ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhODdhMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotanNwbW9kZWwuamFyCi1kZXYucHJvcGVydGllcwotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlXzYuMC4wLmphcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmVfNi4wLjAuemlwCi1qc3Btb2RlbHNyYy56aXAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNGQwMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RyYWNlZmlsdGVyPQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGluZGV4bWFuYWdlcj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwc2VhcmNoPWZhbHNlCi0KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvcmVzb2x2ZT1mYWxzZQotCi0KLSMgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXIuX2RlYnVnCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9tYW5hZ2VyPWZhbHNlCi0KLSMgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuQ01Eb2N1bWVudEZhY3RvcnlUTEQuX2RlYnVnCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9mYWN0b3J5PWZhbHNlCi0KLSNvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsL2luZGV4LlByb2plY3REZXNjcmlwdGlvbi5fZGVidWdJbmRleENyZWF0aW9uCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4Y3JlYXRpb249ZmFsc2UKLSNvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsL2luZGV4LlByb2plY3REZXNjcmlwdGlvbi5fZGVidWdJbmRleFRpbWUKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvaW5kZXh0aW1lPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmRlYnVnUHJlZml4TGlzdGVuZXIKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wYXJ0aXRpb25lci9wcmVmaXhsaXN0ZW5lcj1mYWxzZQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjEwYjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3ZmM1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jV2VkIEphbiAxMiAxNjoxMToxMSBFU1QgMjAwNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRmOWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICBqc3AuamFyLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLmpzcG1vZGVsLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWU2MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIEpTUCBNb2RlbAotbmxGZWF0dXJlTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBKU1AgTW9kZWwgTkwgU3VwcG9ydAotU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIEpTUCBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotSlNQX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBDb250ZW50IFR5cGUKLUpTUF9UYWdfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFRhZyBDb250ZW50IFR5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTNhM2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ianNwbW9kZWwuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0gICAgICA8bW9kZWxIYW5kbGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1AiCi0gICAgICAgICAgICBhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUubW9kZWxoYW5kbGVyIj4KLSAgICAgIDwvbW9kZWxIYW5kbGVyPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuZG9jdW1lbnRGYWN0b3JpZXMiPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIHR5cGU9InRsZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5DTURvY3VtZW50RmFjdG9yeVRMRCI+Ci0gICAgICA8L2ZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuYnVpbGRlcmRlbGVnYXRlLnRvZG8iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmJ1aWxkZXJkZWxlZ2F0ZSI+Ci0gICAgICA8cGFydGljaXBhbnQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFza3MuSlNQVGFza1RhZ1NlZWtlciIKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLSAgICAgIDwvcGFydGljaXBhbnQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMiCi0gICAgICAgICBuYW1lPSIlU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSI+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRTZXR1cCIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZG9jdW1lbnRzZXR1cCIKLSAgICAgICAgIG5hbWU9IlN0cnVjdHVyZWQgSlNQIERvY3VtZW50IFNldHVwIHBhcnRpY2lwYW50Ij4KLSAgICAgIDxwYXJ0aWNpcGFudAotICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0ianNwIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0ianNwZiIvPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0ianNweCIvPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0ianNmIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0ianN2Ij4KLSAgICAgIDwvZmlsZVR5cGVzPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0ianRwbCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249InRsZCIvPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0idGFnIi8+Ci0gICAgICA8ZmlsZVR5cGVzCi0gICAgICAgICAgICB0eXBlPSJ0ZXh0IgotICAgICAgICAgICAgZXh0ZW5zaW9uPSJ0YWd4Ii8+Ci0gICAgICA8ZmlsZVR5cGVzCi0gICAgICAgICAgICB0eXBlPSJ0ZXh0IgotICAgICAgICAgICAgZXh0ZW5zaW9uPSJ0YWdmIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0UHJvY2Vzc29ycyI+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGwiCi0gICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgICAgICAgIDwhLS0gYXNzb2NpYXRlIEpTUCBmaWxlIHR5cGVzIC0tPgotICAgICAgICAgPGNvbnRlbnQtdHlwZQotICAgICAgICAgICAgICAgZmlsZS1leHRlbnNpb25zPSJqc3AsanNwZixqc2YsanN2LGp0cGwsanNweCIKLSAgICAgICAgICAgICAgIHByaW9yaXR5PSJoaWdoIgotICAgICAgICAgICAgICAgbmFtZT0iJUpTUF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLSAgICAgICAgICAgICAgIGlkPSJqc3Bzb3VyY2UiCi0gICAgICAgICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJICAgZGVmYXVsdC1jaGFyc2V0PSJJU08tODg1OS0xIj4KLQkJCTxkZXNjcmliZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQIi8+Ci0JCSA8L2NvbnRlbnQtdHlwZT4KLSAgICAgICAgIDwhLS0gYXNzb2NpYXRlIEpTUCAyLjAgVGFnIGZpbGUgdHlwZXMgLS0+Ci0gICAgICAgICA8Y29udGVudC10eXBlCi0gICAgICAgICAgICAgICBmaWxlLWV4dGVuc2lvbnM9InRhZyx0YWd4LHRhZ2YiCi0gICAgICAgICAgICAgICBwcmlvcml0eT0iaGlnaCIKLSAgICAgICAgICAgICAgIG5hbWU9IiVKU1BfVGFnX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotICAgICAgICAgICAgICAgaWQ9InRhZ3NvdXJjZSIKLSAgICAgICAgICAgICAgIGJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCSAgIGRlZmF1bHQtY2hhcnNldD0iVVRGLTgiPgotCQkgPC9jb250ZW50LXR5cGU+Ci0JCTwhLS0gYXNzb2NpYXRlIC50bGQgZmlsZXMgd2l0aCB0aGUgWE1MIGNvbnRlbnQgdHlwZSAtLT4KLQkJPGZpbGUtYXNzb2NpYXRpb24KLQkJCWNvbnRlbnQtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWZpbGUtZXh0ZW5zaW9ucz0idGxkIi8+Ci0JPC9leHRlbnNpb24+CQkgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvSlNQMTFOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvSlNQMTFOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyYmM5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL0pTUDExTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmU7Ci0KLQotLyoqCi0gKiBKU1AgMS4xIE5hbWVzcGFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDExTmFtZXNwYWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIHsKLQkJLy8gRWxlbWVudCBuYW1lcwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRMRVQgPSAianNwOnNjcmlwdGxldCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTiA9ICJqc3A6ZXhwcmVzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTEFSQVRJT04gPSAianNwOmRlY2xhcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfUEFHRSA9ICJqc3A6ZGlyZWN0aXZlLnBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9JTkNMVURFID0gImpzcDpkaXJlY3RpdmUuaW5jbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1RBR0xJQiA9ICJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFQkVBTiA9ICJqc3A6dXNlQmVhbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUUFJPUEVSVFkgPSAianNwOnNldFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRQUk9QRVJUWSA9ICJqc3A6Z2V0UHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREUgPSAianNwOmluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkQgPSAianNwOmZvcndhcmQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTiA9ICJqc3A6cGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTVMgPSAianNwOnBhcmFtcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMTEJBQ0sgPSAianNwOmZhbGxiYWNrIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTSA9ICJqc3A6cGFyYW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAianNwOnJvb3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAianNwOnRleHQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQMTFfVVJJID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVEFHX1BSRUZJWCA9ICJqc3AiOyAvLyROT04tTkxTLTEkCi0JLy8gYXR0cmlidXRlIG5hbWVzCi0JLy8gICBkaXJlY3RpdmUucGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRVhURU5EUyA9ICJleHRlbmRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05URU5UX1RZUEUgPSAiY29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lNUE9SVCA9ICJpbXBvcnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NFU1NJT04gPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQlVGRkVSID0gImJ1ZmZlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVVUT0ZMVVNIID0gImF1dG9GbHVzaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNfVEhSRUFEX1NBRkUgPSAiaXNUaHJlYWRTYWZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JTkZPID0gImluZm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VSUk9SX1BBR0UgPSAiZXJyb3JQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFID0gImlzRXJyb3JQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HID0gInBhZ2VFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGRpcmVjdGl2ZS5pbmNsdWRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGRpcmVjdGl2ZS50YWdsaWIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHVzZUJlYW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDT1BFID0gInNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQkVBTl9OQU1FID0gImJlYW5OYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JLy8gICBzZXRQcm9wZXJ0eQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BST1BFUlRZID0gInByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFSQU0gPSAicGFyYW0iOyAvLyROT04tTkxTLTEkCi0JLy8gICBpbmNsdWRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRkxVU0ggPSAiZmx1c2giOyAvLyROT04tTkxTLTEkCi0JLy8gICBwbHVnaW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFQkFTRSA9ICJjb2RlYmFzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxJR04gPSAiYWxpZ24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FSQ0hJVkUgPSAiYXJjaGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSEVJR0hUID0gImhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gImhzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSlJFVkVSU0lPTiA9ICJqcmV2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSAidnNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9XSURUSCA9ICJ3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTlNQTFVHSU5VUkwgPSAibnNwbHVnaW51cmwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lFUExVR0lOVVJMID0gImllcGx1Z2ludXJsIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgcm9vdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9YTUxOU19KU1AgPSAieG1sbnM6anNwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JLy8gYXR0cmlidXRlIHZhbHVlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9KQVZBID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DVF9ERUZBVUxUID0gInRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIjsvL0QxOTUzNjYgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQlVGU0laX0RFRkFVTFQgPSAiOGtiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfU0VTU0lPTiA9ICJzZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkVRVUVTVCA9ICJyZXF1ZXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQVBQTElDQVRJT04gPSAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CRUFOID0gImJlYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BUFBMRVQgPSAiYXBwbGV0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9KVkVSMTEgPSAiMS4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfWE1MTlNfSlNQID0gImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9KU1AxMk5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9KU1AxMk5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzI0MWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvSlNQMTJOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlOwotCi0vKioKLSAqIE5hbWVzIGZvciBKU1AgMS4yIHNwZWMuCi0gKiBDdXJyZW50bHksIGl0IGlzIGp1c3QgdGhlIHNhbWUgYXMgSlNQMTFOYW1lc3BhY2UgaW4gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDEyTmFtZXNwYWNlIGV4dGVuZHMgSlNQMTFOYW1lc3BhY2UgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9KU1AyME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9KU1AyME5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzZiY2YyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvSlNQMjBOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlOwotCi0vKioKLSAqIE5ldyBuYW1lcyBmb3IgSlNQIDIuMCBzcGVjLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMjBOYW1lc3BhY2UgZXh0ZW5kcyBKU1AxMk5hbWVzcGFjZSB7Ci0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgZXh0ZW5kcyBKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZSB7Ci0JCVN0cmluZyBESVJFQ1RJVkVfVEFHID0gImpzcDpkaXJlY3RpdmUudGFnIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgRElSRUNUSVZFX0FUVFJJQlVURSA9ICJqc3A6ZGlyZWN0aXZlLmF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIERJUkVDVElWRV9WQVJJQUJMRSA9ICJqc3A6ZGlyZWN0aXZlLnZhcmlhYmxlIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2NDFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgbW92ZWQgdG8gaW50ZXJuYWwgcGFja2FnZSBiZWNhdXNlIG9ubHkgdGhpcyBwbHVnaW4gc2hvdWxkIGJlCi0gKiB1c2luZyB0aGlzIExvZ2dlciBjbGFzcy4KLSAqIAotICogd2lsbCBiZSByZW1vdmVkIGluIE00Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyIHsKLQkvLyBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcgotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9QYWdlRGlyZWN0aXZlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9QYWdlRGlyZWN0aXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBlMGE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvUGFnZURpcmVjdGl2ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudHByb3BlcnRpZXMuSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyOwotCi0vKioKLSAqIENsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGhhdmUgdHdvIHJlc3BvbnNpYmlsaXRpZXMuIAotICogT25lIGlzIHRvIHByb3ZpZGUKLSAqIGFuZCBlbWJlZGRlZCBmYWN0b3J5IHJlZ2lzdHJ5IGZvciBKU1AgQXdhcmUgSU5vZGVBZGFwdGVyIEZhY3RvcmllcwotICogdG8gdXNlLiBUaGUgb3RoZXIgaXMgdG8gbW9uaXRvciBwYWdlIGRpcmVjdGl2ZXMgYW5kIGlmIAotICogYSBjaGFuZ2UgaW4gZW1iZWRkZWQgdHlwZSBpcyBpcyBtYWRlLCBpdCB3aWxsIHNpZ25hbCAKLSAqIHRoZSBzdHJ1Y3R1cmVkTW9kZWwgdGhhdCBpdCBuZWVkcyB0byByZWluaXRpYWxpemUgaXRzZWxmLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyLCBJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgewotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpOwotCi0JLyoqCi0JICogVGhpcyBzZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25jZSwgc2hvcnRseSBhZnRlcgotCSAqIGluaXRpYWxpemF0aW9uLgotCSAqLwotCXZvaWQgc2V0RW1iZWRkZWRUeXBlKEVtYmVkZGVkVHlwZUhhbmRsZXIgaGFuZGxlcik7Ci0KLQlFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkVHlwZSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdG8gZ2l2ZSB0aGlzIGFkYXB0ZXIgYSBjaGFuY2UgdG8gdXNlCi0JICogdGhlIEFkYXB0ZXJGYWN0b3JlcyBmcm9tIHRoZSBFbWJlZGRlZFR5cGVIYW5kbGVyCi0JICogdG8gYWRhcHQgdGhlIG5vZGUuIEl0cyB0byBiZSB1c2VkIGJ5IEpTUEF3YXJlQWRhcHRlckZhY3RvcmllcwotCSAqIHRvIChwb3RlbnRpYWxseSkgYWRhcHQgbm9kZXMgZnJvbSB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlLgotCSAqLwotCUlOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSk7Ci0KLQl2b2lkIGFkZEVtYmVkZGVkRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KTsKLQotCS8qKgotCSAqIE1ldGhvZCBzZXRMYW5ndWFnZS4KLQkgKiBAcGFyYW0gbGFuZ3VhZ2UKLQkgKi8KLQl2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSk7Ci0KLQlJTm9kZU5vdGlmaWVyIGdldFRhcmdldCgpOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZShPYmplY3Qga2V5KTsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50bW9kZWwvdGxkL0pTUDExVExETmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvY29udGVudG1vZGVsL3RsZC9KU1AxMVRMRE5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTdkYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50bW9kZWwvdGxkL0pTUDExVExETmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMTFUTEROYW1lcyB7Ci0KLQlTdHJpbmcgVEFHTElCID0gInRhZ2xpYiI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBDT05URU5UX0pTUCA9ICJKU1AiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlRFTlRfRU1QVFkgPSAiZW1wdHkiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlRFTlRfVEFHREVQRU5ERU5UID0gInRhZ2RlcGVuZGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQUcgPSAidGFnIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BWRVJTSU9OID0gImpzcHZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRMSUJWRVJTSU9OID0gInRsaWJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTSE9SVE5BTUUgPSAic2hvcnRuYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUk4gPSAidXJuIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTkZPID0gImluZm8iOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBURUlDTEFTUyA9ICJ0ZWljbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHQ0xBU1MgPSAidGFnY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEJPRFlDT05URU5UID0gImJvZHljb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSSUJVVEUgPSAiYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIElEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRVFVSVJFRCA9ICJyZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUlRFWFBSVkFMVUUgPSAicnRleHBydmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJTkNMVURFID0gImluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBZRVMgPSAieWVzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBOTyA9ICJubyI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvSlNQMTJUTEROYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50bW9kZWwvdGxkL0pTUDEyVExETmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmOGI0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvSlNQMTJUTEROYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZDsKLQotcHVibGljIGludGVyZmFjZSBKU1AxMlRMRE5hbWVzIHsKLQotCVN0cmluZyBUQUdMSUIgPSBKU1AxMVRMRE5hbWVzLlRBR0xJQjsKLQotCVN0cmluZyBDT05URU5UX0pTUCA9IEpTUDExVExETmFtZXMuQ09OVEVOVF9KU1A7Ci0JU3RyaW5nIENPTlRFTlRfRU1QVFkgPSBKU1AxMVRMRE5hbWVzLkNPTlRFTlRfRU1QVFk7Ci0JU3RyaW5nIENPTlRFTlRfVEFHREVQRU5ERU5UID0gSlNQMTFUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVDsKLQotCVN0cmluZyBUQUcgPSBKU1AxMVRMRE5hbWVzLlRBRzsKLQlTdHJpbmcgSlNQX1ZFUlNJT04gPSAianNwLXZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRMSUJfVkVSU0lPTiA9ICJ0bGliLXZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNIT1JUX05BTUUgPSAic2hvcnQtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVJJID0gSlNQMTFUTEROYW1lcy5VUkk7Ci0JU3RyaW5nIFVSTiA9IEpTUDExVExETmFtZXMuVVJOOwotCi0JU3RyaW5nIE5BTUUgPSBKU1AxMVRMRE5hbWVzLk5BTUU7Ci0JU3RyaW5nIFRFSV9DTEFTUyA9ICJ0ZWktY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBR19DTEFTUyA9ICJ0YWctY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEJPRFlfQ09OVEVOVCA9ICJib2R5LWNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJJQlVURSA9IEpTUDExVExETmFtZXMuQVRUUklCVVRFOwotCi0JU3RyaW5nIElEID0gSlNQMTFUTEROYW1lcy5JRDsKLQlTdHJpbmcgUkVRVUlSRUQgPSBKU1AxMVRMRE5hbWVzLlJFUVVJUkVEOwotCVN0cmluZyBSVEVYUFJWQUxVRSA9IEpTUDExVExETmFtZXMuUlRFWFBSVkFMVUU7Ci0KLQlTdHJpbmcgUFJFRklYID0gSlNQMTFUTEROYW1lcy5QUkVGSVg7Ci0KLQlTdHJpbmcgSU5DTFVERSA9IEpTUDExVExETmFtZXMuSU5DTFVERTsKLQlTdHJpbmcgRklMRSA9IEpTUDExVExETmFtZXMuRklMRTsKLQotCVN0cmluZyBUUlVFID0gSlNQMTFUTEROYW1lcy5UUlVFOwotCVN0cmluZyBGQUxTRSA9IEpTUDExVExETmFtZXMuRkFMU0U7Ci0JU3RyaW5nIFlFUyA9IEpTUDExVExETmFtZXMuWUVTOwotCVN0cmluZyBOTyA9IEpTUDExVExETmFtZXMuTk87Ci0KLQkvKgotCSAqIEBzaW5jZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBESVNQTEFZX05BTUUgPSAiZGlzcGxheS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTTUFMTF9JQ09OID0gInNtYWxsLWljb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIExBUkdFX0lDT04gPSAibGFyZ2UtaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JU3RyaW5nIFZBTElEQVRPUiA9ICJ2YWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBTElEQVRPUl9DTEFTUyA9ICJ2YWxpZGF0b3ItY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBTElEQVRPUl9JTklUX1BBUkFNID0gImluaXQtcGFyYW0iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBTElEQVRPUl9QQVJBTV9OQU1FID0gInBhcmFtLW5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBTElEQVRPUl9QQVJBTV9WQUxVRSA9ICJwYXJhbS12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JU3RyaW5nIExJU1RFTkVSID0gImxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBMSVNURU5FUl9DTEFTUyA9ICJsaXN0ZW5lci1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBWQVJJQUJMRSA9ICJ2YXJpYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfTkFNRV9HSVZFTiA9ICJuYW1lLWdpdmVuIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9OQU1FX0ZST01fQVRUUklCVVRFID0gIm5hbWUtZnJvbS1hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX0NMQVNTID0gInZhcmlhYmxlLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9ERUNMQVJFID0gImRlY2xhcmUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX1NDT1BFID0gInNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9TQ09QRV9ORVNURUQgPSAiTkVTVEVEIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9TQ09QRV9BVF9CRUdJTiA9ICJBVF9CRUdJTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfU0NPUEVfQVRfRU5EID0gIkFUX0VORCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvSlNQMjBUTEROYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50bW9kZWwvdGxkL0pTUDIwVExETmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlMDNjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvSlNQMjBUTEROYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZDsKLQotLypubHNYWFgqLwotcHVibGljIGludGVyZmFjZSBKU1AyMFRMRE5hbWVzIGV4dGVuZHMgSlNQMTJUTEROYW1lcyB7Ci0JU3RyaW5nIENPTlRFTlRfU0NSSVBUTEVTUyA9ICJzY3JpcHRsZXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFWEFNUExFID0gImV4YW1wbGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZSQUdNRU5UID0gImZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGVU5DVElPTiA9ICJmdW5jdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlVOQ1RJT05fQ0xBU1MgPSAiZnVuY3Rpb24tY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZVTkNUSU9OX0VYVEVOU0lPTiA9ICJmdW5jdGlvbi1leHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZVTkNUSU9OX1NJR05BVFVSRSA9ICJmdW5jdGlvbi1zaWduYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIElDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQUdfRVhURU5TSU9OID0gInRhZy1leHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBR19GSUxFID0gInRhZy1maWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFRBR0RJUiA9ICJ0YWdkaXIiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFRBR0xJQl9FWFRFTlNJT04gPSAidGFnbGliLWV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50bW9kZWwvdGxkL1RMREF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExEQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1YjE2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExEQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIGRlZmluaXRpb24gZnJvbSBhIFRMRAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRMREF0dHJpYnV0ZURlY2xhcmF0aW9uIGV4dGVuZHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBzaW5jZSBKU1AgMi4wCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JCi0JLyoqCi0JICogdGhlIGF0dHJpYnV0ZSdzIG5hbWUKLQkgKiBAc2luY2UgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCBydW50aW1lIGJ5IGFuIGV4cHJlc3Npb24KLQkgKiBAc2luY2UgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRSdGV4cHJ2YWx1ZSgpOwotCi0JLyoqCi0JICogdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlCi0JICogQHNpbmNlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZyYWdtZW50Ci0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0ZyYWdtZW50KCk7Ci0JCi0JLyoqCi0JICogaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbAotCSAqIEBzaW5jZSBKU1AgMS4xCi0JICovCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50bW9kZWwvdGxkL1RMRERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExERG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiNzI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExERG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFRMRERvY3VtZW50IGV4dGVuZHMgQ01Eb2N1bWVudCB7Ci0KLQlTdHJpbmcgQ01fS0lORCA9ICJDb250ZW50IE1vZGVsIEtpbmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9UTEQgPSAiSlNQIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAc2luY2UgSlNQIDIuMAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgY29udGVudHMgb2YgdGhlICJkZXNjcmlwdGlvbiIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLCBzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZS4KLQkgKiBAc2luY2UgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgY29udGVudHMgb2YgdGhlICJkaXNwbGF5LW5hbWUiIGVsZW1lbnQgb2YgYSBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGl0IGlzIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scwotCSAqIEBzaW5jZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIExpc3QgLSBBIGxpc3Qgb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHRhZyBsaWJyYXJ5Ci0JICogQHNpbmNlIEpTUCAyLjAKLQkgKi8KLQlMaXN0IGdldEV4dGVuc2lvbnMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIExpc3QgLSBBIGxpc3Qgb2YgVExERnVuY3Rpb25zIGRlc2NyaWJpbmcgdGhlIGRlY2xhcmVkIGZ1bmN0aW9ucwotCSAqIEBzaW5jZSBKU1AgMi4wCi0JICovCi0JTGlzdCBnZXRGdW5jdGlvbnMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSBjb250ZW50cyBvZiB0aGUgImluZm8iIGVsZW1lbnQgb2YgYSBKU1AgMS4xIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwgc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUuCi0JICogQHNpbmNlIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0SW5mbygpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgdmVyc2lvbiBvZiBKU1AgdGhlIHRhZyBsaWJyYXJ5IGRlcGVuZHMgdXBvbgotCSAqIEBzaW5jZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldEpzcHZlcnNpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAibGFyZ2UtaWNvbiIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgb3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0JICogQHNpbmNlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0TGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBAc2luY2UgSlNQIDEuMgotCSAqIEByZXR1cm4gTGlzdCAtIGEgTGlzdCBvZiBUTERMaXN0ZW5lcnMKLQkgKi8KLQlMaXN0IGdldExpc3RlbmVycygpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBBIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5IGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVycmVkIHByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcwotCSAqIEBzaW5jZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFNob3J0bmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgY29udGVudHMgb2YgdGhlICJzbWFsbC1pY29uIiBlbGVtZW50IG9mIGEgSlNQIDEuMiB0YWcgbGlicmFyeSBkZXNjcmlwdG9yOyBvcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQkgKiBAc2luY2UgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXRTbWFsbEljb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IChpdCdzIGltcGxlbWVudGF0aW9uKQotCSAqIEBzaW5jZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFRsaWJ2ZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBVUkkgZGVjbGFyZWQgd2l0aGluIHRoZSBkZXNjcmlwdG9yCi0JICogQHNpbmNlIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAc2luY2UgSlNQIDEuMgotCSAqLwotCVRMRFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExERWxlbWVudERlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExERWxlbWVudERlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTE2NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50bW9kZWwvdGxkL1RMREVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVExERWxlbWVudERlY2xhcmF0aW9uIGV4dGVuZHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCi0JLyoqCi0JICogVGhlIGJvZHkgY29udGVudCB0eXBlCi0JICogCi0JICogQHNpbmNlIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0Qm9keWNvbnRlbnQoKTsKLQotCS8qKgotCSAqIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCSAqIAotCSAqIEBzaW5jZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKLQkgKiAKLQkgKiBAc2luY2UgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZwotCSAqIAotCSAqIEBzaW5jZSBKU1AgMi4wCi0JICovCi0JU3RyaW5nIGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywKLQkgKiBmb3IgdG9vbCBjb25zdW1wdGlvbgotCSAqIAotCSAqIEBzaW5jZSBKU1AgMi4wCi0JICovCi0JTGlzdCBnZXRFeHRlbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAc2luY2UgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRJbmZvKCk7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGFuIG9wdGlvbmFsIGxhcmdlIGljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCSAqIAotCSAqIEBzaW5jZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldExhcmdlSWNvbigpOwotCi0JQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUKLQkgKiByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gb3IgdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhIHRhZwotCSAqIGxpYnJhcnkgcGFja2FnZWQgaW4gYSBKQVIuIFRoaXMgbXVzdCBiZWdpbiB3aXRoIC9XRUItSU5GL3RhZ3MgaWYgdGhlCi0JICogLnRhZyBmaWxlIHJlc2lkZXMgaW4gdGhlIFdBUiwgb3IgL01FVEEtSU5GL3RhZ3MgaWYgdGhlIC50YWcgZmlsZQotCSAqIHJlc2lkZXMgaW4gYSBKQVIuCi0JICogCi0JICogCi0JICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgLnRhZyh4KSBmaWxlIGFzIGRlZmluZWQgaW4gdGhlIC50bGQgZmlsZSwgbnVsbAotCSAqICAgICAgICAgaWYgaW50ZXJuYWwgdG8gdGhlIC50bGQKLQkgKiBAc2luY2UgSlNQIDIuMAotCSAqLwotCVN0cmluZyBnZXRQYXRoKCk7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGFuIG9wdGlvbmFsIHNtYWxsIGljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCSAqIAotCSAqIEBzaW5jZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldFNtYWxsSWNvbigpOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZwotCSAqIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcKLQkgKiAKLQkgKiBAc2luY2UgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRUYWdjbGFzcygpOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgYW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YKLQkgKiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0JICogCi0JICogQHNpbmNlIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0VGVpY2xhc3MoKTsKLQotCS8qKgotCSAqIEBzaW5jZSBKU1AgMS4yCi0JICogQHJldHVybiBMaXN0IG9mIFRMRFZhcmlhYmxlcwotCSAqLwotCUxpc3QgZ2V0VmFyaWFibGVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50bW9kZWwvdGxkL1RMREZ1bmN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExERnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE3ZWZhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExERnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVExERnVuY3Rpb24gewotCi0JU3RyaW5nIGdldENsYXNzTmFtZSgpOwotCQotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQlTdHJpbmcgZ2V0RXhhbXBsZSgpOwotCi0JTGlzdCBnZXRFeHRlbnNpb25zKCk7Ci0KLQlTdHJpbmcgZ2V0SWNvbigpOwotCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCUNNRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpOwotCi0JU3RyaW5nIGdldFNpZ25hdHVyZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhZGE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExESW5pdFBhcmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkOwotCi0KLS8qKgotICogQSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gYWxvbmcgd2l0aCBhIGRlc2NyaXB0aW9uCi0gKiBAc2luY2UgSlNQIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRMREluaXRQYXJhbSB7Ci0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExETGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvY29udGVudG1vZGVsL3RsZC9UTERMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2JkMGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvY29udGVudG1vZGVsL3RsZC9UTERMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZDsKLQotCi0vKioKLSAqIERlZmluZXMgYW4gb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgb2JqZWN0IHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgcmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5Ci0gKiBAc2luY2UgSlNQIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRMRExpc3RlbmVyIHsKLQlTdHJpbmcgZ2V0TGlzdGVuZXJDbGFzcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvY29udGVudG1vZGVsL3RsZC9UTERWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvY29udGVudG1vZGVsL3RsZC9UTERWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2M2JjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExEVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGFuIG9wdGlvbmFsIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkKLSAqIEBzaW5jZSBKU1AgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVExEVmFsaWRhdG9yIHsKLQkvKioKLQkgKiBAcmV0dXJuIExpc3QgLSBhIExpc3Qgb2YgVExESW5pdFBhcmFtcwotCSAqLwotCUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50bW9kZWwvdGxkL1RMRFZhcmlhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExEVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxMGE5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVExEVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLS8qKgotICogSW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgZGVmaW5lZCBieSB0aGlzIHRhZy4KLSAqIEBzaW5jZSBKU1AgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVExEVmFyaWFibGUgewotCi0JLyoqCi0JICogV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LCB0cnVlIGlzIHRoZSBkZWZhdWx0LgotCSAqLwotCWJvb2xlYW4gZ2V0RGVjbGFyZSgpOwotCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uIHRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuCi0JICovCi0JU3RyaW5nIGdldE5hbWVGcm9tQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBUaGUgdmFyaWFibGUgbmFtZSBnaXZlbiBhcyBhIGNvbnN0YW50Ci0JICovCi0JU3RyaW5nIGdldE5hbWVHaXZlbigpOwotCQotCS8qKgotCSAqIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGRlZmluZWQuCi0JICovCi0JU3RyaW5nIGdldFNjb3BlKCk7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUsIGphdmEubGFuZy5TdHJpbmcgaWYgbnVsbAotCSAqLwotCVN0cmluZyBnZXRWYXJpYWJsZUNsYXNzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVVJJUmVzb2x2ZXJQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50bW9kZWwvdGxkL1VSSVJlc29sdmVyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExZmE5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnRtb2RlbC90bGQvVVJJUmVzb2x2ZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHdpbGwgYmUgcmVtb3ZlZCBpbiBNNAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VUklSZXNvbHZlcjsKLQotcHVibGljIGludGVyZmFjZSBVUklSZXNvbHZlclByb3ZpZGVyIHsKLQotCVVSSVJlc29sdmVyIGdldFJlc29sdmVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyY2EzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudHR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZpZW5jZSB0byBwcm92aWRlIGNvbXBpbGUtdGltZQotICogc2FmZXR5IHdoZW4gcmVmZXJpbmcgdG8gYSBjb250ZW50VHlwZSBJRC4gVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZAotICogZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JKU1AgewotCS8qCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IG5vdCBkZWNsYXJlZCBhcyBmaW5hbCwKLQkgKiBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfSlNQID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2VuY29kaW5nL0lKU1BIZWFkQ29udGVudERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2VuY29kaW5nL0lKU1BIZWFkQ29udGVudERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2M0ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9lbmNvZGluZy9JSlNQSGVhZENvbnRlbnREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLQotcHVibGljIGludGVyZmFjZSBJSlNQSGVhZENvbnRlbnREZXRlY3RvciBleHRlbmRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0JU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JU3RyaW5nIGdldExhbmd1YWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9lbmNvZGluZy9KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvZW5jb2RpbmcvSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWQ0ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9lbmNvZGluZy9KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwYXJzZXMgYmVnaW5uaW5nIHBvcnRpb24gb2YgSlNQIGZpbGUgdG8gZ2V0IGF0dHJpYnV0ZXMgaW4gcGFnZQotICogZGlyZWN0aWl2ZQotICogIAotICovCi1wdWJsaWMgY2xhc3MgSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yIGV4dGVuZHMgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IgewotCi0JcHVibGljIEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvZW5jb2RpbmcvSlNQRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvZW5jb2RpbmcvSlNQRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxZmEwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2VuY29kaW5nL0pTUERvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQUmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkNvZGVkUmVhZGVyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BEb2N1bWVudExvYWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0xBTkdVQUdFID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTUlNRV9UWVBFID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1BFQ19ERUZBVUxUX0VOQ09ESU5HID0gIklTTy04ODU5LTEiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIElGaWxlIGdldEZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcGF0aCA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcGF0aCA9IGlkLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gVE9ETyBuZWVkcyByZXdvcmsgZm9yIGxpbmtlZCByZXNvdXJjZXMKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSByb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChwYXRoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeTsKLQotCXB1YmxpYyBKU1BEb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoSlNQU291cmNlUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJVGFnTWFya2VyIGJtID0gbmV3IFRhZ01hcmtlcih0YWdOYW1lKTsKLQkJcGFyc2VyLmFkZE5lc3RhYmxlUHJlZml4KGJtKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVDb2RlZERvY3VtZW50KGlGaWxlKTsKLQotCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUoaUZpbGUpOwotCQkJaWYgKGVtYmVkZGVkVHlwZSAhPSBudWxsKQotCQkJCWVtYmVkZGVkVHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCi0JCQlmRnVsbFByZXBhcmVkUmVhZGVyLnJlc2V0KCk7Ci0JCQlzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZGdWxsUHJlcGFyZWRSZWFkZXIpOwotCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoZkZ1bGxQcmVwYXJlZFJlYWRlciAhPSBudWxsKSB7Ci0JCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZUNvZGVkRG9jdW1lbnQoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWdldENvZGVkUmVhZGVyQ3JlYXRvcigpLnNldChpRmlsZSk7Ci0KLQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldENvZGVkUmVhZGVyKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldEVuY29kaW5nTWVtZW50bygpKTsKLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCAmJiBpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGhhdmUgYm90aCBudWxsIGZpbGVuYW1lIGFuZCBpbnB1dHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNvZGVkUmVhZGVyQ3JlYXRvciA9IG5ldyBDb2RlZFJlYWRlckNyZWF0b3IoKTsKLQkJdHJ5IHsKLQkJCWNvZGVkUmVhZGVyQ3JlYXRvci5zZXQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0Q29kZWRSZWFkZXIoKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGZFbmNvZGluZ01lbWVudG8pOwotCQkJLy8gdGhlIGZhY3QgdGhhdCBmaWxlIGlzIG51bGwgbWVhbnMgdGhpcyBtZXRob2QvY29kZSBwYXRoIGlzIG5vCi0JCQkvLyBnb29kIGZvciBKU1AgZnJhZ21lbnRzCi0JCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEVtYmVkZGVkVHlwZSgoSUZpbGUpIG51bGwpOwotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5yZXNldCgpOwotCQkJaWYgKGVtYmVkZGVkVHlwZSAhPSBudWxsKQotCQkJCWVtYmVkZGVkVHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuZ2V0UGFyc2VyKCkpOwotCQkJc2V0RG9jdW1lbnRDb250ZW50c0Zyb21SZWFkZXIoc3RydWN0dXJlZERvY3VtZW50LCBmRnVsbFByZXBhcmVkUmVhZGVyKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlIGluIHRoaXMgY29udGV4dAotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgIT0gbnVsbCkgewotCQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCi0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEByZXR1cm4gSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCgpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0TWltZVR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX01JTUVfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLm1vZGVsLkFic3RyYWN0RHVtcGVyI2dldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpCi0JICovCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCWlmIChmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID09IG51bGwpIHsKLQkJCWZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeQotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCkgewotCQlpZiAoZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5ID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCURvY3VtZW50IGRvYyA9ICgoWE1MTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2MpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkSGFuZGxlciA9IHBhZ2VEaXJlY3RpdmVBZGFwdGVyLmdldEVtYmVkZGVkVHlwZSgpOwotCQlyZXR1cm4gZW1iZWRkZWRIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSB0aGUgTUlNRSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGluIGEgcGFnZSBkaXJlY3RpdmUuIFRoaXMKLQkgKiBzaG91bGQgYXBwZWFyICJhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgSlNQIHBhZ2UiIGFjY29yZGluZyB0byB0aGUKLQkgKiBKU1AgdjEuMiBzcGVjaWZpY2F0aW9uLgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZFR5cGUoSUZpbGUgZmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgPT0gbnVsbCkgewotCQkJaGFuZGxlciA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBtaW1lVHlwZSA9IG51bGw7Ci0KLQkJCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBqc3BQcm92aWRlciA9IGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpOwotCQkJanNwUHJvdmlkZXIuc2V0KGdldEZ1bGxQcmVwYXJlZFJlYWRlcigpKTsKLQkJCWlmIChqc3BQcm92aWRlciBpbnN0YW5jZW9mIElKU1BIZWFkQ29udGVudERldGVjdG9yKSB7Ci0JCQkJbWltZVR5cGUgPSAoKElKU1BIZWFkQ29udGVudERldGVjdG9yKSBqc3BQcm92aWRlcikuZ2V0Q29udGVudFR5cGUoKTsKLQkJCX0KLQotCQkJRW1iZWRkZWRUeXBlUmVnaXN0cnkgcmVnID0gZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlpZiAobWltZVR5cGUgPT0gbnVsbCB8fCBtaW1lVHlwZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJaGFuZGxlciA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWhhbmRsZXIgPSByZWcuZ2V0VHlwZUZvcihtaW1lVHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRm9yIEpTUCBmaWxlcywgdGV4dC9odG1sIGlzIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZS4gVGhpcyBtYXkgd2FudAotCSAqIHRoaXMgZGlmZmVyZW50IGZvciB0eXBlcyBsaWtlIGpzdiAoanNwIGZvciB2b2ljZSB4bWwpIEZvciBub3csIGhhcmQKLQkgKiBjb2RlIHRvIG5ldyBpbnN0YW5jZS4gSW4gZnV0dXJlLCBzaG91bGQgZ2V0IGluc3RhbmNlIGZyb20gcmVnaXN0cnkuCi0JICogU3BlY2lmaWNhdGlvbiBjaXRlcyBIVE1MIGFzIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKCkgewotCQlFbWJlZGRlZFR5cGVSZWdpc3RyeSByZWcgPSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKTsKLQkJcmV0dXJuIHJlZy5nZXRUeXBlRm9yKGdldERlZmF1bHRNaW1lVHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0TGFuZ3VhZ2UuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMYW5ndWFnZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gZmlyc3QgY2hlY2sgdGhlIG1vZGVsIChkb2N1bWVudCBpdHNlbGYpIHRvIHNlZSBpZiBjb250YWlucwotCQlyZXN1bHQgPSBnZXRMYW5ndWFnZUZyb21TdHJ1Y3R1cmVkRG9jdW1lbnQobW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkvLyBOb3RlOiBpZiBtb2RlbCBjb250YWlucyBhbiB1bnN1cHBvcnRlZAotCQkvLyBsYW5ndWFnZSwgd2UnbGwgZXZlbiByZXR1cm4gaXQsCi0JCS8vIHNpbmNlIHdobyBrbm93cyB3aGF0IGZ1dHVyZSBob2xkcy4KLQotCQkvLyBhbHdheXMgcmV0dXJuIHNvbWV0aGluZwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IERFRkFVTFRfTEFOR1VBR0U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0TGFuZ3VhZ2VGcm9tU3RydWN0dXJlZERvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExhbmd1YWdlRnJvbVN0cnVjdHVyZWREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBiYXNjaWFsbHkgc2FtZSBhbGdvcml0aG0gYXMgZ2V0IGVuY29kaW5nIG9yCi0JCS8vIGdldCBjb250ZW50IHR5cGUgZnJvbSBzdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JCUlKU1BIZWFkQ29udGVudERldGVjdG9yIGxvY2FsSGVhZFBhcnNlciA9IChJSlNQSGVhZENvbnRlbnREZXRlY3RvcikgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCk7Ci0JCS8vIHdlIGNhbiBiZSBhc3N1cmVkIHRoYXQgaXRzIGFscmVhZHkgYmVlbgotCQkvLyBwYXJzZWQuIElmIG5vdCBjYWxsIHBhcnNlSGVhZGVyRm9yUGFnZURpcmVjdGl2ZSgpCi0JCS8vIGJlZm9yZSBjYWxsaW5nIGdldExhbmd1YWdlOwotCQlsb2NhbEhlYWRQYXJzZXIuc2V0KGRvY3VtZW50KTsKLQkJcmVzdWx0ID0gbG9jYWxIZWFkUGFyc2VyLmdldExhbmd1YWdlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCS8vIHJlbWVtYmVyLCB0aGUgTG9hZGVyCi0JCS8vIHdpbGwgbmVlZCB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgcGFyc2VyCi0JCS8vIGJhc2VkIG9uICJlbWJlZGRlZCBjb250ZW50IgotCQlKU1BTb3VyY2VQYXJzZXIgcGFyc2VyID0gbmV3IEpTUFNvdXJjZVBhcnNlcigpOwotCQkvLyBhZGQgZGVmYXVsdCBuZXN0YWJsZSB0YWcgbGlzdAotCQlhZGROZXN0YWJsZVByZWZpeChwYXJzZXIsIEpTUDExTmFtZXNwYWNlLkpTUF9UQUdfUFJFRklYKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWZpY2F0aW9uIGNpdGVzIElTTy04ODU5LTEvTGF0aW4tMSBhcyB0aGUgZGVmYXVsdCBjaGFyc2V0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJcmV0dXJuIFNQRUNfREVGQVVMVF9FTkNPRElORzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzICJyZWluaXRpYWxpemUiIHNpbmNlIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgdGhlCi0JICogZGVmYXVsdCBvbmUgYXNzaWduZWQsIGJlZm9yZSB3ZSBzdGFydCBjaGVja2luZyB0aGUgc3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRDbG9uZU9mRW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIEVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkRW1iZWRkZWRDb250ZW50VHlwZSwgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdFbWJlZGRlZENvbnRlbnRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBjaGVjayBwcm9ncmFtIGxvZ2ljCi0JCUFzc2VydC5pc05vdE51bGwob2xkRW1iZWRkZWRDb250ZW50VHlwZSwgIlByb2dyYW0gZXJyb3I6IGludmFsaWQgY2FsbCBkdXJpbmcgbW9kZWwgaW5pdGlhbGl6YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBvbmNlIHdlIGtub3cgdGhlIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSwgd2UgbmVlZCB0byBzZXQgaXQgaW4gdGhlCi0JCS8vIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIC4uLiB0aGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMKLQkJLy8gY3JpdGljYWwgaGVyZSwgdGhlIGRvYyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBidXQgaXRzIGNvbnRlbnRzIG5vdAotCQkvLyBzZXQKLQkJLy8geWV0LAotCQkvLyBhbmQgYWxsIGZhY3RvcmllcyBtdXN0IGhhdmUgYmVlbiBzZXQgdXAgYWxzby4KLQkJWE1MTW9kZWwgZG9tTW9kZWwgPSAoWE1MTW9kZWwpIG1vZGVsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlYTUxEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJLy8gPT0+IC8vIFByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKQotCQkvLyAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCS8vID09PiAvLyBNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikKLQkJLy8gKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCS8vIGJlY2F1c2UsIGV2ZW4gaW4gdGhlIGNsb25lIGNhc2UsIHRoZSBtb2RlbCBoYXMgYmVlbiBwYXJpdGFsbHkKLQkJLy8gaW50aWFsaXplZAotCQkvLyB3aXRoCi0JCS8vIHRoZSBvbGQgZW1iZWRkZWQgdHlwZSAoZHVyaW5nIGNyZWF0ZU1vZGVsKSwgd2UgbmVlZCB0byB1bml0aWFsaXplCi0JCS8vIHBhcnRzIG9mIGl0LCBiYXNlZCBvbiB0aGUgb2xkIChvciBkZWZhdWx0KSBvbmVzCi0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCS8vIHJlbWVtYmVyLCBlbWJlZGRlZCB0eXBlIGZhY3RvcmllcyBhcmUgYXV0b21hdGljYWxseSBjbGVhcmVkIHdoZW4KLQkJLy8gZW1iZWRlZFR5cGUgY2hhbmdlZAotCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUobmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCWlmIChuZXdFbWJlZGRlZENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCW5ld0VtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCX0KLQkJLy8gYWRkaW5nIGxhbmd1YWdlIGhlcmUsIGluIHRoaXMgY29udmllbmVudCBjZW50cmFsCi0JCS8vIGxvY2F0aW9uLCBidXQgc29tZSBvYnZpb3VzIHJlbmFtaW5nIG9yIHJlZmFjdG9yaW5nCi0JCS8vIHdvdWxkbid0IGh1cnQsIGluIGZ1dHVyZS4KLQkJLy8gSSBuZWVkZWQgdG8gYWRkIHRoaXMgbGFuZ3VhZ2Ugc2V0dGluZyBmb3IgSlNQIEZyYWdtZW50IHN1cHBvcnQKLQkJLy8gTm90ZTogdGhpcyBpcyB0aGUgb25lIHRoYXQgY291bnRzLCBzaW5jZSBhdCB0aGlzIHBvaW50LAotCQkvLyB0aGUgbW9kZWwgaGFzIGFuIElELCBzbyB3ZSBjYW4gbG9vayB1cCBJRmlsZSwgZXRjLgotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShtb2RlbCk7Ci0JCWlmIChsYW5ndWFnZSAhPSBudWxsICYmIGxhbmd1YWdlLmxlbmd0aCgpID4gMCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRFbWJlZGRlZFR5cGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpbml0aWFsaXplRW1iZWRkZWRUeXBlRnJvbURlZmF1bHQobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBpbml0RW1iZWRkZWRUeXBlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0RW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZXhpc3RpbmdFbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUob2xkTW9kZWwpOwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0VtYmVkZGVkQ29udGVudFR5cGUgPSBleGlzdGluZ0VtYmVkZGVkVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlpZiAoZXhpc3RpbmdFbWJlZGRlZFR5cGUgPT0gbnVsbCkgewotCQkJaW5pdEVtYmVkZGVkVHlwZShuZXdNb2RlbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvL2luaXRFbWJlZGRlZFR5cGUobmV3TW9kZWwpOwotCQkJaW5pdENsb25lT2ZFbWJlZGRlZFR5cGUobmV3TW9kZWwsIGV4aXN0aW5nRW1iZWRkZWRUeXBlLCBuZXdFbWJlZGRlZENvbnRlbnRUeXBlKTsKLQkJfQotCQlzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShuZXdNb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyAiaW5pdGlhbGl6ZSIgc2luY2UgaXMgYWx3YXlzIGFzc3VtZXMgaXQgaGFzbid0IGJlZW4gaW5pdGFsaXplZAotCSAqIHlldC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkQ29udGVudFR5cGUpIHsKLQkJLy8gY2hlY2sgcHJvZ3JhbSBsb2dpYwotCQlBc3NlcnQuaXNOb3ROdWxsKGVtYmVkZGVkQ29udGVudFR5cGUsICJQcm9ncmFtIGVycm9yOiBpbnZhbGlkIGNhbGwgZHVyaW5nIG1vZGVsIGluaXRpYWxpemF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gb25jZSB3ZSBrbm93IHRoZSBlbWJlZGRlZCBjb250ZW50IHR5cGUsIHdlIG5lZWQgdG8gc2V0IGl0IGluIHRoZQotCQkvLyBQYWdlRGlyZWN0aXZlQWRhcHRlciAuLi4gdGhlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uIGlzCi0JCS8vIGNyaXRpY2FsIGhlcmUsIHRoZSBkb2MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYnV0IGl0cyBjb250ZW50cyBub3QKLQkJLy8gc2V0Ci0JCS8vIHlldCwKLQkJLy8gYW5kIGFsbCBmYWN0b3JpZXMgbXVzdCBoYXZlIGJlZW4gc2V0IHVwIGFsc28uCi0JCVhNTE1vZGVsIGRvbU1vZGVsID0gKFhNTE1vZGVsKSBtb2RlbDsKLQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldEVtYmVkZGVkVHlwZShlbWJlZGRlZENvbnRlbnRUeXBlKTsKLQkJZW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJZW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkvLyBhZGRpbmcgbGFuZ3VhZ2UgaGVyZSwgaW4gdGhpcyBjb252aWVuZW50IGNlbnRyYWwKLQkJLy8gbG9jYXRpb24sIGJ1dCBzb21lIG9idmlvdXMgcmVuYW1pbmcgb3IgcmVmYWN0b3JpbmcKLQkJLy8gd291bGRuJ3QgaHVydCwgaW4gZnV0dXJlLgotCQkvLyBJIG5lZWRlZCB0byBhZGQgdGhpcyBsYW5ndWFnZSBzZXR0aW5nIGZvciBKU1AgRnJhZ21lbnQgc3VwcG9ydAotCQkvLyBOb3RlOiBJIGRvbid0IHRoaW5rIHRoaXMgYXR0ZW1wdGVkIGluaXQgY291bnRzIGZvciBtdWNoLgotCQkvLyBJIHRoaW5rIGl0cyBhbHdheXMgZXhlY3V0ZWQgd2hlbiBtb2RlbCBpcyB2ZXJ5IGZpcnN0Ci0JCS8vIGJlaW5nIGluaXRpYWxpemVkLCBhbmQgZG9lc24ndCBldmVuIGhhdmUgY29udGVudAotCQkvLyBvciBhbiBJRCB5ZXQuIEkgdGhvdWdodCBJJ2QgbGVhdmUsIHNpbmNlIGl0IHdvdWxkbid0Ci0JCS8vIGh1cnQsIGluIGNhc2UgaXRzIGNhbGxlZCBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCQkvLwkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobW9kZWwpOwotCQkvLwkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW5pdCBtZXRob2QgaXMgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBjcmVhdGluZyBhbiBlbXB0eSBtb2RlbCwKLQkgKiB3aGljaCB3ZSBhbHdheXMgZG8uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbWJlZGRlZFR5cGVGcm9tRGVmYXVsdChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRDb250ZW50VHlwZSA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJaW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShtb2RlbCwgZW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgSVN0cnVjdHVyZWREb2N1bWVudCwgdGhhdCBoYXMKLQkgKiBiZWVuIGluaXRpYWxpemVkIHdpdGggYXBwcm9wcmlhdGUgcGFyc2VyLiBGb3IgbWFueSBsb2FkZXJzLCB0aGUKLQkgKiAoZGVmYXVsdCkgcGFyc2VyIHVzZWQgaXMga25vd24gZm9yIGFueSBpbnB1dC4gRm9yIG90aGVycywgdGhlIGNvcnJlY3QKLQkgKiBwYXJzZXIgKGFuZCBpdHMgaW5pdGlhbGl6YXRpb24pIGlzIG5vcm1hbGwgZGVwZW5kZW50IG9uIHRoZSBjb250ZW50IG9mCi0JICogdGhlIGZpbGUuIFRoaXMgbm8tYXJndW1lbnQgbWV0aG9kIHNob3VsZCBhc3N1bWUgImVtcHR5IGlucHV0IiBhbmQgd291bGQKLQkgKiB0aGVyZWZvcmUgcmV0dXJuIHRoZSBkZWZhdWx0IHBhcnNlciBmb3IgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuIElmIHRoZQotCSAqIHBhcnNlciBpcyB0byBoYW5kbGUgdGFnIGxpYnJhcmllcywgaXQgbXVzdCBoYXZlIGEgVGFnbGliU3VwcG9ydCBvYmplY3QKLQkgKiB3aXRoIGEgdmFsaWQgVVJJUmVzb2x2ZXIgYW5kIHRoaXMgSVN0cnVjdHVyZWREb2N1bWVudCBhdHRhY2hlZCB0byBpdAotCSAqIGJlZm9yZSB0aGUgY29udGVudHMgYXJlIHNldCBvbiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuc2V0UmVQYXJzZXIobmV3IEpTUFJlUGFyc2VyKCkpOwotCQkvLwkJc3RydWN0dXJlZERvY3VtZW50LnNldERvY3VtZW50UGFydGl0aW9uZXIobmV3Ci0JCS8vIEpTUEphdmFEb2N1bWVudFBhcnRpb25lcigpKTsKLQkJLy8gZXZlbiB0aG91Z2ggdGhpcyBpcyBhbiAiZW1wdHkgbW9kZWwiIC4uLiB3ZSB3YW50IGl0IHRvIGhhdmUgYXQKLQkJLy8gbGVhc3QKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQgZW1iZWRkZWRlZCBjb250ZW50IHR5cGUgaGFuZGxlcgotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJZW1iZWRkZWRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BEb2N1bWVudExvYWRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlYTUxNb2RlbCBkb21Nb2RlbCA9IChYTUxNb2RlbCkgc3RydWN0dXJlZE1vZGVsOwotCQkvLwotCQkvLyBkb2N1bWVudCBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHNldCBmb3IgdGhpcyB0bwotCQkvLyB3b3JrLgotCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZG9jdW1lbnQpOwotCQkvLyBpZiB0aGVyZSBpcyBhIG1vZGVsIGluIHRoZSBhZGFwdGVyLCB0aGlzIHdpbGwgYWRhcHQgaXQgdG8KLQkJLy8gZmlyc3Qgbm9kZS4gQWZ0ZXIgdGhhdCB0aGUgUHJvcGFnYXRpbmdBZGF0ZXIgc3ByZWFkcyBvdmVyIHRoZQotCQkvLyBjaGlsZHJlbiBiZWluZwotCQkvLyBjcmVhdGVkLiBFYWNoIHRpbWUgdGhhdCBoYXBwZW5kcywgYSBzaWRlIGVmZmVjdCBpcyB0bwotCQkvLyBhbHNvICJzcHJlYWQiIHNwcmVjaWZpYyByZWdpc3RlcmVkIGFkYXB0ZXJzLAotCQkvLyB0aGV5IHR3byBjYW4gcHJvcGlnYXRlIGlzIG5lZWRlZC4KLQkJLy8gVGhpcyAnZ2V0JyBjYXVzZXMgZmlyc3QgdG8gYmUgYmUgYXR0YWNoZWQuCi0JCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCS8vIG1heSBtYWtlIHRoaXMgZWFzaWVyIHRvIHVzZSBpbiBmdXR1ZQotCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeSgpKTsKLQkJLy8gRm9yIEpTUHMsIHRoZSBNb2RlbFF1ZXJ5QWRhcHRlciBtdXN0IGJlICJhdHRhY2hlZCIgdG8gdGhlIGRvY3VtZW50Ci0JCS8vIGJlZm9yZSBjb250ZW50IGlzIHNldCBpbiB0aGUgbW9kZWwsIHNvIHRhZ2xpYiBpbml0aXphdGlvbiBjYW4KLQkJLy8gdGFrZSBwbGFjZS4KLQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCS8vCi0JCS8vIAotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgInJlaW5pdGlhbGl6ZSIgc2luY2UgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhdCBsZWFzdCB0aGUKLQkgKiBkZWZhdWx0IG9uZSBhc3NpZ25lZCwgYmVmb3JlIHdlIHN0YXJ0IGNoZWNraW5nIHRoZSBzdHJlYW0KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVJbml0aWFsaXplRW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIEVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkRW1iZWRkZWRDb250ZW50VHlwZSwgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdFbWJlZGRlZENvbnRlbnRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBjaGVjayBwcm9ncmFtIGxvZ2ljCi0JCUFzc2VydC5pc05vdE51bGwob2xkRW1iZWRkZWRDb250ZW50VHlwZSwgIlByb2dyYW0gZXJyb3I6IGludmFsaWQgY2FsbCBkdXJpbmcgbW9kZWwgaW5pdGlhbGl6YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBvbmNlIHdlIGtub3cgdGhlIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSwgd2UgbmVlZCB0byBzZXQgaXQgaW4gdGhlCi0JCS8vIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIC4uLiB0aGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMKLQkJLy8gY3JpdGljYWwgaGVyZSwgdGhlIGRvYyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBidXQgaXRzIGNvbnRlbnRzIG5vdAotCQkvLyBzZXQKLQkJLy8geWV0LAotCQkvLyBhbmQgYWxsIGZhY3RvcmllcyBtdXN0IGhhdmUgYmVlbiBzZXQgdXAgYWxzby4KLQkJWE1MTW9kZWwgZG9tTW9kZWwgPSAoWE1MTW9kZWwpIG1vZGVsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlYTUxEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSBkb2N1bWVudC5nZXRFeGlzdGluZ0FkYXB0ZXIoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikKLQkJLy8gZG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikKLQkJLy8gZG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCS8vIHNpbmNlICdkb2N1bWVudCcgaXMgbm90IHJlY3JlYXRlZCBpbiB0aGlzCi0JCS8vIHJlaW5pdCBwYXRoLCB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgYWRhcHRlcnMsCi0JCS8vIGV4Y2VwdCBmb3IgdGhlIHByb3BhZ2F0ZWQgYWRhcHRlcnMgKGluY2x1ZGluZyBwYWdlCi0JCS8vIGRpcmVjdGl2ZSBhZGFwdGVyLCBhbmQgbW9kZWwgcXVlcnkgYWRhcHRlcikuCi0JCS8vIHRvIGFjY29tcGxpc2ggdGhpcywgd2UnbGwganVzdCByZW1vdmUgYWxsLCB0aGVuCi0JCS8vIGFkZCBiYWNrIHdpdGggYSBjYWxsIHRvIHByZS1sb2FkIGFkYXB0LgotCQkvLyBsZXQgY2xpZW50cyBkZWNpZGUgdG8gdW5sb2FkIGFkYXB0ZXJzIGZyb20gZG9jdW1lbnQKLQkJLy8JCUNvbGxlY3Rpb24gb2xkQWRhcHRlcnMgPSBkb2N1bWVudC5nZXRBZGFwdGVycygpOwotCQkvLwkJSXRlcmF0b3Igb2xkQWRhcHRlcnNJdGVyYXRvciA9IG9sZEFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCS8vCQl3aGlsZSAob2xkQWRhcHRlcnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJLy8JCQlJTm9kZUFkYXB0ZXIgb2xkQWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpCi0JCS8vIG9sZEFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpOwotCQkvLwkJCWlmIChvbGRBZGFwdGVyICE9IHBhZ2VEaXJlY3RpdmVBZGFwdGVyICYmIG9sZEFkYXB0ZXIgIT0KLQkJLy8gcHJvcGFnYXRpbmdBZGFwdGVyICYmIG9sZEFkYXB0ZXIgIT0gbW9kZWxRdWVyeUFkYXB0ZXIpIHsKLQkJLy8JCQkJLy8gRE8gTk9UIHJlbW92ZSBkaXJlY3RseSEKLQkJLy8JCQkJLy8gY2FuIGNoYW5nZSBjb250ZW50cyB3aGlsZSBpbiBub3RpZml0eSBsb29wIQotCQkvLwkJCQkvL29sZEFkYXB0ZXJzSXRlcmF0b3IucmVtb3ZlKCk7Ci0JCS8vCQkJCWRvY3VtZW50LnJlbW92ZUFkYXB0ZXIob2xkQWRhcHRlcik7Ci0JCS8vCQkJfQotCQkvLwkJfQotCQkvLyBETVc6IEkgYmVsaWV2ZSBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIGlzIG5lZWRlZCwKLQkJLy8gc2luY2UgcmVsZWFzZXMgY2FjaGVkIGFkYXB0ZXJzCi0JCS8vCQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIERvY3VtZW50SW1wbCkgewotCQkvLwkJCQkJKChEb2N1bWVudEltcGwpIGRvY3VtZW50KS5yZWxlYXNlRG9jdW1lbnRUeXBlKCk7Ci0JCS8vCQkJCQkoKERvY3VtZW50SW1wbCkgZG9jdW1lbnQpLnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQkvLwkJCQl9Ci0JCS8vIHJlbWVtYmVyLCBlbWJlZGRlZCB0eXBlIGZhY3RvcmllcyBhcmUgYXV0b21hdGljYWxseSBjbGVhcmVkIHdoZW4KLQkJLy8gZW1iZWRlZFR5cGUgY2hhbmdlZAotCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUobmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCS8vCQkvLyBidXQgc3RpbGwgbmVlZCB0byBjbGVhciB0aGUgcGFnZSBkaXJlY3RpdmUgd2F0Y2hlcnMsIGFuZCBsZXQKLQkJLy8gdGhlbQotCQkvLyBiZQotCQkvLyByZWRpc2NvdmVyZWQgKHdpdGggbmV3LCBhY2N1cmF0ZSBub2RlIGFzIHRhcmdldCkKLQkJLy8JCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsZWFyUGFnZVdhdGNoZXJzKCk7Ci0JCWlmIChuZXdFbWJlZGRlZENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCW5ld0VtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCX0KLQkJLy8gYWRkaW5nIGxhbmd1YWdlIGhlcmUsIGluIHRoaXMgY29udmllbmVudCBjZW50cmFsCi0JCS8vIGxvY2F0aW9uLCBidXQgc29tZSBvYnZpb3VzIHJlbmFtaW5nIG9yIHJlZmFjdG9yaW5nCi0JCS8vIHdvdWxkbid0IGh1cnQsIGluIGZ1dHVyZS4KLQkJLy8gSSBuZWVkZWQgdG8gYWRkIHRoaXMgbGFuZ3VhZ2Ugc2V0dGluZyBmb3IgSlNQIEZyYWdtZW50IHN1cHBvcnQKLQkJLy8gTm90ZTogdGhpcyBpcyB0aGUgb25lIHRoYXQgY291bnRzLCBzaW5jZSBhdCB0aGlzIHBvaW50LAotCQkvLyB0aGUgbW9kZWwgaGFzIGFuIElELCBzbyB3ZSBjYW4gbG9vayB1cCBJRmlsZSwgZXRjLgotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShtb2RlbCk7Ci0JCWlmIChsYW5ndWFnZSAhPSBudWxsICYmIGxhbmd1YWdlLmxlbmd0aCgpID4gMCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldExhbmd1YWdlSW5QYWdlRGlyZWN0aXZlKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChuZXdNb2RlbCBpbnN0YW5jZW9mIFhNTE1vZGVsKSB7Ci0JCQlYTUxEb2N1bWVudCBkb2N1bWVudCA9ICgoWE1MTW9kZWwpIG5ld01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobmV3TW9kZWwpOwotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwMTc1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BJbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucHJlZmVyZW5jZXMuQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSlNQQ29yZVBsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRUZJWCA9ICIlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRE9VQkxFX1BSRUZJWCA9ICIlJSI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEpTUENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSlNQQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJLy8gc2V0IG1vZGVsIHByZWZlcmVuY2UgZGVmYXVsdHMKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MsIHRydWUpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUywgZmFsc2UpOwotCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGRlZmF1bHRFbmMgPSBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5VVEZfODsKLQkJU3RyaW5nIHN5c3RlbUVuYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOwkJIC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN5c3RlbUVuYyAhPSBudWxsKSB7Ci0JCQlkZWZhdWx0RW5jID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldFByZWZlcnJlZERlZmF1bHRJYW5hTmFtZShzeXN0ZW1FbmMsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlVURl84KTsKLQkJfQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCBkZWZhdWx0RW5jKTsKLQkJCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFCX1dJRFRILCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX1RBQl9XSURUSCk7Ci0KLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5GT1JNQVRUSU5HX1NVUFBPUlRFRCwgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgNzIpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTLCBmYWxzZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuSU5ERU5UX1VTSU5HX1RBQlMsIHRydWUpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUywgZmFsc2UpOwotCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuUFJFRkVSUkVEX01BUktVUF9DQVNFX1NVUFBPUlRFRCwgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSwgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFLCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJCi0JCS8vIEpTUEluZGV4TWFuYWdlciBkZXBlbmRzIG9uIFRhZ2xpYkNvbnRyb2xsZXIsIHNvIFRhZ2xpYkNvbnRyb2xsZXIKLQkJLy8gc2hvdWxkIGJlIHN0YXJ0ZWQgZmlyc3QKLQkJVGFnbGliQ29udHJvbGxlci5zdGFydHVwKCk7Ci0JCQotCQkvLyBhZGQgSlNQSW5kZXhNYW5hZ2VyIHRvIGtlZXAgSlNQIEluZGV4IHVwIHRvIGRhdGUKLQkJLy8gbGlzdGVuaW5nIGZvciBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIGFuZCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihKU1BJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKSwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQkKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwOTEKLQkJLy8gbWFrZXMgc3VyZSBJbmRleE1hbmFnZXIgaXMgYXdhcmUgb2Ygb3VyIGluZGV4ZXMKLQkJSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2F2ZUluZGV4ZXMoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gc3RvcCBsaXN0ZW5pbmcKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkpOwotCQkvLyBzdG9wIGFueSBzZWFyY2hpbmcvaW5kZXhpbmcKLQkJSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNldENhbmNlbGVkKHRydWUpOwotCQkgCi0JCVRhZ2xpYkNvbnRyb2xsZXIuc2h1dGRvd24oKTsKLQkJCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBzID0gdmFsdWUudHJpbSgpOwotCQlpZiAoIXMuc3RhcnRzV2l0aChLRVlfUFJFRklYLCAwKSkKLQkJCXJldHVybiBzOwotCQlpZiAocy5zdGFydHNXaXRoKEtFWV9ET1VCTEVfUFJFRklYLCAwKSkKLQkJCXJldHVybiBzLnN1YnN0cmluZygxKTsKLQotCQlpbnQgaXggPSBzLmluZGV4T2YoJyAnKTsKLQkJU3RyaW5nIGtleSA9IGl4ID09IC0xID8gcyA6IHMuc3Vic3RyaW5nKDAsIGl4KTsKLQotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkuc3Vic3RyaW5nKDEpKSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYTY0ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSlNQU2VhcmNoU3VwcG9ydC4wPUpTUCBTZWFyY2ggaW5kZXhpbmcgd29ya3NwYWNlCi1KU1BJbmRleE1hbmFnZXIuMD1VcGRhdGluZyBKU1AgSW5kZXgKLUpTUEluZGV4TWFuYWdlci4xPVByb2Nlc3NpbmcgcmVzb3VyY2UgZGVsdGEKLUpTUEluZGV4TWFuYWdlci4yPUpTUCBJbmRleGVyIGluZGV4aW5nIHswfSBmaWxlcwotSlNQSW5kZXhNYW5hZ2VyLjM9SlNQIEluZGV4ZXIgaW5kZXhpbmcgZmlsZSB7MH0KLUpTUEluZGV4TWFuYWdlci40PUpTUCBJbmRleGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1ZGNkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZiBkZXNpcmVkLAotICogdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMgcGx1Z2luLiBPdGhlcgotICogcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIEBwYXJhbSBsZXZlbCBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLCBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24gZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGggL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRXcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50V3JhcHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2ZTY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRXcmFwcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTUNvbnRlbnRXcmFwcGVySW1wbCBleHRlbmRzIENNTm9kZVdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Db250ZW50IHsKLQotCXByaXZhdGUgQ01Db250ZW50IGZDTUNvbnRlbnQgPSBudWxsOwotCi0JLyoqCi0JICogQ01Db250ZW50V3JhcHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwcmVmaXggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnRXcmFwcGVySW1wbChTdHJpbmcgcHJlZml4LCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQgbm9kZSkgewotCQlzdXBlcihwcmVmaXgsIG5vZGUpOwotCQlmQ01Db250ZW50ID0gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBmQ01Db250ZW50LmdldE1heE9jY3VyKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0JICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gZkNNQ29udGVudC5nZXRNaW5PY2N1cigpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZDTUNvbnRlbnQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRXcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFdyYXBwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTc3MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFdyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnRtb2RlbC5DTU5vZGVXcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudFdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudCwgQ01Ob2RlV3JhcHBlciB7Ci0KLQljbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQkJcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUhhc2h0YWJsZSBnZXRIYXNodGFibGUoKSB7Ci0JCQlyZXR1cm4gdGFibGU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiB0YWJsZS5zaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIChDTU5vZGUpIHRhYmxlLmdldChuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJaW50IHNpemUgPSB0YWJsZS5zaXplKCk7Ci0JCQlpZiAoaW5kZXggPCBzaXplKSB7Ci0JCQkJSXRlcmF0b3IgdmFsdWVzID0gaXRlcmF0b3IoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8PSBpbmRleDsgaSsrKSB7Ci0JCQkJCXJlc3VsdCA9IHZhbHVlcy5uZXh0KCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChDTU5vZGUpIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiB0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lLCBDTU5vZGUgYU5vZGUpIHsKLQkJCWlmIChuYW1lICE9IG51bGwgJiYgYU5vZGUgIT0gbnVsbCkKLQkJCQl0YWJsZS5wdXQobmFtZSwgYU5vZGUpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENNTmFtZXNwYWNlSW1wbCBpbXBsZW1lbnRzIENNTmFtZXNwYWNlIHsKLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBDTURvY3VtZW50V3JhcHBlckltcGwudGhpcy5nZXRVUkkoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQ01Ob2RlLk5BTUVfU1BBQ0U7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJCXJldHVybiBDTURvY3VtZW50V3JhcHBlckltcGwudGhpcy5nZXRQcmVmaXgoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQkJcmV0dXJuIENNRG9jdW1lbnRXcmFwcGVySW1wbC50aGlzLmdldFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIGZlYXR1cmUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcCBmRWxlbWVudHMgPSBudWxsOwotCXByaXZhdGUgQ01OYW1lZE5vZGVNYXAgZkVudGl0aWVzID0gbnVsbDsKLQlwcml2YXRlIENNTmFtZXNwYWNlIGZOYW1lc3BhY2UgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZlByZWZpeDsKLQlwcml2YXRlIFN0cmluZyBmVVJJOwotCi0JcHVibGljIENNRG9jdW1lbnRXcmFwcGVySW1wbChTdHJpbmcgbmV3VVJJLCBTdHJpbmcgbmV3UHJlZml4LCBDTURvY3VtZW50IHRsZCkgewotCQlmVVJJID0gbmV3VVJJOwotCQlmUHJlZml4ID0gbmV3UHJlZml4OwotCQlmRG9jdW1lbnQgPSB0bGQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudHMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCWlmIChmRWxlbWVudHMgPT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKTsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBlbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsKGZQcmVmaXgsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50cygpLml0ZW0oaSkpOwotCQkJCWVsZW1lbnRzLnNldE5hbWVkSXRlbShlZC5nZXROb2RlTmFtZSgpLCBlZCk7Ci0JCQl9Ci0JCQlmRWxlbWVudHMgPSBlbGVtZW50czsKLQkJfQotCQlyZXR1cm4gZkVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIGdldEVudGl0aWVzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRW50aXR5RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCWlmIChmRW50aXRpZXMgPT0gbnVsbCkgewotCQkJZkVudGl0aWVzID0gZ2V0RG9jdW1lbnQoKS5nZXRFbnRpdGllcygpOwotCQl9Ci0JCXJldHVybiBmRW50aXRpZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZXNwYWNlIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lc3BhY2UKLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gZk5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKS5nZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICoKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIGZQcmVmaXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudCgpLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCXJldHVybiBmVVJJOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50KCkuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBlYjhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsIGV4dGVuZHMgQ01Ob2RlV3JhcHBlckltcGwgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0JcHJpdmF0ZSBDTUNvbnRlbnQgZkNNQ29udGVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZkVsZW1lbnREZWNsID0gbnVsbDsKLQotCS8qKgotCSAqIENNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwcmVmaXggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsKFN0cmluZyBwcmVmaXgsIENNRWxlbWVudERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJc3VwZXIocHJlZml4LCBub2RlKTsKLQkJZkVsZW1lbnREZWNsID0gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgQXR0cmlidXRlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q01Db250ZW50IG1ldGhvZAotCSAqIEByZXR1cm4gQ01Db250ZW50Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhpcyBlbGVtZW50J3MgY29udGVudCBtb2RlbC4KLQkgKiBUaGlzIGNhbiBiZSBhbiBDTUVsZW1lbnREZWNsYXJhdGlvbiBvciBhIENNR3JvdXAKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCWlmIChmQ01Db250ZW50ID09IG51bGwpIHsKLQkJCUNNQ29udGVudCBjb250ZW50ID0gZkVsZW1lbnREZWNsLmdldENvbnRlbnQoKTsKLQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIENNR3JvdXApCi0JCQkJZkNNQ29udGVudCA9IG5ldyBDTUdyb3VwV3JhcHBlckltcGwoZlByZWZpeCwgKENNR3JvdXApIGNvbnRlbnQpOwotCQkJZWxzZQotCQkJCWZDTUNvbnRlbnQgPSBuZXcgQ01Db250ZW50V3JhcHBlckltcGwoZlByZWZpeCwgY29udGVudCk7Ci0JCX0KLQkJcmV0dXJuIGZDTUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q29udGVudFR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0RGF0YVR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50TmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMb2NhbEVsZW1lbnRzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGxvY2FsbHkgZGVmaW5lZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldE1heE9jY3VyKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0JICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldE1pbk9jY3VyKCk7Ci0JfQotCi0JcHVibGljIENNTm9kZSBnZXRPcmlnaW5Ob2RlKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwV3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTMxZTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBXcmFwcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgQ01Hcm91cFdyYXBwZXJJbXBsIGV4dGVuZHMgQ01Db250ZW50V3JhcHBlckltcGwgaW1wbGVtZW50cyBDTUdyb3VwIHsKLQljbGFzcyBDTU5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIENNTm9kZUxpc3QgewotCQlwcml2YXRlIExpc3Qgbm9kZXMgPSBudWxsOwotCi0JCS8qKgotCQkgKiBDTU5vZGVMaXN0SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCQkgKi8KLQkJcHVibGljIENNTm9kZUxpc3RJbXBsKCkgewotCQkJc3VwZXIoKTsKLQkJCW5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlCi0JCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZQotCQkgKi8KLQkJcHVibGljIHZvaWQgYXBwZW5kSXRlbShDTU5vZGUgbm9kZSkgewotCQkJbm9kZXMuYWRkKG5vZGUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGdldExlbmd0aCBtZXRob2QKLQkJICogQHJldHVybiBpbnQKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIG5vZGVzLnNpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBpdGVtIG1ldGhvZAotCQkgKiBAcmV0dXJuIENNTm9kZQotCQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JCSAqLwotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG5vZGVzLnNpemUoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoQ01Ob2RlKSBub2Rlcy5nZXQoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDTU5vZGVMaXN0IGZDaGlsZE5vZGVzID0gbnVsbDsKLQlwcml2YXRlIENNR3JvdXAgZkdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIENNR3JvdXBXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHByZWZpeCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNR3JvdXBXcmFwcGVySW1wbChTdHJpbmcgcHJlZml4LCBDTUdyb3VwIG5vZGUpIHsKLQkJc3VwZXIocHJlZml4LCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDaGlsZE5vZGVzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlTGlzdAotCSAqCi0JICogUmV0dXJucyBjaGlsZCBDTU5vZGVMaXN0LCB3aGljaCBpbmNsdWRlcyBFbGVtZW50RGVmaW5pdGlvbiBvciBDTUVsZW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJaWYgKGZDaGlsZE5vZGVzID09IG51bGwpIHsKLQkJCUNNTm9kZUxpc3RJbXBsIGNoaWxkTm9kZXMgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSBmR3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQ01Ob2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDTUdyb3VwKQotCQkJCQljaGlsZE5vZGVzLmFwcGVuZEl0ZW0obmV3IENNR3JvdXBXcmFwcGVySW1wbChmUHJlZml4LCAoQ01Hcm91cCkgY2hpbGQpKTsKLQkJCQllbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIENNRWxlbWVudERlY2xhcmF0aW9uKQotCQkJCQljaGlsZE5vZGVzLmFwcGVuZEl0ZW0obmV3IENNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwoZlByZWZpeCwgKENNRWxlbWVudERlY2xhcmF0aW9uKSBjaGlsZCkpOwotCQkJCWVsc2UKLQkJCQkJLy8gZXJyb3I/Ci0JCQkJCWNoaWxkTm9kZXMuYXBwZW5kSXRlbShuZXcgQ01Ob2RlV3JhcHBlckltcGwoZlByZWZpeCwgY2hpbGQpKTsKLQkJCX0KLQkJCWZDaGlsZE5vZGVzID0gY2hpbGROb2RlczsKLQkJfQotCQlyZXR1cm4gZkNoaWxkTm9kZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0T3BlcmF0aW9uIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0JICovCi0JcHVibGljIGludCBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIGZHcm91cC5nZXRPcGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZHcm91cDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZVdyYXBwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyY2Y5NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnRtb2RlbC5DTU5vZGVXcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgQ01Ob2RlV3JhcHBlckltcGwgaW1wbGVtZW50cyBDTU5vZGUsIENNTm9kZVdyYXBwZXIgewotCXByaXZhdGUgQ01Ob2RlIGZOb2RlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmTm9kZU5hbWUgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBmUHJlZml4ID0gbnVsbDsKLQotCS8qKgotCSAqIENNTm9kZVdyYXBwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlV3JhcHBlckltcGwoU3RyaW5nIHByZWZpeCwgQ01Ob2RlIG5vZGUpIHsKLQkJc3VwZXIoKTsKLQkJZlByZWZpeCA9IHByZWZpeDsKLQkJZk5vZGUgPSBub2RlOwotCi0JCWZOb2RlTmFtZSA9IGZQcmVmaXggKyAiOiIgKyBmTm9kZS5nZXROb2RlTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGZOb2RlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIGZOb2RlLmdldE5vZGVUeXBlKCk7Ci0JfQotCi0JcHVibGljIENNTm9kZSBnZXRPcmlnaW5Ob2RlKCkgewotCQlyZXR1cm4gZk5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmTm9kZS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGZOb2RlLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lUYWdsaWJJbmRleExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JVGFnbGliSW5kZXhMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWMzYTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lUYWdsaWJJbmRleExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBJVGFnbGliSW5kZXhMaXN0ZW5lciB7Ci0Jdm9pZCBpbmRleENoYW5nZWQoSVRhZ2xpYlJlY29yZEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lUYWdsaWJSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lUYWdsaWJSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0MjMxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JVGFnbGliUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2xpYlJlY29yZCB7Ci0Jc2hvcnQgSkFSID0gMSA8PCAyOwotCXNob3J0IFRBR0RJUiA9IDEgPDwgNDsKLQlzaG9ydCBUTEQgPSAxIDw8IDE7Ci0Jc2hvcnQgVVJMID0gMTsKLQlzaG9ydCBXRUJfWE1MID0gMSA8PCAzOwotCi0Jc2hvcnQgZ2V0UmVjb3JkVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSVRhZ2xpYlJlY29yZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JVGFnbGliUmVjb3JkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkZTU4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JVGFnbGliUmVjb3JkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBJVGFnbGliUmVjb3JkRXZlbnQgewotCUlUYWdsaWJSZWNvcmQgZ2V0VGFnbGliUmVjb3JkKCk7Ci0KLQlzaG9ydCBnZXRUeXBlKCk7Ci0KLQlzaG9ydCBBREQgPSAxOwotCXNob3J0IENIQU5HRSA9IDEgPDwgMTsKLQlzaG9ydCBSRU1PVkUgPSAxIDw8IDI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQQ01Eb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3ZmNjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBmYWN0b3J5IGZvciBKU1AgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSlNQQ01Eb2N1bWVudEZhY3RvcnkgewotCi0Jc3RhdGljIGNsYXNzIENNRG9jSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnQgewotCQlwdWJsaWMgQ01Eb2NJbXBsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgamNtID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkpTUDExX0RPQ19UWVBFKTsKLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIGpjbS5nZXROb2RlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBqY20uZ2V0Tm9kZVR5cGUoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJCXJldHVybiBqY20uZ2V0RWxlbWVudHMoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJCXJldHVybiBqY20uZ2V0RW50aXRpZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCQlyZXR1cm4gamNtLmdldE5hbWVzcGFjZSgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgbXljbTsKLQotCXByaXZhdGUgSlNQQ01Eb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCWlmIChteWNtID09IG51bGwpIHsKLQkJCW15Y20gPSBuZXcgQ01Eb2NJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIG15Y207Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0phclJlY29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSmFyUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYjQxMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSmFyUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotCi1wdWJsaWMgY2xhc3MgSmFyUmVjb3JkIGltcGxlbWVudHMgSVRhZ2xpYlJlY29yZCB7Ci0JSVBhdGggbG9jYXRpb247Ci0JTGlzdCB1cmxSZWNvcmRzOwotCi0JcHVibGljIHNob3J0IGdldFJlY29yZFR5cGUoKSB7Ci0JCXJldHVybiBJVGFnbGliUmVjb3JkLkpBUjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFVSTFJlY29yZHMoKSB7Ci0JCXJldHVybiB1cmxSZWNvcmRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb2plY3REZXNjcmlwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvamVjdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjhiZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvamVjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkphclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotY2xhc3MgUHJvamVjdERlc2NyaXB0aW9uIHsKLQotCWNsYXNzIERlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkuZW5kc1dpdGgoIi50bGQiKSkgewotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCXJlbW92ZVRMRChkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWFkZFRMRChkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpKSB7Ci0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJcmVtb3ZlSkFSKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWRkSkFSKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGFnIikgfHwgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkuZW5kc1dpdGgoIi50YWd4IikpIHsKLQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCQlyZW1vdmVUYWdEaXIoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhZGRUYWdEaXIoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkuZXF1YWxzKFdFQl9YTUwpICYmIGRlbHRhLmdldFJlc291cmNlKCkuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLmVxdWFscyhXRUJfSU5GKSkgewotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCXJlbW92ZVNlcnZsZXRzKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWRkU2VydmxldHMoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCWNsYXNzIEluZGV4ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCWlmIChwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoIi50bGQiKSkgewotCQkJCQlhZGRUTEQocHJveHkucmVxdWVzdFJlc291cmNlKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgewotCQkJCQlhZGRKQVIocHJveHkucmVxdWVzdFJlc291cmNlKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoIi50YWciKSB8fCBwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoIi50YWd4IikpIHsKLQkJCQkJYWRkVGFnRGlyKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocHJveHkuZ2V0TmFtZSgpLmVxdWFscyhXRUJfWE1MKSAmJiBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5nZXRQYXJlbnQoKS5nZXROYW1lKCkuZXF1YWxzKFdFQl9JTkYpKSB7Ci0JCQkJCWFkZFNlcnZsZXRzKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCWNsYXNzIFRhZ2xpYlJlY29yZEV2ZW50IGltcGxlbWVudHMgSVRhZ2xpYlJlY29yZEV2ZW50IHsKLQkJSVRhZ2xpYlJlY29yZCBmVGFnbGliUmVjb3JkID0gbnVsbDsKLQkJc2hvcnQgZlR5cGUgPSAtMTsKLQotCQlUYWdsaWJSZWNvcmRFdmVudChJVGFnbGliUmVjb3JkIHJlY29yZCwgc2hvcnQgdHlwZSkgewotCQkJZlRhZ2xpYlJlY29yZCA9IHJlY29yZDsKLQkJCWZUeXBlID0gdHlwZTsKLQkJfQotCi0JCXB1YmxpYyBJVGFnbGliUmVjb3JkIGdldFRhZ2xpYlJlY29yZCgpIHsKLQkJCXJldHVybiBmVGFnbGliUmVjb3JkOwotCQl9Ci0KLQkJcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gZlR5cGU7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBfZGVidWdJbmRleENyZWF0aW9uID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvaW5kZXhjcmVhdGlvbiIpKTsKLQlzdGF0aWMgYm9vbGVhbiBfZGVidWdJbmRleFRpbWUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleHRpbWUiKSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFdFQl9JTkZfUEFUSCA9IG5ldyBQYXRoKCJXRUItSU5GIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9YTUwgPSAid2ViLnhtbCI7Ci0KLQkvKgotCSAqIFJlY29yZHMgYWN0aXZlIEpBUnMgb24gdGhlIGNsYXNzcGF0aC4gVGFnbGliIGRlc2NyaXB0b3JzIHNob3VsZCBiZQotCSAqIHVzYWJsZSwgYnV0IHRoZSBqYXJzIGJ5IHRoZW1zZWx2ZXMgc2hvdWxkIG5vdC4KLQkgKi8KLQlIYXNodGFibGUgZkNsYXNzcGF0aEphcnM7Ci0KLQkvLyBob2xkcyByZWZlcmVuY2VzIGJ5IFVSSSB0byBUTERzCi0JSGFzaHRhYmxlIGZDbGFzc3BhdGhSZWZlcmVuY2VzOwotCi0JLy8gdGhpcyB0YWJsZSBpcyBzcGVjaWFsIGluIHRoYXQgaXQgaG9sZHMgdGFibGVzIG9mIHJlZmVyZW5jZXMgYWNjb3JkaW5nCi0JLy8gdG8gbG9jYWwgcm9vdHMKLQlIYXNodGFibGUgZkltcGxpY2l0UmVmZXJlbmNlczsKLQlIYXNodGFibGUgZkpBUlJlZmVyZW5jZXM7Ci0JSVByb2plY3QgZlByb2plY3Q7Ci0KLQlTdGFjayBmUHJvamVjdFN0YWNrID0gbnVsbDsKLQlIYXNodGFibGUgZlNlcnZsZXRSZWZlcmVuY2VzOwotCUhhc2h0YWJsZSBmVGFnRGlyUmVmZXJlbmNlczsKLQotCUhhc2h0YWJsZSBmVExEUmVmZXJlbmNlczsKLQotCUlSZXNvdXJjZURlbHRhVmlzaXRvciBmVmlzaXRvcjsKLQotCXByaXZhdGUgbG9uZyB0aW1lMDsKLQotCVByb2plY3REZXNjcmlwdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcm9qZWN0ID0gcHJvamVjdDsKLQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmQ2xhc3NwYXRoSmFycyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZKQVJSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZlRhZ0RpclJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmVExEUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZTZXJ2bGV0UmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZJbXBsaWNpdFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCX0KLQotCXZvaWQgYWRkQ2xhc3NwYXRoTGlicmFyeShTdHJpbmcgbGlicmFyeUxvY2F0aW9uKSB7Ci0JCVN0cmluZ1tdIGVudHJpZXMgPSBKYXJVdGlsaXRpZXMuZ2V0RW50cnlOYW1lcyhsaWJyYXJ5TG9jYXRpb24pOwotCQlKYXJSZWNvcmQgbGlicmFyeVJlY29yZCA9IChKYXJSZWNvcmQpIGNyZWF0ZUpBUlJlY29yZChsaWJyYXJ5TG9jYXRpb24pOwotCQlmQ2xhc3NwYXRoSmFycy5wdXQobGlicmFyeUxvY2F0aW9uLCBsaWJyYXJ5UmVjb3JkKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZW50cmllc1tpXS5lbmRzV2l0aCgiLnRsZCIpKSB7Ci0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0obGlicmFyeUxvY2F0aW9uLCBlbnRyaWVzW2ldKTsKLQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdXJpID0gZXh0cmFjdFVSSShsaWJyYXJ5TG9jYXRpb24sIGNvbnRlbnRzKTsKLQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCVVSTFJlY29yZCByZWNvcmQgPSBuZXcgVVJMUmVjb3JkKCk7Ci0JCQkJCQlyZWNvcmQudXJpID0gdXJpOwotCQkJCQkJcmVjb3JkLmJhc2VMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbjsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmVjb3JkLnVybCA9IG5ldyBVUkwoImphcjpmaWxlOiIgKyBsaWJyYXJ5TG9jYXRpb24gKyAiIS8iICsgZW50cmllc1tpXSk7Ci0JCQkJCQkJbGlicmFyeVJlY29yZC51cmxSZWNvcmRzLmFkZChyZWNvcmQpOwotCQkJCQkJCWZDbGFzc3BhdGhSZWZlcmVuY2VzLnB1dCh1cmksIHJlY29yZCk7Ci0JCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlZCByZWNvcmQgZm9yICIgKyB1cmkgKyAiQCIgKyByZWNvcmQuZ2V0VVJMKCkpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gZG9uJ3QgcmVjb3JkIHRoaXMgVVJJCi0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQobGlicmFyeVJlY29yZCwgSVRhZ2xpYlJlY29yZEV2ZW50LkFERCkpOwotCX0KLQotCXZvaWQgYWRkSkFSKElSZXNvdXJjZSBqYXIpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0aW5nIHJlY29yZHMgZm9yIEpBUiAiICsgamFyLmdldEZ1bGxQYXRoKCkpOwotCQlTdHJpbmcgamFyTG9jYXRpb25TdHJpbmcgPSBqYXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlTdHJpbmdbXSBlbnRyaWVzID0gSmFyVXRpbGl0aWVzLmdldEVudHJ5TmFtZXMoamFyKTsKLQkJSmFyUmVjb3JkIGphclJlY29yZCA9IChKYXJSZWNvcmQpIGNyZWF0ZUpBUlJlY29yZChqYXIpOwotCQlmSkFSUmVmZXJlbmNlcy5wdXQoamFyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgamFyUmVjb3JkKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZW50cmllc1tpXS5lbmRzV2l0aCgiLnRsZCIpKSB7Ci0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0oamFyLCBlbnRyaWVzW2ldKTsKLQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdXJpID0gZXh0cmFjdFVSSShqYXJMb2NhdGlvblN0cmluZywgY29udGVudHMpOwotCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJVVJMUmVjb3JkIHJlY29yZCA9IG5ldyBVUkxSZWNvcmQoKTsKLQkJCQkJCXJlY29yZC51cmkgPSB1cmk7Ci0JCQkJCQlyZWNvcmQuYmFzZUxvY2F0aW9uID0gamFyTG9jYXRpb25TdHJpbmc7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJlY29yZC51cmwgPSBuZXcgVVJMKCJqYXI6ZmlsZToiICsgamFyTG9jYXRpb25TdHJpbmcgKyAiIS8iICsgZW50cmllc1tpXSk7Ci0JCQkJCQkJamFyUmVjb3JkLnVybFJlY29yZHMuYWRkKHJlY29yZCk7Ci0JCQkJCQkJZ2V0SW1wbGljaXRSZWZlcmVuY2VzKGphckxvY2F0aW9uU3RyaW5nKS5wdXQodXJpLCByZWNvcmQpOwotCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZWQgcmVjb3JkIGZvciAiICsgdXJpICsgIkAiICsgcmVjb3JkLmdldFVSTCgpKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGRvbid0IHJlY29yZCB0aGlzIFVSSQotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KGphclJlY29yZCwgSVRhZ2xpYlJlY29yZEV2ZW50LkFERCkpOwotCX0KLQotCXZvaWQgYWRkU2VydmxldHMoSVJlc291cmNlIHdlYnhtbCkgewotCQlpZiAod2VieG1sLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybjsKLQkJSW5wdXRTdHJlYW0gd2VieG1sQ29udGVudHMgPSBudWxsOwotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3ZWJ4bWxDb250ZW50cyA9ICgoSUZpbGUpIHdlYnhtbCkuZ2V0Q29udGVudHModHJ1ZSk7Ci0JCQlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCXByb3ZpZGVyLnNldElucHV0U3RyZWFtKHdlYnhtbENvbnRlbnRzKTsKLQkJCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQkJcHJvdmlkZXIuc2V0QmFzZVJlZmVyZW5jZSh3ZWJ4bWwuZ2V0UGFyZW50KCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCWRvY3VtZW50ID0gcHJvdmlkZXIuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHdlYnhtbENvbnRlbnRzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJd2VieG1sQ29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJfQotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0aW5nIHJlY29yZHMgZm9yICIgKyB3ZWJ4bWwuZ2V0RnVsbFBhdGgoKSk7Ci0KLQkJU2VydmxldFJlY29yZCBzZXJ2bGV0UmVjb3JkID0gbmV3IFNlcnZsZXRSZWNvcmQoKTsKLQkJc2VydmxldFJlY29yZC5sb2NhdGlvbiA9IHdlYnhtbC5nZXRMb2NhdGlvbigpOwotCQlmU2VydmxldFJlZmVyZW5jZXMucHV0KHNlcnZsZXRSZWNvcmQuZ2V0V2ViWE1MKCkudG9TdHJpbmcoKSwgc2VydmxldFJlY29yZCk7Ci0JCU5vZGVMaXN0IHRhZ2xpYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnbGlicy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgdXJpID0gcmVhZFRleHRvZkNoaWxkKHRhZ2xpYnMuaXRlbShpKSwgInRhZ2xpYi11cmkiKTsKLQkJCS8vIHNwZWNpZmllZCBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byByb290IG9mIHRoZSB3ZWJhcHAKLQkJCVN0cmluZyBsb2NhdGlvbiA9IHJlYWRUZXh0b2ZDaGlsZCh0YWdsaWJzLml0ZW0oaSksICJ0YWdsaWItbG9jYXRpb24iKTsKLQkJCVRMRFJlY29yZCByZWNvcmQgPSBuZXcgVExEUmVjb3JkKCk7Ci0JCQlyZWNvcmQudXJpID0gdXJpOwotCQkJaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkgewotCQkJCXJlY29yZC5sb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQoZ2V0TG9jYWxSb290KHdlYnhtbC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpICsgbG9jYXRpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVjb3JkLmxvY2F0aW9uID0gbmV3IFBhdGgoVVJJSGVscGVyLm5vcm1hbGl6ZShsb2NhdGlvbiwgd2VieG1sLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgZ2V0TG9jYWxSb290KHdlYnhtbC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpKSk7Ci0JCQl9Ci0JCQlzZXJ2bGV0UmVjb3JkLnRsZFJlY29yZHMuYWRkKHJlY29yZCk7Ci0JCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXMod2VieG1sLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSkucHV0KHVyaSwgcmVjb3JkKTsKLQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlZCByZWNvcmQgZm9yICIgKyB1cmkgKyAiQCIgKyByZWNvcmQubG9jYXRpb24pOwotCQl9Ci0JCVRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQoc2VydmxldFJlY29yZCwgSVRhZ2xpYlJlY29yZEV2ZW50LkFERCkpOwotCX0KLQotCXZvaWQgYWRkVGFnRGlyKElSZXNvdXJjZSB0YWdGaWxlKSB7Ci0JCXJldHVybjsKLQkJLyoqCi0JCSAqIE1ha2Ugc3VyZSB0aGUgdGFnIGZpbGUgaXMgbiBhIFdFQi1JTkYvdGFncyBmb2xkZXIgYmVjYXVzZSBvZiB0aGUKLQkJICogc2hvcnRuYW1lIGNvbXB1dGF0aW9uIHJlcXVpcmVtZW50cwotCQkgKi8KLQkJLy8gaWYgKCh0YWdGaWxlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpID4gMCB8fAotCQkvLyB0YWdGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5pbmRleE9mKCJXRUItSU5GL3RhZ3MiKSA8IDApCi0JCS8vIHJldHVybjsKLQkJLy8gVGFnRGlyUmVjb3JkIHJlY29yZCA9IGNyZWF0ZVRhZ2RpclJlY29yZCh0YWdGaWxlKTsKLQkJLy8gaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCS8vIHJlY29yZC50YWdzLmFkZCh0YWdGaWxlLmdldE5hbWUoKSk7Ci0JCS8vIH0KLQl9Ci0KLQl2b2lkIGFkZFRMRChJUmVzb3VyY2UgdGxkKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGluZyByZWNvcmQgZm9yICIgKyB0bGQuZ2V0RnVsbFBhdGgoKSk7Ci0JCVRMRFJlY29yZCByZWNvcmQgPSBjcmVhdGVUTERSZWNvcmQodGxkKTsKLQkJZlRMRFJlZmVyZW5jZXMucHV0KHRsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlY29yZCk7Ci0JCWlmIChyZWNvcmQudXJpICE9IG51bGwpIHsKLQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyh0bGQuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKS5wdXQocmVjb3JkLnVyaSwgcmVjb3JkKTsKLQkJfQotCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZCwgSVRhZ2xpYlJlY29yZEV2ZW50LkFERCkpOwotCX0KLQotCXZvaWQgY2xlYXIoKSB7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVRhZ2xpYlJlY29yZCBjcmVhdGVKQVJSZWNvcmQoSVJlc291cmNlIGphcikgewotCQlyZXR1cm4gY3JlYXRlSkFSUmVjb3JkKGphci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgSVRhZ2xpYlJlY29yZCBjcmVhdGVKQVJSZWNvcmQoU3RyaW5nIGZpbGVMb2NhdGlvbikgewotCQlKYXJSZWNvcmQgcmVjb3JkID0gbmV3IEphclJlY29yZCgpOwotCQlyZWNvcmQubG9jYXRpb24gPSBuZXcgUGF0aChmaWxlTG9jYXRpb24pOwotCQlyZWNvcmQudXJsUmVjb3JkcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCXJldHVybiByZWNvcmQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCVRhZ0RpclJlY29yZCBjcmVhdGVUYWdkaXJSZWNvcmQoSVJlc291cmNlIHRhZ0ZpbGUpIHsKLQkJSUNvbnRhaW5lciB0YWdkaXIgPSB0YWdGaWxlLmdldFBhcmVudCgpOwotCQlTdHJpbmcgdGFnZGlyTG9jYXRpb24gPSB0YWdkaXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlUYWdEaXJSZWNvcmQgcmVjb3JkID0gKFRhZ0RpclJlY29yZCkgZlRhZ0RpclJlZmVyZW5jZXMuZ2V0KHRhZ2RpckxvY2F0aW9uKTsKLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSBuZXcgVGFnRGlyUmVjb3JkKCk7Ci0JCQlyZWNvcmQubG9jYXRpb24gPSB0YWdkaXIuZ2V0RnVsbFBhdGgoKTsKLQkJCS8vIEpTUCAyLjAgc2VjdGlvbiA4LjQuMwotCQkJaWYgKHRhZ2Rpci5nZXROYW1lKCkuZXF1YWxzKCJ0YWdzIikpCi0JCQkJcmVjb3JkLnNob3J0TmFtZSA9ICJ0YWdzIjsKLQkJCWVsc2UgewotCQkJCUlQYXRoIHRhZ2RpclBhdGggPSB0YWdkaXIuZ2V0RnVsbFBhdGgoKTsKLQkJCQlTdHJpbmdbXSBzZWdtZW50cyA9IHRhZ2RpclBhdGguc2VnbWVudHMoKTsKLQkJCQlmb3IgKGludCBpID0gMTsgcmVjb3JkLnNob3J0TmFtZSA9PSBudWxsICYmIGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2VnbWVudHNbaSAtIDFdLmVxdWFscygiV0VCLUlORiIpICYmIHNlZ21lbnRzW2ldLmVxdWFscygidGFncyIpKSB7Ci0JCQkJCQlJUGF0aCB0YWdkaXJMb2NhbFBhdGggPSB0YWdkaXJQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoaSArIDEpOwotCQkJCQkJcmVjb3JkLnNob3J0TmFtZSA9IHRhZ2RpckxvY2FsUGF0aC50b1N0cmluZygpLnJlcGxhY2UoJy8nLCAnLScpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJcmV0dXJuIHJlY29yZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUTERSZWNvcmQgY3JlYXRlVExEUmVjb3JkKElSZXNvdXJjZSB0bGQpIHsKLQkJVExEUmVjb3JkIHJlY29yZCA9IG5ldyBUTERSZWNvcmQoKTsKLQkJcmVjb3JkLmxvY2F0aW9uID0gdGxkLmdldExvY2F0aW9uKCk7Ci0JCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbnRlbnRzID0gKChJRmlsZSkgdGxkKS5nZXRDb250ZW50cyh0cnVlKTsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSByZWNvcmQubG9jYXRpb24udG9TdHJpbmcoKTsKLQkJCVN0cmluZyBkZWZhdWx0VVJJID0gZXh0cmFjdFVSSShiYXNlTG9jYXRpb24sIGNvbnRlbnRzKTsKLQkJCWlmIChkZWZhdWx0VVJJICE9IG51bGwgJiYgZGVmYXVsdFVSSS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZWNvcmQudXJpID0gZGVmYXVsdFVSSTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlY29yZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGxkQ29udGVudHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFVSSShTdHJpbmcgYmFzZUxvY2F0aW9uLCBJbnB1dFN0cmVhbSB0bGRDb250ZW50cykgewotCQlTdHJpbmdCdWZmZXIgdXJpID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlOb2RlIHJlc3VsdCA9IG51bGw7Ci0JCURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRG9jdW1lbnRQcm92aWRlcigpOwotCQlwcm92aWRlci5zZXRJbnB1dFN0cmVhbSh0bGRDb250ZW50cyk7Ci0JCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKGJhc2VMb2NhdGlvbik7Ci0JCXJlc3VsdCA9IHByb3ZpZGVyLmdldFJvb3RFbGVtZW50KCk7Ci0JCWlmIChyZXN1bHQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBudWxsOwotCQlFbGVtZW50IHRhZ2xpYkVsZW1lbnQgPSAoRWxlbWVudCkgcmVzdWx0OwotCQlpZiAodGFnbGliRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlOb2RlIGNoaWxkID0gdGFnbGliRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCAmJiAhKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5VUkkpKSkgewotCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJTm9kZSB0ZXh0ID0gY2hpbGQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCXdoaWxlICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJaWYgKHRleHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCB0ZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpIHsKLQkJCQkJCXVyaS5hcHBlbmQodGV4dC5nZXROb2RlVmFsdWUoKS50cmltKCkpOwotCQkJCQl9Ci0JCQkJCXRleHQgPSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB1cmkudG9TdHJpbmcoKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgTGlzdCBnZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKElQYXRoIGxvY2F0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gaW1wbGljaXRSZWZlcmVuY2VzID0gZ2V0SW1wbGljaXRSZWZlcmVuY2VzKGxvY2F0aW9uLnRvU3RyaW5nKCkpLnZhbHVlcygpOwotCQlMaXN0IHJlY29yZHMgPSBuZXcgQXJyYXlMaXN0KGZUTERSZWZlcmVuY2VzLnNpemUoKSArIGZUYWdEaXJSZWZlcmVuY2VzLnNpemUoKSArIGZKQVJSZWZlcmVuY2VzLnNpemUoKSArIGZTZXJ2bGV0UmVmZXJlbmNlcy5zaXplKCkpOwotCQlyZWNvcmRzLmFkZEFsbChmVExEUmVmZXJlbmNlcy52YWx1ZXMoKSk7Ci0JCXJlY29yZHMuYWRkQWxsKGZUYWdEaXJSZWZlcmVuY2VzLnZhbHVlcygpKTsKLQkJcmVjb3Jkcy5hZGRBbGwoZkpBUlJlZmVyZW5jZXMudmFsdWVzKCkpOwotCQlyZWNvcmRzLmFkZEFsbChmU2VydmxldFJlZmVyZW5jZXMudmFsdWVzKCkpOwotCQlyZWNvcmRzLmFkZEFsbChpbXBsaWNpdFJlZmVyZW5jZXMpOwotCQlyZXR1cm4gcmVjb3JkczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGltcGxpY2l0UmVmZXJlbmNlcyBmb3IgdGhlIGdpdmVuIHBhdGgKLQkgKi8KLQlIYXNodGFibGUgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKFN0cmluZyBsb2NhdGlvbikgewotCQlTdHJpbmcgbG9jYWxSb290ID0gZ2V0TG9jYWxSb290KGxvY2F0aW9uKTsKLQkJSGFzaHRhYmxlIGltcGxpY2l0UmVmZXJlbmNlcyA9IChIYXNodGFibGUpIGZJbXBsaWNpdFJlZmVyZW5jZXMuZ2V0KGxvY2FsUm9vdCk7Ci0JCWlmIChpbXBsaWNpdFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJaW1wbGljaXRSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgxKTsKLQkJCWZJbXBsaWNpdFJlZmVyZW5jZXMucHV0KGxvY2FsUm9vdCwgaW1wbGljaXRSZWZlcmVuY2VzKTsKLQkJfQotCQlyZXR1cm4gaW1wbGljaXRSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBhcHBsaWNhYmxlIFdlYiBjb250ZXh0IHJvb3QgcGF0aCwgaWYgb25lIGV4aXN0cwotCSAqLwotCUlQYXRoIGdldExvY2FsUm9vdChJUGF0aCBiYXNlTG9jYXRpb24pIHsKLQkJSVJlc291cmNlIGZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihiYXNlTG9jYXRpb24pOwotCQl3aGlsZSAoZmlsZSAhPSBudWxsKSB7Ci0JCQkvKioKLQkJCSAqIFRyZWF0IGFueSBwYXJlbnQgZm9sZGVyIHdpdGggYSBXRUItSU5GIHN1YmZvbGRlciBhcyBhIHdlYi1hcHAKLQkJCSAqIHJvb3QKLQkJCSAqLwotCQkJSUNvbnRhaW5lciBmb2xkZXIgPSBudWxsOwotCQkJaWYgKChmaWxlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApIHsKLQkJCQlmb2xkZXIgPSAoSUNvbnRhaW5lcikgZmlsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvbGRlciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQkvLyBnZXRGb2xkZXIgb24gYSB3b3Jrc3BhY2Ugcm9vdCBtdXN0IHVzZSBhIGZ1bGwgcGF0aCwgc2tpcAotCQkJaWYgKGZvbGRlciAhPSBudWxsICYmIChmb2xkZXIuZ2V0VHlwZSgpICYgSVJlc291cmNlLlJPT1QpID09IDApIHsKLQkJCQlJRm9sZGVyIHdlYmluZiA9IGZvbGRlci5nZXRGb2xkZXIoV0VCX0lORl9QQVRIKTsKLQkJCQlpZiAod2ViaW5mICE9IG51bGwgJiYgd2ViaW5mLmV4aXN0cygpKSB7Ci0JCQkJCXJldHVybiBmb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaWxlID0gZmlsZS5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCXJldHVybiBmUHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYWxSb290KFN0cmluZyBiYXNlTG9jYXRpb24pIHsKLQkJcmV0dXJuIGdldExvY2FsUm9vdChuZXcgUGF0aChiYXNlTG9jYXRpb24pKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmlzaXRvci4KLQkgKi8KLQlJUmVzb3VyY2VEZWx0YVZpc2l0b3IgZ2V0VmlzaXRvcigpIHsKLQkJaWYgKGZWaXNpdG9yID09IG51bGwpIHsKLQkJCWZWaXNpdG9yID0gbmV3IERlbHRhVmlzaXRvcigpOwotCQl9Ci0JCXJldHVybiBmVmlzaXRvcjsKLQl9Ci0KLQl2b2lkIGluZGV4KCkgewotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlmVExEUmVmZXJlbmNlcy5jbGVhcigpOwotCQlmSkFSUmVmZXJlbmNlcy5jbGVhcigpOwotCQlmVGFnRGlyUmVmZXJlbmNlcy5jbGVhcigpOwotCQlmU2VydmxldFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJdHJ5IHsKLQkJCWZQcm9qZWN0LmFjY2VwdChuZXcgSW5kZXhlcigpLCAwKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXhlZCAiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7Ci0JfQotCi0Jdm9pZCBpbmRleENsYXNzcGF0aCgpIHsKLQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJZlByb2plY3RTdGFjayA9IG5ldyBTdGFjaygpOwotCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcy5jbGVhcigpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZlByb2plY3QpOwotCQlpbmRleENsYXNzcGF0aChqYXZhUHJvamVjdCk7Ci0JCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImluZGV4ZWQgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgY2xhc3NwYXRoIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhDbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsICYmIGphdmFQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQlmUHJvamVjdFN0YWNrLnB1c2goamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQl0cnkgewotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiA6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6IHsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIElnbm9yZSBsaWJzIGluIHJlcXVpcmVkIHByb2plY3RzIHRoYXQgYXJlIG5vdAotCQkJCQkJCSAqIGV4cG9ydGVkCi0JCQkJCQkJICovCi0JCQkJCQkJaWYgKGZQcm9qZWN0U3RhY2suc2l6ZSgpIDwgMiB8fCBlbnRyeS5pc0V4cG9ydGVkKCkpIHsKLQkJCQkJCQkJSVBhdGggbGliUGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJCQkJaWYgKGxpYlBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCWFkZENsYXNzcGF0aExpYnJhcnkobGliUGF0aC50b1N0cmluZygpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCUlGaWxlIGxpYkZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobGliUGF0aCk7Ci0JCQkJCQkJCQlpZiAobGliRmlsZSAhPSBudWxsICYmIGxpYkZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCQlhZGRDbGFzc3BhdGhMaWJyYXJ5KGxpYkZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDogewotCQkJCQkJCS8qCi0JCQkJCQkJICogSWdub3JlIHJlcXVpcmVkIHByb2plY3RzIG9mIHJlcXVpcmVkIHByb2plY3RzCi0JCQkJCQkJICogdGhhdCBhcmUgbm90IGV4cG9ydGVkCi0JCQkJCQkJICovCi0JCQkJCQkJaWYgKGZQcm9qZWN0U3RhY2suc2l6ZSgpIDwgMiB8fCBlbnRyeS5pc0V4cG9ydGVkKCkpIHsKLQkJCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChlbnRyeS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKSk7Ci0JCQkJCQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIWZQcm9qZWN0U3RhY2suY29udGFpbnMocHJvamVjdC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJCQlpbmRleENsYXNzcGF0aChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3Igc2VhcmNoaW5nIEphdmEgQnVpbGQgUGF0aCArICgiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIikgZm9yIHRhZyBsaWJyYXJpZXMiLCBlKTsKLQkJCX0KLQkJCWZQcm9qZWN0U3RhY2sucG9wKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWRUZXh0b2ZDaGlsZChOb2RlIG5vZGUsIFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpIHsKLQkJCQlOb2RlIHRleHQgPSBjaGlsZC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJd2hpbGUgKHRleHQgIT0gbnVsbCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHRleHQuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpKTsKLQkJCQkJdGV4dCA9IHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXZvaWQgcmVtb3ZlQ2xhc3NwYXRoTGlicmFyeShTdHJpbmcgbGlicmFyeUxvY2F0aW9uKSB7Ci0JCUphclJlY29yZCByZWNvcmQgPSAoSmFyUmVjb3JkKSBmQ2xhc3NwYXRoSmFycy5yZW1vdmUobGlicmFyeUxvY2F0aW9uKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlVUkxSZWNvcmRbXSByZWNvcmRzID0gKFVSTFJlY29yZFtdKSByZWNvcmQuZ2V0VVJMUmVjb3JkcygpLnRvQXJyYXkobmV3IFVSTFJlY29yZFswXSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcy5yZW1vdmUocmVjb3Jkc1tpXS5nZXRVUkkoKSk7Ci0JCQl9Ci0JCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZCwgSVRhZ2xpYlJlY29yZEV2ZW50LlJFTU9WRSkpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVKQVIoSVJlc291cmNlIGphcikgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVtb3ZpbmcgcmVjb3JkcyBmb3IgSkFSICIgKyBqYXIuZ2V0RnVsbFBhdGgoKSk7Ci0JCUphclJlY29yZCByZWNvcmQgPSAoSmFyUmVjb3JkKSBmSkFSUmVmZXJlbmNlcy5yZW1vdmUoamFyLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCVVSTFJlY29yZFtdIHJlY29yZHMgPSAoVVJMUmVjb3JkW10pIHJlY29yZC5nZXRVUkxSZWNvcmRzKCkudG9BcnJheShuZXcgVVJMUmVjb3JkWzBdKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyhqYXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKS5yZW1vdmUocmVjb3Jkc1tpXS5nZXRVUkkoKSk7Ci0JCQl9Ci0JCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZCwgSVRhZ2xpYlJlY29yZEV2ZW50LlJFTU9WRSkpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVTZXJ2bGV0cyhJUmVzb3VyY2Ugd2VieG1sKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZW1vdmluZyByZWNvcmRzIGZvciAiICsgd2VieG1sLmdldEZ1bGxQYXRoKCkpOwotCQlTZXJ2bGV0UmVjb3JkIHJlY29yZCA9IChTZXJ2bGV0UmVjb3JkKSBmU2VydmxldFJlZmVyZW5jZXMucmVtb3ZlKHdlYnhtbC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCVRMRFJlY29yZFtdIHJlY29yZHMgPSAoVExEUmVjb3JkW10pIHJlY29yZC5nZXRUTERSZWNvcmRzKCkudG9BcnJheShuZXcgVExEUmVjb3JkWzBdKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbW92ZWQgcmVjb3JkIGZvciAiICsgcmVjb3Jkc1tpXS51cmkgKyAiQCIgKyByZWNvcmRzW2ldLmxvY2F0aW9uKTsKLQkJCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXMod2VieG1sLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSkucmVtb3ZlKHJlY29yZHNbaV0uZ2V0VVJJKCkpOwotCQkJfQotCQkJVGFnbGliSW5kZXguZmlyZVRhZ2xpYlJlY29yZEV2ZW50KG5ldyBUYWdsaWJSZWNvcmRFdmVudChyZWNvcmQsIElUYWdsaWJSZWNvcmRFdmVudC5SRU1PVkUpKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFnRGlyKElSZXNvdXJjZSB0YWdGaWxlKSB7Ci0JCS8vIElDb250YWluZXIgdGFnZGlyID0gdGFnRmlsZS5nZXRQYXJlbnQoKTsKLQkJLy8gU3RyaW5nIHRhZ2RpckxvY2F0aW9uID0gdGFnZGlyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJLy8gZlRhZ0RpclJlZmVyZW5jZXMucmVtb3ZlKHRhZ2RpckxvY2F0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlbW92ZVRMRChJUmVzb3VyY2UgdGxkKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZW1vdmluZyByZWNvcmQgZm9yICIgKyB0bGQuZ2V0RnVsbFBhdGgoKSk7Ci0JCVRMRFJlY29yZCByZWNvcmQgPSAoVExEUmVjb3JkKSBmVExEUmVmZXJlbmNlcy5yZW1vdmUodGxkLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCWlmIChyZWNvcmQudXJpICE9IG51bGwpIHsKLQkJCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXModGxkLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSkucmVtb3ZlKHJlY29yZC51cmkpOwotCQkJfQotCQkJVGFnbGliSW5kZXguZmlyZVRhZ2xpYlJlY29yZEV2ZW50KG5ldyBUYWdsaWJSZWNvcmRFdmVudChyZWNvcmQsIElUYWdsaWJSZWNvcmRFdmVudC5SRU1PVkUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JSVRhZ2xpYlJlY29yZCByZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSkgewotCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IG51bGw7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFdvcmthcm91bmQgZm9yIHByb2JsZW0gaW4gVVJJSGVscGVyOyB1cmlzIHN0YXJ0aW5nIHdpdGggJy8nIGFyZQotCQkgKiByZXR1cm5lZCBhcy1pcy4KLQkJICovCi0JCWlmIChyZWZlcmVuY2Uuc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQlsb2NhdGlvbiA9IGdldExvY2FsUm9vdChiYXNlUGF0aCkgKyByZWZlcmVuY2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsb2NhdGlvbiA9IFVSSUhlbHBlci5ub3JtYWxpemUocmVmZXJlbmNlLCBiYXNlUGF0aCwgZ2V0TG9jYWxSb290KGJhc2VQYXRoKSk7Ci0JCX0KLQkJLy8gb3JkZXIgZGljdGF0ZWQgYnkgSlNQIHNwZWMgMi4wIHNlY3Rpb24gNy4yLjMKLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZlNlcnZsZXRSZWZlcmVuY2VzLmdldChsb2NhdGlvbik7Ci0JCX0KLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZkpBUlJlZmVyZW5jZXMuZ2V0KGxvY2F0aW9uKTsKLQkJfQotCQlpZiAocmVjb3JkID09IG51bGwpIHsKLQkJCXJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmVExEUmVmZXJlbmNlcy5nZXQobG9jYXRpb24pOwotCQl9Ci0JCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGdldEltcGxpY2l0UmVmZXJlbmNlcyhiYXNlUGF0aCkuZ2V0KHJlZmVyZW5jZSk7Ci0JCX0KLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZlRhZ0RpclJlZmVyZW5jZXMuZ2V0KGxvY2F0aW9uKTsKLQkJfQotCQlpZiAocmVjb3JkID09IG51bGwpIHsKLQkJCXJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5nZXQocmVmZXJlbmNlKTsKLQkJfQotCQlyZXR1cm4gcmVjb3JkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1NlcnZsZXRSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1NlcnZsZXRSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5NDA2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9TZXJ2bGV0UmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0UmVjb3JkIGltcGxlbWVudHMgSVRhZ2xpYlJlY29yZCB7Ci0JSVBhdGggbG9jYXRpb247Ci0JTGlzdCB0bGRSZWNvcmRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCXB1YmxpYyBzaG9ydCBnZXRSZWNvcmRUeXBlKCkgewotCQlyZXR1cm4gSVRhZ2xpYlJlY29yZC5XRUJfWE1MOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2VieG1sLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRXZWJYTUwoKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUTERSZWNvcmRzKCkgewotCQlyZXR1cm4gdGxkUmVjb3JkczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UTERSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RMRFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTA3N2E5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RMRFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0KLXB1YmxpYyBjbGFzcyBUTERSZWNvcmQgaW1wbGVtZW50cyBJVGFnbGliUmVjb3JkIHsKLQlJUGF0aCBsb2NhdGlvbjsKLQlTdHJpbmcgdXJpOwotCi0JcHVibGljIHNob3J0IGdldFJlY29yZFR5cGUoKSB7Ci0JCXJldHVybiBJVGFnbGliUmVjb3JkLlRMRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpbGVzeXN0ZW0gbG9jYXRpb24uCi0JICovCi0JcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnRGlyUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdEaXJSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1MDRkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdEaXJSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLQotcHVibGljIGNsYXNzIFRhZ0RpclJlY29yZCBpbXBsZW1lbnRzIElUYWdsaWJSZWNvcmQgewotCUlQYXRoIGxvY2F0aW9uOwotCVN0cmluZyBzaG9ydE5hbWU7Ci0JLy8gYSBMaXN0IGhvbGRpbmcgU3RyaW5ncyBvZiAudGFnIGFuZCAudGFneCBmaWxlbmFtZXMgcmVsYXRpdmUgdG8gdGhlCi0JLy8gdGFnZGlyJ3MgbG9jYXRpb24KLQlMaXN0IHRhZ3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJcmV0dXJuIElUYWdsaWJSZWNvcmQuVEFHRElSOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2hvcnROYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQlyZXR1cm4gc2hvcnROYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFncy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VGFncygpIHsKLQkJcmV0dXJuIChTdHJpbmdbXSkgdGFncy50b0FycmF5KG5ldyBTdHJpbmdbdGFncy5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdsaWJDb250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdsaWJDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2ExNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnbGliQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogUHJvdmlkZXMgYSBkaXJlY3QgbWFwcGluZyBmcm9tIElTdHJ1Y3R1cmVkRG9jdW1lbnQgdG8gc3VwcG9ydGluZwotICogVExEQ01Eb2N1bWVudE1hbmFnZXIuCi0gKiAKLSAqIExpc3RlbnMgdG8gdGhlIGNyZWF0aW9uIG9mIEpTUCB0eXBlIFRleHRGaWxlQnVmZmVycyBhbmQgZm9yY2VzIGEgdGV4dC1sZXNzCi0gKiByZXBhcnNlIGFmdGVyIGNvbm5lY3RpbmcgdGFnbGliLXN1cHBvcnRpbmcgbGlzdGVuZXJzLiBDb25uZWN0aW5nIHRoZQotICogbGlzdGVuZXJzIGJlZm9yZSB0aGUgdGV4dCBpcyBzZXQgd291bGQgYmUgaWRlYWwsIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8KLSAqIGxvb2sgdXAgdGFnbGliIHJlZmVyZW5jZXMgc2luY2UgdGhlIGxvY2F0aW9uIGlzIG5vdCB5ZXQga25vd2FibGUuIFNpbmNlCi0gKiB0YWdsaWJzIGNhbiBhZmZlY3QgdGhlIHBhcnNpbmcgb2YgdGhlIGRvY3VtZW50LCBhIHJlcGFyc2UgaXMgY3VycmVudGx5Ci0gKiByZXF1aXJlZCB0byByZWFjdCB0byBjdXN0b20gdGFncyB3aXRoIHRhZ2RlcGVuZGVudCBjb250ZW50LgotICogCi0gKiBUT0RPOiBSZW1vdmUgdGhlIHJlcGFyc2UgcGVuYWx0eS4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkNvbnRyb2xsZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50IHsKLQotCWNsYXNzIERvY3VtZW50SW5mbyB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCUlUZXh0RmlsZUJ1ZmZlciB0ZXh0RmlsZUJ1ZmZlcjsKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgdGxkRG9jdW1lbnRNYW5hZ2VyOwotCX0KLQotCWNsYXNzIEZpbGVCdWZmZXJMaXN0ZW5lciBpbXBsZW1lbnRzIElGaWxlQnVmZmVyTGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI2J1ZmZlckNvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYnVmZmVyQ29udGVudEFib3V0VG9CZVJlcGxhY2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjYnVmZmVyQ29udGVudFJlcGxhY2VkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWZmZXJDb250ZW50UmVwbGFjZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNidWZmZXJDcmVhdGVkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWZmZXJDcmVhdGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9ICgoSVRleHRGaWxlQnVmZmVyKSBidWZmZXIpLmdldERvY3VtZW50KCk7Ci0JCQkJLy8gaWdub3JlIG5vbi1KU1AgZG9jdW1lbnRzCi0JCQkJc3luY2hyb25pemVkIChmSlNQZG9jdW1lbnRzKSB7Ci0JCQkJCWlmICghZkpTUGRvY3VtZW50cy5jb250YWlucyhkb2N1bWVudCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUFzc2VydC5pc1RydWUoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50LCBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgU2V0dXBQYXJ0aWNpcGFudCB3YXMgY2FsbGVkIGZvciBub24tSVN0cnVjdHVyZWREb2N1bWVudCIpOwotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gbmV3IERvY3VtZW50SW5mbygpOwotCQkJCWluZm8uZG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCQkJaW5mby50ZXh0RmlsZUJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQlpbmZvLnRsZERvY3VtZW50TWFuYWdlciA9IG5ldyBUTERDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWluZm8udGxkRG9jdW1lbnRNYW5hZ2VyLnNldFNvdXJjZVBhcnNlcigoSlNQU291cmNlUGFyc2VyKSBpbmZvLmRvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJCQlzeW5jaHJvbml6ZWQgKGZEb2N1bWVudE1hcCkgewotCQkJCQlmRG9jdW1lbnRNYXAucHV0KGRvY3VtZW50LCBpbmZvKTsKLQkJCQl9Ci0JCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnJlcGFyc2UodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjYnVmZmVyRGlzcG9zZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckRpc3Bvc2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9ICgoSVRleHRGaWxlQnVmZmVyKSBidWZmZXIpLmdldERvY3VtZW50KCk7Ci0JCQkJc3luY2hyb25pemVkIChmSlNQZG9jdW1lbnRzKSB7Ci0JCQkJCWlmICghZkpTUGRvY3VtZW50cy5yZW1vdmUoZG9jdW1lbnQpKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXN5bmNocm9uaXplZCAoZkRvY3VtZW50TWFwKSB7Ci0JCQkJT2JqZWN0W10ga2V5cyA9IGZEb2N1bWVudE1hcC5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCQkJYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAmJiAhcmVtb3ZlZDsgaSsrKSB7Ci0JCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChrZXlzW2ldKTsKLQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnRleHRGaWxlQnVmZmVyLmVxdWFscyhidWZmZXIpKSB7Ci0JCQkJCQlmRG9jdW1lbnRNYXAucmVtb3ZlKGtleXNbaV0pOwotCQkJCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNkaXJ0eVN0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXJ0eVN0YXRlQ2hhbmdlZChJRmlsZUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjc3RhdGVDaGFuZ2VGYWlsZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlRmFpbGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjc3RhdGVDaGFuZ2luZyhvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2luZyhJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI3N0YXRlVmFsaWRhdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlciwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhdGVWYWxpZGF0aW9uQ2hhbmdlZChJRmlsZUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gaXNTdGF0ZVZhbGlkYXRlZCkgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjdW5kZXJseWluZ0ZpbGVEZWxldGVkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bmRlcmx5aW5nRmlsZURlbGV0ZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciN1bmRlcmx5aW5nRmlsZU1vdmVkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdW5kZXJseWluZ0ZpbGVNb3ZlZChJRmlsZUJ1ZmZlciBidWZmZXIsIElQYXRoIHBhdGgpIHsKLQkJfQotCi0KLQl9Ci0KLQlzdGF0aWMgVGFnbGliQ29udHJvbGxlciBfaW5zdGFuY2UgPSBudWxsOwotCXN0YXRpYyBwcml2YXRlIGJvb2xlYW4gZklzU2h1dGRvd24gPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgSVRleHRGaWxlQnVmZmVyIGdldEZpbGVCdWZmZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZEb2N1bWVudE1hcCkgewotCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBfaW5zdGFuY2UuZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKQotCQkJCXJldHVybiBpbmZvLnRleHRGaWxlQnVmZmVyOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUZXh0RmlsZUJ1ZmZlciBnZXRGaWxlQnVmZmVyKFRMRENNRG9jdW1lbnRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZEb2N1bWVudE1hcCkgewotCQkJSXRlcmF0b3IgZG9jSW5mb3MgPSBfaW5zdGFuY2UuZkRvY3VtZW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZG9jSW5mb3MuaGFzTmV4dCgpKSB7Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBkb2NJbmZvcy5uZXh0KCk7Ci0JCQkJaWYgKGluZm8udGxkRG9jdW1lbnRNYW5hZ2VyID09IG1hbmFnZXIpCi0JCQkJCWJ1ZmZlciA9IGluZm8udGV4dEZpbGVCdWZmZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRMRENNRG9jdW1lbnRNYW5hZ2VyIGdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBpZiBfaW5zdGFuY2UgaXMgbnVsbCwgd2UgYXJlIGFscmVhZHkgc2h1dHRpbmcgZG9udwotCQlpZiAoX2luc3RhbmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkRvY3VtZW50TWFwKSB7Ci0JCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIF9pbnN0YW5jZS5mRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJCWlmIChpbmZvICE9IG51bGwpCi0JCQkJcmV0dXJuIGluZm8udGxkRG9jdW1lbnRNYW5hZ2VyOwotCQkJcmV0dXJuIG51bGw7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXNldFNodXRkb3duKHRydWUpOwotCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5yZW1vdmVGaWxlQnVmZmVyTGlzdGVuZXIoX2luc3RhbmNlLmZCdWZmZXJMaXN0ZW5lcik7Ci0JCV9pbnN0YW5jZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlfaW5zdGFuY2UgPSBuZXcgVGFnbGliQ29udHJvbGxlcigpOwotCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5hZGRGaWxlQnVmZmVyTGlzdGVuZXIoX2luc3RhbmNlLmZCdWZmZXJMaXN0ZW5lcik7Ci0JCXNldFNodXRkb3duKGZhbHNlKTsKLQl9Ci0KLQlJRmlsZUJ1ZmZlckxpc3RlbmVyIGZCdWZmZXJMaXN0ZW5lcjsKLQlNYXAgZkRvY3VtZW50TWFwOwotCi0JTGlzdCBmSlNQZG9jdW1lbnRzOwotCi0JLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyBvbmx5IHRvIGJlIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBGaWxlQnVmZmVyCi0JLy8gZnJhbWV3b3JrCi0JcHVibGljIFRhZ2xpYkNvbnRyb2xsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZCdWZmZXJMaXN0ZW5lciA9IG5ldyBGaWxlQnVmZmVyTGlzdGVuZXIoKTsKLQkJZkpTUGRvY3VtZW50cyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZEb2N1bWVudE1hcCA9IG5ldyBIYXNoTWFwKDEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50I3NldHVwKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldHVwKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IHNodXRkb3duLCBqdXN0IGlnbm9yZQotCQlpZiAoaXNTaHV0ZG93bigpKSByZXR1cm47Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMpIHsKLQkJCV9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzLmFkZChkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NodXRkb3duKCkgewotCQlyZXR1cm4gZklzU2h1dGRvd247Ci0JfQotCQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2h1dGRvd24oYm9vbGVhbiBpc1NodXRkb3duKSB7Ci0JCWZJc1NodXRkb3duID0gaXNTaHV0ZG93bjsKLQl9Ci0JCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnbGliSW5kZXguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ2xpYkluZGV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDkxYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnbGliSW5kZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIudXRpbC5VUklIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBuaXRpbgotICogCi0gKiBBIG5vbi1leHRlbmRhYmxlIGluZGV4IG1hbmFnZXIgZm9yIHRhZ2xpYnMgc2ltaWxhciB0byB0aGUgSjJFRQotICogSVRhZ2xpYlJlZ2lzdHJ5IGJ1dCBsYWNraW5nIGFueSB0aWVzIHRvIHByb2plY3QgbmF0dXJlcy4KLSAqIAotICogSW5kZXhpbmcgaXMgbm90IHBlcnNpc3RlZCBiZXR3ZWVuIHNlc3Npb25zLCBzbyBuZXcgQUREIGV2ZW50cyB3aWxsIGJlIHNlbnQKLSAqIHRvIElUYWdsaWJJbmRleExpc3RlbmVycyBkdXJpbmcgZWFjaCB3b3JrYmVuY2ggc2Vzc2lvbi4gUkVNT1ZFIGV2ZW50cyBhcmUKLSAqIG5vdCBmaXJlZCBvbiB3b3JrYmVuY2ggc2h1dGRvd24uIEV2ZW50cyBmb3IgVEFHRElSLCBKQVIsIGFuZCBXRUJYTUwgdHlwZQotICogcmVjb3JkcyBhcmUgb25seSBmaXJlZCBmb3IgdGhlIC5qYXIgYW5kIHdlYi54bWwgZmlsZSBpdHNlbGYuIFRoZSByZWNvcmQncwotICogY29udGVudHMgc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbnkgZnVydGhlciBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkluZGV4IHsKLQotCWNsYXNzIENsYXNzcGF0aENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotCQlTdGFjayBwcm9qZWN0U3RhY2sgPSBuZXcgU3RhY2soKTsKLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlwcm9qZWN0U3RhY2suY2xlYXIoKTsKLQkJCWVsZW1lbnRDaGFuZ2VkKGV2ZW50LmdldERlbHRhKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGVsZW1lbnRDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCQlpZiAoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfTU9ERUwpIHsKLQkJCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoYW5nZWQgPSBkZWx0YS5nZXRDaGFuZ2VkQ2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZWQubGVuZ3RoOyBpKyspIHsKLQkJCQkJZWxlbWVudENoYW5nZWQoY2hhbmdlZFtpXSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xBU1NQQVRIX0NIQU5HRUQpICE9IDApIHsKLQkJCQkJSUphdmFFbGVtZW50IHByb2ogPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQkJCWhhbmRsZUNsYXNzcGF0aENoYW5nZSgoSUphdmFQcm9qZWN0KSBwcm9qKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaGFuZGxlQ2xhc3NwYXRoQ2hhbmdlKElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlwcm9qZWN0U3RhY2sucHVzaChwcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpOwotCQkJdHJ5IHsKLQkJCQkvKiBIYW5kbGUgY2hhbmdlcyB0byB0aGlzIHByb2plY3QncyBidWlsZCBwYXRoICovCi0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcHJvamVjdC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCWJvb2xlYW4gY2xhc3NwYXRoSW5kZXhJc09sZCA9IGZQcm9qZWN0RGVzY3JpcHRpb25zLmNvbnRhaW5zS2V5KHJlc291cmNlKTsKLQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb24oKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCWlmIChjbGFzc3BhdGhJbmRleElzT2xkKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5pbmRleENsYXNzcGF0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogVXBkYXRlIGluZGVjZXMgZm9yIHByb2plY3RzIHdobyBpbmNsdWRlIHRoaXMgcHJvamVjdCBpbgotCQkJCSAqIHRoZWlyIGJ1aWxkIHBhdGggKGUuZy4gdG9nZ2xpbmcgdGhlICJleHBvcnRhdGlvbiIgb2YgYQotCQkJCSAqIHRhZ2xpYiBKQVIgaW4gdGhpcyBwcm9qZWN0IGFmZmVjdHMgdGhlIEpBUidzIHZpc2liaWxpdHkgaW4KLQkJCQkgKiBvdGhlciBwcm9qZWN0cykKLQkJCQkgKi8KLQkJCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IHByb2plY3QuZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3RzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlJSmF2YVByb2plY3Qgb3RoZXJQcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJCWlmIChTdHJpbmdVdGlscy5jb250YWlucyhvdGhlclByb2plY3QuZ2V0UmVxdWlyZWRQcm9qZWN0TmFtZXMoKSwgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpLCBmYWxzZSkgJiYgIXByb2plY3RTdGFjay5jb250YWlucyhvdGhlclByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCQkJCWhhbmRsZUNsYXNzcGF0aENoYW5nZShvdGhlclByb2plY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlwcm9qZWN0U3RhY2sucG9wKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgOgotCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSA6IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIHBhaXIgZGVsdGFzIHdpdGggcHJvamVjdHMKLQkJCQkJCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gbmV3IElSZXNvdXJjZURlbHRhW117ZXZlbnQuZ2V0RGVsdGEoKX07Ci0JCQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gbnVsbDsKLQotCQkJCQkJaWYgKGRlbHRhcyAhPSBudWxsICYmIGRlbHRhcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQkJCQlpZiAoZGVsdGFzWzBdICE9IG51bGwpIHsKLQkJCQkJCQkJcmVzb3VyY2UgPSBkZWx0YXNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXJlc291cmNlID0gZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5ST09UKSB7Ci0JCQkJCQkJCQlkZWx0YXMgPSBkZWx0YXNbMF0uZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCQkJCQkJcHJvamVjdHMgPSBuZXcgSVByb2plY3RbZGVsdGFzLmxlbmd0aF07Ci0JCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCWlmIChkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJcHJvamVjdHNbaV0gPSAoSVByb2plY3QpIGRlbHRhc1tpXS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0WzFdOwotCQkJCQkJCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCQkJCQkJCXByb2plY3RzWzBdID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJcHJvamVjdHNbMF0gPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pIHsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGFnbGliSW5kZXggbm90aWNlZCAiICsgcHJvamVjdHNbaV0uZ2V0TmFtZSgpICsgIiBpcyBhYm91dCB0byBiZSBkZWxldGVkL2Nsb3NlZCIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChQcm9qZWN0RGVzY3JpcHRpb24pIGZQcm9qZWN0RGVzY3JpcHRpb25zLnJlbW92ZShwcm9qZWN0c1tpXSk7Ci0JCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVtb3ZpbmcgaW5kZXggb2YgIiArIGRlc2NyaXB0aW9uLmZQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlkZXNjcmlwdGlvbi5jbGVhcigpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgcmVzb3VyY2UgZGVsZXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgOiB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvLyBwYWlyIGRlbHRhcyB3aXRoIHByb2plY3RzCi0JCQkJCQlJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcyA9IG5ldyBJUmVzb3VyY2VEZWx0YVtde2V2ZW50LmdldERlbHRhKCl9OwotCQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG51bGw7Ci0KLQkJCQkJCWlmIChkZWx0YXMgIT0gbnVsbCAmJiBkZWx0YXMubGVuZ3RoID4gMCkgewotCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQkJaWYgKGRlbHRhc1swXSAhPSBudWxsKSB7Ci0JCQkJCQkJCXJlc291cmNlID0gZGVsdGFzWzBdLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlyZXNvdXJjZSA9IGV2ZW50LmdldFJlc291cmNlKCk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUk9PVCkgewotCQkJCQkJCQkJZGVsdGFzID0gZGVsdGFzWzBdLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0W2RlbHRhcy5sZW5ndGhdOwotCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQlpZiAoZGVsdGFzW2ldLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQkJCQkJCXByb2plY3RzW2ldID0gKElQcm9qZWN0KSBkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFsxXTsKLQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQlwcm9qZWN0c1swXSA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCXByb2plY3RzWzBdID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoZGVsdGFzW2ldICE9IG51bGwgJiYgZGVsdGFzW2ldLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEICYmIHByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb24ocHJvamVjdHNbaV0pOwotCQkJCQkJCQkJCWRlbHRhc1tpXS5hY2NlcHQoZGVzY3JpcHRpb24uZ2V0VmlzaXRvcigpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICghcHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkgfHwgKGRlbHRhc1tpXSAhPSBudWxsICYmIGRlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkpIHsKLQkJCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRhZ2xpYkluZGV4IG5vdGljZWQgIiArIHByb2plY3RzW2ldLmdldE5hbWUoKSArICIgaXMgbm8gbG9uZ2VyIGFjY2Vzc2libGUiKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMucmVtb3ZlKHByb2plY3RzW2ldKTsKLQkJCQkJCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZW1vdmluZyBpbmRleCBvZiAiICsgZGVzY3JpcHRpb24uZlByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQlkZXNjcmlwdGlvbi5jbGVhcigpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgcmVzb3VyY2UgY2hhbmdlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z0NoYW5nZUxpc3RlbmVyID0gZmFsc2U7Ci0Jc3RhdGljIGJvb2xlYW4gX2RlYnVnSW5kZXhDcmVhdGlvbiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4Y3JlYXRpb24iKSk7Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUmVzb2x1dGlvbiA9ICJ0cnVlIi5lcXVhbHMoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvcmVzb2x2ZSIpKTsKLQotCXN0YXRpYyBUYWdsaWJJbmRleCBfaW5zdGFuY2U7Ci0KLQlzdGF0aWMgewotCQlfaW5zdGFuY2UgPSBuZXcgVGFnbGliSW5kZXgoKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBmaXJlVGFnbGliUmVjb3JkRXZlbnQoSVRhZ2xpYlJlY29yZEV2ZW50IGV2ZW50KSB7Ci0JCUlUYWdsaWJJbmRleExpc3RlbmVyW10gbGlzdGVuZXJzID0gX2luc3RhbmNlLmZUYWdsaWJJbmRleExpc3RlbmVyczsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCWxpc3RlbmVyc1tpXS5pbmRleENoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIG9mIHRoZSB2aXNpYmxlIElUYWdsaWJSZWNvcmRzIGZvciB0aGUgZ2l2ZW4gZmlsZXBhdGggaW4gdGhlCi0JICogd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSB3b3Jrc3BhY2VQYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVRhZ2xpYlJlY29yZFtdIGdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoSVBhdGggd29ya3NwYWNlUGF0aCkgewotCQlJVGFnbGliUmVjb3JkW10gcmVjb3JkcyA9IF9pbnN0YW5jZS5pbnRlcm5hbEdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMod29ya3NwYWNlUGF0aCk7Ci0JCXJldHVybiByZWNvcmRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGV4dFJvb3QoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gX2luc3RhbmNlLmludGVybmFsR2V0Q29udGV4dFJvb3QocGF0aCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVRhZ2xpYkluZGV4TGlzdGVuZXIoSVRhZ2xpYkluZGV4TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJX2luc3RhbmNlLmludGVybmFsUmVtb3ZlVGFnbGliSW5kZXhMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhIG1hdGNoaW5nIElUYWdsaWJSZWNvcmQgZ2l2ZW4gdGhlIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVBhdGggLQotCSAqICAgICAgICAgICAgdGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoIGZvciBJUmVzb3VyY2VzLCBmdWxsIGZpbGVzeXN0ZW0KLQkgKiAgICAgICAgICAgIHBhdGggb3RoZXJ3aXNlCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBjcm9zc1Byb2plY3RzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVRhZ2xpYlJlY29yZCByZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSwgYm9vbGVhbiBjcm9zc1Byb2plY3RzKSB7Ci0JCUlUYWdsaWJSZWNvcmQgcmVzdWx0ID0gX2luc3RhbmNlLmludGVybmFsUmVzb2x2ZShiYXNlUGF0aCwgcmVmZXJlbmNlLCBjcm9zc1Byb2plY3RzKTsKLQkJaWYgKF9kZWJ1Z1Jlc29sdXRpb24pIHsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGFnbGliSW5kZXggY291bGQgbm90IHJlc29sdmUgXCIiICsgcmVmZXJlbmNlICsgIlwiIGZyb20gIiArIGJhc2VQYXRoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN3aXRjaCAocmVzdWx0LmdldFJlY29yZFR5cGUoKSkgewotCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJCQlUTERSZWNvcmQgcmVjb3JkID0gKFRMRFJlY29yZCkgcmVzdWx0OwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUYWdsaWJJbmRleCByZXNvbHZlZCAiICsgYmFzZVBhdGggKyAiOiIgKyByZWZlcmVuY2UgKyAiID0gIiArIHJlY29yZC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQkJCUphclJlY29yZCByZWNvcmQgPSAoSmFyUmVjb3JkKSByZXN1bHQ7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRhZ2xpYkluZGV4IHJlc29sdmVkICIgKyBiYXNlUGF0aCArICI6IiArIHJlZmVyZW5jZSArICIgPSAiICsgcmVjb3JkLmdldExvY2F0aW9uKCkpOwotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UQUdESVIpIDogewotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCQkJVVJMUmVjb3JkIHJlY29yZCA9IChVUkxSZWNvcmQpIHJlc3VsdDsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGFnbGliSW5kZXggcmVzb2x2ZWQgIiArIGJhc2VQYXRoICsgIjoiICsgcmVmZXJlbmNlICsgIiA9ICIgKyByZWNvcmQuZ2V0VVJMKCkpOwotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENsYXNzcGF0aENoYW5nZUxpc3RlbmVyIGZDbGFzc3BhdGhDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0KLQlNYXAgZlByb2plY3REZXNjcmlwdGlvbnM7Ci0JcHJpdmF0ZSBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJVGFnbGliSW5kZXhMaXN0ZW5lcltdIGZUYWdsaWJJbmRleExpc3RlbmVycyA9IG51bGw7Ci0KLQlwcml2YXRlIFRhZ2xpYkluZGV4KCkgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJZkNsYXNzcGF0aENoYW5nZUxpc3RlbmVyID0gbmV3IENsYXNzcGF0aENoYW5nZUxpc3RlbmVyKCk7Ci0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkNsYXNzcGF0aENoYW5nZUxpc3RlbmVyKTsKLQkJZlByb2plY3REZXNjcmlwdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFRhZ2xpYkluZGV4TGlzdGVuZXIoSVRhZ2xpYkluZGV4TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJX2luc3RhbmNlLmludGVybmFsQWRkVGFnbGliSW5kZXhMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JUHJvamVjdERlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMuZ2V0KHByb2plY3QpOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb24gPSBuZXcgUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QpOwotCQkJZGVzY3JpcHRpb24uaW5kZXgoKTsKLQkJCWRlc2NyaXB0aW9uLmluZGV4Q2xhc3NwYXRoKCk7Ci0JCQlmUHJvamVjdERlc2NyaXB0aW9ucy5wdXQocHJvamVjdCwgZGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGludGVybmFsQWRkVGFnbGliSW5kZXhMaXN0ZW5lcihJVGFnbGliSW5kZXhMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZlRhZ2xpYkluZGV4TGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWZUYWdsaWJJbmRleExpc3RlbmVycyA9IG5ldyBJVGFnbGliSW5kZXhMaXN0ZW5lcltde2xpc3RlbmVyfTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZUYWdsaWJJbmRleExpc3RlbmVycykpOwotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQlmVGFnbGliSW5kZXhMaXN0ZW5lcnMgPSAoSVRhZ2xpYkluZGV4TGlzdGVuZXJbXSkgbGlzdGVuZXJzLnRvQXJyYXkobmV3IElUYWdsaWJJbmRleExpc3RlbmVyWzBdKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVRhZ2xpYlJlY29yZFtdIGludGVybmFsR2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhJUGF0aCBsb2NhdGlvbikgewotCQlJVGFnbGliUmVjb3JkW10gcmVjb3JkcyA9IG51bGw7Ci0JCUlGaWxlIGJhc2VSZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShsb2NhdGlvbik7Ci0JCWlmIChiYXNlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGJhc2VSZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBjcmVhdGVEZXNjcmlwdGlvbihwcm9qZWN0KTsKLQkJCUxpc3QgYXZhaWxhYmxlUmVjb3JkcyA9IGRlc2NyaXB0aW9uLmdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMobG9jYXRpb24pOwotCQkJcmVjb3JkcyA9IChJVGFnbGliUmVjb3JkW10pIGF2YWlsYWJsZVJlY29yZHMudG9BcnJheShyZWNvcmRzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlY29yZHMgPSBuZXcgSVRhZ2xpYlJlY29yZFswXTsKLQkJfQotCQlyZXR1cm4gcmVjb3JkczsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGludGVybmFsR2V0Q29udGV4dFJvb3QoSVBhdGggcGF0aCkgewotCQlJRmlsZSBiYXNlUmVzb3VyY2UgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihwYXRoKTsKLQkJaWYgKGJhc2VSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gYmFzZVJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IF9pbnN0YW5jZS5jcmVhdGVEZXNjcmlwdGlvbihwcm9qZWN0KTsKLQkJCUlQYXRoIHJvb3RQYXRoID0gZGVzY3JpcHRpb24uZ2V0TG9jYWxSb290KGJhc2VSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKHJvb3RQYXRoKTsKLQkJfQotCQkvLyB0cnkgdG8gaGFuZGxlIG91dC1vZi13b3Jrc3BhY2UgcGF0aHMKLQkJSVBhdGggcm9vdCA9IHBhdGg7Ci0JCXdoaWxlIChyb290ICE9IG51bGwgJiYgIXJvb3QuaXNSb290KCkpCi0JCQlyb290ID0gcm9vdC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyb290ID0gcGF0aDsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbnRlcm5hbFJlbW92ZVRhZ2xpYkluZGV4TGlzdGVuZXIoSVRhZ2xpYkluZGV4TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZUYWdsaWJJbmRleExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmVGFnbGliSW5kZXhMaXN0ZW5lcnMpKTsKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJZlRhZ2xpYkluZGV4TGlzdGVuZXJzID0gKElUYWdsaWJJbmRleExpc3RlbmVyW10pIGxpc3RlbmVycy50b0FycmF5KG5ldyBJVGFnbGliSW5kZXhMaXN0ZW5lclswXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElUYWdsaWJSZWNvcmQgaW50ZXJuYWxSZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSwgYm9vbGVhbiBjcm9zc1Byb2plY3RzKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlJVGFnbGliUmVjb3JkIHJlc29sdmVkID0gbnVsbDsKLQkJSUZpbGUgYmFzZVJlc291cmNlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24obmV3IFBhdGgoYmFzZVBhdGgpKTsKLQkJaWYgKGJhc2VSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlwcm9qZWN0ID0gYmFzZVJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGNyZWF0ZURlc2NyaXB0aW9uKHByb2plY3QpOwotCQkJcmVzb2x2ZWQgPSBkZXNjcmlwdGlvbi5yZXNvbHZlKGJhc2VQYXRoLCByZWZlcmVuY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdHJ5IHNpbXBsZSBmaWxlIHN1cHBvcnQgb3V0c2lkZSBvZiB0aGUgd29ya3NwYWNlCi0JCQlGaWxlIGJhc2VGaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0U3lzdGVtRmlsZUF0TG9jYXRpb24obmV3IFBhdGgoYmFzZVBhdGgpKTsKLQkJCWlmIChiYXNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5vcm1hbGl6ZWRSZWZlcmVuY2UgPSBVUklIZWxwZXIubm9ybWFsaXplKHJlZmVyZW5jZSwgYmFzZVBhdGgsICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobm9ybWFsaXplZFJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCVRMRFJlY29yZCByZWNvcmQgPSBuZXcgVExEUmVjb3JkKCk7Ci0JCQkJCXJlY29yZC5sb2NhdGlvbiA9IG5ldyBQYXRoKG5vcm1hbGl6ZWRSZWZlcmVuY2UpOwotCQkJCQlyZWNvcmQudXJpID0gcmVmZXJlbmNlOwotCQkJCQlyZXNvbHZlZCA9IHJlY29yZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1VSTFJlY29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVVJMUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NWI1NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVVJMUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLXB1YmxpYyBjbGFzcyBVUkxSZWNvcmQgaW1wbGVtZW50cyBJVGFnbGliUmVjb3JkIHsKLQlVUkwgdXJsOwotCVN0cmluZyB1cmk7Ci0JU3RyaW5nIGJhc2VMb2NhdGlvbjsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gYmFzZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBVUkxSZWNvcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldFJlY29yZFR5cGUoKSB7Ci0JCXJldHVybiBJVGFnbGliUmVjb3JkLlVSTDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIFVSTC4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGY5MzQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExERG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5TdHJpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGltcGxlbWVudHMgVExEQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBDTURhdGFUeXBlIGF0dHJUeXBlID0gbmV3IENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbjsKLQkKLQkvLwotCXByaXZhdGUgYm9vbGVhbiBmSXNGcmFnbWVudCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZPd25lckRvY3VtZW50OwotCS8vIG9wdGlvbmFsIGlkCi0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0JLy8gcmVxdWlyZWQgbmFtZQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCS8vIG9wdGlvbmFsICJyZXF1aXJlZCIgZWxlbWVudCBwcmVzZW50LCBkZWZhdWx0cyB0byBub3QgcHJlc2VudAotCXByaXZhdGUgYm9vbGVhbiByZXF1aXJlZCA9IGZhbHNlOwotCQotCS8vIG9wdGlvbmFsIHJ1bi10aW1lIChzY3JpcGxldCBkZXJpdmVkKSB2YWx1ZSBvZiBhdHRyaWJ1dGVzLCBkZWZhdWx0cyB0byBub25lL2ZhbHNlCi0JcHJpdmF0ZSBTdHJpbmcgcnRleHBydmFsdWUgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbChDTURvY3VtZW50IG93bmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZPd25lckRvY3VtZW50ID0gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0ck5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0clR5cGUgbWV0aG9kCi0JICogQHJldHVybiBDTURhdGFUeXBlCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCXJldHVybiBhdHRyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICoKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRPd25lckRvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gZk93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRMRERvY3VtZW50LkNNX0tJTkQpKSB7Ci0JCQlyZXR1cm4gVExERG9jdW1lbnQuSlNQX1RMRDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSdGV4cHJ2YWx1ZSgpIHsKLQkJcmV0dXJuIHJ0ZXhwcnZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VXNhZ2UgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKiBPUFRJT05BTHxSRVFVSVJFRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiByZXF1aXJlZCA/IFJFUVVJUkVEIDogT1BUSU9OQUw7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNGcmFnbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZyYWdtZW50KCkgewotCQlyZXR1cm4gZklzRnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlcXVpcmVkOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBpc0ZyYWdtZW50IFRoZSBpc0ZyYWdtZW50IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcmFnbWVudChib29sZWFuIGlzRnJhZ21lbnQpIHsKLQkJZklzRnJhZ21lbnQgPSBpc0ZyYWdtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdJZCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCWlkID0gbmV3SWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZU5hbWUoU3RyaW5nIHN0cmluZykgewotCQluYW1lID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSZXF1aXJlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiBuZXdSZXF1aXJlZCkgewotCQlyZXF1aXJlZCA9IG5ld1JlcXVpcmVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSZXF1aXJlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWRTdHJpbmcoU3RyaW5nIG5ld1JlcXVpcmVkKSB7Ci0JCWlmIChuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgfHwgbmV3UmVxdWlyZWQuZXF1YWxzSWdub3JlQ2FzZSgieWVzIikpIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQlzZXRSZXF1aXJlZCh0cnVlKTsKLQkJZWxzZSBpZiAobmV3UmVxdWlyZWQuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSB8fCBuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKCJubyIpKSAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJc2V0UmVxdWlyZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSdGV4cHJ2YWx1ZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnRleHBydmFsdWUoU3RyaW5nIG5ld1J0ZXhwcnZhbHVlKSB7Ci0JCXJ0ZXhwcnZhbHVlID0gbmV3UnRleHBydmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgIiArIHN1cGVyLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbmFtZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldE5vZGVOYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBCb29sZWFuLnRvU3RyaW5nKGJvb2xlYW4pIGlzIGludHJvZHVjZWQgaW4gMS40Ci0JCS8vYnVmZmVyLmFwcGVuZCgiXG5cdCByZXF1aXJlZDoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKEJvb2xlYW4udG9TdHJpbmcoaXNSZXF1aXJlZCgpKSkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IHJlcXVpcmVkOiIgKyBTdHJpbmdVdGlscy50b1N0cmluZyhpc1JlcXVpcmVkKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHJ0ZXhwcjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFJ0ZXhwcnZhbHVlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZ2V0SWQoKSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBpZDoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldElkKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRGF0YVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Y2RiMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRGF0YVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNRGF0YVR5cGVJbXBsIGltcGxlbWVudHMgQ01EYXRhVHlwZSB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFUeXBlTmFtZTsKLQotCXB1YmxpYyBDTURhdGFUeXBlSW1wbChTdHJpbmcgZGF0YVR5cGVOYW1lKSB7Ci0JCXRoaXMuZGF0YVR5cGVOYW1lID0gZGF0YVR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIHR5cGUgaXMgY3JlYXRlZC4KLQkgKiBUaGlzIHJldHVybnMgbnVsbCBvZiBhIHN1aXRhYmxlIGRlZmF1bHQgaXMgbm90IGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBkYXRhVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgIAotCSAqCi0JICogUmV0dXJucyB0aGUgaW1wbGllZCB2YWx1ZSBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0JICovCi0JcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQlyZXR1cm4gSU1QTElFRF9WQUxVRV9OT05FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBkYXRhVHlwZU5hbWU7Ci0JfQotCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY3JpYmVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRGYWN0b3J5VExELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEZhY3RvcnlUTEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhNDY2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEZhY3RvcnlUTEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuSlNQMTFUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLkpTUDIwVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExERG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExESW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLlRMRExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLlRMRFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTERWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVRhZ2xpYlJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkphclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRMRFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlVSTFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkphclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBDTURvY3VtZW50QnVpbGRlciBmb3IgVGFnbGliIERlc2NyaXB0b3JzCi0gKiAKLSAqIFJldHVybnMgbmFtZXNwYWNlLWxlc3MgQ01Eb2N1bWVudHMgZm9yIGEgdGFnbGliIGRlc2NyaXB0b3IsIGxvYWRpbmcgaXQKLSAqIGRpcmVjdGx5IGZyb20gYSBmaWxlIG9yIGV4dHJhY3RlZCBmcm9tIGEgSkFSIGFyY2hpdmUuIENvbnRlbnQgTW9kZWwgb2JqZWN0cwotICogd2lsbCBpbXBsZW1lbnQgdGhlIFRMRENNRG9jdW1lbnQsIFRMREVsZW1lbnREZWNsYXJhdGlvbiwgYW5kCi0gKiBUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbnRlcmZhY2VzIGZvciBleHRlbmRlZCBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlUTEQgaW1wbGVtZW50cyBDTURvY3VtZW50RmFjdG9yeSB7Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvZmFjdG9yeSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBDTURvY3VtZW50RmFjdG9yeVRMRCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVRMRCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgQVBJCi0JICogCi0JICogQHBhcmFtIGJhc2Vsb2NhdGlvbgotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIGJhc2Vsb2NhdGlvbiwgSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTFUTEROYW1lcy5UQUdMSUIpOwotCQlwcm92aWRlci5zZXRJbnB1dFN0cmVhbShpbnB1dCk7Ci0JCWlmIChiYXNlbG9jYXRpb24gIT0gbnVsbCkKLQkJCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2UoYmFzZWxvY2F0aW9uKTsKLQkJcmV0dXJuIGxvYWREb2N1bWVudChiYXNlbG9jYXRpb24sIHByb3ZpZGVyLmdldFJvb3RFbGVtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50RnJvbURpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgewotCQlpZiAoX2RlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBpbXBsZW1lbnRlZDogdGFnZGlyIGxvYWRpbmcgZm9yICIgKyBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE5PVCBBUEkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50RnJvbUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCS8vIGxvYWQgdGhlIHRhZ2xpYiBkZXNjcmlwdG9yIGZpbGUKLQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKGZpbGVOYW1lKTsKLQkJcHJvdmlkZXIuc2V0Um9vdEVsZW1lbnROYW1lKEpTUDExVExETmFtZXMuVEFHTElCKTsKLQkJcHJvdmlkZXIuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQlOb2RlIHJvb3RFbGVtZW50ID0gcHJvdmlkZXIuZ2V0Um9vdEVsZW1lbnQoKTsKLQkJcmV0dXJuIGxvYWREb2N1bWVudChmaWxlTmFtZSwgcm9vdEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQgYXNzdW1pbmcgdGhlIEpTUCB2MS4xIGRlZmF1bHQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBqYXJGaWxlTmFtZSAtCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmluZyBKQVIgZmlsZQotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudEZyb21KYXIoU3RyaW5nIGphckZpbGVOYW1lKSB7Ci0JCS8vIGxvYWQgdGhlIHRhZ2xpYiBkZXNjcmlwdG9yIGZpbGUKLQkJcmV0dXJuIGJ1aWxkQ01Eb2N1bWVudEZyb21KYXIoamFyRmlsZU5hbWUsIEphclV0aWxpdGllcy5KU1AxMV9UQUdMSUIpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gamFyRmlsZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5pbmcgSkFSIGZpbGUKLQkgKiBAcGFyYW0gY29udGVudEZpbGVOYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHdpdGhpbiB0aGUgSkFSIGZvciBhIHZhbGlkIHRhZ2xpYiBkZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50RnJvbUphcihTdHJpbmcgamFyRmlsZU5hbWUsIFN0cmluZyBjb250ZW50RmlsZU5hbWUpIHsKLQkJLy8gbG9hZCB0aGUgdGFnbGliIGRlc2NyaXB0b3IgZmlsZQotCQlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERvY3VtZW50UHJvdmlkZXIoKTsKLQkJcHJvdmlkZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2UoamFyRmlsZU5hbWUpOwotCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTFUTEROYW1lcy5UQUdMSUIpOwotCQlwcm92aWRlci5zZXRKYXJGaWxlTmFtZShqYXJGaWxlTmFtZSk7Ci0JCXByb3ZpZGVyLnNldEZpbGVOYW1lKGNvbnRlbnRGaWxlTmFtZSk7Ci0JCUNNRG9jdW1lbnQgZG9jdW1lbnQgPSBsb2FkRG9jdW1lbnQoImphcjpmaWxlOi8vIiArIGphckZpbGVOYW1lICsgIiEiICsgY29udGVudEZpbGVOYW1lLCBwcm92aWRlci5nZXRSb290RWxlbWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIFRPRE86IEFkZCB0aGUgdGFncyBkZWNsYXJlZCBpbiBNRVRBLUlORi90YWdzLCBzZWUgSlNQIDIuMCBzZWN0aW9uCi0JCS8vIDguNC4xCi0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbihDTURvY3VtZW50IGRvY3VtZW50LCBOb2RlIGF0dHJOb2RlKSB7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGF0dHIgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoZG9jdW1lbnQpOwotCi0JCU5vZGUgY2hpbGQgPSBhdHRyTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLk5BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldE5vZGVOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLklEKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXRJZChnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuUkVRVUlSRUQpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldFJlcXVpcmVkU3RyaW5nKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5SVEVYUFJWQUxVRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0UnRleHBydmFsdWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AyMFRMRE5hbWVzLkZSQUdNRU5UKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXRGcmFnbWVudChCb29sZWFuLnZhbHVlT2YoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgYSBDTURvY3VtZW50IGZyb20gYSB0YWdsaWIgZGVzY3JpcHRvcgotCSAqIAotCSAqIEBwYXJhbSB1cmkgLQotCSAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIGEgdmFsaWQgdGFnbGliIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpIHsKLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwodXJpKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZUNNRG9jdW1lbnRGcm9tRmlsZSh1cmkpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgewotCQkJSW5wdXRTdHJlYW0gaXN0cmVhbSA9IG51bGw7Ci0JCQlpZiAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGNyZWF0ZUNNRG9jdW1lbnRGcm9tRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCWlzdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotCQkJCQlyZXN1bHQgPSBidWlsZENNRG9jdW1lbnQodXJsLnRvRXh0ZXJuYWxGb3JtKCksIGlzdHJlYW0pOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkJCQkJLy8gTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkV4Y2VwdGlvbiBjcmVhdGluZyBjb250ZW50Ci0JCQkJCS8vIG1vZGVsOiBjb3VsZCBub3QgbG9hZCBUTEQgY29udGVudHMgZnJvbSBVUkkgIiArIHVyaSArICIKLQkJCQkJLy8gOiIgKyB0KTsKLQkJCQl9Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChpc3RyZWFtICE9IG51bGwpCi0JCQkJCWlzdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCS8vIGRvbid0IGNhcmUKLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBuZXcgQ01Eb2N1bWVudEltcGwoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnRGcm9tRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCXRyeSB7Ci0JCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJcmVzdWx0ID0gYnVpbGRDTURvY3VtZW50RnJvbURpcmVjdG9yeShmaWxlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gbnVsbDsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCWlmIChmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBidWlsZENNRG9jdW1lbnRGcm9tSmFyKGZpbGVOYW1lKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IGJ1aWxkQ01Eb2N1bWVudEZyb21GaWxlKGZpbGVOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oQ01Eb2N1bWVudCBjbWRvY3VtZW50LCBFbGVtZW50IHRhZ0ZpbGVOb2RlLCBTdHJpbmcgcGF0aCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKGNtZG9jdW1lbnQpOwotCQlib29sZWFuIGhhc05hbWUgPSBmYWxzZTsKLQotCQkvLyBsb2FkIGluZm9ybWF0aW9uIGRlY2xhcmVkIHdpdGhpbiB0aGUgLnRsZAotCQlOb2RlIGNoaWxkID0gdGFnRmlsZU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuRElTUExBWV9OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0RGlzcGxheU5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5FWEFNUExFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0RXhhbXBsZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLklDT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRTbWFsbEljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0Tm9kZU5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCQloYXNOYW1lID0gZWQuZ2V0Tm9kZU5hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5QQVRIKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0UGF0aChnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlRBR19FWFRFTlNJT04pKSB7Ci0JCQkJCWVkLmdldEV4dGVuc2lvbnMoKS5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlpZiAoaGFzTmFtZSkgewotCQkJLy8gbG9hZCBpbmZvcm1hdGlvbiBkZWNsYXJlZCB3aXRoaW4gdGhlIC50YWcoeCkgZmlsZQotCQkJLy8gSlNQMl9UT0RPOiBpbXBsZW1lbnQgZm9yIEpTUCAyLjAKLQkJCXJldHVybiBlZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlRWxlbWVudERlY2xhcmF0aW9uKENNRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgdGFnTm9kZSkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKGRvY3VtZW50KTsKLQotCQlOb2RlIGNoaWxkID0gdGFnTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIHRhZyBpbmZvcm1hdGlvbgotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLk5BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXROb2RlTmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5UQUdDTEFTUykgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVEFHX0NMQVNTKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldFRhZ2NsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRFSUNMQVNTKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5URUlfQ0xBU1MpKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0VGVpY2xhc3MoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuQk9EWUNPTlRFTlQpIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkJPRFlfQ09OVEVOVCkpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlTdHJpbmcgYm9keWNvbnRlbnQgPSBnZXRDb250YWluZWRUZXh0KGNoaWxkKTsKLQkJCQkJLy8gQXBwYXJlbnRseSwgQXBhY2hlIFRvbWNhdCBpcyBub3QgY2FzZSBzZW5zaXRpdmUgYWJvdXQKLQkJCQkJLy8gdGhlc2UgdmFsdWVzCi0JCQkJCWlmIChib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKEpTUDExVExETmFtZXMuQ09OVEVOVF9KU1ApKQotCQkJCQkJZWQuc2V0Qm9keWNvbnRlbnQoSlNQMTFUTEROYW1lcy5DT05URU5UX0pTUCk7Ci0JCQkJCWVsc2UgaWYgKGJvZHljb250ZW50LmVxdWFsc0lnbm9yZUNhc2UoSlNQMTFUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCkpCi0JCQkJCQllZC5zZXRCb2R5Y29udGVudChKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKTsKLQkJCQkJZWxzZSBpZiAoYm9keWNvbnRlbnQuZXF1YWxzSWdub3JlQ2FzZShKU1AxMVRMRE5hbWVzLkNPTlRFTlRfRU1QVFkpKQotCQkJCQkJZWQuc2V0Qm9keWNvbnRlbnQoSlNQMTFUTEROYW1lcy5DT05URU5UX0VNUFRZKTsKLQkJCQkJZWxzZSBpZiAoYm9keWNvbnRlbnQuZXF1YWxzSWdub3JlQ2FzZShKU1AyMFRMRE5hbWVzLkNPTlRFTlRfU0NSSVBUTEVTUykpCi0JCQkJCQllZC5zZXRCb2R5Y29udGVudChKU1AyMFRMRE5hbWVzLkNPTlRFTlRfU0NSSVBUTEVTUyk7Ci0JCQkJfQotCQkJCS8vIGluZm8gKDEuMSBvbmx5KSBvciBkZXNjcmlwdGlvbiAoMS4yIG9ubHkpCi0JCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLklORk8pIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCS8vIGVkLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQkJZWQuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQkvLyBhdHRyaWJ1dGVzCi0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuQVRUUklCVVRFKSkgewotCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbihkb2N1bWVudCwgY2hpbGQpOwotCQkJCQllZC5hdHRyaWJ1dGVzLnNldE5hbWVkSXRlbShhdHRyLmdldEF0dHJOYW1lKCksIGF0dHIpOwotCQkJCX0KLQkJCQkvLyB2YXJpYWJsZXMKLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRSkpIHsKLQkJCQkJZWQuZ2V0VmFyaWFibGVzKCkuYWRkKGNyZWF0ZVZhcmlhYmxlKGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRMYXJnZUljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0U21hbGxJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuVEFHX0VYVEVOU0lPTikgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQllZC5nZXRFeHRlbnNpb25zKCkuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCXByb3RlY3RlZCBUTERGdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihDTURvY3VtZW50IGRvY3VtZW50LCBOb2RlIGZ1bmN0aW9uTm9kZSkgewotCQlUTERGdW5jdGlvbkltcGwgZnVuY3Rpb24gPSBuZXcgVExERnVuY3Rpb25JbXBsKGRvY3VtZW50KTsKLQkJYm9vbGVhbiBoYXNOYW1lID0gZmFsc2U7Ci0KLQkJTm9kZSBjaGlsZCA9IGZ1bmN0aW9uTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIHRhZyBpbmZvcm1hdGlvbgotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXROYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRVhBTVBMRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldEV4YW1wbGUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GVU5DVElPTl9DTEFTUykgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldENsYXNzTmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkZVTkNUSU9OX0VYVEVOU0lPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLmdldEV4dGVuc2lvbnMoKS5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GVU5DVElPTl9TSUdOQVRVUkUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXRTaWduYXR1cmUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0SWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLk5BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXROYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQkJaGFzTmFtZSA9IGZ1bmN0aW9uLmdldE5hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlpZiAoaGFzTmFtZSkgewotCQkJcmV0dXJuIGZ1bmN0aW9uOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBUTERJbml0UGFyYW0gY3JlYXRlSW5pdFBhcmFtKE5vZGUgaW5pdFBhcmFtTm9kZSkgewotCQlUTERJbml0UGFyYW1JbXBsIGluaXRQYXJhbSA9IG5ldyBUTERJbml0UGFyYW1JbXBsKCk7Ci0JCU5vZGUgY2hpbGQgPSBpbml0UGFyYW1Ob2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SX1BBUkFNX05BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlpbml0UGFyYW0uc2V0TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9QQVJBTV9WQUxVRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWluaXRQYXJhbS5zZXRWYWx1ZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJaW5pdFBhcmFtLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGluaXRQYXJhbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExETGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoTm9kZSBsaXN0ZW5lck5vZGUpIHsKLQkJVExETGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IFRMRExpc3RlbmVySW1wbCgpOwotCQlOb2RlIGNoaWxkID0gbGlzdGVuZXJOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTElTVEVORVJfQ0xBU1MpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlsaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCBUTERWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKE5vZGUgdmFsaWRhdG9yTm9kZSkgewotCQlUTERWYWxpZGF0b3JJbXBsIHZhbGlkYXRvciA9IG5ldyBUTERWYWxpZGF0b3JJbXBsKCk7Ci0JCU5vZGUgY2hpbGQgPSB2YWxpZGF0b3JOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SX0NMQVNTKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFsaWRhdG9yLnNldFZhbGlkYXRvckNsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SX0lOSVRfUEFSQU0pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YWxpZGF0b3IuZ2V0SW5pdFBhcmFtcygpLmFkZChjcmVhdGVJbml0UGFyYW0oY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExEVmFyaWFibGUgY3JlYXRlVmFyaWFibGUoTm9kZSB2YXJpYWJsZU5vZGUpIHsKLQkJVExEVmFyaWFibGVJbXBsIHZhcmlhYmxlID0gbmV3IFRMRFZhcmlhYmxlSW1wbCgpOwotCQlOb2RlIGNoaWxkID0gdmFyaWFibGVOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfQ0xBU1MpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXRWYXJpYWJsZUNsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfREVDTEFSRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldERlY2xhcmVTdHJpbmcoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0ZST01fQVRUUklCVVRFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0TmFtZUZyb21BdHRyaWJ1dGUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0dJVkVOKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0TmFtZUdpdmVuKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfU0NPUEUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXRTY29wZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gdmFyaWFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250YWluZWRUZXh0KE5vZGUgcGFyZW50KSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuLmdldExlbmd0aCgpID09IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlbi5pdGVtKDApLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlzLmFwcGVuZChjaGlsZC5nZXROb2RlVmFsdWUoKSk7Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHMudG9TdHJpbmcoKS50cmltKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCdWlsZGVyRm9yR3JhbW1hcihTdHJpbmcgZ3JhbW1hckZpbGVOYW1lKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdyYW1tYXJGaWxlTmFtZS50b0xvd2VyQ2FzZSgpOwotCQlyZXR1cm4gZmlsZU5hbWUuZW5kc1dpdGgoIi50bGQiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudCBsb2FkRG9jdW1lbnQoU3RyaW5nIGJhc2VMb2NhdGlvbiwgTm9kZSB0YWdsaWIpIHsKLQkJTm9kZSByb290ID0gdGFnbGliOwotCi0JCS8vIGNyZWF0ZSB0aGUgQ01Eb2N1bWVudAotCQlDTURvY3VtZW50SW1wbCBkb2N1bWVudCA9IG5ldyBDTURvY3VtZW50SW1wbCgpOwotCQlkb2N1bWVudC5zZXRCYXNlTG9jYXRpb24oYmFzZUxvY2F0aW9uKTsKLQotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlpZiAoX2RlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJudWxsIFwidGFnbGliXCIgZWxlbWVudCBmb3IgVExEICIgKyBiYXNlTG9jYXRpb24pOwotCQkJfQotCQkJcmV0dXJuIGRvY3VtZW50OwotCQl9Ci0KLQkJLy8gcG9wdWxhdGUgdGhlIENNRG9jdW1lbnQKLQkJTm9kZSBjaGlsZCA9IHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJLy8gdGFnCi0JCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVEFHKSkgewotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gY3JlYXRlRWxlbWVudERlY2xhcmF0aW9uKGRvY3VtZW50LCBjaGlsZCk7Ci0JCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQkJZG9jdW1lbnQuZkVsZW1lbnRzLnNldE5hbWVkSXRlbShlZC5nZXROb2RlTmFtZSgpLCBlZCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGFnLWZpbGUKLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlRBR19GSUxFKSAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCUVsZW1lbnQgdGFnRmlsZUVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGQ7Ci0JCQkJU3RyaW5nIHBhdGggPSB0YWdGaWxlRWxlbWVudC5nZXRBdHRyaWJ1dGUoSlNQMjBUTEROYW1lcy5QQVRIKTsKLQotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwpIGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihkb2N1bWVudCwgdGFnRmlsZUVsZW1lbnQsIHBhdGgpOwotCQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50LmZFbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJCX0KLQkJCX0KLQkJCS8vIG90aGVyIG9uZS1vZi1hLWtpbmQgY2hpbGRyZW4KLQkJCS8vIEpTUCB2ZXJzaW9uCi0JCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuSlNQVkVSU0lPTikgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuSlNQX1ZFUlNJT04pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRKc3B2ZXJzaW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIHRhZyBsaWJyYXJ5IHZlcnNpb24KLQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5UTElCVkVSU0lPTikgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVExJQl9WRVJTSU9OKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0VGxpYnZlcnNpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gc2hvcnQgbmFtZQotCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlNIT1JUTkFNRSkgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU0hPUlRfTkFNRSkpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldFNob3J0bmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBVUkkvVVJOCi0JCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVVJJKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5VUk4pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWRvY3VtZW50LnNldFVyaShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBpbmZvCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5JTkZPKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRJbmZvKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIE5ldyBKU1AgMS4yCi0JCQkvLyBkZXNjcmlwdGlvbgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pKSB7Ci0JCQkJZG9jdW1lbnQuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gZGlzcGxheSBuYW1lCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldERpc3BsYXlOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIGxhcmdlIGljb24KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldExhcmdlSWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBzbWFsbCBpY29uCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRTbWFsbEljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gdmFsaWRhdG9yCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQUxJREFUT1IpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0VmFsaWRhdG9yKGNyZWF0ZVZhbGlkYXRvcihjaGlsZCkpOwotCQkJfQotCQkJLy8gbGlzdGVuZXIKLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxJU1RFTkVSKSkgewotCQkJCWRvY3VtZW50LmdldExpc3RlbmVycygpLmFkZChjcmVhdGVMaXN0ZW5lcihjaGlsZCkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRlVOQ1RJT04pKSB7Ci0JCQkJVExERnVuY3Rpb24gZnVuY3Rpb24gPSBjcmVhdGVGdW5jdGlvbihkb2N1bWVudCwgY2hpbGQpOwotCQkJCWlmIChmdW5jdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50LmdldExpc3RlbmVycygpLmFkZChmdW5jdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuVEFHTElCX0VYVEVOU0lPTikpIHsKLQkJCQlkb2N1bWVudC5nZXRFeHRlbnNpb25zKCkuYWRkKGNoaWxkKTsKLQkJCX0KLQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVmZXJlbmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoSVRhZ2xpYlJlY29yZCByZWZlcmVuY2UpIHsKLQkJQ01Eb2N1bWVudEltcGwgZG9jdW1lbnQgPSBudWxsOwotCQlzd2l0Y2ggKHJlZmVyZW5jZS5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQlUTERSZWNvcmQgcmVjb3JkID0gKFRMRFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCWRvY3VtZW50ID0gKENNRG9jdW1lbnRJbXBsKSBidWlsZENNRG9jdW1lbnRGcm9tRmlsZShyZWNvcmQuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQlpZiAoX2RlYnVnICYmIGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmFpbHVyZSBwYXJzaW5nICIgKyByZWNvcmQuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJfQotCi0JCQkJaWYgKGRvY3VtZW50LmdldFNtYWxsSWNvbigpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0U21hbGxJY29uKCksIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIvIik7Ci0JCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuU01BTExfSUNPTiwgImZpbGU6IiArIGljb25QYXRoKTsKLQkJCQl9Ci0JCQkJaWYgKGRvY3VtZW50LmdldExhcmdlSWNvbigpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0TGFyZ2VJY29uKCksIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIvIik7Ci0JCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTiwgImZpbGU6IiArIGljb25QYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOiB7Ci0JCQkJSmFyUmVjb3JkIHJlY29yZCA9IChKYXJSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlkb2N1bWVudCA9IChDTURvY3VtZW50SW1wbCkgYnVpbGRDTURvY3VtZW50RnJvbUphcihyZWNvcmQuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQlpZiAoZG9jdW1lbnQuZ2V0U21hbGxJY29uKCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRTbWFsbEljb24oKSwgcmVjb3JkLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIhTUVUQS1JTkYvIiwgIi8iKTsKLQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OLCAiamFyOmZpbGU6IiArIGljb25QYXRoKTsKLQkJCQl9Ci0JCQkJaWYgKGRvY3VtZW50LmdldExhcmdlSWNvbigpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0TGFyZ2VJY29uKCksIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiIU1FVEEtSU5GLyIsICIvIik7Ci0JCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTiwgImphcjpmaWxlOiIgKyBpY29uUGF0aCk7Ci0JCQkJfQotCQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZhaWx1cmUgcGFyc2luZyAiICsgcmVjb3JkLmdldExvY2F0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCQkvLyBUYWdEaXJSZWNvcmQgcmVjb3JkID0gKFRhZ0RpclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCS8vIGRvY3VtZW50ID0KLQkJCQkvLyBidWlsZENNRG9jdW1lbnRGcm9tRGlyZWN0b3J5KHJlY29yZC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQlVUkxSZWNvcmQgcmVjb3JkID0gKFVSTFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCUlucHV0U3RyZWFtIHVybENvbnRlbnRzID0gbnVsbDsKLQkJCQlib29sZWFuIGRvQ2FjaGUgPSBmYWxzZTsKLQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbm5lY3Rpb24gPSByZWNvcmQuZ2V0VVJMKCkub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkJZG9DYWNoZSA9IGNvbm5lY3Rpb24uZ2V0VXNlQ2FjaGVzKCk7Ci0JCQkJCWNvbm5lY3Rpb24uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLQkJCQkJdXJsQ29udGVudHMgPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCWRvY3VtZW50ID0gKENNRG9jdW1lbnRJbXBsKSBidWlsZENNRG9jdW1lbnQocmVjb3JkLmdldEJhc2VMb2NhdGlvbigpLCB1cmxDb250ZW50cyk7Ci0JCQkJCWlmIChkb2N1bWVudC5nZXRTbWFsbEljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRTbWFsbEljb24oKSwgcmVjb3JkLmdldFVSTCgpLnRvU3RyaW5nKCksICIvIik7Ci0JCQkJCQlkb2N1bWVudC5zZXRQcm9wZXJ0eShKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04sIGljb25QYXRoKTsKLQkJCQkJfQotCQkJCQlpZiAoZG9jdW1lbnQuZ2V0TGFyZ2VJY29uKCkgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0TGFyZ2VJY29uKCksIHJlY29yZC5nZXRVUkwoKS50b1N0cmluZygpLCAiLyIpOwotCQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OLCBpY29uUGF0aCk7Ci0JCQkJCX0KLQkJCQkJY29ubmVjdGlvbi5zZXRVc2VDYWNoZXMoZG9DYWNoZSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAodXJsQ29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl1cmxDb250ZW50cy5jbG9zZSgpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTRjNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExERG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExEVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEltcGwgaW1wbGVtZW50cyBUTEREb2N1bWVudCB7Ci0JCi0JLyoqIENvbnRhaW5zIHRhZ2luZm8gYW5kL29yIGFueSBvdGhlciBtaXNjIHByb3BlcnRpZXMqLwotCXByaXZhdGUgQW5ub3RhdGlvbk1hcCBmQW5ub3RhdGlvbk1hcCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBNYXAgZlByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgwKTsKLQotCS8qKgotCSAqIFJlY29yZHMgZnJvbSB3aGVyZSB0aGlzIGRvY3VtZW50IHdhcyBjcmVhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkJhc2VMb2NhdGlvbjsKLQkvKiogCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbjsKLQkKLQlwcml2YXRlIFN0cmluZyBmRGlzcGxheU5hbWU7Ci0KLQkvKioKLQkgKiBOT1QgcHVibGljIEFQSQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwgZkVsZW1lbnRzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JcHJpdmF0ZSBMaXN0IGZGdW5jdGlvbnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQotCS8vIGlkIG9mIHRoZSB0YWdsaWIKLQlwcml2YXRlIFN0cmluZyBmSWQgPSBudWxsOwotCS8qKgotCSAqIENoaWxkcmVuIG9mICJ0YWdsaWIiIHdpdGhpbiBhIC50bGQgZmlsZSBlYWNoIGFsbG93Ci0JICogb25lIFRleHQgbm9kZSAoI1BDREFUQSkgYmVuZWF0aCB0aGVtLiAgU3RvcmUgdGhlIHZhbHVlcwotCSAqIGhlcmUgZm9yIHNpbXBsaWNpdHkuCi0JICovCi0JLy8gVGhlIEpTUCBzcGVjaWZpY2F0aW9uIHJlcXVpcmVkIGZvciB0aGlzIHRhZ2xpYiB0byBmdW5jdGlvbgotCXByaXZhdGUgU3RyaW5nIGZKU1BWZXJzaW9uID0gbnVsbDsKLQkKLQlwcml2YXRlIFN0cmluZyBmTGFyZ2VJY29uOwotCi0JcHJpdmF0ZSBMaXN0IGZMaXN0ZW5lcnM7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZlBhcmVudFVSSSA9IG51bGw7Ci0JLy8gQSBzaG9ydCBuYW1lIHN1Z2dlc3RlZCBhcyB0aGUgZGVmYXVsdCBwcmVmaXggZm9yIHRhZ3Mgd2l0aGluIHRoZSBsaWIKLQlwcml2YXRlIFN0cmluZyBmU2hvcnROYW1lID0gbnVsbDsKLQkKLQlwcml2YXRlIFN0cmluZyBmU21hbGxJY29uOwotCQotCS8qKgotCSAqIHNpbmNlIEpTUCAyLjAKLQkgKiAKLQkgKiBUaGUgZW50aXJlIGVsZW1lbnQgaXMgc3RvcmVkIGhlcmUgc2luY2UgaXRzIGxheW91dCBpcyB1bmRlZmluZWQgCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZUYWdsaWJFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgwKTsKLQkKLQkvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgdGFnbGliIGl0c2VsZgotCXByaXZhdGUgU3RyaW5nIGZUTGliVmVyc2lvbiA9IG51bGw7Ci0JCi0JLy8gQSB1bmlxdWUgcHVibGljIFVSSSBkZXNjcmliaW5nIHRoaXMgdGFnbGliLiAgUmVjb21tZW5kZWQgdG8gYmUgdGhlIFVSTAotCS8vIHRvIHRoZSBkZXNjcmlwdG9yCi0JcHJpdmF0ZSBTdHJpbmcgZlVSSSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgVExEVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQkKLQkvKioKLQkgKiBDTURvY3VtZW50SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFubm90YXRpb24gbWFwIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiAgTGF6aWx5IGNyZWF0ZXMKLQkgKiBhbmQgbG9hZHMgYW5ub3RhdGlvbiBtYXAuCi0JICogQHJldHVybiBBbm5vdGF0aW9uTWFwCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uTWFwIGdldEFubm90YXRpb25NYXAoKSB7Ci0JCS8vIGNyZWF0ZSBhIG5ldyBhbm5vdGF0aW9uIG1hcCBhbmQgbG9hZCBpdCB1cAotCQlpZiAoZkFubm90YXRpb25NYXAgPT0gbnVsbCkgewotCQkJZkFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotCQkJCi0JCSAgICBMaXN0IGFubm90YXRpb25GaWxlcyA9IENNUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbkZpbGVzKGdldFVyaSgpKTsKLQkJICAgIGZvciAoSXRlcmF0b3IgaSA9IGFubm90YXRpb25GaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJICAgIAl0cnkgewotCQkgICAgCQlTdHJpbmcgYW5ub3RhdGlvbkZpbGVVUkkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJICAgIAkJQW5ub3RhdGlvbkZpbGVQYXJzZXIgcGFyc2VyID0gbmV3IEFubm90YXRpb25GaWxlUGFyc2VyKCk7Ci0JCSAgICAJCXBhcnNlci5wYXJzZShmQW5ub3RhdGlvbk1hcCwgYW5ub3RhdGlvbkZpbGVVUkkpOwotCQkgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCSAgICAgICAgCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJFeGNlcHRpb24gdGhyb3duIGluIENNRG9jdW1lbnRJbXBsI2dldEFubm90YXRpb25NYXAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gZkFubm90YXRpb25NYXA7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFzZUxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gZkJhc2VMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXlOYW1lLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBmRGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudHMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBmRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW50aXRpZXMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBFbnRpdHlEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldEV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBmVGFnbGliRXh0ZW5zaW9uczsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmdW5jdGlvbnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RnVuY3Rpb25zKCkgewotCQlyZXR1cm4gZkZ1bmN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpZC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZklkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc3B2ZXJzaW9uKCkgewotCQlyZXR1cm4gZkpTUFZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKCkgewotCQlyZXR1cm4gZkxhcmdlSWNvbjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChmTGlzdGVuZXJzID09IG51bGwpCi0JCQlmTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gZkxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lc3BhY2UgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NtZG9jdW1lbnQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyZW50VVJJLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50VVJJKCkgewotCQlyZXR1cm4gZlBhcmVudFVSSTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVExERG9jdW1lbnQuQ01fS0lORCkpIHsKLQkJCXJldHVybiBUTEREb2N1bWVudC5KU1BfVExEOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImFubm90YXRpb25NYXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbk1hcCgpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0bmFtZSgpIHsKLQkJcmV0dXJuIGZTaG9ydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc21hbGxJY29uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgewotCQlyZXR1cm4gZlNtYWxsSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRsaWJ2ZXJzaW9uKCkgewotCQlyZXR1cm4gZlRMaWJWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotCQlyZXR1cm4gZlVSSTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgVExERG9jdW1lbnQjZ2V0VmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgVExEVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbiBUaGUgYmFzZUxvY2F0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlTG9jYXRpb24oU3RyaW5nIGJhc2VMb2NhdGlvbikgewotCQlmQmFzZUxvY2F0aW9uID0gYmFzZUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogQHBhcmFtIGRpc3BsYXlOYW1lIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLQkJdGhpcy5mRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpZC4KLQkgKiBAcGFyYW0gaWQgVGhlIGlkIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmZJZCA9IGlkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdJbmZvIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmZvKFN0cmluZyBuZXdJbmZvKSB7Ci0JCXNldERlc2NyaXB0aW9uKG5ld0luZm8pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdKc3B2ZXJzaW9uIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKc3B2ZXJzaW9uKFN0cmluZyBuZXdKc3B2ZXJzaW9uKSB7Ci0JCWZKU1BWZXJzaW9uID0gbmV3SnNwdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXJnZUljb24uCi0JICogQHBhcmFtIGxhcmdlSWNvbiBUaGUgbGFyZ2VJY29uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgbGFyZ2VJY29uKSB7Ci0JCXRoaXMuZkxhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcnMoTGlzdCBsaXN0ZW5lcnMpIHsKLQkJdGhpcy5mTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50VVJJIFRoZSBwYXJlbnRVUkkgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudFVSSShTdHJpbmcgcGFyZW50VVJJKSB7Ci0JCWZQYXJlbnRVUkkgPSBwYXJlbnRVUkk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWZQcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdTaG9ydG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3J0bmFtZShTdHJpbmcgbmV3U2hvcnRuYW1lKSB7Ci0JCWZTaG9ydE5hbWUgPSBuZXdTaG9ydG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc21hbGxJY29uLgotCSAqIEBwYXJhbSBzbWFsbEljb24gVGhlIHNtYWxsSWNvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHNtYWxsSWNvbikgewotCQl0aGlzLmZTbWFsbEljb24gPSBzbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1RsaWJ2ZXJzaW9uIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUbGlidmVyc2lvbihTdHJpbmcgbmV3VGxpYnZlcnNpb24pIHsKLQkJZlRMaWJWZXJzaW9uID0gbmV3VGxpYnZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1VyaSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJZlVSSSA9IG5ld1VyaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVExEVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChUTEREb2N1bWVudC5DTV9LSU5ELmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8ICJhbm5vdGF0aW9uTWFwIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmUHJvcGVydGllcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgc2hvcnQgbmFtZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFNob3J0bmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkaXNwbGF5IG5hbWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXREaXNwbGF5TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkZXNjcmlwdGlvbiAoaW5mbyk6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXREZXNjcmlwdGlvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBVUkk6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRVcmkoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQganNwIHZlcnNpb246IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRKc3B2ZXJzaW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHRhZ2xpYiB2ZXJzaW9uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGxpYnZlcnNpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgc21hbGwgaWNvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFNtYWxsSWNvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBsYXJnZSBpY29uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TGFyZ2VJY29uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZ2V0VmFsaWRhdG9yKCkgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdmFsaWRhdG9yOiIgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGdldFZhbGlkYXRvcigpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbGlzdGVuZXJzOiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TGlzdGVuZXJzKCkuc2l6ZSgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuIiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0TGlzdGVuZXJzKCkuZ2V0KGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBlbGVtZW50czoiKTsgLy8kTk9OLU5MUy0xJAotCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IGdldEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChTdHJpbmdVdGlscy5yZXBsYWNlKGVsZW1lbnRzLml0ZW0oaSkudG9TdHJpbmcoKSwgIlxuIiwgIlxuXHRcdCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NjkzMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGltcGxlbWVudHMgVExERWxlbWVudERlY2xhcmF0aW9uIHsKLQotCS8vIG9wdGlvbmFsIGF0dHJpYnV0ZXMKLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JLy8gKGVtcHR5fEpTUHx0YWdkZXBlbmRhbnR8c2NyaXB0bGVzcykgLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gSlNQCi0JcHJpdmF0ZSBTdHJpbmcgYm9keWNvbnRlbnQgPSBKU1AxMVRMRE5hbWVzLkNPTlRFTlRfSlNQOwotCi0JLyoqIAotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKiAKLQkgKiBVc2FnZSBpbmZvcm1hdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQotCS8qKiAKLQkgKiBzaW5jZSBKU1AgMS4yCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWU7Ci0KLQkvKiogCi0JICogc2luY2UgSlNQIDIuMAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZFeGFtcGxlOwotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZPd25lckRvY3VtZW50OwotCQotCXByaXZhdGUgU3RyaW5nIGZQYXRoID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdCBmVGFnRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JLyoqIAotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBsYXJnZUljb247Ci0JCi0JCi0JcHJpdmF0ZSBpbnQgbWF4T2NjdXIgPSAtMTsKLQlwcml2YXRlIGludCBtaW5PY2N1ciA9IDA7Ci0KLQkvLyByZXF1aXJlZCB0YWcgbmFtZQotCXByaXZhdGUgU3RyaW5nIG5vZGVOYW1lID0gbnVsbDsKLQkKLQkvKiogCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHNtYWxsSWNvbjsKLQkKLQkvLyB0YWcgaGFuZGxlciBjbGFzcyAtIHJlcXVpcmVkCi0JcHJpdmF0ZSBTdHJpbmcgdGFnY2xhc3MgPSBudWxsOwotCQotCS8vIHRhZyBleHRyYSBpbmZvIGNsYXNzIChzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC5UYWdFeHRyYUluZm8pIC0gb3B0aW9uYWwKLQlwcml2YXRlIFN0cmluZyB0ZWljbGFzcyA9IG51bGw7Ci0KLQkvKiogCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgTGlzdCB2YXJpYWJsZXM7Ci0KLQkvKioKLQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKENNRG9jdW1lbnQgb3duZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyRG9jdW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgQXR0cmlidXRlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb2R5Y29udGVudCgpIHsKLQkJcmV0dXJuIGJvZHljb250ZW50OwotCX0KLQotCS8qKgotCSAqIGdldENNQ29udGVudCBtZXRob2QKLQkgKiBAcmV0dXJuIENNQ29udGVudAotCSAqCi0JICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuCi0JICogVGhpcyBjYW4gYmUgYW4gQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb250ZW50VHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChib2R5Y29udGVudC5lcXVhbHMoSlNQMTFUTEROYW1lcy5DT05URU5UX0VNUFRZKSkKLQkJCXJldHVybiBFTVBUWTsKLQkJaWYgKGJvZHljb250ZW50LmVxdWFscyhKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKSkKLQkJCXJldHVybiBQQ0RBVEE7Ci0JCWVsc2UKLQkJCS8vIEpTUAotCQkJcmV0dXJuIEFOWTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIG5ldyBDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnROYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4YW1wbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZkV4YW1wbGU7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXh0ZW5zaW9ucy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gZlRhZ0V4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbmZvKCkgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXJnZUljb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0JCXJldHVybiBsYXJnZUljb247Ci0JfQotCi0JLyoqCi0JICogZ2V0TG9jYWxFbGVtZW50cyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGx5IGRlZmluZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE1heE9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIG1heE9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotCSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIG1pbk9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBub2RlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gZk93bmVyRG9jdW1lbnQ7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBmUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjcmliZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUgIT0gbnVsbCAmJiBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJ0YWdJbmZvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFN0cmluZ1V0aWxzLnJlc3RvcmVNYXJrZXJzKGdldFRhZ0luZm8oKSk7CS8vIHJldHVybiB0YWcgaW5mbwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZSAhPSBudWxsICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoImRlc2NyaXB0aW9uIikpIHsJLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFN0cmluZ1V0aWxzLnJlc3RvcmVNYXJrZXJzKGdldERlc2NyaXB0aW9uKCkpOyAvLyByZXR1cm4gdGFnIGRlc2NyaXB0aW9uCi0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhUTEREb2N1bWVudC5DTV9LSU5EKSkgewotCQkJcmV0dXJuIFRMRERvY3VtZW50LkpTUF9UTEQ7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSkgewotCQkJcmV0dXJuIGdldE93bmVyRG9jdW1lbnQoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNtYWxsSWNvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJcmV0dXJuIHNtYWxsSWNvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgWFBhdGggb2YgdGhpcyBlbGVtZW50Ci0JICogKGN1cnJlbnRseSBqdXN0IHJldHVybnMgdGhlIG5vZGUgbmFtZSkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3BlYygpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdjbGFzcygpIHsKLQkJcmV0dXJuIHRhZ2NsYXNzOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHRhZ2luZm8gZm9yIHRoaXMgY3VycmVudCBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgdGFnaW5mbyBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFnSW5mbygpIHsKLQkJaWYgKGdldE93bmVyRG9jdW1lbnQoKS5zdXBwb3J0cygiYW5ub3RhdGlvbk1hcCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUFubm90YXRpb25NYXAgbWFwID0gKEFubm90YXRpb25NYXApZ2V0T3duZXJEb2N1bWVudCgpLmdldFByb3BlcnR5KCJhbm5vdGF0aW9uTWFwIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBzcGVjID0gZ2V0U3BlYygpOwotCQkJU3RyaW5nIHJlc3VsdCA9IG1hcC5nZXRQcm9wZXJ0eShzcGVjLCAidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gU3RyaW5nVXRpbHMucmVzdG9yZU1hcmtlcnMocmVzdWx0KTsgLy8gcmV0dXJuIHRhZyBpbmZvCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZWljbGFzcygpIHsKLQkJcmV0dXJuIHRlaWNsYXNzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHZhcmlhYmxlcy4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0VmFyaWFibGVzKCkgewotCQlpZiAodmFyaWFibGVzID09IG51bGwpCi0JCQl2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiB2YXJpYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0JvZHljb250ZW50IGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb2R5Y29udGVudChTdHJpbmcgbmV3Qm9keWNvbnRlbnQpIHsKLQkJYm9keWNvbnRlbnQgPSBuZXdCb2R5Y29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogQHBhcmFtIGRpc3BsYXlOYW1lIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLQkJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZXhhbXBsZSBUaGUgZXhhbXBsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhhbXBsZShTdHJpbmcgZXhhbXBsZSkgewotCQlmRXhhbXBsZSA9IGV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIEBwYXJhbSBsYXJnZUljb24gVGhlIGxhcmdlSWNvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXJnZUljb24oU3RyaW5nIGxhcmdlSWNvbikgewotCQl0aGlzLmxhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlTmFtZShTdHJpbmcgc3RyaW5nKSB7Ci0JCW5vZGVOYW1lID0gc3RyaW5nOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgewotCQlmUGF0aCA9IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc21hbGxJY29uLgotCSAqIEBwYXJhbSBzbWFsbEljb24gVGhlIHNtYWxsSWNvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHNtYWxsSWNvbikgewotCQl0aGlzLnNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGFnY2xhc3MgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ2NsYXNzKFN0cmluZyBuZXdUYWdjbGFzcykgewotCQl0YWdjbGFzcyA9IG5ld1RhZ2NsYXNzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdUZWljbGFzcyBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVpY2xhc3MoU3RyaW5nIG5ld1RlaWNsYXNzKSB7Ci0JCXRlaWNsYXNzID0gbmV3VGVpY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFyaWFibGVzLgotCSAqIEBwYXJhbSB2YXJpYWJsZXMgVGhlIHZhcmlhYmxlcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZXMoTGlzdCB2YXJpYWJsZXMpIHsKLQkJdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogQHJldHVybiBib29sZWFuCi0JICoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNTm9kZSBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCAiICsgc3VwZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Tm9kZU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdGFnIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGFnY2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdGVpIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGVpY2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgYm9keSBjb250ZW50OiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Qm9keWNvbnRlbnQoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGVzY3JpcHRpb24gKGluZm8pOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RGVzY3JpcHRpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgYXR0cmlidXRlczoiKTsgLy8kTk9OLU5MUy0xJAotCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdFx0IiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoYXR0cmlidXRlcy5pdGVtKGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB2YXJpYWJsZXM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRWYXJpYWJsZXMoKS5zaXplKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdFx0IiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0VmFyaWFibGVzKCkuZ2V0KGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMDY4M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCXB1YmxpYyBzdGF0aWMgQ01OYW1lZE5vZGVNYXBJbXBsIEVNUFRZX05BTUVEX05PREVfTUFQID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCXByb3RlY3RlZCBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkvKioKLQkgKiBDTU5hbWVkTm9kZU1hcEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUhhc2h0YWJsZSBnZXRIYXNodGFibGUoKSB7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRhYmxlLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChDTU5vZGUpIHRhYmxlLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWludCBzaXplID0gdGFibGUuc2l6ZSgpOwotCQlpZiAoaW5kZXggPCBzaXplKSB7Ci0JCQlJdGVyYXRvciB2YWx1ZXMgPSBpdGVyYXRvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gaW5kZXg7IGkrKykgewotCQkJCXJlc3VsdCA9IHZhbHVlcy5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChDTU5vZGUpIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBhTm9kZSBDTU5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUsIENNTm9kZSBhTm9kZSkgewotCQlpZiAobmFtZSAhPSBudWxsICYmIGFOb2RlICE9IG51bGwpCi0JCQl0YWJsZS5wdXQobmFtZSwgYU5vZGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Ob2RlTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2IzNTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgQ01Ob2RlTGlzdCB7Ci0Jc3RhdGljIENNTm9kZUxpc3RJbXBsIEVNUFRZX05PREVfTElTVCA9IG5ldyBDTU5vZGVMaXN0SW1wbChDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQlwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCi0JcHVibGljIENNTm9kZUxpc3RJbXBsKCkgewotCQl0aGlzKG5ldyBBcnJheUxpc3QoKSk7Ci0JfQotCi0JcHVibGljIENNTm9kZUxpc3RJbXBsKExpc3QgbGlzdCkgewotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZEl0ZW0oQ01Ob2RlIG5vZGUpIHsKLQkJbGlzdC5hZGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsaXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0KCkgewotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChDTU5vZGUpIGxpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERDTURvY3VtZW50TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRENNRG9jdW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MGQwOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRENNRG9jdW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuSlNQMjBUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVVJJUmVzb2x2ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVRhZ2xpYlJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJJbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIudXRpbC5VUklIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBUTERDTURvY3VtZW50TWFuYWdlciB7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBpbXBsZW1lbnRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24gewotCi0JCS8qKgotCQkgKiBBZGRzIGEgYmxvY2sgdGFnbmFtZSAoZnVsbHkgbmFtZXNwYWNlIHF1YWxpZmllZCkgaW50byB0aGUgbGlzdCBvZgotCQkgKiBibG9jayB0YWcgbmFtZXMgZm9yIHRoZSBwYXJzZXIuIFRoZSBtYXJrZXIKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbG9uZyB3aXRoIHBvc2l0aW9uIGN1ZXMgZHVyaW5nIHJlcGFyc2VzCi0JCSAqIGFsbG93IHRoZSBKU1BTb3VyY2VQYXJzZXIgdG8gZW5hYmxlL2lnbm9yZSB0aGUgdGFncyBhcyBibG9ja3MuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBhZGRCbG9ja1RhZyhTdHJpbmcgdGFnbmFtZU5TLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1hcmtlcikgewotCQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGdldFBhcnNlcigpLmdldEJsb2NrTWFya2VyKHRhZ25hbWVOUykgPT0gbnVsbCkgewotCQkJCWdldFBhcnNlcigpLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcih0YWduYW1lTlMsIG1hcmtlciwgWE1MUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCB0cnVlLCBmYWxzZSkpOwotCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciBhZGRlZCBibG9jayBtYXJrZXI6ICIgKyB0YWduYW1lTlMgKyAiQCIgKyBtYXJrZXIuZ2V0U3RhcnRPZmZzZXQoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuYWJsZXMgYSBUTEQgb3duaW5nIHRoZSBnaXZlbiBwcmVmaXggbG9hZGVkIGZyb20gdGhlIGdpdmVuIFVSSSBhdAotCQkgKiB0aGUgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLiBUaGUgbGlzdCBvZgotCQkgKiBhZGRpdGlvbmFsQ01Eb2N1bWVudHMgd2lsbCBjbGFpbSB0byBub3Qga25vdyBhbnkgb2YgaXRzIHRhZ3MgYXQKLQkJICogcG9zaXRpb25zIGVhcmxpZXIgdGhhbiB0aGF0IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ncyBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEZvciB0YWdsaWIgZGlyZWN0aXZlcywgdGhlIHRhZ2xpYiBpcyB0aGUgYW5jaG9yIHdoaWxlIHRhZ2xpYnMKLQkJICogcmVnaXN0ZXJlZCB0aHJvdWdoIGluY2x1ZGUgZGlyZWN0aXZlcyB1c2UgdGhlIHBhcmVudCBkb2N1bWVudCdzCi0JCSAqIGluY2x1ZGUgZGlyZWN0aXZlIGFzIHRoZWlyIGFuY2hvci4KLQkJICogCi0JCSAqIEBwYXJhbSBwcmVmaXgKLQkJICogQHBhcmFtIHVyaQotCQkgKiBAcGFyYW0gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVUYWdsaWJGcm9tVVJJKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlpZiAocHJlZml4ID09IG51bGwgfHwgdXJpID09IG51bGwgfHwgYmFubmVkUHJlZml4ZXMuY29udGFpbnMocHJlZml4KSkKLQkJCQlyZXR1cm47Ci0JCQkvLyBUcnkgdG8gbG9hZCB0aGUgQ01Eb2N1bWVudCBmb3IgdGhpcyBVUkkKLQkJCUNNRG9jdW1lbnQgdGxkID0gZ2V0Q01Eb2N1bWVudCh1cmkpOwotCQkJaWYgKHRsZCA9PSBudWxsIHx8ICEodGxkIGluc3RhbmNlb2YgVExERG9jdW1lbnQpKSB7Ci0JCQkJaWYgKF9kZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGZhaWxlZCB0byBjcmVhdGUgYSBDTURvY3VtZW50IGZvciAiICsgdXJpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IHRsZC5nZXRFbGVtZW50cygpOwotCQkJLy8gR28gdGhyb3VnaCB0aGUgQ01Eb2N1bWVudCBmb3IgYW55IHRhZ3MgdGhhdCBtdXN0IGJlIG1hcmtlZCBhcwotCQkJLy8gYmxvY2sgdGFncwotCQkJLy8gc3RhcnRpbmcgYXQgdGhlIGFuY2hvcmluZyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLiBBcyB0aGUKLQkJCS8vIGRvY3VtZW50IGlzIGVkaXRlZCBhbmQgdGhlCi0JCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vdmVkIGFyb3VuZCwgdGhlIGJsb2NrIHRhZwotCQkJLy8gZW5hYmxlbWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZm9sbG93Ci0JCQkvLyBpdC4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCVRMREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChUTERFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLml0ZW0oaSk7Ci0JCQkJaWYgKGVkLmdldEJvZHljb250ZW50KCkgPT0gSlNQMTJUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCkKLQkJCQkJYWRkQmxvY2tUYWcocHJlZml4ICsgIjoiICsgZWQuZ2V0Tm9kZU5hbWUoKSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gU2luY2UgbW9kaWZpY2F0aW9ucyB0byBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGFkamFjZW50IHRvIGEKLQkJCS8vIHRhZ2xpYiBkaXJlY3RpdmUgY2FuIGNhdXNlCi0JCQkvLyB0aGF0IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdG8gYmUgcmVwb3J0ZWQsIGZpbHRlciBvdXQgYW55Ci0JCQkvLyBkdXBsaWNhdGVkIFVSSXMuIFdoZW4gdGhlCi0JCQkvLyB0YWdsaWIgaXMgYWN0dWFsbHkgbW9kaWZpZWQsIGEgZnVsbCByZWJ1aWxkIHdpbGwgb2NjdXIgYW5kIG5vCi0JCQkvLyBkdXBsaWNhdGVzCi0JCQkvLyB3aWxsL3Nob3VsZCBiZSBmb3VuZC4KLQkJCUxpc3QgdHJhY2tlcnMgPSBnZXRUYWdsaWJUcmFja2VycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFja2Vycy5zaXplKCk7IGkrKykgewotCQkJCVRhZ2xpYlRyYWNrZXIgdHJhY2tlciA9IChUYWdsaWJUcmFja2VyKSB0cmFja2Vycy5nZXQoaSk7Ci0JCQkJaWYgKHRyYWNrZXIuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkgJiYgdHJhY2tlci5nZXRVUkkoKS5lcXVhbHModXJpKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJaWYgKF9kZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgcmVnaXN0ZXJlZCBhIHRyYWNrZXIgZm9yICIgKyB1cmkgKyAiIHdpdGggcHJlZml4ICIgKyBwcmVmaXgpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0VGFnbGliVHJhY2tlcnMoKS5hZGQobmV3IFRhZ2xpYlRyYWNrZXIodXJpLCBwcmVmaXgsIHRsZCwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSk7Ci0JCX0KLQotCQkvKioKLQkJICogRW5hYmxlcyBhIFRMRCBvd25pbmcgdGhlIGdpdmVuIHByZWZpeCBsb2FkZWQgZnJvbSB0aGUgZ2l2ZW4gVVJJIGF0Ci0JCSAqIHRoZSBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uIFRoZSBsaXN0IG9mCi0JCSAqIGFkZGl0aW9uYWxDTURvY3VtZW50cyB3aWxsIGNsYWltIHRvIG5vdCBrbm93IGFueSBvZiBpdHMgdGFncyBhdAotCQkgKiBwb3NpdGlvbnMgZWFybGllciB0aGFuIHRoYXQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbidzIHBvc2l0aW9uLgotCQkgKiAKLQkJICogRm9yIHRhZ2xpYiBkaXJlY3RpdmVzLCB0aGUgdGFnbGliIGlzIHRoZSBhbmNob3Igd2hpbGUgdGFnbGlicwotCQkgKiByZWdpc3RlcmVkIHRocm91Z2ggaW5jbHVkZSBkaXJlY3RpdmVzIHVzZSB0aGUgcGFyZW50IGRvY3VtZW50J3MKLQkJICogaW5jbHVkZSBkaXJlY3RpdmUgYXMgdGhlaXIgYW5jaG9yLgotCQkgKiAKLQkJICogQHBhcmFtIHByZWZpeAotCQkgKiBAcGFyYW0gdXJpCi0JCSAqIEBwYXJhbSB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGVuYWJsZVRhZ3NJbkRpcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgdGFnZGlyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJaWYgKHByZWZpeCA9PSBudWxsIHx8IHRhZ2RpciA9PSBudWxsIHx8IGJhbm5lZFByZWZpeGVzLmNvbnRhaW5zKHByZWZpeCkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKF9kZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgZW5hYmxpbmcgdGFncyBmcm9tIGRpcmVjdG9yeSIgKyB0YWdkaXIgKyAiIGZvciBwcmVmaXggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBUcnkgdG8gbG9hZCB0aGUgQ01Eb2N1bWVudCBmb3IgdGhpcyBVUkkKLQkJCUNNRG9jdW1lbnQgdGxkID0gZ2V0SW1wbGljaXRDTURvY3VtZW50KHRhZ2Rpcik7Ci0JCQlpZiAodGxkID09IG51bGwgfHwgISh0bGQgaW5zdGFuY2VvZiBUTEREb2N1bWVudCkpCi0JCQkJcmV0dXJuOwotCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSB0bGQuZ2V0RWxlbWVudHMoKTsKLQkJCS8vIEdvIHRocm91Z2ggdGhlIENNRG9jdW1lbnQgZm9yIGFueSB0YWdzIHRoYXQgbXVzdCBiZSBtYXJrZWQgYXMKLQkJCS8vIGJsb2NrIHRhZ3MKLQkJCS8vIHN0YXJ0aW5nIGF0IHRoZSBhbmNob3JpbmcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4gQXMgdGhlCi0JCQkvLyBkb2N1bWVudCBpcyBlZGl0ZWQgYW5kIHRoZQotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb3ZlZCBhcm91bmQsIHRoZSBibG9jayB0YWcKLQkJCS8vIGVuYWJsZW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGZvbGxvdwotCQkJLy8gaXQuCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlUTERFbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoVExERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5pdGVtKGkpOwotCQkJCWlmIChlZC5nZXRCb2R5Y29udGVudCgpID09IEpTUDEyVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQpCi0JCQkJCWFkZEJsb2NrVGFnKHByZWZpeCArICI6IiArIGVkLmdldE5vZGVOYW1lKCksIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIFNpbmNlIG1vZGlmaWNhdGlvbnMgdG8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBhZGphY2VudCB0byBhCi0JCQkvLyB0YWdsaWIgZGlyZWN0aXZlIGNhbiBjYXVzZQotCQkJLy8gdGhhdCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRvIGJlIHJlcG9ydGVkLCBmaWx0ZXIgb3V0IGFueQotCQkJLy8gZHVwbGljYXRlZCBVUklzLiBXaGVuIHRoZQotCQkJLy8gdGFnbGliIGlzIGFjdHVhbGx5IG1vZGlmaWVkLCBhIGZ1bGwgcmVidWlsZCB3aWxsIG9jY3VyIGFuZCBubwotCQkJLy8gZHVwbGljYXRlcwotCQkJLy8gd2lsbC9zaG91bGQgYmUgZm91bmQuCi0JCQlMaXN0IHRyYWNrZXJzID0gZ2V0VGFnbGliVHJhY2tlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2tlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlUYWdsaWJUcmFja2VyIHRyYWNrZXIgPSAoVGFnbGliVHJhY2tlcikgdHJhY2tlcnMuZ2V0KGkpOwotCQkJCWlmICh0cmFja2VyLmdldFByZWZpeCgpLmVxdWFscyhwcmVmaXgpICYmIHRyYWNrZXIuZ2V0VVJJKCkuZXF1YWxzKHRhZ2RpcikpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWlmIChfZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIHJlZ2lzdGVyZWQgYSB0cmFja2VyIGZvciBkaXJlY3RvcnkiICsgdGFnZGlyICsgIiB3aXRoIHByZWZpeCAiICsgcHJlZml4KTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldFRhZ2xpYlRyYWNrZXJzKCkuYWRkKG5ldyBUYWdsaWJUcmFja2VyKHRhZ2RpciwgcHJlZml4LCB0bGQsIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkvLyBjb3VsZCB0ZXN0ID4gMSwgYnV0IHNpbmNlIHdlIG9ubHkgY2FyZSBpZiB0aGVyZSBhcmUgOCAoPCVALAotCQkJLy8gdGFnbGliLCB1cmksID0sIHdoZXJlLCBwcmVmaXgsID0sIHdoYXQpIFtvciA0IGZvciBpbmNsdWRlc10KLQkJCWlmIChhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDQgJiYgYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKS5nZXRUeXBlKCkgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJSVRleHRSZWdpb24gbmFtZSA9IGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJXYXJuaW5nOiBwYXJzZXIgdGV4dCB3YXMgcmVxdWVzdGVkIGJ5ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgYnV0IG5vbmUgd2FzIGF2YWlsYWJsZTsgdGFnbGliIHN1cHBvcnQgZGlzYWJsZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlib29sZWFuIHRhZ2xpYkRldGVjdGVkID0gZmFsc2U7Ci0JCQkJCQlib29sZWFuIHRhZ2xpYkRpcmVjdGl2ZURldGVjdGVkID0gZmFsc2U7Ci0JCQkJCQlib29sZWFuIGluY2x1ZGVEZXRlY3RlZCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiBpbmNsdWRlRGlyZWN0aXZlRGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQkJCWludCBzdGFydE9mZnNldCA9IGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpOwotCQkJCQkJaW50IHRleHRMZW5ndGggPSBuYW1lLmdldFRleHRMZW5ndGgoKTsKLQotCQkJCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCQkJCQl0YWdsaWJEZXRlY3RlZCA9IGdldFBhcnNlcigpLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJCQkJCQl0YWdsaWJEaXJlY3RpdmVEZXRlY3RlZCA9IGdldFBhcnNlcigpLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJCQkJCWluY2x1ZGVEZXRlY3RlZCA9IGdldFBhcnNlcigpLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDEyVExETmFtZXMuSU5DTFVERSk7Ci0JCQkJCQkJaW5jbHVkZURpcmVjdGl2ZURldGVjdGVkID0gZ2V0UGFyc2VyKCkucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX0lOQ0xVREUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gb2xkIGZhc2hpb25lZCB3YXkKLQkJCQkJCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IGdldFBhcnNlcigpLmdldFRleHQoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgpOwotCQkJCQkJCXRhZ2xpYkRldGVjdGVkID0gZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQkJCQkJCXRhZ2xpYkRpcmVjdGl2ZURldGVjdGVkID0gZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQkJCQkJaW5jbHVkZURldGVjdGVkID0gZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5JTkNMVURFKTsKLQkJCQkJCQlpbmNsdWRlRGlyZWN0aXZlRGV0ZWN0ZWQgPSBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodGFnbGliRGV0ZWN0ZWQgfHwgdGFnbGliRGlyZWN0aXZlRGV0ZWN0ZWQpIHsKLQkJCQkJCQlwcm9jZXNzVGFnbGliKGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGluY2x1ZGVEZXRlY3RlZCB8fCBpbmNsdWRlRGlyZWN0aXZlRGV0ZWN0ZWQpIHsKLQkJCQkJCQlwcm9jZXNzSW5jbHVkZShhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0KLQkJCX0KLQkJCS8vIGNvdWxkIHRlc3QgPiAxLCBidXQgc2luY2Ugd2Ugb25seSBjYXJlIGlmIHRoZXJlIGFyZSA1ICg8LAotCQkJLy8ganNwOnJvb3QsIHhtbG5zOnByZWZpeCwgPSwgd2hlcmUpCi0JCQllbHNlIGlmIChhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDQgJiYgYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKS5nZXRUeXBlKCkgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpIHsKLQkJCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiV2FybmluZzogcGFyc2VyIHRleHQgd2FzIHJlcXVlc3RlZCBieSAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGJ1dCBub25lIHdhcyBhdmFpbGFibGU7IHRhZ2xpYiBzdXBwb3J0IGRpc2FibGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcHJvY2Vzc0pTUFJvb3QoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmNsdWRlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXByb2Nlc3NJbmNsdWRlKGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0UGFyc2VyKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFByb2Nlc3MgYW4gaW5jbHVkZSBkaXJlY3RpdmUgZm91bmQgYnkgdGhlIHRleHRTb3VyY2UgcGFyc2VyIGFuZAotCQkgKiBhbmNob3IgYW55IHRhZ2xpYnMgZm91bmQgd2l0aGluIGF0IHRoZQotCQkgKiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uIEluY2x1ZGVzIHVzZSB0aGUgaW5jbHVkaW5nIGZpbGUgYXMKLQkJICogdGhlIHBvaW50IG9mIHJlZmVyZW5jZSwgbm90IG5lY2Vzc2FyaWx5IHRoZSAidG9wIiBmaWxlLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0luY2x1ZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbmNsdWRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSlNQU291cmNlUGFyc2VyIHRleHRTb3VyY2UpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gaW5jbHVkZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgaW5jbHVkZWRGaWxlID0gbnVsbDsKLQkJCWJvb2xlYW4gaXNGaWxlbmFtZSA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJaWYgKHRleHRTb3VyY2UuZ2V0VGV4dChpbmNsdWRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpLmVxdWFscyhKU1AxMlRMRE5hbWVzLkZJTEUpKSB7Ci0JCQkJCQkJaXNGaWxlbmFtZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpc0ZpbGVuYW1lID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNGaWxlbmFtZSAmJiByZWdpb24uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCWluY2x1ZGVkRmlsZSA9IHRleHRTb3VyY2UuZ2V0VGV4dChpbmNsdWRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQkJaXNGaWxlbmFtZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGJlIGRvbmUKLQkJCQlpbmNsdWRlZEZpbGUgPSBudWxsOwotCQkJfQotCQkJaWYgKGluY2x1ZGVkRmlsZSAhPSBudWxsKSB7Ci0JCQkJSVBhdGggcm9vdCA9IFRhZ2xpYkluZGV4LmdldENvbnRleHRSb290KGdldEN1cnJlbnRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJSVBhdGggZmlsZUxvY2F0aW9uID0gbmV3IFBhdGgoVVJJSGVscGVyLm5vcm1hbGl6ZShTdHJpbmdVdGlscy5zdHJpcChpbmNsdWRlZEZpbGUpLnRyaW0oKSwgZ2V0Q3VycmVudEJhc2VMb2NhdGlvbigpLnRvU3RyaW5nKCksIHJvb3QudG9TdHJpbmcoKSkpOwotCQkJCS8vIGNoZWNrIGZvciAibG9vcHMiCi0JCQkJaWYgKCFnZXRJbmNsdWRlcygpLmNvbnRhaW5zKGZpbGVMb2NhdGlvbikgJiYgZmlsZUxvY2F0aW9uICE9IG51bGwgJiYgIWZpbGVMb2NhdGlvbi5lcXVhbHMoZ2V0Q3VycmVudEJhc2VMb2NhdGlvbigpKSkgewotCQkJCQlnZXRJbmNsdWRlcygpLnB1c2goZmlsZUxvY2F0aW9uKTsKLQkJCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpCi0JCQkJCQluZXcgSW5jbHVkZUhlbHBlcihhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGdldFBhcnNlcigpKS5wYXJzZShmaWxlTG9jYXRpb24udG9TdHJpbmcoKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJXYXJuaW5nOiBwYXJzZXIgdGV4dCB3YXMgcmVxdWVzdGVkIGJ5ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgYnV0IG5vbmUgd2FzIGF2YWlsYWJsZTsgdGFnbGliIHN1cHBvcnQgZGlzYWJsZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWdldEluY2x1ZGVzKCkucG9wKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxPT1AgSU4gQElOQ0xVREVTIEZPVU5EOiAiICsgZmlsZUxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFB1bGxzIHRoZSBVUkkgYW5kIHByZWZpeCBmcm9tIHRoZSBnaXZlbiBqc3A6cm9vdAotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuZAotCQkvLyBtYWtlcyBzdXJlIHRoZSB0YWdzIGFyZSBrbm93bi4KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0pTUFJvb3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBqc3BSb290U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlwcm9jZXNzSlNQUm9vdChqc3BSb290U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBqc3BSb290U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBnZXRQYXJzZXIoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSlNQUm9vdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIEpTUFNvdXJjZVBhcnNlciB0ZXh0U291cmNlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQkJYm9vbGVhbiB0YWdsaWIgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gdGV4dFNvdXJjZS5nZXRUZXh0KHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoWE1MTlMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlwcmVmaXggPSBuYW1lLnN1YnN0cmluZyhYTUxOU19MRU5HVEgpOwotCQkJCQkJCWlmICghYmFubmVkUHJlZml4ZXMuY29udGFpbnMocHJlZml4KSkKLQkJCQkJCQkJdGFnbGliID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByZWZpeCA9IG51bGw7Ci0JCQkJCQkJdGFnbGliID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodGFnbGliICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJdXJpID0gdGV4dFNvdXJjZS5nZXRUZXh0KHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCWlmICh1cmkgIT0gbnVsbCAmJiBwcmVmaXggIT0gbnVsbCAmJiAoU3RyaW5nVXRpbHMuc3RyaXAodXJpKS5sZW5ndGgoKSA+IDApICYmIChTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCQlpZiAoYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQkJCQkJCWVuYWJsZVRhZ2xpYkZyb21VUkkoU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KSwgU3RyaW5nVXRpbHMuc3RyaXAodXJpKSwgdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWVuYWJsZVRhZ2xpYkZyb21VUkkoU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KSwgU3RyaW5nVXRpbHMuc3RyaXAodXJpKSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQl1cmkgPSBudWxsOwotCQkJCQkJCXByZWZpeCA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaW9vYkV4YykgewotCQkJCS8vIG5vdGhpbmcgdG8gYmUgZG9uZQotCQkJCXVyaSA9IG51bGw7Ci0JCQkJcHJlZml4ID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NUYWdsaWIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXByb2Nlc3NUYWdsaWIodGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGdldFBhcnNlcigpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQdWxscyB0aGUgVVJJIGFuZCBwcmVmaXggZnJvbSB0aGUgZ2l2ZW4gdGFnbGliIGRpcmVjdGl2ZQotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuZCBtYWtlcyBzdXJlIHRoZSB0YWdzIGFyZSBrbm93bi4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NUYWdsaWIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBKU1BTb3VyY2VQYXJzZXIgdGV4dFNvdXJjZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCVN0cmluZyB0YWdkaXIgPSBudWxsOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkvLyByZW1lbWJlciBhdHRyaWJ1dGUgbmFtZQotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJaW50IHRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCS8vIFN0cmluZyBuYW1lID0gdGV4dFNvdXJjZS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LAotCQkJCQkJLy8gdGV4dExlbmd0aCk7Ci0JCQkJCQlpZiAodGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMVRMRE5hbWVzLlBSRUZJWCkpIHsKLQkJCQkJCQlhdHRyTmFtZSA9IEpTUDExVExETmFtZXMuUFJFRklYOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAodGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlVSSSkpIHsKLQkJCQkJCQlhdHRyTmFtZSA9IEpTUDExVExETmFtZXMuVVJJOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAodGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AyMFRMRE5hbWVzLlRBR0RJUikpIHsKLQkJCQkJCQlhdHRyTmFtZSA9IEpTUDIwVExETmFtZXMuVEFHRElSOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHByb2Nlc3MgdmFsdWUKLQkJCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlpZiAoSlNQMTFUTEROYW1lcy5QUkVGSVguZXF1YWxzKGF0dHJOYW1lKSkKLQkJCQkJCQlwcmVmaXggPSB0ZXh0U291cmNlLmdldFRleHQoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgpOwotCQkJCQkJZWxzZSBpZiAoSlNQMTFUTEROYW1lcy5VUkkuZXF1YWxzKGF0dHJOYW1lKSkKLQkJCQkJCQl1cmkgPSB0ZXh0U291cmNlLmdldFRleHQoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgpOwotCQkJCQkJZWxzZSBpZiAoSlNQMjBUTEROYW1lcy5UQUdESVIuZXF1YWxzKGF0dHJOYW1lKSkKLQkJCQkJCQl0YWdkaXIgPSB0ZXh0U291cmNlLmdldFRleHQoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGJlIGRvbmUKLQkJCQl1cmkgPSBudWxsOwotCQkJCXByZWZpeCA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAodXJpICE9IG51bGwgJiYgcHJlZml4ICE9IG51bGwgJiYgKFN0cmluZ1V0aWxzLnN0cmlwKHVyaSkubGVuZ3RoKCkgPiAwKSAmJiAoU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJaWYgKGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJCQllbmFibGVUYWdsaWJGcm9tVVJJKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCksIFN0cmluZ1V0aWxzLnN0cmlwKHVyaSksIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJZWxzZQotCQkJCQllbmFibGVUYWdsaWJGcm9tVVJJKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCksIFN0cmluZ1V0aWxzLnN0cmlwKHVyaSksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0YWdkaXIgIT0gbnVsbCAmJiBwcmVmaXggIT0gbnVsbCAmJiAoU3RyaW5nVXRpbHMuc3RyaXAodGFnZGlyKS5sZW5ndGgoKSA+IDApICYmIChTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpLmxlbmd0aCgpID4gMCkpIHsKLQkJCQlpZiAoYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQkJCWVuYWJsZVRhZ3NJbkRpcihTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpLCBTdHJpbmdVdGlscy5zdHJpcCh0YWdkaXIpLCB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCWVsc2UKLQkJCQkJZW5hYmxlVGFnc0luRGlyKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCksIFN0cmluZ1V0aWxzLnN0cmlwKHRhZ2RpciksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVzZXRCbG9ja1RhZ3MoKSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJdGVyYXRvciBuYW1lcyA9IGdldFBhcnNlcigpLmdldEJsb2NrTWFya2VycygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKSBuYW1lcy5uZXh0KCk7Ci0JCQkJaWYgKCFtYXJrZXIuaXNHbG9iYWwoKSAmJiBtYXJrZXIuZ2V0Q29udGV4dCgpID09IFhNTFJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIHJlbW92aW5nIGJsb2NrIHRhZyBuYW1lZDogIiArIG1hcmtlci5nZXRUYWdOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJbmFtZXMucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXROb2RlcygpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1RhZ2xpYnMpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogcmVzZXR0aW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdldEluY2x1ZGVzKCkuY2xlYXIoKTsKLQkJCXJlc2V0QmxvY2tUYWdzKCk7Ci0JCQlyZXNldFRhZ2xpYlRyYWNrZXJzKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdEb2N1bWVudCkgewotCQkJQXNzZXJ0LmlzVHJ1ZShuZXdEb2N1bWVudCAhPSBudWxsLCAibnVsbCBkb2N1bWVudCIpOwotCQkJQXNzZXJ0LmlzVHJ1ZShuZXdEb2N1bWVudC5nZXRQYXJzZXIoKSAhPSBudWxsLCAibnVsbCBkb2N1bWVudCBwYXJzZXIiKTsKLQkJCUFzc2VydC5pc1RydWUobmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBKU1BTb3VyY2VQYXJzZXIsICJjYW4gb25seSBsaXN0ZW4gdG8gZG9jdW1lbnQgd2l0aCBhIEpTUFNvdXJjZVBhcnNlciIpOwotCQkJZ2V0U291cmNlUGFyc2VyKCkucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcih0aGlzKTsKLQkJCXNldFNvdXJjZVBhcnNlcigoSlNQU291cmNlUGFyc2VyKSBuZXdEb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCQlnZXRTb3VyY2VQYXJzZXIoKS5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEluY2x1ZGVIZWxwZXIgZXh0ZW5kcyBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIHsKLQkJcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkFuY2hvciA9IG51bGw7Ci0JCXByb3RlY3RlZCBKU1BTb3VyY2VQYXJzZXIgZkxvY2FsUGFyc2VyID0gbnVsbDsKLQkJcHJvdGVjdGVkIEpTUFNvdXJjZVBhcnNlciBmUGFyZW50UGFyc2VyID0gbnVsbDsKLQotCQlwdWJsaWMgSW5jbHVkZUhlbHBlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvciwgSlNQU291cmNlUGFyc2VyIHJvb3RQYXJzZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmQW5jaG9yID0gYW5jaG9yOwotCQkJZlBhcmVudFBhcnNlciA9IHJvb3RQYXJzZXI7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBkZXRlY3RDaGFyc2V0KElGaWxlIGZpbGUpIHsKLQkJCWlmIChmaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvLyBvcHRpbWl6ZWQgZGVzY3JpcHRpb24gbG9va3VwLCBtaWdodCBub3Qgc3VjY2VlZAotCQkJCQlkID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkLmdldENoYXJzZXQoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlCi0JCQkJCS8vIHR5cGUKLQkJCQkJLy8gY2hlY2sgYWJvdmUKLQkJCQl9Ci0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoY29udGVudHMsIGZpbGUuZ2V0TmFtZSgpLCBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVH0pOwotCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGRlc2NyaXB0aW9uLmdldENoYXJzZXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyB3aWxsIHRyeSB0byBjbGVhbnVwIGluIGZpbmFsbHkKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudHMoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUlGaWxlIGlGaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24obmV3IFBhdGgoZmlsZU5hbWUpKTsKLQkJCWlmIChpRmlsZSAhPSBudWxsICYmIGlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nIGNoYXJzZXQgPSBkZXRlY3RDaGFyc2V0KGlGaWxlKTsKLQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGVudHMgPSBpRmlsZS5nZXRDb250ZW50cygpOwotCQkJCQlSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbnRlbnRzLCBjaGFyc2V0KTsKLQkJCQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKLQkJCQkJaW50IG4gPSByZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJCQlzLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQkJCW4gPSByZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KQotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkFuIGV4Y2VwdGlvbiBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nICIgKyBmaWxlTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgYyA9IDA7Ci0JCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQkJaW50IGNvdW50ID0gMDsKLQkJCQlGaWxlIGZpbGUgPSBudWxsOwotCQkJCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCQkJCWxlbmd0aCA9IChpbnQpIGZpbGUubGVuZ3RoKCk7Ci0JCQkJCWZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQkJCXdoaWxlICgoKGMgPSBmaXMucmVhZCgpKSA+PSAwKSAmJiAoY291bnQgPCBsZW5ndGgpKSB7Ci0JCQkJCQljb3VudCsrOwotCQkJCQkJcy5hcHBlbmQoKGNoYXIpIGMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiICsgZmlsZU5hbWUgKyAiXCIiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2Ugd3Jvbmc6IHNwZWNpZnkgaW5wdXRmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChmaXMgIT0gbnVsbCkgewotCQkJCQkJCWZpcy5jbG9zZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbm90aGluZyB0byBkbwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vZGVQYXJzZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJLy8gY291bGQgdGVzdCA+IDEsIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgaWYgdGhlcmUgYXJlIDggKDwlQCwKLQkJCS8vIHRhZ2xpYiwgdXJpLCA9LCB3aGVyZSwgcHJlZml4LCA9LCB3aGF0KQotCQkJaWYgKGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gMSAmJiBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lID0gYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IGZMb2NhbFBhcnNlci5nZXRUZXh0KGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpLCBuYW1lLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCWlmIChkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRBR0xJQikgfHwgZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQikpIHsKLQkJCQkJCXByb2Nlc3NUYWdsaWIoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGZBbmNob3IsIGZMb2NhbFBhcnNlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuSU5DTFVERSkgfHwgZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX0lOQ0xVREUpKSB7Ci0JCQkJCQlwcm9jZXNzSW5jbHVkZShhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZkFuY2hvciwgZkxvY2FsUGFyc2VyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaW9vYkV4YykgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQkJLy8gY291bGQgdGVzdCA+IDEsIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgaWYgdGhlcmUgYXJlIDUgKDwsCi0JCQkvLyBqc3A6cm9vdCwgeG1sbnM6cHJlZml4LCA9LCB3aGVyZSkKLQkJCWVsc2UgaWYgKGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gNCAmJiBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkgewotCQkJCXByb2Nlc3NKU1BSb290KGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBmQW5jaG9yLCBmTG9jYWxQYXJzZXIpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCQlKU1BTb3VyY2VQYXJzZXIgcCA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJCWZMb2NhbFBhcnNlciA9IHA7Ci0JCQlMaXN0IGJsb2NrVGFncyA9IGZQYXJlbnRQYXJzZXIuZ2V0QmxvY2tNYXJrZXJzKCk7Ci0JCQlTdHJpbmcgaW5jbHVkZWRGaWxlbmFtZSA9IGZpbGVuYW1lOwotCQkJRmlsZSBiYXNlRmlsZSA9IEZpbGVCdWZmZXJzLmdldFN5c3RlbUZpbGVBdExvY2F0aW9uKG5ldyBQYXRoKGluY2x1ZGVkRmlsZW5hbWUpKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGJhc2VGaWxlICE9IG51bGwpCi0JCQkJCWluY2x1ZGVkRmlsZW5hbWUgPSBiYXNlRmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQkJU3RyaW5nIHMgPSBnZXRDb250ZW50cyhpbmNsdWRlZEZpbGVuYW1lKTsKLQkJCWZMb2NhbFBhcnNlci5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQkJZkxvY2FsUGFyc2VyLnJlc2V0KHMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja1RhZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGJsb2NrVGFncy5nZXQoaSk7Ci0JCQkJZkxvY2FsUGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcihtYXJrZXIuZ2V0VGFnTmFtZSgpLCBudWxsLCBtYXJrZXIuZ2V0Q29udGV4dCgpLCBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpKTsKLQkJCX0KLQkJCS8vIGZvcmNlIHBhcnNlCi0JCQlmTG9jYWxQYXJzZXIuZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JCQlmTG9jYWxQYXJzZXIgPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXROb2RlcygpIHsKLQkJfQotCi0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90bGRjbWRvY3VtZW50L21hbmFnZXIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLy8gd2lsbCBob2xkIHRoZSBwcmVmaXhlcyBiYW5uZWQgYnkgdGhlIHNwZWNpZmljYXRpb247IHRhZ2xpYnMgbWF5IG5vdCB1c2UKLQkvLyB0aGVtCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGJhbm5lZFByZWZpeGVzID0gbnVsbDsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zOiI7IC8vJE5PTi1OTFMtMSQgCi0Jc3RhdGljIGZpbmFsIGludCBYTUxOU19MRU5HVEggPSBYTUxOUy5sZW5ndGgoKTsKLQotCXN0YXRpYyB7Ci0JCWJhbm5lZFByZWZpeGVzID0gbmV3IEFycmF5TGlzdCg3KTsKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJqc3AiKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoImpzcHgiKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoImphdmEiKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoImphdmF4Iik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJzZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJzdW4iKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoInN1bnciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnlUTEQgZkNNRG9jdW1lbnRCdWlsZGVyID0gbnVsbDsKLQlwcml2YXRlIERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgZkRpcmVjdGl2ZUhhbmRsZXIgPSBudWxsOwotCXByaXZhdGUgSGFzaHRhYmxlIGZEb2N1bWVudHMgPSBudWxsOwotCXByaXZhdGUgU3RhY2sgZkluY2x1ZGVzID0gbnVsbDsKLQotCXByaXZhdGUgSlNQU291cmNlUGFyc2VyIGZQYXJzZXIgPSBudWxsOwotCi0JLy8gdHJpdmlhbCBoYW5kIGVkaXQgdG8gcmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBwcml2YXRlIFVSSVJlc29sdmVyUHJvdmlkZXIKLQkvLyBmUmVzb2x2ZXJQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIExpc3QgZlRhZ2xpYlRyYWNrZXJzID0gbnVsbDsKLQotCXB1YmxpYyBUTERDTURvY3VtZW50TWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgewotCQlpZiAoX2RlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGNsZWFyZWQgaXRzIENNRG9jdW1lbnQgY2FjaGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWdldERvY3VtZW50cygpLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBDTURvY3VtZW50IGF0IHRoZSB1cmkgKGNhY2hlZCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyB1cmkpIHsKLQkJaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZWZlcmVuY2UgPSB1cmk7Ci0JCS8qKgotCQkgKiBKU1AgMS4yIFNwZWNpZmljYXRpb24sIHNlY3Rpb24gNS4yLjIganNwLTFfMi1mY3Mtc3BlYy5wZGYsIHBhZ2UgODcKLQkJICovCi0JCVN0cmluZyBVUk5wcmVmaXggPSAidXJuOmpzcHRsZDoiOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZWZlcmVuY2Uuc3RhcnRzV2l0aChVUk5wcmVmaXgpKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgc2VjdGlvbiA3LjMuMgotCQkJICovCi0JCQlpZiAocmVmZXJlbmNlLmxlbmd0aCgpID4gVVJOcHJlZml4Lmxlbmd0aCgpKQotCQkJCXJlZmVyZW5jZSA9IHJlZmVyZW5jZS5zdWJzdHJpbmcoMTEpOwotCQl9Ci0JCWVsc2UgewotCQkJLyoqCi0JCQkgKiBAc2VlIHNlY3Rpb24gNy4zLjYKLQkJCSAqLwotCQl9Ci0JCUNNRG9jdW1lbnQgZG9jID0gKENNRG9jdW1lbnQpIGdldERvY3VtZW50cygpLmdldChyZWZlcmVuY2UpOwotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCWRvYyA9IGxvYWRUYWdsaWIocmVmZXJlbmNlKTsKLQkJCWlmIChkb2MgIT0gbnVsbCkKLQkJCQlnZXREb2N1bWVudHMoKS5wdXQocmVmZXJlbmNlLCBkb2MpOwotCQl9Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY01Eb2N1bWVudEJ1aWxkZXIuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgQ01Eb2N1bWVudEZhY3RvcnlUTEQsIHNpbmNlIGl0IGhhcyBtb3JlIGJ1aWxkZXIKLQkgKiAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudEZhY3RvcnlUTEQgZ2V0Q01Eb2N1bWVudEJ1aWxkZXIoKSB7Ci0JCWlmIChmQ01Eb2N1bWVudEJ1aWxkZXIgPT0gbnVsbCkKLQkJCWZDTURvY3VtZW50QnVpbGRlciA9IG5ldyBDTURvY3VtZW50RmFjdG9yeVRMRCgpOwotCQlyZXR1cm4gZkNNRG9jdW1lbnRCdWlsZGVyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRUcmFja2VycyhpbnQgb2Zmc2V0KSB7Ci0JCUxpc3QgdmFsaWREb2NzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBhbGxkb2NzID0gZ2V0VGFnbGliVHJhY2tlcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoYWxsZG9jcy5oYXNOZXh0KCkpIHsKLQkJCVRhZ2xpYlRyYWNrZXIgYVRyYWNrZXIgPSAoVGFnbGliVHJhY2tlcikgYWxsZG9jcy5uZXh0KCk7Ci0JCQlpZiAoYVRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSA8IG9mZnNldCB8fCBvZmZzZXQgPCAwKSB7Ci0JCQkJdmFsaWREb2NzLmFkZChhVHJhY2tlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkRG9jczsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50VHJhY2tlcnMoU3RyaW5nIHByZWZpeCwgaW50IG9mZnNldCkgewotCQlMaXN0IHZhbGlkRG9jcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgYWxsZG9jcyA9IGdldFRhZ2xpYlRyYWNrZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFsbGRvY3MuaGFzTmV4dCgpKSB7Ci0JCQlUYWdsaWJUcmFja2VyIGFUcmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGFsbGRvY3MubmV4dCgpOwotCQkJaWYgKChhVHJhY2tlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpIDwgb2Zmc2V0IHx8IG9mZnNldCA8IDApICYmIGFUcmFja2VyLmdldFByZWZpeCgpLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQkJdmFsaWREb2NzLmFkZChhVHJhY2tlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkRG9jczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlJUGF0aCBnZXRDdXJyZW50QmFzZUxvY2F0aW9uKCkgewotCQlJUGF0aCBiYXNlTG9jYXRpb24gPSBudWxsOwotCQlpZiAoIWdldEluY2x1ZGVzKCkuaXNFbXB0eSgpKSB7Ci0JCQliYXNlTG9jYXRpb24gPSAoSVBhdGgpIGdldEluY2x1ZGVzKCkucGVlaygpOwotCQl9Ci0JCWVsc2UgewotCQkJSVBhdGggcGF0aCA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0RmlsZUJ1ZmZlcih0aGlzKS5nZXRMb2NhdGlvbigpOwotCQkJaWYgKHBhdGgudG9GaWxlKCkuZXhpc3RzKCkpCi0JCQkJYmFzZUxvY2F0aW9uID0gcGF0aDsKLQkJCWVsc2UKLQkJCQliYXNlTG9jYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gYmFzZUxvY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGdldERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSB7Ci0JCWlmIChmRGlyZWN0aXZlSGFuZGxlciA9PSBudWxsKQotCQkJZkRpcmVjdGl2ZUhhbmRsZXIgPSBuZXcgRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpOwotCQlyZXR1cm4gZkRpcmVjdGl2ZUhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZG9jdW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEhhc2h0YWJsZQotCSAqLwotCXB1YmxpYyBIYXNodGFibGUgZ2V0RG9jdW1lbnRzKCkgewotCQlpZiAoZkRvY3VtZW50cyA9PSBudWxsKQotCQkJZkRvY3VtZW50cyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcmV0dXJuIGZEb2N1bWVudHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBDTURvY3VtZW50IGF0IHRoZSB0YWdkaXIgKGNhY2hlZCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBnZXRJbXBsaWNpdENNRG9jdW1lbnQoU3RyaW5nIHRhZ2RpcikgewotCQlpZiAodGFnZGlyID09IG51bGwgfHwgdGFnZGlyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlZmVyZW5jZSA9IHRhZ2RpcjsKLQkJLyoqCi0JCSAqIEpTUCAxLjIgU3BlY2lmaWNhdGlvbiwgc2VjdGlvbiA1LjIuMiBqc3AtMV8yLWZjcy1zcGVjLnBkZiwgcGFnZSA4NwotCQkgKi8KLQkJU3RyaW5nIFVSTnByZWZpeCA9ICJ1cm46anNwdGxkOiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlZmVyZW5jZS5zdGFydHNXaXRoKFVSTnByZWZpeCkpIHsKLQkJCS8qKgotCQkJICogQHNlZSBzZWN0aW9uIDcuMy4yCi0JCQkgKi8KLQkJCWlmIChyZWZlcmVuY2UubGVuZ3RoKCkgPiBVUk5wcmVmaXgubGVuZ3RoKCkpCi0JCQkJcmVmZXJlbmNlID0gcmVmZXJlbmNlLnN1YnN0cmluZygxMSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgc2VjdGlvbiA3LjMuNgotCQkJICovCi0JCX0KLQkJQ01Eb2N1bWVudCBkb2MgPSAoQ01Eb2N1bWVudCkgZ2V0RG9jdW1lbnRzKCkuZ2V0KHJlZmVyZW5jZSk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJZG9jID0gbG9hZFRhZ0RpcihyZWZlcmVuY2UpOwotCQkJaWYgKGRvYyAhPSBudWxsKQotCQkJCWdldERvY3VtZW50cygpLnB1dChyZWZlcmVuY2UsIGRvYyk7Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdGFjawotCSAqLwotCXByb3RlY3RlZCBTdGFjayBnZXRJbmNsdWRlcygpIHsKLQkJaWYgKGZJbmNsdWRlcyA9PSBudWxsKQotCQkJZkluY2x1ZGVzID0gbmV3IFN0YWNrKCk7Ci0JCXJldHVybiBmSW5jbHVkZXM7Ci0JfQotCi0JSlNQU291cmNlUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJUmVzb2x2ZXJQcm92aWRlciBnZXRSZXNvbHZlclByb3ZpZGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSlNQU291cmNlUGFyc2VyIGdldFNvdXJjZVBhcnNlcigpIHsKLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpIHsKLQkJcmV0dXJuIGdldERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0VGFnbGliVHJhY2tlcnMoKSB7Ci0JCWlmIChmVGFnbGliVHJhY2tlcnMgPT0gbnVsbCkKLQkJCWZUYWdsaWJUcmFja2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZUYWdsaWJUcmFja2VyczsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgdGFncyBmcm9tIHRoZSBzcGVjaWZpZWQgVVJJLiBJdCBtdXN0IHBvaW50IHRvIGEgVVJMIG9mIHZhbGlkCi0JICogdGFnIGZpbGVzIHRvIHdvcmsuCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgbG9hZFRhZ0RpcihTdHJpbmcgdXJpKSB7Ci0JCUlUYWdsaWJSZWNvcmQgcmVmZXJlbmNlID0gVGFnbGliSW5kZXgucmVzb2x2ZShnZXRDdXJyZW50QmFzZUxvY2F0aW9uKCkudG9TdHJpbmcoKSwgdXJpLCBmYWxzZSk7Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJQ01Eb2N1bWVudCBkb2N1bWVudCA9IGdldENNRG9jdW1lbnRCdWlsZGVyKCkuY3JlYXRlQ01Eb2N1bWVudChyZWZlcmVuY2UpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJLy8gSlNQMl9UT0RPOiBpbXBsZW1lbnQgZm9yIEpTUCAyLjAKLQkJU3RyaW5nIGxvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGdldEN1cnJlbnRCYXNlTG9jYXRpb24oKS50b1N0cmluZygpLCBudWxsLCB1cmkpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoX2RlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRpbmcgdGFncyBmcm9tIGRpciIgKyB1cmkgKyAiIGF0ICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldENNRG9jdW1lbnRCdWlsZGVyKCkuY3JlYXRlQ01Eb2N1bWVudChsb2NhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHRhZ2xpYiBmcm9tIHRoZSBzcGVjaWZpZWQgVVJJLiBJdCBtdXN0IHBvaW50IHRvIGEgdmFsaWQKLQkgKiB0YWdsaWIgZGVzY3JpcHRvciBvciB2YWxpZCBKQVIgZmlsZSB0byB3b3JrLgotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGxvYWRUYWdsaWIoU3RyaW5nIHVyaSkgewotCQlDTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJSVRhZ2xpYlJlY29yZCByZWZlcmVuY2UgPSBUYWdsaWJJbmRleC5yZXNvbHZlKFRhZ2xpYkNvbnRyb2xsZXIuZ2V0RmlsZUJ1ZmZlcih0aGlzKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksIHVyaSwgZmFsc2UpOwotCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCWRvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudEJ1aWxkZXIoKS5jcmVhdGVDTURvY3VtZW50KHJlZmVyZW5jZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoZ2V0Q3VycmVudEJhc2VMb2NhdGlvbigpLnRvU3RyaW5nKCksIG51bGwsIHVyaSk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIHRhZ3MgZnJvbSAiICsgdXJpICsgIiBhdCAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlkb2N1bWVudCA9IGdldENNRG9jdW1lbnRCdWlsZGVyKCkuY3JlYXRlQ01Eb2N1bWVudChsb2NhdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0VGFnbGliVHJhY2tlcnMoKSB7Ci0JCWlmIChfZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgY2xlYXJlZCBpdHMgdGFnbGliIHRyYWNrZXJzXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWdldFRhZ2xpYlRyYWNrZXJzKCkuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VQYXJzZXIoSlNQU291cmNlUGFyc2VyIHBhcnNlcikgewotCQlpZiAoZlBhcnNlciAhPSBudWxsKQotCQkJZlBhcnNlci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSk7Ci0JCWZQYXJzZXIgPSBwYXJzZXI7Ci0JCWlmIChmUGFyc2VyICE9IG51bGwpCi0JCQlmUGFyc2VyLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREZ1bmN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREZ1bmN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQyMDE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERGdW5jdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLlRMREZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBUTERGdW5jdGlvbkltcGwgaW1wbGVtZW50cyBUTERGdW5jdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRGlzcGxheU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZFeGFtcGxlID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCXByaXZhdGUgU3RyaW5nIGZJY29uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmTmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgZk93bmVyRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZTaWduYXR1cmUgPSBudWxsOwotCi0JcHVibGljIFRMREZ1bmN0aW9uSW1wbChDTURvY3VtZW50IG93bmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZPd25lckRvY3VtZW50ID0gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGFzc05hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NOYW1lOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkaXNwbGF5TmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZkRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXhhbXBsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBmRXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVuc2lvbnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGZFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWNvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEljb24oKSB7Ci0JCXJldHVybiBmSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBvd25lckRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmT3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNpZ25hdHVyZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQkJcmV0dXJuIGZTaWduYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqICAgICAgICAgICAgVGhlIGNsYXNzTmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJZkNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkaXNwbGF5TmFtZQotCSAqICAgICAgICAgICAgVGhlIGRpc3BsYXlOYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLQkJZkRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4YW1wbGUKLQkgKiAgICAgICAgICAgIFRoZSBleGFtcGxlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGFtcGxlKFN0cmluZyBleGFtcGxlKSB7Ci0JCWZFeGFtcGxlID0gZXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWNvbgotCSAqICAgICAgICAgICAgVGhlIGljb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb24oU3RyaW5nIGljb24pIHsKLQkJZkljb24gPSBpY29uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlmTmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNpZ25hdHVyZQotCSAqICAgICAgICAgICAgVGhlIHNpZ25hdHVyZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2lnbmF0dXJlKFN0cmluZyBzaWduYXR1cmUpIHsKLQkJZlNpZ25hdHVyZSA9IHNpZ25hdHVyZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREluaXRQYXJhbUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYzlmYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREluaXRQYXJhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTERJbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFRMREluaXRQYXJhbUltcGwgaW1wbGVtZW50cyBUTERJbml0UGFyYW0gewotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQlwdWJsaWMgVExESW5pdFBhcmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IG5hbWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGRlc2NyaXB0aW9uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RGVzY3JpcHRpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdmFsdWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRWYWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExETGlzdGVuZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExETGlzdGVuZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZWE5NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRExpc3RlbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLlRMRExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBUTERMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBsaXN0ZW5lckNsYXNzOwotCi0JcHVibGljIFN0cmluZyBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJbGlzdGVuZXJDbGFzcyA9IGNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IGxpc3RlbmVyIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TGlzdGVuZXJDbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFsaWRhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhbGlkYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjN2Y1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTERWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFRMRFZhbGlkYXRvckltcGwgaW1wbGVtZW50cyBUTERWYWxpZGF0b3IgewotCXByb3RlY3RlZCBMaXN0IGluaXRQYXJhbXM7Ci0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0b3JDbGFzczsKLQotCXB1YmxpYyBMaXN0IGdldEluaXRQYXJhbXMoKSB7Ci0JCWlmIChpbml0UGFyYW1zID09IG51bGwpCi0JCQlpbml0UGFyYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yQ2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5pdFBhcmFtcyhMaXN0IGluaXRQYXJhbXMpIHsKLQkJdGhpcy5pbml0UGFyYW1zID0gaW5pdFBhcmFtczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JDbGFzcyhTdHJpbmcgdmFsaWRhdG9yQ2xhc3MpIHsKLQkJdGhpcy52YWxpZGF0b3JDbGFzcyA9IHZhbGlkYXRvckNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdmFsaWRhdG9yIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VmFsaWRhdG9yQ2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgaW5pdC1wYXJtczoiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldEluaXRQYXJhbXMoKS5zaXplKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG4iICsgU3RyaW5nVXRpbHMucmVwbGFjZShnZXRJbml0UGFyYW1zKCkuZ2V0KGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFyaWFibGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFyaWFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzU4OTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhcmlhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLlRMRFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERWYXJpYWJsZUltcGwgaW1wbGVtZW50cyBUTERWYXJpYWJsZSB7Ci0JLy8gb3B0aW9uYWwgLSBkZWZhdWx0cyB0byB0cnVlCi0JcHJpdmF0ZSBib29sZWFuIGRlY2xhcmUgPSB0cnVlOwotCQotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbjsKLQkvLyByZXF1aXJlZAotCXByaXZhdGUgU3RyaW5nIG5hbWVGcm9tQXR0cmlidXRlOwotCS8vIHJlcXVpcmVkCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZUdpdmVuOwotCS8vIG9wdGlvbmFsIC0gZGVmYXVsdHMgdG8gTkVTVEVECi0JcHJpdmF0ZSBTdHJpbmcgc2NvcGUgPSBKU1AxMlRMRE5hbWVzLlZBUklBQkxFX1NDT1BFX05FU1RFRDsKLQkvLyByZXF1aXJlZCAtIGRlZmF1bHRzIHRvIGEgU3RyaW5nCi0JcHJpdmF0ZSBTdHJpbmcgdmFyaWFibGVDbGFzcyA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVjbGFyZSgpIHsKLQkJcmV0dXJuIGRlY2xhcmU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBuYW1lRnJvbUF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVHaXZlbigpIHsKLQkJcmV0dXJuIG5hbWVHaXZlbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZUNsYXNzKCkgewotCQlyZXR1cm4gdmFyaWFibGVDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJlKGJvb2xlYW4gZGVjbGFyZSkgewotCQl0aGlzLmRlY2xhcmUgPSBkZWNsYXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY2xhcmVTdHJpbmcoU3RyaW5nIGRlY2wpIHsKLQkJc2V0RGVjbGFyZShkZWNsLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRSVUUpIHx8IGRlY2wuZXF1YWxzKEpTUDEyVExETmFtZXMuWUVTKSk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlmRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lRnJvbUF0dHJpYnV0ZShTdHJpbmcgbmFtZUZyb21BdHRyaWJ1dGUpIHsKLQkJdGhpcy5uYW1lRnJvbUF0dHJpYnV0ZSA9IG5hbWVGcm9tQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVHaXZlbihTdHJpbmcgbmFtZUdpdmVuKSB7Ci0JCXRoaXMubmFtZUdpdmVuID0gbmFtZUdpdmVuOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFyaWFibGVDbGFzcyhTdHJpbmcgdmFyaWFibGVDbGFzcykgewotCQl0aGlzLnZhcmlhYmxlQ2xhc3MgPSB2YXJpYWJsZUNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbmFtZSBnaXZlbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldE5hbWVHaXZlbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lIGZyb20gYXR0cmlidXRlOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSkpOyAvLyROT04tTkxTLTEkCi0JCS8vIEJvb2xlYW4udG9TdHJpbmcoYm9vbGVhbikgaXMgaW50cm9kdWNlZCBpbiBKREsgMS40Ci0JCS8vYnVmZmVyLmFwcGVuZCgiXG5cdCBkZWNsYXJlOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoQm9vbGVhbi50b1N0cmluZyhnZXREZWNsYXJlKCkpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGVjbGFyZToiICsgU3RyaW5nVXRpbHMudG9TdHJpbmcoZ2V0RGVjbGFyZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBzY29wZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFNjb3BlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhcmlhYmxlIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VmFyaWFibGVDbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVGFnbGliVHJhY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RhZ2xpYlRyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5ODg1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVGFnbGliVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRXcmFwcGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jb250ZW50bW9kZWwuQ01Eb2N1bWVudFRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLyoqCi0gKiBUYWdsaWJUcmFja2VyIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJUcmFja2VyIGV4dGVuZHMgQ01Eb2N1bWVudFdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudFRyYWNrZXIgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQlwdWJsaWMgVGFnbGliVHJhY2tlcihTdHJpbmcgbmV3VVJJLCBTdHJpbmcgbmV3UHJlZml4LCBDTURvY3VtZW50IHRsZCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCXN1cGVyKG5ld1VSSSwgbmV3UHJlZml4LCB0bGQpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gYVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRQcmVmaXgoKSArICJAIiArIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RDb250ZW50RGVzY3JpYmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0Q29udGVudERlc2NyaWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWVhYTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RDb250ZW50RGVzY3JpYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGVudERlc2NyaWJlciBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0KLQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCi0JCS8vIGFzc3VtZSBpZiB3ZSdyZSBjYWxsZWQgYXQgYWxsIHRoYXQgd2UgYXJlIHZhbGlkIChmZXcgdHlwZXMgY291bGQgYmUKLQkJLy8gZGlzcHJvdmVkLCBtYXliZSBYTUwgLS0gb3IsIG1heWJlIGlmIGV4Y2VwdGlvbiBvY2N1cnMgYWJvdmU/KQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCi0JCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQotCQkvLyBhc3N1bWUgaWYgd2UncmUgY2FsbGVkIGF0IGFsbCB0aGF0IHdlIGFyZSB2YWxpZCAoZmV3IHR5cGVzIGNvdWxkIGJlCi0JCS8vIGRpc3Byb3ZlZCwgbWF5YmUgWE1MIC0tIG9yLCBtYXliZSBpZiBleGNlcHRpb24gb2NjdXJzIGFib3ZlPykKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyI2dldFN1cHBvcnRlZE9wdGlvbnMoKQotCSAqLwotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRldGVjdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGU6IGlmIHdlJ3JlIGFza2VkIGZvciBvbmUsIHdlIHNldCB0aGVtIGFsbC4gSSBuZWVkIHRvIGJlIHN1cmUgaWYKLQkJLy8gY2FsbGVkCi0JCS8vIG11bGl0aXBsZSB0aW1lcyAob25lIGZvciBlYWNoLCBzYXkpIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQotCQkvLyBwcm9jZXNzaW5nIHNhbWUKLQkJLy8gY29udGVudCBhZ2Fpbi4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IGRldGVjdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCS8vIGJ5IHRleHQgdHlwZS4KLQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQnl0ZU9yZGVyTWFyayA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LCBtYXkKLQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBkZXRlY3RlZEJ5dGVPcmRlck1hcmspOwotCQl9Ci0KLQotCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCS8vIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkvLyBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVAotCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYKLQkJCS8vIGludmFsaWQKLQkJCS8vIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucyBhbgotCQkJLy8gImFwcHJvcHJpYXRlIGRlZmF1bHQiIHRvIHVzZS4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBlbmNvZGluZ01lbWVudG8uZ2V0SW52YWxpZEVuY29kaW5nKCkpOwotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCX0KLQotCQlPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCS8vIHdlIGFsd2F5cyBpbmNsdWRlIGRldGVjdGVkLCBpZiBpdHMgZGlmZmVyZW50IHRoYW4gamF2YQotCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQ2hhcnNldCA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCk7Ci0JCQlpZiAoamF2YUNoYXJzZXQuZXF1YWxzKGV4aXN0aW5nQ2hhcnNldCkpIHsKLQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gZGVmYXVsdC50aGUKLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBnZXREZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMgbmVlZCB0bwotCQkJCQkvLyBhZGQsIEknbSBhc3N1bWluZwotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhdm9pZCBhZGRpbmcgYW55dGhpbmcgaWYgbm90IGFic29sdXRseSBuZWVkZWQsIHNpbmNlIGFsd2F5cwotCQkvLyAiY2FjaGVkIiBwZXIgc2Vzc2lvbgotCQkvL2Rlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5FTkNPRElOR19NRU1FTlRPLAotCQkvLyBlbmNvZGluZ01lbWVudG8pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIE9iamVjdCBkZXRlY3RlZENoYXJzZXQsIE9iamVjdCBqYXZhQ2hhcnNldCkgewotCQkvLyBzaW5jZSBlcXVhbCwgd2UgZG9uJ3QgbmVlZCB0byBhZGQsIGJ1dCBpZiBvdXIgZGV0ZWN0ZWQgdmVyc2lvbiBpcwotCQkvLyBkaWZmZXJlbnQgdGhhbgotCQkvLyBqYXZhQ2hhcnNldCwgdGhlbiB3ZSBzaG91bGQgYWRkIGl0LiBUaGlzIHdpbGwgaGFwcGVuLCBmb3IgZXhhbXBsZSwKLQkJLy8gaWYgdGhlcmUncwotCQkvLyBkaWZmZXJlbmNlcyBpbiBjYXNlLCBvciBkaWZmZXJlbmNlcyBkdWUgdG8gb3ZlcnJpZGUgcHJvcGVydGllcwotCQlpZiAoZGV0ZWN0ZWRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCS8vCQkJaWYgKCFkZXRlY3RlZENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJLy8JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsCi0JCQkvLyBkZXRlY3RlZENoYXJzZXQpOwotCQkJLy8JCQl9Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJLy8JCWVsc2UgaWYKLQkJLy8gKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5FTkNPRElOR19NRU1FTlRPKSkKLQkJLy8JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzdkY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmludGVybmFsLkJ5dGVSZWFkZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQotCXByb3RlY3RlZCBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0KLQlwcm90ZWN0ZWQgUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uYWRkVHJhY2UocmVhc29uKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0byByZXR1cm4gYSBkZWZhdWx0IGVuY29kaW5nIC0tIGFzIHNwZWNpZmllZCBieSBhbiBpbmR1c3RyeQotCSAqIGNvbnRlbnQgdHlwZSBzcGVjIC0tIHdoZW4gbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgZm9yIGV4YW1wbGUsIFhNTAotCSAqIHNwZWNpZmllcyBVVEYtOCwgSlNQIHNwZWNpZmllcyBJU08tODg1OS0xLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuCi0JICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoICJzcGVjIGRlZmF1bHQiLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy9jcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5hZGRUcmFjZShFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNjNiNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JKU1AgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnREZXNjcmliZXIgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIAotCQkJCUlDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCAKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgCi0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIAotCQkJCUlDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULAotCQkJCUlDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSwgCi0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5MQU5HVUFHRV9BVFRSSUJVVEV9OwotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJvdGVjdGVkIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDYWxjdWxhdGlvbnMoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBoYW5kbGUgc3RhbmRhcmQgb25lcyBmaXJzdCwgdG8gYmUgc3VyZSBkZXRlY3RvciBwcm9jZXNzZXMKLQkJc3VwZXIuaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCS8vIG5vdyBkbyB0aG9zZSBzcGVjaWZpYyBmb3IgSlNQcwotCQkvLyBub3RlOiBkZXRlY3RvciBzaG91bGQgYWx3YXlzIGJlIG9mIGNvcnJlY3QgaW5zdGFuY2UsIGJ1dCB3ZSdsbCBjaGVjaywgZm9yIG5vdy4KLQkJaWYgKGRldGVjdG9yIGluc3RhbmNlb2YgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSB7Ci0JCQlKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IganNwRGV0ZWN0b3IgPSAoSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcjsKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGpzcERldGVjdG9yLmdldExhbmd1YWdlKCk7Ci0JCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSwgbGFuZ3VhZ2UpOwotCQkJfQotCQkJU3RyaW5nIGNvbnRlbnRUeXBlQXR0cmlidXRlID0ganNwRGV0ZWN0b3IuZ2V0Q29udGVudFR5cGUoKTsgCi0JCQlpZiAoY29udGVudFR5cGVBdHRyaWJ1dGUgIT0gbnVsbCAmJiBjb250ZW50VHlwZUF0dHJpYnV0ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfVFlQRV9BVFRSSUJVVEUsIGNvbnRlbnRUeXBlQXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5M2UwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0lDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiY2U1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0lDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JQ29kZWRSZXNvdXJjZVBsdWdpbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AgewotCS8qKgotCSAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIEFQSSBhdCB0aGlzIHBvaW50LiBJdCBzaG91bGQgcHJvYmFibHkgYmUKLQkgKiBtb3ZlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIENPTlRFTlRfVFlQRV9BVFRSSUJVVEUgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgImNvbnRlbnRUeXBlQXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgTEFOR1VBR0VfQVRUUklCVVRFID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJsYW5ndWFnZUF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNGQwYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gbGlzdC5sZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1MWJhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gOS83LzA0IDg6MTIgQU0gKi8KLQotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDkvNy8wNCA4OjEyIEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIvSlNQSGVhZFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QQUdFX0RJUkVDVElWRSA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLQotICAvKioKLSAgICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsIDcKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw2XDFcN1wyXDBcMVwxMVwyMlwwXDFcNlwxXDBcMVw0NVwyXDAiKwotICAgICJcMVwxN1wxXDBcMVw0Nlw2XDBcMVwzNlwxXDQ0XDEyXDBcMVwyN1wxXDBcMVwxMiIrCi0gICAgIlwxXDEwXDFcNDFcMVwxM1wxXDIwXDFcMjJcMVwwXDFcMzNcMVwzMFwxXDI0XDFcMCIrCi0gICAgIlwxXDIzXDFcMFwxXDMxXDFcMjVcMVwwXDFcMTZcMVwxNVwxXDM3XDFcNDBcMVwyMSIrCi0gICAgIlwxXDBcMVwzMlwxXDI2XDFcMzRcMVw0MlwxXDM1XDFcMFwxXDE0XDFcNDNcN1wwIisKLSAgICAiXDFcMjJcMVwwXDFcMzNcMVwzMFwxXDI0XDFcMFwxXDIzXDFcMFwxXDMxXDFcMjUiKwotICAgICJcMVwwXDFcMTZcMVwxNVwxXDM3XDFcNDBcMVwyMVwxXDBcMVwzMlwxXDI2XDFcMzQiKwotICAgICJcMVw0MlwxXDM1XDFcMFwxXDE0XDFcNDNcMTAxXDBcMVw0XDNcMFwxXDVcMTdcMCIrCi0gICAgIlwxXDNcMTZcMFwxXDFcMjBcMFwxXDNcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMiIrCi0gICAgIlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vIHRyaXZpYWwgaGFuZCBlZGl0IHRvIHJlbW92ZSB1bnVzZWQgdmFyaWFibGUgIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0vL3RyaXZpYWwgaGFuZCBlZGl0IHRvIHJlbW92ZSB1bnVzZWQgdmFyaWFibGUgIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDEwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCXB1YmxpYyBKU1BIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKgotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAJCSAqIGZyb20gaW5wdXQKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotLy8gIAkgdHJpdmlhbCBoYW5kIGVkaXQgdG8gcmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAgeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLS8vICAJIHRyaXZpYWwgaGFuZCBlZGl0IHRvIHJlbW92ZSB1bnVzZWQgdmFyaWFibGUgICAgCQl5eWNvbHVtbiA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZwotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgCQloYXNNb3JlID0gdHJ1ZTsKLQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0KLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCi0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BIZWFkVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxODIpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0KLSAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgCWhhc01vcmU9ZmFsc2U7Ci0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIHl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXG4nOwotICAgICAgaWYgKCF5eV9hdEJPTCAmJiB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdccicpIHsKLSAgICAgICAgeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLSAgICAgICAgaWYgKCF5eV9hdEVPRikgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgaWYgKHl5X2F0Qk9MKQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZV07Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5Y21hcFt5eV9pbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHl5X2lzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB5eV9mb3JOZXh0OiB7IHN3aXRjaCAoeXlfc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSA1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDU3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfc3RhdGUgPSA1ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDU5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDYyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSA2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA2NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSA2NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDY5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9zdGF0ZSA9IDcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA3MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gNzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9zdGF0ZSA9IDc1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA3NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDc4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA3OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDgwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9zdGF0ZSA9IDgzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSA4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9zdGF0ZSA9IDg2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gODA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9zdGF0ZSA9IDg3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA4ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gODk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDkwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9zdGF0ZSA9IDkyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA5MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9zdGF0ZSA9IDk1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA5NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gMTAwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogeXlfc3RhdGUgPSAxMDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDEwMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSAxMDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSAxMDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxMDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSAxMDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSAxMDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSAxMDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSAxMDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gMTEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9zdGF0ZSA9IDExNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDY0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB5eV9pc0ZpbmFsICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoIHl5X25vTG9va0FoZWFkICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgICAgeyAgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDExNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTE3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0gICAgICAgIGNhc2UgMTE4OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTE5OiBicmVhazsKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZUVuZDsgfQotICAgICAgICBjYXNlIDEyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZUVuZDsgfQotICAgICAgICBjYXNlIDEyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDEyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTIzOiBicmVhazsKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O30gfQotICAgICAgICBjYXNlIDEyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30gfQotICAgICAgICBjYXNlIDEyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9QQUdFX0RJUkVDVElWRSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVTdGFydDsgfQotICAgICAgICBjYXNlIDEyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7IH0KLSAgICAgICAgY2FzZSAxMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSAxMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlQ29udGVudFR5cGU7IH0KLSAgICAgICAgY2FzZSAxMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDk5OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VMYW5ndWFnZTsgfQotICAgICAgICBjYXNlIDEzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTg6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSAxMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsgfQotICAgICAgICBjYXNlIDEzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTsgfQotICAgICAgICBjYXNlIDEzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsgfQotICAgICAgICBjYXNlIDEzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM1OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSAxMzY6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMTM3OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDEzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzOTogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBKU1BIZWFkVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgc2Nhbm5lciA9IG5ldyBKU1BIZWFkVG9rZW5pemVyKCBuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiK2FyZ3ZbaV0rIlwiIik7Ci0vLyAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0vLyAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLS8vICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLS8vICAgICAgfQotICAgICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIEpTUEhlYWRUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLSAgICAgICAvL1N5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIC8vU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgLy9TeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGZhNWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotcHVibGljIGludGVyZmFjZSBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzIGV4dGVuZHMgWE1MSGVhZFRva2VuaXplckNvbnN0YW50cyB7Ci0JU3RyaW5nIFBhZ2VEaXJlY3RpdmVTdGFydCA9ICJQYWdlRGlyZWN0aXZlU3RhcnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VEaXJlY3RpdmVFbmQgPSAiUGFnZURpcmVjdGl2ZUVuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUGFnZUxhbmd1YWdlID0gIlBhZ2VMYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUGFnZUVuY29kaW5nID0gIlBhZ2VFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUGFnZUNvbnRlbnRUeXBlID0gIlBhZ2VDb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5OTZjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJpdmF0ZSBTdHJpbmcgZlBhZ2VFbmNvZGluZ1ZhbHVlID0gbnVsbDsKLQlwcml2YXRlIEpTUEhlYWRUb2tlbml6ZXIgZlRva2VuaXplciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkxhbmd1YWdlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRlbnRUeXBlVmFsdWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlhNTERlY0VuY29kaW5nTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmQ2hhcnNldDsKLQlwcml2YXRlIGJvb2xlYW4gdW5pY29kZUNhc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRlbnRUeXBlOwotCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUpTUEhlYWRUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9raW5pemVyKCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJcGFyc2VIZWFkZXIodG9rZW5pemVyKTsKLQkJLy8gdW5pY29kZSBzdHJlYW0gY2FzZXMgYXJlIGNyZWF0ZWQgZGlyZWN0bHkgaW4gcGFyc2VIZWFkZXIKLQkJaWYgKCF1bmljb2RlQ2FzZSkgewotCQkJU3RyaW5nIGVuYyA9IGdldEFwcHJvcHJpYXRlRW5jb2RpbmcoKTsKLQkJCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBKU1BIZWFkVG9rZW5pemVyIGdldFRva2luaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBKU1BIZWFkVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JLyoqCi0JICogVGhlcmUgY2FuIHNvbWV0aW1lcyBiZSBtdWxpdHBsZSAnZW5jb2RpbmdzJyBzcGVjaWZpZWQgaW4gYSBmaWxlLiBUaGlzCi0JICogaXMgYW4gYXR0ZW1wdCB0byBjZW50cmFsaXplIHRoZSBydWxlcyBmb3IgZGVjaWRpbmcgYmV0d2VlbiB0aGVtLgotCSAqIFJldHVybnMgZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHByaW9yaXR5OiAxLiBYTUwgRGVjbGFyYXRpb24gMi4gcGFnZQotCSAqIGRpcmVjdGl2ZSBwYWdlRW5jb2RpbmcgbmFtZSAzLiBwYWdlIGRpcmVjdGl2ZSBjb250ZW50VHlwZSBjaGFyc2V0IG5hbWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUVuY29kaW5nKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZYTUxEZWNFbmNvZGluZ05hbWUgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZYTUxEZWNFbmNvZGluZ05hbWU7Ci0JCWVsc2UgaWYgKGZQYWdlRW5jb2RpbmdWYWx1ZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gZlBhZ2VFbmNvZGluZ1ZhbHVlOwotCQllbHNlIGlmIChmQ2hhcnNldCAhPSBudWxsKQotCQkJcmVzdWx0ID0gZkNoYXJzZXQ7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBieSBKU1AgU3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIklTTy04ODU5LTEiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbShTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlID0gZmFsc2U7Ci0JCWlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGUgPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2QkUiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCX0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlOwotCX0KLQotCS8qKgotCSAqIExvb2tzIGZvciB3aGF0IGV2ZXIgZW5jb2RpbmcgcHJvcGVydGllcyB0aGUgdG9rZW5pemVyIHJldHVybnMuIEl0cyB0aGUKLQkgKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgdG9rZW5pemVyIHRvIHN0b3Agd2hlbiBhcHByb3ByaWF0ZSBhbmQgbm90IGdvIHRvbwotCSAqIGZhci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VIZWFkZXIoSlNQSGVhZFRva2VuaXplciB0b2tlbml6ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZQYWdlRW5jb2RpbmdWYWx1ZSA9IG51bGw7Ci0JCWZDaGFyc2V0ID0gbnVsbDsKLQotCQlIZWFkUGFyc2VyVG9rZW4gdG9rZW4gPSBudWxsOwotCQlkbyB7Ci0JCQkvLyBkb24ndCB1c2UgJ2dldCcgaGVyZSAoYXQgbGVhc3QgdW50aWwgcmVzZXQgaXNzdWUgZml4ZWQpCi0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCVN0cmluZyB0b2tlblR5cGUgPSB0b2tlbi5nZXRUeXBlKCk7Ci0JCQlpZiAoY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKHRva2VuVHlwZSkpCi0JCQkJdW5pY29kZUNhc2UgPSB0cnVlOwotCQkJZWxzZSB7Ci0KLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmWE1MRGVjRW5jb2RpbmdOYW1lID0gdmFsdWVUb2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUVuY29kaW5nKSB7Ci0JCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodmFsdWVUb2tlblR5cGUpKSB7Ci0JCQkJCQkJZlBhZ2VFbmNvZGluZ1ZhbHVlID0gdmFsdWVUb2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUNvbnRlbnRUeXBlKSB7Ci0JCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodmFsdWVUb2tlblR5cGUpKSB7Ci0JCQkJCQkJZkNvbnRlbnRUeXBlVmFsdWUgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh0b2tlblR5cGUgPT0gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlTGFuZ3VhZ2UpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmTGFuZ3VhZ2UgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JCWlmIChmQ29udGVudFR5cGVWYWx1ZSAhPSBudWxsKSB7Ci0JCQlwYXJzZUNvbnRlbnRUeXBlVmFsdWUoZkNvbnRlbnRUeXBlVmFsdWUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMZWdhbFN0cmluZyhTdHJpbmcgdmFsdWVUb2tlblR5cGUpIHsKLQkJaWYgKHZhbHVlVG9rZW5UeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUNvbnRlbnRUeXBlVmFsdWUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiO1xccypjaGFyc2V0XFxzKj1cXHMqIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gcGFydHMgPSBwYXR0ZXJuLnNwbGl0KGNvbnRlbnRUeXBlKTsKLQkJaWYgKHBhcnRzLmxlbmd0aCA+IDApIHsKLQkJCS8vIGlmIG9ubHkgb25lIGl0ZW0sIGl0IGNhbiBzdGlsbCBiZSBjaGFyc2V0IGluc3RlYWQgb2YKLQkJCS8vIGNvbnRlbnRUeXBlCi0JCQlpZiAocGFydHMubGVuZ3RoID09IDEpIHsKLQkJCQlpZiAocGFydHNbMF0ubGVuZ3RoKCkgPiA2KSB7Ci0JCQkJCVN0cmluZyBjaGVja0ZvckNoYXJzZXQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoMCwgNyk7Ci0JCQkJCWlmIChjaGVja0ZvckNoYXJzZXQuZXF1YWxzSWdub3JlQ2FzZSgiY2hhcnNldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWludCBlcXBvcyA9IHBhcnRzWzBdLmluZGV4T2YoJz0nKTsKLQkJCQkJCWVxcG9zID0gZXFwb3MgKyAxOwotCQkJCQkJaWYgKGVxcG9zIDwgcGFydHNbMF0ubGVuZ3RoKCkpIHsKLQkJCQkJCQlmQ2hhcnNldCA9IHBhcnRzWzBdLnN1YnN0cmluZyhlcXBvcyk7Ci0JCQkJCQkJZkNoYXJzZXQgPSBmQ2hhcnNldC50cmltKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQ29udGVudFR5cGUgPSBwYXJ0c1swXTsKLQkJCX0KLQkJfQotCQlpZiAocGFydHMubGVuZ3RoID4gMSkgewotCQkJZkNoYXJzZXQgPSBwYXJ0c1sxXTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldChJRmlsZSBpRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXNldCgpOwotCQlzdXBlci5zZXQoaUZpbGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXNldCgpIHsKLQkJZkNoYXJzZXQgPSBudWxsOwotCQlmQ29udGVudFR5cGVWYWx1ZSA9IG51bGw7Ci0JCWZQYWdlRW5jb2RpbmdWYWx1ZSA9IG51bGw7Ci0JCWZYTUxEZWNFbmNvZGluZ05hbWUgPSBudWxsOwotCQl1bmljb2RlQ2FzZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldCgpOwotCQlzdXBlci5zZXQoaW5wdXRTdHJlYW0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0KCk7Ci0JCXN1cGVyLnNldChyZWFkZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBmTGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb250ZW50VHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbiBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcgcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZSB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzIG5vdCBwcmVzZW50LgotCQl9Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2ZGQ3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL051bGxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQkJYWRkVHJhY2UoREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnlGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGYWN0b3J5Rm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODRlMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnlGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEZhY3RvcnlGb3JKU1AgaW1wbGVtZW50cyBJRG9jdW1lbnRGYWN0b3J5IHsKLQotCXB1YmxpYyBEb2N1bWVudEZhY3RvcnlGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudEZhY3RvcnkjY3JlYXRlRG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShuZXcgSlNQU291cmNlUGFyc2VyKCkpOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQkvLyByZW1lbWJlciwgdGhlIExvYWRlcgotCQkvLyB3aWxsIG5lZWQgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHBhcnNlcgotCQkvLyBiYXNlZCBvbiAiZW1iZWRkZWQgY29udGVudCIKLQkJSlNQU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJLy8gYWRkIGRlZmF1bHQgbmVzdGFibGUgdGFnIGxpc3QKLQkJYWRkTmVzdGFibGVQcmVmaXgocGFyc2VyLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KEpTUFNvdXJjZVBhcnNlciBwYXJzZXIsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCVRhZ01hcmtlciBibSA9IG5ldyBUYWdNYXJrZXIodGFnTmFtZSk7Ci0JCXBhcnNlci5hZGROZXN0YWJsZVByZWZpeChibSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudExvYWRlckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudExvYWRlckZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2VlYjAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRMb2FkZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuUGFnZURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmVuY29kaW5nLklKU1BIZWFkQ29udGVudERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5lbmNvZGluZy5KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmVuY29kaW5nLkpTUERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db2RlZFJlYWRlckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlckZvckZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudExvYWRlckZvckpTUCBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudExvYWRlciBpbXBsZW1lbnRzIElEb2N1bWVudExvYWRlciwgSURvY3VtZW50TG9hZGVyRm9yRmlsZUJ1ZmZlcnMgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0xBTkdVQUdFID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTUlNRV9UWVBFID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1BFQ19ERUZBVUxUX0VOQ09ESU5HID0gIklTTy04ODU5LTEiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIElGaWxlIGdldEZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcGF0aCA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcGF0aCA9IGlkLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gVE9ETyBuZWVkcyByZXdvcmsgZm9yIGxpbmtlZCByZXNvdXJjZXMKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSByb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChwYXRoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeTsKLQlwcml2YXRlIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCi0JcHVibGljIERvY3VtZW50TG9hZGVyRm9ySlNQKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROZXN0YWJsZVByZWZpeChKU1BTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnTmFtZSkgewotCQlUYWdNYXJrZXIgYm0gPSBuZXcgVGFnTWFya2VyKHRhZ05hbWUpOwotCQlwYXJzZXIuYWRkTmVzdGFibGVQcmVmaXgoYm0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyI2NyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpCi0JICovCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlEb2N1bWVudEZhY3RvcnlGb3JKU1AgZmFjdG9yeSA9IG5ldyBEb2N1bWVudEZhY3RvcnlGb3JKU1AoKTsKLQkJSUVuY29kZWREb2N1bWVudCBkb2N1bWVudCA9IChJRW5jb2RlZERvY3VtZW50KSBmYWN0b3J5LmNyZWF0ZURvY3VtZW50KCk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLmRvY3VtZW50LklEb2N1bWVudExvYWRlciNjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoamF2YS5pby5SZWFkZXIpCi0JICovCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFJlYWRlciByZWFkZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCVN0cmluZ0J1ZmZlciBhbGxUZXh0ID0gcmVhZElucHV0U3RyZWFtKHJlYWRlcik7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXQoYWxsVGV4dC50b1N0cmluZygpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwgJiYgaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBoYXZlIGJvdGggbnVsbCBmaWxlbmFtZSBhbmQgaW5wdXRzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVJlYWRlciBmdWxsUHJlcGFyZWRSZWFkZXIgPSBudWxsOwotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb2RlZFJlYWRlckNyZWF0b3IgY29kZWRSZWFkZXJDcmVhdG9yID0gbmV3IENvZGVkUmVhZGVyQ3JlYXRvcigpOwotCQl0cnkgewotCQkJY29kZWRSZWFkZXJDcmVhdG9yLnNldChmaWxlbmFtZSwgaW5wdXRTdHJlYW0pOwotCQkJZnVsbFByZXBhcmVkUmVhZGVyID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldENvZGVkUmVhZGVyKCk7Ci0JCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldEVuY29kaW5nTWVtZW50byhlbmNvZGluZ01lbWVudG8pOwotCQkJLy8gdGhlIGZhY3QgdGhhdCBmaWxlIGlzIG51bGwgbWVhbnMgdGhpcyBtZXRob2QvY29kZSBwYXRoIGlzIG5vCi0JCQkvLyBnb29kIGZvciBKU1AgZnJhZ21lbnRzCi0JCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEVtYmVkZGVkVHlwZSgoSUZpbGUpIG51bGwpOwotCQkJZnVsbFByZXBhcmVkUmVhZGVyLnJlc2V0KCk7Ci0JCQlpZiAoZW1iZWRkZWRUeXBlICE9IG51bGwpCi0JCQkJZW1iZWRkZWRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpICgoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5nZXRQYXJzZXIoKSk7Ci0JCQlzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZ1bGxQcmVwYXJlZFJlYWRlcik7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChmdWxsUHJlcGFyZWRSZWFkZXIgIT0gbnVsbCkgewotCQkJCWZ1bGxQcmVwYXJlZFJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLmRvY3VtZW50LklEb2N1bWVudExvYWRlciNjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sIGNvbS5pYm0uZW5jb2RpbmcucmVzb3VyY2UuRW5jb2RpbmdSdWxlKQotCSAqLwotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAcmV0dXJuIElEb2N1bWVudFBhcnRpdGlvbmVyCi0JICovCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0RGVmYXVsdE1pbWVUeXBlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdE1pbWVUeXBlKCkgewotCQlyZXR1cm4gREVGQVVMVF9NSU1FX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5tb2RlbC5BYnN0cmFjdER1bXBlciNnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKQotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkKLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJaWYgKGZFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBmRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSB0aGUgTUlNRSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGluIGEgcGFnZSBkaXJlY3RpdmUuIFRoaXMKLQkgKiBzaG91bGQgYXBwZWFyICJhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgSlNQIHBhZ2UiIGFjY29yZGluZyB0byB0aGUKLQkgKiBKU1AgdjEuMiBzcGVjaWZpY2F0aW9uLgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZFR5cGUoSUZpbGUgZmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJYm9vbGVhbiBleGlzdHMgPSBmaWxlLmV4aXN0cygpOwotCQlpZiAoIWV4aXN0cykgewotCQkJLy8gaWYgIm5ldyIgZmlsZSwgYXNzdW1lIGRlZmF1bHQKLQkJCWhhbmRsZXIgPSBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGpzcENvbnRlbnRUeXBlQXR0cmlidXRlID0gKFN0cmluZykgZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFKTsKLQkJCQlpZiAoanNwQ29udGVudFR5cGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBqc3BDb250ZW50VHlwZUF0dHJpYnV0ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWhhbmRsZXIgPSBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlFbWJlZGRlZFR5cGVSZWdpc3RyeSByZWcgPSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKTsKLQkJCQkJaGFuZGxlciA9IHJlZy5nZXRUeXBlRm9yKGpzcENvbnRlbnRUeXBlQXR0cmlidXRlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQloYW5kbGVyID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZSgpOwotCQkJfQotCQl9Ci0JCS8vIHBvc3QgY29uZGl0aW9uCi0JCUFzc2VydC5pc05vdE51bGwoaGFuZGxlcik7Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZFR5cGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlEb2N1bWVudCBkb2MgPSAoKFhNTE1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZEhhbmRsZXIgPSBwYWdlRGlyZWN0aXZlQWRhcHRlci5nZXRFbWJlZGRlZFR5cGUoKTsKLQkJcmV0dXJuIGVtYmVkZGVkSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgSlNQIGZpbGVzLCB0ZXh0L2h0bWwgaXMgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlLiBUaGlzIG1heSB3YW50Ci0JICogdGhpcyBkaWZmZXJlbnQgZm9yIHR5cGVzIGxpa2UganN2IChqc3AgZm9yIHZvaWNlIHhtbCkgRm9yIG5vdywgaGFyZAotCSAqIGNvZGUgdG8gbmV3IGluc3RhbmNlLiBJbiBmdXR1cmUsIHNob3VsZCBnZXQgaW5zdGFuY2UgZnJvbSByZWdpc3RyeS4KLQkgKiBTcGVjaWZpY2F0aW9uIGNpdGVzIEhUTUwgYXMgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHJlZyA9IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpOwotCQlyZXR1cm4gcmVnLmdldFR5cGVGb3IoZ2V0RGVmYXVsdE1pbWVUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRMYW5ndWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExhbmd1YWdlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBmaXJzdCBjaGVjayB0aGUgbW9kZWwgKGRvY3VtZW50IGl0c2VsZikgdG8gc2VlIGlmIGNvbnRhaW5zCi0JCXJlc3VsdCA9IGdldExhbmd1YWdlRnJvbVN0cnVjdHVyZWREb2N1bWVudChtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCS8vIE5vdGU6IGlmIG1vZGVsIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkCi0JCS8vIGxhbmd1YWdlLCB3ZSdsbCBldmVuIHJldHVybiBpdCwKLQkJLy8gc2luY2Ugd2hvIGtub3dzIHdoYXQgZnV0dXJlIGhvbGRzLgotCi0JCS8vIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gREVGQVVMVF9MQU5HVUFHRTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRMYW5ndWFnZUZyb21TdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGFuZ3VhZ2VGcm9tU3RydWN0dXJlZERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGJhc2NpYWxseSBzYW1lIGFsZ29yaXRobSBhcyBnZXQgZW5jb2Rpbmcgb3IKLQkJLy8gZ2V0IGNvbnRlbnQgdHlwZSBmcm9tIHN0cnVjdHVyZWREb2N1bWVudC4KLQkJSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IgbG9jYWxIZWFkUGFyc2VyID0gKElKU1BIZWFkQ29udGVudERldGVjdG9yKSBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKTsKLQkJLy8gd2UgY2FuIGJlIGFzc3VyZWQgdGhhdCBpdHMgYWxyZWFkeSBiZWVuCi0JCS8vIHBhcnNlZC4gSWYgbm90IGNhbGwgcGFyc2VIZWFkZXJGb3JQYWdlRGlyZWN0aXZlKCkKLQkJLy8gYmVmb3JlIGNhbGxpbmcgZ2V0TGFuZ3VhZ2U7Ci0JCWxvY2FsSGVhZFBhcnNlci5zZXQoZG9jdW1lbnQpOwotCQlyZXN1bHQgPSBsb2NhbEhlYWRQYXJzZXIuZ2V0TGFuZ3VhZ2UoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJLy8gcmVtZW1iZXIsIHRoZSBMb2FkZXIKLQkJLy8gd2lsbCBuZWVkIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiBwYXJzZXIKLQkJLy8gYmFzZWQgb24gImVtYmVkZGVkIGNvbnRlbnQiCi0JCUpTUFNvdXJjZVBhcnNlciBwYXJzZXIgPSBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JCS8vIGFkZCBkZWZhdWx0IG5lc3RhYmxlIHRhZyBsaXN0Ci0JCWFkZE5lc3RhYmxlUHJlZml4KHBhcnNlciwgSlNQMTFOYW1lc3BhY2UuSlNQX1RBR19QUkVGSVgpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCX0KLQotCS8qKgotCSAqIFNwZWNpZmljYXRpb24gY2l0ZXMgSVNPLTg4NTktMS9MYXRpbi0xIGFzIHRoZSBkZWZhdWx0IGNoYXJzZXQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gU1BFQ19ERUZBVUxUX0VOQ09ESU5HOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyI2hhbmRsZUxpbmVEZWxpbWl0ZXIoamF2YS5sYW5nLlN0cmluZ0J1ZmZlciwKLQkgKiAgICAgIGNvbS5pYm0uc3NlLm1vZGVsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQpCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBoYW5kbGVMaW5lRGVsaW1pdGVyKFN0cmluZ0J1ZmZlciBvcmlnaW5hbFN0cmluZywgSUVuY29kZWREb2N1bWVudCB0aGVTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyAicmVpbml0aWFsaXplIiBzaW5jZSB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IHRoZQotCSAqIGRlZmF1bHQgb25lIGFzc2lnbmVkLCBiZWZvcmUgd2Ugc3RhcnQgY2hlY2tpbmcgdGhlIHN0cmVhbQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0Q2xvbmVPZkVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEVtYmVkZGVkQ29udGVudFR5cGUsIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3RW1iZWRkZWRDb250ZW50VHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gY2hlY2sgcHJvZ3JhbSBsb2dpYwotCQlBc3NlcnQuaXNOb3ROdWxsKG9sZEVtYmVkZGVkQ29udGVudFR5cGUsICJQcm9ncmFtIGVycm9yOiBpbnZhbGlkIGNhbGwgZHVyaW5nIG1vZGVsIGluaXRpYWxpemF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gb25jZSB3ZSBrbm93IHRoZSBlbWJlZGRlZCBjb250ZW50IHR5cGUsIHdlIG5lZWQgdG8gc2V0IGl0IGluIHRoZQotCQkvLyBQYWdlRGlyZWN0aXZlQWRhcHRlciAuLi4gdGhlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uIGlzCi0JCS8vIGNyaXRpY2FsIGhlcmUsIHRoZSBkb2MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYnV0IGl0cyBjb250ZW50cyBub3QKLQkJLy8gc2V0Ci0JCS8vIHlldCwKLQkJLy8gYW5kIGFsbCBmYWN0b3JpZXMgbXVzdCBoYXZlIGJlZW4gc2V0IHVwIGFsc28uCi0JCVhNTE1vZGVsIGRvbU1vZGVsID0gKFhNTE1vZGVsKSBtb2RlbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCS8vID09PiAvLyBQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikKLQkJLy8gKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkvLyBiZWNhdXNlLCBldmVuIGluIHRoZSBjbG9uZSBjYXNlLCB0aGUgbW9kZWwgaGFzIGJlZW4gcGFyaXRhbGx5Ci0JCS8vIGludGlhbGl6ZWQKLQkJLy8gd2l0aAotCQkvLyB0aGUgb2xkIGVtYmVkZGVkIHR5cGUgKGR1cmluZyBjcmVhdGVNb2RlbCksIHdlIG5lZWQgdG8gdW5pdGlhbGl6ZQotCQkvLyBwYXJ0cyBvZiBpdCwgYmFzZWQgb24gdGhlIG9sZCAob3IgZGVmYXVsdCkgb25lcwotCQlvbGRFbWJlZGRlZENvbnRlbnRUeXBlLnVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkvLyByZW1lbWJlciwgZW1iZWRkZWQgdHlwZSBmYWN0b3JpZXMgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCB3aGVuCi0JCS8vIGVtYmVkZWRUeXBlIGNoYW5nZWQKLQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKG5ld0VtYmVkZGVkQ29udGVudFR5cGUpOwotCQlpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQl9Ci0JCS8vIGFkZGluZyBsYW5ndWFnZSBoZXJlLCBpbiB0aGlzIGNvbnZpZW5lbnQgY2VudHJhbAotCQkvLyBsb2NhdGlvbiwgYnV0IHNvbWUgb2J2aW91cyByZW5hbWluZyBvciByZWZhY3RvcmluZwotCQkvLyB3b3VsZG4ndCBodXJ0LCBpbiBmdXR1cmUuCi0JCS8vIEkgbmVlZGVkIHRvIGFkZCB0aGlzIGxhbmd1YWdlIHNldHRpbmcgZm9yIEpTUCBGcmFnbWVudCBzdXBwb3J0Ci0JCS8vIE5vdGU6IHRoaXMgaXMgdGhlIG9uZSB0aGF0IGNvdW50cywgc2luY2UgYXQgdGhpcyBwb2ludCwKLQkJLy8gdGhlIG1vZGVsIGhhcyBhbiBJRCwgc28gd2UgY2FuIGxvb2sgdXAgSUZpbGUsIGV0Yy4KLQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobW9kZWwpOwotCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBpbml0RW1iZWRkZWRUeXBlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0RW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaW5pdGlhbGl6ZUVtYmVkZGVkVHlwZUZyb21EZWZhdWx0KG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaW5pdEVtYmVkZGVkVHlwZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGV4aXN0aW5nRW1iZWRkZWRUeXBlID0gZ2V0RW1iZWRkZWRUeXBlKG9sZE1vZGVsKTsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdFbWJlZGRlZENvbnRlbnRUeXBlID0gZXhpc3RpbmdFbWJlZGRlZFR5cGUubmV3SW5zdGFuY2UoKTsKLQkJaWYgKGV4aXN0aW5nRW1iZWRkZWRUeXBlID09IG51bGwpIHsKLQkJCWluaXRFbWJlZGRlZFR5cGUobmV3TW9kZWwpOwotCQl9Ci0JCWVsc2UgewotCQkJLy9pbml0RW1iZWRkZWRUeXBlKG5ld01vZGVsKTsKLQkJCWluaXRDbG9uZU9mRW1iZWRkZWRUeXBlKG5ld01vZGVsLCBleGlzdGluZ0VtYmVkZGVkVHlwZSwgbmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCX0KLQkJc2V0TGFuZ3VhZ2VJblBhZ2VEaXJlY3RpdmUobmV3TW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgImluaXRpYWxpemUiIHNpbmNlIGlzIGFsd2F5cyBhc3N1bWVzIGl0IGhhc24ndCBiZWVuIGluaXRhbGl6ZWQKLQkgKiB5ZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbWJlZGRlZFR5cGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZENvbnRlbnRUeXBlKSB7Ci0JCS8vIGNoZWNrIHByb2dyYW0gbG9naWMKLQkJQXNzZXJ0LmlzTm90TnVsbChlbWJlZGRlZENvbnRlbnRUeXBlLCAiUHJvZ3JhbSBlcnJvcjogaW52YWxpZCBjYWxsIGR1cmluZyBtb2RlbCBpbml0aWFsaXphdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIG9uY2Ugd2Uga25vdyB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlLCB3ZSBuZWVkIHRvIHNldCBpdCBpbiB0aGUKLQkJLy8gUGFnZURpcmVjdGl2ZUFkYXB0ZXIgLi4uIHRoZSBvcmRlciBvZiBpbml0aWFsaXphdGlvbiBpcwotCQkvLyBjcml0aWNhbCBoZXJlLCB0aGUgZG9jIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGJ1dCBpdHMgY29udGVudHMgbm90Ci0JCS8vIHNldAotCQkvLyB5ZXQsCi0JCS8vIGFuZCBhbGwgZmFjdG9yaWVzIG11c3QgaGF2ZSBiZWVuIHNldCB1cCBhbHNvLgotCQlYTUxNb2RlbCBkb21Nb2RlbCA9IChYTUxNb2RlbCkgbW9kZWw7Ci0JCVhNTERvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUoZW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCWVtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWVtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJLy8gYWRkaW5nIGxhbmd1YWdlIGhlcmUsIGluIHRoaXMgY29udmllbmVudCBjZW50cmFsCi0JCS8vIGxvY2F0aW9uLCBidXQgc29tZSBvYnZpb3VzIHJlbmFtaW5nIG9yIHJlZmFjdG9yaW5nCi0JCS8vIHdvdWxkbid0IGh1cnQsIGluIGZ1dHVyZS4KLQkJLy8gSSBuZWVkZWQgdG8gYWRkIHRoaXMgbGFuZ3VhZ2Ugc2V0dGluZyBmb3IgSlNQIEZyYWdtZW50IHN1cHBvcnQKLQkJLy8gTm90ZTogSSBkb24ndCB0aGluayB0aGlzIGF0dGVtcHRlZCBpbml0IGNvdW50cyBmb3IgbXVjaC4KLQkJLy8gSSB0aGluayBpdHMgYWx3YXlzIGV4ZWN1dGVkIHdoZW4gbW9kZWwgaXMgdmVyeSBmaXJzdAotCQkvLyBiZWluZyBpbml0aWFsaXplZCwgYW5kIGRvZXNuJ3QgZXZlbiBoYXZlIGNvbnRlbnQKLQkJLy8gb3IgYW4gSUQgeWV0LiBJIHRob3VnaHQgSSdkIGxlYXZlLCBzaW5jZSBpdCB3b3VsZG4ndAotCQkvLyBodXJ0LCBpbiBjYXNlIGl0cyBjYWxsZWQgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KLQkJLy8JCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG1vZGVsKTsKLQkJLy8JCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGluaXQgbWV0aG9kIGlzIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBhcmUgY3JlYXRpbmcgYW4gZW1wdHkgbW9kZWwsCi0JICogd2hpY2ggd2UgYWx3YXlzIGRvLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRUeXBlRnJvbURlZmF1bHQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkQ29udGVudFR5cGUgPSBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKCk7Ci0JCWluaXRpYWxpemVFbWJlZGRlZFR5cGUobW9kZWwsIGVtYmVkZGVkQ29udGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSlNQRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJWE1MTW9kZWwgZG9tTW9kZWwgPSAoWE1MTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8KLQkJLy8gZG9jdW1lbnQgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBzZXQgZm9yIHRoaXMgdG8KLQkJLy8gd29yay4KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGRvY3VtZW50KTsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCS8vIFRoaXMgJ2dldCcgY2F1c2VzIGZpcnN0IHRvIGJlIGJlIGF0dGFjaGVkLgotCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkvLyBtYXkgbWFrZSB0aGlzIGVhc2llciB0byB1c2UgaW4gZnV0dWUKLQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ldyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkoKSk7Ci0JCS8vIEZvciBKU1BzLCB0aGUgTW9kZWxRdWVyeUFkYXB0ZXIgbXVzdCBiZSAiYXR0YWNoZWQiIHRvIHRoZSBkb2N1bWVudAotCQkvLyBiZWZvcmUgY29udGVudCBpcyBzZXQgaW4gdGhlIG1vZGVsLCBzbyB0YWdsaWIgaW5pdGl6YXRpb24gY2FuCi0JCS8vIHRha2UgcGxhY2UuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkvLwotCQkvLyAKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzICJyZWluaXRpYWxpemUiIHNpbmNlIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgdGhlCi0JICogZGVmYXVsdCBvbmUgYXNzaWduZWQsIGJlZm9yZSB3ZSBzdGFydCBjaGVja2luZyB0aGUgc3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlSW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEVtYmVkZGVkQ29udGVudFR5cGUsIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3RW1iZWRkZWRDb250ZW50VHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gY2hlY2sgcHJvZ3JhbSBsb2dpYwotCQlBc3NlcnQuaXNOb3ROdWxsKG9sZEVtYmVkZGVkQ29udGVudFR5cGUsICJQcm9ncmFtIGVycm9yOiBpbnZhbGlkIGNhbGwgZHVyaW5nIG1vZGVsIGluaXRpYWxpemF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gb25jZSB3ZSBrbm93IHRoZSBlbWJlZGRlZCBjb250ZW50IHR5cGUsIHdlIG5lZWQgdG8gc2V0IGl0IGluIHRoZQotCQkvLyBQYWdlRGlyZWN0aXZlQWRhcHRlciAuLi4gdGhlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uIGlzCi0JCS8vIGNyaXRpY2FsIGhlcmUsIHRoZSBkb2MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYnV0IGl0cyBjb250ZW50cyBub3QKLQkJLy8gc2V0Ci0JCS8vIHlldCwKLQkJLy8gYW5kIGFsbCBmYWN0b3JpZXMgbXVzdCBoYXZlIGJlZW4gc2V0IHVwIGFsc28uCi0JCVhNTE1vZGVsIGRvbU1vZGVsID0gKFhNTE1vZGVsKSBtb2RlbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0RXhpc3RpbmdBZGFwdGVyKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJLy8gPT0+IC8vIFByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKQotCQkvLyAoKElOb2RlTm90aWZpZXIpCi0JCS8vIGRvY3VtZW50KS5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJLy8gPT0+IC8vIE1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKQotCQkvLyAoKElOb2RlTm90aWZpZXIpCi0JCS8vIGRvY3VtZW50KS5nZXRFeGlzdGluZ0FkYXB0ZXIoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQlvbGRFbWJlZGRlZENvbnRlbnRUeXBlLnVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkvLyBzaW5jZSAnZG9jdW1lbnQnIGlzIG5vdCByZWNyZWF0ZWQgaW4gdGhpcwotCQkvLyByZWluaXQgcGF0aCwgd2UgbmVlZCB0byByZW1vdmUgYWxsIGFkYXB0ZXJzLAotCQkvLyBleGNlcHQgZm9yIHRoZSBwcm9wYWdhdGVkIGFkYXB0ZXJzIChpbmNsdWRpbmcgcGFnZQotCQkvLyBkaXJlY3RpdmUgYWRhcHRlciwgYW5kIG1vZGVsIHF1ZXJ5IGFkYXB0ZXIpLgotCQkvLyB0byBhY2NvbXBsaXNoIHRoaXMsIHdlJ2xsIGp1c3QgcmVtb3ZlIGFsbCwgdGhlbgotCQkvLyBhZGQgYmFjayB3aXRoIGEgY2FsbCB0byBwcmUtbG9hZCBhZGFwdC4KLQkJLy8gbGV0IGNsaWVudHMgZGVjaWRlIHRvIHVubG9hZCBhZGFwdGVycyBmcm9tIGRvY3VtZW50Ci0JCS8vCQlDb2xsZWN0aW9uIG9sZEFkYXB0ZXJzID0gZG9jdW1lbnQuZ2V0QWRhcHRlcnMoKTsKLQkJLy8JCUl0ZXJhdG9yIG9sZEFkYXB0ZXJzSXRlcmF0b3IgPSBvbGRBZGFwdGVycy5pdGVyYXRvcigpOwotCQkvLwkJd2hpbGUgKG9sZEFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCS8vCQkJSU5vZGVBZGFwdGVyIG9sZEFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKQotCQkvLyBvbGRBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKTsKLQkJLy8JCQlpZiAob2xkQWRhcHRlciAhPSBwYWdlRGlyZWN0aXZlQWRhcHRlciAmJiBvbGRBZGFwdGVyICE9Ci0JCS8vIHByb3BhZ2F0aW5nQWRhcHRlciAmJiBvbGRBZGFwdGVyICE9IG1vZGVsUXVlcnlBZGFwdGVyKSB7Ci0JCS8vCQkJCS8vIERPIE5PVCByZW1vdmUgZGlyZWN0bHkhCi0JCS8vCQkJCS8vIGNhbiBjaGFuZ2UgY29udGVudHMgd2hpbGUgaW4gbm90aWZpdHkgbG9vcCEKLQkJLy8JCQkJLy9vbGRBZGFwdGVyc0l0ZXJhdG9yLnJlbW92ZSgpOwotCQkvLwkJCQlkb2N1bWVudC5yZW1vdmVBZGFwdGVyKG9sZEFkYXB0ZXIpOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJLy8gRE1XOiBJIGJlbGlldmUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBpcyBuZWVkZWQsCi0JCS8vIHNpbmNlIHJlbGVhc2VzIGNhY2hlZCBhZGFwdGVycwotCQkvLwkJCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudEltcGwpIHsKLQkJLy8JCQkJCSgoRG9jdW1lbnRJbXBsKSBkb2N1bWVudCkucmVsZWFzZURvY3VtZW50VHlwZSgpOwotCQkvLwkJCQkJKChEb2N1bWVudEltcGwpIGRvY3VtZW50KS5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJLy8JCQkJfQotCQkvLyByZW1lbWJlciwgZW1iZWRkZWQgdHlwZSBmYWN0b3JpZXMgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCB3aGVuCi0JCS8vIGVtYmVkZWRUeXBlIGNoYW5nZWQKLQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKG5ld0VtYmVkZGVkQ29udGVudFR5cGUpOwotCQkvLwkJLy8gYnV0IHN0aWxsIG5lZWQgdG8gY2xlYXIgdGhlIHBhZ2UgZGlyZWN0aXZlIHdhdGNoZXJzLCBhbmQgbGV0Ci0JCS8vIHRoZW0KLQkJLy8gYmUKLQkJLy8gcmVkaXNjb3ZlcmVkICh3aXRoIG5ldywgYWNjdXJhdGUgbm9kZSBhcyB0YXJnZXQpCi0JCS8vCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5jbGVhclBhZ2VXYXRjaGVycygpOwotCQlpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQl9Ci0JCS8vIGFkZGluZyBsYW5ndWFnZSBoZXJlLCBpbiB0aGlzIGNvbnZpZW5lbnQgY2VudHJhbAotCQkvLyBsb2NhdGlvbiwgYnV0IHNvbWUgb2J2aW91cyByZW5hbWluZyBvciByZWZhY3RvcmluZwotCQkvLyB3b3VsZG4ndCBodXJ0LCBpbiBmdXR1cmUuCi0JCS8vIEkgbmVlZGVkIHRvIGFkZCB0aGlzIGxhbmd1YWdlIHNldHRpbmcgZm9yIEpTUCBGcmFnbWVudCBzdXBwb3J0Ci0JCS8vIE5vdGU6IHRoaXMgaXMgdGhlIG9uZSB0aGF0IGNvdW50cywgc2luY2UgYXQgdGhpcyBwb2ludCwKLQkJLy8gdGhlIG1vZGVsIGhhcyBhbiBJRCwgc28gd2UgY2FuIGxvb2sgdXAgSUZpbGUsIGV0Yy4KLQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobW9kZWwpOwotCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobmV3TW9kZWwgaW5zdGFuY2VvZiBYTUxNb2RlbCkgewotCQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSAoKFhNTE1vZGVsKSBuZXdNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG5ld01vZGVsKTsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA5MWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuUGFnZURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50cHJvcGVydGllcy5Db250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFkYXB0cyBkb2N1bWVudCAKLSAqIHdpdGggdGhlIGFuIGluc3RhbmNlIG9mIFBhZ2VEaXJlY3RpdmVBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQWRhcHRlckZhY3RvcnkgewotCi0KLQlwcml2YXRlIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeS4KLQkgKiBOb3RlOiBpdHMgaW1wb3J0YW50IG5vdCB0byBiZSBhIHNpbmdsZXRvbiwgc2luY2UKLQkgKiB0aGlzIGZhY3RvcnkgbmVlZHMgdG8gdHJhY2sgaXRzIGFkYXB0ZXIocykgYW5kIHJlbGVhc2UKLQkgKiB0aGVtIHdoZW4gdGhleSBhcmUgcmVsZWFzZWQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqLwotCXByb3RlY3RlZCBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbm8gYXJndW1lbnQgY29uc3RydWN0b3IgYXNzdW1lcyBpdHMgYSAKLQkgKiBGYWN0b3J5IGZvciBQYWdlRGlyZWN0aXZlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXRoaXMoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgWE1MTm9kZSkgewotCQkJWE1MTm9kZSBub2RlID0gKFhNTE5vZGUpIHRhcmdldDsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0QWRhcHRlckluc3RhbmNlKHRhcmdldCk7Ci0JCQkJQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5nZXRTdWJqZWN0KCkuYWRkTGlzdGVuZXIocmVzdWx0KTsKLQotCQkJfQotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAocGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmdldFN1YmplY3QoKS5yZW1vdmVMaXN0ZW5lcihwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdlIGFzc3VtZSB0aGlzIGlzIG9ubHkgY2FsbGVkIGZvciAnZG9jdW1lbnQnIHRhcmdldAotCSAqLwotCXByb3RlY3RlZCBQYWdlRGlyZWN0aXZlQWRhcHRlciBnZXRBZGFwdGVySW5zdGFuY2UoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJLy8gaWYgb3VyIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQKLQkJLy8gdGFyZ2V0LCB0aGVuLCBzb21laG93LCB0aGUgZG9jdW1lbnQgbm9kZSBtdXN0IAotCQkvLyBoYXZlIGNoYW5nZWQgZm9yIGEgbW9kZWwsIHNvIHdlIHNob3VsZCByZWxlYXNlIAotCQkvLyBvbGQgYWRhcHRlciBhbmQgY3JlYXRlIG5ldyBvbmUgZm9yIG5ldyBkb2N1bWVudCAKLQkJLy8gbm9kZS4gVGhpcyBpcyBwcm9iYWJseSBhIHByb2dyYW1taW5nIGVycm9yLgotCQlpZiAocGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlpZiAodGFyZ2V0ICE9IHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UuZ2V0VGFyZ2V0KCkpIHsKLQkJCQlyZWxlYXNlKCk7Ci0JCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSA9IG5ldyBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwodGFyZ2V0KTsKLQkJCX0KLQkJCS8vIGVsc2UgcmV0dXJuIHRoZSBvbmUgd2UgaGF2ZQotCQl9Ci0JCWVsc2UgewotCQkJLy8gaWYgaXMgZXF1YWwgdG8gbnVsbCwgY3JlYXRlIGEgbmV3IG9uZQotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSA9IG5ldyBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwodGFyZ2V0KTsKLQkJfQotCQlBc3NlcnQuaXNOb3ROdWxsKHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UpOwotCQlyZXR1cm4gcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQotCQlyZXR1cm4gbmV3IFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeSh0aGlzLmFkYXB0ZXJLZXksIHRoaXMuc2hvdWxkUmVnaXN0ZXJBZGFwdGVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OGU4ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuUGFnZURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVN0YXRlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFzIHRoZSByZXNwb25zaWJpbGl0eSB0byBwcm92aWRlIAotICogYW4gZW1iZWRkZWQgZmFjdG9yeSByZWdpc3RyeSBmb3IgSlNQIEF3YXJlIElOb2RlQWRhcHRlciBGYWN0b3JpZXMKLSAqIHRvIHVzZS4gCi0gKiAKLSAqIFR5cGljYWxseSwgdGhlIGVtYmVkZGVkIHR5cGUgaXMgdG8gYmUgY29uc2lkZXJlZCBhIGZlYXR1cmUgb2YgCi0gKiB0aGUgZG9jdW1lbnQsIHNvIEpTUCBBd2FyZSBBZHBhdGVyRmFjdG9yaWVzIHNob3VsZCBjYWxsCi0gKiBnZXRBZGFwdGVyKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKSBkaXJlY3RveSBvbiB0aGUgZG9jdW1lbnQKLSAqIChvciBvd25pbmcgZG9jdW1lbnQpIG5vZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwgaW1wbGVtZW50cyBQYWdlRGlyZWN0aXZlQWRhcHRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJfQ0hBUlNFVCA9ICJjaGFyc2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIE9iamVjdCBhZGFwdGVyVHlwZSA9IFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzOwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbDsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTID0gbmV3IFN0cmluZ1tdeyJqYXZhc2NyaXB0IiwgImphdmFzY3JpcHQxLjAiLCAiamF2YXNjcmlwdDEuMV8zIiwgImphdmFzY3JpcHQxLjIiLCAiamF2YXNjcmlwdDEuMyIsICJqYXZhc2NyaXB0MS40IiwgImphdmFzY3JpcHQxLjUiLCAiamF2YXNjcmlwdDEuNiIsICJqc2NyaXB0IiwgInNhc2hzY3JpcHQifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy0xMCQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gSkFWQV9MQU5HVUFHRV9LRVlTID0gbmV3IFN0cmluZ1tdeyJqYXZhIn07IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuCi0JICovCi0JcHVibGljIFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbChJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlzdXBlcigpOwotCQlub3RpZmllckF0Q3JlYXRpb24gPSB0YXJnZXQ7Ci0JCS8vIHdlIG5lZWQgdG8gcmVtZW1iZXIgb3VyIGluc3RhbmNlIG9mIG1vZGVsLCAKLQkJLy8gaW4gY2FzZSB3ZSBuZWVkIHRvICJzaWduYWwiIGEgcmUtaW5pdCBuZWVkZWQuCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBYTUxOb2RlKSB7Ci0JCQlYTUxOb2RlIG5vZGUgPSAoWE1MTm9kZSkgdGFyZ2V0OwotCQkJbW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHBhcnNlcyB0aGUgZnVsbCBjb250ZW50VHlwZSB2YWx1ZSBpbnRvIGl0cyB0d28gcGFydHMKLQkgKiB0aGUgY29udGVudFR5cGUsIGFuZCB0aGUgY2hhcnNldCwgaWYgcHJlc2VudC4gTm90ZTogdGhpcyAKLQkgKiBtZXRob2QgaXMgYSBsaWdodGx5IG1vZGlmaWVkIHZlcnNpb24gb2YgYSBtZXRob2QgaW4gQWJzdHJhY3RIZWFkUGFyc2VyLgotCSAqIFRoZXJlLCB3ZSdyZSBtb3N0bHkgaW50ZXJlc3RlZCBpbiB0aGUgY2hhcnNldCBwYXJ0IG9mIGNvbnRlbnRUeXBlVmFsdWUuIAotCSAqIEhlcmUsIHdlJ3JlIG1vc3RseSBpbnRlcmVzdGVkIGluIHRoZSBtaW1lVHlwZSBwYXJ0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE1pbWVUeXBlRnJvbUNvbnRlbnRUeXBlVmFsdWUoU3RyaW5nIGNvbnRlbnRUeXBlVmFsdWUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgY2xlYW5Db250ZW50VHlwZVZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBOb25MZXR0ZXJEaWdpdHMoY29udGVudFR5cGVWYWx1ZSk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsZWFuQ29udGVudFR5cGVWYWx1ZSwgIjs9IFx0XG5cclxmIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHRMZW4gPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJLy8gaWYgY29udGFpbnMgZW5jb2Rpbmcgc2hvdWxkIGhhdmUgdGhyZWUgdG9rZW5zLCB0aGUgbWltZXR5cGUsIHRoZSB3b3JkICdjaGFyc2V0JywgYW5kIHRoZSBlbmNvZGluZyB2YWx1ZQotCQlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3RMZW5dOwotCQlpbnQgaiA9IDA7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQl0b2tlbnNbal0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlqKys7Ci0JCX0KLQkJLy8gCi0JCS8vIEZvbGxvd2luZyBpcyB0aGUgY29tbW9uIGZvcm0gZm9yIHRhcmdldCBleHByZXNzaW9uCQkKLQkJLy8gPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotCQkvLyBCdXQgYXBwYXJyZW50bHkgaXMgYWxzbyB2YWxpZCB3aXRob3V0IHRoZSBjb250ZW50IHR5cGUgdGhlcmUsIAotCQkvLyBqdXN0IHRoZSBjaGFyc2V0LCBhcyBmb2xsb3dzOgotCQkvLyA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9ImNoYXJzZXQ9VVRGLTgiPgotCQkvLyBTbyB3ZSdsbCBsb29wIHRocm91Z2ggdG9rZW5zIGFuZCBrZXkgb2ZmIG9mICdjaGFyc2V0JwotCi0JCWludCBjaGFyc2V0UG9zID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmVxdWFsc0lnbm9yZUNhc2UoU1RSX0NIQVJTRVQpKSB7Ci0JCQkJY2hhcnNldFBvcyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy9TdHJpbmcgY2hhcnNldCA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0JCWlmIChjaGFyc2V0UG9zID4gLTEpIHsKLQkJCS8vIGNhc2Ugd2hlcmUgY2hhcnNldCB3YXMgcHJlc2VudAotCQkJLy8JCQlpbnQgY2hhcnNldFZhbHVlUG9zID0gY2hhcnNldFBvcyArIDE7Ci0JCQkvLwkJCWlmIChjaGFyc2V0VmFsdWVQb3MgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkvLwkJCQljaGFyc2V0ID0gdG9rZW5zW2NoYXJzZXRWYWx1ZVBvc107Ci0JCQkvLwkJCX0KLQkJCWludCBjb250ZW50VHlwZVZhbHVlUG9zID0gY2hhcnNldFBvcyAtIDE7Ci0JCQlpZiAoY29udGVudFR5cGVWYWx1ZVBvcyA+IC0xKSB7Ci0JCQkJY29udGVudFR5cGUgPSB0b2tlbnNbY29udGVudFR5cGVWYWx1ZVBvc107Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBjaGFyc2V0IHdhcyBub3QgcHJlc2VudCwgc28gaWYgdGhlcmUncyAKLQkJCS8vIGEgdmFsdWUsIHdlIGFzc3VtZSBpdHMgdGhlIGNvbnRlbnRUeXBlIHZhbHVlCi0JCQlpZiAodG9rZW5zLmxlbmd0aCA+IDApIHsKLQkJCQljb250ZW50VHlwZSA9IHRva2Vuc1swXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudFR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZUhhbmRsZXI7Ci0JcHJpdmF0ZSBMaXN0IGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgU3RyaW5nIGNhY2hlZExhbmd1YWdlOwotCXByaXZhdGUgU3RyaW5nIGNhY2hlZENvbnRlbnRUeXBlOwotCXByaXZhdGUgSU5vZGVOb3RpZmllciBub3RpZmllckF0Q3JlYXRpb247Ci0KLQlwcml2YXRlIGludCBmaXJzdExhbmd1YWdlUG9zaXRpb24gPSAtMTsKLQlwcml2YXRlIGludCBmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24gPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiByZWluaXRpYWxpemluZzsKLQotCS8qCi0JICogQHNlZSBJTm9kZUFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gYWRhcHRlclR5cGUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTm9kZUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyLCBpbnQsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbWJlZGRlZFR5cGUoRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyKSB7Ci0JCS8vIGlmIHJlYWxseSB0aGUgc2FtZSBoYW5kbGVyLCBubyBuZWVkIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcKLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgPT0gaGFuZGxlcikgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIHRoZW4gb25lIGV4aXN0cywgYW5kIHRoZSBuZXcgb25lIGlzIHRydWVseSBkaWZmZXJlbnQsIHNvIHdlIG5lZWQgdG8gCi0JCS8vIHJlbGVhc2UgYW5kIHJlbW92ZSBjdXJyZW50IGZhY3RvcmllcwotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBsaXN0ID0gZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChsaXN0Lmhhc05leHQoKSkgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoQWRhcHRlckZhY3RvcnkpIGxpc3QubmV4dCgpOwotCQkJCWZhY3RvcnkucmVsZWFzZSgpOwotCQkJfQotCi0JCQllbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5jbGVhcigpOwotCQl9Ci0KLQkJZW1iZWRkZWRUeXBlSGFuZGxlciA9IGhhbmRsZXI7Ci0JCS8vIHdoZW4gdGhlIGhhbmRsZXIgaXMgc2V0LCAidHJhbnNmZXIiIGl0cyBmYWN0b3JpZXMgdG8gb3VyIG93biBsaXN0LgotCQkvLyBub3RlOiBvdXIgb3duIGxpc3QgbWF5IGFsc28gYmUgYWRkZWQgdG8gZWxzZSB3aGVyZSwgc3VjaCBhcyBvbgotCQkvLyAiZWRpdG9yIHNpZGUiLgotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGVtYmVkZGVkVHlwZUhhbmRsZXIuZ2V0QWRhcHRlckZhY3RvcmllcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5LmFkZChmYWN0b3J5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUGFnZURpcmVjdGl2ZUFkYXB0ZXIjYWRhcHQoSU5vZGVOb3RpZmllciwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJSU5vZGVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIGVtYmVkZGVkQ29udGVudFR5cGUgaGFzbid0IGJlZW4gc2V0LCAKLQkJLy8gdGhlbiB3ZSBjYW4gbm90IGFkYXB0IGl0LgotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlpZiAoZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuaXRlcmF0b3IoKTsKLQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCWZhY3RvcnkgPSAoQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJCQkJcmVzdWx0ID0gZmFjdG9yeS5hZGFwdChub3RpZmllcik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBQYWdlRGlyZWN0aXZlQWRhcHRlciNnZXRFbWJlZGRlZFR5cGUoKQotCSAqLwotCXB1YmxpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkVHlwZSgpIHsKLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgPT0gbnVsbCkgewotCQkJZW1iZWRkZWRUeXBlSGFuZGxlciA9IGdldERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZW1iZWRkZWRUeXBlSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbWJlZGRlZEZhY3RvcnkoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQkvLyBzaG91bGQgd2UgY2hlY2sgaWYgYWxyZWFkeSBleGlzdHMgaW4gbGlzdD8KLQkJZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuYWRkKGZhY3RvcnkpOwotCX0KLQotCS8vCS8qKgotCS8vCSAqIFVzZWQgYnkgUGFnZURpcmVjdGl2ZVdhdGNoZXJzIHRvIHNpZ25hbCB0aGF0IHNvbWUgaW1wb3J0YW50IGF0dHJpYnV0ZSBoYXMgY2hhbmdlZCwgYW5kIAotCS8vCSAqIGFueSBjYWNoZWQgdmFsdWVzIHNob3VsZCBiZSByZS1jYWxjdWF0ZWQKLQkvLwkgKi8KLQkvLwl2b2lkIGNoYW5nZWQoKSB7Ci0JLy8JCS8vIHdlIHdvbid0IGFjdHVhbGx5IGNoZWNrIGlmIGNoYW5nZSBpcyBuZWVkZWQsIGlmIHRoZSBtb2RlbCBzdGF0ZSBpcyBhbHJlYWR5IGNoYW5naW5nLgotCS8vCQlpZiAoIW1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JLy8JCQkvLyBnbyB0aHJvdWdoIG91ciBsaXN0IG9mIHBhZ2Ugd2F0Y2hlciBhZGFwdGVycywgYW5kIHVwZGF0ZXMgdGhlIGF0dHJpYnV0ZXMgCi0JLy8JCQkvLyB3ZSdyZSBpbnRlcmVzdGVkIGluLCBpZiBhbmQgb25seSBpZiB0aGV5IGFyZSB0aGUgZWFybGllc3Qgb2NjdXJhbmNlIGluIHRoZSByZXNvdXJjZQotCS8vCQkJU3RyaW5nIHBvdGVudGlhbENvbnRlbnRUeXBlID0gbnVsbDsKLQkvLwkJCVN0cmluZyBwb3RlbnRpYWxMYW5ndWFnZSA9IG51bGw7Ci0JLy8JCQlpbnQgY29udGVudFR5cGVQb3NpdGlvbiA9IC0xOwotCS8vCQkJaW50IGxhbmd1YWdlUG9zaXRpb24gPSAtMTsKLQkvLwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFnZURpcmVjdGl2ZVdhdGNoZXJzLml0ZXJhdG9yKCk7Ci0JLy8JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JLy8JCQkJUGFnZURpcmVjdGl2ZVdhdGNoZXIgcGRXYXRjaGVyID0gKFBhZ2VEaXJlY3RpdmVXYXRjaGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JLy8JCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gcGRXYXRjaGVyLmdldENvbnRlbnRUeXBlKCk7Ci0JLy8JCQkJU3RyaW5nIGxhbmd1YWdlID0gcGRXYXRjaGVyLmdldExhbmd1YWdlKCk7Ci0JLy8JCQkJaW50IG9mZnNldCA9IHBkV2F0Y2hlci5nZXRPZmZzZXQoKTsKLQkvLwkJCQlpZiAocG90ZW50aWFsQ29udGVudFR5cGUgPT0gbnVsbCB8fCAoaGFzVmFsdWUoY29udGVudFR5cGUpICYmIChvZmZzZXQgPCBjb250ZW50VHlwZVBvc2l0aW9uKSkpIHsKLQkvLwkJCQkJcG90ZW50aWFsQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKLQkvLwkJCQkJY29udGVudFR5cGVQb3NpdGlvbiA9IG9mZnNldDsKLQkvLwkJCQl9Ci0JLy8JCQl9Ci0JLy8JCQkvLyBub3cgd2UgaGF2ZSB0aGUgYmVzdCBjYW5kaWF0ZXMgZm9yIGNhY2hlZCB2YWx1ZXMsIGxldCdzIHNlZSBpZiB0aGV5J3ZlIHJlYWxseSBjaGFuZ2VkIGZyb20gCi0JLy8JCQkvLyB3aGF0IHdlIGhhZC4gSWYgc28sIG5vdGUgd2UgZ28gdGhyb3VnaCB0aGUgc2V0dGVycyBzbyBzaWRlIGVmZmVjdHMgY2FuIHRha2UgcGxhY2UgdGhlcmUuCi0JLy8JCQlwb3RlbnRpYWxDb250ZW50VHlwZSA9IGdldE1pbWVUeXBlRnJvbUNvbnRlbnRUeXBlVmFsdWUocG90ZW50aWFsQ29udGVudFR5cGUpOwotCS8vCQkJaWYgKHBvdGVudGlhbENvbnRlbnRUeXBlID09IG51bGwgfHwgcG90ZW50aWFsQ29udGVudFR5cGUubGVuZ3RoKCkgPT0gMCkgewotCS8vCQkJCS8vcG90ZW50aWFsQ29udGVudFR5cGUgPSBnZXREZWZhdWx0Q29udGVudFR5cGUoKTsKLQkvLwkJCX0gZWxzZSB7Ci0JLy8JCQkJc2V0Q2FjaGVkQ29udGVudFR5cGUocG90ZW50aWFsQ29udGVudFR5cGUpOwotCS8vCQkJfQotCS8vCi0JLy8JCQlpZiAocG90ZW50aWFsTGFuZ3VhZ2UgIT0gbnVsbCAmJiBoYXNWYWx1ZShwb3RlbnRpYWxMYW5ndWFnZSkpIHsKLQkvLwkJCQlzZXRDYWNoZWRMYW5ndWFnZShwb3RlbnRpYWxMYW5ndWFnZSk7Ci0JLy8JCQl9Ci0JLy8JCX0KLQkvLwl9Ci0Jdm9pZCBjaGFuZ2VkQ29udGVudFR5cGUoaW50IGVsZW1lbnRPZmZzZXQsIFN0cmluZyBuZXdWYWx1ZSkgewotCQkvLyBvbmx5IG5lZWQgdG8gcHJvY2VzcyBpZiB0aGlzIG5ldyB2YWx1ZSBpcyAKLQkJLy8gZWFybGllciBpbiB0aGUgZmlsZSB0aGFuIG91ciBjdXJyZW50IHZhbHVlCi0JCWlmIChmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24gPT0gLTEgfHwgZWxlbWVudE9mZnNldCA8PSBmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24pIHsKLQkJCS8vIGR3X1RPRE86IHVwZGF0ZSBlbWJlZGRlZCBwYXJ0aXRpb25lciBpbiBKU1AgZG9jdW1lbnQgcGFydGl0aW9uZXIKLQkJCS8vIG5zZF9UT0RPOiB1cGRhdGUgZW1iZWRkZWQgcGFydGl0aW9uZXIgaW4gSlNQIGRvY3VtZW50IHBhcnRpdGlvbmVyCi0KLQkJCS8vIG5vIG5lZWQgdG8gY2hhbmdlIGN1cnJlbnQgdmFsdWUsIGlmIHdlJ3JlIHRvbGQgc29tZSAKLQkJCS8vIGVhcmxpZXIgdmFsdWUgaXMgbnVsbCBvciBibGFuayAoc291bmRzIGxpa2UgYW4gZXJyb3IsIGFueXdheSkKLQkJCWlmIChoYXNWYWx1ZShuZXdWYWx1ZSkpIHsKLQkJCQlmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24gPSBlbGVtZW50T2Zmc2V0OwotCQkJCVN0cmluZyBwb3RlbnRpYWxDb250ZW50VHlwZSA9IGdldE1pbWVUeXBlRnJvbUNvbnRlbnRUeXBlVmFsdWUobmV3VmFsdWUpOwotCQkJCS8vIG9ubHkgZG8gdGhlIHNldCBwcm9jZXNzaW5nIGlmIGRpZmZlcmVudAotCQkJCS8vIGZyb20gd2hhdCBpdCBhbHJlYWR5IGlzCi0JCQkJLy8JaWYgKCFwb3RlbnRpYWxDb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKGNhY2hlZExhbmd1YWdlKSkgewotCQkJCXNldENhY2hlZENvbnRlbnRUeXBlKHBvdGVudGlhbENvbnRlbnRUeXBlKTsKLQkJCQkvLwl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IFBhZ2VEaXJlY3RpdmVXYXRjaGVycyB0byBzaWduYWwgdGhhdCBzb21lIGltcG9ydGFudCBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQsIGFuZCAKLQkgKiBhbnkgY2FjaGVkIHZhbHVlcyBzaG91bGQgYmUgcmUtY2FsY3VhdGVkCi0JICovCi0Jdm9pZCBjaGFuZ2VkTGFuZ3VhZ2UoaW50IGVsZW1lbnRPZmZzZXQsIFN0cmluZyBuZXdWYWx1ZSkgewotCQkvLyBvbmx5IG5lZWQgdG8gcHJvY2VzcyBpZiB0aGlzIG5ldyB2YWx1ZSBpcyAKLQkJLy8gZWFybGllciBpbiB0aGUgZmlsZSB0aGFuIG91ciBjdXJyZW50IHZhbHVlCi0JCS8vIGhhcyB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8sIGluIGNhc2Ugb3VyIHByZXZpb3VzIGVhcmxpZXN0IG9uZSwgCi0JCS8vIGlzIGl0c2VsZiBjaGFuZ2luZyEKLQkJaWYgKGZpcnN0TGFuZ3VhZ2VQb3NpdGlvbiA9PSAtMSB8fCBlbGVtZW50T2Zmc2V0IDw9IGZpcnN0TGFuZ3VhZ2VQb3NpdGlvbikgewotCi0JCQkvLyBubyBuZWVkIHRvIGNoYW5nZSBjdXJyZW50IHZhbHVlLCBpZiB3ZSdyZSB0b2xkIHNvbWUgCi0JCQkvLyBlYXJsaWVyIHZhbHVlIGlzIG51bGwgb3IgYmxhbmsgKHNvdW5kcyBsaWtlIGFuIGVycm9yLCBhbnl3YXkpCi0JCQlpZiAoaGFzVmFsdWUobmV3VmFsdWUpKSB7Ci0JCQkJZmlyc3RMYW5ndWFnZVBvc2l0aW9uID0gZWxlbWVudE9mZnNldDsKLQkJCQkvLyBvbmx5IGRvIHRoZSBzZXQgcHJvY2Vzc2luZyBpZiBkaWZmZXJlbnQKLQkJCQkvLyBmcm9tIHdoYXQgaXQgYWxyZWFkeSBpcwotCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzSWdub3JlQ2FzZShjYWNoZWRMYW5ndWFnZSkpIHsKLQkJCQkJc2V0Q2FjaGVkTGFuZ3VhZ2UobmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZHdfVE9ETzogc2V0IGxhbmd1YWdlIGluIGRvY3VtZW50IHBhcnRpdGlvbmVyCi0JCQkvLyBuc2RfVE9ETzogc2V0IGxhbmd1YWdlIGluIGRvY3VtZW50IHBhcnRpdGlvbmVyCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IFBhZ2VEaXJlY3RpdmVXYXRjaGVycyB0byBzaWduYWwgdGhhdCBzb21lIGltcG9ydGFudCBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQsIGFuZCAKLQkgKiBhbnkgY2FjaGVkIHZhbHVlcyBzaG91bGQgYmUgcmUtY2FsY3VhdGVkCi0JICovCi0Jdm9pZCBjaGFuZ2VkUGFnZUVuY29kaW5nKGludCBlbGVtZW50T2Zmc2V0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQotCQkvLyB3ZSBkb24ndCBjdXJyZW50bHkgdHJhY2sgYWN0aXZlIHZhbHVlLCBzaW5jZQotCQkvLyBqdXN0IG5lZWQgZHVyaW5nIHJlYWQgYW5kIHdyaXRlICh3aGVyZSBpdHMgCi0JCS8vIGNhbGN1bGF0ZWQuIFdlIHdpbGwgbmVlZCBpbiBmdXR1cmUsIHRvIAotCQkvLyBhY3VyYXRlbHkgY2xvbmUgYSBtb2RlbCBhbmQgdG8gZGlzcGxheSAKLQkJLy8gImN1cnJlbnQgZW5jb2RpbmciIHRvIHVzZXIgaW4gc3RhdHVzIGJhci4KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaGFzVmFsdWUuCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc1ZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhY2hlZENvbnRlbnRUeXBlLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGNhY2hlZENvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNhY2hlZENvbnRlbnRUeXBlID0gZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0Q29udGVudFR5cGUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiAidGV4dC9odG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhY2hlZExhbmd1YWdlLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLQkJaWYgKGNhY2hlZExhbmd1YWdlID09IG51bGwpCi0JCQljYWNoZWRMYW5ndWFnZSA9IGdldERlZmF1bHRMYW5ndWFnZSgpOwotCQlyZXR1cm4gY2FjaGVkTGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldERlZmF1bHRMYW5ndWFnZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRMYW5ndWFnZSgpIHsKLQkJcmV0dXJuICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNhY2hlZENvbnRlbnRUeXBlLgotCSAqIEBwYXJhbSBjYWNoZWRDb250ZW50VHlwZSBUaGUgY2FjaGVkQ29udGVudFR5cGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVkQ29udGVudFR5cGUoU3RyaW5nIG5ld0NvbnRlbnRUeXBlKSB7Ci0JCS8vIGlmIHRoZSBwYXNzZWQgaW4gdmFsdWUgaXMgdGhlIHNhbWUgYXMgZXhpc3RpbmcsIHRoZXJlJ3Mgbm90aGluZyB0byBkby4KLQkJLy8gaWYgaXRzIGRpZmZlcmVudCwgdGhlbiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgY29udGVudEhhbmRsZXIgYXMgd2VsbAotCQkvLyBhbmQsIG1vcmUgdG8gdGhlIHBvaW50LCBzaWduYWwgYSByZS1pbml0aWFsaXp0YXRpb24gaXMgbmVlZGVkLgotCQkvLyBOb3RlOiBpZiB0aGUgdmFsdWUgd2UncmUgZ2V0dGluZyBzZXQgdG8gZG9lcyBub3QgaGF2ZSBhIGhhbmRsZXIgaW4gdGhlIHJlZ2lzdHJ5LCAKLQkJLy8gd2UnbGwgYWN0dWFsbHkgbm90IHNldCBpdCB0byBudWxsIG9yIGFueXRoaW5nLCB3ZSdsbCBqdXN0IGNvbnRpbnVlIG9uIHdpdGggdGhlIG9uZQotCQkvLyB3ZSBoYXZlLiBUaGlzIGlzIHByZXR0eSBpbXBvcnRhbnQgdG8gYXZvaWQgcmUtaW5pdGlhbGl6aW5nIG9uIGV2ZXJ5IGtleSBzdHJva2UgaWYgc29tZW9uZSAKLQkJLy8gaXMgdHlwaW5nIGluIGEgbmV3IGNvbnRlbnQgdHlwZSwgYnV0IGhhdmVuJ3QgeWV0IGZpbmlzaGVkIHRoZSB3aG9sZSAid29yZCIuCi0JCS8vIEhvd2V2ZXIsIGlmIGFuIGNvbnRlbnRUeXBlIGlzIG5vdCByZWNvZ25pemVkLCB0aGUgcmVnaXN0cnkgcmV0dXJucyB0aGUgb25lIAotCQkvLyBmb3IgWE1MLgotCQkvLwkJaWYgKHRoaXMuY2FjaGVkQ29udGVudFR5cGUgIT0gbnVsbCAmJiB0aGlzLmNhY2hlZENvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UobmV3Q29udGVudFR5cGUpKSB7IC8vIHRoZW4gZG8gbm90aGluZwotCQkvLwkJfSBlbHNlIHsKLQkJdGhpcy5jYWNoZWRDb250ZW50VHlwZSA9IG5ld0NvbnRlbnRUeXBlOwotCQkvLyBzZWUgaWYgd2UgY2FuIHVwZGF0ZSBlbWJlZGRlZCBoYW5kbGVyCi0JCS8vCQlpZiAodGhpcy5jYWNoZWRDb250ZW50VHlwZSA9PSBudWxsIHx8IHRoaXMuY2FjaGVkQ29udGVudFR5cGUubGVuZ3RoKCkgPT0gMCkgeyAvLyBkbyBub3RoaW5nLCBkb24ndCBjYW4ndCBnZXQgYSBuZXcgaGFuZGxlciwgc28gd2UnbGwga2VlcCB3aGF0IHdlIGhhdmUKLQkJLy8JCX0gZWxzZSB7Ci0KLQkJLy8gZ2V0SGFuZGxlciBzaG91bGQgYWx3YXlzIHJldHVybiBzb21ldGhpbmcgKG5ldmVyIG51bGwpLCBiYXNlZCAKLQkJLy8gb24gdGhlIHJ1bGVzIGluIHRoZSBmYWN0b3J5LiAKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyID0gZ2V0SGFuZGxlckZvcih0aGlzLmNhY2hlZENvbnRlbnRUeXBlKTsKLQkJLy8gd2UgZG8gdGhpcyBjaGVjayBmb3IgcmUtaW5pdCBoZXJlLCBpbnN0ZWFkIG9mIGluIHNldEVtYmVkZGVkVHlwZSwgCi0JCS8vIHNpbmNlIHNldEVtYmVkZGVkVHlwZSBpcyBjYWxsZWQgZHVyaW5nIHRoZSBub3JtYWwgaW5pdGlhbGl6dGlvbiAKLQkJLy8gcHJvY2Vzcywgd2hlbiByZS1pbml0IGlzIG5vdCBuZWVkZWQgKHNpbmNlIHRoZXJlIGlzIG5vIGNvbnRlbnQpCi0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyICE9IG51bGwgJiYgaGFuZGxlciAhPSBudWxsICYmIGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gaGFuZGxlcikgewotCQkJLy8gY2hhbmdpbmcgdGhpcyBlbWJlZGRlZCBoYW5kbGVyIGhlcmUgbWF5IAotCQkJLy8gYmUgaW4gdGhlIG1pZGRsZSBvZiBhbm90aWZ5IGxvb3AsIG5vdCBzdXJlCi0JCQkvLyBpZiB0aGF0J2xsIGNhdXNlIHByb2JsZW1zLgotCQkJc2V0RW1iZWRkZWRUeXBlKGhhbmRsZXIpOwotCQkJbW9kZWxSZWluaXROZWVkZWQoZW1iZWRkZWRUeXBlSGFuZGxlciwgaGFuZGxlcik7Ci0JCX0KLQkJLy8JCX0KLQotCQkvLwkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZS1pbml0IGJhc2VkIG9uIGVtYmVkZGVkVHlwZUhhbmRsZXIKLQkgKiBjaGFuZ2luZy4gSXQgaXMgZ2l2ZW4gcHJpb3JpdHkgb3ZlciB0aGUgbGFuZ3VhZ2UgY2hhbmdlLCBzaW5jZQotCSAqIHRoZXJlIGl0cyBtb3JlIGltcG9ydGFudCB0byBoYXZlIG9sZCBhbmQgbmV3IGhhbmRsZXJzJ3MgaW4gdGhlIAotCSAqIHN0YXRlRGF0YSBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbW9kZWxSZWluaXROZWVkZWQoRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0hhbmRsZXIpIHsKLQkJaWYgKG1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImFscmVhZHkgYmVpbmcgaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJbW9kZWwuc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKG5ldyBFbWJlZGRlZFR5cGVTdGF0ZURhdGEob2xkSGFuZGxlciwgbmV3SGFuZGxlcikpOwotCQkJbW9kZWwuc2V0UmVpbml0aWFsaXplTmVlZGVkKHRydWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgbW9kZWxSZWluaXROZWVkZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vZGVsUmVpbml0TmVlZGVkKFN0cmluZyBvbGRsYW5ndWFnZSwgU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCS8vIGJpdCBvZiBhIHNob3J0IGN1dCBmb3Igbm93IC4uLi4gd2UgZG9udCcgbmVlZCBsYW5ndWFnZSBhdCB0aGUgbW9tZW50LCAKLQkJLy8gYnV0IHNob3VsZCBzZXQgdGhlIHN0YXRlIGRhdGEKLQkJaWYgKG1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJhbHJlYWR5IGJlaW5nIGluaXRpYWxpemVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJLy8gaWYgYWxyZWFkeSBiZWluZyByZS1pbml0aWFsaXplZCwgd2UgZG9uJ3Qgd2FudCB0byAKLQkJCQkvLyByZXNldCB0aGUgZGF0YSBpbiB0aGUgc3RhdGVEYXRhIGZpZWxkLgotCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCW1vZGVsLnNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShuZXdMYW5ndWFnZSk7Ci0JCQkJbW9kZWwuc2V0UmVpbml0aWFsaXplTmVlZGVkKHRydWUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWRMYW5ndWFnZShTdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJaWYgKGNhY2hlZExhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2VTdGF0ZUNoYW5nZWQoY2FjaGVkTGFuZ3VhZ2UsIG5ld0xhbmd1YWdlKSkgeyAvLyBhIGNvbXBsZXRlIHJlLWluaXQgb3ZlcmtpbGwgaW4gY3VycmVudCBzeXN0ZW0sIHNpbmNlIHJlYWxseSBqdXN0IG5lZWQgZm9yIAotCQkJLy8gdGhlIGxpbmUgc3R5bGUgcHJvdmlkZXJzLCAKLQkJCS8vIEJVVCwgYSBjaGFuZ2UgaW4gbGFuZ3VhZ2UgY291bGQgZWZmZWN0IG90aGVyIHRoaW5ncywgCi0JCQkvLyBhbmQgd2UgZG9uJ3QgZXhwZWN0IHRvIGhhcHBlbiBvZnRlbiBzbyBhIGxpdHRsZSBvdmVya2lsbCBpc24ndCB0b28gYmFkLgotCQkJLy8gVGhlIGRlZXAgcHJvYmxlbSBpcyB0aGF0IHRoZXJlIGlzIG5vIHdheSB0byBnZXQgYXQgdGhlICJlZGl0IHNpZGUiIGFkcGFwdGVycwotCQkJLy8gc3BlY2lmaWNhbGx5IGhlcmUgaW4gbW9kZWwgY2xhc3MuCi0JCQkvLyB3ZSBoYXZlIHRvIGRvIHRoZSBtb2RlbCBjaGFuZ2VkIHNlcXVlbmNlIHRvIGdldCB0aGUgCi0JCQkvLyBzY3JlZW4gdG8gdXBkYXRlLgotCQkJLy8gZG8gbm90IHNpZ25hbCBhZ2FpbiwgaWYgc2lnbmFsZWQgb25jZSAodGhlIHJlaW5pdCBzdGF0ZSBkYXRhIHdpbGwgYmUgd3JvbmcuCi0JCQkvLyAodGhpcyBuZWVkcyB0byBiZSBpbXByb3ZlZCBpbiBmdXR1cmUpCi0JCQlpZiAoIW1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JCQkJbW9kZWxSZWluaXROZWVkZWQoY2FjaGVkTGFuZ3VhZ2UsIG5ld0xhbmd1YWdlKTsKLQkJCX0KLQkJfQotCQlzZXRMYW5ndWFnZShuZXdMYW5ndWFnZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBwdWJsaWMgYWNjZXNzIG1ldGhvZCwgdXNlZCBlc3BlY2lhbGx5Ci0JICogZnJvbSBsb2FkZXIsIGZvciBKU1AgRnJhZ21lbnQgc3VwcG9ydC4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCXRoaXMuY2FjaGVkTGFuZ3VhZ2UgPSBuZXdMYW5ndWFnZTsKLQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSAoKElEb2N1bWVudEV4dGVuc2lvbjMpIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnQuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyk7Ci0JCWlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIHsKLQkJCSgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgcGFydGl0aW9uZXIpLnNldExhbmd1YWdlKG5ld0xhbmd1YWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBsYW5ndWFnZVN0YXRlQ2hhbmdlLgotCSAqIEBwYXJhbSBjYWNoZWRMYW5ndWFnZQotCSAqIEBwYXJhbSBuZXdMYW5ndWFnZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsYW5ndWFnZVN0YXRlQ2hhbmdlZChTdHJpbmcgY2FjaGVkTGFuZ3VhZ2UsIFN0cmluZyBuZXdMYW5ndWFnZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAvLyBsYW5ndWFnZXMgYXJlIGVxdWFsLCB0aGVuIG5vIGNoYW5nZSBpbiBzdGF0ZQotCQlpZiAoIWNhY2hlZExhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UobmV3TGFuZ3VhZ2UpKSB7Ci0JCQlib29sZWFuIG9sZExhbmd1YWdlS25vd24gPSBsYW5ndWFnZUtub3duKGNhY2hlZExhbmd1YWdlKTsKLQkJCWJvb2xlYW4gbmV3TGFuZ3VhZ2VLbm93biA9IGxhbmd1YWdlS25vd24obmV3TGFuZ3VhZ2UpOwotCQkJcmVzdWx0ID0gbmV3TGFuZ3VhZ2VLbm93biB8fCAoIW5ld0xhbmd1YWdlS25vd24gJiYgb2xkTGFuZ3VhZ2VLbm93bik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgbGFuZ3VhZ2VLbm93bi4KLQkgKiBAcGFyYW0gY2FjaGVkTGFuZ3VhZ2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbGFuZ3VhZ2VLbm93bihTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJcmV0dXJuIChTdHJpbmdVdGlscy5jb250YWlucyhKQVZBX0xBTkdVQUdFX0tFWVMsIGxhbmd1YWdlLCBmYWxzZSkgfHwgU3RyaW5nVXRpbHMuY29udGFpbnMoSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTLCBsYW5ndWFnZSwgZmFsc2UpKTsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRIYW5kbGVyRm9yKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlFbWJlZGRlZFR5cGVSZWdpc3RyeSByZWcgPSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKTsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJaWYgKHJlZyAhPSBudWxsKQotCQkJaGFuZGxlciA9IHJlZy5nZXRUeXBlRm9yKGNvbnRlbnRUeXBlKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5LgotCSAqIEByZXR1cm4gUmV0dXJucyBhIEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeQotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogRm9yIEpTUCBmaWxlcywgdGV4dC9odG1sIGlzIHRoZSBkZWZhdWx0IAotCSAqIGNvbnRlbnQgdHlwZS4gVGhpcyBtYXkgd2FudCB0aGlzIGRpZmZlcmVudCAKLQkgKiBmb3IgdHlwZXMgbGlrZSBqc3YgKGpzcCBmb3Igdm9pY2UgeG1sKQotCSAqIEZvciBub3csIGhhcmQgY29kZSB0byBuZXcgaW5zdGFuY2UuCi0JICogSW4gZnV0dXJlLCBzaG91bGQgZ2V0IGluc3RhbmNlIGZyb20gcmVnaXN0cnkuCi0JICogCi0JICogU3BlY2lmaWNhdGlvbiBjaXRlcyBIVE1MIGFzIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqLwotCXByb3RlY3RlZCBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRIYW5kbGVyRm9yKGdldERlZmF1bHRDb250ZW50VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb250ZW50U2V0dGluZ3NDaGFuZ2VkKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvLyBOb3RlOiB3ZSBjdXJyZW50bHkgZ2V0IG5vdGlmaWVkIG11bHRpcGxlIHRpbWVzLCAKLQkJLy8gSSBhc3N1bWUgc2luY2UgdGhlcmUncyBtdWxpdHBsZSBmaWVsZHMgaW4gdGhlIHByb3BlcnRpZXMuCi0JCS8vIEZvciBub3csIEknbGwgYXNzdW1lIHRoYXQgb25jZSB3ZSBnZXQgbm90aWZpZWQsIGFsbCB0aGUgCi0JCS8vIGZpZWxkcyBhcmUgYWNjdXJhdGUsIHNvIGlmIHdlJ3JlIHJlaW5pdGlhbGl6aW5nLCBkb24ndCAKLQkJLy8gY2hlY2sgYW55IGZ1cnRoZXIuIFRvIE5PVCBkbyB0aGlzIGNhdXNlcyBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgotCQkvLyBleGNlcHRpb25zLiBUbyBkbyBpdCwgbWF5IGNhdXNlIHVzIHRvIG1pc3Mgd2hlbiB1c2VyIGNoYW5nZXMKLQkJLy8gdHdvIGZpZWxkcyBhdCBvbmNlLiBXaWxsIG5lZWQgdG8gdGVzdC4gCi0JCWlmIChyZWluaXRpYWxpemluZykKLQkJCXJldHVybjsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKG1vZGVsKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JCS8vICAgICAgICBpZiAocmVzb3VyY2UuRklMRSA9PSByZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJLy8gICAgICAgIAlmaWxlbmFtZSA9IHJlc291cmNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJLy8gICAgICAgIH0KLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIXByb2plY3QuZXF1YWxzKHJlc291cmNlLmdldFByb2plY3QoKSkpCi0JCQlyZXR1cm47Ci0JCS8vIE5vdGU6IHRoZXNlIGNoYW5nZSBub3RpZmljYXRpb25zIGFwcGVhciB0byBiZSBjb21pbmcgCi0JCS8vIGluIGJhc2VkIG9uIGFueSBjaGFuZ2UgaW4gcHJvamVjdC4gSSdtIG5vdCBzdXJlIGhvdwotCQkvLyB0byB0ZWxsIGlmIHRoZXkgYXJlIGZvciBteSBwYXJ0aWN1bGFyIGZpbGUsIG9yIAotCQkvLyBpZiB0aGVyZSdzIHNvbWUgb3RoZXIgZXJyb3IgSSdtIG1ha2luZyBpbiBsaXN0ZW5lcnMuCi0JCS8vIHRoZSBzZXR0ZXJzIGJlbG93IHNob3VsZCBiZSBzbWFydCBlbm91Z2ggCi0JCS8vIHRvIGtub3cgaWYgYSBtZWFuaW5nZnVsIGNoYW5nZSBvY2N1cnJlZCwgb3IgCi0JCS8vIG5vdC4gTm90ZTogd2Ugc2VlbSB0byBnZXQgY2FsbGVkIGEgbG90IChmb3IgcmVzb3VyY2VzIG90aGVyIHRoYW4gb3VyIG93bj8pCi0JCS8vIHdpdGggbG90cyBvZiAnbnVsbCcgdmFsdWVzLiBUaGUgbG9naWMgYmVsb3cgbWF5IHByZXZlbnQgdGhlIGNvcnJlY3QgdW5zZXR0aW5nCi0JCS8vIG9mIGEgcHJvcGVydHkgKHN1Y2ggYXMgY2hhbmdpbmcgZnJvbSBhIGxhbmd1YWdlIHNldHRpbmcgYmFjayB0byAnbm9uZScpLiAKLQkJLy8gV2UgbWF5IG5lZWQgYSAnbm9uZScgaWQsIG9yIHNvbWV0aGluZywgdG8gaGVscCBkZXRlY3QgdGhhdCBjYXNlLCBzaW5jZSB3ZSBjYW4ndCAKLQkJLy8gYWx3YXlzIGFzc3VtZSB0aGUgJ251bGwnIGlzIGFjY3VyYXRlLgotCX0KLQotCXB1YmxpYyBJTm9kZU5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIG5vdGlmaWVyQXRDcmVhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKE9iamVjdCB0eXBlKSB7Ci0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyICE9IG51bGwpIHsKLQkJCWlmIChlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5pdGVyYXRvcigpOwotCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjZDZiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci0KLWludGVyZmFjZSBQYWdlRGlyZWN0aXZlV2F0Y2hlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlTdHJpbmcgZ2V0Q29udGVudFR5cGUoKTsKLQotCVN0cmluZyBnZXRMYW5ndWFnZSgpOwotCi0JaW50IGdldE9mZnNldCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YzkzM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlByb3BhZ2F0aW5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5IGV4dGVuZHMgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuCi0JICovCi0JcHVibGljIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeSgpIHsKLQkJdGhpcyhQYWdlRGlyZWN0aXZlV2F0Y2hlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS4KLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICovCi0JcHVibGljIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlQYWdlRGlyZWN0aXZlV2F0Y2hlciByZXN1bHQgPSBudWxsOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgWE1MRWxlbWVudCkgewotCQkJWE1MRWxlbWVudCB4bWxFbGVtZW50ID0gKFhNTEVsZW1lbnQpIHRhcmdldDsKLQkJCWlmICh4bWxFbGVtZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkvLyAgICAgICAgICAgICAgICBpZiAoeG1sRWxlbWVudC5nZXROb2RlTmFtZSgpID09IEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKSB7ICAgLy8gbm90IHN1cmUgd2h5IGlkZW50aXR5IHRvICBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfUEFHRSBkb2Vzbid0IHdvcmsKLQkJCQlpZiAoeG1sRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOmRpcmVjdGl2ZS5wYWdlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHQgPSBuZXcgUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsKHhtbEVsZW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkodGhpcy5hZGFwdGVyS2V5LCB0aGlzLnNob3VsZFJlZ2lzdGVyQWRhcHRlcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjg1ZDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuUGFnZURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLQotCi0KLS8qKiAKLSAqIFRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGlzIGNsYXNzIGlzIHRvIG1vbml0b3IgcGFnZSBkaXJlY3RpdmVzIGFuZCBpZiAKLSAqIGEgY2hhbmdlIGluIGVtYmVkZGVkIHR5cGUgaXMgaXMgbWFkZSwgaXQgd2lsbCBzaWduYWwgCi0gKiB0aGUgc3RydWN0dXJlZE1vZGVsIHRoYXQgaXQgbmVlZHMgdG8gcmVpbml0aWFsaXplIGl0c2VsZi4KLSAqLwotY2xhc3MgUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsIGltcGxlbWVudHMgUGFnZURpcmVjdGl2ZVdhdGNoZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGFkYXB0ZXJUeXBlID0gUGFnZURpcmVjdGl2ZVdhdGNoZXIuY2xhc3M7Ci0JWE1MRWxlbWVudCB0YXJnZXRFbGVtZW50OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbC4KLQkgKi8KLQlwdWJsaWMgUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsKFhNTEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRhcmdldEVsZW1lbnQgPSB0YXJnZXQ7Ci0JCVN0cmluZyBjb250ZW50VHlwZVZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgiY29udGVudFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudFR5cGVWYWx1ZSAhPSBudWxsKSB7Ci0JCQkvLyB1c2luZyBjb25jcmV0ZSBjbGFzcyBiZWxvdywgc2luY2UgImNoYW5nZWQiIGlzIHNvbWV0aGluZyBvZiBhbiBpbnRlcm5hbCBtZXRob2QKLQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwpICgoWE1MRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNoYW5nZWRDb250ZW50VHlwZSgoKEluZGV4ZWRSZWdpb24pIHRhcmdldEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksIGNvbnRlbnRUeXBlVmFsdWUpOwotCQl9Ci0JCVN0cmluZyBsYW5ndWFnZVZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgibGFuZ3VhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobGFuZ3VhZ2VWYWx1ZSAhPSBudWxsKSB7Ci0JCQkvLyB1c2luZyBjb25jcmV0ZSBjbGFzcyBiZWxvdywgc2luY2UgImNoYW5nZWQiIGlzIHNvbWV0aGluZyBvZiBhbiBpbnRlcm5hbCBtZXRob2QKLQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwpICgoWE1MRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNoYW5nZWRMYW5ndWFnZSgoKEluZGV4ZWRSZWdpb24pIHRhcmdldEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksIGxhbmd1YWdlVmFsdWUpOwotCQl9Ci0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU5vZGVBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IGFkYXB0ZXJUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLklOb2RlQWRhcHRlciNub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIsIGludCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyB3ZSBzaG91bGQgb25seSBiZSBhZGRlZCB0byBwYWdlIGRpcmVjdGl2ZXMsIHNvIGlmIHdlIHNlZSBhIHBhZ2UgZGlyZWN0aXZlCi0JCS8vIGNoYW5nZSwgd2UgbmVlZCB0byBjaGVjayBpdHMgYXR0cmlidXRlcywgYW5kIG5vdGlmeSB0aGUgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgd2hlbiAKLQkJLy8gY2VydGFpbiBvbmVzIGNoYW5lLCBzbyBpdCBjYW4gbWFrZSBpdHMgImNlbnRyYWxpemVkIiBkZWNpc2lvbnMuCi0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIFhNTE5vZGUpIHsKLQotCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQkJaWYgKGNoYW5nZWRGZWF0dXJlIGluc3RhbmNlb2YgQXR0ckltcGwpIHsKLQkJCQkJCUF0dHJJbXBsIGF0dHJpYnV0ZSA9IChBdHRySW1wbCkgY2hhbmdlZEZlYXR1cmU7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMoImNvbnRlbnRUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIHVzaW5nIGNvbmNyZXRlIGNsYXNzIGJlbG93LCBzaW5jZSAiY2hhbmdlZCIgaXMgc29tZXRoaW5nIG9mIGFuIGludGVybmFsIG1ldGhvZAotCQkJCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwpICgoWE1MRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5jaGFuZ2VkQ29udGVudFR5cGUoKChJbmRleGVkUmVnaW9uKSB0YXJnZXRFbGVtZW50KS5nZXRTdGFydE9mZnNldCgpLCAoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMoImxhbmd1YWdlIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJLy8gdXNpbmcgY29uY3JldGUgY2xhc3MgYmVsb3csIHNpbmNlICJjaGFuZ2VkIiBpcyBzb21ldGhpbmcgb2YgYW4gaW50ZXJuYWwgbWV0aG9kCi0JCQkJCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCkgKChYTUxEb2N1bWVudCkgdGFyZ2V0RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNoYW5nZWRMYW5ndWFnZSgoKEluZGV4ZWRSZWdpb24pIHRhcmdldEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksIChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5SRU1PVkUgOgotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicmVtb3ZlZCIrbmV3IERhdGUoKS50b1N0cmluZygpKTsKLQkJCQkJYnJlYWs7Ci0KLQotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50LmltcGwuUGFnZURpcmVjdGl2ZVdhdGNoZXIjZ2V0Q29udGVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCVN0cmluZyBjb250ZW50VHlwZVZhbHVlID0gdGFyZ2V0RWxlbWVudC5nZXRBdHRyaWJ1dGUoImNvbnRlbnRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbnRlbnRUeXBlVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50LmltcGwuUGFnZURpcmVjdGl2ZVdhdGNoZXIjZ2V0TGFuZ3VhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCVN0cmluZyBsYW5ndWFnZVZhbHVlID0gdGFyZ2V0RWxlbWVudC5nZXRBdHRyaWJ1dGUoImxhbmd1YWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGxhbmd1YWdlVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50LmltcGwuUGFnZURpcmVjdGl2ZVdhdGNoZXIjZ2V0T2Zmc2V0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRhcmdldEVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1NldHVwUGFydGljaXBhbnRGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU2V0dXBQYXJ0aWNpcGFudEZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTk1YmFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU2V0dXBQYXJ0aWNpcGFudEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gbm90IHVzZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBXVFAgMS4wTTQKLSAqLwotCi1wdWJsaWMgY2xhc3MgU2V0dXBQYXJ0aWNpcGFudEZvckpTUCBpbXBsZW1lbnRzIElEb2N1bWVudFNldHVwUGFydGljaXBhbnQgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQjc2V0dXAob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXAoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQKCk7Ci0JCQlkb2N1bWVudC5zZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmVyKTsKLQkJCXBhcnRpdGlvbmVyLmNvbm5lY3QoZG9jdW1lbnQpOwotCQkJCi0JCQkvLyBzZXR1cCBlbXB0eSBtb2RlbCBoZXJlPyBjb29yZGluYXRlZCB2aWEgbW9kZWwgbWFuYWdlcj8KLQkJCQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmM2MmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Db21waWxhdGlvblVuaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOwotCi0vKioKLSAqIFRvIGVuc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiBQcm9ibGVtUmVxdWVzdG9yIGFuZCBXb3JraW5nQ29weU93bmVyCi0gKiBmb3IgSlNQIHBsdWdpbnMuICBUaGVzZSB3ZXJlIHJlbW92ZWQgZnJvbSBKU1BUcmFuc2xhdGlvbiB0byBlbnN1cmUgdGhhdCB0aGUKLSAqIEpTUFRyYW5zbGF0aW9uIHdhcyBub3QgaGVsZCBpbiBtZW1vcnkgYnkgYW55IHR5cGUgb2YgSkRUIGxpc3RzIChjYWNoaW5nCi0gKiBzZWFyY2ggcmVzdWx0cywgZXRjLi4uKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0SGVscGVyIHsKLQotICAgIHByaXZhdGUgSlNQUHJvYmxlbVJlcXVlc3RvciBmUHJvYmxlbVJlcXVlc3RvciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBXb3JraW5nQ29weU93bmVyIGZXb3JraW5nQ29weU93bmVyID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBDb21waWxhdGlvblVuaXRIZWxwZXIgaW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIENvbXBpbGF0aW9uVW5pdEhlbHBlcigpIHsKLSAgICAgICAgLy8gZm9yY2UgdXNlIG9mIGluc3RhbmNlCi0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgZmluYWwgQ29tcGlsYXRpb25Vbml0SGVscGVyIGdldEluc3RhbmNlKCkgewotCi0gICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQ29tcGlsYXRpb25Vbml0SGVscGVyKCk7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlNQUHJvYmxlbVJlcXVlc3RvciBnZXRQcm9ibGVtUmVxdWVzdG9yKCkgewotCi0gICAgICAgIGlmIChmUHJvYmxlbVJlcXVlc3RvciA9PSBudWxsKQotICAgICAgICAgICAgZlByb2JsZW1SZXF1ZXN0b3IgPSBuZXcgSlNQUHJvYmxlbVJlcXVlc3RvcigpOwotICAgICAgICByZXR1cm4gZlByb2JsZW1SZXF1ZXN0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIFdvcmtpbmdDb3B5T3duZXIgZ2V0V29ya2luZ0NvcHlPd25lcigpIHsKLQotICAgICAgICBpZiAoZldvcmtpbmdDb3B5T3duZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgZldvcmtpbmdDb3B5T3duZXIgPSBuZXcgV29ya2luZ0NvcHlPd25lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkpTUCBXb3JraW5nIGNvcHkgb3duZXIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZXb3JraW5nQ29weU93bmVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Fc2NhcGVkVGV4dFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Fc2NhcGVkVGV4dFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljZjYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvRXNjYXBlZFRleHRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIGNsYXNzIHRvIGhhbmRsZSBjaHVua3Mgb2YgdGV4dC9yZWdpb25zCi0gKiB3aXRoIGVzY2FwZWQgY2hhcmFjdGVyIGRhdGEKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFc2NhcGVkVGV4dFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGZYTUx0b0phdmFMb29rdXAgPSBudWxsOwotCi0JLyoqCi0JICogQHJldHVybiB1bmVzY2FwZWQgZnVsbCB0ZXh0IG9mIHRoYXQgcmVnaW9uLCAiIiBpZiB0aGVyZSBpcyBubyB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5lc2NhcGVkVGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gcikgewotCQlTdHJpbmcgdGVzdCA9IChwYXJlbnQgIT0gcikgPyBwYXJlbnQuZ2V0RnVsbFRleHQocikgOiBwYXJlbnQuZ2V0RnVsbFRleHQoKTsKLQkJcmV0dXJuIGdldFVuZXNjYXBlZFRleHQodGVzdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5lc2NhcGVkVGV4dChTdHJpbmcgdGVzdCkgewotCQlpbml0TG9va3VwKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0ZXN0ICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGVzdCwgIiY7IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0b2sxLCB0b2syLCB0b2szLCB0cmFuc1N0cmluZzsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQl0b2sxID0gdG9rMiA9IHRvazMgPSB0cmFuc1N0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJdG9rMSA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWlmICh0b2sxLmVxdWFscygiJiIpICYmIHN0Lmhhc01vcmVUb2tlbnMoKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJdG9rMiA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQl0b2szID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCEodHJhbnNTdHJpbmcgPSBmWE1MdG9KYXZhTG9va3VwLmdldFByb3BlcnR5KHRvazEgKyB0b2syICsgdG9rMywgIiIpKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodHJhbnNTdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCh0b2sxICsgdG9rMiArIHRvazMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIGxvb2t1cCB0YWJsZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRMb29rdXAoKSB7Ci0JCWZYTUx0b0phdmFMb29rdXAgPSBuZXcgUHJvcGVydGllcygpOwotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImYXBvczsiLCAiJyIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJnF1b3Q7IiwgIlwiIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImYW1wOyIsICImIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImbHQ7IiwgIjwiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZYTUx0b0phdmFMb29rdXAuc2V0UHJvcGVydHkoIiZndDsiLCAiPiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJm5ic3A7IiwgIiAiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gZW50aXR5IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVFbnRpdHlSZWZlcmVuY2UoU3RyaW5nIGVudGl0eSkgewotCQlyZXR1cm4gZlhNTHRvSmF2YUxvb2t1cC5nZXRQcm9wZXJ0eShlbnRpdHksIGVudGl0eSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSUpTUFRyYW5zbGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSUpTUFRyYW5zbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzlmM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0lKU1BUcmFuc2xhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci0KLS8qKgotICogQW4gb2JqZWN0IHRoYXQgaG9sZHMgYSB0cmFuc2xhdGVkIEpTUCBTdHJpbmcgYWxvbmcgd2l0aAotICogcG9zaXRpb24gbWFwcGluZyBmcm9tIEphdmEgdG8gSlNQLCBhbmQgSlNQIHRvIEphdmEuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSlNQVHJhbnNsYXRpb24gewotCi0JLyoqCi0JICogVGhlIHN0cmluZyBjb250ZW50cyBvZiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudC4KLQkgKiBAcmV0dXJuICB0aGUgc3RyaW5nIGNvbnRlbnRzIG9mIHRoZSB0cmFuc2xhdGVkIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKTsKLQotCS8qKgotCSAqIFRoZSBjb3JyZXNwb25kaW5nIGphdmEgb2Zmc2V0IGluIHRoZSB0cmFuc2xhdGVkIGRvY3VtZW50IGZvciBhIGdpdmVuIGpzcCBvZmZzZXQuCi0JICogQHBhcmFtIGpzcFBvc2l0aW9uCi0JICogQHJldHVybiB0aGUgamF2YSBvZmZzZXQgdGhhdCBtYXBzIHRvIGpzcE9mZnNldCwgLTEgaWYgdGhlIHBvc2l0aW9uIGhhcyBubyBtYXBwaW5nLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SmF2YU9mZnNldChpbnQganNwT2Zmc2V0KTsKLQotCS8qKgotCSAqIFRoZSBjb3JyZXNwb25kaW5nIGpzcCBvZmZzZXQgaW4gdGhlIHNvdXJjZSBkb2N1bWVudCBmb3IgYSBnaXZlbiBqc3Agb2Zmc2V0IGluIHRoZSB0cmFuc2xhdGVkIGRvY3VtZW50LgotCSAqIEBwYXJhbSBqYXZhUG9zaXRpb24KLQkgKiBAcmV0dXJuIHRoZSBqc3Agb2Zmc2V0IHRoYXQgbWFwcyB0byBqYXZhT2Zmc2V0LCAtMSBpZiB0aGUgcG9zaXRpb24gaGFzIG5vIG1hcHBpbmcuCi0JICovCi0JcHVibGljIGludCBnZXRKc3BPZmZzZXQoaW50IGphdmFPZmZzZXQpOwotCi0JLyoqCi0JICogVGhlIGNvcnJlc3BvbmRpbmcgQ29tcGlsYXRpb25Vbml0IGZvciB0aGUgdHJhbnNsYXRlZCBKU1AgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIGFuIElDb21waWxhdGlvblVuaXQgb2YgdGhlIHRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJSmF2YUVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpTUCByYW5nZSBpbiB0aGUgSlNQIFN0cnVjdHVyZWREb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBqc3BTdGFydCBzdGFyaW5nIG9mZnNldCBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICogQHBhcmFtIGpzcEVuZCBlbmRpbmcgb2Zmc2V0IGluIHRoZSBKU1AgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIElKYXZhRWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgSlNQIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBnZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShpbnQganNwU3RhcnQsIGludCBqc3BFbmQpOwotCi0JLyoqCi0JICogTXVzdCBiZSBzZXQgdHJ1ZSBpbiBvcmRlciBmb3IgcHJvYmxlbXMgdG8gYmUgY29sbGVjdGVkIGR1cmluZyByZWNvbmNpbGUuCi0JICogSWYgc2V0IGZhbHNlLCBwcm9ibGVtcyB3aWxsIGJlIGlnbm9yZWQgZHVyaW5nIHJlY29uY2lsZS4KLQkgKiBAcGFyYW0gY29sbGVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKGJvb2xlYW4gY29sbGVjdCk7Ci0KLQkvKioKLQkgKiBSZWNvbmNpbGVzIHRoZSBjb21waWxhdGlvbiB1bml0IGZvciB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBMaXN0IG9mIHByb2JsZW1zIGNvbGxlY3RlZCBkdXJpbmcgcmVjb25jaWxlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvYmxlbXMoKTsKLQkKLQkvLyBhZGQgdGhlc2UgQVBJIG9uY2UgZmluYWxpemVkCi0JLy8gZ2V0SnNwRWRpdHMoVGV4dEVkaXQgamF2YUVkaXQpCi0JLy8gZ2V0SmF2YVJhbmdlcygpCi0gICAgLy8gZ2V0SmF2YURvY3VtZW50KCkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQMlNlcnZsZXROYW1lVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUDJTZXJ2bGV0TmFtZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5YTkxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQMlNlcnZsZXROYW1lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUDJTZXJ2bGV0TmFtZVV0aWwgewotCQotCS8qKgotCSAqIFdBUyBtYW5nbGVzIFRvbSZKZXJyeSBhczogX1RvbV8yNl9KZXJyeTsgdGhpcyB0YWtlcyBpbiB0aGUgbWFuZ2xlZCBuYW1lCi0JICogYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIG5hbWUuCi0JICogCi0JICogVW5tYW5nbGVzIHRoZSBxdWFsaWZpZWQgdHlwZSBuYW1lLiAgSWYgYW4gdW5kZXJzY29yZSBpcyBmb3VuZAotCSAqIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBtYW5nbGVkIHJlcHJlc2VudGF0aW9uIG9mIGEgbm9uLWFscGhhLCAKLQkgKiBub24tZGlnaXQgY2hhcmFjdGVyIG9mIHRoZSBmb3JtIF9OTl8sIHdoZXJlIE5OIGFyZSBoZXggZGlnaXRzCi0JICogcmVwcmVzZW50aW5nIHRoZSBlbmNvZGVkIGNoYXJhY3Rlci4gIFRoaXMgcm91dGluZSBjb252ZXJ0cyBpdAotCSAqIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyB1bm1hbmdsZShTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJaWYocXVhbGlmaWVkVHlwZU5hbWUuY2hhckF0KDApICE9ICdfJykKLQkJCXJldHVybiBxdWFsaWZpZWRUeXBlTmFtZTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBwb3NzaWJsZSA9ICIiOwotCQotCQkvLyByZW1vdmUgdGhlIC5qYXZhIGV4dGVuc2lvbiBpZiB0aGVyZSBpcyBvbmUKLQkJaWYocXVhbGlmaWVkVHlwZU5hbWUuZW5kc1dpdGgoIi5qYXZhIikpLy8kTk9OLU5MUy0xJAotCQkJcXVhbGlmaWVkVHlwZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZS5zdWJzdHJpbmcoMCwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCkgLSA1KTsKLQkJCi0JCWZvcihpbnQgaSA9IDE7IGkgPCBxdWFsaWZpZWRUeXBlTmFtZS5sZW5ndGgoKTsgaSsrKSB7ICAvLyBzdGFydCBhdCBpbmRleCAxIGIvYyAxc3QgY2hhciBpcyBhbHdheXMgJ18nCi0JCQljaGFyIGMgPSBxdWFsaWZpZWRUeXBlTmFtZS5jaGFyQXQoaSk7Ci0JCQlpZihjID09ICdfJykgewotCQkJCWludCBlbmRJbmRleCA9IHF1YWxpZmllZFR5cGVOYW1lLmluZGV4T2YoJ18nLCBpKzEpOwotCQkJCWlmKGVuZEluZGV4ID09IC0xKQotCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCWVsc2UgewotCQkJCQljaGFyIHVubWFuZ2xlZDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBvc3NpYmxlID0gcXVhbGlmaWVkVHlwZU5hbWUuc3Vic3RyaW5nKGkrMSwgZW5kSW5kZXgpOyAKLQkJCQkJICAgIGlmKGlzVmFsaWQocG9zc2libGUpKSB7Ci0JCQkJCQkJdW5tYW5nbGVkID0gKGNoYXIpSW50ZWdlci5kZWNvZGUoIjB4IiArIHBvc3NpYmxlKS5pbnRWYWx1ZSgpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpID0gZW5kSW5kZXg7Ci0JCQkJCSAgICB9Ci0JCQkJCSAgICBlbHNlIHsgCi0JCQkJCSAgICAgICAgdW5tYW5nbGVkID0gYzsKLQkJCQkJICAgIH0KLQkJCQkJCQotCQkJCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl1bm1hbmdsZWQgPSBjOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodW5tYW5nbGVkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBIZXggcmVwcmVzZW50YXRpb24gb2YgYW4gQVNDSUkgY2hhcmFjdGVyIChlZy4gMkYgLT4gLykKLQkgKiBAcGFyYW0gcG9zc2libGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBwb3NzaWJsZSkgewotCSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCSAgICBpZihwb3NzaWJsZS5sZW5ndGgoKSA9PSAyKXsJICAgIAotCSAgICAgICAgY2hhciBjMSA9IHBvc3NpYmxlLmNoYXJBdCgwKTsKLQkgICAgICAgIGNoYXIgYzIgPSBwb3NzaWJsZS5jaGFyQXQoMSk7Ci0JICAgICAgICAvLyAxc3QgY2hhcmFjdGVyIG11c3QgYmUgYSBkaWdpdAotCSAgICAgICAgaWYoQ2hhcmFjdGVyLmlzRGlnaXQoYzEpKSB7Ci0JICAgICAgICAgICAgLy8gMm5kIGNoYXJhY3RlciBtdXN0IGJlIGRpZ2l0IG9yIHVwcGVyIGNhc2UgbGV0dGVyIEEtRgotCSAgICAgICAgICAgIGlmKENoYXJhY3Rlci5pc0RpZ2l0KGMyKSkgewotCSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjMikgJiYgKGMyID09ICdBJyB8fCBjMiA9PSAnQicgfHwgYzIgPT0gICdDJ3x8IGMyID09ICAnRCd8fCBjMiA9PSAgJ0UnfHwgYzIgPT0gJ0YnKSkgewotCSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNYW5nbGUgc3RyaW5nIHRvIFdBUy1saWtlIHNwZWNpZmljYXRpb25zCi0JICoKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBtYW5nbGUoU3RyaW5nIG5hbWUpIHsJICAKLQkgIFN0cmluZ0J1ZmZlciBtb2RpZmllZE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAKLQkgIC8vIGV4dGVuc2lvbiAoLmpzcCwgLmpzcGYsIC5qc3B4LCBldGMuLi4pIHNob3VsZCBhbHJlYWR5IGJlIGVuY29kZWQgaW4gbmFtZQotCSAgCi0JICBpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQkgIC8vIGluIGNhc2UgbmFtZSBpcyBmb3JiaWRkZW4gKGEgbnVtYmVyLCBjbGFzcywgZm9yLCBldGMuLi4pCi0JICBtb2RpZmllZE5hbWUuYXBwZW5kKCdfJyk7Ci0JCi0JICAvLyBlbnN1cmUgcmVzdCBvZiBjaGFyYWN0ZXJzIGFyZSB2YWxpZAkKLQkgIGZvciAoaW50IGk9MDsgaTwgbGVuZ3RoOyBpKyspIHsKLQkJICBjaGFyIGN1cnJlbnRDaGFyID0gbmFtZS5jaGFyQXQoaSk7Ci0JCSAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjdXJyZW50Q2hhcikgPT0gdHJ1ZSAgKSB7IAotCQkJICBtb2RpZmllZE5hbWUuYXBwZW5kKGN1cnJlbnRDaGFyKTsKLQkJICB9IGVsc2UgewotCQkJICBtb2RpZmllZE5hbWUuYXBwZW5kKG1hbmdsZUNoYXIoY3VycmVudENoYXIpKTsKLQkJICB9Ci0JICB9Ci0JICByZXR1cm4gbW9kaWZpZWROYW1lLnRvU3RyaW5nKCk7Ci0JICAKLQl9Ci0KLQkvKioKLQkgKiB0YWtlIGEgY2hhcmFjdGVyIGFuZCByZXR1cm4gaXRzIGhleCBlcXVpdmFsZW50Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIG1hbmdsZUNoYXIoY2hhciBjaCkgewotCSAgaWYgKCBjaCA9PSBGaWxlLnNlcGFyYXRvckNoYXIgKSB7Ci0JCSAgY2ggPSAnLyc7Ci0JICB9Ci0JCi0JICBpZiAoIENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpID09IHRydWUgKSB7Ci0JCSAgcmV0dXJuICIiICsgY2g7IC8vJE5PTi1OTFMtMSQKLQkgIH0KLQkgIHJldHVybiAiXyIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKS50b1VwcGVyQ2FzZSgpICsgIl8iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQSW5jbHVkZVJlZ2lvbkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUEluY2x1ZGVSZWdpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlMjI0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQSW5jbHVkZVJlZ2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBFeHRlbnNpb24gb2YgWE1MSlNQUmVnaW9uSGVscGVyIGludGVkZWQgdG8gcGFyc2UgZW50aXJlIGluY2x1ZGVkIEpTUCBmaWxlcy4KLSAqIEJhc2ljYWxseSBpdCBleHBhbmRzIHRoZSBydWxlcyBmb3Igd2hhdCB0YWdzIGFyZSBwYXJzZWQgYXMgSlNQLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1jbGFzcyBKU1BJbmNsdWRlUmVnaW9uSGVscGVyIGV4dGVuZHMgWE1MSlNQUmVnaW9uSGVscGVyIHsKLQkvKioKLQkgKiBAcGFyYW0gSlNQVHJhbnNsYXRvcgotCSAqLwotCXB1YmxpYyBKU1BJbmNsdWRlUmVnaW9uSGVscGVyKEpTUFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlzdXBlcih0cmFuc2xhdG9yKTsKLQl9Ci0KLQkvLyB0aGVzZSBtZXRob2RzIGRldGVybWluZSB3aGF0IGNvbnRlbnQgZ2V0cyBhZGRlZCB0byB0aGUgbG9jYWwgc2NyaXBsZXQsIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uIGJ1ZmZlcnMKLQkvKgotCSAqIHJldHVybiB0cnVlIGZvciBlbGVtZW50cyB3aG9zZSBjb250ZW50cyB3ZSBtaWdodCB3YW50IHRvIGFkZCB0byB0aGUgamF2YSBmaWxlIHdlIGFyZSBidWlsZGluZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSlNQU3RhcnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpOwotCQlyZXR1cm4gdHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlY2xhcmF0aW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkZWNsYXJhdGlvbiIpIC8vJE5PTi1OTFMtMSQJCQotCQkJCQl8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIjwlISIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cHJlc3Npb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmV4cHJlc3Npb24iKSAvLyROT04tTkxTLTEkCQkKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI8JT0iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2NyaXB0bGV0KFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpzY3JpcHRsZXQiKSAvLyROT04tTkxTLTEkCQkKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI8JSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUuaW5jbHVkZSIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpbmNsdWRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhZ2xpYkRpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ0YWdsaWIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFnZURpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnBhZ2UiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgicGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gZGlmZmVyZW50IGJ0d24gWE1MLUpTUCBhbmQgSlNQIHRhZ3MJCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVnaW9uTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQlTdHJpbmcgbmFtZVN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBzaXplID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJaWYgKHNpemUgPiAxKSB7Ci0JCQkvLyBwcmVzdW1hYmx5IFhNTC1KU1AgPGpzcDpzY3JpcHRsZXQ+IHwgPGpzcDpleHByZXNzaW9uPiB8IDxqc3A6ZGVjbGFyYXRpb24+Ci0JCQluYW1lUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJfQotCQllbHNlIGlmIChzaXplID09IDEpIHsKLQkJCS8vIHByZXN1bWFibHkgSlNQIG9wZW4gPCUgfCA8JT0gfCA8JSEKLQkJCW5hbWVSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQl9Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpCi0JCQluYW1lU3RyID0gZlRleHRUb1BhcnNlLnN1YnN0cmluZyhzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChuYW1lUmVnaW9uKSk7Ci0JCXJldHVybiBuYW1lU3RyLnRyaW0oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3RoZXJSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoc2RSZWdpb24pOwotCQlwcm9jZXNzUGFnZURpcmVjdGl2ZShzZFJlZ2lvbik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BQcm9ibGVtUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQUHJvYmxlbVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ3NjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BQcm9ibGVtUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUHJvYmxlbVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLQotY2xhc3MgSlNQUHJvYmxlbVJlcXVlc3RvciBpbXBsZW1lbnRzIElQcm9ibGVtUmVxdWVzdG9yIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNBY3RpdmUgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNSdW5uaW5nID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIExpc3QgZkNvbGxlY3RlZFByb2JsZW1zOwotCi0gICAgcHVibGljIHZvaWQgYmVnaW5SZXBvcnRpbmcoKSB7Ci0KLSAgICAgICAgZklzUnVubmluZyA9IHRydWU7Ci0gICAgICAgIGZDb2xsZWN0ZWRQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsKLQotICAgICAgICBpZiAoaXNBY3RpdmUoKSkKLSAgICAgICAgICAgIGZDb2xsZWN0ZWRQcm9ibGVtcy5hZGQocHJvYmxlbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgewotCi0gICAgICAgIGZJc1J1bm5pbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQotICAgICAgICByZXR1cm4gZklzQWN0aXZlICYmIGZDb2xsZWN0ZWRQcm9ibGVtcyAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGlzIHByb2JsZW0gcmVxdWVzdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpc0FjdGl2ZQotICAgICAqICAgICAgICAgICAgdGhlIHN0YXRlIG9mIHRoaXMgcHJvYmxlbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0FjdGl2ZShib29sZWFuIGlzQWN0aXZlKSB7Ci0KLSAgICAgICAgaWYgKGZJc0FjdGl2ZSAhPSBpc0FjdGl2ZSkgewotICAgICAgICAgICAgZklzQWN0aXZlID0gaXNBY3RpdmU7Ci0gICAgICAgICAgICBpZiAoZklzQWN0aXZlKQotICAgICAgICAgICAgICAgIHN0YXJ0Q29sbGVjdGluZ1Byb2JsZW1zKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3RvcENvbGxlY3RpbmdQcm9ibGVtcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgdGhpcyBhbm5vdGF0aW9uIG1vZGVsIHRvIGNvbGxlY3QgdGVtcG9yYXJ5IHByb2JsZW1zIGZyb20gbm93IG9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydENvbGxlY3RpbmdQcm9ibGVtcygpIHsKLQotICAgICAgICBmQ29sbGVjdGVkUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgdGhpcyBhbm5vdGF0aW9uIG1vZGVsIHRvIG5vIGxvbmdlciBjb2xsZWN0IHRlbXBvcmFyeSBwcm9ibGVtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RvcENvbGxlY3RpbmdQcm9ibGVtcygpIHsKLQotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjb2xsZWN0ZWQgcHJvYmxlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDb2xsZWN0ZWRQcm9ibGVtcygpIHsKLQotICAgICAgICByZXR1cm4gZkNvbGxlY3RlZFByb2JsZW1zOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLQotICAgICAgICByZXR1cm4gZklzUnVubmluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ5ZjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIDxwPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgSUpTUFRyYW5zbGF0aW9uLiAgCi0gKiA8YnI+Ci0gKiBUaGlzIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBqYXZhIHRyYW5zbGF0aW9uIG9mIAotICogYSBKU1AgZmlsZSBhcyB3ZWxsIGFzIGEgbWFwcGluZyBvZiByYW5nZXMgZnJvbSB0aGUgdHJhbnNsYXRlZCBKYXZhIHRvIHRoZSBKU1Agc291cmNlLCAKLSAqIGFuZCBtYXBwaW5nIGZyb20gSlNQIHNvdXJjZSBiYWNrIHRvIHRoZSB0cmFuc2xhdGVkIEphdmEuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogWW91IG1heSBhbHNvIHVzZSBKU1BUcmFuc2xhdGlvbiB0byBkbyBDb21waWxhdGlvblVuaXQtZXNxdWUgdGhpbmdzIHN1Y2ggYXM6Ci0gKiA8dWw+Ci0gKiAJPGxpPmNvZGUgc2VsZWN0IChnZXQgamF2YSBlbGVtZW50cyBmb3IganNwIHNlbGVjdGlvbik8L2xpPgotICogIDxsaT5yZWNvbmNpbGU8L2xpPgotICogIDxsaT5nZXQgamF2YSByZWdpb25zIGZvciBqc3Agc2VsZWN0aW9uPC9saT4KLSAqICA8bGk+Z2V0IGEgSlNQIHRleHQgZWRpdCBiYXNlZCBvbiBhIEphdmEgdGV4dCBlZGl0PC9saT4KLSAqICA8bGk+ZGV0ZXJtaW5lIGlmIGEgamF2YSBvZmZzZXQgZmFsbHMgd2l0aGluIGEganNwOnVzZUJlYW4gcmFuZ2U8L2xpPgotICogIDxsaT5kZXRlcm1pbmUgaWYgYSBqYXZhIG9mZnNldCBmYWxscyB3aXRoaW4gYSBqc3AgaW1wb3J0IHN0YXRtZW50PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdGlvbiBpbXBsZW1lbnRzIElKU1BUcmFuc2xhdGlvbiB7Ci0JCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyAody9vdXQgZXh0ZW5zaW9uKSAqKi8KLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElKYXZhUHJvamVjdCBmSmF2YVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSnNwMkphdmFNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BJbXBvcnRzTWFwID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZkphdmEySnNwVXNlQmVhbk1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZKYXZhMkpzcEluZGlyZWN0TWFwID0gbnVsbDsKLQkKLQkvLyBkb24ndCB3YW50IHRvIGhvbGQgb250byBtb2RlbCAodmlhIHRyYW5zbGF0b3IpCi0JLy8gYWxsIHJlbGV2YW50IGluZm8gaXMgZXh0cmFjdGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLQkvL3ByaXZhdGUgSlNQVHJhbnNsYXRvciBmVHJhbnNsYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkphdmFUZXh0ID0gIiI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkpzcFRleHQgPSAiIjsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgZkNvbXBpbGF0aW9uVW5pdCA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCS8qKiBsb2NrIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgY29tcGlsYXRpb24gdW5pdCAqKi8KLQlwcml2YXRlIGJ5dGVbXSBmTG9jayA9IG51bGw7Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRpb24oSUphdmFQcm9qZWN0IGphdmFQcm9qLCBKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQotCQlmTG9jayA9IG5ldyBieXRlWzBdOwotCQlmSmF2YVByb2plY3QgPSBqYXZhUHJvajsKLQkJLy9mVHJhbnNsYXRvciA9IHRyYW5zbGF0b3I7Ci0JCQotCQkvLyBjYW4gYmUgbnVsbCBpZiBpdCdzIGFuIGVtcHR5IGRvY3VtZW50ICh3LyBOdWxsSlNQVHJhbnNsYXRpb24pCi0JCWlmKHRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkgICAgZkphdmFUZXh0ID0gdHJhbnNsYXRvci5nZXRUcmFuc2xhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCSAgICBmSnNwVGV4dCA9IHRyYW5zbGF0b3IuZ2V0SnNwVGV4dCgpOwotCQkJZkNsYXNzbmFtZSA9IHRyYW5zbGF0b3IuZ2V0Q2xhc3NuYW1lKCk7Ci0JCQlmSmF2YTJKc3BNYXAgPSB0cmFuc2xhdG9yLmdldEphdmEySnNwUmFuZ2VzKCk7Ci0JCQlmSnNwMkphdmFNYXAgPSB0cmFuc2xhdG9yLmdldEpzcDJKYXZhUmFuZ2VzKCk7Ci0JCQlmSmF2YTJKc3BJbXBvcnRzTWFwID0gdHJhbnNsYXRvci5nZXRKYXZhMkpzcEltcG9ydFJhbmdlcygpOwotCQkJZkphdmEySnNwVXNlQmVhbk1hcCA9IHRyYW5zbGF0b3IuZ2V0SmF2YTJKc3BVc2VCZWFuUmFuZ2VzKCk7Ci0JCQlmSmF2YTJKc3BJbmRpcmVjdE1hcCA9IHRyYW5zbGF0b3IuZ2V0SmF2YTJKc3BJbmRpcmVjdFJhbmdlcygpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBmSmF2YVByb2plY3Q7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uI2dldEphdmFUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCkgewotCQkvL3JldHVybiAoZlRyYW5zbGF0b3IgIT0gbnVsbCkgPyBmVHJhbnNsYXRvci5nZXRUcmFuc2xhdGlvbigpLnRvU3RyaW5nKCkgOiAiIjsgIC8vJE5PTi1OTFMtMSQgCi0JCXJldHVybiBmSmF2YVRleHQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SnNwVGV4dCgpIHsKLQkJLy9yZXR1cm4gKGZUcmFuc2xhdG9yICE9IG51bGwpID8gZlRyYW5zbGF0b3IuZ2V0SnNwVGV4dCgpIDogIiI7ICAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmSnNwVGV4dDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKYXZhUGF0aCgpIHsKLQkJLy8gY3JlYXRlIGlmIG5lY2Vzc2FyeQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCXJldHVybiAoY3UgIT0gbnVsbCkgPyBjdS5nZXRQYXRoKCkudG9TdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBvZmZzZXQgZm9yIGEgZ2l2ZSBKU1Agb2Zmc2V0Ci0JICovCi0JcHVibGljIGludCBnZXRKYXZhT2Zmc2V0KGludCBqc3BPZmZzZXQpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgb2Zmc2V0SW5SYW5nZSA9IDA7Ci0JCVBvc2l0aW9uIGpzcFBvcywgamF2YVBvcyA9IG51bGw7Ci0KLQkJLy8gaXRlcmF0ZSBhbGwgbWFwcGVkIGpzcCByYW5nZXMKLQkJSXRlcmF0b3IgaXQgPSBmSnNwMkphdmFNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJanNwUG9zID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkvLyBuZWVkIHRvIGNvdW50IHRoZSBsYXN0IHBvc2l0aW9uIGFzIGluY2x1ZGVkCi0JCQlpZiAoIWpzcFBvcy5pbmNsdWRlcyhqc3BPZmZzZXQpICYmICEoanNwUG9zLm9mZnNldCtqc3BQb3MubGVuZ3RoID09IGpzcE9mZnNldCkpCi0JCQkJY29udGludWU7Ci0KLQkJCW9mZnNldEluUmFuZ2UgPSBqc3BPZmZzZXQgLSBqc3BQb3Mub2Zmc2V0OwotCQkJamF2YVBvcyA9IChQb3NpdGlvbikgZkpzcDJKYXZhTWFwLmdldChqc3BQb3MpOwotCQkJaWYoamF2YVBvcyAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGphdmFQb3Mub2Zmc2V0ICsgb2Zmc2V0SW5SYW5nZTsKLQkJCWVsc2UgIHsKLQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSmF2YVBvc2l0aW9uIHdhcyBudWxsISIgKyBqc3BPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSlNQIG9mZnNldCBmb3IgYSBnaXZlIEphdmEgb2Zmc2V0Ci0JICovCi0JcHVibGljIGludCBnZXRKc3BPZmZzZXQoaW50IGphdmFPZmZzZXQpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgb2Zmc2V0SW5SYW5nZSA9IDA7Ci0JCVBvc2l0aW9uIGpzcFBvcywgamF2YVBvcyA9IG51bGw7Ci0KLQkJLy8gaXRlcmF0ZSBhbGwgbWFwcGVkIGphdmEgcmFuZ2VzCi0JCUl0ZXJhdG9yIGl0ID0gZkphdmEySnNwTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWphdmFQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCS8vIG5lZWQgdG8gY291bnQgdGhlIGxhc3QgcG9zaXRpb24gYXMgaW5jbHVkZWQKLQkJCWlmICghamF2YVBvcy5pbmNsdWRlcyhqYXZhT2Zmc2V0KSAmJiAhKGphdmFQb3Mub2Zmc2V0K2phdmFQb3MubGVuZ3RoID09IGphdmFPZmZzZXQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlvZmZzZXRJblJhbmdlID0gamF2YU9mZnNldCAtIGphdmFQb3Mub2Zmc2V0OwotCQkJanNwUG9zID0gKFBvc2l0aW9uKSBmSmF2YTJKc3BNYXAuZ2V0KGphdmFQb3MpOwotCQkJCi0JCQlpZihqc3BQb3MgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBqc3BQb3Mub2Zmc2V0ICsgb2Zmc2V0SW5SYW5nZTsKLQkJCWVsc2UgIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgImpzcFBvc2l0aW9uIHdhcyBudWxsISIgKyBqYXZhT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgUG9zaXRpb25zIGluIHRoZSBKYXZhIGRvY3VtZW50IHRvIGNvcnJlc3BvbmRpbmcgUG9zaXRpb25zIGluIHRoZSBKU1AgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSGFzaE1hcCBnZXRKYXZhMkpzcE1hcCgpIHsKLQkJcmV0dXJuIGZKYXZhMkpzcE1hcDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIFBvc2l0aW9ucyBpbiB0aGUgSlNQIGRvY3VtZW50IHRvIGNvcnJlc3BvbmRpbmcgUG9zaXRpb25zIGluIHRoZSBKYXZhIGRvY3VtZW50Ci0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SnNwMkphdmFNYXAoKSB7Ci0JCXJldHVybiBmSnNwMkphdmFNYXA7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgamF2YSByYW5nZSBjb3ZlcnMgbW9yZSB0aGFuIG9uZSBwYXJ0aXRpb24gaW4gdGhlIEpTUCBmaWxlLgotCSAqIAotCSAqIDxwPgotCSAqIGV4LgotCSAqIDxjb2RlPgotCSAqIDwlCi0JICogCWlmKHN1Ym1pdCkKLQkgKiAgewotCSAqICU+Ci0JICogICAgPHA+IHByaW50IHRoaXMuLi48L3A+Ci0JICogCi0JICogPCUKLQkgKiAgfQotCSAqICBlbHNlCi0JICogIHsKLQkgKiAlPgotCSAqIAkgICA8cD4gcHJpbnQgdGhhdC4uLjwvcD4KLQkgKiA8JQotCSAqICB9Ci0JICogJT4KLQkgKiA8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIHRoZSBpZiBlbHNlIHN0YXRlbWVudCBhYm92ZSBzcGFucyAzIEpTUCBwYXJ0aXRpb25zLCBzbyBpdCB3b3VsZCByZXR1cm4gdHJ1ZS4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGphdmEgY29kZSBzcGFucyBtdWx0aXBsZSBKU1AgcGFydGl0aW9ucywgb3RoZXJ3aXNlIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGphdmFTcGFuc011bHRpcGxlSnNwUGFydGl0aW9ucyhpbnQgamF2YU9mZnNldCwgaW50IGphdmFMZW5ndGgpIHsKLQkJSGFzaE1hcCBqYXZhMmpzcCA9IGdldEphdmEySnNwTWFwKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ID0gamF2YTJqc3Aua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJUG9zaXRpb24gamF2YVJhbmdlID0gbnVsbDsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlqYXZhUmFuZ2UgPSAoUG9zaXRpb24paXQubmV4dCgpOwotCQkJaWYoamF2YVJhbmdlLm92ZXJsYXBzV2l0aChqYXZhT2Zmc2V0LCBqYXZhTGVuZ3RoKSkKLQkJCQljb3VudCsrOwotCQkJaWYoY291bnQgPiAxKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBwb3NpdGlvbnMgZm9yIHRoZSBnaXZlbiByYW5nZSBpbiB0aGUgSmF2YSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRKYXZhUmFuZ2VzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0SmF2YTJKc3BNYXAoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlQb3NpdGlvbiBwID0gbnVsbDsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlwID0gKFBvc2l0aW9uKWl0Lm5leHQoKTsKLQkJCWlmKHAub3ZlcmxhcHNXaXRoKG9mZnNldCwgbGVuZ3RoKSkKLQkJCQlyZXN1bHRzLmFkZChwKTsKLQkJfQotCQlyZXR1cm4gKFBvc2l0aW9uW10pcmVzdWx0cy50b0FycmF5KG5ldyBQb3NpdGlvbltyZXN1bHRzLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGhlIGphdmEgT2Zmc2V0IGZhbGxzIHdpdGhpbiB0aGUgdXNlciBpbXBvcnQgcmFuZ2VzCi0JICogQHBhcmFtIGphdmFPZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGphdmEgT2Zmc2V0IGZhbGxzIHdpdGhpbiB0aGUgdXNlciBpbXBvcnQgcmFuZ2VzLCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcG9ydChpbnQgamF2YU9mZnNldCkgewotCQlyZXR1cm4gaXNJblJhbmdlcyhqYXZhT2Zmc2V0LCBmSmF2YTJKc3BJbXBvcnRzTWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGhlIGphdmEgb2Zmc2V0IGZhbGxzIHdpdGhpbiB0aGUgdXNlIGJlYW4gcmFuZ2VzCi0JICogQHBhcmFtIGphdmFPZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGphdmEgb2Zmc2V0IGZhbGxzIHdpdGhpbiB0aGUgdXNlciBpbXBvcnQgcmFuZ2VzLCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZUJlYW4oaW50IGphdmFPZmZzZXQpIHsKLQkJcmV0dXJuIGlzSW5SYW5nZXMoamF2YU9mZnNldCwgZkphdmEySnNwVXNlQmVhbk1hcCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBqYXZhUG9zCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5kaXJlY3QoaW50IGphdmFPZmZzZXQpIHsKLQkJcmV0dXJuIGlzSW5SYW5nZXMoamF2YU9mZnNldCwgZkphdmEySnNwSW5kaXJlY3RNYXAsIGZhbHNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5SYW5nZXMoaW50IGphdmFPZmZzZXQsIEhhc2hNYXAgcmFuZ2VzKSB7Ci0JCXJldHVybiBpc0luUmFuZ2VzKGphdmFPZmZzZXQsIHJhbmdlcywgdHJ1ZSk7Ci0JfQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGluY2x1ZGVkIGluIGFueSBvZiB0aGUgcmFuZ2VzIChQb3NpdGlvbnMpIHBhc3NlZCBpbi4KLQkgKiBpbmNsdWRlRW5kT2Zmc2V0IHRlbGxzIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIGVuZCBvZmZzZXQgb2YgZWFjaCByYW5nZSBpbiB0aGUgdGVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YU9mZnNldAotCSAqIEBwYXJhbSByYW5nZXMKLQkgKiBAcGFyYW0gaW5jbHVkZUVuZE9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJblJhbmdlcyhpbnQgamF2YU9mZnNldCwgSGFzaE1hcCByYW5nZXMsIGJvb2xlYW4gaW5jbHVkZUVuZE9mZnNldCkgewotCQkKLQkJSXRlcmF0b3IgaXQgPSByYW5nZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlQb3NpdGlvbiBqYXZhUG9zID0gKFBvc2l0aW9uKWl0Lm5leHQoKTsKLQkJCS8vIGFsc28gaW5jbHVkZSB0aGUgc3RhcnQgYW5kIGVuZCBvZmZzZXQgKG9ubHkgaWYgcmVxdWVzdGVkKQotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgxNjg3Ci0JCQlpZihqYXZhUG9zLmluY2x1ZGVzKGphdmFPZmZzZXQpIHx8IChpbmNsdWRlRW5kT2Zmc2V0ICYmIGphdmFQb3Mub2Zmc2V0K2phdmFQb3MubGVuZ3RoID09IGphdmFPZmZzZXQpKSAKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIENvbXBpbGF0aW9uVW5pdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBKU1BUcmFuc2xhdGlvbiAodGhpcyBwYXJ0aWN1bGFyIG1vZGVsKQotCSAqIFdoZW4gdXNpbmcgbWV0aG9kcyBvbiB0aGUgQ1UsIGl0J3MgcmVjY29tZW5kZWQgdG8gc3luY2hyb25pemUgb24gdGhlIENVIGZvciByZWxpYWJsZQotCSAqIHJlc3VsdHMuCi0JICogCi0JICogVGhlIG1ldGhvZCBpcyBzeW5jaHJvbml6ZWQgdG8gZW5zdXJlIHRoYXQgPGNvZGU+Y3JlYXRlQ29tcGxpbGF0aW9uVW5pdDwvY29kZT4gZG9lc24ndAotCSAqIGdldCBlbnRlcmVkIDIgb3IgbW9yZSB0aW1lcyBzaW11bHRhbmVvdXNseS4gIEEgc2lkZSBlZmZlY3Qgb2YgdGhhdCBpcyAyIGNvbXBpbGF0aW9uIHVuaXRzCi0JICogY2FuIGJlIGNyZWF0ZWQgaW4gdGhlIEphdmFNb2RlbE1hbmFnZXIsIGJ1dCB3ZSBvbmx5IGhvbGQgb25lIHJlZmVyZW5jZSB0byBpdCBpbiAKLQkgKiBmQ29tcGlsYXRpb25Vbml0LiAgVGhpcyB3b3VsZCBsZWFkIHRvIGEgbGVhayBzaW5jZSBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgQ1UgaXMKLQkgKiBkaXNjYXJkZWQgaW4gdGhlIDxjb2RlPnJlbGVhc2UoKTwvY29kZT4gbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gYSBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJc3luY2hyb25pemVkKGZMb2NrKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmQ29tcGlsYXRpb25Vbml0ID09IG51bGwpIHsKLQkJCQkJZkNvbXBpbGF0aW9uVW5pdCA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJaWYoREVCVUcpCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImVycm9yIGNyZWF0aW5nIEpTUCB3b3JraW5nIGNvcHkuLi4gIiwgam1lKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBmQ29tcGlsYXRpb25Vbml0OwotCX0KLQkKLQkvKioKLQkgKiBPcmlnaW5hbGx5IGZyb20gUmVjb25jaWxlU3RlcEZvckphdmEuICBDcmVhdGVzIGFuIElDb21waWxhdGlvblVuaXQgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIEpTUCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIElDb21waWxhdGlvblVuaXQgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIEpTUCBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gbnVsbDsKLQkJSUphdmFFbGVtZW50IGplID0gZ2V0SmF2YVByb2plY3QoKTsKLQotCQlpZiAoamUgPT0gbnVsbCB8fCAhamUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlzd2l0Y2ggKGplLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJCWplID0gamUuZ2V0UGFyZW50KCk7Ci0JCQkvLyBmYWxsIHRocm91Z2gKLQotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBqZTsKLQkJCQlwYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50Um9vdC5ERUZBVUxUX1BBQ0tBR0VST09UX1BBVEgpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgotCQkJCUlKYXZhUHJvamVjdCBqUHJvamVjdCA9IChJSmF2YVByb2plY3QpIGplOwotCi0JCQkJaWYgKCFqUHJvamVjdC5leGlzdHMoKSkgewotCQkJCQlpZihERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiBBYm9ydCBjcmVhdGUgd29ya2luZyBjb3B5OiBjYW5ub3QgY3JlYXRlIHdvcmtpbmcgY29weTogSlNQIGlzIG5vdCBpbiBhIEphdmEgcHJvamVjdCIpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXBhY2thZ2VGcmFnbWVudFJvb3QgPSBudWxsOwotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoaSA8IHBhY2thZ2VGcmFnbWVudFJvb3RzLmxlbmd0aCkgewotCQkJCQlpZiAoIXBhY2thZ2VGcmFnbWVudFJvb3RzW2ldLmlzQXJjaGl2ZSgpICYmICFwYWNrYWdlRnJhZ21lbnRSb290c1tpXS5pc0V4dGVybmFsKCkpIHsKLQkJCQkJCXBhY2thZ2VGcmFnbWVudFJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290c1tpXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQkJaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QgPT0gbnVsbCkgewotCQkJCQlpZihERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiBBYm9ydCBjcmVhdGUgd29ya2luZyBjb3B5OiBjYW5ub3QgY3JlYXRlIHdvcmtpbmcgY29weTogSlNQIGlzIG5vdCBpbiBhIEphdmEgcHJvamVjdCB3aXRoIHNvdXJjZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QiKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudFJvb3QuREVGQVVMVF9QQUNLQUdFUk9PVF9QQVRIKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0KGdldENsYXNzbmFtZSgpICsgIi5qYXZhIikuZ2V0V29ya2luZ0NvcHkoZ2V0V29ya2luZ0NvcHlPd25lcigpLCBnZXRQcm9ibGVtUmVxdWVzdG9yKCksIGdldFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRDb250ZW50cyhjdSk7Ci0KLQkJaWYoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSlNQVHJhbnNsYXRpb24gWyIrIHRoaXMgKyAiXSBmaW5pc2hlZCBjcmVhdGluZyBDb21waWxhdGlvblVuaXQ6ICIgKyBjdSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysiKTsKLQkJfQotCQkKLQkJcmV0dXJuIGN1OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2JsZW0gcmVxdWVzdG9yIGZvciB0aGUgQ29tcGlsYXRpb25Vbml0IGluIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIEpTUFByb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcigpIHsKLQkgICAgcmV0dXJuIENvbXBpbGF0aW9uVW5pdEhlbHBlci5nZXRJbnN0YW5jZSgpLmdldFByb2JsZW1SZXF1ZXN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJV29ya2luZ0NvcHlPd25lciBmb3IgdGhpcyBDb21waWxhdGlvblVuaXQgaW4gdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXB1YmxpYyBXb3JraW5nQ29weU93bmVyIGdldFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0JICAgIHJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRXb3JraW5nQ29weU93bmVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIGluIGxvbmcgb3BlcmF0aW9ucyAocmVjb25jaWxlLCBjcmVhdGluZyB0aGUgQ29tcGlsYXRpb25Vbml0Li4uKSBpbiB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCkKLQkJCWZQcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gZlByb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBMaXN0IG9mIHByb2JsZW1zIGNvbGxlY3RlZCBkdXJpbmcgcmVjb25jaWxlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvYmxlbXMoKSB7Ci0JCUxpc3QgcHJvYmxlbXMgPSBnZXRQcm9ibGVtUmVxdWVzdG9yKCkuZ2V0Q29sbGVjdGVkUHJvYmxlbXMoKTsKLQkJcmV0dXJuIHByb2JsZW1zICE9IG51bGwgPyBwcm9ibGVtcyA6IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBNdXN0IGJlIHNldCB0cnVlIGluIG9yZGVyIGZvciBwcm9ibGVtcyB0byBiZSBjb2xsZWN0ZWQgZHVyaW5nIHJlY29uY2lsZS4KLQkgKiBJZiBzZXQgZmFsc2UsIHByb2JsZW1zIHdpbGwgYmUgaWdub3JlZCBkdXJpbmcgcmVjb25jaWxlLgotCSAqIEBwYXJhbSBjb2xsZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUoYm9vbGVhbiBjb2xsZWN0KSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYoY3UgIT0gbnVsbCkgewkKLQkJCWdldFByb2JsZW1SZXF1ZXN0b3IoKS5zZXRJc0FjdGl2ZShjb2xsZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY29uY2lsZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZm9yIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGVDb21waWxhdGlvblVuaXQoKSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc3luY2hyb25pemVkKGN1KSB7Ci0JCQkJCWN1Lm1ha2VDb25zaXN0ZW50KGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJY3UucmVjb25jaWxlKElDb21waWxhdGlvblVuaXQuTk9fQVNULCB0cnVlLCBnZXRXb3JraW5nQ29weU93bmVyKCksIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IGNvbnRlbnRzIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHRvIHRoZSB0cmFuc2xhdGVkIGpzcCB0ZXh0LgotCSAqIEBwYXJhbSB0aGUgSUNvbXBpbGF0aW9uVW5pdCBvbiB3aGljaCB0byBzZXQgdGhlIGJ1ZmZlciBjb250ZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDb250ZW50cyhJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWlmIChjdSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJc3luY2hyb25pemVkIChjdSkgewotCQkJSUJ1ZmZlciBidWZmZXI7Ci0JCQl0cnkgewotCQkJCQotCQkJCWJ1ZmZlciA9IGN1LmdldEJ1ZmZlcigpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlidWZmZXIgPSBudWxsOwotCQkJfQotCQotCQkJaWYgKGJ1ZmZlciAhPSBudWxsKQotCQkJCWJ1ZmZlci5zZXRDb250ZW50cyhnZXRKYXZhVGV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElKYXZhRWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgSlNQIHJhbmdlIGluIHRoZSBKU1AgU3RydWN0dXJlZERvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGpzcFN0YXJ0IHN0YXJpbmcgb2Zmc2V0IGluIHRoZSBKU1AgZG9jdW1lbnQKLQkgKiBAcGFyYW0ganNwRW5kIGVuZGluZyBvZmZzZXQgaW4gdGhlIEpTUCBkb2N1bWVudAotCSAqIEByZXR1cm4gSUphdmFFbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBKU1Agc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElKYXZhRWxlbWVudFtdIGdldEVsZW1lbnRzRnJvbUpzcFJhbmdlKGludCBqc3BTdGFydCwgaW50IGpzcEVuZCkgewotCi0JCWludCBqYXZhUG9zaXRpb25TdGFydCA9IGdldEphdmFPZmZzZXQoanNwU3RhcnQpOwotCQlpbnQgamF2YVBvc2l0aW9uRW5kID0gZ2V0SmF2YU9mZnNldChqc3BFbmQpOwotCi0JCUlKYXZhRWxlbWVudFtdIEVNVFBZX1JFU1VMVF9TRVQgPSBuZXcgSUphdmFFbGVtZW50WzBdOwotCQlJSmF2YUVsZW1lbnRbXSByZXN1bHQgPSBFTVRQWV9SRVNVTFRfU0VUOwotCQl0cnkgewotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJaWYgKGN1ICE9IG51bGwgJiYgY3UuZ2V0QnVmZmVyKCkuZ2V0TGVuZ3RoKCkgPiAwICYmIGphdmFQb3NpdGlvblN0YXJ0ID4gMCAmJiBqYXZhUG9zaXRpb25FbmQgPj0gamF2YVBvc2l0aW9uU3RhcnQpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKGN1KSB7Ci0JCQkJCXJlc3VsdCA9IGN1LmNvZGVTZWxlY3QoamF2YVBvc2l0aW9uU3RhcnQsIGphdmFQb3NpdGlvbkVuZCAtIGphdmFQb3NpdGlvblN0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiB4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKHgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKLQkJcmV0dXJuIGZDbGFzc25hbWU7Ci0JfQotCi0JLyoqCi0JICogTXVzdCBkaXNjYXJkIGNvbXBpbGF0aW9uIHVuaXQsIG9yIGVsc2UgdGhleSBjYW4gbGVhayBpbiB0aGUgSmF2YU1vZGVsTWFuYWdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCQotCQlzeW5jaHJvbml6ZWQoZkxvY2spIHsKLQkJCWlmKGZDb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoLSkgSlNQVHJhbnNsYXRpb24gWyIgKyB0aGlzICsiXSBkaXNjYXJkaW5nIENvbXBpbGF0aW9uVW5pdDogIiArIGZDb21waWxhdGlvblVuaXQpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLQkJCQkJfQotCQkJCQlmQ29tcGlsYXRpb25Vbml0LmRpc2NhcmRXb3JraW5nQ29weSgpOwkKLQkJCQl9IAotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkvLyB3ZSdyZSBkb25lIHcvIGl0IGFueXdheQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NzNhMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgZm9yIGdldHRpbmcgYSBKU1BUcmFuc2xhdGlvbiBvZiB0aGUgZG9jdW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIsIElEb2N1bWVudExpc3RlbmVyIHsKLQkKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWU9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkpzcERvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmSmF2YURvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGZKU1BUcmFuc2xhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZEb2N1bWVudElzRGlydHkgPSB0cnVlOwotCXByaXZhdGUgWE1MTW9kZWwgZlhNTE1vZGVsOwotCXByaXZhdGUgSlNQVHJhbnNsYXRvciBmVHJhbnNsYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBOdWxsUHJvZ3Jlc3NNb25pdG9yIGZUcmFuc2xhdGlvbk1vbml0b3IgPSBudWxsOwotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uQWRhcHRlcihYTUxNb2RlbCB4bWxNb2RlbCkgewotCQlzZXRYTUxNb2RlbCh4bWxNb2RlbCk7Ci0JCWluaXRpYWxpemVKYXZhUGx1Z2lucygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHJlcXVpcmVkIEphdmEgUGx1Z2lucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKYXZhUGx1Z2lucygpIHsKLQkJSmF2YUNvcmUuZ2V0UGx1Z2luKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTm9kZUFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTm9kZUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChjb20uaWJtLnNzZS5tb2RlbC5JTm9kZU5vdGlmaWVyLAotCSAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKioKLQkgKiBBdXRvbWF0aWNhbGx5IHNldCB0aHJvdWdoIHRoZSBzZXRYTUxNb2RlbChYTUxNb2RlbCkKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGZKc3BEb2N1bWVudCAhPSBudWxsKQotCQkJZkpzcERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJZG9jLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCQlmSnNwRG9jdW1lbnQgPSBkb2M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJLy8gbWFyayB0cmFuc2xhdGlvbiBmb3IgcmVidWlsZGluZwotCQlmRG9jdW1lbnRJc0RpcnR5ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLmVkaXRvci5JUmVsZWFzYWJsZSNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkKLQkJaWYoZkpzcERvY3VtZW50ICE9IG51bGwpCi0JCQlmSnNwRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJCi0JCWlmKGZUcmFuc2xhdGlvbk1vbml0b3IgIT0gbnVsbCkKLQkJCWZUcmFuc2xhdGlvbk1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQotCQlpZihmSlNQVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJCi0JCQlpZihERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUFRyYW5zbGF0aW9uQWRhcHRlciByZWxlYXNpbmc6IiArIGZKU1BUcmFuc2xhdGlvbik7Ci0JCQkKLQkJCWZKU1BUcmFuc2xhdGlvbi5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKU1BUcmFuc2xhdGlvbiBmb3IgdGhpcyBhZGFwdGVyLgotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UuZWRpdG9yLmpzcC5qYXZhLkpTUFRyYW5zbGF0aW9uCi0JICogQHJldHVybiBhIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBnZXRKU1BUcmFuc2xhdGlvbigpIHsKLQkJCi0JCWlmIChmSlNQVHJhbnNsYXRpb24gPT0gbnVsbCB8fCBmRG9jdW1lbnRJc0RpcnR5KSB7Ci0JCQlKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBudWxsOwotCQkJaWYgKGdldFhNTE1vZGVsKCkgIT0gbnVsbCAmJiBnZXRYTUxNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oMCkgIT0gbnVsbCkgewotCQkJCXRyYW5zbGF0b3IgPSBnZXRUcmFuc2xhdG9yKChYTUxOb2RlKSBnZXRYTUxNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oMCkpOwotCQkJCXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGphdmFDb250ZW50cyA9IHRyYW5zbGF0b3IuZ2V0VHJhbnNsYXRpb24oKTsKLQkJCQlmSmF2YURvY3VtZW50ID0gbmV3IERvY3VtZW50KGphdmFDb250ZW50cy50b1N0cmluZygpKTsKLQkJCQkKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVtcHR5IGRvY3VtZW50IGNhc2UKLQkJCQl0cmFuc2xhdG9yID0gbmV3IEpTUFRyYW5zbGF0b3IoKTsKLQkJCQlTdHJpbmdCdWZmZXIgZW1wdHlDb250ZW50cyA9IHRyYW5zbGF0b3IuZ2V0RW1wdHlUcmFuc2xhdGlvbigpOwotCQkJCWZKYXZhRG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoZW1wdHlDb250ZW50cy50b1N0cmluZygpKTsKLQkJCX0KLQkJCS8vIGl0J3MgZ29pbmcgdG8gYmUgcmVidWlsdCwgc28gd2UgcmVsZWFzZSBpdCBoZXJlCi0JCQlpZihmSlNQVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJCWlmKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUFRyYW5zbGF0aW9uQWRhcHRlciByZWxlYXNpbmc6IiArIGZKU1BUcmFuc2xhdGlvbik7Ci0JCQkJZkpTUFRyYW5zbGF0aW9uLnJlbGVhc2UoKTsKLQkJCX0KLQkJCWZKU1BUcmFuc2xhdGlvbiA9IG5ldyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbihnZXRYTUxNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBmSmF2YURvY3VtZW50LCBnZXRKYXZhUHJvamVjdCgpLCB0cmFuc2xhdG9yKTsKLQkJCWZEb2N1bWVudElzRGlydHkgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZkpTUFRyYW5zbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpTUFRyYW5zbGF0b3IgZm9yIHRoaXMgYWRhcHRlci4gSWYgaXQncyBudWxsLCBhIG5ldwotCSAqIHRyYW5zbGF0b3IgaXMgY3JlYXRlZCB3aXRoIHRoZSB4bWxOb2RlLiBPdGhlcndpc2UgdGhlCi0JICogdHJhbnNsYXRvci5yZXNldCh4bWxOb2RlKSBpcyBjYWxsZWQgdG8gcmVzZXQgdGhlIGN1cnJlbnQgbG9jYWwKLQkgKiB0cmFuc2xhdG9yLgotCSAqIAotCSAqIEBwYXJhbSB4bWxOb2RlCi0JICogICAgICAgICAgICB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgSlNQIGRvY3VtZW50IHRvIGJlIHRyYW5zbGF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBKU1BUcmFuc2xhdG9yIGZvciB0aGlzIGFkYXB0ZXIgKGNyZWF0ZXMgaWYgbnVsbCkKLQkgKi8KLQlwcml2YXRlIEpTUFRyYW5zbGF0b3IgZ2V0VHJhbnNsYXRvcihYTUxOb2RlIHhtbE5vZGUpIHsKLQkJaWYgKGZUcmFuc2xhdG9yID09IG51bGwpIHsKLQkJCWZUcmFuc2xhdGlvbk1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJZlRyYW5zbGF0b3IgPSBuZXcgSlNQVHJhbnNsYXRvcigpOwotCQkJZlRyYW5zbGF0b3IucmVzZXQoeG1sTm9kZSwgZlRyYW5zbGF0aW9uTW9uaXRvcik7Ci0JCX0KLQkJZWxzZQotCQkJZlRyYW5zbGF0b3IucmVzZXQoeG1sTm9kZSwgZlRyYW5zbGF0aW9uTW9uaXRvcik7Ci0JCXJldHVybiBmVHJhbnNsYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIFhNTE1vZGVsIGZvciB0aGlzIGFkYXB0ZXIuIE11c3QgYmUgY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSB4bWxNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhNTE1vZGVsKFhNTE1vZGVsIHhtbE1vZGVsKSB7Ci0JCWZYTUxNb2RlbCA9IHhtbE1vZGVsOwotCQlzZXREb2N1bWVudChmWE1MTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIFhNTE1vZGVsIGZvciB0aGlzIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIFhNTE1vZGVsIGdldFhNTE1vZGVsKCkgewotCQlyZXR1cm4gZlhNTE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEdldHMgKG9yIGNyZWF0ZXMgdmlhIEphdmFDb3JlKSBhIEphdmFQcm9qZWN0IGJhc2VkIG9uIHRoZSBsb2NhdGlvbiBvZgotCSAqIHRoaXMgYWRhcHRlcidzIFhNTE1vZGVsLiAgUmV0dXJucyBudWxsIGZvciBub24gSUZpbGUgYmFzZWQgbW9kZWxzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGphdmEgcHJvamVjdCB3aGVyZQotCSAqLwotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBnZXRYTUxNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpOwotCQkJLy8gMjAwNDExMjkgKHBhKSB0aGUgYmFzZSBsb2NhdGlvbiBjaGFuZ2VkIGZvciB4bWwgbW9kZWwgCi0JCQkvLyBiZWNhdXNlIG9mIEZpbGVCdWZmZXJzLCBzbyB0aGlzIGNvZGUgaGFkIHRvIGJlIHVwZGF0ZWQKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTY4NgotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJaWYgKGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCWZpbGUgPSByb290LmdldEZpbGUoZmlsZVBhdGgpOwotCQkJfQotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCX0KLS8vCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoYmFzZUxvY2F0aW9uKSk7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBwcm9qZWN0ID09IG51bGwgJiYgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQlpZiAoZmlsZXNbaV0uZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0vLwkJCQkJcHJvamVjdCA9IGZpbGVzW2ldLmdldFByb2plY3QoKTsKLS8vCQkJCQlicmVhazsKLS8vCQkJCX0KLS8vCQkJfQotCQkJaWYocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGdldFhNTE1vZGVsKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCIoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSBwcm9ibGVtIGdldHRpbmcgamF2YSBwcm9qZWN0IGZyb20gdGhlIFhNTE1vZGVsJ3MgYmFzZUxvY2F0aW9uID4gIiArIGdldFhNTE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIihKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHByb2JsZW0gZ2V0dGluZyBqYXZhIHByb2plY3QiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA5NWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIEpTUFRyYW5zbGF0aW9uQWRhcHRlcnMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIEpTUFRyYW5zbGF0aW9uQWRhcHRlciBmQWRhcHRlciA9IG51bGw7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWU9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5BZGFwdGVyRmFjdG9yeSNjb3B5KCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBYTUxOb2RlICYmIGZBZGFwdGVyID09IG51bGwpIHsKLQkJCWZBZGFwdGVyID0gbmV3IEpTUFRyYW5zbGF0aW9uQWRhcHRlcigoKFhNTE5vZGUpIHRhcmdldCkuZ2V0TW9kZWwoKSk7Ci0JCQlpZihERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgWyIgKyB0aGlzICsgIl0gY3JlYXRlZCBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLkFic3RyYWN0QWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLkFic3RyYWN0QWRhcHRlckZhY3RvcnkjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZBZGFwdGVyICE9IG51bGwpIHsKLQkJCWlmKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIoLSkgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBbIiArIHRoaXMgKyAiXSByZWxlYXNpbmcgYWRhcHRlcjogIiArIGZBZGFwdGVyKTsKLQkJCX0KLQkJCWZBZGFwdGVyLnJlbGVhc2UoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTUxZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi0KLS8qKgotICogQWRkcyB0aGUgbm90aW9uIG9mIElEb2N1bWVudHMgKGpzcCBEb2N1bWVudCBhbmQgamF2YSBEb2N1bWVudCkKLSAqIFVzZWQgZm9yIFRleHRFZGl0IHRyYW5zbGF0aW9uCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZXh0ZW5kcyBKU1BUcmFuc2xhdGlvbiB7Ci0JCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8vIGp1c3QgYSBjb252ZW5pZW5jZSBkYXRhIHN0cnVjdHVyZQotCS8vIHRvIGtlZXAgdHJhY2sgb2YgamF2YSBwb3NpdGlvbiBkZWx0YXMKLQlwcml2YXRlIGNsYXNzIFBvc2l0aW9uRGVsdGEgewotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkID0gZmFsc2U7Ci0JCXB1YmxpYyBpbnQgcHJlT2Zmc2V0ID0gMDsKLQkJcHVibGljIGludCBwcmVMZW5ndGggPSAwOwotCQlwdWJsaWMgaW50IHBvc3RPZmZzZXQgPSAwOwotCQlwdWJsaWMgaW50IHBvc3RMZW5ndGggPSAwOwotCQkKLQkJcHVibGljIFBvc2l0aW9uRGVsdGEoaW50IHByZU9mZnNldCwgaW50IHByZUxlbmd0aCkgewotCQkJdGhpcy5wcmVPZmZzZXQgPSBwcmVPZmZzZXQ7Ci0JCQl0aGlzLnByZUxlbmd0aCA9IHByZUxlbmd0aDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQb3N0RWRpdERhdGEoaW50IHBvc3RPZmZzZXQsIGludCBwb3N0TGVuZ3RoLCBib29sZWFuIGlzRGVsZXRlZCkgewotCQkJdGhpcy5wb3N0T2Zmc2V0ID0gcG9zdE9mZnNldDsKLQkJCXRoaXMucG9zdExlbmd0aCA9IHBvc3RMZW5ndGg7Ci0JCQl0aGlzLmlzRGVsZXRlZCA9IGlzRGVsZXRlZDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElEb2N1bWVudCBmSnNwRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSURvY3VtZW50IGZKYXZhRG9jdW1lbnQgPSBudWxsOwotCQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbihJRG9jdW1lbnQganNwRG9jdW1lbnQsIElEb2N1bWVudCBqYXZhRG9jdW1lbnQsIElKYXZhUHJvamVjdCBqYXZhUHJvaiwgSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKGphdmFQcm9qLCB0cmFuc2xhdG9yKTsKLQkJZkpzcERvY3VtZW50ID0ganNwRG9jdW1lbnQ7Ci0JCWZKYXZhRG9jdW1lbnQgPSBqYXZhRG9jdW1lbnQ7Ci0JCQotCQkvLyBtYWtlIHN1cmUgcG9zaXRpb25zIGFyZSBhZGRlZCB0byBKYXZhIGFuZCBKU1AgZG9jdW1lbnRzCi0JCS8vIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0ZXh0IGVkaXRzCi0JCWFkZFBvc2l0aW9uc1RvRG9jdW1lbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0SnNwRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmSnNwRG9jdW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0SmF2YURvY3VtZW50KCkgewotCQlyZXR1cm4gZkphdmFEb2N1bWVudDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVGV4dCgpIHsKLQkJcmV0dXJuIGdldEphdmFEb2N1bWVudCgpICE9IG51bGwgPyBnZXRKYXZhRG9jdW1lbnQoKS5nZXQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBjb3JyZXNwb25kaW5nIFRleHRFZGl0IGZvciB0aGUgSlNQIGZpbGUgZ2l2ZW4gYSBUZXh0RWRpdCBmb3IgYSBKYXZhIGZpbGUuCi0JICogTm90ZTogVGhpcyBtZXRob2QgYWN0dWFsbHkgYXBwbGllcyB0aGUgSmF2YSBlZGl0IHRvIHRoZSBpbnRlcm5hbCBKYXZhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBqYXZhRWRpdAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSlNQIGVkaXRzIChub3QgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgeWV0KQotCSAqLwotCXB1YmxpYyBUZXh0RWRpdCBnZXRKc3BFZGl0KFRleHRFZGl0IGphdmFFZGl0KSB7Ci0KLQkJTGlzdCBqc3BFZGl0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpbnQgb2Zmc2V0ID0gamF2YUVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBqYXZhRWRpdC5nZXRMZW5ndGgoKTsKLQkJCi0JCWlmKGphdmFFZGl0IGluc3RhbmNlb2YgTXVsdGlUZXh0RWRpdCAmJiBqYXZhRWRpdC5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkKLQkJCUlSZWdpb24gciA9IFRleHRFZGl0LmdldENvdmVyYWdlKGdldEFsbEVkaXRzKGphdmFFZGl0KSk7Ci0JCQlvZmZzZXQgPSByLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gci5nZXRMZW5ndGgoKTsKLQkJfQotCQkKLQkJLy8gZ2V0IGphdmEgcmFuZ2VzIHRoYXQgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGUgZWRpdAotCQlQb3NpdGlvbltdIGphdmFQb3NpdGlvbnMgPSBnZXRKYXZhUmFuZ2VzKG9mZnNldCwgbGVuZ3RoKTsKLQkJCi0JCS8vIHJlY29yZCBwb3NpdGlvbiBkYXRhIGJlZm9yZSB0aGUgY2hhbmdlCi0JCVBvc2l0aW9uW10ganNwUG9zaXRpb25zID0gbmV3IFBvc2l0aW9uW2phdmFQb3NpdGlvbnMubGVuZ3RoXTsKLQkJUG9zaXRpb25EZWx0YVtdIGRlbHRhcyA9IG5ldyBQb3NpdGlvbkRlbHRhW2phdmFQb3NpdGlvbnMubGVuZ3RoXTsKLQkJZm9yKGludCBpPTA7IGk8amF2YVBvc2l0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJZGVsdGFzW2ldID0gbmV3IFBvc2l0aW9uRGVsdGEoamF2YVBvc2l0aW9uc1tpXS5vZmZzZXQsIGphdmFQb3NpdGlvbnNbaV0ubGVuZ3RoKTsKLQkJCS8vIGlzSW5kaXJlY3QgbWVhbnMgdGhlIHBvc2l0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QgYXMgZXhhY3QgdGV4dCAKLQkJCS8vIG1hcHBpbmcgZnJvbSBqYXZhIDwtPiBqc3AgKGVnLiBhbiBpbXBvcnQgc3RhdGVtZW50KQotCQkJaWYoIWlzSW5kaXJlY3QoamF2YVBvc2l0aW9uc1tpXS5vZmZzZXQpKQotCQkJCWpzcFBvc2l0aW9uc1tpXSA9IChQb3NpdGlvbilnZXRKYXZhMkpzcE1hcCgpLmdldChqYXZhUG9zaXRpb25zW2ldKTsKLQkJfQotCi0JCWlmKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWx0YXM6Iik7Ci0JCQlTdHJpbmcgamF2YVRleHQgPSBnZXRKYXZhVGV4dCgpOwotCQkJZm9yKGludCBpPTA7IGk8ZGVsdGFzLmxlbmd0aDsgaSsrKSAKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInBvc1siICsgZGVsdGFzW2ldLnByZU9mZnNldCArICI6IiArIGRlbHRhc1tpXS5wcmVMZW5ndGggKyAiXSIgKyBqYXZhVGV4dC5zdWJzdHJpbmcoZGVsdGFzW2ldLnByZU9mZnNldCwgZGVsdGFzW2ldLnByZU9mZnNldCArIGRlbHRhc1tpXS5wcmVMZW5ndGgpICk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0JCX0KLQkJCi0JCS8vIGFwcGx5IHRoZSBlZGl0IHRvIHRoZSBqYXZhIGRvY3VtZW50Ci0JCXRyeSB7Ci0JCQlqYXZhRWRpdC5hcHBseShnZXRKYXZhRG9jdW1lbnQoKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQkvLyBub3cgYXQgdGhpcyBwb2ludCBKYXZhIHBvc2l0aW9ucyBhcmUgdW5yZWxpYWJsZSBzaW5jZSB0aGV5IHdlcmUgdXBkYXRlZCBhZnRlciBhcHBseWluZyBqYXZhIGVkaXQuCi0JCQotCQlTdHJpbmcgbmV3SmF2YVRleHQgPSBnZXRKYXZhRG9jdW1lbnQoKS5nZXQoKTsKLQkJaWYoREVCVUcpIAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJqYXZhIHBvc3QgZm9ybWF0IHRleHQ6XG4iICsgbmV3SmF2YVRleHQpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyByZWNvcmQgcG9zdCBlZGl0IGRhdGEKLQkJZm9yKGludCBpPTA7IGk8amF2YVBvc2l0aW9ucy5sZW5ndGg7IGkrKykKLQkJCWRlbHRhc1tpXS5zZXRQb3N0RWRpdERhdGEoamF2YVBvc2l0aW9uc1tpXS5vZmZzZXQsIGphdmFQb3NpdGlvbnNbaV0ubGVuZ3RoLCBqYXZhUG9zaXRpb25zW2ldLmlzRGVsZXRlZCk7Ci0JCQotCQkvLyBjcmVhdGUgYXBwcm9wcmlhdGUgdGV4dCBlZGl0cyBmb3IgZGVsdGFzCi0JCVBvc2l0aW9uIGpzcFBvcyA9IG51bGw7Ci0JCVN0cmluZyByZXBsYWNlVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvcihpbnQgaT0wOyBpPGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJanNwUG9zID0ganNwUG9zaXRpb25zW2ldOwotCQkJLy8gY2FuIGJlIG51bGwgaWYgaXQncyBhbiBpbmRpcmVjdCBtYXBwaW5nIHBvc2l0aW9uCi0JCQkvLyBvciBpZiBzb21ldGhpbmcgd2FzIGFkZGVkIGludG8gamF2YSB0aGF0IHdhcyBub3Qgb3JpZ2luYWxseSBpbiBKU1AgKGxpa2UgYSBuZXcgaW1wb3J0Li4uKQotCi0JCQlpZihqc3BQb3MgIT0gbnVsbCkgewotCQkJCWlmKGRlbHRhc1tpXS5pc0RlbGV0ZWQpIHsKLQkJCQkJanNwRWRpdHMuYWRkKG5ldyBEZWxldGVFZGl0KGpzcFBvcy5vZmZzZXQsIGpzcFBvcy5sZW5ndGgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlcGxhY2VUZXh0ID0gbmV3SmF2YVRleHQuc3Vic3RyaW5nKGRlbHRhc1tpXS5wb3N0T2Zmc2V0LCBkZWx0YXNbaV0ucG9zdE9mZnNldCArIGRlbHRhc1tpXS5wb3N0TGVuZ3RoKTsKLQkJCQkJanNwRWRpdHMuYWRkKG5ldyBSZXBsYWNlRWRpdChqc3BQb3Mub2Zmc2V0LCBqc3BQb3MubGVuZ3RoLCByZXBsYWNlVGV4dCkpOwotCQkJCX0KLQkJCQlpZihERUJVRykgCi0JCQkJCWRlYnVnUmVwbGFjZShkZWx0YXMsIGpzcFBvcywgcmVwbGFjZVRleHQsIGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhlIG5ldyBKYXZhIHRleHQgaGFzIG5vIGNvcnJlc3BvbmRpbmcgSlNQIHBvc2l0aW9uCi0JCQkJLy8gcG9zc2libGUgbmV3IGltcG9ydD8KLQkJCQlpZihpc0ltcG9ydChqYXZhUG9zaXRpb25zW2ldLmdldE9mZnNldCgpKSAmJiByZXBsYWNlVGV4dC5sYXN0SW5kZXhPZigiaW1wb3J0ICIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVwbGFjZVRleHQgPSBuZXdKYXZhVGV4dC5zdWJzdHJpbmcoZGVsdGFzW2ldLnBvc3RPZmZzZXQsIGRlbHRhc1tpXS5wb3N0T2Zmc2V0ICsgZGVsdGFzW2ldLnBvc3RMZW5ndGgpOwotCQkJCQlTdHJpbmcgaW1wb3J0VGV4dCA9IHJlcGxhY2VUZXh0LnN1YnN0cmluZyhyZXBsYWNlVGV4dC5sYXN0SW5kZXhPZigiaW1wb3J0ICIpLCByZXBsYWNlVGV4dC5pbmRleE9mKCI7IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLy8gZXZlbnV0YWxseSBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgWE1MLUpTUAotCQkJCQlpbXBvcnRUZXh0ID0gIjwlQHBhZ2UgaW1wb3J0PVwiIiArIGltcG9ydFRleHQgKyAiXCIgJT5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlqc3BFZGl0cy5hZGQobmV3IEluc2VydEVkaXQoMCwgaW1wb3J0VGV4dCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY3JlYXRlTXVsdGlUZXh0RWRpdCgoVGV4dEVkaXRbXSlqc3BFZGl0cy50b0FycmF5KG5ldyBUZXh0RWRpdFtqc3BFZGl0cy5zaXplKCldKSk7Ci0JfQotCQotCi0JLyoqCi0JICogQ29tYmluZXMgYW4gYXJyYXkgb2YgZWRpdHMgaW50byBvbmUgTXVsdGlUZXh0RWRpdCAod2l0aCB0aGUgYXBwcm9wcmlhdGUgY292ZXJhZ2UgcmVnaW9uKQotCSAqIEBwYXJhbSBlZGl0cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRleHRFZGl0IGNyZWF0ZU11bHRpVGV4dEVkaXQoVGV4dEVkaXRbXSBlZGl0cykgewotCQkKLQkJaWYoZWRpdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCQotCQlJUmVnaW9uIHJlZ2lvbiA9IFRleHRFZGl0LmdldENvdmVyYWdlKGVkaXRzKTsKLQkJTXVsdGlUZXh0RWRpdCBtdWx0aUVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdHMubGVuZ3RoOyBpKyspIHsKLQkJCWFkZFRvTXVsdGlFZGl0KGVkaXRzW2ldLCBtdWx0aUVkaXQpOwotCQl9Ci0JCXJldHVybiBtdWx0aUVkaXQ7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBhZGRUb011bHRpRWRpdChUZXh0RWRpdCBlZGl0LCBNdWx0aVRleHRFZGl0IG11bHRpRWRpdCkgewotCQkKLQkJLy8gY2hlY2sgZm9yIG92ZXJsYXAgaGVyZQotCQkvLyBkaXNjYXJkIG92ZXJsYXBwaW5nIGVkaXRzLi4KLQkJLy8gcG9zc2libGUgZXhwb25lbnRpYWwgcGVyZm9ybWFuY2UgaGl0Li4uIG5lZWQgYSBiZXR0ZXIgd2F5Li4uCi0JCVRleHRFZGl0W10gY2hpbGRyZW4gPSBtdWx0aUVkaXQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYoY2hpbGRyZW5baV0uY292ZXJzKGVkaXQpKQotCQkJCS8vIGRvbid0IGFkZAotCQkJCXJldHVybjsKLQkJfQotCQltdWx0aUVkaXQuYWRkQ2hpbGQoZWRpdCk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBwYXJhbSB0cmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQb3NpdGlvbnNUb0RvY3VtZW50cygpIHsKLQkJCi0JCS8vIGNhbiBiZSBudWxsIGlmIGl0J3MgYSBOdWxsSlNQVHJhbnNsYXRpb24KLQkJaWYoZ2V0SmF2YURvY3VtZW50KCkgIT0gbnVsbCAmJiBnZXRKc3BEb2N1bWVudCgpICE9IG51bGwpIHsKLQotCQkJSGFzaE1hcCBqYXZhMmpzcCA9IGdldEphdmEySnNwTWFwKCk7Ci0JCQlJdGVyYXRvciBpdCA9IGphdmEyanNwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlQb3NpdGlvbiBqYXZhUG9zID0gbnVsbDsKLQkJCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJCWphdmFQb3MgPShQb3NpdGlvbilpdC5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJCi0JCQkJCWZKYXZhRG9jdW1lbnQuYWRkUG9zaXRpb24oamF2YVBvcyk7Ci0JCQkJCQotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHlyaW5nIHRvIGFkZCBKYXZhIFBvc2l0aW9uOlsiICsgamF2YVBvcy5vZmZzZXQgKyAiOiIgKyBqYXZhUG9zLmxlbmd0aCArICJdIHRvICIgKyBnZXRKYXZhUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQJCQkJCQotCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInN1YnN0cmluZyA6WyIgKyBmSmF2YURvY3VtZW50LmdldCgpLnN1YnN0cmluZyhqYXZhUG9zLm9mZnNldCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJCi0JCQkJCWZKc3BEb2N1bWVudC5hZGRQb3NpdGlvbigoUG9zaXRpb24pamF2YTJqc3AuZ2V0KGphdmFQb3MpKTsKLQkJCQkJCi0JCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlpZihERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0eXJpbmcgdG8gYWRkIEpTUCBQb3NpdGlvbjpbIiArICgoUG9zaXRpb24pamF2YTJqc3AuZ2V0KGphdmFQb3MpKS5vZmZzZXQgKyAiOiIgKygoUG9zaXRpb24pamF2YTJqc3AuZ2V0KGphdmFQb3MpKS5sZW5ndGggKyAiXSB0byAiICsgZ2V0SmF2YVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGdldHMgYWxsIGNoaWxkIGVkaXRzCi0JICogQHBhcmFtIGphdmFFZGl0Ci0JICogQHJldHVybiBhbGwgY2hpbGQgZWRpdHMKLQkgKi8KLQlwcml2YXRlIFRleHRFZGl0W10gZ2V0QWxsRWRpdHMoVGV4dEVkaXQgamF2YUVkaXQpIHsKLQkJCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZihqYXZhRWRpdCBpbnN0YW5jZW9mIE11bHRpVGV4dEVkaXQpIHsKLQkJCVRleHRFZGl0W10gY2hpbGRyZW4gPSBqYXZhRWRpdC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgCi0JCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGdldEFsbEVkaXRzKGNoaWxkcmVuW2ldKSkpOwotCQl9Ci0JCWVsc2UgCi0JCQlyZXN1bHQuYWRkKGphdmFFZGl0KTsKLQkJcmV0dXJuIChUZXh0RWRpdFtdKXJlc3VsdC50b0FycmF5KG5ldyBUZXh0RWRpdFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlbHRhcwotCSAqIEBwYXJhbSBqc3BQb3MKLQkgKiBAcGFyYW0gcmVwbGFjZVRleHQKLQkgKiBAcGFyYW0ganNwVGV4dAotCSAqIEBwYXJhbSBpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlYnVnUmVwbGFjZShQb3NpdGlvbkRlbHRhW10gZGVsdGFzLCBQb3NpdGlvbiBqc3BQb3MsIFN0cmluZyByZXBsYWNlVGV4dCwgaW50IGkpIHsKLQkJU3RyaW5nIGpzcENodW5rOwotCQlqc3BDaHVuayA9IGdldEpzcERvY3VtZW50KCkuZ2V0KCkuc3Vic3RyaW5nKGpzcFBvcy5vZmZzZXQsIGpzcFBvcy5vZmZzZXQgKyBqc3BQb3MubGVuZ3RoKTsKLQkJaWYoIWRlbHRhc1tpXS5pc0RlbGV0ZWQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVwbGFjaW5nOiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImpzcDpbIiArIGpzcENodW5rICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIncvIDpbIiArIHJlcGxhY2VUZXh0ICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvblV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiNTFmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5Db3B5U291cmNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkNvcHlUYXJnZXRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5Nb3ZlU291cmNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1vdmVUYXJnZXRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLQotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uVXRpbCB7Ci0JcHJvdGVjdGVkIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByb3RlY3RlZCBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBmVHJhbnNsYXRpb24gPSBudWxsOwotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uVXRpbChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IHRyYW5zbGF0ZVRleHRFZGl0KFRleHRFZGl0IHRleHRFZGl0KSB7Ci0JCVRleHRFZGl0IHRyYW5zbGF0ZWRUZXh0RWRpdCA9IG51bGw7Ci0KLQkJaW50IGphdmFPZmZzZXQgPSB0ZXh0RWRpdC5nZXRPZmZzZXQoKTsKLQkJaW50IGpzcE9mZnNldCA9IGdldFRyYW5zbGF0aW9uKCkuZ2V0SnNwT2Zmc2V0KHRleHRFZGl0LmdldE9mZnNldCgpKTsKLQkJaW50IGxlbmd0aCA9IHRleHRFZGl0LmdldExlbmd0aCgpOwotCi0JCWlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIE11bHRpVGV4dEVkaXQpIHsKLQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQlUZXh0RWRpdFtdIGNoaWxkcmVuID0gKChNdWx0aVRleHRFZGl0KSB0ZXh0RWRpdCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlUZXh0RWRpdCB0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCA9IHRyYW5zbGF0ZVRleHRFZGl0KGNoaWxkcmVuW2ldKTsKLQkJCQlpZiAodHJhbnNsYXRlZENoaWxkVGV4dEVkaXQgIT0gbnVsbCkKLQkJCQkJKChNdWx0aVRleHRFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLmFkZENoaWxkKHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0KTsKLQkJCX0KLQkJfSBlbHNlIGlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIFJlcGxhY2VFZGl0KSB7Ci0JCQlpZiAoanNwT2Zmc2V0ID09IC0xKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlpZiAoIWdldFRyYW5zbGF0aW9uKCkuamF2YVNwYW5zTXVsdGlwbGVKc3BQYXJ0aXRpb25zKGphdmFPZmZzZXQsIGxlbmd0aCkpCi0JCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IFJlcGxhY2VFZGl0KGpzcE9mZnNldCwgbGVuZ3RoLCAoKFJlcGxhY2VFZGl0KSB0ZXh0RWRpdCkuZ2V0VGV4dCgpKTsKLQkJfSBlbHNlIGlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIEluc2VydEVkaXQpIHsKLQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBJbnNlcnRFZGl0KGpzcE9mZnNldCwgKChJbnNlcnRFZGl0KSB0ZXh0RWRpdCkuZ2V0VGV4dCgpKTsKLQkJfSBlbHNlIGlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIERlbGV0ZUVkaXQpIHsKLQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBEZWxldGVFZGl0KGpzcE9mZnNldCwgbGVuZ3RoKTsKLQkJCVRleHRFZGl0W10gY2hpbGRyZW4gPSAoKERlbGV0ZUVkaXQpIHRleHRFZGl0KS5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCVRleHRFZGl0IHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0ID0gdHJhbnNsYXRlVGV4dEVkaXQoY2hpbGRyZW5baV0pOwotCQkJCWlmICh0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCAhPSBudWxsKQotCQkJCQkoKERlbGV0ZUVkaXQpIHRyYW5zbGF0ZWRUZXh0RWRpdCkuYWRkQ2hpbGQodHJhbnNsYXRlZENoaWxkVGV4dEVkaXQpOwotCQkJfQotCQl9IGVsc2UgaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgQ29weVNvdXJjZUVkaXQpIHsKLQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBDb3B5U291cmNlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCk7Ci0JCQkoKENvcHlTb3VyY2VFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLnNldFRhcmdldEVkaXQoKChDb3B5U291cmNlRWRpdCkgdGV4dEVkaXQpLmdldFRhcmdldEVkaXQoKSk7Ci0JCQkoKENvcHlTb3VyY2VFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLnNldFNvdXJjZU1vZGlmaWVyKCgoQ29weVNvdXJjZUVkaXQpIHRleHRFZGl0KS5nZXRTb3VyY2VNb2RpZmllcigpKTsKLQkJfSBlbHNlIGlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIENvcHlUYXJnZXRFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgQ29weVRhcmdldEVkaXQoanNwT2Zmc2V0KTsKLQkJCSgoQ29weVRhcmdldEVkaXQpIHRleHRFZGl0KS5nZXRTb3VyY2VFZGl0KCkuc2V0VGFyZ2V0RWRpdCgoQ29weVRhcmdldEVkaXQpIHRyYW5zbGF0ZWRUZXh0RWRpdCk7Ci0JCX0gZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBNb3ZlU291cmNlRWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IE1vdmVTb3VyY2VFZGl0KGpzcE9mZnNldCwgbGVuZ3RoKTsKLQkJCSgoTW92ZVNvdXJjZUVkaXQpIHRyYW5zbGF0ZWRUZXh0RWRpdCkuc2V0VGFyZ2V0RWRpdCgoKE1vdmVTb3VyY2VFZGl0KSB0ZXh0RWRpdCkuZ2V0VGFyZ2V0RWRpdCgpKTsKLQkJfSBlbHNlIGlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIE1vdmVUYXJnZXRFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgTW92ZVRhcmdldEVkaXQoanNwT2Zmc2V0KTsKLQkJCSgoTW92ZVRhcmdldEVkaXQpIHRleHRFZGl0KS5nZXRTb3VyY2VFZGl0KCkuc2V0VGFyZ2V0RWRpdCgoTW92ZVRhcmdldEVkaXQpIHRyYW5zbGF0ZWRUZXh0RWRpdCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5lZWQgdG8gdHJhbnNsYXRlICIgKyB0ZXh0RWRpdCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiB0cmFuc2xhdGVkVGV4dEVkaXQ7Ci0JfQotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGdldFRyYW5zbGF0aW9uKCkgewotCQlpZiAoZlRyYW5zbGF0aW9uID09IG51bGwpIHsKLQkJCVhNTE1vZGVsIHhtbE1vZGVsID0gKFhNTE1vZGVsKSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJdHJ5IHsKLQkJCQlYTUxEb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCi0JCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyIHRyYW5zbGF0aW9uQWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJaWYgKHRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKQotCQkJCQlmVHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIGdldFRyYW5zbGF0aW9uKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmVlN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExEVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jb250ZW50bW9kZWwuQ01Eb2N1bWVudFRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnRtb2RlbC5DTU5vZGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi0vKioKLSAqIFRyYW5zbGF0ZXMgYSBKU1AgZG9jdW1lbnQgaW50byBhIEh0dHBTZXJ2bGV0LgotICogS2VlcHMgdHdvIHdheSBtYXBwaW5nIGZyb20gamF2YSB0cmFuc2xhdGlvbiB0byB0aGUgb3JpZ2luYWwgSlNQIHNvdXJjZSwgd2hpY2gKLSAqIGNhbiBiZSBvYnRhaW5lZCB0aHJvdWdoIGdldEphdmEySnNwUmFuZ2VzKCkgYW5kIGdldEpzcDJKYXZhUmFuZ2VzKCkuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdG9yIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRMID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU3RyaW5nIGZDbGFzc0hlYWRlciA9ICJwdWJsaWMgY2xhc3MgX0pTUFNlcnZsZXQgZXh0ZW5kcyAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzbmFtZSA9ICJfSlNQU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFN0cmluZyBmU2VydmljZUhlYWRlciA9ICJwdWJsaWMgdm9pZCBfanNwU2VydmljZShqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiXHRcdHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24ge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQgcGFnZUNvbnRleHQgPSBudWxsO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uIHNlc3Npb24gPSBudWxsO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbiA9IG51bGw7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWcgY29uZmlnID0gbnVsbDtcbiIgKyAvLyROT04tTkxTLTEkIAotCQkJCSJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXIgb3V0ID0gbnVsbDtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIk9iamVjdCBwYWdlID0gbnVsbDsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBmRm9vdGVyID0gIn19IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZFeGNlcHRpb24gPSAiVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IG51bGw7IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fUFJFRklYID0gIm91dC5wcmludChcIlwiKyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1NVRkZJWCA9ICIpOyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBmU3VwZXJjbGFzcyA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogZlNvdXJjZVBvc2l0aW9uID0gcG9zaXRpb24gaW4gSlNQIHNvdXJjZSovCi0JcHJpdmF0ZSBpbnQgZlNvdXJjZVBvc2l0aW9uID0gLTE7Ci0JLyoqIGZSZWxhdGl2ZU9mZmVzdCA9IG9mZnNldCBpbiB0aGUgYnVmZmVyIHRoZXJlIHRoZSBjdXJzb3IgaXMgKi8KLQlwcml2YXRlIGludCBmUmVsYXRpdmVPZmZzZXQgPSAtMTsKLQkvKiogZkN1cnNvclBvc2l0aW9uID0gb2Zmc2V0IGluIHRoZSB0cmFuc2xhdGVkIGphdmEgZG9jdW1lbnQgKi8KLQlwcml2YXRlIGludCBmQ3Vyc29yUG9zaXRpb24gPSAtMTsKLQkvKiogc29tZSBwYWdlIGRpcmVjdGl2ZSBhdHRyaWJ1dGVzICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Vycm9yUGFnZSwgZkN1cnNvckluRXhwcmVzc2lvbiA9IGZhbHNlOwotCi0JLyoqIHVzZXIgamF2YSBjb2RlIGluIGJvZHkgb2YgdGhlIHNlcnZpY2UgbWV0aG9kICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlVzZXJDb2RlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8qKiB1c2VyIGRlZmluZWQgdmFycyBkZWNsYXJlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGFzcyAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZVc2VyRGVjbGFyYXRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8qKiB1c2VyIGRlZmluZWQgaW1wb3J0cyAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZVc2VySW1wb3J0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZJbXBvcnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOyAvLyBpbXBvcnRzCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlJlc3VsdDsgLy8gdGhlIGZpbmFsIHRyYXNsYXRlZCBqYXZhIGRvY3VtZW50IHN0cmluZyBidWZmZXIKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQ3Vyc29yT3duZXIgPSBudWxsOyAvLyB0aGUgYnVmZmVyIHdoZXJlIHRoZSBjdXJzb3IgaXMKLQotCXByaXZhdGUgWE1MTW9kZWwgZlN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgTW9kZWxRdWVyeSBmTW9kZWxRdWVyeSA9IG51bGw7Ci0JLy9wcml2YXRlIFhNTE5vZGUgZlBvc2l0aW9uTm9kZTsgLy8gcG9zaXRpb24gaW4gdGhlIERPTQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGU7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbkNvZGVSZWdpb24gPSBmYWxzZTsgLy8gZmxhZyBmb3IgaWYgY3Vyc29yIGlzIGluIHRoZSBjdXJyZW50IHJlZ2lvbiBiZWluZyB0cmFuc2xhdGVkCi0KLQkvKioKLQkgKiB0aGVzZSBjb25zdGFudHMgYXJlIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgY29kZSBpbiBxdWVzdGlvbiAKLQkgKiBpcyBlbWJlZGRlZCAoSlNQIGFzIGFuIGF0dHJpYnV0ZSBvciB3aXRoaW4gY29tbWVudCB0YWdzKQotCSAqIG9yIGlzIGp1c3Qgc3RhbmRhcmQgSlNQIGNvZGUsIG9yIGlkZW50aWZpZXMgaWYgaXQncyBhbiBleHByZXNzaW9uIAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFNUQU5EQVJEX0pTUCA9IDA7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgRU1CRURERURfSlNQID0gMTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBERUNMQVJBVElPTiA9IDI7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgRVhQUkVTU0lPTiA9IDQ7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU0NSSVBUTEVUID0gODsKLQotCS8qKiB1c2VkIHRvIGF2b2lkIGluZmluaXRlIGxvb3BpbmcgaW5jbHVkZSBmaWxlcyAqLwotCXByaXZhdGUgU3RhY2sgZkluY2x1ZGVzID0gbnVsbDsKLQkvKiogbW9zdGx5IGZvciBoZWxwZXIgY2xhc3Nlcywgc28gdGhleSBwYXJzZSBjb3JyZWN0bHkgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBmQmxvY2tNYXJrZXJzID0gbnVsbDsKLQkvKiogdXNlIG9ubHkgb25lIGluY2x1ZSBoZWxwZXIgcGVyIGZpbGUgbG9jYXRpb24gKi8KLQlwcml2YXRlIEhhc2hNYXAgZkpTUEluY2x1ZGVIZWxwZXJNYXAgPSBudWxsOwotCS8qKiBmb3Iga2VlcGluZyB0cmFjayBvZiBvZmZzZXQgaW4gdXNlciBidWZmZXJzIHdoaWxlIGRvY3VtZW50IGlzIGJlaW5nIGJ1aWx0Ki8KLQlwcml2YXRlIGludCBmT2Zmc2V0SW5Vc2VySW1wb3J0cyA9IDA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucyA9IDA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckNvZGUgPSAwOwotCi0JLyoqIGNvcnJlbGF0ZXMgcmFuZ2VzIChwb3NpdGlvbnMpIGluIGphdmEgdG8gcmFuZ2VzIGluIGpzcCAqLwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqIG1hcCBvZiByYW5nZXMgaW4gZlVzZXJJbXBvcnRzIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlcikgdG8gcmFuZ2VzIGluIHNvdXJjZSBKU1AgYnVmZmVyLiAqLwotCXByaXZhdGUgSGFzaE1hcCBmSW1wb3J0UmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQkvKiogbWFwIG9mIHJhbmdlcyBpbiBmVXNlckNvZGUgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyKSB0byByYW5nZXMgaW4gc291cmNlIEpTUCBidWZmZXIuICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZDb2RlUmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQkvKiogbWFwIG9mIHJhbmdlcyBpbiBmVXNlckRlY2xhcmF0aW9ucyAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIpIHRvIHJhbmdlcyBpbiBzb3VyY2UgSlNQIGJ1ZmZlci4gKi8KLQlwcml2YXRlIEhhc2hNYXAgZkRlY2xhcmF0aW9uUmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBmVXNlQmVhblJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JLyoqIHJhbmdlcyB0aGF0IGRvbid0IGRpcmVjdGx5IG1hcCBmcm9tIGphdmEgY29kZSB0byBKU1AgY29kZSAoZWcuIDwlQGluY2x1ZGUgZmlsZT0iaW5jbHVkZWQuanNwIiU+ICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbmRpcmVjdFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCQotCS8qKiAKLQkgKiBzYXZlIEpTUCBkb2N1bWVudCB0ZXh0IGZvciBsYXRlciB1c2UgCi0JICogbWF5IGp1c3Qgd2FudCB0byByZWFkIHRoaXMgZnJvbSB0aGUgZmlsZSBvciBzdHJ1Y2R0dXJlZCBkb2N1bWVudCBkZXBlbmRpbmcgd2hhdCBpcyBhdmFpbGFibGUKLQkgKiAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZKc3BUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQotCS8qKiAKLQkgKiBCaXRzIGluZGljYXRlcyB3aGF0IHN0YXRlIHRoZSB0cmFuc2xhdG9yIGlzIGluCi0JICogdXNlIHN0YXRlTWFzayB8IE1BU0sgdG8gc2V0Ci0JICogdXNlIChzdGF0ZU1hc2sgJiBNQVNLKSA9PSBNQVNLIHRvIGNoZWNrCi0JICogVVNFIHN0YXRlTWFzayAKLQkgKi8KLQkKLQkvKiogbm8gc3RhdGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX05PTkUgPSAwOwotCQotCS8qKgotCSAqIGNvbmZpZ3VyZSB1c2luZyBhbiBYTUxOb2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmUoWE1MTm9kZSBub2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCQlmU3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkvL2ZQb3NpdGlvbk5vZGUgPSBub2RlOwotCQkKLQkJZk1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQotCQlTdHJpbmcgY2xhc3NOYW1lID0gY3JlYXRlQ2xhc3NuYW1lKG5vZGUpOwotCQlpZiAoY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJc2V0Q2xhc3NuYW1lKGNsYXNzTmFtZSk7Ci0JCQlmQ2xhc3NIZWFkZXIgPSAicHVibGljIGNsYXNzICIgKyBjbGFzc05hbWUgKyAiIGV4dGVuZHMgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogbWVtb3J5IHNhdmluZyBjb25maWd1cmUgKG5vIFN0cnVjdHVyZWREb2N1bWVudCBpbiBtZW1vcnkpCi0JICogY3VycmVudGx5IGRvZXNuJ3QgaGFuZGxlIGluY2x1ZGVkIGZpbGVzCi0JICogCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmUoSUZpbGUganNwRmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIHdoZW4gY29uZmlndXJlZCBvbiBhIGZpbGUKLQkJLy8gZlN0cnVjdHVyZWRNb2RlbCwgZlBvc2l0aW9uTm9kZSwgZk1vZGVsUXVlcnksIGZTdHJ1Y3R1cmVkRG9jdW1lbnQgYXJlIGFsbCBudWxsCi0JCQotCQlmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQkJCi0JCVN0cmluZyBjbGFzc05hbWUgPSBjcmVhdGVDbGFzc25hbWUoanNwRmlsZSk7Ci0JCWlmIChjbGFzc05hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzZXRDbGFzc25hbWUoY2xhc3NOYW1lKTsKLQkJCWZDbGFzc0hlYWRlciA9ICJwdWJsaWMgY2xhc3MgIiArIGNsYXNzTmFtZSArICIgZXh0ZW5kcyAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUganNwIHRleHQgZnJvbSBhbiBJRmlsZQotCSAqIEBwYXJhbSBqc3BGaWxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEpzcFRleHQoSUZpbGUganNwRmlsZSkgewotCQl0cnkgewotCQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGpzcEZpbGUuZ2V0Q29udGVudHMoKSk7Ci0JCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0JCSAgICBTdHJpbmcgbGluZSA9IG51bGw7IAotCQkgICAgd2hpbGUgKChsaW5lPXJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKXsgCi0JCSAgICAJZkpzcFRleHRCdWZmZXIuYXBwZW5kKGxpbmUpOwotCQkgICAgCWZKc3BUZXh0QnVmZmVyLmFwcGVuZChFTkRMKTsKLQkJICAgIH0gCi0JCSAgICByZWFkZXIuY2xvc2UoKTsgCi0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlQ2xhc3NuYW1lKFhNTE5vZGUgbm9kZSkgewotCQkKLQkJU3RyaW5nIGNsYXNzbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyBiYXNlID0gbm9kZS5nZXRNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpOwotCQkJY2xhc3NuYW1lID0gSlNQMlNlcnZsZXROYW1lVXRpbC5tYW5nbGUoYmFzZSk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVDbGFzc25hbWUoSUZpbGUganNwRmlsZSkgewotCQkKLQkJU3RyaW5nIGNsYXNzbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmKGpzcEZpbGUgIT0gbnVsbCkgewotCQkJY2xhc3NuYW1lID0gSlNQMlNlcnZsZXROYW1lVXRpbC5tYW5nbGUoanNwRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBjbGFzc25hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7Ci0JCXRoaXMuZkNsYXNzbmFtZSA9IGNsYXNzbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZkNsYXNzbmFtZSAhPSBudWxsID8gdGhpcy5mQ2xhc3NuYW1lIDogIkdlbmVyaWNKc3BTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNvIHRoYXQgdGhlIEpTUFRyYW5zbGF0b3IgY2FuIGJlIHJldXNlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChYTUxOb2RlIG5vZGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKLQkJCi0JCS8vIGluaXRpYWxpemUgc29tZSB0aGluZ3Mgb24gbm9kZQotCQljb25maWd1cmUobm9kZSwgcHJvZ3Jlc3MpOwotCQlyZXNldCgpOwotCQkvLyBzZXQgdGhlIGpzcCB0ZXh0IGJ1ZmZlcgotCQlmSnNwVGV4dEJ1ZmZlci5hcHBlbmQoZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0JfQotCQotCS8qKgotCSAqIGNvbnNlcnZhdGl2ZSB2ZXJzaW9uIChubyBTdHJ1Y3R1cmVkRG9jdW1lbnQvTW9kZWwpCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKiBAcGFyYW0gcHJvZ3Jlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChJRmlsZSBqc3BGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7Ci0JCQotCQkvLyBpbml0aWFsaXplIHNvbWUgdGhpbmdzIG9uIG5vZGUKLQkJY29uZmlndXJlKGpzcEZpbGUsIHByb2dyZXNzKTsKLQkJcmVzZXQoKTsKLQkJLy8gc2V0IHRoZSBqc3AgdGV4dCBidWZmZXIKLQkJc2V0SnNwVGV4dChqc3BGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWluaXRpYWxpemUgc29tZSBmaWVsZHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCQotCQkvLyByZXNldCBwcm9ncmVzcyBtb25pdG9yCi0JCWlmIChmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQlmUHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKGZhbHNlKTsKLQotCQkvLyByZWluaXQgZmllbGRzCi0JCWZTb3VyY2VQb3NpdGlvbiA9IC0xOwotCQlmUmVsYXRpdmVPZmZzZXQgPSAtMTsKLQkJZkN1cnNvclBvc2l0aW9uID0gLTE7Ci0KLQkJZklzRXJyb3JQYWdlID0gZkN1cnNvckluRXhwcmVzc2lvbiA9IGZhbHNlOwotCi0JCWZVc2VyQ29kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZlVzZXJEZWNsYXJhdGlvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZVc2VySW1wb3J0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmSW1wb3J0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsgLy8gaW1wb3J0cwotCQlmUmVzdWx0ID0gbnVsbDsKLQkJZkN1cnNvck93bmVyID0gbnVsbDsgLy8gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgY3Vyc29yIGlzCi0KLQkJZkN1cnJlbnROb2RlID0gbnVsbDsKLQkJZkluQ29kZVJlZ2lvbiA9IGZhbHNlOyAvLyBmbGFnIGZvciBpZiBjdXJzb3IgaXMgaW4gdGhlIGN1cnJlbnQgcmVnaW9uCi0JCQkJCQkJICAvLyBiZWluZyB0cmFuc2xhdGVkCi0KLQkJaWYgKGZJbmNsdWRlcyAhPSBudWxsKQotCQkJZkluY2x1ZGVzLmNsZWFyKCk7Ci0KLQkJZkJsb2NrTWFya2VycyA9IG51bGw7Ci0KLQkJZkpTUEluY2x1ZGVIZWxwZXJNYXAgPSBudWxsOwotCi0JCWZPZmZzZXRJblVzZXJJbXBvcnRzID0gMDsKLQkJZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucyA9IDA7Ci0JCWZPZmZzZXRJblVzZXJDb2RlID0gMDsKLQotCQlmSmF2YTJKc3BSYW5nZXMuY2xlYXIoKTsKLQkJZkltcG9ydFJhbmdlcy5jbGVhcigpOwotCQlmQ29kZVJhbmdlcy5jbGVhcigpOwotCQlmVXNlQmVhblJhbmdlcy5jbGVhcigpOwotCQlmRGVjbGFyYXRpb25SYW5nZXMuY2xlYXIoKTsKLQkJZkluZGlyZWN0UmFuZ2VzLmNsZWFyKCk7Ci0JCQotCQlmSnNwVGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBqdXN0IHRoZSAic2hlbGwiIG9mIGEgc2VydmxldCwgbm90aGluZyBjb250cmlidXRlZCBmcm9tIHRoZSBKU1AgZG9jCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBnZXRFbXB0eVRyYW5zbGF0aW9uKCkgewotCQlyZXNldCgpOwotCQlidWlsZFJlc3VsdCgpOwotCQlyZXR1cm4gZ2V0VHJhbnNsYXRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogcHV0IHRoZSBmaW5hbCBqYXZhIGRvY3VtZW50IHRvZ2V0aGVyCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGJ1aWxkUmVzdWx0KCkgewotCQkvLyB0byBidWlsZCB0aGUgamF2YSBkb2N1bWVudCB0aGlzIGlzIHRoZSBvcmRlcjoKLQkJLy8gCi0JCS8vICsgZGVmYXVsdCBpbXBvcnRzCi0JCS8vICsgdXNlciBpbXBvcnRzCi0JCS8vICsgY2xhc3MgaGVhZGVyCi0JCS8vIFsrIGVycm9yIHBhZ2VdCi0JCS8vICsgdXNlciBkZWNsYXJhdGlvbnMKLQkJLy8gKyBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIKLQkJLy8gKyB1c2VyIGNvZGUKLQkJLy8gKyBzZXJ2aWNlIG1ldGhvZCBmb290ZXIKLQkJZlJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoZkltcG9ydHMubGVuZ3RoKCkgKyBmVXNlckRlY2xhcmF0aW9ucy5sZW5ndGgoKSArIGZVc2VyQ29kZS5sZW5ndGgoKSArIDIwNDgpOwotCQlpbnQgamF2YU9mZnNldCA9IDA7Ci0KLQkJLy8gZGVmYXVsdCBpbXBvcnRzCi0JCWFwcGVuZChmSW1wb3J0cyk7Ci0JCWphdmFPZmZzZXQgKz0gZkltcG9ydHMubGVuZ3RoKCk7Ci0JCXVwZGF0ZVJhbmdlcyhmSW1wb3J0UmFuZ2VzLCBqYXZhT2Zmc2V0KTsKLQkJCi0JCS8vdXBkYXRlUmFuZ2VzKGZJbmRpcmVjdEltcG9ydHMsIGphdmFPZmZzZXQpOwotCQkvLyB1c2VyIGltcG9ydHMKLQkJYXBwZW5kKGZVc2VySW1wb3J0cyk7Ci0JCWphdmFPZmZzZXQgKz0gZlVzZXJJbXBvcnRzLmxlbmd0aCgpOwotCi0JCS8vIGNsYXNzIGhlYWRlcgotCQlmUmVzdWx0LmFwcGVuZChmQ2xhc3NIZWFkZXIpOyAvLyROT04tTkxTLTEkCi0JCWphdmFPZmZzZXQgKz0gZkNsYXNzSGVhZGVyLmxlbmd0aCgpOwotCQlmUmVzdWx0LmFwcGVuZChmU3VwZXJjbGFzcyArICJ7XG4iKTsgLy8kTk9OLU5MUy0xJAotCQlqYXZhT2Zmc2V0ICs9IGZTdXBlcmNsYXNzLmxlbmd0aCgpICsgMjsKLQotCQl1cGRhdGVSYW5nZXMoZkRlY2xhcmF0aW9uUmFuZ2VzLCBqYXZhT2Zmc2V0KTsKLQkJLy8gdXNlciBkZWNsYXJhdGlvbnMKLQkJYXBwZW5kKGZVc2VyRGVjbGFyYXRpb25zKTsKLQkJamF2YU9mZnNldCArPSBmVXNlckRlY2xhcmF0aW9ucy5sZW5ndGgoKTsKLQotCQlmUmVzdWx0LmFwcGVuZChmU2VydmljZUhlYWRlcik7Ci0JCWphdmFPZmZzZXQgKz0gZlNlcnZpY2VIZWFkZXIubGVuZ3RoKCk7Ci0JCS8vIGVycm9yIHBhZ2UgICAgICAKLQkJaWYgKGZJc0Vycm9yUGFnZSkgewotCQkJZlJlc3VsdC5hcHBlbmQoZkV4Y2VwdGlvbik7Ci0JCQlqYXZhT2Zmc2V0ICs9IGZFeGNlcHRpb24ubGVuZ3RoKCk7Ci0JCX0KLQkJdXBkYXRlUmFuZ2VzKGZDb2RlUmFuZ2VzLCBqYXZhT2Zmc2V0KTsKLQkJCi0JCS8vIHVzZXIgY29kZQotCQlhcHBlbmQoZlVzZXJDb2RlKTsKLQkJamF2YU9mZnNldCArPSBmVXNlckNvZGUubGVuZ3RoKCk7Ci0KLQkJLy8gZm9vdGVyCi0JCWZSZXN1bHQuYXBwZW5kKGZGb290ZXIpOwotCQlqYXZhT2Zmc2V0ICs9IGZGb290ZXIubGVuZ3RoKCk7Ci0KLQkJZkphdmEySnNwUmFuZ2VzLnB1dEFsbChmSW1wb3J0UmFuZ2VzKTsKLQkJZkphdmEySnNwUmFuZ2VzLnB1dEFsbChmRGVjbGFyYXRpb25SYW5nZXMpOwotCQlmSmF2YTJKc3BSYW5nZXMucHV0QWxsKGZDb2RlUmFuZ2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gamF2YVJhbmdlcwotCSAqIEBwYXJhbSBvZmZzZXRJbkphdmEKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUmFuZ2VzKEhhc2hNYXAgcmFuZ2VNYXAsIGludCBvZmZzZXRJbkphdmEpIHsKLQkJLy8ganVzdCBuZWVkIHRvIHVwZGF0ZSBqYXZhIHJhbmdlcyB3LyB0aGUgb2Zmc2V0IHdlIG5vdyBrbm93Ci0JCUl0ZXJhdG9yIGl0ID0gcmFuZ2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgCi0JCQkoKFBvc2l0aW9uKSBpdC5uZXh0KCkpLm9mZnNldCArPSBvZmZzZXRJbkphdmE7Ci0JfQotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyAocG9zaXRpb25zKSBpbiBqYXZhIGRvY3VtZW50IHRvIHJhbmdlcyBpbiBqc3AgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIGphdmEgcG9zaXRpb25zIHRvIGpzcCBwb3NpdGlvbnMuCi0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SmF2YTJKc3BSYW5nZXMoKSB7Ci0JCXJldHVybiBmSmF2YTJKc3BSYW5nZXM7Ci0JfQotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBqc3AgZG9jdW1lbnQgdG8gcmFuZ2VzIGluIGphdmEgZG9jdW1lbnQuCi0JICogQHJldHVybiBhIG1hcCBvZiBqc3AgcG9zaXRpb25zIHRvIGphdmEgcG9zaXRpb25zLCBvciBudWxsIGlmIG5vIHRyYW5zbGF0aW9uIGhhcyBvY2N1cmVkIHlldAotCSAqICh0aGUgbWFwIGhhc24ndCBiZWVuIGJ1aWx0KS4gCi0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SnNwMkphdmFSYW5nZXMoKSB7Ci0JCWlmIChmSmF2YTJKc3BSYW5nZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlIYXNoTWFwIGZsaXBGbG9wcGVkID0gbmV3IEhhc2hNYXAoKTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZKYXZhMkpzcFJhbmdlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlPYmplY3QgcmFuZ2UgPSBudWxsOwotCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCXJhbmdlID0ga2V5cy5uZXh0KCk7Ci0JCQlmbGlwRmxvcHBlZC5wdXQoZkphdmEySnNwUmFuZ2VzLmdldChyYW5nZSksIHJhbmdlKTsKLQkJfQotCQlyZXR1cm4gZmxpcEZsb3BwZWQ7Ci0JfQotCQotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwSW1wb3J0UmFuZ2VzKCkgewotCQlyZXR1cm4gZkltcG9ydFJhbmdlczsKLQl9Ci0JCi0JcHVibGljIEhhc2hNYXAgZ2V0SmF2YTJKc3BVc2VCZWFuUmFuZ2VzKCkgewotCQlyZXR1cm4gZlVzZUJlYW5SYW5nZXM7Ci0JfQotCQotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwSW5kaXJlY3RSYW5nZXMoKSB7Ci0JCXJldHVybiBmSW5kaXJlY3RSYW5nZXM7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdG8gdGhlIGpzcDwtPmphdmEgbWFwIGJ5IGRlZmF1bHQKLQkgKiBAcGFyYW0gdmFsdWUgYSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBpbXBvcnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wb3J0cyhTdHJpbmcgdmFsdWUpIHsKLQkJYWRkSW1wb3J0cyh2YWx1ZSwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFBhc3MgaW4gYSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBpbXBvcnQgdmFsdWVzLAotCSAqIGFwcGVuZHMgZWFjaCB0byB0aGUgZmluYWwgcmVzdWx0IGJ1ZmZlcgotCSAqIEBwYXJhbSB2YWx1ZSBhIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIGltcG9ydHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBvcnRzKFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBhZGRUb01hcCkgewotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE2ODcKLQkJLy8gYWRkZWQgdGhlICJhZGRUb01hcCIgcGFyYW1ldGVyIHRvIGV4Y2x1ZGUgaW1wb3J0cyBvcmlnaW5hdGluZwotCQkvLyBmcm9tIGluY2x1ZGVkIEpTUCBmaWxlcyB0byBiZSBhZGRlZCB0byB0aGUganNwPC0+amF2YSBtYXBwaW5nCQotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdG9rID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGFwcGVuZGFnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXRvayA9IHN0Lm5leHRUb2tlbigpOwotCQkJYXBwZW5kYWdlID0gImltcG9ydCAiICsgdG9rICsgIjsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlhcHBlbmRUb0J1ZmZlcihhcHBlbmRhZ2UsIGZVc2VySW1wb3J0cywgYWRkVG9NYXAsIGZDdXJyZW50Tm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgLyoga2VlcCB0cmFjayBvZiBjdXJzb3IgcG9zaXRpb24gaW5zaWRlIHRoZSBidWZmZXIKLQkgLyogYXBwZW5kcyBidWZmZXIgdG8gdGhlIGZpbmFsIHJlc3VsdCBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmQoU3RyaW5nQnVmZmVyIGJ1ZikgewotCQlpZiAoZ2V0Q3Vyc29yT3duZXIoKSA9PSBidWYpIHsKLQkJCWZDdXJzb3JQb3NpdGlvbiA9IGZSZXN1bHQubGVuZ3RoKCkgKyBnZXRSZWxhdGl2ZU9mZnNldCgpOwotCQl9Ci0JCWZSZXN1bHQuYXBwZW5kKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHZhbGlkIGFmdGVyIGEgY29uZmlndXJlKC4uLiksIHRyYW5zbGF0ZSguLi4pIG9yIHRyYW5zbGF0ZUZyb21GaWxlKC4uLikgY2FsbAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcmVzdWx0IChqYXZhIHRyYW5zbGF0aW9uKSBidWZmZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGdldFRyYW5zbGF0aW9uKCkgewotCQlyZXR1cm4gZlJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogT25seSB2YWxpZCBhZnRlciBhIGNvbmZpZ3VyZSguLi4pLCB0cmFuc2xhdGUoLi4uKSBvciB0cmFuc2xhdGVGcm9tRmlsZSguLi4pIGNhbGwKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGluIHRoZSBKU1AgZmlsZQotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SnNwVGV4dCgpIHsKLQkJcmV0dXJuIGZKc3BUZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogYWRkcyB0aGUgdmFyaWFibGVzIGZvciBhIHRhZyBpbiBhIHRhZ2xpYiB0byB0aGUgZHVtbXkgamF2YSBkb2N1bWVudAotCSAqIEBwYXJhbSB0YWdUb0FkZCBpcyB0aGUgbmFtZSBvZiB0aGUgdGFnIHdob3NlIHZhcmlhYmxlcyB3ZSB3YW50IHRvIGFkZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYlZhcmlhYmxlcyhTdHJpbmcgdGFnVG9BZGQpIHsKLQkJaWYgKGZNb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MTU5Ci0JCQlUTERDTURvY3VtZW50TWFuYWdlciBkb2NNZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJaWYgKGRvY01nciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUl0ZXJhdG9yIHRhZ2xpYnMgPSBkb2NNZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGZDdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpKS5pdGVyYXRvcigpOwotCQkJQ01Eb2N1bWVudCBkb2MgPSBudWxsOwotCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBudWxsOwotCQkJd2hpbGUgKHRhZ2xpYnMuaGFzTmV4dCgpKSB7Ci0JCQkJZG9jID0gKENNRG9jdW1lbnQpIHRhZ2xpYnMubmV4dCgpOwotCQkJCUNNTm9kZSBub2RlID0gbnVsbDsKLQkJCQlpZiAoKGVsZW1lbnRzID0gZG9jLmdldEVsZW1lbnRzKCkpICE9IG51bGwgJiYgKG5vZGUgPSBlbGVtZW50cy5nZXROYW1lZEl0ZW0odGFnVG9BZGQpKSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikgewotCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIpIHsKLQkJCQkJCW5vZGUgPSAoKENNTm9kZVdyYXBwZXIpIG5vZGUpLmdldE9yaWdpbk5vZGUoKTsKLQkJCQkJfQotCQkJCQkvLyBmdXR1cmVfVE9ETwotCQkJCQkvLyBGT1IgVEFHTElCIDEuMSBTVFlMRSwgV0UgTkVFRCBUTyBJTlNUQU5USUFURSBUSEUgCi0JCQkJCS8vIFRhZ0V4dHJhSW5mbyBjbGFzcyBhbmQgZ2V0IHRoZSB2YXJpYWJsZXMgdGhhdCB3YXkJCQkKLQkJCQkJLy8gdXNlIHJlZmxlY3Rpb24gdG8gY3JlYXRlIGNsYXNzLi4uCi0JCQkJCS8vIFZhcmlhYmxlSW5mb1tdIGdldFZhcmlhYmxlSW5mbyhUYWdEYXRhIGRhdGEpCi0JCQkJCS8vIFRISVMgSVMgT05MWSBGT1IgVEFHTElCIDEuMiBTVFlMRSAudGxkIGZpbGVzCi0JCQkJCUxpc3QgbGlzdCA9ICgoVExERWxlbWVudERlY2xhcmF0aW9uKSBub2RlKS5nZXRWYXJpYWJsZXMoKTsKLQkJCQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJCVRMRFZhcmlhYmxlIHZhciA9IChUTERWYXJpYWJsZSkgaXQubmV4dCgpOwotCQkJCQkJU3RyaW5nIHZhck5hbWUgPSB2YXIuZ2V0TmFtZUdpdmVuKCk7Ci0JCQkJCQlpZiAodmFyTmFtZSA9PSBudWxsKSB7Ci0JCQkJCQkJdmFyTmFtZSA9IHZhci5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpOwotCQkJCQkJfQotCQkJCQkJaWYgKHZhck5hbWUgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyB2YXJDbGFzcyA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJCAvLyB0aGUgZGVmYXVsdCBjbGFzcy4uLgotCQkJCQkJCWlmICh2YXIuZ2V0VmFyaWFibGVDbGFzcygpICE9IG51bGwpIHsKLQkJCQkJCQkJdmFyQ2xhc3MgPSB2YXIuZ2V0VmFyaWFibGVDbGFzcygpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBhZGQgdG8gZGVjbGFyYXRpb25zLi4uCi0JCQkJCQkJU3RyaW5nIG5ld0RlY2xhcmF0aW9uID0gdmFyQ2xhc3MgKyAiICIgKyB2YXJOYW1lICsgIiA9IG51bGw7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MTU5Ci0JCQkJCQkJLy8gbm90IGFkZGluZyB0byBtYXAgdG8gYXZvaWQgc3RyYW5nZSByZWZhY3RvcmluZyBiZWhhdmlvcgotCQkJCQkJCWFwcGVuZFRvQnVmZmVyKG5ld0RlY2xhcmF0aW9uLCBmVXNlckNvZGUsIGZhbHNlLCBmQ3VycmVudE5vZGUpOwotLy8JCQkJCQkJZlVzZXJDb2RlLmFwcGVuZChuZXdEZWNsYXJhdGlvbik7Ci0vLwotLy8JCQkJCQkJUG9zaXRpb24gamF2YVJhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlLCBuZXdEZWNsYXJhdGlvbi5sZW5ndGgoKSk7Ci0vLwkJCQkJCQkvLyB3aWxsIG5lZWQgdG8gaW5jcmVtZW1udCBvZmZzZXQgaW4gdXNlciBjb2RlCi0vLwkJCQkJCQlQb3NpdGlvbiBqc3BSYW5nZSA9IG5ldyBQb3NpdGlvbihmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSwgZkN1cnJlbnROb2RlLmdldExlbmd0aCgpKTsKLS8vCQkJCQkJCWZDb2RlUmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLS8vCQkJCQkJCWZPZmZzZXRJblVzZXJDb2RlICs9IG5ld0RlY2xhcmF0aW9uLmxlbmd0aCgpOwotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHVzZWQgYnkgaW5uZXIgaGVscGVyIGNsYXNzIChYTUxKU1BSZWdpb25IZWxwZXIsIEpTUEluY2x1ZGVSZWdpb25IZWxwZXIpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCQlpZiAoZkJsb2NrTWFya2VycyA9PSBudWxsKQotCQkJZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci0JfQotCi0JLyoqIAotCSAvKiB0aGUgbWFpbiBjb250cm9sIGxvb3AgZm9yIHRyYW5zbGF0aW5nIHRoZSBkb2N1bWVudCwgZHJpdmVuIGJ5IHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgbm9kZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGUoKSB7Ci0JCXNldEN1cnJlbnROb2RlKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQotCQl3aGlsZSAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsICYmICFpc0NhbmNlbGVkKCkpIHsKLQkJCQotCQkJLy8gaW50ZXJjZXB0IEhUTUwgY29tbWVudCBmbGF0IG5vZGUKLQkJCS8vIGFsc28gaGFuZGxlcyBVTkRFRklORUQgKHdoaWNoIGlzIHdoYXQgQ0RBVEEgY29tZXMgaW4gYXMpCi0JCQkvLyBiYXNpY2FsbHkgdGhpcyBwYXJ0IHdpbGwgaGFuZGxlIGFueSAiZW1iZWRkZWQiIEpTUCBjb250YWluZXJzCi0JCQlpZiAoZ2V0Q3VycmVudE5vZGUoKS5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUIHx8IGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQgfHwgZ2V0Q3VycmVudE5vZGUoKS5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCQl0cmFuc2xhdGVYTUxDb21tZW50Tm9kZShnZXRDdXJyZW50Tm9kZSgpKTsKLQkJCX0KLQkJCWVsc2UgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggcmVnaW9uIGluIHRoZSBmbGF0IG5vZGUKLQkJCXsKLQkJCQl0cmFuc2xhdGVSZWdpb25Db250YWluZXIoZ2V0Q3VycmVudE5vZGUoKSwgU1RBTkRBUkRfSlNQKTsKLQkJCX0KLQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpCi0JCQkJYWR2YW5jZU5leHROb2RlKCk7Ci0JCX0KLQkJYnVpbGRSZXN1bHQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnQoSURvY3VtZW50IGRvY3VtZW50LCBJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtLCBTdHJpbmcgY2hhcnNldCkgewotCQlSZWFkZXIgaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbnRlbnRTdHJlYW0sIGNoYXJzZXQpLCAyMDQ4KTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwNDgpOwotCQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKLQkJCWludCBuID0gaW4ucmVhZChyZWFkQnVmZmVyKTsKLQkJCXdoaWxlIChuID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQocmVhZEJ1ZmZlciwgMCwgbik7Ci0JCQkJbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl9Ci0JCQlkb2N1bWVudC5zZXQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc2xhdG9yJ3MgcHJvZ3JzcyBtb25pdG9yLCBmYWxzZSBpZiB0aGUgbW9uaXRvciBpcyBudWxsCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCXJldHVybiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsKSA/IGZhbHNlIDogZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkdmFuY2VOZXh0Tm9kZSgpIHsKLQkJc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpOwotCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKQotCQkJc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKSB7Ci0JCWlmIChpc0pTUChnZXRDdXJyZW50Tm9kZSgpLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpKSkgewotCQkJSXRlcmF0b3IgaXQgPSBnZXRDdXJyZW50Tm9kZSgpLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJciA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCWlmIChyLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCByLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DT05URU5UKQotCQkJCQlicmVhazsKLQkJCQllbHNlIGlmIChyLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpCi0JCQkJCWJyZWFrOwotCQkJCWVsc2UgaWYgKHIuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dChyKS50cmltKCkuZXF1YWxzKCJpbXBvcnQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgYSByZWdpb24gY29udGFpbmVyIChhbmQgWE1MIEpTUCBjb250YWluZXIsIG9yIDwlIEpTUCBjb250YWluZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlUmVnaW9uQ29udGFpbmVyKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXIsIGludCBKU1BUeXBlKSB7Ci0JCQotCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uID0gY29udGFpbmVyOwotCQlJdGVyYXRvciByZWdpb25zID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyBQTVIgOTE5MzAKLQkJCS8vIENNVkMgMjQxODY5Ci0JCQkvLyBjb250ZW50IGFzc2lzdCB3YXMgbm90IHNob3dpbmcgdXAgaW4gSlNQIGluc2lkZSBhIGphdmFzY3JpcHQgcmVnaW9uCi0JCQlpZiAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQkvLyBjaGVjayBpZiBpdCdzIG5lc3RlZCBqc3AgaW4gIGEgc2NyaXB0IHRhZy4uLgotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQl0cmFuc2xhdGVKU1BOb2RlKHJlZ2lvbiwgcmVnaW9ucywgdHlwZSwgRU1CRURERURfSlNQKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJCQkJLy8gVEhJUyBFTUJFRERFRCBKU1AgVEVYVCBXSUxMIENPTUUgT1VUIExBVEVSIFdIRU4gUEFSVElUSU9OSU5HIEhBUyAKLQkJCQkJLy8gU1VQUE9SVCBGT1IgTkVTVEVEIFhNTC1KU1AKLQkJCQkJLy8gQ01WQyAyNDE4ODIKLQkJCQkJZGVjb2RlU2NyaXB0QmxvY2soY29udGFpbmVyUmVnaW9uLmdldEZ1bGxUZXh0KHJlZ2lvbiksIGNvbnRhaW5lclJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkJCX0KLQkJCX0KLQkJCWlmICh0eXBlICE9IG51bGwgJiYgaXNKU1AodHlwZSkpIC8vIDwlLCA8JT0sIDwlISwgPCVACi0JCQl7Ci0JCQkJdHJhbnNsYXRlSlNQTm9kZShyZWdpb24sIHJlZ2lvbnMsIHR5cGUsIEpTUFR5cGUpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCQl0cmFuc2xhdGVYTUxOb2RlKGNvbnRhaW5lclJlZ2lvbiwgcmVnaW9ucyk7Ci0JCQl9Ci0JCX0KLQkJLy99Ci0JfQotCi0JLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JICogKiogVEVNUCBXT1JLQVJPVU5EIEZPUiBDTVZDIDI0MTg4MgotCSAqIFRha2VzIGEgU3RyaW5nIGFuZCBibG9ja3Mgb3V0IGpzcDpzY3JpcHRsZXQsIGpzcDpleHByZXNzaW9uLCBhbmQganNwOmRlY2xhcmF0aW9uCi0JICogQHBhcmFtIGJsb2NrVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVjb2RlU2NyaXB0QmxvY2soU3RyaW5nIGJsb2NrVGV4dCwgaW50IHN0YXJ0T2ZCbG9jaykgewotCQlYTUxKU1BSZWdpb25IZWxwZXIgaGVscGVyID0gbmV3IFhNTEpTUFJlZ2lvbkhlbHBlcih0aGlzKTsKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOnNjcmlwdGxldCIsIG51bGwsIFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCWhlbHBlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpleHByZXNzaW9uIiwgbnVsbCwgWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmRlY2xhcmF0aW9uIiwgbnVsbCwgWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmRpcmVjdGl2ZS5pbmNsdWRlIiwgbnVsbCwgWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmRpcmVjdGl2ZS50YWdsaWIiLCBudWxsLCBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIucmVzZXQoYmxvY2tUZXh0LCBzdGFydE9mQmxvY2spOwotCQkvLyBmb3JjZSBwYXJzZQotCQloZWxwZXIuZm9yY2VQYXJzZSgpOwotCQloZWxwZXIud3JpdGVUb0J1ZmZlcnMoKTsKLQl9Ci0KLQkvKgotCSAqIHJldHVybnMgc3RyaW5nIG1pbnVzIENEQVRBIG9wZW4gYW5kIGNsb3NlIHRleHQKLQkgKi8KLQlmaW5hbCBwdWJsaWMgU3RyaW5nIHN0cmlwQ0RBVEEoU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIHJlc3VsdFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQ0RBVEFfT1BFTiA9ICI8IVtDREFUQVsiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBDREFUQV9DTE9TRSA9ICJdXT4iOyAvLyROT04tTkxTLTEkCi0JCWludCBzdGFydCA9IDA7Ci0JCWludCBlbmQgPSB0ZXh0Lmxlbmd0aCgpOwotCQl3aGlsZSAoc3RhcnQgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0JCQlpZiAodGV4dC5pbmRleE9mKENEQVRBX09QRU4sIHN0YXJ0KSA+IC0xKSB7Ci0JCQkJZW5kID0gdGV4dC5pbmRleE9mKENEQVRBX09QRU4sIHN0YXJ0KTsKLQkJCQlyZXN1bHRUZXh0ICs9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJCXN0YXJ0ID0gZW5kICsgQ0RBVEFfT1BFTi5sZW5ndGgoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuaW5kZXhPZihDREFUQV9DTE9TRSwgc3RhcnQpID4gLTEpIHsKLQkJCQllbmQgPSB0ZXh0LmluZGV4T2YoQ0RBVEFfQ0xPU0UsIHN0YXJ0KTsKLQkJCQlyZXN1bHRUZXh0ICs9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJCXN0YXJ0ID0gZW5kICsgQ0RBVEFfQ0xPU0UubGVuZ3RoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbmQgPSB0ZXh0Lmxlbmd0aCgpOwotCQkJCXJlc3VsdFRleHQgKz0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFRleHQ7Ci0JfQotCi0JLy8gRU5EIE9GIFdPUktBUk9VTkQgQ09ERS4uLgotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAKLQkvKioKLQkgKiBkZXRlcm1pbmVzIGlmIHRoZSB0eXBlIGlzIGEgcHVyZSBKU1AgdHlwZSAobm90IFhNTCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0pTUChTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiB8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSAmJiB0eXBlICE9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKTsKLQkJLy8gY2hlY2tpbmcgWE1MX1RBR19PUEVOIHNvIDxqc3A6ZGlyZWN0aXZlLnh4eC8+IGdldHMgdHJlYXRlZCBsaWtlIG90aGVyIFhNTCBqc3AgdGFncwotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgdGhlIHZhcmlvdXMgWE1MSlNQIHR5cGUgbm9kZXMKLQkgKiBAcGFyYW0gcmVnaW9ucyB0aGUgcmVnaW9ucyBvZiB0aGUgWE1MTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVhNTE5vZGUoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lciwgSXRlcmF0b3IgcmVnaW9ucykgewotCQkvLyBjb250ZW50cyBtdXN0IGJlIHZhbGlkIFhIVE1MLCB0cmFuc2xhdGUgZXNjYXBlZCBDREFUQSBpbnRvIHdoYXQgaXQgcmVhbGx5IGlzLi4uCi0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotIAkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCByLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIC8vIDxqc3A6ZGlyZWN0aXZlLnh4eCBjb21lcyBpbiBhcyB0aGlzCi0JCQl7Ci0JCQkJU3RyaW5nIGZ1bGxUYWdOYW1lID0gY29udGFpbmVyLmdldEZ1bGxUZXh0KHIpLnRyaW0oKTsKLQkJCQlpZiAoZnVsbFRhZ05hbWUuaW5kZXhPZignOicpID4gLTEpIHsKLQkJCQkJYWRkVGFnbGliVmFyaWFibGVzKGZ1bGxUYWdOYW1lKTsgLy8gaXQgbWF5IGJlIGEgdGFnbGliCi0JCQkJfQotCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZnVsbFRhZ05hbWUsICI6LiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkgJiYgc3QubmV4dFRva2VuKCkuZXF1YWxzKCJqc3AiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJU3RyaW5nIGpzcFRhZ05hbWUgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJCWlmIChqc3BUYWdOYW1lLmVxdWFscygidXNlQmVhbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJYWR2YW5jZU5leHROb2RlKCk7IC8vIGdldCB0aGUgY29udGVudAotCQkJCQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJCQkJdHJhbnNsYXRlVXNlQmVhbihjb250YWluZXIpOyAvLyAncmVnaW9ucycgc2hvdWxkIGJlIGFsbCB0aGUgdXNlQmVhbiBhdHRyaWJ1dGVzCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoanNwVGFnTmFtZS5lcXVhbHMoInNjcmlwdGxldCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7CQotCQkJCQkJCS8vIDxqc3A6c2NyaXB0bGV0PnNjcmlwdGxldCBjb250ZW50Li4uPC9qc3A6c2NyaXB0bGV0PgotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RyID0gZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCk7Ci0JCQkJCQkJaWYoc2RyICE9IG51bGwpIHsKLQkJCQkJCQkJdHJhbnNsYXRlU2NyaXB0bGV0U3RyaW5nKHNkci5nZXRUZXh0KCksIHNkciwgc2RyLmdldFN0YXJ0T2Zmc2V0KCksIHNkci5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWFkdmFuY2VOZXh0Tm9kZSgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoanNwVGFnTmFtZS5lcXVhbHMoImV4cHJlc3Npb24iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCS8vIDxqc3A6ZXhwcmVzc2lvbj5leHByZXNzaW9uIGNvbnRlbnQuLi48L2pzcDpleHByZXNzaW9uPgotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RyID0gZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCk7Ci0JCQkJCQkJaWYoc2RyICE9IG51bGwpIHsKLQkJCQkJCQkJdHJhbnNsYXRlRXhwcmVzc2lvblN0cmluZyhzZHIuZ2V0VGV4dCgpLCBzZHIsIHNkci5nZXRTdGFydE9mZnNldCgpLCBzZHIuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCQkJCX0KLQkJCQkJCQlhZHZhbmNlTmV4dE5vZGUoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJkZWNsYXJhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJLy8gPGpzcDpkZWNsYXJhdGlvbj5kZWNsYXJhdGlvbiBjb250ZW50Li4uPC9qc3A6ZGVjbGFyYXRpb24+Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIgPSBnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKTsKLQkJCQkJCQlpZihzZHIgIT0gbnVsbCkgewotCQkJCQkJCQl0cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhzZHIuZ2V0VGV4dCgpLCBzZHIsIHNkci5nZXRTdGFydE9mZnNldCgpLCBzZHIuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQkJYWR2YW5jZU5leHROb2RlKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZGlyZWN0aXZlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCQkJCWlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygidGFnbGliIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJaGFuZGxlVGFnbGliKCk7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoImluY2x1ZGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkKLQkJCQkJCQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJU3RyaW5nIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkvLyBDTVZDIDI1ODMxMQotCQkJCQkJCQkJLy8gUE1SIDE4MzY4LCBCNjYzCi0JCQkJCQkJCQkvLyBza2lwIHRvIHJlcXVpcmVkICJmaWxlIiBhdHRyaWJ1dGUsIHNob3VsZCBiZSBzYWZlIGJlY2F1c2UKLQkJCQkJCQkJCS8vICJmaWxlIiBpcyB0aGUgb25seSBhdHRyaWJ1dGUgZm9yIHRoZSBpbmNsdWRlIGRpcmVjdGl2ZQotCQkJCQkJCQkJd2hpbGUgKHIgIT0gbnVsbCAmJiByZWdpb25zLmhhc05leHQoKSAmJiAhci5nZXRUeXBlKCkuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQkJCQkJCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWF0dHJWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKHIsIHJlZ2lvbnMpOwotCQkJCQkJCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKQotCQkJCQkJCQkJCWhhbmRsZUluY2x1ZGVGaWxlKGZpbGVMb2NhdGlvbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoInBhZ2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkKLQkJCQkJCQkJCS8vIDIwMDQwNzAyIGNvbW1lbnRpbmcgdGhpcyBvdXQKLQkJCQkJCQkJCS8vIGJhZCBpZiBjdXJyZW50Tm9kZSBpcyByZWZlcmVuY2VkIGFmdGVyIGhlcmUgdy8gdGhlIGN1cnJlbnQgbGlzdAotCQkJCQkJCQkJLy8gc2VlOiBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNQotCQkJCQkJCQkJLy8gc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpOwotCQkJCQkJCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJCXRyYW5zbGF0ZVBhZ2VEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMpOyAvLyAncmVnaW9ucycgYXJlIGF0dHJpYnV0ZXMgZm9yIHRoZSBkaXJlY3RpdmUKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYoanNwVGFnTmFtZS5lcXVhbHMoImluY2x1ZGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCi0JCQkJCQkJLy8gPGpzcDppbmNsdWRlIHBhZ2U9ImZpbGVuYW1lIikgLz4KLQkJCQkJCQl3aGlsZShyZWdpb25zLmhhc05leHQoKSkgewotCQkJCQkJCQlyID0gKElUZXh0UmVnaW9uKXJlZ2lvbnMubmV4dCgpOwotCQkJCQkJCQlpZihyLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUgJiYgZ2V0Q3VycmVudE5vZGUoKS5nZXRUZXh0KHIpLmVxdWFscygicGFnZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGdldEF0dHJpYnV0ZVZhbHVlKHIsIHJlZ2lvbnMpOwotCQkJCQkJCQkJaGFuZGxlSW5jbHVkZUZpbGUoZmlsZW5hbWUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9CQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFnIG5hbWUgaXMgbm90IGpzcAotCQkJCQkvLyBoYW5kbGUgZW1iZWRkZWQganNwIGF0dHJpYnV0ZXMuLi4KLQkJCQkJSVRleHRSZWdpb24gZW1iZWRkZWQgPSBudWxsOwotCQkJCQlJdGVyYXRvciBhdHRyUmVnaW9ucyA9IG51bGw7Ci0JCQkJCUlUZXh0UmVnaW9uIGF0dHJDaHVuayA9IG51bGw7Ci0JCQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCQkJZW1iZWRkZWQgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCQkJaWYgKGVtYmVkZGVkIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCQkvLyBwYXJzZSBvdXQgY29udGFpbmVyCi0JCQkJCQkJYXR0clJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBlbWJlZGRlZCkuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJd2hpbGUgKGF0dHJSZWdpb25zLmhhc05leHQoKSkgewotCQkJCQkJCQlhdHRyQ2h1bmsgPSAoSVRleHRSZWdpb24pIGF0dHJSZWdpb25zLm5leHQoKTsKLQkJCQkJCQkJU3RyaW5nIHR5cGUgPSBhdHRyQ2h1bmsuZ2V0VHlwZSgpOwotCQkJCQkJCQkvLyBDTVZDIDI2MzY2MSwgZW1iZWRkZWQgSlNQIGluIGF0dHJpYnV0ZSBzdXBwb3J0Ci0JCQkJCQkJCS8vIG9ubHkgd2FudCB0byB0cmFuc2xhdGUgb25lIHRpbWUgcGVyIGVtYmVkZGVkIHJlZ2lvbgotCQkJCQkJCQkvLyBzbyB3ZSBvbmx5IHRyYW5zbGF0ZSBvbiB0aGUgSlNQIG9wZW4gdGFncyAobm90IGNvbnRlbnQpCi0JCQkJCQkJCWlmICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiB8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgewotCQkJCQkJCQkJLy8gbm93IGNhbGwganNwdHJhbnNsYXRlCi0JCQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZW1iZWRkZWQganNwIE9QRU4gPj4+PiAiICsgKChJVGV4dFJlZ2lvbkNvbnRhaW5lcillbWJlZGRlZCkuZ2V0VGV4dChhdHRyQ2h1bmspKTsKLQkJCQkJCQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBlbWJlZGRlZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnb2VzIHRocm91Z2ggY29tbWVudCByZWdpb25zLCBjaGVja3MgaWYgYW55IGFyZSBhbiBlbWJlZGRlZCBKU1AgY29udGFpbmVyCi0JICogaWYgaXQgZmluZHMgb25lLCBpdCdzIHNlbmRzIHRoZSBjb250YWluZXIgaW50byB0aGUgdHJhbnNsYXRpb24gcm91dGluZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVhNTENvbW1lbnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJdGVyYXRvciBpdCA9IG5vZGUuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIGNvbW1lbnRSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaXQgIT0gbnVsbCAmJiBpdC5oYXNOZXh0KCkpIHsKLQkJCWNvbW1lbnRSZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChjb21tZW50UmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQl0cmFuc2xhdGVSZWdpb25Db250YWluZXIoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb21tZW50UmVnaW9uLCBFTUJFRERFRF9KU1ApOyAvLyBpdCdzIGVtYmVkZGVkIGpzcC4uLml0ZXJhdGUgcmVnaW9ucy4uLgotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZGV0ZXJtaW5lcyB3aGljaCB0eXBlIG9mIEpTUCBub2RlIHRvIHRyYW5zbGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZUpTUE5vZGUoSVRleHRSZWdpb24gcmVnaW9uLCBJdGVyYXRvciByZWdpb25zLCBTdHJpbmcgdHlwZSwgaW50IEpTUFR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOICYmIHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJdHJhbnNsYXRlRGlyZWN0aXZlKHJlZ2lvbnMpOwotCQl9Ci0JCWVsc2UgewotCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRlbnRSZWdpb24gPSBudWxsOwotCQkJaWYgKEpTUFR5cGUgPT0gU1RBTkRBUkRfSlNQICYmIChzZXRDdXJyZW50Tm9kZShnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKSkpICE9IG51bGwpIHsKLQkJCQljb250ZW50UmVnaW9uID0gZ2V0Q3VycmVudE5vZGUoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKEpTUFR5cGUgPT0gRU1CRURERURfSlNQICYmIHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCS8vIENNVkMgMjYzNjYxCi0JCQkJdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkJsb2NrKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbik7Ci0JCQkJLy8gZW5zdXJlIHRoZSByZXN0IG9mIHRoaXMgbWV0aG9kIHdvbid0IGJlIGNhbGxlZAotCQkJCWNvbnRlbnRSZWdpb24gPSBudWxsOwotCQkJfQotCQkJaWYgKGNvbnRlbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWlmICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHsKLQkJCQkJdHJhbnNsYXRlRXhwcmVzc2lvbihjb250ZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgewotCQkJCQl0cmFuc2xhdGVEZWNsYXJhdGlvbihjb250ZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgewotCQkJCQl0cmFuc2xhdGVTY3JpcHRsZXQoY29udGVudFJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBvZiBhbiBhdHRyaWJ1dGUgdy8gbm8gcmVnaW9uIDxwIGFsaWduPSI8JSU+Ij4KLQkJCQlzZXRDdXJzb3JPd25lcihnZXRKU1BUeXBlRm9yUmVnaW9uKHJlZ2lvbikpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFzcyB0aGUgSVRleHRSZWdpb25Db2xsZWN0aW9uIHdoaWNoIGlzIHRoZSBlbWJlZGRlZCByZWdpb24KLQkgKiBAcGFyYW0gaXRlcmF0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkJsb2NrKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb2xsZWN0aW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoaXNKU1AocmVnaW9uLmdldFR5cGUoKSkpCi0JCQkJYnJlYWs7Ci0JCQlyZWdpb24gPSBudWxsOwotCQl9Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkF0dHJpYnV0ZShjb2xsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogZm9yIGV4YW1wbGU6IAotCSAqIDxhIGhyZWY9ImluZGV4LmpzcD9wPTwlPWFiYyU+Yj08JT14eXolPiI+YWJjPC9hPgotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2xhdGVFbWJlZGRlZEpTUEluQXR0cmlidXRlKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBlbWJlZGRlZENvbnRhaW5lcikgewotCQkvLyBUSElTIE1FVEhPRCBJUyBBIEZJWCBGT1IgQ01WQyAyNjM2NjEgKGpzcCBlbWJlZGRlZCBpbiBhdHRyaWJ1dGUgcmVnaW9ucykKLQkJCi0JCS8vIGxvb3AgYWxsIHJlZ2lvbnMKLQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucyA9IGVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gZGVsaW0gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBjb250ZW50ID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlmb3IoaW50IGk9MDsgaTxlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQotCQkJLy8gcG9zc2libGUgZGVsaW1pdGVyLCBjaGVjayBsYXRlcgotCQkJZGVsaW0gPSBlbWJlZGRlZFJlZ2lvbnMuZ2V0KGkpOwotCQkJdHlwZSA9IGRlbGltLmdldFR5cGUoKTsKLQkJCQotCQkJLy8gY2hlY2sgbmV4dCByZWdpb24gdG8gc2VlIGlmIGl0J3MgY29udGVudAotCQkJaWYoaSsxPGVtYmVkZGVkUmVnaW9ucy5zaXplKCkpIHsKLQkJCQlpZihlbWJlZGRlZFJlZ2lvbnMuZ2V0KGkrMSkuZ2V0VHlwZSgpID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKQotCQkJCQljb250ZW50ID0gZW1iZWRkZWRSZWdpb25zLmdldChpKzEpOwotCQkJfQotCQkJCi0JCQlpZihjb250ZW50ICE9IG51bGwpIHsKLQkJCQlpbnQgY29udGVudFN0YXJ0ID0gIGVtYmVkZGVkQ29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KGNvbnRlbnQpOwotCQkJCWludCByU3RhcnQgPSBmQ3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRlbnRTdGFydDsKLQkJCQlpbnQgckVuZCA9IGZDdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgZW1iZWRkZWRDb250YWluZXIuZ2V0RW5kT2Zmc2V0KGNvbnRlbnQpOwotCQkJCQotCQkJCWJvb2xlYW4gaW5UaGlzUmVnaW9uID0gclN0YXJ0IDw9IGZTb3VyY2VQb3NpdGlvbiAmJiByRW5kID49IGZTb3VyY2VQb3NpdGlvbjsKLQkJCQkvL2ludCBqc3BQb3NpdGlvblN0YXJ0ID0gZkN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyBjb250ZW50U3RhcnQ7Ci0JCQkJCi0JCQkJaWYodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB7Ci0JCQkJCWZMYXN0SlNQVHlwZSA9IEVYUFJFU1NJT047Ci0JCQkJCXRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB7Ci0JCQkJCWZMYXN0SlNQVHlwZSA9IFNDUklQVExFVDsKLQkJCQkJdHJhbnNsYXRlU2NyaXB0bGV0U3RyaW5nKGVtYmVkZGVkQ29udGFpbmVyLmdldFRleHQoY29udGVudCksIGZDdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50LmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZih0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQkJCWZMYXN0SlNQVHlwZSA9IERFQ0xBUkFUSU9OOwotCQkJCQl0cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGNvbnRlbnQpLCBmQ3VycmVudE5vZGUsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGNhbGN1bGF0ZSByZWxhdGl2ZSBvZmZzZXQgaW4gYnVmZmVyCi0JCQkJaWYgKGluVGhpc1JlZ2lvbikgewotCQkJCQlzZXRDdXJzb3JPd25lcihmTGFzdEpTUFR5cGUpOwotCQkJCQlpbnQgY3VycmVudEJ1ZmZlckxlbmd0aCA9IGdldEN1cnNvck93bmVyKCkubGVuZ3RoKCk7Ci0JCQkJCXNldFJlbGF0aXZlT2Zmc2V0KChmU291cmNlUG9zaXRpb24gLSBjb250ZW50U3RhcnQpICsgY3VycmVudEJ1ZmZlckxlbmd0aCk7Ci0JCQkJCWlmIChmTGFzdEpTUFR5cGUgPT0gRVhQUkVTU0lPTikgewotCQkJCQkJLy8gaWYgYW4gZXhwcmVzc2lvbiwgYWRkIHRoZW4gbGVuZ3RoIG9mIHRoZSBlbmNsb3NpbmcgcGFyZW4uLgotCQkJCQkJc2V0Q3Vyc29ySW5FeHByZXNzaW9uKHRydWUpOwotCQkJCQkJc2V0UmVsYXRpdmVPZmZzZXQoZ2V0UmVsYXRpdmVPZmZzZXQoKSArIEVYUFJFU1NJT05fUFJFRklYLmxlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXR5cGUgPSBudWxsOwotCQkJCWNvbnRlbnQgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZkxhc3RKU1BUeXBlID0gU0NSSVBUTEVUOwotCi0JLyoqCi0JICogSlNQVHlwZSBpcyBvbmx5IHVzZWQgaW50ZXJuYWxseSBpbiB0aGlzIGNsYXNzIHRvIGRlc2NyaWJlIHR5ZSB0eXBlIG9mIHJlZ2lvbiB0byBiZSB0cmFuc2xhdGVkCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SlNQVHlwZUZvclJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpbnQgdHlwZSA9IFNDUklQVExFVDsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKQotCQkJdHlwZSA9IFNDUklQVExFVDsKLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKQotCQkJdHlwZSA9IEVYUFJFU1NJT047Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pCi0JCQl0eXBlID0gREVDTEFSQVRJT047Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpCi0JCQl0eXBlID0gZkxhc3RKU1BUeXBlOwotCQkvLyByZW1lbWJlciB0aGUgbGFzdCB0eXBlLCBpbiBjYXNlIHRoZSBuZXh0IHR5cGUgdGhhdCBjb21lcyBpbiBpcyBKU1BfQ09OVEVOVAotCQlmTGFzdEpTUFR5cGUgPSB0eXBlOwotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgLyogPCVAICU+Ci0JIC8qIG5lZWQgdG8gcGFzcyBpbiB0aGUgZGlyZWN0aXZlIHRhZyByZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVEaXJlY3RpdmUoSXRlcmF0b3IgcmVnaW9ucykgewotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIHJlZ2lvblRleHQsIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7IC8vIGNvdWxkIGJlIFhNTF9DT05URU5UID0gIiIsIHNraXBzIGF0dHJzPwotCQkJcmVnaW9uVGV4dCA9IGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKTsKLQkJCWlmIChyZWdpb25UZXh0LmluZGV4T2YoInRhZ2xpYiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGFkZCBjdXN0b20gdGFnIGJsb2NrIG1hcmtlcnMgaGVyZQotCQkJCWhhbmRsZVRhZ2xpYigpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblRleHQuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIENNVkMgMjU4MzExCi0JCQkJLy8gUE1SIDE4MzY4LCBCNjYzCi0JCQkJLy8gc2tpcCB0byByZXF1aXJlZCAiZmlsZSIgYXR0cmlidXRlLCBzaG91bGQgYmUgc2FmZSBiZWNhdXNlCi0JCQkJLy8gImZpbGUiIGlzIHRoZSBvbmx5IGF0dHJpYnV0ZSBmb3IgdGhlIGluY2x1ZGUgZGlyZWN0aXZlCi0JCQkJd2hpbGUgKHIgIT0gbnVsbCAmJiByZWdpb25zLmhhc05leHQoKSAmJiAhci5nZXRUeXBlKCkuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJfQotCQkJCWZpbGVMb2NhdGlvbiA9IGdldEF0dHJpYnV0ZVZhbHVlKHIsIHJlZ2lvbnMpOwotCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkKLQkJCQkJaGFuZGxlSW5jbHVkZUZpbGUoZmlsZUxvY2F0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblRleHQuaW5kZXhPZigicGFnZSIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRyYW5zbGF0ZVBhZ2VEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgaWRlYWxseSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBydW4gdGhyb3VnaCBKU1BUcmFuc2xhdG9yCi0JICogVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGlubmVyIGhlbHBlciBjbGFzc2VzIHRoYXQgbmVlZCB0byBhZGQgYmxvY2sgbWFya2VycyB0byB0aGVpciBvd24gcGFyc2Vycy4KLQkgKiBUaGlzIG1ldGhvZCBvbmx5IGFkZHMgbWFya2VycyB0aGF0IGNhbWUgZnJvbSA8QHRhZ2xpYj4gZGlyZWN0aXZlcywgKG5vdCA8QGluY2x1ZGU+KSwKLQkgKiBzaW5jZSBpbmNsdWRlIGZpbGUgdGFnbGlicyBhcmUgaGFuZGxlZCBvbiB0aGUgZmx5IHdoZW4gdGhleSBhcmUgZW5jb3VudGVyZWQuCi0JICogKiBAcGFyYW0gcmVnaW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVRhZ2xpYigpIHsKLQkJLy8gZ2V0L2NyZWF0ZSBUTERDTURvY3VtZW50Ci0JCVRMRENNRG9jdW1lbnRNYW5hZ2VyIG1nciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJTGlzdCB0cmFja2VycyA9IG1nci5nZXRDTURvY3VtZW50VHJhY2tlcnMoZ2V0Q3VycmVudE5vZGUoKS5nZXRFbmQoKSk7Ci0JCQlJdGVyYXRvciBpdCA9IHRyYWNrZXJzLml0ZXJhdG9yKCk7Ci0JCQlDTURvY3VtZW50VHJhY2tlciB0cmFja2VyID0gbnVsbDsKLQkJCUl0ZXJhdG9yIHRhZ2xpYlJlZ2lvbnMgPSBudWxsOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IG51bGw7Ci0JCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQl0cmFja2VyID0gKENNRG9jdW1lbnRUcmFja2VyKSBpdC5uZXh0KCk7Ci0JCQkJc2RSZWdpb24gPSB0cmFja2VyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCXRhZ2xpYlJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAodGFnbGliUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJciA9IChJVGV4dFJlZ2lvbikgdGFnbGliUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCWlmIChyLmdldFR5cGUoKS5lcXVhbHMoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSkgewotCQkJCQkJaWYgKHNkUmVnaW9uLmdldFRleHQocikuZXF1YWxzKCJ0YWdsaWIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYWRkQmxvY2tNYXJrZXJzKHRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIGFkZHMgYmxvY2sgbWFya2VycyB0byBKU1BUcmFuc2xhdG9yJ3MgYmxvY2sgbWFya2VyIGxpc3QgZm9yIGFsbCBlbGVtZW50cyBpbiBkb2MKLQkgKiBAcGFyYW0gZG9jCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmxvY2tNYXJrZXJzKENNRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gZG9jLmdldEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCUNNTm9kZSBub2RlID0gbnVsbDsKLQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlub2RlID0gKENNTm9kZSkgZWxlbWVudHMubmV4dCgpOwotCQkJCWdldEJsb2NrTWFya2VycygpLmFkZChuZXcgQmxvY2tNYXJrZXIobm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgciBpcyBhbiBhdHRyaWJ1dGUgbmFtZSByZWdpb24sIHRoaXMgbWV0aG9kIHdpbGwgc2FmZWx5IHJldHVybiB0aGUgdmFsdWUgZm9yIHRoYXQgYXR0cmlidXRlLgotCSAqIEBwYXJhbSByCi0JICogQHBhcmFtIHJlbWFpbmluZ1JlZ2lvbnMKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lIChyKSwgb3IgbnVsbCBpZiBpc24ndCBvbmUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKElUZXh0UmVnaW9uIHIsIEl0ZXJhdG9yIHJlbWFpbmluZ1JlZ2lvbnMpIHsKLQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSB7Ci0JCQlpZiAocmVtYWluaW5nUmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlbWFpbmluZ1JlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKHJlbWFpbmluZ1JlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZW1haW5pbmdSZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCS8vIGhhbmRsZSBpbmNsdWRlIGZvciB0aGUgZmlsZW5hbWUKLQkJCQkJcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHRha2VzIGFuIGVtbnVtZXJhdGlvbiBvZiB0aGUgYXR0cmlidXRlcyBvZiBhIGRpcmVjdGl2ZSB0YWcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVQYWdlRGlyZWN0aXZlQXR0cmlidXRlcyhJdGVyYXRvciByZWdpb25zKSB7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUsIGF0dHJWYWx1ZTsKLQkJLy8gaXRlcmF0ZSBhbGwgYXR0cmlidXRlcwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpICE9IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJYXR0ck5hbWUgPSBhdHRyVmFsdWUgPSBudWxsOwotCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSB7Ci0JCQkJCi0JCQkJYXR0ck5hbWUgPSBnZXRDdXJyZW50Tm9kZSgpLmdldFRleHQocikudHJpbSgpOwotCQkJCWlmKGF0dHJOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQkKLQkJCQkJCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChnZXRDdXJyZW50Tm9kZSgpLmdldFRleHQocikpOwotCQkJCQkJfQotCQkJCQkJLy8gaGFzIGVxdWFscywgYnV0IG5vIHZhbHVlPwotCQkJCQl9Ci0JCQkJCXNldERpcmVjdGl2ZUF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXRzIHRoZSBhcHByb3ByaWF0ZSBwYWdlIGRpcmVjdGl2ZSBhdHRyaWJ1dGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREaXJlY3RpdmVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgYXR0clZhbHVlKSB7Ci0JCWlmIChhdHRyVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gdXNlcyBkZWZhdWx0IChpZiB0aGVyZSB3YXMgb25lKQotCQlpZiAoYXR0ck5hbWUuZXF1YWxzKCJleHRlbmRzIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJZlN1cGVyY2xhc3MgPSBhdHRyVmFsdWU7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJpbXBvcnQiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlhZGRJbXBvcnRzKGF0dHJWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJzZXNzaW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJLy9mU2Vzc2lvbiA9ICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShhdHRyVmFsdWUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiYnVmZmVyIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJLy8gaWdub3JlIGZvciBub3cKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImF1dG9GbHVzaCIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCS8vIGlnbm9yZSBmb3Igbm93Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJpc1RocmVhZFNhZmUiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQkvL2ZUaHJlYWRTYWZlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoYXR0clZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiaXNFcnJvclBhZ2UiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlmSXNFcnJvclBhZ2UgPSBCb29sZWFuLnZhbHVlT2YoYXR0clZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUluY2x1ZGVGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG51bGw7Ci0JCQlpZiAoZ2V0UmVzb2x2ZXIoKSAhPSBudWxsKSB7Ci0JCQkJZmlsZUxvY2F0aW9uID0gKGdldEluY2x1ZGVzKCkuZW1wdHkoKSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGdldFJlc29sdmVyKCkuZ2V0TG9jYXRpb25CeVVSSShTdHJpbmdVdGlscy5zdHJpcChmaWxlbmFtZSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRSZXNvbHZlcigpLmdldExvY2F0aW9uQnlVUkkoU3RyaW5nVXRpbHMuc3RyaXAoZmlsZW5hbWUpLCAoU3RyaW5nKSBnZXRJbmNsdWRlcygpLnBlZWsoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBzaG91bGRuJ3QgaGFwcGVuCi0JCQkJZmlsZUxvY2F0aW9uID0gU3RyaW5nVXRpbHMuc3RyaXAoZmlsZW5hbWUpOwotCQkJfQotCQkJLy8gaG9wZWZ1bGx5LCBhIHJlc29sdmVyIGlzIHByZXNlbnQgYW5kIGhhcyByZXR1cm5lZCBhIGNhbm9uaWNhbCBmaWxlIHBhdGgKLQkJCWlmICghZ2V0SW5jbHVkZXMoKS5jb250YWlucyhmaWxlTG9jYXRpb24pICYmIGdldEJhc2VMb2NhdGlvbigpICE9IG51bGwgJiYgIWZpbGVMb2NhdGlvbi5lcXVhbHMoZ2V0QmFzZUxvY2F0aW9uKCkpKSB7Ci0JCQkJZ2V0SW5jbHVkZXMoKS5wdXNoKGZpbGVMb2NhdGlvbik7Ci0JCQkJSlNQSW5jbHVkZVJlZ2lvbkhlbHBlciBoZWxwZXIgPSBnZXRJbmNsdWRlc0hlbHBlcihmaWxlTG9jYXRpb24pOwotCQkJCWhlbHBlci5wYXJzZShmaWxlTG9jYXRpb24pOwotCQkJCWhlbHBlci53cml0ZVRvQnVmZmVycygpOwotCQkJCWdldEluY2x1ZGVzKCkucG9wKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG9uZSBoZWxwZXIgcGVyIGZpbGVMb2NhdGlvbgotCSAqLwotCXByb3RlY3RlZCBKU1BJbmNsdWRlUmVnaW9uSGVscGVyIGdldEluY2x1ZGVzSGVscGVyKFN0cmluZyBmaWxlTG9jYXRpb24pIHsKLQkJLy8gbGF6eSBjcmVhdGlvbgotCQlpZiAoZkpTUEluY2x1ZGVIZWxwZXJNYXAgPT0gbnVsbCkgewotCQkJZkpTUEluY2x1ZGVIZWxwZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCUpTUEluY2x1ZGVSZWdpb25IZWxwZXIgaGVscGVyID0gKEpTUEluY2x1ZGVSZWdpb25IZWxwZXIpIGZKU1BJbmNsdWRlSGVscGVyTWFwLmdldChmaWxlTG9jYXRpb24pOwotCQlpZiAoaGVscGVyID09IG51bGwpIHsKLQkJCWhlbHBlciA9IG5ldyBKU1BJbmNsdWRlUmVnaW9uSGVscGVyKHRoaXMpOwotCQkJZkpTUEluY2x1ZGVIZWxwZXJNYXAucHV0KGZpbGVMb2NhdGlvbiwgaGVscGVyKTsKLQkJfQotCQlyZXR1cm4gaGVscGVyOwotCX0KLQotCXByaXZhdGUgVVJJUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSA/IGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0UmVzb2x2ZXIoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCkgewotCQlpZiAoZ2V0UmVzb2x2ZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRSZXNvbHZlcigpLmdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFN0YWNrIGdldEluY2x1ZGVzKCkgewotCQlpZiAoZkluY2x1ZGVzID09IG51bGwpCi0JCQlmSW5jbHVkZXMgPSBuZXcgU3RhY2soKTsKLQkJcmV0dXJuIGZJbmNsdWRlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVFeHByZXNzaW9uU3RyaW5nKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZW1iZWRkZWRDb250YWluZXIsIGludCBqc3BQb3NpdGlvblN0YXJ0LCBpbnQganNwUG9zaXRpb25MZW5ndGgpIHsKLQkJYXBwZW5kVG9CdWZmZXIoRVhQUkVTU0lPTl9QUkVGSVgsIGZVc2VyQ29kZSwgZmFsc2UsIGVtYmVkZGVkQ29udGFpbmVyKTsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJDb2RlLCB0cnVlLCBlbWJlZGRlZENvbnRhaW5lciwganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgpOwotCQlhcHBlbmRUb0J1ZmZlcihFWFBSRVNTSU9OX1NVRkZJWCwgZlVzZXJDb2RlLCBmYWxzZSwgZW1iZWRkZWRDb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZURlY2xhcmF0aW9uU3RyaW5nKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZW1iZWRkZWRDb250YWluZXIsIGludCBqc3BQb3NpdGlvblN0YXJ0LCBpbnQganNwUG9zaXRpb25MZW5ndGgpIHsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJEZWNsYXJhdGlvbnMsIHRydWUsIGVtYmVkZGVkQ29udGFpbmVyLCBqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCk7Ci0JCWFwcGVuZFRvQnVmZmVyKEVOREwsIGZVc2VyRGVjbGFyYXRpb25zLCBmYWxzZSwgZW1iZWRkZWRDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIHVzZWQgYnkgWE1MSlNQUmVnaW9uSGVscGVyIGZvciBpbmNsdWRlZCBKU1AgZmlsZXMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBlbWJlZGRlZENvbnRhaW5lcgotCSAqIEBwYXJhbSBqc3BQb3NpdGlvblN0YXJ0Ci0JICogQHBhcmFtIGpzcFBvc2l0aW9uTGVuZ3RoCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlU2NyaXB0bGV0U3RyaW5nKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZW1iZWRkZWRDb250YWluZXIsIGludCBqc3BQb3NpdGlvblN0YXJ0LCBpbnQganNwUG9zaXRpb25MZW5ndGgpIHsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJDb2RlLCB0cnVlLCBlbWJlZGRlZENvbnRhaW5lciwganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgpOwotCX0KLQotCS8vIHRoZSBmb2xsb3dpbmcgMyBtZXRob2RzIGRldGVybWluZSB0aGUgY3Vyc29yIHBvc2l0aW9uCi0JLy8gPCU9ICU+Ci0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlRXhwcmVzc2lvbihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyBuZXdUZXh0ID0gZ2V0VW5lc2NhcGVkUmVnaW9uVGV4dChyZWdpb24sIEVYUFJFU1NJT04pOwotCQlhcHBlbmRUb0J1ZmZlcihFWFBSRVNTSU9OX1BSRUZJWCwgZlVzZXJDb2RlLCBmYWxzZSwgZkN1cnJlbnROb2RlKTsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJDb2RlLCB0cnVlLCBmQ3VycmVudE5vZGUpOwotCQlhcHBlbmRUb0J1ZmZlcihFWFBSRVNTSU9OX1NVRkZJWCwgZlVzZXJDb2RlLCBmYWxzZSwgZkN1cnJlbnROb2RlKTsKLQl9Ci0KLQkvLwotCS8vIDwlISAlPgotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZURlY2xhcmF0aW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24pIHsKLQkJU3RyaW5nIG5ld1RleHQgPSBnZXRVbmVzY2FwZWRSZWdpb25UZXh0KHJlZ2lvbiwgREVDTEFSQVRJT04pOwotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckRlY2xhcmF0aW9ucywgdHJ1ZSwgZkN1cnJlbnROb2RlKTsKLQkJYXBwZW5kVG9CdWZmZXIoRU5ETCwgZlVzZXJEZWNsYXJhdGlvbnMsIGZhbHNlLCBmQ3VycmVudE5vZGUpOwotCX0KLQotCS8vCi0JLy8gPCUgJT4KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVTY3JpcHRsZXQoSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbikgewotCQlTdHJpbmcgbmV3VGV4dCA9IGdldFVuZXNjYXBlZFJlZ2lvblRleHQocmVnaW9uLCBTQ1JJUFRMRVQpOwotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckNvZGUsIHRydWUsIGZDdXJyZW50Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHVzaW5nIGEgcmVnaW9uLCBwcm9iYWJseSBpbmRpcmVjdCBtYXBwaW5nIChlZy4gPCVAcGFnZSBpbmNsdWRlPSIiJT4pCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiBAcGFyYW0gYnVmZmVyCi0JICogQHBhcmFtIGFkZFRvTWFwCi0JICogQHBhcmFtIGpzcFJlZmVyZW5jZVJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRUb0J1ZmZlcihTdHJpbmcgbmV3VGV4dCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBhZGRUb01hcCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGpzcFJlZmVyZW5jZVJlZ2lvbikgewotCSAJaW50IHN0YXJ0ID0gMCwgbGVuZ3RoID0gMDsKLQkgCWlmKGpzcFJlZmVyZW5jZVJlZ2lvbiAhPSBudWxsKSB7Ci0JIAkJc3RhcnQgPSBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkgCQlsZW5ndGggPSBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JIAl9Ci0JIAlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBidWZmZXIsIGFkZFRvTWFwLCBqc3BSZWZlcmVuY2VSZWdpb24sIHN0YXJ0LCBsZW5ndGgsIGZhbHNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFRvQnVmZmVyKFN0cmluZyBuZXdUZXh0LCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBib29sZWFuIGFkZFRvTWFwLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uTGVuZ3RoKSB7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGJ1ZmZlciwgYWRkVG9NYXAsIGpzcFJlZmVyZW5jZVJlZ2lvbiwganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgsIHRydWUpOwotCX0KLQkgCi0JLyoqCi0JICogQWRkcyBuZXdUZXh0IHRvIHRoZSBidWZmZXIgcGFzc2VkIGluLCBhbmQgYWRkcyB0byB0cmFuc2xhdGlvbiBtYXBwaW5nIGFzIHNwZWNpZmllZCBieSB0aGUgYWRkVG9NYXAgZmxhZy4KLQkgKiBzb21lIHNwZWNpYWwgY2FzZXMgdG8gY29uc2lkZXIgKHRoYXQgbWF5IGJlIGFmZmVjdGVkIGJ5IGNoYW5nZXMgdG8gdGhpcyBtZXRob2QpOiAKLQkgKiBpbmNsdWRlZCBmaWxlcwotCSAqIHNjcmlwbGV0cyBpbiBhbiBhdHRyaWJ1dGUgdmFsdWUKLQkgKiByZWZhY3RvcmluZwotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogQHBhcmFtIGJ1ZmZlcgotCSAqIEBwYXJhbSBhZGRUb01hcAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRUb0J1ZmZlcihTdHJpbmcgbmV3VGV4dCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBhZGRUb01hcCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGpzcFJlZmVyZW5jZVJlZ2lvbiwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkxlbmd0aCwgYm9vbGVhbiBpc0luZGlyZWN0KSB7Ci0JCQotCQkvLyBub3RoaW5nIHRvIGFwcGVuZAotCQlpZiAoanNwUmVmZXJlbmNlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBhZGQgYSBuZXdsaW5lIHNvIHRyYW5zbGF0aW9uIGxvb2tzIGNsZWFuZXIKLQkJbmV3VGV4dCArPSBFTkRMOwotCQkKLQkJaWYgKGJ1ZmZlciA9PSBmVXNlckNvZGUpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV3VGV4dCk7Ci0JCQlpZiAoYWRkVG9NYXApIHsKLQkJCQlpZiAoaXNVc2ViZWFuVGFnKGpzcFJlZmVyZW5jZVJlZ2lvbikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIHJlcXVpcmVzIHNwZWNpYWwgbWFwcGluZwotCQkJCQkJYXBwZW5kVXNlQmVhblRvQnVmZmVyKG5ld1RleHQsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgaXNJbmRpcmVjdCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCQkJCS8vIHN0aWxsIHdvcmtpbmcgb3V0IGtpbmtzCi0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhbGwgb3RoZXIgY2FzZXMKLQkJCQkJUG9zaXRpb24gamF2YVJhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlLCBuZXdUZXh0Lmxlbmd0aCgpKTsKLQkJCQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgpOwotCQkJCQkKLQkJCQkJZkNvZGVSYW5nZXMucHV0KGphdmFSYW5nZSwganNwUmFuZ2UpOwotCQkJCQlpZihpc0luZGlyZWN0KQotCQkJCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmT2Zmc2V0SW5Vc2VyQ29kZSArPSBuZXdUZXh0Lmxlbmd0aCgpOwotCQl9Ci0JCWVsc2UgaWYgKGJ1ZmZlciA9PSBmVXNlckRlY2xhcmF0aW9ucykgewotCQkJYnVmZmVyLmFwcGVuZChuZXdUZXh0KTsKLQkJCWlmIChhZGRUb01hcCkgewotCQkJCVBvc2l0aW9uIGphdmFSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyRGVjbGFyYXRpb25zLCBuZXdUZXh0Lmxlbmd0aCgpKTsKLQkJCQlQb3NpdGlvbiBqc3BSYW5nZSA9IG5ldyBQb3NpdGlvbihqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCk7Ci0JCQkJCi0JCQkJZkRlY2xhcmF0aW9uUmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCQlpZihpc0luZGlyZWN0KQotCQkJCQlmSW5kaXJlY3RSYW5nZXMucHV0KGphdmFSYW5nZSwganNwUmFuZ2UpOwotCQkJfQotCQkJZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucyArPSBuZXdUZXh0Lmxlbmd0aCgpOwotCQl9Ci0JCWVsc2UgaWYgKGJ1ZmZlciA9PSBmVXNlckltcG9ydHMpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV3VGV4dCk7Ci0JCQlpZiAoYWRkVG9NYXApIHsKLQkJCQlhcHBlbmRJbXBvcnRUb0J1ZmZlcihqc3BSZWZlcmVuY2VSZWdpb24sIGlzSW5kaXJlY3QpOwotCQkJfQotCQkJZk9mZnNldEluVXNlckltcG9ydHMgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVXNlYmVhblRhZyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNVc2VCZWFuID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FICYmIGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpLmVxdWFscygianNwOnVzZUJlYW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaXNVc2VCZWFuID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNVc2VCZWFuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogQHBhcmFtIGpzcFJlZmVyZW5jZVJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRJbXBvcnRUb0J1ZmZlcihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBib29sZWFuIGlzSW5kaXJlY3QpIHsKLQkJLy8gdGhlc2UgcG9zaXRpb25zIHdpbGwgYmUgdXBkYXRlZCBiZWxvdwotCQkvLyA3IGlzIGxlbmd0aCBvZiAiaW1wb3J0ICIKLQkJUG9zaXRpb24gamF2YVJhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJJbXBvcnRzICsgNywgMSk7Ci0JCVBvc2l0aW9uIGpzcFJhbmdlID0gbmV3IFBvc2l0aW9uKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydCgpLCBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkKLQkJLy8gY2FsY3VsYXRlIEpTUCByYW5nZSBieSBmaW5kaW5nICJpbXBvcnQiIGF0dHJpYnV0ZQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBzaXplID0gcmVnaW9ucy5zaXplKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYoci5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKQotCQkJCWlmKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpLnRyaW0oKS5lcXVhbHMoImltcG9ydCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gZ2V0IHRoZSBhdHRyIHZhbHVlIHJlZ2lvbgotCQkJCQlpZihzaXplID4gaSsyKSB7Ci0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSsyKTsKLQkJCQkJCWlmKHIuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQkvLyB1c2UgdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUgKG1pbnVzIHRoZSBxdW90ZXMpCi0JCQkJCQkJLy8gd29uJ3Qgd29yayBmb3IgbXVsdGlwbGUKLQkJCQkJCQlTdHJpbmcgaW1wb3J0VGV4dCA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkJCWludCBxdW90ZU9mZnNldCA9IChpbXBvcnRUZXh0LnN0YXJ0c1dpdGgoIlwiIikgfHwgaW1wb3J0VGV4dC5zdGFydHNXaXRoKCInIikpID8gMSA6IDA7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCVN0cmluZyBzdHJpcHBlZFRleHQgPSBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlc0xlYXZlSW5zaWRlU3BhY2UoaW1wb3J0VGV4dCk7Ci0JCQkJCQkJanNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpK3F1b3RlT2Zmc2V0LCBzdHJpcHBlZFRleHQubGVuZ3RoKCkpOwotCQkJCQkJCS8vIHNldCBqYXZhIHJhbmdlIGxlbmd0aAotCQkJCQkJCWphdmFSYW5nZS5zZXRMZW5ndGgoc3RyaXBwZWRUZXh0Lmxlbmd0aCgpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJfQotCi0JCS8vIHB1dCByYW5nZXMgaW4gamF2YSAtPiBqc3AgcmFuZ2UgbWFwCi0JCWZJbXBvcnRSYW5nZXMucHV0KGphdmFSYW5nZSwganNwUmFuZ2UpOwotCQlpZihpc0luZGlyZWN0KQotCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZW1wIGZpeCBmb3IgMjgyMjk1IHVudGlsIGJldHRlciBtYXBwaW5nIGlzIGluIHBsYWNlCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFVzZUJlYW5Ub0J1ZmZlcihTdHJpbmcgbmV3VGV4dCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGpzcFJlZmVyZW5jZVJlZ2lvbiwgYm9vbGVhbiBpc0luZGlyZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gamF2YSBzdHJpbmcgbG9va3MgbGlrZSB0aGlzICh0b2tlbml6ZWQpCi0JCS8vIFR5cGUgaWQgPSBuZXcgQ2xhc3NuYW1lKCk7XG4KLQkJLy8gMCAgICAxICAyIDMgICA0Ci0JCS8vIG9yCi0JCS8vIFR5cGUgaWQgPSBudWxsO1xuIC8vIGlmIHRoZXJlIGlzIG5vIGNsYXNzbmFtZQotCQkvLyAwICAgIDEgIDIgMwotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIGNhbGN1bGF0ZSBqYXZhIHJhbmdlcwotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihuZXdUZXh0LCAiICIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaSA9IDA7Ci0JCVN0cmluZ1tdIHBhcnNlZEphdmEgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJcGFyc2VkSmF2YVtpKytdID0gc3QubmV4dFRva2VuKCk7Ci0KLQkJU3RyaW5nIHR5cGUgPSBwYXJzZWRKYXZhWzBdICE9IG51bGwgPyBwYXJzZWRKYXZhWzBdIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGlkID0gcGFyc2VkSmF2YVsxXSAhPSBudWxsID8gcGFyc2VkSmF2YVsxXSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjbGFzc05hbWUgPSBwYXJzZWRKYXZhLmxlbmd0aCA+IDQgPyBwYXJzZWRKYXZhWzRdIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlQb3NpdGlvbiBqYXZhVHlwZVJhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlLCB0eXBlLmxlbmd0aCgpKTsKLQkJUG9zaXRpb24gamF2YUlkUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUgKyB0eXBlLmxlbmd0aCgpICsgMSwgaWQubGVuZ3RoKCkpOwotCQlQb3NpdGlvbiBqYXZhQ2xhc3NSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSArIHR5cGUubGVuZ3RoKCkgKyAxICsgaWQubGVuZ3RoKCkgKyA3LCAwKTsKLQkJaWYoY2xhc3NOYW1lLmxlbmd0aCgpID49IDQpIHsKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjEzMgotICAgICAgICAgICAgaW50IGNsYXNzTmFtZUxlbmd0aCA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCxjbGFzc05hbWUuaW5kZXhPZignKCcpKS5sZW5ndGgoKTsKLQkJCWphdmFDbGFzc1JhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlICsgdHlwZS5sZW5ndGgoKSArIDEgKyBpZC5sZW5ndGgoKSArIDcsIGNsYXNzTmFtZUxlbmd0aCk7Ci0gICAgICAgIH0KLQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBjYWxjdWxhdGUganNwIHJhbmdlcwotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUgPSAiIiwgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgcXVvdGVPZmZzZXQgPSAwOwotCQlQb3NpdGlvbiBqc3BUeXBlUmFuZ2UgPSBudWxsOwotCQlQb3NpdGlvbiBqc3BJZFJhbmdlID0gbnVsbDsKLQkJUG9zaXRpb24ganNwQ2xhc3NSYW5nZSA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWdpb25zLnNpemUoKTsgaisrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaik7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJYXR0ck5hbWUgPSBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0VGV4dChyKTsKLQkJCQlpZiAocmVnaW9ucy5zaXplKCkgPj0gaiArIDIgJiYgcmVnaW9ucy5nZXQoaiArIDIpLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCS8vIGdldCBhdHRyIHZhbHVlCi0JCQkJCXIgPSByZWdpb25zLmdldChqICsgMik7Ci0JCQkJCWF0dHJWYWx1ZSA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkKLQkJCQkJLy8gbWF5IGhhdmUgcXVvdGVzCi0JCQkJCXF1b3RlT2Zmc2V0ID0gKGF0dHJWYWx1ZS5zdGFydHNXaXRoKCJcIiIpIHx8IGF0dHJWYWx1ZS5zdGFydHNXaXRoKCInIikpID8gMSA6IDA7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkKLQkJCQkJaWYgKGF0dHJOYW1lLmVxdWFscygidHlwZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQlqc3BUeXBlUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpICsgcXVvdGVPZmZzZXQsIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShhdHRyVmFsdWUpLmxlbmd0aCgpKTsKLQkJCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQlqc3BJZFJhbmdlID0gbmV3IFBvc2l0aW9uKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHF1b3RlT2Zmc2V0LCBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlc0xlYXZlSW5zaWRlU3BhY2UoYXR0clZhbHVlKS5sZW5ndGgoKSk7Ci0JCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiY2xhc3MiKSkgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWpzcENsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpICsgcXVvdGVPZmZzZXQsIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShhdHRyVmFsdWUpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHB1dCByYW5nZXMgaW4gamF2YSAtPiBqc3AgcmFuZ2UgbWFwCi0JCWlmICghdHlwZS5lcXVhbHMoIiIpICYmIGpzcFR5cGVSYW5nZSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZDb2RlUmFuZ2VzLnB1dChqYXZhVHlwZVJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQkJLy8gbm90ZTogZG9uJ3QgdXBkYXRlIG9mZnNldHMgZm9yIHRoaXMgbWFwIHdoZW4gcmVzdWx0IGlzIGJ1aWx0Ci0JCQkvLyB0aGV5J2xsIGJlIHVwZGF0ZWQgd2hlbiBjb2RlIHJhbmdlcyBvZmZzZXRzIGFyZSB1cGRhdGVkCi0JCQlmVXNlQmVhblJhbmdlcy5wdXQoamF2YVR5cGVSYW5nZSwganNwVHlwZVJhbmdlKTsKLQkJCWlmKGlzSW5kaXJlY3QpCi0JCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhVHlwZVJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQl9Ci0JCWlmICghaWQuZXF1YWxzKCIiKSAmJiBqc3BJZFJhbmdlICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJZkNvZGVSYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BJZFJhbmdlKTsKLQkJCS8vIG5vdGU6IGRvbid0IHVwZGF0ZSBvZmZzZXRzIGZvciB0aGlzIG1hcCB3aGVuIHJlc3VsdCBpcyBidWlsdAotCQkJLy8gdGhleSdsbCBiZSB1cGRhdGVkIHdoZW4gY29kZSByYW5nZXMgb2Zmc2V0cyBhcmUgdXBkYXRlZAotCQkJZlVzZUJlYW5SYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQkJaWYoaXNJbmRpcmVjdCkKLQkJCQlmSW5kaXJlY3RSYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQl9Ci0JCWlmICghY2xhc3NOYW1lLmVxdWFscygiIikgJiYganNwQ2xhc3NSYW5nZSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZDb2RlUmFuZ2VzLnB1dChqYXZhQ2xhc3NSYW5nZSwganNwQ2xhc3NSYW5nZSk7Ci0JCQkvLyBub3RlOiBkb24ndCB1cGRhdGUgb2Zmc2V0cyBmb3IgdGhpcyBtYXAgd2hlbiByZXN1bHQgaXMgYnVpbHQKLQkJCS8vIHRoZXknbGwgYmUgdXBkYXRlZCB3aGVuIGNvZGUgcmFuZ2VzIG9mZnNldHMgYXJlIHVwZGF0ZWQKLQkJCWZVc2VCZWFuUmFuZ2VzLnB1dChqYXZhQ2xhc3NSYW5nZSwganNwVHlwZVJhbmdlKTsKLQkJCWlmKGlzSW5kaXJlY3QpCi0JCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhQ2xhc3NSYW5nZSwganNwVHlwZVJhbmdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYnVmZmVyIHRvIHRoZSBjdXJyZW50IEpTUFR5cGU6Ci0JICogU1RBTkRBUkRfSlNQLCBFTUJFRERFRF9KU1AsIERFQ0xBUkFUSU9OLCBFWFBSRVNTSU9OLCBTQ1JJUFRMRVQKLQkgKiAoZm9yIGtlZXB0aW5nIHRyYWNrIG9mIGN1cnNvciBwb3NpdGlvbiB3aGVuIHRoZSBmaW5hbCBkb2N1bWVudCBpcyBidWlsdCkKLQkgKiBAcGFyYW0gSlNQVHlwZSB0aGUgSlNQIHR5cGUgdGhhdCB0aGUgY3Vyc29yIGlzIGluCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3Vyc29yT3duZXIoaW50IEpTUFR5cGUpIHsKLQkJc3dpdGNoIChKU1BUeXBlKSB7Ci0JCQljYXNlIERFQ0xBUkFUSU9OIDoKLQkJCQlzZXRDdXJzb3JPd25lcihmVXNlckRlY2xhcmF0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVYUFJFU1NJT04gOgotCQkJY2FzZSBTQ1JJUFRMRVQgOgotCQkJCXNldEN1cnNvck93bmVyKGZVc2VyQ29kZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzZXRDdXJzb3JPd25lcihmVXNlckNvZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhpcyBwaWVjZSBvZiBjb2RlIGl0ZXJhdGVzIHRocm91Z2ggZkN1cnJlbnROb2RlcwotCSAqIGFuZCBjbHVtcHMgdGhlbSB0b2dldGhlciBpbiBhIGJpZyB0ZXh0IHN0cmluZwotCSAqIC0gdW5lc2NhcGluZyBjaGFyYWN0ZXJzIGlmIHRoZXkgYXJlIG5vdCBDREFUQQotCSAqIC0gc2ltcGx5IGFwcGVuZGluZyBpZiB0aGV5IGFyZSBDREFUQQotCSAqIGl0IHN0b3BzIGl0ZXJhdGlvbiB3aGVuIGl0IGhpdHMgYSBub2RlIHRoYXQgaXMgYW4gWE1MX1RBR19OQU1FICh3aGljaCBzaG91bGQgYmUgdGhlIHJlZ2lvbiBjbG9zaW5nIHRhZykKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuZXNjYXBlZFJlZ2lvblRleHQoSVRleHRSZWdpb25Db2xsZWN0aW9uIHN0UmVnaW9uLCBpbnQgSlNQVHlwZSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgc3RhcnQgPSBzdFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gc3RSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCS8vIGFkanVzdG1lbnQgbmVjZXNzYXJ5IGZvciBlbWJlZGRlZCByZWdpb24gY29udGFpbmVycwotCQlpZiAoc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lciAmJiBzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQlpZiAoc3RSZWdpb24uZ2V0UmVnaW9ucygpICE9IG51bGwgJiYgc3RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiBqc3BDb250ZW50ID0gc3RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsgLy8gc2hvdWxkIGJlIGpzcENvbnRlbnQgcmVnaW9uCi0JCQkJc3RhcnQgPSBzdFJlZ2lvbi5nZXRTdGFydE9mZnNldChqc3BDb250ZW50KTsKLQkJCQllbmQgPSBzdFJlZ2lvbi5nZXRFbmRPZmZzZXQoanNwQ29udGVudCk7Ci0JCQl9Ci0JCX0KLQkJaW50IENEQVRBT2Zmc2V0ID0gMDsgLy8gbnVtYmVyIG9mIGNoYXJhY3RlcnMgbG9zdCBpbiBjb252ZXJzaW9uCi0JCWludCBidWZmZXJTaXplID0gMDsKLQkJaWYgKHN0UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCBzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5CTE9DS19URVhUIC8vIG5lZWQgdGhpcyBmb3IgZW1iZWRkZWQgSlNQIHJlZ2lvbnMKLQkJCQkJfHwgc3RSZWdpb24uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSAvLyBuZWVkIHRoaXMgaW4gY2FzZSB0aGVyZSdzIG5vIHJlZ2lvbi4uLgotCQl7Ci0JCQlmSW5Db2RlUmVnaW9uID0gKHN0YXJ0IDw9IGZTb3VyY2VQb3NpdGlvbiAmJiBmU291cmNlUG9zaXRpb24gPD0gZW5kKTsKLQkJCWlmIChmSW5Db2RlUmVnaW9uKSB7Ci0JCQkJc2V0Q3Vyc29yT3duZXIoSlNQVHlwZSk7Ci0JCQkJc2V0UmVsYXRpdmVPZmZzZXQoKGZTb3VyY2VQb3NpdGlvbiAtIHN0YXJ0KSArIGdldEN1cnNvck93bmVyKCkubGVuZ3RoKCkpOwotCQkJCWlmIChKU1BUeXBlID09IEVYUFJFU1NJT04pIHsKLQkJCQkJLy8gaWYgYW4gZXhwcmVzc2lvbiwgYWRkIHRoZW4gbGVuZ3RoIG9mIHRoZSBlbmNsb3NpbmcgcGFyZW4uLgotCQkJCQlzZXRDdXJzb3JJbkV4cHJlc3Npb24odHJ1ZSk7Ci0JCQkJCXNldFJlbGF0aXZlT2Zmc2V0KGdldFJlbGF0aXZlT2Zmc2V0KCkgKyBFWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJSVRleHRSZWdpb24ganNwQ29udGVudCA9IG51bGw7Ci0JCQlpZiAoc3RSZWdpb24uZ2V0UmVnaW9ucygpICE9IG51bGwgJiYgc3RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpCi0JCQkJanNwQ29udGVudCA9IHN0UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlyZXR1cm4gKGpzcENvbnRlbnQgIT0gbnVsbCkgPyBzdFJlZ2lvbi5nZXRGdWxsVGV4dChqc3BDb250ZW50KSA6IHN0UmVnaW9uLmdldEZ1bGxUZXh0KCk7IC8vIGRvbid0IHVuZXNjYXBlIGlmIGl0J3Mgbm90IGFuIFhNTEpTUCB0YWcKLQkJfQotCQllbHNlIGlmIChzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB7Ci0JCQkvLyBuZWVkIHRvIGRldGVybWluZSBjdXJzb3Igb3duZXIgc28gdGhhdCB0aGUgZkN1cm9zb3JQb3NpdGlvbiB3aWxsIGJlCi0JCQkvLyBjb3JyZWN0IGV2ZW4gaWYgdGhlcmUgaXMgbm8gcmVnaW9uIGFmdGVyIHRoZSBjdXJzb3IgaW4gdGhlIEpTUCBmaWxlCi0JCQlzZXRDdXJzb3JPd25lcihKU1BUeXBlKTsKLQkJfQotCQkvLyBpdGVyYXRlIFhNTENPTlRFTlQgYW5kIENEQVRBIHJlZ2lvbnMKLQkJLy8gbG9vcCBmQ3VycmVudE5vZGUgdW50aWwgeW91IGhpdCA8L2pzcDpzY3JpcHRsZXQ+IChvciBvdGhlciBjbG9zaW5nIHRhZyBuYW1lKQotCQl3aGlsZSAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsICYmIGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpICE9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSAvLyBuZWVkIHRvIHN0b3Agb24gdGhlIGVuZGluZyB0YWcgbmFtZS4uLgotCQl7Ci0JCQlzdGFydCA9IGdldEN1cnJlbnROb2RlKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWVuZCA9IGdldEN1cnJlbnROb2RlKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlidWZmZXJTaXplID0gYnVmZmVyLmxlbmd0aCgpOwotCQkJQ0RBVEFPZmZzZXQgPSB1bmVzY2FwZVJlZ2lvbihnZXRDdXJyZW50Tm9kZSgpLCBidWZmZXIpOwotCQkJZkluQ29kZVJlZ2lvbiA9IChzdGFydCA8PSBmU291cmNlUG9zaXRpb24gJiYgZlNvdXJjZVBvc2l0aW9uIDw9IGVuZCk7Ci0JCQlpZiAoZkluQ29kZVJlZ2lvbikgewotCQkJCXNldEN1cnNvck93bmVyKEpTUFR5cGUpOwotCQkJCS8vIHRoaXMgb2Zmc2V0IGlzIHNvcnQgb2YgY29tcGxpY2F0ZWQuLi4KLQkJCQkvLyBpdCdzIGNvbXBvc2VkIG9mOgotCQkJCS8vIDEuIHRoZSBsZW5ndGggb2YgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHJlZ2lvbiB1cCB0aWxsIHdoZXJlIHRoZSBjdXJzb3IgaXMKLQkJCQkvLyAyLiBtaW51cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgbG9zdCBpbiBDREFUQSB0cmFuc2xhdGlvbgotCQkJCS8vIDMuIHBsdXMgdGhlIGxlbmd0aCBvZiB0aGUgZXNjYXBlZCBidWZmZXIgYmVmb3JlIHRoZSBjdXJyZW50IHJlZ2lvbiwgYnV0IAotCQkJCS8vICAgIGlzIHN0aWxsIHdpdGhpbiB0aGUganNwIHRhZwotCQkJCXNldFJlbGF0aXZlT2Zmc2V0KChmU291cmNlUG9zaXRpb24gLSBnZXRDdXJyZW50Tm9kZSgpLmdldFN0YXJ0T2Zmc2V0KCkpICsgZ2V0Q3Vyc29yT3duZXIoKS5sZW5ndGgoKSAtIENEQVRBT2Zmc2V0ICsgYnVmZmVyU2l6ZSk7Ci0JCQkJaWYgKEpTUFR5cGUgPT0gRVhQUkVTU0lPTikgewotCQkJCQlzZXRDdXJzb3JJbkV4cHJlc3Npb24odHJ1ZSk7Ci0JCQkJCS8vIGlmIGFuIGV4cHJlc3Npb24sIGFkZCB0aGVuIGxlbmd0aCBvZiB0aGUgZW5jbG9zaW5nIHBhcmVuLi4KLQkJCQkJc2V0UmVsYXRpdmVPZmZzZXQoZ2V0UmVsYXRpdmVPZmZzZXQoKSArIEVYUFJFU1NJT05fUFJFRklYLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKQotCQkJCWFkdmFuY2VOZXh0Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gciB0aGUgcmVnaW9uIHRvIGJlIHVuZXNjYXBlZCAoWE1MQ29udGVudCwgWE1MIEVOVElUWSBSRUZFUkVOQ0UsIG9yIENEQVRBKQotCSAqIEBwYXJhbSBzYiB0aGUgc3RyaW5nYnVmZmVyIHRvIGFwcGVuZCB0aGUgdGV4dCB0bwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgaW4gdW5lc2NhcGluZyB0aGlzIHRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHVuZXNjYXBlUmVnaW9uKElUZXh0UmVnaW9uIHIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGhCZWZvcmUgPSAwLCBsZW5ndGhBZnRlciA9IDAsIGNkYXRhX3RhZ3NfbGVuZ3RoID0gMDsKLQkJaWYgKHIgIT0gbnVsbCAmJiAoci5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCB8fCByLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSkgewotCQkJbGVuZ3RoQmVmb3JlID0gKGdldEN1cnJlbnROb2RlKCkgIT0gcikgPyBnZXRDdXJyZW50Tm9kZSgpLmdldEZ1bGxUZXh0KHIpLmxlbmd0aCgpIDogZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dCgpLmxlbmd0aCgpOwotCQkJcyA9IEVzY2FwZWRUZXh0VXRpbC5nZXRVbmVzY2FwZWRUZXh0KGdldEN1cnJlbnROb2RlKCksIHIpOwotCQkJbGVuZ3RoQWZ0ZXIgPSBzLmxlbmd0aCgpOwotCQkJc2IuYXBwZW5kKHMpOwotCQl9Ci0JCWVsc2UgaWYgKHIgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQlpZiAociBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSAvLyBvbmx5IGludGVyZXN0ZWQgaW4gY29udGVudHMKLQkJCXsKLQkJCQkvLyBuYXZpZ2F0ZSB0byBuZXh0IHJlZ2lvbiBjb250YWluZXIgKHdoaWNoIHNob3VsZCBiZSBhIEpTUCByZWdpb24pCi0JCQkJSXRlcmF0b3IgaXQgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByKS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQlJVGV4dFJlZ2lvbiB0ZW1wID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCXRlbXAgPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lciB8fCB0ZW1wLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQkJCQlzYi5hcHBlbmQoZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dCh0ZW1wKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodGVtcC5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTiB8fCB0ZW1wLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkgewotCQkJCQkJY2RhdGFfdGFnc19sZW5ndGggKz0gdGVtcC5nZXRMZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKGxlbmd0aEJlZm9yZSAtIGxlbmd0aEFmdGVyICsgY2RhdGFfdGFnc19sZW5ndGgpOwotCX0KLQotCS8vCi0JLy8gPGpzcDp1c2VCZWFuPgotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVVzZUJlYW4oSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lcikgewotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyBpZCA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0JCQotCQlJdGVyYXRvciByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIChyLmdldFR5cGUoKSAhPSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgci5nZXRUeXBlKCkgIT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCi0JCQlhdHRyTmFtZSA9IGF0dHJWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlhdHRyTmFtZSA9IGNvbnRhaW5lci5nZXRUZXh0KHIpLnRyaW0oKTsKLQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoY29udGFpbmVyLmdldFRleHQocikpOwotCQkJCQl9Ci0JCQkJCS8vIGhhcyBlcXVhbHMsIGJ1dCBubyB2YWx1ZT8KLQkJCQl9Ci0JCQkJLy8gYW4gYXR0cmlidXRlIHdpdGggbm8gZXF1YWxzPwotCQkJfQotCQkJLy8gKHBhKSBtaWdodCBuZWVkIGRpZmZlcmVudCBsb2dpYyBoZXJlIGlmIHdlIHdhbm5hIHN1cHBvcnQgbW9yZQotCQkJaWYgKGF0dHJOYW1lICE9IG51bGwgJiYgYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzKCJpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWlkID0gYXR0clZhbHVlOwotCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiY2xhc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQljbGFzc05hbWUgPSBhdHRyVmFsdWU7Ci0JCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJ0eXBlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJdHlwZSA9IGF0dHJWYWx1ZTsKLQkJCX0KLQotCQl9Ci0JCS8vIGhhcyBpZCB3LyB0eXBlIGFuZC9vciBjbGFzc25hbWUgCi0JCS8vIFR5cGUgaWQgPSBuZXcgQ2xhc3NuYW1lKCk7Ci0JCS8vIG9yCi0JCS8vIFR5cGUgaWQgPSBudWxsOyAvLyBpZiB0aGVyZSBpcyBubyBjbGFzc25hbWUKLQkJaWYgKGlkICE9IG51bGwgJiYgKHR5cGUgIT0gbnVsbCB8fCBjbGFzc05hbWUgIT0gbnVsbCkpIHsKLQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJdHlwZSA9IGNsYXNzTmFtZTsKLQkJCVN0cmluZyBwcmVmaXggPSB0eXBlICsgIiAiICsgaWQgKyAiID0gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgc3VmZml4ID0gIm51bGw7XG4iOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpCi0JCQkJc3VmZml4ID0gIm5ldyAiICsgY2xhc3NOYW1lICsgIigpO1xuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZmVyZW5jZVJlZ2lvbiA9IGZDdXJyZW50Tm9kZS5nZXRQcmV2aW91cygpICE9IG51bGwgPyBmQ3VycmVudE5vZGUuZ2V0UHJldmlvdXMoKSA6IGZDdXJyZW50Tm9kZTsKLQkJCWFwcGVuZFRvQnVmZmVyKHByZWZpeCArIHN1ZmZpeCwgZlVzZXJDb2RlLCB0cnVlLCByZWZlcmVuY2VSZWdpb24pOwotCQl9Ci0JfQotCi0JZmluYWwgcHVibGljIGludCBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckluRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JJbkV4cHJlc3Npb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3Vyc29ySW5FeHByZXNzaW9uKGJvb2xlYW4gaW4pIHsKLQkJZkN1cnNvckluRXhwcmVzc2lvbiA9IGluOwotCX0KLQotCWZpbmFsIHB1YmxpYyB2b2lkIHNldFNvdXJjZUN1cnNvcihpbnQgaSkgewotCQlmU291cmNlUG9zaXRpb24gPSBpOwotCX0KLQotCWZpbmFsIHB1YmxpYyBpbnQgZ2V0U291cmNlUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmU291cmNlUG9zaXRpb247Ci0JfQotCQotCWZpbmFsIHB1YmxpYyBUTERDTURvY3VtZW50TWFuYWdlciBnZXRUTERDTURvY3VtZW50TWFuYWdlcigpIHsKLQkJcmV0dXJuIFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JfQotCi0JZmluYWwgcHVibGljIHZvaWQgc2V0UmVsYXRpdmVPZmZzZXQoaW50IHJlbGF0aXZlT2Zmc2V0KSB7Ci0JCXRoaXMuZlJlbGF0aXZlT2Zmc2V0ID0gcmVsYXRpdmVPZmZzZXQ7Ci0JfQotCi0JZmluYWwgcHVibGljIGludCBnZXRSZWxhdGl2ZU9mZnNldCgpIHsKLQkJcmV0dXJuIGZSZWxhdGl2ZU9mZnNldDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q3Vyc29yT3duZXIoU3RyaW5nQnVmZmVyIGN1cnNvck93bmVyKSB7Ci0JCXRoaXMuZkN1cnNvck93bmVyID0gY3Vyc29yT3duZXI7Ci0JfQotCi0JZmluYWwgcHVibGljIFN0cmluZ0J1ZmZlciBnZXRDdXJzb3JPd25lcigpIHsKLQkJcmV0dXJuIGZDdXJzb3JPd25lcjsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2V0Q3VycmVudE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSkgewotCQlyZXR1cm4gdGhpcy5mQ3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZTsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRDdXJyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIGZDdXJyZW50Tm9kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1hNTEpTUFJlZ2lvbkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1hNTEpTUFJlZ2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQ1MzYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogUGFyc2VyL2hlbHBlciBjbGFzcyBmb3IgSlNQVHJhbnNsYXRvci4gIFVzZWQgZm9yIHBhcnNpbmcgWE1MLUpTUCByZWdpb25zIChpbiBhIHNjcmlwdCBibG9jaykKLSAqIEEgbG90IG9mIGxvZ2ljIGJvcnJvd2VkIGZyb20gVExEQ01Eb2N1bWVudE1hbmFnZXIuICBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgWE1MSlNQUmVnaW9uSGVscGVyIHBlciB0ZXh0IGZpbGUKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotY2xhc3MgWE1MSlNQUmVnaW9uSGVscGVyIGltcGxlbWVudHMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciB7Ci0JcHJpdmF0ZSBmaW5hbCBKU1BUcmFuc2xhdG9yIGZUcmFuc2xhdG9yOwotCXByb3RlY3RlZCBKU1BTb3VyY2VQYXJzZXIgZkxvY2FsUGFyc2VyID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUZXh0VG9QYXJzZSA9IG51bGw7Ci0JLy8gbmVlZCB0aGlzIGlmIG5vdCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50IChlZy4gcGFyc2luZyBqdXN0IGEgc2NyaXB0IGJsb2NrKQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0T2ZUZXh0VG9QYXJzZSA9IDA7Ci0JLy8gYnVmZmVycyBmb3IgdGV4dCB0aGF0IHRoaXMgY2xhc3MgcGFyc2VzCQotCXByb3RlY3RlZCBMaXN0IGZTY3JpcHRsZXRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGZFeHByZXNzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBmRGVjbGFyYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIG5hbWUgb2YgdGhlIG9wZW4gdGFnIHRoYXQgd2FzIGxhc3QgaGFuZGxlZCAoaWYgd2UgYXJlIGludGVyZXN0ZWQgaW4gaXQpCi0JcHJvdGVjdGVkIFN0cmluZyBmVGFnbmFtZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBmVGV4dEJlZm9yZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBmVW5lc2NhcGVkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBmU3RyaXBwZWRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBmb3IgcmVjb25jaWxpbmcgY3Vyc29yIHBvc2l0aW9uIGxhdGVyCi0JaW50IGZQb3NzaWJsZU93bmVyID0gSlNQVHJhbnNsYXRvci5TQ1JJUFRMRVQ7Ci0KLQlwdWJsaWMgWE1MSlNQUmVnaW9uSGVscGVyKEpTUFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlnZXRMb2NhbFBhcnNlcigpLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCXRoaXMuZlRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOwotCX0KLQotCXByb3RlY3RlZCBKU1BTb3VyY2VQYXJzZXIgZ2V0TG9jYWxQYXJzZXIoKSB7Ci0JCWlmIChmTG9jYWxQYXJzZXIgPT0gbnVsbCkKLQkJCWZMb2NhbFBhcnNlciA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJcmV0dXJuIGZMb2NhbFBhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZkxvY2FsUGFyc2VyLmFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHRleHRUb1BhcnNlKSB7Ci0JCXJlc2V0KHRleHRUb1BhcnNlLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgdGV4dFRvUGFyc2UsIGludCBzdGFydCkgewotCQlmU3RhcnRPZlRleHRUb1BhcnNlID0gc3RhcnQ7Ci0JCWdldExvY2FsUGFyc2VyKCkucmVzZXQodGV4dFRvUGFyc2UpOwotCQlmVGV4dFRvUGFyc2UgPSB0ZXh0VG9QYXJzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JjZVBhcnNlKCkgewotCQlnZXRMb2NhbFBhcnNlcigpLmdldERvY3VtZW50UmVnaW9ucygpOwotCQlmTG9jYWxQYXJzZXIgPSBudWxsOwotCX0KLQotCS8qCi0JICogcGFyc2UgYW4gZW50aXJlIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJLy8gZnJvbSBvdXRlciBjbGFzcwotCQlMaXN0IGJsb2NrTWFya2VycyA9IHRoaXMuZlRyYW5zbGF0b3IuZ2V0QmxvY2tNYXJrZXJzKCk7Ci0JCXJlc2V0KGdldENvbnRlbnRzKGZpbGVuYW1lKSk7Ci0JCS8vIHRoaXMgYWRkcyB0aGUgY3VycmVudCBtYXJrZXJzIGZyb20gdGhlIG91dGVyIGNsYXNzIGxpc3QKLQkJLy8gdG8gdGhpcyBwYXJzZXIgc28gcGFyc2luZyB3b3JrcyBjb3JyZWN0bHkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWFkZEJsb2NrTWFya2VyKChCbG9ja01hcmtlcikgYmxvY2tNYXJrZXJzLmdldChpKSk7Ci0JCX0KLQkJZm9yY2VQYXJzZSgpOwotCX0KLQotCS8qCi0JICogd3JpdGVzIG91dCBzY3JpcHRsZXQsIGV4cHJlc3Npb24sIGFuZCBkZWNsYXJhdGlvbiBidWZmZXJzCi0JICogdG8gdGhlIG9uZ29pbmcgYnVmZmVycyBpbiB0aGUgSlNQVHJhbnNsYXRvciAoY2FsbHMgdG8gb3V0ZXIgSlNQVHJhbnNsYXRvciBtZXRob2RzKQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlVG9CdWZmZXJzKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJLy8gY3VycmVudE5vZGUgc2hvdWxkIGJlIHRoZSA8JUBwYWdlIGluY2x1ZGU9Inh4eCIlPiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2NyaXB0bGV0cy5zaXplKCk7IGkrKykgewotCQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoKFN0cmluZykgZlNjcmlwdGxldHMuZ2V0KGkpLCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkV4cHJlc3Npb25zLnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoKFN0cmluZykgZkV4cHJlc3Npb25zLmdldChpKSwgY3VycmVudE5vZGUsIGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnROb2RlLmdldExlbmd0aCgpKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZEZWNsYXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuZlRyYW5zbGF0b3IudHJhbnNsYXRlRGVjbGFyYXRpb25TdHJpbmcoKFN0cmluZykgZkRlY2xhcmF0aW9ucy5nZXQoaSksIGN1cnJlbnROb2RlLCBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIGxpc3RlbnMgdG8gcGFyc2VyIG5vZGUgcGFyc2VkIGV2ZW50cwotCSAqIGFkZHMgdG8gbG9jYWwgc2NyaXBsZXQsIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uIGJ1ZmZlcnMKLQkgKiBkZXRlcm1pbmVzIHdoaWNoIHR5cGUgb2YgcmVnaW9uIHRoZSBjdXJzb3IgaXMgaW4sIGFuZCBhZGp1c3RzIGN1cnNvciBvZmZzZXQgYWNjb3JkaW5nbHkgCi0JICovCi0JcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidGFnbmFtZSA+ICIgKyBmVGFnbmFtZSk7Ci0JCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2RSZWdpb24gPiAiICsgc2RSZWdpb24uZ2V0VHlwZSgpKTsKLQkJLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZFJlZ2lvbiB0ZXh0IGlzID4+ICIgKyBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKSk7Ci0JCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrPT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQkJdHJ5IHsKLQkJCWlmIChpc0pTUFN0YXJ0UmVnaW9uKHNkUmVnaW9uKSkgewotCQkJCVN0cmluZyBuYW1lU3RyID0gZ2V0UmVnaW9uTmFtZShzZFJlZ2lvbik7Ci0JCQkJaWYgKGlzSlNQUmVnaW9uKG5hbWVTdHIpKQotCQkJCQlmVGFnbmFtZSA9IG5hbWVTdHI7Ci0JCQkJZWxzZQotCQkJCQlmVGFnbmFtZSA9IG51bGw7Ci0JCQl9Ci0JCQllbHNlIGlmIChzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkJCWlmIChmVGFnbmFtZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGFzc2lnbiBjb250ZW50cyB0byBvbmUgb2YgdGhlIHRhYmxlcwotCQkJCQlpZiAoaXNTY3JpcHRsZXQoZlRhZ25hbWUpKSB7Ci0JCQkJCQlwcm9jZXNzU2NyaXB0bGV0KHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0V4cHJlc3Npb24oZlRhZ25hbWUpKSB7Ci0JCQkJCQlwcm9jZXNzRXhwcmVzc2lvbihzZFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNEZWNsYXJhdGlvbihmVGFnbmFtZSkpIHsKLQkJCQkJCXByb2Nlc3NEZWNsYXJhdGlvbihzZFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwcm9jZXNzT3RoZXJSZWdpb25zKHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCQlpZiAoZlRhZ25hbWUgIT0gbnVsbCkgewotCQkJCQlwcm9jZXNzVXNlQmVhbihzZFJlZ2lvbik7Ci0JCQkJCXByb2Nlc3NPdGhlclJlZ2lvbnMoc2RSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZUYWduYW1lID0gbnVsbDsKLQkJCX0KLQkJCS8vIHRoaXMgdXBkYXRlcyBjdXJzb3IgcG9zaXRpb24KLQkJCWNoZWNrQ3Vyc29ySW5SZWdpb24oc2RSZWdpb24pOwotCQl9Ci0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2dnaW5nIHRoaXMgZXhjZXB0aW9uIHRoYXQgSSd2ZSBzZWVuIGEgY291cGxlIG9mIHRpbWVzLi4uCi0JCQkvLyBzZWVtcyB0byBoYXBwZW4gZHVyaW5nIHNodXRkb3duIG9mIHVuaXQgdGVzdHMsIGF0IHdoaWNoIAotCQkJLy8gcG9pbnQgTG9nZ2VyIGhhcyBhbHJlYWR5IGJlZW4gdW5sb2FkZWQKLQkJCXRyeSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJYTUxKU1BSZWdpb25IZWxwZXI6IGV4Y2VwdGlvbiBpbiBub2RlIHBhcnNpbmciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGV4KSB7Ci0JCQkJLy8gZG8gbm90aGluZywgc2luY2Ugd2UncmUganVzdCBlbmRpbmcKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tDdXJzb3JJblJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCS8vIGlmIGN1cnNvciBpcyBpbiB0aGlzIHJlZ2lvbi4uLgotCQlpZiAodGhpcy5mVHJhbnNsYXRvci5nZXRTb3VyY2VQb3NpdGlvbigpID49IGZTdGFydE9mVGV4dFRvUGFyc2UgKyBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICYmIHRoaXMuZlRyYW5zbGF0b3IuZ2V0U291cmNlUG9zaXRpb24oKSA8PSBmU3RhcnRPZlRleHRUb1BhcnNlICsgc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCWludCBlbmRPZk5hbWVUYWcgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IG9mZnNldCA9IGZUZXh0QmVmb3JlLmxlbmd0aCgpIC0gZlN0cmlwcGVkVGV4dC5sZW5ndGgoKTsKLQkJCS8vIG9mZnNldCBpbiBhZGR0aW9uIHRvIHdoYXQncyBhbHJlYWR5IGluIHRoZSBidWZmZXIKLQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0UmVsYXRpdmVPZmZzZXQodGhpcy5mVHJhbnNsYXRvci5nZXRTb3VyY2VQb3NpdGlvbigpIC0gKGZTdGFydE9mVGV4dFRvUGFyc2UgKyBlbmRPZk5hbWVUYWcpIC0gb2Zmc2V0KTsKLQkJCS8vIG91dGVyIGNsYXNzIG1ldGhvZAotCQkJdGhpcy5mVHJhbnNsYXRvci5zZXRDdXJzb3JPd25lcihmUG9zc2libGVPd25lcik7Ci0JCQkvLyBhZGQgbGVuZ3RoIG9mIHdoYXQncyBhbHJlYWR5IGluIHRoZSBidWZmZXIKLQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0UmVsYXRpdmVPZmZzZXQodGhpcy5mVHJhbnNsYXRvci5nZXRSZWxhdGl2ZU9mZnNldCgpICsgdGhpcy5mVHJhbnNsYXRvci5nZXRDdXJzb3JPd25lcigpLmxlbmd0aCgpKTsKLQkJCWlmIChmUG9zc2libGVPd25lciA9PSBKU1BUcmFuc2xhdG9yLkVYUFJFU1NJT04pIHsKLQkJCQkvLyBhZGQgbGVuZ3RoIG9mIGV4cHJlc3Npb24gcHJlZml4IGlmIG5lY2Vzc2FyeS4uLgotCQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0UmVsYXRpdmVPZmZzZXQodGhpcy5mVHJhbnNsYXRvci5nZXRSZWxhdGl2ZU9mZnNldCgpICsgSlNQVHJhbnNsYXRvci5FWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVjbGFyYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcmVwYXJlVGV4dChzZFJlZ2lvbik7Ci0JCWZEZWNsYXJhdGlvbnMuYWRkKGZTdHJpcHBlZFRleHQpOwotCQlmUG9zc2libGVPd25lciA9IEpTUFRyYW5zbGF0b3IuREVDTEFSQVRJT047Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0V4cHJlc3Npb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcmVwYXJlVGV4dChzZFJlZ2lvbik7Ci0JCWZFeHByZXNzaW9ucy5hZGQoZlN0cmlwcGVkVGV4dCk7Ci0JCWZQb3NzaWJsZU93bmVyID0gSlNQVHJhbnNsYXRvci5FWFBSRVNTSU9OOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NTY3JpcHRsZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcmVwYXJlVGV4dChzZFJlZ2lvbik7Ci0JCWZTY3JpcHRsZXRzLmFkZChmU3RyaXBwZWRUZXh0KTsKLQkJZlBvc3NpYmxlT3duZXIgPSBKU1BUcmFuc2xhdG9yLlNDUklQVExFVDsKLQl9Ci0KLQkvKgotCSAqIFN1YnN0aXR1dGVzIHZhbHVlcyBmb3IgZW50aXR5IHJlZmVyZW5jZXMsIHN0cmlwcyBDREFUQSB0YWdzLCBhbmQga2VlcHMKLQkgKiB0cmFjayBvZiBzdHJpbmcgbGVuZ3RoKHMpIGZvciBjdXJzb3IgcG9zaXRpb24gY2FsY3VsYXRpb24gbGF0ZXIuCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlmVGV4dEJlZm9yZSA9IGZUZXh0VG9QYXJzZS5zdWJzdHJpbmcoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpOwotCQlmVW5lc2NhcGVkVGV4dCA9IEVzY2FwZWRUZXh0VXRpbC5nZXRVbmVzY2FwZWRUZXh0KGZUZXh0QmVmb3JlKTsKLQkJZlN0cmlwcGVkVGV4dCA9IHRoaXMuZlRyYW5zbGF0b3Iuc3RyaXBDREFUQShmVW5lc2NhcGVkVGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1VzZUJlYW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlpZiAoZlRhZ25hbWUgIT0gbnVsbCAmJiBpc1VzZUJlYW4oZlRhZ25hbWUpKSB7Ci0JCQkvLyBwcmV2aW91cyByZWdpb24gaGFzIHRoZSBhY3R1YWwgYXR0cmlidXRlcwotCQkJc2RSZWdpb24gPSBzZFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJU3RyaW5nIGJlYW5DbGFzcywgYmVhblR5cGUsIGJlYW5JZCwgYmVhbkRlY2wgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJYmVhbkNsYXNzID0gZ2V0QXR0cmlidXRlVmFsdWUoImNsYXNzIiwgc2RSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQliZWFuVHlwZSA9IGdldEF0dHJpYnV0ZVZhbHVlKCJ0eXBlIiwgc2RSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQliZWFuSWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgiaWQiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYgKGJlYW5JZCAhPSBudWxsICYmIChiZWFuVHlwZSAhPSBudWxsIHx8IGJlYW5DbGFzcyAhPSBudWxsKSkgewotCQkJCWlmIChiZWFuVHlwZS5lcXVhbHMoIiIpKQotCQkJCSAgICBiZWFuVHlwZSA9IGJlYW5DbGFzczsKLQkJCQlTdHJpbmcgcHJlZml4ID0gYmVhblR5cGUgKyAiICIgKyBiZWFuSWQgKyAiID0gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nIHN1ZmZpeCA9ICJudWxsO1xuIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChiZWFuQ2xhc3MgIT0gbnVsbCkKLQkJCQkJc3VmZml4ID0gIm5ldyAiICsgYmVhbkNsYXNzICsgIigpO1xuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYmVhbkRlY2wgPSBwcmVmaXggKyBzdWZmaXg7Ci0JCQl9CQotCQkJCi0JCQlmU2NyaXB0bGV0cy5hZGQoYmVhbkRlY2wpOwotCQkJZlBvc3NpYmxlT3duZXIgPSBKU1BUcmFuc2xhdG9yLlNDUklQVExFVDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NPdGhlclJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcm9jZXNzSW5jbHVkZURpcmVjdGl2ZShzZFJlZ2lvbik7Ci0JCXByb2Nlc3NQYWdlRGlyZWN0aXZlKHNkUmVnaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5jbHVkZURpcmVjdGl2ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCWlmIChpc0luY2x1ZGVEaXJlY3RpdmUoZlRhZ25hbWUpKSB7Ci0JCQkvLyB0aGUgZGlyZWN0aXZlIG5hbWUgcmVnaW9uIGl0c2VsZiBjb250YWlucyB0aGUgYXR0cnMuLi4KLQkJCWlmIChzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDApLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DT05URU5UKQotCQkJCXNkUmVnaW9uID0gc2RSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZSgiZmlsZSIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5mVHJhbnNsYXRvci5oYW5kbGVJbmNsdWRlRmlsZShmaWxlTG9jYXRpb24pOwotCQl9Ci0JCWVsc2UgaWYgKGlzUG9zc2libGVDdXN0b21UYWcoZlRhZ25hbWUpKSB7Ci0JCQkvLyB0aGlzIGN1c3RvbSB0YWcgbWF5IGRlZmluZSB2YXJpYWJsZXMKLQkJCXRoaXMuZlRyYW5zbGF0b3IuYWRkVGFnbGliVmFyaWFibGVzKGZUYWduYW1lKTsKLQkJfQotCQllbHNlIGlmIChpc1RhZ2xpYkRpcmVjdGl2ZShmVGFnbmFtZSkpIHsKLQkJCS8vIGFsc28gYWRkIHRoZSBvbmVzIGNyZWF0ZWQgaGVyZSB0byB0aGUgcGFyZW50IGRvY3VtZW50Ci0JCQlTdHJpbmcgcHJlZml4ID0gZ2V0QXR0cmlidXRlVmFsdWUoInByZWZpeCIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJTGlzdCBkb2NzID0gdGhpcy5mVHJhbnNsYXRvci5nZXRUTERDTURvY3VtZW50TWFuYWdlcigpLmdldENNRG9jdW1lbnRUcmFja2VycyhwcmVmaXgsIHRoaXMuZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKS5nZXRFbmQoKSk7Ci0JCQlJdGVyYXRvciBpdCA9IGRvY3MuaXRlcmF0b3IoKTsKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gbnVsbDsKLQkJCUNNTm9kZSBub2RlID0gbnVsbDsKLQkJCUNNRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZG9jID0gKENNRG9jdW1lbnQpIGl0Lm5leHQoKTsKLQkJCQllbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCQlub2RlID0gKENNTm9kZSkgZWxlbWVudHMubmV4dCgpOwotCQkJCQltYXJrZXIgPSBuZXcgQmxvY2tNYXJrZXIobm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSk7Ci0JCQkJCS8vIGdsb2JhbCBzY29wZSBpcyBPSyBiZWNhdXNlIHdlIGhhdmUgZW5jb3VudGVyZWQgdGhpcyA8QHRhZ2xpYj4gZGlyZWN0aXZlCi0JCQkJCS8vIHNvIGl0IGFsbCBtYXJrZXJzIGZyb20gaXQgc2hvdWxkIHdpbGwgYmUgaW4gc2NvcGUKLQkJCQkJLy8gYWRkIHRvIHRoaXMgbG9jYWwgcGFyc2VyCi0JCQkJCWFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JCQkJCS8vIGFkZCB0byBvdXRlciBjbGFzcyBtYXJrZXIgbGlzdCwgZm9yIAotCQkJCQl0aGlzLmZUcmFuc2xhdG9yLmdldEJsb2NrTWFya2VycygpLmFkZChtYXJrZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NQYWdlRGlyZWN0aXZlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJaWYgKGlzUGFnZURpcmVjdGl2ZShmVGFnbmFtZSkpIHsKLQkJCXdoaWxlIChzZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHNkUmVnaW9uLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpCi0JCQkJCWJyZWFrOwotCQkJCXNkUmVnaW9uID0gc2RSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCX0KLQkJCVN0cmluZyBpbXBvcnRWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKCJpbXBvcnQiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbXBvcnRWYWx1ZSAhPSAiIikgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gaGFkIHRvIGFkZCAiZmFsc2UiIHBhcmFtZXRlciB0byBlbnN1cmUgdGhlc2UgCi0JCQkJLy8gaW1wb3J0cyBkb24ndCBnZXQgYWRkZWQgdG8ganNwIDwtPiBqYXZhIG1hcCAoc2luY2UgdGhleSBhcmUgZnJvbSBhbiBpbmNsdWRlZCBmaWxlKQotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MTY4NwotCQkJCXRoaXMuZlRyYW5zbGF0b3IuYWRkSW1wb3J0cyhpbXBvcnRWYWx1ZSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQkKLQotCS8qCi0JICogY29udmVuaWVuY2UgbWV0aG9kIHRvIGdldCBhbiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhdHRyaWJ1dGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIGF0dHJOYW1lLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCVN0cmluZyBzZFJlZ2lvblRleHQgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQkJU3RyaW5nIHRleHRSZWdpb25UZXh0LCBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdCA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uLCB2YWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW5hbWVSZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQl0ZXh0UmVnaW9uVGV4dCA9IHNkUmVnaW9uVGV4dC5zdWJzdHJpbmcobmFtZVJlZ2lvbi5nZXRTdGFydCgpLCBuYW1lUmVnaW9uLmdldEVuZCgpKTsKLQkJCQlpZiAodGV4dFJlZ2lvblRleHQuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHsKLQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQkJdmFsdWVSZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQkJCWlmICh2YWx1ZVJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJCWF0dHJWYWx1ZSA9IHNkUmVnaW9uVGV4dC5zdWJzdHJpbmcodmFsdWVSZWdpb24uZ2V0U3RhcnQoKSwgdmFsdWVSZWdpb24uZ2V0RW5kKCkpOwotCQkJCQkJCWJyZWFrOyAvLyBpbm5lcgotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBvdXRlcgotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoYXR0clZhbHVlKTsKLQl9Ci0KLQkvLyB0aGVzZSBtZXRob2RzIGRldGVybWluZSB3aGF0IGNvbnRlbnQgZ2V0cyBhZGRlZCB0byB0aGUgbG9jYWwgc2NyaXBsZXQsIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uIGJ1ZmZlcnMKLQkvKgotCSAqIHJldHVybiB0cnVlIGZvciBlbGVtZW50cyB3aG9zZSBjb250ZW50cyB3ZSBtaWdodCB3YW50IHRvIGFkZCB0byB0aGUgamF2YSBmaWxlIHdlIGFyZSBidWlsZGluZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSlNQU3RhcnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlyZXR1cm4gKHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1BSZWdpb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIGlzRGVjbGFyYXRpb24odGFnTmFtZSkgfHwgaXNFeHByZXNzaW9uKHRhZ05hbWUpIHx8IGlzU2NyaXB0bGV0KHRhZ05hbWUpIHx8IGlzVXNlQmVhbih0YWdOYW1lKSB8fCBpc0luY2x1ZGVEaXJlY3RpdmUodGFnTmFtZSkgfHwgaXNQb3NzaWJsZUN1c3RvbVRhZyh0YWdOYW1lKSB8fCBpc1RhZ2xpYkRpcmVjdGl2ZSh0YWdOYW1lKSB8fCBpc1BhZ2VEaXJlY3RpdmUodGFnTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWNsYXJhdGlvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGVjbGFyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHByZXNzaW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpleHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2NyaXB0bGV0KFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpzY3JpcHRsZXQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXNlQmVhbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6dXNlQmVhbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUuaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb3NzaWJsZUN1c3RvbVRhZyhTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5pbmRleE9mKCI6IikgPiAxOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWdsaWJEaXJlY3RpdmUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRpcmVjdGl2ZS50YWdsaWIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFnZURpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVnaW9uTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQlTdHJpbmcgbmFtZVN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBzaXplID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJaWYgKHNpemUgPiAxKSB7Ci0JCQkvLyBwcmVzdW1hYmx5IFhNTC1KU1AgPGpzcDpzY3JpcHRsZXQ+IHwgPGpzcDpleHByZXNzaW9uPiB8IDxqc3A6ZGVjbGFyYXRpb24+Ci0JCQluYW1lUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCW5hbWVTdHIgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KG5hbWVSZWdpb24pKTsKLQkJfQotCQlyZXR1cm4gbmFtZVN0ci50cmltKCk7Ci0JfQotCi0JLyoKLQkgKiBnZXQgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBhcyBhIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudHMoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgYyA9IDA7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZU5hbWUpOwotCQkJSUZpbGUgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQlpZihmICE9IG51bGwgJiYgIWYuZXhpc3RzKCkpIHsKLQkJCQlmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQkJfQotICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLmV4aXN0cygpKSB7Ci0gICAgCQkJaXMgPSBmLmdldENvbnRlbnRzKCk7Ci0gICAgCQkJd2hpbGUgKChjID0gaXMucmVhZCgpKSAhPSAtMSkgewotICAgIAkJCQljb3VudCsrOwotICAgIAkJCQlzLmFwcGVuZCgoY2hhcikgYyk7Ci0gICAgCQkJfQotICAgICAgICAgICAgfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJfQotCQl9Ci0JCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSW5kZXhXb3Jrc3BhY2VKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSW5kZXhXb3Jrc3BhY2VKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZDBkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0luZGV4V29ya3NwYWNlSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBSZS1pbmRleGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLgotICogRW5zdXJlcyB0aGUgSlNQIEluZGV4IGlzIGluIGEgc3RhYmxlIHN0YXRlIGJlZm9yZSBwZXJmb3JtaW5nIGEgc2VhcmNoLgotICogKGxpa2UgYWZ0ZXIgYSBjcmFzaCBvciBpZiBwcmV2aW91cyBpbmRleGluZyB3YXMgY2FuY2VsZWQpCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleFdvcmtzcGFjZUpvYiBleHRlbmRzIEpvYiB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGluZGV4bWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBWaXNpdG9yIHRoYXQgcmV0cmlldmVzIGpzcCBwcm9qZWN0IHBhdGhzIGZvciBhbGwganNwIGZpbGVzIGluIHRoZSB3b3Jrc3BhY2UsCi0JICogYW5kIGFkZHMgdGhlIGZpbGVzIHRvIGJlIGluZGV4ZWQgYXMgdGhleSBhcmUgZW5jb3VudGVyZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEpTUEZpbGVWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQkgICAgcHJpdmF0ZSBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJCi0JCS8vIG1vbml0b3IgZnJvbSB0aGUgSm9iCi0JCUlQcm9ncmVzc01vbml0b3IgZklubmVyTW9uaXRvciA9IG51bGw7Ci0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRoaXMuZklubmVyTW9uaXRvciA9IG1vbml0b3I7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkKLQkJCS8vIGNoZWNrIGpvYiBjYW5jZWxlZAotCQkJaWYgKHRoaXMuZklubmVyTW9uaXRvciAhPSBudWxsICYmIHRoaXMuZklubmVyTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQkvLyBjaGVjayBzZWFyY2ggc3VwcG9ydCBjYW5jZWxlZAotCQkJaWYoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkKLQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJCS8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uCi0JCQkJLy8gY2hlY2sgbmFtZSBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyB0aGUgZmlsZSAobGVzcyB3b3JrKQotCQkJCWlmKGdldEpzcENvbnRlbnRUeXBlKCkuaXNBc3NvY2lhdGVkV2l0aChwcm94eS5nZXROYW1lKCkpKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQlpZihmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkKLQkJCQkJCWlmKERFQlVHKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEluZGV4V29ya3NwYWNlSm9iIGFkZGluZyBmaWxlOiAiICsgZmlsZS5nZXROYW1lKCkpOwotCQkJCQkJLy8gdGhpcyBjYWxsIHdpbGwgY2hlY2sgdGhlIENvbnRlbnRUeXBlRGVzY3JpcHRpb24sIHNvIGRvbid0IG5lZWQgdG8gZG8gaXQgaGVyZS4KLQkJCQkJCS8vSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmFkZEpzcEZpbGUoZmlsZSk7Ci0JCQkJCQl0aGlzLmZpbGVzLmFkZChmaWxlKTsKLQkJCQkJCXRoaXMuZklubmVyTW9uaXRvci5zdWJUYXNrKHByb3h5LmdldE5hbWUoKSk7Ci0JCQkJCQkKLQkJCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIGZpbmFsIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCSAgICByZXR1cm4gKElGaWxlW10pdGhpcy5maWxlcy50b0FycmF5KG5ldyBJRmlsZVt0aGlzLmZpbGVzLnNpemUoKV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZUpTUCA9IG51bGw7Ci0JCi0JcHVibGljIEluZGV4V29ya3NwYWNlSm9iKCkgewotCQkvLyBwYV9UT0RPIG1heSB3YW50IHRvIHNheSBzb21ldGhpbmcgbGlrZSAiUmVidWlsZGluZyBKU1AgSW5kZXgiIHRvIGJlIG1vcmUKLQkJLy8gZGVzY3JpcHRpdmUgaW5zdGVhZCBvZiAiVXBkYXRpbmcgSlNQIEluZGV4IiBzaW5jZSB0aGV5IGFyZSAyIGRpZmZlcmVudCB0aGluZ3MKLQkJc3VwZXIoSlNQQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJUpTUEluZGV4TWFuYWdlci4wIikpOwotCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQl9Ci0KLQlJQ29udGVudFR5cGUgZ2V0SnNwQ29udGVudFR5cGUoKSB7Ci0JCWlmKHRoaXMuZkNvbnRlbnRUeXBlSlNQID09IG51bGwpCi0JCQl0aGlzLmZDb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQlyZXR1cm4gdGhpcy5mQ29udGVudFR5cGVKU1A7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5qb2JzLkludGVybmFsSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlpZihtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9Ci0JCQotCQlpZihERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIF4gSW5kZXhXb3Jrc3BhY2VKb2Igc3RhcnRlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCi0JCXRyeSB7Ci0JCSAgICBKU1BGaWxlVmlzaXRvciB2aXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKG1vbml0b3IpOwotCQkgICAgLy8gY29sbGVjdCBhbGwganNwIGZpbGVzCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJLy8gcmVxdWVzdCBpbmRleGluZwotCQkJLy8gdGhpcyBpcyBwcmV0dHkgbXVjaCBsaWtlIGZha2luZyBhbiBlbnRpcmUgd29ya3NwYWNlIHJlc291cmNlIGRlbHRhCi0JCQlKU1BJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbmRleEZpbGVzKHZpc2l0b3IuZ2V0RmlsZXMoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYoREVCVUcpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpZihERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIF4gSW5kZXhXb3Jrc3BhY2VKb2IgZmluaXNoZWRcbiAgIHRvdGFsIHRpbWUgcnVubmluZzogIiArIChmaW5pc2ggLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQl2b2lkIHNldENhbmNlbGVkU3RhdGUoKSB7Ci0JCUpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldEluZGV4U3RhdGUoSlNQSW5kZXhNYW5hZ2VyLlNfQ0FOQ0VMRUQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQSW5kZXhNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEluZGV4TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkwYWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQSW5kZXhNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSW5kZXhNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0aGUgSlNQIGluZGV4IHVwIHRvIGRhdGUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BJbmRleE1hbmFnZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZT0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BpbmRleG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLRVlfSU5ERVhfU1RBVEUgPSAianNwSW5kZXhTdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8vIHNldCB0byBTX1VQREFUSU5HIG9uY2UgYSByZXNvdXJjZSBjaGFuZ2UgY29tZXMgaW4KLQkvLyBzZXQgdG8gU19TVEFCTEUgaWY6Ci0JLy8gLSB3ZSBrbm93IHdlIGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoZSByZXNvdXJjZSBjaGFuZ2UKLQkvLyAtIG9yIHRoZSBQcm9jZXNzRmlsZXNKb2IgY29tcGxldGVzCi0JLy8gc2V0IHRvIFNfQ0FOQ0VMRUQgaWYgYW4gaW5kZXhpbmcgam9iIGlzIGNhbmNlbGVkCi0JLy8gc2V0IHRvIFNfUkVCVUlMRElORyBpZiByZS1pbmRleGluZyB0aGUgZW50aXJlIHdvcmtzcGFjZQotCi0JLy8gdGhlIGludCAnMCcgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGEgcHJlZmVyZW5jZSBpcyBub3QgdGhlcmUKLQkvKiogaW5kZXggaXMgcmVsaWFibGUgdG8gdXNlKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX1NUQUJMRSA9IDE7Ci0JLyoqIGluZGV4IGlzIGJlaW5nIHVwZGF0ZWQgKGZyb20gYSByZXNvdXJjZSBkZWx0YSkqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfVVBEQVRJTkcgPSAyOwotCS8qKiBlbnRpcmUgaW5kZXggaXMgYmVpbmcgcmVidWlsdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfUkVCVUlMRElORyA9IDM7Ci0JLyoqIGluZGV4aW5nIGpvYiB3YXMgY2FuY2VsZWQgaW4gdGhlIG1pZGRsZSBvZiBpdCwgaW5kZXggbmVlZHMgdG8gYmUgcmVidWlsdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfQ0FOQ0VMRUQgPSA0OwotCQotCS8qKiBzeW1ib2xpYyBuYW1lIGZvciBPU0dJIGZyYW1ld29yayAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOwotCQotCS8qKgotCSAqIENvbGxlY3RzIEpTUCBmaWxlcyBmcm9tIGEgcmVzb3VyY2UgZGVsdGEuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKU1BSZXNvdXJjZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQkvLyB1c2luZyBoYXNoIG1hcCBlbnN1cmVzIG9ubHkgb25lIG9mIGVhY2ggZmlsZQotCQkvLyBtdXN0IGJlIHJlc2V0IGJlZm9yZSBldmVyeSB1c2UKLQkJcHJpdmF0ZSBIYXNoTWFwIGpzcEZpbGVzID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBKU1BSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQl0aGlzLmpzcEZpbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQkJLy8gaW4gY2FzZSBKU1Agc2VhcmNoIHdhcyBjYW5jZWxlZCAoZWcuIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yKQotCQkJaWYoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCQlib29sZWFuIGFkZGVkID0gKGtpbmQgJiBJUmVzb3VyY2VEZWx0YS5BRERFRCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQ7Ci0JCQkJYm9vbGVhbiBpc0ludGVyZXN0aW5nQ2hhbmdlID0gZmFsc2U7Ci0JCQkJaWYoKGtpbmQgJiBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQkJCS8vIGlnbm9yZSB0aGluZ3MgbGlrZSBtYXJrZXIgY2hhbmdlcwotCQkJCQlpc0ludGVyZXN0aW5nQ2hhbmdlID0gKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gSVJlc291cmNlRGVsdGEuQ09OVEVOVCB8fCAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgPT0gSVJlc291cmNlRGVsdGEuUkVQTEFDRUQ7Ci0JCQkJfQotCQkJCWJvb2xlYW4gcmVtb3ZlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRDsKLQkJCQlpZihhZGRlZCB8fCBpc0ludGVyZXN0aW5nQ2hhbmdlKSB7Ci0JCQkJCQotCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJCQkvLyBxdWljayBjaGVjayBpZiBpdCdzIGV2ZW4gSlNQIHJlbGF0ZWQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQkJCQkvLyBjaGVja2luZyBuYW1lIGZyb20gdGhlIGRlbHRhIGJlZm9yZSBnZXR0aW5nIHJlc291cmNlIGJlY2F1c2UgaXQncyBsaWdodGVyCi0JCQkJCWludCBudW1TZWdtZW50cyA9IGRlbHRhLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCk7Ci0JCQkJCVN0cmluZyBmaWxlbmFtZSA9IGRlbHRhLmdldEZ1bGxQYXRoKCkuc2VnbWVudChudW1TZWdtZW50cy0xKTsKLQkJCQkJaWYgKGdldEpzcENvbnRlbnRUeXBlKCkuaXNBc3NvY2lhdGVkV2l0aChmaWxlbmFtZSkpIHsKLQkJCQkJCQotCQkJCQkJSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJaWYgKHIgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewkKLQkJCQkJCQl0aGlzLmpzcEZpbGVzLnB1dChyLmdldEZ1bGxQYXRoKCksIHIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYocmVtb3ZlZCkgewotCQkJCQkvLyBoYW5kbGUgY2xlYW51cCAKLQkJCQkJaWYoZGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQlJUmVzb3VyY2UgciA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCQlpZihyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICYmIHIuZXhpc3RzKCkpIHsKLQkJCQkJCQlkZWxldGVJbmRleCgoSUZpbGUpcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCS8vIG5lZWQgdG8gc2V0IHN0YXRlIGhlcmUgc29tZWhvdywgYW5kIHJlaW5kZXgKLQkJCQkvLyBvdGhlcndpc2UgaW5kZXggd2lsbCBiZSB1bnJlbGlhYmxlCi0JCQkJaWYoREVCVUcpCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkRlbHRhIGFuYWx5c2lzIG1heSBub3QgYmUgY29tcGxldGUiLCAgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIGlmIHRoZSBkZWx0YSBoYXMgY2hpbGRyZW4sIGNvbnRpbnVlIHRvIGFkZC9yZW1vdmUgZmlsZXMKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgZGVsZXRlSW5kZXgoSUZpbGUgZm9sZGVyKSB7Ci0JCQkvLyBjbGVhbnVwIGluZGV4Ci0JCQlJbmRleE1hbmFnZXIgaW0gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmRleE1hbmFnZXIoKTsKLQkJCUlQYXRoIGZvbGRlclBhdGggPSBmb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJCUlQYXRoIGluZGV4TG9jYXRpb24gPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuY29tcHV0ZUluZGV4TG9jYXRpb24oZm9sZGVyUGF0aCk7Ci0JCQlpbS5yZW1vdmVJbmRleChpbmRleExvY2F0aW9uKTsKLS8vCQkJaW0uaW5kZXhMb2NhdGlvbnMucmVtb3ZlS2V5KGZvbGRlclBhdGgpOwotLy8JCQlpbS5pbmRleExvY2F0aW9ucy5yZW1vdmVWYWx1ZShpbmRleExvY2F0aW9uKTsKLQkJCUZpbGUgZiA9IGluZGV4TG9jYXRpb24udG9GaWxlKCk7Ci0JCQlmLmRlbGV0ZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSl0aGlzLmpzcEZpbGVzLnZhbHVlcygpLnRvQXJyYXkobmV3IElGaWxlW3RoaXMuanNwRmlsZXMuc2l6ZSgpXSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkJdGhpcy5qc3BGaWxlcy5jbGVhcigpOwotCQl9Ci0JfQotCS8vIGVuZCBjbGFzcyBKU1BSZXNvdXJjZVZpc2l0b3IKLQkKLQkvKioKLQkgKiBzY2hlZHVsZXMgSlNQIGZpbGVzIGZvciBpbmRleGluZyBieSBKYXZhIGNvcmUKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NGaWxlc0pvYiBleHRlbmRzIEpvYiB7IAotCQlJRmlsZVtdIGpzcEZpbGVzID0gIG51bGw7Ci0JCVByb2Nlc3NGaWxlc0pvYihTdHJpbmcgdGFza05hbWUsIElGaWxlW10gZmlsZXMpIHsKLQkJCXN1cGVyKHRhc2tOYW1lKTsKLQkJCXRoaXMuanNwRmlsZXMgPSBmaWxlczsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCi0JCQlpZihpc0NhbmNlbGVkKG1vbml0b3IpIHx8IGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCQkJCi0JCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJLy8gQVBJIGluZGljYXRlcyB0aGF0IG1vbml0b3IgaXMgbmV2ZXIgbnVsbAotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCB0aGlzLmpzcEZpbGVzIC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJSlNQU2VhcmNoU3VwcG9ydCBzcyA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCQlTdHJpbmcgcHJvY2Vzc2luZ05GaWxlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkKLQkJCQlmb3IoaW50IGkgPSAwOyBpPHRoaXMuanNwRmlsZXMubGVuZ3RoOyBpKyspIHsKLQotCQkJCQlpZihpc0NhbmNlbGVkKG1vbml0b3IpIHx8IGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJc3MuYWRkSnNwRmlsZSh0aGlzLmpzcEZpbGVzIFtpXSk7Ci0JCQkJCQkvLyBKU1AgSW5kZXhlciBwcm9jZXNzaW5nIG4gZmlsZXMKLQkJCQkJCXByb2Nlc3NpbmdORmlsZXMgPSBKU1BDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlSlNQSW5kZXhNYW5hZ2VyLjIiLCBuZXcgU3RyaW5nW117SW50ZWdlci50b1N0cmluZygodGhpcy5qc3BGaWxlcyAubGVuZ3RoIC1pKSl9KTsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhwcm9jZXNzaW5nTkZpbGVzICsgIiAtICIgKyB0aGlzLmpzcEZpbGVzIFtpXS5nZXROYW1lKCkpOwotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQkKLQkJCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgSm9iIGFkZGVkIGZpbGU6ICIgKyB0aGlzLmpzcEZpbGVzIFtpXS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCQkJICAgIC8vIFJBVExDMDAyODQ3NzYKLQkJCQkJICAgIC8vIElTU1VFOiB3ZSBwcm9iYWJseSBzaG91bGRuJ3QgYmUgY2F0Y2hpbmcgRVZFUlkgZXhjZXB0aW9uLCBidXQKLQkJCQkJICAgIC8vIHRoZSBmcmFtZXdvcmsgb25seSBhbGxvd3MgdG8gcmV0dXJuIElTdGF0dXMgaW4gb3JkZXIgdG8gY29tbXVuaWNhdGUKLQkJCQkJICAgIC8vIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdoaWNoIG1lYW5zIHRoZSBsb29wCi0JCQkJCSAgICAvLyB3b24ndCBjb21wbGV0ZSwgYW5kIHdlIHdvdWxkIGhpdCB0aGUgc2FtZSBwcm9ibGVtIHRoZSBuZXh0IHRpbWUuCi0JCQkJCSAgICAvLyAKLQkJCQkJICAgIC8vIGEgcG9zc2libGUgc29sdXRpb24gaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgZXhjZXB0aW9ucyBsb2dnZWQKLQkJCQkJICAgIC8vIGFuZCBvbmx5IGxvZyBhIGNlcnRhaW4gYW10IG9mIHRoZSBzYW1lIG9uZSwgb3RoZXJ3aXNlIHNraXAgaXQuCi0JCQkJCQlpZighZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCQkJICAgIFN0cmluZyBmaWxlbmFtZSA9IHRoaXMuanNwRmlsZXNbaV0gIT0gbnVsbCA/IHRoaXMuanNwRmlsZXNbaV0uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCSAgICBMb2dnZXIubG9nRXhjZXB0aW9uKCJKU1BJbmRleGVyIHByb2JsZW0gaW5kZXhpbmc6IiArIGZpbGVuYW1lLCAgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gLy8gZW5kIGZvcgotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8ganVzdCBpbiBjYXNlIHNvbWV0aGluZyBkaWRuJ3QgZm9sbG93IEFQSSAobW9uaXRvciBpcyBudWxsKQotCQkJCWlmKG1vbml0b3IgIT0gbnVsbCkKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCQkKLQkJCWxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlsb25nIGRpZmYgPSBmaW5pc2ggLSBzdGFydDsKLQkJCWlmKERFQlVHKSB7Ci0JCQkJZlRvdGFsVGltZSArPSBkaWZmOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0aGlzIHRpbWU6ICIgKyBkaWZmICsiIGN1bXVsYXRpdmUgdGltZSBmb3IgcmVzb3VyY2UgY2hhbmdlZDogIiArIGZUb3RhbFRpbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIHJ1bk1vbml0b3IpIHsKLQkJCQotCQkJYm9vbGVhbiBjYW5jZWxlZCA9IGZhbHNlOwotCQkJLy8gY2hlY2sgc3BlY2lmaWMgbW9uaXRvciBwYXNzZWQgaW50byBydW4gbWV0aG9kICh0aGUgcHJvZ3Jlc3MgZ3JvdXAgaW4gdGhpcyBjYXNlKQotCQkJLy8gY2hlY2sgbWFpbiBzZWFyY2ggc3VwcG9ydCBjYW5jZWxlZAotCQkJaWYocnVuTW9uaXRvciAhPSBudWxsICYmIHJ1bk1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCWNhbmNlbGVkID0gdHJ1ZTsKLQkJCWVsc2UgaWYoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkKLQkJCQljYW5jZWxlZCA9IHRydWU7Ci0JCQlyZXR1cm4gY2FuY2VsZWQ7Ci0JCX0KLQl9Ci0JLy8gZW5kIGNsYXNzIFByb2Nlc3NGaWxlc0pvYgotCQotCXByaXZhdGUgc3RhdGljIEpTUEluZGV4TWFuYWdlciBmU2luZ2xldG9uID0gbnVsbDsKLQlwcml2YXRlIEpTUFJlc291cmNlVmlzaXRvciBmVmlzaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlSlNQID0gbnVsbDsKLQkJCi0Jc3RhdGljIGxvbmcgZlRvdGFsVGltZSA9IDA7Ci0JCi0JcHJpdmF0ZSBKU1BJbmRleE1hbmFnZXIoKXsKLQkJLy8gb25seSBvbmUgaW5zdGFuY2UKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSlNQSW5kZXhNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQkKLQkJaWYoZlNpbmdsZXRvbiA9PSBudWxsKQotCQkJZlNpbmdsZXRvbiA9IG5ldyBKU1BJbmRleE1hbmFnZXIoKTsKLQkJcmV0dXJuIGZTaW5nbGV0b247Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkKLQkJLy8gaWdub3JlIHJlc291cmNlIGNoYW5nZXMgaWYgYWxyZWFkeSByZWJ1aWxkaW5nCi0JCWlmKGdldEluZGV4U3RhdGUoKSA9PSBTX1JFQlVJTERJTkcpCi0JCQlyZXR1cm47Ci0JCS8vIHByZXZpb3VzbHkgY2FuY2VsZWQsIG5lZWRzIGVudGlyZSBpbmRleCByZWJ1aWxkCi0JCWlmKGdldEluZGV4U3RhdGUoKSA9PSBTX0NBTkNFTEVEKSB7Ci0JCQlyZWJ1aWxkSW5kZXgoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gc2V0IGZsYWcsIHNvIHdlIGtub3cgaWYgYSBqb2IgaXMgZ29pbmcgdG8gYmUgc3RhcnRlZAotCQkvLyBhbmQgdGhlIHN0YXRlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgYmFjayB0byBTX1NUQUJMRQotCQlib29sZWFuIGJlZ2FuUHJvY2VzcyA9IGZhbHNlOwotCQlzZXRVcGRhdGluZ1N0YXRlKCk7Ci0JCQotCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCWlmKGRlbHRhICE9IG51bGwpIHsKLQkJCS8vIG9ubHkgY2FyZSBhYm91dCBhZGRzIG9yIGNoYW5nZXMgcmlnaHQgbm93Li4uCi0JCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCWJvb2xlYW4gY2hhbmdlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRDsKLQkJCWlmKGFkZGVkIHx8IGNoYW5nZWQpIHsKLQkJCQkKLQkJCQkvLyBvbmx5IGFuYWx5emUgdGhlIGZ1bGwgKHN0YXJ0aW5nIGF0IHJvb3QpIGRlbHRhIGhpZXJhcmNoeQotCQkJCWlmKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlKU1BSZXNvdXJjZVZpc2l0b3IgdiA9IGdldFZpc2l0b3IoKTsKLQkJCQkJCS8vIGNsZWFyIGZyb20gbGFzdCBydW4KLQkJCQkJCXYucmVzZXQoKTsKLQkJCQkJCS8vIGNvdW50IGZpbGVzLCBwb3NzaWJseSBkbyB0aGlzIGluIGEgam9iIHRvby4uLgotCQkJCQkJLy8gZG9uJ3QgaW5jbHVkZSBQSEFOVE9NIHJlc291cmNlcwotCQkJCQkJZGVsdGEuYWNjZXB0KHYsIGZhbHNlKTsKLQkJCQkJCQotCQkJCQkJLy8gcHJvY2VzcyBmaWxlcyBmcm9tIHRoaXMgZGVsdGEKLQkJCQkJCUlGaWxlW10gZmlsZXMgPSB2LmdldEZpbGVzKCk7Ci0JCQkJCQlpZihmaWxlcy5sZW5ndGggPiAwKSB7CQotCQkJCQkJCS8vcHJvY2Vzc0ZpbGVzKGZpbGVzKTsKLQkJCQkJCQlpbmRleEZpbGVzKGZpbGVzKTsKLQkJCQkJCQliZWdhblByb2Nlc3MgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIG5lZWQgdG8gc2V0IHN0YXRlIGhlcmUgc29tZWhvdywgYW5kIHJlaW5kZXgKLQkJCQkJCS8vIG90aGVyd2lzZSBpbmRleCB3aWxsIGJlIHVucmVsaWFibGUKLQkJCQkJCWlmKERFQlVHKQotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJCQkvLyBvdGhlcndpc2UgaW5kZXggd2lsbCBiZSB1bnJlbGlhYmxlCi0JCQkJCQlpZihERUJVRykKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJLy8gaWYgd2UgbmV2ZXIga2lja2VkIG9mZiBwcm9jZXNzLCBqb2Igd29uJ3Qgc2V0IGJhY2sgdG8gc3RhYmxlCi0JCS8vIHNvIHdlIHNldCBpdCBoZXJlCi0JCWlmKCFiZWdhblByb2Nlc3MpIHsKLQkJCXNldFN0YWJsZVN0YXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEluZGV4U3RhdGUoaW50IHN0YXRlKSB7Ci0JCWlmKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBzZXR0aW5nIGluZGV4IHN0YXRlIHRvOiAiICsgc3RhdGUyU3RyaW5nKHN0YXRlKSk7Ci0JCX0KLQkJUGx1Z2luIGpzcE1vZGVsUGx1Z2luID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWpzcE1vZGVsUGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoUEtFWV9JTkRFWF9TVEFURSwgc3RhdGUpOwotCQlqc3BNb2RlbFBsdWdpbi5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JfQotCXByaXZhdGUgU3RyaW5nIHN0YXRlMlN0cmluZyhpbnQgc3RhdGUpIHsKLQkJU3RyaW5nIHMgPSAiVU5LTk9XTiI7Ci0JCXN3aXRjaChzdGF0ZSkgewotCQkJY2FzZShTX1NUQUJMRSk6Ci0JCQkJcyA9ICJTX1NUQUJMRSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlKFNfVVBEQVRJTkcpOgotCQkJCXMgPSAiU19VUERBVElORyI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlKFNfQ0FOQ0VMRUQpOgotCQkJCXMgPSAiU19DQU5DRUxFRCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlKFNfUkVCVUlMRElORyk6Ci0JCQkJcyA9ICJTX1JFQlVJTERJTkciOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQlwdWJsaWMgaW50IGdldEluZGV4U3RhdGUoKSB7Ci0JCXJldHVybiBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChQS0VZX0lOREVYX1NUQVRFKTsgCi0JfQotCXB1YmxpYyB2b2lkIHNldFVwZGF0aW5nU3RhdGUoKSB7Ci0JCWlmKGdldEluZGV4U3RhdGUoKSAhPSBTX0NBTkNFTEVEKQotCQkJc2V0SW5kZXhTdGF0ZShTX1VQREFUSU5HKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q2FuY2VsZWRTdGF0ZSgpIHsKLQkJc2V0SW5kZXhTdGF0ZShKU1BJbmRleE1hbmFnZXIuU19DQU5DRUxFRCk7Ci0JfQotCS8vIGNhCi0JcHVibGljIHZvaWQgc2V0U3RhYmxlU3RhdGUoKSB7Ci0JCWlmKGdldEluZGV4U3RhdGUoKSAhPSBTX0NBTkNFTEVEKQotCQkJc2V0SW5kZXhTdGF0ZShTX1NUQUJMRSk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFJlYnVpbGRpbmdTdGF0ZSgpIHsKLQkJc2V0SW5kZXhTdGF0ZShTX1JFQlVJTERJTkcpOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVidWlsZEluZGV4SWZOZWVkZWQoKSB7Ci0JCWlmKGdldEluZGV4U3RhdGUoKSAhPSBTX1NUQUJMRSkgewotCQkJcmVidWlsZEluZGV4KCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYnVpbGRJbmRleCgpIHsKLQkJCi0JCWlmKERFQlVHKSAKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIEpTUCBJbmRleCB1bnN0YWJsZSwgcmVxdWVzdGluZyByZS1pbmRleGluZyIpOwotCi0JCWZpbmFsIEluZGV4V29ya3NwYWNlSm9iIGluZGV4aW5nSm9iID0gbmV3IEluZGV4V29ya3NwYWNlSm9iKCk7Ci0JCQotCQlpbmRleGluZ0pvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9SdW4oSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIuYWJvdXRUb1J1bihldmVudCk7Ci0JCQkJc2V0UmVidWlsZGluZ1N0YXRlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmRvbmUoZXZlbnQpOwotCQkJCXNldFN0YWJsZVN0YXRlKCk7Ci0JCQkJaW5kZXhpbmdKb2IucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQlpbmRleGluZ0pvYi5zY2hlZHVsZSgpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgc2NoZWR1bGVzIGEgSm9iIHRvIHByb2Nlc3MgY29sbGVjdGVkIGZpbGVzLgotCSAqIEFsbCBKU1AgaW5kZXhpbmcgc2hvdWxkIGJlIGRvbmUgdGhyb3VnaCB0aGlzIG1ldGhvZCBvciBwcm9jZXNzRmlsZXMoSUZpbGUgZmlsZSkKLQkgKiBAcGFyYW0gZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBpbmRleEZpbGVzKElGaWxlW10gZmlsZXMpIHsKLQkJLy8gdXBkYXRpbmcgSlNQIEluZGV4Ci0JCVN0cmluZyB0YXNrTmFtZSA9IEpTUENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVKU1BJbmRleE1hbmFnZXIuMCIpOwotCQkKLQkJLy8gUHJvY2Vzc2luZyByZXNvdXJjZSBkZWx0YQotCQlmaW5hbCBKb2IgcHJvY2Vzc0ZpbGVzID0gbmV3IFByb2Nlc3NGaWxlc0pvYih0YXNrTmFtZSwgZmlsZXMpOwotCi0JCS8vIG9ubHkgc2hvdyBpbiB2ZXJib3NlIG1vZGUKLQkJcHJvY2Vzc0ZpbGVzLnNldFN5c3RlbSh0cnVlKTsKLQkJCi0JCS8vIGRvbid0IHVzZSB0aGlzIHJ1bGUKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MzEKLQkJLy9wcm9jZXNzRmlsZXMuc2V0UnVsZShuZXcgSW5kZXhGaWxlUnVsZSgpKTsKLQkJCi0JCXByb2Nlc3NGaWxlcy5zZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXByb2Nlc3NGaWxlcy5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIuZG9uZShldmVudCk7Ci0JCQkJc2V0U3RhYmxlU3RhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXByb2Nlc3NGaWxlcy5zY2hlZHVsZSgpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBQYWNrYWdlIHByb3RlY3RlZCBmb3IgYWNjZXNzIGJ5IGlubmVyIEpvYiBjbGFzcyBpbiByZXNvdXJjZUNoYW5nZWQoLi4uKQotCSAqIEByZXR1cm4KLQkgKi8KLQlKU1BSZXNvdXJjZVZpc2l0b3IgZ2V0VmlzaXRvcigpICB7Ci0JCQotCQlpZih0aGlzLmZWaXNpdG9yID09IG51bGwpIHsKLQkJCXRoaXMuZlZpc2l0b3IgPSBuZXcgSlNQUmVzb3VyY2VWaXNpdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZlZpc2l0b3I7Ci0JfQotCQotCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDkxCi0JLy8gbWFrZXMgc3VyZSBJbmRleE1hbmFnZXIgaXMgYXdhcmUgb2Ygb3VyIGluZGV4ZXMKLQlwdWJsaWMgdm9pZCBzYXZlSW5kZXhlcygpIHsKLQkJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpOwotCQlJUGF0aCBqc3BNb2RlbFdvcmtpbmdMb2NhdGlvbiA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbigpOwotCQkKLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShqc3BNb2RlbFdvcmtpbmdMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQlTdHJpbmdbXSBmaWxlcyA9IGZvbGRlci5saXN0KCk7Ci0JCVN0cmluZyBsb2NheSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUluZGV4IGluZGV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZvcihpbnQgaT0wOyBpPGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYoZmlsZXNbaV0udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmluZGV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2NheSA9IGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvU3RyaW5nKCkgKyIvIiArIGZpbGVzW2ldOyAvLyROT04tTkxTLTEkCi0JCQkJCWluZGV4ID0gbmV3IEluZGV4KGxvY2F5LCAiSW5kZXggZm9yICIgKyBsb2NheSwgdHJ1ZSAvKnJldXNlIGluZGV4IGZpbGUqLyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5kZXhNYW5hZ2VyLnNhdmVJbmRleChpbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gd2Ugc2hvdWxkIGJlIHNodXR0aW5nIGRvd24sIHdhbnQgdG8gc2h1dCBkb3duIHF1aWV0bHkKLQkJCWlmKERFQlVHKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JSUNvbnRlbnRUeXBlIGdldEpzcENvbnRlbnRUeXBlKCkgewotCQlpZih0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotCQkJdGhpcy5mQ29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJcmV0dXJuIHRoaXMuZkNvbnRlbnRUeXBlSlNQOwotCX0KLQkKLQkvKioKLQkgKiBBIGNoZWNrIHRvIHNlZSBpZiB0aGUgT1NHSSBmcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFN5c3RlbSBCdW5kbGUgaXMgc3RvcHBlZCAoaWUuIHRoZSBmcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bikKLQkgKi8KLQlib29sZWFuIGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkgewotCQkvLyBpbiB0aGUgRnJhbWV3b3JrIGNsYXNzIHRoZXJlJ3MgYSBub3RlOgotCQkvLyBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTeXN0ZW0gQnVuZGxlIHRvIFNUT1BQSU5HLgotCQkvLyB0aGlzIG11c3QgYmUgZG9uZSBmaXJzdCBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjE5LjIgZnJvbSB0aGUgT1NHaSBSMyBzcGVjLiAgCi0JCWJvb2xlYW4gc2h1dHRpbmdEb3duID0gUGxhdGZvcm0uZ2V0QnVuZGxlKE9TR0lfRlJBTUVXT1JLX0lEKS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5TVE9QUElORzsKLQkJaWYgKERFQlVHICYmIHNodXR0aW5nRG93bikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXI6IHN5c3RlbSBpcyBzaHV0dGluZyBkb3duISIpOwotCQl9Ci0JCXJldHVybiBzaHV0dGluZ0Rvd247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0NTQ2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFBhdGhJbmRleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci0KLS8qKgotICogcGFfVE9ETyBTdGlsbCBuZWVkIHRvIHRha2UgaW50byBjb25zaWRlcmF0aW9uOgotICogCS0gZm9jdXMgaW4gd29ya3NwYWNlCi0gKiAgLSBzZWFyY2ggcGF0dGVybgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGF0aEluZGV4ZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZT0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLy8gdmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlCi0JY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQkvLyBoYXNoIG1hcCBmb3JjZXMgb25seSBvbmUgb2YgZWFjaCBmaWxlCi0JCXByaXZhdGUgSGFzaE1hcCBmUGF0aHMgPSBuZXcgSGFzaE1hcCgpOwotCQlJSmF2YVNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0JCVNlYXJjaFBhdHRlcm4gZlBhdHRlcm4gPSBudWxsOwotCi0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuZlBhdHRlcm4gPSBwYXR0ZXJuOwotCQkJdGhpcy5mU2NvcGUgPSBzY29wZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkKLQkJCWlmKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0KLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJCS8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uCi0JCQkJLy8gY2hlY2sgbmFtZSBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyB0aGUgZmlsZSAobGVzcyB3b3JrKQotCQkJCWlmKGNvbnRlbnRUeXBlSlNQLmlzQXNzb2NpYXRlZFdpdGgocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCQkKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSlwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlTdHJpbmcgY3RJZCA9IG51bGw7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJY3RJZCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1AuZXF1YWxzKGN0SWQpKSB7Ci0JCQkJCQlpZiAodGhpcy5mU2NvcGUuZW5jbG9zZXMocHJveHkucmVxdWVzdEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpIHsKLQkKLQkJCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIHNlbGVjdGVkIGluZGV4IHBhdGg6IiArIGZpbGUuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCWZQYXRocy5wdXQoZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLCBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuY29tcHV0ZUluZGV4TG9jYXRpb24oZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZG9uJ3Qgc2VhcmNoIGRlZXBlciBmb3IgZmlsZXMKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aFtdIGdldFBhdGhzKCkgewotCQkJcmV0dXJuIChJUGF0aFtdKSBmUGF0aHMudmFsdWVzKCkudG9BcnJheShuZXcgSVBhdGhbZlBhdGhzLnNpemUoKV0pOwotCQl9Ci0JfQotCi0JcHVibGljIElQYXRoW10gZ2V0VmlzaWJsZUpzcFBhdGhzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewotCi0JCUpTUEZpbGVWaXNpdG9yIGpzcEZpbGVWaXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKHBhdHRlcm4sIHNjb3BlKTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuYWNjZXB0KGpzcEZpbGVWaXNpdG9yLCAwKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBqc3BGaWxlVmlzaXRvci5nZXRQYXRocygpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjRhMDI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmV4Y2VwdGlvbnMuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotCi0KLS8qKgotICogQ3JlYXRlZCB3aXRoIGEgLmpzcCBmaWxlLCBidXQgc2hvdWxkIGFwcGVhciB0byBiZSBhIC5qYXZhIGZpbGUgZm9yIGluZGV4aW5nCi0gKiBhbmQgc2VhcmNoaW5nIHB1cnBvc2VzLiAgVGhlcmUgYXJlIHB1cnBvc2VseSBmZXcgZmllbGRzIGluIHRoaXMgY2xhc3MsCi0gKiBhbmQgdGhvc2UgZmllbGRzIGFyZSBsaWdodHdlaWdodCBzaW5jZSBpdCdzIHBvc3NpYmxlIGZvciBtYW55IEpTUCBzZWFyY2gKLSAqIGRvY3VtZW50cyB0byBleGlzdCBpbiBtZW1vcnkgYXQgb25lIHRpbWUgKGVnLiBhZnRlciBpbXBvcnRpbmcgYSBwcm9qZWN0Ci0gKiB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIEpTUCBmaWxlcykKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaERvY3VtZW50IHsKLQotCXByaXZhdGUgU3RyaW5nIFVOS05PV05fUEFUSCA9ICIqKnBhdGggdW5rbm93bioqIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZKU1BQYXRoU3RyaW5nID0gVU5LTk9XTl9QQVRIOwotCXByaXZhdGUgU3RyaW5nIGZDVVBhdGggPSBVTktOT1dOX1BBVEg7Ci0JcHJpdmF0ZSBTZWFyY2hQYXJ0aWNpcGFudCBmUGFydGljaXBhbnQgPSBudWxsOwotCQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIHBhcnRpY2lwYW50Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIEpTUFNlYXJjaERvY3VtZW50KFN0cmluZyBmaWxlUGF0aCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQotCQl0aGlzLmZKU1BQYXRoU3RyaW5nID0gZmlsZVBhdGg7Ci0JCXRoaXMuZlBhcnRpY2lwYW50ID0gcGFydGljaXBhbnQ7Ci0JfQotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50IGdldFBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gdGhpcy5mUGFydGljaXBhbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQjZ2V0Q2hhckNvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50cygpIHsKLSAgICAgICAgSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotCQlyZXR1cm4gdHJhbnMgIT0gbnVsbCA/IHRyYW5zLmdldEphdmFUZXh0KCkudG9DaGFyQXJyYXkoKSA6IG5ldyBjaGFyWzBdOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGdldENoYXJDb250ZW50cygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCQotCS8qKgotCSAqIEl0J3Mgbm90IHJlY29tbWVuZGVkIGZvciBjbGllbnRzIHRvIGhvbGQgb24gdG8gdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqIHNpbmNlIGl0J3Mga2luZCBvZiBsYXJnZS4gIElmIHBvc3NpYmxlLCBob2xkIG9uIHRvIHRoZSBKU1BTZWFyY2hEb2N1bWVudCwKLQkgKiB3aGljaCBpcyBtb3JlIG9mIGEgbGlnaHR3ZWlnaHQgcHJveHkuCi0JICogCi0JICogQHJldHVybiB0aGUgSlNQVHJhbnNsYXRpb24gZm9yIHRoZSBqc3AgZmlsZSwgb3IgbnVsbCBpZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGZpbGUuCi0JICovCi0JcHVibGljIGZpbmFsIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGdldEpTUFRyYW5zbGF0aW9uKCkgewotCQlKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0JCUlGaWxlIGpzcEZpbGUgPSBnZXRGaWxlKCk7Ci0JCWlmKCFKU1BTZWFyY2hTdXBwb3J0LmlzSnNwKGpzcEZpbGUpKQotCQkJcmV0dXJuIHRyYW5zbGF0aW9uOwotCQkKLQkJWE1MTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZ2V0IGV4aXN0aW5nIG1vZGVsIGZvciByZWFkLCB0aGVuIGdldCBkb2N1bWVudCBmcm9tIGl0Ci0JCQl4bWxNb2RlbCA9IChYTUxNb2RlbCkgZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGpzcEZpbGUpOwotCQkJLy8gaGFuZGxlIHVuc3VwcG9ydGVkCi0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXNldHVwQWRhcHRlckZhY3RvcnkoeG1sTW9kZWwpOwotCQkJCVhNTERvY3VtZW50IGRvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSBkb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCXRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwgZSkgewotCQkJLy8gbm8gbmVlZCB0byBsb2cgdGhpcy4gSnVzdCBjb25zaWRlciBpdCBhbiBpbnZhbGlkIGZpbGUgZm9yIG91cgotCQkJLy8gcHVycG9zZXMuCi0JCQkvL0xvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0JfQotCQotCS8qKgotCSAqIGFkZCB0aGUgZmFjdG9yeSBmb3IgSlNQVHJhbnNsYXRpb25BZGFwdGVyIGhlcmUKLQkgKiAKLQkgKiBAcGFyYW0gc20KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBBZGFwdGVyRmFjdG9yeShJU3RydWN0dXJlZE1vZGVsIHNtKSB7Ci0JCUpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogdGhlIHBhdGggdG8gdGhlIEphdmEgY29tcGlsYXRpb24gdW5pdAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldFBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLSAgICAgICAgSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotCSAgICAvLyBjYWNoaW5nIHRoZSBwYXRoIHNpbmNlIGl0J3MgZXhwZW5zaXZlIHRvIGdldCB0cmFuc2xhdGlvbgotCSAgICBpZih0aGlzLmZDVVBhdGggPT0gbnVsbCB8fCB0aGlzLmZDVVBhdGggPT0gVU5LTk9XTl9QQVRIKSB7ICAKLSAgICAgICAgICAgIGlmKHRyYW5zICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhpcy5mQ1VQYXRoID0gdHJhbnMuZ2V0SmF2YVBhdGgoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gZkNVUGF0aCAhPSBudWxsID8gZkNVUGF0aCA6IFVOS05PV05fUEFUSDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRKc3BPZmZzZXQoaW50IGphdmFPZmZzZXQpIHsKLQkgICAgLy8gY29waWVkIGZyb20gSlNQVHJhbnNsYXRpb24KLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgb2Zmc2V0SW5SYW5nZSA9IDA7Ci0JCVBvc2l0aW9uIGpzcFBvcywgamF2YVBvcyA9IG51bGw7Ci0JCUpTUFRyYW5zbGF0aW9uIHRyYW5zID0gZ2V0SlNQVHJhbnNsYXRpb24oKTsKLSAgICAgICAgaWYodHJhbnMgIT0gbnVsbCkgewotICAgIAkJSGFzaE1hcCBqYXZhMmpzcE1hcCA9IHRyYW5zLmdldEphdmEySnNwTWFwKCk7Ci0gICAgCQkKLSAgICAJCS8vIGl0ZXJhdGUgYWxsIG1hcHBlZCBqYXZhIHJhbmdlcwotICAgIAkJSXRlcmF0b3IgaXQgPSBqYXZhMmpzcE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIAkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgIAkJCWphdmFQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLSAgICAJCQkvLyBuZWVkIHRvIGNvdW50IHRoZSBsYXN0IHBvc2l0aW9uIGFzIGluY2x1ZGVkCi0gICAgCQkJaWYgKCFqYXZhUG9zLmluY2x1ZGVzKGphdmFPZmZzZXQpICYmICEoamF2YVBvcy5vZmZzZXQramF2YVBvcy5sZW5ndGggPT0gamF2YU9mZnNldCkpCi0gICAgCQkJCWNvbnRpbnVlOwotICAgIAotICAgIAkJCW9mZnNldEluUmFuZ2UgPSBqYXZhT2Zmc2V0IC0gamF2YVBvcy5vZmZzZXQ7Ci0gICAgCQkJanNwUG9zID0gKFBvc2l0aW9uKSBqYXZhMmpzcE1hcC5nZXQoamF2YVBvcyk7Ci0gICAgCQkJCi0gICAgCQkJaWYoanNwUG9zICE9IG51bGwpCi0gICAgCQkJCXJlc3VsdCA9IGpzcFBvcy5vZmZzZXQgKyBvZmZzZXRJblJhbmdlOwotICAgIAkJCWVsc2UgIHsKLSAgICAJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJqc3BQb3NpdGlvbiB3YXMgbnVsbCEiICsgamF2YU9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQl9Ci0gICAgCQkJYnJlYWs7Ci0gICAgCQl9Ci0gICAgICAgIH0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JICAgIElQYXRoIGpzcFBhdGggPSBuZXcgUGF0aCh0aGlzLmZKU1BQYXRoU3RyaW5nKTsKLQkgICAgSUZpbGUganNwRmlsZSA9IHJvb3QuZ2V0RmlsZShqc3BQYXRoKTsKLQkgICAgaWYoIWpzcEZpbGUuZXhpc3RzKCkpIHsKLQkgICAgICAgIC8vIHBvc3NpYmx5IG91dHNpZGUgd29ya3NwYWNlCi0JICAgICAgICBqc3BGaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24oanNwUGF0aCk7Ci0JICAgIH0KLQkJcmV0dXJuIGpzcEZpbGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gbm93IHNpbmNlIEpTUFRyYW5zbGF0aW9uIGlzIGNyZWF0ZWQgb24gdGhlIGZseQotCX0KLQkKLQkvKioKLQkgKiBmb3IgZGVidWdnaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJbSlNQU2VhcmNoRG9jdW1lbnQ6IiArIHRoaXMuZkpTUFBhdGhTdHJpbmcgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQjZ2V0RW5jb2RpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQjZ2V0Qnl0ZUNvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50cygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDRmNWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotCi0vKioKLSAqIEludGVncmF0aW9uIG9mIEpTUCB3LyBqYXZhIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaFBhcnRpY2lwYW50IGV4dGVuZHMgU2VhcmNoUGFydGljaXBhbnQgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBJbXBvcnRhbnQgdG8gbmV2ZXIgcmV0dXJuIG51bGwgaGVyZSBvciBlbHNlIEphdmEgc2VhcmNoIHBhcnRpY2lwYXRpb24gd2lsbCBicmVhay4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCkgewotCQkKLQkJU2VhcmNoRG9jdW1lbnQgc0RvYyA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRTZWFyY2hEb2N1bWVudChkb2N1bWVudFBhdGgpOwotCi0JCWlmKHNEb2MgPT0gbnVsbCl7Ci0JCQkvLyByZXR1cm4gYSBkdW1teSBkb2MgaGVyZSBzbyBzZWFyY2ggcGFydGljaXBhdGlvbiBkb2Vzbid0IGJyZWFrCi0JCQlyZXR1cm4gbmV3IE51bGxTZWFyY2hEb2N1bWVudChkb2N1bWVudFBhdGgpOwotCQl9Ci0JCXJldHVybiBzRG9jOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiSlNQIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUGF0aFtdIHNlbGVjdEluZGV4ZXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB7Ci0JCUpTUFBhdGhJbmRleGVyIGluZGV4ZXIgPSBuZXcgSlNQUGF0aEluZGV4ZXIoKTsKLQkJcmV0dXJuIGluZGV4ZXIuZ2V0VmlzaWJsZUpzcFBhdGhzKHBhdHRlcm4sIHNjb3BlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbmRleERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBJUGF0aCBpbmRleFBhdGgpIHsKLQkJaWYgKCEoZG9jdW1lbnQgaW5zdGFuY2VvZiBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gdXNlIEphdmEgc2VhcmNoIGluZGV4aW5nCi0JCVNlYXJjaEVuZ2luZS5nZXREZWZhdWx0U2VhcmNoUGFydGljaXBhbnQoKS5pbmRleERvY3VtZW50KGRvY3VtZW50LCBpbmRleFBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoRG9jdW1lbnRbXSBpbmRleE1hdGNoZXMsIFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQkJCi0JCS8vIGZpbHRlciBvdXQgbnVsbCBtYXRjaGVzCi0JCUxpc3QgZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVNlYXJjaERvY3VtZW50IG1hdGNoID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleE1hdGNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBvc3NpYmxlIG1hdGNoaW5nIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlOiAiICsgaW5kZXhNYXRjaGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJbWF0Y2ggPSBpbmRleE1hdGNoZXNbaV07Ci0JCQlpZiAobWF0Y2ggIT0gbnVsbCkgewotCQkJCS8vIHNvbWUgbWF0Y2hlcyBtYXkgYmUgbnVsbCwgb3IgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBkYXRlLCB0aGUgZmlsZSBtYXkgbm90IGV2ZW4gZXhpc3QKLQkJCQlpZihtYXRjaCBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlICYmICgoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUpbWF0Y2gpLmdldEZpbGUoKS5leGlzdHMoKSkKLQkJCQlmaWx0ZXJlZC5hZGQobWF0Y2gpOwotCQkJfQotCQl9Ci0KLQkJaW5kZXhNYXRjaGVzID0gKFNlYXJjaERvY3VtZW50W10pIGZpbHRlcmVkLnRvQXJyYXkobmV3IFNlYXJjaERvY3VtZW50W2ZpbHRlcmVkLnNpemUoKV0pOwotCQlTZWFyY2hFbmdpbmUuZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCkubG9jYXRlTWF0Y2hlcyhpbmRleE1hdGNoZXMsIHBhdHRlcm4sIHNjb3BlLCByZXF1ZXN0b3IsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50I2JlZ2luU2VhcmNoaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblNlYXJjaGluZygpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50I2RvbmVTZWFyY2hpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvbmVTZWFyY2hpbmcoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCNnZXREb2N1bWVudChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUZpbGUgZmlsZSkgewotCQkvLyBuZXZlciBnZXRzIGNhbGxlZD8KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU2NvcGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljYzI2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotCi0vKioKLSAqIFVzZWQgdG8gY29uc3RyYWluIEpTUC9qYXZhIHNlYXJjaCB0byBjZXJ0YWluIHBhdGhzIGFuZCBlbGVtZW50cy4KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTZWFyY2hTY29wZSBpbXBsZW1lbnRzIElKYXZhU2VhcmNoU2NvcGUgewotCi0JcHJpdmF0ZSBib29sZWFuIGZFbmNsb3Nlc0FsbCA9IGZhbHNlOwotCXByaXZhdGUgTGlzdCBmUmVzb3VyY2VQYXRocyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZKYXZhRWxlbWVudHMgPSBudWxsOwotCi0JcHVibGljIEpTUFNlYXJjaFNjb3BlKCkgewotCQkvLyBlbXB0eSBjb25zdHJ1Y3RvciBqdXN0IHJldHVybnMgdHJ1ZSBmb3IgZXZlcnl0aGluZwotCQkvLyBldmVyeXRoaW5nIGlzIGluIHNjb3BlCi0JCXRoaXMuZkVuY2xvc2VzQWxsID0gdHJ1ZTsKLQkJaW5pdCgpOwotCX0KLQotCXB1YmxpYyBKU1BTZWFyY2hTY29wZShTdHJpbmdbXSByZXNvdXJjZVN0cmluZ1BhdGgpIHsKLQkJaW5pdCgpOwotCQlmUmVzb3VyY2VQYXRocy5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZXNvdXJjZVN0cmluZ1BhdGgpKTsKLQl9Ci0KLQlwdWJsaWMgSlNQU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10gamF2YUVsZW1lbnQpIHsKLQkJaW5pdCgpOwotCQlmSmF2YUVsZW1lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGphdmFFbGVtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXRoaXMuZlJlc291cmNlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMuZkphdmFFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhTdHJpbmcgcmVzb3VyY2VQYXRoU3RyaW5nKSB7Ci0KLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGVuY2xvc2VzUGF0aChyZXNvdXJjZVBhdGhTdHJpbmcpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJLy8gcGFfVE9EIGltcGxlbWVudAotCQlpZiAodGhpcy5mRW5jbG9zZXNBbGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhJUmVzb3VyY2VQcm94eSBlbGVtZW50KSB7Ci0KLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGVuY2xvc2VzUGF0aChlbGVtZW50LnJlcXVlc3RGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXRoaXMuZlJlc291cmNlUGF0aHMuYWRkKHBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5mSmF2YUVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW5jbG9zZXNQYXRoKFN0cmluZyBwb3NzaWJsZSkgewotCi0JCVN0cmluZ1tdIHBhdGhzID0gKFN0cmluZ1tdKSBmUmVzb3VyY2VQYXRocy50b0FycmF5KG5ldyBTdHJpbmdbZlJlc291cmNlUGF0aHMuc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwb3NzaWJsZS5lcXVhbHMocGF0aHNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCi0JCXJldHVybiAiSlNQU2VhcmNoU2NvcGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCkgewotCi0JCS8vIHBhX1RPRE8KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXNCaW5hcmllcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzQ2xhc3NwYXRocygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVzQmluYXJpZXMoYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc0NsYXNzcGF0aHMoYm9vbGVhbiBpbmNsdWRlc0NsYXNzcGF0aHMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjAwN2I1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZUxvb2t1cFRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUDJTZXJ2bGV0TmFtZVV0aWw7Ci0KLS8qKgotICogQ2VudHJhbCBhY2Nlc3MgdG8gamF2YSBpbmRleGluZyBhbmQgc2VhcmNoLiBBbGwgY29udGFjdCBiZXR3ZWVuIEpEVCBpbmRleGluZwotICogYW5kIFNlYXJjaGluZyBzaG91bGQgYmUgZG9uZSB0aHJvdWdoIGhlcmUuCi0gKiAKLSAqIENsaWVudHMgc2hvdWxkIGFjY2VzcyB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIHZpYSB0aGUgc2luZ2xlIGluc3RhbmNlIHZpYQotICogPGNvZGU+Z2V0SW5zdGFuY2UoKTwvY29kZT4uCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTZWFyY2hTdXBwb3J0IHsKLQotICAgIC8vIGZvciBkZWJ1Z2dpbmcKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLSAgICBzdGF0aWMgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigiY29tLmlibS5zc2UubW9kZWwuanNwL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIERFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBKU1BTZWFyY2hTdXBwb3J0IHNpbmdsZXRvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEpTUFNlYXJjaFBhcnRpY2lwYW50IGZQYXJ0aWNpcGFudCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIElQYXRoIGZKc3BQbHVnaW5Mb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAvLyBwYV9UT0RPIG1heSBiZSBzbG93IChlc3AgZm9yIGluZGV4aW5nIGVudGlyZSB3b3Jrc3BhY2UpCi0gICAgcHJpdmF0ZSBmaW5hbCBDUkMzMiBmQ2hlY2tzdW1DYWxjdWxhdG9yID0gbmV3IENSQzMyKCk7Ci0KLSAgICAvKiogbWFpbiBjYW5jZWwgbW9udGlvciBmb3IgYWxsIHNlYXJjaCBzdXBwb3J0ICovCi0gICAgcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIGZNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgIHByaXZhdGUgSlNQU2VhcmNoU3VwcG9ydCgpIHsKLSAgICAgICAgLy8gZm9yY2UgdXNlIG9mIHNpbmdsZSBpbnN0YW5jZQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgb3BlcmF0aW9uIGVuc3VyZXMgdGhhdCB0aGUgbGl2ZSByZXNvdXJjZSdzIHNlYXJjaCBtYXJrZXJzIHNob3cgdXAgaW4KLSAgICAgKiB0aGUgb3BlbiBlZGl0b3IuIEl0IGFsc28gYWxsb3dzIHRoZSBhYmlsaXR5IHRvIHBhc3MgaW4gYSBQcm9ncmVzc01vbml0b3IKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFNlYXJjaEpvYiBleHRlbmRzIEpvYiBpbXBsZW1lbnRzIElKYXZhU2VhcmNoQ29uc3RhbnRzIHsKLQotICAgICAgICBTdHJpbmcgZlNlYXJjaFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIElKYXZhU2VhcmNoU2NvcGUgZlNjb3BlID0gbnVsbDsKLQotICAgICAgICBpbnQgZlNlYXJjaEZvciA9IEZJRUxEOwotCi0gICAgICAgIGludCBmTGltaXRUbyA9IEFMTF9PQ0NVUlJFTkNFUzsKLQotICAgICAgICBpbnQgZk1hdGNoTW9kZSA9IFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIOwotCi0gICAgICAgIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCi0gICAgICAgIFNlYXJjaFJlcXVlc3RvciBmUmVxdWVzdG9yID0gbnVsbDsKLQotICAgICAgICBJSmF2YUVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIGphdmEgZWxlbWVudAotICAgICAgICBwdWJsaWMgU2VhcmNoSm9iKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgICAgIHN1cGVyKCJKU1AgU2VhcmNoIC0gIiArIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICB0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBzZWFyY2ggdGV4dAotICAgICAgICBwdWJsaWMgU2VhcmNoSm9iKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgc3VwZXIoIkpTUCBTZWFyY2ggLSAiICsgc2VhcmNoVGV4dCk7Ci0gICAgICAgICAgICB0aGlzLmZTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDsKLSAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0gICAgICAgICAgICB0aGlzLmZTZWFyY2hGb3IgPSBzZWFyY2hGb3I7Ci0gICAgICAgICAgICB0aGlzLmZMaW1pdFRvID0gbGltaXRUbzsKLSAgICAgICAgICAgIHRoaXMuZk1hdGNoTW9kZSA9IG1hdGNoTW9kZTsKLSAgICAgICAgICAgIHRoaXMuZklzQ2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTsKLSAgICAgICAgICAgIHRoaXMuZlJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGpvYk1vbml0b3IpIHsKLQotICAgICAgICAgICAgaWYgKGpvYk1vbml0b3IgIT0gbnVsbCAmJiBqb2JNb25pdG9yLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgICAgICAgICBpZiAoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0KLSAgICAgICAgICAgIFNlYXJjaFBhdHRlcm4gamF2YVNlYXJjaFBhdHRlcm4gPSBudWxsOwotICAgICAgICAgICAgLy8gaWYgYW4gZWxlbWVudCBpcyBhdmFpbGFibGUsIHVzZSB0aGF0IHRvIGNyZWF0ZSBzZWFyY2ggcGF0dGVybgotICAgICAgICAgICAgLy8gKGVnLiBMb2NhbFZhcmlhYmxlKQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgdGV4dCBhbmQgb3RoZXIgcGFyYW10ZXJzCi0gICAgICAgICAgICBpZiAodGhpcy5mRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGphdmFTZWFyY2hQYXR0ZXJuID0gU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKHRoaXMuZkVsZW1lbnQsIHRoaXMuZkxpbWl0VG8pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGphdmFTZWFyY2hQYXR0ZXJuID0gU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKHRoaXMuZlNlYXJjaFRleHQsIHRoaXMuZlNlYXJjaEZvciwgdGhpcy5mTGltaXRUbywgdGhpcy5mTWF0Y2hNb2RlKTsKLQotICAgICAgICAgICAgaWYgKGphdmFTZWFyY2hQYXR0ZXJuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKU1BTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IHsgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSB9OwotICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZSBlbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGpvYk1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvYk1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGVuZ2luZS5zZWFyY2goamF2YVNlYXJjaFBhdHRlcm4sIHBhcnRpY2lwYW50cywgdGhpcy5mU2NvcGUsIHRoaXMuZlJlcXVlc3Rvciwgam9iTW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG5vbi1Db3JlRXhjZXB0aW9ucyB3aWxsIHBlcm1hbmVudGx5IHN0YWxsIHRoZSBXb3JrZXIgdGhyZWFkCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGpvYk1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvYk1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZW5kIFNlYXJjaEpvYgotICAgIC8qKgotICAgICAqIFJ1bm5hYmxlIGZvcmNlcyBjYWxsZXIgdG8gd2FpdCB1bnRpbCBmaW5pc2hlZCAoYXMgb3Bwb3NlZCB0byB1c2luZyBhIEpvYikKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFNlYXJjaFJ1bm5hYmxlIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlLCBJSmF2YVNlYXJjaENvbnN0YW50cyB7Ci0KLSAgICAgICAgU3RyaW5nIGZTZWFyY2hUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJSmF2YVNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGZTZWFyY2hGb3IgPSBGSUVMRDsKLQotICAgICAgICBpbnQgZkxpbWl0VG8gPSBBTExfT0NDVVJSRU5DRVM7Ci0KLSAgICAgICAgaW50IGZNYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDsKLQotICAgICAgICBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotICAgICAgICBTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvciA9IG51bGw7Ci0KLSAgICAgICAgSUphdmFFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBqYXZhIGVsZW1lbnQKLSAgICAgICAgcHVibGljIFNlYXJjaFJ1bm5hYmxlKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgICAgIHRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIHNlYXJjaCB0ZXh0Ci0gICAgICAgIHB1YmxpYyBTZWFyY2hSdW5uYWJsZShTdHJpbmcgc2VhcmNoVGV4dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgaW50IHNlYXJjaEZvciwgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaFRleHQgPSBzZWFyY2hUZXh0OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaEZvciA9IHNlYXJjaEZvcjsKLSAgICAgICAgICAgIHRoaXMuZkxpbWl0VG8gPSBsaW1pdFRvOwotICAgICAgICAgICAgdGhpcy5mTWF0Y2hNb2RlID0gbWF0Y2hNb2RlOwotICAgICAgICAgICAgdGhpcy5mSXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmIChKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgU2VhcmNoUGF0dGVybiBqYXZhU2VhcmNoUGF0dGVybiA9IG51bGw7Ci0gICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgICAgICAvLyAoZWcuIExvY2FsVmFyaWFibGUpCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSB0ZXh0IGFuZCBvdGhlciBwYXJhbXRlcnMKLSAgICAgICAgICAgIGlmICh0aGlzLmZFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgZkxpbWl0VG8pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGphdmFTZWFyY2hQYXR0ZXJuID0gU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKGZTZWFyY2hUZXh0LCBmU2VhcmNoRm9yLCBmTGltaXRUbywgZk1hdGNoTW9kZSk7Ci0KLSAgICAgICAgICAgIGlmIChqYXZhU2VhcmNoUGF0dGVybiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSlNQU2VhcmNoUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSB7IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgfTsKLSAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUgZW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzaygiIiwgMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlYXJjaChqYXZhU2VhcmNoUGF0dGVybiwgcGFydGljaXBhbnRzLCBmU2NvcGUsIGZSZXF1ZXN0b3IsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICAvL3Rocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG5vbi1Db3JlRXhjZXB0aW9ucyB3aWxsIHBlcm1hbmVudGx5IHN0YWxsIHRoZSBXb3JrZXIgdGhyZWFkCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGVuZCBTZWFyY2hSdW5uYWJsZQotCi0gICAgLyoqCi0gICAgICogQ2xpZW50cyBzaG91bGQgYWNjZXNzIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgdmlhIHRoZSBzaW5nbGUgaW5zdGFuY2UKLSAgICAgKiB2aWEgZ2V0SW5zdGFuY2UoKQotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKU1BTZWFyY2hTdXBwb3J0IGdldEluc3RhbmNlKCkgewotCi0gICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCkKLSAgICAgICAgICAgIHNpbmdsZXRvbiA9IG5ldyBKU1BTZWFyY2hTdXBwb3J0KCk7Ci0gICAgICAgIHJldHVybiBzaW5nbGV0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gY2hlY2sgaWYgYSBmaWxlIGlzIGEganNwIGZpbGUgKHNpbmNlIHRoaXMgaXMgZG9uZQotICAgICAqIGZyZXF1ZW50bHkpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSnNwKElGaWxlIGZpbGUpIHsKLQotICAgICAgICBib29sZWFuIGlzSnNwID0gZmFsc2U7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCi0gICAgICAgICAgICAgICAgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24sIGl0J3MgbGVzcyBleHBlbnNpdmUKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGVKU1AuaXNBc3NvY2lhdGVkV2l0aChmaWxlLmdldE5hbWUoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGl0IGNhbiBiZSBudWxsCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihpcywgZmlsZS5nZXROYW1lKCksIG5ldyBRdWFsaWZpZWROYW1lW10geyBJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQgfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZUN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXNKc3AgPSAoZmlsZUN0SWQgIT0gbnVsbCAmJiBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQLmVxdWFscyhmaWxlQ3RJZCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCBhc3N1bWUgaXQncyBpbnZhbGlkIEpTUAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gbXVzdCBjbG9zZSBpbnB1dCBzdHJlYW0gaW4gY2FzZSBvdGhlcnMgbmVlZCBpdAotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc3VyZSBob3cgdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0pzcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzY2hlZHVsZXMgYSBzZWFyY2ggZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoaXMgSlNQIGZpbGUgZm9yIGluZGV4aW5nIChieQotICAgICAqIHRoZSBqYXZhIGluZGV4ZXIpCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBKU1AgZmlsZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbmRleGluZyB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGFkZEpzcEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBKU1AgZmlsZToiICsgZmlsZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIGNyZWF0ZQotICAgICAgICBTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IGNyZWF0ZVNlYXJjaERvY3VtZW50KGZpbGUpOwotICAgICAgICAvLyBudWxsIGlmIG5vdCBhIGpzcCBmaWxlCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldFNlYXJjaFBhcnRpY2lwYW50KCkuc2NoZWR1bGVEb2N1bWVudEluZGV4aW5nKGRlbGVnYXRlLCBjb21wdXRlSW5kZXhMb2NhdGlvbihmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZmFpbHVyZSBoZXJlIGRvZXNuJ3Qga2VlcCBvdGhlciBkb2N1bWVudHMgZnJvbQotICAgICAgICAgICAgICAgIC8vIGJlaW5nIGluZGV4ZWQKLSAgICAgICAgICAgICAgICAvLyBpZiBwZWZvcm1lZCBpbiBhIGJhdGNoIGNhbGwgKGxpa2UgSlNQSW5kZXhNYW5hZ2VyKQotICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGVkIiArIGRlbGVnYXRlICsgImZvciBpbmRleGluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBlcmZvcm0gYSBqYXZhIHNlYXJjaCB3LyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gUnVucyBpbiBhIGJhY2tncm91bmQgSm9iCi0gICAgICogKHJlc3VsdHMgbWF5IHN0aWxsIGNvbWUgaW4gYWZ0ZXIgdGhpcyBtZXRob2QgY2FsbCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoVGV4dAotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBvZiB0ZXh0IHRvIHNlYXJjaCBvbgotICAgICAqIEBwYXJhbSBzZWFyY2hGb3IKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsIE1FVEhPRCwgRklFTEQsIFBBQ0tBR0UsIGV0Yy4uLgotICAgICAqIEBwYXJhbSBsaW1pdFRvCi0gICAgICogICAgICAgICAgICBJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMsCi0gICAgICogICAgICAgICAgICBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLAotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTEVNRU5UT1JTLCBvcgotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTCi0gICAgICogQHBhcmFtIG1hdGNoTW9kZQotICAgICAqICAgICAgICAgICAgYWxsb3cgKiB3aWxkY2FyZHMgb3Igbm90Ci0gICAgICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKiAgICAgICAgICAgIHBhc3NlZCBpbiB0byBhY2NlcHQgc2VhcmNoIG1hdGNoZXMgKGFuZCBkbyAic29tZXRoaW5nIiB3aXRoCi0gICAgICogICAgICAgICAgICB0aGVtKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChTdHJpbmcgc2VhcmNoVGV4dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgaW50IHNlYXJjaEZvciwgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihzZWFyY2hUZXh0LCBzY29wZSwgc2VhcmNoRm9yLCBsaW1pdFRvLCBtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy8gcG9wcyB1cCB1c2VyIG9wZXJhdGlvbiBibG9ja2VkIGRpYWxvZyBpZiB5b3UgcGVyZm9ybSBhIGxvbmcgc2VhcmNoLAotICAgICAgICAvLyB0aGVuIG9wZW4gYSBmaWxlIGJlY2F1c2UgaXQgbG9ja3MgdGhlIHdvcmtzcGFjZQotICAgICAgICAvL2pvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgICBqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2ggZm9yIGFuIElKYXZhRWxlbWVudCwgY29uc3RyYWluZWQgYnkgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFJ1bnMgaW4KLSAgICAgKiBhIGJhY2tncm91bmQgSm9iIChyZXN1bHRzIG1heSBzdGlsbCBjb21lIGluIGFmdGVyIHRoaXMgbWV0aG9kIGNhbGwpCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc2NvcGUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihlbGVtZW50LCBzY29wZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YUVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYW4gSVdvcmtzcGFjZSBydW5uYWJsZSAocmVzdWx0cyB3aWxsIGJlIHJlcG9ydGVkIGJ5IHRoZSBlbmQgb2YgdGhpcwotICAgICAqIG1ldGhvZCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEBwYXJhbSBzY29wZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hSdW5uYWJsZShJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoUnVubmFibGUgc2VhcmNoUnVubmFibGUgPSBuZXcgU2VhcmNoUnVubmFibGUoZWxlbWVudCwgc2NvcGUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRDYW5jZWxlZChmYWxzZSk7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHNlYXJjaFJ1bm5hYmxlLCBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ganNwRmlsZQotICAgICAqIEByZXR1cm4gU2VhcmNoRG9jdW1lbnQgaWYgdGhlIGZpbGUgaXMgbm90IG51bGwsIGV4aXN0cywgYW5kIGlzIGEgSlNQCi0gICAgICogICAgICAgICBmaWxlLCBvdGhlcndpc2UgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNlYXJjaERvY3VtZW50IGNyZWF0ZVNlYXJjaERvY3VtZW50KElGaWxlIGpzcEZpbGUpIHsKLQotICAgICAgICBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIGlmIChqc3BGaWxlICE9IG51bGwgJiYganNwRmlsZS5leGlzdHMoKSAmJiBpc0pzcChqc3BGaWxlKSkgewotCi0gICAgICAgICAgICBkZWxlZ2F0ZSA9IG5ldyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShuZXcgSlNQU2VhcmNoRG9jdW1lbnQoanNwRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGdldFNlYXJjaFBhcnRpY2lwYW50KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDZW50cmFsaXplZCBwbGFjZSB0byBhY2Nlc3MgSlNQU2VhcmNoRG9jdW1lbnRzICh1c2VkIGJ5Ci0gICAgICogSlNQU2VhcmNoUGFydGljaXBhbnQgYW5kIEpTUFNlYXJjaFJlcXVlc3RvcikKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoRG9jUGF0aAotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcmV0dXJuIHRoZSBKU1BTZWFyY2hEb2N1bWVudCBvciBudWxsIGlmIG9uZSBpcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0U2VhcmNoRG9jdW1lbnQoU3RyaW5nIHNlYXJjaERvY1BhdGgpIHsKLSAgICAgICAgIAotICAgICAgICBTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIElGaWxlIGYgPSBmaWxlRm9yQ1VQYXRoKHNlYXJjaERvY1BhdGgpOwotICAgICAgICBpZiAoZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZSA9IGNyZWF0ZVNlYXJjaERvY3VtZW50KGYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaGFuZGxlIGZhaWx1cmUgY2FzZS4uLiAoZmlsZSBkZWxldGVkIG1heWJlPykKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5tYW5nbGVzIHRoZSBzZWFyY2hEb2NQYXRoIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIEpTUCBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hEb2NQYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBJRmlsZSBmaWxlRm9yQ1VQYXRoKFN0cmluZyBzZWFyY2hEb2NQYXRoKSB7Ci0gICAgCi0gICAgICAgIFN0cmluZ1tdIHNwbGl0ID0gc2VhcmNoRG9jUGF0aC5zcGxpdCgiLyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBzcGxpdFtzcGxpdC5sZW5ndGggLSAxXTsKLQotICAgICAgICAvLyBpZ25vcmUgYW55dGhpbmcgYnV0IC5qYXZhIG1hdGNoZXMgKGxpa2UgLmNsYXNzIGJpbmFyeSBtYXRjaGVzKQotICAgICAgICBpZighc2VhcmNoRG9jUGF0aC5lbmRzV2l0aCgiLmphdmEiKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBKU1AyU2VydmxldE5hbWVVdGlsLnVubWFuZ2xlKGNsYXNzbmFtZSk7Ci0gICAgICAgCi0gICAgICAgIC8vIHRyeSBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIElGaWxlIGYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlUGF0aCkpOwotICAgICAgICAvLyB3b3Jrc3BhY2UgcmVsYXRpdmUgdGhlbgotICAgICAgICBpZihmID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjAwOQotICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgcHJvamVjdCBuYW1lIGFzIHdlbGwKLSAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIG1lYW4gPj0gMiBwYXRoIHNlZ21lbnRzCi0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgpOwotICAgICAgICAgICAgaWYocGF0aC5zZWdtZW50Q291bnQoKSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICBKU1BTZWFyY2hQYXJ0aWNpcGFudCBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpIHsKLQotICAgICAgICBpZiAodGhpcy5mUGFydGljaXBhbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRoaXMuZlBhcnRpY2lwYW50ID0gbmV3IEpTUFNlYXJjaFBhcnRpY2lwYW50KCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmZQYXJ0aWNpcGFudDsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIGNhbGxlZCBmcm9tIEpTUFBhdGhJbmRleGVyCi0gICAgLy8gcGFfVE9ETwotICAgIC8vaG93IGNhbiB3ZSBtYWtlIHN1cmUgcGFydGljaXBhbnQgaW5kZXhMb2NhdGlvbnMgYXJlIHVwZGF0ZWQgYXQgc3RhcnR1cD8KLSAgICBwdWJsaWMgZmluYWwgSVBhdGggY29tcHV0ZUluZGV4TG9jYXRpb24oSVBhdGggY29udGFpbmVyUGF0aCkgewotCi0gICAgICAgIC8vIHBhX1RPRE8gdGhlcmUgc2hvdWxkIGJlIGEgbm9uIGludGVybmFsIHdheSB0byBkbyB0aGlzLgotICAgICAgICBJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0gICAgICAgIFNpbXBsZUxvb2t1cFRhYmxlIGluZGV4TG9jYXRpb25zID0gaW5kZXhNYW5hZ2VyLmluZGV4TG9jYXRpb25zOwotCi0gICAgICAgIFN0cmluZyBpbmRleExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGluZGV4TG9jYXRpb25zLmdldChjb250YWluZXJQYXRoKTsKLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbmRleExvY2F0aW9uID0gKFN0cmluZykgb2JqOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gY3JlYXRlIGluZGV4IGVudHJ5Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aFN0cmluZyA9IGNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpOwotICAgICAgICAgICAgdGhpcy5mQ2hlY2tzdW1DYWxjdWxhdG9yLnJlc2V0KCk7Ci0gICAgICAgICAgICB0aGlzLmZDaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKHBhdGhTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBMb25nLnRvU3RyaW5nKHRoaXMuZkNoZWNrc3VtQ2FsY3VsYXRvci5nZXRWYWx1ZSgpKSArICIuaW5kZXgiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbQotICAgICAgICAgICAgLy8gSW5kZXhNYW5hZ2VyI2NvbXB1dGVJbmRleExvY2F0aW9uKC4uLikKLSAgICAgICAgICAgIGluZGV4TG9jYXRpb24gPSBnZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSkudG9PU1N0cmluZygpOwotCi0gICAgICAgICAgICAvLyBwYV9UT0RPIG5lZWQgdG8gYWRkIHRvIGphdmEgcGF0aCB0b28sIHNvIEpEVCBzZWFyY2ggc3VwcG9ydCBrbm93cwotICAgICAgICAgICAgLy8gdGhlcmUgc2hvdWxkIGJlIGEgbm9uIGludGVybmFsIHdheSB0byBkbyB0aGlzLgotICAgICAgICAgICAgaW5kZXhMb2NhdGlvbnMucHV0KGNvbnRhaW5lclBhdGgsIGluZGV4TG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUGF0aChpbmRleExvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvLyBjb3BpZWQgZnJvbSBKRFQgSW5kZXhNYW5hZ2VyCi0gICAgcHVibGljIElQYXRoIGdldE1vZGVsSnNwUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkgewotCi0gICAgICAgIGlmICh0aGlzLmZKc3BQbHVnaW5Mb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkpzcFBsdWdpbkxvY2F0aW9uOwotCi0gICAgICAgIElQYXRoIHN0YXRlTG9jYXRpb24gPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0KLSAgICAgICAgLy8gcGFfVE9ETyB3b3JrYXJvdW5kIGZvcgotICAgICAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIyNjcKLSAgICAgICAgLy8gY29waWVkIGZyb20gSW5kZXhNYW5hZ2VyCi0gICAgICAgIFN0cmluZyBkZXZpY2UgPSBzdGF0ZUxvY2F0aW9uLmdldERldmljZSgpOwotICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwgJiYgZGV2aWNlLmNoYXJBdCgwKSA9PSAnLycpCi0gICAgICAgICAgICBzdGF0ZUxvY2F0aW9uID0gc3RhdGVMb2NhdGlvbi5zZXREZXZpY2UoZGV2aWNlLnN1YnN0cmluZygxKSk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuZkpzcFBsdWdpbkxvY2F0aW9uID0gc3RhdGVMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKU1AgSW5kZXhpbmcgYW5kIFNlYXJjaCBqb2JzIGNoZWNrIHRoaXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gY2FuY2VsKSB7Ci0KLSAgICAgICAgZk1vbml0b3Iuc2V0Q2FuY2VsZWQoY2FuY2VsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKU1AgSW5kZXhpbmcgYW5kIFNlYXJjaCBqb2JzIGNoZWNrIHRoaXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0KLSAgICAgICAgcmV0dXJuIGZNb25pdG9yLmlzQ2FuY2VsZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKU1AgSW5kZXhpbmcgYW5kIFNlYXJjaCBqb2JzIGNoZWNrIHRoaXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCi0gICAgICAgIHJldHVybiB0aGlzLmZNb25pdG9yOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0phdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0phdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjEzZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25FeHRlbnNpb247Ci0KLQotLyoqCi0gKiBXcmFwcGVyIG1ldGhvZCB0byBzZXQgZ2V0UGF0aCgpIHBhdGggdG8gYmUgdGhlIHBhdGggb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgCi0gKiBmb3IgdGhlIGpzcCBmaWxlLiAoc2luY2UgaXQncyBhIGZpbmFsIG1ldGhvZCwgaXQgbmVlZHMgdG8gYmUgc2V0IHZpYSBjb25zdHJ1Y3RvcikKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIGV4dGVuZHMgU2VhcmNoRG9jdW1lbnQgewotCQotCXByaXZhdGUgSlNQU2VhcmNoRG9jdW1lbnQgZkpTUFNlYXJjaERvYyA9IG51bGw7Ci0JCi0JcHVibGljIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKEpTUFNlYXJjaERvY3VtZW50IGpzcFNlYXJjaERvYykgewotCQkKLQkJc3VwZXIoanNwU2VhcmNoRG9jLmdldFBhdGgoKSwganNwU2VhcmNoRG9jLmdldFBhcnRpY2lwYW50KCkpOwotCQl0aGlzLmZKU1BTZWFyY2hEb2MgPSBqc3BTZWFyY2hEb2M7Ci0JfQotCi0JcHVibGljIGJ5dGVbXSBnZXRCeXRlQ29udGVudHMoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEJ5dGVDb250ZW50cygpOwotCX0KLQotCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnRzKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRDaGFyQ29udGVudHMoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRKYXZhVGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEVuY29kaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRGaWxlKCk7Ci0JfQotCQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBnZXRKc3BUcmFuc2xhdGlvbigpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRKc3BPZmZzZXQoaW50IGphdmFPZmZzZXQpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0SnNwT2Zmc2V0KGphdmFPZmZzZXQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQl0aGlzLmZKU1BTZWFyY2hEb2MucmVsZWFzZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvTnVsbE1vZGVsTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9OdWxsTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGRhZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9OdWxsTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VUklSZXNvbHZlcjsKLQotLyoqCi0gKiBTaW1wbGUgIm51bGwiIGltcGxlbWVudGF0aW9uLCBlbnRpcmVseSB0byBtb3JlIGVhc2lseSBoYW5kbGUgY2FzZSB3aGVyZQotICogbW9kZWwgbWFuYWdlciBjYW4ndCBiZSByZXRyaWV2ZWQgZHVlIHRvIHdvcmtzcGFjZSBzaHV0dGluZyBkb3duLiBJdHMgaW50ZW50Ci0gKiBpcyB0byBoZWxwIG1pbmltaXplIG51bGwgY2hlY2tzIChlc3BlY2lhbGx5IG5ldyBudWxsIGNoZWNrcyA6KQotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1vZGVsTWFuYWdlciBpbXBsZW1lbnRzIElNb2RlbE1hbmFnZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2Fib3V0VG9DaGFuZ2VNb2RlbHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3Iob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRGb3Iob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2NyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sIGNvbS5pYm0uc3NlLm1vZGVsLnV0aWwuVVJJUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGNvbS5pYm0uc3NlLm1vZGVsLnV0aWwuVVJJUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvbnRlbnQsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sIGNvbS5pYm0uc3NlLm1vZGVsLnV0aWwuVVJJUmVzb2x2ZXIsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlciwgU3RyaW5nIGlhbmFFbmNvZGluZ05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2NyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2NyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGNvbS5pYm0uc3NlLm1vZGVsLnV0aWwuVVJJUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKFN0cmluZyBjb250ZW50VHlwZUlkLCBVUklSZXNvbHZlciByZXNvbHZlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNhZGRNb2RlbE1hbmFnZXJMaXN0ZW5lcihjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTW9kZWxNYW5hZ2VyTGlzdGVuZXIoSU1vZGVsTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNjaGFuZ2VkTW9kZWxzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFuZ2VkTW9kZWxzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLklNb2RlbE1hbmFnZXIjY29weU1vZGVsRm9yRWRpdChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjb3B5TW9kZWxGb3JFZGl0KFN0cmluZyBvbGRJZCwgU3RyaW5nIG5ld0lkKSB0aHJvd3MgUmVzb3VyY2VJblVzZSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoT2JqZWN0IGlkKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldEV4aXN0aW5nTW9kZWxGb3JFZGl0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoT2JqZWN0IGlkKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldEV4aXN0aW5nTW9kZWxGb3JSZWFkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldEV4aXN0aW5nTW9kZWxJZHMoKQotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFeGlzdGluZ01vZGVsSWRzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNnZXRNb2RlbEZvckVkaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNnZXRNb2RlbEZvckVkaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLklNb2RlbE1hbmFnZXIjZ2V0TW9kZWxGb3JFZGl0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlLAotCSAqICAgICAgY29tLmlibS5lbmNvZGluZy5yZXNvdXJjZS5FbmNvZGluZ1J1bGUpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNnZXRNb2RlbEZvclJlYWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUsCi0JICogICAgICBjb20uaWJtLmVuY29kaW5nLnJlc291cmNlLkVuY29kaW5nUnVsZSkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldE1vZGVsRm9yUmVhZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldE1vZGVsRm9yUmVhZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNnZXRNb2RlbEZvckVkaXQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sIGNvbS5pYm0uc3NlLm1vZGVsLnV0aWwuVVJJUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNnZXRNb2RlbEZvclJlYWQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sIGNvbS5pYm0uc3NlLm1vZGVsLnV0aWwuVVJJUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNnZXROZXdNb2RlbEZvckVkaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNnZXROZXdNb2RlbEZvclJlYWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNnZXRSZWZlcmVuY2VDb3VudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnQoT2JqZWN0IGlkKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldFJlZmVyZW5jZUNvdW50Rm9yRWRpdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KE9iamVjdCBpZCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yUmVhZChPYmplY3QgaWQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLklNb2RlbE1hbmFnZXIjaXNTaGFyZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZChPYmplY3QgaWQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2lzU2hhcmVkRm9yRWRpdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yRWRpdChPYmplY3QgaWQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2lzU2hhcmVkRm9yUmVhZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yUmVhZChPYmplY3QgaWQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2lzU3RhdGVDaGFuZ2luZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0ZUNoYW5naW5nKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLklNb2RlbE1hbmFnZXIjbW92ZU1vZGVsKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVNb2RlbChPYmplY3Qgb2xkSWQsIE9iamVjdCBuZXdJZCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLklNb2RlbE1hbmFnZXIjcmVsb2FkTW9kZWwoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0pCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVsb2FkTW9kZWwoT2JqZWN0IGlkLCBJbnB1dFN0cmVhbSBpblN0cmVhbSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNyZWluaXRpYWxpemUoY29tLmlibS5zc2UubW9kZWwuSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLklNb2RlbE1hbmFnZXIjcmVtb3ZlTW9kZWxNYW5hZ2VyTGlzdGVuZXIoY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGVsTWFuYWdlckxpc3RlbmVyKElNb2RlbE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLklNb2RlbE1hbmFnZXIjc2F2ZVN0cnVjdHVyZWREb2N1bWVudChjb20uaWJtLnNzZS5tb2RlbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlU3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBJRmlsZSBpRmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2NhbGN1bGF0ZUlkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSUZpbGUgZmlsZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNjYWxjdWxhdGVCYXNlTG9jYXRpb24ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVCYXNlTG9jYXRpb24oSUZpbGUgZmlsZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNjcmVhdGVOZXdJbnN0YW5jZShjb20uaWJtLnNzZS5tb2RlbC5JU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU5ld0luc3RhbmNlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldEV4aXN0aW5nTW9kZWxGb3JSZWFkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuSU1vZGVsTWFuYWdlciNnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldE1vZGVsRm9yRWRpdChjb20uaWJtLnNzZS5tb2RlbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgdGV4dEZpbGVCdWZmZXJEb2N1bWVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5JTW9kZWxNYW5hZ2VyI2dldE1vZGVsRm9yUmVhZChjb20uaWJtLnNzZS5tb2RlbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElTdHJ1Y3R1cmVkRG9jdW1lbnQgdGV4dEZpbGVCdWZmZXJEb2N1bWVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5OWExMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRvcjsKLQotCi0KLS8qKgotICogQW4gZW1wdHkgc2VydmxldCwgc2FmZSBmb3IgSmF2YSBzZWFyY2ggcGFydGljaXBhdGlvbgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgTnVsbFNlYXJjaERvY3VtZW50IGV4dGVuZHMgU2VhcmNoRG9jdW1lbnQgewotCQotCVN0cmluZ0J1ZmZlciBmRW1wdHlTZXJ2bGV0QnVmZmVyID0gbnVsbDsKLQkKLQlwdWJsaWMgTnVsbFNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgpIHsKLQkJc3VwZXIoZG9jdW1lbnRQYXRoLCBuZXcgSlNQU2VhcmNoUGFydGljaXBhbnQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyID0gbmV3IEpTUFRyYW5zbGF0b3IoKS5nZXRFbXB0eVRyYW5zbGF0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQlyZXR1cm4gdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLQl9Ci0JCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmZFbXB0eVNlcnZsZXRCdWZmZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUENvZGVSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUENvZGVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiMTQzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BDb2RlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BDb2RlUmVnaW9uIGV4dGVuZHMgRm9yZWlnblJlZ2lvbiB7Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uUGFyc2VyIGZCbG9ja05vZGVDaGVja2VyID0gbnVsbDsKLQotCS8qKgotCSAqIEphdmFDb2RlUmVnaW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpTUENvZGVSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpTUENvZGVSZWdpb24oU3RyaW5nIG5ld0NvbnRleHQsIGludCBuZXdTdGFydCwgaW50IG5ld1RleHRMZW5ndGgsIGludCBuZXdMZW5ndGgpIHsKLQkJc3VwZXIobmV3Q29udGV4dCwgbmV3U3RhcnQsIG5ld1RleHRMZW5ndGgsIG5ld0xlbmd0aCwgImpzcC1qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFJlZ2lvblBhcnNlcgotCSAqLwotCXByb3RlY3RlZCBSZWdpb25QYXJzZXIgZ2V0QmxvY2tOb2RlQ2hlY2tlcigpIHsKLQkJaWYgKGZCbG9ja05vZGVDaGVja2VyID09IG51bGwpIHsKLQkJCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQkJZkJsb2NrTm9kZUNoZWNrZXIgPSBtbWFuYWdlci5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCkuZ2V0UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGZCbG9ja05vZGVDaGVja2VyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQuaW50ZXJmYWNlcy5jb3JlLklSZWdpb25Db2RlQXNzaXN0UHJvY2Vzc29yCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDAyNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQuWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQkvKioKLQkgKiBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIFRoaXMgaXMgYSBsYW5ndWFnZSBzcGVjaWZpYyBtZXRob2QgKGUuZy4gSFRNTCwgSmF2YSwgUHJvbG9nLCBldGMuKSBzbwotCS8vIGNvdWxkL3Nob3VsZCBiZSBtYWRlIGNvbmZpZ3VyYWJsZS4KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGYyN2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuSlNQMTFUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkNvcmVOb2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSlNQUmVQYXJzZXIgZXh0ZW5kcyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciB7Ci0KLQkvKioKLQkgKiBBbGxvdyBhIHJlcGFyc2VyIHRvIGNoZWNrIGZvciBleHRyYSBzeW50YWN0aWMgY2FzZXMgdGhhdCByZXF1aXJlCi0JICogcGFyc2luZyBiZXlvbmQgdGhlIGZsYXROb2RlIGJvdW5kYXJ5LgotCSAqIAotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBKU1AgbGFuZ3VhZ2UgbWFya2VycyAoY29tbWVudHMgYXJlIGhhbmRsZWQKLQkgKiBlbHNld2hlcmUpLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uU3ludGF4KCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBzdXBlci5jaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uU3ludGF4KCk7Ci0JCS8vIE5vbmUgb2YgdGhlIHN1cGVyY2xhc3MnIGNhc2VzIHdlcmUgdmFsaWQsIHNvIGNoZWNrIGZvciBKU1AgY2FzZXMKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjaGVja0ZvckpTUCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQSBjaGFuZ2UgdG8gYSBKU1AgdGFnIGNhbiByZXN1bHQgaW4gYWxsIGJlaW5nIHJlcGFyc2VkLgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JKU1AoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiPCU9Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiPCUhIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiJT4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgYSBjb21tZW50IHN0YXJ0IG9yIGVuZCB0YWcgaXMgYmVpbmcgYWRkZWQgb3IgZGVsZXRlZCwgd2UnbGwgcmVzY2FuCi0JICogdGhlIHdob2xlIGRvY3VtZW50LiBUaGUgcmVhc29uIGlzIHRoYXQgY29udGVudCB0aGF0IGlzIHJldmVhbGVkIG9yCi0JICogY29tbWVudGVkIG91dCBjYW4gZWZmZWN0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmVzdCBvZiB0aGUKLQkgKiBkb2N1bWVudC4gTm90ZTogZm9yIG5vdyB0aGlzIGlzIHZlcnkgWE1ML0pTUCBzcGVjaWZpYywgY2FuCi0JICogcmVmYWN0b3IvaW1wcm92ZSBsYXRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDb21tZW50cygpIHsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBzdXBlci5jaGVja0ZvckNvbW1lbnRzKCk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiPCUtLSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIi0tJT4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyB3ZSdsbCBhbHNvIGNoZWNrIGZvciB0aGVzZSBkZWdlbmVyYXRlIGNhc2VzCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlLS0tJT4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvcmUgcmVwYXJzaW5nIG1ldGhvZCAuLi4gYWZ0ZXIgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eSBlbmQgaGF2ZQotCSAqIGJlZW4gY2FsY3VsYXRlZCBlbHNld2hlcmUuIC0gdGhpcyBtZXRob2Qgb3ZlcnJpZGVzLCBkb2VzIG5vdCBleHRlbmQKLQkgKiBzdXBlcidzIG1ldGhvZC4gY2hhbmdlcy9maXhlcyB0byBzdXBlciBtYXkgaGF2ZSB0byBiZSBtYWRlIGhlcmUgYXMKLQkgKiB3ZWxsLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlTdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eUVuZCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpbnQgcmVzY2FuU3RhcnQgPSAtMTsKLQkJaW50IHJlc2NhbkVuZCA9IC0xOwotCQlib29sZWFuIGZpcnN0VGltZSA9IGZhbHNlOwotCQlib29sZWFuIGRldGVjdGVkQnJlYWtpbmdDaGFuZ2UgPSBmYWxzZTsKLQotCQkvLwotCQkvLyAic2F2ZSIgdGhlIG9sZE5vZGVzICh0aGF0IG1heSBiZSByZXBsYWNlZCkgaW4gYSBsaXN0Ci0JCUNvcmVOb2RlTGlzdCBvbGROb2RlcyA9IGZvcm1PbGROb2RlcyhkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0KLQkJaWYgKGNvbnRhaW5zQnJlYWtpbmdDaGFuZ2Uob2xkTm9kZXMpIHx8IGlzQnJlYWtpbmdXaXRoTmVzdGVkVGFnKGRpcnR5U3RhcnQsIGRpcnR5RW5kKSkgewotCQkJaWYgKERlYnVnLmRlYnVnVGFnbGlicykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlcGFyc2U6IGlzIHRhZ2xpYiBvciBpbmNsdWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWRldGVjdGVkQnJlYWtpbmdDaGFuZ2UgPSB0cnVlOwotCQkJcmVzY2FuU3RhcnQgPSAwOwotCQkJcmVzY2FuRW5kID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSArIGZMZW5ndGhEaWZmZXJlbmNlOwotCQkJb2xkTm9kZXMgPSBmb3JtT2xkTm9kZXMoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQljbGVhclRhZ2xpYkluZm8oKTsKLQkJfQotCQllbHNlIGlmIChkaXJ0eVN0YXJ0ID09IG51bGwgfHwgZGlydHlFbmQgPT0gbnVsbCkgewotCQkJLy8gZGlydHlTdGFydCBvciBkaXJ0eSBlbmQgYXJlIG51bGwsIHRoZW4gdGhhdCBtZWFucyB3ZSBkaWRuJ3QKLQkJCS8vIGhhdmUgYQotCQkJLy8gY2FjaGVkIG5vZGUsIHdoaWNoIG1lYW5zIHdlIGhhdmUgYW4gZW1wdHkgZG9jdW1lbnQsIHNvIHdlCi0JCQkvLyBqdXN0IG5lZWQgdG8gcmVzY2FuIHRoZSBjaGFuZ2VzCi0JCQlyZXNjYW5TdGFydCA9IDA7Ci0JCQlyZXNjYW5FbmQgPSBmQ2hhbmdlcy5sZW5ndGgoKTsKLQkJCWZpcnN0VGltZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlc2NhbgotCQkJcmVzY2FuU3RhcnQgPSBkaXJ0eVN0YXJ0LmdldFN0YXJ0KCk7Ci0JCQkvLwotCQkJLy8gc2V0IHRoZSBlbmQgb2YgdGhlIHRleHQgdG8gcmVzY2FuCi0JCQkvLyBub3RpY2Ugd2UgdXNlIHRoZSBzYW1lIHJhdGlvbmFsZSBhcyBmb3IgdGhlIHJlc2NhblN0YXJ0LAotCQkJLy8gd2l0aCB0aGUgYWRkZWQgY2F2ZWF0IHRoYXQgbGVuZ3RoIGhhcyB0byBiZSBhZGRlZCB0byBpdCwKLQkJCS8vIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBuZXcgdGV4dCB3aGljaCBoYXMgYmVlbiBhZGRlZCBvciBkZWxldGVkLgotCQkJLy8gSWYgY2hhbmdlcyBoYXMgemVybyBsZW5ndGgsIHRoZW4gImxlbmd0aCIgd2lsbCBiZSBuZWdhdGl2ZSwKLQkJCS8vIHNpbmNlCi0JCQkvLyB3ZSBhcmUgZGVsZXRpbmcgdGV4dC4gT3RoZXJ3aXNlLCB1c2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCQkJLy8gd2hhdCdzIHNlbGVjdGVkIHRvIGJlIHJlcGxhY2VkIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgdGV4dC4KLQkJCXJlc2NhbkVuZCA9IGRpcnR5RW5kLmdldEVuZCgpICsgZkxlbmd0aERpZmZlcmVuY2U7Ci0JCX0KLQotCQkvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBvbGQgc3R1ZmYgInNhdmVkIiBhd2F5LCB1cGRhdGUgdGhlIGRvY3VtZW50Ci0JCS8vIHdpdGggdGhlIGNoYW5nZXMuCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQudXBkYXRlRG9jdW1lbnREYXRhKGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSwgZkNoYW5nZXMpOwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0gbm93IHRoZSByZWFsIHdvcmsKLQkJcmVzdWx0ID0gY29yZV9yZXBhcnNlKHJlc2NhblN0YXJ0LCByZXNjYW5FbmQsIG9sZE5vZGVzLCBmaXJzdFRpbWUpOwotCQkvLwotCi0JCS8vIGlmIHdlIGRpZCBub3QgZGV0ZWN0IGEgYnJlYWtpbmcgdHlwZSBvZiBjaGFuZ2UgYXQgdGhlIGJlZ2lubmluZywKLQkJLy8gYnV0Ci0JCS8vIGRvIG5vdywgdGhlbiByZXBhcnNlIGFsbCEgSWYgd2UgZGlkIGRldGVjdCB0aGVtLCB0aGVuIHdlIG1heSBvciBtYXkKLQkJLy8gbm90IGRldGVjdCBhZ2FpbiwgYnV0IHByZXN1bWFibHkgd2UndmUgYWxyZWFkeSBzZXQgdXAgdG8gcmUtcGFyc2VkCi0JCS8vIGV2ZXJ0aGluZywgc28gbm8gbmVlZCB0byBkbyBhZ2Fpbi4KLQkJaWYgKCghZGV0ZWN0ZWRCcmVha2luZ0NoYW5nZSkgJiYgKGNvbnRhaW5zQnJlYWtpbmdDaGFuZ2Uob2xkTm9kZXMpKSkgewotCQkJY2xlYXJUYWdsaWJJbmZvKCk7Ci0JCQkvLyByZXBhcnNlIGFsbAotCQkJb2xkTm9kZXMgPSBmb3JtT2xkTm9kZXMoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQlyZXN1bHQgPSBjb3JlX3JlcGFyc2UoMCwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSwgb2xkTm9kZXMsIGZpcnN0VGltZSk7Ci0JCX0KLQotCQkvLyBldmVudCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLCBpbmNhc2UgdGhlcmUgaXMKLQkJLy8gc29tZSBvcHRpbWl6YXRpb24gdGhleSBjYW4gZG8KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IHRoZSByZWdpb25zIGdpdmVuLCByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnRzIG9mIGEKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBjb250YWluIHJlZ2lvbnMgdGhhdCBjb3VsZCBhbHRlciB0aGUKLQkgKiBiZWhhdmlvciBvZiB0aGUgcGFyc2VyIG9yIHRoZSBwYXJzaW5nIG9mIGFyZWFzIG91dHNpZGUgb2YgdGhlIHJlZ2lvbnMKLQkgKiBnaXZlbi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCcmVha2luZ0NoYW5nZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUsIElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCXJldHVybiBpc1RhZ2xpYk9ySW5jbHVkZShub2RlLCByZWdpb25zKSB8fCBpc0pzcFJvb3QocmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcmVnaW9ucyBnaXZlbiwgcmVwcmVzZW50aW5nIHRoZSByZWdpb25zIHRvdWNoZWQgYnkgYQotCSAqIHRleHQgY2hhbmdlIGhhdmU6IDEpIC4uLmFuIGluc2VydGlvbiBhdCB0aGUgdGV4dEVuZE9mZnNldCBvZiBhbgotCSAqIFhNTF9UQUdfT1BFTiB0aGF0J3MgaW4gaXQncyBvd24gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmQgcHJlY2VkZWQKLQkgKiBieSBhbiB1bmVuZGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gMikgLi4uYSBkZWxldGlvbiBoYXBwZW5pbmcgaW4KLQkgKiBhbiBYTUxfRU1QVFlfVEFHX0NMT1NFIHRoYXQgZW5kcyBhIElUZXh0UmVnaW9uQ29udGFpbmVyIDMpIC4uLmFuCi0JICogaW5zZXJ0aW9uIGhhcHBlbmluZyB3aXRoIGEgJyA8JyBjaGFyYWN0ZXIgc29tZXdoZXJlIGluIGFuIFhNTCBhdHRyaWJ1dGUKLQkgKiBuYW1lIG9yIHZhbHVlIDQpIC4uLmEgZGVsZXRpb24gb2YgYSBub3JtYWwgWE1MX1RBR19DTE9TRSBzaW5jZQotCSAqIHN1YnNlcXVlbnQgdGFncyBiZWNvbWUgYXR0cmlidXRlIHZhbHVlcwotCSAqLwotCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtpbmdXaXRoTmVzdGVkVGFnKGJvb2xlYW4gY2hhbmdlc0luY2x1ZGVBX2x0LCBib29sZWFuIGRlbHNJbmNsdWRlQV9ndCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSBwYXJlbnQuZ2V0UHJldmlvdXMoKTsKLQkJLy8gY2FzZSAxIHRlc3QKLQkJaWYgKHBhcmVudC5nZXRSZWdpb25zKCkuc2l6ZSgpID09IDEgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiAmJiAocHJldmlvdXMgPT0gbnVsbCB8fCAoIXByZXZpb3VzLmlzRW5kZWQoKSB8fCBwcmV2aW91cy5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCS8vY2FzZSAyIHRlc3QKLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbjsKLQkJCUlUZXh0UmVnaW9uIGludGVybmFsID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5nZXQoY29udGFpbmVyLmdldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQkJCWlmIChpbnRlcm5hbC5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSAmJiBjb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAyKQotCQkJCWludGVybmFsID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5nZXQoY29udGFpbmVyLmdldFJlZ2lvbnMoKS5zaXplKCkgLSAyKTsKLQkJCWlmIChpbnRlcm5hbC5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvL2Nhc2UgMyB0ZXN0Ci0JCWlmIChjaGFuZ2VzSW5jbHVkZUFfbHQgJiYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJLy9jYXNlIDQgdGVzdAotCQlpZiAoZGVsc0luY2x1ZGVBX2d0ICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcmVnaW9ucyBnaXZlbiwgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiBhCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaW5jbHVkZXMgYSBqc3A6cm9vdCB0YWcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKc3BSb290KElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCXJldHVybiByZWdpb25zLnNpemUoKSA+IDEgJiYgcmVnaW9ucy5nZXQoMCkuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmIHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IHRoZSByZWdpb25zIGdpdmVuLCByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnRzIG9mIGEKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpbmNsdWRlcyBhIHZhbGlkIHRhZ2xpYiBkaXJlY3RpdmUgb3IgaW5jbHVkZQotCSAqIGRpcmVjdGl2ZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1RhZ2xpYk9ySW5jbHVkZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUsIElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCWJvb2xlYW4gc2l6ZUFuZFR5cGVzTWF0Y2ggPSAocmVnaW9ucy5zaXplKCkgPiAxKSAmJiAocmVnaW9ucy5nZXQoMSkuZ2V0VHlwZSgpID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkKLQkJCQkJJiYgKHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgcmVnaW9ucy5nZXQoMCkuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKTsKLQkJaWYgKCFzaXplQW5kVHlwZXNNYXRjaCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMSk7Ci0JCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gbm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCXJldHVybiBzaXplQW5kVHlwZXNNYXRjaAotCQkJCQkmJiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5UQUdMSUIpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuSU5DTFVERSkgfHwgZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQikgfHwgZGlyZWN0aXZlTmFtZQotCQkJCQkJCQkuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyVGFnbGliSW5mbygpIHsKLQkJaWYgKERlYnVnLmRlYnVnVGFnbGlicykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2xlYXJpbmcgdGFnbGliIGluZm8iKTsgLy8kTk9OLU5MUy0xJAotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikKLQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBwYXJzZXIpLnJlc2V0SGFuZGxlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNCcmVha2luZ0NoYW5nZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBsaXN0KSB7Ci0JCWJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCWlmIChpc0JyZWFraW5nQ2hhbmdlKG5vZGUsIG5vZGUuZ2V0UmVnaW9ucygpKSkgewotCQkJCWNvbnRhaW5zID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbnM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZERpcnR5RW5kKGludCBlbmQpIHsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IHN1cGVyLmZpbmREaXJ0eUVuZChlbmQpOwotCi0JCS8vIGlmIG5vdCB3ZWxsIGZvcm1lZCwgZ2V0IG9uZSBwYXN0LCBpZiBpdHMgbm90IG51bGwKLQotCQkvLyBub3csIGlmIGFueSBvZiB0by1iZS1zY2FubmVkIGZsYXRub2RlcyBhcmUgdGhlIHN0YXJ0IG9mIGEganNwCi0JCS8vIHJlZ2lvbiwgd2UnbGwKLQkJLy8gcmVwYXJzZSBhbGwgdGhlIHdheSB0byB0aGUgZW5kLCB0byBiZSBzdXJlIHdlIGRldGVjdCBlbWJlZGRlZAotCQkvLyByZWdpb25zIChvciBub3QtZW1iZWRkZWQgcmVnaW9ucykgY29ycmVjdGx5LgotCQkvLyBub3RpY2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBpZiB3ZSdyZSBvbmx5IHByb2Nlc3Npbmcgb25lIG5vZGUuCi0JCS8vIG5vdGljZSB0b28gd2UgaGF2ZSBhIHN0cm9uZyBhc3N1bXB0aW9uIGhlcmUgdGhhdCBkaXJ0eVN0YXJ0IGhhcwotCQkvLyBhbHJlYWR5IGJlZW4gZm91bmQhCi0JCS8vCi0JCS8vIG5vdGUgdGhhdCBkaXJ0eUVuZCBpcyBub3QgY2hlY2tlZCBpbiB0aGUgZG8tYmxvY2sgYmVsb3csIHNvIHdlJ2xsCi0JCS8vIGNoZWNrIGl0IGZpcnN0LgotCQlpZiAoaXNKU1BFbWJlZGRlZFN0YXJ0T3JFbmQocmVzdWx0KSkgewotCQkJcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3aGVuIGVuZCBub2RlIGFuZCBzdGFydCBub2RlIGFyZSB0aGUgc2FtZSwgd2Ugb25seSBuZWVkIHRoZQotCQkJLy8gYWJvdmUKLQkJCS8vIGNoZWNrLCBvdGhlcndpc2UsIHRoZXJlJ3MgYSBmZXcgY2FzZXMgdGhhdCB3ZSdsbCBzZWFyY2ggdGhlCi0JCQkvLyByZXN0IG9mIHRoZQotCQkJLy8gZmxhdG5vZGVzIG5lZWRsZXNzbHkuCi0JCQlpZiAocmVzdWx0ICE9IGRpcnR5U3RhcnQpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNlYXJjaE5vZGUgPSBkaXJ0eVN0YXJ0OwotCQkJCWRvIHsKLQkJCQkJaWYgKGlzSlNQRW1iZWRkZWRTdGFydE9yRW5kKHNlYXJjaE5vZGUpKSB7Ci0JCQkJCQlyZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2VhcmNoTm9kZSA9IHNlYXJjaE5vZGUuZ2V0TmV4dCgpOwotCQkJCQl9Ci0JCQkJCS8vIGlmIHdlIGdldCB0byB0aGUgY3VycmVudCBkaXJ0eSBlbmQsIG9yIGVuZCBvZgotCQkJCQkvLyBmbGF0bm9kZXMsIHdpdGhvdXQgZmluZGluZyBKU1AgcmVnaW9uIHRoZW4gd2UKLQkJCQkJLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBmdXJ0aGVyCi0JCQkJfQotCQkJCXdoaWxlICgoc2VhcmNoTm9kZSAhPSByZXN1bHQpICYmIChzZWFyY2hOb2RlICE9IG51bGwpKTsKLQkJCX0KLQkJfQotCQkvLyByZXN1bHQgc2hvdWxkIG5ldmVyIGJlIG51bGwsIGJ1dCBjYWNoZWROb2RlIG5lZWRzIHRvIGJlIHByb3RlY3RlZAotCQkvLyBmcm9tIGJlaW5nIGNoYW5nZWQgdG8gbnVsbAotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWRpcnR5RW5kID0gcmVzdWx0OwotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtpbmdXaXRoTmVzdGVkVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWJvb2xlYW4gY2hhbmdlc0luY2x1ZGVBX2x0ID0gZkNoYW5nZXMgIT0gbnVsbCAmJiBmQ2hhbmdlcy5pbmRleE9mKCc8JykgPj0gMDsKLQkJYm9vbGVhbiBkZWxzSW5jbHVkZUFfZ3QgPSBmRGVsZXRlZFRleHQgIT0gbnVsbCAmJiBmRGVsZXRlZFRleHQuaW5kZXhPZignPicpID49IDA7Ci0KLQkJLy9MaXN0IHJlZ2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHN0YXJ0OwotCQlpbnQgZW5kUmVwbGFjZSA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2U7Ci0JCXdoaWxlIChlbmQgIT0gbnVsbCAmJiBub2RlICE9IGVuZC5nZXROZXh0KCkpIHsKLQkJCUl0ZXJhdG9yIGkgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoaW50ZXJzZWN0cyhub2RlLCByZWdpb24sIGZTdGFydCwgZW5kUmVwbGFjZSkpIHsKLQotCQkJCQlyZXN1bHQgPSBpc0JyZWFraW5nV2l0aE5lc3RlZFRhZyhjaGFuZ2VzSW5jbHVkZUFfbHQsIGRlbHNJbmNsdWRlQV9ndCwgbm9kZSwgcmVnaW9uKTsKLQotCQkJCQlpZiAocmVzdWx0KQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQkJaWYgKHJlc3VsdCkKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbnRlcnNlY3RzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSwgSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgbG93LCBpbnQgaGlnaCkgewotCQlpbnQgc3RhcnQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCWludCBlbmQgPSBub2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQlyZXR1cm4gKGVuZCA+PSBsb3cgJiYgc3RhcnQgPD0gaGlnaCkgfHwgKHN0YXJ0IDw9IGxvdyAmJiBlbmQgPj0gbG93KSB8fCAoc3RhcnQgPD0gaGlnaCAmJiBlbmQgPj0gaGlnaCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHBvdGVudGlhbGx5IGNvdWxkIGJlIGEganNwIGVtYmVkZGVkIHJlZ2lvbi4gVGhpbmdzIGxpa2UKLQkgKiBKU1AgRGVjbGFyYXRpb24gY2FuJ3QgYmUgZW1iZWRkZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQRW1iZWRkZWRTdGFydE9yRW5kKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCXJlc3VsdCA9ICgodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHx8ICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHx8ICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogZXh0ZW5kcyBzdXBlciBjbGFzcyBiZWhhdmlvcgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUGFydE9mQmxvY2tSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJcmVzdWx0ID0gKCh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgfHwgKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHx8IHN1cGVyLmlzUGFydE9mQmxvY2tSZWdpb24oZmxhdE5vZGUpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSlNQUmVQYXJzZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcXVpY2tDaGVjaygpIHsKLQkJaWYgKGNvbnRhaW5zQnJlYWtpbmdDaGFuZ2UobmV3IENvcmVOb2RlTGlzdChkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzdXBlci5xdWlja0NoZWNrKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5jbG9uZSgpOwotCQl9Ci0JCWNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb3VsZCBvbmx5IGhhcHBlbiBpZiBzb21lIGNoYW5nZXMKLQkJCS8vIHN1cGVyY2xhc3Mgc29tZWRheQotCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQU291cmNlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BTb3VyY2VQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzNjM3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BTb3VyY2VQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsLkpTUFRva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5JUmVnaW9uQ29tcGFyaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuSlNQQ2FwYWJsZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogVGFrZXMgaW5wdXQgZnJvbSB0aGUgSlNQVG9rZW5pemVyIGFuZCBjcmVhdGVzIGEgdGFnIGxpc3QKLSAqLwotCi1wdWJsaWMgY2xhc3MgSlNQU291cmNlUGFyc2VyIGV4dGVuZHMgWE1MU291cmNlUGFyc2VyIGltcGxlbWVudHMgSlNQQ2FwYWJsZVBhcnNlciB7Ci0JcHJvdGVjdGVkIGNsYXNzIE5lc3RhYmxlUHJlZml4SGFuZGxlciBpbXBsZW1lbnRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24gewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxuczoiOwotCi0JCS8qKgotCQkgKiBFbmFibGVzIGEgVExEIG93bmluZyB0aGUgZ2l2ZW4gcHJlZml4IGxvYWRlZCBmcm9tIHRoZSBnaXZlbiBVUkkgYXQKLQkJICogdGhlIGFuY2hvckZsYXROb2RlLiBUaGUgbGlzdCBvZiBhZGRpdGlvbmFsQ01Eb2N1bWVudHMgd2lsbCBjbGFpbSB0bwotCQkgKiBub3Qga25vdyBhbnkgb2YgaXRzIHRhZ3MgYXQgcG9zaXRpb25zIGVhcmxpZXIgdGhhbiB0aGF0Ci0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ncyBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEZvciB0YWdsaWIgZGlyZWN0aXZlcywgdGhlIHRhZ2xpYiBpcyB0aGUgYW5jaG9yIHdoaWxlIHRhZ2xpYnMKLQkJICogcmVnaXN0ZXJlZCB0aHJvdWdoIGluY2x1ZGUgZGlyZWN0aXZlcyB1c2UgdGhlIHByaW1hcnkgaW5jbHVkZQotCQkgKiBkaXJlY3RpdmUgYXMgdGhlaXIgYW5jaG9yLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZW5hYmxlRm9yVGFnbGliKFN0cmluZyBwcmVmaXgsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yRmxhdE5vZGUpIHsKLQkJCWlmIChwcmVmaXggPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlMaXN0IHRhZ21hcmtlcnMgPSAoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmdldE5lc3RhYmxlUHJlZml4ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnbWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJCWlmICgoKFRhZ01hcmtlcikgdGFnbWFya2Vycy5nZXQoaSkpLmdldFRhZ05hbWUoKS5lcXVhbHMocHJlZml4KSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5nZXROZXN0YWJsZVByZWZpeGVzKCkuYWRkKG5ldyBUYWdNYXJrZXIocHJlZml4LCBhbmNob3JGbGF0Tm9kZSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFDb3JlRmxhdE5vZGUpIHsKLQkJCS8vIGNvdWxkIHRlc3QgPiAxLCBidXQgc2luY2Ugd2Ugb25seSBjYXJlIGlmIHRoZXJlIGFyZSA4ICg8JUAsCi0JCQkvLyB0YWdsaWIsIHVyaSwgPSwgd2hlcmUsIHByZWZpeCwgPSwgd2hhdCkgW29yIDQgZm9yIGluY2x1ZGVzXQotCQkJaWYgKGFDb3JlRmxhdE5vZGUuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiA0ICYmIGFDb3JlRmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKS5nZXRUeXBlKCkgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJSVRleHRSZWdpb24gbmFtZSA9IGFDb3JlRmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQl0cnkgewotCQkJCQlpbnQgb2Zmc2V0ID0gYUNvcmVGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChuYW1lKTsKLQkJCQkJaW50IGxlbmd0aCA9IG5hbWUuZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlib29sZWFuIHRhZ2xpYmRldGVjdGVkID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gdGFnbGliZGlyZWN0aXZlZGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJCQkJdGFnbGliZGV0ZWN0ZWQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCQkJCQl0YWdsaWJkaXJlY3RpdmVkZXRlY3RlZCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gb2xkIGZhc2hpb25lZCB3YXkKLQkJCQkJCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gZ2V0VGV4dChvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQl0YWdsaWJkZXRlY3RlZCA9IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJCQkJCXRhZ2xpYmRpcmVjdGl2ZWRldGVjdGVkID0gZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBwcm9jZXNzRGlyZWN0aXZlTmFtZSA9IHRhZ2xpYmRldGVjdGVkIHx8IHRhZ2xpYmRpcmVjdGl2ZWRldGVjdGVkOwotCQkJCQlpZiAocHJvY2Vzc0RpcmVjdGl2ZU5hbWUpIHsKLQkJCQkJCXByb2Nlc3NUYWdsaWIoYUNvcmVGbGF0Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkJLy9kbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQkJLy8gY291bGQgdGVzdCA+IDEsIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgaWYgdGhlcmUgYXJlIDUgKDwsCi0JCQkvLyBqc3A6cm9vdCwgeG1sbnM6cHJlZml4LCA9LCB3aGVyZSkKLQkJCWVsc2UgaWYgKGFDb3JlRmxhdE5vZGUuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiA0ICYmIChhQ29yZUZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSkpLmdldFR5cGUoKSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkgewotCQkJCXByb2Nlc3NKU1BSb290KGFDb3JlRmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0pTUFJvb3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YWdsaWJGbGF0Tm9kZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSB0YWdsaWJGbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCWJvb2xlYW4gdGFnbGliID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gdGFnbGliRmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCWludCBsZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCi0JCQkJCQlTdHJpbmcgbmFtZSA9IGdldFRleHQob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChYTUxOUykgJiYgbmFtZS5sZW5ndGgoKSA+IFhNTE5TLmxlbmd0aCgpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlwcmVmaXggPSBuYW1lLnN1YnN0cmluZyg2KTsKLQkJCQkJCQl0YWdsaWIgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJlZml4ID0gbnVsbDsKLQkJCQkJCQl0YWdsaWIgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmICh0YWdsaWIgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlwcmVmaXggPSBTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpOwotCQkJCQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQllbmFibGVGb3JUYWdsaWIocHJlZml4LCB0YWdsaWJGbGF0Tm9kZSk7Ci0JCQkJCQkJcHJlZml4ID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJcHJlZml4ID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBQdWxscyB0aGUgcHJlZml4IGZyb20gdGhlIGdpdmVuIHRhZ2xpYiBkaXJlY3RpdmUKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmQgbWFrZXMgc3VyZSB0aGUgcHJlZml4IGlzIG5lc3RhYmxlLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RhZ2xpYihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZ2xpYkZsYXROb2RlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZ2xpYkZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQkJYm9vbGVhbiBwcmVmaXhuYW1lID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsICYmIGZDaGFyU2VxdWVuY2VTb3VyY2UgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJCQkJCWludCBvZmZzZXQgPSB0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkJCWludCBsZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJCXByZWZpeG5hbWUgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlBSRUZJWCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvbGQgZmFzaGlvbmVkIHdheQotCQkJCQkJCXByZWZpeG5hbWUgPSAoZ2V0VGV4dCh0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5QUkVGSVgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcmVmaXhuYW1lICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJcHJlZml4ID0gZ2V0VGV4dCh0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJcHJlZml4ID0gbnVsbDsKLQkJCX0KLQkJCXByZWZpeCA9IFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCk7Ci0JCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCWVuYWJsZUZvclRhZ2xpYihwcmVmaXgsIHRhZ2xpYkZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKSB7Ci0JCQlJdGVyYXRvciB0YWdtYXJrZXJzID0gKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5nZXROZXN0YWJsZVByZWZpeGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlICh0YWdtYXJrZXJzLmhhc05leHQoKSkgewotCQkJCWlmICghKChUYWdNYXJrZXIpIHRhZ21hcmtlcnMubmV4dCgpKS5pc0dsb2JhbCgpKQotCQkJCQl0YWdtYXJrZXJzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiNzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoY29tLmlibS5zc2UubW9kZWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQkJCXJlc2V0Tm9kZXMoKTsKLQkJCWdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJaWYgKG5ld0RvY3VtZW50ICE9IG51bGwgJiYgbmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIHsKLQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgbmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkpLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBKU1BTb3VyY2VQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSlNQU291cmNlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KFRhZ01hcmtlciBtYXJrZXIpIHsKLQkJKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5hZGROZXN0YWJsZVByZWZpeChtYXJrZXIpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5lc3RhYmxlUHJlZml4ZXMoKSB7Ci0JCXJldHVybiAoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmdldE5lc3RhYmxlUHJlZml4ZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQmxvY2tUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IEpTUFRva2VuaXplcigpOwotCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKS5hZGQobmV3IE5lc3RhYmxlUHJlZml4SGFuZGxlcigpKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnBhcnNlci5SZWdpb25QYXJzZXIjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCUpTUFNvdXJjZVBhcnNlciBuZXdJbnN0YW5jZSA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJbmV3SW5zdGFuY2Uuc2V0VG9rZW5pemVyKGdldFRva2VuaXplcigpLm5ld0luc3RhbmNlKCkpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCS8vIERNVzogMi8xMi8wMy4gTWFkZSBjdXJyZW50IG5vZGUgbG9jYWwgdmFyaWFibGUsIHNpbmNlCi0JCS8vIHdlIGNoYW5nZWQgY2xhc3MgdG8gbm90IHJlcXVpcmUgc3RhdGUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQotCQl3aGlsZSAoKHJlZ2lvbiA9IGdldE5leHRSZWdpb24oKSkgIT0gbnVsbCkgewotCQkJdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyB0aGVzZSB0eXBlcyAobWlnaHQpIGRlbWFuZCBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm9yIGVhY2gKLQkJCS8vIG9mIHRoZW0KLQkJCWlmICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJCS8vIG11bHRpcGxlIGJsb2NrIHRleHRzIGluZGljYXRlZCBlbWJlZGRlZCBjb250YWluZXJzOyBubwotCQkJCQkvLyBuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBub3QgY29udGludWluZyBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vIGVuc3VyZSB0aGF0IGFueSBleGlzdGluZyBub2RlIGlzIGF0IGxlYXN0Ci0JCQkJCQkvLyB0ZXJtaW5hdGVkCi0JCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5zZXRUZXh0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0KLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCQl9Ci0JCQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy9yZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgT1BFTiBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJZWxzZSBpZiAoKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuaXNFbmRlZCgpKSB8fCAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkKLQkJCQkJCXx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikKLQkJCQkJCXx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCAodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pCi0JCQkJCQl8fCAodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCAodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHx8ICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgfHwgdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfT1BFTikgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGVuc3VyZSB0aGF0IGFueSBleGlzdGluZyBub2RlIGlzIGF0IGxlYXN0IHRlcm1pbmF0ZWQKLQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJLy8gZkN1cnJlbnROb2RlLnNldFRleHRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLQotCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQl9Ci0JCQkJCWxhc3ROb2RlID0gY3VycmVudE5vZGU7Ci0JCQkJfQotCQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy9yZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBORUlUSEVSIG9wZW4gbm9yIGNsb3NlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOyBqdXN0IGFkZCB0byB0aGVtCi0JCQllbHNlIGlmICgodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCQkJCXx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQpIHx8ICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQpCi0JCQkJCQl8fCAodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkgfHwgKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UKSB7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIGNsb3NlIG9mZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQkvLyBjbGVhbmx5Ci0JCQllbHNlIGlmICgodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKQotCQkJCQkJfHwgKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB8fCAodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpCi0JCQkJCQl8fCB0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DTE9TRSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvL3JlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhpcyBpcyBleHRyZW1lbHkgcmFyZSwgYnV0IHZhbGlkCi0JCQllbHNlIGlmICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCS8vIHBhY2sgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciB3aXRoIHRoaXMgcmVnaW9uCi0JCQkJaWYgKGxhc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQlJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoSVRleHRSZWdpb25Db250YWluZXIpIGxhc3RSZWdpb247Ci0JCQkJCWNvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKHJlZ2lvbik7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgY29udGFpbmVyIHJlZ2lvbnMgaGF2ZSBwYXJlbnQuIFByb2JhYmx5IGEKLQkJCQkJLy8gYmV0dGVyIHBsYWNlIHRvIHNldCwKLQkJCQkJLy8gYnV0IGZvciBub3csIHdpbGwgKHJlKXNldCBlYWNoIHRpbWUgdGhyb3VnaAotCQkJCQljb250YWluZXIuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy9yZWdpb24uc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydChjb250YWluZXIuZ2V0TGVuZ3RoKCkgLSByZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGhXaXRoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoV2l0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlVOREVGSU5FRCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gc2tpcCBvbiBhIHZlcnktZmlyc3QgcmVnaW9uIHNpdHVhdGlvbiBhcyB0aGUgZGVmYXVsdAotCQkJCS8vIGJlaGF2aW9yIGlzIGdvb2QgZW5vdWdoCi0JCQkJLy8gY29tYmluZSB3aXRoIHByZXZpb3VzIGlmIGFsc28gdW5kZWZpbmVkCi0JCQkJaWYgKGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCQkJY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmFkanVzdExlbmd0aFdpdGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoV2l0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCQkvLyBwcmV2aW91cyB3YXNuJ3QgdW5kZWZpbmVkCi0JCQkJZWxzZSB7Ci0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiBhbiB1bmtub3duIHR5cGUgaXMgdGhlIGZpcnN0IHJlZ2lvbiBpbiB0aGUgZG9jdW1lbnQsCi0JCQkJLy8gZW5zdXJlIHRoYXQgYSBub2RlIGV4aXN0cwotCQkJCWlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvL3JlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCi0JCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZvdW5kIHJlZ2lvbiBvZiBub3Qgc3BlY2lmaWNhbGx5IGhhbmRsZWQgdHlwZSAiICsgcmVnaW9uLmdldFR5cGUoKSArICIgQCAiICsgcmVnaW9uLmdldFN0YXJ0KCkgKyAiWyIgKyByZWdpb24uZ2V0TGVuZ3RoKCkgKyAiXSIpOy8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQkJfQotCi0JCQkvLyB0aGVzZSByZWdpb25zIGFsc28gZ2V0IHRoZWlyIG93biBub2RlLCBzbyBjbG9zZSB0aGVtIGNsZWFubHkKLQkJCS8vIE5PVEU6IHRoZXNlIHJlZ2lvbnMgaGF2ZSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBjcmVhdGVkCi0JCQkvLyBmb3IgdGhlbSBhYm92ZTsgaXQgbWF5Ci0JCQkvLyBiZSBtb3JlIHJlYWRhYmxlIGlmIHRoYXQgaXMgaGFuZGxlZCBoZXJlIGFzIHdlbGwsIGJ1dCB0aGUKLQkJCS8vIGN1cnJlbnQgbGF5b3V0Ci0JCQkvLyBlbnN1cmVzIHRoYXQgdGhleSBvcGVuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgdGhlIHNhbWUgd2F5Ci0JCQlpZiAoKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKQotCQkJCQkJfHwgKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgfHwgKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gY3VycmVudE5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJfQotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyB0YWdOYW1lKSB7Ci0JCSgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkucmVtb3ZlTmVzdGFibGVQcmVmaXgodGFnTmFtZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGMyNzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQQ29kZVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuanNwLm1vZGVsLnBhcnNlci50ZW1wLlhNTEpTUFJlZ2lvbkNvbnRleHRzOwotCi0vKioKLSAqIAotICogVGhpcyByZWdpb24gZmFjdG9yeSBpcyB2ZXJ5IHNwZWNpZmljIHRvIHRoZSBwYXJzZXIgb3V0cHV0LCAKLSAqIGFuZCB0aGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgdmFyaW91cyByZWdpb25zLgotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSBleHRlbmRzIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIGxhbmcsIFN0cmluZyBzdXJyb3VuZGluZ1RhZykgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoY29udGV4dCA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkJbmV3UmVnaW9uID0gbmV3IEpTUENvZGVSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZQotCQkJbmV3UmVnaW9uID0gc3VwZXIuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbGFuZywgc3Vycm91bmRpbmdUYWcpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwNzcwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5OwotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZiBTdHJ1Y3R1cmVkUmVnaW9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeSBleHRlbmRzIFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVSZWdpb24oaW50IHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBKU1BfRElSRUNUSVZFIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWluc3RhbmNlID0gWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKHR5cGUpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQ5MDRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5OSArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxLzI3LzA1IDQ6NDkgUE0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5JbnRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuanNwLm1vZGVsLnBhcnNlci50ZW1wLlhNTEpTUFJlZ2lvbkNvbnRleHRzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEvMjcvMDUgNDo0OSBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEpTUFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBYTUxKU1BSZWdpb25Db250ZXh0cyB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfRFFVT1RFUyA9IDUyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX1NRVU9URVMgPSA1MTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9TUVVPVEVTX0VORCA9IDUzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfU1FVT1RFU19FTkQgPSA0NjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX0RRVU9URVMgPSA0NTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMID0gNDM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0JMT0NLX1RBR19TQ0FOID0gMzY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9TUVVPVEVTID0gNDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9UQUdfQ0xPU0UgPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEID0gNDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUgPSAyNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTCA9IDUwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfU1FVT1RFRF9WQkwgPSA1NjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEID0gNDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDIzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMjQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUgPSAxOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0NPTlRFTlQgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMzE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gMzI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUyA9IDIwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX0RRVU9URVNfRU5EID0gNTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9EUVVPVEVEX0VMID0gNDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OID0gMjg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX0VORCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfVEVYVCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAzMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04gPSAzNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX0RRVU9URVNfRU5EID0gNDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9TUVVPVEVEX0VMID0gNDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT01NRU5UX0VORCA9IDM5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDM1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMgPSAzMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RRVU9URURfVkJMID0gNTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0FCT1JUX0VNQkVEREVEID0gNDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEID0gMjk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT01NRU5UID0gMzg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTiA9IDM3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSSA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX05BTUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1RBR19OQU1FID0gMjI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9UQUdfQ0xPU0UgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlQgPSAzOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDVcMVwyNlwyXDBcMVwxN1wyMlwwXDFcMTdcMVwyNVwxXDEyXDFcNjMiKwotICAgICJcMVwxNVwxXDIyXDFcMTNcMVwxNFwxXDI0XDFcMjRcMVwyNFwxXDI0XDFcMjRcMVw3IisKLSAgICAiXDFcNlwxXDNcMTJcMjBcMVwxMVwxXDcwXDFcMVwxXDUwXDFcMlwxXDRcMVwyMSIrCi0gICAgIlwxXDM3XDFcNzFcMVwzNVwxXDM2XDFcNTRcMVw2NlwxXDYwXDFcNjBcMVw2MVwxXDYwIisKLSAgICAiXDFcNjBcMVwzMlwxXDMxXDFcNjJcMVw1MVwxXDUzXDFcNjBcMVw2NVwxXDY0XDFcNDAiKwotICAgICJcMVw2N1wyXDYwXDFcMjdcMVw1MlwxXDYwXDFcMzRcMVwxMDJcMVwyM1wxXDBcMVwxMCIrCi0gICAgIlwxXDBcMVw1NlwxXDEwMVwxXDcyXDFcNTdcMVw0MlwxXDY2XDFcNzNcMVw2MFwxXDQ1IisKLSAgICAiXDFcNzZcMVw2MFwxXDMzXDFcMzFcMVw0N1wxXDQ2XDFcNzdcMVw2MFwxXDQzXDFcNDQiKwotICAgICJcMVw1NVwxXDEwMFwxXDQxXDFcNjBcMVwzMFwxXDUyXDFcNjBcMVwxNlwxXDBcMVwxMDMiKwotICAgICJcNzFcMFwxXDc1XDEwXDBcMjdcNzRcMVwwXDM3XDc0XDFcMFw3Mlw3NFwyXDBcMTNcNzQiKwotICAgICJcMlwwXDEwXDc0XDFcMFw2NVw3NFwxXDBcMTA0XDc0XDExXDBcNDRcNzRcM1wwXDJcNzQiKwotICAgICJcNFwwXDM2XDc0XDcwXDBcMTMxXDc0XDIyXDBcN1w3NFwxNlwwXDJcNzVcNTZcMFwxMDZcNzUiKwotICAgICJcMzJcMFwyXDc1XDQ0XDBcMVw3NFwxXDc1XDNcNzRcMVwwXDFcNzRcMVwwXDI0XDc0IisKLSAgICAiXDFcMFw1NFw3NFwxXDBcN1w3NFwzXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NCIrCi0gICAgIlwxXDBcMVw3NFwxXDBcMjJcNzRcMTVcMFwxNFw3NFwxXDBcMTAyXDc0XDFcMFwxNFw3NCIrCi0gICAgIlwxXDBcNDRcNzRcMVwwXDRcNzVcMTFcMFw2NVw3NFwyXDBcMlw3NFwyXDBcMlw3NCIrCi0gICAgIlwzXDBcMzRcNzRcMlwwXDEwXDc0XDJcMFwyXDc0XDY3XDBcNDZcNzRcMlwwXDFcNzQiKwotICAgICJcN1wwXDQ2XDc0XDEyXDBcMjFcNzVcMVwwXDI3XDc1XDFcMFwzXDc1XDFcMFwxXDc1IisKLSAgICAiXDFcMFwyXDc1XDFcMFwxXDc1XDEzXDBcMzNcNzRcNVwwXDNcNzRcNTZcMFwzMlw3NCIrCi0gICAgIlw1XDBcMVw3NVwxMlw3NFwxMFw3NVwxNVwwXDEyXDc1XDZcMFwxXDc1XDEwN1w3NFwyXDAiKwotICAgICJcNVw3NFwxXDBcMTdcNzRcMVwwXDRcNzRcMVwwXDFcNzRcMTdcNzVcMlw3NFwyXDc1IisKLSAgICAiXDFcMFw0XDc1XDJcMFwxMlw3NVx1MDIwN1wwXDNcNzVcMVwwXDY1XDc0XDJcMFwxXDc1IisKLSAgICAiXDFcNzRcMjBcNzVcM1wwXDRcNzVcM1wwXDEyXDc0XDJcNzVcMlwwXDEyXDc1XDIxXDAiKwotICAgICJcM1w3NVwxXDBcMTBcNzRcMlwwXDJcNzRcMlwwXDI2XDc0XDFcMFw3XDc0XDFcMCIrCi0gICAgIlwxXDc0XDNcMFw0XDc0XDJcMFwxXDc1XDFcMFw3XDc1XDJcMFwyXDc1XDJcMCIrCi0gICAgIlwzXDc1XDExXDBcMVw3NVw0XDBcMlw3NFwxXDBcM1w3NFwyXDc1XDJcMFwxMlw3NSIrCi0gICAgIlwyXDc0XDIwXDBcMVw3NVwyXDBcNlw3NFw0XDBcMlw3NFwyXDBcMjZcNzRcMVwwIisKLSAgICAiXDdcNzRcMVwwXDJcNzRcMVwwXDJcNzRcMVwwXDJcNzRcMlwwXDFcNzVcMVwwIisKLSAgICAiXDVcNzVcNFwwXDJcNzVcMlwwXDNcNzVcMTNcMFw0XDc0XDFcMFwxXDc0XDdcMCIrCi0gICAgIlwxMlw3NVwyXDc1XDNcNzRcMTRcMFwzXDc1XDFcMFw3XDc0XDFcMFwxXDc0XDFcMCIrCi0gICAgIlwzXDc0XDFcMFwyNlw3NFwxXDBcN1w3NFwxXDBcMlw3NFwxXDBcNVw3NFwyXDAiKwotICAgICJcMVw3NVwxXDc0XDEwXDc1XDFcMFwzXDc1XDFcMFwzXDc1XDIyXDBcMVw3NFw1XDAiKwotICAgICJcMTJcNzVcMjFcMFwzXDc1XDFcMFwxMFw3NFwyXDBcMlw3NFwyXDBcMjZcNzRcMVwwIisKLSAgICAiXDdcNzRcMVwwXDJcNzRcMlwwXDRcNzRcMlwwXDFcNzVcMVw3NFw2XDc1XDNcMCIrCi0gICAgIlwyXDc1XDJcMFwzXDc1XDEwXDBcMlw3NVw0XDBcMlw3NFwxXDBcM1w3NFw0XDAiKwotICAgICJcMTJcNzVcMjJcMFwyXDc1XDFcMFw2XDc0XDNcMFwzXDc0XDFcMFw0XDc0XDNcMCIrCi0gICAgIlwyXDc0XDFcMFwxXDc0XDFcMFwyXDc0XDNcMFwyXDc0XDNcMFwzXDc0XDNcMCIrCi0gICAgIlwxMFw3NFwxXDBcM1w3NFw0XDBcNVw3NVwzXDBcM1w3NVwxXDBcNFw3NVwxMVwwIisKLSAgICAiXDFcNzVcMTdcMFwxMVw3NVwyMVwwXDNcNzVcMVwwXDEwXDc0XDFcMFwzXDc0XDFcMCIrCi0gICAgIlwyN1w3NFwxXDBcMTJcNzRcMVwwXDVcNzRcNFwwXDdcNzVcMVwwXDNcNzVcMVwwIisKLSAgICAiXDRcNzVcN1wwXDJcNzVcMTFcMFwyXDc0XDRcMFwxMlw3NVwyMlwwXDJcNzVcMVwwIisKLSAgICAiXDEwXDc0XDFcMFwzXDc0XDFcMFwyN1w3NFwxXDBcMTJcNzRcMVwwXDVcNzRcNFwwIisKLSAgICAiXDdcNzVcMVwwXDNcNzVcMVwwXDRcNzVcN1wwXDJcNzVcN1wwXDFcNzRcMVwwIisKLSAgICAiXDJcNzRcNFwwXDEyXDc1XDIyXDBcMlw3NVwxXDBcMTBcNzRcMVwwXDNcNzRcMVwwIisKLSAgICAiXDI3XDc0XDFcMFwyMFw3NFw0XDBcNlw3NVwyXDBcM1w3NVwxXDBcNFw3NVwxMVwwIisKLSAgICAiXDFcNzVcMTBcMFwyXDc0XDRcMFwxMlw3NVwyMjFcMFw1Nlw3NFwxXDBcMVw3NFwxXDc1IisKLSAgICAiXDJcNzRcN1w3NVw1XDBcNlw3NFwxXDc1XDEwXDc1XDFcMFwxMlw3NVw0N1wwXDJcNzQiKwotICAgICJcMVwwXDFcNzRcMlwwXDJcNzRcMVwwXDFcNzRcMlwwXDFcNzRcNlwwXDRcNzQiKwotICAgICJcMVwwXDdcNzRcMVwwXDNcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMlwwXDJcNzQiKwotICAgICJcMVwwXDJcNzRcMVwwXDFcNzRcMVw3NVwyXDc0XDZcNzVcMVwwXDJcNzVcMVw3NCIrCi0gICAgIlwyXDBcNVw3NFwxXDBcMVw3NVwxXDBcNlw3NVwyXDBcMTJcNzVcNzZcMFwyXDc1IisKLSAgICAiXDZcMFwxMlw3NVwxM1wwXDFcNzVcMVwwXDFcNzVcMVwwXDFcNzVcNFwwXDJcNzUiKwotICAgICJcMTBcNzRcMVwwXDQxXDc0XDdcMFwyNFw3NVwxXDBcNlw3NVw0XDBcNlw3NVwxXDAiKwotICAgICJcMVw3NVwxXDBcMjVcNzVcM1wwXDdcNzVcMVwwXDFcNzVcMzQ2XDBcNDZcNzRcMTJcMCIrCi0gICAgIlw0N1w3NFwxMVwwXDFcNzRcMVwwXDJcNzRcMVwwXDNcNzRcMVwwXDFcNzRcMVwwIisKLSAgICAiXDJcNzRcMVwwXDVcNzRcNTFcMFwxXDc0XDFcMFwxXDc0XDFcMFwxXDc0XDEzXDAiKwotICAgICJcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwzXDBcMlw3NFwzXDBcMVw3NFw1XDAiKwotICAgICJcM1w3NFwxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwzXDAiKwotICAgICJcMlw3NFwzXDBcMlw3NFwxXDBcMVw3NFw1MFwwXDFcNzRcMTFcMFwxXDc0XDJcMCIrCi0gICAgIlwxXDc0XDJcMFwyXDc0XDdcMFwyXDc0XDFcMFwxXDc0XDFcMFw3XDc0XDUwXDAiKwotICAgICJcMVw3NFw0XDBcMVw3NFwxMFwwXDFcNzRcdTBjMDZcMFwyMzRcNzRcNFwwXDEzMlw3NFw2XDAiKwotICAgICJcMjZcNzRcMlwwXDZcNzRcMlwwXDQ2XDc0XDJcMFw2XDc0XDJcMFwxMFw3NFwxXDAiKwotICAgICJcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMzdcNzRcMlwwXDY1XDc0XDFcMCIrCi0gICAgIlw3XDc0XDFcMFwxXDc0XDNcMFwzXDc0XDFcMFw3XDc0XDNcMFw0XDc0XDJcMCIrCi0gICAgIlw2XDc0XDRcMFwxNVw3NFw1XDBcM1w3NFwxXDBcN1w3NFwzMjNcMFwxNVw3NVw0XDAiKwotICAgICJcMVw3NVwxMDRcMFwxXDc0XDNcMFwyXDc0XDJcMFwxXDc0XDEyMVwwXDNcNzRcdTBlODJcMCIrCi0gICAgIlwxXDc1XDFcMFwxXDc0XDMxXDBcMTFcNzRcNlw3NVwxXDBcNVw3NVwxM1wwXDEyNFw3NCIrCi0gICAgIlw0XDBcMlw3NVwyXDBcMlw3NVwyXDBcMTMyXDc0XDFcMFwzXDc1XDZcMFw1MFw3NCIrCi0gICAgIlx1MWNkM1wwXHU1MWE2XDc0XHUwYzVhXDBcdTJiYTRcNzRcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA2OCwgICAxMzYsICAgMjA0LCAgIDI3MiwgICAzNDAsICAgNDA4LCAgIDQ3NiwgICA1NDQsICAgNjEyLCAKLSAgICAgIDY4MCwgICA3NDgsICAgODE2LCAgIDg4NCwgICA5NTIsICAxMDIwLCAgMTA4OCwgIDExNTYsICAxMjI0LCAgMTI5MiwgCi0gICAgIDEzNjAsICAxNDI4LCAgMTQ5NiwgIDE1NjQsICAxNjMyLCAgMTcwMCwgIDE3NjgsICAxODM2LCAgMTkwNCwgIDE5NzIsIAotICAgICAyMDQwLCAgMjEwOCwgIDIxNzYsICAyMjQ0LCAgMjMxMiwgIDIzODAsICAyNDQ4LCAgMjUxNiwgIDI1ODQsICAyNjUyLCAKLSAgICAgMjcyMCwgIDI3ODgsICAyODU2LCAgMjkyNCwgIDI5OTIsICAzMDYwLCAgMzEyOCwgIDMxOTYsICAzMjY0LCAgMzMzMiwgCi0gICAgIDM0MDAsICAzNDY4LCAgMzUzNiwgIDM2MDQsICAzNjcyLCAgMzc0MCwgIDM4MDgsICAzODc2LCAgMzk0NCwgIDQwMTIsIAotICAgICA0MDgwLCAgNDE0OCwgIDQyMTYsICA0Mjg0LCAgNDM1MiwgIDQyODQsICA0MzUyLCAgNDQyMCwgIDQyODQsICA0Mjg0LCAKLSAgICAgNDM1MiwgIDQ0ODgsICA0NTU2LCAgNDYyNCwgIDQ2OTIsICA0NzYwLCAgNDgyOCwgIDQ4OTYsICA0Mjg0LCAgNDM1MiwgCi0gICAgIDQ5NjQsICA1MDMyLCAgNTEwMCwgIDQyODQsICA1MTY4LCAgNTE2OCwgIDUyMzYsICA1MzA0LCAgNTM3MiwgIDQ5NjQsIAotICAgICA0Mjg0LCAgNTQ0MCwgIDU1MDgsICA0Mjg0LCAgNTU3NiwgIDU2NDQsICA1NzEyLCAgNTc4MCwgIDQyODQsICA0MzUyLCAKLSAgICAgNTg0OCwgIDU5MTYsICA1OTg0LCAgNjA1MiwgIDYxMjAsICA2MTg4LCAgNDI4NCwgIDYyNTYsICA2MjU2LCAgNjMyNCwgCi0gICAgIDYzOTIsICA2NDYwLCAgNjUyOCwgIDY1OTYsICA0Mjg0LCAgNjY2NCwgIDY3MzIsICA2ODAwLCAgNjg2OCwgIDY5MzYsIAotICAgICA3MDA0LCAgNDI4NCwgIDcwNzIsICA3MTQwLCAgNzIwOCwgIDcyNzYsICA3MzQ0LCAgNzQxMiwgIDc0ODAsICA3NTQ4LCAKLSAgICAgNDI4NCwgIDc2MTYsICA3Njg0LCAgNzc1MiwgIDc4MjAsICA3ODg4LCAgNzk1NiwgIDgwMjQsICA4MDkyLCAgODA5MiwgCi0gICAgIDgxNjAsICA4MjI4LCAgODI5NiwgIDgzNjQsICA4MzY0LCAgODQzMiwgIDg1MDAsICA4NTY4LCAgODYzNiwgIDg2MzYsIAotICAgICA4NzA0LCAgODc3MiwgIDg4NDAsICA4OTA4LCAgNDI4NCwgIDg5NzYsICA4OTc2LCAgOTA0NCwgIDkxMTIsICA5MTgwLCAKLSAgICAgOTI0OCwgIDQyODQsICA0Mjg0LCAgNDM1MiwgIDkzMTYsICA0Mjg0LCAgNDM1MiwgIDkzODQsICA5NDUyLCAgOTUyMCwgCi0gICAgIDk1ODgsICA0Mjg0LCAgOTY1NiwgIDk3MjQsICA5NzkyLCAgOTg2MCwgIDQyODQsICA5OTI4LCAgOTk5NiwgMTAwNjQsIAotICAgIDEwMTMyLCAgNDI4NCwgIDQyODQsIDEwMjAwLCAgNDI4NCwgMTAyNjgsIDEwMzM2LCAxMDI2OCwgMTA0MDQsIDEwNDcyLCAKLSAgICAxMDQwNCwgIDQyODQsICA0Mjg0LCAxMDU0MCwgMTA2MDgsIDEwNjc2LCAgNDI4NCwgMTA3NDQsIDEwODEyLCAxMDg4MCwgCi0gICAgMTA5NDgsIDExMDE2LCAgNDI4NCwgIDQyODQsIDExMDg0LCAgNDI4NCwgMTExNTIsIDExMjIwLCAxMTE1MiwgMTEyODgsIAotICAgIDExMzU2LCAxMTI4OCwgIDQyODQsICA0Mjg0LCAxMTQyNCwgMTE0OTIsIDExNTYwLCAgNDI4NCwgMTE2MjgsIDExNjk2LCAKLSAgICAxMTc2NCwgIDQyODQsICA0Mjg0LCAxMTgzMiwgMTE5MDAsIDExOTY4LCAxMjAzNiwgMTIxMDQsICA0Mjg0LCAxMjE3MiwgCi0gICAgMTIyNDAsIDEyMzA4LCAxMjM3NiwgMTI0NDQsIDEyNTEyLCAxMjU4MCwgMTI2NDgsIDEyNzE2LCAgNDI4NCwgMTI3ODQsIAotICAgIDEyODUyLCAgNDI4NCwgIDQyODQsICA1MTY4LCAgNTMwNCwgIDQyODQsIDEyOTIwLCAgNTM3MiwgMTI5ODgsICA1NDQwLCAKLSAgICAgNTU3NiwgIDU2NDQsIDEzMDU2LCAgNTcxMiwgIDQyODQsIDEzMTI0LCAxMzE5MiwgIDU3ODAsIDEzMjYwLCAgNDI4NCwgCi0gICAgMTE5MDAsICA0Mjg0LCAgNjI1NiwgIDYzMjQsICA0Mjg0LCAxMzMyOCwgIDYzOTIsIDEzMzk2LCAgNDI4NCwgMTM0NjQsIAotICAgIDEzNTMyLCAgNzA3MiwgMTM2MDAsICA3Mjc2LCAgNDI4NCwgMTM2NjgsICA3MzQ0LCAxMzczNiwgMTM4MDQsIDEzODcyLCAKLSAgICAxMzk0MCwgMTQwMDgsIDE0MDc2LCAgNzgyMCwgIDQyODQsIDE0MTQ0LCAxNDIxMiwgIDgwOTIsICA4MTYwLCAgNDI4NCwgCi0gICAgMTQyODAsIDE0MzQ4LCAxNDQxNiwgMTQ0ODQsIDE0NTUyLCAgODI5NiwgIDgwOTIsICA4MzY0LCAgODQzMiwgIDQyODQsIAotICAgICA4NTAwLCAgODU2OCwgIDgzNjQsICA4NjM2LCAgODcwNCwgIDQyODQsIDE0NjIwLCAxNDY4OCwgMTQ3NTYsIDE0ODI0LCAKLSAgICAxNDg5MiwgMTQ5NjAsIDE1MDI4LCAgODk3NiwgIDkwNDQsICA0Mjg0LCAxNTA5NiwgMTUxNjQsIDE1MjMyLCAxNTMwMCwgCi0gICAgMTUzNjgsIDE1NDM2LCAxNTUwNCwgMTU1NzIsIDE1NjQwLCAxNTcwOCwgIDQyODQsICA0Mjg0LCAgNDI4NCwgMTU3NzYsIAotICAgICA0Mjg0LCAgNDI4NCwgMTU4NDQsIDE1OTEyLCAxNTk4MCwgMTYwNDgsIDEwMjY4LCAgNDI4NCwgMTYxMTYsIDE2MTg0LCAKLSAgICAxMDQwNCwgIDQyODQsIDE2MjUyLCAxNjMyMCwgMTYzODgsIDE2NDU2LCAxNjUyNCwgMTY1OTIsIDE2NjYwLCAxNjcyOCwgCi0gICAgMTY3OTYsIDEwOTQ4LCAxMTE1MiwgIDQyODQsIDE2ODY0LCAxNjkzMiwgMTEyODgsICA0Mjg0LCAxNzAwMCwgMTcwNjgsIAotICAgIDE3MTM2LCAxNzIwNCwgMTcyNzIsIDE3MzQwLCAxNzQwOCwgMTc0NzYsIDE3NTQ0LCAgNDI4NCwgIDQyODQsICA0Mjg0LCAKLSAgICAxNzYxMiwgMTc2ODAsIDE3NzQ4LCAxNzgxNiwgMTc4ODQsICA0Mjg0LCAxNzk1MiwgMTgwMjAsICA0Mjg0LCAgNDI4NCwgCi0gICAgIDQyODQsICA0Mjg0LCAgNDI4NCwgIDQ2OTIsIDE4MDg4LCAxODE1NiwgMTgyMjQsIDE4MjkyLCAxODM2MCwgMTg0MjgsIAotICAgIDE4MzYwLCAxODQ5NiwgMTg1NjQsIDE4NDk2LCAxODYzMiwgMTg3MDAsIDE4NzY4LCAxODgzNiwgMTg5MDQsIDE4OTcyLCAKLSAgICAxOTA0MCwgMTkwNDAsIDE5MTA4LCAxOTE3NiwgMTkxNzYsICA4ODQwLCAgODg0MCwgMTkyNDQsIDE5MzEyLCAxOTM4MCwgCi0gICAgMTkzODAsICA5MTgwLCAgOTE4MCwgMTk0NDgsIDE5NTE2LCAxOTU4NCwgMTU5ODAsIDEwMDY0LCAxMDA2NCwgMTk2NTIsIAotICAgIDEwMjY4LCAxMDI2OCwgMTk3MjAsIDEwNDA0LCAxMDQwNCwgMTk3ODgsIDEwNTQwLCAxMDU0MCwgMTY1MjQsIDE5ODU2LCAKLSAgICAxMDc0NCwgMTA3NDQsIDE2NzI4LCAxOTkyNCwgMTA5NDgsIDEwOTQ4LCAxMTE1MiwgMTExNTIsIDE5OTkyLCAxMTI4OCwgCi0gICAgMTEyODgsIDIwMDYwLCAxMTQyNCwgMTE0MjQsIDE3MjcyLCAyMDEyOCwgMTE2MjgsIDExNjI4LCAxNzQ3NiwgMjAxOTYsIAotICAgICA0Mjg0LCAgNDI4NCwgMjAyNjQsIDIwMzMyLCAgNDI4NCwgMjA0MDAsIDIwNDY4LCAyMDUzNiwgIDcwNzIsICA0Mjg0LCAKLSAgICAgNDI4NCwgMjA2MDQsIDIwNjcyLCAyMDc0MCwgMjA4MDgsIDIwODc2LCAxNDQ4NCwgMTQ4MjQsIDIwOTQ0LCAxNTMwMCwgCi0gICAgMjEwMTIsICA0Mjg0LCAgNDI4NCwgMjEwODAsIDIxMTQ4LCAyMTIxNiwgIDQyODQsIDIxMjg0LCAyMTM1MiwgMjE0MjAsIAotICAgIDIxNDg4LCAgNDI4NCwgMjE1NTYsIDIxNjI0LCAyMTY5MiwgMjE3NjAsIDIxODI4LCAyMTg5NiwgMjE5NjQsIDIyMDMyLCAKLSAgICAyMjEwMCwgMjIxNjgsIDIyMjM2LCAyMjMwNCwgMjIzNzIsIDIyNDQwLCAyMjUwOCwgMjI1NzYsIDIyNjQ0LCAyMjcxMiwgCi0gICAgMjI3ODAsIDIyODQ4LCAyMjkxNiwgIDQ2OTIsIDIyOTg0LCAyMzA1MiwgMjMxMjAsIDIzMTg4LCAyMzI1NiwgIDQyODQsIAotICAgICA0Mjg0LCAyMzMyNCwgMjMzOTIsIDIzNDYwLCAyMzUyOCwgMTY1MjQsIDE2NzI4LCAyMzU5NiwgMjM2NjQsIDE3MjcyLCAKLSAgICAxNzQ3NiwgMjM3MzIsIDIzODAwLCAyMzg2OCwgIDQyODQsICA0Mjg0LCAgNDI4NCwgMjM5MzYsIDI0MDA0LCAyNDA3MiwgCi0gICAgMjQxNDAsIDI0MjA4LCAyNDI3NiwgMjQzNDQsICA2ODAwLCAyNDQxMiwgMjQ0ODAsIDI0NTQ4LCAyNDYxNiwgMjQ2ODQsIAotICAgIDI0NzUyLCAyNDgyMCwgIDQyODQsIDI0ODg4LCAgODg0MCwgIDkxODAsIDEwMjY4LCAxMDQwNCwgMTExNTIsIDExMjg4LCAKLSAgICAyNDk1NiwgMjUwMjQsIDI1MDkyLCAyNTE2MCwgMjUyMjgsIDI1Mjk2LCAyNTM2NCwgMjU0MzIsIDI1NTAwLCAyNTU2OCwgCi0gICAgMjU2MzYsIDI1NzA0LCAyNTc3MiwgMjU4NDAsIDI1OTA4LCAyNTk3NiwgMjYwNDQsIDI2MTEyLCAyNjE4MCwgMjYyNDgsIAotICAgIDI2MzE2LCAyNjM4NCwgMjY0NTIsIDI2NTIwLCAyNjU4OCwgMjY2NTYsIDI2NzI0LCAyNjc5MiwgMjY4NjAsIDI2OTI4LCAKLSAgICAyNjk5NiwgMjcwNjQsIDI3MTMyLCAyNzIwMCwgMjcyNjgsIDI3MzM2LCAyNzQwNCwgMjc0NzIsIDI3NTQwLCAyNzYwOCwgCi0gICAgIDQyODQsIDI3Njc2LCAyNzc0NCwgMjc4MTIsIDI3ODgwLCAgNjgwMCwgMjc5NDgsIDI4MDE2LCAyODA4NCwgMjgxNTIsIAotICAgIDI4MjIwLCAyODI4OCwgMjgzNTYsIDI4NDI0LCAyODQ5MiwgMjg1NjAsIDI4NjI4LCAyODY5NiwgMjg3NjQsIDI4ODMyCi0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9IAotICAgICJcMVw3MlwxXDczXDExXDcyXDFcNzRcMVw3MlwxXDc1XDRcNzJcMVw3NiIrCi0gICAgIlw0MFw3MlwxXDc3XDIwXDcyXDFcMTAwXDFcMTAxXDEwMlwxMDBcMVwxMDJcMVwxMDMiKwotICAgICJcMjFcMTAyXDFcMTA0XDJcMTAyXDFcMTA1XDU1XDEwMlwxXDEwNlwxXDEwN1wxMDJcMTA2IisKLSAgICAiXDFcMTAyXDFcMTAzXDVcMTAyXDFcMTEwXDE2XDEwMlwxXDEwNVw1NlwxMDJcMVwxMDMiKwotICAgICJcMlwxMDJcMVwxMTFcMVwxMTJcMlwxMDJcMlwxMTNcNVwxMDJcMVwxMTJcNlwxMDIiKwotICAgICJcMVwxMTJcMlwxMTRcM1wxMTNcMVwxMDJcMTBcMTEzXDFcMTE1XDJcMTEzXDFcMTAyIisKLSAgICAiXDEwXDExM1wxXDExNVwxXDExM1wxXDEwMlw0XDExM1wxXDEwMlw0XDExM1wxXDEwMiIrCi0gICAgIlw0XDExM1wzXDEwMlwxXDEwM1wyXDEwMlwxXDExMVwxXDExNlwxMVwxMDJcMVwxMTYiKwotICAgICJcNlwxMDJcMVwxMTZcNTVcMTAyXDFcMTE3XDFcMTIwXDJcMTE3XDFcMTIxXDIxXDExNyIrCi0gICAgIlwxXDEwNVw1NVwxMTdcMVwxMDJcMVwxMDNcMlwxMDJcMVwxMjJcMVwxMTJcMlwxMDIiKwotICAgICJcMlwxMjNcNVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMjNcMVwxMDJcMTNcMTIzIisKLSAgICAiXDFcMTAyXDEyXDEyM1wxXDEwMlw0XDEyM1wxXDEwMlw0XDEyM1wxXDEwMlw0XDEyMyIrCi0gICAgIlwzXDEwMlwxXDEwM1wyXDEwMlwxXDEyMlwxXDExMlwyXDEwMlwyXDEyM1w1XDEwMiIrCi0gICAgIlwxXDExMlw2XDEwMlwxXDExMlw1XDEyM1wxXDEwMlwxM1wxMjNcMVwxMjRcMTJcMTIzIisKLSAgICAiXDFcMTAyXDRcMTIzXDFcMTAyXDRcMTIzXDFcMTAyXDRcMTIzXDJcMTAyXDFcMTI1IisKLSAgICAiXDFcMTAzXDFcMTAyXDFcMTI2XDFcMTI3XDFcMTEyXDRcMTI1XDFcMTMwXDFcMTI1IisKLSAgICAiXDFcMTMxXDJcMTI1XDFcMTEyXDZcMTI1XDFcMTEyXDU1XDEyNVwxXDEwMlwxXDEwMyIrCi0gICAgIlwyXDEwMlwxXDEzMlwyMVwxMDJcMVwxMDVcNTZcMTAyXDFcMTAzXDFcMTMzXDFcMTM0IisKLSAgICAiXDFcMTAyXDFcMTEyXDJcMTAyXDJcMTM1XDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyIisKLSAgICAiXDVcMTM1XDFcMTAyXDEzXDEzNVwxXDEwMlwxMlwxMzVcMVwxMDJcNFwxMzVcMVwxMDIiKwotICAgICJcNFwxMzVcMVwxMDJcNFwxMzVcM1wxMDJcMVwxMDNcMVwxMzNcMVwxMzRcMVwxMDIiKwotICAgICJcMVwxMTJcMlwxMDJcMlwxMzVcNVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMzUiKwotICAgICJcMVwxMDJcMTNcMTM1XDFcMTM2XDEyXDEzNVwxXDEwMlw0XDEzNVwxXDEwMlw0XDEzNSIrCi0gICAgIlwxXDEwMlw0XDEzNVwyXDEwMlwxXDEzN1wxXDEwM1wxXDEzM1wxXDE0MFwxXDEzNyIrCi0gICAgIlwxXDExMlw0XDEzN1wxXDE0MVwxXDEzN1wxXDE0MlwyXDEzN1wxXDExMlw2XDEzNyIrCi0gICAgIlwxXDExMlw1NVwxMzdcMVwxMDJcMVwxMDNcM1wxMDJcMVwxMTJcMTFcMTAyXDFcMTEyIisKLSAgICAiXDZcMTAyXDFcMTEyXDU1XDEwMlwxXDE0M1wxXDE0NFwyMFwxNDNcMVwxNDVcM1wxNDMiKwotICAgICJcMVwxMDVcNTVcMTQzXDFcMTAyXDFcMTQ2XDNcMTAyXDFcMTEyXDJcMTAyXDJcMTQ3IisKLSAgICAiXDVcMTAyXDFcMTEyXDJcMTAyXDFcMTUwXDNcMTAyXDFcMTEyXDVcMTQ3XDFcMTAyIisKLSAgICAiXDEzXDE0N1wxXDEwMlwxMlwxNDdcMVwxMDJcNFwxNDdcMVwxMDJcNFwxNDdcMVwxMDIiKwotICAgICJcNFwxNDdcM1wxMDJcMVwxNDZcM1wxMDJcMVwxNTFcMTFcMTAyXDFcMTUxXDJcMTAyIisKLSAgICAiXDFcMTUwXDNcMTAyXDFcMTUxXDU2XDEwMlwxXDE0NlwzXDEwMlwxXDExMlwyXDEwMiIrCi0gICAgIlwyXDE1Mlw1XDEwMlwxXDExMlwyXDEwMlwxXDE1MFwzXDEwMlwxXDExMlw1XDE1MiIrCi0gICAgIlwxXDEwMlwxM1wxNTJcMVwxMDJcMTJcMTUyXDFcMTAyXDRcMTUyXDFcMTAyXDRcMTUyIisKLSAgICAiXDFcMTAyXDRcMTUyXDNcMTAyXDFcMTQ2XDNcMTAyXDFcMTEyXDJcMTAyXDJcMTUyIisKLSAgICAiXDVcMTAyXDFcMTEyXDJcMTAyXDFcMTUwXDNcMTAyXDFcMTEyXDVcMTUyXDFcMTAyIisKLSAgICAiXDEzXDE1MlwxXDE1M1wxMlwxNTJcMVwxMDJcNFwxNTJcMVwxMDJcNFwxNTJcMVwxMDIiKwotICAgICJcNFwxNTJcMlwxMDJcMVwxNTRcMVwxNDZcMVwxMDJcMVwxNTVcMVwxNTRcMVwxMTIiKwotICAgICJcNFwxNTRcMVwxNTZcMVwxNTRcMVwxNTdcMlwxNTRcMVwxMTJcMlwxNTRcMVwxNjAiKwotICAgICJcM1wxNTRcMVwxMTJcNTVcMTU0XDFcMTYxXDFcMTYyXDFcMTYzXDFcMTY0XDRcMTYxIisKLSAgICAiXDJcMTY1XDE1XDE2MVw1XDE2NlwxXDE2MVwxM1wxNjZcMVwxNjFcMTJcMTY2XDFcMTYxIisKLSAgICAiXDRcMTY2XDFcMTYxXDRcMTY2XDFcMTYxXDFcMTY3XDNcMTY2XDJcMTYxXDFcMTAyIisKLSAgICAiXDFcMTcwXDFcMTYzXDFcMTY0XDFcMTAyXDFcMTEyXDJcMTAyXDJcMTcxXDVcMTAyIisKLSAgICAiXDFcMTEyXDZcMTAyXDFcMTEyXDVcMTcxXDFcMTAyXDEzXDE3MVwxXDEwMlwxMlwxNzEiKwotICAgICJcMVwxMDJcNFwxNzFcMVwxMDJcNFwxNzFcMVwxMDJcNFwxNzFcM1wxMDJcMVwxNzAiKwotICAgICJcMVwxNjNcMVwxNjRcMVwxMDJcMVwxMTJcMlwxMDJcMlwxNzFcNVwxMDJcMVwxMTIiKwotICAgICJcNlwxMDJcMVwxMTJcNVwxNzFcMVwxMDJcMTNcMTcxXDFcMTcyXDEyXDE3MVwxXDEwMiIrCi0gICAgIlw0XDE3MVwxXDEwMlw0XDE3MVwxXDEwMlw0XDE3MVwyXDEwMlwxXDE3M1wxXDE3NCIrCi0gICAgIlwxXDE2M1wxXDE3NVwxXDE3M1wxXDExMlw0XDE3M1wxXDE3NlwxXDE3M1wxXDE3NyIrCi0gICAgIlwxXDIwMFwxXDE3M1wxXDExMlw2XDE3M1wxXDExMlwzNFwxNzNcMVwyMDFcMjBcMTczIisKLSAgICAiXDFcMTAyXDFcMjAyXDFcMjAzXDJcMTAyXDFcMTEyXDExXDEwMlwxXDExMlw2XDEwMiIrCi0gICAgIlwxXDExMlw3XDEwMlwxXDIwNFwxXDIwNVwyXDEwMlwxXDIwNlwxMVwxMDJcMVwyMDYiKwotICAgICJcMVwxMDJcMVwyMDVcMVwyMDRcMjVcMTAyXDFcMTAzXDFcMjAzXDJcMTAyXDFcMTEyIisKLSAgICAiXDExXDEwMlwxXDExMlw2XDEwMlwxXDExMlw1XDEwMlwxXDIwN1w1MFwxMDJcMVwxMDMiKwotICAgICJcMVwyMDNcMlwxMDJcMVwxMTJcMlwxMDJcMlwyMTBcNVwxMDJcMVwxMTJcNlwxMDIiKwotICAgICJcMVwxMTJcNVwyMTBcMVwyMDdcMTNcMjEwXDFcMTAyXDEyXDIxMFwxXDEwMlw0XDIxMCIrCi0gICAgIlwxXDEwMlw0XDIxMFwxXDEwMlw0XDIxMFwzXDEwMlwxXDEwM1wxXDIwM1wyXDEwMiIrCi0gICAgIlwxXDExMlwxMVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMDJcMVwyMDdcN1wxMDIiKwotICAgICJcMVwyMTFcNlwxMDJcMVwyMTJcMTBcMTAyXDFcMjExXDEyXDEwMlwxXDIxMlw0XDEwMiIrCi0gICAgIlwxXDIxM1wxXDEwM1wxXDIwM1wxXDIxNFwxXDIxM1wxXDExMlw0XDIxM1wxXDIxNSIrCi0gICAgIlwxXDIxM1wxXDIxNlwyXDIxM1wxXDExMlw2XDIxM1wxXDExMlw1XDIxM1wxXDIxNyIrCi0gICAgIlw0N1wyMTNcMVwyMjBcMVwxMDNcMVwyMDNcMVwyMjFcMVwyMjBcMVwxMTJcNFwyMjAiKwotICAgICJcMVwyMjJcMVwyMjBcMVwyMjNcMlwyMjBcMVwxMTJcNlwyMjBcMVwxMTJcNVwyMjAiKwotICAgICJcMVwyMjRcNDdcMjIwXDFcMjI1XDFcMTAzXDFcMjAzXDFcMjI2XDFcMjI1XDFcMTEyIisKLSAgICAiXDRcMjI1XDFcMjI3XDFcMjI1XDFcMjMwXDJcMjI1XDFcMTEyXDZcMjI1XDFcMTEyIisKLSAgICAiXDU1XDIyNVwxXDIzMVwxXDIzMlwxXDIzM1wxMDFcMjMxXDFcMjM0XDFcMTAzXDFcMjAzIisKLSAgICAiXDFcMjM1XDFcMjM0XDFcMTEyXDRcMjM0XDFcMjM2XDFcMjM0XDFcMjM3XDJcMjM0IisKLSAgICAiXDFcMTEyXDZcMjM0XDFcMTEyXDU1XDIzNFwxXDI0MFwxXDI0MVwxXDI0MlwxMDFcMjQwIisKLSAgICAiXDFcMjQzXDFcMjQ0XDEwMlwyNDNcMVwxMDJcMVwyNDVcMjRcMTAyXDFcMTA1XDU1XDEwMiIrCi0gICAgIlwxXDI0NlwxXDI0N1wxMDJcMjQ2XDFcMTAyXDFcMTAzXDVcMTAyXDFcMjUwXDE2XDEwMiIrCi0gICAgIlwxXDEwNVw1NVwxMDJcMVwyNTFcMVwyNTJcM1wyNTFcMVwyNTNcNlwyNTFcMVwyNTQiKwotICAgICJcMVwyNTVcMVwyNTFcMVwyNTNcNlwyNTFcMVwyNTNcMzRcMjUxXDFcMjU2XDIwXDI1MSIrCi0gICAgIlwxXDI1N1wxXDI1MlwzXDI1N1wxXDI2MFw0XDI1N1wxXDI2MVwyXDI1N1wxXDI2MiIrCi0gICAgIlwxXDI1N1wxXDI2MFw2XDI1N1wxXDI2MFwzNFwyNTdcMVwyNjNcMjBcMjU3XDFcMTAyIisKLSAgICAiXDFcMTAzXDI0XDEwMlwxXDEwNVw1NVwxMDJcMVwyNjRcMVwyNjVcMTBcMjY0XDFcMjY2IisKLSAgICAiXDFcMjY0XDFcMjY3XDFcMjcwXDY1XDI2NFwxXDI3MVwxXDI3MlwxXDI3M1wxMlwyNzIiKwotICAgICJcMVwxMDJcMTFcMjcyXDFcMjc0XDU1XDI3MlwxXDI3NVwxXDI3NlwxMFwyNzVcMVwxMDIiKwotICAgICJcMTNcMjc1XDFcMjc3XDU1XDI3NVwxXDEwMlwxXDEwM1wxMlwxMDJcMVwzMDBcMTFcMTAyIisKLSAgICAiXDFcMTA1XDU2XDEwMlwxXDEwM1wxMFwxMDJcMVwzMDFcMTNcMTAyXDFcMTA1XDU1XDEwMiIrCi0gICAgIlwxXDMwMlwxXDMwM1wxMFwzMDJcMVwyNjFcNjdcMzAyXDFcMzA0XDFcMzA1XDFcMzA2IisKLSAgICAiXDFcMzA3XDEyXDMwNlwxXDI1NFw2NVwzMDZcMVwzMTBcMVwzMDVcMVwzMTFcMVwzMTIiKwotICAgICJcMTBcMzExXDFcMzEzXDFcMzExXDFcMzE0XDQ2XDMxMVwxXDMxNVwxN1wzMTFcMVwzMTYiKwotICAgICJcMVwzMTdcMVwzMjBcMTJcMzE3XDFcMTAyXDExXDMxN1wxXDMyMVw1NVwzMTdcMVwzMjIiKwotICAgICJcMVwzMjNcMTBcMzIyXDFcMTAyXDEzXDMyMlwxXDMyNFw1NVwzMjJcMVwxMDJcMVwxMDMiKwotICAgICJcMTJcMTAyXDFcMzI1XDExXDEwMlwxXDEwNVw1NlwxMDJcMVwxMDNcMTBcMTAyXDFcMzI2IisKLSAgICAiXDEzXDEwMlwxXDEwNVw1NVwxMDJcMVwzMjdcMVwzMzBcMTBcMzI3XDFcMjYxXDY3XDMyNyIrCi0gICAgIlwxXDMzMVwxXDMzMlwxXDMzM1wxXDMzNFwxMlwzMzNcMVwyNTRcNjVcMzMzXDFcMzM1IisKLSAgICAiXDFcMzMyXDFcNzJcMVwwXDExXDcyXDFcMFwxXDcyXDFcMFw0XDcyIisKLSAgICAiXDFcMFw0MFw3MlwxXDBcMjBcNzJcM1wwXDFcMzM2XDFcMzM3XDE1XDAiKwotICAgICJcMVwzNDBcMlwwXDFcMzQxXDYzXDBcMVwzNDJcMlwwXDJcMzQzXDVcMCIrCi0gICAgIlwxXDM0Mlw2XDBcMVwzNDJcNVwzNDNcMVwwXDEzXDM0M1wxXDBcMTJcMzQzIisKLSAgICAiXDFcMzQ0XDRcMzQzXDFcMFw0XDM0M1wxXDBcNFwzNDNcMlwwXDFcMzQ1IisKLSAgICAiXDFcMFwxMVwzNDVcMVwwXDFcMzQ1XDFcMzQ2XDFcMzQ3XDNcMzQ1XDFcMCIrCi0gICAgIlw2MVwzNDVcNVwwXDFcMzQyXDJcMFwyXDM1MFw1XDBcMVwzNDJcNlwwIisKLSAgICAiXDFcMzQyXDVcMzUwXDFcMFwxM1wzNTBcMVwwXDEyXDM1MFwxXDBcNFwzNTAiKwotICAgICJcMVwwXDRcMzUwXDFcMFw0XDM1MFwyXDBcMVwzNDVcMVwwXDExXDM0NSIrCi0gICAgIlwxXDBcMlwzNDVcMVwzNTFcM1wzNDVcMVwwXDQwXDM0NVwxXDM1MlwyMFwzNDUiKwotICAgICJcMTI2XDBcMVwzNTNcMlwwXDFcMzU0XDEwMVwwXDFcMzU1XDY3XDBcMVwzNTYiKwotICAgICJcNzZcMFwxXDM1N1wxMDZcMFwxXDExMlwxMVwwXDFcMTEyXDZcMFwxXDExMiIrCi0gICAgIlw2M1wwXDRcMTEzXDZcMFwxXDExM1w2XDBcNVwxMTNcMVwwXDEzXDExMyIrCi0gICAgIlwxXDBcMTJcMTEzXDFcMFw0XDExM1wxXDBcMTFcMTEzXDEwXDBcNFwxMTMiKwotICAgICJcNlwwXDFcMTEzXDZcMFwyXDExM1wxXDM2MFwyXDExM1wxXDBcMTNcMTEzIisKLSAgICAiXDFcMFwxMlwxMTNcMVwwXDRcMTEzXDFcMFwxMVwxMTNcMTBcMFw0XDExMyIrCi0gICAgIlw2XDBcMVwxMTNcNlwwXDJcMTEzXDFcMzYxXDJcMTEzXDFcMFwxM1wxMTMiKwotICAgICJcMVwwXDEyXDExM1wxXDBcNFwxMTNcMVwwXDExXDExM1w3XDBcMVwxMTYiKwotICAgICJcMTFcMFwxXDExNlw2XDBcMVwxMTZcNTdcMFwxXDM2MlwxMDNcMFwxXDM2MyIrCi0gICAgIlwxMDdcMFw0XDEyM1w2XDBcMVwxMjNcNlwwXDVcMTIzXDFcMFwxM1wxMjMiKwotICAgICJcMVwwXDEyXDEyM1wxXDBcNFwxMjNcMVwwXDExXDEyM1wyXDBcMVwxMjUiKwotICAgICJcMlwwXDFcMzY0XDFcMTI1XDFcMFw0XDEyNVwxXDBcMVwxMjVcMVwwIisKLSAgICAiXDJcMTI1XDFcMFw2XDEyNVwxXDBcNTZcMTI1XDFcMFwxXDM2M1wxXDM2NCIrCi0gICAgIlwxXDEyNVwxXDBcNFwxMjVcMVwwXDFcMTI1XDFcMFwyXDEyNVwxXDAiKwotICAgICJcNlwxMjVcMVwwXDU1XDEyNVwxXDM2NVwxXDBcMTBcMzY1XDFcMzY2XDJcMzY1IisKLSAgICAiXDFcMzY3XDQ1XDM2NVwxXDM2N1wyMFwzNjVcMVwzNzBcMVwwXDEyXDM3MFwxXDM2NiIrCi0gICAgIlwxXDM3MVw0NVwzNzBcMVwzNzFcMjBcMzcwXDJcMFwxXDEzM1wxXDM3MlwxMDZcMCIrCi0gICAgIlw0XDEzNVw2XDBcMVwxMzVcNlwwXDVcMTM1XDFcMFwxM1wxMzVcMVwwIisKLSAgICAiXDEyXDEzNVwxXDBcNFwxMzVcMVwwXDExXDEzNVwyXDBcMVwxMzdcMlwwIisKLSAgICAiXDFcMzczXDFcMTM3XDFcMFw0XDEzN1wxXDBcMVwxMzdcMVwwXDJcMTM3IisKLSAgICAiXDFcMFw2XDEzN1wxXDBcNTZcMTM3XDFcMFwxXDEzM1wxXDM3NFwxXDEzNyIrCi0gICAgIlwxXDBcNFwxMzdcMVwwXDFcMTM3XDFcMFwyXDEzN1wxXDBcNlwxMzciKwotICAgICJcMVwwXDU1XDEzN1wxXDE0MVwxXDBcMVwzNzVcMVwzNzZcMVwxNDFcMVwzNzUiKwotICAgICJcNFwxNDFcMVwzNzdcMVwxNDFcMVwzNzVcMVx1MDEwMFwxXDE0MVwxXDM3NVw2XDE0MSIrCi0gICAgIlwxXDM3NVwzNFwxNDFcMVx1MDEwMFwyMFwxNDFcMVwxNDJcMVwwXDFcdTAxMDFcMVx1MDEwMiIrCi0gICAgIlwxXDE0MlwxXHUwMTAxXDRcMTQyXDFcdTAxMDFcMVwxNDJcMVwzNzdcMVx1MDEwM1wxXDE0MiIrCi0gICAgIlwxXHUwMTAxXDZcMTQyXDFcdTAxMDFcMzRcMTQyXDFcdTAxMDNcMjBcMTQyXDJcMFwxXHUwMTA0IisKLSAgICAiXDEyM1wwXDFcMzUzXDJcMFwxXHUwMTA1XDY0XDBcNFwxNDdcNlwwXDFcMTQ3IisKLSAgICAiXDZcMFw1XDE0N1wxXDBcMTNcMTQ3XDFcMFwxMlwxNDdcMVwwXDRcMTQ3IisKLSAgICAiXDFcMFwxMVwxNDdcNFwwXDFcdTAxMDZcMTA2XDBcMVwxNTFcMTFcMFwxXDE1MSIrCi0gICAgIlw2XDBcMVwxNTFcNjNcMFw0XDE1Mlw2XDBcMVwxNTJcNlwwXDVcMTUyIisKLSAgICAiXDFcMFwxM1wxNTJcMVwwXDEyXDE1MlwxXDBcNFwxNTJcMVwwXDExXDE1MiIrCi0gICAgIlwyXDBcMVwxNTRcMlwwXDFcdTAxMDdcMVwxNTRcMVwwXDRcMTU0XDFcMCIrCi0gICAgIlwxXDE1NFwxXDBcMlwxNTRcMVwwXDZcMTU0XDFcMFw1NVwxNTRcMVx1MDEwOCIrCi0gICAgIlwxXDBcMTBcdTAxMDhcMVx1MDEwOVwyXHUwMTA4XDFcdTAxMGFcNDVcdTAxMDhcMVx1MDEwYVwyMFx1MDEwOCIrCi0gICAgIlwxXHUwMTBiXDFcMFwxMlx1MDEwYlwxXHUwMTA5XDFcdTAxMGNcNDVcdTAxMGJcMVx1MDEwY1wyMFx1MDEwYiIrCi0gICAgIlwxXDE1NFwxXDBcMVx1MDEwNlwxXHUwMTA3XDFcMTU0XDFcMFw0XDE1NFwxXDAiKwotICAgICJcMVwxNTRcMVwwXDJcMTU0XDFcMFw2XDE1NFwxXDBcNTVcMTU0XDFcMTYxIisKLSAgICAiXDNcMFwyM1wxNjFcNVwwXDFcMTYxXDEzXDBcMVwxNjFcMTJcMFwxXDE2MSIrCi0gICAgIlw0XDBcMVwxNjFcNFwwXDFcMTYxXDRcMFwyXDE2MVwzXDBcMVwzMzYiKwotICAgICJcMTZcMFwxXDM1M1wyXDBcMVwzNDFcNjBcMFwxXHUwMTBkXDEwMVwwXDFcMTYxIisKLSAgICAiXDNcMFwyXDE2MVw0XDE2NVw2XDE2MVwxXDE2NVw2XDE2MVw1XDE2NlwxXDE2MSIrCi0gICAgIlwxM1wxNjZcMVwxNjFcMTJcMTY2XDFcMTYxXDRcMTY2XDFcMTYxXDRcMTY2XDFcMTY1IisKLSAgICAiXDRcMTY2XDJcMTYxXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDdcMTY2IisKLSAgICAiXDFcdTAxMGVcM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlw1XDBcMVwzMzZcNFwwXDJcdTAxMGZcMTBcMFwxXDM1M1wyXDBcMVwzNDEiKwotICAgICJcMVwwXDVcdTAxMGZcMVwwXDEzXHUwMTBmXDFcMFwxMlx1MDEwZlwxXDBcNFx1MDEwZiIrCi0gICAgIlwxXDBcNFx1MDEwZlwxXDBcNFx1MDEwZlwxMFwwXDRcMTcxXDZcMFwxXDE3MSIrCi0gICAgIlw2XDBcNVwxNzFcMVwwXDEzXDE3MVwxXDBcMTJcMTcxXDFcMFw0XDE3MSIrCi0gICAgIlwxXDBcMTFcMTcxXDJcMFwxXDE3M1wyXDBcMVx1MDExMFwxXDE3M1wxXDAiKwotICAgICJcNFwxNzNcMVwwXDFcMTczXDFcMFwyXDE3M1wxXDBcNlwxNzNcMVwwIisKLSAgICAiXDU1XDE3M1wzXDBcMVwzMzZcNFwwXDJcdTAxMTFcMTBcMFwxXDM1M1wyXDAiKwotICAgICJcMVwzNDFcMVwwXDVcdTAxMTFcMVwwXDEzXHUwMTExXDFcMFwxMlx1MDExMVwxXDAiKwotICAgICJcNFx1MDExMVwxXDBcNFx1MDExMVwxXDBcNFx1MDExMVwyXDBcMVwxNzNcMVwwIisKLSAgICAiXDFcdTAxMGRcMVx1MDExMFwxXDE3M1wxXDBcNFwxNzNcMVwwXDFcMTczXDFcMCIrCi0gICAgIlwyXDE3M1wxXDBcNlwxNzNcMVwwXDU1XDE3M1wxXHUwMTEyXDFcMFwxMFx1MDExMiIrCi0gICAgIlwxXHUwMTEzXDJcdTAxMTJcMVx1MDExNFw0NVx1MDExMlwxXHUwMTE0XDIwXHUwMTEyXDFcdTAxMTVcMVwwIisKLSAgICAiXDEyXHUwMTE1XDFcdTAxMTNcMVx1MDExNlw0NVx1MDExNVwxXHUwMTE2XDIwXHUwMTE1XDFcMTczXDJcMCIrCi0gICAgIlwxXHUwMTEwXDFcMTczXDFcMFw0XDE3M1wxXDBcMVwxNzNcMVwwXDFcMTczIisKLSAgICAiXDFcdTAxMTdcMVwwXDZcMTczXDFcMFw1NlwxNzNcMlwwXDFcdTAxMTBcMVwxNzMiKwotICAgICJcMVwwXDRcMTczXDFcMFwxXDE3M1wxXDBcMVwxNzNcMVx1MDExOFwxXDAiKwotICAgICJcNlwxNzNcMVwwXDU1XDE3M1wzXDBcMVwzMzZcMTZcMFwxXDM1M1wyXDAiKwotICAgICJcMVx1MDEwNVwxMjRcMFwxXHUwMTE5XDJcMFwxXHUwMTE5XDcyXDBcMVx1MDExYVwxNFwwIisKLSAgICAiXDFcdTAxMWFcNjBcMFwyXHUwMTFiXDUwXDBcMjNcdTAxMWNcMVx1MDExZFw2MFx1MDExY1w2XDAiKwotICAgICJcNFwyMTBcNlwwXDFcMjEwXDZcMFw1XDIxMFwxXDBcMTNcMjEwXDFcMCIrCi0gICAgIlwxMlwyMTBcMVwwXDRcMjEwXDFcMFwxMVwyMTBcNTRcMFwxXHUwMTFlXDEyMFwwIisKLSAgICAiXDFcdTAxMWZcMTBcMFwxXHUwMTFmXDNcMFwxXDIxM1wyXDBcMVx1MDEyMFwxXDIxMyIrCi0gICAgIlwxXDBcNFwyMTNcMVwwXDFcMjEzXDFcMFwyXDIxM1wxXDBcNlwyMTMiKwotICAgICJcMVwwXDU1XDIxM1wxXHUwMTIxXDFcMFwxMFx1MDEyMVwxXHUwMTIyXDJcdTAxMjFcMVx1MDEyMyIrCi0gICAgIlw0NVx1MDEyMVwxXHUwMTIzXDIwXHUwMTIxXDFcdTAxMjRcMVwwXDFcdTAxMjRcMlx1MDEyNVwxXHUwMTI0IisKLSAgICAiXDRcdTAxMjVcMlx1MDEyNFwxXHUwMTI2XDFcdTAxMjdcMVx1MDEyNFw0XHUwMTI1XDFcdTAxMjRcMTBcdTAxMjUiKwotICAgICJcMVx1MDEyNFwyNlx1MDEyNVwxXHUwMTI3XDEwXHUwMTI1XDJcdTAxMjRcNFx1MDEyNVwyXHUwMTI0XDFcMjE3IisKLSAgICAiXDJcdTAxMWNcMVx1MDEyOFwxXDIxN1wxXHUwMTFjXDRcMjE3XDFcdTAxMWNcMVwyMTdcMVx1MDExYyIrCi0gICAgIlwyXDIxN1wxXHUwMTFjXDNcMjE3XDFcdTAxMjlcMlwyMTdcMVx1MDExY1w1NVwyMTdcMVwyMjAiKwotICAgICJcMlwwXDFcdTAxMmFcMVwyMjBcMVwwXDRcMjIwXDFcMFwxXDIyMFwxXDAiKwotICAgICJcMlwyMjBcMVwwXDZcMjIwXDFcMFw1NVwyMjBcMTJcdTAxMmJcMVx1MDEyY1w3MVx1MDEyYiIrCi0gICAgIlwxNFx1MDEyZFwxXHUwMTJjXDY3XHUwMTJkXDFcMjI0XDJcdTAxMWNcMVx1MDEyZVwxXDIyNFwxXHUwMTFjIisKLSAgICAiXDRcMjI0XDFcdTAxMWNcMVwyMjRcMVx1MDExY1wyXDIyNFwxXHUwMTFjXDNcMjI0XDFcdTAxMmYiKwotICAgICJcMlwyMjRcMVx1MDExY1w1NVwyMjRcMVwyMjVcMlwwXDFcdTAxMzBcMVwyMjVcMVwwIisKLSAgICAiXDRcMjI1XDFcMFwxXDIyNVwxXDBcMlwyMjVcMVwwXDZcMjI1XDFcMCIrCi0gICAgIlw1NVwyMjVcMVx1MDEzMVwxXDBcMTBcdTAxMzFcMVx1MDEzMlwyXHUwMTMxXDFcdTAxMzNcNDVcdTAxMzEiKwotICAgICJcMVx1MDEzM1wyMFx1MDEzMVwxXHUwMTM0XDFcMFwxXHUwMTM0XDJcdTAxMzVcMVx1MDEzNFw0XHUwMTM1IisKLSAgICAiXDJcdTAxMzRcMVx1MDEzNlwxXHUwMTM3XDFcdTAxMzRcNFx1MDEzNVwxXHUwMTM0XDEwXHUwMTM1XDFcdTAxMzQiKwotICAgICJcMjZcdTAxMzVcMVx1MDEzN1wxMFx1MDEzNVwyXHUwMTM0XDRcdTAxMzVcMlx1MDEzNFwyXDIzMVwxXDAiKwotICAgICJcMTAzXDIzMVwxXDBcMTdcMjMxXDFcdTAxMzhcMlwyMzFcMVx1MDEzOVw1NlwyMzFcMVwyMzQiKwotICAgICJcMlwwXDFcdTAxM2FcMVwyMzRcMVwwXDRcMjM0XDFcMFwxXDIzNFwxXDAiKwotICAgICJcMlwyMzRcMVwwXDZcMjM0XDFcMFw1NVwyMzRcMVx1MDEzYlwxXDBcMTBcdTAxM2IiKwotICAgICJcMVx1MDEzY1wyXHUwMTNiXDFcdTAxM2RcNDVcdTAxM2JcMVx1MDEzZFwyMFx1MDEzYlwxXHUwMTNlXDFcMCIrCi0gICAgIlwxXHUwMTNlXDJcdTAxM2ZcMVx1MDEzZVw0XHUwMTNmXDJcdTAxM2VcMVx1MDE0MFwxXHUwMTQxXDFcdTAxM2UiKwotICAgICJcNFx1MDEzZlwxXHUwMTNlXDEwXHUwMTNmXDFcdTAxM2VcMjZcdTAxM2ZcMVx1MDE0MVwxMFx1MDEzZlwyXHUwMTNlIisKLSAgICAiXDRcdTAxM2ZcMlx1MDEzZVwyXDI0MFwxXDBcMTAzXDI0MFwxXDBcMTdcMjQwXDFcdTAxNDIiKwotICAgICJcMlwyNDBcMVx1MDE0M1w1NlwyNDBcMjJcMFwxXHUwMTQ0XDJcMFwxXDM1NFw2NVwwIisKLSAgICAiXDFcdTAxNDVcNzRcMFwxXDI1MVwxXDBcMTJcMjUxXDFcMFwxXHUwMTQ2XDQ1XDI1MSIrCi0gICAgIlwxXHUwMTQ2XDIwXDI1MVwzXDBcMVx1MDE0N1wxNlwwXDFcMzUzXDJcMFwxXDM1NCIrCi0gICAgIlw1NlwwXDFcMjUxXDFcMFwzXDI1MVwxXDI1M1w2XDI1MVwxXDBcMVx1MDE0NiIrCi0gICAgIlwxXDI1MVwxXDI1M1w2XDI1MVwxXDI1M1wzNFwyNTFcMVx1MDE0NlwzNlwyNTFcMVx1MDE0OCIrCi0gICAgIlwxMDNcMjUxXDFcdTAxNDlcNjVcMjUxXDFcMjU3XDFcMFwxMFwyNTdcMVwwXDJcMjU3IisKLSAgICAiXDFcdTAxNGFcNDVcMjU3XDFcdTAxNGFcMjFcMjU3XDFcMFwzXDI1N1wxXDI2MFw0XDI1NyIrCi0gICAgIlwxXDBcMlwyNTdcMVx1MDE0YVwxXDI1N1wxXDI2MFw2XDI1N1wxXDI2MFwzNFwyNTciKwotICAgICJcMVx1MDE0YVwzNlwyNTdcMVx1MDE0YlwxMDNcMjU3XDFcdTAxNGNcNjVcMjU3XDEyXDI2NFwxXDAiKwotICAgICJcMVwyNjRcMVwwXDFcdTAxNGRcNjVcMjY0XDFcMFwxMlwyNjRcMVwwXDFcMjY0IisKLSAgICAiXDFcMFwxXHUwMTRkXDRcMjY0XDFcdTAxNGVcNjBcMjY0XDFcMFwxMlwyNjRcMVwwIisKLSAgICAiXDFcMjY0XDFcMFwxXDI2NFwxXHUwMTRmXDY0XDI2NFwxXHUwMTUwXDE0XHUwMTUxXDFcdTAxNTIiKwotICAgICJcMTAzXHUwMTUxXDFcdTAxNTJcNVx1MDE1MVwxXHUwMTUzXDJcdTAxNTFcMVx1MDE1NFw1Nlx1MDE1MVwxMlx1MDE1NSIrCi0gICAgIlwxXHUwMTU2XDEwM1x1MDE1NVwxXHUwMTU2XDdcdTAxNTVcMVx1MDE1N1wyXHUwMTU1XDFcdTAxNThcNTZcdTAxNTUiKwotICAgICJcMTJcMzAyXDFcMFw2N1wzMDJcMVx1MDE1OVwxXDBcMTJcMzAyXDFcMFw3XDMwMiIrCi0gICAgIlwxXHUwMTVhXDU3XDMwMlwxXHUwMTU5XDFcMFwxMlwzMDJcMVx1MDE1Ylw3MVwzMDJcMTRcMzA2IisKLSAgICAiXDFcMFw2NVwzMDZcMVx1MDE1Y1wxXDBcMTRcMzA2XDFcMFw1XDMwNlwxXHUwMTVkIisKLSAgICAiXDU3XDMwNlwxXHUwMTVjXDFcMFwxNFwzMDZcMVx1MDE1ZVw2N1wzMDZcMTJcMzExXDFcMCIrCi0gICAgIlwxXDMxMVwxXDBcNjZcMzExXDFcMFwxMlwzMTFcMVwwXDFcMzExXDFcMCIrCi0gICAgIlw1XDMxMVwxXHUwMTVmXDYwXDMxMVwxXDBcMTJcMzExXDFcMFwxXDMxMVwxXDAiKwotICAgICJcMVwzMTFcMVx1MDE2MFw2NFwzMTFcMVwwXDE0XHUwMTYxXDFcdTAxNjJcMTAzXHUwMTYxXDFcdTAxNjIiKwotICAgICJcNVx1MDE2MVwxXHUwMTYzXDJcdTAxNjFcMVx1MDE2NFw1Nlx1MDE2MVwxMlx1MDE2NVwxXHUwMTY2XDEwM1x1MDE2NSIrCi0gICAgIlwxXHUwMTY2XDdcdTAxNjVcMVx1MDE2N1wyXHUwMTY1XDFcdTAxNjhcNTZcdTAxNjVcMTJcMzI3XDFcMCIrCi0gICAgIlw2N1wzMjdcMVx1MDE2OVwxXDBcMTJcMzI3XDFcMFw3XDMyN1wxXHUwMTZhXDU3XDMyNyIrCi0gICAgIlwxXHUwMTY5XDFcMFwxMlwzMjdcMVx1MDE2Ylw3MVwzMjdcMTRcMzMzXDFcMFw2NVwzMzMiKwotICAgICJcMVx1MDE2Y1wxXDBcMTRcMzMzXDFcMFw1XDMzM1wxXHUwMTZkXDU3XDMzM1wxXHUwMTZjIisKLSAgICAiXDFcMFwxNFwzMzNcMVx1MDE2ZVw2N1wzMzNcN1wwXDFcdTAxNmZcMTFcMFwxXHUwMTcwIisKLSAgICAiXDNcMFwxXHUwMTcxXDIyXDBcMVx1MDE3Mlw0MlwwXDFcdTAxNzNcMjRcMFwxXHUwMTc0IisKLSAgICAiXDU0XDBcMVwzNDJcMlwwXDJcdTAxNzVcNVwwXDFcMzQyXDZcMFwxXDM0MiIrCi0gICAgIlw1XHUwMTc1XDFcMFwxM1x1MDE3NVwxXDBcMTJcdTAxNzVcMVwwXDRcdTAxNzVcMVwwIisKLSAgICAiXDRcdTAxNzVcMVwwXDRcdTAxNzVcMlwwXDFcdTAxNzZcMVwwXDNcdTAxNzZcMVx1MDE3NyIrCi0gICAgIlw0XDM0M1wxXHUwMTc2XDFcMFwzXHUwMTc2XDFcdTAxNzdcMVwzNDNcMVx1MDE3NlwxXDAiKwotICAgICJcM1x1MDE3NlwxXHUwMTc3XDVcMzQzXDFcdTAxNzZcMTNcMzQzXDFcdTAxNzZcMTJcMzQzXDFcdTAxNzYiKwotICAgICJcNFwzNDNcMVx1MDE3OFwxMVwzNDNcMlx1MDE3NlwyMFwwXDFcdTAxNzlcN1wwXDFcdTAxN2EiKwotICAgICJcNzBcMFwxXDM0Nlw2NlwwXDEwM1wzNDdcMVx1MDE3YlwxXHUwMTc2XDFcMFwzXHUwMTc2IisKLSAgICAiXDFcdTAxNzdcNFwzNTBcMVx1MDE3NlwxXDBcM1x1MDE3NlwxXHUwMTc3XDFcMzUwXDFcdTAxNzYiKwotICAgICJcMVwwXDNcdTAxNzZcMVx1MDE3N1w1XDM1MFwxXHUwMTc2XDEzXDM1MFwxXHUwMTc2XDEyXDM1MCIrCi0gICAgIlwxXHUwMTc2XDRcMzUwXDFcdTAxN2NcMTFcMzUwXDJcdTAxNzZcMTAzXDM1MVwxXHUwMTdkXDYzXDAiKwotICAgICJcMVwzNTJcNDVcMFwxXHUwMTcxXDIyXDBcMVx1MDE3Mlw2N1wwXDFcdTAxNzRcNTFcMCIrCi0gICAgIlwxXHUwMTdlXDEwM1wwXDFcdTAxN2ZcMTA3XDBcNFwxMTNcNlwwXDFcMTEzXDZcMCIrCi0gICAgIlwzXDExM1wyXHUwMTgwXDFcMFwxM1wxMTNcMVwwXDEyXDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDExXDExM1wxMFwwXDRcMTEzXDZcMFwxXDExM1w2XDBcNVwxMTMiKwotICAgICJcMVwwXDEzXDExM1wxXDBcMlwxMTNcMVx1MDE4MVw3XDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDZcMTEzXDFcdTAxODFcMlwxMTNcMlwwXDEyXDM2NVwxXDM2NlwzXDM2NSIrCi0gICAgIlwxXDBcNjVcMzY1XDE0XDM3MFwxXDM2NlwxXDM3MFwxXDBcNjVcMzcwXDFcMzc1IisKLSAgICAiXDFcMFwxMFwzNzVcMVwzNzdcMlwzNzVcMVx1MDE4Mlw0NVwzNzVcMVx1MDE4MlwyMFwzNzUiKwotICAgICJcMVwxNDFcMlwzNzVcMVwzNzZcMVwxNDFcMVwzNzVcNFwxNDFcMVwzNzdcMVwxNDEiKwotICAgICJcMVwzNzVcMVwxNDFcMVwxMzdcMVwzNzVcNlwxNDFcMVwzNzVcNTVcMTQxXDFcdTAxMDEiKwotICAgICJcMVwwXDEyXHUwMTAxXDFcMzc3XDFcdTAxODNcNDVcdTAxMDFcMVx1MDE4M1wyMFx1MDEwMVwxXDE0MiIrCi0gICAgIlwyXHUwMTAxXDFcdTAxMDJcMVwxNDJcMVx1MDEwMVw0XDE0MlwxXHUwMTAxXDFcMTQyXDFcMzc3IisKLSAgICAiXDFcMTQyXDFcMTM3XDFcdTAxMDFcNlwxNDJcMVx1MDEwMVw1NVwxNDJcMTJcdTAxMDhcMVx1MDEwOSIrCi0gICAgIlwzXHUwMTA4XDFcMFw2NVx1MDEwOFwxNFx1MDEwYlwxXHUwMTA5XDFcdTAxMGJcMVwwXDY1XHUwMTBiIisKLSAgICAiXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDZcMTY2XDFcdTAxODRcMlwxNjYiKwotICAgICJcMTBcMFw0XHUwMTBmXDZcMFwxXHUwMTBmXDZcMFw1XHUwMTBmXDFcMFwxM1x1MDEwZiIrCi0gICAgIlwxXDBcMTJcdTAxMGZcMVwwXDRcdTAxMGZcMVwwXDExXHUwMTBmXDEwXDBcNFx1MDExMSIrCi0gICAgIlw2XDBcMVx1MDExMVw2XDBcNVx1MDExMVwxXDBcMTNcdTAxMTFcMVwwXDEyXHUwMTExIisKLSAgICAiXDFcMFw0XHUwMTExXDFcMFwxMVx1MDExMVwyXDBcMTJcdTAxMTJcMVx1MDExM1wzXHUwMTEyIisKLSAgICAiXDFcMFw2NVx1MDExMlwxNFx1MDExNVwxXHUwMTEzXDFcdTAxMTVcMVwwXDY1XHUwMTE1XDFcdTAxODUiKwotICAgICJcMlx1MDE4NlwxXHUwMTg3XDFcdTAxODVcMVx1MDE4Nlw0XHUwMTg1XDFcdTAxODZcMVx1MDE4NVwxXHUwMTg2IisKLSAgICAiXDJcdTAxODVcMVx1MDE4Nlw2XHUwMTg1XDFcdTAxODZcNTRcdTAxODVcMVwxNzNcMVx1MDE4OFwyXHUwMTg5IisKLSAgICAiXDFcdTAxOGFcMVx1MDE4OFwxXHUwMTg5XDRcdTAxODhcMVx1MDE4OVwxXHUwMTg4XDFcdTAxODlcMlx1MDE4OCIrCi0gICAgIlwxXHUwMTg5XDZcdTAxODhcMVx1MDE4OVw1NFx1MDE4OFwxXDE3M1wzNVwwXDFcdTAxOGJcMzRcMCIrCi0gICAgIlwxXHUwMThiXDUxXDBcMVx1MDE4Y1wxNFwwXDFcdTAxOGNcNzBcMFwxXHUwMThkXDExXDAiKwotICAgICJcMVx1MDE4ZFw3M1wwXDFcdTAxOGVcMTdcMFwxXHUwMThlXDExMFwwXDFcdTAxOGZcN1wwIisKLSAgICAiXDFcdTAxOGZcMlwwXDEyXHUwMTIxXDFcdTAxMjJcM1x1MDEyMVwxXDBcNjVcdTAxMjFcMVx1MDEyNCIrCi0gICAgIlwxXDBcMTJcdTAxMjRcMVx1MDEyMlwxXHUwMTkwXDQ1XHUwMTI0XDFcdTAxOTBcMjFcdTAxMjRcMVwwIisKLSAgICAiXDEyXHUwMTI0XDFcdTAxOTFcMVx1MDE5MFw0NVx1MDEyNFwxXHUwMTkwXDIwXHUwMTI0XDE0XDBcMVx1MDE5MiIrCi0gICAgIlw2N1wwXDE0XHUwMTI0XDFcdTAxOTFcMVx1MDEyNFwxXDBcNjVcdTAxMjRcMTJcdTAxMzFcMVx1MDEzMiIrCi0gICAgIlwzXHUwMTMxXDFcMFw2NVx1MDEzMVwxXHUwMTM0XDFcMFwxMlx1MDEzNFwxXHUwMTMyXDFcdTAxOTMiKwotICAgICJcNDVcdTAxMzRcMVx1MDE5M1wyMVx1MDEzNFwxXDBcMTJcdTAxMzRcMVx1MDE5NFwxXHUwMTkzXDQ1XHUwMTM0IisKLSAgICAiXDFcdTAxOTNcMjBcdTAxMzRcMTRcMFwxXHUwMTk1XDY3XDBcMTRcdTAxMzRcMVx1MDE5NFwxXHUwMTM0IisKLSAgICAiXDFcMFw2NVx1MDEzNFwyXDIzMVwxXDBcMjJcMjMxXDFcdTAxOTZcMjJcMjMxXDFcdTAxOTciKwotICAgICJcMzVcMjMxXDFcMFwzMVwyMzFcMVx1MDE5OFw0N1wyMzFcMTJcdTAxM2JcMVx1MDEzY1wzXHUwMTNiIisKLSAgICAiXDFcMFw2NVx1MDEzYlwxXHUwMTNlXDFcMFwxMlx1MDEzZVwxXHUwMTNjXDFcdTAxOTlcNDVcdTAxM2UiKwotICAgICJcMVx1MDE5OVwyMVx1MDEzZVwxXDBcMTJcdTAxM2VcMVx1MDE5YVwxXHUwMTk5XDQ1XHUwMTNlXDFcdTAxOTkiKwotICAgICJcMjBcdTAxM2VcMTRcMFwxXHUwMTliXDY3XDBcMTRcdTAxM2VcMVx1MDE5YVwxXHUwMTNlXDFcMCIrCi0gICAgIlw2NVx1MDEzZVwyXDI0MFwxXDBcMjJcMjQwXDFcdTAxOWNcMjJcMjQwXDFcdTAxOWRcMzVcMjQwIisKLSAgICAiXDFcMFwzMVwyNDBcMVx1MDE5ZVw0N1wyNDBcN1wwXDFcdTAxOWZcMTFcMFwxXHUwMTcwIisKLSAgICAiXDNcMFwxXHUwMTcxXDIyXDBcMVx1MDE3Mlw1NVwwXDFcdTAxYTBcNjFcMFwxNlwyNTEiKwotICAgICJcMVwwXDY1XDI1MVwxNlwyNTdcMVwwXDY1XDI1N1wxMlwyNjRcMVwwXDFcMjY0IisKLSAgICAiXDFcMFwxXDI2NFwxXHUwMWExXDY0XDI2NFwxXHUwMTUwXDEyXDI2NFwxXDBcMVwyNjQiKwotICAgICJcMVwwXDFcdTAxNGRcN1wyNjRcMVx1MDFhMlwyMlwyNjRcMVx1MDFhM1wzMlwyNjRcMVwwIisKLSAgICAiXDEyXHUwMWExXDFcMFwxXHUwMWExXDFcMFw2Nlx1MDFhMVwxXDBcMTJcdTAxNTBcMVwwIisKLSAgICAiXDFcdTAxNTBcMVwwXDFcdTAxYTRcNjVcdTAxNTBcMVwwXDE0XHUwMTUxXDFcdTAxNTJcMTBcdTAxNTEiKwotICAgICJcMVx1MDFhNVwyMlx1MDE1MVwxXHUwMWE2XDQ3XHUwMTUxXDFcdTAxNTJcMTdcdTAxNTFcMVx1MDFhN1w0N1x1MDE1MSIrCi0gICAgIlwxMlx1MDE1NVwxXHUwMTU2XDEyXHUwMTU1XDFcdTAxYThcMjJcdTAxNTVcMVx1MDFhOVw0NVx1MDE1NVwxXHUwMTU2IisKLSAgICAiXDIxXHUwMTU1XDFcdTAxYWFcNDdcdTAxNTVcMTJcMzAyXDFcMFwxMDNcMzAyXDFcMFwxMlwzMDIiKwotICAgICJcMVx1MDFhYlwyMlwzMDJcMVx1MDFhY1wzMVwzMDJcMVx1MDE1OVwxXDBcMTAyXHUwMWFkXDFcdTAxYWUiKwotICAgICJcMVx1MDFhZFwxNFwzMDZcMVwwXDEwM1wzMDZcMVwwXDEwXDMwNlwxXHUwMWFmXDIyXDMwNiIrCi0gICAgIlwxXHUwMWIwXDMxXDMwNlwxXHUwMTVjXDFcMFwxMDJcdTAxYjFcMVx1MDFiMlwxXHUwMWIxXDEyXDMxMSIrCi0gICAgIlwxXDBcMVwzMTFcMVwwXDEwXDMxMVwxXHUwMWIzXDIyXDMxMVwxXHUwMWI0XDMyXDMxMSIrCi0gICAgIlwxXDBcMTRcdTAxNjFcMVx1MDE2MlwxMFx1MDE2MVwxXHUwMWI1XDIyXHUwMTYxXDFcdTAxYjZcNDdcdTAxNjEiKwotICAgICJcMVx1MDE2MlwxN1x1MDE2MVwxXHUwMWI3XDQ3XHUwMTYxXDEyXHUwMTY1XDFcdTAxNjZcMTJcdTAxNjVcMVx1MDFiOCIrCi0gICAgIlwyMlx1MDE2NVwxXHUwMWI5XDQ1XHUwMTY1XDFcdTAxNjZcMjFcdTAxNjVcMVx1MDFiYVw0N1x1MDE2NVwxMlwzMjciKwotICAgICJcMVwwXDEwM1wzMjdcMVwwXDEyXDMyN1wxXHUwMWJiXDIyXDMyN1wxXHUwMWJjXDMxXDMyNyIrCi0gICAgIlwxXHUwMTY5XDFcMFwxMDJcdTAxYmRcMVx1MDFiZVwxXHUwMWJkXDE0XDMzM1wxXDBcMTAzXDMzMyIrCi0gICAgIlwxXDBcMTBcMzMzXDFcdTAxYmZcMjJcMzMzXDFcdTAxYzBcMzFcMzMzXDFcdTAxNmNcMVwwIisKLSAgICAiXDEwMlx1MDFjMVwxXHUwMWMyXDFcdTAxYzFcN1wwXDFcdTAxYzNcMTAzXDBcMVx1MDFjNFwxMzFcMCIrCi0gICAgIlwxXHUwMWM1XDQ2XDBcMVx1MDE3NVwxXDBcMTFcdTAxNzVcMVwwXDZcdTAxNzVcMVwwIisKLSAgICAiXDYxXHUwMTc1XDFcdTAxNzZcMVwwXDExXHUwMTc2XDFcMFw2XHUwMTc2XDFcMFw0NVx1MDE3NiIrCi0gICAgIlwxXDBcMTRcdTAxNzZcMVwwXDNcdTAxNzZcMVx1MDE3N1w1XHUwMTc2XDFcMFwzXHUwMTc2IisKLSAgICAiXDFcdTAxNzdcMlx1MDE3NlwxXDBcM1x1MDE3NlwxXHUwMTc3XDQxXHUwMTc2XDFcdTAxYzZcMTNcdTAxNzYiKwotICAgICJcMjBcMFwxXHUwMTc5XDQ3XDBcMVx1MDFjN1wzM1wwXDFcdTAxYzhcMTRcMFwzXHUwMWM4IisKLSAgICAiXDJcMFwxXHUwMWM4XDExXDBcMVx1MDFjOFwxXDBcMlx1MDFjOFw2XDBcMVx1MDFjOCIrCi0gICAgIlwyXDBcMlx1MDFjOFw2XDBcMVx1MDFjOFwxMFwwXDRcMTEzXDZcMFwxXDExMyIrCi0gICAgIlw2XDBcNVwxMTNcMVwwXDExXDExM1wxXHUwMWM5XDFcMTEzXDFcMFwxXHUwMWM5IisKLSAgICAiXDExXDExM1wxXDBcNFwxMTNcMVwwXDExXDExM1wyXDBcMTJcMzc1XDFcMzc3IisKLSAgICAiXDNcMzc1XDFcMFw2NVwzNzVcMTRcdTAxMDFcMVwzNzdcMVx1MDEwMVwxXDBcNjVcdTAxMDEiKwotICAgICJcNlwwXDNcMTY2XDFcdTAxY2FcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcdTAxODVcMlx1MDE4NlwxXHUwMTg3XDFcdTAxODVcMVx1MDE4Nlw0XHUwMTg1XDFcdTAxODZcMVx1MDE4NSIrCi0gICAgIlwxXHUwMTg2XDJcdTAxODVcMVx1MDE4Nlw2XHUwMTg1XDFcdTAxODZcNTRcdTAxODVcMVx1MDFjYlwxMDNcdTAxODYiKwotICAgICJcMVx1MDFjY1wxXHUwMTg4XDJcdTAxODlcMVx1MDE4YVwxXHUwMTg4XDFcdTAxODlcNFx1MDE4OFwxXHUwMTg5IisKLSAgICAiXDFcdTAxODhcMVx1MDE4OVwyXHUwMTg4XDFcdTAxODlcNlx1MDE4OFwxXHUwMTg5XDU0XHUwMTg4XDFcdTAxY2IiKwotICAgICJcMTAzXHUwMTg5XDFcdTAxY2RcNDBcMFwxXHUwMWNlXDE0XDBcMVx1MDFjZVw2MFwwXDJcdTAxY2YiKwotICAgICJcMTAxXDBcMVx1MDFkMFwxMTJcMFwxXHUwMWQxXDE0XDBcMVx1MDFkMVw2MFwwXDJcdTAxZDIiKwotICAgICJcNTBcMFwxNFx1MDEyNFwxXHUwMTIyXDFcdTAxMjRcMVwwXDY1XHUwMTI0XDNcMFwyXHUwMWQzIisKLSAgICAiXDFcMFw0XHUwMWQzXDJcMFwxXHUwMTI2XDFcdTAxZDNcMVwwXDRcdTAxZDNcMVwwIisKLSAgICAiXDEwXHUwMWQzXDFcMFwzN1x1MDFkM1wyXDBcNFx1MDFkM1wyXDBcMTRcdTAxMzRcMVx1MDEzMiIrCi0gICAgIlwxXHUwMTM0XDFcMFw2NVx1MDEzNFwzXDBcMlx1MDFkNFwxXDBcNFx1MDFkNFwyXDAiKwotICAgICJcMVx1MDEzNlwxXHUwMWQ0XDFcMFw0XHUwMWQ0XDFcMFwxMFx1MDFkNFwxXDBcMzdcdTAxZDQiKwotICAgICJcMlwwXDRcdTAxZDRcMlwwXDJcMjMxXDFcMFwzMlwyMzFcMVx1MDFkNVw0NlwyMzEiKwotICAgICJcMTRcdTAxM2VcMVx1MDEzY1wxXHUwMTNlXDFcMFw2NVx1MDEzZVwzXDBcMlx1MDFkNlwxXDAiKwotICAgICJcNFx1MDFkNlwyXDBcMVx1MDE0MFwxXHUwMWQ2XDFcMFw0XHUwMWQ2XDFcMFwxMFx1MDFkNiIrCi0gICAgIlwxXDBcMzdcdTAxZDZcMlwwXDRcdTAxZDZcMlwwXDJcMjQwXDFcMFwzMlwyNDAiKwotICAgICJcMVx1MDFkN1w0NlwyNDBcN1wwXDFcdTAxZDhcNzZcMFwxXHUwMWQ5XDEwMVwwXDEyXHUwMTUwIisKLSAgICAiXDFcMFwxXHUwMTUwXDFcMFwxXHUwMTUwXDFcMFw2NVx1MDE1MFwxNFx1MDE1MVwxXHUwMTUyIisKLSAgICAiXDIwXHUwMTUxXDFcdTAxZGFcNDZcdTAxNTFcMTJcdTAxNTVcMVx1MDE1NlwyMlx1MDE1NVwxXHUwMWRiXDQ2XHUwMTU1IisKLSAgICAiXDEyXHUwMWRjXDFcdTAxZGRcNzBcdTAxZGNcMVwwXDE0XHUwMWRlXDFcdTAxZGRcNjZcdTAxZGVcMVwwIisKLSAgICAiXDE0XHUwMTYxXDFcdTAxNjJcMjBcdTAxNjFcMVx1MDFkZlw0Nlx1MDE2MVwxMlx1MDE2NVwxXHUwMTY2XDIyXHUwMTY1IisKLSAgICAiXDFcdTAxZTBcNDZcdTAxNjVcMTJcdTAxZTFcMVx1MDFlMlw3MFx1MDFlMVwxXDBcMTRcdTAxZTNcMVx1MDFlMiIrCi0gICAgIlw2Nlx1MDFlM1wzN1wwXDFcdTAxZTRcMTM1XDBcMVx1MDFjNlwzM1wwXDFcdTAxYzhcMTRcMCIrCi0gICAgIlwzXHUwMWM4XDJcMFwxXHUwMWM4XDExXDBcMVx1MDFjOFwxXDBcMlx1MDFjOFw2XDAiKwotICAgICJcMVx1MDFjOFwxXDBcMVx1MDFjN1wyXHUwMWM4XDZcMFwxXHUwMWM4XDEwXDBcNFwxMTMiKwotICAgICJcNlwwXDFcMTEzXDZcMFw1XDExM1wxXDBcNlwxMTNcMVx1MDFlNVw0XDExMyIrCi0gICAgIlwxXDBcMTJcMTEzXDFcMFwxXDExM1wxXHUwMWU1XDJcMTEzXDFcMFwxMVwxMTMiKwotICAgICJcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFw2XDE2NiIrCi0gICAgIlwxXHUwMWU2XDRcMTY2XDFcMFw2XDE2NlwxXHUwMWU3XDNcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDU0XDBcMVx1MDFlOFw3NlwwXDFcdTAxZTlcMTNcMFwxXHUwMWU5IisKLSAgICAiXDY0XDBcMVx1MDFlYVwxMVwwXDFcdTAxZWFcNzFcMFwxXHUwMWViXDExXDBcMVx1MDFlYiIrCi0gICAgIlw3NFwwXDFcdTAxZWNcMTNcMFwxXHUwMWVjXDIyXDBcMlwyMzFcMVwwXDMzXDIzMSIrCi0gICAgIlwxXHUwMWVkXDQ1XDIzMVwyXDI0MFwxXDBcMzNcMjQwXDFcdTAxZWVcNDVcMjQwXDE0XHUwMTUxIisKLSAgICAiXDFcdTAxNTJcMjFcdTAxNTFcMVx1MDFlZlw0NVx1MDE1MVwxMlx1MDE1NVwxXHUwMTU2XDIzXHUwMTU1XDFcdTAxZjAiKwotICAgICJcNDVcdTAxNTVcMTJcdTAxZGNcMVx1MDFhZFw2N1x1MDFkY1wxXHUwMWYxXDFcdTAxYWRcMTRcdTAxZGVcMVx1MDFiMSIrCi0gICAgIlw2NVx1MDFkZVwxXHUwMWYyXDFcdTAxYjFcMTRcdTAxNjFcMVx1MDE2MlwyMVx1MDE2MVwxXHUwMWYzXDQ1XHUwMTYxIisKLSAgICAiXDEyXHUwMTY1XDFcdTAxNjZcMjNcdTAxNjVcMVx1MDFmNFw0NVx1MDE2NVwxMlx1MDFlMVwxXHUwMWJkXDY3XHUwMWUxIisKLSAgICAiXDFcdTAxZjVcMVx1MDFiZFwxNFx1MDFlM1wxXHUwMWMxXDY1XHUwMWUzXDFcdTAxZjZcMVx1MDFjMVwzN1wwIisKLSAgICAiXDFcdTAxZjdcNTJcMFw0XDExM1w2XDBcMVwxMTNcNlwwXDVcMTEzXDFcMCIrCi0gICAgIlwzXDExM1wxXHUwMWY4XDdcMTEzXDFcMFw0XDExM1wxXHUwMWY4XDVcMTEzXDFcMCIrCi0gICAgIlw0XDExM1wxXDBcMTFcMTEzXDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw1XDE2NlwxXDBcMTFcMTY2XDFcdTAxZjlcMVwxNjZcMVwwXDEyXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDEwXDE2NlwxXHUwMWZhXDJcMTY2XDFcMFwxMlwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcNTVcMFwxXHUwMWZiXDIzXDBcMVx1MDFmYlw1MFwwIisKLSAgICAiXDFcdTAxZmNcMTdcMFwxXHUwMWZjXDY2XDBcMVx1MDFmZFwxMlwwXDFcdTAxZmRcNTJcMCIrCi0gICAgIlwxXHUwMWZlXDEwN1wwXDFcdTAxZmZcMzRcMFwxXHUwMWZmXDExXDBcMlwyMzFcMVwwIisKLSAgICAiXDM0XDIzMVwxXHUwMjAwXDQ0XDIzMVwyXDI0MFwxXDBcMzRcMjQwXDFcdTAyMDFcNDRcMjQwIisKLSAgICAiXDE0XHUwMTUxXDFcdTAxNTJcMjJcdTAxNTFcMVx1MDIwMlw0NFx1MDE1MVwxMlx1MDE1NVwxXHUwMTU2XDI0XHUwMTU1IisKLSAgICAiXDFcdTAyMDNcNDRcdTAxNTVcMTJcdTAxZGNcMVx1MDIwNFw2N1x1MDFkY1wxXHUwMWYxXDFcdTAxYWRcMTRcdTAxZGUiKwotICAgICJcMVx1MDIwNVw2NVx1MDFkZVwxXHUwMWYyXDFcdTAxYjFcMTRcdTAxNjFcMVx1MDE2MlwyMlx1MDE2MVwxXHUwMjA2IisKLSAgICAiXDQ0XHUwMTYxXDEyXHUwMTY1XDFcdTAxNjZcMjRcdTAxNjVcMVx1MDIwN1w0NFx1MDE2NVwxMlx1MDFlMVwxXHUwMjA4IisKLSAgICAiXDY3XHUwMWUxXDFcdTAxZjVcMVx1MDFiZFwxNFx1MDFlM1wxXHUwMjA5XDY1XHUwMWUzXDFcdTAxZjZcMVx1MDFjMSIrCi0gICAgIlw0MFwwXDFcdTAyMGFcNTFcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMVx1MDIwYlwxXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcNlwxNjZcMVx1MDIwY1w0XDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDQ0XDBcMVx1MDIwZFwxMVwwXDFcdTAyMGRcNjdcMFwxXHUwMjBlIisKLSAgICAiXDE0XDBcMVx1MDIwZVw2NlwwXDFcdTAyMGZcMTRcMFwxXHUwMjBmXDI2XDBcMlwyMzEiKwotICAgICJcMVwwXDM1XDIzMVwxXHUwMjEwXDQzXDIzMVwyXDI0MFwxXDBcMzVcMjQwXDFcdTAyMTEiKwotICAgICJcNDNcMjQwXDE0XHUwMTUxXDFcdTAxNTJcMjNcdTAxNTFcMVx1MDIxMlw0M1x1MDE1MVwxMlx1MDE1NVwxXHUwMTU2IisKLSAgICAiXDI1XHUwMTU1XDFcdTAyMTNcNDNcdTAxNTVcMTRcdTAxNjFcMVx1MDE2MlwyM1x1MDE2MVwxXHUwMjE0XDQzXHUwMTYxIisKLSAgICAiXDEyXHUwMTY1XDFcdTAxNjZcMjVcdTAxNjVcMVx1MDIxNVw0M1x1MDE2NVwzN1wwXDFcdTAyMTZcNTJcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcdTAyMTdcNVwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFw1XDE2NlwxXHUwMjE4IisKLSAgICAiXDVcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDJcMjMxXDFcMFwzNFwyMzFcMVx1MDIxOVw0NFwyMzFcMlwyNDBcMVwwXDM0XDI0MCIrCi0gICAgIlwxXHUwMjFhXDQ0XDI0MFwxNFx1MDE1MVwxXHUwMTUyXDIyXHUwMTUxXDFcdTAyMWJcNDRcdTAxNTFcMTJcdTAxNTUiKwotICAgICJcMVx1MDE1NlwyNFx1MDE1NVwxXHUwMjFjXDQ0XHUwMTU1XDE0XHUwMTYxXDFcdTAxNjJcMjJcdTAxNjFcMVx1MDIxZCIrCi0gICAgIlw0NFx1MDE2MVwxMlx1MDE2NVwxXHUwMTY2XDI0XHUwMTY1XDFcdTAyMWVcNDRcdTAxNjVcMzRcMFwxXHUwMjFmIisKLSAgICAiXDU1XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxXDE2NlwxXHUwMjIwXDdcMTY2IisKLSAgICAiXDJcMFwyXDIzMVwxXDBcMzFcMjMxXDFcdTAyMjFcNDdcMjMxXDJcMjQwXDFcMCIrCi0gICAgIlwzMVwyNDBcMVx1MDIyMlw0N1wyNDBcMTRcdTAxNTFcMVx1MDE1MlwxN1x1MDE1MVwxXHUwMjIzXDQ3XHUwMTUxIisKLSAgICAiXDEyXHUwMTU1XDFcdTAxNTZcMjFcdTAxNTVcMVx1MDIyNFw0N1x1MDE1NVwxNFx1MDE2MVwxXHUwMTYyXDE3XHUwMTYxIisKLSAgICAiXDFcdTAyMjVcNDdcdTAxNjFcMTJcdTAxNjVcMVx1MDE2NlwyMVx1MDE2NVwxXHUwMjI2XDQ3XHUwMTY1XDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcdTAyMjdcNVwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxMFwxNjZcMVx1MDIyOCIrCi0gICAgIlwyXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcNFwxNjZcMVx1MDIyOSIrCi0gICAgIlw2XDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcNVwxNjZcMVx1MDIyYSIrCi0gICAgIlw1XDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlw2XHUwMjJiXDRcdTAyMmNcNlx1MDIyYlwxXHUwMjJjXDVcdTAyMmJcMVwwXDVcdTAyMmNcMVx1MDIyYiIrCi0gICAgIlwxM1x1MDIyY1wxXHUwMjJiXDEyXHUwMjJjXDFcdTAyMmJcNFx1MDIyY1wxXHUwMjJiXDExXHUwMjJjXDJcdTAyMmIiKwotICAgICJcNDFcMFwxXHUwMjJkXDNcMFwxXHUwMjJlXDdcMFwxXHUwMjJmXDFcdTAyMzBcMjBcMCIrCi0gICAgIlwxXHUwMjMxXDEyXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVx1MDIzMlwzXDE2NlwxXHUwMjMzXDJcMTY2XDFcMFw0XDE2NlwxXHUwMjM0IisKLSAgICAiXDFcdTAyMzVcNFwxNjZcMVwwXDRcMTY2XDFcMFw2XDE2NlwxXHUwMjM2XDJcMTY2IisKLSAgICAiXDYwXDBcMVx1MDIzN1w3NFwwXDFcdTAyMzhcMTEyXDBcMVx1MDIzOVwxMDJcMFwxXHUwMjNhIisKLSAgICAiXDEwNFwwXDFcdTAyM2JcMzNcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcMFwxM1wxNjZcMVwwXDVcMTY2XDFcdTAyM2NcNFwxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVx1MDIzZFwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw1XDE2NlwxXHUwMjNlXDRcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjNmXDVcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw1XDE2NlwxXHUwMjQwXDRcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTFcMTY2XDQ1XDBcMVx1MDI0MVwxMzJcMFwxXHUwMjQyXDEwNFwwXDFcdTAyNDNcNjVcMCIrCi0gICAgIlwxXHUwMjQ0XDEyMVwwXDFcdTAyNDVcMTZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFw2XDE2NlwxXHUwMjQ2XDRcMTY2XDFcMFwxMlwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDFcMTY2XDFcdTAyNDdcN1wxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDJcMTY2XDFcdTAyNDhcNlwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcdTAyNDlcNVwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDJcMTY2XDFcdTAyNGFcNlwxNjZcNDdcMFwxXHUwMjRiXDcxXDBcMVx1MDI0Y1wxMDNcMCIrCi0gICAgIlwxXHUwMjRkXDExM1wwXDFcdTAyNGVcMTAyXDBcMVx1MDI0Zlw0N1wwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEwXDE2NlwxXHUwMjUwXDJcMTY2XDFcMCIrCi0gICAgIlwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTY2XDFcdTAyNTFcMVwwXDEzXDE2NlwxXDBcMTJcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2IisKLSAgICAiXDZcMFw0XDE2NlwxXHUwMjUyXDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDZcMTY2XDFcdTAyNTNcNFwxNjZcMVwwXDEyXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDVcMTY2XDFcdTAyNTRcNVwxNjZcMVwwXDEyXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2Nlw2MFwwXDFcdTAyNTVcMTI1XDBcMVx1MDI1Nlw1MFwwIisKLSAgICAiXDFcdTAyNTdcMTAzXDBcMVx1MDI1OFw0NFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDI1OVw0XDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcN1wxNjZcMVx1MDI1YVwxXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDEwXDE2NlwxXHUwMjViXDJcMTY2XDFcMFwxMlwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxMFwxNjZcMVx1MDI1Y1wyXDE2NlwxXDBcMTJcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDEwM1wwXDFcdTAyNWRcNjFcMFwxXHUwMjQ1XDEyNVwwIisKLSAgICAiXDFcdTAyNGZcMTAzXDBcMVx1MDI1ZVwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTBcMTY2XDFcdTAyNWZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcMFwxM1wxNjZcMVwwXDZcMTY2XDFcdTAyNGFcM1wxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDEwXDE2NiIrCi0gICAgIlwxXHUwMjU0XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMFwxNjZcMVx1MDI2MCIrCi0gICAgIlwzNVwwXDFcdTAyNDVcMTUwXDBcMVx1MDI2MVwxMVwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNFwxNjZcMVx1MDI0YVwxXDBcMTNcMTY2XDFcMFwxMlwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDdcMTY2XDFcdTAyNjJcMVwxNjZcNTdcMFwxXHUwMjQ1XDM0XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjRhIisKLSAgICAiXDVcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjayh5eV9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICAvLyBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAkJLy8kTk9OLU5MUy0xJAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIJLy8kTk9OLU5MUy0xJAotICB9OwotCi0gIC8qKgotICAgKiBZWV9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFlZX0FUVFJJQlVURVtdID0gewotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAKLSAgICAgMSwgIDksICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICA5LCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDksICA5LCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDksIAotICAgICA5LCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDMsICAzLCAKLSAgICAgMywgIDMsICAzLCAgMywgIDksICA5LCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgCi0gICAgIDEsICAwLCAgMSwgIDAsICA5LCAgMSwgIDIsICAxLCAgMiwgIDEsICAxLCAgMCwgIDAsICAwLCAgOSwgIDEsIAotICAgICAxLCAgOSwgIDksICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDksICAxLCAKLSAgICAgMCwgIDAsICAxLCAgOSwgIDAsICA5LCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMCwgCi0gICAgIDEsICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsIAotICAgICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDEsICAwLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgCi0gICAgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDksICA5LCAgOSwgIDAsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAyLCAxMywgIDMsICAyLCAgMiwgMTMsICAzLCAgMiwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMiwgMTMsICAzLCAgMiwgIDIsIDEzLCAgMywgIDIsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAwLCAgOSwgCi0gICAgIDksICA5LCAgMCwgIDAsICAxLCAgMSwgIDEsICA5LCAgMCwgIDAsIDEzLCAgOSwgMTMsICA5LCAgOSwgIDEsIAotICAgICAxLCAgMCwgIDAsICAxLCAgMywgIDIsICAyLCAgMywgIDIsICAyLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMSwgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgCi0gICAgIDEsICAxLCAgMSwgIDAsICAzLCAgMywgIDIsICAzLCAgMywgIDIsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsIAotICAgICAwLCAgMCwgIDEsICAxLCAgMywgIDMsICAyLCAgMywgIDMsICAyLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMCwgIDAsICA5LCAgOSwgIDAsICAxLCAgOSwgIDAsICAxLCAgMSwgIDUsIDEzLCAxMywgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICA5LCAgOSwgIDIsICAyLCAgMCwgIDksICAwLCAgMiwgIDIsIAotICAgICAwLCAgOSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDIsICAyLCAKLSAgICAgMCwgIDAsICAyLCAgMiwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDksICA5LCAgMSwgCi0gICAgIDEsICAyLCAgMiwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDAsICAxLCAgMSwgIDksICA5LCAgOSwgIDEsIAotICAgICAxLCAgMiwgIDIsICAyLCAgMiwgIDAsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDksICAxLCAKLSAgICAgMSwgIDEsICAzLCAgMywgIDMsICAzLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDAsICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOwotCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JLy8gYSAiaGludCIgYXMgdG8gd2hhdCBhbiBlbWJlZGRlZCByZWdpb24gc2hvdWxkIGJlIGV2YWx1YXRlZAotCXByaXZhdGUgU3RyaW5nIGZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JLy8gYSAiaGludCIgYXMgdG8gd2hhdCBzdGF0ZSB0byBlbnRlciBvbmNlIGFuIGVtYmVkZGVkIHJlZ2lvbiBoYXMKLQkvLyAgIGJlZW4gY29tcGxldGVkCi0JcHJpdmF0ZSBpbnQgZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCS8vIHRoZSBjb250YWluZXIgdXNlZCB0byBjcmVhdGUgZW1iZWRkZWQgcmVnaW9ucwotCXByaXZhdGUgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9DT05URVhUID0gIlBST1hZX0NPTlRFWFQiOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBpbnNpZGUgb2YgYW4gZW1iZWRkZWQgcmVnaW9uCi0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbENvbnRleHQgPSBudWxsOwotCi0JLy8gdGhlIGxpc3Qgb2YgdGFnIG5hbWUgQmxvY2tNYXJrZXJzCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCXByaXZhdGUgTGlzdCBmTmVzdGFibGVQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCi0JLy8gd2hlcmUgdGhlIGxhc3QgaW50ZXJuYWwgY29udGFpbmVyIGJsb2NrIHdhcyBmb3VuZAotCXByaXZhdGUgaW50IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7Ci0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBmRm9yYmlkSlNQID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBpbnQgZkVMbGV2ZWwgPSAwOwotCi0JcHJpdmF0ZSBKU1BQYXJzZXJSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gbmV3IEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByY3N2ZXIgPSAiJElkOiBKU1BUb2tlbml6ZXIuamF2YSx2IDEuNCAyMDA1LzAxLzI3IDIxOjUzOjU3IG5pdGluZCBFeHAgJCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkKLQkJCXJldHVybjsKLQkJZkJsb2NrTWFya2Vycy5hZGQobWFya2VyKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKSB7Ci0JCWZOZXN0YWJsZVByZWZpeGVzLmFkZChtYXJrZXIpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldE5lc3RhYmxlUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBmTmVzdGFibGVQcmVmaXhlczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0YWJsZShTdHJpbmcgdGFnTmFtZSkgewotCQkvL0l0ZXJhdG9yIGJsb2NrcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCS8vd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQkvLwlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcilibG9ja3MubmV4dCgpOwotCQkvLwlTdHJpbmcgbWFya2VyTmFtZSA9IG1hcmtlci5nZXRUYWdOYW1lKCk7Ci0JCS8vCWlmKHRhZ05hbWUubGVuZ3RoKCkgPiBtYXJrZXJOYW1lLmxlbmd0aCgpICsgMSAmJiB0YWdOYW1lLnN0YXJ0c1dpdGgobWFya2VyTmFtZSkgJiYgdGFnTmFtZS5jaGFyQXQobWFya2VyTmFtZS5sZW5ndGgoKSkgPT0gJzonKSB7Ci0JCS8vCQlyZXR1cm4gbWFya2VyLmlzR2xvYmFsKCkgfHwgZ2V0T2Zmc2V0KCkgPj0gbWFya2VyLmdldE1hcmtlcigpLmdldFN0YXJ0KCk7Ci0JCS8vCX0KLQkJLy99Ci0JCS8vcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlTmVzdGFibGVQcmVmaXgoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGZOZXN0YWJsZVByZWZpeGVzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIG5lc3RhYmxlcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobmVzdGFibGVzLmhhc05leHQoKSkgewotCQkJCWlmICgoKFRhZ01hcmtlcikgbmVzdGFibGVzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJCW5lc3RhYmxlcy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQkJaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQkJYmxvY2tzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbnVsbCwgZW5kVGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIGVuZFR5cGVzLCBudWxsKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVHlwZSkgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbmV3IFN0cmluZ1tde2VuZFR5cGV9LCBudWxsKTsKLQl9Ci0JLyoqCi0JICogIHVzZXIgbWV0aG9kIAotCSAqIAotCSAqIEFzc2VtYmxlcyBhbiBlbWJlZGRlZCBjb250YWluZXIgYmVnaW5uaW5nIHdpdGggdGhlIGdpdmVuIHN0YXJ0VHlwZSBhcwotCSAqIHRoZSBmaXJzdCBDb250ZXh0UmVnaW9uIHdpdGhpbiBpdCBhbmQgb2YgdGhlIHR5cGUgZkVtYmVkZGVkSGludC4gIFRoZQotCSAqIGVuZFR5cGVzW10gYXJyYXkgY29udGFpbnMgdGhlIGNvbnRleHQgdHlwZXMgdGhhdCB3aWxsIGNhdXNlIGEgc3VjY2Vzc2Z1bAotCSAqIGV4aXQuICBVc2Ugb2YgdGhlIGVuZFRhZ05hbWUgcGFyYW1ldGVyIGFsdGVycyB0aGlzIGJlaGF2aW9yIHRvIGZvcmNlIGFuCi0JICogZXhpdCBvbiBhbiBYTUxfVEFHX0NMT1NFIGFmdGVyIHNlZWluZyBhbiBYTUxfVEFHX05BTUUgd2hvc2Ugc2lnbmlmaWNhbnQKLQkgKiB0ZXh0IG1hdGNoZXMgdGhlIGVuZFRhZ05hbWUgU3RyaW5nLiAgQWxsIGNvbnRlbnRzIGluIGJldHdlZW4gYXJlCi0JICogaW5zaWduaWZpY2FudCwgYW5kIHllcywgdGhpcyBtZWFucyBjb21tZW50cyBhcmUgYWxsb3dlZCBpbnNpZGUuCi0JICoqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzLCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQkvLyB0aGUgY29udGV4dCBvZiB0aGUgcmVnaW9uIGJlaW5nIGFkZGVkIHRvIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJaW50ZXJuYWxDb250ZXh0ID0gc3RhcnRUeXBlOwotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHRoaXMgY29udGFpbmVyIGJlZ2FuOyB0byBwcm92aWRlIHJlbGF0aXZlIGluZGVjZXMgZm9yIHRoZSByZWdpb25zCi0JCWludCBjb250YWluZXJTdGFydCA9IHl5Y2hhcjsKLQkJYm9vbGVhbiBub3RGaW5pc2hlZCA9IHRydWU7Ci0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgd2Ugc2VlbSB0byBiZSBzbyB0aGF0IHRoZSBlbmRUYWdOYW1lIGNhbiBiZSBjaGVja2VkCi0JCWJvb2xlYW4gaXNJbkVuZFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGlzSW5GaXJzdFRhZyA9IHRydWU7Ci0JCS8vIGNyZWF0ZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyIGFuZCBzZXR1cCBpdHMgInR5cGUiCi0JCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKGZFbWJlZGRlZEhpbnQpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KGNvbnRhaW5lclN0YXJ0KTsKLQkJCS8vIFRPRE86IHBhcmVudCByZWdpb24gbmVlZHMgdG8gYmUgc2V0IC4uLi4gYnV0IG5vdCBzdXJlIHdoZXJlIHRvIGdldCBpdCBmcm9tIAotCQkJLy8JCWZFbWJlZGRlZENvbnRhaW5lci5zZXRQYXJlbnQocGFyZW50UmVnaW9uKTsKLQkJfQotCQljb250YWluZXJTdGFydCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpOwotCQl3aGlsZSAobm90RmluaXNoZWQpIHsKLQkJCS8vIGFkZCB0aGUgcmVnaW9uIHRvIHRoZSBjb250YWluZXIKLQkJCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgewotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJLy8gbG9uZ3NjYW4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGF0dGVtcHQgYSBibG9ja1RhZ1NjYW4gd2l0aGluIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJCQlib29sZWFuIGxvbmdzY2FuID0gZmFsc2U7Ci0JCQkJLy8gc2F2ZSB0aGUgdG9rZW5pemVyIHN0YXRlIGluIGNhc2Ugb2YgYSBibG9jayB0YWcgc2NhbgotCQkJCWludCBwcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOwotCQkJCVN0cmluZyBwcmV2aW91c0N1cnJlbnRUYWdOYW1lID0gZkN1cnJlbnRUYWdOYW1lOwotCQkJCWludCBwcmV2aW91c1Bvc3RTdGF0ZSA9IGZFbWJlZGRlZFBvc3RTdGF0ZTsKLQkJCQlTdHJpbmcgcHJldmlvdXNFbWJlZGRlZEhpbnQgPSBmRW1iZWRkZWRIaW50OwotCQkJCS8vIGRldGVybWluZSBpZiBhIGJsb2NrIHRhZyBzY2FuIGlzIG5lY2Vzc2FyeQotCQkJCWlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCQkJCWludGVybmFsVGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJCQlpZighaXNOZXN0YWJsZShpbnRlcm5hbFRhZ05hbWUpKSB7Ci0JCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCQkJCQkJLy8gc25hZ2dlZCBhIHRhZyBuYW1lIHdlIHNob3VsZG4ndCBoYXZlCi0JCQkJCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9BQk9SVF9FTUJFRERFRDsKLQkJCQkJCW5vdEZpbmlzaGVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfT1BFTiB8fCBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCQkJCX0KLQkJCQkvLyBkbyB1cGtlZXAgZm9yIGVuZFRhZ05hbWUgdXNhZ2U7IG11c3QgYmUgaGVyZSBzaW5jZSB0aGUgbmV4dCB0b2tlbiBjb3VsZCBiZSB0aGUgY2xvc2UKLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaXNJbkVuZFRhZyA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgewotCQkJCQlpc0luRmlyc3RUYWcgPSBpc0luRW5kVGFnID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkgCUlUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZFJlZ2lvbnMgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQkJCQlpZiAoZW1iZWRkZWRSZWdpb25zLnNpemUoKSA+IDIgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfQ0xPU0UgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKSAtIDMpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19PUEVOICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY29udGFpbnNUYWdOYW1lKGludGVybmFsVGFnTmFtZSkpIHsKLQkJCQkJCQlsb25nc2NhbiA9IHRydWU7Ci0JCQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxvbmdzY2FuKQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBpbnRlcm5hbFRhZ05hbWU7Ci0JCQkJLy8gcmVhZCB0aGUgbmV4dCByZWdpb24gYW5kIGNvbnRleHQKLQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJaWYgKGxvbmdzY2FuKSB7Ci0JCQkJCS8vIFJldHVybmluZyBmcm9tIGEgYmxvY2sgdGFnIHNjYW4gcmVxdWlyZXMgcmVzdG9yaW5nIHNvbWUgc3RhdGUgdmFyaWFibGVzCi0JCQkJCS8vIGFzIHdlbGwgYXMgaGFuZGxpbmcgdGhlIGJsb2NrIHJlZ2lvbiBhbmQgc2V0dGluZyB1cCBmb3Igbm9ybWFsIHNjYW5uaW5nCi0JCQkJCS8vIGluc2lkZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyBuZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCQkJbG9uZ3NjYW4gPSBmYWxzZTsKLQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gcHJldmlvdXNQb3N0U3RhdGU7Ci0JCQkJCWZFbWJlZGRlZEhpbnQgPSBwcmV2aW91c0VtYmVkZGVkSGludDsKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gcHJldmlvdXNDdXJyZW50VGFnTmFtZTsKLQkJCQkJeXliZWdpbihwcmV2aW91c1N0YXRlKTsKLQkJCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwcmltR2V0TmV4dFRva2VuKCkgY2FsbHMgbWF5IHRocm93IGFuIElPRXhjZXB0aW9uCi0JCQkJLy8gY2F0Y2ggYW5kIGRvIG5vdGhpbmcgc2luY2UgdGhlIGlzRU9GIGNoZWNrIGJlbG93Ci0JCQkJLy8gd2lsbCBwcm9wZXJseSBleGl0IGlmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZikgewotCQkJCS8vIHNvbWUgb3RoZXIgZXhjZXB0aW9uIGhhcHBlbmVkOyBuZXZlciBzaG91bGQKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGYpOwotCQkJfQotCQkJYm9vbGVhbiBpc0VuZGluZ1R5cGUgPSB5eXN0YXRlKCkgPT0gU1RfQUJPUlRfRU1CRURERUQ7Ci0JCQlpZighaXNFbmRpbmdUeXBlKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGVuZGluZyBjb250ZXh0Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpc0VuZGluZ1R5cGUgPSBpc0VuZGluZ1R5cGUgfHwgKGludGVybmFsQ29udGV4dCA9PSBlbmRUeXBlc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlzRW5kaW5nVHlwZSA9ICgoaXNJbkVuZFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgfHwgKGlzSW5GaXJzdFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VNUFRZX1RBR19DTE9TRSkpICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsICYmIGludGVybmFsVGFnTmFtZS5lcXVhbHMoZW5kVGFnTmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkTGlzdCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCQlub3RGaW5pc2hlZCA9IG5vdEZpbmlzaGVkICYmICgoIWlzRW5kaW5nVHlwZSkgJiYgIWlzRU9GKCkgJiYgKGVuZFRhZ05hbWUgIT0gbnVsbCB8fCBpbnRlcm5hbENvbnRleHQgIT0gVU5ERUZJTkVEKSAmJiAhKGludGVybmFsQ29udGV4dCA9PSBQUk9YWV9DT05URVhUICYmIChlbWJlZGRlZExpc3QuZ2V0KGVtYmVkZGVkTGlzdC5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBVTkRFRklORUQpKTsKLQkJfQotCQkvLyBmaW5pc2ggYWRkaW5nIHRoZSBsYXN0IGNvbnRleHQKLQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCS8vbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOwotCQl9Ci0JCXl5YmVnaW4oZkVtYmVkZGVkUG9zdFN0YXRlKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsKLQkJcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuYWxsb3dzSlNQKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuZ2V0Q29udGV4dCgpOwotCQl9Ci0JCXJldHVybiBCTE9DS19URVhUOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOwotCX0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcigpIHsKLQkJcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjb250YWluc1RhZ05hbWUodGFnTmFtZSk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJYmVnaW5CbG9ja01hcmtlclNjYW4obmV3VGFnTmFtZSwgQkxPQ0tfVEVYVCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotCSAqIHN0YXJ0IG9mIGEgdGV4dCBibG9jayB3aXRoaW4gYSAibmV3VGFnTmFtZSIgdGFnLgotCSAqCi0JICogRXhhbXBsZTogCi0JICoJVG9rZW5pemVyIHRva2VyID0gbmV3IFRva2VuaXplcigpOwotCSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7Ci0JICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotCSAqCXRva2VyLmJlZ2luQmxvY2tNYXJrZXJTY2FuKCJzY3JpcHQiLCBCTE9DS19URVhUKTsKLQkgKgl0b2tlci5nZXRSZWdpb25zKCk7IAotCSAqCi0JICogUmV0dXJuczoKLQkgKglCTE9DS19URVhUOiAwLTQwCi0JICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLQkgKglYTUxfVEFHX05BTUU6IDQzLTQ4Ci0JICoJWE1MX1RBR19DTE9TRTogNDktNDkKLQkgKglYTUxfQ09OVEVOVDogNTAtNTcKLQkgKgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOwotCX0KLQotLyoqCi0gKiBNZXRob2QgZG9TY2FuLgotICogCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcgotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcKLSAqIAotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIgotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicKLSAqIEBwYXJhbSBhbGxvd0pTUCAtIGNoZWNrIGZvciBhbmQgYWxsb3cgZm9yIEpTUCBtYXJrdXAgPCUlPgotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkKLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MKLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCS8vIENoZWNrIGZvciBKU1Agc3RhcnRzICgiPCUiKSBpZiB0aGUgdGFnIGlzIGdsb2JhbCBsaWtlIFNDUklQVCBvciBTVFlMRQotCWJvb2xlYW4gY2hlY2tKU1BzID0gYWxsb3dKU1AgJiYgIWZGb3JiaWRKU1A7Ci0JYm9vbGVhbiBjaGVja2VkRm9ySlNQc09uY2UgPSAhY2hlY2tKU1BzOwotCWJvb2xlYW4gY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IGZhbHNlOwotCQotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLS8vCQljID0gKGNoYXIpIG47Ci0JCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuCi0JCWlmIChuID09IFlZRU9GICYmIGNoZWNrZWRGb3JKU1BzT25jZSkgewotCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCS8qKgotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgSlNQcyAiPCUiCi0JCQkgKi8KLQkJCWNoZWNrZWRGb3JKU1BzT25jZSA9IHRydWU7Ci0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoIDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgSlNQcwotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLgotCQkJaWYoY2hlY2tKU1BzICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiAKLQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICsgMV0gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGpzcHN0YXJ0ZXIubGVuZ3RoIDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgSlNQIDIgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0Ci0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4KLQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9jdXJyZW50UG9zID4gMCAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYKLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAzKSB5eV9jdXJyZW50UG9zLi4oeXlfY3VycmVudFBvcytqc3BTdGFydGxlbmd0aC0xKSA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiAhY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJgotCQkJCQl5eV9zdGFydFJlYWQgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCArIDFdID09ICclJykgewotCQkJCWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSB0cnVlOwotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCi0KLQkJCS8qKgotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgQ0RBVEEgIjwhW0NEQVRBWyIKLQkJCSAqLwotCQkJLy8gMSkgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgQ0RBVEEKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBDREFUQSBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPFshQ0RBVEFbXV0+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0vKgkJCWlmKGNoZWNrQ0RBVEEgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zICsgc2VhcmNoU3RyaW5nTGVuZ3RoIDwgeXlfYnVmZmVyLmxlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIAotCQkJCWNoYXJzTWF0Y2goY2RhdGFTdGFydGVyLCB5eV9idWZmZXIsIDAsIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGgpKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQkvLyBnbyB0byBhIHN0YXRlIHdoZXJlIENEQVRBIGNhbiBiZSBmb3VuZAotCQkJCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShzZWFyY2hDb250ZXh0KTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KHl5Y2hhcik7Ci0JCQkJfQotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oc2VhcmNoQ29udGV4dCwgeXljaGFyLCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCVN0cmluZyBjb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCWlmKGNvbnRleHQuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOKSkgewotCQkJCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOLCBYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfQ0xPU0UpOwotCQkJCX0KLQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLSovLyoKLQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBjZGF0YVN0YXJ0ZXIubGVuZ3RoOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBDREFUQSByaWdodCBoZXJlIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndAotCQkJLy8gc3BpbGwgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2hpbGUgY2hlY2tpbmcuCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJgotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLgotCQkJZWxzZSBpZihjaGVja0NEQVRBICYmICFjaGVja2VkRm9yQ0RBVEFPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7Ci0JCQkJY2hlY2tlZEZvckNEQVRBT25jZSA9IHRydWU7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0qLwotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXIKLQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcwotCQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2FtZSA9IHRydWU7Ci0JCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3NlcwotCQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsKLQkJCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdwotCQkJCWVsc2UgewotCQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNhbWUgJiYgcmVxdWlyZVRhaWxTZXBhcmF0b3IgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gKLQkJCQkvLyAiPC9zY3JpcHRTIgotCQkJCWxhc3RDaGVja0NoYXIgPSB5eV9idWZmZXJbeXlfY3VycmVudFBvc107Ci0JCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICIKLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQotCQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSAhc2FtZSB8fCAoeXlfY3VycmVudFBvcyA8IHl5X3N0YXJ0UmVhZCArIHNlYXJjaFN0cmluZ0xlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgewotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0Ci0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7Ci0JCXl5X2N1cnJlbnRQb3MrKzsKLQl9Ci0JeXliZWdpbihleGl0U3RhdGUpOwotCS8vIElmIHRoZSBlbmRpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpCi0JCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUKLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCk7Ci0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOwotfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkKLQkgKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotCSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4KLQkgKgotCSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLQkgKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLgotCSAqCi0JICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLQkgKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJLy8gbG9hZCB0aGUgc3RhcnRpbmcgbm9uLXdoaXRlc3BhY2UgdG9rZW4gKGFzc3VtZSB0aGF0IGl0IGlzIHNvKQotCQlpZiAoZlNob3VsZExvYWRCdWZmZXJlZCkgewotCQkJaWYgKGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBjb250YWluZXIgPSBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lcjsKLQkJCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQl9Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCWlmIChjb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsKLQkJCQlyZXR1cm4gZkVtYmVkZGVkQ29udGFpbmVyOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX1JPT1RfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJCWVsc2UKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJCX0KLQkJCXN0YXJ0ID0geXljaGFyOwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQlpZiAoeXlfYXRFT0YpIHsKLQkJCQlmVG9rZW5Db3VudCsrOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuCi0JCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJaWYgKGZfY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7Ci0JCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IGZFbWJlZGRlZENvbnRhaW5lcjsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQllbHNlCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlmQnVmZmVyZWRDb250ZXh0ID0gZl9jb250ZXh0OwotCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7Ci0JCWlmIChmQnVmZmVyZWRDb250ZXh0ID09IFdISVRFX1NQQUNFKSB7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCQlsZW5ndGggKz0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQl9Ci0JCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJCS8vIEVPRgotCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZlRva2VuQ291bnQrKzsKLQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIEpTUFRva2VuaXplcigpewotCQlzdXBlcigpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCQl0aGlzKG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgewotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXksIGludCBuZXdPZmZzZXQpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCAwKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgbmV3T2Zmc2V0KTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbikgewotCQlyZXNldChpbiwgMCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kICoKLQkgKgotCSAqIFJlc2V0IGludGVybmFsIGNvdW50ZXJzIGFuZCB2YXJzIHRvICJuZXdseSBjcmVhdGVkIiB2YWx1ZXMsIGluIHRoZSBob3BlcwotCSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBjb250YWlucyBjb2RlIGJsb2NrcyB0aGF0IHdlcmUgZXNzZW50aWFsbHkgZHVwbGljYXRlZCBmcm9tIHRoZQotCSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLQkgKiBhZGRlZC4gIFRob3NlIGNvZGUgYmxvY2tzIHdlcmUgdW5kZXIgdGhlIGFib3ZlIGNvcHlyaWdodC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzZXR0aW5nIHRva2VuaXplciIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlmT2Zmc2V0ID0gbmV3T2Zmc2V0OwotCQotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXl5X3JlYWRlciA9IGluOwotCQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXl5X3N0YXRlID0gMDsKLQkKLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCQotCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQkKLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJeXlfbWFya2VkUG9zID0gMDsKLQkKLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCQotCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfY3VycmVudFBvcyA9IDA7Ci0JCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9zdGFydFJlYWQgPSAwOwotCQotCQkvKiogCi0JCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkgKiBmcm9tIGlucHV0IAotCQkgKi8KLQkJeXlfZW5kUmVhZCA9IDA7Ci0JCi0JCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWxpbmUgPSAwOwotCQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXljaGFyID0gMDsKLQkKLQkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCQl5eV9hdEVPRiA9IGZhbHNlOwotCQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQkKLQkKLQkJLyogdXNlciB2YXJzOiAqLwotCQlmVG9rZW5Db3VudCA9IDA7Ci0JIAotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQlmQnVmZmVyZWRTdGFydCA9IDE7Ci0JCWZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JCi0JCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7Ci0JCi0JCWNvbnRleHQgPSBudWxsOwotCQlzdGFydCA9IDA7Ci0JCXRleHRMZW5ndGggPSAwOwotCQlsZW5ndGggPSAwOwotCQotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkKLQkJZkVMbGV2ZWwgPSAwOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICogQHNlZSBjb20uaWJtLnNlZC5wYXJzZXIuQmxvY2tUb2tlbml6ZXIjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpIHsKLQkJSlNQVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IEpTUFRva2VuaXplcigpOwotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIAotCQkvLyBhcmUgbmV2ZXIgZGVzdHJveWVkIChlLmcuICdyZWxlYXNlJykKLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsKLQkJCWlmKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOwotCQl9Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBmTmVzdGFibGVQcmVmaXhlcy5zaXplKCk7IGkrKykgewotCQkJVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpIGZOZXN0YWJsZVByZWZpeGVzLmdldChpKTsKLQkJCWlmKG1hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZE5lc3RhYmxlUHJlZml4KG1hcmtlcik7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCQkvLyAgIFhNTF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCQlyZXR1cm4gZG9TY2FuKCItLT4iLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgWE1MX0NPTU1FTlRfVEVYVCwgU1RfWE1MX0NPTU1FTlRfRU5ELCBTVF9YTUxfQ09NTUVOVF9FTkQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5KU1BDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNjYW4gZm9yICctLSU+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkJLy8gICBKU1BfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkJLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9KU1BfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQkJcmV0dXJuIGRvU2NhbigiLS0lPiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgSlNQX0NPTU1FTlRfVEVYVCwgU1RfSlNQX0NPTU1FTlRfRU5ELCBTVF9KU1BfQ09NTUVOVF9FTkQpOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzI4OTAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCA3MTgwKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTM3NikgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3IKLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShjaGFyW10gbWFya2VyVGFnTmFtZSwgaW50IG9mZnNldCwgaW50IHRhZ25hbWVMZW5ndGgpIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBqKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgPT0gdGFnbmFtZUxlbmd0aCkgewotCQkJCWJvb2xlYW4gbWF0Y2hlc1NvRmFyID0gdHJ1ZTsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgewotCQkJCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpICE9IG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXRjaGVzU29GYXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqCi0JICogUmV0dXJuIEFMTCBvZiB0aGUgcmVnaW9ucyBzY2FubmFibGUgd2l0aGluIHRoZSByZW1haW5pbmcgdGV4dAotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlCi0JICovCi0JcHVibGljIGZpbmFsIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCXdoaWxlKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbmNlIHRoaXMgaXMgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBOT1QgdGhlIHJlY29tbWVuZGVkIAotCQkJLy8gd2F5IG9mIGdldHRpbmcgdG9rZW5zLCBtYW55IGVycm9ycyBhcmUgc2ltcGx5IGhpZGRlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcChTdHJpbmcgcykgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJKHl5bGVuZ3RoKCkgKyB5eWNoYXIpICsgIik6XCciICsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1V0aWxzLmVzY2FwZSh5eXRleHQoKSkgKyAiXCciKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgIC0gc2tlbGV0b24uc2VkICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLwotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKFN0cmluZyBtYXJrZXJUYWdOYW1lKSB7Ci0JSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2IKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIHl5X3B1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotICAgICAgeXlfd2FzX3B1c2hiYWNrID0gZmFsc2U7Ci0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIGludCB5eV9uZXh0ID0geXl0cmFuc1sgeXlfcm93TWFwW3l5X3N0YXRlXSArIHl5Y21hcFt5eV9pbnB1dF0gXTsKLSAgICAgICAgICBpZiAoeXlfbmV4dCA9PSAtMSkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIHl5X3N0YXRlID0geXlfbmV4dDsKLQotICAgICAgICAgIGludCB5eV9hdHRyaWJ1dGVzID0gWVlfQVRUUklCVVRFW3l5X3N0YXRlXTsKLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMikgPiAwICkKLSAgICAgICAgICAgIHl5X3B1c2hiYWNrUG9zID0geXlfY3VycmVudFBvczsKLQotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAxKSA+IDAgKSB7Ci0gICAgICAgICAgICB5eV93YXNfcHVzaGJhY2sgPSAoeXlfYXR0cmlidXRlcyAmIDQpID4gMDsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID4gMCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfd2FzX3B1c2hiYWNrKQotICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvczsKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSA1Nzg6IAotICAgICAgICBjYXNlIDU4MzogCi0gICAgICAgIGNhc2UgNTkwOiAKLSAgICAgICAgY2FzZSA1OTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImpzcCBkaXJlY3RpdmUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2MTE6IGJyZWFrOwotICAgICAgICBjYXNlIDU0MjogCi0gICAgICAgIGNhc2UgNTQ0OiAKLSAgICAgICAgY2FzZSA1NDU6IAotICAgICAgICBjYXNlIDU0NjogCi0gICAgICAgIGNhc2UgNTQ3OiAKLSAgICAgICAgY2FzZSA1NDg6IAotICAgICAgICBjYXNlIDU0OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JeXliZWdpbihTVF9DREFUQV9URVhUKTsKLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47Ci0gfQotICAgICAgICBjYXNlIDYxMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJqc3A6cm9vdCB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBKU1BfUk9PVF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjEzOiBicmVhazsKLSAgICAgICAgY2FzZSA1MjY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2MTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDUyNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDYxNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTI0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjE2OiBicmVhazsKLSAgICAgICAgY2FzZSA1MTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQzsKLSB9Ci0gICAgICAgIGNhc2UgNjE3OiBicmVhazsKLSAgICAgICAgY2FzZSA1MDk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTTsKLSB9Ci0gICAgICAgIGNhc2UgNjE4OiBicmVhazsKLSAgICAgICAgY2FzZSA1MDM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2MTk6IGJyZWFrOwotICAgICAgICBjYXNlIDQ4MTogCi0gICAgICAgIGNhc2UgNTE5OiAKLSAgICAgICAgY2FzZSA1MjA6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDYyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDc2OiAKLSAgICAgICAgY2FzZSA1MTU6IAotICAgICAgICBjYXNlIDUxNjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2MjE6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5KU1AgY29tbWVudCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIEpTUF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2MjI6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3MTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsKLQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pCi0JCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2MjM6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2MDogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJWQkwgaW4gYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCWZFTGxldmVsKys7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDYyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU5OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkVMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCWZFTGxldmVsKys7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2MjU6IGJyZWFrOwotICAgICAgICBjYXNlIDQ1NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDYyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDUxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT01NRU5UX1RFWFQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0NPTU1FTlQ7Ci0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47Ci0gfQotICAgICAgICBjYXNlIDYyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDUwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOwotCXJldHVybiBKU1BfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2Mjg6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjI5OiBicmVhazsKLSAgICAgICAgY2FzZSAzODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjMwOiBicmVhazsKLSAgICAgICAgY2FzZSAzODE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2MzE6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MDogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAyKTsKLQlmRUxsZXZlbCsrOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIEpTUF9WQkxfQ0xPU0UpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDYzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2MzM6IGJyZWFrOwotICAgICAgICBjYXNlIDM3ODogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOwotCWZFTGxldmVsKys7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBKU1BfRUxfQ0xPU0UpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDYzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDYzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY5OiAKLSAgICAgICAgY2FzZSA0MDY6IAotICAgICAgICBjYXNlIDQxMjogCi0gICAgICAgIGNhc2UgNDE4OiAKLSAgICAgICAgY2FzZSA0MjE6IAotICAgICAgICBjYXNlIDQyNDogCi0gICAgICAgIGNhc2UgNDI3OiAKLSAgICAgICAgY2FzZSA0MzE6IAotICAgICAgICBjYXNlIDQzNTogCi0gICAgICAgIGNhc2UgNDM3OiAKLSAgICAgICAgY2FzZSA0NDA6IAotICAgICAgICBjYXNlIDQ0MzogCi0gICAgICAgIGNhc2UgNDQ3OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBleHByZXNzaW9uIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGFuIGV4cHJlc3Npb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9FWFBSRVNTSU9OX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRVhQUkVTU0lPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2MzY6IGJyZWFrOwotICAgICAgICBjYXNlIDM2ODogCi0gICAgICAgIGNhc2UgNDA1OiAKLSAgICAgICAgY2FzZSA0MTE6IAotICAgICAgICBjYXNlIDQxNzogCi0gICAgICAgIGNhc2UgNDIwOiAKLSAgICAgICAgY2FzZSA0MjM6IAotICAgICAgICBjYXNlIDQyNjogCi0gICAgICAgIGNhc2UgNDMwOiAKLSAgICAgICAgY2FzZSA0MzQ6IAotICAgICAgICBjYXNlIDQzNjogCi0gICAgICAgIGNhc2UgNDM5OiAKLSAgICAgICAgY2FzZSA0NDI6IAotICAgICAgICBjYXNlIDQ0NjogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZGVjbGFyYXRpb24gYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSBkZWNsYXJhdGlvbiBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9ERUNMQVJBVElPTl9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ERUNMQVJBVElPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2Mzc6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NzogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJcmV0dXJuIEpTUF9ESVJFQ1RJVkVfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZGlyZWN0aXZlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RJUkVDVElWRV9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0RJUkVDVElWRV9DTE9TRSwgSlNQX0NMT1NFfSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDYzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU3OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDYzOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzUzOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzUxOiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsKys7Ci0JaWYoZkVMbGV2ZWwgPT0gMSkgewotCQlyZXR1cm4gSlNQX1ZCTF9PUEVOOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjQxOiBicmVhazsKLSAgICAgICAgY2FzZSAzNDE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFU19FTkQpOwotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM3OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NDM6IGJyZWFrOwotICAgICAgICBjYXNlIDMzNTogCi0gICAgICAgICAgeyAKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihKU1BfRUxfQ09OVEVOVCsgIjpbIiArIHl5dGV4dCgpICsgIl0iKTsKLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM0OiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsKys7Ci0JaWYoZkVMbGV2ZWwgPT0gMSkgewotCQlyZXR1cm4gSlNQX0VMX09QRU47Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NDU6IGJyZWFrOwotICAgICAgICBjYXNlIDMzMTogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9EUVVPVEVEX1ZCTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQ2OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzA6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBFTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQ3OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjg6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9WQkwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY0ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI3OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfRUwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY0OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI2OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGVuZCB0YWciKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX0VORF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkKLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjUwOiBicmVhazsKLSAgICAgICAgY2FzZSAyODQ6IAotICAgICAgICBjYXNlIDI5NjogCi0gICAgICAgIGNhc2UgMzAyOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ7Ci0gfQotICAgICAgICBjYXNlIDY1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcyOiAKLSAgICAgICAgICB7IAotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOwotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldAotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOwotCWlmKCFpc05lc3RhYmxlKHRhZ05hbWUpKSB7Ci0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsKLQl9Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0Ci0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NTI6IGJyZWFrOwotICAgICAgICBjYXNlIDI3MDogCi0gICAgICAgICAgeyAKLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsKLQkvLyBwdXNoYmFjayB0byBqdXN0IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNrZXQKLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsKLQlpZighaXNOZXN0YWJsZSh0YWdOYW1lKSkgewotCQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JCXJldHVybiBYTUxfVEFHX09QRU47Ci0JfQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFhNTF9UQUdfT1BFTiwgdGFnTmFtZSk7IC8vID8KLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NTM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2ODogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY1NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI1OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCk7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBkb3VibGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJAotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NTU6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMzogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgdGFnIGVtYmVkZGVkIG5hbWUgc3RhcnQgLSBzdGFydCB0YWciKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NTY6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMjogCi0gICAgICAgIGNhc2UgMTI3OiAKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICBjYXNlIDI3NDogCi0gICAgICAgIGNhc2UgMjc4OiAKLSAgICAgICAgY2FzZSAyNzk6IAotICAgICAgICBjYXNlIDM4ODogCi0gICAgICAgIGNhc2UgMzkxOiAKLSAgICAgICAgY2FzZSA0NTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNjU4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NTk6IGJyZWFrOwotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgIGNhc2UgMzg3OiAKLSAgICAgICAgY2FzZSA0NTc6IAotICAgICAgICBjYXNlIDQ4NTogCi0gICAgICAgIGNhc2UgNDg2OiAKLSAgICAgICAgY2FzZSA1MDQ6IAotICAgICAgICBjYXNlIDUwNTogCi0gICAgICAgIGNhc2UgNTIyOiAKLSAgICAgICAgY2FzZSA1MjM6IAotICAgICAgICBjYXNlIDUzNTogCi0gICAgICAgIGNhc2UgNTQzOiAKLSAgICAgICAgY2FzZSA1NTA6IAotICAgICAgICBjYXNlIDU1MTogCi0gICAgICAgIGNhc2UgNTUyOiAKLSAgICAgICAgY2FzZSA1NTM6IAotICAgICAgICBjYXNlIDU1NTogCi0gICAgICAgIGNhc2UgNTYxOiAKLSAgICAgICAgY2FzZSA1NjI6IAotICAgICAgICBjYXNlIDU2MzogCi0gICAgICAgIGNhc2UgNTY0OiAKLSAgICAgICAgY2FzZSA1NjU6IAotICAgICAgICBjYXNlIDU3MTogCi0gICAgICAgIGNhc2UgNTcyOiAKLSAgICAgICAgY2FzZSA1NzM6IAotICAgICAgICBjYXNlIDU3NDogCi0gICAgICAgIGNhc2UgNTc1OiAKLSAgICAgICAgY2FzZSA1ODE6IAotICAgICAgICBjYXNlIDU4MjogCi0gICAgICAgIGNhc2UgNTg0OiAKLSAgICAgICAgY2FzZSA1ODU6IAotICAgICAgICBjYXNlIDU5MTogCi0gICAgICAgIGNhc2UgNTkyOiAKLSAgICAgICAgY2FzZSA1OTM6IAotICAgICAgICBjYXNlIDU5NDogCi0gICAgICAgIGNhc2UgNjAwOiAKLSAgICAgICAgY2FzZSA2MDE6IAotICAgICAgICBjYXNlIDYwMjogCi0gICAgICAgIGNhc2UgNjAzOiAKLSAgICAgICAgY2FzZSA2MDY6IAotICAgICAgICBjYXNlIDYwNzogCi0gICAgICAgIGNhc2UgNjA5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlpZihpc0Jsb2NrTWFya2VyKCkpIHsKLQkJZkVtYmVkZGVkSGludCA9IGdldEJsb2NrTWFya2VyQ29udGV4dCgpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9CTE9DS19UQUdfU0NBTjsKLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCX0KLQllbHNlCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NjE6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgIGNhc2UgMTExOiAKLSAgICAgICAgY2FzZSAyNjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNjYyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDY2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjY0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBkaXJlY3RpdmUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFKTsKLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NjU6IGJyZWFrOwotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSA5OTogCi0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgY29kZSBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBkb1NjYW4oIiU+IiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCk7Ci0gfQotICAgICAgICBjYXNlIDY2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICBjYXNlIDk2OiAKLSAgICAgICAgY2FzZSA5NzogCi0gICAgICAgIGNhc2UgMjU0OiAKLSAgICAgICAgY2FzZSAyNTU6IAotICAgICAgICBjYXNlIDI1ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNjY3OiBicmVhazsKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA2Njg6IGJyZWFrOwotICAgICAgICBjYXNlIDkyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2Njk6IGJyZWFrOwotICAgICAgICBjYXNlIDkwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODQ6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSAyNDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNjcxOiBicmVhazsKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDY3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICBjYXNlIDIwMDogCi0gICAgICAgIGNhc2UgMjAxOiAKLSAgICAgICAgY2FzZSAyMDQ6IAotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgY2FzZSAyMTg6IAotICAgICAgICBjYXNlIDIxOTogCi0gICAgICAgIGNhc2UgMzYyOiAKLSAgICAgICAgY2FzZSAzNjU6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjczOiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgIGNhc2UgMTc5OiAKLSAgICAgICAgY2FzZSAxODA6IAotICAgICAgICBjYXNlIDE4MzogCi0gICAgICAgIGNhc2UgMTkzOiAKLSAgICAgICAgY2FzZSAxOTQ6IAotICAgICAgICBjYXNlIDE5NzogCi0gICAgICAgIGNhc2UgMTk4OiAKLSAgICAgICAgY2FzZSAzMzI6IAotICAgICAgICBjYXNlIDM0NjogCi0gICAgICAgIGNhc2UgMzQ5OiAKLSAgICAgICAgY2FzZSA0MTY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgY2FzZSAxNTk6IAotICAgICAgICBjYXNlIDE2MDogCi0gICAgICAgIGNhc2UgMzIyOiAKLSAgICAgICAgY2FzZSA0MTM6IAotICAgICAgICBjYXNlIDQ3MDogCi0gICAgICAgIGNhc2UgNDkzOiAKLSAgICAgICAgY2FzZSA1MTI6IAotICAgICAgICBjYXNlIDUyODogCi0gICAgICAgIGNhc2UgNTM3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY3NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDE1MjogCi0gICAgICAgIGNhc2UgMTUzOiAKLSAgICAgICAgY2FzZSAzMTI6IAotICAgICAgICBjYXNlIDQwNzogCi0gICAgICAgIGNhc2UgNDY4OiAKLSAgICAgICAgY2FzZSA0OTI6IAotICAgICAgICBjYXNlIDUxMTogCi0gICAgICAgIGNhc2UgNTI3OiAKLSAgICAgICAgY2FzZSA1MzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlpZighZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUR8fGZTdGF0ZVN0YWNrLnBlZWsoKT09U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpLTEpOwotCQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JfQotCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2Nzc6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAxMDQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA2Nzg6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgIGNhc2UgMTcwOiAKLSAgICAgICAgY2FzZSAxNzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDY3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMDogCi0gICAgICAgIGNhc2UgNTc6IAotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgIGNhc2UgMjI2OiAKLSAgICAgICAgY2FzZSAyMjg6IAotICAgICAgICBjYXNlIDIyOTogCi0gICAgICAgIGNhc2UgMjMxOiAKLSAgICAgICAgY2FzZSAyMzM6IAotICAgICAgICBjYXNlIDM3MjogCi0gICAgICAgIGNhc2UgMzczOiAKLSAgICAgICAgY2FzZSAzNzQ6IAotICAgICAgICBjYXNlIDQ1MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDEwMTogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAxMTk6IAotICAgICAgICBjYXNlIDEyOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5zdGFydCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2ODE6IGJyZWFrOwotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSA4ODogCi0gICAgICAgIGNhc2UgODk6IAotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5NTogCi0gICAgICAgIGNhc2UgMTAzOiAKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgY2FzZSAxMTU6IAotICAgICAgICBjYXNlIDEyNDogCi0gICAgICAgIGNhc2UgMTMxOiAKLSAgICAgICAgY2FzZSAxMzI6IAotICAgICAgICBjYXNlIDEzMzogCi0gICAgICAgIGNhc2UgMTM0OiAKLSAgICAgICAgY2FzZSAxMzY6IAotICAgICAgICBjYXNlIDEzNzogCi0gICAgICAgIGNhc2UgMTM5OiAKLSAgICAgICAgY2FzZSAxNDA6IAotICAgICAgICBjYXNlIDE0MTogCi0gICAgICAgIGNhc2UgMTQ0OiAKLSAgICAgICAgY2FzZSAxNDU6IAotICAgICAgICBjYXNlIDE0NjogCi0gICAgICAgIGNhc2UgMTQ5OiAKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICBjYXNlIDE1MTogCi0gICAgICAgIGNhc2UgMTU2OiAKLSAgICAgICAgY2FzZSAxNTc6IAotICAgICAgICBjYXNlIDE1ODogCi0gICAgICAgIGNhc2UgMTY0OiAKLSAgICAgICAgY2FzZSAxNjc6IAotICAgICAgICBjYXNlIDE3MjogCi0gICAgICAgIGNhc2UgMTczOiAKLSAgICAgICAgY2FzZSAxNzc6IAotICAgICAgICBjYXNlIDE3ODogCi0gICAgICAgIGNhc2UgMTg1OiAKLSAgICAgICAgY2FzZSAxODY6IAotICAgICAgICBjYXNlIDE4ODogCi0gICAgICAgIGNhc2UgMTg5OiAKLSAgICAgICAgY2FzZSAxOTU6IAotICAgICAgICBjYXNlIDE5OTogCi0gICAgICAgIGNhc2UgMjA2OiAKLSAgICAgICAgY2FzZSAyMDc6IAotICAgICAgICBjYXNlIDIwOTogCi0gICAgICAgIGNhc2UgMjEwOiAKLSAgICAgICAgY2FzZSAyMTY6IAotICAgICAgICBjYXNlIDIyMDogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiISEhdW5leHBlY3RlZCEhITogXCIiICsgeXl0ZXh0KCkgKyAiXCI6IiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl5eWNoYXIgKyAiLSIgKyAoeXljaGFyICsgeXlsZW5ndGgoKSkpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gVU5ERUZJTkVEOwotIH0KLSAgICAgICAgY2FzZSA2ODI6IGJyZWFrOwotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgdGV4dCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQlTdHJpbmcgcmV0dXJuZWRDb250ZXh0ID0gZG9TY2FuKCJdXT4iLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgWE1MX0NEQVRBX1RFWFQsIFNUX0NEQVRBX0VORCwgIFNUX0NEQVRBX0VORCk7Ly8kTk9OLU5MUy0xJAotCWlmKHJldHVybmVkQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkKLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOwotCXJldHVybiByZXR1cm5lZENvbnRleHQ7Ci0gfQotICAgICAgICBjYXNlIDY4MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDE4NzogCi0gICAgICAgIGNhc2UgMTkwOiAKLSAgICAgICAgY2FzZSAyMDg6IAotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg0OiBicmVhazsKLSAgICAgICAgY2FzZSA2OTogCi0gICAgICAgIGNhc2UgNzA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0gfQotICAgICAgICBjYXNlIDY4NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgY2FzZSA3NjogCi0gICAgICAgIGNhc2UgMjM5OiAKLSAgICAgICAgY2FzZSAyNDA6IAotICAgICAgICBjYXNlIDM4NDogCi0gICAgICAgIGNhc2UgNDU2OiAKLSAgICAgICAgY2FzZSA0ODQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY4NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7Ci0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg3OiBicmVhazsKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICBjYXNlIDgwOiAKLSAgICAgICAgICB7IAotCQkvLyBibG9jayBzY2FuIHVudGlsIGNsb3NlIGlzIGZvdW5kCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7Ci0gfQotICAgICAgICBjYXNlIDY4ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjY6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBjb21wbGV4IHNpbmdsZSBxdW90ZWQiKTsvLyROT04tTkxTLTEkCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTA6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjkxOiBicmVhazsKLSAgICAgICAgY2FzZSAxMzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjkyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMzg6IAotICAgICAgICBjYXNlIDE0MjogCi0gICAgICAgIGNhc2UgMjg5OiAKLSAgICAgICAgY2FzZSAyOTM6IAotICAgICAgICBjYXNlIDQwMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBwdWJsaWMgcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotIH0KLSAgICAgICAgY2FzZSA2OTM6IGJyZWFrOwotICAgICAgICBjYXNlIDE0MzogCi0gICAgICAgIGNhc2UgMTQ3OiAKLSAgICAgICAgY2FzZSAyOTk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgc3lzdGVtIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLSB9Ci0gICAgICAgIGNhc2UgNjk0OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDg6IAotICAgICAgICBjYXNlIDMwNTogCi0gICAgICAgIGNhc2UgMzA5OiAKLSAgICAgICAgY2FzZSA0MDM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2OTU6IGJyZWFrOwotICAgICAgICBjYXNlIDE1NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2OTY6IGJyZWFrOwotICAgICAgICBjYXNlIDE1NTogCi0gICAgICAgIGNhc2UgMzE1OiAKLSAgICAgICAgY2FzZSAzMTk6IAotICAgICAgICBjYXNlIDQwOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjk3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2OTg6IGJyZWFrOwotICAgICAgICBjYXNlIDE2NTogCi0gICAgICAgIGNhc2UgMTY2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkpTUCBjb21tZW50IHRleHQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSA2OTk6IGJyZWFrOwotICAgICAgICBjYXNlIDE2ODogCi0gICAgICAgIGNhc2UgMTc0OiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNzAwOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjk6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW5zaWRlIG9mIEpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JaWYoeXlzdGF0ZSgpICE9IFNUX0FCT1JUX0VNQkVEREVEKQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3MDE6IGJyZWFrOwotICAgICAgICBjYXNlIDE3MTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MDI6IGJyZWFrOwotICAgICAgICBjYXNlIDE3NjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MDM6IGJyZWFrOwotICAgICAgICBjYXNlIDE4MTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTKTsKLQlyZXR1cm4gSlNQX0VMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzA0OiBicmVhazsKLSAgICAgICAgY2FzZSAxODI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFUyk7Ci0JcmV0dXJuIEpTUF9FTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsLS07Ci0JaWYoZkVMbGV2ZWwgPT0gMCkgewotCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCXJldHVybiBKU1BfRUxfQ0xPU0U7Ci0JfQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzA2OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCXJldHVybiBKU1BfRUxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MDc6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JcmV0dXJuIEpTUF9FTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcwODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjAyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTKTsKLQlyZXR1cm4gSlNQX1ZCTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcxMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjAzOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTKTsKLQlyZXR1cm4gSlNQX1ZCTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcxMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA1OiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsLS07Ci0JaWYoZkVMbGV2ZWwgPT0gMCkgewotCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCXJldHVybiBKU1BfVkJMX0NMT1NFOwotCX0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MTI6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCXJldHVybiBKU1BfVkJMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzEzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTM6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlyZXR1cm4gSlNQX1ZCTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcxNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE3OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MTU6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9FTkRfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDcxNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9QSSk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzE3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjM6IAotICAgICAgICBjYXNlIDIzNDogCi0gICAgICAgIGNhc2UgMzExOiAKLSAgICAgICAgY2FzZSAzMjE6IAotICAgICAgICBjYXNlIDMyMzogCi0gICAgICAgIGNhc2UgMzMzOiAKLSAgICAgICAgY2FzZSAzMzg6IAotICAgICAgICBjYXNlIDM0MjogCi0gICAgICAgIGNhc2UgMzQ1OiAKLSAgICAgICAgY2FzZSAzNDg6IAotICAgICAgICBjYXNlIDM1MDogCi0gICAgICAgIGNhc2UgMzU0OiAKLSAgICAgICAgY2FzZSAzNTg6IAotICAgICAgICBjYXNlIDM2MTogCi0gICAgICAgIGNhc2UgMzY0OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBzY3JpcHRsZXQgYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMSk7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBmaW5pc2hlZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9TQ1JJUFRMRVRfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1NDUklQVExFVF9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA3MTg6IGJyZWFrOwotICAgICAgICBjYXNlIDIyNDogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47Ci0gfQotICAgICAgICBjYXNlIDcxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQxOiAKLSAgICAgICAgICB7IAotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlCi0JCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzIxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIEpTUF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzIzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzI0OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjI6IAotICAgICAgICBjYXNlIDE2MzogCi0gICAgICAgICAgeyAKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JIH0KLSAgICAgICAgY2FzZSA3MjU6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFza3MvSlNQVGFza1RhZ1NlZWtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YXNrcy9KU1BUYXNrVGFnU2Vla2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmU2ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YXNrcy9KU1BUYXNrVGFnU2Vla2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmJ1aWxkZXIuZGVsZWdhdGVzLlhNTFRhc2tUYWdTZWVrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0czsKLQotcHVibGljIGNsYXNzIEpTUFRhc2tUYWdTZWVrZXIgZXh0ZW5kcyBYTUxUYXNrVGFnU2Vla2VyIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmlzQ29tbWVudFJlZ2lvbihyZWdpb24sIHRleHRSZWdpb24pIHx8IHRleHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvTnVsbFN0cnVjdHVyZWREb2N1bWVudFBhcnRpdGlvbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvTnVsbFN0cnVjdHVyZWREb2N1bWVudFBhcnRpdGlvbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFlNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL051bGxTdHJ1Y3R1cmVkRG9jdW1lbnRQYXJ0aXRpb25lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQucnVsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5TdHJ1Y3R1cmVkVHlwZWRSZWdpb247Ci0KLS8qKgotICogVG8gYmUgdXNlZCB3aGVuIG5vIGtub3duIHBhcnRpdGlvbmVyIGlzIGF2YWlsYWJsZS4KLSAqIEFsd2F5cyByZXR1cm5zIHRoZSB1bmtub3duIHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsU3RydWN0dXJlZERvY3VtZW50UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0KLQlwdWJsaWMgY2xhc3MgTnVsbFN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBpbXBsZW1lbnRzIFN0cnVjdHVyZWRUeXBlZFJlZ2lvbiB7Ci0KLQkJcHJpdmF0ZSBpbnQgZk9mZnNldDsKLQotCQlwcml2YXRlIGludCBmTGVuZ3RoOwotCi0JCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJCWZUeXBlID0gdHlwZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCQlmTGVuZ3RoID0gbGVuZ3RoOwotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkJZk9mZnNldCA9IG9mZnNldDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiBmVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIGZMZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJCXJldHVybiBmT2Zmc2V0OwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVF9VTktOT1dOX1BBUlRJVElPTiA9ICJjb20uaWJtLnNzZS5VTktOT1dOX1BBUlRJVElPTl9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gbGVnYWxUeXBlcyA9IG5ldyBTdHJpbmdbXXtTVF9VTktOT1dOX1BBUlRJVElPTn07Ci0KLQlwdWJsaWMgTnVsbFN0cnVjdHVyZWREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFR5cGVkUmVnaW9uIGNyZWF0ZVBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcmVzdWx0ID0gbmV3IE51bGxTdHJ1Y3R1cmVkVHlwZWRSZWdpb24oKTsKLQkJcmVzdWx0LnNldE9mZnNldChvZmZzZXQpOwotCQlyZXN1bHQuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCXJlc3VsdC5zZXRUeXBlKHR5cGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBTVF9VTktOT1dOX1BBUlRJVElPTjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBsZWdhbFR5cGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIFNUX1VOS05PV05fUEFSVElUSU9OOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c05vZGUsIElUZXh0UmVnaW9uIHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlLCBJVGV4dFJlZ2lvbiBuZXh0RW5kVGFnTmFtZVJlZ2lvbikgewotCQlyZXR1cm4gU1RfVU5LTk9XTl9QQVJUSVRJT047Ci0JfQotCi0JcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlJVHlwZWRSZWdpb25bXSBhbHdheXNPbmUgPSBuZXcgSVR5cGVkUmVnaW9uW117Y3JlYXRlUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCBTVF9VTktOT1dOX1BBUlRJVElPTil9OwotCQlyZXR1cm4gYWx3YXlzT25lOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoaW50IG9mZnNldCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpOwotCX0KLQotCXB1YmxpYyBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGNyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIDEsIGdldERlZmF1bHQoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzE1MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmVuY29kaW5nLkpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0KLQlwcml2YXRlIGNsYXNzIFByZWZpeExpc3RlbmVyIGltcGxlbWVudHMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiB7Ci0JCS8vIHRyYWNrIHRoZSBsaXN0IG9mIHByZWZpeGVzIGludHJvZHVjZWQgYnkgdGFnbGliIGRpcmVjdGl2ZXMKLQkJcHJpdmF0ZSBMaXN0IGZDdXN0b21BY3Rpb25QcmVmaXhlcyA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZMYXN0VHJ1ZSA9IG51bGw7Ci0KLQkJcHVibGljIFByZWZpeExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJCWZDdXN0b21BY3Rpb25QcmVmaXhlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQlyZXNldE5vZGVzKCk7Ci0JCX0KLQotCQlwcml2YXRlIEpTUFNvdXJjZVBhcnNlciBnZXRUZXh0U291cmNlKCkgewotCQkJcmV0dXJuIChKU1BTb3VyY2VQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vZGVQYXJzZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQkJLy8gTGFyZ2VseSB0YWtlbiBmcm9tIHRoZSBUTERDTURvY3VtZW50TWFuYWdlcgotCQkJLy8gY291bGQgdGVzdCA+IDEsIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgaWYgdGhlcmUgYXJlIDggKDwlQCwKLQkJCS8vIHRhZ2xpYiwgdXJpLCA9LCB3aGVyZSwgcHJlZml4LCA9LCB3aGF0KSBbb3IgNCBmb3IgaW5jbHVkZXNdCi0JCQlpZiAoc2RSZWdpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiA0ICYmIHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCXRyeSB7Ci0JCQkJCWJvb2xlYW4gdGFibGliZGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBkaXJlY3RpdmVUYWdsaWJkZXRlY3RlZDsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbik7Ci0JCQkJCWludCB0ZXh0TGVuZ3RoID0gbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0KLQkJCQkJaWYgKGdldFRleHRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQl0YWJsaWJkZXRlY3RlZCA9IGdldFRleHRTb3VyY2UoKS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCQkJCQlkaXJlY3RpdmVUYWdsaWJkZXRlY3RlZCA9IGdldFRleHRTb3VyY2UoKS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5Ci0JCQkJCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IGdldFRleHRTb3VyY2UoKS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoKTsKLQkJCQkJCXRhYmxpYmRldGVjdGVkID0gZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQkJCQkJZGlyZWN0aXZlVGFnbGliZGV0ZWN0ZWQgPSBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCQkJfQotCQkJCQlpZiAodGFibGliZGV0ZWN0ZWQgfHwgZGlyZWN0aXZlVGFnbGliZGV0ZWN0ZWQpIHsKLQkJCQkJCXByb2Nlc3NUYWdsaWIoc2RSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJCS8vIElTU1VFOiB3aHkgaXMgdGhpcyAibm9ybWFsIiBoZXJlPwotCQkJCQkvL2RvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzVGFnbGliKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgcHJlZml4VmFsdWUgPSBudWxsOwotCQkJYm9vbGVhbiBwcmVmaXhuYW1lRGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJaW50IHRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCXByZWZpeG5hbWVEZXRlY3RlZCA9IGdldFRleHRTb3VyY2UoKS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlBSRUZJWCk7Ci0JCQkJCQkvL1N0cmluZyByZWdpb25UZXh0ID0KLQkJCQkJCS8vIGZUZXh0U291cmNlLmdldFRleHQoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgpOwotCQkJCQkJLy9wcmVmaXhuYW1lID0KLQkJCQkJCS8vIHJlZ2lvblRleHQuZXF1YWxzKEpTUDEyVExETmFtZXMuUFJFRklYKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcmVmaXhuYW1lRGV0ZWN0ZWQgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlwcmVmaXhWYWx1ZSA9IGdldFRleHRTb3VyY2UoKS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJcHJlZml4VmFsdWUgPSBudWxsOwotCQkJfQotCQkJaWYgKHByZWZpeFZhbHVlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJlZml4VGV4dCA9IFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeFZhbHVlKSArICI6IjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICghZkN1c3RvbUFjdGlvblByZWZpeGVzLmNvbnRhaW5zKHByZWZpeFRleHQpKSB7Ci0JCQkJCWlmKGRlYnVnUHJlZml4TGlzdGVuZXIgPT0gdHJ1ZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQLlByZWZpeExpc3RlbmVyIGxlYXJuaW5nIHByZWZpeDogIiArIHByZWZpeFRleHQpOwotCQkJCQl9Ci0JCQkJCWZDdXN0b21BY3Rpb25QcmVmaXhlcy5hZGQocHJlZml4VGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXROb2RlcygpIHsKLQkJCWZMYXN0VHJ1ZSA9IG51bGw7Ci0JCQlmQ3VzdG9tQWN0aW9uUHJlZml4ZXMuY2xlYXIoKTsKLQkJCWZDdXN0b21BY3Rpb25QcmVmaXhlcy5hZGQoSlNQMTFOYW1lc3BhY2UuSlNQX1RBR19QUkVGSVggKyAiOiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZihkZWJ1Z1ByZWZpeExpc3RlbmVyID09IHRydWUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AuUHJlZml4TGlzdGVuZXIgZm9yZ2V0dGluZyBsZWFybmVkIHByZWZpeGVzIik7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uI3NldFN0cnVjdHVyZWREb2N1bWVudChjb20uaWJtLnNzZS5tb2RlbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdEb2N1bWVudCkgewotCQkJcmVzZXROb2RlcygpOwotCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSkucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcih0aGlzKTsKLQkJCWlmKG5ld0RvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgbmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkpLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoQ3VzdG9tQWN0aW9uUHJlZml4KFN0cmluZyB0YWduYW1lKSB7Ci0JCQlpZiAodGFnbmFtZS5lcXVhbHMoZkxhc3RUcnVlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkN1c3RvbUFjdGlvblByZWZpeGVzLnNpemUoKTsgaSsrKQotCQkJCWlmICh0YWduYW1lLnN0YXJ0c1dpdGgoKFN0cmluZykgZkN1c3RvbUFjdGlvblByZWZpeGVzLmdldChpKSkpIHsKLQkJCQkJZkxhc3RUcnVlID0gdGFnbmFtZTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdQcmVmaXhMaXN0ZW5lciA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGFydGl0aW9uZXIvcHJlZml4bGlzdGVuZXIiKSk7Ci0KLQotCS8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdjUuMS4wLCB3ZSdsbCByZXVzZSBTVF9KU1BfRElSRUNUSVZFIGZvciBhY3Rpb24KLQkvLyB0YWdzCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmRW5hYmxlSlNQQWN0aW9uUGFydGl0aW9ucyA9IHRydWU7Ci0JLy8gbGlzdCBvZiB2YWxpZCBKU1AgMS4yIHRhZyBhbmQgYWN0aW9uIG5hbWVzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBmSlNQQWN0aW9uVGFnTmFtZXMgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0NPTlRFTlRfVFlQRSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVF9ERUZBVUxUX0pTUCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUX0pTUF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUX0pTUF9TQ1JJUFQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUX0pTUF9DT05URU5UX0RFTElNSVRFUiA9IFNUX0pTUF9TQ1JJUFQgKyAiREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUX0pTUF9DT05URU5UX0pBVkEgPSBTVF9KU1BfU0NSSVBUICsgIkpBVkEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RfSlNQX0NPTlRFTlRfSkFWQVNDUklQVCA9IFNUX0pTUF9TQ1JJUFQgKyAiSkFWQVNDUklQVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVF9KU1BfREVGQVVMVF9FTCA9IFNUX0pTUF9TQ1JJUFQgKyAiSlNQX0VMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUX0pTUF9ESVJFQ1RJVkUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSFRNTF9DT05URU5UX1RZUEUgPSAidGV4dC94aHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTlRFTlRfVFlQRSA9ICJ0ZXh0L3htbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde1NUX0RFRkFVTFRfSlNQLCBTVF9KU1BfREVGQVVMVF9FTCwgU1RfSlNQX0RJUkVDVElWRSwgU1RfSlNQX0NPTlRFTlRfREVMSU1JVEVSLCBTVF9KU1BfQ09OVEVOVF9KQVZBLCBTVF9KU1BfQ09OVEVOVF9KQVZBU0NSSVBULCBTVF9KU1BfQ09NTUVOVH07Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBmRW1iZWRkZWRQYXJ0aXRpb25lciA9IG51bGw7Ci0KLQkKLQkvKioKLQkgKiBBc3N1bWUgbGFuZ3VhZ2U9amF2YSBieSBkZWZhdWx0IC4uLiBjbGllbnQsIHN1Y2ggYXMKLQkgKiBQYWdlRGlyZWN0aXZlQWRhcHRlciwgbXVzdCBzZXQgbGFuZ3VhZ2Ugb2YgZG9jdW1lbnQgcGFydGl0aW9uZXIsCi0JICogaWYvd2hlbiBpdCBjaGFuZ2VzLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYW5ndWFnZSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgUHJlZml4TGlzdGVuZXIgZlByZWZpeFBhcnNlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSlNQRG9jdW1lbnRQYXJ0aW9uZXIuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChmSlNQQWN0aW9uVGFnTmFtZXMgPT0gbnVsbCkgewotCQkJZkpTUEFjdGlvblRhZ05hbWVzID0gbmV3IEFycmF5TGlzdCgpOyAvLyB1c2VzIC5lcXVhbHMoKSBmb3IKLQkJCS8vIGNvbnRhaW5zKCkKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCQkJLy8JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCS8vCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfUEFHRSk7Ci0JCQkvLwkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GQUxMQkFDSyk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUldBUkQpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOQ0xVREUpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUyk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBMVUdJTik7Ci0JCQkvLwkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2Nvbm5lY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIuY29ubmVjdChkb2N1bWVudCk7Ci0JCWZTdXBwb3J0ZWRUeXBlcyA9IG51bGw7Ci0KLQkJLy8gYmUgZXh0cmEgcGFyYW5vaWQKLQkJaWYgKGZFbmFibGVKU1BBY3Rpb25QYXJ0aXRpb25zICYmIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSBpbnN0YW5jZW9mIEpTUFNvdXJjZVBhcnNlcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIHBhcnNlciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJCXBhcnNlci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKGZQcmVmaXhQYXJzZUxpc3RlbmVyKTsKLQkJCWZQcmVmaXhQYXJzZUxpc3RlbmVyID0gbmV3IFByZWZpeExpc3RlbmVyKCk7Ci0JCQlwYXJzZXIuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihmUHJlZml4UGFyc2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGNyZWF0ZVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgcmVzdWx0ID0gbmV3IE51bGxTdHJ1Y3R1cmVkRG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCQlKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IganNwSGVhZENvbnRlbnREZXRlY3RvciA9IG5ldyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IoKTsKLQkJanNwSGVhZENvbnRlbnREZXRlY3Rvci5zZXQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlOwotCQl0cnkgewotCQkJY29udGVudFR5cGUgPSBqc3BIZWFkQ29udGVudERldGVjdG9yLmdldENvbnRlbnRUeXBlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIGluIHRoaXMgY29udGV4dAotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljb250ZW50VHlwZSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gd2UgY3VycmVudGx5IG9ubHkgaGF2ZSB0d28gLi4uIGV2ZW50dWFsbHkgc2hvdWxkCi0JCS8vIG1ha2Ugb3IgdGllLWluIHRvIGV4aXN0aW5nIHJlZ2lzdHJ5LgotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShIVE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFhIVE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFhNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCS8vIHdlJ2xsIGNoZWNrIGZvciBudWxsIGRvY3VtZW50LCBqdXN0IGZvciBidWxsZXQgcHJvb2ZpbmcgKGluY2FzZQotCQkvLyBkaXNjb25ubmVjdCBpcyBjYWxsZWQgd2l0aG91dCBjb3JyZXNwb25kaW5nIGNvbm5lY3QuCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIHBhcnNlciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJCWlmIChmUHJlZml4UGFyc2VMaXN0ZW5lciAhPSBudWxsKQotCQkJCXBhcnNlci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKGZQcmVmaXhQYXJzZUxpc3RlbmVyKTsKLQkJCWZQcmVmaXhQYXJzZUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCi0JCWlmIChmRW1iZWRkZWRQYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRQYXJ0aXRpb25lci5kaXNjb25uZWN0KCk7Ci0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkwOQotCQkJLyoqCi0JCQkgKiBmb3JjZSByZWNyZWF0aW9uIHdoZW4gcmVjb25uZWN0ZWQKLQkJCSAqLwotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIgPSBudWxsOwotCQl9Ci0JCS8vIHN1cGVyLmRpc2Nvbm5lY3Qgc2hvdWxkIGNvbWUgYXQgZW5kLCBzaW5jZSBpdCAobWF5KSBzZXQKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50IHRvIG51bGwKLQkJc3VwZXIuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKS5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW1iZWRkZWRQYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKSB7Ci0JCWlmIChmRW1iZWRkZWRQYXJ0aXRpb25lciA9PSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRQYXJ0aXRpb25lciA9IGNyZWF0ZVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCi0JCXJldHVybiBmRW1iZWRkZWRQYXJ0aXRpb25lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBmTGFuZ3VhZ2U7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldExvY2FsTGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIGNvbmZpZ3VyZWRUeXBlcyA9IGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmVkVHlwZXMubGVuZ3RoOyBpKyspCi0JCQl0eXBlcy5hZGQoY29uZmlndXJlZFR5cGVzW2ldKTsKLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhcmVudE5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzZFJlZ2lvbiAhPSBudWxsICYmIGlzVmFsaWRKc3BBY3Rpb25SZWdpb25UeXBlKHNkUmVnaW9uLmdldFR5cGUoKSkpCi0JCQlzZFJlZ2lvbiA9IHNkUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0KLQkJaWYgKHNkUmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJLy8gb25seSBmaW5kIHBhcmVudCBuYW1lcyBmcm9tIGEgc3RhcnQgdGFnCi0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCWlmIChyZWdpb25zLmdldCgwKS5nZXRUeXBlKCkuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSAmJiByLmdldFR5cGUoKS5lcXVhbHMoWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpKSB7Ci0JCQkJCXJlc3VsdCA9IHNkUmVnaW9uLmdldFRleHQocik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5tb2RlbC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyI2dldFBhcnRpdGlvblR5cGUoY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWZpbmFsIFN0cmluZyByZWdpb25fdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChyZWdpb25fdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZUZvckRvY3VtZW50TGFuZ3VhZ2UoKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhUIHx8IHJlZ2lvbl90eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UpCi0JCQlyZXN1bHQgPSBTVF9KU1BfQ09NTUVOVDsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FIHx8IHJlZ2lvbl90eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCByZWdpb25fdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFKQotCQkJcmVzdWx0ID0gU1RfSlNQX0RJUkVDVElWRTsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFIHx8IHJlZ2lvbl90eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCByZWdpb25fdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHJlZ2lvbl90eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKQotCQkJcmVzdWx0ID0gU1RfSlNQX0NPTlRFTlRfREVMSU1JVEVSOwotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkKLQkJCXJlc3VsdCA9IFNUX0RFRkFVTFRfSlNQOwotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfT1BFTiB8fCByZWdpb25fdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVCB8fCByZWdpb25fdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ0xPU0UgfHwgcmVnaW9uX3R5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0RRVU9URQotCQkJCQl8fCByZWdpb25fdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfU1FVT1RFIHx8IHJlZ2lvbl90eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9RVU9URURfQ09OVEVOVCkKLQkJCXJlc3VsdCA9IFNUX0pTUF9ERUZBVUxUX0VMOwotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQkvLyBwb3NzaWJseSBiZXR3ZWVuIDxqc3A6c2NyaXB0bGV0PiwgPGpzcDpleHByZXNzaW9uPiwKLQkJCS8vIDxqc3A6ZGVjbHJhdGlvbj4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSB0aGlzLnN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGlzSnNwSmF2YUFjdGlvbk5hbWUoZ2V0UGFyZW50TmFtZShzZFJlZ2lvbikpKQotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGVGb3JEb2N1bWVudExhbmd1YWdlKCk7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gZ2V0RGVmYXVsdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQucGFydGl0aW9uLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjZ2V0UGFydGl0aW9uVHlwZShjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVRleHRSZWdpb24sCi0JICogICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzTm9kZSwgSVRleHRSZWdpb24gcHJldmlvdXNTdGFydFRhZ05hbWVSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUsIElUZXh0UmVnaW9uIG5leHRFbmRUYWdOYW1lUmVnaW9uKSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4ocHJldmlvdXNOb2RlLCBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiwgbmV4dE5vZGUsIG5leHRFbmRUYWdOYW1lUmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUZvckRvY3VtZW50TGFuZ3VhZ2UoKSB7Ci0JCVN0cmluZyByZXN1bHQ7Ci0JCWlmIChmTGFuZ3VhZ2UgPT0gbnVsbCB8fCBmTGFuZ3VhZ2UuZXF1YWxzSWdub3JlQ2FzZSgiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IFNUX0pTUF9DT05URU5UX0pBVkE7Ci0JCX0KLQkJZWxzZSBpZiAoZkxhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UoImphdmFzY3JpcHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBTVF9KU1BfQ09OVEVOVF9KQVZBU0NSSVBUOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gU1RfSlNQX1NDUklQVCArIGdldExhbmd1YWdlKCkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlMaXN0IGNvbWJpbmVkVHlwZXMgPSBnZXRMb2NhbExlZ2FsQ29udGVudFR5cGVzKCk7Ci0JCWlmIChnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gbW9yZVR5cGVzID0gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldExlZ2FsQ29udGVudFR5cGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vcmVUeXBlcy5sZW5ndGg7IGkrKykKLQkJCQljb21iaW5lZFR5cGVzLmFkZChtb3JlVHlwZXNbaV0pOwotCQl9Ci0JCWZTdXBwb3J0ZWRUeXBlcyA9IG5ldyBTdHJpbmdbMF07Ci0JCWNvbWJpbmVkVHlwZXMudG9BcnJheShmU3VwcG9ydGVkVHlwZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZFJlZ2lvbgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQWN0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJaWYgKCFzZFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gc2hvdWxkbid0IGdldCBhIHRhZyBuYW1lIHJlZ2lvbiB0eXBlIHVubGVzcyBhIHRhZyBuYW1lIHJlZ2lvbgotCQkvLyBleGlzdHMKLQkJLy8gYXQgWzFdCi0JCUlUZXh0UmVnaW9uIHRhZ05hbWVSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQlTdHJpbmcgdGFnTmFtZSA9IHNkUmVnaW9uLmdldFRleHQodGFnTmFtZVJlZ2lvbik7Ci0JCS8vIFRPRE86IHN1cHBvcnQgY3VzdG9tIEpTUCBhY3Rpb25zCi0JCS8vIHRoZSBqc3A6IHByZWZpeCBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcHJlZml4IGxpc3RlbmVyCi0JCS8vCQlpZiAoZkpTUEFjdGlvblRhZ05hbWVzLmNvbnRhaW5zKHRhZ05hbWUpKQotCQkvLwkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZlByZWZpeFBhcnNlTGlzdGVuZXIuc3RhcnRzV2l0aEN1c3RvbUFjdGlvblByZWZpeCh0YWdOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5wYXJ0aXRpb24uU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNnZXRPdmVycmlkZURvY3VtZW50UGFydGl0aW9uVHlwZShjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkgKiAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RvY3VtZW50UmVnaW9uQmFzZWRQYXJ0aXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVRleHRSZWdpb24gY29udGFpbmVkQ2hpbGRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIGRvY3VtZW50UmVnaW9uQ29udGV4dCA9IHNkUmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKGNvbnRhaW5lZENoaWxkUmVnaW9uICE9IG51bGwpIHsKLQkJCWlmIChkb2N1bWVudFJlZ2lvbkNvbnRleHQuZXF1YWxzKFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgfHwgZG9jdW1lbnRSZWdpb25Db250ZXh0LmVxdWFscyhYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkpIHsKLQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGNvbnRhaW5lZENoaWxkUmVnaW9uLmdldExlbmd0aCgpLCBTVF9KU1BfRElSRUNUSVZFKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChmRW5hYmxlSlNQQWN0aW9uUGFydGl0aW9ucyAmJiBpc0FjdGlvbihzZFJlZ2lvbiwgb2Zmc2V0KSkgewotCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgY29udGFpbmVkQ2hpbGRSZWdpb24uZ2V0TGVuZ3RoKCksIFNUX0pTUF9ESVJFQ1RJVkUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5pc0RvY3VtZW50UmVnaW9uQmFzZWRQYXJ0aXRpb24oc2RSZWdpb24sIGNvbnRhaW5lZENoaWxkUmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwb3NzaWJsZUpzcEphdmFBY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSnNwSmF2YUFjdGlvbk5hbWUoU3RyaW5nIHBvc3NpYmxlSnNwSmF2YUFjdGlvbikgewotCQlyZXR1cm4gcG9zc2libGVKc3BKYXZhQWN0aW9uLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFRMRVQpIHx8IHBvc3NpYmxlSnNwSmF2YUFjdGlvbi5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTikgfHwgcG9zc2libGVKc3BKYXZhQWN0aW9uLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUNMQVJBVElPTik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRKc3BBY3Rpb25SZWdpb25UeXBlKFN0cmluZyB0eXBlKSB7Ci0JCS8vIHRydWUgZm9yIGFueXRoaW5nIHRoYXQgY2FuIGJlIHdpdGhpbiA8anNwOnNjcmlwdGxldD4sCi0JCS8vIDxqc3A6ZXhwcmVzc2lvbj4sIDxqc3A6ZGVjbGFyYXRpb24+Ci0JCXJldHVybiB0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQgfHwgdHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfHwgdHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOIHx8IHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCB8fCB0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCBpbnN0YW5jZSA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQKCk7Ci0JCWluc3RhbmNlLnNldEVtYmVkZGVkUGFydGl0aW9uZXIoY3JlYXRlU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcihzdHJ1Y3R1cmVkRG9jdW1lbnQpKTsKLQkJaW5zdGFuY2Uuc2V0TGFuZ3VhZ2UoZkxhbmd1YWdlKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVtYmVkZGVkUGFydGl0aW9uZXIuCi0JICogCi0JICogQHBhcmFtIGVtYmVkZGVkUGFydGl0aW9uZXIKLQkgKiAgICAgICAgICAgIFRoZSBlbWJlZGRlZFBhcnRpdGlvbmVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYmVkZGVkUGFydGl0aW9uZXIoSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgZW1iZWRkZWRQYXJ0aXRpb25lcikgewotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkwOQotCQkvKioKLQkJICogbWFuYWdlIGNvbm5lY3RlZCBzdGF0ZSBvZiBlbWJlZGRlZCBwYXJ0aXRpb25lcgotCQkgKi8KLQkJaWYoZkVtYmVkZGVkUGFydGl0aW9uZXIgIT0gbnVsbCAmJiBzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIuZGlzY29ubmVjdCgpOwotCQl9Ci0JCQotCQl0aGlzLmZFbWJlZGRlZFBhcnRpdGlvbmVyID0gZW1iZWRkZWRQYXJ0aXRpb25lcjsKLQkJCi0JCWlmKGZFbWJlZGRlZFBhcnRpdGlvbmVyICE9IG51bGwgJiYgc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LnBhcnRpdGlvbi5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyI2NyZWF0ZVBhcnRpdGlvbihpbnQsCi0JICogICAgICBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJLy9UT0RPOiBuZWVkIHRvIGNhcnJ5IHRoaXMgc2luZ2xlIGluc3RhbmNlIGlkZWEgZnVydGhlciB0byBiZQotCQkvLyBjb21wbGV0ZSwKLQkJLy8gYnV0IGhvcGVmdWxseSB0aGlzIHdpbGwgYmUgbGVzcyBnYXJiYWdlIHRoYW4gYmVmb3JlIChlc3BlY2lhbGx5IGZvcgotCQkvLyBIVE1MLCBYTUwsCi0JCS8vIG5hdHVyYWxseSEpCi0JCWludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlID0gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmNyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGFuZ3VhZ2UKLQkgKiAgICAgICAgICAgIFRoZSBsYW5ndWFnZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJdGhpcy5mTGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjIwNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vblhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25YTUwgewotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcigpIHsKLQkJRG9jdW1lbnRCdWlsZGVyIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoYm9vbGVhbiB2YWxpZGF0aW5nKSB7Ci0JCURvY3VtZW50QnVpbGRlciByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBpbnN0YW5jZSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCWluc3RhbmNlLnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7Ci0JCQlyZXN1bHQgPSBpbnN0YW5jZS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShEb2N1bWVudCBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIG9zdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvY3VtZW50KTsKLQkJdHJ5IHsKLQkJCVRyYW5zZm9ybWVyIHNlcmlhbGl6ZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJ5IHsKLQkJCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi0xNiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB1bnN1cHBvcnRlZCBwcm9wZXJ0aWVzCi0JCQl9Ci0JCQlzZXJpYWxpemVyLnRyYW5zZm9ybShkb21Tb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3N0cmVhbSkpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMGZiYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkphclV0aWxpdGllczsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogQW4gWE1MIENyZWF0b3IvUmVhZGVyL1dyaXRlciB0aGF0IDEpIElnbm9yZXMgYW55IERvY3VtZW50VHlwZSBOb2RlcyBmb3VuZAotICogd2l0aGluIHRoZSBkb2N1bWVudCAoYXMgd2VsbCBhcyBhbnkgZW50aXRpZXMpIDIpIElnbm9yZXMgYW55Ci0gKiBlcnJvcnMvZXhjZXB0aW9ucyBmcm9tIFhlcmNlcyB3aGVuIGxvYWRpbmcgYSBkb2N1bWVudCAzKSBDYW4gbG9hZCBEb2N1bWVudHMKLSAqIGZyb20gd2l0aGluIGEgLkpBUiBmaWxlICgqKipyZWFkLW9ubHkqKiopCi0gKi8KLQotcHVibGljIGNsYXNzIERvY3VtZW50UHJvdmlkZXIgewotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZCYXNlUmVmZXJlbmNlOwotCXByb3RlY3RlZCBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIGZWYWxpZGF0aW5nID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgamFyRmlsZU5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBFbnRpdHlSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTm9kZSByb290RWxlbWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyByb290RWxlbWVudE5hbWUgPSBudWxsOwotCi0JcHVibGljIERvY3VtZW50UHJvdmlkZXIoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIERvY3VtZW50IF9nZXRQYXJzZWREb2N1bWVudERPTTIoKSB7Ci0JCURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0KLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBnZXREb2N1bWVudEJ1aWxkZXIoKTsKLQkJCS8vIERPTVBhcnNlciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7Ci0JCQkvLyBwYXJzZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIiwKLQkJCS8vIGZhbHNlKTsvLyROT04tTkxTLTEkCi0JCQkvLyBwYXJzZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL25vbnZhbGlkYXRpbmcvbG9hZC1kdGQtZ3JhbW1hciIsCi0JCQkvLyBmYWxzZSk7Ly8kTk9OLU5MUy0xJAotCQkJLy8gcGFyc2VyLnNldEVycm9ySGFuZGxlcihnZXROdWxsRXJyb3JIYW5kbGVyKCkpOwotCQkJLy8gcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKGdldE51bGxFbnRpdHlSZXNvbHZlcigpKTsKLQkJCS8vIGlzID0gZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCWJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIoZ2V0RW50aXR5UmVzb2x2ZXIoKSk7Ci0JCQlidWlsZGVyLnNldEVycm9ySGFuZGxlcihnZXROdWxsRXJyb3JIYW5kbGVyKCkpOwotCQkJaXMgPSBnZXRJbnB1dFN0cmVhbSgpOwotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJcmVzdWx0ID0gYnVpbGRlci5wYXJzZShpcywgZ2V0QmFzZVJlZmVyZW5jZSgpKTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCQkvLyBwYXJzaW5nIGV4Y2VwdGlvbiwgbm90aWZ5IHRoZSB1c2VyPwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWEV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gTk9UIGFuICJleGNlcHRpb25hbCBjYXNlIjsgZG8gbm90IExvZwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiSU9FeGNlcHRpb24gd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyB3aGF0IGNhbiBiZSBkb25lPwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBmQmFzZVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIERvY3VtZW50Ci0JICovCi0JcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCWxvYWQoKTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCXByb3RlY3RlZCBEb2N1bWVudEJ1aWxkZXIgZ2V0RG9jdW1lbnRCdWlsZGVyKCkgewotCQlyZXR1cm4gQ29tbW9uWE1MLmdldERvY3VtZW50QnVpbGRlcihpc1ZhbGlkYXRpbmcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIERPTUltcGxlbWVudGF0aW9uIGdldERvbUltcGxlbWVudGF0aW9uKCkgewotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJfQotCQljYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlMSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCX0KLQkJRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9IGJ1aWxkZXIuZ2V0RE9NSW1wbGVtZW50YXRpb24oKTsKLQkJcmV0dXJuIGltcGw7Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBUYWtlcyBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm0gImEvYi9jIiBhbmQgZW5zdXJlcyB0aGF0IHRoYXQKLQkgKiBzdHJ1Y3R1cmUgZXhpc3RzIGJlbG93IHRoZSBoZWFkIGVsZW1lbnQsIGRvd24gdGhyb3VnaCAnYycsIGFuZCByZXR1cm5zCi0JICogYSA8ZW0+c2luZ2xlPC9lbT4gZWxlbWVudCAnYycuIEZvciBtdWx0aXBsZSBlbGVtZW50cyAoc3VjaCBhcwotCSAqIG11bHRpcGxlICZsdDttYWNybyZndDsgZWxlbWVudHMgY29udGFpbmVkIHdpdGhpbiBhIHNpbmdsZQotCSAqICZsdDttYWNyb3MmZ3Q7IGVsZW1lbnQsIGZ1bGwgRE9NIGFjY2VzcyBpcyByZXF1aXJlZCBmb3Igc2VhcmNoaW5nIGFuZAotCSAqIGNoaWxkIGVsZW1lbnQgbWFuaXB1bGF0aW9uLgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudChTdHJpbmcgbmFtZSkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCWxvYWQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gKEVsZW1lbnQpIGdldE5vZGUoZ2V0Um9vdEVsZW1lbnQoKSwgbmFtZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gRW50aXR5UmVzb2x2ZXIgdGhhdCB3b24ndCB0cnkgdG8gbG9hZCBhbmQgcmVzb2x2ZSBBTlkKLQkgKiBlbnRpdGllcwotCSAqLwotCXByaXZhdGUgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQlyZXNvbHZlciA9IG5ldyBFbnRpdHlSZXNvbHZlcigpIHsKLQkJCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJCQlJbnB1dFNvdXJjZSByZXN1bHQgPSBudWxsOwotCQkJCQlpZiAoZ2V0QmFzZVJlZmVyZW5jZSgpICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJVVJMIHNwZWMgPSBuZXcgVVJMKCJmaWxlOi8vIiArIGdldEJhc2VSZWZlcmVuY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlVUkwgdXJsID0gbmV3IFVSTChzcGVjLCBzeXN0ZW1JRCk7Ci0JCQkJCQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkJCQkJcmVzdWx0ID0gbmV3IElucHV0U291cmNlKHN5c3RlbUlEICE9IG51bGwgPyBzeXN0ZW1JRCA6ICIvXyIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlyZXN1bHQuc2V0UHVibGljSWQocHVibGljSUQpOwotCQkJCQkJCQlyZXN1bHQuc2V0Qnl0ZVN0cmVhbShjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcigiIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXN1bHQuc2V0UHVibGljSWQocHVibGljSUQpOwotCQkJCQkJcmVzdWx0LnNldFN5c3RlbUlkKHN5c3RlbUlEICE9IG51bGwgPyBzeXN0ZW1JRCA6ICIvXyIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuZCBpbnB1dCBzdHJlYW0gdG8gdXNlIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIERvY3VtZW50IDEpIGZyb20KLQkgKiBhbiBJbnB1dFN0cmVhbSBzZXQgb24gdGhpcyBpbnN0YW5jZSAyKSBmcm9tIGEgSkFSIGZpbGUgd2l0aCB0aGUgZ2l2ZW4KLQkgKiBlbnRyeSBuYW1lIDMpIGZyb20gYSBub3JtYWwgZmlsZQotCSAqIAotCSAqIEByZXR1cm4gSW5wdXRTdHJlYW0KLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQlyZXR1cm4gaW5wdXRTdHJlYW07Ci0JCWVsc2UgaWYgKGlzSkFSKCkpIHsKLQkJCXJldHVybiBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0oZ2V0SmFyRmlsZU5hbWUoKSwgZ2V0RmlsZU5hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShnZXRGaWxlTmFtZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmFyRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBqYXJGaWxlTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBnZXROYW1lZENoaWxkKE5vZGUgcGFyZW50LCBTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTm9kZUxpc3QgY2hpbGRMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGNoaWxkTGlzdC5pdGVtKGkpLmdldE5vZGVOYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpCi0JCQkJcmV0dXJuIGNoaWxkTGlzdC5pdGVtKGkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBEb2N1bWVudCBnZXROZXdEb2N1bWVudCgpIHsKLQkJRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldERvbUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnQoIiIsIGdldFJvb3RFbGVtZW50TmFtZSgpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSByZXN1bHQuZ2V0Q2hpbGROb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJcmVzdWx0LnJlbW92ZUNoaWxkKGNoaWxkcmVuLml0ZW0oaSkpOwotCQkJfQotCQkJLy8gd2UncmUgZ29pbmcgdGhyb3VnaCB0aGlzIGVmZm9ydCB0byBhdm9pZCBhIE5TIGVsZW1lbnQKLQkJCUVsZW1lbnQgc2V0dGluZ3MgPSByZXN1bHQuY3JlYXRlRWxlbWVudChnZXRSb290RWxlbWVudE5hbWUoKSk7Ci0JCQlyZXN1bHQuYXBwZW5kQ2hpbGQoc2V0dGluZ3MpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBUYWtlcyBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm0gImEvYi9jIiBhbmQgZW5zdXJlcyB0aGF0IHRoYXQKLQkgKiBzdHJ1Y3R1cmUgZXhpc3RzIGJlbG93IHRoZSBoZWFkIGVsZW1lbnQsIGRvd24gdGhyb3VnaCAnYycsIGFuZCByZXR1cm5zCi0JICogdGhlIGVsZW1lbnQgJ2MnLgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0Tm9kZShOb2RlIG5vZGUsIFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5hbWUsICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRva2VuID0gbnVsbDsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKGdldE5hbWVkQ2hpbGQobm9kZSwgdG9rZW4pID09IG51bGwpCi0JCQkJbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRva2VuKSk7Ci0JCQlub2RlID0gZ2V0TmFtZWRDaGlsZChub2RlLCB0b2tlbik7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBFcnJvckhhbmRsZXIgdGhhdCB3aWxsIG5vdCBzdG9wIHRoZSBwYXJzZXIgb24gcmVwb3J0ZWQKLQkgKiBlcnJvcnMKLQkgKi8KLQlwcml2YXRlIEVycm9ySGFuZGxlciBnZXROdWxsRXJyb3JIYW5kbGVyKCkgewotCQlpZiAoZXJyb3JIYW5kbGVyID09IG51bGwpIHsKLQkJCWVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWFBhcnNlRXhjZXB0aW9uIHdpdGggIiArIGdldEphckZpbGVOYW1lKCkgKyAiLyIgKyBnZXRGaWxlTmFtZSgpICsgIiAoZXJyb3IpIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvcjogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiU0FYUGFyc2VFeGNlcHRpb24gd2l0aCAiICsgZ2V0SmFyRmlsZU5hbWUoKSArICIvIiArIGdldEZpbGVOYW1lKCkgKyAiIChmYXRhbEVycm9yKSB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWFBhcnNlRXhjZXB0aW9uIHdpdGggIiArIGdldEphckZpbGVOYW1lKCkgKyAiLyIgKyBnZXRGaWxlTmFtZSgpICsgIiAod2FybmluZykgd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBlcnJvckhhbmRsZXI7Ci0JfQotCi0JcHJvdGVjdGVkIERvY3VtZW50IGdldFBhcnNlZERvY3VtZW50KCkgewotCQlEb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJRmlsZSBleGlzdGVuY2VUZXN0ZXIgPSBudWxsOwotCQkJaWYgKGlzSkFSKCkpCi0JCQkJZXhpc3RlbmNlVGVzdGVyID0gbmV3IEZpbGUoZ2V0SmFyRmlsZU5hbWUoKSk7Ci0JCQllbHNlCi0JCQkJZXhpc3RlbmNlVGVzdGVyID0gbmV3IEZpbGUoZ2V0RmlsZU5hbWUoKSk7Ci0JCQlpZiAoIWV4aXN0ZW5jZVRlc3Rlci5leGlzdHMoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJlc3VsdCA9IF9nZXRQYXJzZWREb2N1bWVudERPTTIoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBFbGVtZW50IG9mIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIE5vZGUgZ2V0Um9vdEVsZW1lbnQoKSB7Ci0JCXJldHVybiBnZXRSb290RWxlbWVudChnZXREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZS9hIHJvb3QgRWxlbWVudCBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXRSb290RWxlbWVudChEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCXRyeSB7Ci0JCQlFbGVtZW50IG5ld1Jvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoZ2V0Um9vdEVsZW1lbnROYW1lKCkpOwotCQkJZG9jLmFwcGVuZENoaWxkKG5ld1Jvb3RFbGVtZW50KTsKLQkJCXJldHVybiBuZXdSb290RWxlbWVudDsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Um9vdEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gcm9vdEVsZW1lbnROYW1lOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSkFSKCkgewotCQlyZXR1cm4gZ2V0SmFyRmlsZU5hbWUoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpbmcoKSB7Ci0JCXJldHVybiBmVmFsaWRhdGluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKCkgewotCQkvLyByb290RWxlbWVudE5hbWUgYW5kIGZpbGVOYW1lIGFyZSBleHBlY3RlZCB0byBiZSBkZWZpbmVkIGF0IHRoaXMKLQkJLy8gcG9pbnQKLQkJZG9jdW1lbnQgPSBnZXRQYXJzZWREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKHJvb3RFbGVtZW50TmFtZSAhPSBudWxsKQotCQkJCXJvb3RFbGVtZW50ID0gZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpOwotCQkJZWxzZQotCQkJCXJvb3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCX0KLQotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCByb290RWxlbWVudCA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGdldE5ld0RvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZ2V0Um9vdEVsZW1lbnROYW1lKCkpKQotCQkJCQkJcm9vdEVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGRyZW4uaXRlbShpKTsKLQkJCQl9Ci0JCQkJaWYgKHJvb3RFbGVtZW50ID09IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkJcm9vdEVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEb2N1bWVudChEb2N1bWVudCBvZG9jdW1lbnQsIE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUNvbW1vblhNTC5zZXJpYWxpemUob2RvY3VtZW50LCBzdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlUmVmZXJlbmNlKFN0cmluZyBzdHJpbmcpIHsKLQkJZkJhc2VSZWZlcmVuY2UgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0ZpbGVOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdGaWxlTmFtZSkgewotCQlmaWxlTmFtZSA9IG5ld0ZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGlucHV0U3RyZWFtIGZvciB3aGljaCB0byBwcm92aWRlIGEgRG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlucHV0U3RyZWFtCi0JICogICAgICAgICAgICBUaGUgaW5wdXRTdHJlYW0gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdKYXJGaWxlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphckZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3SmFyRmlsZU5hbWUpIHsKLQkJamFyRmlsZU5hbWUgPSBuZXdKYXJGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Um9vdEVsZW1lbnROYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9vdEVsZW1lbnROYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3Um9vdEVsZW1lbnROYW1lKSB7Ci0JCXJvb3RFbGVtZW50TmFtZSA9IG5ld1Jvb3RFbGVtZW50TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpbmcoYm9vbGVhbiBiKSB7Ci0JCWZWYWxpZGF0aW5nID0gYjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZSgpIHsKLQkJaWYgKGlzSkFSKCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHJvb3RFbGVtZW50ID09IG51bGwpIHsKLQkJCWRvY3VtZW50ID0gZ2V0TmV3RG9jdW1lbnQoKTsKLQkJCXJvb3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtIG9zdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShnZXRGaWxlTmFtZSgpKTsKLQotCQkJc3RvcmVEb2N1bWVudChkb2N1bWVudCwgb3N0cmVhbSk7Ci0KLQkJCW9zdHJlYW0uZmx1c2goKTsKLQkJCW9zdHJlYW0uY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHNhdmluZyBkb2N1bWVudCAiICsgZ2V0RmlsZU5hbWUoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlRG9jdW1lbnQoRG9jdW1lbnQgb2RvY3VtZW50LCBPdXRwdXRTdHJlYW0gb3N0cmVhbSkgewotCQl0cnkgewotCQkJc2F2ZURvY3VtZW50KG9kb2N1bWVudCwgb3N0cmVhbSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlU3RhdGVEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVTdGF0ZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5NzExNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVTdGF0ZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLm1vZGVsaGFuZGxlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBvbmx5IGZvciByZW1lbWJlcmluZyBvbGQgYW5kIG5ldyBlbWJlZGRlZCBoYW5kbGVycywgCi0gKiBpbiB0aGUgZXZlbnQgYSByZS1pbml0IGlzIG5lZWRlZC4KLSAqLwotcHVibGljIGNsYXNzIEVtYmVkZGVkVHlwZVN0YXRlRGF0YSB7Ci0KLQotCUVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkSGFuZGxlcjsKLQlFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0hhbmRsZXI7Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlU3RhdGVEYXRhKEVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkSGFuZGxlciwgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdIYW5kbGVyKSB7Ci0JCXRoaXMub2xkSGFuZGxlciA9IG9sZEhhbmRsZXI7Ci0JCXRoaXMubmV3SGFuZGxlciA9IG5ld0hhbmRsZXI7Ci0JfQotCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0TmV3SGFuZGxlcigpIHsKLQkJcmV0dXJuIG5ld0hhbmRsZXI7Ci0JfQotCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0T2xkSGFuZGxlcigpIHsKLQkJcmV0dXJuIG9sZEhhbmRsZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9tb2RlbGhhbmRsZXIvSlNQTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvbW9kZWxoYW5kbGVyL0pTUE1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzBhMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9tb2RlbGhhbmRsZXIvSlNQTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZW5jb2RpbmcuSUpTUEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmVuY29kaW5nLkpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZW5jb2RpbmcuSlNQRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQUmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50LlhNTFN0eWxlTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLk1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuRGVidWdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlLlByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCXByb3RlY3RlZCBmaW5hbCBpbnQgTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUksgPSAyMDAwMDA7Ci0KLQkvKioKLQkgKiBETVcgLSBOb3RlOiBJIHRoaW5rIHRoZSBlbWJlZGRlZFR5cGVSZWdpc3RyeSBpbiBJTW9kZWxNYW5hZ2VyIGNhbiBiZQotCSAqIHJlbW92ZWQKLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9NSU1FX1RZUEUgPSAidGV4dC9odG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTUEVDX0RFRkFVTFRfRU5DT0RJTkcgPSAiSVNPLTg4NTktMSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9MQU5HVUFHRSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEpTUE1vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkKLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJaWYgKGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQllbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkgPSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCkgewotCQkvLyBmdXR1cmVfVE9ETzogdGhpcyBpcyBzaW1pbGFyIHRvICJoYXJkIGNvZGluZyIKLQkJLy8gdGhhdCBIVE1MIHdpbGwgYmUgaW4gSlNQIGZpbGUgLi4uIHNob3VsZCBtYWtlIG1vcmUKLQkJLy8gZmxleGlibGUgaW4gZnV0dXJlLgotCQlYTUxTdHlsZU1vZGVsSW1wbCBtb2RlbCA9IG5ldyBYTUxTdHlsZU1vZGVsSW1wbCgpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhdGlvbiBjaXRlcyBJU08tODg1OS0xL0xhdGluLTEgYXMgdGhlIGRlZmF1bHQgY2hhcnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRFbmNvZGluZygpIHsKLQkJcmV0dXJuIFNQRUNfREVGQVVMVF9FTkNPRElORzsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgSlNQIGZpbGVzLCB0ZXh0L2h0bWwgaXMgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlLiBUaGlzIG1heSB3YW50Ci0JICogdGhpcyBkaWZmZXJlbnQgZm9yIHR5cGVzIGxpa2UganN2IChqc3AgZm9yIHZvaWNlIHhtbCkgRm9yIG5vdywgaGFyZAotCSAqIGNvZGUgdG8gbmV3IGluc3RhbmNlLiBJbiBmdXR1cmUsIHNob3VsZCBnZXQgaW5zdGFuY2UgZnJvbSByZWdpc3RyeS4KLQkgKiAKLQkgKiBTcGVjaWZpY2F0aW9uIGNpdGVzIEhUTUwgYXMgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHJlZyA9IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpOwotCQlyZXR1cm4gcmVnLmdldFR5cGVGb3IoZ2V0RGVmYXVsdE1pbWVUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0TWltZVR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX01JTUVfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0cmlldmUgdGhlIG1vZGVsIGZyb20gdGhlIGZpbGUgc3lzdGVtIChvciB3aGF0Ci0JICogZXZlciB0aGUgbG9hZGVyIGlzIHByZXBhcmVkIHRvIGRvKS4gSWYgdGhlIHJlc291cmNlIGNhbiBub3QgYmUgZm91bmQKLQkgKiAoYW5kIHRoZXJlZm9yZSBhIG1vZGVsIGNhbiBub3QgYmUgY3JlYXRlZCksIHRoZW4gaXQgc2hvdWxkIHJldHVybiBudWxsLgotCSAqLwotCS8vIHB1YmxpYyB2b2lkIGxvYWQoUmVhZGVyIHJlYWRlciwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRW5jb2RpbmdSdWxlCi0JLy8gZW5jb2RpbmdSdWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JLy8gaW5pdGlhbGl6ZUVtYmVkZGVkVHlwZUZyb21TdHJlYW0ocmVhZGVyLCBtb2RlbCk7Ci0JLy8gc2V0TGFuZ3VhZ2VJblBhZ2VEaXJlY3RpdmUobW9kZWwpOwotCS8vIHN1cGVyLmxvYWQocmVhZGVyLCBtb2RlbCwgZW5jb2RpbmdSdWxlKTsKLQkvLyB9Ci0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgSVN0cnVjdHVyZWREb2N1bWVudCwgdGhhdCBoYXMKLQkgKiBiZWVuIGluaXRpYWxpemVkIHdpdGggYXBwcm9wcmlhdGUgcGFyc2VyLiBGb3IgbWFueSBsb2FkZXJzLCB0aGUKLQkgKiAoZGVmYXVsdCkgcGFyc2VyIHVzZWQgaXMga25vd24gZm9yIGFueSBpbnB1dC4gRm9yIG90aGVycywgdGhlIGNvcnJlY3QKLQkgKiBwYXJzZXIgKGFuZCBpdHMgaW5pdGlhbGl6YXRpb24pIGlzIG5vcm1hbGwgZGVwZW5kZW50IG9uIHRoZSBjb250ZW50IG9mCi0JICogdGhlIGZpbGUuIFRoaXMgbm8tYXJndW1lbnQgbWV0aG9kIHNob3VsZCBhc3N1bWUgImVtcHR5IGlucHV0IiBhbmQgd291bGQKLQkgKiB0aGVyZWZvcmUgcmV0dXJuIHRoZSBkZWZhdWx0IHBhcnNlciBmb3IgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICogCi0JICogSWYgdGhlIHBhcnNlciBpcyB0byBoYW5kbGUgdGFnIGxpYnJhcmllcywgaXQgbXVzdCBoYXZlIGEgVGFnbGliU3VwcG9ydAotCSAqIG9iamVjdCB3aXRoIGEgdmFsaWQgVVJJUmVzb2x2ZXIgYW5kIHRoaXMgSVN0cnVjdHVyZWREb2N1bWVudCBhdHRhY2hlZAotCSAqIHRvIGl0IGJlZm9yZSB0aGUgY29udGVudHMgYXJlIHNldCBvbiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuc2V0UmVQYXJzZXIobmV3IEpTUFJlUGFyc2VyKCkpOwotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihuZXcKLQkJLy8gSlNQSmF2YURvY3VtZW50UGFydGlvbmVyKCkpOwotCQkvLyBldmVuIHRob3VnaCB0aGlzIGlzIGFuICJlbXB0eSBtb2RlbCIgLi4uIHdlIHdhbnQgaXQgdG8gaGF2ZSBhdAotCQkvLyBsZWFzdCB0aGUKLQkJLy8gZGVmYXVsdCBlbWJlZGRlZGVkIGNvbnRlbnQgdHlwZSBoYW5kbGVyCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRUeXBlID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZSgpOwotCQllbWJlZGRlZFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJLy8gcmVtZW1iZXIsIHRoZSBMb2FkZXIKLQkJLy8gd2lsbCBuZWVkIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiBwYXJzZXIKLQkJLy8gYmFzZWQgb24gImVtYmVkZGVkIGNvbnRlbnQiCi0JCXJldHVybiBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXN1cGVyLnByZUxvYWRBZGFwdChzdHJ1Y3R1cmVkTW9kZWwpOwotCQlYTUxNb2RlbCBkb21Nb2RlbCA9IChYTUxNb2RlbCkgc3RydWN0dXJlZE1vZGVsOwotCQkvLwotCQkvLyBkb2N1bWVudCBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHNldCBmb3IgdGhpcyB0bwotCQkvLyB3b3JrLgotCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZG9jdW1lbnQpOwotCQkvLyBpZiB0aGVyZSBpcyBhIG1vZGVsIGluIHRoZSBhZGFwdGVyLCB0aGlzIHdpbGwgYWRhcHQgaXQgdG8KLQkJLy8gZmlyc3Qgbm9kZS4gQWZ0ZXIgdGhhdCB0aGUgUHJvcGFnYXRpbmdBZGF0ZXIgc3ByZWFkcyBvdmVyIHRoZQotCQkvLyBjaGlsZHJlbiBiZWluZwotCQkvLyBjcmVhdGVkLiBFYWNoIHRpbWUgdGhhdCBoYXBwZW5kcywgYSBzaWRlIGVmZmVjdCBpcyB0bwotCQkvLyBhbHNvICJzcHJlYWQiIHNwcmVjaWZpYyByZWdpc3RlcmVkIGFkYXB0ZXJzLAotCQkvLyB0aGV5IHR3byBjYW4gcHJvcGlnYXRlIGlzIG5lZWRlZC4KLQkJLy8gVGhpcyAnZ2V0JyBjYXVzZXMgZmlyc3QgdG8gYmUgYmUgYXR0YWNoZWQuCi0JCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCS8vIG1heSBtYWtlIHRoaXMgZWFzaWVyIHRvIHVzZSBpbiBmdXR1ZQotCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeSgpKTsKLQkJaWYgKERlYnVnLmRlYnVnTm90aWZpY2F0aW9uQW5kRXZlbnRzKSB7Ci0JCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IERlYnVnQWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQkJLy8gRm9yIEpTUHMsIHRoZSBNb2RlbFF1ZXJ5QWRhcHRlciBtdXN0IGJlICJhdHRhY2hlZCIgdG8gdGhlIGRvY3VtZW50Ci0JCS8vIGJlZm9yZSBjb250ZW50IGlzIHNldCBpbiB0aGUgbW9kZWwsIHNvIHRhZ2xpYiBpbml0aXphdGlvbiBjYW4KLQkJLy8gdGFrZSBwbGFjZS4KLQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCS8vCi0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aG9zZSBmYWN0b3JpZXMgd2hpY2ggbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUKLQkgKiBzdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCS8vCi0JCWZhY3RvcnkgPSBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBuZXcgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IG5ldyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQotCi0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLm1vZGVsLkFic3RyYWN0RHVtcGVyI2dldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpCi0JICovCi0JcHVibGljIElKU1BIZWFkQ29udGVudERldGVjdG9yIGdldEhlYWRQYXJzZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbml0IG1ldGhvZCBpcyBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgYXJlIGdldHRpbmcgdGhlIGVtYmVkZGVkIHR5cGUKLQkgKiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gc3BlY2lmaWNhbGx5LgotCSAqLwotCS8vIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRUeXBlRnJvbVN0cmVhbShSZWFkZXIgcmVhZGVyLAotCS8vIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gSUZpbGUgZmlsZSA9IFJlc291cmNlVXRpbC5nZXRGaWxlRm9yKG1vZGVsKTsKLQkvLyBKU1BEb2N1bWVudExvYWRlciBqc3BEb2N1bWVudExvYWRlciA9KEpTUERvY3VtZW50TG9hZGVyKQotCS8vIGdldERvY3VtZW50TG9hZGVyKCk7Ci0JLy8gRW1iZWRkZWRUeXBlSGFuZGxlciBpbnB1dEVtYmVkZGVkQ29udGVudFR5cGUgPQotCS8vIGpzcERvY3VtZW50TG9hZGVyLmdldEVtYmVkZGVkVHlwZShmaWxlKTsKLQkvLyBFbWJlZGRlZFR5cGVIYW5kbGVyIGV4aXN0aW5nRW1iZWRkZWRUeXBlID0gZ2V0RW1iZWRkZWRUeXBlKG1vZGVsKTsKLQkvLyAvLyB3ZSBkb24ndCBleHBlY3QgdGhlIGV4aXN0aW5nIHR5cGUgdG8gYmUgbnVsbCwgYnV0IGlmIGl0IGlzLCB0aGVuCi0JLy8gLy8gdGhpcyBpcyBhIHNpbXBseSBpbml0IGNhc2UsIG5vdCByZS1pbml0Ci0JLy8gaWYgKGV4aXN0aW5nRW1iZWRkZWRUeXBlID09IG51bGwpIHsKLQkvLyBpbml0aWFsaXplRW1iZWRkZWRUeXBlKG1vZGVsLCBpbnB1dEVtYmVkZGVkQ29udGVudFR5cGUpOwotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyBpZiAoZXhpc3RpbmdFbWJlZGRlZFR5cGUgIT0gaW5wdXRFbWJlZGRlZENvbnRlbnRUeXBlKSB7Ci0JLy8gLy8gb25seSBuZWVkIHRvIHJlaW5pdGlhbGl6ZSBpZiB0cnVlbHkgZGlmZmVyZW50Ci0JLy8gcmVJbml0aWFsaXplRW1iZWRkZWRUeXBlKG1vZGVsLCBleGlzdGluZ0VtYmVkZGVkVHlwZSwKLQkvLyBpbnB1dEVtYmVkZGVkQ29udGVudFR5cGUpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8qKgotCSAqIFRoaXMgaW5pdCBtZXRob2QgaXMgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBjcmVhdGluZyBhbiBlbXB0eSBtb2RlbCwKLQkgKiB3aGljaCB3ZSBhbHdheXMgZG8uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbWJlZGRlZFR5cGVGcm9tRGVmYXVsdChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRDb250ZW50VHlwZSA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJaW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShtb2RlbCwgZW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyAiaW5pdGlhbGl6ZSIgc2luY2UgaXMgYWx3YXlzIGFzc3VtZXMgaXQgaGFzbid0IGJlZW4gaW5pdGFsaXplZAotCSAqIHlldC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkQ29udGVudFR5cGUpIHsKLQkJLy8gY2hlY2sgcHJvZ3JhbSBsb2dpYwotCQlBc3NlcnQuaXNOb3ROdWxsKGVtYmVkZGVkQ29udGVudFR5cGUsICJQcm9ncmFtIGVycm9yOiBpbnZhbGlkIGNhbGwgZHVyaW5nIG1vZGVsIGluaXRpYWxpemF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gb25jZSB3ZSBrbm93IHRoZSBlbWJlZGRlZCBjb250ZW50IHR5cGUsIHdlIG5lZWQgdG8gc2V0IGl0IGluIHRoZQotCQkvLyBQYWdlRGlyZWN0aXZlQWRhcHRlciAuLi4gdGhlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uIGlzCi0JCS8vIGNyaXRpY2FsIGhlcmUsIHRoZSBkb2MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYnV0IGl0cyBjb250ZW50cyBub3QKLQkJLy8gc2V0IHlldCwKLQkJLy8gYW5kIGFsbCBmYWN0b3JpZXMgbXVzdCBoYXZlIGJlZW4gc2V0IHVwIGFsc28uCi0JCVhNTE1vZGVsIGRvbU1vZGVsID0gKFhNTE1vZGVsKSBtb2RlbDsKLQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldEVtYmVkZGVkVHlwZShlbWJlZGRlZENvbnRlbnRUeXBlKTsKLQkJZW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJZW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkvLyBhZGRpbmcgbGFuZ3VhZ2UgaGVyZSwgaW4gdGhpcyBjb252aWVuZW50IGNlbnRyYWwKLQkJLy8gbG9jYXRpb24sIGJ1dCBzb21lIG9idmlvdXMgcmVuYW1pbmcgb3IgcmVmYWN0b3JpbmcKLQkJLy8gd291bGRuJ3QgaHVydCwgaW4gZnV0dXJlLgotCQkvLyBJIG5lZWRlZCB0byBhZGQgdGhpcyBsYW5ndWFnZSBzZXR0aW5nIGZvciBKU1AgRnJhZ21lbnQgc3VwcG9ydAotCQkvLyBOb3RlOiBJIGRvbid0IHRoaW5rIHRoaXMgYXR0ZW1wdGVkIGluaXQgY291bnRzIGZvciBtdWNoLgotCQkvLyBJIHRoaW5rIGl0cyBhbHdheXMgZXhlY3V0ZWQgd2hlbiBtb2RlbCBpcyB2ZXJ5IGZpcnN0Ci0JCS8vIGJlaW5nIGluaXRpYWxpemVkLCBhbmQgZG9lc24ndCBldmVuIGhhdmUgY29udGVudAotCQkvLyBvciBhbiBJRCB5ZXQuIEkgdGhvdWdodCBJJ2QgbGVhdmUsIHNpbmNlIGl0IHdvdWxkbid0Ci0JCS8vIGh1cnQsIGluIGNhc2UgaXRzIGNhbGxlZCBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCQkvLyBTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShtb2RlbCk7Ci0JCS8vIHBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0TGFuZ3VhZ2UuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMYW5ndWFnZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBmaXJzdCBjaGVjayB0aGUgbW9kZWwgKGRvY3VtZW50IGl0c2VsZikgdG8gc2VlIGlmIGNvbnRhaW5zCi0JCXJlc3VsdCA9IGdldExhbmd1YWdlRnJvbVN0cnVjdHVyZWREb2N1bWVudChtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCS8vIE5vdGU6IGlmIG1vZGVsIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkCi0JCS8vIGxhbmd1YWdlLCB3ZSdsbCBldmVuIHJldHVybiBpdCwKLQkJLy8gc2luY2Ugd2hvIGtub3dzIHdoYXQgZnV0dXJlIGhvbGRzLgotCi0JCS8vIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gREVGQVVMVF9MQU5HVUFHRTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRMYW5ndWFnZUZyb21TdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGFuZ3VhZ2VGcm9tU3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gYmFzY2lhbGx5IHNhbWUgYWxnb3JpdGhtIGFzIGdldCBlbmNvZGluZyBvcgotCQkvLyBnZXQgY29udGVudCB0eXBlIGZyb20gc3RydWN0dXJlZERvY3VtZW50LgotCQlJSlNQSGVhZENvbnRlbnREZXRlY3RvciBsb2NhbEhlYWRQYXJzZXIgPSBnZXRIZWFkUGFyc2VyKCk7Ci0JCS8vIHdlIGNhbiBiZSBhc3N1cmVkIHRoYXQgaXRzIGFscmVhZHkgYmVlbgotCQkvLyBwYXJzZWQuIElmIG5vdCBjYWxsIHBhcnNlSGVhZGVyRm9yUGFnZURpcmVjdGl2ZSgpCi0JCS8vIGJlZm9yZSBjYWxsaW5nIGdldExhbmd1YWdlOwotCQlsb2NhbEhlYWRQYXJzZXIuc2V0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBsb2NhbEhlYWRQYXJzZXIuZ2V0TGFuZ3VhZ2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZQotCQkJLy8gVE9ETyBuZWVkIHRvIHJlY29uc2lkZXIgZGVzaWduIHRvIGF2b2lkCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzICJyZWluaXRpYWxpemUiIHNpbmNlIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgdGhlCi0JICogZGVmYXVsdCBvbmUgYXNzaWduZWQsIGJlZm9yZSB3ZSBzdGFydCBjaGVja2luZyB0aGUgc3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlSW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEVtYmVkZGVkQ29udGVudFR5cGUsIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3RW1iZWRkZWRDb250ZW50VHlwZSkgewotCQkvLyBjaGVjayBwcm9ncmFtIGxvZ2ljCi0JCUFzc2VydC5pc05vdE51bGwob2xkRW1iZWRkZWRDb250ZW50VHlwZSwgIlByb2dyYW0gZXJyb3I6IGludmFsaWQgY2FsbCBkdXJpbmcgbW9kZWwgaW5pdGlhbGl6YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBvbmNlIHdlIGtub3cgdGhlIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSwgd2UgbmVlZCB0byBzZXQgaXQgaW4gdGhlCi0JCS8vIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIC4uLiB0aGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMKLQkJLy8gY3JpdGljYWwgaGVyZSwgdGhlIGRvYyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBidXQgaXRzIGNvbnRlbnRzIG5vdAotCQkvLyBzZXQgeWV0LAotCQkvLyBhbmQgYWxsIGZhY3RvcmllcyBtdXN0IGhhdmUgYmVlbiBzZXQgdXAgYWxzby4KLQkJWE1MTW9kZWwgZG9tTW9kZWwgPSAoWE1MTW9kZWwpIG1vZGVsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlYTUxEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSBkb2N1bWVudC5nZXRFeGlzdGluZ0FkYXB0ZXIoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikKLQkJLy8gZG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikKLQkJLy8gZG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCS8vIHNpbmNlICdkb2N1bWVudCcgaXMgbm90IHJlY3JlYXRlZCBpbiB0aGlzCi0JCS8vIHJlaW5pdCBwYXRoLCB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgYWRhcHRlcnMsCi0JCS8vIGV4Y2VwdCBmb3IgdGhlIHByb3BhZ2F0ZWQgYWRhcHRlcnMgKGluY2x1ZGluZyBwYWdlCi0JCS8vIGRpcmVjdGl2ZSBhZGFwdGVyLCBhbmQgbW9kZWwgcXVlcnkgYWRhcHRlcikuCi0JCS8vIHRvIGFjY29tcGxpc2ggdGhpcywgd2UnbGwganVzdCByZW1vdmUgYWxsLCB0aGVuCi0JCS8vIGFkZCBiYWNrIHdpdGggYSBjYWxsIHRvIHByZS1sb2FkIGFkYXB0LgotCQkvLyBsZXQgY2xpZW50cyBkZWNpZGUgdG8gdW5sb2FkIGFkYXB0ZXJzIGZyb20gZG9jdW1lbnQKLQkJLy8gQ29sbGVjdGlvbiBvbGRBZGFwdGVycyA9IGRvY3VtZW50LmdldEFkYXB0ZXJzKCk7Ci0JCS8vIEl0ZXJhdG9yIG9sZEFkYXB0ZXJzSXRlcmF0b3IgPSBvbGRBZGFwdGVycy5pdGVyYXRvcigpOwotCQkvLyB3aGlsZSAob2xkQWRhcHRlcnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJLy8gSU5vZGVBZGFwdGVyIG9sZEFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKQotCQkvLyBvbGRBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKTsKLQkJLy8gaWYgKG9sZEFkYXB0ZXIgIT0gcGFnZURpcmVjdGl2ZUFkYXB0ZXIgJiYgb2xkQWRhcHRlciAhPQotCQkvLyBwcm9wYWdhdGluZ0FkYXB0ZXIgJiYgb2xkQWRhcHRlciAhPSBtb2RlbFF1ZXJ5QWRhcHRlcikgewotCQkvLyAvLyBETyBOT1QgcmVtb3ZlIGRpcmVjdGx5IQotCQkvLyAvLyBjYW4gY2hhbmdlIGNvbnRlbnRzIHdoaWxlIGluIG5vdGlmaXR5IGxvb3AhCi0JCS8vIC8vb2xkQWRhcHRlcnNJdGVyYXRvci5yZW1vdmUoKTsKLQkJLy8gZG9jdW1lbnQucmVtb3ZlQWRhcHRlcihvbGRBZGFwdGVyKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIERNVzogSSBiZWxpZXZlIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgaXMgbmVlZGVkLAotCQkvLyBzaW5jZSByZWxlYXNlcyBjYWNoZWQgYWRhcHRlcnMKLQkJLy8gaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgRG9jdW1lbnRJbXBsKSB7Ci0JCS8vICgoRG9jdW1lbnRJbXBsKSBkb2N1bWVudCkucmVsZWFzZURvY3VtZW50VHlwZSgpOwotCQkvLyAoKERvY3VtZW50SW1wbCkgZG9jdW1lbnQpLnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQkvLyB9Ci0JCS8vIHJlbWVtYmVyLCBlbWJlZGRlZCB0eXBlIGZhY3RvcmllcyBhcmUgYXV0b21hdGljYWxseSBjbGVhcmVkIHdoZW4KLQkJLy8gZW1iZWRlZFR5cGUgY2hhbmdlZAotCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUobmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCS8vIC8vIGJ1dCBzdGlsbCBuZWVkIHRvIGNsZWFyIHRoZSBwYWdlIGRpcmVjdGl2ZSB3YXRjaGVycywgYW5kIGxldAotCQkvLyB0aGVtIGJlIHJlZGlzY292ZXJlZCAod2l0aCBuZXcsIGFjY3VyYXRlIG5vZGUgYXMgdGFyZ2V0KQotCQkvLyBwYWdlRGlyZWN0aXZlQWRhcHRlci5jbGVhclBhZ2VXYXRjaGVycygpOwotCQlpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCi0JCQkvLyBwYXJ0aXRpb25lciBzZXR1cCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhpcyBsb2FkZXIKLQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyIGRvY3VtZW50UGFydGl0aW9uZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCQkJLy8gSVNTVUU6IHRoaXMgbG9naWMgaXMgZmxhd2VkLCBub3Qgc3VyZSBvZiBvcmlnaW5hbCBpbnRlbnQsIGJ1dAotCQkJLy8gYWRkZWQgbnVsbC90eXBlIGNoZWNrcyBmb3Igc2FmZXR5LgotCQkJaWYgKGRvY3VtZW50UGFydGl0aW9uZXIgIT0gbnVsbCAmJiBkb2N1bWVudFBhcnRpdGlvbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgewotCQkJCWlmIChuZXdFbWJlZGRlZENvbnRlbnRUeXBlLmdldEZhbWlseUlkKCkuZXF1YWxzKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpKSB7Ci0JCQkJCSgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgZG9jdW1lbnRQYXJ0aXRpb25lcikuc2V0RW1iZWRkZWRQYXJ0aXRpb25lcihuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpKTsKLQkJCQl9IGVsc2UgaWYgKG5ld0VtYmVkZGVkQ29udGVudFR5cGUuZ2V0RmFtaWx5SWQoKS5lcXVhbHMoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKSkgewotCQkJCQkoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIGRvY3VtZW50UGFydGl0aW9uZXIpLnNldEVtYmVkZGVkUGFydGl0aW9uZXIobmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBhZGRpbmcgbGFuZ3VhZ2UgaGVyZSwgaW4gdGhpcyBjb252aWVuZW50IGNlbnRyYWwKLQkJLy8gbG9jYXRpb24sIGJ1dCBzb21lIG9idmlvdXMgcmVuYW1pbmcgb3IgcmVmYWN0b3JpbmcKLQkJLy8gd291bGRuJ3QgaHVydCwgaW4gZnV0dXJlLgotCQkvLyBJIG5lZWRlZCB0byBhZGQgdGhpcyBsYW5ndWFnZSBzZXR0aW5nIGZvciBKU1AgRnJhZ21lbnQgc3VwcG9ydAotCQkvLyBOb3RlOiB0aGlzIGlzIHRoZSBvbmUgdGhhdCBjb3VudHMsIHNpbmNlIGF0IHRoaXMgcG9pbnQsCi0JCS8vIHRoZSBtb2RlbCBoYXMgYW4gSUQsIHNvIHdlIGNhbiBsb29rIHVwIElGaWxlLCBldGMuCi0JCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG1vZGVsKTsKLQkJaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzICJyZWluaXRpYWxpemUiIHNpbmNlIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgdGhlCi0JICogZGVmYXVsdCBvbmUgYXNzaWduZWQsIGJlZm9yZSB3ZSBzdGFydCBjaGVja2luZyB0aGUgc3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRDbG9uZU9mRW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIEVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkRW1iZWRkZWRDb250ZW50VHlwZSwgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdFbWJlZGRlZENvbnRlbnRUeXBlKSB7Ci0JCS8vIGNoZWNrIHByb2dyYW0gbG9naWMKLQkJQXNzZXJ0LmlzTm90TnVsbChvbGRFbWJlZGRlZENvbnRlbnRUeXBlLCAiUHJvZ3JhbSBlcnJvcjogaW52YWxpZCBjYWxsIGR1cmluZyBtb2RlbCBpbml0aWFsaXphdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIG9uY2Ugd2Uga25vdyB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlLCB3ZSBuZWVkIHRvIHNldCBpdCBpbiB0aGUKLQkJLy8gUGFnZURpcmVjdGl2ZUFkYXB0ZXIgLi4uIHRoZSBvcmRlciBvZiBpbml0aWFsaXphdGlvbiBpcwotCQkvLyBjcml0aWNhbCBoZXJlLCB0aGUgZG9jIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGJ1dCBpdHMgY29udGVudHMgbm90Ci0JCS8vIHNldCB5ZXQsCi0JCS8vIGFuZCBhbGwgZmFjdG9yaWVzIG11c3QgaGF2ZSBiZWVuIHNldCB1cCBhbHNvLgotCQlYTUxNb2RlbCBkb21Nb2RlbCA9IChYTUxNb2RlbCkgbW9kZWw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCVhNTERvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJLy8gPT0+IC8vIE1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKQotCQkvLyAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJLy8gYmVjYXVzZSwgZXZlbiBpbiB0aGUgY2xvbmUgY2FzZSwgdGhlIG1vZGVsIGhhcyBiZWVuIHBhcml0YWxseQotCQkvLyBpbnRpYWxpemVkIHdpdGgKLQkJLy8gdGhlIG9sZCBlbWJlZGRlZCB0eXBlIChkdXJpbmcgY3JlYXRlTW9kZWwpLCB3ZSBuZWVkIHRvIHVuaXRpYWxpemUKLQkJLy8gcGFydHMgb2YgaXQsIGJhc2VkIG9uIHRoZSBvbGQgKG9yIGRlZmF1bHQpIG9uZXMKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQlvbGRFbWJlZGRlZENvbnRlbnRUeXBlLnVuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJLy8gcmVtZW1iZXIsIGVtYmVkZGVkIHR5cGUgZmFjdG9yaWVzIGFyZSBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgd2hlbgotCQkvLyBlbWJlZGVkVHlwZSBjaGFuZ2VkCi0JCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldEVtYmVkZGVkVHlwZShuZXdFbWJlZGRlZENvbnRlbnRUeXBlKTsKLQkJaWYgKG5ld0VtYmVkZGVkQ29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJCW5ld0VtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJfQotCQkvLyBhZGRpbmcgbGFuZ3VhZ2UgaGVyZSwgaW4gdGhpcyBjb252aWVuZW50IGNlbnRyYWwKLQkJLy8gbG9jYXRpb24sIGJ1dCBzb21lIG9idmlvdXMgcmVuYW1pbmcgb3IgcmVmYWN0b3JpbmcKLQkJLy8gd291bGRuJ3QgaHVydCwgaW4gZnV0dXJlLgotCQkvLyBJIG5lZWRlZCB0byBhZGQgdGhpcyBsYW5ndWFnZSBzZXR0aW5nIGZvciBKU1AgRnJhZ21lbnQgc3VwcG9ydAotCQkvLyBOb3RlOiB0aGlzIGlzIHRoZSBvbmUgdGhhdCBjb3VudHMsIHNpbmNlIGF0IHRoaXMgcG9pbnQsCi0JCS8vIHRoZSBtb2RlbCBoYXMgYW4gSUQsIHNvIHdlIGNhbiBsb29rIHVwIElGaWxlLCBldGMuCi0JCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG1vZGVsKTsKLQkJaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJRG9jdW1lbnQgZG9jID0gKChYTUxNb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvYykuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRIYW5kbGVyID0gcGFnZURpcmVjdGl2ZUFkYXB0ZXIuZ2V0RW1iZWRkZWRUeXBlKCk7Ci0JCXJldHVybiBlbWJlZGRlZEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWluaXRpYWxpemVFbWJlZGRlZFR5cGVGcm9tRGVmYXVsdChtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZXhpc3RpbmdFbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUob2xkTW9kZWwpOwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0VtYmVkZGVkQ29udGVudFR5cGUgPSBleGlzdGluZ0VtYmVkZGVkVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlpZiAoZXhpc3RpbmdFbWJlZGRlZFR5cGUgPT0gbnVsbCkgewotCQkJaW5pdEVtYmVkZGVkVHlwZShuZXdNb2RlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpbml0RW1iZWRkZWRUeXBlKG5ld01vZGVsKTsKLQkJCWluaXRDbG9uZU9mRW1iZWRkZWRUeXBlKG5ld01vZGVsLCBleGlzdGluZ0VtYmVkZGVkVHlwZSwgbmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCX0KLQkJc2V0TGFuZ3VhZ2VJblBhZ2VEaXJlY3RpdmUobmV3TW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldExhbmd1YWdlSW5QYWdlRGlyZWN0aXZlKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJaWYgKG5ld01vZGVsIGluc3RhbmNlb2YgWE1MTW9kZWwpIHsKLQkJCVhNTERvY3VtZW50IGRvY3VtZW50ID0gKChYTUxNb2RlbCkgbmV3TW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQlTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShuZXdNb2RlbCk7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEhhbmRsZXIgPSBudWxsOwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0hhbmRsZXIgPSBudWxsOwotCQlPYmplY3QgcmVpbml0U3RhdGVEYXRhID0gbW9kZWwuZ2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKCk7Ci0JCWlmIChyZWluaXRTdGF0ZURhdGEgaW5zdGFuY2VvZiBFbWJlZGRlZFR5cGVTdGF0ZURhdGEpIHsKLQkJCUVtYmVkZGVkVHlwZVN0YXRlRGF0YSBvbGRTdGF0ZURhdGEgPSAoRW1iZWRkZWRUeXBlU3RhdGVEYXRhKSByZWluaXRTdGF0ZURhdGE7Ci0JCQlvbGRIYW5kbGVyID0gb2xkU3RhdGVEYXRhLmdldE9sZEhhbmRsZXIoKTsKLQkJCW5ld0hhbmRsZXIgPSBvbGRTdGF0ZURhdGEuZ2V0TmV3SGFuZGxlcigpOwotCQkJLy8gbm90ZS4gV2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSB0aGUgbmV3IGhhbmRsZXIgaW4gdGhlIG1vZGVsJ3MKLQkJCS8vIChkb2N1bWVudHMpIGFkYXB0ZXJzLAotCQkJLy8gc28gbmVlZCBuZWVkIHRvIHVzZSB0aGUgb2xkIG9uZSB0byB1bmRvIHRoZSBvbGQgc3RhdGUgZGF0YQotCQkJcmVJbml0aWFsaXplRW1iZWRkZWRUeXBlKG1vZGVsLCBvbGRIYW5kbGVyLCBuZXdIYW5kbGVyKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGZvciBsYW5ndWFnZSAuLi4gd2Ugc29tZWRheSBNSUdIVCBoYXZlIHRvIGRvIHNvbWV0aGluZwotCQkJLy8gaGVyZSwgYnV0IGZvciBub3csIHdlIGRvbid0IGhhdmUgYW55IG1vZGVsLXNpZGUgbGFuZ3VhZ2UKLQkJCS8vIHNlbnNpdGl2ZSBhZGFwdGVycy4KLQkJfQotCQlyZXR1cm4gc3VwZXIucmVpbml0aWFsaXplKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSlNQTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IEpTUERvY3VtZW50TG9hZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IGFuIElucHV0U3RyZWFtIGhhcyBtYXJrL3Jlc2V0IHN1cHBvcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRNYXJrU3VwcG9ydGVkU3RyZWFtKElucHV0U3RyZWFtIG9yaWdpbmFsKSB7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvcmlnaW5hbC5tYXJrU3VwcG9ydGVkKCkpCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShvcmlnaW5hbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJ5dGVbXSBnZXRCeXRlcyhJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IG1heCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIHNtYWxsQnVmZmVyID0gbmV3IGJ5dGVbbWF4XTsKLQkJYnl0ZVtdIHJldHVybkJ1ZmZlciA9IG51bGw7Ci0JCWludCBuUmVhZCA9IGlucHV0U3RyZWFtLnJlYWQoc21hbGxCdWZmZXIsIDAsIG1heCk7Ci0JCWlmIChuUmVhZCA8IG1heCkgewotCQkJLy8gZW1wdHkgZmlsZSB3aWxsIHJldHVybiAtMTsKLQkJCWlmIChuUmVhZCA8IDApCi0JCQkJblJlYWQgPSAwOwotCQkJYnl0ZVtdIHNtYWxsZXJCdWZmZXIgPSBuZXcgYnl0ZVtuUmVhZF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNtYWxsQnVmZmVyLCAwLCBzbWFsbGVyQnVmZmVyLCAwLCBuUmVhZCk7Ci0JCQlyZXR1cm5CdWZmZXIgPSBzbWFsbGVyQnVmZmVyOwotCQl9IGVsc2UgewotCQkJcmV0dXJuQnVmZmVyID0gc21hbGxCdWZmZXI7Ci0JCX0KLQkJcmV0dXJuIHJldHVybkJ1ZmZlcjsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MTFkMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmVuY29kaW5nLkpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZW5jb2RpbmcuSlNQRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50TG9hZGVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Nb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JKU1AgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyRm9ySlNQKCkgewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9Ci0KLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFnZURlc2lnbmVyID0KLQkvLyAiY29tLmlibS5ldG9vbHMud2ViZWRpdC5wYWdlLlBhZ2VEZXNpZ25lciI7IC8vJE5PTi1OTFMtMSQKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTEVkaXRvciA9Ci0JLy8gImNvbS5pYm0uZXRvb2xzLndlYmVkaXQuZWRpdG9yLkhUTUxFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKU1BUYWdOYW1lKEpTUFNvdXJjZVBhcnNlciBwYXJzZXIsIFN0cmluZyB0YWduYW1lKSB7Ci0JCUJsb2NrTWFya2VyIGJtID0gbmV3IEJsb2NrTWFya2VyKHRhZ25hbWUsIG51bGwsIFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCB0cnVlKTsKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKGJtKTsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNQTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoVVNFX0ZJTEVfQlVGRkVSUykKLQkJCXJldHVybiBuZXcgRG9jdW1lbnRMb2FkZXJGb3JKU1AoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBKU1BEb2N1bWVudExvYWRlcigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhNjY5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLklkUmVzb2x2ZXI7Ci0KLQotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbCBleHRlbmRzIE1vZGVsUXVlcnlBZGFwdGVySW1wbCB7Ci0JcHVibGljIEpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbChDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlLCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnksIElkUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlzdXBlcihjbURvY3VtZW50Q2FjaGUsIG1vZGVsUXVlcnksIGlkUmVzb2x2ZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTFiYzY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlNpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSlNQTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbFF1ZXJ5Q01Qcm92aWRlcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBKU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIobmV3IEpTUE1vZGVsUXVlcnlDTVByb3ZpZGVyKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJjMDliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIENNRG9jdW1lbnQgcHJvdmlkZXIgZm9yIEhUTUwgYW5kIEpTUCBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlciBpbXBsZW1lbnRzIE1vZGVsUXVlcnlDTVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBKU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLiBvciBudWxsIGlmIG5vCi0JICogQ01Eb2N1bWVudCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkgewotCQlDTURvY3VtZW50IGpjbWRvYyA9IEpTUENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoKTsKLQotCQlDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCi0JCQkJLy8gdGVzdCB0byBzZWUgaWYgdGhpcyBub2RlIGJlbG9uZ3MgdG8gSlNQJ3MgQ01Eb2N1bWVudCAoY2FzZQotCQkJCS8vIHNlbnNpdGl2ZSkKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGpjbWRvYy5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50TmFtZSk7Ci0JCQkJaWYgKGRlYyAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGpjbWRvYzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBwcmVmaXggPSBub2RlLmdldFByZWZpeCgpOwotCi0JCQlpZiAocmVzdWx0ID09IG51bGwgJiYgcHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCAmJiBub2RlIGluc3RhbmNlb2YgWE1MTm9kZSkgewotCQkJCS8vIGNoZWNrIHBvc2l0aW9uIGRlcGVuZGVudAotCQkJCVhNTE5vZGUgeG1sTm9kZSA9IChYTUxOb2RlKSBub2RlOwotCQkJCVRMRENNRG9jdW1lbnRNYW5hZ2VyIHRsZG1nciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoeG1sTm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJaWYgKHRsZG1nciAhPSBudWxsKSB7Ci0JCQkJCUxpc3QgZG9jdW1lbnRzID0gdGxkbWdyLmdldENNRG9jdW1lbnRUcmFja2Vycyhub2RlLmdldFByZWZpeCgpLCB4bWxOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkvLyB0aGVyZSBzaG91bGRuJ3QgYmUgbW9yZSB0aGFuIG9uZSBjbWRvY3VtZW50IHJldHVybmVkCi0JCQkJCWlmIChkb2N1bWVudHMgIT0gbnVsbCAmJiBkb2N1bWVudHMuc2l6ZSgpID4gMCkKLQkJCQkJCXJlc3VsdCA9IChDTURvY3VtZW50KSBkb2N1bWVudHMuZ2V0KDApOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU5MjU1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuSWRSZXNvbHZlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgewotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwganNwTW9kZWwgPSBudWxsOwotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGVtYmVkZGVkTW9kZWxRdWVyeSA9IG51bGw7Ci0JcHVibGljIEpTUE1vZGVsUXVlcnlJbXBsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElkUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJc3VwZXIobmV3IEpTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKCkpOwotCQlqc3BNb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2RlbFF1ZXJ5I2dldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQpCi0JICovCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBzdXBlci5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KGVsZW1lbnQpOwotCQkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogQHNlZSBNb2RlbFF1ZXJ5I2dldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUpCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKSB7Ci0JCUNNRG9jdW1lbnQgZG9jID0gc3VwZXIuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBxdWVyeSA9IGdldEVtYmVkZGVkTW9kZWxRdWVyeShub2RlKTsKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJZG9jID0gcXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kZWxRdWVyeSNnZXRDTU5vZGUoTm9kZSkKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldENNTm9kZShOb2RlIG5vZGUpIHsKLQkJQ01Ob2RlIHJlc3VsdCA9IHN1cGVyLmdldENNTm9kZShub2RlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KG5vZGUpOwotCQkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBxdWVyeS5nZXRDTU5vZGUobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucykgewotCQlNb2RlbFF1ZXJ5IGVtcSA9IGdldEVtYmVkZGVkTW9kZWxRdWVyeShlbGVtZW50KTsKLQkJaWYgKGVtcSAhPSBudWxsKQotCQkJcmV0dXJuIGVtcS5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0JfQotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KE5vZGUgbm9kZSkgewotCQlpZiAodGhpcy5lbWJlZGRlZE1vZGVsUXVlcnkgPT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJTm9kZSBvd25lck5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChvd25lck5vZGUgPT0gbnVsbCkgewotCQkJCS8vIHRoZW4gbXVzdCBiZSB0aGUgZG9jdW1lbnQgaXRzZWxmCi0JCQkJb3duZXJOb2RlID0gbm9kZTsKLQkJCX0KLQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHR5cGVhZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIG93bmVyTm9kZSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAodHlwZWFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCU1vZGVsUXVlcnlBZGFwdGVyIGVtYmVkZGVkQWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgdHlwZWFkYXB0ZXIuYWRhcHQoKElOb2RlTm90aWZpZXIpIG5vZGUsIE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoZW1iZWRkZWRBZGFwdGVyICE9IG51bGwpCi0JCQkJCXRoaXMuZW1iZWRkZWRNb2RlbFF1ZXJ5ID0gZW1iZWRkZWRBZGFwdGVyLmdldE1vZGVsUXVlcnkoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5lbWJlZGRlZE1vZGVsUXVlcnk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5I2dldENNQXR0cmlidXRlRGVjbGFyYXRpb24ob3JnLnczYy5kb20uQXR0cikKLQkgKi8KLQlwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikgewotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlc3VsdCA9IHN1cGVyLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBxdWVyeSA9IGdldEVtYmVkZGVkTW9kZWxRdWVyeShhdHRyKTsKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVlcnkuZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNzhmY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbHF1ZXJ5LlhNTENhdGFsb2dJZFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIudXRpbC5JZFJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbCBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBzdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AoKSB7Ci0JCXRoaXMoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyS2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQKE9iamVjdCBrZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihrZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCh0aGlzLmFkYXB0ZXJLZXksIHRoaXMuc2hvdWxkUmVnaXN0ZXJBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBZGFwdGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCi0JCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AuY3JlYXRlQWRhcHRlciIgKyB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlckltcGwgPT0gbnVsbCkgewotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhNTE5vZGUpIHsKLQkJCQlYTUxOb2RlIHhtbE5vZGUgPSAoWE1MTm9kZSkgdGFyZ2V0OwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBzdGF0ZU5vdGlmaWVyID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkvLyBjb250aW51ZSBvbmx5IGlmIHRoZSBsb2NhdGlvbiBpcyBrbm93bgotCQkJCWlmKGJhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXN0YXRlTm90aWZpZXIuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJCQlDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlID0gbmV3IENNRG9jdW1lbnRDYWNoZSgpOwotCQkJCQlGaWxlIGZpbGUgPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSkudG9GaWxlKCk7Ci0JCQkJCWlmKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCWJhc2VMb2NhdGlvbiA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQliYXNlTG9jYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCUlkUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKTsKLQkKLQkJCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gbmV3IEpTUE1vZGVsUXVlcnlJbXBsKG1vZGVsLCByZXNvbHZlcik7Ci0JCQkJCW1vZGVsUXVlcnkuc2V0RWRpdE1vZGUoTW9kZWxRdWVyeS5FRElUX01PREVfVU5DT05TVFJBSU5FRCk7Ci0JCQkJCW1vZGVsUXVlcnlBZGFwdGVySW1wbCA9IG5ldyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwoY21Eb2N1bWVudENhY2hlLCBtb2RlbFF1ZXJ5LCByZXNvbHZlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsLAotCSAqICAgICAgSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkvLyBpZiBvbGRNb2RlbCAhPSBuZXdNb2RlbCwgYmFkIHRoaW5ncyBtaWdodCBoYXBwZW4gd2l0aCB0aGUgYWRhcHRlcgotCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJc3RhdGVOb3RpZmllciA9IG5ld01vZGVsOwotCQl1cGRhdGVSZXNvbHZlcihzdGF0ZU5vdGlmaWVyKTsKLQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWlmIChzdGF0ZU5vdGlmaWVyICE9IG51bGwpIHsKLQkJCXN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXN0YXRlTm90aWZpZXIgPSBudWxsOwotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXJJbXBsICE9IG51bGwpIHsKLQkJCW1vZGVsUXVlcnlBZGFwdGVySW1wbC5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZXNvbHZlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUZpbGUgYmFzZUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwuc2V0SWRSZXNvbHZlcihuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3Yzg2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1jc3Ntb2RlbC5qYXIKLWJ1aWxkLnhtbAotZGV2LnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDk3NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwNDZlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMGQ3NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotI1dlZCBKYW4gMTIgMTM6MjQ6MjYgRVNUIDIwMDUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFhMWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICBjc3MuamFyLFwKLSAgICAgICAgICAgICAgIGNzc3Byb2ZpbGUvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UuY3NzbW9kZWwuamFyID0gc3JjLwotc3JjLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBjc3Nwcm9maWxlLyxcCi0gICAgICAgICAgICAgICBidWlsZC54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzLXByb2ZpbGUuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3MtcHJvZmlsZS5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTM1YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3MtcHJvZmlsZS5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPCEtLSBEVEQgZm9yIENTUyBNZXRhIE1vZGVsIFByb2ZpbGUgLS0+Ci0KLTwhLS0gRW50aXRpZXMgLS0+Ci0KLTwhLS0gbmFtZS1kZWZpbml0aW9uCTogSW4gZGVmaW5pbmcgbWV0YSBtb2RlbCBvYmplY3QsIG9iamVjdCBuYW1lIC0tPgotPCEtLSBpcyBnaXZlbiBieSB1c2luZyB0aGlzIGF0dHJpYnV0ZS4gLS0+Ci0KLTwhRU5USVRZICUgbmFtZS1kZWZpbml0aW9uICduYW1lIENEQVRBICNSRVFVSVJFRCcgPgotCi08IS0tIG5hbWUtcmVmZXJlbmNlCQk6IHVzZWQgdG8gcmVmZXIgbWV0YSBtb2RlbCBvYmplY3QgdGhhdCBkZWZpbmVkIC0tPgotPCEtLSBieSBuYW1lLWRlZmluaXRpb24gLS0+Ci0KLTwhRU5USVRZICUgbmFtZS1yZWZlcmVuY2UgJ25hbWUgQ0RBVEEgI1JFUVVJUkVEJyA+Ci0KLTwhLS0gYXZhaWxhYmlsaXR5CQk6IENTUyBNZXRhIE1vZGVsIFByb2ZpbGUgcGVybWl0IGltcG9ydGluZyAtLT4KLTwhLS0gb3RoZXIgcHJvZmlsZSBhbmQgZGVzY3JpYmUgZGlmZmVyZW5jZSBmb3IgaXQuIC0tPgotCi08IUVOVElUWSAlIGF2YWlsYWJpbGl0eSAnZW5hYmxlZCAodHJ1ZSB8IGZhbHNlKSAidHJ1ZSInID4KLTwhRU5USVRZICUgb3ZlcndyaXRlICdvdmVyd3JpdGUgKHRydWUgfCBmYWxzZSkgImZhbHNlIicgPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqIC0tPgotPCEtLSAgZWxtZW50cy9hdHRyaWJ1dGVzICAtLT4KLTwhLS0gKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTwhRUxFTUVOVCBjc3MtcHJvZmlsZSAocHJvZmlsZS1pbXBvcnQ/ICwgKHN0eWxlc2hlZXQtZGVmIHwgY2hhcnNldC1ydWxlLWRlZiB8IGltcG9ydC1ydWxlLWRlZiB8IHBhZ2UtcnVsZS1kZWYgfCBtZWRpYS1ydWxlLWRlZiB8IGZvbnRmYWNlLXJ1bGUtZGVmIHwgc3R5bGUtcnVsZS1kZWYgfCBwcm9wZXJ0eS1kZWYgfCBkZXNjcmlwdG9yLWRlZiB8IGNvbnRhaW5lci1kZWYgfCBmdW5jdGlvbi1kZWYgfCBudW1iZXItZGVmIHwgdW5pdC1kZWYgfCBrZXl3b3JkLWRlZiB8IGNhdGVnb3J5LWRlZiB8IHBzZXVkby1lbGVtZW50LWRlZiB8IHBzZXVkby1jbGFzcy1kZWYpKikgPgotCi08IS0tIGEgcHJvZmlsZSBjYW4gaW5jbHVkZSBvdGhlciBwcm9maWxlIC0tPgotCi08IUVMRU1FTlQgcHJvZmlsZS1pbXBvcnQgRU1QVFkgPgotPCFBVFRMSVNUIHByb2ZpbGUtaW1wb3J0IG5hbWUgQ0RBVEEgI1JFUVVJUkVEID4KLQotPCEtLSB3aGljaCB0eXBlIG9mIHJ1bGUgY2FuIGJlIHVzZWQ/IC0tPgotCi08IUVMRU1FTlQgc3R5bGVzaGVldC1kZWYgKGRlc2NyaXB0aW9uPyAsIChjaGFyc2V0LXJ1bGUgfCBpbXBvcnQtcnVsZSB8IHBhZ2UtcnVsZSB8IG1lZGlhLXJ1bGUgfCBmb250ZmFjZS1ydWxlIHwgc3R5bGUtcnVsZSkqKSA+Ci08IUFUVExJU1Qgc3R5bGVzaGVldC1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgY2hhcnNldC1ydWxlIEVNUFRZID4KLTwhQVRUTElTVCBjaGFyc2V0LXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIGltcG9ydC1ydWxlIEVNUFRZID4KLTwhQVRUTElTVCBpbXBvcnQtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgcGFnZS1ydWxlIEVNUFRZID4KLTwhQVRUTElTVCBwYWdlLXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIG1lZGlhLXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIG1lZGlhLXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIGZvbnRmYWNlLXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIGZvbnRmYWNlLXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIHN0eWxlLXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIHN0eWxlLXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotCi08IUVMRU1FTlQgY2hhcnNldC1ydWxlLWRlZiAoZGVzY3JpcHRpb24/KSA+Ci08IUFUVExJU1QgY2hhcnNldC1ydWxlLWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBpbXBvcnQtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPykgPgotPCFBVFRMSVNUIGltcG9ydC1ydWxlLWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBwYWdlLXJ1bGUtZGVmIChkZXNjcmlwdGlvbj8gLCAocHJvcGVydHkgfCBwc2V1ZG8tY2xhc3MpKikgPgotPCFBVFRMSVNUIHBhZ2UtcnVsZS1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgbWVkaWEtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPykgPgotPCFBVFRMSVNUIG1lZGlhLXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIGZvbnRmYWNlLXJ1bGUtZGVmIChkZXNjcmlwdGlvbj8gLCBkZXNjcmlwdG9yKikgPgotPCFBVFRMSVNUIGZvbnRmYWNlLXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIHN0eWxlLXJ1bGUtZGVmIChkZXNjcmlwdGlvbj8gLCAocHJvcGVydHkgfCBzZWxlY3Rvci1leHByZXNzaW9uIHwgcHNldWRvLWNsYXNzIHwgcHNldWRvLWVsZW1lbnQpKikgPgotPCFBVFRMSVNUIHN0eWxlLXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIHNlbGVjdG9yLWV4cHJlc3Npb24gRU1QVFkgPgotPCFBVFRMSVNUIHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZSAoZGVzY2VuZGFudCB8IGNoaWxkIHwgYWRqYWNlbnQgfCB1bml2ZXJzYWwgfCBhdHRyaWJ1dGUpICNSRVFVSVJFRCAlYXZhaWxhYmlsaXR5OyA+Ci0KLTwhRUxFTUVOVCBwc2V1ZG8tY2xhc3MgRU1QVFkgPgotPCFBVFRMSVNUIHBzZXVkby1jbGFzcyAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KLQotPCFFTEVNRU5UIHBzZXVkby1lbGVtZW50IEVNUFRZID4KLTwhQVRUTElTVCBwc2V1ZG8tZWxlbWVudCAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KLQotPCFFTEVNRU5UIHBzZXVkby1jbGFzcy1kZWYgKGRlc2NyaXB0aW9uPywgc2VsZWN0b3ItdmFsdWUpID4KLTwhQVRUTElTVCBwc2V1ZG8tY2xhc3MtZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLTwhRUxFTUVOVCBzZWxlY3Rvci12YWx1ZSAoI1BDREFUQSkgPgotCi08IUVMRU1FTlQgcHNldWRvLWVsZW1lbnQtZGVmIChkZXNjcmlwdGlvbj8sIHNlbGVjdG9yLXZhbHVlKSA+Ci08IUFUVExJU1QgcHNldWRvLWVsZW1lbnQtZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIGtleXdvcmQtZGVmIChkZXNjcmlwdGlvbj8gLCBrZXl3b3JkLXZhbHVlKSA+Ci08IUFUVExJU1Qga2V5d29yZC1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotPCFFTEVNRU5UIGtleXdvcmQtdmFsdWUgKCNQQ0RBVEEpID4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSkgPgotCi08IUVMRU1FTlQgZnVuY3Rpb24tZGVmIChkZXNjcmlwdGlvbj8gLCBmdW5jdGlvbi12YWx1ZSkgPgotPCFBVFRMSVNUIGZ1bmN0aW9uLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQgZnVuY3Rpb24tdmFsdWUgKCNQQ0RBVEEpID4KLQotPCFFTEVNRU5UIG51bWJlci1kZWYgKGRlc2NyaXB0aW9uPyAsIHVuaXQqKSA+Ci08IUFUVExJU1QgbnVtYmVyLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQgdW5pdCBFTVBUWSA+Ci08IUFUVExJU1QgdW5pdCAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KLQotPCFFTEVNRU5UIHVuaXQtZGVmIChkZXNjcmlwdGlvbj8gLCB1bml0LXZhbHVlKSA+Ci08IUFUVExJU1QgdW5pdC1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotPCFFTEVNRU5UIHVuaXQtdmFsdWUgKCNQQ0RBVEEpID4KLQotPCFFTEVNRU5UIGNvbnRhaW5lci1kZWYgKGRlc2NyaXB0aW9uPyAsIChudW1iZXIgfCBrZXl3b3JkIHwgZnVuY3Rpb24gfCBjb250YWluZXIpKikgPgotPCFBVFRMSVNUIGNvbnRhaW5lci1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgY2F0ZWdvcnktZGVmIChkZXNjcmlwdGlvbj8sIGNhcHRpb24pID4KLTwhQVRUTElTVCBjYXRlZ29yeS1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotPCFFTEVNRU5UIGNhcHRpb24gKCNQQ0RBVEEpID4KLQotPCFFTEVNRU5UIHByb3BlcnR5LWRlZiAoZGVzY3JpcHRpb24/ICwgKG51bWJlciB8IGtleXdvcmQgfCBmdW5jdGlvbiB8IGNvbnRhaW5lciB8IHN0cmluZyB8IHNlcGFyYXRvciB8IHByb3BlcnR5KSopID4KLTwhQVRUTElTVCBwcm9wZXJ0eS1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsKLQkJCQkJICAgaW5oZXJpdGVkICh5ZXMgfCBubyB8IG5hKSAibmEiCi0JCQkJCSAgIG1lZGlhZ3JvdXAgQ0RBVEEgI0lNUExJRUQKLQkJCQkJICAgY2F0ZWdvcnkgQ0RBVEEgI0lNUExJRUQgPgotPCFFTEVNRU5UIGRlc2NyaXB0b3ItZGVmIChkZXNjcmlwdGlvbj8sIChudW1iZXIgfCBrZXl3b3JkIHwgZnVuY3Rpb24gfCBjb250YWluZXIgfCBzdHJpbmcgfCBzZXBhcmF0b3IgfCBwcm9wZXJ0eSkqKSA+Ci08IUFUVExJU1QgZGVzY3JpcHRvci1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgbnVtYmVyIEVNUFRZID4KLTwhQVRUTElTVCBudW1iZXIgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+IAotPCFFTEVNRU5UIGtleXdvcmQgRU1QVFkgPgotPCFBVFRMSVNUIGtleXdvcmQgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+IAotPCFFTEVNRU5UIGZ1bmN0aW9uIEVNUFRZID4KLTwhQVRUTElTVCBmdW5jdGlvbiAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBjb250YWluZXIgRU1QVFkgPgotPCFBVFRMSVNUIGNvbnRhaW5lciAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4gCi08IUVMRU1FTlQgc3RyaW5nIEVNUFRZID4KLTwhQVRUTElTVCBzdHJpbmcgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgc2VwYXJhdG9yIEVNUFRZID4KLTwhQVRUTElTVCBzZXBhcmF0b3IgbmFtZSAoY29tbWEgfCBzbGFzaCkgI1JFUVVJUkVEICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBwcm9wZXJ0eSBFTVBUWSA+Ci08IUFUVExJU1QgcHJvcGVydHkgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+IAotPCFFTEVNRU5UIGRlc2NyaXB0b3IgRU1QVFkgPgotPCFBVFRMSVNUIGRlc2NyaXB0b3IgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGIxNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLTwhRE9DVFlQRSBjc3MtcHJvZmlsZSBTWVNURU0gImNzcy1wcm9maWxlLmR0ZCIgPi0tPgotPGNzcy1wcm9maWxlPgotCTxzdHlsZXNoZWV0LWRlZj4KLQkJPGRlc2NyaXB0aW9uPiVjc3MxLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPGltcG9ydC1ydWxlLz4KLQkJPHN0eWxlLXJ1bGUvPgotCTwvc3R5bGVzaGVldC1kZWY+Ci0KLQk8aW1wb3J0LXJ1bGUtZGVmPgotCTwvaW1wb3J0LXJ1bGUtZGVmPgotCi0JPHN0eWxlLXJ1bGUtZGVmPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJkZXNjZW5kYW50Ii8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJmaXJzdC1saW5lIi8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJmaXJzdC1sZXR0ZXIiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJsaW5rIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0idmlzaXRlZCIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImFjdGl2ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWltYWdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1sZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjbGVhciIvPgotCQk8cHJvcGVydHkgbmFtZT0iY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRpc3BsYXkiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZsb2F0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LWZhbWlseSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXZhcmlhbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtd2VpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJoZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxldHRlci1zcGFjaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS10eXBlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1sZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tcmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi10b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctcmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctdG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LWFsaWduIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtaW5kZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LXRyYW5zZm9ybSIvPgotCQk8cHJvcGVydHkgbmFtZT0idmVydGljYWwtYWxpZ24iLz4KLQkJPHByb3BlcnR5IG5hbWU9IndoaXRlLXNwYWNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0id29yZC1zcGFjaW5nIi8+Ci0JPC9zdHlsZS1ydWxlLWRlZj4KLQotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImxpbmsiPgotCQk8c2VsZWN0b3ItdmFsdWU+bGluazwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9InZpc2l0ZWQiPgotCQk8c2VsZWN0b3ItdmFsdWU+dmlzaXRlZDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImFjdGl2ZSI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5hY3RpdmU8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iZmlyc3QtbGluZSI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdC1saW5lPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1lbGVtZW50LWRlZj4KLQk8cHNldWRvLWVsZW1lbnQtZGVmIG5hbWU9ImZpcnN0LWxldHRlciI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdC1sZXR0ZXI8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWVsZW1lbnQtZGVmPgotCi0JPCEtLSBwcm9wZXJ0eSBkZWZpbml0aW9uIC0tPgotCi0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtY29sb3IiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtaW1hZ2UiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcmVwZWF0Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcG9zaXRpb24iLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InNjcm9sbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJmaXhlZCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1jb2xvciIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0idHJhbnNwYXJlbnQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtaW1hZ2UiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtcG9zaXRpb24iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1yZXBlYXQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0LXgiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0LXkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm8tcmVwZWF0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXIiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWNvbG9yIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXN0eWxlIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJkb3R0ZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGFzaGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNvbGlkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRvdWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJncm9vdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlkZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5zZXQiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3V0c2V0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3Atd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItcmlnaHQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWJvdHRvbSIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWxlZnQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wLXdpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0idGhpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaWNrIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0idGhpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1sZWZ0LXdpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0idGhpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci13aWR0aCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaWNrIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjbGVhciIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJib3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjb2xvciIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJkaXNwbGF5IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8a2V5d29yZCBuYW1lPSJibG9jayIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGlzdC1pdGVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZsb2F0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250IgotCQlpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC12YXJpYW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXdlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1mYW1pbHkiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJzbGFzaCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1mYW1pbHkiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxzdHJpbmcgbmFtZT0iZmFtaWx5LW5hbWUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJnZW5lcmljLWZhbWlseSIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXNpemUiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYWJzb2x1dGUtc2l6ZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9InJlbGF0aXZlLXNpemUiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXN0eWxlIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iaXRhbGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9ibGlxdWUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtdmFyaWFudCIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNtYWxsLWNhcHMiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtd2VpZ2h0IiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm9sZCIvPgotCQk8a2V5d29yZCBuYW1lPSJib2xkZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGlnaHRlciIvPgotCQk8a2V5d29yZCBuYW1lPSIxMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjMwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI0MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjYwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI3MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iODAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjkwMCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iaGVpZ2h0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImxldHRlci1zcGFjaW5nIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImxpbmUtaGVpZ2h0IiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImNsYXNzaWZpY2F0aW9uIj4KLQkJPGtleXdvcmQgbmFtZT0iZGlzYyIvPgotCQk8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlY2ltYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbnNpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3V0c2lkZSIvPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtaW1hZ2UiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtcG9zaXRpb24iIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8a2V5d29yZCBuYW1lPSJpbnNpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3V0c2lkZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS10eXBlIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImNsYXNzaWZpY2F0aW9uIj4KLQkJPGtleXdvcmQgbmFtZT0iZGlzYyIvPgotCQk8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlY2ltYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi10b3AiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLXJpZ2h0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi1ib3R0b20iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLWxlZnQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZyIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy10b3AiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctcmlnaHQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctYm90dG9tIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLWxlZnQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtYWxpZ24iIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imp1c3RpZnkiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtZGVjb3JhdGlvbiIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVuZGVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdmVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsaW5lLXRocm91Z2giLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxpbmsiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtaW5kZW50IiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtdHJhbnNmb3JtIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJjYXBpdGFsaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyY2FzZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlcmNhc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idmVydGljYWwtYWxpZ24iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0iYmFzZWxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3ViIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN1cGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZXh0LXRvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJtaWRkbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm90dG9tIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRleHQtYm90dG9tIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2hpdGUtc3BhY2UiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0icHJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vd3JhcCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2lkdGgiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id29yZC1zcGFjaW5nIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQotCTwhLS0gY29udGFpbmVyIGRlZmluaXRpb24gOiBDb250YWluZXIgaXMgdGhlIGx1bXAgb2YgdmFsdWVzLgotCUl0IGNhbiBiZSB1c2VkIGxpa2UgbWFjcm9zLiAtLT4KLSAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJhYnNvbHV0ZS1zaXplIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieHgtc21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieC1zbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibGFyZ2UiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieC1sYXJnZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4eC1sYXJnZSIvPgotICAgIDwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJjb2xvciI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFxdWEiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxhY2siLz4KLQkJPGtleXdvcmQgbmFtZT0iYmx1ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmdWNoc2lhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImdyYXkiLz4KLQkJPGtleXdvcmQgbmFtZT0iZ3JlZW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGltZSIvPgotCQk8a2V5d29yZCBuYW1lPSJtYXJvb24iLz4KLQkJPGtleXdvcmQgbmFtZT0ibmF2eSIvPgotCQk8a2V5d29yZCBuYW1lPSJvbGl2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJwdXJwbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNpbHZlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IndoaXRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InllbGxvdyIvPgotCQk8ZnVuY3Rpb24gbmFtZT0icmdiIi8+Ci0JCTxudW1iZXIgbmFtZT0iaGFzaCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJnZW5lcmljLWZhbWlseSI+Ci0JCTxrZXl3b3JkIG5hbWU9InNlcmlmIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNhbnMtc2VyaWYiLz4KLQkJPGtleXdvcmQgbmFtZT0iY3Vyc2l2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmYW50YXN5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1vbm9zcGFjZSIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJyZWxhdGl2ZS1zaXplIj4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGxlciIvPgotCQk8a2V5d29yZCBuYW1lPSJsYXJnZXIiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0KLQk8IS0tIGNhdGVnb3J5IGRlZmluaXRpb24gOiBUaGlzIGlzIHVzZWQgdG8gY2F0ZWdvcml6ZSBwcm9wZXJ0aWVzCi0JaW4gUHJvcGVydGllcyBWaWV3LiAtLT4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImJveCI+Ci0JCTxjYXB0aW9uPiVjc3MxLmNhdGVnb3J5LWRlZi5ib3guY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxjYXB0aW9uPiVjc3MxLmNhdGVnb3J5LWRlZi5jb2xvcmFuZGJhY2tncm91bmQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImNsYXNzaWZpY2F0aW9uIj4KLQkJPGNhcHRpb24+JWNzczEuY2F0ZWdvcnktZGVmLmNsYXNzaWZpY2F0aW9uLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJmb250Ij4KLQkJPGNhcHRpb24+JWNzczEuY2F0ZWdvcnktZGVmLmZvbnQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InRleHQiPgotCQk8Y2FwdGlvbj4lY3NzMS5jYXRlZ29yeS1kZWYudGV4dC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCi0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJyZ2IiPgotCQk8ZnVuY3Rpb24tdmFsdWU+cmdiPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9InVyaSI+Ci0JCTxmdW5jdGlvbi12YWx1ZT51cmw8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCQotCTwhLS0gbnVtYmVyIGRlZmluaXRpb24gOiBXaGF0IHVuaXQgdHlwZXMgYmUgYWNjZXB0YWJsZSBmb3IgZWFjaAotCW51bWJlciB0eXBlPyAtLT4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJoYXNoIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iaGFzaCIvPgotICAgIDwvbnVtYmVyLWRlZj4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJsZW5ndGgiPgotICAgICAgICA8dW5pdCBuYW1lPSJlbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJleCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJweCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJpbiIvPgotICAgICAgICA8dW5pdCBuYW1lPSJjbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJtbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJwdCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJwYyIvPgotICAgIDwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJudW1iZXIiPgotCTwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJwZXJjZW50YWdlIj4KLQkJPHVuaXQgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvbnVtYmVyLWRlZj4KLQotCTx1bml0LWRlZiBuYW1lPSJjbSI+Ci0JCTx1bml0LXZhbHVlPmNtPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImVtIj4KLQkJPHVuaXQtdmFsdWU+ZW08L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZXgiPgotCQk8dW5pdC12YWx1ZT5leDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJoYXNoIj4KLQkJPHVuaXQtdmFsdWU+IzwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJpbiI+Ci0JCTx1bml0LXZhbHVlPmluPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Im1tIj4KLQkJPHVuaXQtdmFsdWU+bW08L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icGMiPgotCQk8dW5pdC12YWx1ZT5wYzwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwZXJjZW50YWdlIj4KLQkJPHVuaXQtdmFsdWU+JTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwdCI+Ci0JCTx1bml0LXZhbHVlPnB0PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InB4Ij4KLQkJPHVuaXQtdmFsdWU+cHg8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQotICAgIDwhLS0ga2V5d29yZHMgOiBzdHJpbmcgY29uc3RhbnRzICh0aGlzIGlzIGxhc3QgcGFydC4uKSAtLT4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjIwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjIwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIzMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4zMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNDAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NDAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjUwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjUwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI2MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT42MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNzAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NzAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjgwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjgwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI5MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT45MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXF1YSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFxdWE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXV0byI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmF1dG88L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmFzZWxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5iYXNlbGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibGFjayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsYWNrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsaW5rIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ymxpbms8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxvY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibG9jazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibHVlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ymx1ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib2xkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym9sZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib2xkZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib2xkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm90aCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvdGg8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm90dG9tIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym90dG9tPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNhcGl0YWxpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jYXBpdGFsaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNlbnRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNlbnRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjaXJjbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jaXJjbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3Vyc2l2ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmN1cnNpdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGFzaGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGFzaGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRlY2ltYWwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kZWNpbWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRpc2MiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kaXNjPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRvdHRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRvdHRlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkb3VibGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kb3VibGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFudGFzeSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhbnRhc3k8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZml4ZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5maXhlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmdWNoc2lhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZnVjaHNpYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncmF5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3JheTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncmVlbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyZWVuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imdyb292ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyb292ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5zZXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbnNldDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbnNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaXRhbGljIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aXRhbGljPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imp1c3RpZnkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5qdXN0aWZ5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxhcmdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGFyZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGFyZ2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGFyZ2VyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxlZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sZWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpZ2h0ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saWdodGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpbWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saW1lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpbmUtdGhyb3VnaCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpbmUtdGhyb3VnaDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsaXN0LWl0ZW0iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saXN0LWl0ZW08L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXItYWxwaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlci1hbHBoYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1yb21hbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLXJvbWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyY2FzZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyY2FzZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtYXJvb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tYXJvb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWVkaXVtIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWVkaXVtPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1pZGRsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1pZGRsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtb25vc3BhY2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tb25vc3BhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibmF2eSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5hdnk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm8tcmVwZWF0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm8tcmVwZWF0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ub25lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vcm1hbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vcm1hbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJub3dyYXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ub3dyYXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib2JsaXF1ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9ibGlxdWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib2xpdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vbGl2ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvdXRzZXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdXRzZXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3V0c2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm91dHNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3ZlcmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdmVybGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwcmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wcmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icHVycGxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cHVycGxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZXBlYXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVwZWF0LXgiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZXBlYXQteDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQteSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdC15PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZGdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmlkZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzYW5zLXNlcmlmIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2Fucy1zZXJpZjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzY3JvbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zY3JvbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2VyaWYiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZXJpZjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaWx2ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zaWx2ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbC1jYXBzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c21hbGwtY2Fwczwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c21hbGxlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzb2xpZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNvbGlkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNxdWFyZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNxdWFyZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdWIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdWI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3VwZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdXBlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGVhbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZXh0LXRvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQtdG9wPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRleHQtYm90dG9tIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGV4dC1ib3R0b208L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGhpY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50aGljazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0aGluIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGhpbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0b3AiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50b3A8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idHJhbnNwYXJlbnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50cmFuc3BhcmVudDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1bmRlcmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51bmRlcmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXItYWxwaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlci1hbHBoYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlci1yb21hbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyLXJvbWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyY2FzZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyY2FzZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3aGl0ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPndoaXRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtbGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ingtc21hbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LXNtYWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Inh4LXNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eHgtc21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieHgtbGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54eC1sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ5ZWxsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT55ZWxsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLTwvY3NzLXByb2ZpbGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWZjMDg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tPCFET0NUWVBFIGNzcy1wcm9maWxlIFNZU1RFTSAiY3NzLXByb2ZpbGUuZHRkIiA+LS0+Ci08Y3NzLXByb2ZpbGU+Ci0JPHN0eWxlc2hlZXQtZGVmPgotCQk8ZGVzY3JpcHRpb24+JWNzczIuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8Y2hhcnNldC1ydWxlLz4KLQkJPGltcG9ydC1ydWxlLz4KLQkJPHBhZ2UtcnVsZS8+Ci0JCTxtZWRpYS1ydWxlLz4KLQkJPGZvbnRmYWNlLXJ1bGUvPgotCQk8c3R5bGUtcnVsZS8+Ci0JPC9zdHlsZXNoZWV0LWRlZj4KLQotCTxjaGFyc2V0LXJ1bGUtZGVmPgotCTwvY2hhcnNldC1ydWxlLWRlZj4KLQk8aW1wb3J0LXJ1bGUtZGVmPgotCTwvaW1wb3J0LXJ1bGUtZGVmPgotCTxtZWRpYS1ydWxlLWRlZj4KLQk8L21lZGlhLXJ1bGUtZGVmPgotCi0JPHBhZ2UtcnVsZS1kZWY+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGVmdCIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9InJpZ2h0Ii8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iZmlyc3QiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWFmdGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1pbnNpZGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im9ycGhhbnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndpZG93cyIvPgotCTwvcGFnZS1ydWxlLWRlZj4KLQotCTxmb250ZmFjZS1ydWxlLWRlZj4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iYXNjZW50Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImJhc2VsaW5lIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImJib3giLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iY2FwLWhlaWdodCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJjZW50ZXJsaW5lIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImRlZmluaXRpb24tc3JjIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImRlc2NlbnQiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZm9udC1mYW1pbHkiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZm9udC1zaXplIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImZvbnQtc3RyZXRjaCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJmb250LXN0eWxlIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImZvbnQtdmFyaWFudCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJmb250LXdlaWdodCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJtYXRobGluZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJwYW5vc2UtMSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJzbG9wZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJzbG9wZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJzcmMiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0ic3RlbWgiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0ic3RlbXYiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0idG9wbGluZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJ1bmljb2RlLXJhbmdlIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InVuaXRzLXBlci1lbSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJ3aWR0aHMiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0ieC1oZWlnaHQiLz4KLQk8L2ZvbnRmYWNlLXJ1bGUtZGVmPgotCi0JPCEtLSBXaGljaCBwcm9wZXJ0aWVzIGNhbiBzdHlsZSBydWxlIGluY2x1ZGUgPyAtLT4KLQotCTxzdHlsZS1ydWxlLWRlZj4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iZGVzY2VuZGFudCIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJjaGlsZCIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJhZGphY2VudCIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJ1bml2ZXJzYWwiLz4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iYXR0cmlidXRlIi8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJmaXJzdC1saW5lIi8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJmaXJzdC1sZXR0ZXIiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImJlZm9yZSIvPgotCQk8cHNldWRvLWVsZW1lbnQgbmFtZT0iYWZ0ZXIiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJmaXJzdC1jaGlsZCIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImxpbmsiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJ2aXNpdGVkIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iaG92ZXIiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJhY3RpdmUiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJmb2N1cyIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImxhbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9ImF6aW11dGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1wb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1yZXBlYXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWNvbGxhcHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zcGFjaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3AtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbS1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3Atc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbS1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3Atd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbS13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjYXB0aW9uLXNpZGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNsZWFyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjbGlwIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iY29udGVudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iY291bnRlci1pbmNyZW1lbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvdW50ZXItcmVzZXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWFmdGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUtYmVmb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdXJzb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRpcmVjdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGlzcGxheSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZWxldmF0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlbXB0eS1jZWxscyIvPgotCQk8cHJvcGVydHkgbmFtZT0iZmxvYXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtZmFtaWx5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZS1hZGp1c3QiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc3RyZXRjaCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC12YXJpYW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXdlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsZXR0ZXItc3BhY2luZyIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGluZS1oZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtaW1hZ2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtcG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtdHlwZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tdG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tcmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1sZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJrZXItb2Zmc2V0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJrcyIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWF4LWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWF4LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtaW4taGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtaW4td2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im9ycGhhbnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im92ZXJmbG93Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLXRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctbGVmdCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1hZnRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1iZWZvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UtYWZ0ZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlLWJlZm9yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGl0Y2giLz4KLQkJPHByb3BlcnR5IG5hbWU9InBpdGNoLXJhbmdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbGF5LWR1cmluZyIvPgotCQk8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InF1b3RlcyIvPgotCQk8cHJvcGVydHkgbmFtZT0icmljaG5lc3MiLz4KLQkJPHByb3BlcnR5IG5hbWU9InJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhayIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWstaGVhZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1udW1lcmFsIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1wdW5jdHVhdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlZWNoLXJhdGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InN0cmVzcyIvPgotCQk8cHJvcGVydHkgbmFtZT0idGFibGUtbGF5b3V0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LWFsaWduIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtaW5kZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LXNoYWRvdyIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC10cmFuc2Zvcm0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0idW5pY29kZS1iaWRpIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJ0aWNhbC1hbGlnbiIvPgotCQk8cHJvcGVydHkgbmFtZT0idmlzaWJpbGl0eSIvPgotCQk8cHJvcGVydHkgbmFtZT0idm9pY2UtZmFtaWx5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2b2x1bWUiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndoaXRlLXNwYWNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aWRvd3MiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3b3JkLXNwYWNpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9InotaW5kZXgiLz4KLQk8L3N0eWxlLXJ1bGUtZGVmPgotCi0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0iZmlyc3QtY2hpbGQiPgotCQk8c2VsZWN0b3ItdmFsdWU+Zmlyc3QtY2hpbGQ8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJsaW5rIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmxpbms8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJ2aXNpdGVkIj4KLQkJPHNlbGVjdG9yLXZhbHVlPnZpc2l0ZWQ8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJob3ZlciI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5ob3Zlcjwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImFjdGl2ZSI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5hY3RpdmU8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJmb2N1cyI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5mb2N1czwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImxhbmciPgotCQk8c2VsZWN0b3ItdmFsdWU+bGFuZzwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImxlZnQiPgotCQk8c2VsZWN0b3ItdmFsdWU+bGVmdDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9InJpZ2h0Ij4KLQkJPHNlbGVjdG9yLXZhbHVlPnJpZ2h0PC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0iZmlyc3QiPgotCQk8c2VsZWN0b3ItdmFsdWU+Zmlyc3Q8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iZmlyc3QtbGluZSI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdC1saW5lPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1lbGVtZW50LWRlZj4KLQk8cHNldWRvLWVsZW1lbnQtZGVmIG5hbWU9ImZpcnN0LWxldHRlciI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdC1sZXR0ZXI8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWVsZW1lbnQtZGVmPgotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iYmVmb3JlIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmJlZm9yZTwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tZWxlbWVudC1kZWY+Ci0JPHBzZXVkby1lbGVtZW50LWRlZiBuYW1lPSJhZnRlciI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5hZnRlcjwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tZWxlbWVudC1kZWY+Ci0KLQk8IS0tIHByb3BlcnR5IGRlZmluaXRpb24gLS0+Ci0KLQk8cHJvcGVydHktZGVmIG5hbWU9ImF6aW11dGgiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcHJvdmlkZXMgc3BhdGlhbCBhdWRpbyBwcm9wZXJ0eSBmb3IgYXVyYWwKLSAgICAgICAgcHJlc2VudGF0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG51bWJlciBuYW1lPSJhbmdsZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJsZWZ0LXNpZGUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZmFyLWxlZnQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJjZW50ZXItbGVmdCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iY2VudGVyLXJpZ2h0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImZhci1yaWdodCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJyaWdodC1zaWRlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImJlaGluZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJsZWZ0d2FyZHMiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0icmlnaHR3YXJkcyIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1jb2xvciIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1yZXBlYXQiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1wb3NpdGlvbiIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InNjcm9sbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJmaXhlZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InRyYW5zcGFyZW50Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtaW1hZ2UiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdC14Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdC15Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vLXJlcGVhdCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXIiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1jb2xsYXBzZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbGxhcHNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlcGFyYXRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0cmFuc3BhcmVudCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItc3BhY2luZyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1zdHlsZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXRvcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3Atd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1yaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWJvdHRvbSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1sZWZ0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci10b3AtY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0LWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1ib3R0b20tY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWxlZnQtY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXRvcC1zdHlsZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0LXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tLXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItbGVmdC1zdHlsZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3R0b20iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNhcHRpb24tc2lkZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxrZXl3b3JkIG5hbWU9InRvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjbGVhciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY2xpcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJzaGFwZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNvbG9yIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjb250ZW50IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhbGwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPHN0cmluZyBuYW1lPSJhbnkiLz4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8ZnVuY3Rpb24gbmFtZT0iY291bnRlciIvPgotCQk8ZnVuY3Rpb24gbmFtZT0iYXR0ciIvPgotCQk8a2V5d29yZCBuYW1lPSJvcGVuLXF1b3RlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNsb3NlLXF1b3RlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vLW9wZW4tcXVvdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm8tY2xvc2UtcXVvdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY291bnRlci1pbmNyZW1lbnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8c3RyaW5nIG5hbWU9ImNvdW50ZXItaWRlbnRpZmllciIvPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjb3VudGVyLXJlc2V0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhbGwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPHN0cmluZyBuYW1lPSJjb3VudGVyLWlkZW50aWZpZXIiLz4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY3VlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1iZWZvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1hZnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjdWUtYWZ0ZXIiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY3VlLWJlZm9yZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjdXJzb3IiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwsaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ1aSI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJjcm9zc2hhaXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVmYXVsdCIvPgotCQk8a2V5d29yZCBuYW1lPSJwb2ludGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1vdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZS1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibmUtcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im53LXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJuLXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzZS1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3ctcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InMtcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InctcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0id2FpdCIvPgotCQk8a2V5d29yZCBuYW1lPSJoZWxwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZGlyZWN0aW9uIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibHRyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJ0bCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJkaXNwbGF5IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhbGwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJpbmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxvY2siLz4KLQkJPGtleXdvcmQgbmFtZT0ibGlzdC1pdGVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJ1bi1pbiIvPgotCQk8a2V5d29yZCBuYW1lPSJjb21wYWN0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1hcmtlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmxpbmUtdGFibGUiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtcm93LWdyb3VwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWhlYWRlci1ncm91cCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1mb290ZXItZ3JvdXAiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtcm93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWNvbHVtbi1ncm91cCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1jb2x1bW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtY2VsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1jYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZWxldmF0aW9uIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0iYW5nbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmVsb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ibGV2ZWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYWJvdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlnaGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImVtcHR5LWNlbGxzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPGtleXdvcmQgbmFtZT0ic2hvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZsb2F0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC12YXJpYW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXdlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1mYW1pbHkiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJpY29uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lbnUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVzc2FnZS1ib3giLz4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGwtY2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJzdGF0dXMtYmFyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJzbGFzaCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1mYW1pbHkiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPHN0cmluZyBuYW1lPSJmYW1pbHktbmFtZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zaXplIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYWJzb2x1dGUtc2l6ZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9InJlbGF0aXZlLXNpemUiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc2l6ZS1hZGp1c3QiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXN0cmV0Y2giCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IndpZGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5hcnJvd2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVsdHJhLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHRyYS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlbWktY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlbWktZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXh0cmEtZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0idWx0cmEtZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zdHlsZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iaXRhbGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9ibGlxdWUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC12YXJpYW50IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbC1jYXBzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtd2VpZ2h0IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJib2xkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvbGRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJsaWdodGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjEwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIyMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjQwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI1MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjcwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI4MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iOTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImhlaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGVmdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGV0dGVyLXNwYWNpbmciCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImxpbmUtaGVpZ2h0IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtcG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtaW1hZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8a2V5d29yZCBuYW1lPSJpbnNpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3V0c2lkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPGtleXdvcmQgbmFtZT0iZGlzYyIvPgotCQk8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlY2ltYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVjaW1hbC1sZWFkaW5nLXplcm8iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItZ3JlZWsiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItbGF0aW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItbGF0aW4iLz4KLQkJPGtleXdvcmQgbmFtZT0iaGVicmV3Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFybWVuaWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imdlb3JnaWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNqay1pZGVvZ3JhcGhpYyIvPgotCQk8a2V5d29yZCBuYW1lPSJoaXJhZ2FuYSIvPgotCQk8a2V5d29yZCBuYW1lPSJrYXRha2FuYSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaXJhZ2FuYS1pcm9oYSIvPgotCQk8a2V5d29yZCBuYW1lPSJrYXRha2FuYS1pcm9oYSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLXRvcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLXJpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tYm90dG9tIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tbGVmdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFya2VyLW9mZnNldCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFya3MiCi0JCWluaGVyaXRlZD0ibmEiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8a2V5d29yZCBuYW1lPSJjcm9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNyb3NzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWF4LWhlaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWF4LXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtaW4taGVpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtaW4td2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im9ycGhhbnMiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im91dGxpbmUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3V0bGluZS1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLGludGVyYWN0aXZlIiBjYXRlZ29yeT0idWkiPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImludmVydCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJvdXRsaW5lLXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwsaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ1aSI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im91dGxpbmUtd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3ZlcmZsb3ciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9InZpc2libGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlkZGVuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNjcm9sbCIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0icGFkZGluZy13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLXRvcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctcmlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0icGFkZGluZy13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLWJvdHRvbSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctbGVmdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZ2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPHN0cmluZyBuYW1lPSJwYWdlLWlkZW50aWZpZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFnZS1icmVhay1hZnRlciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iYWx3YXlzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF2b2lkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFnZS1icmVhay1iZWZvcmUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsd2F5cyIvPgotCQk8a2V5d29yZCBuYW1lPSJhdm9pZCIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF2b2lkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGF1c2UiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9InRpbWUiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhdXNlLWFmdGVyIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJ0aW1lIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYXVzZS1iZWZvcmUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9InRpbWUiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBpdGNoIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0iZnJlcXVlbmN5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IngtbG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlnaCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LWhpZ2giLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGl0Y2gtcmFuZ2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGxheS1kdXJpbmciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1peCIvPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBvc2l0aW9uIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJzdGF0aWMiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVsYXRpdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYWJzb2x1dGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZml4ZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icXVvdGVzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxzdHJpbmcgbmFtZT0iYW55Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icmljaG5lc3MiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icmlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNpemUiCi0JCWluaGVyaXRlZD0ibmEiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InBvcnRyYWl0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxhbmRzY2FwZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVhayIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzcGVsbC1vdXQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic3BlYWstaGVhZGVyIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8a2V5d29yZCBuYW1lPSJvbmNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsd2F5cyIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVhay1udW1lcmFsIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImRpZ2l0cyIvPgotCQk8a2V5d29yZCBuYW1lPSJjb250aW51b3VzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNwZWFrLXB1bmN0dWF0aW9uIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVlY2gtcmF0ZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LXNsb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ic2xvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0iZmFzdCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LWZhc3QiLz4KLQkJPGtleXdvcmQgbmFtZT0iZmFzdGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNsb3dlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzdHJlc3MiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGFibGUtbGF5b3V0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZpeGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtYWxpZ24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ianVzdGlmeSIvPgotCQk8c3RyaW5nIG5hbWU9ImFueSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVuZGVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdmVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsaW5lLXRocm91Z2giLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxpbmsiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1pbmRlbnQiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtc2hhZG93IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC10cmFuc2Zvcm0iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0iY2FwaXRhbGl6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlcmNhc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXJjYXNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idG9wIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ1bmljb2RlLWJpZGkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJlbWJlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJiaWRpLW92ZXJyaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZlcnRpY2FsLWFsaWduIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdWIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRleHQtdG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1pZGRsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dC1ib3R0b20iLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZpc2liaWxpdHkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9InZpc2libGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlkZGVuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbGxhcHNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZvaWNlLWZhbWlseSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8c3RyaW5nIG5hbWU9InNwZWNpZmljLXZvaWNlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iZ2VuZXJpYy12b2ljZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ2b2x1bWUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNpbGVudCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LXNvZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic29mdCIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG91ZCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LWxvdWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2hpdGUtc3BhY2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InByZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub3dyYXAiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2lkb3dzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id29yZC1zcGFjaW5nIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ6LWluZGV4IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0KLQk8IS0tIGRlc2NyaXB0b3IgZGVmaW5pdGlvbiA6IFRoZXNlIGFyZSBmb3IgQGZvbnQtZmFjZSAtLT4KLQotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJhc2NlbnQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImJhc2VsaW5lIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJiYm94Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImNhcC1oZWlnaHQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImNlbnRlcmxpbmUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImRlZmluaXRpb24tc3JjIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImRlc2NlbnQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtZmFtaWx5Ij4KLQkJPHN0cmluZyBuYW1lPSJmYW1pbHktbmFtZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ii8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LXNpemUiPgotCQk8a2V5d29yZCBuYW1lPSJhbGwiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtc3RyZXRjaCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0idWx0cmEtY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4dHJhLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJjb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VtaS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VtaS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHRyYS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bHRyYS1leHBhbmRlZCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC1zdHlsZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iaXRhbGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9ibGlxdWUiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtdmFyaWFudCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbC1jYXBzIi8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LXdlaWdodCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm9sZCIvPgotCQk8a2V5d29yZCBuYW1lPSIxMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjMwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI0MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjYwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI3MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iODAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjkwMCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ibWF0aGxpbmUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InBhbm9zZS0xIj4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ic2xvcGUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InNyYyI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGZ1bmN0aW9uIG5hbWU9ImZvcm1hdCIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImZvbnQtZmFjZS1uYW1lIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ic3RlbWgiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InN0ZW12Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ0b3BsaW5lIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ1bmljb2RlLXJhbmdlIj4KLQkJPHN0cmluZyBuYW1lPSJ1cmFuZ2UiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ1bml0cy1wZXItZW0iPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9IndpZHRocyI+Ci0JCTxzdHJpbmcgbmFtZT0idXJhbmdlIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ieC1oZWlnaHQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0KLQk8IS0tIGNvbnRhaW5lciBkZWZpbml0aW9uIDogQ29udGFpbmVyIGlzIHRoZSBsdW1wIG9mIHZhbHVlcy4KLQlJdCBjYW4gYmUgdXNlZCBsaWtlIG1hY3Jvcy4gLS0+Ci0gICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYWJzb2x1dGUtc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Inh4LXNtYWxsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Ingtc21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImxhcmdlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9IngtbGFyZ2UiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieHgtbGFyZ2UiLz4KLSAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYm9yZGVyLXN0eWxlIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJoaWRkZW4iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZG90dGVkIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImRhc2hlZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzb2xpZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJkb3VibGUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZ3Jvb3ZlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZGdlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Imluc2V0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im91dHNldCIvPgotICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJib3JkZXItd2lkdGgiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotICAgICAgICA8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotICAgIDwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJjb2xvciI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFxdWEiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxhY2siLz4KLQkJPGtleXdvcmQgbmFtZT0iYmx1ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmdWNoc2lhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImdyYXkiLz4KLQkJPGtleXdvcmQgbmFtZT0iZ3JlZW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGltZSIvPgotCQk8a2V5d29yZCBuYW1lPSJtYXJvb24iLz4KLQkJPGtleXdvcmQgbmFtZT0ibmF2eSIvPgotCQk8a2V5d29yZCBuYW1lPSJvbGl2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJwdXJwbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNpbHZlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IndoaXRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InllbGxvdyIvPgotCQk8Y29udGFpbmVyIG5hbWU9InN5c3RlbS1jb2xvciIvPgotCQk8ZnVuY3Rpb24gbmFtZT0icmdiIi8+Ci0JCTxudW1iZXIgbmFtZT0iaGFzaCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJnZW5lcmljLWZhbWlseSI+Ci0JCTxrZXl3b3JkIG5hbWU9InNlcmlmIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNhbnMtc2VyaWYiLz4KLQkJPGtleXdvcmQgbmFtZT0iY3Vyc2l2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmYW50YXN5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1vbm9zcGFjZSIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJmb250LWZhY2UtbmFtZSI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJsb2NhbCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJnZW5lcmljLXZvaWNlIj4KLQkJPGtleXdvcmQgbmFtZT0ibWFsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmZW1hbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2hpbGQiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ibWFyZ2luLXdpZHRoIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0icGFkZGluZy13aWR0aCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJyZWxhdGl2ZS1zaXplIj4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGxlciIvPgotCQk8a2V5d29yZCBuYW1lPSJsYXJnZXIiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ic2hhcGUiPgotCQk8ZnVuY3Rpb24gbmFtZT0icmVjdCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJzeXN0ZW0tY29sb3IiPgotCQk8a2V5d29yZCBuYW1lPSJBY3RpdmVCb3JkZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iQWN0aXZlQ2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJBcHBXb3Jrc3BhY2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iQmFja2dyb3VuZCIvPgotCQk8a2V5d29yZCBuYW1lPSJCdXR0b25GYWNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkJ1dHRvbkhpZ2hsaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJCdXR0b25TaGFkb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iQnV0dG9uVGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJDYXB0aW9uVGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJHcmF5VGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJIaWdobGlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iSGlnaGxpZ2h0VGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJJbmFjdGl2ZUJvcmRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJJbmFjdGl2ZUNhcHRpb24iLz4KLQkJPGtleXdvcmQgbmFtZT0iSW5hY3RpdmVDYXB0aW9uVGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJJbmZvQmFja2dyb3VuZCIvPgotCQk8a2V5d29yZCBuYW1lPSJJbmZvVGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJNZW51Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Ik1lbnVUZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IlNjcm9sbGJhciIvPgotCQk8a2V5d29yZCBuYW1lPSJUaHJlZUREYXJrU2hhZG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IlRocmVlREZhY2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iVGhyZWVESGlnaGxpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IlRocmVlRExpZ2h0U2hhZG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IlRocmVlRFNoYWRvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJXaW5kb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iV2luZG93RnJhbWUiLz4KLQkJPGtleXdvcmQgbmFtZT0iV2luZG93VGV4dCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQotCTwhLS0gY2F0ZWdvcnkgZGVmaW5pdGlvbiA6IFRoaXMgaXMgdXNlZCB0byBjYXRlZ29yaXplIHByb3BlcnRpZXMKLQlpbiBQcm9wZXJ0aWVzIFZpZXcuIC0tPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iYXVyYWwiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYuYXVyYWwuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImJveCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5ib3guY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5jb2xvcmFuZGJhY2tncm91bmQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImNvbnRlbnQiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYuY29udGVudC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iZm9udCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5mb250LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJwYWdlIj4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnBhZ2UuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InRhYmxlcyI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi50YWJsZXMuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InRleHQiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYudGV4dC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0idWkiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYudWkuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InZpc3VhbCI+Ci08IS0tCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYudmlzdWFsLmNhcHRpb248L2NhcHRpb24+LS0+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi52aXN1YWwuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQkKLQk8IS0tIGZ1bmN0aW9uIGRlZmluaXRpb24gLS0+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJhdHRyIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPmF0dHI8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0iY291bnRlciI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5jb3VudGVyPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9InJlY3QiPgotCQk8ZnVuY3Rpb24tdmFsdWU+cmVjdDwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJyZ2IiPgotCQk8ZnVuY3Rpb24tdmFsdWU+cmdiPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9InVyaSI+Ci0JCTxmdW5jdGlvbi12YWx1ZT51cmw8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0iZm9ybWF0Ij4KLQkJPGZ1bmN0aW9uLXZhbHVlPmZvcm1hdDwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJsb2NhbCI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5sb2NhbDwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0KLQk8IS0tIG51bWJlciBkZWZpbml0aW9uIDogV2hhdCB1bml0IHR5cGVzIGJlIGFjY2VwdGFibGUgZm9yIGVhY2gKLQludW1iZXIgdHlwZT8gLS0+Ci0gICAgPG51bWJlci1kZWYgbmFtZT0iYW5nbGUiPgotICAgICAgICA8dW5pdCBuYW1lPSJkZWciLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iZ3JhZCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJyYWQiLz4KLSAgICA8L251bWJlci1kZWY+Ci0gICAgPG51bWJlci1kZWYgbmFtZT0iZnJlcXVlbmN5Ij4KLSAgICAgICAgPHVuaXQgbmFtZT0iaHoiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0ia2h6Ii8+Ci0gICAgPC9udW1iZXItZGVmPgotICAgIDxudW1iZXItZGVmIG5hbWU9Imhhc2giPgotICAgICAgICA8dW5pdCBuYW1lPSJoYXNoIi8+Ci0gICAgPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9ImludGVnZXIiPgotCTwvbnVtYmVyLWRlZj4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJsZW5ndGgiPgotICAgICAgICA8dW5pdCBuYW1lPSJlbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJleCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJweCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJpbiIvPgotICAgICAgICA8dW5pdCBuYW1lPSJjbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJtbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJwdCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJwYyIvPgotICAgIDwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJudW1iZXIiPgotCTwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJwZXJjZW50YWdlIj4KLQkJPHVuaXQgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJ0aW1lIj4KLQkJPHVuaXQgbmFtZT0ibXMiLz4KLQkJPHVuaXQgbmFtZT0icyIvPgotCTwvbnVtYmVyLWRlZj4KLQotCTx1bml0LWRlZiBuYW1lPSJjbSI+Ci0JCTx1bml0LXZhbHVlPmNtPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImRlZyI+Ci0JCTx1bml0LXZhbHVlPmRlZzwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJlbSI+Ci0JCTx1bml0LXZhbHVlPmVtPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImV4Ij4KLQkJPHVuaXQtdmFsdWU+ZXg8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZ3JhZCI+Ci0JCTx1bml0LXZhbHVlPmdyYWQ8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iaGFzaCI+Ci0JCTx1bml0LXZhbHVlPiM8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iaHoiPgotCQk8dW5pdC12YWx1ZT5IejwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJpbiI+Ci0JCTx1bml0LXZhbHVlPmluPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImtoeiI+Ci0JCTx1bml0LXZhbHVlPmtIejwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJtbSI+Ci0JCTx1bml0LXZhbHVlPm1tPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Im1zIj4KLQkJPHVuaXQtdmFsdWU+bXM8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icGMiPgotCQk8dW5pdC12YWx1ZT5wYzwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwZXJjZW50YWdlIj4KLQkJPHVuaXQtdmFsdWU+JTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwdCI+Ci0JCTx1bml0LXZhbHVlPnB0PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InB4Ij4KLQkJPHVuaXQtdmFsdWU+cHg8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icmFkIj4KLQkJPHVuaXQtdmFsdWU+cmFkPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InMiPgotCQk8dW5pdC12YWx1ZT5zPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0KLSAgICA8IS0tIGtleXdvcmRzIDogc3RyaW5nIGNvbnN0YW50cyAodGhpcyBpcyBsYXN0IHBhcnQuLikgLS0+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjEwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjEwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIyMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4yMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMzAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MzAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjQwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjQwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI1MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT41MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNjAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NjAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjcwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjcwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI4MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT44MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iOTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+OTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFib3ZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YWJvdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWJzb2x1dGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hYnNvbHV0ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJBY3RpdmVCb3JkZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5BY3RpdmVCb3JkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQWN0aXZlQ2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkFjdGl2ZUNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFsd2F5cyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFsd2F5czwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJBcHBXb3Jrc3BhY2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5BcHBXb3Jrc3BhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXF1YSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFxdWE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXJtZW5pYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hcm1lbmlhbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhdXRvIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXV0bzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhdm9pZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmF2b2lkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkJhY2tncm91bmQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5CYWNrZ3JvdW5kPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJhc2VsaW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmFzZWxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmVoaW5kIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmVoaW5kPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJlbG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmVsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmlkaS1vdmVycmlkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJpZGktb3ZlcnJpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxhY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibGFjazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibGluayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsaW5rPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsb2NrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmxvY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmx1ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsdWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm9sZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvbGQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm9sZGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym9sZGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvdGgiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib3RoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvdHRvbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvdHRvbTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJCdXR0b25GYWNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QnV0dG9uRmFjZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJCdXR0b25IaWdobGlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5CdXR0b25IaWdobGlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQnV0dG9uU2hhZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QnV0dG9uU2hhZG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkJ1dHRvblRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5CdXR0b25UZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNhcGl0YWxpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jYXBpdGFsaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNhcHRpb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jYXB0aW9uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkNhcHRpb25UZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Q2FwdGlvblRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2VudGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2VudGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNlbnRlci1sZWZ0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2VudGVyLWxlZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2VudGVyLXJpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2VudGVyLXJpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNoaWxkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2hpbGQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2lyY2xlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2lyY2xlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNqay1pZGVvZ3JhcGhpYyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNqay1pZGVvZ3JhcGhpYzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjbG9zZS1xdW90ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNsb3NlLXF1b3RlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jb2RlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvbmRlbnNlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvbmRlbnNlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb2xsYXBzZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvbGxhcHNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvbXBhY3QiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jb21wYWN0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvbnRpbnVvdXMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jb250aW51b3VzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNyb3AiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jcm9wPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNyb3NzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3Jvc3M8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3Jvc3NoYWlyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3Jvc3NoYWlyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImN1cnNpdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jdXJzaXZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRhc2hlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRhc2hlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkZWNpbWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGVjaW1hbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkZWNpbWFsLWxlYWRpbmctemVybyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRlY2ltYWwtbGVhZGluZy16ZXJvPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRlZmF1bHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kZWZhdWx0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRpZ2l0cyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRpZ2l0czwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkaXNjIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGlzYzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkb3R0ZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kb3R0ZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZG91YmxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZG91YmxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImUtcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZS1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZW1iZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5lbWJlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJleHBhbmRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmV4cGFuZGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImV4dHJhLWNvbmRlbnNlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmV4dHJhLWNvbmRlbnNlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJleHRyYS1leHBhbmRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmV4dHJhLWV4cGFuZGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhbnRhc3kiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYW50YXN5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhci1sZWZ0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFyLWxlZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFyLXJpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFyLXJpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhc3QiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYXN0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhc3RlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhc3Rlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmZW1hbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mZW1hbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZml4ZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5maXhlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmdWNoc2lhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZnVjaHNpYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJnZW9yZ2lhbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdlb3JnaWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImdyYXkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ncmF5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkdyYXlUZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+R3JheVRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ3JlZW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ncmVlbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncm9vdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ncm9vdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGVicmV3Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGVicmV3PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhlbHAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oZWxwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpZGRlbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpZGRlbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaWdoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlnaDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJIaWdobGlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5IaWdobGlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSGlnaGxpZ2h0VGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkhpZ2hsaWdodFRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlnaGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlnaGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpcmFnYW5hIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlyYWdhbmE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlyYWdhbmEtaXJvaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaXJhZ2FuYS1pcm9oYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpY29uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aWNvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJJbmFjdGl2ZUJvcmRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkluYWN0aXZlQm9yZGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkluYWN0aXZlQ2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkluYWN0aXZlQ2FwdGlvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJJbmFjdGl2ZUNhcHRpb25UZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SW5hY3RpdmVDYXB0aW9uVGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJJbmZvQmFja2dyb3VuZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkluZm9CYWNrZ3JvdW5kPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkluZm9UZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SW5mb1RleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5oZXJpdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmluaGVyaXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5saW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5saW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImlubGluZS10YWJsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmlubGluZS10YWJsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnNldCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmluc2V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imluc2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmluc2lkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnZlcnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbnZlcnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaXRhbGljIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aXRhbGljPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imp1c3RpZnkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5qdXN0aWZ5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImthdGFrYW5hIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+a2F0YWthbmE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ia2F0YWthbmEtaXJvaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5rYXRha2FuYS1pcm9oYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsYW5kc2NhcGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sYW5kc2NhcGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsYXJnZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sYXJnZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGVmdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxlZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGVmdC1zaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGVmdC1zaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxlZnR3YXJkcyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxlZnR3YXJkczwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsZXZlbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxldmVsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpZ2h0ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saWdodGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpbWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saW1lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpbmUtdGhyb3VnaCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpbmUtdGhyb3VnaDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsaXN0LWl0ZW0iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saXN0LWl0ZW08L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG91ZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvdWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXItYWxwaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlci1hbHBoYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1ncmVlayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLWdyZWVrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyLWxhdGluIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXItbGF0aW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXItcm9tYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlci1yb21hbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlcmNhc2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlcmNhc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibHRyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bHRyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1hbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tYWxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1hcmtlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1hcmtlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtYXJvb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tYXJvb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWVkaXVtIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWVkaXVtPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ik1lbnUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5NZW51PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ik1lbnVUZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+TWVudVRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWVzc2FnZS1ib3giPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tZXNzYWdlLWJveDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtaWRkbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5taWRkbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWl4Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWl4PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1vbm9zcGFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1vbm9zcGFjZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtb3ZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bW92ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuLXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm4tcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5hcnJvd2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bmFycm93ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibmF2eSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5hdnk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibmUtcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bmUtcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vLWNsb3NlLXF1b3RlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm8tY2xvc2UtcXVvdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm8tb3Blbi1xdW90ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vLW9wZW4tcXVvdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm8tcmVwZWF0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm8tcmVwZWF0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ub25lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vcm1hbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vcm1hbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJub3dyYXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ub3dyYXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibnctcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bnctcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im9ibGlxdWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vYmxpcXVlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im9saXZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b2xpdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib25jZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9uY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3Blbi1xdW90ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9wZW4tcXVvdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3V0c2V0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3V0c2V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im91dHNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdXRzaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im92ZXJsaW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3ZlcmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icG9pbnRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnBvaW50ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icG9ydHJhaXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wb3J0cmFpdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwcmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wcmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icHVycGxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cHVycGxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZWxhdGl2ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlbGF0aXZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQteCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdC14PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdC15Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0LXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlkZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWRnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZ2h0LXNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWdodC1zaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZ2h0d2FyZHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWdodHdhcmRzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJ0bCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJ0bDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJydW4taW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ydW4taW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icy1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zLXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzYW5zLXNlcmlmIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2Fucy1zZXJpZjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzY3JvbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zY3JvbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iU2Nyb2xsYmFyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+U2Nyb2xsYmFyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlLXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlLXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzZW1pLWNvbmRlbnNlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlbWktY29uZGVuc2VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlbWktZXhwYW5kZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZW1pLWV4cGFuZGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlcGFyYXRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2VwYXJhdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2VyaWYiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZXJpZjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2hvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaWxlbnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zaWxlbnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2lsdmVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2lsdmVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNsb3dlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNsb3dlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsLWNhcHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbC1jYXBzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsLWNhcHRpb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbC1jYXB0aW9uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNvZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zb2Z0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNvbGlkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c29saWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3BlbGwtb3V0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3BlbGwtb3V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNxdWFyZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNxdWFyZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdGF0aWMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdGF0aWM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3RhdHVzLWJhciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN0YXR1cy1iYXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3ViIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3ViPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN1cGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3VwZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3ctcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3ctcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY2VsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWNlbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY29sdW1uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtY29sdW1uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLWNvbHVtbi1ncm91cCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWNvbHVtbi1ncm91cDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1mb290ZXItZ3JvdXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1mb290ZXItZ3JvdXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtaGVhZGVyLWdyb3VwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtaGVhZGVyLWdyb3VwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLXJvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLXJvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1yb3ctZ3JvdXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1yb3ctZ3JvdXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGVhbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRlYWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGV4dC10b3AiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZXh0LXRvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZXh0LWJvdHRvbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQtYm90dG9tPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRoaWNrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGhpY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGhpbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRoaW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVERGFya1NoYWRvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPlRocmVlRERhcmtTaGFkb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVERmFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPlRocmVlREZhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVESGlnaGxpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVESGlnaGxpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IlRocmVlRExpZ2h0U2hhZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVETGlnaHRTaGFkb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVEU2hhZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVEU2hhZG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0cmFuc3BhcmVudCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRyYW5zcGFyZW50PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVsdHJhLWNvbmRlbnNlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVsdHJhLWNvbmRlbnNlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1bHRyYS1leHBhbmRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVsdHJhLWV4cGFuZGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVuZGVybGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVuZGVybGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlci1hbHBoYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyLWFscGhhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyLWxhdGluIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXItbGF0aW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXItcm9tYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlci1yb21hbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlcmNhc2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlcmNhc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idmlzaWJsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnZpc2libGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idy1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT53LXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3YWl0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+d2FpdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3aGl0ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPndoaXRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IndpZGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+d2lkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iV2luZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+V2luZG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IldpbmRvd0ZyYW1lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+V2luZG93RnJhbWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iV2luZG93VGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPldpbmRvd1RleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1mYXN0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1mYXN0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtaGlnaCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtaGlnaDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWxhcmdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWxvdWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWxvdWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1sb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LXNsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LXNsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1zbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtc21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1zb2Z0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1zb2Z0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Inh4LXNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eHgtc21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieHgtbGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54eC1sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ5ZWxsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT55ZWxsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLTwvY3NzLXByb2ZpbGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLW1vYmlsZTFfMC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiNmMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS08IURPQ1RZUEUgY3NzLXByb2ZpbGUgU1lTVEVNICJjc3MtcHJvZmlsZS5kdGQiID4tLT4KLTxjc3MtcHJvZmlsZT4KLQk8cHJvZmlsZS1pbXBvcnQgbmFtZT0iY3NzcHJvZmlsZS1jc3MyLnhtbCIvPgotCTxzdHlsZXNoZWV0LWRlZj4KLQkJPGRlc2NyaXB0aW9uPiVtb2JpbGUxXzAuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8Y2hhcnNldC1ydWxlLz4KLQkJPGltcG9ydC1ydWxlLz4KLQkJPG1lZGlhLXJ1bGUvPgotCQk8c3R5bGUtcnVsZS8+Ci0JPC9zdHlsZXNoZWV0LWRlZj4KLQotCTwhLS0gV2hpY2ggcHJvcGVydGllcyBjYW4gc3R5bGUgcnVsZSBpbmNsdWRlID8gLS0+Ci0JPCEtLSB1c2luZyAib3ZlcndyaXRlIiBtZXRob2Q6IG9ubHkgZGlzYWJsZWQgcHJvcGVydGllcyBhcmUgd3JpdHRlbi4gLS0+Ci0KLQk8c3R5bGUtcnVsZS1kZWYgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iY2hpbGQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImFkamFjZW50IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJhdHRyaWJ1dGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iZmlyc3QtY2hpbGQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGluayIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJhY3RpdmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGFuZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImF6aW11dGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sbGFwc2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvdHRvbSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNhcHRpb24tc2lkZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNsaXAiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb250ZW50IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY291bnRlci1pbmNyZW1lbnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb3VudGVyLXJlc2V0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1cnNvciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRpcmVjdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVsZXZhdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVtcHR5LWNlbGxzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplLWFkanVzdCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc3RyZXRjaCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxlZnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsZXR0ZXItc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFya2VyLW9mZnNldCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWF4LWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1heC13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1pbi1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtaW4td2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvcnBoYW5zIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtY29sb3IiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXN0eWxlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im92ZXJmbG93IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBpdGNoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGl0Y2gtcmFuZ2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbGF5LWR1cmluZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icXVvdGVzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icmljaG5lc3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJyaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNpemUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhayIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLWhlYWRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLW51bWVyYWwiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1wdW5jdHVhdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWVjaC1yYXRlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3RyZXNzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGFibGUtbGF5b3V0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1zaGFkb3ciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0b3AiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ1bmljb2RlLWJpZGkiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2b2ljZS1mYW1pbHkiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2b2x1bWUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aWRvd3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3b3JkLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ6LWluZGV4IiBlbmFibGVkPSJmYWxzZSIvPgotCTwvc3R5bGUtcnVsZS1kZWY+Ci0KLQk8IS0tIHByb3BlcnR5IGRlZmluaXRpb24gLS0+Ci0JPCEtLSB1c2luZyAicmVkaWZpbmUiIG1ldGhvZDogaWYgIm92ZXJ3cml0ZSIgYXR0cmlidXRlIGlzIHNldCB0bwotCSJmYWxzZSIJb3Igbm90IHNldCwgaXQgbWVhbnMgdGhlIG5vZGUgaXMgY2xlYW5seSByZWRpZmluZWQgLS0+Ci0KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImRpc3BsYXkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImlubGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJibG9jayIvPgotCQk8a2V5d29yZCBuYW1lPSJsaXN0LWl0ZW0iLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS10eXBlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImRpc2MiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2lyY2xlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNxdWFyZSIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWNpbWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWdyZWVrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1hbGlnbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJqdXN0aWZ5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtZGVjb3JhdGlvbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0idW5kZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZlcnRpY2FsLWFsaWduIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdWIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCi0JPCEtLSBjb250YWluZXIgZGVmaW5pdGlvbiA6IENvbnRhaW5lciBpcyB0aGUgbHVtcCBvZiB2YWx1ZXMuCi0JSXQgY2FuIGJlIHVzZWQgbGlrZSBtYWNyb3MuIC0tPgotCTxjb250YWluZXItZGVmIG5hbWU9ImNvbG9yIiBvdmVyd3JpdGU9InRydWUiPgotCQk8Y29udGFpbmVyIG5hbWU9InN5c3RlbS1jb2xvciIgZW5hYmxlZD0iZmFsc2UiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci08L2Nzcy1wcm9maWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS13YXAueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYjJhMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tPCFET0NUWVBFIGNzcy1wcm9maWxlIFNZU1RFTSAiY3NzLXByb2ZpbGUuZHRkIiA+LS0+Ci08Y3NzLXByb2ZpbGU+Ci0JPHByb2ZpbGUtaW1wb3J0IG5hbWU9ImNzc3Byb2ZpbGUtY3NzMi54bWwiLz4KLQk8c3R5bGVzaGVldC1kZWY+Ci0JCTxkZXNjcmlwdGlvbj4ld2FwLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPGNoYXJzZXQtcnVsZS8+Ci0JCTxpbXBvcnQtcnVsZS8+Ci0JCTxtZWRpYS1ydWxlLz4KLQkJPHN0eWxlLXJ1bGUvPgotCTwvc3R5bGVzaGVldC1kZWY+Ci0KLQk8IS0tIFdoaWNoIHByb3BlcnRpZXMgY2FuIHN0eWxlIHJ1bGUgaW5jbHVkZSA/IC0tPgotCTwhLS0gdXNpbmcgIm92ZXJ3cml0ZSIgbWV0aG9kOiBvbmx5IGRpc2FibGVkIHByb3BlcnRpZXMgYXJlIHdyaXR0ZW4uIC0tPgotCi0JPHN0eWxlLXJ1bGUtZGVmIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhemltdXRoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWNvbGxhcHNlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3R0b20iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjYXB0aW9uLXNpZGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjbGlwIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY29udGVudCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdXJzb3IiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkaXJlY3Rpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlbGV2YXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlbXB0eS1jZWxscyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZS1hZGp1c3QiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0cmV0Y2giIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsZWZ0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGV0dGVyLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtlci1vZmZzZXQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJrcyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1heC1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXgtd2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtaW4taGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWluLXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3JwaGFucyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLWNvbG9yIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1zdHlsZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtd2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdmVyZmxvdyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWluc2lkZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UtYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwaXRjaCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBpdGNoLXJhbmdlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGxheS1kdXJpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InF1b3RlcyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InJpY2huZXNzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icmlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzaXplIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWsiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1oZWFkZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1udW1lcmFsIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWstcHVuY3R1YXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVlY2gtcmF0ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InN0cmVzcyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRhYmxlLWxheW91dCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtc2hhZG93IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idG9wIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idW5pY29kZS1iaWRpIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idm9pY2UtZmFtaWx5IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idm9sdW1lIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0id2lkb3dzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0id29yZC1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iei1pbmRleCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Ii13YXAtbWFycXVlZS1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iLXdhcC1tYXJxdWVlLWxvb3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9Ii13YXAtbWFycXVlZS1kaXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9Ii13YXAtbWFycXVlZS1zcGVlZCIvPgotCQk8cHJvcGVydHkgbmFtZT0iLXdhcC1hY2Nlc3NrZXkiLz4KLQkJPHByb3BlcnR5IG5hbWU9Ii13YXAtaW5wdXQtZm9ybWF0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSItd2FwLWlucHV0LXJlcXVpcmVkIi8+Ci0JPC9zdHlsZS1ydWxlLWRlZj4KLQotCTwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbiAtLT4KLQk8IS0tIHVzaW5nICJyZWRpZmluZSIgbWV0aG9kOiBpZiAib3ZlcndyaXRlIiBhdHRyaWJ1dGUgaXMgc2V0IHRvCi0JImZhbHNlIglvciBub3Qgc2V0LCBpdCBtZWFucyB0aGUgbm9kZSBpcyBjbGVhbmx5IHJlZGlmaW5lZCAtLT4KLQotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZGlzcGxheSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0iaW5saW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsb2NrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxpc3QtaXRlbSIvPgotCQk8a2V5d29yZCBuYW1lPSItd2FwLW1hcnF1ZWUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS10eXBlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImRpc2MiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2lyY2xlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNxdWFyZSIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWNpbWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1hbGlnbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJqdXN0aWZ5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtZGVjb3JhdGlvbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0idW5kZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsaW5rIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZlcnRpY2FsLWFsaWduIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdWIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1pZGRsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1tYXJxdWVlLXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ3YXAiPgotCQk8a2V5d29yZCBuYW1lPSJzY3JvbGwiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2xpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYWx0ZXJuYXRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtbWFycXVlZS1sb29wIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ3YXAiPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5maW5pdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1tYXJxdWVlLWRpciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0id2FwIj4KLQkJPGtleXdvcmQgbmFtZT0ibHRyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJ0bCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLW1hcnF1ZWUtc3BlZWQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9IndhcCI+Ci0JCTxrZXl3b3JkIG5hbWU9InNsb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZhc3QiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1hY2Nlc3NrZXkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImludGVyYWN0aXZlIiBjYXRlZ29yeT0id2FwIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJrZXljb21iaW5hdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLWlucHV0LWZvcm1hdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ3YXAiPgotCQk8Y29udGFpbmVyIG5hbWU9ImZvcm1hdCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLWlucHV0LXJlcXVpcmVkIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9IndhcCI+Ci0JCTxrZXl3b3JkIG5hbWU9InRydWUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZmFsc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCi0JPCEtLSBjb250YWluZXIgZGVmaW5pdGlvbiA6IENvbnRhaW5lciBpcyB0aGUgbHVtcCBvZiB2YWx1ZXMuCi0JSXQgY2FuIGJlIHVzZWQgbGlrZSBtYWNyb3MuIC0tPgotCTxjb250YWluZXItZGVmIG5hbWU9ImNvbG9yIiBvdmVyd3JpdGU9InRydWUiPgotCQk8Y29udGFpbmVyIG5hbWU9InN5c3RlbS1jb2xvciIgZW5hYmxlZD0iZmFsc2UiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iZm9ybWF0Ij4KLQkJPHN0cmluZyBuYW1lPSJhbnkiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ia2V5Y29tYmluYXRpb24iPgotCQk8Y29udGFpbmVyIG5hbWU9ImtleSIvPgotCQk8a2V5d29yZCBuYW1lPSItIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImtleSI+Ci0JCTxrZXl3b3JkIG5hbWU9InNwYWNlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0ic3BlY2lhbGtleSIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJzcGVjaWFsa2V5Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtb2RpZmllcmtleSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImZ1bmN0aW9ua2V5Ii8+Ci0JCTxjb250YWluZXIgbmFtZT0ibmF2aWdhdGlvbmtleSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImVkaXRrZXkiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJtaXNja2V5Ii8+Ci0JCTxjb250YWluZXIgbmFtZT0idm9sdW1lY29udHJvbGtleSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImFwcGxpY2F0aW9ua2V5Ii8+Ci0JCTxjb250YWluZXIgbmFtZT0icGhvbmVrZXkiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJ2ZW5kb3JrZXkiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ibW9kaWZpZXJrZXkiPgotCQk8a2V5d29yZCBuYW1lPSJhY2Nlc3NrZXkiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjbWRrZXkiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJvcHRrZXkiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjdHJsa2V5Ii8+Ci0JCTxjb250YWluZXIgbmFtZT0ic2hpZnRrZXkiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJhbHRrZXkiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJ3aW5rZXkiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJtZXRha2V5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZjbiIvPgotCQk8a2V5d29yZCBuYW1lPSJjYXBzIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImNtZGtleSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNtZCIvPgotCQk8a2V5d29yZCBuYW1lPSJyY21kIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxjbWQiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ib3B0a2V5Ij4KLQkJPGtleXdvcmQgbmFtZT0ib3B0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJvcHQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG9wdCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJjdHJsa2V5Ij4KLQkJPGtleXdvcmQgbmFtZT0iY3RybCIvPgotCQk8a2V5d29yZCBuYW1lPSJyY3RybCIvPgotCQk8a2V5d29yZCBuYW1lPSJsY3RybCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJzaGlmdGtleSI+Ci0JCTxrZXl3b3JkIG5hbWU9InNoaWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJzaGlmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJsc2hpZnQiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iYWx0a2V5Ij4KLQkJPGtleXdvcmQgbmFtZT0iYWx0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJhbHQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGFsdCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJ3aW5rZXkiPgotCQk8a2V5d29yZCBuYW1lPSJ3aW4iLz4KLQkJPGtleXdvcmQgbmFtZT0icndpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsd2luIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9Im1ldGFrZXkiPgotCQk8a2V5d29yZCBuYW1lPSJtZXRhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJtZXRhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxtZXRhIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImZ1bmN0aW9ua2V5Ij4KLQkJPGtleXdvcmQgbmFtZT0iZjEiLz4KLQkJPGtleXdvcmQgbmFtZT0iZjIiLz4KLQkJPGtleXdvcmQgbmFtZT0iZjMiLz4KLQkJPGtleXdvcmQgbmFtZT0iZjQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZjUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZjYiLz4KLQkJPGtleXdvcmQgbmFtZT0iZjciLz4KLQkJPGtleXdvcmQgbmFtZT0iZjgiLz4KLQkJPGtleXdvcmQgbmFtZT0iZjkiLz4KLQkJPGtleXdvcmQgbmFtZT0iZjEwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImYxMSIvPgotCQk8a2V5d29yZCBuYW1lPSJmMTIiLz4KLQkJPGtleXdvcmQgbmFtZT0iZjEzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImYxNCIvPgotCQk8a2V5d29yZCBuYW1lPSJmMTUiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ibmF2aWdhdGlvbmtleSI+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYiIvPgotCQk8a2V5d29yZCBuYW1lPSJlc2MiLz4KLQkJPGtleXdvcmQgbmFtZT0iZW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0icmV0dXJuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lbnUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGVscCIvPgotCQk8a2V5d29yZCBuYW1lPSJuYW1lbWVudSIvPgotCQk8a2V5d29yZCBuYW1lPSJyY2wiLz4KLQkJPGtleXdvcmQgbmFtZT0ic25kIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFycm93a2V5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InBhZ2VrZXkiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iYXJyb3drZXkiPgotCQk8a2V5d29yZCBuYW1lPSJ1cCIvPgotCQk8a2V5d29yZCBuYW1lPSJkb3duIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0icGFnZWtleSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImhvbWUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZW5kIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InBndXAiLz4KLQkJPGtleXdvcmQgbmFtZT0icGdkbiIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJlZGl0a2V5Ij4KLQkJPGtleXdvcmQgbmFtZT0iYnMiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImlucyIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bmRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImN1dCIvPgotCQk8a2V5d29yZCBuYW1lPSJjb3B5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InBhc3RlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNsciIvPgotCQk8a2V5d29yZCBuYW1lPSJzdG8iLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ibWlzY2tleSI+Ci0JCTxrZXl3b3JkIG5hbWU9InBydHNjIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN5c3JxIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNjcmxvY2siLz4KLQkJPGtleXdvcmQgbmFtZT0icGF1c2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYnJrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im51bWxvY2siLz4KLQkJPGtleXdvcmQgbmFtZT0icHdyIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InZvbHVtZWNvbnRyb2xrZXkiPgotCQk8a2V5d29yZCBuYW1lPSJ2b2x1bWV1cCIvPgotCQk8a2V5d29yZCBuYW1lPSJ2b2x1bWVkb3duIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImFwcGxpY2F0aW9ua2V5Ij4KLQkJPGtleXdvcmQgbmFtZT0ibWVtbyIvPgotCQk8a2V5d29yZCBuYW1lPSJ0b2RvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNhbGVuZGFyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1haWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYWRkcmVzcyIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJwaG9uZWtleSI+Ci0JCTxrZXl3b3JkIG5hbWU9InBob25lLXNlbmQiLz4KLQkJPGtleXdvcmQgbmFtZT0icGhvbmUtZW5kIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InBob25lLWFjY2VwdCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJ2ZW5kb3JrZXkiPgotCQk8a2V5d29yZCBuYW1lPSJ2bmQuIi8+Ci0JPC9jb250YWluZXItZGVmPgotCi0JPGNhdGVnb3J5LWRlZiBuYW1lPSJ3YXAiPgotCQk8Y2FwdGlvbj4ld2FwLmNhdGVnb3J5LWRlZi53YXAuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQotCTxudW1iZXItZGVmIG5hbWU9Imxlbmd0aCI+Ci0gICAgICAgIDx1bml0IG5hbWU9ImVtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImV4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB4Ii8+Ci0JPC9udW1iZXItZGVmPgotCi0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ii13YXAtbWFycXVlZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPi13YXAtbWFycXVlZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJzbGlkZSI+Ci0JCTxrZXl3b3JkLXZhbHVlPnNsaWRlPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImFsdGVybmF0ZSI+Ci0JCTxrZXl3b3JkLXZhbHVlPmFsdGVybmF0ZTwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJpbmZpbml0ZSI+Ci0JCTxrZXl3b3JkLXZhbHVlPmluZmluaXRlPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9Ii0iPgotCQk8a2V5d29yZC12YWx1ZT4tPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InNwYWNlIj4KLQkJPGtleXdvcmQtdmFsdWU+c3BhY2U8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iYWNjZXNza2V5Ij4KLQkJPGtleXdvcmQtdmFsdWU+YWNjZXNza2V5PC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImZuIj4KLQkJPGtleXdvcmQtdmFsdWU+Zm48L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iZmNuIj4KLQkJPGtleXdvcmQtdmFsdWU+ZmNuPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImNhcHMiPgotCQk8a2V5d29yZC12YWx1ZT5jYXBzPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImNtZCI+Ci0JCTxrZXl3b3JkLXZhbHVlPmNtZDwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJyY21kIj4KLQkJPGtleXdvcmQtdmFsdWU+cmNtZDwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJsY21kIj4KLQkJPGtleXdvcmQtdmFsdWU+bGNtZDwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJvcHQiPgotCQk8a2V5d29yZC12YWx1ZT5vcHQ8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0icm9wdCI+Ci0JCTxrZXl3b3JkLXZhbHVlPnJvcHQ8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0ibG9wdCI+Ci0JCTxrZXl3b3JkLXZhbHVlPmxvcHQ8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iY3RybCI+Ci0JCTxrZXl3b3JkLXZhbHVlPmN0cmw8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0icmN0cmwiPgotCQk8a2V5d29yZC12YWx1ZT5yY3RybDwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJsY3RybCI+Ci0JCTxrZXl3b3JkLXZhbHVlPmxjdHJsPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InNoaWZ0Ij4KLQkJPGtleXdvcmQtdmFsdWU+c2hpZnQ8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0icnNoaWZ0Ij4KLQkJPGtleXdvcmQtdmFsdWU+cnNoaWZ0PC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImxzaGlmdCI+Ci0JCTxrZXl3b3JkLXZhbHVlPmxzaGlmdDwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJhbHQiPgotCQk8a2V5d29yZC12YWx1ZT5hbHQ8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0icmFsdCI+Ci0JCTxrZXl3b3JkLXZhbHVlPnJhbHQ8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0ibGFsdCI+Ci0JCTxrZXl3b3JkLXZhbHVlPmxhbHQ8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0id2luIj4KLQkJPGtleXdvcmQtdmFsdWU+d2luPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InJ3aW4iPgotCQk8a2V5d29yZC12YWx1ZT5yd2luPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9Imx3aW4iPgotCQk8a2V5d29yZC12YWx1ZT5sd2luPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9Im1ldGEiPgotCQk8a2V5d29yZC12YWx1ZT5tZXRhPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InJtZXRhIj4KLQkJPGtleXdvcmQtdmFsdWU+cm1ldGE8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0ibG1ldGEiPgotCQk8a2V5d29yZC12YWx1ZT5sbWV0YTwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJmMSI+Ci0JCTxrZXl3b3JkLXZhbHVlPmYxPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImYyIj4KLQkJPGtleXdvcmQtdmFsdWU+ZjI8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iZjMiPgotCQk8a2V5d29yZC12YWx1ZT5mMzwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJmNCI+Ci0JCTxrZXl3b3JkLXZhbHVlPmY0PC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImY1Ij4KLQkJPGtleXdvcmQtdmFsdWU+ZjU8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iZjYiPgotCQk8a2V5d29yZC12YWx1ZT5mNjwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJmNyI+Ci0JCTxrZXl3b3JkLXZhbHVlPmY3PC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImY4Ij4KLQkJPGtleXdvcmQtdmFsdWU+Zjg8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iZjkiPgotCQk8a2V5d29yZC12YWx1ZT5mOTwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJmMTAiPgotCQk8a2V5d29yZC12YWx1ZT5mMTA8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iZjExIj4KLQkJPGtleXdvcmQtdmFsdWU+ZjExPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImYxMiI+Ci0JCTxrZXl3b3JkLXZhbHVlPmYxMjwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJmMTMiPgotCQk8a2V5d29yZC12YWx1ZT5mMTM8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iZjE0Ij4KLQkJPGtleXdvcmQtdmFsdWU+ZjE0PC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImYxNSI+Ci0JCTxrZXl3b3JkLXZhbHVlPmYxNTwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJ0YWIiPgotCQk8a2V5d29yZC12YWx1ZT50YWI8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iZXNjIj4KLQkJPGtleXdvcmQtdmFsdWU+ZXNjPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImVudGVyIj4KLQkJPGtleXdvcmQtdmFsdWU+ZW50ZXI8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0icmV0dXJuIj4KLQkJPGtleXdvcmQtdmFsdWU+cmV0dXJuPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9Im5hbWVtZW51Ij4KLQkJPGtleXdvcmQtdmFsdWU+bmFtZW1lbnU8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0icmNsIj4KLQkJPGtleXdvcmQtdmFsdWU+cmNsPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InNuZCI+Ci0JCTxrZXl3b3JkLXZhbHVlPnNuZDwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJhcnJvd2tleSI+Ci0JCTxrZXl3b3JkLXZhbHVlPmFycm93a2V5PC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InBhZ2VrZXkiPgotCQk8a2V5d29yZC12YWx1ZT5wYWdla2V5PC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InVwIj4KLQkJPGtleXdvcmQtdmFsdWU+dXA8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iZG93biI+Ci0JCTxrZXl3b3JkLXZhbHVlPmRvd248L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iaG9tZSI+Ci0JCTxrZXl3b3JkLXZhbHVlPmhvbWU8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iZW5kIj4KLQkJPGtleXdvcmQtdmFsdWU+ZW5kPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InBndXAiPgotCQk8a2V5d29yZC12YWx1ZT5wZ3VwPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InBnZG4iPgotCQk8a2V5d29yZC12YWx1ZT5wZ2RuPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImJzIj4KLQkJPGtleXdvcmQtdmFsdWU+YnM8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iZGVsIj4KLQkJPGtleXdvcmQtdmFsdWU+ZGVsPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImlucyI+Ci0JCTxrZXl3b3JkLXZhbHVlPmluczwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJ1bmRvIj4KLQkJPGtleXdvcmQtdmFsdWU+dW5kbzwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJjdXQiPgotCQk8a2V5d29yZC12YWx1ZT5jdXQ8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iY29weSI+Ci0JCTxrZXl3b3JkLXZhbHVlPmNvcHk8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0icGFzdGUiPgotCQk8a2V5d29yZC12YWx1ZT5wYXN0ZTwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJjbHIiPgotCQk8a2V5d29yZC12YWx1ZT5jbHI8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0ic3RvIj4KLQkJPGtleXdvcmQtdmFsdWU+c3RvPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InBydHNjIj4KLQkJPGtleXdvcmQtdmFsdWU+cHJ0c2M8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0ic3lzcnEiPgotCQk8a2V5d29yZC12YWx1ZT5zeXNycTwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJzY3Jsb2NrIj4KLQkJPGtleXdvcmQtdmFsdWU+c2NybG9jazwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJicmsiPgotCQk8a2V5d29yZC12YWx1ZT5icms8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0ibnVtbG9jayI+Ci0JCTxrZXl3b3JkLXZhbHVlPm51bWxvY2s8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0icHdyIj4KLQkJPGtleXdvcmQtdmFsdWU+cHdyPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InZvbHVtZXVwIj4KLQkJPGtleXdvcmQtdmFsdWU+dm9sdW1ldXA8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0idm9sdW1lZG93biI+Ci0JCTxrZXl3b3JkLXZhbHVlPnZvbHVtZWRvd248L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0ibWVtbyI+Ci0JCTxrZXl3b3JkLXZhbHVlPm1lbW88L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0idG9kbyI+Ci0JCTxrZXl3b3JkLXZhbHVlPnRvZG88L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0iY2FsZW5kYXIiPgotCQk8a2V5d29yZC12YWx1ZT5jYWxlbmRhcjwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJtYWlsIj4KLQkJPGtleXdvcmQtdmFsdWU+bWFpbDwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJhZGRyZXNzIj4KLQkJPGtleXdvcmQtdmFsdWU+YWRkcmVzczwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJwaG9uZS1zZW5kIj4KLQkJPGtleXdvcmQtdmFsdWU+cGhvbmUtc2VuZDwva2V5d29yZC12YWx1ZT4KLQk8L2tleXdvcmQtZGVmPgotCTxrZXl3b3JkLWRlZiBuYW1lPSJwaG9uZS1lbmQiPgotCQk8a2V5d29yZC12YWx1ZT5waG9uZS1lbmQ8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLQk8a2V5d29yZC1kZWYgbmFtZT0icGhvbmUtYWNjZXB0Ij4KLQkJPGtleXdvcmQtdmFsdWU+cGhvbmUtYWNjZXB0PC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InZuZC4iPgotCQk8a2V5d29yZC12YWx1ZT52bmQuPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9InRydWUiPgotCQk8a2V5d29yZC12YWx1ZT50cnVlPC9rZXl3b3JkLXZhbHVlPgotCTwva2V5d29yZC1kZWY+Ci0JPGtleXdvcmQtZGVmIG5hbWU9ImZhbHNlIj4KLQkJPGtleXdvcmQtdmFsdWU+ZmFsc2U8L2tleXdvcmQtdmFsdWU+Ci0JPC9rZXl3b3JkLWRlZj4KLTwvY3NzLXByb2ZpbGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3ZTM5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGNzc3Byb2ZpbGUtY3NzMS54bWwKLWNzczEuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb249Q2FzY2FkaW5nIFN0eWxlIFNoZWV0cywgbGV2ZWwgMQotY3NzMS5jYXRlZ29yeS1kZWYuYm94LmNhcHRpb249Qm94IG1vZGVsCi1jc3MxLmNhdGVnb3J5LWRlZi5jb2xvcmFuZGJhY2tncm91bmQuY2FwdGlvbj1Db2xvcnMgYW5kIEJhY2tncm91bmRzCi1jc3MxLmNhdGVnb3J5LWRlZi5jbGFzc2lmaWNhdGlvbi5jYXB0aW9uPUNsYXNzaWZpY2F0aW9uCi1jc3MxLmNhdGVnb3J5LWRlZi5mb250LmNhcHRpb249Rm9udAotY3NzMS5jYXRlZ29yeS1kZWYudGV4dC5jYXB0aW9uPVRleHQKLSMgY3NzcHJvZmlsZS1jc3MyLnhtbAotY3NzMi5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbj1DYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAyCi1jc3MyLmNhdGVnb3J5LWRlZi5hdXJhbC5jYXB0aW9uPUF1cmFsCi1jc3MyLmNhdGVnb3J5LWRlZi5ib3guY2FwdGlvbj1Cb3ggbW9kZWwKLWNzczIuY2F0ZWdvcnktZGVmLmNvbG9yYW5kYmFja2dyb3VuZC5jYXB0aW9uPUNvbG9ycyBhbmQgQmFja2dyb3VuZHMKLWNzczIuY2F0ZWdvcnktZGVmLmNvbnRlbnQuY2FwdGlvbj1HZW5lcmF0ZWQgY29udGVudC9MaXN0Ci1jc3MyLmNhdGVnb3J5LWRlZi5mb250LmNhcHRpb249Rm9udHMKLWNzczIuY2F0ZWdvcnktZGVmLnBhZ2UuY2FwdGlvbj1QYWdlZCBtZWRpYQotY3NzMi5jYXRlZ29yeS1kZWYudGFibGVzLmNhcHRpb249VGFibGVzCi1jc3MyLmNhdGVnb3J5LWRlZi50ZXh0LmNhcHRpb249VGV4dAotY3NzMi5jYXRlZ29yeS1kZWYudmlzdWFsLmNhcHRpb249VmlzdWFsCi1jc3MyLmNhdGVnb3J5LWRlZi51aS5jYXB0aW9uPVVzZXIgaW50ZXJmYWNlCi0jIGNzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbAotbW9iaWxlMV8wLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPUNTUyBNb2JpbGUgUHJvZmlsZSAxLjAKLSMgY3NzcHJvZmlsZS13YXAueG1sCi13YXAuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb249V0NTUyAxLjAKLXdhcC5jYXRlZ29yeS1kZWYud2FwLmNhcHRpb249V0NTUyBFeHRlbnNpb25zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFmZjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBDU1MgTW9kZWwKLW5sRmVhdHVyZU5hbWU9U3RydWN0dXJlZCBTb3VyY2UgQ1NTIE1vZGVsIE5MIFN1cHBvcnQKLWNzc3Byb2ZpbGVfY3NzMi5uYW1lPUNTUzI6IENhc2NhZGluZyBTdHlsZSBTaGVldHMsIGxldmVsIDIKLWNzc3Byb2ZpbGVfY3NzMS5uYW1lPUNTUzE6IENhc2NhZGluZyBTdHlsZSBTaGVldHMsIGxldmVsIDEKLWNzc3Byb2ZpbGVfbW9iaWxlMV8wLm5hbWU9Q1NTIE1vYmlsZSBQcm9maWxlIDEuMAotY3NzcHJvZmlsZV93YXAubmFtZT1XQ1NTIDEuMAotU3RydWN0dXJlZF9DU1NfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIENTUyBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotQ1NTX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUNTUyBDb250ZW50IFR5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Q5ZjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZSIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJjc3Ntb2RlbC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3Nwcm9maWxlIj4KLSAgICAgIDxwcm9maWxlCi0gICAgICAgICAgICBuYW1lPSIlY3NzcHJvZmlsZV9jc3MyLm5hbWUiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMi54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3Byb2ZpbGUuY3NzMiI+Ci0gICAgICA8L3Byb2ZpbGU+Ci0gICAgICA8cHJvZmlsZQotICAgICAgICAgICAgbmFtZT0iJWNzc3Byb2ZpbGVfY3NzMS5uYW1lIgotICAgICAgICAgICAgdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3Byb2ZpbGUuY3NzMSI+Ci0gICAgICA8L3Byb2ZpbGU+Ci0gICAgICA8cHJvZmlsZQotICAgICAgICAgICAgbmFtZT0iJWNzc3Byb2ZpbGVfbW9iaWxlMV8wLm5hbWUiCi0gICAgICAgICAgICB1cmk9ImNzc3Byb2ZpbGUvY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nwcm9maWxlLm1vYmlsZTFfMCI+Ci0gICAgICA8L3Byb2ZpbGU+Ci0gICAgICA8cHJvZmlsZQotICAgICAgICAgICAgbmFtZT0iJWNzc3Byb2ZpbGVfd2FwLm5hbWUiCi0gICAgICAgICAgICB1cmk9ImNzc3Byb2ZpbGUvY3NzcHJvZmlsZS13YXAueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nwcm9maWxlLndhcCI+Ci0gICAgICA8L3Byb2ZpbGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLSAgICAgIDxtb2RlbEhhbmRsZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckNTUyIKLSAgICAgICAgICAgIGFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbGhhbmRsZXIiPgotICAgICAgPC9tb2RlbEhhbmRsZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuYnVpbGRlcmRlbGVnYXRlLnRvZG8iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmJ1aWxkZXJkZWxlZ2F0ZSI+Ci0gICAgICA8cGFydGljaXBhbnQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3MuQ1NTVGFza1RhZ1NlZWtlciIKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIj4KLSAgICAgIDwvcGFydGljaXBhbnQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMiCi0gICAgICAgICBuYW1lPSIlU3RydWN0dXJlZF9DU1NfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSI+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249ImNzcyI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXRQcm9jZXNzb3JzIj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZm9ybWF0LkZvcm1hdFByb2Nlc3NvckNTUyIKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgICAgICAgIDxjb250ZW50LXR5cGUKLSAgICAgICAgICAgICAgIGZpbGUtZXh0ZW5zaW9ucz0iY3NzIgotICAgICAgICAgICAgICAgcHJpb3JpdHk9ImhpZ2giCi0gICAgICAgICAgICAgICBuYW1lPSIlQ1NTX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotICAgICAgICAgICAgICAgaWQ9ImNzc3NvdXJjZSIKLSAgICAgICAgICAgICAgIGJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiPgotCQkJPGRlc2NyaWJlciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnQuQ29udGVudERlc2NyaWJlckZvckNTUyIvPgotCQk8L2NvbnRlbnQtdHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvQ1NTQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9DU1NDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTZjMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9DU1NDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgaW50ZXJuYWwgQ1NTQ29yZVBsdWdpbiBjbGFzcyBpbnN0ZWFkIGlmIHBvc3NpYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb3JlUGx1Z2luIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW4gewotCS8vIHNlZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbgotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9hZGFwdGVycy9JQ1NTTW9kZWxBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2FkYXB0ZXJzL0lDU1NNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwOTUxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2FkYXB0ZXJzL0lDU1NNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTW9kZWxBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCUlDU1NNb2RlbCBnZXRNb2RlbCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvYWRhcHRlcnMvSU1vZGVsUHJvdmlkZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvYWRhcHRlcnMvSU1vZGVsUHJvdmlkZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwYmU1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2FkYXB0ZXJzL0lNb2RlbFByb3ZpZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFByb3ZpZGVBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgbW9kZWxQcm92aWRlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLQotCS8qKgotCSAqLwotCXZvaWQgbW9kZWxSZWxlYXNlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLQotCS8qKgotCSAqLwotCXZvaWQgbW9kZWxSZW1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvYWRhcHRlcnMvSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2FkYXB0ZXJzL0lTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjdkOGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvYWRhcHRlcnMvSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBJQ1NTTW9kZWxBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9hZGFwdGVycy9JU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvYWRhcHRlcnMvSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjNkMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9hZGFwdGVycy9JU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlU2VsZWN0b3JBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHBzZXVkb05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlib29sZWFuIG1hdGNoKElDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9hZGFwdGVycy9JU3R5bGVTaGVldEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvYWRhcHRlcnMvSVN0eWxlU2hlZXRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZTA5ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9hZGFwdGVycy9JU3R5bGVTaGVldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlU2hlZXRBZGFwdGVyIGV4dGVuZHMgSUNTU01vZGVsQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIEhUTUwvWE1MIGVsZW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBhZGFwdGVyCi0JICovCi0JRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIENTUyBkb2N1bWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gdGhpcyBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0U2hlZXQoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSB0aW1lIG9mIHJlbGVhc2luZyBIVE1ML1hNTCBtb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgdGltZSBvZiByZW1vdmluZyB0aGlzIEVsZW1lbnQgZnJvbSB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9hZGFwdGVycy9JU3R5bGVTaGVldExpc3RBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2FkYXB0ZXJzL0lTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4ZGIzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2FkYXB0ZXJzL0lTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlU2hlZXRMaXN0QWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlFbnVtZXJhdGlvbiBnZXRDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRPdmVycmlkZVN0eWxlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotCi0JLyoqCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXRMaXN0IGdldFN0eWxlU2hlZXRzKCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlU3R5bGVTaGVldHMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmIxMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY2xlYW51cDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTQ2xlYW51cFN0cmF0ZWd5IHsKLQotCXN0YXRpYyBmaW5hbCBzaG9ydCBBU0lTID0gMDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgTE9XRVIgPSAxOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUFBFUiA9IDI7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0SWRlbnRDYXNlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0UHJvcE5hbWVDYXNlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0UHJvcFZhbHVlQ2FzZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldFNlbGVjdG9yVGFnQ2FzZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0Zvcm1hdFNvdXJjZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc1F1b3RlVmFsdWVzKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZm9ybWF0U291cmNlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkZW50Q2FzZQotCSAqICAgICAgICAgICAgc2hvcnQKLQkgKi8KLQl2b2lkIHNldElkZW50Q2FzZShzaG9ydCBpZGVudENhc2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb3BOYW1lQ2FzZQotCSAqICAgICAgICAgICAgc2hvcnQKLQkgKi8KLQl2b2lkIHNldFByb3BOYW1lQ2FzZShzaG9ydCBwcm9wTmFtZUNhc2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb3BWYWx1ZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRQcm9wVmFsdWVDYXNlKHNob3J0IHByb3BWYWx1ZUNhc2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHF1b3RlVmFsdWVzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRRdW90ZVZhbHVlcyhib29sZWFuIHF1b3RlVmFsdWVzKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RvclRhZ0Nhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRTZWxlY3RvclRhZ0Nhc2Uoc2hvcnQgc2VsZWN0b3JUYWdDYXNlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwN2IzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnByZWZlcmVuY2VzLkNTU01vZGVsUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLQotCi0KLXB1YmxpYyBjbGFzcyBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgQ1NTQ2xlYW51cFN0cmF0ZWd5IHsKLQotCXN0YXRpYyBwcml2YXRlIENTU0NsZWFudXBTdHJhdGVneSBpbnN0YW5jZSA9IG51bGw7Ci0JLy8gaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHRzCi0JcHJvdGVjdGVkIHNob3J0IGZJZGVudENhc2UgPSBBU0lTOwotCXByb3RlY3RlZCBzaG9ydCBmUHJvcE5hbWVDYXNlID0gQVNJUzsKLQlwcm90ZWN0ZWQgc2hvcnQgZlByb3BWYWx1ZUNhc2UgPSBBU0lTOwotCXByb3RlY3RlZCBzaG9ydCBmU2VsZWN0b3JUYWdDYXNlID0gVVBQRVI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZlF1b3RlVmFsdWVzID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmRm9ybWF0U291cmNlID0gdHJ1ZTsKLQotCS8qKgotCSAqIENTU0NsZWFudXBTdHJhdGVneUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0SWRlbnRDYXNlKCkgewotCQlyZXR1cm4gZklkZW50Q2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU0NsZWFudXBTdHJhdGVneSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldFByb3BOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIGZQcm9wTmFtZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRQcm9wVmFsdWVDYXNlKCkgewotCQlyZXR1cm4gZlByb3BWYWx1ZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRTZWxlY3RvclRhZ0Nhc2UoKSB7Ci0JCXJldHVybiBmU2VsZWN0b3JUYWdDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWZJZGVudENhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURFTlRJRklFUikpOwotCQlmUHJvcE5hbWVDYXNlID0gZ2V0Q2xlYW51cENhc2VWYWx1ZShwcmVmcy5nZXRJbnQoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1BST1BFUlRZX05BTUUpKTsKLQkJZlByb3BWYWx1ZUNhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUpKTsKLQkJZlNlbGVjdG9yVGFnQ2FzZSA9IGdldENsZWFudXBDYXNlVmFsdWUocHJlZnMuZ2V0SW50KENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9TRUxFQ1RPUikpOwotCQlmUXVvdGVWYWx1ZXMgPSBwcmVmcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKTsKLQkJZkZvcm1hdFNvdXJjZSA9IHByZWZzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBDU1NDbGVhbnVwU3RyYXRlZ3kgZXF1aXZhbGVudCBjYXNlIHNob3J0IHZhbHVlIHdoZW4gZ2l2ZW4gYW4KLQkgKiBpbnQKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGVxdWl2YWxlbnQgY2FzZSBzaG9ydCBvciBBU0lTIGlmIGNhbm5vdCBiZSBkZXRlcm1pbmVkCi0JICovCi0JcHJpdmF0ZSBzaG9ydCBnZXRDbGVhbnVwQ2FzZVZhbHVlKGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkxPV0VSIDoKLQkJCQlyZXR1cm4gTE9XRVI7Ci0JCQljYXNlIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDoKLQkJCQlyZXR1cm4gVVBQRVI7Ci0JCX0KLQkJcmV0dXJuIEFTSVM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3JtYXRTb3VyY2UoKSB7Ci0JCXJldHVybiBmRm9ybWF0U291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUXVvdGVWYWx1ZXMoKSB7Ci0JCXJldHVybiBmUXVvdGVWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZvcm1hdFNvdXJjZQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSkgewotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZGVudENhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWRlbnRDYXNlKHNob3J0IGlkZW50Q2FzZSkgewotCQlmSWRlbnRDYXNlID0gaWRlbnRDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wTmFtZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcE5hbWVDYXNlKHNob3J0IHByb3BOYW1lQ2FzZSkgewotCQlmUHJvcE5hbWVDYXNlID0gcHJvcE5hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wVmFsdWVDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BWYWx1ZUNhc2Uoc2hvcnQgcHJvcFZhbHVlQ2FzZSkgewotCQlmUHJvcFZhbHVlQ2FzZSA9IHByb3BWYWx1ZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHF1b3RlVmFsdWVzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVvdGVWYWx1ZXMoYm9vbGVhbiBxdW90ZVZhbHVlcykgewotCQlmUXVvdGVWYWx1ZXMgPSBxdW90ZVZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0b3JUYWdDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yVGFnQ2FzZShzaG9ydCBzZWxlY3RvclRhZ0Nhc2UpIHsKLQkJZlNlbGVjdG9yVGFnQ2FzZSA9IHNlbGVjdG9yVGFnQ2FzZTsKLQl9Ci0KLQkvLyBUT0RPOiBhIHNhdmVPcHRpb25zIHNob3VsZCBiZSBhZGRlZCB0byBDU1NDbGVhbnVwU3RyYXRlZ3kgaW50ZXJmYWNlCi0JcHVibGljIHZvaWQgc2F2ZU9wdGlvbnMoKSB7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX0lERU5USUZJRVIsIGZJZGVudENhc2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FLCBmUHJvcE5hbWVDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUsIGZQcm9wVmFsdWVDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfU0VMRUNUT1IsIGZTZWxlY3RvclRhZ0Nhc2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTLCBmUXVvdGVWYWx1ZXMpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIGZGb3JtYXRTb3VyY2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNWRlYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NGb3JtYXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY2xlYW51cC5BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cFByb2Nlc3NvckNTUyBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJQ1NTRm9ybWF0VXRpbCBmb3JtYXRVdGlsID0gQ1NTRm9ybWF0VXRpbC5nZXRJbnN0YW5jZSgpOwotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gKChJQ1NTTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBkb2MpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IGZvcm1hdHRlci5jbGVhbnVwKGRvYyk7Ci0JCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIGRvYykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBkb2MpLmdldEVuZE9mZnNldCgpOwotCQkJCWZvcm1hdFV0aWwucmVwbGFjZVNvdXJjZShkb2MuZ2V0TW9kZWwoKSwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBidWYudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgWE1MTW9kZWwpIHsKLQkJCUxpc3QgY3Nzbm9kZXMgPSBmb3JtYXRVdGlsLmNvbGxlY3RDU1NOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJaWYgKGNzc25vZGVzICE9IG51bGwgJiYgIWNzc25vZGVzLmlzRW1wdHkoKSkgewotCQkJCUlDU1NNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc3Nub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSBjc3Nub2Rlcy5nZXQoaSk7Ci0JCQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBub2RlKTsKLQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IGZvcm1hdHRlci5jbGVhbnVwKG5vZGUpOwotCQkJCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCWludCBlbmRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJCQkJaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCQkJCQltb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJCQl9Ci0JCQkJCQlmb3JtYXRVdGlsLnJlcGxhY2VTb3VyY2UobW9kZWwsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgYnVmLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciNjbGVhbnVwRG9jdW1lbnQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciNjbGVhbnVwRG9jdW1lbnQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuY2xlYW51cC5BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yI2dldENsZWFudXBIYW5kbGVyKG9yZy53M2MuZG9tLk5vZGUpCi0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgZ2V0Q2xlYW51cEhhbmRsZXIoTm9kZSBub2RlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5jbGVhbnVwLkFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IjZ2V0Rm9ybWF0UHJvY2Vzc29yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuY2xlYW51cC5BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yI3JlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NBY2Nlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU0FjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDVlZjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU0FjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTQWNjZXNzIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLlZlY3RvcgotCSAqLwotCVZlY3RvciBnZXRDbGFzc05hbWVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTQXR0ci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTQXR0ci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODdkOTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU0F0dHIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTQXR0ciBleHRlbmRzIElDU1NOb2RlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0T3duZXJDU1NOb2RlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NDaGFyc2V0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTQ2hhcnNldFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2MTI2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NDaGFyc2V0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NDaGFyc2V0UnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NDaGFyc2V0UnVsZSB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIEVOQ09ESU5HID0gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU0RvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDcwZTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU0RvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU0RvY3VtZW50IGV4dGVuZHMgSUNTU05vZGUgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTQ2hhcnNldFJ1bGUKLQkgKi8KLQlJQ1NTQ2hhcnNldFJ1bGUgY3JlYXRlQ1NTQ2hhcnNldFJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZQotCSAqLwotCUNTU0ZvbnRGYWNlUnVsZSBjcmVhdGVDU1NGb250RmFjZVJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGUKLQkgKi8KLQlJQ1NTSW1wb3J0UnVsZSBjcmVhdGVDU1NJbXBvcnRSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5JQ1NTTWVkaWFSdWxlCi0JICovCi0JSUNTU01lZGlhUnVsZSBjcmVhdGVDU1NNZWRpYVJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlCi0JICovCi0JSUNTU1BhZ2VSdWxlIGNyZWF0ZUNTU1BhZ2VSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBjcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShzaG9ydCBwcmltaXRpdmVUeXBlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUNTU1J1bGUgY3JlYXRlQ1NTUnVsZShTdHJpbmcgcnVsZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC50cmVlbW9kZWwuY2VpLkNTU1N0eWxlRGVjbEl0ZW0KLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSUNTU1N0eWxlRGVjbEl0ZW0gY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZQotCSAqLwotCUlDU1NTdHlsZVJ1bGUgY3JlYXRlQ1NTU3R5bGVSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZQotCSAqLwotCUNTU1Vua25vd25SdWxlIGNyZWF0ZUNTU1Vua25vd25SdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdAotCSAqLwotCU1lZGlhTGlzdCBjcmVhdGVNZWRpYUxpc3QoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICovCi0JSUNTU01vZGVsIGdldE1vZGVsKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzRG9jdW1lbnQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NJbXBvcnRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NJbXBvcnRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MThjMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTSW1wb3J0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU0ltcG9ydFJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgQ1NTSW1wb3J0UnVsZSB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIEhSRUYgPSAiaHJlZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVmcmVzaFN0eWxlU2hlZXQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBocmVmCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NNZWRpYVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU01lZGlhUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDZmM2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU01lZGlhUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU01lZGlhUnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTWVkaWFSdWxlIGV4dGVuZHMgSUNTU05vZGUsIElDU1NSdWxlQ29udGFpbmVyLCBDU1NNZWRpYVJ1bGUgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZjVmM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5ldmVudC5JQ1NTU3R5bGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU01vZGVsIGV4dGVuZHMgSUNTU1N0eWxlTm90aWZpZXIsIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUwgPSAiZXh0ZXJuYWxDU1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRURERUQgPSAiZW1iZWRkZWRDU1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5MSU5FID0gImlubGluZUNTUyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuSUNTU0RvY3VtZW50Ci0JICovCi0JSUNTU0RvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlIGdldE93bmVyRE9NTm9kZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JT2JqZWN0IGdldFN0eWxlU2hlZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBjbGVhbnVwIC0+IHJlYnVpbGQgQ1NTIE5vZGVzIFRoaXMgaXMgcHJlLWJldGEgZml4IGZvciAxNzgxNzYuCi0JICovCi0Jdm9pZCByZWZyZXNoTm9kZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NOYW1lZE5vZGVNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU05hbWVkTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjFhY2NhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU05hbWVkTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOYW1lZE5vZGVNYXAgZXh0ZW5kcyBJQ1NTTm9kZUxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSUNTU05vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YWYwYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOb2RlIHsKLQotCXNob3J0IEFUVFJfTk9ERSA9IC0xOwotCXNob3J0IFVOS05PV05SVUxFX05PREUgPSAwOwotCXNob3J0IFNUWUxFUlVMRV9OT0RFID0gMTsKLQlzaG9ydCBDSEFSU0VUUlVMRV9OT0RFID0gMjsKLQlzaG9ydCBJTVBPUlRSVUxFX05PREUgPSAzOwotCXNob3J0IE1FRElBUlVMRV9OT0RFID0gNDsKLQlzaG9ydCBGT05URkFDRVJVTEVfTk9ERSA9IDU7Ci0Jc2hvcnQgUEFHRVJVTEVfTk9ERSA9IDY7Ci0Jc2hvcnQgU1RZTEVTSEVFVF9OT0RFID0gNzsKLQlzaG9ydCBTVFlMRURFQ0xBUkFUSU9OX05PREUgPSA4OwotCXNob3J0IFNUWUxFREVDTElURU1fTk9ERSA9IDk7Ci0Jc2hvcnQgVkFMVUVMSVNUX05PREUgPSAxMDsKLQlzaG9ydCBQUklNSVRJVkVWQUxVRV9OT0RFID0gMTE7Ci0Jc2hvcnQgTUVESUFMSVNUX05PREUgPSAxMjsKLQlzaG9ydCBET0NVTUVOVENTU1NUWUxFX05PREUgPSAxMzsKLQlzaG9ydCBMSU5LU1RZTEVfTk9ERSA9IDE0OwotCXNob3J0IEVMRU1FTlRDU1NJTkxJTkVTVFlMRV9OT0RFID0gMTU7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jc3MuQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOYW1lZE5vZGVNYXAKLQkgKi8KLQlJQ1NTTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudHJlZW1vZGVsLmNzcy5DU1NOb2RlTGlzdAotCSAqLwotCUlDU1NOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jc3MuQ1NTTm9kZQotCSAqLwotCUlDU1NOb2RlIGdldEZpcnN0Q2hpbGQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudHJlZW1vZGVsLmNzcy5DU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0TGFzdENoaWxkKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jc3MuQ1NTTm9kZQotCSAqLwotCUlDU1NOb2RlIGdldE5leHRTaWJsaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0Tm9kZVR5cGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudHJlZW1vZGVsLmNzcy5DU1NEb2N1bWVudAotCSAqLwotCUlDU1NEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jc3MuQ1NTTm9kZQotCSAqLwotCUlDU1NOb2RlIGdldFBhcmVudE5vZGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudHJlZW1vZGVsLmNzcy5DU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc0NoaWxkTm9kZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NOb2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1YmZiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOb2RlTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudHJlZW1vZGVsLmNzcy5DU1NOb2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlJQ1NTTm9kZSBpdGVtKGludCBpbmRleCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTUGFnZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1BhZ2VSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODJmYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTUGFnZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQYWdlUnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTUGFnZVJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgQ1NTUGFnZVJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBTRUxFQ1RPUiA9ICJzZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yTGlzdAotCSAqLwotCUlDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTUHJpbWl0aXZlVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1ByaW1pdGl2ZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjBiNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTUHJpbWl0aXZlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTUHJpbWl0aXZlVmFsdWUgZXh0ZW5kcyBJQ1NTTm9kZSwgSUNTU1ZhbHVlLCBDU1NQcmltaXRpdmVWYWx1ZSB7Ci0KLQlzaG9ydCBDU1NfSU5URUdFUiA9IDI2OwotCXNob3J0IENTU19IQVNIID0gMjc7Ci0Jc2hvcnQgQ1NTX1VSQU5HRSA9IDI4OwotCXNob3J0IENTU19GT1JNQVQgPSAyOTsKLQlzaG9ydCBDU1NfTE9DQUwgPSAzMDsKLQlzaG9ydCBDU1NfU0xBU0ggPSAzMTsKLQlzaG9ydCBDU1NfQ09NTUEgPSAzMjsKLQlzaG9ydCBDU1NfSU5IRVJJVF9QUklNSVRJVkUgPSAzMzsKLQotCS8qKgotCSAqIEBwYXJhbSBmbG9hdFZhbHVlCi0JICogICAgICAgICAgICBmbG9hdAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKGZsb2F0IGZsb2F0VmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgc3RyaW5nVmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTUnVsZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTUnVsZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWVhN2QzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1J1bGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTUnVsZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUNTU1J1bGUgYXBwZW5kUnVsZShDU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld1J1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJlZlJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JQ1NTUnVsZSBpbnNlcnRSdWxlQmVmb3JlKENTU1J1bGUgbmV3UnVsZSwgQ1NTUnVsZSByZWZSdWxlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlDU1NSdWxlIHJlbW92ZVJ1bGUoQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUNTU1J1bGUgcmVwbGFjZVJ1bGUoQ1NTUnVsZSBuZXdSdWxlLCBDU1NSdWxlIG9sZFJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1NlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWNlYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NlbGVjdG9yIHsKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuSUNTU1NlbGVjdG9ySXRlbQotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JSUNTU1NlbGVjdG9ySXRlbSBnZXRJdGVtKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCUl0ZXJhdG9yIGdldEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFNwZWNpZmljaXR5KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCWJvb2xlYW4gbWF0Y2goRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvciBnZXRFcnJvcnMoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRFcnJvckNvdW50KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjZWFjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGV4dGVuZHMgSUNTU1NlbGVjdG9ySXRlbSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgREVTQ0VOREFOVCA9ICcgJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hJTEQgPSAnPic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEFESkFDRU5UID0gJysnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBVTktOT1dOID0gJz8nOyAvLyBlcnJvciBjYXNlCi0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWNoYXIgZ2V0Q29tYmluYXRvclR5cGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NTZWxlY3Rvckl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1NlbGVjdG9ySXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRhZTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1NlbGVjdG9ySXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTZWxlY3Rvckl0ZW0gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lNUExFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01CSU5BVE9SID0gMjsKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldEl0ZW1UeXBlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTU2VsZWN0b3JMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NTZWxlY3Rvckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2MDhkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NTZWxlY3Rvckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NlbGVjdG9yTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCUl0ZXJhdG9yIGdldEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLlZlY3RvcgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JSUNTU1NlbGVjdG9yIGdldFNlbGVjdG9yKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0RXJyb3JDb3VudCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgZ2V0RXJyb3JzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCWJvb2xlYW4gbWF0Y2goRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTU2ltcGxlU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1NpbXBsZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzMyZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTU2ltcGxlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2ltcGxlU2VsZWN0b3IgZXh0ZW5kcyBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xhc3MoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JU3RyaW5nIGdldElEKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mQ2xhc3NlcygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mSURzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlpbnQgZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlTdHJpbmcgZ2V0UHNldWRvTmFtZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc1VuaXZlcnNhbCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbEl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ0YjA4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NTdHlsZURlY2xJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlRGVjbEl0ZW0gZXh0ZW5kcyBJQ1NTTm9kZSwgSUNTU1ZhbHVlTGlzdCB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIElNUE9SVEFOVCA9ICJpbXBvcnRhbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBhcHBlbmRWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZQotCSAqLwotCUNTU1ZhbHVlIGdldENTU1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0UHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIHJlbW92ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgcmVwbGFjZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSBuZXdWYWx1ZSwgSUNTU1ByaW1pdGl2ZVZhbHVlIG9sZFZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIHByaW9yaXR5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBzZXRQcmlvcml0eShTdHJpbmcgcHJpb3JpdHkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhZWI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NTdHlsZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBleHRlbmRzIElDU1NEb2N1bWVudCwgQ1NTU3R5bGVEZWNsYXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jZWkuQ1NTU3R5bGVEZWNsSXRlbQotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlJQ1NTU3R5bGVEZWNsSXRlbSBnZXREZWNsSXRlbU5vZGUoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jZWkuQ1NTU3R5bGVEZWNsSXRlbQotCSAqIEBwYXJhbSBvbGREZWNsCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC50cmVlbW9kZWwuY2VpLkNTU1N0eWxlRGVjbEl0ZW0KLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JSUNTU1N0eWxlRGVjbEl0ZW0gcmVtb3ZlRGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG9sZERlY2wpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jZWkuQ1NTU3R5bGVEZWNsSXRlbQotCSAqIEBwYXJhbSBuZXdEZWNsCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC50cmVlbW9kZWwuY2VpLkNTU1N0eWxlRGVjbEl0ZW0KLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JSUNTU1N0eWxlRGVjbEl0ZW0gc2V0RGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG5ld0RlY2wpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTU3R5bGVSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NTdHlsZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmZTI2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NTdHlsZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlUnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NTdHlsZVJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBTRUxFQ1RPUiA9ICJzZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yTGlzdAotCSAqLwotCUlDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTU3R5bGVTaGVldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTU3R5bGVTaGVldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGExZjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1N0eWxlU2hlZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVTaGVldCBleHRlbmRzIElDU1NEb2N1bWVudCwgSUNTU1J1bGVDb250YWluZXIsIENTU1N0eWxlU2hlZXQgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCU5vZGVMaXN0IGdldE93bmVyTm9kZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKiBAcGFyYW0gZG9jCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCU5vZGVMaXN0IGdldE93bmVyTm9kZXMoRG9jdW1lbnQgZG9jKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0Ci0JICovCi0JQ1NTUnVsZUxpc3QgZ2V0T3duZXJSdWxlcygpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdAotCSAqLwotCVN0eWxlU2hlZXRMaXN0IGdldFBhcmVudFN0eWxlU2hlZXRzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSUNTU1ZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzE1ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTVmFsdWUgZXh0ZW5kcyBDU1NWYWx1ZSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0Q1NTVmFsdWVUZXh0KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ1NTVmFsdWVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NWYWx1ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhNTkzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDU1NWYWx1ZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1ZhbHVlTGlzdCBleHRlbmRzIElDU1NWYWx1ZSwgQ1NTVmFsdWVMaXN0IHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgYXBwZW5kVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgcmVtb3ZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDb3VudGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lDb3VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTdkNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9kb2N1bWVudC9JQ291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNvdW50ZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvdW50ZXIgZXh0ZW5kcyBJQ1NTTm9kZSwgQ291bnRlciB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIElERU5USUZJRVIgPSAiaWRlbnRpZmllciI7IC8vJE5PTi1OTFMtMSQKLQlqYXZhLmxhbmcuU3RyaW5nIExJU1RTVFlMRSA9ICJsaXN0c3R5bGUiOyAvLyROT04tTkxTLTEkCi0JamF2YS5sYW5nLlN0cmluZyBTRVBBUkFUT1IgPSAic2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIGlkZW50aWZpZXIKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RTdHlsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldExpc3RTdHlsZShTdHJpbmcgbGlzdFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIFNlcGFyYXRvcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgc2VwYXJhdG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbkNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWVkYzY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuRE9NSW1wbGVtZW50YXRpb25DU1M7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTUltcGxlbWVudGF0aW9uQ1NTIGV4dGVuZHMgRE9NSW1wbGVtZW50YXRpb25DU1MgewotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC50cmVlbW9kZWwuY2VpLkNTU1N0eWxlRGVjbEJsb2NrCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUlDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSURvY3VtZW50U3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZG9jdW1lbnQvSURvY3VtZW50U3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkOWE4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2RvY3VtZW50L0lEb2N1bWVudFN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5Eb2N1bWVudFN0eWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50U3R5bGUgZXh0ZW5kcyBEb2N1bWVudFN0eWxlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBuZXdTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlTdHlsZVNoZWV0IGFwcGVuZFNoZWV0KFN0eWxlU2hlZXQgbmV3U2hlZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gbmV3U2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gcmVmU2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JU3R5bGVTaGVldCBpbnNlcnRTaGVldEJlZm9yZShTdHlsZVNoZWV0IG5ld1NoZWV0LCBTdHlsZVNoZWV0IHJlZlNoZWV0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG9sZFNoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0eWxlU2hlZXQgcmVtb3ZlU2hlZXQoU3R5bGVTaGVldCBvbGRTaGVldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBuZXdTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBvbGRTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlTdHlsZVNoZWV0IHJlcGxhY2VTaGVldChTdHlsZVNoZWV0IG5ld1NoZWV0LCBTdHlsZVNoZWV0IG9sZFNoZWV0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZXZlbnQvSUNTU1N0eWxlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZXZlbnQvSUNTU1N0eWxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxMzk0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2V2ZW50L0lDU1NTdHlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlTGlzdGVuZXIgewotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzdHlsZUNoYW5nZWQoSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc3R5bGVVcGRhdGUoSUNTU01vZGVsIHNyY01vZGVsKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2V2ZW50L0lDU1NTdHlsZU5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2V2ZW50L0lDU1NTdHlsZU5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODI0NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9ldmVudC9JQ1NTU3R5bGVOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZXZlbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlTm90aWZpZXIgZXh0ZW5kcyBJQ1NTU3R5bGVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogCi0JICovCi0JTGlzdCBnZXRTdHlsZUxpc3RlbmVycygpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc1JlY29yZGluZygpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2Zvcm1hdC9DU1NTb3VyY2VGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZm9ybWF0L0NTU1NvdXJjZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2UyMzA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZm9ybWF0L0NTU1NvdXJjZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZm9ybWF0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU291cmNlRm9ybWF0dGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uCi0JICovCi0JU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvZm9ybWF0L0Zvcm1hdFByb2Nlc3NvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTMyMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZm9ybWF0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTRm9ybWF0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdC5BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEZvcm1hdFByb2Nlc3NvckNTUyBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgcmVuYW1lZCB0byBnZXRGaWxlRXh0ZW5zaW9uKCkgVE9ETyB3aWxsIGRlbGV0ZSBpbiBDNQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiAiY3NzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICJjc3MiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQotCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJQ1NTRm9ybWF0VXRpbCBmb3JtYXRVdGlsID0gQ1NTRm9ybWF0VXRpbC5nZXRJbnN0YW5jZSgpOwotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gKChJQ1NTTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBkb2MpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IGZvcm1hdHRlci5mb3JtYXQoZG9jKTsKLQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZG9jKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBlbmRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIGRvYykuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJZm9ybWF0VXRpbC5yZXBsYWNlU291cmNlKGRvYy5nZXRNb2RlbCgpLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIGJ1Zi50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBYTUxNb2RlbCkgewotCQkJTGlzdCBjc3Nub2RlcyA9IGZvcm1hdFV0aWwuY29sbGVjdENTU05vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQlpZiAoY3Nzbm9kZXMgIT0gbnVsbCAmJiAhY3Nzbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJSUNTU01vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNzc25vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIGNzc25vZGVzLmdldChpKTsKLQkJCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIG5vZGUpOwotCQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gZm9ybWF0dGVyLmZvcm1hdChub2RlKTsKLQkJCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQkJCQkJbW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkJfQotCQkJCQkJZm9ybWF0VXRpbC5yZXBsYWNlU291cmNlKG1vZGVsLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIGJ1Zi50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuZm9ybWF0LkFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciNnZXRGb3JtYXRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5mb3JtYXQuQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yI2dldEZvcm1hdHRlcihvcmcudzNjLmRvbS5Ob2RlKQotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoTm9kZSBub2RlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5mb3JtYXQuQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yI3JlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwMzU0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucHJlZmVyZW5jZXMuQ1NTUHJlZmVyZW5jZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucHJlZmVyZW5jZXMuQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENTU0NvcmVQbHVnaW4gcGx1Z2luOwotCS8vIFJlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFRklYID0gIiUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ET1VCTEVfUFJFRklYID0gIiUlIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ1NTQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDU1NDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI2luaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJQ1NTUHJlZmVyZW5jZUhlbHBlci5jcmVhdGVEZWZhdWx0UHJlZmVyZW5jZXMocHJlZnMpOwotCi0JCS8vIHNldCBtb2RlbCBwcmVmZXJlbmNlIGRlZmF1bHRzCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFLCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSwgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMsIGZhbHNlKTsKLQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBkZWZhdWx0RW5jID0gQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVVRGXzg7Ci0JCVN0cmluZyBzeXN0ZW1FbmMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3lzdGVtRW5jICE9IG51bGwpIHsKLQkJCWRlZmF1bHRFbmMgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0UHJlZmVycmVkRGVmYXVsdElhbmFOYW1lKHN5c3RlbUVuYywgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVVRGXzgpOwotCQl9Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQsIGRlZmF1bHRFbmMpOwotCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQUJfV0lEVEgsIDQpOwotCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUVElOR19TVVBQT1JURUQsIHRydWUpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUywgZmFsc2UpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLklOREVOVF9VU0lOR19UQUJTLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMsIGZhbHNlKTsKLQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlBSRUZFUlJFRF9NQVJLVVBfQ0FTRV9TVVBQT1JURUQsIGZhbHNlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFLCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBzID0gdmFsdWUudHJpbSgpOwotCQlpZiAoIXMuc3RhcnRzV2l0aChLRVlfUFJFRklYLCAwKSkKLQkJCXJldHVybiBzOwotCQlpZiAocy5zdGFydHNXaXRoKEtFWV9ET1VCTEVfUFJFRklYLCAwKSkKLQkJCXJldHVybiBzLnN1YnN0cmluZygxKTsKLQotCQlpbnQgaXggPSBzLmluZGV4T2YoJyAnKTsKLQkJU3RyaW5nIGtleSA9IGl4ID09IC0xID8gcyA6IHMuc3Vic3RyaW5nKDAsIGl4KTsKLQotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkuc3Vic3RyaW5nKDEpKSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiN2VhYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGxlYXNlX3NwZWNpZnlfQ1NTX2ZpbGVfbmE9UGxlYXNlIHNwZWNpZnkgQ1NTIGZpbGUgbmFtZS4KLUVSUk9SX19DYW5ub3RfdXNlX2Ffc3RhdGljX0VSUk9SXz1FUlJPUjogQ2Fubm90IHVzZSBhIHN0YXRpYyBDaGFyU3RyZWFtIGNsYXNzIHdpdGggYSBub24tc3RhdGljIGxleGljYWwgYW5hbHl6ZXIuCi1Zb3VfY2Fubm90X3VzZV9DU1NTdHlsZVNoZV9VSV89WW91IGNhbm5vdCB1c2UgQ1NTU3R5bGVTaGVldC5nZXRPd25lclJ1bGUoKSBiZWNhdXNlIG9mIG1hbnkgcmVmZXJlbmNlcnMgb2YgdGhpcyBydWxlXG5QbGVhc2UgdXNlIGdldE9ud2VyUnVsZXMoKQotTWlzc2luZ19yZXR1cm5fc3RhdGVtZW50X2lfRVJST1JfPU1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbgotMWNvbmNhdF9FUlJPUl89ezB9Zmlyc3QgZmxhdCBub2RlIGlzIG51bGwuCi0yY29uY2F0X0VSUk9SXz17MH1maXJzdCBmbGF0IG5vZGUgaXMgbm90IGluIG1vZGVsLgotM2NvbmNhdF9FUlJPUl89ezB9bGFzdCBmbGF0IG5vZGUgaXMgbnVsbC4KLTRjb25jYXRfRVJST1JfPXswfWxhc3QgZmxhdCBub2RlIGlzIG5vdCBpbiBtb2RlbC4KLTI1Y29uY2F0X0VSUk9SXz17MH1maXJzdCByZWdpb24gaXMgbnVsbC4KLTI2Y29uY2F0X0VSUk9SXz17MH1maXJzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLgotMjdjb25jYXRfRVJST1JfPXswfWxhc3QgcmVnaW9uIGlzIG51bGwuCi0yOGNvbmNhdF9FUlJPUl89ezB9bGFzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLgotNWNvbmNhdF9FUlJPUl89ezB9Zmlyc3QgcmVnaW9uIGlzIG51bGwuCi02Y29uY2F0X0VSUk9SXz17MH1maXJzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLgotN2NvbmNhdF9FUlJPUl89ezB9bGFzdCByZWdpb24gaXMgbnVsbC4KLThjb25jYXRfRVJST1JfPXswfWxhc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4KLTljb25jYXRfRVJST1JfPUludmFsaWQgZXNjYXBlIGNoYXJhY3RlciBhdCBsaW5lIHswfSBjb2x1bW4gezF9LgotMTJjb25jYXRfRVhDXz1DYXVnaHQgRXhjZXB0aW9uOiB7MH0KLTEzY29uY2F0X0VSUk9SXz1FcnJvcjogSWdub3JpbmcgaW52YWxpZCBsZXhpY2FsIHN0YXRlIDogezB9LiBTdGF0ZSB1bmNoYW5nZWQuCi0xNWNvbmNhdF9FUlJPUl89TGV4aWNhbCBlcnJvciBhdCBsaW5lIHswfSwgY29sdW1uIHsxfS4gIEVuY291bnRlcmVkOiAgezJ9IGFmdGVyIDoKLUVSUk9SX19DYW5ub3RfdXNlX2Ffc3RhdGljX0VSUk9SX19FUlJPUl89RVJST1I6IENhbm5vdCB1c2UgYSBzdGF0aWMgQ2hhclN0cmVhbSBjbGFzcyB3aXRoIGEgbm9uLXN0YXRpYyBsZXhpY2FsIGFuYWx5emVyLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZTJmZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50L0Fic3RyYWN0Q29udGVudERlc2NyaWJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50L0Fic3RyYWN0Q29udGVudERlc2NyaWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjJiNzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudC9BYnN0cmFjdENvbnRlbnREZXNjcmliZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbnRlbnREZXNjcmliZXIgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFR9OwotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCi0JCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQotCQkvLyBhc3N1bWUgaWYgd2UncmUgY2FsbGVkIGF0IGFsbCB0aGF0IHdlIGFyZSB2YWxpZCAoZmV3IHR5cGVzIGNvdWxkIGJlCi0JCS8vIGRpc3Byb3ZlZCwgbWF5YmUgWE1MIC0tIG9yLCBtYXliZSBpZiBleGNlcHRpb24gb2NjdXJzIGFib3ZlPykKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLlJlYWRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQotCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0KLQkJLy8gYXNzdW1lIGlmIHdlJ3JlIGNhbGxlZCBhdCBhbGwgdGhhdCB3ZSBhcmUgdmFsaWQgKGZldyB0eXBlcyBjb3VsZCBiZQotCQkvLyBkaXNwcm92ZWQsIG1heWJlIFhNTCAtLSBvciwgbWF5YmUgaWYgZXhjZXB0aW9uIG9jY3VycyBhYm92ZT8pCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNnZXRTdXBwb3J0ZWRPcHRpb25zKCkKLQkgKi8KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0KLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDYWxjdWxhdGlvbnMoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RlOiBpZiB3ZSdyZSBhc2tlZCBmb3Igb25lLCB3ZSBzZXQgdGhlbSBhbGwuIEkgbmVlZCB0byBiZSBzdXJlIGlmCi0JCS8vIGNhbGxlZAotCQkvLyBtdWxpdGlwbGUgdGltZXMgKG9uZSBmb3IgZWFjaCwgc2F5KSB0aGF0IHdlIGRvbid0IHdhc3RlIHRpbWUKLQkJLy8gcHJvY2Vzc2luZyBzYW1lCi0JCS8vIGNvbnRlbnQgYWdhaW4uCi0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSBkZXRlY3Rvci5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQudGhlCi0JCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZ2V0RGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYXZvaWQgYWRkaW5nIGFueXRoaW5nIGlmIG5vdCBhYnNvbHV0bHkgbmVlZGVkLCBzaW5jZSBhbHdheXMKLQkJLy8gImNhY2hlZCIgcGVyIHNlc3Npb24KLQkJLy9kZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuRU5DT0RJTkdfTUVNRU5UTywKLQkJLy8gZW5jb2RpbmdNZW1lbnRvKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4KLQkJLy8gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsIGhhcHBlbiwgZm9yIGV4YW1wbGUsCi0JCS8vIGlmIHRoZXJlJ3MKLQkJLy8gZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMgZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLwkJCWlmICghZGV0ZWN0ZWRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCS8vCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULAotCQkJLy8gZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJCS8vCQkJfQotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCS8vCQllbHNlIGlmCi0JCS8vIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuRU5DT0RJTkdfTUVNRU5UTykpCi0JCS8vCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50L0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMDM4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmludGVybmFsLkJ5dGVSZWFkZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQotCXByb3RlY3RlZCBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0KLQlwcm90ZWN0ZWQgUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uYWRkVHJhY2UocmVhc29uKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0byByZXR1cm4gYSBkZWZhdWx0IGVuY29kaW5nIC0tIGFzIHNwZWNpZmllZCBieSBhbiBpbmR1c3RyeQotCSAqIGNvbnRlbnQgdHlwZSBzcGVjIC0tIHdoZW4gbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgZm9yIGV4YW1wbGUsIFhNTAotCSAqIHNwZWNpZmllcyBVVEYtOCwgSlNQIHNwZWNpZmllcyBJU08tODg1OS0xLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuCi0JICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoICJzcGVjIGRlZmF1bHQiLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy9jcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5hZGRUcmFjZShFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudC9DU1NIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvQ1NTSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjVlYmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudC9DU1NIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEvMjcvMDQgNjo0MiBQTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSA8YQotICogaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleCA8L2E+IDEuMi4yCi0gKiBvbiAxLzI3LzA0IDY6NDIgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIENTU0hlYWRUb2tlbml6ZXIgewotCi0JLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotCS8qKiBsZXhpY2FsIHN0YXRlcyAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA4OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDEwOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBDSEFSU0VUX1JVTEUgPSA0OwotCi0JLyoqCi0JICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLQkgKiBZWV9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsIGF0IHRoZQotCSAqIGJlZ2lubmluZyBvZiBhIGxpbmUgbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHswLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3fTsKLQotCS8qKgotCSAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gIlwxMVwwXDFcNlwxXDExXDJcMFwxXDEwXDIyXDBcMVw2XDFcMFwxXDM2XDJcMCIgKyAiXDFcNDFcMVwwXDFcMzdcN1wwXDFcNDBcMTNcMFwxXDM1XDFcMTJcMVw3XDFcMzQiICsgIlwxXDEzXDFcMTdcMVwyMlwxXDBcMVwyMFwxXDMxXDFcMjVcMVwwXDFcMzNcMVwyMSIgKyAiXDFcMzJcMlwwXDFcMTZcMVwxNVwxXDI3XDFcMzBcMlwwXDFcMjNcMVwyNFwxXDI2IiArICJcM1wwXDFcMTRcMTBcMFwxXDIyXDFcMFwxXDIwXDFcMzFcMVwyNVwxXDBcMVwzMyIgKyAiXDFcMjFcMVwzMlwyXDBcMVwxNlwxXDE1XDFcMjdcMVwzMFwyXDBcMVwyM1wxXDI0IiArICJcMVwyNlwzXDBcMVwxNFwxMDJcMFwxXDRcM1wwXDFcNVwxN1wwXDFcM1wxNlwwIiArICJcMVwxXDIwXDBcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLQkgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotCS8qIGVycm9yIGNvZGVzICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotCS8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7IlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLCAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UifTsKLQotCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCXByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0JLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQlwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0JLyoqCi0JICogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcyB0aGUgc291cmNlCi0JICogb2YgdGhlIHl5dGV4dCgpIHN0cmluZwotCSAqLwotCXByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0JLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0JLyoqCi0JICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkIGZyb20KLQkgKiBpbnB1dAotCSAqLwotCXByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLQotCS8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQlwcml2YXRlIGludCB5eWNoYXI7Ci0KLQotCS8qKgotCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+dGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYQotCSAqIGxpbmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLQkvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT50aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0JLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotCS8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDEwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCi0JcHVibGljIENTU0hlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIGluKSB7Ci0JCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkJeXlfcmVhZGVyID0gaW47Ci0KLQkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0KLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0JCS8qCi0JCSAqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMgdGhlCi0JCSAqIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nCi0JCSAqLwotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikgMCk7Ci0KLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJeXlfbWFya2VkUG9zID0gMDsKLQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9zdGFydFJlYWQgPSAwOwotCi0JCS8qKgotCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkJICogZnJvbSBpbnB1dAotCQkgKi8KLQkJeXlfZW5kUmVhZCA9IDA7Ci0KLQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXljaGFyID0gMDsKLQotCi0JCS8qKgotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PnRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKLQkJICogbGluZQotCQkgKi8KLQkJeXlfYXRCT0wgPSBmYWxzZTsKLQotCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXl5X2F0RU9GID0gZmFsc2U7Ci0KLQkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotCQlmU3RhdGVTdGFjay5jbGVhcigpOwotCi0JCWhhc01vcmUgPSB0cnVlOwotCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLQotCi0JfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIgVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZgotCSAqIHRoaXMgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotCSAqLwotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0JCXRoaXMueXlfcmVhZGVyID0gaW47Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcwotCSAqIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqICAgICAgICAgICAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotCSAqLwotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwYWNrZWQKLQkgKiAgICAgICAgICAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICogQHJldHVybiB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLQkJY2hhcltdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotCQlpbnQgaSA9IDA7IC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgKi8KLQkJaW50IGogPSAwOyAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotCQl3aGlsZSAoaSA8IDE1OCkgewotCQkJaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotCQkJY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWRvCi0JCQkJbWFwW2orK10gPSB2YWx1ZTsKLQkJCXdoaWxlICgtLWNvdW50ID4gMCk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgc3RyZWFtIGlzIHJlYWNoZWQuCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0JICovCi0JcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotCQkvKiBzdGFuZGFyZCBjYXNlICovCi0JCWlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkKLQkJCXJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotCQkvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovCi0JCWlmICh5eV9hdEVPRikKLQkJCXJldHVybiBZWUVPRjsKLQotCQkvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotCQkvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotCQlpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfYnVmZmVyLCAwLCB5eV9lbmRSZWFkIC0geXlfc3RhcnRSZWFkKTsKLQotCQkJLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLQkJCXl5X2VuZFJlYWQgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfY3VycmVudFBvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9tYXJrZWRQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfcHVzaGJhY2tQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfc3RhcnRSZWFkID0gMDsKLQkJfQotCi0JCS8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLQkJaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJLyogaWYgbm90OiBibG93IGl0IHVwICovCi0JCQljaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0JCQl5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0JCX0KLQotCQkvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLQkJaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIHl5X2J1ZmZlci5sZW5ndGggLSB5eV9lbmRSZWFkKTsKLQotCQlpZiAobnVtUmVhZCA9PSAtMSkKLQkJCXJldHVybiBZWUVPRjsKLQotCQl5eV9lbmRSZWFkICs9IG51bVJlYWQ7Ci0KLQkJcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCX0KLQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJeXlfYXRFT0YgPSB0cnVlOyAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotCQl5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAqLwotCQl5eV9yZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0JCXJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotCX0KLQotCS8qKgotCSAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0JICogCi0JICogQHBhcmFtIG5ld1N0YXRlCi0JICogICAgICAgICAgICB0aGUgbmV3IGxleGljYWwgc3RhdGUKLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotCQl5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCWZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zIC0geXlfc3RhcnRSZWFkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0JICovCi0JZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLQkJcmV0dXJuIHl5X21hcmtlZFBvcyAtIHl5X3N0YXJ0UmVhZDsKLQl9Ci0KLQotCS8qKgotCSAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckNvZGUKLQkgKiAgICAgICAgICAgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotCSAqLwotCXByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLQkJfQotCQljYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotCQl9Ci0KLQkJU3lzdGVtLmV4aXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG51bWJlcgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uIFRoaXMgbnVtYmVyIG11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0JCWlmIChudW1iZXIgPiB5eWxlbmd0aCgpKQotCQkJeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0JCXl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwgd2hlbiB0aGUKLQkgKiBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLQkJaWYgKCF5eV9lb2ZfZG9uZSkgewotCQkJeXlfZW9mX2RvbmUgPSB0cnVlOwotCQkJaGFzTW9yZSA9IGZhbHNlOwotCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsIHRoZSBlbmQKLQkgKiBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCWludCB5eV9pbnB1dDsKLQkJaW50IHl5X2FjdGlvbjsKLQotCi0JCXdoaWxlICh0cnVlKSB7Ci0KLQkJCXl5Y2hhciArPSB5eWxlbmd0aCgpOwotCi0JCQl5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MgLSAxXSA9PSAnXG4nOwotCQkJaWYgKCF5eV9hdEJPTCAmJiB5eV9idWZmZXJbeXlfbWFya2VkUG9zIC0gMV0gPT0gJ1xyJykgewotCQkJCXl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0JCQkJaWYgKCF5eV9hdEVPRikKLQkJCQkJeXlfY3VycmVudFBvcy0tOwotCQkJfQotCi0JCQl5eV9hY3Rpb24gPSAtMTsKLQotCQkJeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotCQkJaWYgKHl5X2F0Qk9MKQotCQkJCXl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZSArIDFdOwotCQkJZWxzZQotCQkJCXl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZV07Ci0KLQotCQkJeXlfZm9yQWN0aW9uIDogewotCQkJCXdoaWxlICh0cnVlKSB7Ci0KLQkJCQkJeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLQkJCQkJaWYgKHl5X2lucHV0ID09IFlZRU9GKQotCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0JCQkJCXl5X2lucHV0ID0geXljbWFwW3l5X2lucHV0XTsKLQotCQkJCQlib29sZWFuIHl5X2lzRmluYWwgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0JCQkJCXl5X2Zvck5leHQgOiB7Ci0JCQkJCQlzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0JCQkJCQkJY2FzZSAwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDExOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMwIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDI5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMwIDoKLQkJCQkJCQkJCWNhc2UgMzEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDQgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyMCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyNiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMjkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzOCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTIgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0NyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTMgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0OCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0OSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjQgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTQgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQl5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHl5X2lzRmluYWwpIHsKLQkJCQkJCXl5X2FjdGlvbiA9IHl5X3N0YXRlOwotCQkJCQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJCQkJCWlmICh5eV9ub0xvb2tBaGVhZCkKLQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCi0JCQlzd2l0Y2ggKHl5X2FjdGlvbikgewotCi0JCQkJY2FzZSA0NSA6IHsKLQkJCQkJeXlwdXNoYmFjaygyKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDY1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNSA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDY2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOSA6Ci0JCQkJY2FzZSAyMCA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7Ci0JCQkJCXN0cmluZy5zZXRMZW5ndGgoMCk7Ci0JCQkJfQotCQkJCWNhc2UgNjcgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE4IDogewotCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuUnVsZUVuZDsKLQkJCQl9Ci0JCQkJY2FzZSA2OCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzIgOiB7Ci0JCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA2OSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDQgOiB7Ci0JCQkJCXl5cHVzaGJhY2soMik7Ci0JCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA3MCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjEgOiB7Ci0JCQkJCWlmICh5eWNoYXIgPT0gMCkgewotCQkJCQkJeXliZWdpbihDSEFSU0VUX1JVTEUpOwotCQkJCQkJcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhc2UgNzEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDU2IDogewotCQkJCQlpZiAoeXljaGFyID09IDApIHsKLQkJCQkJCXl5YmVnaW4oU1RfWE1MRGVjbCk7Ci0JCQkJCQlyZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2FzZSA3MiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgOCA6Ci0JCQkJY2FzZSA5IDoKLQkJCQljYXNlIDEwIDoKLQkJCQljYXNlIDExIDoKLQkJCQljYXNlIDEyIDoKLQkJCQljYXNlIDEzIDoKLQkJCQljYXNlIDE0IDoKLQkJCQljYXNlIDE1IDoKLQkJCQljYXNlIDE2IDoKLQkJCQljYXNlIDIxIDogewotCQkJCQlpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHsKLQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXNlIDczIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MSA6IHsKLQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCQlyZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOwotCQkJCX0KLQkJCQljYXNlIDc0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2MyA6IHsKLQkJCQkJcHVzaEN1cnJlbnRTdGF0ZSgpOwotCQkJCQl5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsKLQkJCQkJcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7Ci0JCQkJfQotCQkJCWNhc2UgNzUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMgOgotCQkJCWNhc2UgMTcgOiB7Ci0JCQkJCXB1c2hDdXJyZW50U3RhdGUoKTsKLQkJCQkJeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7Ci0JCQkJfQotCQkJCWNhc2UgNzYgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ2IDogewotCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007Ci0JCQkJfQotCQkJCWNhc2UgNzcgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMzIDogewotCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOwotCQkJCX0KLQkJCQljYXNlIDc4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzNCA6IHsKLQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsKLQkJCQl9Ci0JCQkJY2FzZSA3OSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjQgOgotCQkJCWNhc2UgMjYgOgotCQkJCWNhc2UgMjkgOiB7Ci0JCQkJCXN0cmluZy5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCX0KLQkJCQljYXNlIDgwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMyA6IHsKLQkJCQkJeXliZWdpbihTUV9TVFJJTkcpOwotCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCX0KLQkJCQljYXNlIDgxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMiA6IHsKLQkJCQkJeXliZWdpbihEUV9TVFJJTkcpOwotCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCX0KLQkJCQljYXNlIDgyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNyA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDgzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOCA6IHsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA4NCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzAgOiB7Ci0JCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA4NSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzEgOiB7Ci0JCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA4NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLQkJCQkJCXl5X2F0RU9GID0gdHJ1ZTsKLQkJCQkJCXl5X2RvX2VvZigpOwotCQkJCQkJewotCQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLQkgKiAKLQkgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuIEl0IHByaW50cwotCSAqIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZCwgb3IKLQkgKiBhbiBlcnJvciBvY2N1cmVkLgotCSAqIAotCSAqIEBwYXJhbSBhcmd2Ci0JICogICAgICAgICAgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1biB0aGUgc2Nhbm5lcgotCSAqICAgICAgICAgICAgb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLQkJCUNTU0hlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNjYW5uZXIgPSBuZXcgQ1NTSGVhZFRva2VuaXplcihuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIiArIGFyZ3ZbaV0gKyAiXCIiKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQkJCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIENTU0hlYWRUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlkbyB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0JCQkJfQotCQkJCXdoaWxlICghc2Nhbm5lci55eV9hdEVPRik7Ci0KLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCQl9Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50L0NTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkZGVmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMgewotCi0JU3RyaW5nIFJ1bGVFbmQgPSAiUnVsZUVuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0hBUlNFVF9SVUxFID0gIkNIQVJTRVRfUlVMRSI7IC8vJE5PTi1OTFMtMSQKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudC9DU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudC9DU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1MGFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJpdmF0ZSBDU1NIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0KLQkvKioKLQkgKiBUaGVyZSBpcyBubyBzcGVjIGRlZmluZWQgZW5jb2RpbmcgZm9yIENTUywgc28gTnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIHNob3VsZCBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luLnhtbCAob3IgbG9vayBpdCB1cCBmcm9tIHRoZXJlKS4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbShTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gZmFsc2U7Ci0JCWlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2QkUiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCX0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9rZW5pemVyLgotCSAqLwotCXByaXZhdGUgQ1NTSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgQ1NTSGVhZFRva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlZ2FsU3RyaW5nKFN0cmluZyB2YWx1ZVRva2VuVHlwZSkgewotCQlpZiAodmFsdWVUb2tlblR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoZWNrSW5Db250ZW50cygpOwotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQljaGVja0hldXJpc3RpY3MoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0luQ29udGVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDU1NIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkgewotCQkJCS8vIHNpZGUgZWZmZWN0IG9mIGNhbkhhbmRsZSBpcyB0byBjcmVhdGUgYXBwcm9wcmlhdGUgbWVtZW50bwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFKSB7Ci0JCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJSGVhZFBhcnNlclRva2VuIHZhbHVlVG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byh2YWx1ZVRva2VuLmdldFRleHQoKSwgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSGV1cmlzdGljcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gbm9IZXVyaXN0aWMgPSBmYWxzZTsKLQkJU3RyaW5nIGhldXJpc3RpY0VuY29kaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzNdOwotCQkJaW50IG5SZWFkID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZlJlYWRlci5yZWFkeSgpKSB7Ci0JCQkJCWludCBvbmVCeXRlID0gZlJlYWRlci5yZWFkKCk7Ci0JCQkJCW5SZWFkKys7Ci0JCQkJCWlmIChvbmVCeXRlIDw9IDB4RkYpIHsKLQkJCQkJCWJ5dGVzW2ldID0gKGJ5dGUpIG9uZUJ5dGU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlub0hldXJpc3RpYyA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5vSGV1cmlzdGljID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFub0hldXJpc3RpYyAmJiBuUmVhZCA9PSAzKSB7Ci0JCQkJaGV1cmlzdGljRW5jb2RpbmcgPSBFbmNvZGluZ0d1ZXNzZXIuZ3Vlc3NFbmNvZGluZyhieXRlcywgMyk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGFueSBJTyBleGNlcHRpb24sIHRoZW4gbm90IGEgaGV1cmlzdGljIGNhc2UKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJfQotCQlpZiAoaGV1cmlzdGljRW5jb2RpbmcgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGhldXJpc3RpY0VuY29kaW5nLCBFbmNvZGluZ01lbWVudG8uR1VFU1NFRF9FTkNPRElOR19GUk9NX1NUUkVBTSk7Ci0JCX0KLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvQ29udGVudERlc2NyaWJlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGE5ZjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9yQ1NTIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50RGVzY3JpYmVyIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQotCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50L0VuY29kaW5nR3Vlc3Nlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50L0VuY29kaW5nR3Vlc3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA1YTVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudC9FbmNvZGluZ0d1ZXNzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50OwotCi0vKioKLSAqIAotICogVGhpcyBpcyBwb3J0ZWQgZnJvbSBQYWdlRGVzaWduZXIncyBocGJjb20vS2FuamkuY3BwJ3MKLSAqIEthbmppOjpndWVzc19rYW5qaV9jb2RlKCksCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ0d1ZXNzZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSSA9IDA7IC8vIEFTQ0lJCi0JLy8gSVNPLTIwMjItSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUlfSU4gPSA4OyAvLyBUaGlzIGlzIGFmdGVyIElTTzIwMjIncyBjaGFuZ2UKLQkvLyBTaGlmdC1KSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVVDX0hBTEZLQU5BID0gNjsgLy8gVGhpcyBpcyBIYWxmIEthbmEgaW4gRVVDLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVVQ19KUCA9IDM7IC8vIFRoaXMgaXMgRVVDLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTTzIwMjJfSlAgPSA0OyAvLyBUaGlzIGlzIElTTy0yMDIyLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpJU19IQUxGS0FOQSA9IDc7IC8vIFRIaXMgaXMgSGFsZiBLYW5hIGluCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FVUMxID0gMHg0MDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VVQzIgPSAoYnl0ZSkgMHg4MDsKLQkvLyBBU0NJSQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSklOID0gMHgwMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pPVVQgPSAweDAyOwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVNDID0gMHgwNDsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pJUyA9IDB4MDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9TRlQxID0gMHgxMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX1NGVDIgPSAweDIwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga3R5cGVbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAwMCAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDEwICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgLyogISIjJCUmJyAqLy8qICIgKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiAoKSorLC0uLyAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qIDAxMjM0NTY3ICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogODk6OyA8PT4/ICovCi0JMHgyOSwgMHgyOCwgMHgyYiwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogQEFCQ0RFRkcgKi8KLQkweDJhLCAweDI4LCAweDJhLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBISUpLTE1OTyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIFBRUlNUVVZXICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogWFlaW1xdXl8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBhYmNkZWZnICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogaGlqa2xtbm8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBwcXJzdHV2dyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MDAsIC8qIHh5ent8fX4gKi8KLQkweDIwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAvKiA4MCAqLwotCTB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIC8qIDkwICovCi0JMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgyMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEEwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEIwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEMwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEQwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIC8qIEUwICovCi0JKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIC8qIEYwICovCi0JKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4YzAsIDB4MDAsfTsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNPODg1OV8xID0gMTsgLy8gSVNPLTEKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hJRlRfSklTID0gMjsgLy8gVGhpcyBpcyBTaGlmdC1KSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0pJU19IQUxGS0FOQSA9IDU7IC8vIFRoaXMgaXMgSGFsZiBLYW5hIGluCi0KLQkvKioKLQkgKiBDdXJyZW50bHksIG9ubHkgSmFwYW5lc2UgZW5jb2RpbmdzIGFyZSBzdXBwb3J0ZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAtMTsgLy8gVW5rbm93bgotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIGludAotCSAqIAotCSAqIENvbnZlcnQgcHJpdmF0ZSBpbnQgdG8gSUFOQSBFbmNvZGluZyBuYW1lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9JQU5BRW5jb2RpbmdOYW1lKGludCBjb2RlKSB7Ci0JCVN0cmluZyBlbmNvZGluZyA9IG51bGw7Ci0KLQkJc3dpdGNoIChjb2RlKSB7Ci0JCQljYXNlIFNISUZUX0pJUyA6Ci0JCQljYXNlIFNKSVNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIlNoaWZ0X0pJUyI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBFVUNfSlAgOgotCQkJY2FzZSBFVUNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIkVVQy1KUCI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBJU08yMDIyX0pQIDoKLQkJCWNhc2UgSklTX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJJU08tMjAyMi1KUCI7Ly8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGd1ZXNzZWQgSmF2YSBFbmNvZGluZyBuYW1lIHRhcmdldDogYnl0ZXMgdG8gYmUgaW5zcGVjdGVkIGxlbmd0aDoKLQkgKiBsZW5ndGggb2YgdGFyZ2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3Vlc3NFbmNvZGluZyhieXRlW10gdGFyZ2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBjb2RlID0gVU5LTk9XTjsKLQotCQkvLyBDdXJyZW50bHksIG9ubHkgSmFwYW5lc2UgaXMgc3VwcG9ydGVkLgotCQlTdHJpbmcgc3lzdGVtX2N0eXBlID0gamF2YS51dGlsLkxvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGpwX2N0eXBlID0gamF2YS51dGlsLkxvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpOwotCQlpZiAoc3lzdGVtX2N0eXBlLmNvbXBhcmVUbyhqcF9jdHlwZSkgPT0gMCkgewotCQkJLy8gT2ssIEknbSB1bmRlciBqYV9KUC4KLQkJCWNvZGUgPSBBU0NJSTsKLQkJCWludCBwb3MgPSAwOwotCQkJd2hpbGUgKChjb2RlID09IEFTQ0lJKSAmJiAobGVuZ3RoID4gMCkpIHsKLQkJCQlpbnQgY2gxID0gdGFyZ2V0W3Bvc107Ci0JCQkJY2gxID0gY2gxICYgMHgwMDAwMDBGRjsKLQkJCQlpbnQgY2gyID0gKGxlbmd0aCA+PSAyKSA/IHRhcmdldFtwb3MgKyAxXSA6IDA7Ci0JCQkJY2gyID0gY2gyICYgMHgwMDAwMDBGRjsKLQkJCQlpbnQgY2gzID0gKGxlbmd0aCA+PSAzKSA/IHRhcmdldFtwb3MgKyAyXSA6IDA7Ci0JCQkJY2gzID0gY2gzICYgMHgwMDAwMDBGRjsKLQkJCQljb2RlID0gZ3Vlc3NKYXBhbmVzZUthbmppQ29kZShjaDEsIGNoMiwgY2gzLCAwKTsKLQkJCQlwb3MrKzsKLQkJCQlsZW5ndGgtLTsKLQkJCX0KLQkJCXN3aXRjaCAoY29kZSkgewotCQkJCWNhc2UgSVNPMjAyMl9KUCA6Ci0JCQkJY2FzZSBKSVNfSEFMRktBTkEgOgotCQkJCQljb2RlID0gSVNPMjAyMl9KUDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBFVUNfSlAgOgotCQkJCQljb2RlID0gRVVDX0pQOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJY29kZSA9IFNISUZUX0pJUzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKGNvbnZlcnRUb0lBTkFFbmNvZGluZ05hbWUoY29kZSkpOwotCX0KLQotCS8qKgotCSAqIEd1ZXNzIHRoZSBlbmNvZGluZy4gaGFsZmthbmFfZmxhZyA9IDB4MDEgKCBkZXRlY3QgU0pJUyBoYWxmIGthbmEgKQotCSAqIGhhbGZrYW5hX2ZsYWcgPSAweDAyICggZGV0ZWN0IEVVQyBoYWxmIGthbmEgKQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBndWVzc0phcGFuZXNlS2FuamlDb2RlKGludCBjaDEsIGludCBjaDIsIGludCBjaDMsIGludCBoYWxma2FuYV9mbGFnKSB7Ci0JCWJvb2xlYW4gc2ppc19oYW5rYWt1X2ZsYWcgPSAoKGhhbGZrYW5hX2ZsYWcgJiAweDAxKSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQkJYm9vbGVhbiBldWNfaGFua2FrdV9mbGFnID0gKChoYWxma2FuYV9mbGFnICYgMHgwMikgIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0KLQkJaWYgKGNoMSA9PSAwKQotCQkJcmV0dXJuIFVOS05PV047Ci0JCWlmIChzamlzX2hhbmtha3VfZmxhZyAmJiBjaDEgPj0gMHhhMSAmJiBjaDEgPD0gMHhkZikKLQkJCXJldHVybiBTSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChldWNfaGFua2FrdV9mbGFnICYmIGNoMSA9PSAweDhlICYmIGNoMiA+PSAweGExICYmIGNoMiA8PSAweGRmKQotCQkJcmV0dXJuIEVVQ19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoKChrdHlwZVtjaDFdICYgS1RfU0ZUMSkgIT0gMCkgJiYgKChrdHlwZVtjaDJdICYgS1RfU0ZUMikgIT0gMCkpCi0JCQlyZXR1cm4gU0hJRlRfSklTOwotCQllbHNlIGlmICgoKGt0eXBlW2NoMV0gJiBLVF9FVUMxKSAhPSAwKSAmJiAoKGt0eXBlW2NoMl0gJiBLVF9FVUMyKSAhPSAwKSkKLQkJCXJldHVybiBFVUNfSlA7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmICgoa3R5cGVbY2gyXSAmIEtUX0pJTikgIT0gMCkpCi0JCQlyZXR1cm4gSVNPMjAyMl9KUDsKLQkJZWxzZSBpZiAoY2gxID49IDB4YTEgJiYgY2gxIDw9IDB4ZGYpCi0JCQlyZXR1cm4gU0pJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgY2gyID09IDB4MjgvKiAnKCcgKi8mJiBjaDMgPT0gMHg0OS8qICdJJyAqLykKLQkJCXJldHVybiBKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmIGNoMiA9PSAweDI4LyogJygnICovJiYgKChrdHlwZVtjaDNdICYgS1RfSk9VVCkgIT0gMCkpCi0JCQlyZXR1cm4gQVNDSUlfSU47Ci0KLQkJcmV0dXJuIEFTQ0lJOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ0d1ZXNzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50L0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50L0hlYWRQYXJzZXJUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Q5YTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudC9IZWFkUGFyc2VyVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50L0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5NWFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnQ7Ci0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gbGlzdC5sZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50L051bGxNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvTnVsbE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1YzczNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnQvTnVsbE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gRW5jb2RpbmdNZW1lbnRvIChpdHMgc3VwZXIgY2xhc3MpLAotICogd2hlbiB0aGVyZSBpcyBub3QgaW4gZmFjdCBBTlkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB3aGVuIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBTdHJpbmcKLSAqLwotcHVibGljIGNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIE51bGxNZW1lbnRvKCkgewotCQlzdXBlcigpOwotCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldEFwcHJvcHJpYXRlRGVmYXVsdChkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JCWFkZFRyYWNlKERFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lNZWRpYUdyb3VwSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lNZWRpYUdyb3VwSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwMmFjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JTWVkaWFHcm91cElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZWRpYUdyb3VwSUQgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9QQUdFRCA9ICJwYWdlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fVklTVUFMID0gInZpc3VhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0FVUkFMID0gImF1cmFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fVEFDVElMRSA9ICJ0YWN0aWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9HUklEID0gImdyaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9CSVRNQVAgPSAiYml0bWFwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9JTlRFUkFDVElWRSA9ICJpbnRlcmFjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX1NUQVRJQyA9ICJzdGF0aWMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0FMTCA9ICJhbGwiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSVZhbElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JVmFsSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5YzFhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JVmFsSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxJRCB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzEwMCA9ICIxMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl8yMDAgPSAiMjAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfMzAwID0gIjMwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzQwMCA9ICI0MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl81MDAgPSAiNTAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfNjAwID0gIjYwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzcwMCA9ICI3MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl84MDAgPSAiODAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfOTAwID0gIjkwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FCT1ZFID0gImFib3ZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUJTT0xVVEUgPSAiYWJzb2x1dGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BQ1RJVkVCT1JERVIgPSAiQWN0aXZlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUNUSVZFQ0FQVElPTiA9ICJBY3RpdmVDYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUxMID0gImFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FMV0FZUyA9ICJhbHdheXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BUFBXT1JLU1BBQ0UgPSAiQXBwV29ya3NwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVFVQSA9ICJhcXVhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVJNRU5JQU4gPSAiYXJtZW5pYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BVVRPID0gImF1dG8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BVk9JRCA9ICJhdm9pZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JBQ0tHUk9VTkQgPSAiQmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JBU0VMSU5FID0gImJhc2VsaW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkVISU5EID0gImJlaGluZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JFTE9XID0gImJlbG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQklESV9PVkVSUklERSA9ICJiaWRpLW92ZXJyaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkxBQ0sgPSAiYmxhY2siOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CTElOSyA9ICJibGluayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JMT0NLID0gImJsb2NrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkxVRSA9ICJibHVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQk9MRCA9ICJib2xkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQk9MREVSID0gImJvbGRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JPVEggPSAiYm90aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JPVFRPTSA9ICJib3R0b20iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CVVRUT05GQUNFID0gIkJ1dHRvbkZhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CVVRUT05ISUdITElHSFQgPSAiQnV0dG9uSGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQlVUVE9OU0hBRE9XID0gIkJ1dHRvblNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JVVFRPTlRFWFQgPSAiQnV0dG9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NBUElUQUxJWkUgPSAiY2FwaXRhbGl6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NBUFRJT04gPSAiY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NBUFRJT05URVhUID0gIkNhcHRpb25UZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0VOVEVSID0gImNlbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NFTlRFUl9MRUZUID0gImNlbnRlci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0VOVEVSX1JJR0hUID0gImNlbnRlci1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NISUxEID0gImNoaWxkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0lSQ0xFID0gImNpcmNsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NKS19JREVPR1JBUEhJQyA9ICJjamstaWRlb2dyYXBoaWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DTE9TRV9RVU9URSA9ICJjbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NPREUgPSAiY29kZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NPTkRFTlNFRCA9ICJjb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT0xMQVBTRSA9ICJjb2xsYXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NPTVBBQ1QgPSAiY29tcGFjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NPTlRJTlVPVVMgPSAiY29udGludW91cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NST1AgPSAiY3JvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NST1NTID0gImNyb3NzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ1JPU1NIQUlSID0gImNyb3NzaGFpciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NVUlNJVkUgPSAiY3Vyc2l2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RBU0hFRCA9ICJkYXNoZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ERUNJTUFMID0gImRlY2ltYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ERUNJTUFMX0xFQURJTkdfWkVSTyA9ICJkZWNpbWFsLWxlYWRpbmctemVybyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RJR0lUUyA9ICJkaWdpdHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ESVNDID0gImRpc2MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ET1RURUQgPSAiZG90dGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRE9VQkxFID0gImRvdWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VfUkVTSVpFID0gImUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRU1CRUQgPSAiZW1iZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FWFBBTkRFRCA9ICJleHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VYVFJBX0NPTkRFTlNFRCA9ICJleHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FWFRSQV9FWFBBTkRFRCA9ICJleHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBTlRBU1kgPSAiZmFudGFzeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBUl9MRUZUID0gImZhci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkFSX1JJR0hUID0gImZhci1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBU1QgPSAiZmFzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBU1RFUiA9ICJmYXN0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GRU1BTEUgPSAiZmVtYWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRklYRUQgPSAiZml4ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GVUNIU0lBID0gImZ1Y2hzaWEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HRU9SR0lBTiA9ICJnZW9yZ2lhbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dSQVkgPSAiZ3JheSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dSQVlURVhUID0gIkdyYXlUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR1JFRU4gPSAiZ3JlZW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HUk9PVkUgPSAiZ3Jvb3ZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSEVCUkVXID0gImhlYnJldyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hFTFAgPSAiaGVscCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJRERFTiA9ICJoaWRkZW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISURFID0gImhpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISUdIID0gImhpZ2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISUdITElHSFQgPSAiSGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElHSExJR0hUVEVYVCA9ICJIaWdobGlnaHRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElHSEVSID0gImhpZ2hlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJUkFHQU5BID0gImhpcmFnYW5hIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElSQUdBTkFfSVJPSEEgPSAiaGlyYWdhbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkFDVElWRUJPUkRFUiA9ICJJbmFjdGl2ZUJvcmRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOQUNUSVZFQ0FQVElPTiA9ICJJbmFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkFDVElWRUNBUFRJT05URVhUID0gIkluYWN0aXZlQ2FwdGlvblRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkZPQkFDS0dST1VORCA9ICJJbmZvQmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lORk9URVhUID0gIkluZm9UZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5MSU5FID0gImlubGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOTElORV9UQUJMRSA9ICJpbmxpbmUtdGFibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTlNFVCA9ICJpbnNldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOU0lERSA9ICJpbnNpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTlZFUlQgPSAiaW52ZXJ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0pVU1RJRlkgPSAianVzdGlmeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0tBVEFLQU5BID0gImthdGFrYW5hIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfS0FUQUtBTkFfSVJPSEEgPSAia2F0YWthbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MQU5EU0NBUEUgPSAibGFuZHNjYXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEFSR0UgPSAibGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MQVJHRVIgPSAibGFyZ2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEVGVF9TSURFID0gImxlZnQtc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xFRlRXQVJEUyA9ICJsZWZ0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MRVZFTCA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xJR0hURVIgPSAibGlnaHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xJTUUgPSAibGltZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xJTkVfVEhST1VHSCA9ICJsaW5lLXRocm91Z2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MSVNUX0lURU0gPSAibGlzdC1pdGVtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9VRCA9ICJsb3VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XID0gImxvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSID0gImxvd2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJfQUxQSEEgPSAibG93ZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUl9HUkVFSyA9ICJsb3dlci1ncmVlayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSX0xBVElOID0gImxvd2VyLWxhdGluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJfUk9NQU4gPSAibG93ZXItcm9tYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUkNBU0UgPSAibG93ZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTFRSID0gImx0ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01BTEUgPSAibWFsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01BUktFUiA9ICJtYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NQVJPT04gPSAibWFyb29uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUVESVVNID0gIm1lZGl1bSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01FTlUgPSAibWVudSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01FTlVURVhUID0gIk1lbnVUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUVTU0FHRV9CT1ggPSAibWVzc2FnZS1ib3giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NSURETEUgPSAibWlkZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUlYID0gIm1peCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01PTk9TUEFDRSA9ICJtb25vc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NT1ZFID0gIm1vdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OX1JFU0laRSA9ICJuLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05BUlJPV0VSID0gIm5hcnJvd2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTkFWWSA9ICJuYXZ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTkVfUkVTSVpFID0gIm5lLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PX0NMT1NFX1FVT1RFID0gIm5vLWNsb3NlLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9fT1BFTl9RVU9URSA9ICJuby1vcGVuLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9fUkVQRUFUID0gIm5vLXJlcGVhdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PTkUgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PUk1BTCA9ICJub3JtYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT1dSQVAgPSAibm93cmFwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTldfUkVTSVpFID0gIm53LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09CTElRVUUgPSAib2JsaXF1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09MSVZFID0gIm9saXZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT05DRSA9ICJvbmNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT1BFTl9RVU9URSA9ICJvcGVuLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT1VUU0VUID0gIm91dHNldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09VVFNJREUgPSAib3V0c2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09WRVJMSU5FID0gIm92ZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUE9JTlRFUiA9ICJwb2ludGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUE9SVFJBSVQgPSAicG9ydHJhaXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9QUkUgPSAicHJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUFVSUExFID0gInB1cnBsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFRCA9ICJyZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRUxBVElWRSA9ICJyZWxhdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFUEVBVCA9ICJyZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRVBFQVRfWCA9ICJyZXBlYXQteCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFUEVBVF9ZID0gInJlcGVhdC15IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUklER0UgPSAicmlkZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JJR0hUX1NJREUgPSAicmlnaHQtc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JJR0hUV0FSRFMgPSAicmlnaHR3YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JUTCA9ICJydGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SVU5fSU4gPSAicnVuLWluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU19SRVNJWkUgPSAicy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TQU5TX1NFUklGID0gInNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TQ1JPTEwgPSAic2Nyb2xsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0NST0xMQkFSID0gIlNjcm9sbGJhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFX1JFU0laRSA9ICJzZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRU1JX0NPTkRFTlNFRCA9ICJzZW1pLWNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFTUlfRVhQQU5ERUQgPSAic2VtaS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFUEFSQVRFID0gInNlcGFyYXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VSSUYgPSAic2VyaWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TSE9XID0gInNob3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TSUxFTlQgPSAic2lsZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0lMVkVSID0gInNpbHZlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NMT1cgPSAic2xvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NMT1dFUiA9ICJzbG93ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTUFMTCA9ICJzbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMX0NBUFMgPSAic21hbGwtY2FwcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMX0NBUFRJT04gPSAic21hbGwtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMRVIgPSAic21hbGxlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NPRlQgPSAic29mdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NPTElEID0gInNvbGlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1BFTExfT1VUID0gInNwZWxsLW91dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NRVUFSRSA9ICJzcXVhcmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1RBVFVTX0JBUiA9ICJzdGF0dXMtYmFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1VCID0gInN1YiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NVUEVSID0gInN1cGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1dfUkVTSVpFID0gInN3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFID0gInRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ0FQVElPTiA9ICJ0YWJsZS1jYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ0VMTCA9ICJ0YWJsZS1jZWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ09MVU1OID0gInRhYmxlLWNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0NPTFVNTl9HUk9VUCA9ICJ0YWJsZS1jb2x1bW4tZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9GT09URVJfR1JPVVAgPSAidGFibGUtZm9vdGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfSEVBREVSX0dST1VQID0gInRhYmxlLWhlYWRlci1ncm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX1JPVyA9ICJ0YWJsZS1yb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9ST1dfR1JPVVAgPSAidGFibGUtcm93LWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVBTCA9ICJ0ZWFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVYVF9UT1AgPSAidGV4dC10b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9URVhUX0JPVFRPTSA9ICJ0ZXh0LWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RISUNLID0gInRoaWNrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhJTiA9ICJ0aGluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVEREFSS1NIQURPVyA9ICJUaHJlZUREYXJrU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVERkFDRSA9ICJUaHJlZURGYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVESElHSExJR0hUID0gIlRocmVlREhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFRExJR0hUU0hBRE9XID0gIlRocmVlRExpZ2h0U2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVEU0hBRE9XID0gIlRocmVlRFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UUkFOU1BBUkVOVCA9ICJ0cmFuc3BhcmVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VMVFJBX0NPTkRFTlNFRCA9ICJ1bHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VTFRSQV9FWFBBTkRFRCA9ICJ1bHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VOREVSTElORSA9ICJ1bmRlcmxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VUFBFUl9BTFBIQSA9ICJ1cHBlci1hbHBoYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VQUEVSX0xBVElOID0gInVwcGVyLWxhdGluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVVBQRVJfUk9NQU4gPSAidXBwZXItcm9tYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VUFBFUkNBU0UgPSAidXBwZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVklTSUJMRSA9ICJ2aXNpYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV19SRVNJWkUgPSAidy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XQUlUID0gIndhaXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSElURSA9ICJ3aGl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dJREVSID0gIndpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0lORE9XID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dJTkRPV0ZSQU1FID0gIldpbmRvd0ZyYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0lORE9XVEVYVCA9ICJXaW5kb3dUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9GQVNUID0gIngtZmFzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfSElHSCA9ICJ4LWhpZ2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0xBUkdFID0gIngtbGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0xPVUQgPSAieC1sb3VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9MT1cgPSAieC1sb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX1NMT1cgPSAieC1zbG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9TTUFMTCA9ICJ4LXNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9TT0ZUID0gIngtc29mdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hYX1NNQUxMID0gInh4LXNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWFhfTEFSR0UgPSAieHgtbGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ZRUxMT1cgPSAieWVsbG93IjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTNmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNQ29udGFpbmVyIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3Igbm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9BQlNPTFVURV9TSVpFID0gImFic29sdXRlLXNpemUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQk9SREVSX1NUWUxFID0gImJvcmRlci1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9CT1JERVJfV0lEVEggPSAiYm9yZGVyLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0NPTE9SID0gImNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1NZU1RFTV9DT0xPUiA9ICJzeXN0ZW0tY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfR0VORVJJQ19GQU1JTFkgPSAiZ2VuZXJpYy1mYW1pbHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfR0VORVJJQ19WT0lDRSA9ICJnZW5lcmljLXZvaWNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX01BUkdJTl9XSURUSCA9ICJtYXJnaW4td2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfUEFERElOR19XSURUSCA9ICJwYWRkaW5nLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1JFTEFUSVZFX1NJWkUgPSAicmVsYXRpdmUtc2l6ZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTUNvbnRhaW5lcihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlPYmplY3QgYXBwZW5kQ2hpbGQoT2JqZWN0IG5vZGUpIHsKLQkJaWYgKCFub2Rlcy5jb250YWlucyhub2RlKSkKLQkJCW5vZGVzLmFkZChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSGF2ZShTdHJpbmcgaWRlbnRpZmllcikgewotCQlpbnQgbkNoaWxkID0gZ2V0TnVtQ2hpbGQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGQ7IGkrKykgewotCQkJT2JqZWN0IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFN0cmluZyAmJiBpZGVudGlmaWVyLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgY2hpbGQpKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUHJvcENNQ29udGFpbmVyICYmICgoUHJvcENNQ29udGFpbmVyKSBjaGlsZCkuY2FuSGF2ZShpZGVudGlmaWVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZEF0KGludCBpbmRleCkgewotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBpbmRleCA8IDAgfHwgbm9kZXMuc2l6ZSgpIDw9IGluZGV4KQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBQcm9wQ01Db250YWluZXIgZ2V0Q29udEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgyMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNQ29udGFpbmVyKSBub2RlOwotCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQkvLyByZWdpc3RlcgotCQkJbm9kZSA9IG5ldyBQcm9wQ01Db250YWluZXIobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Db250YWluZXIpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaWRlbnRzKSB7Ci0JCWlmIChpZGVudHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5DaGlsZHJlbiA9IG5vZGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGRyZW47IGkrKykgewotCQkJT2JqZWN0IG5vZGUgPSBub2Rlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFByb3BDTU5vZGUpCi0JCQkJKChQcm9wQ01Ob2RlKSBub2RlKS5nZXRJZGVudGlmaWVycyhpZGVudHMpOwotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCQlpZGVudHMuYWRkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXROdW1DaGlsZCgpIHsKLQkJaWYgKG5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIG5vZGVzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9DT05UQUlORVI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbkNoaWxkcmVuID0gbm9kZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSsrKSB7Ci0JCQlPYmplY3Qgbm9kZSA9IG5vZGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgUHJvcENNTm9kZSkKLQkJCQkoKFByb3BDTU5vZGUpIG5vZGUpLmdldFZhbHVlcyh2YWx1ZXMpOwotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCWlmICghdmFsdWVzLmNvbnRhaW5zKG5vZGUpKQotCQkJCQl2YWx1ZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JT2JqZWN0IHJlbW92ZUNoaWxkKE9iamVjdCBub2RlKSB7Ci0JCW5vZGVzLnJlbW92ZShub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZvbnRQcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRm9udFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOGUyMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRm9udFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNRm9udFByb3BlcnR5IGV4dGVuZHMgUHJvcENNUHJvcGVydHkgewotCi0JLy8gc3RhdGljIGZpZWxkcwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGNhY2hlZElkTWFwID0gbnVsbDsKLQkvLyBzZWxlY3RpbmcgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfRkFNSUxZID0gImZvbnQtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9WQVJJQU5UID0gImZvbnQtdmFyaWFudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfV0VJR0hUID0gImZvbnQtd2VpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9TVFJFVENIID0gImZvbnQtc3RyZXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfU0laRSA9ICJmb250LXNpemUiOy8vJE5PTi1OTFMtMSQKLQkvLyBxdWFsaWZpY2F0aW9uIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9VTklDT0RFX1JBTkdFID0gInVuaWNvZGUtcmFuZ2UiOy8vJE5PTi1OTFMtMSQKLQkvLyBudW1lcmljIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9VTklUU19QRVJfRU0gPSAidW5pdHMtcGVyLWVtIjsvLyROT04tTkxTLTEkCi0JLy8gcmVmZXJlbmNpbmcgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1NSQyA9ICJzcmMiOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXRjaGluZyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfUEFOT1NFXzEgPSAicGFub3NlLTEiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9TVEVNViA9ICJzdGVtdiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1NURU1IID0gInN0ZW1oIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfU0xPUEUgPSAic2xvcGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9DQVBfSEVJR0hUID0gImNhcC1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9YX0hFSUdIVCA9ICJ4LWhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0FTQ0VOVCA9ICJhc2NlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9ERVNDRU5UID0gImRlc2NlbnQiOy8vJE5PTi1OTFMtMSQKLQkvLyBzeW50aGVzaXMgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1dJRFRIUyA9ICJ3aWR0aHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9CQk9YID0gImJib3giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9ERUZJTklUSU9OX1NSQyA9ICJkZWZpbml0aW9uLXNyYyI7Ly8kTk9OLU5MUy0xJAotCS8vIGFsaWdubWVudCBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQkFTRUxJTkUgPSAiYmFzZWxpbmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9DRU5URVJMSU5FID0gImNlbnRlcmxpbmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9NQVRITElORSA9ICJtYXRobGluZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1RPUExJTkUgPSAidG9wbGluZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTUZvbnRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVByb3BlcnR5IGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJbm9kZSA9IG5ldyBQcm9wQ01Gb250UHJvcGVydHkobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldE5hbWVFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5rZXlzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0eUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfRk9OVFBST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIG5hbWVzKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIG5ldyBWZWN0b3IoaW5zdGFuY2VzLmtleVNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgbmFtZXMoT2JqZWN0IG1lZGlhR3JvdXApIHsKLQkJaWYgKG1lZGlhR3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybiBuYW1lcygpOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlWZWN0b3IgcHJvcGVydGllcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlJdGVyYXRvciBpdCA9IGluc3RhbmNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gKFByb3BDTVByb3BlcnR5KSBpdC5uZXh0KCk7Ci0JCQlpZiAocHJvcC5nZXRNZWRpYUdyb3VwcygpLmNvbnRhaW5zKG1lZGlhR3JvdXApKQotCQkJCXByb3BlcnRpZXMuYWRkKHByb3AuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIElmIGl0ZW50aWZpZXIgaXMgbnVsbCwgZ2V0IGFsbCBwcm9wZXJ0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgcHJvcGVydGllc0ZvcihTdHJpbmcgaWRlbnRpZmllciwgYm9vbGVhbiBzaG9ydGhhbmRzKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBpZiBpZGVudGlmaWVyIGlzIG51bGwsIGdldCBhbGwgcHJvcGVydGllcwotCQlpZiAoaWRlbnRpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBWZWN0b3IoaW5zdGFuY2VzLnZhbHVlcygpKTsKLQotCQlpZiAoY2FjaGVkSWRNYXAgPT0gbnVsbCkgewotCQkJLy8gc3RhcnQgY2FjaGVpbmcKLQkJCWNhY2hlZElkTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2VhcmNoIGNhY2hlZAotCQkJT2JqZWN0IHJldCA9IGNhY2hlZElkTWFwLmdldChpZGVudGlmaWVyICsgU3RyaW5nLnZhbHVlT2Yoc2hvcnRoYW5kcykpOwotCQkJaWYgKHJldCAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgVmVjdG9yKChDb2xsZWN0aW9uKSByZXQpOwotCQl9Ci0KLQkJLy8gY3JlYXRlCi0JCUVudW1lcmF0aW9uIHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0eUVudW0oKTsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQl3aGlsZSAocHJvcGVydGllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgcHJvcGVydGllcy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCFzaG9ydGhhbmRzICYmIHByb3AuaXNTaG9ydGhhbmQoKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChwcm9wLmNhbkhhdmUoaWRlbnRpZmllcikpCi0JCQkJc2V0LmFkZChwcm9wKTsKLQkJfQotCi0JCS8vIGNhY2hlCi0JCWNhY2hlZElkTWFwLnB1dChpZGVudGlmaWVyICsgU3RyaW5nLnZhbHVlT2Yoc2hvcnRoYW5kcyksIHNldCk7Ci0KLQkJcmV0dXJuIG5ldyBWZWN0b3Ioc2V0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZWZjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01GdW5jdGlvbiBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9BVFRSID0gImF0dHIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQ09VTlRFUiA9ICJjb3VudGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1JHQiA9ICJyZ2IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfU0hBUEUgPSAicmVjdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9VUkkgPSAidXJsIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0ZPUk1BVCA9ICJmb3JtYXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfTE9DQUwgPSAibG9jYWwiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01GdW5jdGlvbihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldElkZW50aWZpZXJzKFNldCBpbmRlbnRzKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHB1YmxpYyBQcm9wQ01GdW5jdGlvbiBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTUZ1bmN0aW9uKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTUZ1bmN0aW9uKG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNRnVuY3Rpb24pIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfRlVOQzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcykgewotCQlpZiAodmFsdWVzICE9IG51bGwgJiYgIXZhbHVlcy5jb250YWlucyh0aGlzKSkKLQkJCXZhbHVlcy5hZGQodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhODRkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wQ01Ob2RlIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX0lERU5USUZJRVIgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX1BST1BFUlRZID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9OVU1CRVIgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX1NUUklORyA9IDM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfRlVOQyA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfQ09OVEFJTkVSID0gNTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9TVUJQUk9QRVJUWSA9IDY7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfRk9OVFBST1BFUlRZID0gNzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9VTklDT0RFX1JBTkdFID0gODsKLQlwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBzaG9ydCBMT0FESU5HID0gMDsgLy8gMCA6IG5vdCBpbml0aWFsaXplZCwgMSA6IHVuZGVyCi0JCQkJCQkJCQkJLy8gaW5pdGlhbGl6aW5nLCAyIDogaW5pdGlhbGl6ZS1kb25lCi0JCQkJCQkJCQkJLy8gYW5kIGZpeCBEQgotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFByb3BDTU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2V0IGdldElkZW50aWZpZXJzKCkgewotCQlIYXNoU2V0IGlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWdldElkZW50aWZpZXJzKGlkcyk7Ci0JCXJldHVybiBpZHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cyk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBzaG9ydCBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRWYWx1ZXMoKSB7Ci0JCVZlY3RvciB2YWxzID0gbmV3IFZlY3RvcigpOwotCQlnZXRWYWx1ZXModmFscyk7Ci0JCXJldHVybiB2YWxzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IHZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0UHJvcGVydHlDTSgpIHsKLQkJaWYgKCFpc05lZWRJbml0aWFsaXplKCkpCi0JCQlyZXR1cm47Ci0JCUxPQURJTkcgPSAxOwotCi0JCVByb3BDTU51bWJlci5pbml0TnVtYmVyQ01EaW0oKTsKLQotCQkvLyBhemltdXRoCi0JCVByb3BDTVByb3BlcnR5IHByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQVpJTVVUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9BTkdMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlRfU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkFSX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZBUl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFRfU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkVISU5EKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUV0FSRFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUV0FSRFMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCi0JCS8vIGJhY2tncm91bmQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CRyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDYpOwotCi0JCS8vIGJhY2tncm91bmQtYXR0YWNobWVudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NDUk9MTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRklYRUQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RSQU5TUEFSRU5UKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtaW1hZ2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLXBvc2l0aW9uIC0tLS0gc3ViLXByb3BlcnRpZXMgaG9yaXpvbnRhbAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLXBvc2l0aW9uIC0tLS0gc3ViLXByb3BlcnRpZXMgdmVydGljYWwKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1wb3NpdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtcmVwZWF0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRVBFQVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFUEVBVF9YKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRVBFQVRfWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9fUkVQRUFUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWNvbGxhcHNlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTExBUFNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT0xMQVBTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VQQVJBVEUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUikpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVFJBTlNQQVJFTlQpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItc3BhY2luZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TUEFDSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKSk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci10b3AKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItbGVmdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXRvcC1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItdG9wLXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItdG9wLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItcmlnaHQtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItcmlnaHQtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXJpZ2h0LXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1ib3R0b20tY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbS1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbS13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWxlZnQtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1sZWZ0LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWxlZnQtd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNhcHRpb24tc2lkZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NBUFRJT05fU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsZWFyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xFQVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVEFUSUMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcCAtLS0tIHN1Yi1wcm9wZXJ0aWVzIHRvcAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAgLS0tLSBzdWItcHJvcGVydGllcyByaWdodAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCSgoUHJvcENNU3ViUHJvcGVydHkpIHByb3ApLnNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcCAtLS0tIHN1Yi1wcm9wZXJ0aWVzIGJvdHRvbQotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAgLS0tLSBzdWItcHJvcGVydGllcyBsZWZ0Ci0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9TSEFQRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNvbnRlbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT05URU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0FOWSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX0NPVU5URVIpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9BVFRSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT1BFTl9RVU9URSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0xPU0VfUVVPVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PX09QRU5fUVVPVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PX0NMT1NFX1FVT1RFKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsgLy8gaW5maW5pdGUKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BTEwpOwotCi0JCS8vIGNvdW50ZXItaW5jcmVtZW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9JTkNSRU1FTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfQ09VTlRFUl9JRCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FMTCk7Ci0KLQkJLy8gY291bnRlci1yZXNldAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfUkVTRVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfQ09VTlRFUl9JRCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FMTCk7Ci0KLQkJLy8gY3VlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0JFRk9SRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQUZURVIpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBjdWUtYWZ0ZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQUZURVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBjdWUtYmVmb3JlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0JFRk9SRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGN1cnNvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVUlNPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ1JPU1NIQUlSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ERUZBVUxUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9QT0lOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NT1ZFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTkVfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OV19SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05fUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRV9SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NXX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU19SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1dfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9URVhUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XQUlUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9IRUxQKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsgLy8gaW5maW5pdGUKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBkaXJlY3Rpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVJFQ1RJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xUUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUlRMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGRpc3BsYXkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVNQTEFZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JMT0NLKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MSVNUX0lURU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JVTl9JTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09NUEFDVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUFSS0VSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5MSU5FX1RBQkxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9ST1dfR1JPVVApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0hFQURFUl9HUk9VUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfRk9PVEVSX0dST1VQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9ST1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0NPTFVNTl9HUk9VUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfQ09MVU1OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9DRUxMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9DQVBUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BTEwpOwotCi0JCS8vIGVsZXZhdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VMRVZBVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9BTkdMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JFTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRVZFTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUJPVkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJR0hFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBlbXB0eS1jZWxscwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VNUFRZX0NFTExTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TSE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISURFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZsb2F0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRkxPQVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0FQVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSUNPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVOVSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVTU0FHRV9CT1gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMX0NBUFRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NUQVRVU19CQVIpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1mYW1pbHkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9GT05UKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19GQU1JTFkpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtc2l6ZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQUJTT0xVVEVfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1JFTEFUSVZFX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1zaXplLWFkanVzdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRV9BREpVU1QpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXN0cmV0Y2gKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUUkVUQ0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0lERVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05BUlJPV0VSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VTFRSQV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYVFJBX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRU1JX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VNSV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYVFJBX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VTFRSQV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSVRBTElDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PQkxJUVVFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC12YXJpYW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTUFMTF9DQVBTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC13ZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9MRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8yMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzMwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNDAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl81MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzYwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNzAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl84MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzkwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTElHSFRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9MREVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGVmdHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGV0dGVyLXNwYWNpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRVRURVJfU1BBQ0lORyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGluZS1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaXN0LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGlzdC1zdHlsZS1pbWFnZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGlzdC1zdHlsZS1wb3NpdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lOU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT1VUU0lERSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaXN0LXN0eWxlLXR5cGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RJU0MpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NJUkNMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1FVQVJFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ERUNJTUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ERUNJTUFMX0xFQURJTkdfWkVSTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJfUk9NQU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VQUEVSX1JPTUFOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUl9HUkVFSyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJfQUxQSEEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSX0xBVElOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VUFBFUl9BTFBIQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVVBQRVJfTEFUSU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hFQlJFVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVJNRU5JQU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0dFT1JHSUFOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DSktfSURFT0dSQVBISUMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJUkFHQU5BKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9LQVRBS0FOQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElSQUdBTkFfSVJPSEEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0tBVEFLQU5BX0lST0hBKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmdpbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTik7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luLXRvcAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luLXJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmdpbi1ib3R0b20KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmdpbi1sZWZ0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFya2VyLW9mZnNldAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktFUl9PRkZTRVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJrcwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DUk9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DUk9TUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBtYXgtaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1heC13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1pbi1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWluLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gb3JwaGFucwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09SUEhBTlMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIG91dGxpbmUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfV0lEVEgpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIG91dGxpbmUtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lOVkVSVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gb3V0bGluZS1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIG91dGxpbmUtd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBvdmVyZmxvdwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09WRVJGTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9WSVNJQkxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISURERU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NDUk9MTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElORyk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nLXRvcAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nLXJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFkZGluZy1ib3R0b20KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFkZGluZy1sZWZ0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWdlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9QQUdFX0lEKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gcGFnZS1icmVhay1hZnRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQUZURVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMV0FZUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVZPSUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBwYWdlLWJyZWFrLWJlZm9yZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQkVGT1JFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTFdBWVMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FWT0lEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gcGFnZS1icmVhay1pbnNpZGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0lOU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVZPSUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHBhdXNlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfVElNRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBhdXNlLWFmdGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQUZURVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfVElNRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwYXVzZS1iZWZvcmUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9CRUZPUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfVElNRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwaXRjaAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0ZSRVFVRU5DWSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElHSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9ISUdIKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGl0Y2gtcmFuZ2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSF9SQU5HRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGxheS1kdXJpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QTEFZX0RVUklORyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUlYKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRVBFQVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBvc2l0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUE9TSVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FCU09MVVRFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRUxBVElWRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRklYRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NUQVRJQyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBxdW90ZXMKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9RVU9URVMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfQU5ZKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyByaWNobmVzcwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJQ0hORVNTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyByaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gc2l6ZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUE9SVFJBSVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xBTkRTQ0FQRSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBzcGVhawotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NQRUxMX09VVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHNwZWFrLWhlYWRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX0hFQURFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT05DRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxXQVlTKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3BlYWstbnVtZXJhbAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX05VTUVSQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RJR0lUUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09OVElOVU9VUyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHNwZWFrLXB1bmN0dWF0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfUFVOQ1RVQVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzcGVlY2gtcmF0ZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUVDSF9SQVRFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfU0xPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0xPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GQVNUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0ZBU1QpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzdHJlc3MKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TVFJFU1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHRhYmxlLWxheW91dAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RBQkxFX0xBWU9VVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRklYRUQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdGV4dC1hbGlnbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfQUxJR04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0pVU1RJRlkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfQU5ZKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LWRlY29yYXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0RFQ09SQVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VOREVSTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT1ZFUkxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xJTkVfVEhST1VHSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkxJTkspOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LWluZGVudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfSU5ERU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdGV4dC1zaGFkb3cKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1NIQURPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdGV4dC10cmFuc2Zvcm0KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1RSQU5TRk9STSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0FQSVRBTElaRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVVBQRVJDQVNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUkNBU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdG9wCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdW5pY29kZS1iaWRpCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVU5JQ09ERV9CSURJKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VNQkVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CSURJX09WRVJSSURFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHZlcnRpY2FsLWFsaWduCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVkVSVElDQUxfQUxJR04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEVYVF9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NVQik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkFTRUxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01JRERMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1VQRVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RFWFRfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB2aXNpYmlsaXR5Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVklTSUJJTElUWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVklTSUJMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElEREVOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT0xMQVBTRSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB2b2ljZS1mYW1pbHkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0lDRV9GQU1JTFkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfVk9JQ0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX1ZPSUNFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHZvbHVtZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPTFVNRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TSUxFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfU09GVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU09GVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0xPVUQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyB3aGl0ZS1zcGFjZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dISVRFX1NQQUNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1BSRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9XUkFQKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHdpZG93cwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRE9XUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHdvcmQtc3BhY2luZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dPUkRfU1BBQ0lORyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gei1pbmRleAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1pfSU5ERVgpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLyoqICoqKioqKioqIGZvbnQgcHJvcGVydGllcyAqKioqKioqKiogKi8KLQkJLy8gZm9udC1mYW1pbHkKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX0ZBTUlMWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9GT05UKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19GQU1JTFkpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSVRBTElDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PQkxJUVVFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC12YXJpYW50Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9WQVJJQU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTUFMTF9DQVBTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtd2VpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9XRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPTEQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzEwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMjAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8zMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzQwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl82MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzcwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfODAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl85MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXN0cmV0Y2gKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX1NUUkVUQ0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVUxUUkFfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFRSQV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VNSV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFTUlfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFRSQV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVUxUUkFfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC1zaXplCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9TSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9BQlNPTFVURV9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUkVMQVRJVkVfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyB1bmljb2RlLXJhbmdlCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfVU5JQ09ERV9SQU5HRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNVVJhbmdlLmdldEluc3RhbmNlT2YoUHJvcENNVVJhbmdlLlZBTF9VUkFOR0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyB1bml0cy1wZXItZW0KLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9VTklUU19QRVJfRU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gc3JjCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfU1JDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9GT1JNQVQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9MT0NBTCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIHBhbm9zZS0xCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfUEFOT1NFXzEpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMTApOwotCi0JCS8vIHN0ZW12Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfU1RFTVYpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gc3RlbWgKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9TVEVNSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBzbG9wZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1NMT1BFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIGNhcC1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9DQVBfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHgtaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfWF9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gYXNjZW50Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQVNDRU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIGRlc2NlbnQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9ERVNDRU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHdpZHRocwotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1dJRFRIUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01VUmFuZ2UuZ2V0SW5zdGFuY2VPZihQcm9wQ01VUmFuZ2UuVkFMX1VSQU5HRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGJib3gKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9CQk9YKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQotCQkvLyBkZWZpbml0aW9uLXNyYwotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0RFRklOSVRJT05fU1JDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQotCQkvLyBiYXNlbGluZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0JBU0VMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIGNlbnRlcmxpbmUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9DRU5URVJMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIG1hdGhsaW5lCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfTUFUSExJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gdG9wbGluZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1RPUExJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLyoqICoqKioqKioqIGNvbnRhaW5lcnMgKioqKioqKioqICovCi0KLQkJLy8gYWJzb2x1dGUtc2l6ZQotCQlQcm9wQ01Db250YWluZXIgY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0FCU09MVVRFX1NJWkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1hYX1NNQUxMKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX1NNQUxMKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTUFMTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MQVJHRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9MQVJHRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWFhfTEFSR0UpOwotCi0JCS8vIGJvcmRlci1zdHlsZQotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TT0xJRCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfREFTSEVEKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ET1RURUQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0RPVUJMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfR1JPT1ZFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSURHRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5TRVQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX09VVFNFVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElEREVOKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQotCQkvLyBib3JkZXItd2lkdGgKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhJTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USElDSyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQotCQkvLyBjb2xvcgotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FRVUEpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JMQUNLKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CTFVFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GVUNIU0lBKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9HUkFZKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9HUkVFTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTElNRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUFST09OKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OQVZZKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PTElWRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfUFVSUExFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRUQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NJTFZFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEVBTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0hJVEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1lFTExPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfU1lTVEVNX0NPTE9SKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfUkdCKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9IQVNIKSk7Ci0KLQkJLy8gc3lzdGVtIGNvbG9yCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9TWVNURU1fQ09MT1IpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FDVElWRUJPUkRFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUNUSVZFQ0FQVElPTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVBQV09SS1NQQUNFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CQUNLR1JPVU5EKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CVVRUT05GQUNFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CVVRUT05ISUdITElHSFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JVVFRPTlNIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQlVUVE9OVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0FQVElPTlRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0dSQVlURVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISUdITElHSFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0hJR0hMSUdIVFRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOQUNUSVZFQk9SREVSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkFDVElWRUNBUFRJT04pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOQUNUSVZFQ0FQVElPTlRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lORk9CQUNLR1JPVU5EKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkZPVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVOVSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVOVVRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NDUk9MTEJBUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVEREFSS1NIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVERkFDRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVESElHSExJR0hUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRURMSUdIVFNIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVEU0hBRE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSU5ET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1dJTkRPV0ZSQU1FKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSU5ET1dURVhUKTsKLQotCQkvLyBnZW5lcmljLWZhbWlseQotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19GQU1JTFkpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NFUklGKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TQU5TX1NFUklGKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DVVJTSVZFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GQU5UQVNZKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NT05PU1BBQ0UpOwotCi0JCS8vIGdlbmVyaWMtdm9pY2UKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfVk9JQ0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01BTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0ZFTUFMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0hJTEQpOwotCi0JCS8vIG1hcmdpbi13aWR0aAotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCi0JCS8vIHBhZGRpbmctd2lkdGgKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0KLQkJLy8gcmVsYXRpdmUtc2l6ZQotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUkVMQVRJVkVfU0laRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEFSR0VSKTsKLQotCQlMT0FESU5HID0gMjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNMb2FkaW5nKCkgewotCQlyZXR1cm4gTE9BRElORyA9PSAxOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc05lZWRJbml0aWFsaXplKCkgewotCQlyZXR1cm4gTE9BRElORyA9PSAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU51bWJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTMxMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01OdW1iZXIgZXh0ZW5kcyBQcm9wQ01Ob2RlIHsKLQotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0FOR0xFID0gImFuZ2xlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9GUkVRVUVOQ1kgPSAiZnJlcXVlbmN5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9JTlRFR0VSID0gImludGVnZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0xFTkdUSCA9ICJsZW5ndGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX1BFUkNFTlRBR0UgPSAicGVyY2VudGFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfVElNRSA9ICJ0aW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9IQVNIID0gImhhc2giOyAvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCS8vIGhleC1jb2xvci8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX05VTSA9ICJudW1iZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fQ00gPSAiY20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fREVHID0gImRlZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9FTVMgPSAiZW0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fRVhTID0gImV4IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0dSQUQgPSAiZ3JhZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9IQVNIID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSFogPSAiSHoiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSU4gPSAiaW4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSU5URUdFUiA9ICJJTlRFR0VSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0tIWiA9ICJrSHoiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTU0gPSAibW0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTVMgPSAibXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTlVNQkVSID0gIk5VTUJFUiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QQyA9ICJwYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QRVJDRU5UQUdFID0gIiUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUFQgPSAicHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUFggPSAicHgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUkFEID0gInJhZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9TID0gInMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgZkRpbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNTnVtYmVyKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpbWVuc2lvbihzaG9ydCBwcmltaXRpdmVUeXBlKSB7Ci0JCXN3aXRjaCAocHJpbWl0aXZlVHlwZSkgewotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ00gOgotCQkJCXJldHVybiBESU1fQ007Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ERUcgOgotCQkJCXJldHVybiBESU1fREVHOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQlyZXR1cm4gRElNX0VNUzsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUyA6Ci0JCQkJcmV0dXJuIERJTV9FWFM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQlyZXR1cm4gRElNX0dSQUQ7Ci0JCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJcmV0dXJuIERJTV9IQVNIOyAvLyBwcmVmaXggZGltZW5zaW9uIC4uLi4KLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0haIDoKLQkJCQlyZXR1cm4gRElNX0haOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU4gOgotCQkJCXJldHVybiBESU1fSU47Ci0JCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJcmV0dXJuIERJTV9LSFo7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJcmV0dXJuIERJTV9NTTsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TIDoKLQkJCQlyZXR1cm4gRElNX01TOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCXJldHVybiBESU1fUEM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQlyZXR1cm4gRElNX1BFUkNFTlRBR0U7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJcmV0dXJuIERJTV9QVDsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQlyZXR1cm4gRElNX1BYOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQlyZXR1cm4gRElNX1JBRDsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1MgOgotCQkJCXJldHVybiBESU1fUzsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTZXQgZ2V0RGltZW5zaW9ucygpIHsKLQkJSGFzaFNldCB2YWxzID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgaXQgPSBmRGltcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl2YWxzLmFkZChpdC5uZXh0KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgUHJvcENNTnVtYmVyIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgyMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNTnVtYmVyKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTU51bWJlcihuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTU51bWJlcikgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9OVU1CRVI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyB2b2lkIGluaXROdW1iZXJDTURpbSgpIHsKLQkJUHJvcENNTnVtYmVyIG51bSA9IGdldEluc3RhbmNlT2YoVkFMX0FOR0xFKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fREVHKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fR1JBRCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1JBRCk7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfRlJFUVVFTkNZKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fSFopOwotCQludW0uZkRpbXMuYWRkKERJTV9LSFopOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX0hBU0gpOwotCQludW0uZkRpbXMuYWRkKERJTV9IQVNIKTsKLQotCQkvLyBudW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9JTlRFR0VSKTsKLQkJLy8gbnVtLmZEaW1zLmFkZChESU1fSU5URUdFUik7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfTEVOR1RIKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fQ00pOwotCQludW0uZkRpbXMuYWRkKERJTV9FTVMpOwotCQludW0uZkRpbXMuYWRkKERJTV9FWFMpOwotCQludW0uZkRpbXMuYWRkKERJTV9JTik7Ci0JCW51bS5mRGltcy5hZGQoRElNX01NKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUEMpOwotCQludW0uZkRpbXMuYWRkKERJTV9QVCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1BYKTsKLQotCQkvLyBudW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9OVU1CRVIpOwotCQkvLyBudW0uZkRpbXMuYWRkKERJTV9OVU1CRVIpOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX1BFUkNFTlRBR0UpOwotCQludW0uZkRpbXMuYWRkKERJTV9QRVJDRU5UQUdFKTsKLQotCQludW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9USU1FKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fTVMpOwotCQludW0uZkRpbXMuYWRkKERJTV9TKTsKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJhYjM4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01Qcm9wZXJ0eSBleHRlbmRzIFByb3BDTUNvbnRhaW5lciB7Ci0KLQkvLyBzdGF0aWMgZmllbGRzCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgY2FjaGVkSWRNYXAgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQVpJTVVUSCA9ICJhemltdXRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CRyA9ICJiYWNrZ3JvdW5kIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19BVFRBQ0hNRU5UID0gImJhY2tncm91bmQtYXR0YWNobWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfQ09MT1IgPSAiYmFja2dyb3VuZC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfSU1BR0UgPSAiYmFja2dyb3VuZC1pbWFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUE9TSVRJT04gPSAiYmFja2dyb3VuZC1wb3NpdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUkVQRUFUID0gImJhY2tncm91bmQtcmVwZWF0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVIgPSAiYm9yZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MTEFQU0UgPSAiYm9yZGVyLWNvbGxhcHNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MT1IgPSAiYm9yZGVyLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1BBQ0lORyA9ICJib3JkZXItc3BhY2luZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1NUWUxFID0gImJvcmRlci1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUCA9ICJib3JkZXItdG9wIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFQgPSAiYm9yZGVyLXJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NID0gImJvcmRlci1ib3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUID0gImJvcmRlci1sZWZ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX0NPTE9SID0gImJvcmRlci10b3AtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9DT0xPUiA9ICJib3JkZXItcmlnaHQtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fQ09MT1IgPSAiYm9yZGVyLWJvdHRvbS1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfQ09MT1IgPSAiYm9yZGVyLWxlZnQtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfU1RZTEUgPSAiYm9yZGVyLXRvcC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX1NUWUxFID0gImJvcmRlci1yaWdodC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9TVFlMRSA9ICJib3JkZXItYm90dG9tLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9TVFlMRSA9ICJib3JkZXItbGVmdC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9XSURUSCA9ICJib3JkZXItdG9wLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfV0lEVEggPSAiYm9yZGVyLXJpZ2h0LXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1dJRFRIID0gImJvcmRlci1ib3R0b20td2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1dJRFRIID0gImJvcmRlci1sZWZ0LXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfV0lEVEggPSAiYm9yZGVyLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1RUT00gPSAiYm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DQVBUSU9OX1NJREUgPSAiY2FwdGlvbi1zaWRlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTEVBUiA9ICJjbGVhciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ0xJUCA9ICJjbGlwIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT0xPUiA9ICJjb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09OVEVOVCA9ICJjb250ZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX0lOQ1JFTUVOVCA9ICJjb3VudGVyLWluY3JlbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09VTlRFUl9SRVNFVCA9ICJjb3VudGVyLXJlc2V0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUUgPSAiY3VlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQUZURVIgPSAiY3VlLWFmdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQkVGT1JFID0gImN1ZS1iZWZvcmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVUlNPUiA9ICJjdXJzb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0RJU1BMQVkgPSAiZGlzcGxheSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRUxFVkFUSU9OID0gImVsZXZhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRU1QVFlfQ0VMTFMgPSAiZW1wdHktY2VsbHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZMT0FUID0gImZsb2F0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UID0gImZvbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfRkFNSUxZID0gImZvbnQtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkUgPSAiZm9udC1zaXplIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkVfQURKVVNUID0gImZvbnQtc2l6ZS1hZGp1c3QiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RSRVRDSCA9ICJmb250LXN0cmV0Y2giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RZTEUgPSAiZm9udC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9WQVJJQU5UID0gImZvbnQtdmFyaWFudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9XRUlHSFQgPSAiZm9udC13ZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0hFSUdIVCA9ICJoZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xFRlQgPSAibGVmdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVUVEVSX1NQQUNJTkcgPSAibGV0dGVyLXNwYWNpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJTkVfSEVJR0hUID0gImxpbmUtaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFID0gImxpc3Qtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfSU1BR0UgPSAibGlzdC1zdHlsZS1pbWFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9QT1NJVElPTiA9ICJsaXN0LXN0eWxlLXBvc2l0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1RZUEUgPSAibGlzdC1zdHlsZS10eXBlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU4gPSAibWFyZ2luIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fVE9QID0gIm1hcmdpbi10b3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9SSUdIVCA9ICJtYXJnaW4tcmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9CT1RUT00gPSAibWFyZ2luLWJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0xFRlQgPSAibWFyZ2luLWxlZnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUktFUl9PRkZTRVQgPSAibWFya2VyLW9mZnNldCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS1MgPSAibWFya3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUlOX0hFSUdIVCA9ICJtaW4taGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fV0lEVEggPSAibWluLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PUlBIQU5TID0gIm9ycGhhbnMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkUgPSAib3V0bGluZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9DT0xPUiA9ICJvdXRsaW5lLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX1NUWUxFID0gIm91dGxpbmUtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfV0lEVEggPSAib3V0bGluZS13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1ZFUkZMT1cgPSAib3ZlcmZsb3ciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkcgPSAicGFkZGluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19UT1AgPSAicGFkZGluZy10b3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfUklHSFQgPSAicGFkZGluZy1yaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19CT1RUT00gPSAicGFkZGluZy1ib3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfTEVGVCA9ICJwYWRkaW5nLWxlZnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0UgPSAicGFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19BRlRFUiA9ICJwYWdlLWJyZWFrLWFmdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0JFRk9SRSA9ICJwYWdlLWJyZWFrLWJlZm9yZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19JTlNJREUgPSAicGFnZS1icmVhay1pbnNpZGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFID0gInBhdXNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9BRlRFUiA9ICJwYXVzZS1hZnRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0VfQkVGT1JFID0gInBhdXNlLWJlZm9yZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0ggPSAicGl0Y2giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BJVENIX1JBTkdFID0gInBpdGNoLXJhbmdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QTEFZX0RVUklORyA9ICJwbGF5LWR1cmluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUE9TSVRJT04gPSAicG9zaXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1FVT1RFUyA9ICJxdW90ZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1JJQ0hORVNTID0gInJpY2huZXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9SSUdIVCA9ICJyaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU0laRSA9ICJzaXplIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBSyA9ICJzcGVhayI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfSEVBREVSID0gInNwZWFrLWhlYWRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfTlVNRVJBTCA9ICJzcGVhay1udW1lcmFsIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19QVU5DVFVBVElPTiA9ICJzcGVhay1wdW5jdHVhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFRUNIX1JBVEUgPSAic3BlZWNoLXJhdGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NUUkVTUyA9ICJzdHJlc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RBQkxFX0xBWU9VVCA9ICJ0YWJsZS1sYXlvdXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfQUxJR04gPSAidGV4dC1hbGlnbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9ERUNPUkFUSU9OID0gInRleHQtZGVjb3JhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9JTkRFTlQgPSAidGV4dC1pbmRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfU0hBRE9XID0gInRleHQtc2hhZG93IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX1RSQU5TRk9STSA9ICJ0ZXh0LXRyYW5zZm9ybSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVE9QID0gInRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVU5JQ09ERV9CSURJID0gInVuaWNvZGUtYmlkaSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVkVSVElDQUxfQUxJR04gPSAidmVydGljYWwtYWxpZ24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1ZJU0lCSUxJVFkgPSAidmlzaWJpbGl0eSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9JQ0VfRkFNSUxZID0gInZvaWNlLWZhbWlseSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9MVU1FID0gInZvbHVtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0hJVEVfU1BBQ0UgPSAid2hpdGUtc3BhY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRE9XUyA9ICJ3aWRvd3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRFRIID0gIndpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XT1JEX1NQQUNJTkcgPSAid29yZC1zcGFjaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9aX0lOREVYID0gInotaW5kZXgiOy8vJE5PTi1OTFMtMSQKLQkvLyBpbnN0YW5jZSBmaWVsZHMKLQlwcml2YXRlIGludCBmTWluVmFsdWVDb3VudCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZk1heFZhbHVlQ291bnQgPSAxOwotCXByaXZhdGUgT2JqZWN0W10gbWVkaWFHcm91cHM7Ci0JcHJvdGVjdGVkIExpc3QgY29udGFpbmVyczsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01Qcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlPYmplY3QgYXBwZW5kQ2hpbGQoT2JqZWN0IG5vZGUpIHsKLQkJT2JqZWN0IHJldCA9IHN1cGVyLmFwcGVuZENoaWxkKG5vZGUpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFByb3BDTVByb3BlcnR5KSB7Ci0JCQkvLyByZWdpc3RlciBzaG9ydGhhbmQgY29udGFpbmVyCi0JCQlQcm9wQ01Qcm9wZXJ0eSBjbSA9IChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQkJCWlmIChjbS5jb250YWluZXJzID09IG51bGwpCi0JCQkJY20uY29udGFpbmVycyA9IG5ldyBWZWN0b3IoKTsKLQkJCWlmICghY20uY29udGFpbmVycy5jb250YWlucyh0aGlzKSkKLQkJCQljbS5jb250YWluZXJzLmFkZCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYXBwZW5kTWVkaWFHcm91cChPYmplY3QgbWcpIHsKLQkJaWYgKG1lZGlhR3JvdXBzID09IG51bGwpCi0JCQltZWRpYUdyb3VwcyA9IG5ldyBPYmplY3RbMV07Ci0JCWVsc2UgewotCQkJT2JqZWN0W10gb2xkTWVkaWFHcm91cHMgPSBtZWRpYUdyb3VwczsKLQkJCW1lZGlhR3JvdXBzID0gbmV3IE9iamVjdFtvbGRNZWRpYUdyb3Vwcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkTWVkaWFHcm91cHMsIDAsIG1lZGlhR3JvdXBzLCAwLCBvbGRNZWRpYUdyb3Vwcy5sZW5ndGgpOwotCQl9Ci0JCW1lZGlhR3JvdXBzW21lZGlhR3JvdXBzLmxlbmd0aCAtIDFdID0gbWc7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgyMDApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTVByb3BlcnR5KG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNYXhWYWx1ZUNvdW50KCkgewotCQlyZXR1cm4gZk1heFZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVkaWFHcm91cHMoKSB7Ci0JCWlmIChtZWRpYUdyb3VwcyAhPSBudWxsKQotCQkJcmV0dXJuIEFycmF5cy5hc0xpc3QobWVkaWFHcm91cHMpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluVmFsdWVDb3VudCgpIHsKLQkJcmV0dXJuIGZNaW5WYWx1ZUNvdW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0TmFtZUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmtleXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldFByb3BlcnR5RW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCkgewotCQlyZXR1cm4gKGNvbnRhaW5lcnMgPT0gbnVsbCkgPyAwIDogY29udGFpbmVycy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaG9ydGhhbmQoKSB7Ci0JCWludCBuQ2hpbGQgPSBnZXROdW1DaGlsZCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZDsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZ2V0Q2hpbGRBdChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9wQ01Qcm9wZXJ0eSAmJiAhKG9iaiBpbnN0YW5jZW9mIFByb3BDTVN1YlByb3BlcnR5KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgbmFtZXMoKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMua2V5U2V0KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBuYW1lcyhPYmplY3QgbWVkaWFHcm91cCkgewotCQlpZiAobWVkaWFHcm91cCA9PSBudWxsKQotCQkJcmV0dXJuIG5hbWVzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCVZlY3RvciBwcm9wZXJ0aWVzID0gbmV3IFZlY3RvcigpOwotCi0JCUl0ZXJhdG9yIGl0ID0gaW5zdGFuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3AgPSAoUHJvcENNUHJvcGVydHkpIGl0Lm5leHQoKTsKLQkJCWlmIChwcm9wLmdldE1lZGlhR3JvdXBzKCkuY29udGFpbnMobWVkaWFHcm91cCkpCi0JCQkJcHJvcGVydGllcy5hZGQocHJvcC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogSWYgaWRlbnRpZmllciBpcyBudWxsLCBnZXQgYWxsIHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBwcm9wZXJ0aWVzRm9yKFN0cmluZyBpZGVudGlmaWVyLCBib29sZWFuIHNob3J0aGFuZHMpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIGlmIGlkZW50aWZpZXIgaXMgbnVsbCwgZ2V0IGFsbCBwcm9wZXJ0aWVzCi0JCWlmIChpZGVudGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMudmFsdWVzKCkpOwotCi0JCWlmIChjYWNoZWRJZE1hcCA9PSBudWxsKSB7Ci0JCQkvLyBzdGFydCBjYWNoZWluZwotCQkJY2FjaGVkSWRNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWFyY2ggY2FjaGVkCi0JCQlPYmplY3QgcmV0ID0gY2FjaGVkSWRNYXAuZ2V0KGlkZW50aWZpZXIgKyBTdHJpbmcudmFsdWVPZihzaG9ydGhhbmRzKSk7Ci0JCQlpZiAocmV0ICE9IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBWZWN0b3IoKENvbGxlY3Rpb24pIHJldCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUKLQkJRW51bWVyYXRpb24gcHJvcGVydHlFbnVtID0gZ2V0UHJvcGVydHlFbnVtKCk7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKHByb3BlcnR5RW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgcHJvcGVydHlFbnVtLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoIXNob3J0aGFuZHMgJiYgcHJvcC5pc1Nob3J0aGFuZCgpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHByb3AuY2FuSGF2ZShpZGVudGlmaWVyKSkKLQkJCQlzZXQuYWRkKHByb3ApOwotCQl9Ci0KLQkJLy8gY2FjaGUKLQkJY2FjaGVkSWRNYXAucHV0KGlkZW50aWZpZXIgKyBTdHJpbmcudmFsdWVPZihzaG9ydGhhbmRzKSwgc2V0KTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihzZXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1heFZhbHVlQ291bnQoaW50IG5ld01heFZhbHVlQ291bnQpIHsKLQkJZk1heFZhbHVlQ291bnQgPSBuZXdNYXhWYWx1ZUNvdW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1pblZhbHVlQ291bnQoaW50IG5ld01pblZhbHVlQ291bnQpIHsKLQkJZk1pblZhbHVlQ291bnQgPSBuZXdNaW5WYWx1ZUNvdW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQcm9wQ01Qcm9wZXJ0eSBzaG9ydGhhbmRDb250YWluZXJBdChpbnQgaSkgewotCQlpZiAoY29udGFpbmVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpIDwgMCB8fCBjb250YWluZXJzLnNpemUoKSA8PSBpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUHJvcENNUHJvcGVydHkpIGNvbnRhaW5lcnMuZ2V0KGkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBzaG9ydGhhbmRDb250YWluZXJJdGVyYXRvcigpIHsKLQkJaWYgKGNvbnRhaW5lcnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gY29udGFpbmVycy5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdHJpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjBiNTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVN0cmluZyBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfRk9OVCA9ICJmb250IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9DT1VOVEVSX0lEID0gImNvdW50ZXJJZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfUEFHRV9JRCA9ICJwYWdlSWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX1ZPSUNFID0gInZvaWNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9BTlkgPSAiYW55IjsgLy8gcmVzZXJ2ZWQKLQkJCQkJCQkJCQkJCQkJCS8vIG5hbWUvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNU3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgcHVibGljIFByb3BDTVN0cmluZyBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVN0cmluZykgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlub2RlID0gbmV3IFByb3BDTVN0cmluZyhuYW1lKTsKLQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQotCQlyZXR1cm4gKFByb3BDTVN0cmluZykgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9TVFJJTkc7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdWJQcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3ViUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlYmIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdWJQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNU3ViUHJvcGVydHkgZXh0ZW5kcyBQcm9wQ01Qcm9wZXJ0eSB7Ci0KLQkvLyBzdGF0aWMgZmllbGRzCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQkdfUE9TSVRJT05fWCA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uSCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQkdfUE9TSVRJT05fWSA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uViI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQ0xJUF9UT1AgPSAiY2xpcFRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQ0xJUF9SSUdIVCA9ICJjbGlwUmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfQk9UVE9NID0gImNsaXBCb3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfTEVGVCA9ICJjbGlwTGVmdCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTVN1YlByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBzaG9ydGhhbmRDb250YWluZXJBdCgwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVByb3BlcnR5IGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJbm9kZSA9IG5ldyBQcm9wQ01TdWJQcm9wZXJ0eShuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0TmFtZUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmtleXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldFByb3BlcnR5RW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9TVUJQUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBuYW1lcygpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy5rZXlTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5IHByb3ApIHsKLQkJaWYgKGNvbnRhaW5lcnMgPT0gbnVsbCkKLQkJCWNvbnRhaW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbnRhaW5lcnMuY2xlYXIoKTsKLQkJY29udGFpbmVycy5hZGQocHJvcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVVSYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzU3MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNVVJhbmdlIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1VSQU5HRSA9ICJ1cmFuZ2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01VUmFuZ2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcENNVVJhbmdlIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNVVJhbmdlKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCW5vZGUgPSBuZXcgUHJvcENNVVJhbmdlKG5hbWUpOwotCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCi0JCXJldHVybiAoUHJvcENNVVJhbmdlKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX1VOSUNPREVfUkFOR0U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmJhMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVV0aWwgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1pbnVzKENvbGxlY3Rpb24gc3JjLCBDb2xsZWN0aW9uIHJlZikgewotCQlJdGVyYXRvciBpdCA9IHJlZi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKHNyYy5jb250YWlucyhvYmopKQotCQkJCXNyYy5yZW1vdmUob2JqKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBsdXMoQ29sbGVjdGlvbiBzcmMsIENvbGxlY3Rpb24gcmVmKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVmLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXNyYy5jb250YWlucyhvYmopKQotCQkJCXNyYy5hZGQob2JqKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3RDU1NOb2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BYnN0cmFjdENTU05vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTBlMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BYnN0cmFjdENTU05vZGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDU1NOb2RlTGlzdCB7Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIG5vZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuQ1NTTm9kZQotCSAqIEBwYXJhbSBuZG9lCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5DU1NOb2RlCi0JICovCi0JSUNTU05vZGUgYXBwZW5kTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXRoaXMubm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCXRoaXMubm9kZXMuYWRkRWxlbWVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gdGhpcy5ub2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5DU1NOb2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU05vZGUgaXRlbUltcGwoaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLm5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElDU1NOb2RlKSB0aGlzLm5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5DU1NOb2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5DU1NOb2RlCi0JICovCi0JSUNTU05vZGUgcmVtb3ZlTm9kZShpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBub2RlCi0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQotCQlJQ1NTTm9kZSByZW1vdmVkID0gKElDU1NOb2RlKSB0aGlzLm5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JCXRoaXMubm9kZXMucmVtb3ZlRWxlbWVudEF0KGluZGV4KTsKLQkJcmV0dXJuIHJlbW92ZWQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQXR0ckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQXR0ckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkMDNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0F0dHJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU0F0dHJJbXBsIGV4dGVuZHMgQ1NTUmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU0F0dHIgewotCi0JcHJpdmF0ZSBTdHJpbmcgZk5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBvd25lckNTU05vZGUgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTQXR0ckltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NSZWdpb25Db250YWluZXIKLQkgKi8KLQlDU1NBdHRySW1wbChDU1NBdHRySW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQl0aGlzLmZOYW1lID0gdGhhdC5mTmFtZTsKLQkJdGhpcy5zZXRWYWx1ZSh0aGF0LmZWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ1NTQXR0ciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0F0dHJJbXBsKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudHJlZW1vZGVsLmNzcy5DU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlyZXR1cm4gbmV3IENTU0F0dHJJbXBsKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBJQ1NTTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQVRUUl9OT0RFOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBnZXRPd25lckNTU05vZGUoKSB7Ci0JCXJldHVybiBvd25lckNTU05vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAvKiAodGhpcy5uYW1lID09IG51bGwpICovZmFsc2U7Ci0JCWlmICh0aGlzLmZOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0aGlzLmZOYW1lLmVxdWFscyhuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlWYWx1ZUNoYW5nZWQoU3RyaW5nIG9sZFZhbHVlKSB7Ci0JCWlmICh0aGlzLm93bmVyQ1NTTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGZvciBtb2RlbAotCQlJQ1NTRG9jdW1lbnQgZG9jID0gb3duZXJDU1NOb2RlLmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ1NTTW9kZWxJbXBsIG1vZGVsID0gKENTU01vZGVsSW1wbCkgZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC52YWx1ZUNoYW5nZWQodGhpcywgb2xkVmFsdWUpOwotCi0JCS8vIGZvciBhZGFwdGVycwotCQlTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZSgpOwotCQl0aGlzLm93bmVyQ1NTTm9kZS5ub3RpZnkoQ0hBTkdFLCB0aGlzLCBvbGRWYWx1ZSwgdmFsdWUsIHRoaXMub3duZXJDU1NOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld05hbWUpIHsKLQkJZk5hbWUgPSBuZXdOYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdPd25lckNTU05vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckNTU05vZGUoQ1NTTm9kZUltcGwgbmV3T3duZXJDU1NOb2RlKSB7Ci0JCW93bmVyQ1NTTm9kZSA9IG5ld093bmVyQ1NTTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IGZWYWx1ZTsKLQkJZlZhbHVlID0gbmV3VmFsdWU7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKG9sZFZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NDaGFyc2V0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQ2hhcnNldFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTg4MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NDaGFyc2V0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wcmVmZXJlbmNlcy5DU1NQcmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWw7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTQ2hhcnNldFJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBJQ1NTQ2hhcnNldFJ1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTQ2hhcnNldFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU0NoYXJzZXRSdWxlSW1wbAotCSAqLwotCUNTU0NoYXJzZXRSdWxlSW1wbChDU1NDaGFyc2V0UnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNzcy5pbnRlcmZhY2VzLkNTU05vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU0NoYXJzZXRSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTQ2hhcnNldFJ1bGVJbXBsKHRoaXMpOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVuY29kaW5nIGluZm9ybWF0aW9uIHVzZWQgaW4gdGhpcyA8Y29kZT5AY2hhcnNldDwvY29kZT4gcnVsZS4KLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIHZhbHVlIGhhcyBhCi0JICogICAgICAgICAgICAgICAgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBlbmNvZGluZwotCSAqICAgICAgICAgICAgICAgIHJ1bGUgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKGdldEF0dHJpYnV0ZShFTkNPRElORykpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDSEFSU0VUUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIENIQVJTRVRfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGNzcyBwcmVmCi0JCS8vIFN0cmluZyBxdW90ZSA9Ci0JCS8vIGNvbS5pYm0uc3NlLmVkaXRvci5jc3MucHJlZmVyZW5jZXMuQ1NTUHJlZmVyZW5jZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldFF1b3RlU3RyaW5nKChJQ1NTTW9kZWwpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkpOwotCQlTdHJpbmcgcXVvdGUgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0UXVvdGVTdHJpbmcobnVsbCk7Ci0JCVN0cmluZyBlbmMgPSBDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhlbmNvZGluZyk7Ci0JCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShlbmMsIHF1b3RlKTsKLQkJc2V0QXR0cmlidXRlKEVOQ09ESU5HLCBxdW90ZSArIGVuYyArIHF1b3RlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOTk0MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ291bnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciB7Ci0JLyoqCi0JICogCi0JICovCi0JZmluYWwgY2xhc3MgRmxvYXRJbmZvIHsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJRmxvYXRJbmZvKFN0cmluZyB0ZXh0KSB7Ci0JCQlwYXJzZSh0ZXh0KTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXZvaWQgcGFyc2UoU3RyaW5nIHRleHQpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZJZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYk51bSA9IHRydWU7Ci0JCQlpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsKLQkJCQlpZiAoYk51bSkgewotCQkJCQlpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScgfHwgYyA9PSAnLicgfHwgYyA9PSAnKycgfHwgYyA9PSAnLScpIHsKLQkJCQkJCWJ1ZlZhbHVlLmFwcGVuZChjKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJ1ZklkZW50LmFwcGVuZChjKTsKLQkJCQkJCWJOdW0gPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnVmSWRlbnQuYXBwZW5kKGMpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyB2YWx1ZVN0ciA9IGJ1ZlZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlmVmFsdWUgPSBGbG9hdC52YWx1ZU9mKHZhbHVlU3RyKS5mbG9hdFZhbHVlKCk7Ci0JCQlmSWRlbnRpZmllciA9IGJ1ZklkZW50LnRvU3RyaW5nKCk7Ci0JCQlmVHlwZSA9IGdldEZsb2F0VmFsdWVUeXBlKHZhbHVlU3RyLCBmSWRlbnRpZmllcik7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlmbG9hdCBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiBmVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJCXJldHVybiBmSWRlbnRpZmllcjsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXNob3J0IGdldFZhbHVlVHlwZSgpIHsKLQkJCXJldHVybiBmVHlwZTsKLQkJfQotCi0JCXByaXZhdGUgZmxvYXQgZlZhbHVlID0gMC4wZjsKLQkJcHJpdmF0ZSBTdHJpbmcgZklkZW50aWZpZXIgPSBudWxsOwotCQlwcml2YXRlIHNob3J0IGZUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VOS05PV047Ci0JfQotCi0JZmluYWwgc3RhdGljIGludCBTX05PUk1BTCA9IDA7Ci0JZmluYWwgc3RhdGljIGludCBTX0ZVTkNUSU9OID0gMTsKLQlmaW5hbCBzdGF0aWMgaW50IFNfRk9OVF9TTEFTSCA9IDI7Ci0JZmluYWwgc3RhdGljIGludCBTX0NPTU1BX1NFUEFSQVRJT04gPSAzOwotCXByaXZhdGUgSUNTU0RvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZQYXJlbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmVGVtcFN0cnVjdHVyZWREb2N1bWVudCA9IGZhbHNlOwotCXByaXZhdGUgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IGZVcGRhdGVDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0RlY2xhcmF0aW9uSXRlbVBhcnNlcihJQ1NTRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVBdHRyVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImF0dHIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVH07Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KDApOwotCQl2YWx1ZS5zZXRWYWx1ZShnZXRUZXh0KHJlZ2lvbikpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVDb3VudGVyc1ZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJjb3VudGVycyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkd9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpbnQgc2l6ZSA9IHZhbHVlUmVnaW9ucy5zaXplKCk7Ci0JCWlmIChzaXplICE9IDIgJiYgc2l6ZSAhPSAzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNvdW50ZXJJbXBsIHZhbHVlID0gZ2V0Q291bnRlcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQl2YWx1ZS5zZXRJZGVudGlmaWVyKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5JREVOVElGSUVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJdmFsdWUuc2V0U2VwYXJhdG9yKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5TRVBBUkFUT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQl2YWx1ZS5zZXRMaXN0U3R5bGUodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLkxJU1RTVFlMRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVDb3VudGVyVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImNvdW50ZXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaW50IHNpemUgPSB2YWx1ZVJlZ2lvbnMuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDb3VudGVySW1wbCB2YWx1ZSA9IGdldENvdW50ZXIoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKTsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSBudWxsOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJdmFsdWUuc2V0SWRlbnRpZmllcih0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuSURFTlRJRklFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXZhbHVlLnNldExpc3RTdHlsZSh0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuTElTVFNUWUxFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU3R5bGVEZWNsSXRlbUltcGwgY3JlYXRlRGVjbGFyYXRpb25JdGVtKElUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucykgewotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBpdGVtID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUobm9kZVJlZ2lvbnMpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlpdGVtID0gZ2V0Q1NTU3R5bGVEZWNsSXRlbShuYW1lKTsKLQkJfQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVGbG9hdFZhbHVlKFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlGbG9hdEluZm8gaW5mbyA9IG5ldyBGbG9hdEluZm8odGV4dCk7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKGluZm8uZ2V0VmFsdWVUeXBlKCkpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWUuc2V0VmFsdWUoaW5mby5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlRm9ybWF0VmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImZvcm1hdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklOR307Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCS8vIGZvcm1hdCBjYW4gdGFrZSB2YXJpYWJsZSBhcmdzLgotCQlpZiAodmFsdWVSZWdpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRk9STUFUKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldCgwKTsKLQkJdmFsdWUuc2V0VmFsdWUoQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHMoZ2V0VGV4dChyZWdpb24pKSk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlTG9jYWxWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygibG9jYWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkd9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpZiAodmFsdWVSZWdpb25zLnNpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTE9DQUwpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KDApOwotCQl2YWx1ZS5zZXRWYWx1ZShDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhnZXRUZXh0KHJlZ2lvbikpKTsKLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlUHJpbWl0aXZlVmFsdWUoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKTsKLQkJaWYgKGlzQmxhbmsodHlwZSkpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCXZhbHVlID0gY3JlYXRlRmxvYXRWYWx1ZSh0ZXh0LCB0eXBlKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCXZhbHVlID0gY3JlYXRlU3RyaW5nVmFsdWUodGV4dCwgdHlwZSk7Ci0JCX0KLQotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZSh0ZXh0LCB0eXBlKTsKLQkJfQotCi0JCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWUuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVByaW1pdGl2ZVZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IG51bGw7Ci0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHJlZ2lvbnMpOwotCQlpZiAocmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKHRleHQuZXF1YWxzKCJyZ2IoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlUmdiVmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygiY291bnRlcigiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVDb3VudGVyVmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygiY291bnRlcnMoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlQ291bnRlcnNWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJhdHRyKCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZUF0dHJWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJmb3JtYXQoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlRm9ybWF0VmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygibG9jYWwoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlTG9jYWxWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJyZWN0KCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZVJlY3RWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlID0gY3JlYXRlU3RyaW5nVmFsdWUocmVnaW9ucyk7Ci0JCX0KLQotCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50ICYmIHZhbHVlICE9IG51bGwpIHsKLQkJCXZhbHVlLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbnMuZ2V0KDApLCByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpKTsKLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVSZWN0VmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoInJlY3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04sIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVH07IC8vIElERU5UOgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2F1dG8nCi0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJUmVjdEltcGwgdmFsdWUgPSBnZXRSZWN0KCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KGkpOwotCQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNoaWxkVmFsdWUgPSBudWxsOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldFRvcCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0UmlnaHQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldEJvdHRvbSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDMgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0TGVmdCgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCXNldFN0cmluZ1ZhbHVlKGNoaWxkVmFsdWUsIHRleHQsIHR5cGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0RmxvYXRWYWx1ZShjaGlsZFZhbHVlLCB0ZXh0LCB0eXBlKTsKLQkJCX0KLQkJCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQljaGlsZFZhbHVlLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVSZ2JWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygicmdiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRX07Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJUkdCQ29sb3JJbXBsIHZhbHVlID0gZ2V0UkdCQ29sb3IoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoaSk7Ci0JCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgY2hpbGRWYWx1ZSA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0UmVkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRHcmVlbigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0Qmx1ZSgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlzZXRGbG9hdFZhbHVlKGNoaWxkVmFsdWUsIGdldFRleHQocmVnaW9uKSwgcmVnaW9uLmdldFR5cGUoKSk7Ci0JCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJY2hpbGRWYWx1ZS5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlU3RyaW5nVmFsdWUoU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCXNob3J0IHZhbHVlVHlwZSA9IGdldFN0cmluZ1ZhbHVlVHlwZSh0ZXh0LCB0eXBlKTsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUodmFsdWVUeXBlKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmICh2YWx1ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSkgewotCQkJCXRleHQgPSBDU1NVdGlsLmV4dHJhY3RVcmlDb250ZW50cyh0ZXh0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKHZhbHVlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HKSB7Ci0JCQkJdGV4dCA9IENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKHRleHQpOwotCQkJfQotCQkJdmFsdWUuc2V0VmFsdWUodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVN0cmluZ1ZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyB0eXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UOwotCQlpZiAocmVnaW9ucy5zaXplKCkgPT0gMSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlU3RyaW5nVmFsdWUobWFrZVN0cmluZyhyZWdpb25zKSwgdHlwZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDb3VudGVySW1wbCBnZXRDb3VudGVyKCkgewotCQlDb3VudGVySW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q291bnRlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDb3VudGVySW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT1VOVEVSKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBnZXRDU1NQcmltaXRpdmVWYWx1ZShzaG9ydCB0eXBlKSB7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTUHJpbWl0aXZlVmFsdWUodHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKHR5cGUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU3R5bGVEZWNsSXRlbUltcGwgZ2V0Q1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NTdHlsZURlY2xJdGVtKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBzaG9ydCBnZXRGbG9hdFZhbHVlVHlwZShTdHJpbmcgaWRlbnQpIHsKLQkJaWRlbnQgPSBpZGVudC50b0xvd2VyQ2FzZSgpOwotCQlzaG9ydCB2YWx1ZVR5cGU7Ci0JCWlmIChpZGVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFscygiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImVtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFg7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiY20iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ007Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgibW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU07Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU47Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicGMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZGVnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImdyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1M7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFo7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgia2h6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWjsKLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT047Ci0JCX0KLQkJcmV0dXJuIHZhbHVlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgc2hvcnQgZ2V0RmxvYXRWYWx1ZVR5cGUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaWRlbnQpIHsKLQkJaWRlbnQgPSBpZGVudC50b0xvd2VyQ2FzZSgpOwotCQlzaG9ydCB2YWx1ZVR5cGU7Ci0JCWlmIChpZGVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoMCA8PSB2YWx1ZS5pbmRleE9mKCcuJykpIHsKLQkJCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFscygiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImVtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFg7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiY20iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ007Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgibW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU07Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU47Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicGMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZGVnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImdyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1M7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFo7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgia2h6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWjsKLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT047Ci0JCX0KLQkJcmV0dXJuIHZhbHVlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGdW5jdGlvbk5hbWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA8IDIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uIGZpcnN0UmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCWlmIChmaXJzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KGZpcnN0UmVnaW9uKTsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIG1ldGhvZCBoYXMgbm8gdmFsaWRhdGlvbiBjaGVjaywgdGhlbiByZWdpb25zIG11c3QgYmUgcGFzc2VkCi0JICogZ2V0RnVuY3Rpb25OYW1lKCkuLi4KLQkgKi8KLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBnZXRGdW5jdGlvblBhcmFtZXRlcnMoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMsIFN0cmluZ1tdIGFjY2VwdHMpIHsKLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0JCWludCBuQWNjZXB0cyA9IChhY2NlcHRzICE9IG51bGwpID8gYWNjZXB0cy5sZW5ndGggOiAwOwotCQlJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQlpLm5leHQoKTsgLy8gc2tpcCBGVU5DVElPTgotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc0JsYW5rKHR5cGUpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobkFjY2VwdHMgPT0gMCkgewotCQkJCW5ld1JlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBpQWNjZXB0ID0gMDsgaUFjY2VwdCA8IG5BY2NlcHRzOyBpQWNjZXB0KyspIHsKLQkJCQkJaWYgKHR5cGUgPT0gYWNjZXB0c1tpQWNjZXB0XSkgewotCQkJCQkJbmV3UmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZWdpb25zOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCS8vIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JLy8gVmVjdG9yIG5vZGVSZWdpb25zID0gbmV3IFZlY3RvcihmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCS8vIHJldHVybiBnZXRQcm9wZXJ0eU5hbWUobm9kZVJlZ2lvbnMpOwotCS8vIH0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuYW1lUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQl3aGlsZSAoIW5vZGVSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbm9kZVJlZ2lvbnMucmVtb3ZlKDApOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2UobmFtZVJlZ2lvbnMpOwotCQkJCW5hbWUgPSBtYWtlU3RyaW5nKG5hbWVSZWdpb25zKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5hbWVSZWdpb25zLmFkZChyZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgUmVjdEltcGwgZ2V0UmVjdCgpIHsKLQkJUmVjdEltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0ICE9IG51bGwgJiYgZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldFJlY3QoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoUmVjdEltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBSR0JDb2xvckltcGwgZ2V0UkdCQ29sb3IoKSB7Ci0JCVJHQkNvbG9ySW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0UkdCQ29sb3IoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoUkdCQ29sb3JJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHNob3J0IGdldFN0cmluZ1ZhbHVlVHlwZShTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJc2hvcnQgdmFsdWVUeXBlOwotCQlpZiAodGV4dC50b0xvd2VyQ2FzZSgpLmVxdWFscygiaW5oZXJpdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5IRVJJVF9QUklNSVRJVkU7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORykgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NUUklORzsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0g7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgdGV4dC5lcXVhbHMoIiwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPTU1BOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIHRleHQuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19TTEFTSDsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFKSB7Ci0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSQU5HRTsKLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVDsKLQkJfQotCQlyZXR1cm4gdmFsdWVUeXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIG1ha2VTdHJpbmcoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBiU3BhY2UgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoIWJTcGFjZSAmJiBpc0JsYW5rKHR5cGUpKSB7Ci0JCQkJYnVmLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYlNwYWNlID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoZ2V0VGV4dChyZWdpb24pKTsKLQkJCQliU3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFRlbXBvcmFyeShib29sZWFuIGJUZW1wKSB7Ci0JCWZUZW1wU3RydWN0dXJlZERvY3VtZW50ID0gYlRlbXA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEZsb2F0VmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlLCBTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJRmxvYXRJbmZvIGluZm8gPSBuZXcgRmxvYXRJbmZvKHRleHQpOwotCQl2YWx1ZS5zZXRGbG9hdFZhbHVlKGluZm8uZ2V0VmFsdWVUeXBlKCksIGluZm8uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFN0cmluZ1ZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSwgU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCXNob3J0IHZhbHVlVHlwZSA9IGdldFN0cmluZ1ZhbHVlVHlwZSh0ZXh0LCB0eXBlKTsKLQkJdmFsdWUuc2V0U3RyaW5nVmFsdWUodmFsdWVUeXBlLCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXRlbQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1N0eWxlRGVjbEl0ZW0KLQkgKiBAcGFyYW0gbm9kZVJlZ2lvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBJbXBvcnRhbnRBdHRyaWJ1dGUoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCWlmIChpdGVtID09IG51bGwgfHwgbm9kZVJlZ2lvbnMgPT0gbnVsbCB8fCBub2RlUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlUmVnaW9ucy5nZXQobm9kZVJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQpIHsKLQkJCWl0ZW0uc2V0UHJpb3JpdHkoZ2V0VGV4dChyZWdpb24pKTsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBpdGVtKS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCk7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCW5vZGVSZWdpb25zLnJlbW92ZShyZWdpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRVcGRhdGVDb250ZXh0KENTU01vZGVsVXBkYXRlQ29udGV4dCB1cGRhdGVDb250ZXh0KSB7Ci0JCWZVcGRhdGVDb250ZXh0ID0gdXBkYXRlQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29sb25TZXBhcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVEZWNsSXRlbUltcGwgc2V0dXBEZWNsYXJhdGlvbkl0ZW0oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCFoYXNDb2xvblNlcGFyYXRvcihmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZlBhcmVudFJlZ2lvbiA9IGZsYXROb2RlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsgLy8gbWFrZQotCQkvLyBjb3B5Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIG5ld0l0ZW0gPSBjcmVhdGVEZWNsYXJhdGlvbkl0ZW0obm9kZVJlZ2lvbnMpOwotCQlpZiAobmV3SXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50ICYmIGZsYXROb2RlICE9IG51bGwpIHsKLQkJCW5ld0l0ZW0uc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGZsYXROb2RlKTsKLQkJfQotCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKG5vZGVSZWdpb25zKTsKLQkJc2V0dXBJbXBvcnRhbnRBdHRyaWJ1dGUobmV3SXRlbSwgbm9kZVJlZ2lvbnMpOwotCQkvLyBOb3csIG5vZGVSZWdpb25zIGp1c3QgaGFzIHJlZ2lvbnMgZm9yIHZhbHVlLgotCQlzZXR1cFZhbHVlcyhuZXdJdGVtLCBub2RlUmVnaW9ucyk7Ci0JCXJldHVybiBuZXdJdGVtOwotCX0KLQotCXZvaWQgc2V0dXBWYWx1ZXMoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24sIElUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucykgewotCQlmUGFyZW50UmVnaW9uID0gcGFyZW50UmVnaW9uOwotCQlzZXR1cFZhbHVlcyhpdGVtLCBub2RlUmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogbm9kZVJlZ2lvbnMgbXVzdCBiZSBicm9rZW4uIElmIHlvdSBuZWVkIGFmdGVyLCBtYWtlIGNvcHkgb2YgdGhlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBWYWx1ZXMoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkJ1ZiA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQlib29sZWFuIGJGb250ID0gKHByb3BlcnR5TmFtZS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9GT05UKSk7Ci0JCS8vIChzaG9ydC1oYW5kKSBmb250Ci0JCWludCBzdGF0dXMgPSAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSkgPyBTX0NPTU1BX1NFUEFSQVRJT04gOiBTX05PUk1BTDsKLQkJd2hpbGUgKCFub2RlUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGVSZWdpb25zLnJlbW92ZSgwKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCB0eXBlCi0JCQkvLyA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkvLyBicmVhazsKLQkJCS8vIH0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQkJY2FzZSBTX05PUk1BTCA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCQkJcmVnaW9uQnVmLmFkZChyZWdpb24pOwotCQkJCQkJc3RhdHVzID0gU19GVU5DVElPTjsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChiRm9udCAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiBmUGFyZW50UmVnaW9uLmdldFRleHQocmVnaW9uKS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCQlzdGF0dXMgPSBTX0ZPTlRfU0xBU0g7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWlzQmxhbmsodHlwZSkpIHsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNfRlVOQ1RJT04gOgotCQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uQnVmKTsKLQkJCQkJCXJlZ2lvbkJ1Zi5jbGVhcigpOwotCQkJCQkJc3RhdHVzID0gU19OT1JNQUw7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWlzQmxhbmsodHlwZSkpIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNfRk9OVF9TTEFTSCA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04pIHsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJCXN0YXR1cyA9IFNfQ09NTUFfU0VQQVJBVElPTjsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghaXNCbGFuayh0eXBlKSkgewotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb24pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU19DT01NQV9TRVBBUkFUSU9OIDoKLQkJCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIGZQYXJlbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pLmVxdWFscygiLCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uQnVmKTsKLQkJCQkJCXJlZ2lvbkJ1Zi5jbGVhcigpOwotCQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCQkJCQlpdGVtLmFwcGVuZFZhbHVlKHZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZWdpb25CdWYuYWRkKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCQlpdGVtLmFwcGVuZFZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFyZWdpb25CdWYuaXNFbXB0eSgpKSB7Ci0JCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbkJ1Zik7Ci0JCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCWl0ZW0uYXBwZW5kVmFsdWUodmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIChmUGFyZW50UmVnaW9uICE9IG51bGwpID8gZlBhcmVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbikgOiAiIjsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmxhbmsoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEb2N1bWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRG9jdW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYmI2NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEb2N1bWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTRG9jdW1lbnRJbXBsIGV4dGVuZHMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU0RvY3VtZW50IHsKLQotCXByaXZhdGUgQ1NTTW9kZWxJbXBsIGZNb2RlbCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NEb2N1bWVudEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NEb2N1bWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTRG9jdW1lbnRJbXBsCi0JICovCi0JQ1NTRG9jdW1lbnRJbXBsKENTU0RvY3VtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUlDU1NOb2RlIGNyZWF0ZUNTU0F0dHIoU3RyaW5nIG5hbWUpIHsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IG5ldyBDU1NBdHRySW1wbChuYW1lKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlCi0JICovCi0JcHVibGljIElDU1NDaGFyc2V0UnVsZSBjcmVhdGVDU1NDaGFyc2V0UnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlCi0JICovCi0JcHVibGljIENTU0ZvbnRGYWNlUnVsZSBjcmVhdGVDU1NGb250RmFjZVJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU0ltcG9ydFJ1bGUgY3JlYXRlQ1NTSW1wb3J0UnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuSUNTU01lZGlhUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTTWVkaWFSdWxlIGNyZWF0ZUNTU01lZGlhUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU1BhZ2VSdWxlIGNyZWF0ZUNTU1BhZ2VSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCXB1YmxpYyBJQ1NTUHJpbWl0aXZlVmFsdWUgY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoc2hvcnQgcHJpbWl0aXZlVHlwZSkgewotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBudWxsOwotCQlpZiAocHJpbWl0aXZlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09VTlRFUikKLQkJCXZhbHVlID0gbmV3IENvdW50ZXJJbXBsKCk7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1QpCi0JCQl2YWx1ZSA9IG5ldyBSZWN0SW1wbCgpOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SR0JDT0xPUikKLQkJCXZhbHVlID0gbmV3IFJHQkNvbG9ySW1wbCgpOwotCQllbHNlCi0JCQl2YWx1ZSA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwocHJpbWl0aXZlVHlwZSk7Ci0JCXZhbHVlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGNyZWF0ZUNTU1J1bGUoU3RyaW5nIHJ1bGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jZWkuQ1NTU3R5bGVEZWNsSXRlbQotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbEl0ZW0gY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSBuZXcgQ1NTU3R5bGVEZWNsSXRlbUltcGwocHJvcGVydHlOYW1lKTsKLQkJaXRlbS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVSdWxlIGNyZWF0ZUNTU1N0eWxlUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGUKLQkgKi8KLQlwdWJsaWMgQ1NTVW5rbm93blJ1bGUgY3JlYXRlQ1NTVW5rbm93blJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0Ci0JICovCi0JcHVibGljIE1lZGlhTGlzdCBjcmVhdGVNZWRpYUxpc3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICovCi0JcHVibGljIElDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTTW9kZWxJbXBsCi0JICovCi0Jdm9pZCBzZXRNb2RlbChDU1NNb2RlbEltcGwgbW9kZWwpIHsKLQkJdGhpcy5mTW9kZWwgPSBtb2RlbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NGb250RmFjZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ZvbnRGYWNlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiZGY2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ZvbnRGYWNlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU0ZvbnRGYWNlUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlRGVjbENvbnRhaW5lciBpbXBsZW1lbnRzIENTU0ZvbnRGYWNlUnVsZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NGb250RmFjZVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU0ZvbnRGYWNlUnVsZUltcGwKLQkgKi8KLQlDU1NGb250RmFjZVJ1bGVJbXBsKENTU0ZvbnRGYWNlUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNzcy5pbnRlcmZhY2VzLkNTU05vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU0ZvbnRGYWNlUnVsZUltcGwgY2xvbmVkID0gbmV3IENTU0ZvbnRGYWNlUnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBleHRyYWN0UHJlU3RyaW5nKCkgewotCQlyZXR1cm4gIkBmb250LWZhY2UiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRk9OVEZBQ0VSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gRk9OVF9GQUNFX1JVTEU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTSW1wb3J0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTSW1wb3J0UnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5OWYxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ltcG9ydFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklNb2RlbFByb3ZpZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuVVJMTW9kZWxQcm92aWRlckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU0ltcG9ydFJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBJQ1NTSW1wb3J0UnVsZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkRpcnR5ID0gdHJ1ZTsKLQlwcml2YXRlIElDU1NTdHlsZVNoZWV0IGZTdHlsZVNoZWV0OwotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTSW1wb3J0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTSW1wb3J0UnVsZUltcGwKLQkgKi8KLQlDU1NJbXBvcnRSdWxlSW1wbChDU1NJbXBvcnRSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTSW1wb3J0UnVsZUltcGwgY2xvbmVkID0gbmV3IENTU0ltcG9ydFJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNsb3NlU3R5bGVTaGVldCgpIHsKLQkJaWYgKGZTdHlsZVNoZWV0ICE9IG51bGwpIHsKLQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gZlN0eWxlU2hlZXQ7Ci0JCQlmU3R5bGVTaGVldCA9IG51bGw7IC8vIHRvIHByZXZlbnQgbG9vcCwgd2UgbXVzdCByZXNldCBmU3R5bGVTaGVldAotCQkJCQkJCQkvLyBiZWZvcmUgYWxsIGNsb3NpbmcgYWN0aW9uCi0KLQkJCXNoZWV0LmdldE1vZGVsKCkucmVtb3ZlU3R5bGVMaXN0ZW5lcihnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PQotCQkJLy8gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UgU1RZTEUgdGFnCi0JCQkvLyBhZGFwdGVyID0gKE1vZGVsUHJvdmlkZUFkYXB0ZXIpCi0JCQkvLyAoKElOb2RlTm90aWZpZXIpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyB9Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKHNoZWV0LmdldE1vZGVsKCkpOwotCi0JCQlzaGVldC5nZXRNb2RlbCgpLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGxvY2F0aW9uIG9mIHRoZSBzdHlsZSBzaGVldCB0byBiZSBpbXBvcnRlZC4gVGhlIGF0dHJpYnV0ZSB3aWxsIG5vdAotCSAqIGNvbnRhaW4gdGhlIDxjb2RlPiJ1cmwoLi4uKSI8L2NvZGU+IHNwZWNpZmllciBhcm91bmQgdGhlIFVSSS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBDU1NVdGlsLmV4dHJhY3RVcmlDb250ZW50cyhnZXRBdHRyaWJ1dGUoSFJFRikpOwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiBtZWRpYSB0eXBlcyBmb3Igd2hpY2ggdGhpcyBzdHlsZSBzaGVldCBtYXkgYmUgdXNlZC4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0IGdldE1lZGlhKCkgewotCQlJQ1NTTm9kZSBtZWRpYSA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKG1lZGlhICE9IG51bGwpIHsKLQkJCWlmIChtZWRpYSBpbnN0YW5jZW9mIE1lZGlhTGlzdCkgewotCQkJCXJldHVybiAoTWVkaWFMaXN0KSBtZWRpYTsKLQkJCX0KLQkJfQotCi0JCS8vIFRISVMgQ0FTRSBJUyBFUlJPUiBDQVNFCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBJTVBPUlRSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0eWxlIHNoZWV0IHJlZmVycmVkIHRvIGJ5IHRoaXMgcnVsZSwgaWYgaXQgaGFzIGJlZW4gbG9hZGVkLiBUaGUKLQkgKiB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3R5bGUgc2hlZXQgaGFzCi0JICogbm90IHlldCBiZWVuIGxvYWRlZCBvciBpZiBpdCB3aWxsIG5vdCBiZSBsb2FkZWQgKGUuZy4gaWYgdGhlIHN0eWxlCi0JICogc2hlZXQgaXMgZm9yIGEgbWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB1c2VyIGFnZW50KS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVTaGVldCBnZXRTdHlsZVNoZWV0KCkgewotCi0JCWlmIChmRGlydHkpIHsKLQkJCS8vIE5PVEU6IHRyeS9jYXRjaCBibG9jayBpcyBhIFRFTVAgZml4IHRvIGF2b2lkIGNvbXBpbGUgZXJyb3JzOgotCQkJdHJ5IHsKLQkJCQljbG9zZVN0eWxlU2hlZXQoKTsKLQotCQkJCWlmIChnZXRIcmVmKCkgPT0gbnVsbCB8fCBnZXRIcmVmKCkubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlmRGlydHkgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwgPSBnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsgLy8gY2FzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gU1RZTEUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRhZwotCQkJCQliYXNlTW9kZWwgPSAoKFhNTE5vZGUpIGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldE93bmVyRE9NTm9kZSgpKS5nZXRNb2RlbCgpOwotCQkJCX0KLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJCS8vIGlmIChnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09Ci0JCQkJLy8gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UgU1RZTEUgdGFnCi0JCQkJLy8gYWRhcHRlciA9IChNb2RlbFByb3ZpZGVBZGFwdGVyKQotCQkJCS8vICgoSU5vZGVOb3RpZmllcilnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyBsb2FkIG1vZGVsIGZyb20gSU1vZGVsTWFuYWdlcgotCQkJCVVSTE1vZGVsUHJvdmlkZXJDU1MgcHJvdmlkZXIgPSBuZXcgVVJMTW9kZWxQcm92aWRlckNTUygpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBwcm92aWRlci5nZXRNb2RlbEZvclJlYWQoYmFzZU1vZGVsLCBnZXRIcmVmKCkpOwotCQkJCWZEaXJ0eSA9IGZhbHNlOwotCi0JCQkJaWYgKG5ld01vZGVsID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWlmICghKG5ld01vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSkgewotCQkJCQluZXdNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJLy8gbm90aWZ5IGFkYXB0ZXIKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLm1vZGVsUHJvdmlkZWQobmV3TW9kZWwpOwotCi0JCQkJZlN0eWxlU2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpICgoSUNTU01vZGVsKSBuZXdNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlpZiAoZlN0eWxlU2hlZXQgIT0gbnVsbCkKLQkJCQkJZlN0eWxlU2hlZXQuZ2V0TW9kZWwoKS5hZGRTdHlsZUxpc3RlbmVyKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmU3R5bGVTaGVldDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBJTVBPUlRfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoU3R5bGVTaGVldCgpIHsKLQkJaWYgKCFmRGlydHkpIHsKLQkJCWNsb3NlU3R5bGVTaGVldCgpOwotCQkJZkRpcnR5ID0gdHJ1ZTsKLQkJCW5vdGlmeShJTm9kZU5vdGlmaWVyLkNIQU5HRSwgZ2V0QXR0cmlidXRlTm9kZShIUkVGKSwgbnVsbCwgbnVsbCwgZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlbGVhc2VSdWxlKCkgewotCQlpZiAoZlN0eWxlU2hlZXQgIT0gbnVsbCkgewotCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSBmU3R5bGVTaGVldDsKLQkJCWZTdHlsZVNoZWV0ID0gbnVsbDsgLy8gdG8gcHJldmVudCBsb29wLCB3ZSBtdXN0IHJlc2V0IGZTdHlsZVNoZWV0Ci0JCQkJCQkJCS8vIGJlZm9yZSBhbGwgY2xvc2luZyBhY3Rpb24KLQotCQkJc2hlZXQuZ2V0TW9kZWwoKS5yZW1vdmVTdHlsZUxpc3RlbmVyKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIGlmIChnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09Ci0JCQkvLyBJQ1NTTW9kZWwuRU1CRURERUQpIHsgLy8gY2FzZSBTVFlMRSB0YWcKLQkJCS8vIGFkYXB0ZXIgPSAoTW9kZWxQcm92aWRlQWRhcHRlcikKLQkJCS8vICgoSU5vZGVOb3RpZmllcilnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIH0KLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5tb2RlbFJlbGVhc2VkKHNoZWV0LmdldE1vZGVsKCkpOwotCi0JCQlzaGVldC5nZXRNb2RlbCgpLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGhyZWYKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZkRpcnR5ID0gdHJ1ZTsKLQkJc2V0QXR0cmlidXRlKEhSRUYsIENTU0xpbmtDb252ZXJ0ZXIuYWRkRnVuYyhocmVmKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTWVkaWFSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNZWRpYVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MWJmYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNZWRpYVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01lZGlhUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlSW1wbCBpbXBsZW1lbnRzIElDU1NNZWRpYVJ1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTWVkaWFSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NNZWRpYVJ1bGVJbXBsCi0JICovCi0JQ1NTTWVkaWFSdWxlSW1wbChDU1NNZWRpYVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgYXBwZW5kUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIGFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgcnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5DU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NNZWRpYVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NNZWRpYVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRlbGV0ZSBhIHJ1bGUgZnJvbSB0aGUgbWVkaWEgYmxvY2suCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBUaGUgaW5kZXggd2l0aGluIHRoZSBtZWRpYSBibG9jaydzIHJ1bGUgY29sbGVjdGlvbiBvZiB0aGUKLQkgKiAgICAgICAgICAgIHJ1bGUgdG8gcmVtb3ZlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGRvZXMgbm90Ci0JICogICAgICAgICAgICAgICAgY29ycmVzcG9uZCB0byBhIHJ1bGUgaW4gdGhlIG1lZGlhIHJ1bGUgbGlzdC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbWVkaWEgcnVsZQotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJ1bGUoaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldEluZGV4ZWRSdWxlKGluZGV4KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiBhbGwgQ1NTIHJ1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrLgotCSAqLwotCXB1YmxpYyBDU1NSdWxlTGlzdCBnZXRDc3NSdWxlcygpIHsKLQkJQ1NTUnVsZUxpc3RJbXBsIGxpc3QgPSBuZXcgQ1NTUnVsZUxpc3RJbXBsKCk7Ci0KLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkKLQkJCQlsaXN0LmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTUnVsZUltcGwKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCUNTU1J1bGVJbXBsIGdldEluZGV4ZWRSdWxlKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJaWYgKGkrKyA9PSBpbmRleCkKLQkJCQkJcmV0dXJuIChDU1NSdWxlSW1wbCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBIGxpc3Qgb2YgbWVkaWEgdHlwZXMgZm9yIHRoaXMgcnVsZS4KLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGdldE1lZGlhKCkgewotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKQotCQkJCXJldHVybiAoTWVkaWFMaXN0KSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE1FRElBUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIE1FRElBX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBpbnNlcnQgYSBuZXcgcnVsZSBpbnRvIHRoZSBtZWRpYSBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgVGhlIHBhcnNhYmxlIHRleHQgcmVwcmVzZW50aW5nIHRoZSBydWxlLiBGb3IgcnVsZSBzZXRzIHRoaXMKLQkgKiAgICAgICAgICAgIGNvbnRhaW5zIGJvdGggdGhlIHNlbGVjdG9yIGFuZCB0aGUgc3R5bGUgZGVjbGFyYXRpb24uIEZvcgotCSAqICAgICAgICAgICAgYXQtcnVsZXMsIHRoaXMgc3BlY2lmaWVzIGJvdGggdGhlIGF0LWlkZW50aWZpZXIgYW5kIHRoZSBydWxlCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgbWVkaWEgYmxvY2sncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlCi0JICogICAgICAgICAgICBydWxlIGJlZm9yZSB3aGljaCB0byBpbnNlcnQgdGhlIHNwZWNpZmllZCBydWxlLiBJZiB0aGUKLQkgKiAgICAgICAgICAgIHNwZWNpZmllZCBpbmRleCBpcyBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBtZWRpYSBibG9ja3MncwotCSAqICAgICAgICAgICAgcnVsZSBjb2xsZWN0aW9uLCB0aGUgcnVsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlCi0JICogICAgICAgICAgICBtZWRpYSBibG9jay4KLQkgKiBAcmV0dXJuIFRoZSBpbmRleCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrJ3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZSBuZXdseQotCSAqICAgICAgICAgaW5zZXJ0ZWQgcnVsZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBydWxlIGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgICAgIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGUuZy4sIGlmIGFuCi0JICogICAgICAgICAgICAgICAgPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSBpcyBpbnNlcnRlZCBhZnRlciBhIHN0YW5kYXJkIHJ1bGUgc2V0IG9yIG90aGVyCi0JICogICAgICAgICBhdC1ydWxlLiA8YnI+Ci0JICogICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggaXMgbm90IGEgdmFsaWQKLQkgKiAgICAgICAgIGluc2VydGlvbiBwb2ludC4gPGJyPgotCSAqICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZWRpYSBydWxlIGlzCi0JICogICAgICAgICByZWFkb25seS4gPGJyPgotCSAqICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcnVsZSBoYXMgYSBzeW50YXggZXJyb3IgYW5kCi0JICogICAgICAgICBpcyB1bnBhcnNhYmxlLgotCSAqLwotCXB1YmxpYyBpbnQgaW5zZXJ0UnVsZShTdHJpbmcgcnVsZSwgaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaW50IGxlbmd0aCA9IGdldENzc1J1bGVzKCkuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChpbmRleCA8IDAgfHwgbGVuZ3RoIDwgaW5kZXgpCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQotCQlDU1NSdWxlSW1wbCByZWZSdWxlID0gKGxlbmd0aCAhPSBpbmRleCkgPyBnZXRJbmRleGVkUnVsZShpbmRleCkgOiBudWxsOwotCi0JCUNTU1J1bGVJbXBsIG5ld1J1bGUgPSAoQ1NTUnVsZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NSdWxlKHJ1bGUpOwotCi0JCS8vIHByZXZlbnQgZnJvbSBuZXN0aW5nIEBtZWRpYSBydWxlCi0JCWlmIChuZXdSdWxlLmdldFR5cGUoKSA9PSBDU1NSdWxlLk1FRElBX1JVTEUpCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5TWU5UQVhfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCi0JCWluc2VydEJlZm9yZShuZXdSdWxlLCByZWZSdWxlKTsKLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSByZWZSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBpbnNlcnRSdWxlQmVmb3JlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlZlJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIHJlZlJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgcmVmUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVtb3ZlUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgcnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZXBsYWNlUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBuZXdSdWxlLCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBvbGRSdWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1J1bGUgPT0gbnVsbCAmJiBvbGRSdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSByZXBsYWNlQ2hpbGQoKENTU05vZGVJbXBsKSBuZXdSdWxlLCAoQ1NTTm9kZUltcGwpIG9sZFJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsQ3JlYXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsQ3JlYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjQwZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbENyZWF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsQ3JlYXRpb25Db250ZXh0IHsKLQotCXByaXZhdGUgQ1NTTm9kZUltcGwgZlJvb3ROb2RlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZUYXJnZXROb2RlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZOZXh0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlJlcGFyc2VTdGFydCA9IC0xOwotCXByaXZhdGUgaW50IGZSZXBhcnNlRW5kID0gLTE7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbENvbnRleHQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbENyZWF0aW9uQ29udGV4dChDU1NOb2RlSW1wbCByb290Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCWZSb290Tm9kZSA9IHJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2xlYXIoKSB7Ci0JCWZOZXh0Tm9kZSA9IG51bGw7Ci0JCWZUYXJnZXROb2RlID0gbnVsbDsKLQkJcmVzZXRSZXBhcnNlUmFuZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NOb2RlSW1wbCBnZXROZXh0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0UmVwYXJzZUVuZCgpIHsKLQkJcmV0dXJuIGZSZXBhcnNlRW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRSZXBhcnNlU3RhcnQoKSB7Ci0JCXJldHVybiBmUmVwYXJzZVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU05vZGVJbXBsIGdldFJvb3ROb2RlKCkgewotCQlyZXR1cm4gZlJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU05vZGVJbXBsIGdldFRhcmdldE5vZGUoKSB7Ci0JCXJldHVybiBmVGFyZ2V0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzVG9SZXBhcnNlKCkgewotCQlyZXR1cm4gKDAgPD0gZ2V0UmVwYXJzZVN0YXJ0KCkgJiYgMCA8PSBnZXRSZXBhcnNlRW5kKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVzZXRSZXBhcnNlUmFuZ2UoKSB7Ci0JCWZSZXBhcnNlU3RhcnQgPSBmUmVwYXJzZUVuZCA9IC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0TGFzdCgpIHsKLQkJZk5leHROb2RlID0gbnVsbDsKLQotCQlpZiAoIShmUm9vdE5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IGZSb290Tm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmUm9vdE5vZGUpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCUNTU05vZGVJbXBsIG5vZGUgPSBmUm9vdE5vZGU7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJSUNTU05vZGUgbGFzdENoaWxkID0gbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCQlpZiAobGFzdENoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyICYmICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBsYXN0Q2hpbGQpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCW5vZGUgPSAoQ1NTTm9kZUltcGwpIGxhc3RDaGlsZDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWZUYXJnZXROb2RlID0gbm9kZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0TmV4dE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlmTmV4dE5vZGUgPSAoQ1NTTm9kZUltcGwpIG5vZGU7Ci0JCWlmIChmTmV4dE5vZGUgIT0gbnVsbCkgewotCQkJZlRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpIGZOZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFJlcGFyc2VFbmQoaW50IGVuZCkgewotCQlmUmVwYXJzZUVuZCA9IGVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFJlcGFyc2VTdGFydChpbnQgc3RhcnQpIHsKLQkJZlJlcGFyc2VTdGFydCA9IHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0VGFyZ2V0Tm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWZUYXJnZXROb2RlID0gKENTU05vZGVJbXBsKSBub2RlOwotCQlpZiAoZk5leHROb2RlICE9IG51bGwgJiYgZk5leHROb2RlLmdldFBhcmVudE5vZGUoKSAhPSBmVGFyZ2V0Tm9kZSkgewotCQkJZk5leHROb2RlID0gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsRGVsZXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsRGVsZXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNjM5NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbERlbGV0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQgewotCi0JcHJpdmF0ZSBpbnQgZk9sZFN0YXJ0ID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZk9sZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZk5ld1N0YXJ0ID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZk5ld0xlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aERpZmZlcmVuY2UgPSAwOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBudWxsOwotCS8vIHByaXZhdGUgSUNTU05vZGUgZlJvb3ROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCBmUmVtb3ZlZFJhbmdlQmVnaW4gPSAtMTsKLQlwcml2YXRlIGludCBmUmVtb3ZlZFJhbmdlRW5kID0gLTE7Ci0JcHJpdmF0ZSBDU1NOb2RlTGlzdEltcGwgZk5vZGVzVG9CZVJlbW92ZWQgPSBuZXcgQ1NTTm9kZUxpc3RJbXBsKCk7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbERlbGV0aW9uQ29udGV4dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU01vZGVsRGVsZXRpb25Db250ZXh0KElDU1NOb2RlIHJvb3ROb2RlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gZlJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBhZGROb2RlVG9CZVJlbW92ZWQoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbk5vZGVzID0gZk5vZGVzVG9CZVJlbW92ZWQuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbk5vZGVzOyBpKyspIHsKLQkJCUlDU1NOb2RlIHBhcmVudCA9IGZOb2Rlc1RvQmVSZW1vdmVkLml0ZW0oaSk7Ci0JCQlpZiAoQ1NTTW9kZWxVdGlsLmlzUGFyZW50T2YocGFyZW50LCBub2RlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlmTm9kZXNUb0JlUmVtb3ZlZC5hcHBlbmROb2RlKG5vZGUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGV4cGFuZFJlbW92ZWRSYW5nZUJlZ2luKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbmV3QmVnaW4gPSBmbGF0Tm9kZS5nZXRTdGFydCgpOyAvLyBmT2xkU3RhcnQgPT0gZk5ld1N0YXJ0LCByaWdodD8/Ci0JCWlmIChmUmVtb3ZlZFJhbmdlQmVnaW4gPCAwIHx8IG5ld0JlZ2luIDwgZlJlbW92ZWRSYW5nZUJlZ2luKSB7Ci0JCQlmUmVtb3ZlZFJhbmdlQmVnaW4gPSBuZXdCZWdpbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZXhwYW5kUmVtb3ZlZFJhbmdlRW5kKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbmV3RW5kID0gZmxhdE5vZGUuZ2V0RW5kKCkgKyAoKGlzT2xkTm9kZShmbGF0Tm9kZSkpID8gZkxlbmd0aERpZmZlcmVuY2UgOiAwKTsKLQkJaWYgKGZSZW1vdmVkUmFuZ2VFbmQgPCAwIHx8IGZSZW1vdmVkUmFuZ2VFbmQgPCBuZXdFbmQpIHsKLQkJCWZSZW1vdmVkUmFuZ2VFbmQgPSBuZXdFbmQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBmaW5kQ29udGFpbmVyKENTU05vZGVJbXBsIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkvLyBBbSBpIGEgY29udGFpbmVyIG9mIGZsYXROb2RlPwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWludCBmaXJzdFN0YXJ0ID0gZ2V0T3JpZ2luYWxPZmZzZXQoZmlyc3ROb2RlKTsKLQkJCWludCBsYXN0U3RhcnQgPSBnZXRPcmlnaW5hbE9mZnNldChsYXN0Tm9kZSk7Ci0JCQlpbnQgc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCi0JCQlpZiAoZmlyc3RTdGFydCA8PSBzdGFydCAmJiBzdGFydCA8PSBsYXN0U3RhcnQpIHsKLQkJCQkvLyBJIGFtIGEgY29udGFpbmVyLCBpcyBteSBjaGlsZCBhIGNvbnRhaW5lciA/Ci0JCQkJZm9yIChJQ1NTTm9kZSBub2RlID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCQkJCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBmaW5kQ29udGFpbmVyKChDU1NOb2RlSW1wbCkgbm9kZSwgZmxhdE5vZGUpOwotCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGZpbmREZWxldGlvblRhcmdldChDU1NOb2RlSW1wbCBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCA9IGZpbmRDb250YWluZXIocGFyZW50LCBmbGF0Tm9kZSk7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50KGZsYXROb2RlLnRvU3RyaW5nKCkgKyAiOiAiKTsKLQotCQkvLyBjaGlsZCBhKD09PT09KWIoPT09PT0pYwotCQkvLyBwYXJlbnQgKD09PT09PT09PT09PT09PT0pIGEsYyBjYW4gcmVtb3ZlIHBhcmVudCwgYnV0IGIgY2Fubm90LgotCi0JCUlDU1NOb2RlIGNoaWxkOwotCi0JCWZvciAoY2hpbGQgPSB0YXJnZXQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsICYmICEoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCS8vIGp1c3QgYWR2YW5jaW5nCi0JCX0KLQotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0YXJnZXQgaGFzIG5vIGNoaWxkcmVuLiIpOyAvLyBURVNUQllDT1pZCi0JCQlyZXR1cm4gdGFyZ2V0OyAvLyBoYXMgbm8gY2hpbGQgY29udGFpbmVycy4KLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0KCkgPCBnZXRPcmlnaW5hbE9mZnNldChmaXJzdE5vZGUpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmbGF0Tm9kZSBpcyBpbiBmcm9udCBvZiBmaXJzdCBjaGlsZCIpOwotCQkJCS8vIC8vIFRFU1RCWUNPWlkKLQkJCQlyZXR1cm4gdGFyZ2V0OyAvLyBhCi0JCQl9Ci0JCX0KLQotCQlmb3IgKGNoaWxkID0gdGFyZ2V0LmdldExhc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsICYmICEoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpOyBjaGlsZCA9IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpKSB7Ci0JCQkvLyBqdXN0IGFkdmFuY2luZwotCQl9Ci0KLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGFyZ2V0IGhhcyBubyBjaGlsZHJlbi4iKTsgLy8gVEVTVEJZQ09aWQotCQkJcmV0dXJuIHRhcmdldDsgLy8gaGFzIG5vIGNoaWxkIGNvbnRhaW5lcnMuCi0JCX0KLQkJZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChnZXRPcmlnaW5hbE9mZnNldChmaXJzdE5vZGUpIDwgZmxhdE5vZGUuZ2V0U3RhcnQoKSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZmxhdE5vZGUgaXMgaW4gYWZ0ZXIgb2YgbGFzdCBjaGlsZCIpOwotCQkJCS8vIC8vIFRFU1RCWUNPWlkKLQkJCQlyZXR1cm4gdGFyZ2V0OyAvLyBjCi0JCQl9Ci0JCX0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImZsYXROb2RlIGlubmVyIG9mIGNoaWxkcmVuIik7IC8vIFRFU1RCWUNPWlkKLQkJcmV0dXJuIG51bGw7IC8vIGIKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvciBnZXROb2Rlc1RvQmVSZW1vdmVkKCkgewotCQlDb2xsZWN0aW9uIG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgbk5vZGVzID0gZk5vZGVzVG9CZVJlbW92ZWQuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbk5vZGVzOyBpKyspIHsKLQkJCW5vZGVzLmFkZChmTm9kZXNUb0JlUmVtb3ZlZC5pdGVtKGkpKTsKLQkJfQotCQlyZXR1cm4gbm9kZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGludCBnZXRPcmlnaW5hbE9mZnNldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCWlmICgwIDw9IGZMZW5ndGhEaWZmZXJlbmNlKSB7Ci0JCQkJaWYgKGZOZXdTdGFydCArIGZOZXdMZW5ndGggPCBvZmZzZXQpIHsKLQkJCQkJb2Zmc2V0IC09IGZMZW5ndGhEaWZmZXJlbmNlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChmT2xkU3RhcnQgKyBmT2xkTGVuZ3RoIDw9IG9mZnNldCB8fCAoZk5ld1N0YXJ0IDwgMCAmJiBmT2xkU3RhcnQgPD0gb2Zmc2V0ICYmICFpc09sZE5vZGUoZmxhdE5vZGUpKSB8fCAoMCA8PSBmTmV3U3RhcnQgJiYgZk5ld1N0YXJ0ICsgZk5ld0xlbmd0aCA8PSBvZmZzZXQgJiYgIWlzT2xkTm9kZShmbGF0Tm9kZSkpKSB7Ci0JCQkJCW9mZnNldCAtPSBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRSZW1vdmVkUmFuZ2VCZWdpbigpIHsKLQkJcmV0dXJuIGZSZW1vdmVkUmFuZ2VCZWdpbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0UmVtb3ZlZFJhbmdlRW5kKCkgewotCQlyZXR1cm4gZlJlbW92ZWRSYW5nZUVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNPbGROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwpIHsKLQkJCWZvciAoRW51bWVyYXRpb24gZSA9IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJaWYgKGUubmV4dEVsZW1lbnQoKSA9PSBmbGF0Tm9kZSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXR1cENvbnRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJZk9sZExlbmd0aCA9IENTU1V0aWwuZ2V0VGV4dExlbmd0aChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCAmJiAwIDwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSAmJiAoZmxhdE5vZGUgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpICE9IG51bGwpIHsKLQkJCWZPbGRTdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmT2xkU3RhcnQgPSAtMTsKLQkJfQotCQlmTmV3TGVuZ3RoID0gQ1NTVXRpbC5nZXRUZXh0TGVuZ3RoKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsICYmIDAgPCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpICYmIChmbGF0Tm9kZSA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSkgIT0gbnVsbCkgewotCQkJZk5ld1N0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCWZSZW1vdmVkUmFuZ2VCZWdpbiA9IGZOZXdTdGFydDsKLQkJCWZSZW1vdmVkUmFuZ2VFbmQgPSBmTmV3U3RhcnQgKyBmTmV3TGVuZ3RoOwotCQl9Ci0JCWVsc2UgewotCQkJZk5ld1N0YXJ0ID0gLTE7Ci0JCQlmUmVtb3ZlZFJhbmdlQmVnaW4gPSBmUmVtb3ZlZFJhbmdlRW5kID0gLTE7Ci0JCX0KLQkJZkxlbmd0aERpZmZlcmVuY2UgPSBmTmV3TGVuZ3RoIC0gZk9sZExlbmd0aDsKLQkJZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCi0JCS8vIGNsZWFudXAgbm9kZXMKLQkJd2hpbGUgKDAgPCBmTm9kZXNUb0JlUmVtb3ZlZC5nZXRMZW5ndGgoKSkgewotCQkJZk5vZGVzVG9CZVJlbW92ZWQucmVtb3ZlTm9kZSgwKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5OGY1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmV2ZW50LklDU1NTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5DU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5DU1NTdHlsZU5vdGlmeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuSW1wb3J0UnVsZUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5JbXBvcnRlZENvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5TZWxlY3RvcnNDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFic3RyYWN0U3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIENTU01vZGVsSW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSUNTU01vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBDU1NEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgb3JnLnczYy5kb20uTm9kZSBvd25lck5vZGUgPSBudWxsOwotCXByaXZhdGUgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIHN0eWxlTm90aWZpZXIgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxQYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZXIgZlVwZGF0ZXIgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElEX05PTl9FWFRFUk5BTF9DU1MgPSAiKipfTk9OX0VYVEVSTkFMX0NTU18qKioiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENTU01vZGVsSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZXZlbnQuQ1NTU3R5bGVMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLmFkZFN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXZvaWQgYXR0clJlcGxhY2VkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5ld0F0dHIsIENTU05vZGVJbXBsIG9sZEF0dHIpIHsKLQkJaWYgKCFmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlKSB7Ci0JCQlDU1NNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldFVwZGF0ZXIoKTsKLQkJCXVwZGF0ZXIuYXR0clJlcGxhY2VkKHBhcmVudE5vZGUsIG5ld0F0dHIsIG9sZEF0dHIpOwotCQl9Ci0KLQkJSUNTU1NlbGVjdG9yIHJlbW92ZWRbXSA9IG51bGwsIGFkZGVkW10gPSBudWxsOwotCQlpZiAob2xkQXR0ciAhPSBudWxsICYmIG9sZEF0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgb2xkQXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSkgewotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgb2xkQXR0cjsKLQkJCS8vIGNvbGxlY3QgY2hhbmdlZCBzZWxlY3RvcgotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCXJlbW92ZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJcmVtb3ZlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCX0KLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCAmJiBuZXdBdHRyLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFICYmICgoQ1NTQXR0ckltcGwpIG5ld0F0dHIpLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoQ1NTQXR0ckltcGwpIG5ld0F0dHI7Ci0JCQkvLyBjb2xsZWN0IGNoYW5nZWQgc2VsZWN0b3IKLQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQlhZGRlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCX0KLQkJaWYgKHJlbW92ZWQgIT0gbnVsbCB8fCBhZGRlZCAhPSBudWxsIHx8IGdldERvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpIHsKLQkJCWdldFN0eWxlTm90aWZpZXIoKS5maXJlKHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQkJfQotCQkvLyBmb3IgaHJlZiBhdHRyaWJ1dGUKLQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCAmJiBnZXRTdHlsZUxpc3RlbmVycygpLnNpemUoKSA+IDApIHsKLQkJCWJvb2xlYW4gdXBkYXRlID0gZmFsc2U7Ci0JCQlpZiAob2xkQXR0ciAhPSBudWxsICYmIG9sZEF0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgb2xkQXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCXVwZGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAobmV3QXR0ciAhPSBudWxsICYmIG5ld0F0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbmV3QXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCXVwZGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAodXBkYXRlKQotCQkJCSgoSUNTU0ltcG9ydFJ1bGUpIHBhcmVudE5vZGUpLmdldFN0eWxlU2hlZXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5iZWdpblJlY29yZGluZygpOwotCi0JCU5vZGUgbm9kZSA9IGdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBYTUxOb2RlKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gKChYTUxOb2RlKSBub2RlKS5nZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXZvaWQgY2hpbGRSZXBsYWNlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHsKLQkJaWYgKCFmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlKSB7Ci0JCQlDU1NNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldFVwZGF0ZXIoKTsKLQkJCXVwZGF0ZXIuY2hpbGRSZXBsYWNlZChwYXJlbnROb2RlLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCQl9Ci0KLQkJLy8gYWx3YXlzIGNoZWNrIGFuZCBzZW5kIHNlbGVjdG9yIGV2ZW50Ci0JCUlDU1NTZWxlY3RvciByZW1vdmVkW10gPSBudWxsLCBhZGRlZFtdID0gbnVsbDsKLQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUgfHwgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBUlVMRV9OT0RFKSB7Ci0JCQkvLyBjb2xsZWN0IG9sZCBzZWxlY3RvcnMKLQkJCVNlbGVjdG9yc0NvbGxlY3RvciBzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJc2VsVHJhdi5hcHBseShvbGRDaGlsZCk7Ci0JCQlpbnQgblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJaWYgKG5TZWwgPiAwKSB7Ci0JCQkJcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbblNlbF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsOyBpKyspCi0JCQkJCXJlbW92ZWRbaV0gPSAoSUNTU1NlbGVjdG9yKSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLmdldChpKTsKLQkJCX0KLQkJCS8vIGNvbGxlY3QgbmV3IHNlbGVjdG9ycwotCQkJc2VsVHJhdiA9IG5ldyBTZWxlY3RvcnNDb2xsZWN0b3IoKTsKLQkJCXNlbFRyYXYuYXBwbHkobmV3Q2hpbGQpOwotCQkJblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJaWYgKG5TZWwgPiAwKSB7Ci0JCQkJYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gbW9kaWZpY2F0aW9uCi0JCQlJQ1NTTm9kZSBydWxlID0gcGFyZW50Tm9kZTsKLQkJCXdoaWxlIChydWxlICE9IG51bGwpIHsKLQkJCQlpZiAocnVsZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpCi0JCQkJCWJyZWFrOwotCQkJCXJ1bGUgPSBydWxlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWlmIChydWxlICE9IG51bGwpIHsKLQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSAoKElDU1NTdHlsZVJ1bGUpIHJ1bGUpLmdldFNlbGVjdG9ycygpOwotCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJfQotCQl9Ci0JCWlmIChyZW1vdmVkICE9IG51bGwgfHwgYWRkZWQgIT0gbnVsbCB8fCBnZXREb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSB7Ci0JCQkvLyBzZW5kIHNlbGVjdG9yIGNoYW5nZWQgZXZlbnQKLQkJCWdldFN0eWxlTm90aWZpZXIoKS5maXJlKHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQkJfQotCQkvLyBjbG9zZSByZW1vdmVkIGltcG9ydC1ydWxlJ3MgZXh0ZXJuYWwgc3R5bGUgc2hlZXRzCi0JCXsKLQkJCUltcG9ydFJ1bGVDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRSdWxlQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG9sZENoaWxkKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRSdWxlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJKChDU1NJbXBvcnRSdWxlSW1wbCkgaXQubmV4dCgpKS5jbG9zZVN0eWxlU2hlZXQoKTsKLQkJCX0KLQkJfQotCQkvLyBzZW5kIGV2ZW50cyB0byBsaXN0ZW5lciBmb3IgbmV3IGltcG9ydC1ydWxlcwotCQlpZiAoZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsICYmIGdldFN0eWxlTGlzdGVuZXJzKCkuc2l6ZSgpID4gMCkgewotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShuZXdDaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VJbXBvcnRlZCgpIHsKLQkJaWYgKCFpc1NoYXJlZCgpKSB7Ci0JCQkvLyByZWxlYXNlIGxpc3RlbmVycwotCQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgewotCQkJCVZlY3RvciB0b1JlbW92ZSA9IG5ldyBWZWN0b3IoZ2V0U3R5bGVMaXN0ZW5lcnMoKSk7Ci0JCQkJSXRlcmF0b3IgaXQgPSB0b1JlbW92ZS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJcmVtb3ZlU3R5bGVMaXN0ZW5lcigoSUNTU1N0eWxlTGlzdGVuZXIpIGl0Lm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2xvc2UgaW1wb3J0IHJ1bGVzCi0JCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShnZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGl0MiA9IHRyYXYuZ2V0UnVsZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Mi5oYXNOZXh0KCkpIHsKLQkJCQkoKENTU0ltcG9ydFJ1bGVJbXBsKSBpdDIubmV4dCgpKS5yZWxlYXNlUnVsZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU0RvY3VtZW50SW1wbAotCSAqLwotCXByaXZhdGUgQ1NTRG9jdW1lbnRJbXBsIGNyZWF0ZURvY3VtZW50KCkgewotCQlDU1NEb2N1bWVudEltcGwgZG9jID0gbnVsbDsKLQkJaW50IHBhcnNlck1vZGUgPSBDU1NTb3VyY2VQYXJzZXIuTU9ERV9TVFlMRVNIRUVUOwotCQlpZiAob3duZXJOb2RlID09IG51bGwpIHsKLQkJCS8vIHRoaXMgY2FzZSBpcyBleHRlcm5hbCBDU1MgZmlsZQotCQkJZG9jID0gKENTU1N0eWxlU2hlZXRJbXBsKSBET01DU1NJbXBsLmNyZWF0ZUNTU1N0eWxlU2hlZXQobnVsbCwgbnVsbCk7IC8vIHBhcmFtZXRlcnMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFyZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBTVFlMRS10YWcKLQkJCXBhcnNlck1vZGUgPSBDU1NTb3VyY2VQYXJzZXIuTU9ERV9TVFlMRVNIRUVUOwotCQl9Ci0JCWVsc2UgaWYgKG93bmVyTm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkVsZW1lbnQgJiYgKChFbGVtZW50KSBvd25lck5vZGUpLmdldFRhZ05hbWUoKS50b1VwcGVyQ2FzZSgpLmVxdWFscygiU1RZTEUiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8vIHRoaXMgY2FzZSBpcyBTVFlMRS10YWcKLQkJCUVsZW1lbnQgc3R5bGUgPSAoRWxlbWVudCkgb3duZXJOb2RlOwotCQkJZG9jID0gKENTU1N0eWxlU2hlZXRJbXBsKSBET01DU1NJbXBsLmNyZWF0ZUNTU1N0eWxlU2hlZXQoc3R5bGUuZ2V0QXR0cmlidXRlKCJUSVRMRSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlzdHlsZS5nZXRBdHRyaWJ1dGUoIk1FRElBIikpOy8vJE5PTi1OTFMtMSQKLQkJCXBhcnNlck1vZGUgPSBDU1NTb3VyY2VQYXJzZXIuTU9ERV9TVFlMRVNIRUVUOwotCQl9Ci0JCWVsc2UgaWYgKG93bmVyTm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkVsZW1lbnQgfHwgb3duZXJOb2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uQXR0cikgewotCQkJLy8gSW5saW5lIGF0dHJpYnV0ZXMKLQkJCWRvYyA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgRE9NQ1NTSW1wbC5jcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0JCQlwYXJzZXJNb2RlID0gQ1NTU291cmNlUGFyc2VyLk1PREVfREVDTEFSQVRJT047Ci0JCX0KLQkJUmVnaW9uUGFyc2VyIHJlZ2lvblBhcnNlciA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFBhcnNlcigpOwotCQlpZiAocmVnaW9uUGFyc2VyIGluc3RhbmNlb2YgQ1NTU291cmNlUGFyc2VyKSB7Ci0JCQkoKENTU1NvdXJjZVBhcnNlcikgcmVnaW9uUGFyc2VyKS5zZXRQYXJzZXJNb2RlKHBhcnNlck1vZGUpOwotCQl9Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIpIHsKLQkJTm9kZSBub2RlID0gZ2V0T3duZXJET01Ob2RlKCk7Ci0JCWlmIChub2RlICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIFhNTE5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSAoKFhNTE5vZGUpIG5vZGUpLmdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5lbmRSZWNvcmRpbmcocmVxdWVzdGVyKTsKLQotCQlnZXRTdHlsZU5vdGlmaWVyKCkuZW5kUmVjb3JkaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSUNTU0RvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhpcy5kb2N1bWVudCA9IGNyZWF0ZURvY3VtZW50KCk7Ci0JCQl0aGlzLmRvY3VtZW50LnNldE1vZGVsKHRoaXMpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQkJLy8gdGhlIGZpcnN0IHRpbWUKLQkJQXNzZXJ0LmlzTm90TnVsbChnZXRNb2RlbEhhbmRsZXIoKSk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBnZXRNb2RlbEhhbmRsZXIoKS5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBuZXcKLQkJLy8gY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LmltcGwuSVN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZE1vZGVsLkNTUyk7Ci0JCS8vIENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHJlUGFyc2VyID0gbmV3Ci0JCS8vIENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JCS8vIHJlUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyAoKGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5pbXBsLklTdHJ1Y3R1cmVkRG9jdW1lbnQpc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihyZVBhcnNlcik7Ci0KLQkJc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0RG9jdW1lbnQoKSkuZ2V0Q29udGFpbmVyTm9kZShvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldE93bmVyRE9NTm9kZSgpIHsKLQkJcmV0dXJuIG93bmVyTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3duZXJOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIGlmIHRoZSBjYXNlIG9mIGV4dGVybmFsIENTUyBtb2RlbCwgeW91Ci0JICogICAgICAgICAgICBzaG91bGQgc2V0IG51bGwsIGVsc2UgaWYgaW50ZXJuYWwgY3NzLCB5b3Ugc2hvdWxkIHNldAotCSAqICAgICAgICAgICAgU1RZTEUtdGFnIG5vZGUsIGVsc2UgaWYgaW5saW5lIGNzcywgeW91IHNob3VsZCBzZXQgdGhlCi0JICogICAgICAgICAgICBlbGVtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHN0eWxlLWF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRPTU5vZGUoTm9kZSBub2RlKSB7Ci0JCS8vIHByb2hpYml0IG93bmVyIGNoYW5nZQotCQlBc3NlcnQuaXNUcnVlKG93bmVyTm9kZSA9PSBudWxsKTsKLQkJb3duZXJOb2RlID0gbm9kZTsKLQkJaWYgKG93bmVyTm9kZSAhPSBudWxsKSB7IC8vIGZvciBpbnRlcm5hbC9pbmxpbmUgQ1NTIGNvbnRleHQKLQkJCXRyeSB7Ci0JCQkJc2V0SWQoSURfTk9OX0VYVEVSTkFMX0NTUyk7Ci0JCQl9Ci0JCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkJLy8gaW1wb3NzaWJsZQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NNb2RlbFBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChmUGFyc2VyID09IG51bGwpIHsKLQkJCWlmIChnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlmUGFyc2VyID0gbmV3IENTU01vZGVsUGFyc2VyKGRvY3VtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3R5bGVMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBnZXRTdHlsZU5vdGlmaWVyKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRTdHlsZVNoZWV0VHlwZSgpIHsKLQkJaWYgKGdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbikKLQkJCXJldHVybiBJTkxJTkU7Ci0JCWlmIChnZXRPd25lckRPTU5vZGUoKSAhPSBudWxsKQotCQkJcmV0dXJuIEVNQkVEREVEOwotCQllbHNlCi0JCQlyZXR1cm4gRVhURVJOQUw7Ci0JfQotCi0JcHJpdmF0ZSBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIgZ2V0U3R5bGVOb3RpZmllcigpIHsKLQkJaWYgKHN0eWxlTm90aWZpZXIgPT0gbnVsbCkgewotCQkJc3R5bGVOb3RpZmllciA9IChvd25lck5vZGUgIT0gbnVsbCkgPyBuZXcgQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlcih0aGlzKSA6IG5ldyBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHN0eWxlTm90aWZpZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZXIgZ2V0VXBkYXRlcigpIHsKLQkJaWYgKGZVcGRhdGVyID09IG51bGwpIHsKLQkJCWZVcGRhdGVyID0gbmV3IENTU01vZGVsVXBkYXRlcih0aGlzKTsKLQkJCWZVcGRhdGVyLnNldFBhcnNlcihnZXRQYXJzZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIGZVcGRhdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVjb3JkaW5nKCkgewotCQlyZXR1cm4gZ2V0U3R5bGVOb3RpZmllcigpLmlzUmVjb3JkaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIChnZXRTdHlsZVNoZWV0VHlwZSgpID09IEVYVEVSTkFMKSAmJiBzdXBlci5pc1NoYXJlZCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LmV2ZW50cy5OZXdNb2RlbEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgZm9yIHRoZSBjYXNlCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpCi0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSB0cnVlOwotCi0JCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBnZXREb2N1bWVudCgpKS5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJQ1NTTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhmbGF0Tm9kZXMsIG51bGwpOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBub0NoYW5nZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCS8vIG5vcAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9PSBudWxsICYmIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJQ1NTTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogY2xlYW51cCAtPiByZWJ1aWxkIENTUyBOb2RlcyBUaGlzIGlzIHByZS1iZXRhIGZpeCBmb3IgMTc4MTc2LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hOb2RlcygpIHsKLQkJLy8gY2xlYW51cCBvbGQgbm9kZXMKLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0JCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBnZXREb2N1bWVudCgpKS5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQotCQlnZXRQYXJzZXIoKS5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCVN0cmluZyBzb3VyY2UgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0VGV4dCgpOwotCi0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dCh0aGlzLCAwLCBzb3VyY2UubGVuZ3RoKCksIG51bGwpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQodGhpcywgMCwgMCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJQ1NTTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCXBhcnNlci5jaGFuZ2VSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbik7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPbGRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TmV3UmVnaW9ucygpOwotCQlpZiAob2xkUmVnaW9ucyA9PSBudWxsICYmIG5ld1JlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQotCQlDU1NNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJcGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJcGFyc2VyLnJlcGxhY2VSZWdpb25zKGZsYXROb2RlLCBuZXdSZWdpb25zLCBvbGRSZWdpb25zKTsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbUVkaXQoKSB7Ci0JCWNsb3NlSW1wb3J0ZWQoKTsKLQkJaWYgKGdldFN0eWxlU2hlZXRUeXBlKCkgPT0gRVhURVJOQUwpIHsKLQkJCXN1cGVyLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCQljbG9zZUltcG9ydGVkKCk7Ci0JCWlmIChnZXRTdHlsZVNoZWV0VHlwZSgpID09IEVYVEVSTkFMKSB7Ci0JCQlzdXBlci5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmV2ZW50LkNTU1N0eWxlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5yZW1vdmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3U3RydWN0dXJlZERvY3VtZW50Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IHN1cGVyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXJldHVybjsgLy8gbm90aW5nIHRvIGRvCi0KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJb2xkU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQluZXdNb2RlbChuZXcgTmV3RG9jdW1lbnRFdmVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoaXMpKTsKLQkJfQotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQluZXdTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzcmNNb2RlbAotCSAqICAgICAgICAgICAgY29tLmltYi5zZWQuY3NzLm1vZGUuaW50ZWZhY2VzLklDU1NNb2RlbAotCSAqIEBwYXJhbSByZW1vdmVkCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqIEBwYXJhbSBhZGRlZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yW10KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZUNoYW5nZWQoSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5zdHlsZUNoYW5nZWQoc3JjTW9kZWwsIHJlbW92ZWQsIGFkZGVkLCBtZWRpYSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNyY01vZGVsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLnN0eWxlVXBkYXRlKHNyY01vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXZvaWQgdmFsdWVDaGFuZ2VkKENTU05vZGVJbXBsIG5vZGUsIFN0cmluZyBvbGRWYWx1ZSkgewotCQlpZiAoIWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUpIHsKLQkJCUNTU01vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0VXBkYXRlcigpOwotCQkJdXBkYXRlci52YWx1ZUNoYW5nZWQobm9kZSwgb2xkVmFsdWUpOwotCQl9Ci0KLQkJSUNTU1NlbGVjdG9yIHJlbW92ZWRbXSA9IG51bGwsIGFkZGVkW10gPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBub2RlKS5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgbm9kZTsKLQkJCQkvLyBjb2xsZWN0IGNoYW5nZWQgc2VsZWN0b3IKLQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChhdHRyLmdldFZhbHVlKCkpOwotCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCi0JCQkJLy8gZ2V0IG9sZCB2YWx1ZQotCQkJCWxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChvbGRWYWx1ZSk7Ci0JCQkJcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJCXJlbW92ZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgewotCQkJCUlDU1NOb2RlIHJ1bGUgPSBub2RlOwotCQkJCXdoaWxlIChydWxlICE9IG51bGwpIHsKLQkJCQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKQotCQkJCQkJYnJlYWs7Ci0JCQkJCXJ1bGUgPSBydWxlLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0JCQkJaWYgKHJ1bGUgIT0gbnVsbCkgewotCQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSAoKElDU1NTdHlsZVJ1bGUpIHJ1bGUpLmdldFNlbGVjdG9ycygpOwotCQkJCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVtb3ZlZCAhPSBudWxsIHx8IGFkZGVkICE9IG51bGwgfHwgZ2V0RG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJLy8gc2VuZCBzZWxlY3RvciBjaGFuZ2VkIGV2ZW50Ci0JCQlnZXRTdHlsZU5vdGlmaWVyKCkuZmlyZShyZW1vdmVkLCBhZGRlZCwgbnVsbCk7Ci0JCX0KLQkJLy8gZm9yIGhyZWYgYXR0cmlidXRlCi0JCWlmIChnZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwgJiYgZ2V0U3R5bGVMaXN0ZW5lcnMoKS5zaXplKCkgPiAwKSB7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbm9kZSkuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCSgoSUNTU0ltcG9ydFJ1bGUpICgoSUNTU0F0dHIpIG5vZGUpLmdldE93bmVyQ1NTTm9kZSgpKS5nZXRTdHlsZVNoZWV0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbE5vZGVGZWVkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxOb2RlRmVlZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNTBhOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbE5vZGVGZWVkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsTm9kZUZlZWRlciB7Ci0KLQlDU1NEb2N1bWVudEltcGwgZkRvY3VtZW50ID0gbnVsbDsKLQlDU1NNb2RlbFVwZGF0ZUNvbnRleHQgZlVwZGF0ZUNvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTTW9kZWxOb2RlRmVlZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxOb2RlRmVlZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU01vZGVsTm9kZUZlZWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU01vZGVsTm9kZUZlZWRlcihDU1NEb2N1bWVudEltcGwgZG9jdW1lbnQsIENTU01vZGVsVXBkYXRlQ29udGV4dCB1cGRhdGVDb250ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmVXBkYXRlQ29udGV4dCA9IHVwZGF0ZUNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTQ2hhcnNldFJ1bGVJbXBsIGdldENTU0NoYXJzZXRSdWxlKCkgewotCQlDU1NDaGFyc2V0UnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NDaGFyc2V0UnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NDaGFyc2V0UnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NDaGFyc2V0UnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0ZvbnRGYWNlUnVsZUltcGwgZ2V0Q1NTRm9udEZhY2VSdWxlKCkgewotCQlDU1NGb250RmFjZVJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTRm9udEZhY2VSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU0ZvbnRGYWNlUnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NGb250RmFjZVJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NJbXBvcnRSdWxlSW1wbCBnZXRDU1NJbXBvcnRSdWxlKCkgewotCQlDU1NJbXBvcnRSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU0ltcG9ydFJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTSW1wb3J0UnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NJbXBvcnRSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTWVkaWFSdWxlSW1wbCBnZXRDU1NNZWRpYVJ1bGUoKSB7Ci0JCUNTU01lZGlhUnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NNZWRpYVJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTTWVkaWFSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU01lZGlhUnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCBnZXRDU1NQYWdlUnVsZSgpIHsKLQkJQ1NTUGFnZVJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTUGFnZVJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTUGFnZVJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUGFnZVJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZVJ1bGVJbXBsIGdldENTU1N0eWxlUnVsZSgpIHsKLQkJQ1NTU3R5bGVSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU1N0eWxlUnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NTdHlsZVJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTU3R5bGVSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2MGM1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NSdWxlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ29yZU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsUGFyc2VyIHsKLQotCXByaXZhdGUgQ1NTRG9jdW1lbnRJbXBsIGZEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBmQ3JlYXRpb25Db250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsRGVsZXRpb25Db250ZXh0IGZEZWxldGlvbkNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IGZVcGRhdGVDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsTm9kZUZlZWRlciBmRmVlZGVyID0gbnVsbDsKLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudFdhbGtlciBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlBhcnNlRmxvYXRpbmcgPSBmYWxzZTsKLQotCS8qKgotCSAqIENTU01vZGVsUGFyc2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NNb2RlbFBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NNb2RlbFBhcnNlcihDU1NEb2N1bWVudEltcGwgZG9jKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQkJZkNyZWF0aW9uQ29udGV4dCA9IG5ldyBDU1NNb2RlbENyZWF0aW9uQ29udGV4dChkb2MpOwotCQlmRGVsZXRpb25Db250ZXh0ID0gbmV3IENTU01vZGVsRGVsZXRpb25Db250ZXh0KGRvYyk7Ci0JCWZVcGRhdGVDb250ZXh0ID0gbmV3IENTU01vZGVsVXBkYXRlQ29udGV4dCgpOwotCQlmRmVlZGVyID0gbmV3IENTU01vZGVsTm9kZUZlZWRlcihkb2MsIGZVcGRhdGVDb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ldyBDb3JlTm9kZUxpc3QoZmxhdE5vZGUsIGZsYXROb2RlKSwgbmV3IENvcmVOb2RlTGlzdChmbGF0Tm9kZSwgZmxhdE5vZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNoYW5nZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwgfHwgcmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZkRvY3VtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0ID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShmbGF0Tm9kZSk7Ci0JCWlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobmV4dCkgPT0gdHlwZSkgewotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlU3RhcnQoZmxhdE5vZGUuZ2V0RW5kKCkpOwotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlRW5kKG5leHQuZ2V0RW5kKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBEZWxldGlvbkNvbnRleHQoKSB7Ci0JCS8vIHNldHVwRGVsZXRpb25Db250ZXh0KG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gY2xlYW51cEZpcnN0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSwgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCkgewotCQlpZiAoZmlyc3ROb2RlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmaXJzdE5vZGUgPT0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldE5leHROb2RlSW5DdXJyZW50KGZpcnN0Tm9kZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChsYXN0Tm9kZSA9PSBudWxsIHx8IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaXNPbGROb2RlKGxhc3ROb2RlKSB8fCBuZXh0Tm9kZSA9PSBudWxsIHx8IGxhc3ROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBuZXh0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJdGFyZ2V0LnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwsIG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGFyZ2V0LnNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5leHROb2RlKTsKLQkJCX0KLQkJCUlDU1NOb2RlIHBhcmVudCA9IHRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJY2xlYW51cEZpcnN0Tm9kZShmaXJzdE5vZGUsIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBjbGVhbnVwTGFzdE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSwgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCkgewotCQlpZiAobGFzdE5vZGUgPT0gbnVsbCB8fCB0YXJnZXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGxhc3ROb2RlID09IHRhcmdldC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFByZXZOb2RlSW5DdXJyZW50KGxhc3ROb2RlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3ROb2RlID09IG51bGwgfHwgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUoZmlyc3ROb2RlKSB8fCBwcmV2Tm9kZSA9PSBudWxsIHx8IHByZXZOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBmaXJzdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCXRhcmdldC5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRhcmdldC5zZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHByZXZOb2RlKTsKLQkJCX0KLQkJCUlDU1NOb2RlIHBhcmVudCA9IHRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJY2xlYW51cExhc3ROb2RlKGxhc3ROb2RlLCAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBjbGVhbnVwVXBkYXRlQ29udGV4dCgpIHsKLQkJaW50IHJlbWFpbnMgPSBmVXBkYXRlQ29udGV4dC5nZXROb2RlQ291bnQoKTsKLQkJZlVwZGF0ZUNvbnRleHQuY2xlYW51cENvbnRleHQoKTsKLQkJcmV0dXJuIHJlbWFpbnM7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGZsb2F0aW5nIENTUyBydWxlIChvd25lciBkb2N1bWVudCB3aWxsIGJlIHNldCkgdGhpcyBpcyBmb3IKLQkgKiBDU1NTdHlsZVNoZWV0LmNyZWF0ZUNTU1J1bGUoU3RyaW5nKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gZmxhdE5vZGVzCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QKLQkgKi8KLQlDU1NSdWxlIGNyZWF0ZUNTU1J1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzKSB7Ci0JCWlmIChmbGF0Tm9kZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmUGFyc2VGbG9hdGluZyA9IHRydWU7Ci0KLQkJLy8gc2V0dXAgY3JlYXRpb24gY29udGV4dAotCQlmQ3JlYXRpb25Db250ZXh0LmNsZWFyKCk7Ci0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShudWxsKTsKLQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShudWxsKTsKLQkJQ1NTUnVsZUltcGwgcGFyZW50UnVsZSA9IG51bGw7Ci0KLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZmxhdE5vZGVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDU1NOb2RlSW1wbCBtb2RpZmllZCA9IGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlpZiAocGFyZW50UnVsZSA9PSBudWxsICYmIG1vZGlmaWVkIGluc3RhbmNlb2YgQ1NTUnVsZUltcGwpIHsKLQkJCQlwYXJlbnRSdWxlID0gKENTU1J1bGVJbXBsKSBtb2RpZmllZDsKLQkJCX0KLQkJfQotCi0JCWZQYXJzZUZsb2F0aW5nID0gZmFsc2U7Ci0KLQkJaWYgKHBhcmVudFJ1bGUgIT0gbnVsbCkgewotCQkJQ1NTTW9kZWxVdGlsLmNsZWFudXBDb250YWluZXIocGFyZW50UnVsZSk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50UnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZEJyYWNlQ2xvc2UoaW50IGRlcHRoLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0LCBib29sZWFuIGJCcmVha1NpYmxpbmcpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBudWxsOwotCQlpbnQgYnJhY2VMZXZlbCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHN0YXJ0LmdldE5leHQoKTsKLQkJZm9yICg7IHJlZ2lvbiAhPSBudWxsOyByZWdpb24gPSByZWdpb24uZ2V0TmV4dCgpKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldE5vZGVBdChvZmZzZXQpOwotCQkJaW50IGRlcHRoSGl0ID0gKG5vZGUgIT0gbnVsbCkgPyBDU1NNb2RlbFV0aWwuZ2V0RGVwdGgobm9kZSkgOiAtMTsKLQkJCWlmIChkZXB0aCA8PSBkZXB0aEhpdCkgewotCQkJCS8vIHNpYmxpbmcgaXMgZm91bmQgYmVmb3JlICJ9IgotCQkJCWlmIChiQnJlYWtTaWJsaW5nKSB7Ci0JCQkJCUNTU05vZGVJbXBsIHBhcmVudCA9IChDU1NOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCXdoaWxlIChkZXB0aCA8PSBDU1NNb2RlbFV0aWwuZ2V0RGVwdGgocGFyZW50KSkgewotCQkJCQkJbm9kZSA9IHBhcmVudDsKLQkJCQkJCXBhcmVudCA9IChDU1NOb2RlSW1wbCkgcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgbm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IHByZXZOb2RlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShyZWdpb24pOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCWJyYWNlTGV2ZWwrKzsKLQkJCX0KLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQlicmFjZUxldmVsLS07Ci0JCQkJaWYgKGJyYWNlTGV2ZWwgPCAwKSB7Ci0JCQkJCXJlc3VsdCA9IHJlZ2lvbjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcHJldk5vZGUgPSByZWdpb247Ci0JCX0KLQotCQlpZiAocmVzdWx0ID09IG51bGwgJiYgcmVnaW9uID09IG51bGwpIHsKLQkJCS8vIHJlYWNoIHRoZSBlbmQgb2YgZG9jdW1lbnQKLQkJCXJlc3VsdCA9IHByZXZOb2RlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5vZGVMaXN0ID0gbnVsbDsKLQkJaWYgKDAgPD0gc3RhcnQgJiYgc3RhcnQgPD0gZW5kKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSBmRG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIENTU01vZGVsSW1wbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKChDU1NNb2RlbEltcGwpIG1vZGVsKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kIC0gMSk7Ci0JCQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCAmJiBlbmROb2RlICE9IG51bGwpIHsKLQkJCQkJCW5vZGVMaXN0ID0gbmV3IENvcmVOb2RlTGlzdChzdGFydE5vZGUsIGVuZE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZ2V0Tm9kZUF0KGludCBvZmZzZXQpIHsKLQkJQ1NTTm9kZUltcGwgcm9vdE5vZGUgPSBmQ3JlYXRpb25Db250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCUlDU1NOb2RlIHRhcmdldCA9IHJvb3ROb2RlLmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTTm9kZUltcGwpIHRhcmdldDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRCcmFjZUNsb3NlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCUlDU1NOb2RlIHRhcmdldCA9IENTU01vZGVsVXRpbC5maW5kQnJhY2VDb250YWluZXIoZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCkpOwotCi0JCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHBhcmVudCA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHRhcmdldDsKLQkJaWYgKENTU01vZGVsVXRpbC5pc0ludGVycnVwdGlvbihwYXJlbnQsIHJlZ2lvbikpIHsKLQkJCUlDU1NOb2RlIG5vZGUgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZVN0YXJ0KHBhcmVudC5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VFbmQocGFyZW50LmdldEVuZE9mZnNldCgpKTsKLQkJCQkoKENTU05vZGVJbXBsKSBub2RlKS5yZW1vdmVDaGlsZChwYXJlbnQpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUNTU1BhZ2VSdWxlIHx8IHBhcmVudCBpbnN0YW5jZW9mIElDU1NNZWRpYVJ1bGUgfHwgcGFyZW50IGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8IHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCUNTU01vZGVsVXRpbC5leHBhbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIocGFyZW50LCByZWdpb24pOwotCQkJaWYgKCFDU1NNb2RlbFV0aWwuaXNCcmFjZUNsb3NlZCh0YXJnZXQpKSB7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHBhcmVudC5nZXRQYXJlbnROb2RlKCkpOwotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUocGFyZW50LmdldE5leHRTaWJsaW5nKCkpOwotCQkJCXJldHVybiBwYXJlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydEJyYWNlT3BlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGtleVJlZ2lvbiA9IENTU1V0aWwuZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCWlmIChrZXlSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCFmUGFyc2VGbG9hdGluZykgewotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldE5vZGVBdChrZXlSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmICEobm9kZSBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGtleVJlZ2lvbik7Ci0KLQkJQ1NTTm9kZUltcGwgaW5zZXJ0ZWQgPSBudWxsOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRQYWdlUnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0TWVkaWFSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0Rm9udEZhY2VSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChDU1NVdGlsLmlzU2VsZWN0b3JUZXh0KGtleVJlZ2lvbikpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0U3R5bGVSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCi0JCWlmIChpbnNlcnRlZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJLy8gQ1NTTW9kZWxVdGlsLmV4cGFuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKWluc2VydGVkLAotCQkJLy8gZmxhdE5vZGUpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZUNsb3NlID0gZmluZEJyYWNlQ2xvc2UoQ1NTTW9kZWxVdGlsLmdldERlcHRoKGluc2VydGVkKSwgcmVnaW9uLCAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpKTsKLQkJCWlmIChicmFjZUNsb3NlICE9IG51bGwpIHsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VTdGFydChyZWdpb24uZ2V0RW5kKCkpOwotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZUVuZChicmFjZUNsb3NlLmdldEVuZCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydENoYXJzZXRSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYmVnaW5Eb2NSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kRG9jUmVnaW9uKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChiZWdpbkRvY1JlZ2lvbi5nZXRSZWdpb25zKCkpOwotCQlyZWdpb25zLnJlbW92ZSgwKTsgLy8gbXVzdCBiZSAiQGNoYXJzZXQiCi0JCUlUZXh0UmVnaW9uIGVuY29kaW5nUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHJlZ2lvbnMucmVtb3ZlKDApOwotCQkJaWYgKHRleHRSZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSB0ZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcpIHsKLQkJCQllbmNvZGluZ1JlZ2lvbiA9IHRleHRSZWdpb247Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZW5jb2RpbmdSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NDaGFyc2V0UnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTQ2hhcnNldFJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCXJ1bGUuc2V0QXR0cmlidXRlKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORywgYmVnaW5Eb2NSZWdpb24uZ2V0VGV4dChlbmNvZGluZ1JlZ2lvbikpOwotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgZW5kRG9jUmVnaW9uKTsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IHJ1bGUuZ2V0QXR0cmlidXRlTm9kZShJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGJlZ2luRG9jUmVnaW9uLCBlbmNvZGluZ1JlZ2lvbiwgZW5jb2RpbmdSZWdpb24pOwotCQl9Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGZDcmVhdGlvbkNvbnRleHQgPT0gbnVsbCB8fCByZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9ICgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHJlZ2lvbikuZ2V0VHlwZSgpOwotCQlDU1NOb2RlSW1wbCBtb2RpZmllZCA9IG51bGw7Ci0KLQkJSUNTU05vZGUgdGFyZ2V0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0KLQkJaWYgKChmUGFyc2VGbG9hdGluZyAmJiB0YXJnZXQgPT0gbnVsbCkgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpIHsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCQltb2RpZmllZCA9IGluc2VydFNlbWlDb2xvbkZvclJ1bGUocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCW1vZGlmaWVkID0gaW5zZXJ0QnJhY2VPcGVuKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQltb2RpZmllZCA9IGluc2VydEJyYWNlQ2xvc2UocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFIHx8IENTU1V0aWwuaXNTZWxlY3RvclRleHQocmVnaW9uKSkgewotCQkJCWNoZWNrTmV4dE5vZGUocmVnaW9uLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUKSB7Ci0JCQkJY2hlY2tOZXh0Tm9kZShyZWdpb24sIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCh0YXJnZXQgaW5zdGFuY2VvZiBDU1NSdWxlRGVjbENvbnRhaW5lciB8fCB0YXJnZXQgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uKSAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSkgewotCQkJbW9kaWZpZWQgPSBpbnNlcnRTdHlsZURlY2xhcmF0aW9uSXRlbShyZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJbW9kaWZpZWQgPSBpbnNlcnRTZW1pQ29sb25Gb3JTdHlsZURlY2xhcmF0aW9uSXRlbShyZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJbW9kaWZpZWQgPSBpbnNlcnRCcmFjZUNsb3NlKHJlZ2lvbik7Ci0JCX0KLQotCQkvLyBwb3N0IHByb2Nlc3MKLQkJaWYgKG1vZGlmaWVkICE9IG51bGwpIHsKLQkJCWlmIChtb2RpZmllZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBtb2RpZmllZCkucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCByZWdpb25MaXN0KSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IHJlZ2lvbkxpc3QuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbik7Ci0JCQlpZiAoZkNyZWF0aW9uQ29udGV4dC5pc1RvUmVwYXJzZSgpKSB7Ci0JCQkJaW50IG9yaWdTdGFydCA9IHJlZ2lvbi5nZXRFbmQoKTsKLQkJCQlpbnQgb3JpZ0VuZCA9IHJlZ2lvbkxpc3QuaXRlbShyZWdpb25MaXN0LmdldExlbmd0aCgpIC0gMSkuZ2V0RW5kKCk7Ci0JCQkJaW50IG5ld1N0YXJ0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRSZXBhcnNlU3RhcnQoKTsKLQkJCQlpbnQgbmV3RW5kID0gZkNyZWF0aW9uQ29udGV4dC5nZXRSZXBhcnNlRW5kKCk7Ci0JCQkJaWYgKG5ld1N0YXJ0IDwgb3JpZ1N0YXJ0IHx8IG9yaWdFbmQgPCBuZXdFbmQpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3Tm9kZUxpc3QgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0KG5ld1N0YXJ0LCBuZXdFbmQpOwotCQkJCQlzZXR1cENyZWF0aW9uQ29udGV4dChuZXdOb2RlTGlzdC5pdGVtKDApKTsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdOb2RlTGlzdCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZDcmVhdGlvbkNvbnRleHQucmVzZXRSZXBhcnNlUmFuZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydEZvbnRGYWNlUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZU5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTRm9udEZhY2VSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NGb250RmFjZVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbiwgYnJhY2VOb2RlKTsKLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0SW1wb3J0UnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJlZ2luRG9jUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZERvY1JlZ2lvbikgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoYmVnaW5Eb2NSZWdpb24uZ2V0UmVnaW9ucygpKTsKLQkJcmVnaW9ucy5yZW1vdmUoMCk7IC8vIG11c3QgYmUgIkBpbXBvcnQiCi0JCUlUZXh0UmVnaW9uIGhyZWZSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoIXJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gcmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQlpZiAodGV4dFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHRleHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcpIHsKLQkJCQlocmVmUmVnaW9uID0gdGV4dFJlZ2lvbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChocmVmUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTSW1wb3J0UnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTSW1wb3J0UnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHJlZ2lvbnMpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhTGlzdCA9IChNZWRpYUxpc3RJbXBsKSBydWxlLmdldE1lZGlhKCk7Ci0JCXNldE1lZGlhTGlzdChtZWRpYUxpc3QsIGJlZ2luRG9jUmVnaW9uLCByZWdpb25zKTsKLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCXJ1bGUuc2V0QXR0cmlidXRlKElDU1NJbXBvcnRSdWxlLkhSRUYsIGJlZ2luRG9jUmVnaW9uLmdldFRleHQoaHJlZlJlZ2lvbikpOwotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgZW5kRG9jUmVnaW9uKTsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IHJ1bGUuZ2V0QXR0cmlidXRlTm9kZShJQ1NTSW1wb3J0UnVsZS5IUkVGKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgaHJlZlJlZ2lvbiwgaHJlZlJlZ2lvbik7Ci0JCX0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydE1lZGlhUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlTm9kZSkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NNZWRpYVJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU01lZGlhUnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCQlyZWdpb25zLnJlbW92ZSgwKTsgLy8gbXVzdCBiZSAiQG1lZGlhIgotCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHJlZ2lvbnMpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhTGlzdCA9IChNZWRpYUxpc3RJbXBsKSBydWxlLmdldE1lZGlhKCk7Ci0JCXNldE1lZGlhTGlzdChtZWRpYUxpc3QsIGZsYXROb2RlLCByZWdpb25zKTsKLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBicmFjZU5vZGUpOwotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRQYWdlUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlTm9kZSkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBnZXQgc2VsZWN0b3IgcmVnaW9ucwotCQlJVGV4dFJlZ2lvbkxpc3Qgc2VsZWN0b3JSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCQlzZWxlY3RvclJlZ2lvbnMucmVtb3ZlKDApOyAvLyBtdXN0IGJlICJAcGFnZSIKLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2Uoc2VsZWN0b3JSZWdpb25zKTsKLQotCQlDU1NQYWdlUnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTUGFnZVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCVN0cmluZyBzZWxlY3RvclN0ciA9IENTU1V0aWwuZ2V0UmVnaW9uVGV4dChmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zKTsKLQkJCWlmICgwIDwgc2VsZWN0b3JTdHIubGVuZ3RoKCkpIHsKLQkJCQlydWxlLnNldFNlbGVjdG9yVGV4dChzZWxlY3RvclN0cik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBicmFjZU5vZGUpOwotCQlDU1NBdHRySW1wbCBhdHRyID0gcnVsZS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NQYWdlUnVsZS5TRUxFQ1RPUik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgc2VsZWN0b3JSZWdpb25zICE9IG51bGwgJiYgIXNlbGVjdG9yUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZmxhdE5vZGUsIHNlbGVjdG9yUmVnaW9ucy5nZXQoMCksIHNlbGVjdG9yUmVnaW9ucy5nZXQoc2VsZWN0b3JSZWdpb25zLnNpemUoKSAtIDEpKTsKLQkJfQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTZW1pQ29sb25Gb3JSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ga2V5UmVnaW9uID0gQ1NTVXRpbC5maW5kUHJldmlvdXNTaWduaWZpY2FudE5vZGUocmVnaW9uKTsKLQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoa2V5UmVnaW9uKTsKLQotCQlDU1NOb2RlSW1wbCBpbnNlcnRlZCA9IG51bGw7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0SW1wb3J0UnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRDaGFyc2V0UnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gaW5zZXJ0ZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTZW1pQ29sb25Gb3JTdHlsZURlY2xhcmF0aW9uSXRlbShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQkvLyBvbmx5IHRhcmdldC9uZXQgbm9kZSBpcyBjaGFuZ2VkLiBub3RoaW5nIHRvIGRvLgotCi0JCUNTU05vZGVJbXBsIHRhcmdldE5vZGUgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJaW50IG9mZnNldCA9IHRhcmdldE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCS8vIHdpZGVuIGRvY3VtZW50IHJlZ2lvbiByYW5nZQotCQkJLy8gKChDU1NTdHlsZURlY2xJdGVtSW1wbCl0YXJnZXROb2RlKS5zZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbik7Ci0JCQlDU1NNb2RlbFV0aWwuZXhwYW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKChDU1NTdHlsZURlY2xJdGVtSW1wbCkgdGFyZ2V0Tm9kZSwgcmVnaW9uKTsKLQkJCS8vIHBzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluZGljYXRlcyBDU1NTdHlsZURlY2xJdGVtCi0JCQlJQ1NTTm9kZSBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocGFyZW50Tm9kZSk7Ci0JCQlJQ1NTTm9kZSBuZXh0ID0gbnVsbDsKLQkJCWlmIChwYXJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWZvciAoSUNTU05vZGUgY2hpbGQgPSB0YXJnZXROb2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciAmJiBvZmZzZXQgPCAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJCW5leHQgPSBjaGlsZDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQotCQkJcmV0dXJuIHRhcmdldE5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFN0eWxlRGVjbGFyYXRpb25JdGVtKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uKSB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHBhcmVudCA9IG51bGw7Ci0JCUNTU05vZGVJbXBsIG5vZGUgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlRGVjbENvbnRhaW5lcikgewotCQkJQ1NTUnVsZURlY2xDb250YWluZXIgZGVjbENvbnRhaW5lciA9IChDU1NSdWxlRGVjbENvbnRhaW5lcikgbm9kZTsKLQkJCXBhcmVudCA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgZGVjbENvbnRhaW5lci5nZXRTdHlsZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgewotCQkJcGFyZW50ID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBub2RlOwotCQl9Ci0KLQkJQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIGl0ZW1QYXJzZXIgPSBuZXcgQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyKHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpdGVtUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudFRlbXBvcmFyeShmYWxzZSk7Ci0JCWl0ZW1QYXJzZXIuc2V0VXBkYXRlQ29udGV4dChmVXBkYXRlQ29udGV4dCk7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGRlY2xJdGVtID0gaXRlbVBhcnNlci5zZXR1cERlY2xhcmF0aW9uSXRlbShkb2NSZWdpb24pOwotCQlpZiAoZGVjbEl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlkZWNsSXRlbS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2NSZWdpb24sIGRvY1JlZ2lvbik7Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIGRlY2xJdGVtKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShkZWNsSXRlbSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQoZGVjbEl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKGRlY2xJdGVtKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIGRlY2xJdGVtOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0U3R5bGVSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VOb2RlKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGdldCBzZWxlY3RvciByZWdpb25zCi0JCUlUZXh0UmVnaW9uTGlzdCBzZWxlY3RvclJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGZsYXROb2RlLmdldFJlZ2lvbnMoKSk7Ci0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHNlbGVjdG9yUmVnaW9ucyk7Ci0KLQkJQ1NTU3R5bGVSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NTdHlsZVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCVN0cmluZyBzZWxlY3RvclN0ciA9IENTU1V0aWwuZ2V0UmVnaW9uVGV4dChmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zKTsKLQkJCWlmIChzZWxlY3RvclN0ciAhPSBudWxsICYmIDAgPCBzZWxlY3RvclN0ci5sZW5ndGgoKSkgewotCQkJCXJ1bGUuc2V0U2VsZWN0b3JUZXh0KHNlbGVjdG9yU3RyKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGJyYWNlTm9kZSk7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBydWxlLmdldEF0dHJpYnV0ZU5vZGUoSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiBzZWxlY3RvclJlZ2lvbnMgIT0gbnVsbCAmJiAhc2VsZWN0b3JSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zLmdldCgwKSwgc2VsZWN0b3JSZWdpb25zLmdldChzZWxlY3RvclJlZ2lvbnMuc2l6ZSgpIC0gMSkpOwotCQl9Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHJ1bGUpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJldGVuZFJlbW92ZU5vZGUoKSB7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBub2RlID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZlVwZGF0ZUNvbnRleHQuZ2V0RGVsZXRpb25UYXJnZXQoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdE5vZGUgIT0gbnVsbCkgewotCQkJZkRlbGV0aW9uQ29udGV4dC5leHBhbmRSZW1vdmVkUmFuZ2VCZWdpbihmaXJzdE5vZGUpOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCWZEZWxldGlvbkNvbnRleHQuZXhwYW5kUmVtb3ZlZFJhbmdlRW5kKGxhc3ROb2RlKTsKLQkJfQotCi0JCXNocmlua0NvbnRhaW5lcigoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmVXBkYXRlQ29udGV4dC5nZXREZWxldGlvblRhcmdldFBhcmVudCgpLCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9wYWdhdGVSYW5nZVByZUluc2VydChDU1NOb2RlSW1wbCBwYXJlbnQsIENTU05vZGVJbXBsIGNoaWxkKSB7Ci0JCWlmICghKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnRDb250YWluZXIgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjaGlsZENvbnRhaW5lciA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IGNoaWxkQ29udGFpbmVyLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBjaGlsZENvbnRhaW5lci5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdE5vZGUgPT0gbnVsbCB8fCBsYXN0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGJNb2RpZmllZCA9IHBhcmVudENvbnRhaW5lci5pbmNsdWRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmlyc3ROb2RlLCBsYXN0Tm9kZSk7Ci0JCWlmIChiTW9kaWZpZWQpIHsKLQkJCXBhcmVudENvbnRhaW5lci5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCWRvIHsKLQkJCQlmbGF0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0UHJldk5vZGUoZmxhdE5vZGUpOwotCQkJCXR5cGUgPSAoZmxhdE5vZGUgIT0gbnVsbCkgPyBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpIDogbnVsbDsKLQkJCX0KLQkJCXdoaWxlICh0eXBlICE9IG51bGwgJiYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkpOwotCQl9Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiAoZkRlbGV0aW9uQ29udGV4dC5pc0luUmVtb3ZlZFJhbmdlKGZsYXROb2RlKSkgeyAvLyBhbHJlYWR5Ci0JCS8vIHJlbW92ZWQKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0KLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIG5vZGUgPSBmRGVsZXRpb25Db250ZXh0LmZpbmREZWxldGlvblRhcmdldChmRG9jdW1lbnQsIGZsYXROb2RlKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlID09IGZEb2N1bWVudCkgewotCQkJcmV0dXJuOyAvLyBub3QgYXR0YWNoZWQgd2l0aCBhbnkgdHJlZU5vZGUKLQkJfQotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIHsKLQkJCUlDU1NOb2RlIHJ1bGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChydWxlIGluc3RhbmNlb2YgQ1NTU3R5bGVSdWxlSW1wbCkgewotCQkJCW5vZGUgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBydWxlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gSUNTU05vZGUgcCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkvLyBpZiAocCA9PSBudWxsIHx8ICEgKHAgaW5zdGFuY2VvZgotCQkvLyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCQkvLyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50ID0KLQkJLy8gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcilwOwotCi0JCWlmIChmRGVsZXRpb25Db250ZXh0LmFkZE5vZGVUb0JlUmVtb3ZlZChub2RlKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3ROb2RlICE9IG51bGwpIHsKLQkJCQlmRGVsZXRpb25Db250ZXh0LmV4cGFuZFJlbW92ZWRSYW5nZUJlZ2luKGZpcnN0Tm9kZSk7Ci0JCQl9Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCWZEZWxldGlvbkNvbnRleHQuZXhwYW5kUmVtb3ZlZFJhbmdlRW5kKGxhc3ROb2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNocmlua0NvbnRhaW5lcihub2RlKTsKLQkJLy8gcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcykgewotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBmbGF0Tm9kZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQotCQlJdGVyYXRvciBpID0gZkRlbGV0aW9uQ29udGV4dC5nZXROb2Rlc1RvQmVSZW1vdmVkKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IChDU1NOb2RlSW1wbCkgaS5uZXh0KCk7Ci0JCQlpZiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gKENTU05vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXNocmlua0NvbnRhaW5lcigoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQsIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpOwotCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWlmIChmRG9jdW1lbnQgPT0gbnVsbCB8fCBmQ3JlYXRpb25Db250ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkpIHsKLQkJCXNldHVwRGVsZXRpb25Db250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQkJc2hvcnQgdXBkYXRlTW9kZSA9IGZVcGRhdGVDb250ZXh0LmdldFVwZGF0ZU1vZGUoKTsKLQkJCWlmICh1cGRhdGVNb2RlID09IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSURMRSkgewotCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcmV0ZW5kUmVtb3ZlTm9kZSgpOwotCQkJfQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QoZkRlbGV0aW9uQ29udGV4dC5nZXRSZW1vdmVkUmFuZ2VCZWdpbigpLCBmRGVsZXRpb25Db250ZXh0LmdldFJlbW92ZWRSYW5nZUVuZCgpKTsKLQkJCWNsZWFudXBEZWxldGlvbkNvbnRleHQoKTsKLQkJfQotCi0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkpIHsKLQkJCXNldHVwQ3JlYXRpb25Db250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSk7Ci0JCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQl9Ci0KLQkJLy8gbWFrZSBkb2N1bWVudCBob2xkIHdob2xlIHN0cnVjdHVyZWREb2N1bWVudAotCQkvKgotCQkgKiBib29sZWFuIGJVcGRhdGUgPSBmYWxzZTsgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJICogZmxhdE5vZGUgPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsgYlVwZGF0ZSA9Ci0JCSAqIGJVcGRhdGUgfHwgKGZsYXROb2RlID09IG51bGwgfHwKLQkJICogZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUoZmxhdE5vZGUpIHx8Ci0JCSAqIGZsYXROb2RlLmdldFByZXZpb3VzKCkgIT0gbnVsbCk7IGZsYXROb2RlID0KLQkJICogZkRvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsgYlVwZGF0ZSA9IGJVcGRhdGUgfHwKLQkJICogKGZsYXROb2RlID09IG51bGwgfHwgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUoZmxhdE5vZGUpIHx8Ci0JCSAqIGZsYXROb2RlLmdldE5leHQoKSAhPSBudWxsKTsKLQkJICovCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJZkRvY3VtZW50LnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJLyogfSAqLwotCi0JCS8vIHJlbW92ZSBpbiBvZmZpY2lhbCByZWxlYXNlCi0JCS8vIENTU01vZGVsVXRpbC5kaWFnbm9zZVRyZWUoZkRvY3VtZW50LAotCQkvLyBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlcGxhY2VSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChuZXdSZWdpb25zID09IG51bGwgfHwgb2xkUmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZEb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldENyZWF0aW9uVGFyZ2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCB8fCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA8PSAwKSB7Ci0JCQkvLyB0b3Agb2YgZG9jdW1lbnQKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShmRG9jdW1lbnQpOwotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShmRG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJQ1NTTm9kZUltcGwgY3Vyc29yTm9kZSA9IGdldE5vZGVBdChjdXJzb3JQb3MpOwotCQlpZiAoY3Vyc29yTm9kZSA9PSBudWxsKSB7IC8vIGVuZCBvZiBkb2N1bWVudAotCQkJY3Vyc29yTm9kZSA9IGZEb2N1bWVudDsKLQkJfQotCi0JCS8vIGZpbmQgZWRnZSBvZiB0cmVlIG5vZGUKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0JCS8vIGJvb2xlYW4gYk92ZXJTZW1pQ29sb24gPSBmYWxzZTsKLQkJYm9vbGVhbiBiT3Zlck9wZW5CcmFjZSA9IGZhbHNlOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQlmb3IgKGZsYXROb2RlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOyBmbGF0Tm9kZSAhPSBudWxsOyBmbGF0Tm9kZSA9IGZsYXROb2RlLmdldFByZXZpb3VzKCkpIHsKLQkJCW5vZGUgPSBnZXROb2RlQXQoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IGZEb2N1bWVudDsKLQkJCX0KLQkJCWlmIChub2RlICE9IGN1cnNvck5vZGUgfHwgbm9kZS5nZXRTdGFydE9mZnNldCgpID09IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChmbGF0Tm9kZSAhPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCQkJLy8gaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fAotCQkJCS8vIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCS8vIGJPdmVyU2VtaUNvbG9uID0gdHJ1ZTsKLQkJCQkvLyB9IGVsc2UKLQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJCWJPdmVyT3BlbkJyYWNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDU1NOb2RlSW1wbCB0YXJnZXROb2RlID0gbnVsbDsKLQotCQkvLyBpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkvLyB2PC0tfAotCQkvLyBBQUFBQUEKLQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkEgLCBub2RlOkIgLT4gdGFyZ2V0IGlzIEEKLQkJLy8gdGFyZ2V0Tm9kZSA9IChub2RlID09IG51bGwpID8gZkRvY3VtZW50IDogbm9kZTsKLQkJLy8gfSBlbHNlCi0JCWlmIChjdXJzb3JOb2RlID09IG5vZGUpIHsKLQkJCS8vIHY8LS18Ci0JCQkvLyBBQUFBQUEKLQkJCS8vIEJCQkJCQkJCQkIgY3Vyc29yTm9kZTpBICwgbm9kZTpCIC0+IHRhcmdldCBpcyBBCi0JCQlpZiAoYk92ZXJPcGVuQnJhY2UgJiYgY3Vyc29yTm9kZSBpbnN0YW5jZW9mIENTU1J1bGVEZWNsQ29udGFpbmVyKSB7Ci0JCQkJdGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgKChDU1NSdWxlRGVjbENvbnRhaW5lcikgY3Vyc29yTm9kZSkuZ2V0U3R5bGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRhcmdldE5vZGUgPSBjdXJzb3JOb2RlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gdjwtLXwKLQkJCS8vIEFBQQotCQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkIgLCBub2RlOkEgLT4gZGVwZW5kIG9uIEEncyBub2RlIHR5cGUKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5DSEFSU0VUUlVMRV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJCS8vIHRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpKChiT3ZlclNlbWlDb2xvbikgPwotCQkJCS8vIG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZSk7IC8vIE5QCi0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQkJCWlmIChyZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgcmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJCXRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJdGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0YXJnZXROb2RlID0gbm9kZTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZSh0YXJnZXROb2RlKTsKLQkJSUNTU05vZGUgbmV4dCA9IG51bGw7Ci0JCWlmICh0YXJnZXROb2RlLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHRhcmdldE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgJiYgY3Vyc29yUG9zIDwgKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCW5leHQgPSBjaGlsZDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRSZXBhcnNlUmFuZ2UoKSB7Ci0JCWZDcmVhdGlvbkNvbnRleHQuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyID09IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyKCk7Ci0JCX0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pbml0aWFsaXplKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiByZWdpb25zOiBzdXJyb3VuZGluZyBzcGFjZXMgc2hvdWxkIGJlIHJlbW92ZWQuIFEuIFdoeSBkaWQgeW91IHNldAotCSAqIG1lZGlhVGFibGUgPyBBLiBNZWRpYUxpc3QgbWF5IGhhdmUgdHdvIG9yIG1vcmUgbWVkaXVtIHRoYXQgaGF2ZSBzYW1lCi0JICogdmFsdWUsIHRoZW4gc2VhcmNpbmcgaW4gTWVkaWFMaXN0IGlzIG5vdCBwZXJmZWN0LiBRLgotCSAqIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgaXMgbm90IGNhcmUuIEFyZSB5b3UgT0s/IEEuIE9LLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZWRpYUxpc3QoTWVkaWFMaXN0SW1wbCBtZWRpYUxpc3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMpIHsKLQkJaWYgKG1lZGlhTGlzdCA9PSBudWxsIHx8IHRleHRSZWdpb25zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlDb2xsZWN0aW9uIG1lZGlhVGFibGUgPSBuZXcgSGFzaFNldCgpOwotCQlDU1NOb2RlTGlzdEltcGwgYXR0cnMgPSBtZWRpYUxpc3QuZ2V0TWVkaWEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgIT0gYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJbWVkaWFUYWJsZS5hZGQoYXR0cnMuaXRlbShpKSk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiBzdGFydCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGVuZCA9IG51bGw7Ci0KLQkJSXRlcmF0b3IgaSA9IHRleHRSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSAoSVRleHRSZWdpb24pICgoaS5oYXNOZXh0KCkpID8gaS5uZXh0KCkgOiBudWxsKTsKLQkJd2hpbGUgKHRleHRSZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJVU0pIHsKLQkJCQlTdHJpbmcgbWVkaXVtU3RyID0gcmVnaW9uLmdldFRleHQodGV4dFJlZ2lvbik7Ci0JCQkJaWYgKDAgPCBtZWRpdW1TdHIubGVuZ3RoKCkpIHsKLQkJCQkJQ1NTQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCQkJCS8vIGlzIHRoZSBtZWRpdW0gYWxyZWFkeSBzZXQgPwotCQkJCQlJdGVyYXRvciBpVGFibGUgPSBtZWRpYVRhYmxlLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpVGFibGUuaGFzTmV4dCgpKSB7Ci0JCQkJCQlDU1NBdHRySW1wbCBjYWkgPSAoQ1NTQXR0ckltcGwpIGlUYWJsZS5uZXh0KCk7Ci0JCQkJCQlpZiAobWVkaXVtU3RyLmVxdWFsc0lnbm9yZUNhc2UoY2FpLmdldFZhbHVlKCkpKSB7Ci0JCQkJCQkJYXR0ciA9IGNhaTsKLQkJCQkJCQltZWRpYVRhYmxlLnJlbW92ZShjYWkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChhdHRyID09IG51bGwpIHsKLQkJCQkJCS8vIGlzIG5vdCBzZXQuIGNyZWF0ZSBuZXcgYXR0cmlidXRlCi0JCQkJCQlTdHJpbmcga2V5ID0gIm1lZGl1bVAiICsgbWVkaWFMaXN0Lm1lZGl1bUNvdW50ZXIrKzsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbWVkaWFMaXN0LnNldEF0dHJpYnV0ZShrZXksIG1lZGl1bVN0cik7Ci0JCQkJCQlhdHRyID0gbWVkaWFMaXN0LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJCQkJfQotCQkJCQlhdHRyLnNldFJhbmdlUmVnaW9uKHJlZ2lvbiwgdGV4dFJlZ2lvbiwgdGV4dFJlZ2lvbik7Ci0JCQkJCWlmIChzdGFydCA9PSBudWxsKSB7Ci0JCQkJCQlzdGFydCA9IHRleHRSZWdpb247Ci0JCQkJCX0KLQkJCQkJZW5kID0gdGV4dFJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXh0UmVnaW9uID0gKElUZXh0UmVnaW9uKSAoKGkuaGFzTmV4dCgpKSA/IGkubmV4dCgpIDogbnVsbCk7Ci0JCX0KLQotCQlpZiAoc3RhcnQgIT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCQkJbWVkaWFMaXN0LnNldFJhbmdlUmVnaW9uKHJlZ2lvbiwgc3RhcnQsIGVuZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBDcmVhdGlvbkNvbnRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJcmVzZXRSZXBhcnNlUmFuZ2UoKTsKLQkJcmVzZXRDcmVhdGlvblRhcmdldChyZWdpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cERlbGV0aW9uQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWZEZWxldGlvbkNvbnRleHQuc2V0dXBDb250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0dXBVcGRhdGVDb250ZXh0KHNob3J0IHVwZGF0ZU1vZGUsIElDU1NOb2RlIHBhcmVudE5vZGUsIElDU1NOb2RlIHRhcmdldE5vZGUpIHsKLQkJZlVwZGF0ZUNvbnRleHQuc2V0dXBDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIHRhcmdldE5vZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2hyaW5rQ29udGFpbmVyKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQkJYk1vZGlmaWVkID0gYk1vZGlmaWVkIHx8IGNsZWFudXBMYXN0Tm9kZShjaGlsZC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHBhcmVudCk7Ci0JCWJNb2RpZmllZCA9IGJNb2RpZmllZCB8fCBjbGVhbnVwRmlyc3ROb2RlKGNoaWxkLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHBhcmVudCk7Ci0KLQkJaWYgKGJNb2RpZmllZCkgewotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJZm9yIChJQ1NTTm9kZSBub2RlID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChjaGlsZCAhPSBub2RlICYmIG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJY2hpbGQuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTAxOGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IHsKLQotCi0JY2xhc3MgQ1NTTm9kZVVwZGF0ZVRyYXZlcnNlciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQkJcHVibGljIENTU05vZGVVcGRhdGVUcmF2ZXJzZXIoKSB7Ci0JCQlzdXBlcigpOwotCQkJc2V0VHJhdmVyc2VJbXBvcnRlZChmYWxzZSk7Ci0JCQlzZXRUcmF2ZXJzZUltcG9ydEZpcnN0KGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyBMaW5rZWRMaXN0IGdldE5vZGVMaXN0KCkgewotCQkJcmV0dXJuIGZUcmF2Tm9kZUxpc3Q7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCQlmVHJhdk5vZGVMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgfHwgbm9kZSBpbnN0YW5jZW9mIENTU0F0dHJJbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKSB7Ci0JCQkJLy8gc2tpcAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlRyYXZOb2RlTGlzdC5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZUNvbnRhaW5lcikgewotCQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJCX0KLQkJfQotCi0JCUxpbmtlZExpc3QgZlRyYXZOb2RlTGlzdCA9IG51bGw7Ci0JfQotCi0JSUNTU05vZGUgZkxhc3ROb2RlID0gbnVsbDsKLQlJQ1NTTm9kZSBmRGVsZXRpb25UYXJnZXRQYXJlbnQgPSBudWxsOwotCUlDU1NOb2RlIGZEZWxldGlvblRhcmdldCA9IG51bGw7Ci0JTGlua2VkTGlzdCBmTm9kZUxpc3QgPSBudWxsOwotCXByaXZhdGUgc2hvcnQgZlVwZGF0ZU1vZGUgPSBVUERBVEVfSURMRTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0lETEUgPSAwOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfSU5TRVJUX0ZOQ09OVEFJTkVSID0gMTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSID0gMjsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUiA9IDM7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9SRU1PVkVfUkNPTlRBSU5FUiA9IDQ7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9DSEFOR0VfUkNPTlRBSU5FUiA9IDU7Ci0KLQkvKioKLQkgKiBDU1NOb2RlVXBkYXRlUXVldWUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbFVwZGF0ZUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjbGVhbnVwQ29udGV4dCgpIHsKLQkJZk5vZGVMaXN0ID0gbnVsbDsKLQkJZkRlbGV0aW9uVGFyZ2V0ID0gbnVsbDsKLQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gbnVsbDsKLQkJZlVwZGF0ZU1vZGUgPSBVUERBVEVfSURMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDb3VudGVySW1wbCBnZXRDb3VudGVyKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENvdW50ZXJJbXBsKSB7Ci0JCQlyZXR1cm4gKENvdW50ZXJJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ291bnRlckltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0NoYXJzZXRSdWxlSW1wbCBnZXRDU1NDaGFyc2V0UnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NDaGFyc2V0UnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTQ2hhcnNldFJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTQ2hhcnNldFJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NGb250RmFjZVJ1bGVJbXBsIGdldENTU0ZvbnRGYWNlUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU0ZvbnRGYWNlUnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NGb250RmFjZVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NJbXBvcnRSdWxlSW1wbCBnZXRDU1NJbXBvcnRSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0ltcG9ydFJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU0ltcG9ydFJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTSW1wb3J0UnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU01lZGlhUnVsZUltcGwgZ2V0Q1NTTWVkaWFSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTTWVkaWFSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU01lZGlhUnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCBnZXRDU1NQYWdlUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQYWdlUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTUGFnZVJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTUGFnZVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoc2hvcnQgdHlwZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSAoKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgbm9kZSkuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IHR5cGUgfHwgKChub2RlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIHx8IG5vZGVUeXBlID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUikgJiYgKHR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiB8fCB0eXBlID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUikpKSB7Ci0JCQkJcmV0dXJuIChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgbm9kZTsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBbIiArIHR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiXSBpcyBleHBlY3RlZCwgYnV0IHR5cGUgaXMgWyIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgKyAiXTogXCIiICsgdmFsdWUuZ2VuZXJhdGVTb3VyY2UoKSArICJcIiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQcmltaXRpdmVWYWx1ZUltcGwoIiArIHR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiKSBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJfQotCi0JCXVuZ2V0Tm9kZSgpOwotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGdldENTU1ByaW1pdGl2ZVZhbHVlQW55KCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJcmV0dXJuIChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQcmltaXRpdmVWYWx1ZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGdldENTU1N0eWxlRGVjbEl0ZW0oU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsICYmICgoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIG5vZGUpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIChDU1NTdHlsZURlY2xJdGVtSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1N0eWxlRGVjbEl0ZW1JbXBsKCIgKyBwcm9wZXJ0eU5hbWUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiKSBpcyBleHBlY3RlZCwgYnV0ICIgKyBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsvLyROT04tTkxTLTEkCi0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlUnVsZUltcGwgZ2V0Q1NTU3R5bGVSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTU3R5bGVSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1N0eWxlUnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlJQ1NTTm9kZSBnZXREZWxldGlvblRhcmdldCgpIHsKLQkJcmV0dXJuIGZEZWxldGlvblRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0RGVsZXRpb25UYXJnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBmRGVsZXRpb25UYXJnZXRQYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBJQ1NTTm9kZSBnZXROb2RlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGZOb2RlTGlzdCAhPSBudWxsICYmIDAgPCBmTm9kZUxpc3Quc2l6ZSgpKSB7Ci0JCQlub2RlID0gKElDU1NOb2RlKSBmTm9kZUxpc3QucmVtb3ZlRmlyc3QoKTsKLQkJfQotCQlmTGFzdE5vZGUgPSBub2RlOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0Tm9kZUNvdW50KCkgewotCQlpZiAoZk5vZGVMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiBmTm9kZUxpc3Quc2l6ZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gSUNTU05vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkvLyByZXR1cm4gZlBhcmVudE5vZGU7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCVJlY3RJbXBsIGdldFJlY3QoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgUmVjdEltcGwpIHsKLQkJCXJldHVybiAoUmVjdEltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJSZWN0SW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JUkdCQ29sb3JJbXBsIGdldFJHQkNvbG9yKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJHQkNvbG9ySW1wbCkgewotCQkJcmV0dXJuIChSR0JDb2xvckltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJSR0JDb2xvckltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRVcGRhdGVNb2RlKCkgewotCQlyZXR1cm4gZlVwZGF0ZU1vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIChmTm9kZUxpc3QgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXR1cENvbnRleHQoc2hvcnQgdXBkYXRlTW9kZSwgSUNTU05vZGUgcGFyZW50Tm9kZSwgSUNTU05vZGUgdGFyZ2V0Tm9kZSkgewotCQlmVXBkYXRlTW9kZSA9IHVwZGF0ZU1vZGU7Ci0KLQkJSUNTU05vZGUgdHJhdmVyc2VSb290OwotCQlpZiAodXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfQ0hBTkdFX1JDT05UQUlORVIpIHsKLQkJCXRyYXZlcnNlUm9vdCA9IHBhcmVudE5vZGU7Ci0JCQl3aGlsZSAodHJhdmVyc2VSb290IGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJdHJhdmVyc2VSb290ID0gdHJhdmVyc2VSb290LmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRyYXZlcnNlUm9vdCA9IHRhcmdldE5vZGU7Ci0JCX0KLQotCQlpZiAodXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgfHwgLy8gcmVnaW9uCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbnNlcnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vID0+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmbGF0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub2RlCi0JCQkJCXVwZGF0ZU1vZGUgPT0gVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUikgewotCQkJZkRlbGV0aW9uVGFyZ2V0ID0gdHJhdmVyc2VSb290OwotCQkJaWYgKGZEZWxldGlvblRhcmdldCA9PSB0YXJnZXROb2RlKSB7Ci0JCQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gcGFyZW50Tm9kZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZEZWxldGlvblRhcmdldFBhcmVudCA9IGZEZWxldGlvblRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmRGVsZXRpb25UYXJnZXQgPSBudWxsOwotCQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gbnVsbDsKLQkJfQotCi0JCWlmICh1cGRhdGVNb2RlID09IFVQREFURV9JTlNFUlRfUkNPTlRBSU5FUiB8fCB1cGRhdGVNb2RlID09IFVQREFURV9JTlNFUlRfRk5DT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgLy8gcmVnaW9uCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlbW92ZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyA9PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByZS1pbnNlcnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmxhdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub2RlCi0JCQkJCXVwZGF0ZU1vZGUgPT0gVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSKSB7Ci0JCQlDU1NOb2RlVXBkYXRlVHJhdmVyc2VyIHRyYXZlcnNlciA9IG5ldyBDU1NOb2RlVXBkYXRlVHJhdmVyc2VyKCk7Ci0JCQl0cmF2ZXJzZXIuYXBwbHkodHJhdmVyc2VSb290KTsKLQkJCWZOb2RlTGlzdCA9IHRyYXZlcnNlci5nZXROb2RlTGlzdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZk5vZGVMaXN0ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmdldE5vZGUoKSB7Ci0JCWlmIChmTm9kZUxpc3QgIT0gbnVsbCAmJiBmTGFzdE5vZGUgIT0gbnVsbCkgewotCQkJZk5vZGVMaXN0LmFkZEZpcnN0KGZMYXN0Tm9kZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTc0MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQXR0ckNoYW5nZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxVcGRhdGVyIHsKLQotCXByaXZhdGUgQ1NTTW9kZWxJbXBsIGZNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbFBhcnNlciBmUGFyc2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENTU01vZGVsVXBkYXRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU01vZGVsVXBkYXRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NNb2RlbFVwZGF0ZXIoQ1NTTW9kZWxJbXBsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGF0dHJJbnNlcnRlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NBdHRySW1wbCBhdHRyKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKHBhcmVudE5vZGUpOwotCi0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ2Fubm90IGdldCBmb3JtYXQgYWRhcHRlciA6ICIgKyBwYXJlbnROb2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2hvcnQgdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSU5TRVJUX1JDT05UQUlORVI7Ci0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIGF0dHIpOwotCi0JCS8vIGdldCBmb3JtYXR0ZWQgaW5mbwotCQlBdHRyQ2hhbmdlQ29udGV4dCByZWdpb24gPSBuZXcgQXR0ckNoYW5nZUNvbnRleHQoKTsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKGZvcm1hdHRlci5mb3JtYXRBdHRyQ2hhbmdlZChwYXJlbnROb2RlLCBhdHRyLCB0cnVlLCByZWdpb24pKTsKLQotCQkvLyBzZXQgdGV4dAotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBpbnNlcnRUZXh0KHJlZ2lvbi5zdGFydCwgcmVnaW9uLmVuZCAtIHJlZ2lvbi5zdGFydCwgdGV4dCk7Ci0KLQkJaW50IG5SZW1haW5zID0gZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCWlmICgwIDwgblJlbWFpbnMgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgdm9pZCBhdHRyUmVtb3ZlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NBdHRySW1wbCBhdHRyKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKHBhcmVudE5vZGUpOwotCi0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ2Fubm90IGdldCBmb3JtYXQgYWRhcHRlciA6ICIgKyBwYXJlbnROb2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2hvcnQgdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfUkVNT1ZFX1JDT05UQUlORVI7Ci0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIGF0dHIpOwotCi0JCS8vIGdldCBmb3JtYXR0ZWQgaW5mbwotCQlBdHRyQ2hhbmdlQ29udGV4dCByZWdpb24gPSBuZXcgQXR0ckNoYW5nZUNvbnRleHQoKTsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKGZvcm1hdHRlci5mb3JtYXRBdHRyQ2hhbmdlZChwYXJlbnROb2RlLCBhdHRyLCBmYWxzZSwgcmVnaW9uKSk7Ci0KLQkJLy8gc2V0IHRleHQKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gaW5zZXJ0VGV4dChyZWdpb24uc3RhcnQsIHJlZ2lvbi5lbmQgLSByZWdpb24uc3RhcnQsIHRleHQpOwotCi0JCWludCBuUmVtYWlucyA9IGZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQotCQlpZiAoMCA8IG5SZW1haW5zICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhdHRyUmVwbGFjZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbmV3QXR0ciwgQ1NTTm9kZUltcGwgb2xkQXR0cikgewotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2xkQXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyUmVtb3ZlZChwYXJlbnROb2RlLCAoQ1NTQXR0ckltcGwpIG9sZEF0dHIpOwotCQl9Ci0KLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJYXR0ckluc2VydGVkKHBhcmVudE5vZGUsIChDU1NBdHRySW1wbCkgbmV3QXR0cik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hpbGRJbnNlcnRlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lETEU7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCXVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lOU0VSVF9GTkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQl1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JTlNFUlRfUkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIldoYXQncyB0aGlzIG5vZGU/IDogIiArIG5vZGUuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBub2RlKTsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBkZWZhdWx0SW5zZXJ0ZWQocGFyZW50Tm9kZSwgbm9kZSk7Ci0KLQkJaW50IG5SZW1haW5zID0gZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCWlmICgwIDwgblJlbWFpbnMgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hpbGRSZW1vdmVkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5vZGUpIHsKLQkJc2hvcnQgdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSURMRTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfUkVNT1ZFX0ZOQ09OVEFJTkVSOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCXVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiV2hhdCdzIHRoaXMgbm9kZT8gOiAiICsgbm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIG5vZGUpOwotCi0JCUNTU05vZGVJbXBsIHByZXYgPSBnZXRPbGRQcmV2aW91cyhwYXJlbnROb2RlLCBub2RlKTsKLQkJQ1NTTm9kZUltcGwgbmV4dCA9IGdldE9sZE5leHQocGFyZW50Tm9kZSwgbm9kZSk7Ci0JCWludCBpbnNlcnRQb3MgPSAtMSwgZW5kUG9zID0gLTE7Ci0JCVN0cmluZyBzb3VyY2UgPSAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCWluc2VydFBvcyA9IHByZXYuZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnNlcnRQb3MgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnNlcnRQb3MgLT0gbmVhcmVzdFNwYWNlTGVuZ3RoQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydFBvcyk7Ci0JCX0KLQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJZW5kUG9zID0gbmV4dC5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZW5kUG9zID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCWVuZFBvcyArPSBuZWFyZXN0U3BhY2VMZW5ndGhBZnRlcihwYXJlbnROb2RlLCBlbmRQb3MpOwotCQl9Ci0JCXNvdXJjZSA9IGdldFNwYWNlQmVmb3JlKHBhcmVudE5vZGUsIG5leHQsIG5vZGUpOwotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQ7Ci0JCWlmIChzb3VyY2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXN1bHQgPSBpbnNlcnRUZXh0KGluc2VydFBvcywgZW5kUG9zIC0gaW5zZXJ0UG9zLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gcmVtb3ZlVGV4dChpbnNlcnRQb3MsIGVuZFBvcyAtIGluc2VydFBvcyk7Ci0JCX0KLQotCQlpbnQgblJlbWFpbnMgPSBmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0KLQkJaWYgKDAgPCBuUmVtYWlucyAmJiAhKHJlc3VsdCBpbnN0YW5jZW9mIE5vQ2hhbmdlRXZlbnQpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCQkKLQkJfQotCi0JCS8qCi0JCSAqIGludCByZW1vdmVTdGFydCA9IC0xOyBpbnQgcmVtb3ZlRW5kID0gLTE7IGlmIChub2RlIGluc3RhbmNlb2YKLQkJICogQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCSAqIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPQotCQkgKiAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKW5vZGU7Ci0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0KLQkJICogY29udGFpbmVyLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPQotCQkgKiBjb250YWluZXIuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOyBpZiAoZmlyc3ROb2RlICE9IG51bGwgJiYKLQkJICogbGFzdE5vZGUgIT0gbnVsbCkgeyByZW1vdmVTdGFydCA9IGZpcnN0Tm9kZS5nZXRTdGFydCgpOyByZW1vdmVFbmQgPQotCQkgKiBsYXN0Tm9kZS5nZXRFbmQoKTsgfSB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJICogQ1NTUmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChDU1NSZWdpb25Db250YWluZXIpbm9kZTsKLQkJICogSVRleHRSZWdpb24gZmlyc3RSZWdpb24gPSBjb250YWluZXIuZ2V0Rmlyc3RSZWdpb24oKTsgSVRleHRSZWdpb24KLQkJICogbGFzdFJlZ2lvbiA9IGNvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCk7IGlmIChmaXJzdFJlZ2lvbiAhPSBudWxsICYmCi0JCSAqIGxhc3RSZWdpb24gIT0gbnVsbCkgeyByZW1vdmVTdGFydCA9IGZpcnN0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCSAqIHJlbW92ZUVuZCA9IGxhc3RSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7IH0gfSBpZiAoMCA8PSByZW1vdmVTdGFydCAmJgotCQkgKiAwIDw9IHJlbW92ZUVuZCkgeyByZW1vdmVUZXh0KHJlbW92ZVN0YXJ0LCByZW1vdmVFbmQgLSByZW1vdmVTdGFydCArCi0JCSAqIDEpOyB9Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2hpbGRSZXBsYWNlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9sZENoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkUmVtb3ZlZChwYXJlbnROb2RlLCBvbGRDaGlsZCk7Ci0JCX0KLQotCQlpZiAobmV3Q2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGRJbnNlcnRlZChwYXJlbnROb2RlLCBuZXdDaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGRlZmF1bHRJbnNlcnRlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCWludCBpbnNlcnRQb3MgPSAtMTsKLQkJSUNTU05vZGUgc2libGluZzsKLQkJU3RyaW5nIHByZVNwYWNlID0gIiIsIHBvc3RTcGFjZSA9ICIiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSAwOwotCi0JCWlmIChpbnNlcnRQb3MgPCAwKSB7Ci0JCQlpZiAoKHNpYmxpbmcgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpKSAhPSBudWxsKSB7Ci0JCQkJLy8gYWZ0ZXIgcHJldmlvdXMgY2hpbGQKLQkJCQlpbnNlcnRQb3MgPSBnZXRUZXh0RW5kKHNpYmxpbmcpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGluc2VydFBvcyA8IDApIHsKLQkJCWlmICgoc2libGluZyA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgIT0gbnVsbCkgewotCQkJCS8vIGJlZm9yZSBuZXh0IGNoaWxkCi0JCQkJaW5zZXJ0UG9zID0gZ2V0VGV4dFN0YXJ0KHNpYmxpbmcpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGluc2VydFBvcyA8IDApIHsKLQkJCS8vIHBvc2l0aW9uIG9mIHBhcmVudAotCQkJaW5zZXJ0UG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3MocGFyZW50Tm9kZSk7Ci0JCX0KLQotCQlpZiAoaW5zZXJ0UG9zIDwgMCkgewotCQkJLy8gZmlyc3R0aW1lCi0JCQlpbnNlcnRQb3MgPSAwOwotCQl9Ci0KLQkJLy8gZm9ybWF0IHByZXZpb3VzIHNwYWNlcwotCQlsZW5ndGggPSBuZWFyZXN0U3BhY2VMZW5ndGhCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0UG9zKTsKLQkJaW5zZXJ0UG9zIC09IGxlbmd0aDsKLQkJcHJlU3BhY2UgPSBnZXRTcGFjZUJlZm9yZShwYXJlbnROb2RlLCBub2RlLCBudWxsKTsKLQkJLy8gZm9ybWF0IHBvc3Qgc3BhY2VzCi0JCWxlbmd0aCArPSBuZWFyZXN0U3BhY2VMZW5ndGhBZnRlcihwYXJlbnROb2RlLCBpbnNlcnRQb3MgKyBsZW5ndGgpOwotCQlwb3N0U3BhY2UgPSBnZXRTcGFjZUJlZm9yZShwYXJlbnROb2RlLCBub2RlLmdldE5leHRTaWJsaW5nKCksIG51bGwpOwotCi0JCS8vIHNldCB0ZXh0Ci0JCVN0cmluZyB0ZXh0ID0gcHJlU3BhY2UgKyBub2RlLmdlbmVyYXRlU291cmNlKCkudHJpbSgpICsgcG9zdFNwYWNlOwotCQlyZXR1cm4gaW5zZXJ0VGV4dChpbnNlcnRQb3MsIGxlbmd0aCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoQ1NTTm9kZUltcGwgbm9kZSkgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub2RlKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGZvcm1hdHRlci5nZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHJpdmF0ZSBpbnQgZ2V0RG9jdW1lbnRFbmQoKSB7Ci0JLy8gaW50IGVuZCA9IC0xOwotCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0KLQkvLyBmTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JLy8gaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JLy8gaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mCi0JLy8gY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LmltcGwuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkvLyBlbmQgPQotCS8vICgoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LmltcGwuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpc3RydWN0dXJlZERvY3VtZW50KS5nZXRMZW5ndGgoKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBlbmQ7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JLy8gcmV0dXJuIChmTW9kZWwgIT0gbnVsbCkgPyBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSA6IG51bGw7Ci0JLy8gfQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGdldE9sZE5leHQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlDU1NOb2RlSW1wbCBjaGlsZCA9IChDU1NOb2RlSW1wbCkgcGFyZW50Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJQ1NTTm9kZUltcGwgcmV0ID0gbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldEVuZE9mZnNldCgpIDwgY2hpbGQuZ2V0RW5kT2Zmc2V0KCkpCi0JCQkJcmV0ID0gY2hpbGQ7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCQljaGlsZCA9IChDU1NOb2RlSW1wbCkgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBnZXRPbGRQcmV2aW91cyhDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCUNTU05vZGVJbXBsIGNoaWxkID0gKENTU05vZGVJbXBsKSBwYXJlbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJQ1NTTm9kZUltcGwgcmV0ID0gbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKQotCQkJCXJldCA9IGNoaWxkOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQkJY2hpbGQgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNwYWNlQmVmb3JlKElDU1NOb2RlIHBhcmVudE5vZGUsIElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIHRvUmVtb3ZlKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBwYXJlbnROb2RlKTsKLQotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBleGNlcHRGb3IgPSBudWxsOwotCQkJaWYgKHRvUmVtb3ZlICE9IG51bGwpIHsKLQkJCQlDU1NOb2RlSW1wbCByZW1vdmUgPSAoQ1NTTm9kZUltcGwpIHRvUmVtb3ZlOwotCQkJCWV4Y2VwdEZvciA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbihyZW1vdmUuZ2V0U3RhcnRPZmZzZXQoKSwgcmVtb3ZlLmdldEVuZE9mZnNldCgpIC0gcmVtb3ZlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRCZWZvcmUocGFyZW50Tm9kZSwgbm9kZSwgZXhjZXB0Rm9yKS50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dEVuZChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBlbmQgPSAtMTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQllbmQgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJZW5kID0gKChDU1NSZWdpb25Db250YWluZXIpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dFN0YXJ0KElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJc3RhcnQgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCQlzdGFydCA9ICgoQ1NTUmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGluc2VydFRleHQoaW50IHN0YXJ0LCBpbnQgb2xkTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodGV4dCAhPSBudWxsICYmIDAgPCBvbGRMZW5ndGggJiYgc3RhcnQgKyBvbGRMZW5ndGggPD0gc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJLy8gbWluaW1pemUgdGV4dCBjaGFuZ2UKLQkJCQlTdHJpbmcgZGVsVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnQsIG9sZExlbmd0aCk7Ci0JCQkJaW50IG5ld0xlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0JCQkJaW50IHNob3J0ZXJMZW4gPSBNYXRoLm1pbihvbGRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JCQkJaW50IHN0TWF0Y2hMZW47Ci0JCQkJZm9yIChzdE1hdGNoTGVuID0gMDsgc3RNYXRjaExlbiA8IHNob3J0ZXJMZW4gJiYgdGV4dC5jaGFyQXQoc3RNYXRjaExlbikgPT0gZGVsVGV4dC5jaGFyQXQoc3RNYXRjaExlbik7IHN0TWF0Y2hMZW4rKykgewotCQkJCQkvLyAKLQkJCQl9Ci0JCQkJaWYgKDAgPCBzdE1hdGNoTGVuICYmIHN0TWF0Y2hMZW4gPCBzaG9ydGVyTGVuICYmIHRleHQuY2hhckF0KHN0TWF0Y2hMZW4gLSAxKSA9PSAweDAwMGQgJiYgKHRleHQuY2hhckF0KHN0TWF0Y2hMZW4pID09IDB4MDAwYSB8fCBkZWxUZXh0LmNoYXJBdChzdE1hdGNoTGVuKSA9PSAweDAwMGEpKSB7Ci0JCQkJCS8vIG11c3Qgbm90IGRpdmlkZSAwZC0+MGEgc2VxdWVuY2UKLQkJCQkJc3RNYXRjaExlbi0tOwotCQkJCX0KLQkJCQlpZiAoc3RNYXRjaExlbiA9PSBzaG9ydGVyTGVuKSB7Ci0JCQkJCWlmIChvbGRMZW5ndGggPCBuZXdMZW5ndGgpIHsgLy8ganVzdCBpbnNlcnQKLQkJCQkJCW9sZExlbmd0aCA9IDA7Ci0JCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKHN0TWF0Y2hMZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG5ld0xlbmd0aCA8IG9sZExlbmd0aCkgeyAvLyBqdXN0IHJlbW92ZQotCQkJCQkJb2xkTGVuZ3RoIC09IHN0TWF0Y2hMZW47Ci0JCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7IC8vIG5vdGhpbmcgdG8gZG8KLQkJCQkJCW9sZExlbmd0aCA9IDA7Ci0JCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW50IGVkTWF0Y2hMZW47Ci0JCQkJCWZvciAoZWRNYXRjaExlbiA9IDA7IHN0TWF0Y2hMZW4gKyBlZE1hdGNoTGVuIDwgc2hvcnRlckxlbiAmJiB0ZXh0LmNoYXJBdChuZXdMZW5ndGggLSBlZE1hdGNoTGVuIC0gMSkgPT0gZGVsVGV4dC5jaGFyQXQob2xkTGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpOyBlZE1hdGNoTGVuKyspIHsKLQkJCQkJCS8vCi0JCQkJCX0KLQkJCQkJaWYgKDAgPCBlZE1hdGNoTGVuICYmIHRleHQuY2hhckF0KG5ld0xlbmd0aCAtIGVkTWF0Y2hMZW4pID09IDB4MDAwYSAmJiAoKGVkTWF0Y2hMZW4gPCBuZXdMZW5ndGggJiYgdGV4dC5jaGFyQXQobmV3TGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpID09IDB4MDAwZCkgfHwgKGVkTWF0Y2hMZW4gPCBvbGRMZW5ndGggJiYgZGVsVGV4dC5jaGFyQXQob2xkTGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpID09IDB4MDAwZCkpKSB7Ci0JCQkJCQkvLyBtdXN0IG5vdCBkaXZpZGUgMGQtPjBhIHNlcXVlbmNlCi0JCQkJCQllZE1hdGNoTGVuLS07Ci0JCQkJCX0KLQkJCQkJb2xkTGVuZ3RoIC09IHN0TWF0Y2hMZW4gKyBlZE1hdGNoTGVuOwotCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQlpZiAoc3RNYXRjaExlbiArIGVkTWF0Y2hMZW4gPCBuZXdMZW5ndGgpIHsKLQkJCQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZyhzdE1hdGNoTGVuLCBuZXdMZW5ndGggLSBlZE1hdGNoTGVuKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXRleHQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKDAgPCBvbGRMZW5ndGggfHwgdGV4dCAhPSBudWxsKSB7Ci0JCQkJLy8gU3RyaW5nIGRlbFRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0LCBvbGRMZW5ndGgpOwotCQkJCXJlc3VsdCA9IHN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChmTW9kZWwsIHN0YXJ0LCBvbGRMZW5ndGgsIHRleHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcml2YXRlIGludCBuZWFyZXN0U3BhY2VMZW5ndGhBZnRlcihDU1NOb2RlSW1wbCBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vZGUpOwotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBmb3JtYXR0ZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKG5vZGUsIGluc2VydFBvcyk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcml2YXRlIGludCBuZWFyZXN0U3BhY2VMZW5ndGhCZWZvcmUoQ1NTTm9kZUltcGwgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub2RlKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUobm9kZSwgaW5zZXJ0UG9zKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlbW92ZVRleHQoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChmTW9kZWwsIHN0YXJ0LCBsZW5ndGgsIG5ldyBTdHJpbmcoIiIpKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFBhcnNlcihDU1NNb2RlbFBhcnNlciBwYXJzZXIpIHsKLQkJZlBhcnNlciA9IHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHZhbHVlQ2hhbmdlZChDU1NOb2RlSW1wbCBub2RlLCBTdHJpbmcgb2xkVmFsdWUpIHsKLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIlRvbyBCYWQuLiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkoKG5vZGUgPT0gbnVsbCkgPyAibnVsbCIgOiBub2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzdGFydCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZTsKLQkJCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBhdHRyLmdldE93bmVyQ1NTTm9kZSgpKTsKLQkJCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCQlzdGFydCA9IGZvcm1hdHRlci5nZXRBdHRySW5zZXJ0UG9zKGF0dHIuZ2V0T3duZXJDU1NOb2RlKCksIGF0dHIuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCWludCBvbGRMZW5ndGggPSAob2xkVmFsdWUgPT0gbnVsbCkgPyAwIDogb2xkVmFsdWUubGVuZ3RoKCk7Ci0JCS8vIGZsYXNoIG9sZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uL0lUZXh0UmVnaW9uCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1JlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0UmFuZ2VSZWdpb24obnVsbCwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgbmV3IHNvdXJjZQotCQlTdHJpbmcgbmV3VmFsdWUgPSBub2RlLmdlbmVyYXRlU291cmNlKCk7Ci0KLQkJSUNTU05vZGUgcGFyZW50OwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSkgewotCQkJcGFyZW50ID0gKChJQ1NTQXR0cikgbm9kZSkuZ2V0T3duZXJDU1NOb2RlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCi0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfQ0hBTkdFX1JDT05UQUlORVIsIHBhcmVudCwgbm9kZSk7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gaW5zZXJ0VGV4dChzdGFydCwgb2xkTGVuZ3RoLCBuZXdWYWx1ZSk7Ci0KLQkJaW50IG5SZW1haW5zID0gZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCWlmICgwIDwgblJlbWFpbnMgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAkJCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZWZkODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTUnVsZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNb2RlbFV0aWwgewotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gY2FuQ29udGFpbkJyYWNlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlICE9IG51bGwgJiYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lciB8fCBub2RlIGluc3RhbmNlb2YgQ1NTUnVsZURlY2xDb250YWluZXIpKSA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXN0YXRpYyB2b2lkIGNsZWFudXBDb250YWluZXIoSUNTU05vZGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWNsZWFudXBDb250YWluZXIoY2hpbGQpOwotCQl9Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJKChDU1NSZWdpb25Db250YWluZXIpIHBhcmVudCkuc2V0UmFuZ2VSZWdpb24obnVsbCwgbnVsbCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCXN0YXRpYyBib29sZWFuIGRpYWdub3NlTm9kZShJQ1NTTm9kZSBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCS8vIGNoZWNrIHRoaXMKLQkJVmVjdG9yIGVycm9ycyA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIG5vZGUgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCQlTdHJpbmcgbm9kZVRleHQgPSBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpICsgIjogIjsvLyROT04tTkxTLTEkCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwgJiYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0SW1wbCkgfHwgbm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkpIHsKLQkJCQllcnJvcnMuYWRkKENTU0NvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiUxY29uY2F0X0VSUk9SXyIsIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWZpcnN0IGZsYXQgbm9kZSBpcyBudWxsLiIKLQkJCX0KLQkJCWVsc2UgaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbW9kZWxOb2RlKSB7Ci0JCQkJCWVycm9ycy5hZGQoQ1NTQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJTJjb25jYXRfRVJST1JfIiwgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgZmxhdCBub2RlIGlzIG5vdCBpbiBtb2RlbC4iCi0JCQkJfQotCQkJfQotCQkJZmxhdE5vZGUgPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsICYmICghKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCB8fCBub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldEltcGwpIHx8IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpKSB7Ci0JCQkJZXJyb3JzLmFkZChDU1NDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlM2NvbmNhdF9FUlJPUl8iLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IGZsYXQgbm9kZSBpcyBudWxsLiIKLQkJCX0KLQkJCWVsc2UgaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbW9kZWxOb2RlKSB7Ci0JCQkJCWVycm9ycy5hZGQoQ1NTQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJTRjb25jYXRfRVJST1JfIiwgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9bGFzdCBmbGF0IG5vZGUgaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlDU1NSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NSZWdpb25Db250YWluZXIpIHBhcmVudDsKLQkJCVN0cmluZyBub2RlVGV4dCA9IENTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkgKyAiOiAiOy8vJE5PTi1OTFMtMSQKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGUuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50UmVnaW9uID0gbm9kZS5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmICghKG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQoQ1NTQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJTI1Y29uY2F0X0VSUk9SXyIsIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWZpcnN0IHJlZ2lvbiBpcyBudWxsLiIKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb24gbW9kZWxSZWdpb24gPSBtb2RlbE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uICE9IG1vZGVsUmVnaW9uKSB7Ci0JCQkJCWVycm9ycy5hZGQoQ1NTQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJTI2Y29uY2F0X0VSUk9SXyIsIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWZpcnN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJCXJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmICghKG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQoQ1NTQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJTI3Y29uY2F0X0VSUk9SXyIsIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWxhc3QgcmVnaW9uIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbiBtb2RlbFJlZ2lvbiA9IG1vZGVsTm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbW9kZWxSZWdpb24pIHsKLQkJCQkJZXJyb3JzLmFkZChDU1NDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlMjhjb25jYXRfRVJST1JfIiwgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9bGFzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJQ1NTTm9kZUxpc3QgYXR0cnMgPSBwYXJlbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgbkF0dHJzID0gYXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJzOyBpKyspIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQlDU1NSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NSZWdpb25Db250YWluZXIpIGF0dHI7Ci0JCQlTdHJpbmcgbm9kZVRleHQgPSBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpICsgIigiICsgYXR0ci5nZXROYW1lKCkgKyAiKTogIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbm9kZS5nZXRGaXJzdFJlZ2lvbigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24gPSBub2RlLmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwgJiYgMCA8IGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSkgewotCQkJCWVycm9ycy5hZGQoQ1NTQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJTVjb25jYXRfRVJST1JfIiwgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgcmVnaW9uIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbiBtb2RlbFJlZ2lvbiA9IG1vZGVsTm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbW9kZWxSZWdpb24pIHsKLQkJCQkJZXJyb3JzLmFkZChDU1NDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlNmNvbmNhdF9FUlJPUl8iLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1maXJzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCQlyZWdpb24gPSBub2RlLmdldExhc3RSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCAmJiAwIDwgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpKSB7Ci0JCQkJZXJyb3JzLmFkZChDU1NDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlN2NvbmNhdF9FUlJPUl8iLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IHJlZ2lvbiBpcyBudWxsLiIKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb24gbW9kZWxSZWdpb24gPSBtb2RlbE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uICE9IG1vZGVsUmVnaW9uKSB7Ci0JCQkJCWVycm9ycy5hZGQoQ1NTQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJThjb25jYXRfRVJST1JfIiwgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9bGFzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCUl0ZXJhdG9yIGkgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU1V0aWwuZGVidWdPdXQoKFN0cmluZykgaS5uZXh0KCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBkaWFnbm9zZVRyZWUoSUNTU05vZGUgcGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBjaGVjayBjaGlsZHJlbgotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlkaWFnbm9zZVRyZWUoY2hpbGQsIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQotCQlkaWFnbm9zZU5vZGUocGFyZW50LCBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIElmIG5lZWRlZCwgbW9kaWZ5IGxhc3QgZmxhdCBub2RlCi0JICovCi0Jc3RhdGljIHZvaWQgZXhwYW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0YXJnZXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKHRhcmdldCA9PSBudWxsIHx8IGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAobGFzdE5vZGUgPT0gZmxhdE5vZGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobGFzdE5vZGUgPT0gbnVsbCB8fCBsYXN0Tm9kZS5nZXRTdGFydCgpIDwgZmxhdE5vZGUuZ2V0U3RhcnQoKSkgewotCQkJdGFyZ2V0LnNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlzdGF0aWMgSUNTU05vZGUgZmluZEJyYWNlQ29udGFpbmVyKElDU1NOb2RlIG5vZGUpIHsKLQkJZm9yIChJQ1NTTm9kZSBpID0gbm9kZTsgaSAhPSBudWxsOyBpID0gaS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChDU1NNb2RlbFV0aWwuY2FuQ29udGFpbkJyYWNlKGkpKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIGludCBnZXREZXB0aChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBkZXB0aCA9IC0xOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlkZXB0aCsrOwotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc0JyYWNlQ2xvc2VkKElDU1NOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBiQ2xvc2VkID0gdHJ1ZTsKLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBiQ2xvc2VkOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3QgPT0gbnVsbCB8fCBsYXN0ID09IG51bGwpIHsKLQkJCXJldHVybiBiQ2xvc2VkOwotCQl9Ci0JCWlmIChsYXN0LmdldFN0YXJ0KCkgPCBmaXJzdC5nZXRTdGFydCgpKSB7Ci0JCQlyZXR1cm4gYkNsb3NlZDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBmaXJzdDsKLQkJaW50IG5PcGVuID0gMDsKLQkJaW50IG5DbG9zZSA9IDA7Ci0JCWRvIHsKLQkJCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQluT3BlbisrOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJbkNsb3NlKys7Ci0JCQl9Ci0JCQlmbGF0Tm9kZSA9IGZsYXROb2RlLmdldE5leHQoKTsKLQkJfQotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCAmJiBmbGF0Tm9kZSAhPSBsYXN0KTsKLQotCQlpZiAoKG5PcGVuID09IDAgJiYgbkNsb3NlID09IDApIHx8IG5DbG9zZSA8IG5PcGVuKSB7Ci0JCQliQ2xvc2VkID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gYkNsb3NlZDsKLQl9Ci0KLQkvKioKLQkgKiBvbmx5IGZvciBpbnNlcnRpb24uLgotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzSW50ZXJydXB0aW9uKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0YXJnZXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKHRhcmdldCA9PSBudWxsIHx8IGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IHRhcmdldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0Tm9kZSAhPSBudWxsICYmIGZpcnN0Tm9kZS5nZXRTdGFydCgpIDwgc3RhcnQgJiYgbGFzdE5vZGUgIT0gbnVsbCAmJiBzdGFydCA8IGxhc3ROb2RlLmdldFN0YXJ0KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc1BhcmVudE9mKElDU1NOb2RlIHBhcmVudCwgSUNTU05vZGUgY2hpbGQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGNoaWxkOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKHBhcmVudCA9PSBub2RlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNWViM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU05hbWVkTm9kZU1hcEltcGwgZXh0ZW5kcyBDU1NOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBJQ1NTTmFtZWROb2RlTWFwIHsKLQotCS8qKgotCSAqIENTU05hbWVkTm9kZU1hcEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NOYW1lZE5vZGVNYXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXQgPSBub2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENTU0F0dHJJbXBsICYmICgoQ1NTQXR0ckltcGwpIG9iaikuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UobmFtZSkgPT0gMCkgewotCQkJCXJldHVybiAoSUNTU05vZGUpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFiNDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFic3RyYWN0Tm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU05vZGVJbXBsIGV4dGVuZHMgQWJzdHJhY3ROb3RpZmllciBpbXBsZW1lbnRzIElDU1NOb2RlLCBJbmRleGVkUmVnaW9uIHsKLQotCXByaXZhdGUgQ1NTRG9jdW1lbnRJbXBsIGZPd25lckRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZQYXJlbnROb2RlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZOZXh0U2libGluZyA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmUHJldmlvdXNTaWJsaW5nID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZGaXJzdENoaWxkID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZMYXN0Q2hpbGQgPSBudWxsOwotCXByb3RlY3RlZCBDU1NOYW1lZE5vZGVNYXBJbXBsIGZBdHRycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NOb2RlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU05vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JQ1NTTm9kZUltcGwoQ1NTTm9kZUltcGwgdGhhdCkgewotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmZPd25lckRvY3VtZW50ID0gdGhhdC5mT3duZXJEb2N1bWVudDsKLQkJCWlmICh0aGF0LmZBdHRycyAhPSBudWxsKSB7Ci0JCQkJaW50IG5BdHRycyA9IHRoYXQuZkF0dHJzLmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJzOyBpKyspIHsKLQkJCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgdGhhdC5mQXR0cnMuaXRlbShpKTsKLQkJCQkJc2V0QXR0cmlidXRlKGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTTm9kZUltcGwgYXBwZW5kQ2hpbGQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3UGFyZW50Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0Jdm9pZCBjbG9uZUNoaWxkTm9kZXMoSUNTU05vZGUgbmV3UGFyZW50LCBib29sZWFuIGRlZXApIHsKLQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudCA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCUNTU05vZGVJbXBsIGNvbnRhaW5lciA9IChDU1NOb2RlSW1wbCkgbmV3UGFyZW50OwotCQljb250YWluZXIucmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJQ1NTTm9kZUltcGwgY2xvbmVkID0gKENTU05vZGVJbXBsKSBjaGlsZC5jbG9uZU5vZGUoZGVlcCk7Ci0JCQlpZiAoY2xvbmVkICE9IG51bGwpCi0JCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAoZ2V0U3RhcnRPZmZzZXQoKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVNvdXJjZSgpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIodGhpcyk7Ci0JCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHRoaXMpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU0F0dHJJbXBsCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTQXR0ckltcGwgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgbmFtZSkgewotCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbkF0dHJzID0gZkF0dHJzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSBmQXR0cnMuaXRlbShpKTsKLQkJCWlmIChhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQlyZXR1cm4gYXR0cjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgSUNTU05hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQlmQXR0cnMgPSBuZXcgQ1NTTmFtZWROb2RlTWFwSW1wbCgpOwotCQlyZXR1cm4gZkF0dHJzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlTGlzdAotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJQ1NTTm9kZUxpc3RJbXBsIGxpc3QgPSBuZXcgQ1NTTm9kZUxpc3RJbXBsKCk7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlsaXN0LmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCUlDU1NOb2RlIGdldENvbW1vbkFuY2VzdG9yKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoSUNTU05vZGUgbmEgPSBub2RlOyBuYSAhPSBudWxsOyBuYSA9IG5hLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChJQ1NTTm9kZSB0YSA9IHRoaXM7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKQotCQkJCQlyZXR1cm4gdGE7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU0RvY3VtZW50SW1wbAotCSAqLwotCUNTU0RvY3VtZW50SW1wbCBnZXRDb250YWluZXJEb2N1bWVudCgpIHsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gdGhpczsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTRG9jdW1lbnRJbXBsKSB7Ci0JCQkJQ1NTRG9jdW1lbnRJbXBsIGRvYyA9IChDU1NEb2N1bWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKGRvYy5pc0RvY3VtZW50KCkpCi0JCQkJCXJldHVybiBkb2M7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JQ1NTTm9kZUltcGwgZ2V0Q29udGFpbmVyTm9kZShpbnQgb2Zmc2V0KSB7Ci0JCWlmICghY29udGFpbnMob2Zmc2V0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJSUNTU05vZGUgZm91bmQgPSAoKENTU05vZGVJbXBsKSBjaGlsZCkuZ2V0Q29udGFpbmVyTm9kZShvZmZzZXQpOwotCQkJaWYgKGZvdW5kICE9IG51bGwpCi0JCQkJcmV0dXJuIChDU1NOb2RlSW1wbCkgZm91bmQ7Ci0JCX0KLQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSUZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJSUZhY3RvcnlSZWdpc3RyeSByZWcgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlCi0JICovCi0JcHVibGljIElDU1NOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmZGaXJzdENoaWxkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlCi0JICovCi0JcHVibGljIElDU1NOb2RlIGdldExhc3RDaGlsZCgpIHsKLQkJcmV0dXJuIHRoaXMuZkxhc3RDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTTm9kZQotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZk5leHRTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlJQ1NTTm9kZSBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQkvLyB0aGUgc2FtZSBhcyBnZXRDb250YWluZXJOb2RlKCkKLQkJcmV0dXJuIGdldENvbnRhaW5lck5vZGUob2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSUNTU0RvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmZPd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlCi0JICovCi0JcHVibGljIElDU1NOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmZQYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlCi0JICovCi0JcHVibGljIElDU1NOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZlByZXZpb3VzU2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNzcy5pbnRlcmZhY2VzLkNTU0ZhY3RvcnkKLQkgKi8KLQlJQ1NTTm9kZSBnZXRSb290Tm9kZSgpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gKENTU05vZGVJbXBsKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiB0aGlzOwotCQlyZXR1cm4gcGFyZW50LmdldFJvb3ROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuICh0aGlzLmZGaXJzdENoaWxkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gcmVmQ2hpbGQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIENTU05vZGVJbXBsIGluc2VydEJlZm9yZShDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgcmVmQ2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU05vZGVJbXBsIGNoaWxkID0gbmV3Q2hpbGQ7Ci0JCUNTU05vZGVJbXBsIG5leHQgPSByZWZDaGlsZDsKLQkJQ1NTTm9kZUltcGwgcHJldiA9IG51bGw7Ci0JCWlmIChuZXh0ID09IG51bGwpIHsKLQkJCXByZXYgPSB0aGlzLmZMYXN0Q2hpbGQ7Ci0JCQl0aGlzLmZMYXN0Q2hpbGQgPSBjaGlsZDsKLQkJfQotCQllbHNlIHsKLQkJCXByZXYgPSAoQ1NTTm9kZUltcGwpIG5leHQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQluZXh0LnNldFByZXZpb3VzU2libGluZyhjaGlsZCk7Ci0JCX0KLQotCQlpZiAocHJldiA9PSBudWxsKQotCQkJdGhpcy5mRmlyc3RDaGlsZCA9IGNoaWxkOwotCQllbHNlCi0JCQlwcmV2LnNldE5leHRTaWJsaW5nKGNoaWxkKTsKLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhuZXh0KTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZSh0aGlzKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKGNoaWxkLCBudWxsKTsKLQotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUF0dHJSZXBsYWNlZChDU1NOb2RlSW1wbCBuZXdBdHRyLCBDU1NOb2RlSW1wbCBvbGRBdHRyKSB7Ci0JCS8vIGZvciBtb2RlbAotCQlJQ1NTRG9jdW1lbnQgZG9jID0gZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmF0dHJSZXBsYWNlZCh0aGlzLCBuZXdBdHRyLCBvbGRBdHRyKTsKLQotCQkvLyBmb3IgYWRhcHRlcnMKLQkJaW50IHR5cGUgPSBDSEFOR0U7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQl0eXBlID0gUkVNT1ZFOwotCQllbHNlIGlmIChvbGRBdHRyID09IG51bGwpCi0JCQl0eXBlID0gQUREOwotCQlub3RpZnkodHlwZSwgb2xkQXR0ciwgb2xkQXR0ciwgbmV3QXR0ciwgZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU05vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUNoaWxkUmVwbGFjZWQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB7Ci0JCS8vIGZvciBtb2RlbAotCQlJQ1NTRG9jdW1lbnQgZG9jID0gZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmNoaWxkUmVwbGFjZWQodGhpcywgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQotCQkvLyBmb3IgYWRhcHRlcnMKLQkJaW50IHR5cGUgPSBDSEFOR0U7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IFJFTU9WRTsKLQkJZWxzZSBpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBBREQ7Ci0JCW5vdGlmeSh0eXBlLCBvbGRDaGlsZCwgb2xkQ2hpbGQsIG5ld0NoaWxkLCBnZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXZvaWQgcmVtb3ZlQXR0cmlidXRlTm9kZShDU1NOb2RlSW1wbCBhdHRyKSB7Ci0JCS8vIGZpbmQKLQkJaW50IG5BdHRycyA9IGZBdHRycy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cnM7IGkrKykgewotCQkJaWYgKGZBdHRycy5pdGVtKGkpID09IGF0dHIpIHsKLQkJCQlmQXR0cnMucmVtb3ZlTm9kZShpKTsKLQkJCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU05vZGVJbXBsCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDU1NOb2RlSW1wbCByZW1vdmVDaGlsZChDU1NOb2RlSW1wbCBvbGRDaGlsZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvbGRDaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gdGhpcykKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGNsb3NlIGltcG9ydCBydWxlcwotCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQl0cmF2LmFwcGx5KG9sZENoaWxkKTsKLQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldFJ1bGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJKChDU1NJbXBvcnRSdWxlSW1wbCkgaXQubmV4dCgpKS5jbG9zZVN0eWxlU2hlZXQoKTsKLQkJfQotCi0JCUNTU05vZGVJbXBsIGNoaWxkID0gb2xkQ2hpbGQ7Ci0JCUNTU05vZGVJbXBsIHByZXYgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQlDU1NOb2RlSW1wbCBuZXh0ID0gKENTU05vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZGaXJzdENoaWxkID0gbmV4dDsKLQkJZWxzZQotCQkJcHJldi5zZXROZXh0U2libGluZyhuZXh0KTsKLQotCQlpZiAobmV4dCA9PSBudWxsKQotCQkJdGhpcy5mTGFzdENoaWxkID0gcHJldjsKLQkJZWxzZQotCQkJbmV4dC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0KLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZShudWxsKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKG51bGwsIGNoaWxkKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCQlJQ1NTTm9kZSBuZXh0Q2hpbGQgPSBudWxsOwotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IG5leHRDaGlsZCkgewotCQkJbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU05vZGVJbXBsCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDU1NOb2RlSW1wbCByZXBsYWNlQ2hpbGQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9sZENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JCWlmIChuZXdDaGlsZCAhPSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JCXJldHVybiByZW1vdmVDaGlsZChvbGRDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ1NTQXR0ckltcGwgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCVN0cmluZyBvbGRWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQkJZkF0dHJzID0gbmV3IENTU05hbWVkTm9kZU1hcEltcGwoKTsKLQkJCUNTU0RvY3VtZW50SW1wbCBkb2MgPSAoQ1NTRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJYXR0ciA9IChDU1NBdHRySW1wbCkgZG9jLmNyZWF0ZUNTU0F0dHIobmFtZSk7Ci0JCQlhdHRyLnNldE93bmVyQ1NTTm9kZSh0aGlzKTsKLQkJCWZBdHRycy5hcHBlbmROb2RlKGF0dHIpOwotCQkJbm90aWZ5QXR0clJlcGxhY2VkKGF0dHIsIG51bGwpOwotCQl9Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjc3NUZXh0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzVGV4dChTdHJpbmcgY3NzVGV4dCkgewotCQkvLyBUT0RPIDogY2FsbCBmbGF0IG1vZGVsIHBhcnNlciBhbmQgcmVwbGFjZSBteXNlbGYgd2l0aCBuZXcgdGhyZWUhIQotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5leHRTaWJsaW5nCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXROZXh0U2libGluZyhJQ1NTTm9kZSBuZXh0U2libGluZykgewotCQl0aGlzLmZOZXh0U2libGluZyA9IChDU1NOb2RlSW1wbCkgbmV4dFNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG93bmVyRG9jdW1lbnQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy5pbnRlcmZhY2VzLkNTU0RvY3VtZW50Ci0JICovCi0Jdm9pZCBzZXRPd25lckRvY3VtZW50KElDU1NEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXRoaXMuZk93bmVyRG9jdW1lbnQgPSAoQ1NTRG9jdW1lbnRJbXBsKSBvd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRQYXJlbnROb2RlKElDU1NOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5mUGFyZW50Tm9kZSA9IChDU1NOb2RlSW1wbCkgcGFyZW50Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJldmlvdXNTaWJsaW5nCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRQcmV2aW91c1NpYmxpbmcoSUNTU05vZGUgcHJldmlvdXNTaWJsaW5nKSB7Ci0JCXRoaXMuZlByZXZpb3VzU2libGluZyA9IChDU1NOb2RlSW1wbCkgcHJldmlvdXNTaWJsaW5nOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJjODU1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU05vZGVMaXN0SW1wbCBleHRlbmRzIEFic3RyYWN0Q1NTTm9kZUxpc3QgaW1wbGVtZW50cyBJQ1NTTm9kZUxpc3QgewotCi0JLyoqCi0JICogQ1NTTm9kZUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTm9kZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudHJlZW1vZGVsLmNzcy5DU1NOb2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGl0ZW1JbXBsKGluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQYWdlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUGFnZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzdkMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQYWdlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NQYWdlUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlRGVjbENvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NQYWdlUnVsZSB7Ci0KLQlJQ1NTU2VsZWN0b3JMaXN0IGZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChudWxsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NQYWdlUnVsZUltcGwKLQkgKi8KLQlDU1NQYWdlUnVsZUltcGwoQ1NTUGFnZVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5DU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NQYWdlUnVsZUltcGwgY2xvbmVkID0gbmV3IENTU1BhZ2VSdWxlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGV4dHJhY3RQcmVTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBwcmVTdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCJAcGFnZSAiKTsvLyROT04tTkxTLTEkCi0JCXByZVN0ci5hcHBlbmQoZ2V0U2VsZWN0b3JUZXh0KCkpOwotCi0JCXJldHVybiBwcmVTdHIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gUEFHRVJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNzcy5pbnRlcmZhY2VzLklDU1NTZWxlY3Rvckxpc3QKLQkgKi8KLQlwdWJsaWMgSUNTU1NlbGVjdG9yTGlzdCBnZXRTZWxlY3RvcnMoKSB7Ci0JCXJldHVybiBmU2VsZWN0b3JMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXJzYWJsZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYWdlIHNlbGVjdG9yIGZvciB0aGUgcnVsZS4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIENTUyBzdHJpbmcgdmFsdWUgaGFzCi0JICogICAgICAgICAgICAgICAgYSBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHJ1bGUgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVGV4dCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShTRUxFQ1RPUik7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gUEFHRV9SVUxFOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yVGV4dChTdHJpbmcgc2VsZWN0b3JUZXh0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKFNFTEVDVE9SLCBzZWxlY3RvclRleHQpOwotCQlmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoc2VsZWN0b3JUZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjBhMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU1ByaW1pdGl2ZUNvbnRhaW5lciBleHRlbmRzIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCB7Ci0KLQkvKioKLQkgKiBDU1NSZWdpb25Db250YWluZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NQcmltaXRpdmVWYWx1ZUltcGwKLQkgKi8KLQlDU1NQcmltaXRpdmVDb250YWluZXIoQ1NTUHJpbWl0aXZlQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQ1NTUmVnaW9uQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHByaW1pdGl2ZVR5cGUKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JQ1NTUHJpbWl0aXZlQ29udGFpbmVyKHNob3J0IHByaW1pdGl2ZVR5cGUpIHsKLQkJc3VwZXIocHJpbWl0aXZlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdFByaW1pdGl2ZXMoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBvd25lckRvY3VtZW50Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTRG9jdW1lbnQKLQkgKi8KLQl2b2lkIHNldE93bmVyRG9jdW1lbnQoSUNTU0RvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQotCQlpbml0UHJpbWl0aXZlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1ByaW1pdGl2ZVZhbHVlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1ZDRkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1ByaW1pdGl2ZVZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5Db3VudGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5SR0JDb2xvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUmVjdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZXh0ZW5kcyBDU1NSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTUHJpbWl0aXZlVmFsdWUgewotCi0JcHJvdGVjdGVkIHNob3J0IGZQcmltaXRpdmVUeXBlID0gQ1NTX1VOS05PV047Ci0JcHJpdmF0ZSBmbG9hdCBmRmxvYXRWYWx1ZSA9IDAuMGY7Ci0JcHJpdmF0ZSBTdHJpbmcgZlN0cmluZ1ZhbHVlID0gbnVsbDsKLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU1ByaW1pdGl2ZVZhbHVlSW1wbAotCSAqLwotCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbChDU1NQcmltaXRpdmVWYWx1ZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQl0aGlzLmZQcmltaXRpdmVUeXBlID0gdGhhdC5mUHJpbWl0aXZlVHlwZTsKLQkJdGhpcy5mRmxvYXRWYWx1ZSA9IHRoYXQuZkZsb2F0VmFsdWU7Ci0JCXRoaXMuZlN0cmluZ1ZhbHVlID0gdGhhdC5mU3RyaW5nVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHNob3J0IHByaW1pdGl2ZVR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJZlByaW1pdGl2ZVR5cGUgPSBwcmltaXRpdmVUeXBlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNsb25lZCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgQ291bnRlciB2YWx1ZS4gSWYgdGhpcyBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSBjb3VudGVyIHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIE1vZGlmaWNhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcKLQkgKiB0aGUgPGNvZGU+Q291bnRlcjwvY29kZT4gaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIENvdW50ZXIgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgQ291bnRlciB2YWx1ZSAoZS5nLiB0aGlzIGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkNTU19DT1VOVEVSPC9jb2RlPikuCi0JICovCi0JcHVibGljIENvdW50ZXIgZ2V0Q291bnRlclZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDU1NWYWx1ZVRleHQoKSB7Ci0JCXJldHVybiBnZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQSBjb2RlIGRlZmluaW5nIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBhcyBkZWZpbmVkIGFib3ZlLgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRDc3NWYWx1ZVR5cGUoKSB7Ci0JCWlmIChnZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTX0lOSEVSSVRfUFJJTUlUSVZFKSB7Ci0JCQlyZXR1cm4gQ1NTX0lOSEVSSVQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ1NTX1BSSU1JVElWRV9WQUxVRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IGEgZmxvYXQgdmFsdWUgaW4gYSBzcGVjaWZpZWQgdW5pdC4gSWYgdGhpcwotCSAqIENTUyB2YWx1ZSBkb2Vzbid0IGNvbnRhaW4gYSBmbG9hdCB2YWx1ZSBvciBjYW4ndCBiZSBjb252ZXJ0ZWQgaW50byB0aGUKLQkgKiBzcGVjaWZpZWQgdW5pdCwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdW5pdFR5cGUKLQkgKiAgICAgICAgICAgIEEgdW5pdCBjb2RlIHRvIGdldCB0aGUgZmxvYXQgdmFsdWUuIFRoZSB1bml0IGNvZGUgY2FuIG9ubHkKLQkgKiAgICAgICAgICAgIGJlIGEgZmxvYXQgdW5pdCB0eXBlIChpLmUuIDxjb2RlPkNTU19OVU1CRVI8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BFUkNFTlRBR0U8L2NvZGU+LDxjb2RlPkNTU19FTVM8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0VYUzwvY29kZT4sPGNvZGU+Q1NTX1BYPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19DTTwvY29kZT4sPGNvZGU+Q1NTX01NPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19JTjwvY29kZT4sPGNvZGU+Q1NTX1BUPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19QQzwvY29kZT4sPGNvZGU+Q1NTX0RFRzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUkFEPC9jb2RlPiw8Y29kZT5DU1NfR1JBRDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfTVM8L2NvZGU+LDxjb2RlPkNTU19TPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19IWjwvY29kZT4sPGNvZGU+Q1NTX0tIWjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRElNRU5TSU9OPC9jb2RlPikuCi0JICogQHJldHVybiBUaGUgZmxvYXQgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCB1bml0LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIGZsb2F0IHZhbHVlIG9yIGlmIHRoZSBmbG9hdCB2YWx1ZSBjYW4ndCBiZQotCSAqICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgdW5pdC4KLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXRWYWx1ZShzaG9ydCB1bml0VHlwZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAoZlByaW1pdGl2ZVR5cGUpIHsKLQkJCWNhc2UgQ1NTX05VTUJFUiA6Ci0JCQljYXNlIENTU19QRVJDRU5UQUdFIDoKLQkJCWNhc2UgQ1NTX0VNUyA6Ci0JCQljYXNlIENTU19FWFMgOgotCQkJY2FzZSBDU1NfUFggOgotCQkJY2FzZSBDU1NfQ00gOgotCQkJY2FzZSBDU1NfTU0gOgotCQkJY2FzZSBDU1NfSU4gOgotCQkJY2FzZSBDU1NfUFQgOgotCQkJY2FzZSBDU1NfUEMgOgotCQkJY2FzZSBDU1NfREVHIDoKLQkJCWNhc2UgQ1NTX1JBRCA6Ci0JCQljYXNlIENTU19HUkFEIDoKLQkJCWNhc2UgQ1NTX01TIDoKLQkJCWNhc2UgQ1NTX1MgOgotCQkJY2FzZSBDU1NfSFogOgotCQkJY2FzZSBDU1NfS0haIDoKLQkJCWNhc2UgQ1NTX0RJTUVOU0lPTiA6Ci0JCQljYXNlIENTU19JTlRFR0VSIDoKLQkJCWNhc2UgQ1NTX0hBU0ggOgotCQkJCXJldHVybiBmRmxvYXRWYWx1ZTsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDEvMTcKLQkgKiAxMjoxMjoxOCkKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gUFJJTUlUSVZFVkFMVUVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUgY29uc3RhbnRzIHNwZWNpZmllZCBhYm92ZS4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0UHJpbWl0aXZlVHlwZSgpIHsKLQkJcmV0dXJuIGZQcmltaXRpdmVUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBSZWN0IHZhbHVlLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIHJlY3QgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5SZWN0PC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgUmVjdCB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBSZWN0IHZhbHVlLiAoZS5nLiB0aGlzIGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkNTU19SRUNUPC9jb2RlPikuCi0JICovCi0JcHVibGljIFJlY3QgZ2V0UmVjdFZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgUkdCIGNvbG9yLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIFJHQiBjb2xvciB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiBNb2RpZmljYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgY2FuIGJlIGFjaGlldmVkIHVzaW5nCi0JICogdGhlIDxjb2RlPlJHQkNvbG9yPC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgUkdCIGNvbG9yIHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIGF0dGFjaGVkIHByb3BlcnR5Ci0JICogICAgICAgICAgICAgICAgY2FuJ3QgcmV0dXJuIGEgUkdCIGNvbG9yIHZhbHVlIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX1JHQkNPTE9SPC9jb2RlPikuCi0JICovCi0JcHVibGljIFJHQkNvbG9yIGdldFJHQkNvbG9yVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBzdHJpbmcgdmFsdWUuIElmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSBzdHJpbmcgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuIFNvbWUKLQkgKiBwcm9wZXJ0aWVzIChsaWtlICdmb250LWZhbWlseScgb3IgJ3ZvaWNlLWZhbWlseScpIGNvbnZlcnQgYSB3aGl0ZXNwYWNlCi0JICogc2VwYXJhdGVkIGxpc3Qgb2YgaWRlbnRzIHRvIGEgc3RyaW5nLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN0cmluZyB2YWx1ZSBpbiB0aGUgY3VycmVudCB1bml0LiBUaGUgY3VycmVudAotCSAqICAgICAgICAgPGNvZGU+cHJpbWl0aXZlVHlwZTwvY29kZT4gY2FuIG9ubHkgYmUgYSBzdHJpbmcgdW5pdCB0eXBlCi0JICogICAgICAgICAoaS5lLiA8Y29kZT5DU1NfU1RSSU5HPC9jb2RlPiw8Y29kZT5DU1NfVVJJPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPkNTU19JREVOVDwvY29kZT4gYW5kIDxjb2RlPkNTU19BVFRSPC9jb2RlPikuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgc3RyaW5nIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChmUHJpbWl0aXZlVHlwZSkgewotCQkJY2FzZSBDU1NfU1RSSU5HIDoKLQkJCWNhc2UgQ1NTX1VSSSA6Ci0JCQljYXNlIENTU19JREVOVCA6Ci0JCQljYXNlIENTU19BVFRSIDoKLQkJCWNhc2UgQ1NTX1VSQU5HRSA6Ci0JCQljYXNlIENTU19GT1JNQVQgOgotCQkJY2FzZSBDU1NfTE9DQUwgOgotCQkJY2FzZSBDU1NfSEFTSCA6Ci0JCQljYXNlIENTU19DT01NQSA6Ci0JCQljYXNlIENTU19TTEFTSCA6Ci0JCQljYXNlIENTU19JTkhFUklUX1BSSU1JVElWRSA6Ci0JCQkJcmV0dXJuIGZTdHJpbmdWYWx1ZTsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZChTdHJpbmcgb2xkVmFsdWUpIHsKLQkJLy8gZm9yIG1vZGVsCi0JCUlDU1NEb2N1bWVudCBkb2MgPSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNTU01vZGVsSW1wbCBtb2RlbCA9IChDU1NNb2RlbEltcGwpIGRvYy5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwudmFsdWVDaGFuZ2VkKHRoaXMsIG9sZFZhbHVlKTsKLQotCQkvLyBmb3IgYWRhcHRlcnMKLQkJbm90aWZ5KENIQU5HRSwgbmV3IFNob3J0KGZQcmltaXRpdmVUeXBlKSwgbnVsbCwgbnVsbCwgZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQSBtZXRob2QgdG8gc2V0IHRoZSBmbG9hdCB2YWx1ZSB3aXRoIGEgc3BlY2lmaWVkIHVuaXQuIElmIHRoZSBwcm9wZXJ0eQotCSAqIGF0dGFjaGVkIHdpdGggdGhpcyB2YWx1ZSBjYW4gbm90IGFjY2VwdCB0aGUgc3BlY2lmaWVkIHVuaXQgb3IgdGhlIGZsb2F0Ci0JICogdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHVuY2hhbmdlZCBhbmQgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+Ci0JICogd2lsbCBiZSByYWlzZWQuCi0JICogCi0JICogQHBhcmFtIHVuaXRUeXBlCi0JICogICAgICAgICAgICBBIHVuaXQgY29kZSBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgdW5pdCBjb2RlIGNhbiBvbmx5IGJlIGEKLQkgKiAgICAgICAgICAgIGZsb2F0IHVuaXQgdHlwZSAoaS5lLiA8Y29kZT5DU1NfTlVNQkVSPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19QRVJDRU5UQUdFPC9jb2RlPiw8Y29kZT5DU1NfRU1TPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19FWFM8L2NvZGU+LDxjb2RlPkNTU19QWDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfQ008L2NvZGU+LDxjb2RlPkNTU19NTTwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfSU48L2NvZGU+LDxjb2RlPkNTU19QVDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEM8L2NvZGU+LDxjb2RlPkNTU19ERUc8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1JBRDwvY29kZT4sPGNvZGU+Q1NTX0dSQUQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX01TPC9jb2RlPiw8Y29kZT5DU1NfUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfSFo8L2NvZGU+LDxjb2RlPkNTU19LSFo8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0RJTUVOU0lPTjwvY29kZT4pLgotCSAqIEBwYXJhbSBmbG9hdFZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IGZsb2F0IHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIGF0dGFjaGVkIHByb3BlcnR5Ci0JICogICAgICAgICAgICAgICAgZG9lc24ndCBzdXBwb3J0IHRoZSBmbG9hdCB2YWx1ZSBvciB0aGUgdW5pdCB0eXBlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZsb2F0VmFsdWUoc2hvcnQgdW5pdFR5cGUsIGZsb2F0IGZsb2F0VmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKHVuaXRUeXBlKSB7Ci0JCQljYXNlIENTU19OVU1CRVIgOgotCQkJY2FzZSBDU1NfUEVSQ0VOVEFHRSA6Ci0JCQljYXNlIENTU19FTVMgOgotCQkJY2FzZSBDU1NfRVhTIDoKLQkJCWNhc2UgQ1NTX1BYIDoKLQkJCWNhc2UgQ1NTX0NNIDoKLQkJCWNhc2UgQ1NTX01NIDoKLQkJCWNhc2UgQ1NTX0lOIDoKLQkJCWNhc2UgQ1NTX1BUIDoKLQkJCWNhc2UgQ1NTX1BDIDoKLQkJCWNhc2UgQ1NTX0RFRyA6Ci0JCQljYXNlIENTU19SQUQgOgotCQkJY2FzZSBDU1NfR1JBRCA6Ci0JCQljYXNlIENTU19NUyA6Ci0JCQljYXNlIENTU19TIDoKLQkJCWNhc2UgQ1NTX0haIDoKLQkJCWNhc2UgQ1NTX0tIWiA6Ci0JCQljYXNlIENTU19ESU1FTlNJT04gOgotCQkJY2FzZSBDU1NfSU5URUdFUiA6Ci0JCQkJU3RyaW5nIG9sZFZhbHVlID0gZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJZlByaW1pdGl2ZVR5cGUgPSB1bml0VHlwZTsKLQkJCQlmRmxvYXRWYWx1ZSA9IGZsb2F0VmFsdWU7Ci0JCQkJbm90aWZ5VmFsdWVDaGFuZ2VkKG9sZFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgbWV0aG9kIHRvIHNldCB0aGUgc3RyaW5nIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCB1bml0LiBJZiB0aGUKLQkgKiBwcm9wZXJ0eSBhdHRhY2hlZCB0byB0aGlzIHZhbHVlIGNhbid0IGFjY2VwdCB0aGUgc3BlY2lmaWVkIHVuaXQgb3IgdGhlCi0JICogc3RyaW5nIHZhbHVlLCB0aGUgdmFsdWUgd2lsbCBiZSB1bmNoYW5nZWQgYW5kIGEKLQkgKiA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgcmFpc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmdUeXBlCi0JICogICAgICAgICAgICBBIHN0cmluZyBjb2RlIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBzdHJpbmcgY29kZSBjYW4gb25seSBiZQotCSAqICAgICAgICAgICAgYSBzdHJpbmcgdW5pdCB0eXBlIChpLmUuIDxjb2RlPkNTU19TVFJJTkc8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1VSSTwvY29kZT4sPGNvZGU+Q1NTX0lERU5UPC9jb2RlPiwgYW5kCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfQVRUUjwvY29kZT4pLgotCSAqIEBwYXJhbSBzdHJpbmdWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyBzdHJpbmcgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgc3RyaW5nIHZhbHVlIG9yIGlmIHRoZSBzdHJpbmcgdmFsdWUgY2FuJ3QgYmUKLQkgKiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHVuaXQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nVmFsdWUoc2hvcnQgc3RyaW5nVHlwZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChzdHJpbmdUeXBlKSB7Ci0JCQljYXNlIENTU19TVFJJTkcgOgotCQkJY2FzZSBDU1NfVVJJIDoKLQkJCWNhc2UgQ1NTX0lERU5UIDoKLQkJCWNhc2UgQ1NTX0FUVFIgOgotCQkJY2FzZSBDU1NfVVJBTkdFIDoKLQkJCWNhc2UgQ1NTX0ZPUk1BVCA6Ci0JCQljYXNlIENTU19MT0NBTCA6Ci0JCQljYXNlIENTU19IQVNIIDoKLQkJCWNhc2UgQ1NTX0NPTU1BIDoKLQkJCWNhc2UgQ1NTX1NMQVNIIDoKLQkJCWNhc2UgQ1NTX0lOSEVSSVRfUFJJTUlUSVZFIDoKLQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBnZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQlmUHJpbWl0aXZlVHlwZSA9IHN0cmluZ1R5cGU7Ci0JCQkJZlN0cmluZ1ZhbHVlID0gc3RyaW5nVmFsdWU7Ci0JCQkJbm90aWZ5VmFsdWVDaGFuZ2VkKG9sZFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDEvMjQKLQkgKiAxNTowNjoyNSkKLQkgKiAKLQkgKiBAcGFyYW0gZmxvYXRWYWx1ZQotCSAqICAgICAgICAgICAgZmxvYXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoZmxvYXQgZmxvYXRWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldEZsb2F0VmFsdWUoZ2V0UHJpbWl0aXZlVHlwZSgpLCBmbG9hdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgyMDAxLzAxLzI0Ci0JICogMTU6MDY6MjUpCi0JICogCi0JICogQHBhcmFtIHN0cmluZ1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGphdmEubGFuZy5TdHJpbmcgc3RyaW5nVmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXRTdHJpbmdWYWx1ZShnZXRQcmltaXRpdmVUeXBlKCksIHN0cmluZ1ZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4M2M4Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUmVnaW9uQ29udGFpbmVyIGV4dGVuZHMgQ1NTTm9kZUltcGwgewotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmRmlyc3RSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVRleHRSZWdpb24gZkxhc3RSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmUGFyZW50UmVnaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1JlZ2lvbkNvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU1JlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NSZWdpb25Db250YWluZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NSZWdpb25Db250YWluZXIKLQkgKi8KLQlDU1NSZWdpb25Db250YWluZXIoQ1NTUmVnaW9uQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDc3NUZXh0KCkgewotCQlpZiAoZkZpcnN0UmVnaW9uID09IG51bGwgfHwgZkxhc3RSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBnZW5lcmF0ZVNvdXJjZSgpOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZlBhcmVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gYkluID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gY3VycmVudCA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKGJJbikgewotCQkJCXNvdXJjZS5hcHBlbmQoZlBhcmVudFJlZ2lvbi5nZXRUZXh0KGN1cnJlbnQpKTsKLQkJCQlpZiAoY3VycmVudCA9PSBmTGFzdFJlZ2lvbikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoY3VycmVudCA9PSBmRmlyc3RSZWdpb24pIHsKLQkJCQkJYkluID0gdHJ1ZTsKLQkJCQkJc291cmNlLmFwcGVuZChmUGFyZW50UmVnaW9uLmdldFRleHQoY3VycmVudCkpOwotCQkJCQlpZiAoY3VycmVudCA9PSBmTGFzdFJlZ2lvbikKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzb3VyY2UudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRMYXN0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCB8fCBmUGFyZW50UmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmUGFyZW50UmVnaW9uLmdldEVuZE9mZnNldChyZWdpb24pOwotCQl9Ci0JCS8qCi0JCSAqIGludCBvZmZzZXQgPSAwOyBpZiAobGFzdFJlZ2lvbiAhPSBudWxsKSBvZmZzZXQgPQotCQkgKiBsYXN0UmVnaW9uLmdldEVuZCgpOwotCQkgKiAKLQkJICogQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGl0ZW0gPSBudWxsOyBJQ1NTTm9kZSBub2RlID0KLQkJICogZ2V0UGFyZW50Tm9kZSgpOyB3aGlsZSAobm9kZSAhPSBudWxsKSB7IGlmIChub2RlIGluc3RhbmNlb2YKLQkJICogQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBpdGVtID0KLQkJICogKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZTsgbm9kZSA9Ci0JCSAqIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOyB9IGlmIChpdGVtICE9IG51bGwpIHsgLy8gYXNzdW1wdGlvbjogcmVnaW9ucwotCQkgKiBhcmUgYXR0YWNoZWQgdG8gRklSU1Qgbm9kZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0KLQkJICogaXRlbS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOyBpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJICogcmV0dXJuIChmbGF0Tm9kZS5nZXRTdGFydCgpICsgb2Zmc2V0KTsgfSByZXR1cm4gMDsKLQkJICovCi0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZQYXJlbnRSZWdpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVRleHRSZWdpb24KLQkgKi8KLQlJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZGaXJzdFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JVGV4dFJlZ2lvbgotCSAqLwotCUlUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXJldHVybiBmTGFzdFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JVGV4dFJlZ2lvbgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JSVRleHRSZWdpb24gZ2V0UmVnaW9uKGludCBpbmRleCkgewotCQlpZiAoZ2V0Rmlyc3RSZWdpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZlBhcmVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAocmVnaW9ucy5nZXQoaSkgPT0gZ2V0Rmlyc3RSZWdpb24oKSkgewotCQkJCWlmIChpICsgaW5kZXggPCByZWdpb25zLnNpemUoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiB0YXJnZXQgPSByZWdpb25zLmdldChpICsgaW5kZXgpOwotCQkJCQlpZiAodGFyZ2V0LmdldFN0YXJ0KCkgPD0gZ2V0TGFzdFJlZ2lvbigpLmdldFN0YXJ0KCkpCi0JCQkJCQlyZXR1cm4gdGFyZ2V0OwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRSZWdpb25Db3VudCgpIHsKLQkJdmFsaWRhdGVSYW5nZSgpOwotCi0JCWlmIChnZXRGaXJzdFJlZ2lvbigpID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKGdldEZpcnN0UmVnaW9uKCkgPT0gZ2V0TGFzdFJlZ2lvbigpKQotCQkJcmV0dXJuIDE7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZlBhcmVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0KLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnQgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChqICE9IDAgfHwgY3VycmVudCA9PSBnZXRGaXJzdFJlZ2lvbigpKQotCQkJCWorKzsKLQkJCWlmIChjdXJyZW50ID09IGdldExhc3RSZWdpb24oKSkKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gajsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldEZpcnN0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCB8fCBmUGFyZW50UmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmUGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQkJLyoKLQkJICogaW50IG9mZnNldCA9IDA7IGlmIChmaXJzdFJlZ2lvbiAhPSBudWxsKSBvZmZzZXQgPQotCQkgKiBmaXJzdFJlZ2lvbi5nZXRTdGFydCgpOwotCQkgKiAKLQkJICogQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGl0ZW0gPSBudWxsOyBJQ1NTTm9kZSBub2RlID0KLQkJICogZ2V0UGFyZW50Tm9kZSgpOyB3aGlsZSAobm9kZSAhPSBudWxsKSB7IGlmIChub2RlIGluc3RhbmNlb2YKLQkJICogQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBpdGVtID0KLQkJICogKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZTsgbm9kZSA9Ci0JCSAqIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOyB9IGlmIChpdGVtICE9IG51bGwpIHsgLy8gYXNzdW1wdGlvbjogcmVnaW9ucwotCQkgKiBhcmUgYXR0YWNoZWQgdG8gRklSU1Qgbm9kZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0KLQkJICogaXRlbS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOyBpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJICogcmV0dXJuIChmbGF0Tm9kZS5nZXRTdGFydCgpICsgb2Zmc2V0KTsgfSByZXR1cm4gMDsKLQkJICovCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBzZXRGaXJzdFJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJdGhpcy5mRmlyc3RSZWdpb24gPSByZWdpb247Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVRleHRSZWdpb24KLQkgKiBAcGFyYW0gbGFzdFJlZ2lvbgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBzZXRMYXN0UmVnaW9uKElUZXh0UmVnaW9uIGxhc3RSZWdpb24pIHsKLQkJdGhpcy5mTGFzdFJlZ2lvbiA9IGxhc3RSZWdpb247Ci0JCXJldHVybiBsYXN0UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaXJzdFJlZ2lvbgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uCi0JICogQHBhcmFtIGxhc3RSZWdpb24KLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JVGV4dFJlZ2lvbgotCSAqLwotCXZvaWQgc2V0UmFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24sIElUZXh0UmVnaW9uIGZpcnN0UmVnaW9uLCBJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uKSB7Ci0JCXRoaXMuZlBhcmVudFJlZ2lvbiA9IHBhcmVudFJlZ2lvbjsKLQkJdGhpcy5mRmlyc3RSZWdpb24gPSBmaXJzdFJlZ2lvbjsKLQkJdGhpcy5mTGFzdFJlZ2lvbiA9IGxhc3RSZWdpb247Ci0KLQkJaWYgKGZpcnN0UmVnaW9uID09IG51bGwgJiYgbGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlzZXRGaXJzdFJlZ2lvbihudWxsKTsKLQkJCXNldExhc3RSZWdpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7IC8vIHJhbmdlIHZhbGlkYXRpb24KLQkJCXZhbGlkYXRlUmFuZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJhbmdlKCkgewotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCi0JCWlmICh0aGlzLmZGaXJzdFJlZ2lvbiAhPSBudWxsIHx8IHRoaXMuZkxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZkZpcnN0UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aGlzLmZGaXJzdFJlZ2lvbiA9IHRoaXMuZkxhc3RSZWdpb247Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuZkxhc3RSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuZkxhc3RSZWdpb24gPSB0aGlzLmZGaXJzdFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5mRmlyc3RSZWdpb24uZ2V0U3RhcnQoKSA+IHRoaXMuZkxhc3RSZWdpb24uZ2V0U3RhcnQoKSkgewotCQkJCS8vIG5lZWQgdG8gc3dhcCBmaXJzdCBmb3IgbGFzdAotCQkJCUlUZXh0UmVnaW9uIHJlZyA9IGZGaXJzdFJlZ2lvbjsKLQkJCQlmRmlyc3RSZWdpb24gPSBmTGFzdFJlZ2lvbjsKLQkJCQlmTGFzdFJlZ2lvbiA9IHJlZzsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBiTW9kaWZpZWQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZURlY2xDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZURlY2xDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4M2E0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVEZWNsQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUnVsZURlY2xDb250YWluZXIgZXh0ZW5kcyBDU1NSdWxlSW1wbCB7Ci0KLQkvKioKLQkgKiBDU1NSdWxlRGVjbENvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU1J1bGVEZWNsQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU1J1bGVEZWNsQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTUnVsZUltcGwKLQkgKi8KLQlDU1NSdWxlRGVjbENvbnRhaW5lcihDU1NSdWxlRGVjbENvbnRhaW5lciB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCWFic3RyYWN0IFN0cmluZyBleHRyYWN0UHJlU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoKSB7Ci0KLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbikKLQkJCQlyZXR1cm4gKENTU1N0eWxlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmNmNGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NSdWxlSW1wbCBleHRlbmRzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIENTU1J1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTUnVsZUltcGwKLQkgKi8KLQlDU1NSdWxlSW1wbChDU1NSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgcnVsZSBpcyBjb250YWluZWQgaW5zaWRlIGFub3RoZXIgcnVsZSAoZS5nLiBhIHN0eWxlIHJ1bGUgaW5zaWRlCi0JICogYW4KLQkgKiAKLQkgKiBAbWVkaWEgYmxvY2spLCB0aGlzIGlzIHRoZSBjb250YWluaW5nIHJ1bGUuIElmIHRoaXMgcnVsZSBpcyBub3QgbmVzdGVkCi0JICogICAgICAgIGluc2lkZSBhbnkgb3RoZXIgcnVsZXMsIHRoaXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBnZXRQYXJlbnRSdWxlKCkgewotCQlJQ1NTTm9kZSBydWxlID0gZ2V0UGFyZW50Tm9kZSgpOwotCi0JCS8vIHBhcmVudCBydWxlIGlzIHVzZWQgb25seSBpZiBwYXJlbnQgaXMgbWVkaWEgcnVsZQotCQlpZiAocnVsZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZUltcGwpCi0JCQlyZXR1cm4gKENTU1J1bGUpIHJ1bGU7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0eWxlIHNoZWV0IHRoYXQgY29udGFpbnMgdGhpcyBydWxlLgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZVNoZWV0IGdldFBhcmVudFN0eWxlU2hlZXQoKSB7Ci0JCUlDU1NOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldEltcGwpCi0JCQkJcmV0dXJuIChDU1NTdHlsZVNoZWV0KSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWYxNWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NSdWxlTGlzdEltcGwgZXh0ZW5kcyBBYnN0cmFjdENTU05vZGVMaXN0IGltcGxlbWVudHMgQ1NTUnVsZUxpc3QgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUnVsZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgYSBDU1MgcnVsZSBieSBvcmRpbmFsIGluZGV4LiBUaGUgb3JkZXIgaW4gdGhpcwotCSAqIGNvbGxlY3Rpb24gcmVwcmVzZW50cyB0aGUgb3JkZXIgb2YgdGhlIHJ1bGVzIGluIHRoZSBDU1Mgc3R5bGUgc2hlZXQuIElmCi0JICogaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcnVsZXMgaW4gdGhlIGxpc3QsIHRoaXMKLQkgKiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleEluZGV4Ci0JICogICAgICAgICAgICBpbnRvIHRoZSBjb2xsZWN0aW9uCi0JICogQHJldHVybiBUaGUgc3R5bGUgcnVsZSBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IHBvc2l0aW9uIGluIHRoZQotCSAqICAgICAgICAgPGNvZGU+Q1NTUnVsZUxpc3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGlzCi0JICogICAgICAgICBub3QgYSB2YWxpZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBpdGVtKGludCBpbmRleCkgewotCQlyZXR1cm4gKENTU1J1bGUpIGl0ZW1JbXBsKGluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2NkZWEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3JDb21iaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1NlbGVjdG9yIGltcGxlbWVudHMgSUNTU1NlbGVjdG9yIHsKLQotCXByaXZhdGUgaW50IGZTcGVjaWZpY2l0eSA9IC0xOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVG9rZW5zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkl0ZW1zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlBhcnNlRXJyb3JzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZk5hbWVFcnJvcnMgPSBudWxsOwotCi0JQ1NTU2VsZWN0b3IoTGlzdCB0b2tlbnMpIHsKLQkJZlRva2VucyA9IG5ldyBBcnJheUxpc3QodG9rZW5zKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiA9PSBudWxsIHx8IHRoaXMuZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDU1NTZWxlY3RvciBmb3JlaWduID0gKENTU1NlbGVjdG9yKSBvYmo7Ci0KLQkJLy8gaWYgKGZTcGVjaWZpY2l0eSAhPSBmb3JlaWduLmZTcGVjaWZpY2l0eSkgcmV0dXJuIGZhbHNlOwotCi0JCWlmIChnZXRMZW5ndGgoKSAhPSBmb3JlaWduLmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCFnZXRJdGVtKGkpLmVxdWFscyhmb3JlaWduLmdldEl0ZW0oaSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuSUNTU1NlbGVjdG9ySXRlbQotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIElDU1NTZWxlY3Rvckl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGZJdGVtcyA9PSBudWxsKSB7Ci0JCQlmSXRlbXMgPSBwYXJzZVNlbGVjdG9yKGZUb2tlbnMpOwotCQl9Ci0JCWlmIChmSXRlbXMgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZkl0ZW1zLnNpemUoKSkgewotCQkJcmV0dXJuIChJQ1NTU2VsZWN0b3JJdGVtKSBmSXRlbXMuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSB7Ci0JCWlmIChmSXRlbXMgPT0gbnVsbCkgewotCQkJZkl0ZW1zID0gcGFyc2VTZWxlY3RvcihmVG9rZW5zKTsKLQkJfQotCQlyZXR1cm4gKGZJdGVtcyAhPSBudWxsKSA/IGZJdGVtcy5pdGVyYXRvcigpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAoZkl0ZW1zID09IG51bGwpIHsKLQkJCWZJdGVtcyA9IHBhcnNlU2VsZWN0b3IoZlRva2Vucyk7Ci0JCX0KLQkJcmV0dXJuIChmSXRlbXMgIT0gbnVsbCkgPyBmSXRlbXMuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudCkgZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy8gY2FzdCBlcnJvciBvciBudWxsIHBvaW50ZXIgLi4uCi0JCQllbGVtZW50ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgZ2V0UHJldmlvdXNFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlFbGVtZW50IHAgPSBudWxsOwotCQlmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlwID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIGEgc2VsZWN0b3IncyBzcGVjaWZpY2l0eSBhID0gdGhlIG51bWJlciBvZiBJRCBhdHRyaWJ1dGVzIGluCi0JICogdGhlIHNlbGVjdG9yIGIgPSB0aGUgbnVtYmVyIG9mIG90aGVyIGF0dHJpYnV0ZXMgYW5kIHBzZXVkby1jbGFzc2VzIGluCi0JICogdGhlIHNlbGVjdG9yIGMgPSB0aGUgbnVtYmVyIG9mIGVsZW1lbnQgbmFtZXMgaW4gdGhlIHNlbGVjdG9yIChpZ25vcmUKLQkgKiBwc2V1ZG8tZWxlbWVudHMpIENvbmNhdGVuYXRpbmcgdGhlIHRocmVlIG51bWJlcnMgYS1iLWMgKGluIGEgbnVtYmVyCi0JICogc3lzdGVtIHdpdGggYSBsYXJnZSBiYXNlKSBnaXZlcyB0aGUgc3BlY2lmaWNpdHkuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwZWNpZmljaXR5KCkgewotCQlpZiAoZlNwZWNpZmljaXR5IDwgMCkgewotCQkJaW50IG5JRHMgPSAwOwotCQkJaW50IG5BdHRyaWJ1dGVzID0gMDsKLQkJCWludCBuRWxlbWVudHMgPSAwOwotCQkJSXRlcmF0b3IgaSA9IGdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSAoSUNTU1NlbGVjdG9ySXRlbSkgaS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCQlDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciA9IChDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCQkJbklEcyArPSBzZWxlY3Rvci5nZXROdW1PZklEcygpOwotCQkJCQluQXR0cmlidXRlcyArPSBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKTsKLQkJCQkJbkF0dHJpYnV0ZXMgKz0gc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0JCQkJCW5BdHRyaWJ1dGVzICs9IHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKTsKLQkJCQkJaWYgKCFzZWxlY3Rvci5pc1VuaXZlcnNhbCgpKSB7Ci0JCQkJCQluRWxlbWVudHMrKzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZTcGVjaWZpY2l0eSA9IG5JRHMgKiAxMDAwMCArIG5BdHRyaWJ1dGVzICogMTAwICsgbkVsZW1lbnRzOwotCQl9Ci0KLQkJcmV0dXJuIGZTcGVjaWZpY2l0eTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUl0ZXJhdG9yIGkgPSBnZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGkubmV4dCgpOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSB7Ci0JCQkJCS8vIElmIGl0ZW0gaXMgREVTQ0VOREFOVCBjb21iaW5hdG9yLCBpdCBpcyBqdXN0IHNpbmdsZQotCQkJCQkvLyBzcGFjZS4KLQkJCQkJLy8gVGhlbiwgeW91IGRvbnQgaGF2ZSB0byBhcHBlbmQgc3RyaW5nLi4KLQkJCQkJaWYgKCgoQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSBpdGVtKS5nZXRDb21iaW5hdG9yVHlwZSgpICE9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVCkgewotCQkJCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1Zi5hcHBlbmQoaXRlbS5nZXRTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJ1Zi5hcHBlbmQoaXRlbS5nZXRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJZkNhY2hlZFN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIGZDYWNoZWRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChvcmcudzNjLmRvbS5FbGVtZW50IGVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcgcHNldWRvTmFtZSkgewotCQlFbGVtZW50IHRhcmdldCA9IGVsZW1lbnQ7Ci0JCWNoYXIgY29tYmluYXRvclR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLlVOS05PV047Ci0JCUVsZW1lbnQgY2h1bmtTdGFydEVsZW1lbnQgPSBudWxsOyAvLyBmb3IgQ0hJTEQgYW5kIEFESkFDRU5UCi0JCQkJCQkJCQkJCS8vIGNvbWJpbmF0b3IKLQkJaW50IGNodW5rU3RhcnRJdGVtID0gLTE7IC8vIGZvciBDSElMRCBhbmQgQURKQUNFTlQgY29tYmluYXRvcgotCQlpbnQgbnVtSXRlbXMgPSBnZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaUl0ZW0gPSBudW1JdGVtcyAtIDE7IGlJdGVtID49IDA7IGlJdGVtLS0pIHsKLQkJCS8vIENoZWNrIFNlbGVjdG9yIEl0ZW1zCi0JCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSBnZXRJdGVtKGlJdGVtKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgSUNTU1NpbXBsZVNlbGVjdG9yKSB7Ci0JCQkJLy8gU2ltcGxlIFNlbGVjdG9yCi0JCQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKCFtYXRjaEV4YWN0bHkoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSwgdGFyZ2V0LCBwc2V1ZG9OYW1lKSkgewotCQkJCQlzd2l0Y2ggKGNvbWJpbmF0b3JUeXBlKSB7Ci0JCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVCA6Ci0JCQkJCQkJZG8gewotCQkJCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KHRhcmdldCk7Ci0JCQkJCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQkJd2hpbGUgKCFtYXRjaEV4YWN0bHkoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSwgdGFyZ2V0LCBwc2V1ZG9OYW1lKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQ0hJTEQgOgotCQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkFESkFDRU5UIDoKLQkJCQkJCQlpZiAoY2h1bmtTdGFydEVsZW1lbnQgIT0gbnVsbCAmJiBjaHVua1N0YXJ0RWxlbWVudCAhPSBlbGVtZW50KSB7Ci0JCQkJCQkJCS8vIHByZXZpb3VzIGNvbmJpbmF0b3IgbXVzdCBiZSBERVNDRU5ERU5ULgotCQkJCQkJCQkvLyBnb3RvIHBhcmVudAotCQkJCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KGNodW5rU3RhcnRFbGVtZW50KTsKLQkJCQkJCQkJaUl0ZW0gPSBjaHVua1N0YXJ0SXRlbSArIDE7Ci0JCQkJCQkJCWNodW5rU3RhcnRFbGVtZW50ID0gbnVsbDsKLQkJCQkJCQkJY2h1bmtTdGFydEl0ZW0gPSAtMTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJLy8gb3RoZXIgY29tYmluYXRvcnMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSB7Ci0JCQkJLy8gQ29tYmluYXRvciAoICIrIiwgIj4iLCAiICIsIC4uLikKLQkJCQlpZiAoaUl0ZW0gPT0gbnVtSXRlbXMgLSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGxhc3QgaXRlbSBpcyBjb21iaW5hdG9yCi0KLQkJCQlJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIHNjID0gKElDU1NTZWxlY3RvckNvbWJpbmF0b3IpIGl0ZW07Ci0JCQkJY29tYmluYXRvclR5cGUgPSBzYy5nZXRDb21iaW5hdG9yVHlwZSgpOwotCQkJCXN3aXRjaCAoY29tYmluYXRvclR5cGUpIHsKLQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQgOgotCQkJCQkJdGFyZ2V0ID0gZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRCA6Ci0JCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5BREpBQ0VOVCA6Ci0JCQkJCQlpZiAoY2h1bmtTdGFydEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkJCWNodW5rU3RhcnRFbGVtZW50ID0gdGFyZ2V0OwotCQkJCQkJCWNodW5rU3RhcnRJdGVtID0gaUl0ZW0gKyAxOyAvLyBzYWZlIGJlY2F1c2UgdGhpcwotCQkJCQkJCQkJCQkJCQkvLyBpcyBub3QgYSBsYXN0IGl0ZW0uCi0JCQkJCQl9Ci0JCQkJCQlpZiAoY29tYmluYXRvclR5cGUgPT0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRCkgewotCQkJCQkJCXRhcmdldCA9IGdldFBhcmVudEVsZW1lbnQodGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXRhcmdldCA9IGdldFByZXZpb3VzRWxlbWVudCh0YXJnZXQpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2hhdCBpcyB0aGlzIGl0ZW0gPz8/Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIE9LIHRoaXMgc2VsZWN0b3IgbWFjaGVzIHRoZSBlbGVtZW50LgotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtYXRjaEV4YWN0bHkoSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCUlTdHlsZVNlbGVjdG9yQWRhcHRlciBhZGFwdGVyID0gKElTdHlsZVNlbGVjdG9yQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRBZGFwdGVyRm9yKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLm1hdGNoKHNlbGVjdG9yLCBlbGVtZW50LCBwc2V1ZG9OYW1lKTsKLQkJfQotCi0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBpOwotCQlTdHJpbmcga2V5OwotCi0JCS8vIFRPRE86IFBzZXVkb05hbWUKLQotCQkvLyBjaGVjayB0YWcgbmFtZQotCQlpZiAoIXNlbGVjdG9yLmlzVW5pdmVyc2FsKCkgJiYgIWVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoc2VsZWN0b3IuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZAotCQlpID0gc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlpZiAoaSA+IDEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJa2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGtleSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghc2VsZWN0b3IuZ2V0SUQoMCkuZXF1YWxzKGtleSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgY2xhc3MKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpOwotCQlpZiAoaSA+IDApIHsKLQkJCWtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihrZXkpOwotCQkJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCWlmIChzZWxlY3Rvci5nZXRDbGFzcyhpKS5lcXVhbHModG9rZW5pemVyLm5leHRUb2tlbigpKSkgewotCQkJCQkJb2sgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFvaykKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgYXR0cmlidXRlcwotCQlmb3IgKGkgPSBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWxlY3Rvci5nZXRBdHRyaWJ1dGUoaSksICI9fnwgXHRcclxuXGYiKTsvLyROT04tTkxTLTEkCi0JCQlpbnQgY291bnRUb2tlbnMgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJCWlmIChjb3VudFRva2VucyA+IDApIHsKLQkJCQlTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpZiAoYXR0clZhbHVlID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoY291bnRUb2tlbnMgPiAxKSB7Ci0JCQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oIj0gXHRcclxuXGYiKTsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1Rva2VuaXplciBhdHRyVmFsdWVUb2tlbml6ZXIgPSBudWxsOwotCQkJCQlpZiAodG9rZW4uZXF1YWxzKCJ+IikpIHsvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyVmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ8IikpIHsvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyVmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSwgIi0iKTsvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGF0dHJWYWx1ZVRva2VuaXplciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQkJCQl3aGlsZSAoYXR0clZhbHVlVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQlpZiAodG9rZW4uZXF1YWxzKGF0dHJWYWx1ZVRva2VuaXplci5uZXh0VG9rZW4oKSkpIHsKLQkJCQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghb2spCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmICghYXR0clZhbHVlLmVxdWFscyh0b2tlbikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHBhcnNlU2VsZWN0b3IoTGlzdCB0b2tlbnMpIHsKLQkJQ1NTU2VsZWN0b3JQYXJzZXIgcGFyc2VyID0gbmV3IENTU1NlbGVjdG9yUGFyc2VyKHRva2Vucyk7Ci0JCUxpc3Qgc2VsZWN0b3IgPSBwYXJzZXIuZ2V0U2VsZWN0b3IoKTsKLQkJSXRlcmF0b3IgaSA9IHBhcnNlci5nZXRFcnJvcnMoKTsKLQkJZlBhcnNlRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWZQYXJzZUVycm9ycy5hZGQoaS5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RvcjsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RXJyb3JzKCkgewotCQlpZiAoZk5hbWVFcnJvcnMgPT0gbnVsbCkgewotCQkJZk5hbWVFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBpSXRlbSA9IGdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaUl0ZW0uaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGlJdGVtLm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIElDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCQlpZiAoISgoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtKS5pc1VuaXZlcnNhbCgpKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9ICgoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtKS5nZXROYW1lKCk7Ci0JCQkJCQlpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKSkgewotCQkJCQkJCWZOYW1lRXJyb3JzLmFkZChpdGVtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoZlBhcnNlRXJyb3JzKTsKLQkJZXJyb3JzLmFkZEFsbChmTmFtZUVycm9ycyk7Ci0JCXJldHVybiBlcnJvcnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ1NTU2VsZWN0b3IjZ2V0RXJyb3JDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRFcnJvckNvdW50KCkgewotCQlpbnQgbkVycm9ycyA9IDA7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRFcnJvcnMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQluRXJyb3JzKys7Ci0JCQlpLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gbkVycm9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWVjYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3JDb21iaW5hdG9yOwotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTZWxlY3RvckNvbWJpbmF0b3IgZXh0ZW5kcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIHsKLQotCWNoYXIgZlR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLlVOS05PV047Ci0KLQkvKioKLQkgKiBDU1NTZWxlY3RvckNvbWJpbmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTU2VsZWN0b3JDb21iaW5hdG9yKGNoYXIgdHlwZSkgewotCQlzdXBlcigpOwotCQlzZXRDb21iaW5hdG9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiA9PSBudWxsIHx8IHRoaXMuZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDU1NTZWxlY3RvckNvbWJpbmF0b3IgZm9yZWlnbiA9IChDU1NTZWxlY3RvckNvbWJpbmF0b3IpIG9iajsKLQotCQlyZXR1cm4gKGdldENvbWJpbmF0b3JUeXBlKCkgPT0gZm9yZWlnbi5nZXRDb21iaW5hdG9yVHlwZSgpKTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGNoYXIgZ2V0Q29tYmluYXRvclR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbVR5cGUoKSB7Ci0JCXJldHVybiBDT01CSU5BVE9SOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGZUeXBlKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCXZvaWQgc2V0Q29tYmluYXRvclR5cGUoY2hhciB0eXBlKSB7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMWIzYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCS8qKgotCSAqIENTU1NlbGVjdG9ySXRlbSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDU1NTZWxlY3Rvckl0ZW0oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1UeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZmFhYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1NlbGVjdG9yTGlzdEltcGwgaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3JMaXN0IHsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ2FjaGVkU3RyaW5nID0gbnVsbDsgLy8gbm9ybWFsaXplZCBzdHJpbmcKLQlwcml2YXRlIExpc3QgZlNlbGVjdG9ycyA9IG51bGw7Ci0KLQlwdWJsaWMgQ1NTU2VsZWN0b3JMaXN0SW1wbChTdHJpbmcgY3NzVGV4dCkgewotCQlzdXBlcigpOwotCQlmVGV4dCA9IGNzc1RleHQ7Ci0JCXBhcnNlU2VsZWN0b3JUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogPT0gbnVsbCB8fCB0aGlzLmdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ1NTU2VsZWN0b3JMaXN0SW1wbCBmb3JlaWduID0gKENTU1NlbGVjdG9yTGlzdEltcGwpIG9iajsKLQotCQlpZiAoZ2V0TGVuZ3RoKCkgIT0gZm9yZWlnbi5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmICghZ2V0U2VsZWN0b3IoaSkuZXF1YWxzKGZvcmVpZ24uZ2V0U2VsZWN0b3IoaSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgSUNTU1NlbGVjdG9yIGdldFNlbGVjdG9yKGludCBpbmRleCkgewotCQlMaXN0IHNlbGVjdG9ycyA9IGdldFNlbGVjdG9ycygpOwotCQlpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IHNlbGVjdG9ycy5zaXplKCkpIHsKLQkJCXJldHVybiAoSUNTU1NlbGVjdG9yKSBzZWxlY3RvcnMuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJaWYgKGZTZWxlY3RvcnMgPT0gbnVsbCkgewotCQkJcGFyc2VTZWxlY3RvclRleHQoKTsKLQkJfQotCQlyZXR1cm4gZlNlbGVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYkZpcnN0ID0gdHJ1ZTsKLQkJCS8vIGdyb3VwcyBpcyBsaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBzZWxlY3RvcnMKLQkJCUl0ZXJhdG9yIGkgPSBnZXRTZWxlY3RvcnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCFiRmlyc3QpIHsKLQkJCQkJYnVmLmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUlDU1NTZWxlY3RvciBpdGVtID0gKElDU1NTZWxlY3RvcikgaS5uZXh0KCk7Ci0JCQkJYnVmLmFwcGVuZChpdGVtLmdldFN0cmluZygpKTsKLQkJCQliRmlyc3QgPSBmYWxzZTsKLQkJCX0KLQkJCWZDYWNoZWRTdHJpbmcgPSBidWYudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZkNhY2hlZFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJaW50IG5TZWxlY3RvcnMgPSBnZXRMZW5ndGgoKTsKLQkJc2VsZWN0b3JMaXN0TG9vcCA6IGZvciAoaW50IGlTZWxlY3RvciA9IDA7IGlTZWxlY3RvciA8IG5TZWxlY3RvcnM7IGlTZWxlY3RvcisrKSB7Ci0JCQkvLyBDaGVjayBlYWNoIFNlbGVjdG9yIExpc3RzCi0JCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihpU2VsZWN0b3IpOwotCQkJaWYgKHNlbGVjdG9yLm1hdGNoKGVsZW1lbnQsIHBzZXVkb05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VTZWxlY3RvclRleHQoKSB7Ci0JCWZTZWxlY3RvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChmVGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9TVFlMRVNIRUVULCBmVGV4dCk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCB0b2tlbkdyb3VwID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJQ1NTVGV4dFRva2VuIHRva2VuID0gdG9rZW5zW2ldOwotCQkJaWYgKHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUiAmJiAwIDwgdG9rZW5Hcm91cC5zaXplKCkpIHsKLQkJCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgQ1NTU2VsZWN0b3IodG9rZW5Hcm91cCk7Ci0JCQkJaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLQkJCQkJZlNlbGVjdG9ycy5hZGQoc2VsZWN0b3IpOwotCQkJCX0KLQkJCQl0b2tlbkdyb3VwLmNsZWFyKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0b2tlbkdyb3VwLmFkZCh0b2tlbnNbaV0pOwotCQkJfQotCQl9Ci0JCWlmICgwIDwgdG9rZW5Hcm91cC5zaXplKCkpIHsKLQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDU1NTZWxlY3Rvcih0b2tlbkdyb3VwKTsKLQkJCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JCQkJZlNlbGVjdG9ycy5hZGQoc2VsZWN0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFN0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRFcnJvcnMoKSB7Ci0JCUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpU2VsZWN0b3IgPSBnZXRTZWxlY3RvcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaVNlbGVjdG9yLmhhc05leHQoKSkgewotCQkJSXRlcmF0b3IgaUVycm9yID0gKChJQ1NTU2VsZWN0b3IpIGlTZWxlY3Rvci5uZXh0KCkpLmdldEVycm9ycygpOwotCQkJd2hpbGUgKGlFcnJvci5oYXNOZXh0KCkpIHsKLQkJCQllcnJvcnMuYWRkKGlFcnJvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlcnJvcnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVycm9yQ291bnQoKSB7Ci0JCWludCBuRXJyb3JzID0gMDsKLQkJSXRlcmF0b3IgaSA9IGdldEVycm9ycygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW5FcnJvcnMrKzsKLQkJCWkubmV4dCgpOwotCQl9Ci0JCXJldHVybiBuRXJyb3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOTExN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvclBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTZWxlY3RvckNvbWJpbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU2VsZWN0b3JQYXJzZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElETEUgPSAwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEUgPSAxOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSU1QTEUgPSAyOwotCi0JcHJpdmF0ZSBMaXN0IGZUb2tlbnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSXRlbXMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmRXJyb3JzID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1NlbGVjdG9yUGFyc2VyKExpc3QgdG9rZW5zKSB7Ci0JCXN1cGVyKCk7Ci0JCWZUb2tlbnMgPSBuZXcgQXJyYXlMaXN0KHRva2Vucyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JTGlzdCBnZXRTZWxlY3RvcigpIHsKLQkJaWYgKGZJdGVtcyA9PSBudWxsKSB7Ci0JCQlwYXJzZVNlbGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VTZWxlY3RvcigpIHsKLQkJZkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUxpc3QgYXR0ckJ1ZiA9IG51bGw7Ci0JCUNTU1NpbXBsZVNlbGVjdG9yIGl0ZW0gPSBudWxsOwotCi0JCWludCBzdGF0dXMgPSBJRExFOwotCQlJdGVyYXRvciBpID0gZlRva2Vucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1RleHRUb2tlbiB0b2tlbiA9IChDU1NUZXh0VG9rZW4pIGkubmV4dCgpOwotCQkJaWYgKHRva2VuID09IG51bGwgfHwgdG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJCWNhc2UgSURMRSA6Ci0JCQkJCWlmIChpc1RhZyh0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCWFwcGVuZFRhZyhpdGVtLCB0b2tlbik7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNJRCh0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCWFwcGVuZElEKGl0ZW0sIHRva2VuKTsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0NsYXNzKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJYXBwZW5kQ2xhc3MoaXRlbSwgdG9rZW4pOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzUHNldWRvKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJYXBwZW5kUHNldWRvKGl0ZW0sIHRva2VuKTsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0F0dHJpYnV0ZUJlZ2luKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJc3RhdHVzID0gQVRUUklCVVRFOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWRkRXJyb3IodG9rZW4pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU0lNUExFIDoKLQkJCQkJaWYgKGlzSUQodG9rZW4pKSB7Ci0JCQkJCQlhcHBlbmRJRChpdGVtLCB0b2tlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNDbGFzcyh0b2tlbikpIHsKLQkJCQkJCWFwcGVuZENsYXNzKGl0ZW0sIHRva2VuKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc1BzZXVkbyh0b2tlbikpIHsKLQkJCQkJCWFwcGVuZFBzZXVkbyhpdGVtLCB0b2tlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNBdHRyaWJ1dGVCZWdpbih0b2tlbikpIHsKLQkJCQkJCXN0YXR1cyA9IEFUVFJJQlVURTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0NvbWJpbmF0b3IodG9rZW4pKSB7IC8vIGNvbWJpbmF0b3IKLQkJCQkJCWNsb3NlSXRlbShpdGVtKTsKLQkJCQkJCWNsb3NlSXRlbShjcmVhdGVDb21iaW5hdG9yKHRva2VuKSk7Ci0JCQkJCQlzdGF0dXMgPSBJRExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWRkRXJyb3IodG9rZW4pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQVRUUklCVVRFIDoKLQkJCQkJaWYgKGlzQXR0cmlidXRlRW5kKHRva2VuKSkgewotCQkJCQkJYXBwZW5kQXR0cmlidXRlKGl0ZW0sIGF0dHJCdWYpOwotCQkJCQkJYXR0ckJ1ZiA9IG51bGw7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoYXR0ckJ1ZiA9PSBudWxsKSB7Ci0JCQkJCQkJYXR0ckJ1ZiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCX0KLQkJCQkJCWF0dHJCdWYuYWRkKHRva2VuKTsKLQkJCQkJCWlmICghaXNBdHRyaWJ1dGVDb250ZW50KHRva2VuKSkgewotCQkJCQkJCWFkZEVycm9yKHRva2VuKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQljbG9zZUl0ZW0oaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZUNvbnRlbnQoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQXR0cmlidXRlRW5kKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZUJlZ2luKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tYmluYXRvcihDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQc2V1ZG8oQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDbGFzcyhDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSUQoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1RhZyhDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTik7Ci0JfQotCi0JcHJpdmF0ZSBDU1NTaW1wbGVTZWxlY3RvciBjcmVhdGVTaW1wbGUoKSB7Ci0JCXJldHVybiBuZXcgQ1NTU2ltcGxlU2VsZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBpZiAiICIgb3IgIisiIG9yICI+IiBhcHBlYXJlZCwgY2xvc2Ugc2ltcGxlc2VsZWN0b3IgYW5kIGFkZCBuZXcKLQkgKiBjb21iaW5hdG9yCi0JICovCi0JcHJpdmF0ZSBDU1NTZWxlY3RvckNvbWJpbmF0b3IgY3JlYXRlQ29tYmluYXRvcihDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJY2hhciB0eXBlID0gMDsKLQotCQlTdHJpbmcgc3RyID0gdG9rZW4uaW1hZ2U7Ci0JCWlmIChzdHIudHJpbSgpLmxlbmd0aCgpID09IDApIHsgLy8gc3BhY2UKLQkJCXR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQ7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyLmVxdWFscygiKyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkFESkFDRU5UOwotCQl9Ci0JCWVsc2UgaWYgKHN0ci5lcXVhbHMoIj4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0eXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRDsKLQkJfQotCi0JCWlmICgwIDwgdHlwZSkgewotCQkJcmV0dXJuIG5ldyBDU1NTZWxlY3RvckNvbWJpbmF0b3IodHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZUl0ZW0oSUNTU1NlbGVjdG9ySXRlbSBpdGVtKSB7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCWZJdGVtcy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXBwZW5kVGFnKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIENTU1RleHRUb2tlbiB0b2tlbikgewotCQlpdGVtLnNldE5hbWUodG9rZW4uaW1hZ2UpOwotCQlpZiAodG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJYWRkRXJyb3IodG9rZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaWYgIiN4eHh4IiBhcHBlYXJlZCwgYWRkIElEIHRvIGN1cnJlbnQgc2VsZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kSUQoQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdG9rZW4udG9TdHJpbmcoKTsKLQkJU3RyaW5nIGlkQ29udGVudCA9IHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLmFkZElEKGlkQ29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogaWYgIi54eHh4IiBhcHBlYXJlZCwgYWRkIENsYXNzIHRvIGN1cnJlbnQgc2VsZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ2xhc3MoQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdG9rZW4udG9TdHJpbmcoKTsKLQkJU3RyaW5nIGNsYXNzQ29udGVudCA9IHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLmFkZENsYXNzKGNsYXNzQ29udGVudCk7Ci0JCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc0NvbnRlbnQuY2hhckF0KDApKSkgewotCQkJYWRkRXJyb3IodG9rZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaWYgIjp4eHh4IiBhcHBlYXJlZCwgYWRkIFBzZXVkbyhlbGVtZW50L2NsYXNzKSB0byBjdXJyZW50IHNlbGVjdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFBzZXVkbyhDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHRleHQgPSB0b2tlbi50b1N0cmluZygpOwotCQlTdHJpbmcgcHNldWRvQ29udGVudCA9IHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLmFkZFBzZXVkb05hbWUocHNldWRvQ29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZEF0dHJpYnV0ZShDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBMaXN0IHRva2VucykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCUNTU1RleHRUb2tlbiB0b2tlbjsKLQkJSXRlcmF0b3IgaSA9IHRva2Vucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCXRva2VuID0gKENTU1RleHRUb2tlbikgaS5uZXh0KCk7Ci0JCQlidWYuYXBwZW5kKHRva2VuLmltYWdlKTsKLQkJfQotCi0JCWl0ZW0uYWRkQXR0cmlidXRlKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlMaXN0IGdldFNlbGVjdG9yVGFncygpIHsKLQkJTGlzdCB0YWdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gdGFnTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRXJyb3IoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCWlmIChmRXJyb3JzID09IG51bGwpIHsKLQkJCWZFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZkVycm9ycy5hZGQodG9rZW4pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIGdldEVycm9ycygpIHsKLQkJcmV0dXJuIChmRXJyb3JzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpIDogZkVycm9ycy5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NpbXBsZVNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NpbXBsZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZDNmNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTaW1wbGVTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU2ltcGxlU2VsZWN0b3IgZXh0ZW5kcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2ltcGxlU2VsZWN0b3IgewotCi0JcHJpdmF0ZSBTdHJpbmcgZk5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZTdHJpbmdCdWYgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmUHNldWRvTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZBdHRyaWJ1dGUgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmQ2xhc3MgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSUQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTU2ltcGxlU2VsZWN0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTU2ltcGxlU2VsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgewotCQlpZiAoZkF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZBdHRyaWJ1dGUuYWRkKGF0dHJpYnV0ZSk7Ci0JCWFkZFRvQnVmKCJbIik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihhdHRyaWJ1dGUpOwotCQlhZGRUb0J1ZigiXSIpOy8vJE5PTi1OTFMtMSQKLQkJZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRDbGFzcyhTdHJpbmcgY2xzKSB7Ci0JCWlmIChmQ2xhc3MgPT0gbnVsbCkgewotCQkJZkNsYXNzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZDbGFzcy5hZGQoY2xzKTsKLQkJYWRkVG9CdWYoIi4iKTsvLyROT04tTkxTLTEkCi0JCWFkZFRvQnVmKGNscyk7Ci0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkSUQoU3RyaW5nIGlkKSB7Ci0JCWlmIChmSUQgPT0gbnVsbCkgewotCQkJZklEID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZJRC5hZGQoaWQpOwotCQlhZGRUb0J1ZigiIyIpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVG9CdWYoaWQpOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFkZFBzZXVkb05hbWUoU3RyaW5nIGNscykgewotCQlpZiAoZlBzZXVkb05hbWUgPT0gbnVsbCkgewotCQkJZlBzZXVkb05hbWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZlBzZXVkb05hbWUuYWRkKGNscyk7Ci0JCWFkZFRvQnVmKCI6Iik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihjbHMpOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVG9CdWYoU3RyaW5nIHN0cikgewotCQlpZiAoZlN0cmluZ0J1ZiA9PSBudWxsKSB7Ci0JCQlmU3RyaW5nQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JCWZTdHJpbmdCdWYuYXBwZW5kKHN0cik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogPT0gbnVsbCB8fCB0aGlzLmdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ1NTU2ltcGxlU2VsZWN0b3IgZm9yZWlnbiA9IChDU1NTaW1wbGVTZWxlY3Rvcikgb2JqOwotCi0JCWlmIChnZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldE5hbWUoKSkgIT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaTsKLQotCQkvLyBjb21wYXJlIHBzZXVkby1jbGFzc2VzIC8gcHNldWRvLWVsZW1lbnRzCi0JCWlmIChnZXROdW1PZlBzZXVkb05hbWVzKCkgIT0gZm9yZWlnbi5nZXROdW1PZlBzZXVkb05hbWVzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBnZXROdW1PZlBzZXVkb05hbWVzKCk7IGkrKykgewotCQkJaWYgKGdldFBzZXVkb05hbWUoaSkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldFBzZXVkb05hbWUoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY29tcGFyZSBjbGFzc2VzCi0JCWlmIChnZXROdW1PZkNsYXNzZXMoKSAhPSBmb3JlaWduLmdldE51bU9mQ2xhc3NlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZDbGFzc2VzKCk7IGkrKykgewotCQkJaWYgKGdldENsYXNzKGkpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZm9yZWlnbi5nZXRDbGFzcyhpKSkgIT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjb21wYXJlIElEcwotCQlpZiAoZ2V0TnVtT2ZJRHMoKSAhPSBmb3JlaWduLmdldE51bU9mSURzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBnZXROdW1PZklEcygpOyBpKyspIHsKLQkJCWlmIChnZXRJRChpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0SUQoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY29tcGFyZSBBdHRyaWJ1dGVzCi0JCWlmIChnZXROdW1PZkF0dHJpYnV0ZXMoKSAhPSBmb3JlaWduLmdldE51bU9mQXR0cmlidXRlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZBdHRyaWJ1dGVzKCk7IGkrKykgewotCQkJaWYgKGdldEF0dHJpYnV0ZShpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0QXR0cmlidXRlKGkpKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKGludCBpbmRleCkgewotCQlpZiAoZkF0dHJpYnV0ZSAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmQXR0cmlidXRlLnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZBdHRyaWJ1dGUuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3MoaW50IGluZGV4KSB7Ci0JCWlmIChmQ2xhc3MgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZkNsYXNzLnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZDbGFzcy5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRChpbnQgaW5kZXgpIHsKLQkJaWYgKGZJRCAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmSUQuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZklELmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1UeXBlKCkgewotCQlyZXR1cm4gU0lNUExFOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIChmTmFtZSAhPSBudWxsKSA/IGZOYW1lIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gKGZBdHRyaWJ1dGUgIT0gbnVsbCkgPyBmQXR0cmlidXRlLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZkNsYXNzZXMoKSB7Ci0JCXJldHVybiAoZkNsYXNzICE9IG51bGwpID8gZkNsYXNzLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZklEcygpIHsKLQkJcmV0dXJuIChmSUQgIT0gbnVsbCkgPyBmSUQuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bU9mUHNldWRvTmFtZXMoKSB7Ci0JCXJldHVybiAoZlBzZXVkb05hbWUgIT0gbnVsbCkgPyBmUHNldWRvTmFtZS5zaXplKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQc2V1ZG9OYW1lKGludCBpbmRleCkgewotCQlpZiAoZlBzZXVkb05hbWUgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZlBzZXVkb05hbWUuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZlBzZXVkb05hbWUuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0TmFtZSgpKTsKLQkJCWlmIChmU3RyaW5nQnVmICE9IG51bGwpIHsKLQkJCQlidWYuYXBwZW5kKGZTdHJpbmdCdWYudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlmQ2FjaGVkU3RyaW5nID0gYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGZDYWNoZWRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbml2ZXJzYWwoKSB7Ci0JCXJldHVybiAoZk5hbWUgPT0gbnVsbCB8fCBmTmFtZS5lcXVhbHMoIioiKSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlmTmFtZSA9IG5hbWU7Ci0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ2YzY2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBleHRlbmRzIENTU05vZGVJbXBsIHsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ1NTQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU0NvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3NzVGV4dCgpIHsKLQkJaWYgKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBnZW5lcmF0ZVNvdXJjZSgpOwotCi0JCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQl3aGlsZSAobm9kZSAhPSBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJCXN0ci5hcHBlbmQobm9kZS5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldEVuZCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgaW5kZXgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCWZvciAoaW50IGkgPSBpbmRleDsgaSA+IDA7IGktLSkgewotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpIHsKLQkJaWYgKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJaW50IGkgPSAwOwotCQlmb3IgKDsgbm9kZSAhPSBudWxsOyBpKyspCi0JCQlub2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCXJldHVybiBpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlyc3QKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5jb3JlLklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gbGFzdAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LmNvcmUuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCWJvb2xlYW4gaW5jbHVkZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCkgewotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCi0JCS8vIHZhbGlkYXRlIHJhbmdlIG9mIHBhcmFtZXRlcnMKLQkJaWYgKGZpcnN0ICE9IG51bGwgJiYgbGFzdCAhPSBudWxsKSB7Ci0JCQlpZiAoZmlyc3QuZ2V0U3RhcnQoKSA+IGxhc3QuZ2V0U3RhcnQoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZpcnN0OwotCQkJCWZpcnN0ID0gbGFzdDsKLQkJCQlsYXN0ID0gbm9kZTsKLQkJCX0KLQkJfQotCi0JCS8vIHZhbGlkYXRlIG1pbmUKLQkJYm9vbGVhbiBiID0gdmFsaWRhdGVSYW5nZSgpOwotCQliTW9kaWZpZWQgPSBiIHx8IGJNb2RpZmllZDsKLQotCQlpZiAoZmlyc3QgIT0gbnVsbCkgewotCQkJaWYgKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCB8fCBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0KCkgPiBmaXJzdC5nZXRTdGFydCgpKSB7Ci0JCQkJc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmlyc3QpOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGFzdCAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgfHwgZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0KCkgPCBsYXN0LmdldFN0YXJ0KCkpIHsKLQkJCQlzZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGxhc3QpOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZS12YWxpZGF0ZQotCQlpZiAoYk1vZGlmaWVkKQotCQkJdmFsaWRhdGVSYW5nZSgpOwotCi0JCXJldHVybiBiTW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBwcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50ID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gYk1vZGlmaWVkOwotCi0JCWJvb2xlYW4gYiA9IHBhcmVudC5pbmNsdWRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJYk1vZGlmaWVkID0gYiB8fCBiTW9kaWZpZWQ7Ci0KLQkJaWYgKGIpCi0JCQlwYXJlbnQucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gZWxzZSBuZWVkIG5vdCB1cGRhdGUgcmFuZ2Ugb2YgYW5jZXN0b3JzCi0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3NzVGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1RleHQoU3RyaW5nIGNzc1RleHQpIHsKLQkJaWYgKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCksIGdldEVuZE9mZnNldCgpIC0gZ2V0U3RhcnRPZmZzZXQoKSwgY3NzVGV4dCk7Ci0JCX0KLQkJZWxzZQotCQkJc3VwZXIuc2V0Q3NzVGV4dChjc3NUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5jb3JlLklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LmNvcmUuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuY29yZS5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5jb3JlLklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlyc3ROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuY29yZS5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGxhc3ROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuY29yZS5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0Jdm9pZCBzZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSkgewotCQlpZiAoZmlyc3ROb2RlICE9IG51bGwpCi0JCQlzZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmaXJzdE5vZGUpOwotCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkKLQkJCXNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obGFzdE5vZGUpOwotCi0JCWlmIChmaXJzdE5vZGUgPT0gbnVsbCAmJiBsYXN0Tm9kZSA9PSBudWxsKSB7Ci0JCQlzZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCXNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7IC8vIHJhbmdlIHZhbGlkYXRpb24KLQkJCXZhbGlkYXRlUmFuZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJhbmdlKCkgewotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCi0JCWlmIChmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsIHx8IGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLmxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMubGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5sYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGhpcy5maXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5maXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpID4gdGhpcy5sYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkpIHsKLQkJCQkvLyBuZWVkIHRvIHN3YXAgZmlyc3QgZm9yIGxhc3QKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQlmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGU7Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBiTW9kaWZpZWQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsSXRlbUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsSXRlbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkM2M0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbEl0ZW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5TdHlsZURlY2xJdGVtRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU3R5bGVEZWNsSXRlbUltcGwgZXh0ZW5kcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTU3R5bGVEZWNsSXRlbSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZlByb3BlcnR5TmFtZTsKLQotCS8qKgotCSAqIENTU1N0eWxlRGVjbEl0ZW1JbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbChDU1NTdHlsZURlY2xJdGVtSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQl0aGlzLmZQcm9wZXJ0eU5hbWUgPSB0aGF0LmZQcm9wZXJ0eU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ1NTU3R5bGVEZWNsSXRlbUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZlByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JcHVibGljIElDU1NQcmltaXRpdmVWYWx1ZSBhcHBlbmRWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gaW5zZXJ0VmFsdWVCZWZvcmUodmFsdWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudHJlZW1vZGVsLmNzcy5DU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVEZWNsSXRlbUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVZhbHVlU291cmNlKCkgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcih0aGlzKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsICYmIGZvcm1hdHRlciBpbnN0YW5jZW9mIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIpCi0JCQlyZXR1cm4gKChTdHlsZURlY2xJdGVtRm9ybWF0dGVyKSBmb3JtYXR0ZXIpLmZvcm1hdFZhbHVlKHRoaXMpLnRvU3RyaW5nKCk7Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWUKLQkgKi8KLQlwdWJsaWMgQ1NTVmFsdWUgZ2V0Q1NTVmFsdWUoKSB7Ci0JCWludCBuVmFsdWUgPSBnZXRMZW5ndGgoKTsKLQkJaWYgKG5WYWx1ZSA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKG5WYWx1ZSA9PSAxKQotCQkJcmV0dXJuIGl0ZW0oMCk7Ci0JCWVsc2UKLQkJCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENTU1ZhbHVlVGV4dCgpIHsKLQkJaWYgKGdldEZpcnN0Q2hpbGQoKSA9PSBudWxsKQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJLy8gY2hlY2sgd2hldGhlciBjaGlsZHJlbiBoYXMgZmxhdG5vZGVzCi0JCUlDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQkJcmV0dXJuIGdlbmVyYXRlVmFsdWVTb3VyY2UoKTsKLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIC0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBnZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgLSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCXJldHVybiBub2RlLmdldFRleHQoKS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRDc3NWYWx1ZVR5cGUoKSB7Ci0JCXJldHVybiBDU1NfVkFMVUVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkKLQkJCQlpKys7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFREVDTElURU1fTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShJTVBPUlRBTlQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gZlByb3BlcnR5TmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHJlZlZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgaW5zZXJ0VmFsdWVCZWZvcmUoSUNTU1ByaW1pdGl2ZVZhbHVlIG5ld1ZhbHVlLCBJQ1NTUHJpbWl0aXZlVmFsdWUgcmVmVmFsdWUpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIG5ld1ZhbHVlLCAoQ1NTTm9kZUltcGwpIHJlZlZhbHVlKTsKLQkJcmV0dXJuIChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBDU1NWYWx1ZSBpdGVtKGludCBpbmRleCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJCWlmIChpKysgPT0gaW5kZXgpCi0JCQkJCXJldHVybiAoQ1NTVmFsdWUpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCXB1YmxpYyBJQ1NTUHJpbWl0aXZlVmFsdWUgcmVtb3ZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJSUNTU05vZGUgbm9kZSA9IHJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgdmFsdWUpOwotCQlyZXR1cm4gKElDU1NQcmltaXRpdmVWYWx1ZSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlwdWJsaWMgSUNTU1ByaW1pdGl2ZVZhbHVlIHJlcGxhY2VWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgbmV3VmFsdWUsIElDU1NQcmltaXRpdmVWYWx1ZSBvbGRWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ld1ZhbHVlOwotCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkKLQkJCWluc2VydFZhbHVlQmVmb3JlKG5ld1ZhbHVlLCBvbGRWYWx1ZSk7Ci0JCXJldHVybiByZW1vdmVWYWx1ZShvbGRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1ZhbHVlVGV4dChTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlJQ1NTTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCUlDU1NOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQkJcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBjaGlsZCk7Ci0JCQl9Ci0JCQljaGlsZCA9IG5leHQ7Ci0JCX0KLQotCQkvLyB1c2UgdGVtcG9yYXJ5IGRvY3VtZW50Ci0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQkoKENTU1NvdXJjZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKS5zZXRQYXJzZXJNb2RlKENTU1NvdXJjZVBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnNldCh2YWx1ZSk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGUuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUNTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciBpdGVtUGFyc2VyID0gbmV3IENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlcihnZXRPd25lckRvY3VtZW50KCkpOwotCQlpdGVtUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudFRlbXBvcmFyeSh0cnVlKTsKLQkJaXRlbVBhcnNlci5zZXR1cFZhbHVlcyh0aGlzLCBub2RlLCBub2RlLmdldFJlZ2lvbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ByaW9yaXR5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoamF2YS5sYW5nLlN0cmluZyBuZXdQcmlvcml0eSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShJTVBPUlRBTlQsIG5ld1ByaW9yaXR5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTBiNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dCB7Ci0KLQlwcm90ZWN0ZWQgSUNTU0RvY3VtZW50IGZPd25lckRvY3VtZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb25lQ2hpbGROb2RlcyhJQ1NTTm9kZSBzcmMsIElDU1NOb2RlIGRlc3QpIHsKLQkJaWYgKGZPd25lckRvY3VtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShkZXN0IGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDU1NOb2RlSW1wbCBjb250YWluZXIgPSAoQ1NTTm9kZUltcGwpIGRlc3Q7Ci0JCWNvbnRhaW5lci5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHNyYy5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpIHsKLQkJCQkvLyBleHRyYWN0IHNob3J0aGFuZCBwcm9wZXJ0eSAuLgotCQkJCS8vIC0tPiBUZW1wCi0JCQkJSUNTU05vZGUgY2xvbmVkID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCQlpZiAoY2xvbmVkIGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCQkJKChDU1NOb2RlSW1wbCkgY2xvbmVkKS5zZXRPd25lckRvY3VtZW50KGZPd25lckRvY3VtZW50KTsKLQkJCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgY2xvbmVkKTsKLQkJCQkJY2xvbmVDaGlsZE5vZGVzKGNoaWxkLCBjbG9uZWQpOwotCQkJCX0KLQkJCQkvLyA8LS0gVGVtcAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSUNTU05vZGUgY2xvbmVkID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCQlpZiAoY2xvbmVkIGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCQkJKChDU1NOb2RlSW1wbCkgY2xvbmVkKS5zZXRPd25lckRvY3VtZW50KGZPd25lckRvY3VtZW50KTsKLQkJCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgY2xvbmVkKTsKLQkJCQkJY2xvbmVDaGlsZE5vZGVzKGNoaWxkLCBjbG9uZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlU3R5bGVEZWNsYXJhdGlvbigpIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZGVjbCA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCh0cnVlKTsKLQkJZGVjbC5zZXRPd25lckRvY3VtZW50KGRlY2wpOwotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMmM2ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENTU0RvY3VtZW50SW1wbCBpbXBsZW1lbnRzIElDU1NTdHlsZURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmSXNEb2N1bWVudDsKLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU1N0eWxlRGVjbEJsb2NrSW1wbAotCSAqLwotCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCXRoaXMuZklzRG9jdW1lbnQgPSB0aGF0LmZJc0RvY3VtZW50OwotCQlpZiAoZklzRG9jdW1lbnQpIHsKLQkJCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbChib29sZWFuIGlzRG9jdW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJZklzRG9jdW1lbnQgPSBpc0RvY3VtZW50OwotCQlpZiAoZklzRG9jdW1lbnQpIHsKLQkJCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jc3MuQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgY2xvbmVkID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jZWkuQ1NTU3R5bGVEZWNsSXRlbQotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbEl0ZW0gZ2V0RGVjbEl0ZW1Ob2RlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldExhc3RDaGlsZCgpOwotCQlwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUudHJpbSgpOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsKSB7Ci0JCQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZTsKLQkJCQlpZiAocHJvcGVydHlOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKS50cmltKCkpID09IDApCi0JCQkJCXJldHVybiBpdGVtOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IGkgPSAwOwotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsKQotCQkJCWkrKzsKLQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFREVDTEFSQVRJT05fTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgQ1NTIHJ1bGUgdGhhdCBjb250YWlucyB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgdGhpcyA8Y29kZT5DU1NTdHlsZURlY2xhcmF0aW9uPC9jb2RlPiBpcyBub3QgYXR0YWNoZWQgdG8gYQotCSAqIDxjb2RlPkNTU1J1bGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGdldFBhcmVudFJ1bGUoKSB7Ci0JCUlDU1NOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1J1bGUpCi0JCQlyZXR1cm4gKENTU1J1bGUpIHBhcmVudDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiBhIENTUwotCSAqIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IHdpdGhpbiB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIGEgc2hvcnRoYW5kCi0JICogcHJvcGVydHkuIFNob3J0aGFuZCBwcm9wZXJ0eSB2YWx1ZXMgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYW5kIG1vZGlmaWVkCi0JICogYXMgc3RyaW5ncywgdXNpbmcgdGhlIDxjb2RlPmdldFByb3BlcnR5VmFsdWU8L2NvZGU+IGFuZAotCSAqIDxjb2RlPnNldFByb3BlcnR5PC9jb2RlPiBtZXRob2RzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0Ci0JICogICAgICAgICBmb3IgdGhpcyBkZWNsYXJhdGlvbiBibG9jay4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIHByb3BlcnR5IGhhcyBub3QgYmVlbiBzZXQuCi0JICovCi0JcHVibGljIENTU1ZhbHVlIGdldFByb3BlcnR5Q1NTVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gZ2V0RGVjbEl0ZW1Ob2RlKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChpdGVtICE9IG51bGwpCi0JCQlyZXR1cm4gaXRlbS5nZXRDU1NWYWx1ZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSBwcmlvcml0eSBvZiBhIENTUyBwcm9wZXJ0eSAoZS5nLiB0aGUKLQkgKiA8Y29kZT4iaW1wb3J0YW50IjwvY29kZT4gcXVhbGlmaWVyKSBpZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4KLQkgKiBleHBsaWNpdGx5IHNldCBpbiB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcmlvcml0eSAoZS5nLgotCSAqICAgICAgICAgPGNvZGU+ImltcG9ydGFudCI8L2NvZGU+KSBpZiBvbmUgZXhpc3RzLiBUaGUgZW1wdHkgc3RyaW5nIGlmCi0JICogICAgICAgICBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5UHJpb3JpdHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gZ2V0RGVjbEl0ZW1Ob2RlKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChpdGVtICE9IG51bGwpCi0JCQlyZXR1cm4gaXRlbS5nZXRQcmlvcml0eSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIENTUyBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5Ci0JICogc2V0IHdpdGhpbiB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0Ci0JICogICAgICAgICBmb3IgdGhpcyBkZWNsYXJhdGlvbiBibG9jay4gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZQotCSAqICAgICAgICAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlDU1NWYWx1ZSB2YWx1ZSA9IGdldFByb3BlcnR5Q1NTVmFsdWUocHJvcGVydHlOYW1lKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlyZXR1cm4gKChJQ1NTVmFsdWUpIHZhbHVlKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZJc0RvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gZXhwbGljaXRseSBzZXQgaW4gdGhpcwotCSAqIGRlY2xhcmF0aW9uIGJsb2NrLiBUaGUgb3JkZXIgb2YgdGhlIHByb3BlcnRpZXMgcmV0cmlldmVkIHVzaW5nIHRoaXMKLQkgKiBtZXRob2QgZG9lcyBub3QgaGF2ZSB0byBiZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIHNldC4gVGhpcwotCSAqIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgYWxsIHByb3BlcnRpZXMgaW4gdGhpcyBkZWNsYXJhdGlvbgotCSAqIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgSW5kZXggb2YgdGhlIHByb3BlcnR5IG5hbWUgdG8gcmV0cmlldmUuCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYXQgdGhpcyBvcmRpbmFsIHBvc2l0aW9uLiBUaGUgZW1wdHkKLQkgKiAgICAgICAgIHN0cmluZyBpZiBubyBwcm9wZXJ0eSBleGlzdHMgYXQgdGhpcyBwb3NpdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgaSA9IDA7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpIHsKLQkJCQlpZiAoaSAhPSBpbmRleCkKLQkJCQkJaSsrOwotCQkJCWVsc2UgewotCQkJCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBpdGVtID0gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBub2RlOwotCQkJCQlyZXR1cm4gaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudHJlZW1vZGVsLmNlaS5DU1NTdHlsZURlY2xJdGVtCi0JICogQHBhcmFtIG9sZERlY2wKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jZWkuQ1NTU3R5bGVEZWNsSXRlbQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbEl0ZW0gcmVtb3ZlRGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG9sZERlY2wpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gKElDU1NTdHlsZURlY2xJdGVtKSByZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIG9sZERlY2wpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmVtb3ZlIGEgQ1NTIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IHdpdGhpbiB0aGlzCi0JICogZGVjbGFyYXRpb24gYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQKLQkgKiAgICAgICAgIGZvciB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlCi0JICogICAgICAgICBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0IG9yIHRoZSBwcm9wZXJ0eSBuYW1lIGRvZXMgbm90Ci0JICogICAgICAgICBjb3JyZXNwb25kIHRvIGEga25vd24gQ1NTIHByb3BlcnR5LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBkZWNsYXJhdGlvbgotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5IG9yIHRoZSBwcm9wZXJ0eSBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlbW92ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gZ2V0RGVjbEl0ZW1Ob2RlKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCXJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgaXRlbSk7Ci0JCQlyZXR1cm4gaXRlbS5nZXRDc3NUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8xNgotCSAqIDIzOjE4OjUxKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudHJlZW1vZGVsLmNlaS5DU1NTdHlsZURlY2xJdGVtCi0JICogQHBhcmFtIG5ld0RlY2wKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jZWkuQ1NTU3R5bGVEZWNsSXRlbQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbEl0ZW0gc2V0RGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG5ld0RlY2wpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IGdldERlY2xJdGVtTm9kZShuZXdEZWNsLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCXJldHVybiAoSUNTU1N0eWxlRGVjbEl0ZW0pIHJlcGxhY2VDaGlsZCgoQ1NTTm9kZUltcGwpIG5ld0RlY2wsIChDU1NOb2RlSW1wbCkgaXRlbSk7Ci0JCWVsc2UKLQkJCXJldHVybiAoSUNTU1N0eWxlRGVjbEl0ZW0pIGFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgbmV3RGVjbCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZSBhbmQgcHJpb3JpdHkgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24KLQkgKiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqIEBwYXJhbSBwcmlvcml0eQotCSAqICAgICAgICAgICAgVGhlIG5ldyBwcmlvcml0eSBvZiB0aGUgcHJvcGVydHkgKGUuZy4KLQkgKiAgICAgICAgICAgIDxjb2RlPiJpbXBvcnRhbnQiPC9jb2RlPikuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBoYXMgYSBzeW50YXgKLQkgKiAgICAgICAgICAgICAgICBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgZGVjbGFyYXRpb24KLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seSBvciB0aGUgcHJvcGVydHkgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgcHJpb3JpdHkpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gWW91IGNhbiB1c2UgdGhpcyBvbmx5IGlmIENTU1ZhbHVlLnNldENzc1RleHQoKSBpcyBpbXBsZW1lbnRlZAotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBpdGVtID0gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBnZXREZWNsSXRlbU5vZGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJaXRlbSA9IChDU1NTdHlsZURlY2xJdGVtSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1N0eWxlRGVjbEl0ZW0ocHJvcGVydHlOYW1lKTsKLQkJCWFwcGVuZENoaWxkKGl0ZW0pOwotCQl9Ci0KLQkJLy8gSUNTU05vZGUgbmV4dCA9IGl0ZW0uZ2V0TmV4dFNpYmxpbmcoKTsKLQkJLy8gcmVtb3ZlQ2hpbGQoaXRlbSk7Ci0KLQkJaXRlbS5zZXRDc3NWYWx1ZVRleHQodmFsdWUpOwotCQlpdGVtLnNldFByaW9yaXR5KHByaW9yaXR5KTsKLQotCQkvLyBpbnNlcnRCZWZvcmUoaXRlbSwgKENTU05vZGVJbXBsKW5leHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2JiZTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU3R5bGVSdWxlSW1wbCBleHRlbmRzIENTU1J1bGVEZWNsQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU1N0eWxlUnVsZSB7Ci0KLQlJQ1NTU2VsZWN0b3JMaXN0IGZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChudWxsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTU3R5bGVSdWxlSW1wbAotCSAqLwotCUNTU1N0eWxlUnVsZUltcGwoQ1NTU3R5bGVSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTU3R5bGVSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVSdWxlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGV4dHJhY3RQcmVTdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRTZWxlY3RvclRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JMaXN0Ci0JICovCi0JcHVibGljIElDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCkgewotCQlyZXR1cm4gZlNlbGVjdG9yTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2VsZWN0b3IgZm9yIHRoZSBydWxlIHNldC4gVGhlCi0JICogaW1wbGVtZW50YXRpb24gbWF5IGhhdmUgc3RyaXBwZWQgb3V0IGluc2lnbmlmaWNhbnQgd2hpdGVzcGFjZSB3aGlsZQotCSAqIHBhcnNpbmcgdGhlIHNlbGVjdG9yLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgQ1NTIHN0cmluZyB2YWx1ZSBoYXMKLQkgKiAgICAgICAgICAgICAgICBhIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcnVsZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUZXh0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFNFTEVDVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBTVFlMRV9SVUxFOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yVGV4dChTdHJpbmcgc2VsZWN0b3JUZXh0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKFNFTEVDVE9SLCBzZWxlY3RvclRleHQpOwotCQlmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoc2VsZWN0b3JUZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVNoZWV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVNoZWV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTRjMjlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVTaGVldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1N0eWxlU2hlZXRJbXBsIGV4dGVuZHMgQ1NTRG9jdW1lbnRJbXBsIGltcGxlbWVudHMgSUNTU1N0eWxlU2hlZXQgewotCi0KLQljbGFzcyBJbnRlcm5hbE5vZGVMaXN0IGltcGxlbWVudHMgTm9kZUxpc3QgewotCi0JCVZlY3RvciBub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCWlmIChub2RlcyA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJZWxzZQotCQkJCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpKSB7Ci0JCQlpZiAobm9kZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpIDwgMCB8fCBub2Rlcy5zaXplKCkgPD0gaSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoTm9kZSkgbm9kZXMuZ2V0KGkpOwotCQl9Ci0JfQotCi0JY2xhc3MgSW50ZXJuYWxTdHlsZVNoZWV0TGlzdCBleHRlbmRzIEFic3RyYWN0Q1NTTm9kZUxpc3QgaW1wbGVtZW50cyBTdHlsZVNoZWV0TGlzdCB7Ci0KLQkJcHVibGljIElDU1NOb2RlIGFwcGVuZE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQkJaWYgKG5vZGVzID09IG51bGwgfHwgIW5vZGVzLmNvbnRhaW5zKG5vZGUpKQotCQkJCXJldHVybiBzdXBlci5hcHBlbmROb2RlKG5vZGUpOwotCQkJZWxzZQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0KLQkJcHVibGljIFN0eWxlU2hlZXQgaXRlbShpbnQgaSkgewotCQkJcmV0dXJuIChTdHlsZVNoZWV0KSBpdGVtSW1wbChpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmRGlzYWJsZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlU2hlZXRJbXBsKCkgewotCQlzdXBlcigpOwotCQlzZXRPd25lckRvY3VtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNTU1N0eWxlU2hlZXRJbXBsCi0JICovCi0JQ1NTU3R5bGVTaGVldEltcGwoQ1NTU3R5bGVTaGVldEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBhcHBlbmRSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jc3MuQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTU3R5bGVTaGVldEltcGwgY2xvbmVkID0gbmV3IENTU1N0eWxlU2hlZXRJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTQ2hhcnNldFJ1bGUgY3JlYXRlQ1NTQ2hhcnNldFJ1bGUoKSB7Ci0JCUNTU0NoYXJzZXRSdWxlSW1wbCBydWxlID0gbmV3IENTU0NoYXJzZXRSdWxlSW1wbCgpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZQotCSAqLwotCXB1YmxpYyBDU1NGb250RmFjZVJ1bGUgY3JlYXRlQ1NTRm9udEZhY2VSdWxlKCkgewotCQlDU1NGb250RmFjZVJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTRm9udEZhY2VSdWxlSW1wbCgpOwotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBzdHlsZSA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCXJ1bGUuYXBwZW5kQ2hpbGQoc3R5bGUpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTSW1wb3J0UnVsZSBjcmVhdGVDU1NJbXBvcnRSdWxlKCkgewotCQlDU1NJbXBvcnRSdWxlSW1wbCBydWxlID0gbmV3IENTU0ltcG9ydFJ1bGVJbXBsKCk7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWEgPSAoTWVkaWFMaXN0SW1wbCkgY3JlYXRlTWVkaWFMaXN0KCk7Ci0KLQkJcnVsZS5hcHBlbmRDaGlsZChtZWRpYSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5JQ1NTTWVkaWFSdWxlCi0JICovCi0JcHVibGljIElDU1NNZWRpYVJ1bGUgY3JlYXRlQ1NTTWVkaWFSdWxlKCkgewotCQlDU1NNZWRpYVJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTTWVkaWFSdWxlSW1wbCgpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhID0gKE1lZGlhTGlzdEltcGwpIGNyZWF0ZU1lZGlhTGlzdCgpOwotCi0JCXJ1bGUuaW5zZXJ0QmVmb3JlKG1lZGlhLCAoQ1NTTm9kZUltcGwpIHJ1bGUuZ2V0Rmlyc3RDaGlsZCgpKTsgLy8gbWVkaWEKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvcAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNoaWxkcmVuCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBsaXN0Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQYWdlUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTUGFnZVJ1bGUgY3JlYXRlQ1NTUGFnZVJ1bGUoKSB7Ci0JCUNTU1BhZ2VSdWxlSW1wbCBydWxlID0gbmV3IENTU1BhZ2VSdWxlSW1wbCgpOwotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBzdHlsZSA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCXJ1bGUuYXBwZW5kQ2hpbGQoc3R5bGUpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENTU1J1bGUgY3JlYXRlQ1NTUnVsZShTdHJpbmcgcnVsZSkgewotCQlDU1NEb2N1bWVudExvYWRlciBsb2FkZXIgPSBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0KHJ1bGUpOwotCi0JCUNTU01vZGVsUGFyc2VyIG1vZGVsUGFyc2VyID0gbmV3IENTU01vZGVsUGFyc2VyKChDU1NEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCXJldHVybiBtb2RlbFBhcnNlci5jcmVhdGVDU1NSdWxlKHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZGVjbCA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbChmYWxzZSk7Ci0JCWRlY2wuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlUnVsZSBjcmVhdGVDU1NTdHlsZVJ1bGUoKSB7Ci0JCUNTU1N0eWxlUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NTdHlsZVJ1bGVJbXBsKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHN0eWxlID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkJcnVsZS5hcHBlbmRDaGlsZChzdHlsZSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZQotCSAqLwotCXB1YmxpYyBDU1NVbmtub3duUnVsZSBjcmVhdGVDU1NVbmtub3duUnVsZSgpIHsKLQkJQ1NTVW5rbm93blJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTVW5rbm93blJ1bGVJbXBsKCk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdAotCSAqLwotCXB1YmxpYyBNZWRpYUxpc3QgY3JlYXRlTWVkaWFMaXN0KCkgewotCQlNZWRpYUxpc3RJbXBsIG1lZGlhID0gbmV3IE1lZGlhTGlzdEltcGwoKTsKLQkJbWVkaWEuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gbWVkaWE7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBkZWxldGUgYSBydWxlIGZyb20gdGhlIHN0eWxlIHNoZWV0LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGxpc3Qgb2YgdGhlIHJ1bGUgdG8KLQkgKiAgICAgICAgICAgIHJlbW92ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBkb2VzIG5vdAotCSAqICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gYSBydWxlIGluIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBzdHlsZSBzaGVldAotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJ1bGUoaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldEluZGV4ZWRSdWxlKGluZGV4KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBsaXN0IG9mIGFsbCBDU1MgcnVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQuIFRoaXMKLQkgKiBpbmNsdWRlcyBib3RoIHJ1bGUgc2V0cyBhbmQgYXQtcnVsZXMuCi0JICovCi0JcHVibGljIENTU1J1bGVMaXN0IGdldENzc1J1bGVzKCkgewotCQlDU1NSdWxlTGlzdEltcGwgbGlzdCA9IG5ldyBDU1NSdWxlTGlzdEltcGwoKTsKLQotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJbGlzdC5hcHBlbmROb2RlKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBzdHlsZSBzaGVldCBpcyBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudC4KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyBub3QuIE1vZGlmeWluZyB0aGlzIGF0dHJpYnV0ZSBtYXkgY2F1c2UgYQotCSAqIG5ldyByZXNvbHV0aW9uIG9mIHN0eWxlIGZvciB0aGUgZG9jdW1lbnQuIEEgc3R5bGVzaGVldCBvbmx5IGFwcGxpZXMgaWYKLQkgKiBib3RoIGFuIGFwcHJvcHJpYXRlIG1lZGl1bSBkZWZpbml0aW9uIGlzIHByZXNlbnQgYW5kIHRoZSBkaXNhYmxlZAotCSAqIGF0dHJpYnV0ZSBpcyBmYWxzZS4gU28sIGlmIHRoZSBtZWRpYSBkb2Vzbid0IGFwcGx5IHRvIHRoZSBjdXJyZW50IHVzZXIKLQkgKiBhZ2VudCwgdGhlIDxjb2RlPmRpc2FibGVkPC9jb2RlPiBhdHRyaWJ1dGUgaXMgaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREaXNhYmxlZCgpIHsKLQkJcmV0dXJuIGZEaXNhYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3R5bGUgc2hlZXQgaXMgYSBsaW5rZWQgc3R5bGUgc2hlZXQsIHRoZSB2YWx1ZSBvZiBpdHMgYXR0cmlidXRlCi0JICogaXMgaXRzIGxvY2F0aW9uLiBGb3IgaW5saW5lIHN0eWxlIHNoZWV0cywgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlCi0JICogaXMgPGNvZGU+bnVsbDwvY29kZT4uIFNlZSB0aGUgaHJlZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlCi0JICogPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudCBpbiBIVE1MIDQuMCwgYW5kIHRoZSBocmVmIHBzZXVkby1hdHRyaWJ1dGUKLQkgKiBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldCBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCXJldHVybiBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCS8qCi0JCQkgKiBPYmplY3QgaWQgPSBtb2RlbC5nZXRJZCgpOyBpZiAoaWQgIT0gbnVsbCkgeyBpZiAoaWQgaW5zdGFuY2VvZgotCQkJICogSVJlc291cmNlKSB7IC8vIFRPRE86IG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGlzIGlzIGNvcnJlY3Qgb3IKLQkJCSAqIG5vdCwgbGF0ZXIuIHJldHVybiAoKElSZXNvdXJjZSlpZCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOyB9Ci0JCQkgKiByZXR1cm4gaWQudG9TdHJpbmcoKTsgfQotCQkJICovfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTUnVsZUltcGwKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCUNTU1J1bGVJbXBsIGdldEluZGV4ZWRSdWxlKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJaWYgKGkrKyA9PSBpbmRleCkKLQkJCQkJcmV0dXJuIChDU1NSdWxlSW1wbCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW50ZW5kZWQgZGVzdGluYXRpb24gbWVkaWEgZm9yIHN0eWxlIGluZm9ybWF0aW9uLiBUaGUgbWVkaWEgaXMKLQkgKiBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPm93bmVyTm9kZTwvY29kZT4uIElmIG5vIG1lZGlhIGhhcyBiZWVuCi0JICogc3BlY2lmaWVkLCB0aGUgPGNvZGU+TWVkaWFMaXN0PC9jb2RlPiB3aWxsIGJlIGVtcHR5LiBTZWUgdGhlIG1lZGlhCi0JICogYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZSA8Y29kZT5MSU5LPC9jb2RlPiBlbGVtZW50IGluIEhUTUwgNC4wLAotCSAqIGFuZCB0aGUgbWVkaWEgcHNldWRvLWF0dHJpYnV0ZSBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldCBwcm9jZXNzaW5nCi0JICogaW5zdHJ1Y3Rpb24gLiBNb2RpZnlpbmcgdGhlIG1lZGlhIGxpc3QgbWF5IGNhdXNlIGEgY2hhbmdlIHRvIHRoZQotCSAqIGF0dHJpYnV0ZSA8Y29kZT5kaXNhYmxlZDwvY29kZT4uCi0JICovCi0JcHVibGljIE1lZGlhTGlzdCBnZXRNZWRpYSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFU0hFRVRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbm9kZSB0aGF0IGFzc29jaWF0ZXMgdGhpcyBzdHlsZSBzaGVldCB3aXRoIHRoZSBkb2N1bWVudC4gRm9yIEhUTUwsCi0JICogdGhpcyBtYXkgYmUgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+TElOSzwvY29kZT4gb3IgPGNvZGU+U1RZTEU8L2NvZGU+Ci0JICogZWxlbWVudC4gRm9yIFhNTCwgaXQgbWF5IGJlIHRoZSBsaW5raW5nIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIEZvcgotCSAqIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBieSBvdGhlciBzdHlsZSBzaGVldHMsIHRoZSB2YWx1ZSBvZiB0aGlzCi0JICogYXR0cmlidXRlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldE93bmVyTm9kZSgpIHsKLQkJLy8gZm9yIDxMSU5LPiB0YWcgb3IgPFNUWUxFPiB0YWcKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQlyZXR1cm4gbW9kZWwuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZUxpc3QgZ2V0T3duZXJOb2RlcygpIHsKLQkJTGlzdCBsaXN0ID0gKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSA/IG5ldyBWZWN0b3IoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpKSA6IG51bGw7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZXJuYWxOb2RlTGlzdCBub2RlcyA9IG5ldyBJbnRlcm5hbE5vZGVMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTdHlsZVNoZWV0QWRhcHRlcikgewotCQkJCW5vZGVzLm5vZGVzLmFkZCgoKElTdHlsZVNoZWV0QWRhcHRlcikgb2JqKS5nZXRFbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gbm9kZXM7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKiBAcGFyYW0gZG9jCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRPd25lck5vZGVzKERvY3VtZW50IGRvYykgewotCQlMaXN0IGxpc3QgPSAoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpID8gbmV3IFZlY3RvcihnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkpIDogbnVsbDsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlcm5hbE5vZGVMaXN0IG5vZGVzID0gbmV3IEludGVybmFsTm9kZUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSB7Ci0JCQkJRWxlbWVudCBlbGUgPSAoKElTdHlsZVNoZWV0QWRhcHRlcikgb2JqKS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZS5nZXRPd25lckRvY3VtZW50KCkgPT0gZG9jKQotCQkJCQlub2Rlcy5ub2Rlcy5hZGQoZWxlKTsKLQkJCX0KLQkJfQotCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIG5vZGVzOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHN0eWxlIHNoZWV0IGNvbWVzIGZyb20gYW4gPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSwgdGhlIDxjb2RlPm93bmVyUnVsZTwvY29kZT4gYXR0cmlidXRlIHdpbGwKLQkgKiAgICAgICAgIGNvbnRhaW4gdGhlIDxjb2RlPkNTU0ltcG9ydFJ1bGU8L2NvZGU+LiBJbiB0aGF0IGNhc2UsIHRoZQotCSAqICAgICAgICAgPGNvZGU+b3duZXJOb2RlPC9jb2RlPiBhdHRyaWJ1dGUgaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5TdHlsZVNoZWV0PC9jb2RlPiBpbnRlcmZhY2Ugd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAgICAgICAgIElmIHRoZSBzdHlsZSBzaGVldCBjb21lcyBmcm9tIGFuIGVsZW1lbnQgb3IgYSBwcm9jZXNzaW5nCi0JICogICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIDxjb2RlPm93bmVyUnVsZTwvY29kZT4gYXR0cmlidXRlIHdpbGwgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGFuZCB0aGUgPGNvZGU+b3duZXJOb2RlPC9jb2RlPiBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIHdpbGwgY29udGFpbiB0aGUgPGNvZGU+Tm9kZTwvY29kZT4uCi0JICovCi0JcHVibGljIENTU1J1bGUgZ2V0T3duZXJSdWxlKCkgewotCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCBDU1NDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlWW91X2Nhbm5vdF91c2VfQ1NTU3R5bGVTaGVfVUlfIikpOyAvLyROT04tTkxTLTEkID0gIllvdSBjYW5ub3QgdXNlIENTU1N0eWxlU2hlZXQuZ2V0T3duZXJSdWxlKCkgYmVjYXVzZSBvZiBtYW55IHJlZmVyZW5jZXJzIG9mIHRoaXMgcnVsZVxuUGxlYXNlIHVzZSBnZXRPbndlclJ1bGVzKCkiCi0JCS8vIGZvciBAaW1wb3J0Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0Ci0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdCBnZXRPd25lclJ1bGVzKCkgewotCQlTdHlsZVNoZWV0TGlzdCBsaXN0ID0gZ2V0UGFyZW50U3R5bGVTaGVldHMoKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDU1NSdWxlTGlzdEltcGwgcnVsZUxpc3QgPSBuZXcgQ1NTUnVsZUxpc3RJbXBsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3Rvcih0aGlzKTsKLQkJCXRyYXYuYXBwbHkoKElDU1NTdHlsZVNoZWV0KSBsaXN0Lml0ZW0oaSkpOwotCQkJcnVsZUxpc3Qubm9kZXMuYWRkQWxsKHRyYXYuZ2V0UnVsZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJ1bGVMaXN0OwotCX0KLQotCS8qKgotCSAqIEZvciBzdHlsZSBzaGVldCBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IHRoZSBjb25jZXB0IG9mIHN0eWxlIHNoZWV0Ci0JICogaW5jbHVzaW9uLCB0aGlzIGF0dHJpYnV0ZSByZXByZXNlbnRzIHRoZSBpbmNsdWRpbmcgc3R5bGUgc2hlZXQsIGlmIG9uZQotCSAqIGV4aXN0cy4gSWYgdGhlIHN0eWxlIHNoZWV0IGlzIGEgdG9wLWxldmVsIHN0eWxlIHNoZWV0LCBvciB0aGUgc3R5bGUKLQkgKiBzaGVldCBsYW5ndWFnZSBkb2VzIG5vdCBzdXBwb3J0IGluY2x1c2lvbiwgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlCi0JICogaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0UGFyZW50U3R5bGVTaGVldCgpIHsKLQkJQ1NTUnVsZSBvd25lciA9IGdldE93bmVyUnVsZSgpOwotCQlpZiAob3duZXIgIT0gbnVsbCkKLQkJCXJldHVybiBvd25lci5nZXRQYXJlbnRTdHlsZVNoZWV0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QgZ2V0UGFyZW50U3R5bGVTaGVldHMoKSB7Ci0JCUxpc3QgbGlzdCA9IChnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgPyBuZXcgVmVjdG9yKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSkgOiBudWxsOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsU3R5bGVTaGVldExpc3Qgc2hlZXRzID0gbmV3IEludGVybmFsU3R5bGVTaGVldExpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQkJc2hlZXRzLmFwcGVuZE5vZGUoKChJQ1NTTW9kZWwpIG9iaikuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNoZWV0cy5nZXRMZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gc2hlZXRzOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYWR2aXNvcnkgdGl0bGUuIFRoZSB0aXRsZSBpcyBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlCi0JICogPGNvZGU+b3duZXJOb2RlPC9jb2RlPi4gU2VlIHRoZSB0aXRsZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlCi0JICogPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudCBpbiBIVE1MIDQuMCwgYW5kIHRoZSB0aXRsZSBwc2V1ZG8tYXR0cmlidXRlCi0JICogZm9yIHRoZSBYTUwgc3R5bGUgc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lck5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBub2RlKS5nZXRBdHRyaWJ1dGUoIlRJVExFIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIHRoZSBzdHlsZSBzaGVldCBsYW5ndWFnZSBmb3IgdGhpcyBzdHlsZSBzaGVldC4gVGhlIHN0eWxlCi0JICogc2hlZXQgbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkIGFzIGEgY29udGVudCB0eXBlIChlLmcuICJ0ZXh0L2NzcyIpLiBUaGUKLQkgKiBjb250ZW50IHR5cGUgaXMgb2Z0ZW4gc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5vd25lck5vZGU8L2NvZGU+LiBBbHNvCi0JICogc2VlIHRoZSB0eXBlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUgPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudAotCSAqIGluIEhUTUwgNC4wLCBhbmQgdGhlIHR5cGUgcHNldWRvLWF0dHJpYnV0ZSBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldAotCSAqIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lck5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBub2RlKS5nZXRBdHRyaWJ1dGUoIlRZUEUiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBpbnNlcnQgYSBuZXcgcnVsZSBpbnRvIHRoZSBzdHlsZSBzaGVldC4gVGhlIG5ldyBydWxlIG5vdwotCSAqIGJlY29tZXMgcGFydCBvZiB0aGUgY2FzY2FkZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgVGhlIHBhcnNhYmxlIHRleHQgcmVwcmVzZW50aW5nIHRoZSBydWxlLiBGb3IgcnVsZSBzZXRzIHRoaXMKLQkgKiAgICAgICAgICAgIGNvbnRhaW5zIGJvdGggdGhlIHNlbGVjdG9yIGFuZCB0aGUgc3R5bGUgZGVjbGFyYXRpb24uIEZvcgotCSAqICAgICAgICAgICAgYXQtcnVsZXMsIHRoaXMgc3BlY2lmaWVzIGJvdGggdGhlIGF0LWlkZW50aWZpZXIgYW5kIHRoZSBydWxlCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGxpc3Qgb2YgdGhlIHJ1bGUKLQkgKiAgICAgICAgICAgIGJlZm9yZSB3aGljaCB0byBpbnNlcnQgdGhlIHNwZWNpZmllZCBydWxlLiBJZiB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICAgICBpbmRleCBpcyBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24sIHRoZSBydWxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3R5bGUKLQkgKiAgICAgICAgICAgIHNoZWV0LgotCSAqIEByZXR1cm4gVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlIG5ld2x5Ci0JICogICAgICAgICBpbnNlcnRlZCBydWxlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIHJ1bGUgY2Fubm90IGJlCi0JICogICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBlLmcuIGlmIGFuCi0JICogICAgICAgICAgICAgICAgPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSBpcyBpbnNlcnRlZCBhZnRlciBhIHN0YW5kYXJkIHJ1bGUgc2V0IG9yIG90aGVyCi0JICogICAgICAgICBhdC1ydWxlLiA8YnI+Ci0JICogICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggaXMgbm90IGEgdmFsaWQKLQkgKiAgICAgICAgIGluc2VydGlvbiBwb2ludC4gPGJyPgotCSAqICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBzdHlsZSBzaGVldCBpcwotCSAqICAgICAgICAgcmVhZG9ubHkuIDxicj4KLQkgKiAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHJ1bGUgaGFzIGEgc3ludGF4IGVycm9yIGFuZAotCSAqICAgICAgICAgaXMgdW5wYXJzYWJsZS4KLQkgKi8KLQlwdWJsaWMgaW50IGluc2VydFJ1bGUoU3RyaW5nIHJ1bGUsIGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWludCBsZW5ndGggPSBnZXRDc3NSdWxlcygpLmdldExlbmd0aCgpOwotCQlpZiAoaW5kZXggPCAwIHx8IGxlbmd0aCA8IGluZGV4KQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBnZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDU1NSdWxlSW1wbCByZWZSdWxlID0gKGxlbmd0aCAhPSBpbmRleCkgPyBnZXRJbmRleGVkUnVsZShpbmRleCkgOiBudWxsOwotCQlpbnQgb2Zmc2V0ID0gKHJlZlJ1bGUgIT0gbnVsbCkgPyByZWZSdWxlLmdldFN0YXJ0T2Zmc2V0KCkgOiBkb2MuZ2V0TGVuZ3RoKCk7Ci0JCWRvYy5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIHJ1bGUpOwotCi0JCS8vIGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIGNyZWF0ZUNTU1J1bGUocnVsZSkscmVmUnVsZSk7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld1J1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJlZlJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIGluc2VydFJ1bGVCZWZvcmUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgbmV3UnVsZSwgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVmUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdSdWxlID09IG51bGwgJiYgcmVmUnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgaW5zZXJ0QmVmb3JlKChDU1NOb2RlSW1wbCkgbmV3UnVsZSwgKENTU05vZGVJbXBsKSByZWZSdWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZW1vdmVSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlcGxhY2VSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG9sZFJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIG9sZFJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlcGxhY2VDaGlsZCgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgb2xkUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogc2V0RGlzYWJsZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWQoYm9vbGVhbiBkaXNhYmxlZCkgewotCQl0aGlzLmZEaXNhYmxlZCA9IGRpc2FibGVkOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1Vua25vd25SdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NVbmtub3duUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiZDk4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1Vua25vd25SdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NVbmtub3duUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlSW1wbCBpbXBsZW1lbnRzIENTU1Vua25vd25SdWxlIHsKLQotCS8vIFRPRE86IFRoaXMgZmllbGQgaXMgbmV2ZXIgcmVhZAotCVN0cmluZyBmQ3NzVGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NVbmtub3duUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy50cmVlbW9kZWwuQ1NTVW5rbm93blJ1bGVJbXBsCi0JICovCi0JQ1NTVW5rbm93blJ1bGVJbXBsKENTU1Vua25vd25SdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY3NzLmludGVyZmFjZXMuQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTVW5rbm93blJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NVbmtub3duUnVsZUltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gVU5LTk9XTlJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBVTktOT1dOX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNzc1RleHQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDc3NUZXh0KFN0cmluZyBjc3NUZXh0KSB7Ci0JCXRoaXMuZkNzc1RleHQgPSBjc3NUZXh0OwotCi0JCXN1cGVyLnNldENzc1RleHQoY3NzVGV4dCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ291bnRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ291bnRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxNWNkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvdW50ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ291bnRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNvdW50ZXI7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ291bnRlckltcGwgZXh0ZW5kcyBDU1NQcmltaXRpdmVDb250YWluZXIgaW1wbGVtZW50cyBJQ291bnRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDb3VudGVySW1wbCgpIHsKLQkJc3VwZXIoQ1NTX0NPVU5URVIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLkNvdW50ZXJJbXBsCi0JICovCi0JQ291bnRlckltcGwoQ291bnRlckltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDb3VudGVySW1wbCBjbG9uZWQgPSBuZXcgQ291bnRlckltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBDb3VudGVyIHZhbHVlLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIGNvdW50ZXIgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5Db3VudGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgQ291bnRlciB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBDb3VudGVyIHZhbHVlIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX0NPVU5URVI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgQ291bnRlciBnZXRDb3VudGVyVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvdW50ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKElERU5USUZJRVIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBzdHlsZSBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShMSVNUU1RZTEUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBzZXBhcmF0b3Igb2YgdGhlIG5lc3RlZCBjb3VudGVycy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcGFyYXRvcigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShTRVBBUkFUT1IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQcmltaXRpdmVzKCkgewotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkZW50aWZpZXIKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShJREVOVElGSUVSLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdFN0eWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZShTdHJpbmcgbGlzdFN0eWxlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKExJU1RTVFlMRSwgbGlzdFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gU2VwYXJhdG9yCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgU2VwYXJhdG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKFNFUEFSQVRPUiwgU2VwYXJhdG9yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01DU1NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTUNTU0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwZTNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTUNTU0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRE9NQ1NTSW1wbCB7Ci0KLQkvKioKLQkgKiBET01DU1NJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERPTUNTU0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5DU1NTdHlsZURlY2xCbG9jawotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZG9jdW1lbnQgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwodHJ1ZSk7Ci0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbWVkaWEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBDU1NTdHlsZVNoZWV0IGNyZWF0ZUNTU1N0eWxlU2hlZXQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVkaWEpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IENTU1N0eWxlU2hlZXRJbXBsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWVkaWFMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZWRpYUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTMwYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZWRpYUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgTWVkaWFMaXN0SW1wbCBleHRlbmRzIENTU1JlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIE1lZGlhTGlzdCB7Ci0KLQlpbnQgbWVkaXVtQ291bnRlcjsKLQotCS8qKgotCSAqIE1lZGlhTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlNZWRpYUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1lZGlhTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuY3NzLnRyZWVtb2RlbC5DU1NDb250YWluZXIKLQkgKi8KLQlNZWRpYUxpc3RJbXBsKE1lZGlhTGlzdEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBtZWRpdW0gPGNvZGU+bmV3TWVkaXVtPC9jb2RlPiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiBJZiB0aGUKLQkgKiA8Y29kZT5uZXdNZWRpdW08L2NvZGU+IGlzIGFscmVhZHkgdXNlZCwgaXQgaXMgZmlyc3QgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TWVkaXVtVGhlCi0JICogICAgICAgICAgICBuZXcgbWVkaXVtIHRvIGFkZC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogSWYgdGhlIG1lZGl1bSBjb250YWlucyBjaGFyYWN0ZXJzCi0JICogICAgICAgICAgICAgICAgdGhhdCBhcmUgaW52YWxpZCBpbiB0aGUgdW5kZXJseWluZyBzdHlsZSBsYW5ndWFnZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbGlzdCBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZE1lZGl1bShTdHJpbmcgbmV3TWVkaXVtKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld01lZGl1bSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNTU05vZGVMaXN0SW1wbCBtID0gZ2V0TWVkaWEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgIT0gbS5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAobmV3TWVkaXVtLmVxdWFscyhpdGVtKGkpKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlzZXRBdHRyaWJ1dGUoIm1lZGl1bSIgKyBJbnRlZ2VyLnRvU3RyaW5nKG1lZGl1bUNvdW50ZXIrKyksIG5ld01lZGl1bSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDEvMTcKLQkgKiAxODo1MDoyOSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnRyZWVtb2RlbC5jc3MuQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJTWVkaWFMaXN0SW1wbCBjbG9uZWQgPSBuZXcgTWVkaWFMaXN0SW1wbCh0aGlzKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBtZWRpdW0gaW5kaWNhdGVkIGJ5IDxjb2RlPm9sZE1lZGl1bTwvY29kZT4gZnJvbSB0aGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTWVkaXVtVGhlCi0JICogICAgICAgICAgICBtZWRpdW0gdG8gZGVsZXRlIGluIHRoZSBtZWRpYSBsaXN0LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBsaXN0IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT1RfRk9VTkRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+b2xkTWVkaXVtPC9jb2RlPiBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICBpbiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVNZWRpdW0oU3RyaW5nIG9sZE1lZGl1bSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpICE9IGdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChvbGRNZWRpdW0uZXF1YWxzKGl0ZW0oaSkpKSB7Ci0JCQkJcmVtb3ZlQXR0cmlidXRlTm9kZSgoQ1NTQXR0ckltcGwpIGZBdHRycy5pdGVtKGkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgbWVkaWEgaW4gdGhlIGxpc3QuIFRoZSByYW5nZSBvZiB2YWxpZCBtZWRpYSBpcwotCSAqIDxjb2RlPjA8L2NvZGU+IHRvIDxjb2RlPmxlbmd0aC0xPC9jb2RlPiBpbmNsdXNpdmUuCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRNZWRpYSgpLmdldExlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gQ1NTTm9kZUxpc3RJbXBsCi0JICovCi0JQ1NTTm9kZUxpc3RJbXBsIGdldE1lZGlhKCkgewotCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQlmQXR0cnMgPSBuZXcgQ1NTTmFtZWROb2RlTWFwSW1wbCgpOwotCQlyZXR1cm4gZkF0dHJzOwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXJzYWJsZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBsaXN0LiBUaGlzIGlzIGEKLQkgKiBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYS4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHN0cmluZyB2YWx1ZSBoYXMgYQotCSAqICAgICAgICAgICAgICAgIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbWVkaWEgbGlzdAotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVkaWFUZXh0KCkgewotCQlyZXR1cm4gZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDEvMTcKLQkgKiAxODo1MDoyOSkKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gTUVESUFMSVNUX05PREU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IHRoIGluIHRoZSBsaXN0LiBJZiA8Y29kZT5pbmRleDwvY29kZT4KLQkgKiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBtZWRpYSBpbiB0aGUgbGlzdCwgdGhpcwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBJbmRleCBpbnRvIHRoZSBjb2xsZWN0aW9uLgotCSAqIEByZXR1cm4gVGhlIG1lZGl1bSBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IHRoIHBvc2l0aW9uIGluIHRoZQotCSAqICAgICAgICAgPGNvZGU+TWVkaWFMaXN0PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhhdCBpcwotCSAqICAgICAgICAgbm90IGEgdmFsaWQgaW5kZXguCi0JICovCi0JcHVibGljIFN0cmluZyBpdGVtKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGdldExlbmd0aCgpIDw9IGluZGV4KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuICgoQ1NTQXR0ckltcGwpIGdldE1lZGlhKCkuaXRlbShpbmRleCkpLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0TWVkaWFUZXh0IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lZGlhVGV4dChTdHJpbmcgbWVkaWFUZXh0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0Q3NzVGV4dChtZWRpYVRleHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JHQkNvbG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SR0JDb2xvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyMGZjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JHQkNvbG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJHQkNvbG9yOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIFJHQkNvbG9ySW1wbCBleHRlbmRzIENTU1ByaW1pdGl2ZUNvbnRhaW5lciBpbXBsZW1lbnRzIFJHQkNvbG9yIHsKLQotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZSZWQ7Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZkdyZWVuOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZCbHVlOwotCi0JLyoqCi0JICogCi0JICovCi0JUkdCQ29sb3JJbXBsKCkgewotCQlzdXBlcihDU1NfUkdCQ09MT1IpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLlJHQkNvbG9ySW1wbAotCSAqLwotCVJHQkNvbG9ySW1wbChSR0JDb2xvckltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlmUmVkID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZSZWQpOwotCQlhcHBlbmRDaGlsZChmUmVkKTsKLQotCQlmR3JlZW4gPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZkdyZWVuKTsKLQkJYXBwZW5kQ2hpbGQoZkdyZWVuKTsKLQotCQlmQmx1ZSA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mQmx1ZSk7Ci0JCWFwcGVuZENoaWxkKGZCbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlSR0JDb2xvckltcGwgY2xvbmVkID0gbmV3IFJHQkNvbG9ySW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBibHVlIHZhbHVlIG9mIHRoZSBSR0IgY29sb3IuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldEJsdWUoKSB7Ci0JCXJldHVybiBmQmx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgZ3JlZW4gdmFsdWUgb2YgdGhlIFJHQiBjb2xvci4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0R3JlZW4oKSB7Ci0JCXJldHVybiBmR3JlZW47Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHJlZCB2YWx1ZSBvZiB0aGUgUkdCIGNvbG9yLgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRSZWQoKSB7Ci0JCXJldHVybiBmUmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLlJHQkNvbG9yCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBSR0JDb2xvciBnZXRSR0JDb2xvclZhbHVlKCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQcmltaXRpdmVzKCkgewotCi0JCWZSZWQgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZSZWQpOwotCi0JCWZHcmVlbiA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZkdyZWVuKTsKLQotCQlmQmx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZkJsdWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlY3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzODgwMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJlY3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgUmVjdEltcGwgZXh0ZW5kcyBDU1NQcmltaXRpdmVDb250YWluZXIgaW1wbGVtZW50cyBSZWN0IHsKLQotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZUb3A7Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZlJpZ2h0OwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZCb3R0b207Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZkxlZnQ7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlSZWN0SW1wbCgpIHsKLQkJc3VwZXIoQ1NTX1JFQ1QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MudHJlZW1vZGVsLlJlY3RJbXBsCi0JICovCi0JUmVjdEltcGwoUmVjdEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlmVG9wID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZUb3ApOwotCQlhcHBlbmRDaGlsZChmVG9wKTsKLQotCQlmUmlnaHQgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZlJpZ2h0KTsKLQkJYXBwZW5kQ2hpbGQoZlJpZ2h0KTsKLQotCQlmQm90dG9tID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZCb3R0b20pOwotCQlhcHBlbmRDaGlsZChmQm90dG9tKTsKLQotCQlmTGVmdCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mTGVmdCk7Ci0JCWFwcGVuZENoaWxkKGZMZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlSZWN0SW1wbCBjbG9uZWQgPSBuZXcgUmVjdEltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgYm90dG9tIG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRCb3R0b20oKSB7Ci0JCXJldHVybiBmQm90dG9tOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBsZWZ0IG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRMZWZ0KCkgewotCQlyZXR1cm4gZkxlZnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuUmVjdAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgUmVjdCBnZXRSZWN0VmFsdWUoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHJpZ2h0IG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRSaWdodCgpIHsKLQkJcmV0dXJuIGZSaWdodDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgdG9wIG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRUb3AoKSB7Ci0JCXJldHVybiBmVG9wOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQcmltaXRpdmVzKCkgewotCi0JCWZUb3AgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZUb3ApOwotCi0JCWZSaWdodCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZlJpZ2h0KTsKLQotCQlmQm90dG9tID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmQm90dG9tKTsKLQotCQlmTGVmdCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZkxlZnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0eWxlU2hlZXRMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHlsZVNoZWV0TGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhMWJmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0eWxlU2hlZXRMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgU3R5bGVTaGVldExpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RDU1NOb2RlTGlzdCBpbXBsZW1lbnRzIFN0eWxlU2hlZXRMaXN0IHsKLQotCS8qKgotCSAqIFN0eWxlU2hlZXRMaXN0SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCVN0eWxlU2hlZXRMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIGEgc3R5bGUgc2hlZXQgYnkgb3JkaW5hbCBpbmRleC4gSWYgaW5kZXggaXMgZ3JlYXRlcgotCSAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBzdHlsZSBzaGVldHMgaW4gdGhlIGxpc3QsIHRoaXMgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleEluZGV4Ci0JICogICAgICAgICAgICBpbnRvIHRoZSBjb2xsZWN0aW9uCi0JICogQHJldHVybiBUaGUgc3R5bGUgc2hlZXQgYXQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBwb3NpdGlvbiBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPlN0eWxlU2hlZXRMaXN0PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhhdAotCSAqICAgICAgICAgaXMgbm90IGEgdmFsaWQgaW5kZXguCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgaXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChTdHlsZVNoZWV0KSBpdGVtSW1wbChpbmRleCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQnl0ZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQnl0ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1ZTM4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0J5dGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQnl0ZVV0aWwgewotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZyBiaWdTdHJpbmcgPSAiXG48QCBwYWdlXG4iOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0YXJnZXQgPSAiPEAgUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IG1hdGNoID0gZmluZElmTWF0Y2goc3RyaW5nVG9CeXRlQXJyYXkoYmlnU3RyaW5nKSwgNywgMCwgc3RyaW5nVG9CeXRlQXJyYXkodGFyZ2V0KSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihtYXRjaCk7Ci0JfQotCi0JLyoqCi0JICogQnl0ZVV0aWwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQnl0ZVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gczEKLQkgKiAgICAgICAgICAgIGJ5dGVbXQotCSAqIEBwYXJhbSBzMgotCSAqICAgICAgICAgICAgYnl0ZVtdCi0JICogQHBhcmFtIG4KLQkgKiAgICAgICAgICAgIGludAotCSAqIAotCSAqIENvbXBhcmUgYnl0ZXMuIElmIHNhbWUsIHJldHVybiAwLiBPdGhlcndpc2Ugbm9uLXplcm8uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IF9jbXAoYnl0ZVtdIHMxLCBpbnQgc3RhcnRzMXBvcywgYnl0ZVtdIHMyLCBpbnQgc3RhcnRzMnBvcywgaW50IGNvbXBsZW4sIGJvb2xlYW4gaWdub3JlY2FzZSkgewotCQlpZiAoKHMxID09IG51bGwpIHx8IChzMiA9PSBudWxsKSkKLQkJCXJldHVybiAxOwotCQlpbnQgbGVuX3MxID0gczEubGVuZ3RoIC0gc3RhcnRzMXBvczsKLQkJaW50IGxlbl9zMiA9IHMyLmxlbmd0aCAtIHN0YXJ0czJwb3M7Ci0JCWlmICgobGVuX3MxIDw9IDApIHx8IChsZW5fczIgPD0gMCkpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKChsZW5fczEgPCBjb21wbGVuKSB8fCAobGVuX3MyIDwgY29tcGxlbikpCi0JCQlyZXR1cm4gMTsKLQotCQlpbnQgbGVuID0gY29tcGxlbjsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWJ5dGUgYzEgPSAoYnl0ZSkgMCwgYzIgPSAoYnl0ZSkgMDsKLQkJd2hpbGUgKG9mZnNldCA8IGxlbikgewotCQkJaWYgKGlnbm9yZWNhc2UgPT0gdHJ1ZSkgewotCQkJCWMxID0gX3RvVXBwZXIoczFbc3RhcnRzMXBvcyArIG9mZnNldF0pOwotCQkJCWMyID0gX3RvVXBwZXIoczJbc3RhcnRzMnBvcyArIG9mZnNldF0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYzEgPSBzMVtzdGFydHMxcG9zICsgb2Zmc2V0XTsKLQkJCQljMiA9IHMyW3N0YXJ0czJwb3MgKyBvZmZzZXRdOwotCQkJfQotCQkJaWYgKGMxID09IGMyKSB7Ci0JCQkJb2Zmc2V0Kys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAob2Zmc2V0ID09IGxlbiA/IDAgOiAoaW50KSAoYzEgLSBjMikpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYnl0ZQotCSAqIEBwYXJhbSBjMQotCSAqICAgICAgICAgICAgYnl0ZQotCSAqIAotCSAqIENvbnZlcnQgdG8gdXBwZXIgY2FzZSBsZXR0ZXIuIEl0J3MgZm9yIEFTQ0lJIG9ubHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBieXRlIF90b1VwcGVyKGJ5dGUgYzEpIHsKLQkJaWYgKChjMSA+PSAoYnl0ZSkgMHg2MSkgJiYgKGMxIDw9IChieXRlKSAweDdhKSkKLQkJCWMxIC09IDB4MjA7Ci0JCXJldHVybiBjMTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiAgICAgICAgICAgIGJ5dGVbXQotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGJ5dGVbXQotCSAqIAotCSAqIExvb2sgZm9yIHRoZSBpbmRleCBvZiAybmQgYnl0ZVtdIHdpdGhpbiAxc3QgYnl0ZVtdLiBJZiBiZWluZyBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIHBvcy4gT3RoZXJ3aXNlLCByZXR1cm4gLTEuIFRoaXMgaXMgY2FzZS1pbnNlbnNpdGl2ZS4gSXQncwotCSAqIHNpbWxhciB0byBTdHJpbmcuaW5kZXhPZigpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGZpbmRJZk1hdGNoKGJ5dGVbXSBjb250YWluZXIsIGludCBsZW5ndGgsIGludCBzdGFydHBvcywgYnl0ZVtdIHRhcmdldCkgewotCQlpbnQgY29udGFpbmVyX2xlbiA9IGxlbmd0aCAtIHN0YXJ0cG9zOwotCQlpbnQgdGFyZ2V0X2xlbiA9IHRhcmdldC5sZW5ndGg7Ci0KLQkJLy8gQ2xlYXJseSBkaWZmZXJlbnQKLQkJaWYgKChjb250YWluZXJfbGVuIDw9IDApIHx8ICh0YXJnZXRfbGVuIDw9IDApKQotCQkJcmV0dXJuIC0xOwotCQlpZiAodGFyZ2V0X2xlbiA+IGNvbnRhaW5lcl9sZW4pCi0JCQlyZXR1cm4gLTE7Ci0KLQkJLy8gTG9vayBmb3IgdGhlIHNhbWUgYnl0ZXMgYXMgJ3RhcmdldCcgaW4gJ2NvbnRhaW5lcicgZnJvbSBzdGFydHBvcwotCQlpbnQgcG9zOwotCQlmb3IgKHBvcyA9IHN0YXJ0cG9zOyBwb3MgPCBsZW5ndGg7IHBvcysrKSB7Ci0JCQlpZiAoc3RyQ2FzZUNtcChjb250YWluZXIsIHBvcywgdGFyZ2V0LCAwLCB0YXJnZXRfbGVuKSA9PSAwKSB7Ci0JCQkJLy8gbWF0Y2hlZC4KLQkJCQlyZXR1cm4gcG9zOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIExldCB0aGUgY29udmVyc2lvbiBiZSBkb25lIGluIGNvZGUgc2luY2UgaXQncyBlYXNpZXIgdG8gcmV1c2UgYW5kCi0JICogdmVyaWZ5IHRoYW4gY29udmVydGluZyB0aGVtIGJ5IGhhbmQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHN0cmluZ1RvQnl0ZUFycmF5KFN0cmluZyBzdHJpbmcpIHsKLQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc3RyaW5nLmxlbmd0aCgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoKCk7IGkrKykKLQkJCWJ5dGVzW2ldID0gKGJ5dGUpIHN0cmluZy5jaGFyQXQoaSk7IC8vIHR5cGVjYXN0IHRvIG51bWJlciB1c2luZwotCQkJCQkJCQkJCQkJLy8gbG93ZXIgOCBiaXRzIG9ubHkKLQkJcmV0dXJuIGJ5dGVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgYnl0ZVtdCi0JICogQHBhcmFtIHN0YXJ0cG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBieXRlCi0JICogCi0JICogVGhpcyBpcyBjYXNlLWluc2Vuc2l0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGZpbmRJZk1hdGNoKGJ5dGVbXSBjb250YWluZXIsIGludCBsZW5ndGgsIGludCBzdGFydHBvcywgYnl0ZSB0YXJnZXQpIHsKLQkJaW50IGNvbnRhaW5lcl9sZW4gPSBsZW5ndGggLSBzdGFydHBvczsKLQotCQlpZiAoY29udGFpbmVyX2xlbiA8PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCS8vIExvb2sgZm9yIHRoZSBzYW1lIGJ5dGUgYXMgJ3RhcmdldCcgaW4gJ2NvbnRhaW5lcicgZnJvbSBzdGFydHBvcwotCQlpbnQgcG9zOwotCQlmb3IgKHBvcyA9IHN0YXJ0cG9zOyBwb3MgPCBsZW5ndGg7IHBvcysrKSB7Ci0JCQlpZiAoX3RvVXBwZXIoY29udGFpbmVyW3Bvc10pID09IF90b1VwcGVyKHRhcmdldCkpCi0JCQkJcmV0dXJuIHBvczsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAgICAgICAgICAgIGJ5dGVbXQotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBzdGFydHBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgYnl0ZQotCSAqIAotCSAqIFNraXAgc2FtZSBieXRlcyBhcyB0YXJnZXQuIFJldHVybiB0aGUgcG9zaXRpb24uIElmIGdvZXMgdG8gZW5kLCByZXR1cm4KLQkgKiAtMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNraXBJZk1hdGNoKGJ5dGVbXSBjb250YWluZXIsIGludCBsZW5ndGgsIGludCBzdGFydHBvcywgYnl0ZSB0YXJnZXQpIHsKLQkJaW50IGNvbnRhaW5lcl9sZW4gPSBsZW5ndGggLSBzdGFydHBvczsKLQotCQkvLyBDbGVhcmx5IGVycm9yCi0JCWlmIChjb250YWluZXJfbGVuIDw9IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaW50IHBvczsKLQkJZm9yIChwb3MgPSBzdGFydHBvczsgcG9zIDwgbGVuZ3RoOyBwb3MrKykgewotCQkJaWYgKGNvbnRhaW5lcltwb3NdICE9IHRhcmdldCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAocG9zID09IGxlbmd0aCkgewotCQkJLy8gSSBmb3VuZCBldmVyeXRoaW5nIGlzIHRhcmdldAotCQkJcG9zID0gLTE7Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBzMQotCSAqICAgICAgICAgICAgYnl0ZVtdCi0JICogQHBhcmFtIHN0YXJ0czFwb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBzMgotCSAqICAgICAgICAgICAgYnl0ZVtdCi0JICogQHBhcmFtIHN0YXJ0czJwb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqIAotCSAqIEl0J3Mgc2ltaWxhciB0byBYUEc0J3Mgc3RyY2FzZWNtcCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgc3RyQ2FzZUNtcChieXRlW10gczEsIGludCBzdGFydHMxcG9zLCBieXRlW10gczIsIGludCBzdGFydHMycG9zLCBpbnQgY29tcGxlbikgewotCQlyZXR1cm4gX2NtcChzMSwgc3RhcnRzMXBvcywgczIsIHN0YXJ0czJwb3MsIGNvbXBsZW4sIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIHMxCi0JICogICAgICAgICAgICBieXRlW10KLQkgKiBAcGFyYW0gc3RhcnRzMXBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIHMyCi0JICogICAgICAgICAgICBieXRlW10KLQkgKiBAcGFyYW0gc3RhcnRzMnBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICogCi0JICogSXQncyBzaW1pbGFyIHRvIFhQRzQncyBzdHJjbXAoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHN0ckNtcChieXRlW10gczEsIGludCBzdGFydHMxcG9zLCBieXRlW10gczIsIGludCBzdGFydHMycG9zLCBpbnQgY29tcGxlbikgewotCQlyZXR1cm4gX2NtcChzMSwgc3RhcnRzMXBvcywgczIsIHN0YXJ0czJwb3MsIGNvbXBsZW4sIGZhbHNlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzI2MjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50LkNTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIENTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yIGV4dGVuZHMgQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgZG9jdW1lbnQgaXMgZW1wdHksIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBub2RlcywKLQkJLy8gc28gbm8gbmVlZCB0byBjb250aW51ZS4KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgbm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBudWxsOwotCQkJLy8gc2tpcCBhbnkgaW5pdGlhbCB3aGl0ZXNwYWNlCi0JCQkvLyBOb3RlIHRoYXQgQGNoYXJzZXQgImVuY29kaW5nbmFtZSI7Ci0JCQkvLyBtdXN0IGFwcGVhciBhdCB2ZXJ5IGJlZ2lubmluZyBvZiBkb2N1bWVudCwKLQkJCS8vIHRvIGJlIHZhbGlkLgotCQkJLy8gTWF5IGhhdmUgdG8gdGVzdCB3aXRoICJkYW1hZ2VkIiBmaWxlcyAoZS5nLgotCQkJLy8gYmVnaW5uaW5nIEVPTHMsIGV0Yy4sIHRvIHZlcmlmeSB0aGlzIHdvcmtzCi0JCQkvLyBhcyBleHBlY3RlZC4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCW5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJCWlmIChnZXRUeXBlKG5vZGUpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0TmV4dFJlZ2lvbk9mVHlwZShDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgcmVnaW9ucyk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGdldE5leHRSZWdpb25PZlR5cGUoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORywgcmVnaW9ucyk7Ci0JCQkJaWYgKHZhbHVlUmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gaWYgZGlkbid0IGZpbmQgdGhlIHJlZ2lvbiwgaXRzIHByb2JhYmx5IGR1ZSB0byBpbGwKLQkJCQkJLy8gZm9ybWVkIGlucHV0LCBzdWNoIGFzCi0JCQkJCS8vIEBjaGFyc2V0ICJJU08tODg1OS02OwotCQkJCQkvLyBzbyB3ZSdsbCB0cnkgYWdhaW4gZm9yICJ1bmtub3duIiByZWdpb24uCi0JCQkJCS8vIElmIHRoYXQgZmFpbHMsIHdlJ2xsIGdpdmUgdXA/Ci0JCQkJCXJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCQlyZWdpb24gPSBnZXROZXh0UmVnaW9uT2ZUeXBlKENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VULCByZWdpb25zKTsKLQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZVJlZ2lvbiA9IGdldE5leHRSZWdpb25PZlR5cGUoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04sIHJlZ2lvbnMpOwotCQkJCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQlyZXN1bHQgPSBub2RlLmdldFRleHQodmFsdWVSZWdpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBub2RlLmdldFRleHQodmFsdWVSZWdpb24pOwotCQkJCX0KLQkJCQlyZXN1bHQgPSBTdHJpbmdVdGlscy5zdHJpcE5vbkxldHRlckRpZ2l0cyhyZXN1bHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZ05hbWUoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQllbmMgPSBnZXRFbmNvZGluZ05hbWUoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFRPRE8gSW1wb3J0YW50OiBuZWVkIHRvIGltcGxlbWVudCBzb21lICJyYXciIHBhcnNlciBmb3IKLQkJCS8vIElEb2N1bWVudCBsZXZlbAotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCVN0cmluZyByZXN1bHQgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbk9mVHlwZShTdHJpbmcgdHlwZSwgSXRlcmF0b3IgcmVnaW9ucykgewotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gdHlwZSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZDRjMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnQuRW5jb2RpbmdHdWVzc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0LkNTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENTU0RvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENTU19JRCA9IENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCi0KLQlwdWJsaWMgQ1NTRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbmNvZGluZ05hbWVCeUd1ZXNzKGJ5dGVbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIGlhbmFFbmMgPSBudWxsOwotCQlpYW5hRW5jID0gRW5jb2RpbmdHdWVzc2VyLmd1ZXNzRW5jb2Rpbmcoc3RyaW5nLCBsZW5ndGgpOwotCQlyZXR1cm4gaWFuYUVuYzsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGVuY29kaW5nLiBGb3IgQ1NTIHRoZXJlIGlzIG5vIHNwZWMnZCBkZWZhdWx0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQkvLyBETVc6IEkgY29waWVkIHRoaXMgZnJvbSBDU1NNb2RlbEltcGxlIC4uLgotCQkvLyBidXQgYW0gbm90IHN1cmUgaXRzIHJpZ2h0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHJlUGFyc2VyID0gbmV3IENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JCXJlUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKHJlUGFyc2VyKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJLy8gcmV0dXJuIG5ldyBDU1NSZWdpb25QYXJzZXIoKTsKLQkJcmV0dXJuIG5ldyBDU1NTb3VyY2VQYXJzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDU1NfSUQpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID09IG51bGwpIHsKLQkJCWRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9DU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0NTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ4ZTMxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0NTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyIGV4dGVuZHMgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIHsKLQotCS8qKgotCSAqIENTU0VtYmVkZGVkU3R5bGVOb3RpZnlBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKi8KLQlwdWJsaWMgQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlcihJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJWE1MTm9kZSBub2RlID0gKFhNTE5vZGUpIG1vZGVsLmdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkoKElDU1NTdHlsZUxpc3RlbmVyKSBhZGFwdGVyKS5zdHlsZUNoYW5nZWQoc3JjTW9kZWwsIHJlbW92ZWQsIGFkZGVkLCBtZWRpYSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJWE1MTm9kZSBub2RlID0gKFhNTE5vZGUpIG1vZGVsLmdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkoKElDU1NTdHlsZUxpc3RlbmVyKSBhZGFwdGVyKS5zdHlsZVVwZGF0ZShzcmNNb2RlbCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9DU1NTdHlsZUV2ZW50RGVsaXZlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0NTU1N0eWxlRXZlbnREZWxpdmVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3NWE1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0NTU1N0eWxlRXZlbnREZWxpdmVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZXZlbnQuSUNTU1N0eWxlTm90aWZpZXI7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1N0eWxlRXZlbnREZWxpdmVyZXIgewotCi0JcHJpdmF0ZSBWZWN0b3IgZlZpc2l0ZWQgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBJQ1NTTW9kZWwgZlNyY01vZGVsOwotCXByaXZhdGUgSUNTU1NlbGVjdG9yW10gZlJlbW92ZWQ7Ci0JcHJpdmF0ZSBJQ1NTU2VsZWN0b3JbXSBmQWRkZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZk1lZGlhOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1N0eWxlRXZlbnREZWxpdmVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmlyZShJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJaWYgKHNyY01vZGVsID09IG51bGwgfHwgc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRoaXMuZlNyY01vZGVsID0gc3JjTW9kZWw7Ci0JCXRoaXMuZlJlbW92ZWQgPSByZW1vdmVkOwotCQl0aGlzLmZBZGRlZCA9IGFkZGVkOwotCQl0aGlzLmZNZWRpYSA9IG1lZGlhOwotCi0JCS8vIHByb2hpYml0IGRlbGl2ZXJpbmcgdG8gc3JjTW9kZWwKLQkJZlZpc2l0ZWQuY2xlYXIoKTsKLQkJZlZpc2l0ZWQuYWRkKHNyY01vZGVsKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2aXNpdCgoSUNTU1N0eWxlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVG8oSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQl0aGlzLmZTcmNNb2RlbCA9IHNyY01vZGVsOwotCQl0aGlzLmZSZW1vdmVkID0gcmVtb3ZlZDsKLQkJdGhpcy5mQWRkZWQgPSBhZGRlZDsKLQkJdGhpcy5mTWVkaWEgPSBtZWRpYTsKLQotCQkvLyBwcm9oaWJpdCBkZWxpdmVyaW5nIHRvIHNyY01vZGVsCi0JCWZWaXNpdGVkLmNsZWFyKCk7Ci0JCS8vIHZpc2l0ZWQuYWRkKHNyY01vZGVsKTsgOiBiZWNhdXNlIGxvb3BpbmcgcHJvYmxlbQotCQl2aXNpdChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJaWYgKHNyY01vZGVsID09IG51bGwgfHwgc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRoaXMuZlNyY01vZGVsID0gc3JjTW9kZWw7Ci0KLQkJLy8gcHJvaGliaXQgZGVsaXZlcmluZyB0byBzcmNNb2RlbAotCQlmVmlzaXRlZC5jbGVhcigpOwotCQlmVmlzaXRlZC5hZGQoc3JjTW9kZWwpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCXZpc2l0VXBkYXRlKChJQ1NTU3R5bGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVVcGRhdGVUbyhJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JCWlmIChzcmNNb2RlbCA9PSBudWxsIHx8IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmZTcmNNb2RlbCA9IHNyY01vZGVsOwotCi0JCS8vIHByb2hpYml0IGRlbGl2ZXJpbmcgdG8gc3JjTW9kZWwKLQkJZlZpc2l0ZWQuY2xlYXIoKTsKLQkJLy8gdmlzaXRlZC5hZGQoc3JjTW9kZWwpOwotCQl2aXNpdFVwZGF0ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXQoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwgfHwgZlZpc2l0ZWQuY29udGFpbnMobGlzdGVuZXIpKQotCQkJcmV0dXJuOwotCi0JCS8vIGZpcmUgZXZlbnQgdG8gbGlzdGVuZXIKLQkJbGlzdGVuZXIuc3R5bGVDaGFuZ2VkKGZTcmNNb2RlbCwgZlJlbW92ZWQsIGZBZGRlZCwgZk1lZGlhKTsKLQkJZlZpc2l0ZWQuYWRkKGxpc3RlbmVyKTsKLQotCQkvLyB0cmF2ZXJzZSBub3RpZmllcgotCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVOb3RpZmllcikgewotCQkJSUNTU1N0eWxlTm90aWZpZXIgbm90aWZpZXIgPSAoSUNTU1N0eWxlTm90aWZpZXIpIGxpc3RlbmVyOwotCQkJaWYgKG5vdGlmaWVyLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgewotCQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IG5vdGlmaWVyLmdldFN0eWxlTGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXZpc2l0KChJQ1NTU3R5bGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdFVwZGF0ZShJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCB8fCBmVmlzaXRlZC5jb250YWlucyhsaXN0ZW5lcikpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZmlyZSBldmVudCB0byBsaXN0ZW5lcgotCQlsaXN0ZW5lci5zdHlsZVVwZGF0ZShmU3JjTW9kZWwpOwotCQlmVmlzaXRlZC5hZGQobGlzdGVuZXIpOwotCi0JCS8vIHRyYXZlcnNlIG5vdGlmaWVyCi0JCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDU1NTdHlsZU5vdGlmaWVyKSB7Ci0JCQlJQ1NTU3R5bGVOb3RpZmllciBub3RpZmllciA9IChJQ1NTU3R5bGVOb3RpZmllcikgbGlzdGVuZXI7Ci0JCQlpZiAobm90aWZpZXIuZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gbGlzdGVuZXJzID0gbm90aWZpZXIuZ2V0U3R5bGVMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdmlzaXRVcGRhdGUoKElDU1NTdHlsZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0NTU1N0eWxlTm90aWZ5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9DU1NTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkMDNiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0NTU1N0eWxlTm90aWZ5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmV2ZW50LklDU1NTdHlsZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkltcG9ydGVkQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLlNlbGVjdG9yc0NvbGxlY3RvcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIGltcGxlbWVudHMgSUNTU1N0eWxlTm90aWZpZXIgewotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgbGlzdGVuZXJzOwotCXByb3RlY3RlZCBmaW5hbCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsIG1vZGVsOwotCXByb3RlY3RlZCBib29sZWFuIHJlY29yZGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1N0eWxlTm90aWZ5QWRhcHRlcihJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQotCQkJbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQotCQkJLy8gc2VuZCBuZXcgc2VsZWN0b3JzIGV2ZW50IHRvIGxpc3RlbmVyCi0JCQlJbXBvcnRlZENvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydGVkQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldEV4dGVybmFscygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBjb2xsZWN0IHNlbGVjdG9ycwotCQkJCVNlbGVjdG9yc0NvbGxlY3RvciBzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJCXNlbFRyYXYuYXBwbHkoc2hlZXQpOwotCQkJCWludCBuU2VsID0gc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JCQkJSUNTU1NlbGVjdG9yW10gYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCi0JCQkJLy8gZmlyZSBldmVudAotCQkJCUNTU1N0eWxlRXZlbnREZWxpdmVyZXIgZGVsaXZlcmVyID0gbmV3IENTU1N0eWxlRXZlbnREZWxpdmVyZXIoKTsKLQkJCQlkZWxpdmVyZXIuZmlyZVRvKGxpc3RlbmVyLCBzaGVldC5nZXRNb2RlbCgpLCBudWxsLCBhZGRlZCwgbnVsbC8qCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIG1lZGlhCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHdpbGwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogYmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW1wbGVtZW50ZWQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGZ1dHVyZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKi8pOwotCQkJfQotCi0JCQkvLyBhZGQgbGlzdGVuZXIKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoKSB7Ci0JCXJlY29yZGluZyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKCkgewotCQlyZWNvcmRpbmcgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlKElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJLy8gc2VuZCBzZWxlY3RvciBjaGFuZ2VkIGV2ZW50Ci0JCUNTU1N0eWxlRXZlbnREZWxpdmVyZXIgZGVsaXYgPSBuZXcgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpOwotCQlkZWxpdi5maXJlKG1vZGVsLCByZW1vdmVkLCBhZGRlZCwgbnVsbCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0U3R5bGVMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWNvcmRpbmcoKSB7Ci0JCXJldHVybiByZWNvcmRpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0KLQkJCS8vIHNlbmQgb2xkIHNlbGVjdG9ycyBldmVudCB0byBsaXN0ZW5lcgotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShtb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRFeHRlcm5hbHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gKElDU1NTdHlsZVNoZWV0KSBpdC5uZXh0KCk7Ci0JCQkJLy8gY29sbGVjdCBzZWxlY3RvcnMKLQkJCQlTZWxlY3RvcnNDb2xsZWN0b3Igc2VsVHJhdiA9IG5ldyBTZWxlY3RvcnNDb2xsZWN0b3IoKTsKLQkJCQlzZWxUcmF2LmFwcGx5KHNoZWV0KTsKLQkJCQlpbnQgblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJCUlDU1NTZWxlY3RvcltdIHJlbW92ZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlyZW1vdmVkW2ldID0gKElDU1NTZWxlY3Rvcikgc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5nZXQoaSk7Ci0KLQkJCQkvLyBmaXJlIGV2ZW50Ci0JCQkJQ1NTU3R5bGVFdmVudERlbGl2ZXJlciBkZWxpdmVyZXIgPSBuZXcgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpOwotCQkJCWRlbGl2ZXJlci5maXJlVG8obGlzdGVuZXIsIHNoZWV0LmdldE1vZGVsKCksIHJlbW92ZWQsIG51bGwsIG51bGwvKgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBtZWRpYQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiB3aWxsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGltcGxlbWVudGVkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGluCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBmdXR1cmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICovKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsIHNyY01vZGVsLCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTZWxlY3RvcltdIGFkZGVkLCBqYXZhLmxhbmcuU3RyaW5nIG1lZGlhKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVVcGRhdGUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNb2RlbCBzcmNNb2RlbCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiNzRiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0TGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wcmVmZXJlbmNlcy5DU1NQcmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU0xpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIGltcGxlbWVudHMgQ1NTU291cmNlR2VuZXJhdG9yIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgc2hvcnQgR0VORVJBVEUgPSAwOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgc2hvcnQgRk9STUFUID0gMTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIHNob3J0IENMRUFOVVAgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgc2hvcnQgc3RyYXRlZ3k7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmREZWxpbUJlZm9yZShJQ1NTTm9kZSBub2RlLCBDb21wb3VuZFJlZ2lvbiB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJYm9vbGVhbiBuZWVkSW5kZW50ID0gIShub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpOwotCQlpZiAodG9BcHBlbmQgPT0gbnVsbCkgewotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlpZiAobmVlZEluZGVudCkKLQkJCQlzb3VyY2UuYXBwZW5kKG1nci5nZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgdHlwZSA9IHRvQXBwZW5kLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IodG9BcHBlbmQuZ2V0RG9jdW1lbnRSZWdpb24oKSwgdG9BcHBlbmQuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocHJldiA9PSBudWxsIHx8IChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldiksIDApWzBdID49IDApKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJc291cmNlLmFwcGVuZChtZ3IuZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQuZ2V0VGV4dCgpLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcih0b0FwcGVuZC5nZXREb2N1bWVudFJlZ2lvbigpLCB0b0FwcGVuZC5nZXRUZXh0UmVnaW9uKCkpOwotCQkJCWl0LnByZXYoKTsKLQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldiksIDApWzBdID49IDApIHsKLQkJCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQlzb3VyY2UuYXBwZW5kKG1nci5nZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG1nci5nZXRNYXhMaW5lV2lkdGgoKSA+IDAgJiYgKCFtZ3IuaXNQcm9oaWJpdFdyYXBPbkF0dHIoKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQkJCWludCBhcHBlbmQgPSAxOwotCQkJCQlpZiAobGVuZ3RoICsgYXBwZW5kID4gbWdyLmdldE1heExpbmVXaWR0aCgpKSB7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQkJc291cmNlLmFwcGVuZChtZ3IuZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJc291cmNlLmFwcGVuZChtZ3IuZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kU3BhY2VCZWZvcmUoSUNTU05vZGUgbm9kZSwgQ29tcG91bmRSZWdpb24gdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCB0b0FwcGVuZCA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCQlTdHJpbmcgdHlwZSA9IHRvQXBwZW5kLmdldFR5cGUoKTsKLQkJQ1NTUHJlZmVyZW5jZUhlbHBlciBtZ3IgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0JCWJvb2xlYW4gbmVlZEluZGVudCA9ICEobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCS8vIGNoZWNrIHdoZXRoZXIgcHJldmlvdXMgcmVnaW9uIGlzICdTJyBhbmQgaGFzIENSLUxGCi0JCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IodG9BcHBlbmQuZ2V0RG9jdW1lbnRSZWdpb24oKSwgdG9BcHBlbmQuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCWl0LnByZXYoKTsKLQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgVGV4dFV0aWxpdGllcy5pbmRleE9mKERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTLCBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHByZXYpLCAwKVswXSA+PSAwKSB7Ci0JCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQlzb3VyY2UuYXBwZW5kKG1nci5nZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZC5nZXRUZXh0KCksIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFICYmIG1nci5pc05ld0xpbmVPbk9wZW5CcmFjZSgpKSB7Ci0JCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkvLyB9IGVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NVUkxZX0JSQUNFX0NMT1NFKSB7Ci0JCQkvLyB9IGVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lOQ0xVREVTIHx8IHR5cGUgPT0KLQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19EQVNITUFUQ0gpIHsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IgJiYgbm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSB7Ci0JCQlpbnQgbiA9IG1nci5nZXRTcGFjZXNQcmVEZWxpbWl0ZXIoKTsKLQkJCWlmIChtZ3IuZ2V0TWF4TGluZVdpZHRoKCkgPiAwICYmICghbWdyLmlzUHJvaGliaXRXcmFwT25BdHRyKCkgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQkJaW50IGFwcGVuZCA9IDE7Ci0JCQkJaWYgKGxlbmd0aCArIG4gKyBhcHBlbmQgPiBtZ3IuZ2V0TWF4TGluZVdpZHRoKCkpIHsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJCXNvdXJjZS5hcHBlbmQobWdyLmdldEluZGVudFN0cmluZygpKTsKLQkJCQkJbiA9IDA7IC8vIG5vIHNwYWNlIGlzIG5lY2Vzc2FyeQotCQkJCX0KLQkJCX0KLQkJCS8vIG5vIGRlbGltaXRlciBjYXNlCi0JCQl3aGlsZSAobi0tID4gMCkKLQkJCQlzb3VyY2UuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJaWYgKG1nci5nZXRNYXhMaW5lV2lkdGgoKSA+IDAgJiYgKCFtZ3IuaXNQcm9oaWJpdFdyYXBPbkF0dHIoKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCQlpbnQgbGVuZ3RoID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCQlpbnQgYXBwZW5kID0gMTsKLQkJCQlpZiAobGVuZ3RoICsgYXBwZW5kID4gbWdyLmdldE1heExpbmVXaWR0aCgpKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQlzb3VyY2UuYXBwZW5kKG1nci5nZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLmdldFRleHQoKSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTcGFjZUJlZm9yZShJQ1NTTm9kZSBub2RlLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2xlYW51cCgpICYmICFnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXJldHVybjsgLy8gZm9yIG5vdCBmb3JtYXR0aW5nIGNhc2Ugb24gY2xlYW51cCBhY3Rpb24KLQkJQ1NTUHJlZmVyZW5jZUhlbHBlciBtZ3IgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmICh0b0FwcGVuZCAhPSBudWxsICYmIHRvQXBwZW5kLnN0YXJ0c1dpdGgoInsiKSAmJiBtZ3IuaXNOZXdMaW5lT25PcGVuQnJhY2UoKSkgey8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSBpZiAoLyogISBtZ3IuaXNPbmVQcm9wZXJ0eVBlckxpbmUoKSAmJiAqL21nci5nZXRNYXhMaW5lV2lkdGgoKSA+IDAgJiYgKCFtZ3IuaXNQcm9oaWJpdFdyYXBPbkF0dHIoKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCWludCBuID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCWludCBhcHBlbmQgPSAodG9BcHBlbmQgIT0gbnVsbCkgPyBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIHRvQXBwZW5kLCAwKVswXSA6IDA7Ci0JCQlpZiAodG9BcHBlbmQgIT0gbnVsbCkKLQkJCQlhcHBlbmQgPSAoYXBwZW5kIDwgMCkgPyB0b0FwcGVuZC5sZW5ndGgoKSA6IGFwcGVuZDsKLQkJCWlmIChuICsgYXBwZW5kICsgMSA+IG1nci5nZXRNYXhMaW5lV2lkdGgoKSkgewotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCXNvdXJjZS5hcHBlbmQobWdyLmdldEluZGVudFN0cmluZygpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc291cmNlLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSkgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IENMRUFOVVA7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBmb3JtYXRQcm9jKG5vZGUpOwotCQlzdHJhdGVneSA9IG9sZFN0cmF0ZWd5OwotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKSB7Ci0JCXNob3J0IG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gQ0xFQU5VUDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSwgcmVnaW9uKTsKLQkJc3RyYXRlZ3kgPSBvbGRTdHJhdGVneTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkSWRlbnRSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCi0JCVN0cmluZyB0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORyB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkpCi0JCQlyZXR1cm4gZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbiwgMCwgc3RneSk7Ci0KLQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQlpZiAoc3RneS5nZXRJZGVudENhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCXJldHVybiB0ZXh0OwotCQkJZWxzZSBpZiAoc3RneS5nZXRJZGVudENhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTUHJlZmVyZW5jZUhlbHBlciBtZ3IgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0KLQkJCWlmIChtZ3IuaXNQcmVzZXJ2ZUNhc2UoKSB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCXJldHVybiB0ZXh0OwotCQkJZWxzZSBpZiAobWdyLmlzSWRlbnRVcHBlckNhc2UoKSkKLQkJCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJZWxzZQotCQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZFByb3BOYW1lUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQotCQlTdHJpbmcgdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJKQotCQkJcmV0dXJuIGRlY29yYXRlZFJlZ2lvbihyZWdpb24sIDEsIHN0Z3kpOwotCQlpZiAoaXNDbGVhbnVwKCkpIHsKLQkJCWlmIChzdGd5LmdldFByb3BOYW1lQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5BU0lTIHx8IHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZKQotCQkJCXJldHVybiB0ZXh0OwotCQkJZWxzZSBpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTUHJlZmVyZW5jZUhlbHBlciBtZ3IgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0KLQkJCWlmIChtZ3IuaXNQcmVzZXJ2ZUNhc2UoKSB8fCByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSkKLQkJCQlyZXR1cm4gdGV4dDsKLQkJCWVsc2UgaWYgKG1nci5pc1Byb3BOYW1lVXBwZXJDYXNlKCkpCi0JCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCi0JCVN0cmluZyB0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSkKLQkJCXJldHVybiBkZWNvcmF0ZWRSZWdpb24ocmVnaW9uLCAyLCBzdGd5KTsKLQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkgIT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpIHsKLQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQkJCXRleHQgPSB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJQ1NTUHJlZmVyZW5jZUhlbHBlciBtZ3IgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0KLQkJCWlmICghbWdyLmlzUHJlc2VydmVDYXNlKCkpIHsKLQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKG1nci5pc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpKQotCQkJCQkJdGV4dCA9IHRleHQudG9VcHBlckNhc2UoKTsKLQkJCQkJZWxzZQotCQkJCQkJdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBpbnQgdHlwZSwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQotCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nIHRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJKSB7Ci0JCQlTdHJpbmcgdXJpID0gQ1NTTGlua0NvbnZlcnRlci5zdHJpcEZ1bmModGV4dCk7Ci0JCQlib29sZWFuIHVwcGVyID0gKHR5cGUgPT0gMCkgPyBtZ3IuaXNJZGVudFVwcGVyQ2FzZSgpIDogKCh0eXBlID09IDEpID8gbWdyLmlzUHJvcE5hbWVVcHBlckNhc2UoKSA6IG1nci5pc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpKTsKLQkJCVN0cmluZyBmdW5jID0gbWdyLmlzUHJlc2VydmVDYXNlKCkgPyB0ZXh0LnN1YnN0cmluZygwLCA0KSA6ICh1cHBlciA/ICJVUkwoIiA6ICJ1cmwoIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpc0NsZWFudXAoKSkgewotCQkJCXVwcGVyID0gKCh0eXBlID09IDApID8gc3RneS5nZXRJZGVudENhc2UoKSA6ICgodHlwZSA9PSAxKSA/IHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgOiBzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSkpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUjsKLQkJCQlmdW5jID0gKCh0eXBlID09IDApID8gc3RneS5nZXRJZGVudENhc2UoKSA6ICgodHlwZSA9PSAxKSA/IHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgOiBzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSkpID09IENTU0NsZWFudXBTdHJhdGVneS5BU0lTID8gdGV4dC5zdWJzdHJpbmcoMCwgNCkgOiAodXBwZXIgPyAiVVJMKCIgOiAidXJsKCIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKCFpc0NsZWFudXAoKSAmJiBtZ3IuaXNRdW90ZUluVVJJKCkpIHx8IChpc0NsZWFudXAoKSAmJiBzdGd5LmlzUXVvdGVWYWx1ZXMoKSkpIHsKLQkJCQlTdHJpbmcgcXVvdGUgPSBtZ3IuZ2V0UXVvdGVTdHJpbmcobnVsbCAvKiByZXNlcnZlZCBwYXJhbWV0ZXIgKi8pOwotCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZSh1cmksIHF1b3RlKTsKLQkJCQl0ZXh0ID0gZnVuYyArIHF1b3RlICsgdXJpICsgcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoaXNDbGVhbnVwKCkgJiYgIXN0Z3kuaXNRdW90ZVZhbHVlcygpKSB7Ci0JCQkJdGV4dCA9IGZ1bmMgKyBDU1NMaW5rQ29udmVydGVyLnJlbW92ZUZ1bmModGV4dCkgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGV4dCA9IGZ1bmMgKyB1cmkgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORyAmJiAoIWlzQ2xlYW51cCgpIHx8IHN0Z3kuaXNRdW90ZVZhbHVlcygpKSkgewotCQkJU3RyaW5nIHF1b3RlID0gbWdyLmdldFF1b3RlU3RyaW5nKG51bGwgLyogcmVzZXJ2ZWQgcGFyYW1ldGVyICovKTsKLQkJCS8vIGJlZ2dpbm5pbmcKLQkJCWlmICghdGV4dC5zdGFydHNXaXRoKHF1b3RlKSkgewotCQkJCWlmICh0ZXh0LnN0YXJ0c1dpdGgoIlwiIikgfHwgdGV4dC5zdGFydHNXaXRoKCJcJyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdGV4dCA9IHF1b3RlICsgdGV4dC5zdWJzdHJpbmcoMSk7Ci0JCQkJZWxzZQotCQkJCQl0ZXh0ID0gcXVvdGUgKyB0ZXh0OwotCQkJfQotCQkJLy8gZW5kaW5nCi0JCQlpZiAoIXRleHQuZW5kc1dpdGgocXVvdGUpKSB7Ci0JCQkJaWYgKHRleHQuZW5kc1dpdGgoIlwiIikgfHwgdGV4dC5lbmRzV2l0aCgiXCciKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCgpIC0gMSkgKyBxdW90ZTsKLQkJCQllbHNlCi0JCQkJCXRleHQgPSB0ZXh0ICsgcXVvdGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSkgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IEZPUk1BVDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSk7Ci0JCXN0cmF0ZWd5ID0gb2xkU3RyYXRlZ3k7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IEZPUk1BVDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSwgcmVnaW9uKTsKLQkJc3RyYXRlZ3kgPSBvbGRTdHJhdGVneTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoaW5zZXJ0ICYmIChhdHRyICE9IG51bGwpID8gYXR0ci5nZXRWYWx1ZSgpIDogIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJldHdlZW4gY2hpbGRyZW4oJ2NoaWxkJyBhbmQgaXRzIHByZXZpb3VzCi0JICogc2libGluZykgYW5kIGFwcGVuZCB0byBzdHJpbmcgYnVmZmVyCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmV0d2VlbiBjaGlsZHJlbignY2hpbGQnIGFuZCBpdHMgcHJldmlvdXMKLQkgKiBzaWJsaW5nKSBhbmQgYXBwZW5kIHRvIHN0cmluZyBidWZmZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldFBhcmVudE5vZGUoKSA9PSBub2RlKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9ybWF0QmVmb3JlKG5vZGUsIGNoaWxkLCAvKiAoY2hpbGQgIT0gbnVsbCkgPyAoY2hpbGQuZ2V0Q3NzVGV4dCgpKSA6ICovIiIsIGJ1ZiwgZXhjZXB0Rm9yKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZXR3ZWVuIGNoaWxkcmVuKCdjaGlsZCcgYW5kIGl0cyBwcmV2aW91cwotCSAqIHNpYmxpbmcpIGFuZCBhcHBlbmQgdG8gc3RyaW5nIGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmb3JtYXRDaGlsZHJlbihJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJLy8gYXBwZW5kIGNoaWxkCi0JCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgKChJTm9kZU5vdGlmaWVyKSBjaGlsZCkuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgY2hpbGQpOwotCQkJfQotCQkJU3RyaW5nQnVmZmVyIGNoaWxkU291cmNlID0gKChBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlcikgZm9ybWF0dGVyKS5mb3JtYXRQcm9jKGNoaWxkKTsKLQkJCWlmICghZmlyc3QpIHsKLQkJCQlmb3JtYXRCZWZvcmUobm9kZSwgY2hpbGQsIG5ldyBTdHJpbmcoY2hpbGRTb3VyY2UpLCBzb3VyY2UsIG51bGwpOwotCQkJfQotCQkJc291cmNlLmFwcGVuZChjaGlsZFNvdXJjZSk7Ci0JCQkvLyBhcHBlbmQgYmV0d2VlbiBjaGlsZHJlbgotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJZmlyc3QgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZvcm1hdENoaWxkcmVuKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpbnQgY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlTdHJpbmdCdWZmZXIgY2hpbGRTb3VyY2UgPSBudWxsOwotCQkJYm9vbGVhbiB0b0ZpbmlzaCA9IGZhbHNlOwotCQkJaWYgKHN0YXJ0IDwgY3VyRW5kKSB7Ci0JCQkJaW50IGN1clN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpZiAoY3VyU3RhcnQgPCBlbmQpIHsKLQkJCQkJLy8gYXBwZW5kIGNoaWxkCi0JCQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSAoKElOb2RlTm90aWZpZXIpIGNoaWxkKS5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCQkJCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQkJY2hpbGRTb3VyY2UgPSAoKEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyKSBmb3JtYXR0ZXIpLmZvcm1hdFByb2MoY2hpbGQpOwotCQkJCQllbHNlCi0JCQkJCQljaGlsZFNvdXJjZSA9ICgoQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIpIGZvcm1hdHRlcikuZm9ybWF0UHJvYyhjaGlsZCwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQl0b0ZpbmlzaCA9IHRydWU7Ci0JCQl9Ci0JCQkvLyBhcHBlbmQgYmV0d2VlbiBjaGlsZHJlbgotCQkJaWYgKCFmaXJzdCkgewotCQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCk7IC8vIGNoYW5nZQotCQkJCQkJCQkJCQkJCQkJCQkvLyBvbmx5Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIHN0YXJ0Ci0JCQkJaWYgKHN0YXJ0IDwgY3VyRW5kKSB7Ci0JCQkJCWludCBjdXJTdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpLmdldEVuZE9mZnNldCgpOwotCQkJCQlpZiAoY3VyU3RhcnQgPCBlbmQpIHsKLQkJCQkJCVN0cmluZyB0b0FwcGVuZCA9IChjaGlsZFNvdXJjZSAhPSBudWxsKSA/IG5ldyBTdHJpbmcoY2hpbGRTb3VyY2UpIDogIiI7Ly8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCQkJZm9ybWF0QmVmb3JlKG5vZGUsIGNoaWxkLCB0b0FwcGVuZCwgc291cmNlLCBudWxsKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlmb3JtYXRCZWZvcmUobm9kZSwgY2hpbGQsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hpbGRTb3VyY2UgIT0gbnVsbCkgewotCQkJCXNvdXJjZS5hcHBlbmQoY2hpbGRTb3VyY2UpOwotCQkJfQotCQkJZmlyc3QgPSBmYWxzZTsKLQkJCWlmICh0b0ZpbmlzaCkKLQkJCQlicmVhazsKLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQgYW5kIGFwcGVuZCB0byBzdHJpbmcKLQkgKiBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBhZnRlciB0aGUgbGFzdCBjaGlsZCBhbmQgYXBwZW5kIHRvIHN0cmluZwotCSAqIGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZWZvcmUgdGhlIGZpcnN0IGNoaWxkIGFuZCBhcHBlbmQgdG8gc3RyaW5nCi0JICogYnVmZmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZWZvcmUgdGhlIGZpcnN0IGNoaWxkIGFuZCBhcHBlbmQgdG8gc3RyaW5nCi0JICogYnVmZmVyCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0UHJvYyhJQ1NTTm9kZSBub2RlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcm1hdFByZShub2RlLCBzb3VyY2UpOwotCQlmb3JtYXRDaGlsZHJlbihub2RlLCBzb3VyY2UpOwotCQlmb3JtYXRQb3N0KG5vZGUsIHNvdXJjZSk7Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXRQcm9jKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjdXJTdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRQcmUobm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdFByZShub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCQljdXJTdGFydCA9IGN1ckVuZDsKLQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRDaGlsZHJlbihub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQkJY3VyU3RhcnQgPSBjdXJFbmQ7Ci0JCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0UG9zdChub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0UG9zdChub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQljdXJFbmQgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdFByZShub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0UHJlKG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJCWN1clN0YXJ0ID0gY3VyRW5kOwotCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdFBvc3Qobm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdFBvc3Qobm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JcHJvdGVjdGVkIENTU0NsZWFudXBTdHJhdGVneSBnZXRDbGVhbnVwU3RyYXRlZ3koSUNTU05vZGUgbm9kZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RyYXRlZ3kgPSBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsLmdldEluc3RhbmNlKCk7Ci0JCUlDU1NEb2N1bWVudCBkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIHN0cmF0ZWd5OwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gc3RyYXRlZ3k7Ci0JCWlmIChtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJLy8gVE9ETyAtIFRSQU5TSVRJT04gTmFrYW1vcmktc2FuLCBvciBLaXQsIGhvdyBjYW4gd2UgbW92ZSB0bwotCQkJLy8gIkhUTUwiIHBsdWdpbj8KLQkJCS8vIGNhbiB3ZSBzdWJjbGFzcz8KLQkJCS8vIHN0cmF0ZWd5ID0gQ1NTSW5IVE1MQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZGVudChJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQlJQ1NTTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTQXR0cikKLQkJCXBhcmVudCA9ICgoSUNTU0F0dHIpIG5vZGUpLmdldE93bmVyQ1NTTm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAobm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uKQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQotCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nIHBhcmVudEluZGVudCA9IGdldEluZGVudChwYXJlbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2Ygb3JnLnczYy5kb20uY3NzLkNTU1J1bGUpCi0JCQlyZXR1cm4gcGFyZW50SW5kZW50ICsgbWdyLmdldEluZGVudFN0cmluZygpOwotCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbikKLQkJCXJldHVybiBwYXJlbnRJbmRlbnQgKyBtZ3IuZ2V0SW5kZW50U3RyaW5nKCk7Ci0JCXJldHVybiBwYXJlbnRJbmRlbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRMYXN0TGluZUxlbmd0aChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcoc291cmNlKTsKLQkJaW50IG4gPSBzdHIubGFzdEluZGV4T2YoZGVsaW0pOwotCQlpZiAobiA8IDApCi0JCQlyZXR1cm4gc3RyLmxlbmd0aCgpOwotCQllbHNlCi0JCQlyZXR1cm4gc3RyLmxlbmd0aCgpIC0gbiAtIGRlbGltLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcykpCi0JCQlyZXR1cm4gMDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcmVnaW9uID0gaXQubmV4dCgpOwotCQkJLy8gaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiAmJgotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSAhPQotCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHBvcyA9IChmb3VuZCA/IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgOiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIC0gaW5zZXJ0UG9zOwotCQlyZXR1cm4gKHBvcyA+PSAwKSA/IHBvcyA6IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8PSAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MgLSAxKSkKLQkJCXJldHVybiAwOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyAtIDEpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MgLSAxKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCXJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCS8vIGlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmCi0JCQkvLyByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgJiYKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgIT0KLQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWludCBwb3MgPSBpbnNlcnRQb3MgLSAoZm91bmQgPyBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikgOiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pKTsKLQkJLy8gZmxhdE5vZGUgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gaWYgKGZvdW5kKSB7Ci0JCS8vIGlmIChyZWdpb24uZ2V0TGVuZ3RoKCkgIT0gcmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkvLyBwb3MgPSBpbnNlcnRQb3MgLSBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIHBvcyA9IGluc2VydFBvcyAtIGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkvLyB9Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIHBvcyA9IGluc2VydFBvcyAtIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCS8vIH0KLQkJcmV0dXJuIChwb3MgPj0gMCkgPyBwb3MgOiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gKG5vZGUgIT0gbnVsbCkgPyBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpIDogbnVsbDsKLQkJcmV0dXJuIChtb2RlbCAhPSBudWxsKSA/IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKSA6ICJcbiIgLyoKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICogZGVmYXVsdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBkZWxpbWl0ZXIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICovOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBUT0RPIDogY2hlY2sgd2hldGhlciB0byB1c2UgbW9kZWwuZ2V0TGluZURlbGltaXRlcigpIG9yCi0JCS8vIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbltdIGdldE91dHNpZGVSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnQgbW9kZWwsIElSZWdpb24gcmVnKSB7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmV0ID0gbmV3IENvbXBvdW5kUmVnaW9uWzJdOwotCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihtb2RlbCwgcmVnLmdldE9mZnNldCgpKTsKLQkJaXQucHJldigpOwotCQlpZiAoaXQuaGFzUHJldigpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gaXQucHJldigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJcmV0WzBdID0gbmV3IENvbXBvdW5kUmVnaW9uKGRvY3VtZW50UmVnaW9uLCB0ZXh0UmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldFswXSA9IG51bGw7Ci0JCX0KLQkJaXQucmVzZXQobW9kZWwsIHJlZy5nZXRPZmZzZXQoKSArIHJlZy5nZXRMZW5ndGgoKSk7Ci0JCWlmIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlyZXRbMV0gPSBuZXcgQ29tcG91bmRSZWdpb24oZG9jdW1lbnRSZWdpb24sIHRleHRSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0WzFdID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDU1NTb3VyY2VHZW5lcmF0b3IgZ2V0UGFyZW50Rm9ybWF0dGVyKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IChDU1NTb3VyY2VHZW5lcmF0b3IpICgoSU5vZGVOb3RpZmllcikgcGFyZW50KS5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBwYXJlbnQpOwotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb25bXSBnZXRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnQgbW9kZWwsIElSZWdpb24gcmVnLCBJUmVnaW9uIGV4Y2VwdEZvciwgU3RyaW5nIHBpY2t1cFR5cGUpIHsKLQkJaW50IHN0YXJ0ID0gcmVnLmdldE9mZnNldCgpOwotCQlpbnQgZW5kID0gcmVnLmdldE9mZnNldCgpICsgcmVnLmdldExlbmd0aCgpOwotCQlpbnQgc3RhcnRFID0gKGV4Y2VwdEZvciAhPSBudWxsKSA/IGV4Y2VwdEZvci5nZXRPZmZzZXQoKSA6IC0xOwotCQlpbnQgZW5kRSA9IChleGNlcHRGb3IgIT0gbnVsbCkgPyBleGNlcHRGb3IuZ2V0T2Zmc2V0KCkgKyBleGNlcHRGb3IuZ2V0TGVuZ3RoKCkgOiAwOwotCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbW9kZWwuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQlib29sZWFuIHBpY2t1cGVkID0gZmFsc2U7Ci0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsICYmIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBlbmQpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJSXRlcmF0b3IgaXQgPSByZWdpb25MaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPCBzdGFydCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGVuZCA8PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pKQotCQkJCQlicmVhazsKLQkJCQlpZiAoc3RhcnRFID49IDAgJiYgc3RhcnRFIDw9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgJiYgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPD0gZW5kRSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETykKLQkJCQkJbGlzdC5hZGQobmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCByZWdpb24pKTsKLQkJCQllbHNlIGlmICghcGlja3VwZWQgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBwaWNrdXBUeXBlKSB7Ci0JCQkJCWxpc3QuYWRkKG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKSk7Ci0JCQkJCXBpY2t1cGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlmbGF0Tm9kZSA9IGZsYXROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAobGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBuZXcgQ29tcG91bmRSZWdpb25bbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHJlZ2lvbnMpOwotCQkJcmV0dXJuIHJlZ2lvbnM7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBDb21wb3VuZFJlZ2lvblswXTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb25bXSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgbW9kZWwsIElSZWdpb24gcmVnLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpbnQgc3RhcnQgPSByZWcuZ2V0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSByZWcuZ2V0T2Zmc2V0KCkgKyByZWcuZ2V0TGVuZ3RoKCkgLSAxOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG1vZGVsLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJd2hpbGUgKGZsYXROb2RlICE9IG51bGwgJiYgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8PSBlbmQpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJSXRlcmF0b3IgaXQgPSByZWdpb25MaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPCBzdGFydCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGVuZCA8IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IChpc0NsZWFudXAoKSAmJiAhc3RneS5pc0Zvcm1hdFNvdXJjZSgpKSkgLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcm1hdHRpbmcKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhc2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9uCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjbGVhbnVwCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhY3Rpb24KLQkJCQkJbGlzdC5hZGQobmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCByZWdpb24pKTsKLQkJCX0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChsaXN0LnNpemUoKSA+IDApIHsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG5ldyBDb21wb3VuZFJlZ2lvbltsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocmVnaW9ucyk7Ci0JCQlyZXR1cm4gcmVnaW9uczsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uWzBdOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbmNsdWRlcyhJUmVnaW9uIHJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIChyZWdpb24uZ2V0T2Zmc2V0KCkgPD0gc3RhcnQpICYmIChlbmQgPD0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNDbGVhbnVwKCkgewotCQlyZXR1cm4gc3RyYXRlZ3kgPT0gQ0xFQU5VUDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNGb3JtYXQoKSB7Ci0JCXJldHVybiBzdHJhdGVneSA9PSBGT1JNQVQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlc1ByZUVuZChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA9PSAocmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHByb3RlY3RlZCBib29sZWFuIG5lZWRTKENvbXBvdW5kUmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlZ2lvbiBvdmVybGFwcGVkUmVnaW9uKElSZWdpb24gcmVnaW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgc3RhcnQsIGVuZCkpIHsKLQkJCWludCBvZmZzZXQgPSAocmVnaW9uLmdldE9mZnNldCgpIDw9IHN0YXJ0KSA/IHN0YXJ0IDogcmVnaW9uLmdldE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9ICgoZW5kIDw9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgPyBlbmQgOiByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIC0gb2Zmc2V0OwotCQkJcmV0dXJuIG5ldyBGb3JtYXRSZWdpb24ob2Zmc2V0LCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvdmVybGFwcyhJUmVnaW9uIHJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIChzdGFydCA8IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgJiYgKHJlZ2lvbi5nZXRPZmZzZXQoKSA8IGVuZCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckNoYW5nZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJDaGFuZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNGE3M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckNoYW5nZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyQ2hhbmdlQ29udGV4dCB7Ci0KLQlwdWJsaWMgaW50IHN0YXJ0LCBlbmQ7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQXR0ckNoYW5nZUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXN0YXJ0ID0gZW5kID0gMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2VhYjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wcmVmZXJlbmNlcy5DU1NQcmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXR0ckZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQXR0ckZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUF0dHJGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCi0JCQlpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpIHx8IGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgcmVnaW9uc1tpIC0gMV0sIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU0ltcG9ydFJ1bGUuSFJFRikpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKSA9PSBudWxsIHx8IGF0dHIuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGNvdW50ZXIgYXR0cmlidXRlcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCXZhbHVlID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSB8fCBhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKSkgewotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NJbXBvcnRSdWxlLkhSRUYpKSB7Ci0JCQkJU3RyaW5nIHVyaSA9IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU0xpbmtDb252ZXJ0ZXIuc3RyaXBGdW5jKHZhbHVlKTsKLQkJCQlTdHJpbmcgZnVuYyA9IG1nci5pc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpID8gIlVSTCgiIDogInVybCgiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJaWYgKG1nci5pc1F1b3RlSW5VUkkoKSkgewotCQkJCQlTdHJpbmcgcXVvdGUgPSBtZ3IuZ2V0UXVvdGVTdHJpbmcoYXR0ci5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZSh1cmksIHF1b3RlKTsKLQkJCQkJdmFsdWUgPSBmdW5jICsgcXVvdGUgKyB1cmkgKyBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2YWx1ZSA9IGZ1bmMgKyB1cmkgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpKSB7Ci0JCQkJU3RyaW5nIHF1b3RlID0gbWdyLmdldFF1b3RlU3RyaW5nKGF0dHIuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkpOwotCQkJCWlmICghdmFsdWUuc3RhcnRzV2l0aCgiXCIiKSAmJiAhdmFsdWUuc3RhcnRzV2l0aCgiXCciKSkvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IHF1b3RlICsgdmFsdWU7Ci0JCQkJaWYgKCF2YWx1ZS5lbmRzV2l0aCgiXCIiKSAmJiAhdmFsdWUuZW5kc1dpdGgoIlwnIikpLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSB2YWx1ZSArIHF1b3RlOwotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCkpIHsKLQkJCQlpZiAobWdyLmlzUHJvcFZhbHVlVXBwZXJDYXNlKCkpCi0JCQkJCXZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTsKLQkJCQllbHNlCi0JCQkJCXZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpID09IG51bGwgfHwgYXR0ci5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWlmIChtZ3IuaXNJZGVudFVwcGVyQ2FzZSgpKQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobWdyLmlzUHJvcFZhbHVlVXBwZXJDYXNlKCkpCi0JCQkJCXZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTsKLQkJCQllbHNlCi0JCQkJCXZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCXNvdXJjZS5hcHBlbmQodmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWZvcm1hdFByZShub2RlLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEF0dHJGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBBdHRyRm9ybWF0dGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NGb3JtYXRVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NGb3JtYXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmRjMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTRm9ybWF0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuYWRhcHRlcnMuSUNTU01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuYWRhcHRlcnMuSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBDU1NGb3JtYXRVdGlsIHsKLQlwdWJsaWMgTGlzdCBjb2xsZWN0Q1NTTm9kZXMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0KTsKLQkJSW5kZXhlZFJlZ2lvbiBlbmROb2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydCArIGxlbmd0aCAtIDEpOwotCi0JCWlmIChzdGFydE5vZGUgPT0gbnVsbCB8fCBlbmROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBub2RlczsKLQkJfQotCi0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCAmJiBzdGFydE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSAmJiBlbmROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCS8vIENTUyBtb2RlbAotCQkJSUNTU05vZGUgY2EgPSBnZXRDb21tb25BbmNlc3RvcigoSUNTU05vZGUpIHN0YXJ0Tm9kZSwgKElDU1NOb2RlKSBlbmROb2RlKTsKLQkJCWlmIChjYSAhPSBudWxsKSB7Ci0JCQkJZm9yIChJQ1NTTm9kZSBub2RlID0gY2EuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGwgJiYgc3RhcnQgKyBsZW5ndGggPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKHN0YXJ0IDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWE1MTW9kZWwgJiYgc3RhcnROb2RlIGluc3RhbmNlb2YgWE1MTm9kZSAmJiBlbmROb2RlIGluc3RhbmNlb2YgWE1MTm9kZSkgewotCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlzdGFydE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChUZXh0KSBzdGFydE5vZGUpLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWlmIChlbmROb2RlIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCWVuZE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChUZXh0KSBlbmROb2RlKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQkvLyBIVE1MIG1vZGVsLCBtYXliZQotCQkJWE1MTm9kZSBjYSA9IChYTUxOb2RlKSBnZXRDb21tb25BbmNlc3RvcigoTm9kZSkgc3RhcnROb2RlLCAoTm9kZSkgZW5kTm9kZSk7Ci0JCQlmaW5kQ1NTKG5vZGVzLCBjYSk7Ci0JCX0KLQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q29tbW9uQW5jZXN0b3IgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q29tbW9uQW5jZXN0b3IoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgewotCQlpZiAobm9kZTEgPT0gbnVsbCB8fCBub2RlMiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIG5hID0gbm9kZTI7IG5hICE9IG51bGw7IG5hID0gbmEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlmb3IgKE5vZGUgdGEgPSBub2RlMTsgdGEgIT0gbnVsbDsgdGEgPSB0YS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAodGEgPT0gbmEpCi0JCQkJCXJldHVybiB0YTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRDU1MoTGlzdCBjc3NOb2RlcywgWE1MTm9kZSBub2RlKSB7Ci0JCUlDU1NNb2RlbEFkYXB0ZXIgYWRhcHRlcjsKLQkJYWRhcHRlciA9IChJQ1NTTW9kZWxBZGFwdGVyKSBub2RlLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJSUNTU01vZGVsIG1vZGVsID0gYWRhcHRlci5nZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCQljc3NOb2Rlcy5hZGQobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGFwdGVyID0gKElDU1NNb2RlbEFkYXB0ZXIpIG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCUlDU1NNb2RlbCBtb2RlbCA9IGFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5JTkxJTkUpIHsKLQkJCQkJY3NzTm9kZXMuYWRkKG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZvciAoWE1MTm9kZSBjaGlsZCA9IChYTUxOb2RlKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSAoWE1MTm9kZSkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJZmluZENTUyhjc3NOb2RlcywgY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ1NTTm9kZSBnZXRDb21tb25BbmNlc3RvcihJQ1NTTm9kZSBub2RlQSwgSUNTU05vZGUgbm9kZUIpIHsKLQkJaWYgKG5vZGVBID09IG51bGwgfHwgbm9kZUIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKElDU1NOb2RlIG5hID0gbm9kZUE7IG5hICE9IG51bGw7IG5hID0gbmEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlmb3IgKElDU1NOb2RlIHRhID0gbm9kZUI7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKSB7Ci0JCQkJCXJldHVybiB0YTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZVNvdXJjZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChvZmZzZXQgPj0gMCAmJiBsZW5ndGggPj0gMCAmJiBvZmZzZXQgKyBsZW5ndGggPD0gc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgpKQotCQkJCXJldHVybjsKLQkJCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCQkvLyBXZSB1c2UgJ3N0cnVjdHVyZWREb2N1bWVudCcgYXMgdGhlIHJlcXVlc3RlciBvYmplY3QganVzdCBzbwotCQkJLy8gdGhpcyBhbmQgdGhlIG90aGVyCi0JCQkvLyBmb3JtYXQtcmVsYXRlZCAncmVwYWxjZVRleHQnIChpbiByZXBsYWNlU291cmNlKSBjYW4gdXNlIHRoZQotCQkJLy8gc2FtZSByZXF1ZXN0ZXIuCi0JCQkvLyBPdGhlcndpc2UsIGlmIHJlcXVlc3RlciBpcyBub3QgaWRlbnRpY2FsLAotCQkJLy8gdGhlIHVuZG8gZ3JvdXAgZ2V0cyAiYnJva2VuIiBpbnRvIG11bHRpcGxlIHBpZWNlcyBiYXNlZAotCQkJLy8gb24gdGhlIHJlcXVlc3RlcnMgYmVpbmcgZGlmZmVyZW50LiBUZWNobmljYWxseSwgYW55IHVuaXF1ZSwKLQkJCS8vIGNvbW1vbgotCQkJLy8gcmVxdWVzdGVyIG9iamVjdCB3b3VsZCB3b3JrLgotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NGb3JtYXRVdGlsIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NGb3JtYXRVdGlsKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIENTU0Zvcm1hdFV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTRm9ybWF0VXRpbCBmSW5zdGFuY2U7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzMmZlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU291cmNlRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uCi0JICovCi0JU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1YmNhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NTb3VyY2VHZW5lcmF0b3IgZ2V0U291cmNlRm9ybWF0dGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIHRhcmdldDsKLQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgOgotCQkJCXJldHVybiBDaGFyc2V0UnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5GT05URkFDRVJVTEVfTk9ERSA6Ci0JCQkJcmV0dXJuIEZvbnRGYWNlUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUgOgotCQkJCXJldHVybiBJbXBvcnRSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLk1FRElBTElTVF9OT0RFIDoKLQkJCQlyZXR1cm4gTWVkaWFMaXN0Rm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLk1FRElBUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gTWVkaWFSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JCQkJaWYgKHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIpCi0JCQkJCXJldHVybiBDb3VudGVyRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQkJZWxzZSBpZiAodmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVCkKLQkJCQkJcmV0dXJuIFJlY3RGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQllbHNlIGlmICh2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlLkNTU19SR0JDT0xPUikKLQkJCQkJcmV0dXJuIFJHQkZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlBBR0VSVUxFX05PREUgOgotCQkJCXJldHVybiBQYWdlUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUgOgotCQkJCXJldHVybiBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJcmV0dXJuIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVSVUxFX05PREUgOgotCQkJCXJldHVybiBTdHlsZVJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFIDoKLQkJCQlyZXR1cm4gU3R5bGVTaGVldEZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5BVFRSX05PREUgOgotCQkJCXJldHVybiBBdHRyRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gVW5rbm93blJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkgZkluc3RhbmNlOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOGQxMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBDU1NTb3VyY2VHZW5lcmF0b3IgZXh0ZW5kcyBDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCByZWdpb24pOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiBleGNlcHRGb3IpOwotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JaW50IGdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JaW50IGdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ2hhcnNldFJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NoYXJzZXRSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMDYwNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ2hhcnNldFJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucHJlZmVyZW5jZXMuQ1NTUHJlZmVyZW5jZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBDSEFSU0VUID0gIkBjaGFyc2V0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDaGFyc2V0UnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NDaGFyc2V0UnVsZS5FTkNPRElORy5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQucHJldigpOwotCQkJCWlmIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpICsgMTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0KSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJZm9ybWF0UHJlKG5vZGUsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc291cmNlKTsKLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCVN0cmluZyBxdW90ZSA9IG1nci5nZXRRdW90ZVN0cmluZyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQkJCVN0cmluZyBzdHIgPSBDSEFSU0VUOwotCQkJaWYgKG1nci5pc0lkZW50VXBwZXJDYXNlKCkpCi0JCQkJc3RyID0gQ0hBUlNFVC50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJU3RyaW5nIGVuYyA9ICgoSUNTU0NoYXJzZXRSdWxlKSBub2RlKS5nZXRFbmNvZGluZygpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKGVuYywgcXVvdGUpOwotCQkJc3RyID0gcXVvdGUgKyAoKGVuYyAhPSBudWxsKSA/IGVuYyA6ICIiKSArIHF1b3RlOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0ciwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWlmICghSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJZWxzZSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbnNbXSA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCBpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCQlyZXR1cm4gcmVnaW9uc1tpXS5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQkJcmV0dXJuIGlOb2RlLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db21wb3VuZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29tcG91bmRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3NWZiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db21wb3VuZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotY2xhc3MgQ29tcG91bmRSZWdpb24gewotCi0JQ29tcG91bmRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmZEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCQl0aGlzLmZUZXh0UmVnaW9uID0gdGV4dFJlZ2lvbjsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZkRvY3VtZW50UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFRleHRSZWdpb24oKSB7Ci0JCXJldHVybiBmVGV4dFJlZ2lvbjsKLQl9Ci0KLQlTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUZXh0UmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudFJlZ2lvbi5nZXRUZXh0KGZUZXh0UmVnaW9uKTsKLQl9Ci0KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pOwotCX0KLQotCWludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KGZUZXh0UmVnaW9uKTsKLQl9Ci0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmRG9jdW1lbnRSZWdpb247Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmVGV4dFJlZ2lvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvdW50ZXJGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvdW50ZXJGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiNzc0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db3VudGVyRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNvdW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucHJlZmVyZW5jZXMuQ1NTUHJlZmVyZW5jZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ291bnRlckZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ291bnRlckZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNvdW50ZXJGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBzb3VyY2U7Ci0KLQkJaWYgKCFJQ291bnRlci5JREVOVElGSUVSLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpICYmICFJQ291bnRlci5MSVNUU1RZTEUuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkgJiYgIUlDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBzb3VyY2U7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJY29udGV4dC5zdGFydCA9IGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWNvbnRleHQuZW5kID0gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJQ1NTUHJlZmVyZW5jZUhlbHBlciBtZ3IgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0KLQkJSUNvdW50ZXIgY291bnRlciA9IChJQ291bnRlcikgbm9kZTsKLQkJU3RyaW5nIHF1b3RlID0gbWdyLmdldFF1b3RlU3RyaW5nKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkpOwotCQlTdHJpbmcgc2VwID0gY291bnRlci5nZXRTZXBhcmF0b3IoKTsKLQkJU3RyaW5nIGlkZW50ID0gY291bnRlci5nZXRJZGVudGlmaWVyKCk7Ci0JCVN0cmluZyBzdHlsZSA9IGNvdW50ZXIuZ2V0TGlzdFN0eWxlKCk7Ci0KLQkJaWYgKElDb3VudGVyLklERU5USUZJRVIuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsKLQkJCWlmIChpbnNlcnQpCi0JCQkJaWRlbnQgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQllbHNlCi0JCQkJaWRlbnQgPSAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoSUNvdW50ZXIuTElTVFNUWUxFLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7Ci0JCQlpZiAoaW5zZXJ0KQotCQkJCXN0eWxlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJZWxzZQotCQkJCXN0eWxlID0gbnVsbDsKLQkJfQotCQllbHNlIGlmIChJQ291bnRlci5TRVBBUkFUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsKLQkJCWlmIChpbnNlcnQpCi0JCQkJc2VwID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJZWxzZQotCQkJCXNlcCA9IG51bGw7Ci0JCX0KLQotCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc2VwLCBxdW90ZSk7Ci0JCXNlcCA9IChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogKHF1b3RlICsgc2VwICsgcXVvdGUpOwotCi0JCVN0cmluZyBmdW5jID0gKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSA/ICJjb3VudGVyKCIgOiAiY291bnRlcnMoIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlpZiAobWdyLmlzUHJvcFZhbHVlVXBwZXJDYXNlKCkpIHsKLQkJCWlkZW50ID0gaWRlbnQudG9VcHBlckNhc2UoKTsKLQkJCXN0eWxlID0gc3R5bGUudG9VcHBlckNhc2UoKTsKLQkJCWZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCQlzdHlsZSA9IHN0eWxlLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJaWYgKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgaWRlbnQsIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGlkZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCXNvdXJjZS5hcHBlbmQoZnVuYyk7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBpZGVudCwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoaWRlbnQpOwotCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHNlcCwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc2VwKTsKLQkJfQotCi0JCWlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmxlbmd0aCgpICE9IDApIHsKLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzdHlsZSwgc291cmNlKTsKLQkJfQotCQlzb3VyY2UuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCi0JCS8qCi0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0KLQkJICogbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJICogSVRleHRSZWdpb25bXSByZWdpb25zID0KLQkJICogZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldwotCQkgKiBGb3JtYXRSZWdpb24oY29udGV4dC5zdGFydCwgY29udGV4dC5lbmQgLSBjb250ZXh0LnN0YXJ0ICsgMSkpOyBpbnQKLQkJICogY29tbWFzWzJdOyBpbnQgbnVtQ29tbWEgPSAwOyBmb3IoaW50IGogPSAwOyBqIDxyZWdpb25zLmxlbmd0aDsgaisrKSB7Ci0JCSAqIGlmIChyZWdpb25zW2pdLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DT01NQSkgewotCQkgKiBjb21tYXNbbnVtQ29tbWErK10gPSBqOyBpZiAobnVtQ29tbWEgPiAxKSBicmVhazsgfSB9Ci0JCSAqIAotCQkgKiBpZiAoSUNvdW50ZXIuSURFTlRJRklFUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgeyB9IGVsc2UKLQkJICogaWYgKElDb3VudGVyLkxJU1RTVFlMRS5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgeyB9IGVsc2UKLQkJICogaWYgKElDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgeyBib29sZWFuCi0JCSAqIHNraXBTcGFjZSA9IGZhbHNlOyBTdHJpbmcgZnVuYyA9IGluc2VydCA/ICJjb3VudGVycygiIDogImNvdW50ZXIoIjsKLQkJICogaWYgKG1nci5pc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpKSBmdW5jID0gZnVuYy50b1VwcGVyQ2FzZSgpOwotCQkgKiAKLQkJICogZm9yKGludCBpPTA7IGkgPHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsgaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09Ci0JCSAqIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJICogc291cmNlLmFwcGVuZChmdW5jKTsgZWxzZSB7IGlmIChudW1Db21tYSA9PSAyICYmIGNvbW1hc1sxXSA8IGkpIHsKLQkJICogIH0gZWxzZSBpZiAobnVtQ29tbWEgPT0gMSAmJiBjb21tYXNbMF0gPCBpICYmIGluc2VydCkgewotCQkgKiAgfSBlbHNlIGlmIChudW1Db21tYSA9PSAxICYmIGNvbW1hc1swXSA8IGkgJiYgISBpbnNlcnQpIHsgfSBlbHNlIGlmCi0JCSAqIChudW1Db21tYSA9PSAwICYmIGluc2VydCAmJiByZWdpb25zW2ldLmdldFR5cGUgPT0KLQkJICogQ1NTUmVnaW9uQ29udGV4dHMuUEFSRU5USEVTSVNfQ0xPU0UpIHsgc291cmNlLmFwcGVuZCgiLCIpOwotCQkgKiBhcHBlbmRTcGFjZUJlZm9yZShub2RlLGF0dHIuZ2V0VmFsdWUoKSxzb3VyY2UpOwotCQkgKiBzb3VyY2UuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7IH0KLQkJICogCi0JCSAqIGlmIChpICE9IDAgJiYgIXNraXBTcGFjZSkKLQkJICogYXBwZW5kU3BhY2VCZWZvcmUobm9kZSxyZWdpb25zW2ldLHNvdXJjZSk7Ci0JCSAqIHNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0pKTsgfSBza2lwU3BhY2UgPQotCQkgKiBmYWxzZTsKLQkJICogCi0JCSAqIGlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PQotCQkgKiBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHNraXBTcGFjZSA9IHRydWU7IH0gfQotCQkgKi8KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlib29sZWFuIHNraXBTcGFjZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCAmJiAhc2tpcFNwYWNlKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNraXBTcGFjZSA9IGZhbHNlOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlza2lwU3BhY2UgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCUlDb3VudGVyIGNvdW50ZXIgPSAoSUNvdW50ZXIpIG5vZGU7Ci0JCQlTdHJpbmcgcXVvdGUgPSBtZ3IuZ2V0UXVvdGVTdHJpbmcobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQlTdHJpbmcgc2VwYXJhdG9yID0gY291bnRlci5nZXRTZXBhcmF0b3IoKTsKLQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzZXBhcmF0b3IsIHF1b3RlKTsKLQkJCVN0cmluZyBzZXAgPSAoc2VwYXJhdG9yID09IG51bGwgfHwgc2VwYXJhdG9yLmxlbmd0aCgpID09IDApID8gbnVsbCA6IChxdW90ZSArIHNlcGFyYXRvciArIHF1b3RlKTsKLQkJCVN0cmluZyBpZGVudCA9IGNvdW50ZXIuZ2V0SWRlbnRpZmllcigpOwotCQkJU3RyaW5nIHN0eWxlID0gY291bnRlci5nZXRMaXN0U3R5bGUoKTsKLQkJCVN0cmluZyBmdW5jID0gKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSA/ICJjb3VudGVyKCIgOiAiY291bnRlcnMoIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJLy8gbm9ybWFsaXplCi0JCQlpZiAoaWRlbnQgPT0gbnVsbCkKLQkJCQlpZGVudCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChzdHlsZSA9PSBudWxsKQotCQkJCXN0eWxlID0gIiI7Ly8kTk9OLU5MUy0xJAotCi0JCQlpZiAobWdyLmlzUHJvcFZhbHVlVXBwZXJDYXNlKCkpIHsKLQkJCQlpZGVudCA9IGlkZW50LnRvVXBwZXJDYXNlKCk7Ci0JCQkJc3R5bGUgPSBzdHlsZS50b1VwcGVyQ2FzZSgpOwotCQkJCWZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCQkJc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJaWYgKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBpZGVudCwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGlkZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZS5hcHBlbmQoZnVuYyk7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgaWRlbnQsIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChpZGVudCk7Ci0JCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzZXAsIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChzZXApOwotCQkJfQotCi0JCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzdHlsZSwgc291cmNlKTsKLQkJCX0KLQkJCXNvdXJjZS5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChJQ291bnRlci5JREVOVElGSUVSLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNvdW50ZXIuSURFTlRJRklFUik7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKSk7Ci0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZSBpZiAoSUNvdW50ZXIuTElTVFNUWUxFLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNvdW50ZXIuTElTVFNUWUxFKTsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpKTsKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgaWYgKElDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDb3VudGVyLlNFUEFSQVRPUik7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKSk7Ci0JCQlib29sZWFuIGhhc0NvbW1hID0gZmFsc2U7Ci0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUikgewotCQkJCQlpZiAoIWhhc0NvbW1hKQotCQkJCQkJaGFzQ29tbWEgPSB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ291bnRlckZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDb3VudGVyRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVjbENvbnRhaW5lckZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVjbENvbnRhaW5lckZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2U1MzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlY2xDb250YWluZXJGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlY2xDb250YWluZXJGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCURlY2xDb250YWluZXJGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uCi0JICogQHBhcmFtIHByZXZSZWdpb24KLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JVGV4dFJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkU2VsZWN0b3JSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBDb21wb3VuZFJlZ2lvbiBwcmV2UmVnaW9uLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlTdHJpbmcgdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHRleHQ7Ci0KLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pIHsKLQkJCXNob3J0IHNlbENhc2UgPSBzdGd5LmdldFNlbGVjdG9yVGFnQ2FzZSgpOwotCQkJaWYgKHNlbENhc2UgPT0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKSB7Ci0JCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHNlbENhc2UgPT0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKSB7Ci0JCQkJcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0KLQkJcmV0dXJuIGRlY29yYXRlZFJlZ2lvbihyZWdpb24sIDAsIHN0Z3kpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJc291cmNlLmFwcGVuZCgifSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWZkOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTcGFjZUJldHdlZW4oSUNTU05vZGUgbm9kZSwgQ29tcG91bmRSZWdpb24gcHJldiwgQ29tcG91bmRSZWdpb24gbmV4dCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCi0JCS8vIGluIHNlbGVjdG9yCi0JCVN0cmluZyBwcmV2VHlwZSA9IHByZXYuZ2V0VHlwZSgpOwotCQlTdHJpbmcgbmV4dFR5cGUgPSBuZXh0LmdldFR5cGUoKTsKLQkJaWYgKENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUocHJldlR5cGUpICYmIENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUobmV4dFR5cGUpKSB7Ci0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM5OTAKLQkJCS8vIEZvcm1hdHRpbmcgQ1NTIGZpbGUgc3BsaXRzIGVsZW1lbnQuY2xhc3MgaW50byBlbGVtZW50IC4gY2xhc3MKLQkJCWlmICgocHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSAmJiAobmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IG5leHRUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCkpIHx8ICgocHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MpICYmIG5leHRUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pKSB7Ci0JCQkJLy8gSW5kaXZpZHVhbGx5LCBTRUxFQ1RPUl9FTEVNRU5UX05BTUUsIFNFTEVDVE9SX0NMQVNTLCBhbmQgU0VMRUNUT1JfSUQgY2FuIGFsbCBiZSBiZWdpbm5pbmcgdHlwZXMuCi0JCQkJLy8gQnV0LCB3ZSBzaG91bGQgbm90IGluc2VydCBhIHNwYWNlIGluIGJldHdlZW4gd2hlbiBTRUxFQ1RPUl9FTEVNRU5UX05BTUUgaXMgZm9sbG93ZWQgYnkgU0VMRUNUT1JfQ0xBU1MsIG9yIHdoZW4KLQkJCQkvLyBTRUxFQ1RPUl9FTEVNRU5UX05BTUUgaXMgZm9sbG93ZWQgYnkgU0VMRUNUT1JfSUQuCi0JCQkJLy8gRm9yIGV4YW1wbGU6IEgxLnBhc3RvcmFsIGFuZCBIMSN6OTh5Ci0JCQkJLy8KLQkJCQkvLyBBbHNvLCBzcGFjZSBpcyBub3cgbm90IGluc2VydGVkIGluIGJldHdlZW4gd2hlbiBTRUxFQ1RPUl9FTEVNRU5UX05BTUUgaXMgZm9sbG93ZWQgYnkgU0VMRUNUT1JfUFNFVURPLCBvciB3aGVuCi0JCQkJLy8gU0VMRUNUT1JfQ0xBU1MgaXMgZm9sbG93ZWQgYnkgU0VMRUNUT1JfUFNFVURPLgotCQkJCS8vIEZvciBleGFtcGxlOiBQOmZpcnN0LWxldHRlciBhbmQgQS5leHRlcm5hbDp2aXNpdGVkCi0JCQl9Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JEIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG5leHQsIHNvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAocHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04gJiYgbmV4dFR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCWlmIChwcmV2LmdldEVuZE9mZnNldCgpICE9IG5leHQuZ2V0U3RhcnRPZmZzZXQoKSkgeyAvLyBub3QKLQkJCQkJCQkJCQkJCQkJCQkvLyBzZXF1ZW50aWFsCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgbmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgbmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkKLQkJCXJldHVybiBuOwotCQlyZXR1cm4gLTE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0ZvbnRGYWNlUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZWVjN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnByZWZlcmVuY2VzLkNTU1ByZWZlcmVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRm9udEZhY2VSdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVjbENvbnRhaW5lckZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgRk9OVF9GQUNFID0gIkBmb250LWZhY2UiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBGb250RmFjZVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlGb250RmFjZVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCVN0cmluZyBzdHIgPSBGT05UX0ZBQ0U7Ci0JCQlpZiAobWdyLmlzSWRlbnRVcHBlckNhc2UoKSkKLQkJCQlzdHIgPSBGT05UX0ZBQ0UudG9VcHBlckNhc2UoKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRm9udEZhY2VSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEZvbnRGYWNlUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMGM5ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotCi0vKioKLSAqIAotICovCi1jbGFzcyBGb3JtYXRSZWdpb24gaW1wbGVtZW50cyBJUmVnaW9uIHsKLQotCXByaXZhdGUgaW50IGZPZmZzZXQsIGZMZW5ndGg7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlGb3JtYXRSZWdpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCQlzZXQob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgcmVnaW9uCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhpcy5mT2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoaW50IG5ld0xlbmd0aCkgewotCQlmTGVuZ3RoID0gbmV3TGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0T2Zmc2V0KGludCBuZXdPZmZzZXQpIHsKLQkJZk9mZnNldCA9IG5ld09mZnNldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRnVuY3Rpb25Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Z1bmN0aW9uRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzExZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRnVuY3Rpb25Gb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucHJlZmVyZW5jZXMuQ1NTUHJlZmVyZW5jZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZ1bmN0aW9uRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JRnVuY3Rpb25Gb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUjsKLQkJCQlpZiAocHJldiA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQkJCXBpY2t1cFR5cGUgPSBudWxsOwotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSBiZXR3ZWVuCi0JCQkJCQkJCQkJCQkJLy8gcGFyYW1ldGVycwotCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDIsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3Qob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlIG5vZGUsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDIsIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlzb3VyY2UuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJQ1NTUHJlZmVyZW5jZUhlbHBlciBtZ3IgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVN0cmluZyBmdW5jID0gZ2V0RnVuYygpOwotCQkJaWYgKG1nci5pc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpKQotCQkJCWZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRGdW5jKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvSW1wb3J0UnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvSW1wb3J0UnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmMxNDE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0ltcG9ydFJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wcmVmZXJlbmNlcy5DU1NQcmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRSdWxlRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIElNUE9SVCA9ICJAaW1wb3J0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgSW1wb3J0UnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUltcG9ydFJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTSW1wb3J0UnVsZS5IUkVGLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJaWYgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHJldik7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQlpdC5uZXh0KCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJaXQubmV4dCgpOwotCQkJCWl0Lm5leHQoKTsKLQkJCQlpZiAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgLSAxKTsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSAtIDEpOwotCQkJCX0KLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0ICYmIGF0dHIuZ2V0VmFsdWUoKSAhPSBudWxsICYmIGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGF0dHIuZ2V0VmFsdWUoKSwgYnVmKTsKLQkJCWJ1Zi5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQkvLyBmb3IgbWVkaWEtdHlwZQotCQlJQ1NTTm9kZSBwcmV2ID0gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgOiBub2RlLmdldExhc3RDaGlsZCgpOwotCQlpbnQgc3RhcnQgPSAocHJldiAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgcHJldikuZ2V0RW5kT2Zmc2V0KCkgOiAwOwotCQlpbnQgZW5kID0gKGNoaWxkICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA6IDA7Ci0JCWlmIChzdGFydCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SOwotCQkJCWlmIChwcmV2ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBleHRyYWN0IHNvdXJjZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBjb21tZW50cwotCQkJfQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJldiAhPSBudWxsICYmIGNoaWxkICE9IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDogPz8/PwotCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UgaWYgKGNoaWxkICE9IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDogYmV0d2VlbiAndXJsKCknIGFuZAotCQkJCQkJCQkJLy8gbWVkaWEgdHlwZXMKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QgYmUKLQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IHJlZ2lvbnNbaV0uZ2V0VGV4dCgpOwotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUKQotCQkJCQlzdHIgPSBkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCQllbHNlCi0JCQkJCXN0ciA9IGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlTdHJpbmcgc3RyID0gSU1QT1JUOwotCQkJaWYgKG1nci5pc0lkZW50VXBwZXJDYXNlKCkpCi0JCQkJc3RyID0gSU1QT1JULnRvVXBwZXJDYXNlKCk7Ci0JCQlTdHJpbmcgcXVvdGUgPSBtZ3IuZ2V0UXVvdGVTdHJpbmcobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlzdHIgPSAidXJsKCI7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKG1nci5pc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpKQotCQkJCXN0ciA9IHN0ci50b1VwcGVyQ2FzZSgpOwotCQkJU3RyaW5nIGhyZWYgPSAoKElDU1NJbXBvcnRSdWxlKSBub2RlKS5nZXRIcmVmKCk7Ci0JCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoaHJlZiwgcXVvdGUpOwotCQkJc3RyID0gc3RyICsgcXVvdGUgKyBocmVmICsgcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3RyLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQl9Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZCBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdCkgJiYgKChvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QpIGNoaWxkKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHN0ciA9IHJlZ2lvbnNbaV0uZ2V0VGV4dCgpOwotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQpCi0JCQkJc3RyID0gZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSk7Ci0JCQllbHNlCi0JCQkJc3RyID0gZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpOwotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghSUNTU0ltcG9ydFJ1bGUuSFJFRi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU0ltcG9ydFJ1bGUuSFJFRik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQllbHNlIHsKLQkJCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJCXJldHVybiAtMTsKLQotCQkJRm9ybWF0UmVnaW9uIGZvcm1hdFJlZ2lvbiA9IG51bGw7Ci0JCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGNoaWxkICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCWZvcm1hdFJlZ2lvbiA9IG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSAtIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJZWxzZQotCQkJCWZvcm1hdFJlZ2lvbiA9IG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBpTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbnNbXSA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgZm9ybWF0UmVnaW9uLCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkpOwotCi0JCQlib29sZWFuIGF0cnVsZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQpIHsKLQkJCQkJYXRydWxlID0gdHJ1ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCFhdHJ1bGUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCXJldHVybiAoY2hpbGQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA6IGlOb2RlLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSW1wb3J0UnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBJbXBvcnRSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFMaXN0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYUxpc3RGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4ZWY2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYUxpc3RGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnByZWZlcmVuY2VzLkNTU1ByZWZlcmVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFMaXN0Rm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBNZWRpYUxpc3RGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlNZWRpYUxpc3RGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJYm9vbGVhbiBmaXJzdCA9IGZhbHNlLCBsYXN0ID0gZmFsc2U7Ci0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0LnByZXYoKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SIHx8IHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRleHQuc3RhcnQgPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJZmlyc3QgPSB0cnVlOwotCi0JCQkJfQotCQkJCWl0LnJlc2V0KGZsYXROb2RlLCByZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgbmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiB8fCBuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPCBjb250ZXh0LmVuZCkgewotCQkJCQljb250ZXh0LmVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWxhc3QgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWxhc3QgPSB0cnVlOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgcHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChjb250ZXh0LnN0YXJ0IDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0ICYmIGF0dHIuZ2V0VmFsdWUoKSAhPSBudWxsICYmIGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICghZmlyc3QpCi0JCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlpZiAoIWxhc3QpIHsKLQkJCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFmaXJzdCAmJiAhbGFzdCkgewotCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJQ1NTUHJlZmVyZW5jZUhlbHBlciBtZ3IgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlNZWRpYUxpc3QgbGlzdCA9IChNZWRpYUxpc3QpIG5vZGU7Ci0JCQlpbnQgbiA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCVN0cmluZyBtZWRpdW0gPSBsaXN0Lml0ZW0oaSk7Ci0JCQkJaWYgKG1nci5pc0lkZW50VXBwZXJDYXNlKCkpCi0JCQkJCW1lZGl1bSA9IG1lZGl1bS50b1VwcGVyQ2FzZSgpOwotCQkJCWVsc2UKLQkJCQkJbWVkaXVtID0gbWVkaXVtLnRvTG93ZXJDYXNlKCk7Ci0KLQkJCQlpZiAoaSAhPSAwKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBtZWRpdW0sIHNvdXJjZSk7Ci0JCQkJfQotCQkJCXNvdXJjZS5hcHBlbmQobWVkaXVtKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJZWxzZSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCS8qCi0JCQkgKiBJVGV4dFJlZ2lvbiByZWdpb25zW10gPQotCQkJICogZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLAotCQkJICogbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCBpTm9kZS5nZXRFbmRPZmZzZXQoKSAtCi0JCQkgKiBpTm9kZS5nZXRTdGFydE9mZnNldCgpICsgMSkpOyBmb3IoaW50IGk9cmVnaW9ucy5sZW5ndGggLSAxOyBpID49Ci0JCQkgKiAwOyBpLS0pIHsgaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09Ci0JCQkgKiBDU1NSZWdpb25Db250ZXh0cy5JTVBPUlRBTlRfU1lNKSByZXR1cm4KLQkJCSAqIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsgfQotCQkJICovCi0JCQlyZXR1cm4gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBNZWRpYUxpc3RGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgTWVkaWFMaXN0Rm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYVJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2YWZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYVJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucHJlZmVyZW5jZXMuQ1NTUHJlZmVyZW5jZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUnVsZUZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBNRURJQSA9ICJAbWVkaWEiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBNZWRpYVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlNZWRpYVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZwotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBudWxsOwotCQkJCWlmICgocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgfHwgKHByZXYgPT0gbnVsbCAmJiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkpIHsKLQkJCQkJcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0U7Ci0JCQkJfQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsgLy8gYmV0d2VlbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gIkBtZWRpYSIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbWVkaWF0eXBlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJCQl9Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsIHx8IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpKSB7IC8vIGJldHdlZW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbWVkaWF0eXBlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmlyc3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc3R5bGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gcnVsZQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCQkJfQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gYmV0d2VlbiBzdHlsZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb21tZW50cwotCQkJCX0KLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgcHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBhZnRlcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxhc3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzdHlsZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJ1bGUKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLmdldFBhcmVudE5vZGUoKSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBiZXR3ZWVuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gIkBtZWRpYSIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBtZWRpYXR5cGUKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsgLy8gYmV0d2VlbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1lZGlhdHlwZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZpcnN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc3R5bGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBydWxlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgInsiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIG51bGwsIHNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gbm9ybWFsIGNhc2UKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7IC8vIGJldHdlZW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gIkBtZWRpYSIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYW5kCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1lZGlhdHlwZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBjb21tZW50cwotCQkJfQotCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCB8fCBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkgeyAvLyBiZXR3ZWVuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbWVkaWF0eXBlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYW5kCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmlyc3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzdHlsZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJ1bGUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJCX0KLQkJCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGJldHdlZW4gc3R5bGVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmUKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gc291cmNlIGZvcm1hdHRpbmcKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWlmIChub2RlLmdldExhc3RDaGlsZCgpID09IG51bGwgfHwgbm9kZS5nZXRMYXN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlib29sZWFuIGJJbkN1cmx5QnJhY2UgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFiSW5DdXJseUJyYWNlKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJZWxzZQotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQkJCWJJbkN1cmx5QnJhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIG5vZGUuZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJQ1NTUHJlZmVyZW5jZUhlbHBlciBtZ3IgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJU3RyaW5nIHN0ciA9IE1FRElBOwotCQkJaWYgKG1nci5pc0lkZW50VXBwZXJDYXNlKCkpCi0JCQkJc3RyID0gTUVESUEudG9VcHBlckNhc2UoKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QpICYmICgob3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0KSBjaGlsZCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpCi0JCQkJcmV0dXJuIG4gLSAxOwotCQkJZWxzZQotCQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBNZWRpYVJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgTWVkaWFSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0TmV4dFNpYmxpbmcoKSA9PSBub2RlLmdldExhc3RDaGlsZCgpKSB7IC8vIGluc2VydGVkCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmlyc3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzdHlsZQotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJ1bGUKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gMDsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKG5ub2RlLmdldEVuZE9mZnNldCgpIDw9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWludCBwb3MgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pIC0gaW5zZXJ0UG9zOwotCQkJcmV0dXJuIChwb3MgPj0gMCkgPyBwb3MgOiAwOwotCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihub2RlLCBpbnNlcnRQb3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0TmV4dFNpYmxpbmcoKSA9PSBub2RlLmdldExhc3RDaGlsZCgpKSB7IC8vIGluc2VydGVkCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmlyc3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzdHlsZQotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJ1bGUKLQkJCWludCBwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChwb3MgPD0gMCkKLQkJCQlwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkgKyA2IC8qCi0JCQkJCQkJCQkJCQkJCQkJCSAqIGxlbmd0aAotCQkJCQkJCQkJCQkJCQkJCQkgKiBvZgotCQkJCQkJCQkJCQkJCQkJCQkgKiAiQG1lZGlhIgotCQkJCQkJCQkJCQkJCQkJCQkgKi87Ci0JCQlyZXR1cm4gaW5zZXJ0UG9zIC0gcG9zOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKG5vZGUsIGluc2VydFBvcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1BhZ2VSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QYWdlUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDE5OWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1BhZ2VSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnByZWZlcmVuY2VzLkNTU1ByZWZlcmVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlUnVsZUZvcm1hdHRlciBleHRlbmRzIERlY2xDb250YWluZXJGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFBBR0UgPSAiQHBhZ2UiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBQYWdlUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVBhZ2VSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWlmICghSUNTU1BhZ2VSdWxlLlNFTEVDVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQubmV4dCgpOwotCQkJCWlmIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmV4dCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBwb3MgPSBnZXRBdHRySW5zZXJ0UG9zKG5vZGUsIGF0dHIuZ2V0TmFtZSgpKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gcG9zOwotCQkJCWNvbnRleHQuZW5kID0gcG9zOwotCQkJCS8qCi0JCQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9Ci0JCQkJICogbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXROb2RlQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKW5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCSAqIElUZXh0UmVnaW9uIHJlZ2lvbiA9Ci0JCQkJICogZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKW5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCSAqIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLlMpIHsKLQkJCQkgKiBjb250ZXh0LnN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7IGNvbnRleHQuZW5kID0KLQkJCQkgKiByZWdpb24uZ2V0RW5kT2Zmc2V0KCk7IH0gZWxzZSB7IGNvbnRleHQuc3RhcnQgPQotCQkJCSAqIGZsYXROb2RlLmdldEVuZE9mZnNldCgpICsgMTsgY29udGV4dC5lbmQgPQotCQkJCSAqIGZsYXROb2RlLmdldEVuZE9mZnNldCgpOyB9Ci0JCQkJICovfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCkgewotCQkJU3RyaW5nIHZhbCA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnVmLmFwcGVuZCh2YWwpOwotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCUNTU1ByZWZlcmVuY2VIZWxwZXIgbWdyID0gQ1NTUHJlZmVyZW5jZUhlbHBlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlTdHJpbmcgc3RyID0gUEFHRTsKLQkJCWlmIChtZ3IuaXNJZGVudFVwcGVyQ2FzZSgpKQotCQkJCXN0ciA9IFBBR0UudG9VcHBlckNhc2UoKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCXN0ciA9ICgoSUNTU1BhZ2VSdWxlKSBub2RlKS5nZXRTZWxlY3RvclRleHQoKTsKLQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3RyLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCX0KLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCAoaSA9PSAwKSA/IG91dHNpZGVbMF0gOiByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV0sIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghSUNTU1BhZ2VSdWxlLlNFTEVDVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJZWxzZSBpZiAoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJcmVnaW9uID0gaXQubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWlmIChpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKSA+PSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFBhZ2VSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFBhZ2VSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1ByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTE1NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wcmVmZXJlbmNlcy5DU1NQcmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCUNTU1ByZWZlcmVuY2VIZWxwZXIgbWdyID0gQ1NTUHJlZmVyZW5jZUhlbHBlci5nZXRJbnN0YW5jZSgpOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWJvb2xlYW4gYXBwZW5kUXVvdGUgPSByZWdpb25zLmxlbmd0aCA+IDEgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSAmJiBpc0NsZWFudXAoKSAmJiBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNRdW90ZVZhbHVlcygpICYmICgoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlLmdldFBhcmVudE5vZGUoKSkuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfRk9OVCkgfHwgKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZS5nZXRQYXJlbnROb2RlKCkpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSB8fCAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlLmdldFBhcmVudE5vZGUoKSkuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKSk7Ci0JCQlTdHJpbmcgcXVvdGUgPSBtZ3IuZ2V0UXVvdGVTdHJpbmcobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlib29sZWFuIHNraXBTcGFjZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCAmJiAhc2tpcFNwYWNlKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzdHJCdWYpOwotCQkJCXNraXBTcGFjZSA9IGZhbHNlOwotCQkJCXN0ckJ1Zi5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlza2lwU3BhY2UgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoYXBwZW5kUXVvdGUpIHsKLQkJCQlzb3VyY2UuYXBwZW5kKHF1b3RlKTsKLQkJCQlTdHJpbmcgc3RyID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQkJc3RyID0gc3RyLnJlcGxhY2UoJ1wnJywgJyAnKTsKLQkJCQlzdHIgPSBzdHIucmVwbGFjZSgnXCInLCAnICcpOwotCQkJCXN0ciA9IHN0ci50cmltKCk7Ci0JCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJCXNvdXJjZS5hcHBlbmQocXVvdGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc291cmNlLmFwcGVuZChzdHJCdWYpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JCQlzaG9ydCB0eXBlID0gdmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCQkJU3RyaW5nIHF1b3RlID0gbWdyLmdldFF1b3RlU3RyaW5nKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkpOwotCi0JCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU0gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRElNRU5TSU9OIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJCWlmICh2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpID09ICgoaW50KSB2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpKSkgewotCQkJCQkJc3RyID0gSW50ZWdlci50b1N0cmluZygoaW50KSB2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXN0ciA9IEZsb2F0LnRvU3RyaW5nKHZhbHVlLmdldEZsb2F0VmFsdWUodHlwZSkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOSEVSSVRfUFJJTUlUSVZFIDoKLQkJCQkJc3RyID0gdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAobWdyLmlzUHJvcFZhbHVlVXBwZXJDYXNlKCkpCi0JCQkJCQkJc3RyID0gc3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJc3RyLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkFOR0UgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPTU1BIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU0xBU0ggOgotCQkJCQlzdHIgPSB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpOwotCQkJfQotCi0JCQlTdHJpbmcgcHJlU3RyID0gbnVsbCwgcG9zdFN0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19BVFRSIDoKLQkJCQkJcHJlU3RyID0gImF0dHIoIjsvLyROT04tTkxTLTEkCi0JCQkJCXBvc3RTdHIgPSAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJCXBvc3RTdHIgPSAiY20iOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVI6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHIDoKLQkJCQkJcG9zdFN0ciA9ICJkZWciOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQkJcG9zdFN0ciA9ICJlbSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFMgOgotCQkJCQlwb3N0U3RyID0gImV4IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQgOgotCQkJCQlwb3N0U3RyID0gImdyYWQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCQlwb3N0U3RyID0gIkh6IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOIDoKLQkJCQkJcG9zdFN0ciA9ICJpbiI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19LSFogOgotCQkJCQlwb3N0U3RyID0gImtIeiI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJCXBvc3RTdHIgPSAibW0iOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTVMgOgotCQkJCQlwb3N0U3RyID0gIm1zIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BDIDoKLQkJCQkJcG9zdFN0ciA9ICJwYyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQkJcG9zdFN0ciA9ICIlIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUIDoKLQkJCQkJcG9zdFN0ciA9ICJwdCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWCA6Ci0JCQkJCXBvc3RTdHIgPSAicHgiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQkJcG9zdFN0ciA9ICJyYWQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1Q6Ci0JCQkJLy8gY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1MgOgotCQkJCQlwb3N0U3RyID0gInMiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HIDoKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHN0ciwgcXVvdGUpOwotCQkJCQlwcmVTdHIgPSBxdW90ZTsKLQkJCQkJcG9zdFN0ciA9IHF1b3RlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkgOgotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc3RyLCBxdW90ZSk7Ci0JCQkJCXByZVN0ciA9ICJ1cmwoIiArIHF1b3RlOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9IHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gdGhlIGZvbGxvd2luZ3MgYXJlIG9yaWdpbmFsIHByaW1pdGl2ZSB2YWx1ZXMKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVU5LTk9XTiA6Ci0JCQkJLy8gdXNlIHN0cgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09NTUEgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5IRVJJVF9QUklNSVRJVkUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJBTkdFIDoKLQkJCQkJcHJlU3RyID0gIlUrIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQgOgotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc3RyLCBxdW90ZSk7Ci0JCQkJCXByZVN0ciA9ICJmb3JtYXQoIiArIHF1b3RlOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9IHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0xPQ0FMIDoKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHN0ciwgcXVvdGUpOwotCQkJCQlwcmVTdHIgPSAibG9jYWwoIiArIHF1b3RlOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9IHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobWdyLmlzUHJvcFZhbHVlVXBwZXJDYXNlKCkpIHsKLQkJCQlpZiAocHJlU3RyICE9IG51bGwpCi0JCQkJCXByZVN0ciA9IHByZVN0ci50b1VwcGVyQ2FzZSgpOwotCQkJCWlmIChwb3N0U3RyICE9IG51bGwpCi0JCQkJCXBvc3RTdHIgPSBwb3N0U3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQlpZiAocHJlU3RyICE9IG51bGwpCi0JCQkJc291cmNlLmFwcGVuZChwcmVTdHIpOwotCQkJaWYgKHN0ciAhPSBudWxsKQotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCWlmIChwb3N0U3RyICE9IG51bGwpCi0JCQkJc291cmNlLmFwcGVuZChwb3N0U3RyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JHQkZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUkdCRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTA5ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUkdCRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUkdCRm9ybWF0dGVyIGV4dGVuZHMgRnVuY3Rpb25Gb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUkdCRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUkdCRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVuYygpIHsKLQkJcmV0dXJuICJyZ2IoIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUkdCRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFJHQkZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JlY3RGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JlY3RGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlYzgzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SZWN0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVjdEZvcm1hdHRlciBleHRlbmRzIEZ1bmN0aW9uRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlY3RGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlSZWN0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVuYygpIHsKLQkJcmV0dXJuICJyZWN0KCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFJlY3RGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgUmVjdEZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1ZjBiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xJdGVtRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wcmVmZXJlbmNlcy5DU1NQcmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVEZWNsSXRlbUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVEZWNsSXRlbUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZEFmdGVyQ29sb25TcGFjZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU1ByZWZlcmVuY2VIZWxwZXIgbWdyID0gQ1NTUHJlZmVyZW5jZUhlbHBlci5nZXRJbnN0YW5jZSgpOwotCQlpbnQgbiA9IG1nci5nZXRTcGFjZXNQb3N0RGVsaW1pdGVyKCk7Ci0KLQkJaWYgKG1nci5nZXRNYXhMaW5lV2lkdGgoKSA+IDAgJiYgKCFtZ3IuaXNQcm9oaWJpdFdyYXBPbkF0dHIoKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJaW50IGFwcGVuZCA9IGdldEZpcnN0Q2hpbGRSZWdpb25MZW5ndGgobm9kZSk7Ci0JCQlpZiAobGVuZ3RoICsgbiArIGFwcGVuZCA+IG1nci5nZXRNYXhMaW5lV2lkdGgoKSkgewotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCXNvdXJjZS5hcHBlbmQobWdyLmdldEluZGVudFN0cmluZygpKTsKLQkJCQluID0gMDsgLy8gbm8gc3BhY2UgaXMgbmVjZXNzYXJ5Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gZGVsaW1pdGVyIGNhc2UKLQkJd2hpbGUgKG4tLSA+IDApCi0JCQlzb3VyY2UuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IGdldEZpcnN0Q2hpbGRSZWdpb25MZW5ndGgoSUNTU05vZGUgbm9kZSkgewotCQlJQ1NTTm9kZSBmaXJzdENoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChmaXJzdENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gMTsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBmaXJzdENoaWxkKS5nZXRTdGFydE9mZnNldCgpOwotCQlSZWdpb25JdGVyYXRvciBpdHIgPSBuZXcgUmVnaW9uSXRlcmF0b3Iobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgc3RhcnQpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnID0gaXRyLm5leHQoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCAmJiByZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCXJldHVybiByZWcuZ2V0VGV4dExlbmd0aCgpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWlmICghSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5ULmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJaWYgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHJldik7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQgJiYgYXR0ci5nZXRWYWx1ZSgpICE9IG51bGwgJiYgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgYXR0ci5nZXRWYWx1ZSgpLCBidWYpOwotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgbnVsbCk7Ci0JCQl9Ci0JCQkvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgewotCQkJaWYgKCgoSUNTU1ByaW1pdGl2ZVZhbHVlKSBjaGlsZCkuZ2V0UHJpbWl0aXZlVHlwZSgpID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09NTUEpCi0JCQkJdG9BcHBlbmQgPSAiLCI7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoKChJQ1NTUHJpbWl0aXZlVmFsdWUpIGNoaWxkKS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19TTEFTSCkKLQkJCQl0b0FwcGVuZCA9ICIvIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgdG9BcHBlbmQgIT0gbnVsbCAmJiAhdG9BcHBlbmQuZXF1YWxzKCIsIikgJiYgIXRvQXBwZW5kLmVxdWFscygiLyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlpZiAodG9BcHBlbmQgIT0gIiwiICYmIHRvQXBwZW5kICE9ICIvIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCS8vIGFwcGVuZCAiIWltcG9ydGFudCIKLQkJCVN0cmluZyBwcmlvcml0eSA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUpLmdldFByaW9yaXR5KCk7Ci0JCQlpZiAocHJpb3JpdHkgIT0gbnVsbCAmJiBwcmlvcml0eS5sZW5ndGgoKSA+IDApIHsKLQkJCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQlpZiAoIW1nci5pc1ByZXNlcnZlQ2FzZSgpKSB7Ci0JCQkJCWlmIChtZ3IuaXNJZGVudFVwcGVyQ2FzZSgpKQotCQkJCQkJcHJpb3JpdHkgPSBwcmlvcml0eS50b1VwcGVyQ2FzZSgpOwotCQkJCQllbHNlCi0JCQkJCQlwcmlvcml0eSA9IHByaW9yaXR5LnRvTG93ZXJDYXNlKCk7Ci0JCQkJfQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHByaW9yaXR5LCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQocHJpb3JpdHkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BOYW1lUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdG9lIHNvdXJjZQotCQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZTsKLQkJCWlmIChtZ3IuaXNQcm9wTmFtZVVwcGVyQ2FzZSgpKQotCQkJCXNvdXJjZS5hcHBlbmQoaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKS50b1VwcGVyQ2FzZSgpKTsKLQkJCWVsc2UKLQkJCQlzb3VyY2UuYXBwZW5kKGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCkpOwotCi0JCQlpbnQgayA9IG1nci5nZXRTcGFjZXNQcmVEZWxpbWl0ZXIoKTsKLQkJCWlmIChtZ3IuZ2V0TWF4TGluZVdpZHRoKCkgPiAwICYmICghbWdyLmlzUHJvaGliaXRXcmFwT25BdHRyKCkgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQkJaW50IGFwcGVuZCA9IDE7Ci0JCQkJaWYgKGxlbmd0aCArIGsgKyBhcHBlbmQgPiBtZ3IuZ2V0TWF4TGluZVdpZHRoKCkpIHsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlzb3VyY2UuYXBwZW5kKG1nci5nZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJCWsgPSAwOyAvLyBubyBzcGFjZSBpcyBuZWNlc3NhcnkKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBubyBkZWxpbWl0ZXIgY2FzZQotCQkJd2hpbGUgKGstLSA+IDApCi0JCQkJc291cmNlLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZS5hcHBlbmQoIjoiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKCFpc0NsZWFudXAoKSB8fCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkgewotCQkJYXBwZW5kQWZ0ZXJDb2xvblNwYWNlKG5vZGUsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcE5hbWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSAmJiAoIWlzQ2xlYW51cCgpIHx8IGdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKSkgewotCQkJCWFwcGVuZEFmdGVyQ29sb25TcGFjZShub2RlLCBzb3VyY2UpOwotCQkJfQotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdFZhbHVlKElDU1NOb2RlIG5vZGUpIHsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgc291cmNlKTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCk7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQllbHNlIHsKLQkJCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJCXJldHVybiAtMTsKLQotCQkJQ29tcG91bmRSZWdpb24gcmVnaW9uc1tdID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBuZXcgRm9ybWF0UmVnaW9uKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGlOb2RlLmdldEVuZE9mZnNldCgpIC0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSksIGdldENsZWFudXBTdHJhdGVneShub2RlKSk7Ci0JCQlmb3IgKGludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UKQotCQkJCQlyZXR1cm4gcmVnaW9uc1tpXS5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQkJcmV0dXJuIGlOb2RlLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPCAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCAmJiBmbGF0Tm9kZS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJbiAtPSBmbGF0Tm9kZS5nZXRMZW5ndGgoKTsKLQkJfQotCQlpZiAobiA+IDApIHsKLQkJCVN0cmluZyBpbXBvcnRhbnQgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcmlvcml0eSgpOwotCQkJaWYgKGltcG9ydGFudCAhPSBudWxsICYmIGltcG9ydGFudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBmaW5kIGJlZm9yZSAiIWltcG9ydGFudCIgcG9zaXRpb24KLQkJCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkpOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCQlpZiAoaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gZmxhdE5vZGUpCi0JCQkJCQlicmVhazsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCkKLQkJCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCS8vIHNraXAgbGFzdCBzcGFjZQotCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCW4gLT0gcmVnaW9uLmdldExlbmd0aCgpIC0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCX0KLQotCQkJcmV0dXJuIG47Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVEZWNsSXRlbUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3OGI0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnByZWZlcmVuY2VzLkNTU1ByZWZlcmVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCi0JCS8vIGNoZWNrIG5vIGNoaWxkCi0JCWlmIChjaGlsZCA9PSBudWxsICYmIHByZXYgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDU1NQcmVmZXJlbmNlSGVscGVyIG1nciA9IENTU1ByZWZlcmVuY2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkvLyBnZXQgbWVhbmluZyByZWdpb25zCi0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBudWxsOwotCQkJaWYgKGV4Y2VwdEZvciA9PSBudWxsKQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWVsc2UgewotCQkJCVN0cmluZyBwaWNrdXBUeXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsKLQkJCQlpZiAocHJldiA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQkJCXBpY2t1cFR5cGUgPSBudWxsOwotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJCX0KLQkJfQotCQllbHNlIGlmIChwcmV2ICE9IG51bGwgJiYgY2hpbGQgIT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOgotCQkJCQkJCQkJCQkJCS8vIGJldHdlZW4gdHdvCi0JCQkJCQkJCQkJCQkJLy8gZGVjbGFyYXRpb25zCi0JCQlzb3VyY2UuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKHByZXYgPT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOiBiZWZvcmUgdGhlIGZpcnN0Ci0JCQkJCQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuUmVnaW9uSXRlcmF0b3IgaXQgPSBudWxsOwotCQkJaWYgKGVuZCA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJaXQgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBlbmQgLSAxKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQlpZiAocG9zID49IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvcyAtIDEpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpdCAhPSBudWxsKSB7Ci0JCQkJaW50IGxpbWl0ID0gKChJbmRleGVkUmVnaW9uKSAoKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpID8gbm9kZS5nZXRQYXJlbnROb2RlKCkgOiBub2RlKSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIGN1clJlZyA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKGN1clJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCBjdXJSZWcuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpCi0JCQkJCQlicmVhazsKLQkJCQkJaWYgKGN1clJlZy5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgY3VyUmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJc291cmNlLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChjdXJSZWcpIDw9IGxpbWl0KQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGNoaWxkID09IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDogYWZ0ZXIgdGhlIGxhc3QKLQkJCQkJCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQlvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5SZWdpb25JdGVyYXRvciBpdCA9IG51bGw7Ci0JCQlpZiAoc3RhcnQgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWl0ID0gbmV3IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLlJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCWlmIChwb3MgPj0gMCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCWl0ID0gbmV3IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLlJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXQgIT0gbnVsbCkgewotCQkJCWludCBsaW1pdCA9ICgoSW5kZXhlZFJlZ2lvbikgKChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSA/IG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZSkpLmdldEVuZE9mZnNldCgpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gY3VyUmVnID0gaXQubmV4dCgpOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IGN1clJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBjdXJSZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKGxpbWl0IDw9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChjdXJSZWcpKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA8PSAwKSB7Ci0JCQkJLy8gZ2V0IG5leHQgcmVnaW9uCi0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCUNvbXBvdW5kUmVnaW9uIHRvQXBwZW5kUmVnaW9uID0gbnVsbDsKLQkJCQlpZiAocG9zID49IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvcyk7Ci0JCQkJCXRvQXBwZW5kUmVnaW9uID0gbmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3MpKTsKLQkJCQl9Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIHRvQXBwZW5kUmVnaW9uLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKChwcmV2ICE9IG51bGwgfHwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA8PSAwKSkgewotCQkJaWYgKG1nci5pc09uZVByb3BlcnR5UGVyTGluZSgpICYmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKSAhPSBub2RlIHx8ICFtZ3IuaXNQcm9oaWJpdFdyYXBPbkF0dHIoKSkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCWVsc2UgaWYgKHByZXYgIT0gbnVsbCB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKSAhPSBub2RlKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJQ1NTUHJlZmVyZW5jZUhlbHBlciBtZ3IgPSBDU1NQcmVmZXJlbmNlSGVscGVyLmdldEluc3RhbmNlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgJiYgbWdyLmlzT25lUHJvcGVydHlQZXJMaW5lKCkgJiYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG5vZGUgfHwgIW1nci5pc1Byb2hpYml0V3JhcE9uQXR0cigpKSkgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWludCBwb3MgPSBzdXBlci5nZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKHBvcyA8IDApIHsKLQkJCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBnZXRQYXJlbnRGb3JtYXR0ZXIobm9kZSk7Ci0JCQlyZXR1cm4gKGZvcm1hdHRlciAhPSBudWxsKSA/IGZvcm1hdHRlci5nZXRDaGlsZEluc2VydFBvcyhub2RlLmdldFBhcmVudE5vZGUoKSkgOiAtMTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDwgMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zKSkgewotCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwgJiYgbm5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkgewotCQkJCUNTU1NvdXJjZUdlbmVyYXRvciBwbnRGb3JtYXR0ZXIgPSBnZXRQYXJlbnRGb3JtYXR0ZXIobm9kZSk7Ci0JCQkJaWYgKHBudEZvcm1hdHRlciAhPSBudWxsKQotCQkJCQlyZXR1cm4gcG50Rm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihub2RlLmdldFBhcmVudE5vZGUoKSwgaW5zZXJ0UG9zKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIobm9kZSwgaW5zZXJ0UG9zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDw9IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcyAtIDEpKSB7Ci0JCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCAmJiBubm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKSB7Ci0JCQkJQ1NTU291cmNlR2VuZXJhdG9yIHBudEZvcm1hdHRlciA9IGdldFBhcmVudEZvcm1hdHRlcihub2RlKTsKLQkJCQlpZiAocG50Rm9ybWF0dGVyICE9IG51bGwpCi0JCQkJCXJldHVybiBwbnRGb3JtYXR0ZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShub2RlLmdldFBhcmVudE5vZGUoKSwgaW5zZXJ0UG9zKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKG5vZGUsIGluc2VydFBvcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTU1YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVSdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVjbENvbnRhaW5lckZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHlsZVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQubmV4dCgpOwotCQkJCWlmIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmV4dCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0KSB7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFNlbGVjdG9yUmVnaW9uKHJlZ2lvbnNbaV0sIChpICE9IDApID8gcmVnaW9uc1tpIC0gMV0gOiBudWxsLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJU3RyaW5nIHN0ciA9ICgoSUNTU1N0eWxlUnVsZSkgbm9kZSkuZ2V0U2VsZWN0b3JUZXh0KCk7Ci0JCQkvLyBhcHBlbmRTcGFjZUJlZm9yZShub2RlLHN0cixzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgInsiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZS5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIChpID09IDApID8gb3V0c2lkZVswXSA6IHJlZ2lvbnNbaSAtIDFdLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRTZWxlY3RvclJlZ2lvbihyZWdpb25zW2ldLCAoaSAhPSAwKSA/IHJlZ2lvbnNbaSAtIDFdIDogbnVsbCwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV0sIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQllbHNlCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBTdHlsZVJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVNoZWV0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVNoZWV0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5N2RmZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVTaGVldEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZVNoZWV0Rm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVTaGVldEZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0eWxlU2hlZXRGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChwcmV2ID09IG51bGwgJiYgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVI7Ci0JCQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCAocmVnaW9ucy5sZW5ndGggPiAwKSA/IHJlZ2lvbnNbMF0gOiBudWxsLCBzb3VyY2UpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBjb21tZW50cwotCQkJCQkJCQkJCQkJCQkJCQkJLy8gb3IKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNlbWlfY29sb24KLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikgewotCQkJCQkvLyBhcHBlbmQgZGVsaW0gYWZ0ZXIKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocHJldiAhPSBudWxsKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJldiAhPSBudWxsICYmIGNoaWxkICE9IG51bGwpIHsgLy8gc291cmNlIGdlbmVyYXRpb24gOgotCQkJCQkJCQkJCQkJCS8vIGJldHdlZW4gdHdvIHJ1bGVzCi0JCQlpZiAocHJldi5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSB8fCBwcmV2LmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSB8fCBwcmV2LmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuVU5LTk9XTlJVTEVfTk9ERSkKLQkJCQlzb3VyY2UuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJfQotCQllbHNlIGlmICgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKHByZXYgPT0gbnVsbCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZyA6IGJlZm9yZSB0aGUgZmlyc3QgcnVsZQotCQkJCUlDU1NOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbmV4dCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCQlwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5leHQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaWYgKHBvcyAhPSAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJQ29tcG91bmRSZWdpb25bXSBwcmV2UmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKDAsIHBvcyksIG51bGwsIG51bGwpOwotCQkJCQlpZiAocHJldlJlZ2lvbnMgIT0gbnVsbCAmJiBwcmV2UmVnaW9ucy5sZW5ndGggPiAwKQotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZCA9PSBudWxsKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nIDogYWZ0ZXIgdGhlIGxhc3QKLQkJCQkJCQkJCQkvLyBydWxlCi0JCQkJaWYgKHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUgfHwgcHJldi5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgfHwgcHJldi5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlVOS05PV05SVUxFX05PREUpCi0JCQkJCXNvdXJjZS5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCi0JCQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8PSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHN0YXJ0IDw9IDApIHsKLQkJCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCQlpZiAocG9zIDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChwcmV2ICE9IG51bGwgJiYgY2hpbGQgPT0gbnVsbCkgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbiA6Ci0JCQkJCQkJCQkJCQkJLy8gYWZ0ZXIgdGhlIGxhc3QgcnVsZQotCQkJaWYgKHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUgfHwgcHJldi5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgfHwgcHJldi5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlVOS05PV05SVUxFX05PREUpCi0JCQkJc291cmNlLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJCWlmICgocmVnaW9ucyAhPSBudWxsICYmIHJlZ2lvbnMubGVuZ3RoID4gMCAmJiByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJfQotCQllbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCUlDU1NOb2RlIGxhc3RDaGlsZCA9IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpZiAobGFzdENoaWxkICE9IG51bGwgJiYgKGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgfHwgbGFzdENoaWxkLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFIHx8IGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlVOS05PV05SVUxFX05PREUpKSB7Ci0JCQkJc291cmNlLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpICE9IG51bGwgJiYgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJcmV0dXJuOyAvLyBub3RoaW5nCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlIG5vZGUsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwIHx8IHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIChzb3VyY2UubGVuZ3RoKCkgPiAwIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpICE9IG51bGwgJiYgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCS8vIHNvdXJjZS5hcHBlbmQoIjwhLS0iKTsKLQkJCS8vIGFwcGVuZERlbGltQmVmb3JlKG5vZGUsbnVsbCwgc291cmNlKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm47IC8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pIHx8IHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkgewotCQkJCWlmIChzb3VyY2UubGVuZ3RoKCkgPiAwIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZyA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnKTsKLQkJCX0KLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZVNoZWV0Rm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlU2hlZXRGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Vbmtub3duUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvVW5rbm93blJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkY2FkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Vbmtub3duUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmtub3duUnVsZUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgVW5rbm93blJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlVbmtub3duUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCUNTU1Vua25vd25SdWxlIHJ1bGUgPSAoQ1NTVW5rbm93blJ1bGUpIG5vZGU7Ci0JCQlzb3VyY2UuYXBwZW5kKHJ1bGUuZ2V0Q3NzVGV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBVbmtub3duUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBVbmtub3duUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA3NTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NQ2F0ZWdvcnkgewotCi0JcHVibGljIENTU01NQ2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ0FURUdPUlk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhcHRpb24oKSB7Ci0JCXJldHVybiBmQ2FwdGlvbjsKLQl9Ci0KLQl2b2lkIHNldENhcHRpb24oU3RyaW5nIGNhcHRpb24pIHsKLQkJZkNhcHRpb24gPSBjYXB0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENhcHRpb24oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDYXB0aW9uKCk7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmQ2FwdGlvbiA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DaGFyc2V0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2hhcnNldFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMTFlZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DaGFyc2V0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1DaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1DaGFyc2V0UnVsZUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1DaGFyc2V0UnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTUNoYXJzZXRSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0NIQVJTRVRfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ29udGFpbmVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Db250YWluZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDNjNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Db250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUNvbnRhaW5lckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Db250YWluZXIgewotCi0KLQlwdWJsaWMgQ1NTTU1Db250YWluZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ09OVEFJTkVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9OVU1CRVIgfHwgdHlwZSA9PSBUWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBUWVBFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gVFlQRV9DT05UQUlORVIpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRGVzY3JpcHRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0MTA2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotCi1jbGFzcyBDU1NNTURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NRGVzY3JpcHRvciB7Ci0KLQotCXB1YmxpYyBDU1NNTURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfREVTQ1JJUFRPUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfTlVNQkVSIHx8IHR5cGUgPT0gVFlQRV9LRVlXT1JEIHx8IHR5cGUgPT0gVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IFRZUEVfQ09OVEFJTkVSIHx8IHR5cGUgPT0gVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBUWVBFX1NFUEFSQVRPUik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NRGVzY3JpcHRvciNnZXRWYWx1ZXMoKQotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRWYWx1ZXMoKSB7Ci0JCVZhbHVlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBWYWx1ZUNvbGxlY3RvcigpOwotCQljb2xsZWN0b3IuYXBwbHkodGhpcyk7Ci0JCXJldHVybiBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZvbnRGYWNlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRm9udEZhY2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTFjMjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRm9udEZhY2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTUZvbnRGYWNlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1Gb250RmFjZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NRm9udEZhY2VSdWxlIHsKLQotCi0JcHVibGljIENTU01NRm9udEZhY2VSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0ZPTlRfRkFDRV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXRUeXBlKCkgPT0gVFlQRV9ERVNDUklQVE9SKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1GdW5jdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRnVuY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZTAyOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1GdW5jdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1GdW5jdGlvbkltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1GdW5jdGlvbiB7Ci0KLQlwdWJsaWMgQ1NTTU1GdW5jdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9GVU5DVElPTjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjcG9zdFNldEF0dHJpYnV0ZSgpCi0JICovCi0JLy8gdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQkvLyBzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JLy8gaWYgKG5hbWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vCi0JLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9BVFRSKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfQ09VTlRFUik7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX1JHQik7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX1JFQ1QpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9VUkkpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9GT1JNQVQpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9MT0NBTCk7Ci0JLy8KLQkvLyBpZiAoISBsaXN0LmNvbnRhaW5zKG5hbWUudG9Mb3dlckNhc2UoKSkpIHsKLQkvLyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsKLQkvLyB9Ci0JLy8gfQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRGdW5jdGlvblN0cmluZygpOwotCX0KLQotCXZvaWQgc2V0RnVuY3Rpb25TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldEZ1bmN0aW9uU3RyaW5nKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1JbXBvcnRSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1JbXBvcnRSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQwMTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NSW1wb3J0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1JbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUltcG9ydFJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NSW1wb3J0UnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTUltcG9ydFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfSU1QT1JUX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1LZXl3b3JkSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1LZXl3b3JkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODJiNjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NS2V5d29yZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1LZXl3b3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUtleXdvcmRJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NS2V5d29yZCB7Ci0KLQlwdWJsaWMgQ1NTTU1LZXl3b3JkSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0tFWVdPUkQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1LZXl3b3JkI2dldEtleXdvcmRTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5d29yZFN0cmluZygpIHsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0S2V5d29yZFN0cmluZygpOwotCX0KLQotCXZvaWQgc2V0S2V5d29yZFN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJZlZhbHVlID0gdmFsdWU7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRLZXl3b3JkU3RyaW5nKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1NZWRpYVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU1lZGlhUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2MGNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU1lZGlhUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1NZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NTWVkaWFSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU1lZGlhUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTU1lZGlhUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9NRURJQV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmM3M2E2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLWFic3RyYWN0IGNsYXNzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU5vZGUgewotCi0JcHVibGljIENTU01NTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFN0cmluZykgZkF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZE5vZGVzKCkgewotCQlpZiAoZkNoaWxkTm9kZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGZDaGlsZE5vZGVzKS5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldERlc2NlbmRhbnRzKCkgewotCQlMaXN0IGRlc2NlbmRhbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpQ2hpbGQgPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpQ2hpbGQuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgY2hpbGQgPSAoQ1NTTU1Ob2RlKSBpQ2hpbGQubmV4dCgpOwotCQkJSXRlcmF0b3IgaURlc2NlbmRhbnQgPSBjaGlsZC5nZXREZXNjZW5kYW50cygpOwotCQkJaWYgKGlEZXNjZW5kYW50Lmhhc05leHQoKSkgewotCQkJCXdoaWxlIChpRGVzY2VuZGFudC5oYXNOZXh0KCkpIHsKLQkJCQkJQ1NTTU1Ob2RlIGRlc2NlbmRhbnQgPSAoQ1NTTU1Ob2RlKSBpRGVzY2VuZGFudC5uZXh0KCk7Ci0JCQkJCWlmICghZGVzY2VuZGFudHMuY29udGFpbnMoZGVzY2VuZGFudCkpIHsKLQkJCQkJCWRlc2NlbmRhbnRzLmFkZChkZXNjZW5kYW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZGVzY2VuZGFudHMuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJCWRlc2NlbmRhbnRzLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGRlc2NlbmRhbnRzKS5pdGVyYXRvcigpOwotCX0KLQotCXZvaWQgYXBwZW5kQ2hpbGQoQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZDaGlsZE5vZGVzID09IG51bGwpIHsKLQkJCWZDaGlsZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWlmICghZkNoaWxkTm9kZXMuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQlmQ2hpbGROb2Rlcy5hZGQoY2hpbGQpOwotCQkJKChDU1NNTU5vZGVJbXBsKSBjaGlsZCkuZlJlZkNvdW50Kys7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZUNoaWxkKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlcmF0b3IgaSA9IGZDaGlsZE5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKGkubmV4dCgpID09IGNoaWxkKSB7Ci0JCQkJaS5yZW1vdmUoKTsKLQkJCQkoKENTU01NTm9kZUltcGwpIGNoaWxkKS5mUmVmQ291bnQtLTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZUFsbENoaWxkTm9kZXMoKSB7Ci0JCWlmIChmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlcmF0b3IgaSA9IGZDaGlsZE5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJKChDU1NNTU5vZGVJbXBsKSBpLm5leHQoKSkuZlJlZkNvdW50LS07Ci0JCX0KLQkJZkNoaWxkTm9kZXMuY2xlYXIoKTsKLQl9Ci0KLQlhYnN0cmFjdCBib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZShNYXAgYXR0cmlidXRlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZkF0dHJpYnV0ZXMucHV0QWxsKGF0dHJpYnV0ZXMpOwotCQlwb3N0U2V0QXR0cmlidXRlKCk7Ci0JfQotCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0Jdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCS8vIGRlZmF1bHQgOiBub3AKLQl9Ci0KLQlhYnN0cmFjdCBzaG9ydCBnZXRFcnJvcigpOwotCi0JaW50IGdldENoaWxkQ291bnQoKSB7Ci0JCXJldHVybiAoZkNoaWxkTm9kZXMgIT0gbnVsbCkgPyBmQ2hpbGROb2Rlcy5zaXplKCkgOiAwOwotCX0KLQotCWludCBnZXRSZWZlcmVuY2VDb3VudCgpIHsKLQkJcmV0dXJuIGZSZWZDb3VudDsKLQl9Ci0KLQotCXByaXZhdGUgTGlzdCBmQ2hpbGROb2RlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmQXR0cmlidXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlJlZkNvdW50ID0gMDsgLy8gZm9yIGVycm9yIGNoZWNrCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9OT1RfQVZBSUxBQkxFID0gIiI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU51bWJlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTnVtYmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzdjMWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTnVtYmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTU51bWJlcjsKLQotY2xhc3MgQ1NTTU1OdW1iZXJJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NTnVtYmVyIHsKLQotCi0JcHVibGljIENTU01NTnVtYmVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX05VTUJFUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldFR5cGUoKSA9PSBUWVBFX1VOSVQpOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUGFnZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBhZ2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmJlNTRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUGFnZVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NUGFnZVJ1bGU7Ci0KLWNsYXNzIENTU01NUGFnZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NUGFnZVJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1QYWdlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9QQUdFX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfUFJPUEVSVFkgfHwgdHlwZSA9PSBUWVBFX1NFTEVDVE9SKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmN2MzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTVByb3BlcnR5OwotCi0KLWNsYXNzIENTU01NUHJvcGVydHlJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NUHJvcGVydHkgewotCXB1YmxpYyBDU1NNTVByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1BST1BFUlRZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9OVU1CRVIgfHwgdHlwZSA9PSBUWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBUWVBFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gVFlQRV9DT05UQUlORVIgfHwgdHlwZSA9PSBUWVBFX1NUUklORyB8fCB0eXBlID09IFRZUEVfU0VQQVJBVE9SIHx8IHR5cGUgPT0gVFlQRV9QUk9QRVJUWSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NUHJvcGVydHkjZ2V0Q2F0ZWdvcnlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShBVFRSX0NBVEVHT1JZKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0VmFsdWVzKCkgewotCQlWYWx1ZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgVmFsdWVDb2xsZWN0b3IoKTsKLQkJY29sbGVjdG9yLmFwcGx5KHRoaXMpOwotCQlyZXR1cm4gY29sbGVjdG9yLmdldE5vZGVzKCk7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBzZXVkb0NsYXNzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4ZjgxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBzZXVkb0NsYXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1jbGFzcyBDU1NNTVBzZXVkb0NsYXNzSW1wbCBleHRlbmRzIENTU01NU2VsZWN0b3JJbXBsIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01NUHNldWRvQ2xhc3NJbXBsLgotCSAqLwotCXB1YmxpYyBDU1NNTVBzZXVkb0NsYXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1TZWxlY3RvciNnZXRTZWxlY3RvclR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9QU0VVRE9fQ0xBU1M7Ci0JfQotCi0Jdm9pZCBzZXRTZWxlY3RvclN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJZlZhbHVlID0gIjoiICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQJCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBzZXVkb0VsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBzZXVkb0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDcxNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCBleHRlbmRzIENTU01NU2VsZWN0b3JJbXBsIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01NUHNldWRvRWxlbWVudEltcGwuCi0JICovCi0JcHVibGljIENTU01NUHNldWRvRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUFNFVURPX0VMRU1FTlQ7Ci0JfQotCi0Jdm9pZCBzZXRTZWxlY3RvclN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJZlZhbHVlID0gIjoiICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxZTExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotY2xhc3MgQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsIGV4dGVuZHMgQ1NTTU1TZWxlY3RvckltcGwgewotCi0JcHVibGljIENTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1TZWxlY3RvciNnZXRTZWxlY3RvclR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9FWFBSRVNTSU9OOwotCX0KLQotCXZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJbWFwLnB1dChFWFBSRVNTSU9OX0FESkFDRU5ULnRvTG93ZXJDYXNlKCksICIrIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwLnB1dChFWFBSRVNTSU9OX0FUVFJJQlVURS50b0xvd2VyQ2FzZSgpLCAiW10iKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fQ0hJTEQudG9Mb3dlckNhc2UoKSwgIj4iKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fREVTQ0VOREFOVC50b0xvd2VyQ2FzZSgpLCAiJyAnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwLnB1dChFWFBSRVNTSU9OX1VOSVZFUlNBTC50b0xvd2VyQ2FzZSgpLCAiKiIpOyAvLyROT04tTkxTLTEkCi0KLQkJZlZhbHVlID0gKFN0cmluZykgbWFwLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCQlpZiAoZlZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TZWxlY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwYjNmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTVNlbGVjdG9yOwotCi0KLWFic3RyYWN0IGNsYXNzIENTU01NU2VsZWN0b3JJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NU2VsZWN0b3IgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01NU2VsZWN0b3JJbXBsLgotCSAqLwotCXB1YmxpYyBDU1NNTVNlbGVjdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1NFTEVDVE9SOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVNlbGVjdG9yI2dldFNlbGVjdG9yU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yU3RyaW5nKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRTZWxlY3RvclN0cmluZygpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBmVmFsdWUgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3RyaW5nSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHJpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YWIyNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHJpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NU3RyaW5nOwotCi1jbGFzcyBDU1NNTVN0cmluZ0ltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TdHJpbmcgewotCi0KLQlwdWJsaWMgQ1NTTU1TdHJpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfU1RSSU5HOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjcG9zdFNldEF0dHJpYnV0ZSgpCi0JICovCi0JLy8gdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQkvLyBzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JLy8gaWYgKG5hbWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vCi0JLy8gTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0FOWS50b0xvd2VyQ2FzZSgpLCAiPGFueT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19DT1VOVEVSX0lERU5USUZJRVIudG9Mb3dlckNhc2UoKSwgIjxjb3VudGVyPiIpOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfRkFNSUxZX05BTUUudG9Mb3dlckNhc2UoKSwgIjxmYW1pbHktbmFtZT4iKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0ZPTlRfRkFDRV9OQU1FLnRvTG93ZXJDYXNlKCksCi0JLy8gIjxmb250LWZhY2UtbmFtZT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19QQUdFX0lERU5USUZJRVIudG9Mb3dlckNhc2UoKSwKLQkvLyAiPHBhZ2UtaWRlbnRpZmllcj4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19TUEVDSUZJQ19WT0lDRS50b0xvd2VyQ2FzZSgpLAotCS8vICI8c3BlY2lmaWMtdm9pY2U+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfVVJBTkdFLnRvTG93ZXJDYXNlKCksICI8dXJhbmdlPiIpOyAvLyROT04tTkxTLTEkCi0JLy8KLQkvLyBmVmFsdWUgPSAoU3RyaW5nKW1hcC5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkvLyBpZiAoZlZhbHVlID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyB9Ci0JLy8KLQkvLyAvKgotCS8vICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCS8vICovCi0JLy8gcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkvLyByZXR1cm4gZlZhbHVlOwotCS8vIH0KLQkvLwotCS8vIHByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5MTllZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1TdHlsZVJ1bGU7Ci0KLWNsYXNzIENTU01NU3R5bGVSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVN0eWxlUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTVN0eWxlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TVFlMRV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX1BST1BFUlRZIHx8IHR5cGUgPT0gVFlQRV9TRUxFQ1RPUik7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVNoZWV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVNoZWV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjc2ZDJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVTaGVldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1TdHlsZVNoZWV0OwotCi1jbGFzcyBDU1NNTVN0eWxlU2hlZXRJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NU3R5bGVTaGVldCB7Ci0KLQotCXB1YmxpYyBDU1NNTVN0eWxlU2hlZXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfU1RZTEVfU0hFRVQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfQ0hBUlNFVF9SVUxFIHx8IHR5cGUgPT0gVFlQRV9JTVBPUlRfUlVMRSB8fCB0eXBlID09IFRZUEVfUEFHRV9SVUxFIHx8IHR5cGUgPT0gVFlQRV9NRURJQV9SVUxFIHx8IHR5cGUgPT0gVFlQRV9GT05UX0ZBQ0VfUlVMRSB8fCB0eXBlID09IFRZUEVfU1RZTEVfUlVMRSk7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Vbml0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Vbml0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTkwNzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NVW5pdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NVW5pdDsKLQotLyoqCi0gKiBDU1NNTVVuaXQgOiBlbWJlZGRlZCB0eXBlCi0gKi8KLWNsYXNzIENTU01NVW5pdEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Vbml0IHsKLQotCXB1YmxpYyBDU1NNTVVuaXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfVU5JVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVVuaXQjZ2V0VW5pdFN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbml0U3RyaW5nKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI3Bvc3RTZXRBdHRyaWJ1dGUoKQotCSAqLwotCS8vIHZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7Ci0JLy8gc3VwZXIucG9zdFNldEF0dHJpYnV0ZSgpOwotCS8vIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCS8vIGlmIChuYW1lID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0NNLnRvTG93ZXJDYXNlKCksICJjbSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0RFRy50b0xvd2VyQ2FzZSgpLCAiZGVnIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfRU1TLnRvTG93ZXJDYXNlKCksICJlbSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0VYUy50b0xvd2VyQ2FzZSgpLCAiZXgiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9HUkFELnRvTG93ZXJDYXNlKCksICJncmFkIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfSEFTSC50b0xvd2VyQ2FzZSgpLCAiIyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0haLnRvTG93ZXJDYXNlKCksICJIeiIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0lOLnRvTG93ZXJDYXNlKCksICJpbiIpOy8vJE5PTi1OTFMtMSQKLQkvLyAvLyBtYXAucHV0KENTU1VuaXRJRC5VX0lOVEVHRVIudG9Mb3dlckNhc2UoKSwKLQkvLyAiKGludGVnZXIpIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfS0haLnRvTG93ZXJDYXNlKCksICJrSHoiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9NTS50b0xvd2VyQ2FzZSgpLCAibW0iKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9NUy50b0xvd2VyQ2FzZSgpLCAibXMiKTsvLyROT04tTkxTLTEkCi0JLy8gLy8gbWFwLnB1dChDU1NVbml0SUQuVV9OVU1CRVIudG9Mb3dlckNhc2UoKSwgIihudW1iZXIpIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUEMudG9Mb3dlckNhc2UoKSwgInBjIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUEVSQ0VOVEFHRS50b0xvd2VyQ2FzZSgpLCAiJSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BULnRvTG93ZXJDYXNlKCksICJwdCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BYLnRvTG93ZXJDYXNlKCksICJweCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1JBRC50b0xvd2VyQ2FzZSgpLCAicmFkIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUy50b0xvd2VyQ2FzZSgpLCAicyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBmVmFsdWUgPSAoU3RyaW5nKW1hcC5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkvLyBpZiAoZlZhbHVlID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyB9Ci0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFVuaXRTdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldFVuaXRTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0VW5pdFN0cmluZygpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNZXRhTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNZXRhTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTg5ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTWV0YU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLQotCi1jbGFzcyBDU1NNZXRhTW9kZWxJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01ldGFNb2RlbCB7Ci0JLy8gY2xhc3MgQ1NTTWV0YU1vZGVsSW1wbCBpbXBsZW1lbnRzIENTU01ldGFNb2RlbCB7Ci0JcHVibGljIENTU01ldGFNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZOb2RlUG9vbCA9IG5ldyBOb2RlUG9vbCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfTUVUQV9NT0RFTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9TVFlMRV9TSEVFVCB8fCB0eXBlID09IFRZUEVfQ0FURUdPUlkpOwotCX0KLQotCXB1YmxpYyBDU1NNTVN0eWxlU2hlZXQgZ2V0U3R5bGVTaGVldCgpIHsKLQkJSXRlcmF0b3IgaSA9IGdldENoaWxkTm9kZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFRZUEVfU1RZTEVfU0hFRVQpIHsKLQkJCQlyZXR1cm4gKENTU01NU3R5bGVTaGVldCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQkJLy8gcmV0dXJuIGZTdHlsZVNoZWV0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDYXRlZ29yaWVzKCkgewotCQlMaXN0IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCWlmIChub2RlLmdldFR5cGUoKSA9PSBUWVBFX0NBVEVHT1JZKSB7Ci0JCQkJY2F0ZWdvcmllcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQl2b2lkIGxvYWRDb21wbGV0ZWQoKSB7Ci0JCWZOb2RlUG9vbCA9IG51bGw7Ci0JfQotCi0JLy8gTGlzdCBmQ2F0ZWdvcmllcyA9IG51bGw7Ci0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjaXNWYWxpZCgpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRTdHlsZVNoZWV0KCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQlOb2RlUG9vbCBnZXROb2RlUG9vbCgpIHsKLQkJcmV0dXJuIGZOb2RlUG9vbDsKLQl9Ci0KLQotCXByaXZhdGUgTm9kZVBvb2wgZk5vZGVQb29sID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmZGJlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNZXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotCi1jbGFzcyBDU1NQcm9maWxlSW1wbCBpbXBsZW1lbnRzIENTU1Byb2ZpbGUgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvSW1wbC4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNZXRhTW9kZWxQcm9maWxlSW5mb0ltcGwuCi0JICovCi0JcHVibGljIENTU1Byb2ZpbGVJbXBsKFN0cmluZyBpZCwgVVJMIHVybCkgewotCQlzdXBlcigpOwotCQlmSUQgPSBpZDsKLQkJZlVSTCA9IHVybDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTWV0YU1vZGVsUHJvZmlsZUluZm8jZ2V0UHJvZmlsZUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVJRCgpIHsKLQkJcmV0dXJuIGZJRDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTWV0YU1vZGVsUHJvZmlsZUluZm8jZ2V0UHJvZmlsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAoZk5hbWUgPT0gbnVsbCkgPyBmSUQgOiBmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKLQkJaWYgKGZNZXRhTW9kZWwgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJbnB1dFN0cmVhbSBpbnB1dCA9IGdldFByb2ZpbGVVUkwoKS5vcGVuU3RyZWFtKCk7Ci0JCQkJUHJvZmlsZUxvYWRlciBsb2FkZXIgPSBuZXcgUHJvZmlsZUxvYWRlcihnZXRSZXNvdXJjZUJ1bmRsZSgpLCBnZXRMb2dnaW5nKCkpOwotCQkJCWZNZXRhTW9kZWwgPSBsb2FkZXIubG9hZFByb2ZpbGUoaW5wdXQpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJDYW5ub3Qgb3BlbiBzdHJlYW0gZm9yIHByb2ZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBmTWV0YU1vZGVsOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCUNsYXNzTG9hZGVyIHRhcmdldExvYWRlciA9IG51bGw7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IGdldE93bmVyUGx1Z2luSUQoKTsKLQkJaWYgKHBsdWdpbklEICE9IG51bGwpIHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0TG9hZGVyID0gYnVuZGxlLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAodGFyZ2V0TG9hZGVyID09IG51bGwpIHsKLQkJCXRhcmdldExvYWRlciA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQl9Ci0KLQkJU3RyaW5nIHByb2ZpbGVVUkxTdHJpbmcgPSBnZXRQcm9maWxlVVJMKCkudG9TdHJpbmcoKTsKLQkJaW50IGxhc3RTbGFzaFBvcyA9IHByb2ZpbGVVUkxTdHJpbmcubGFzdEluZGV4T2YoJy8nKTsKLQkJaWYgKDEgPCBsYXN0U2xhc2hQb3MpIHsKLQkJCVN0cmluZyBwcm9maWxlVVJMQmFzZSA9IHByb2ZpbGVVUkxTdHJpbmcuc3Vic3RyaW5nKDAsIGxhc3RTbGFzaFBvcyArIDEpOwotCQkJdHJ5IHsKLQkJCQlVUkxbXSB1cmxzID0gbmV3IFVSTFtde25ldyBVUkwocHJvZmlsZVVSTEJhc2UpfTsKLQkJCQl0YXJnZXRMb2FkZXIgPSBVUkxDbGFzc0xvYWRlci5uZXdJbnN0YW5jZSh1cmxzLCB0YXJnZXRMb2FkZXIpOwotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiY3NzcHJvZmlsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUxvY2FsZS5nZXREZWZhdWx0KCksIHRhcmdldExvYWRlcik7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNZXRhTW9kZWxQcm9maWxlSW5mbyNnZXRQcm9maWxlVVJMKCkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFByb2ZpbGVVUkwoKSB7Ci0JCXJldHVybiBmVVJMOwotCX0KLQotCXZvaWQgc2V0UHJvZmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0OwotCX0KLQotCXZvaWQgc2V0RGVmYXVsdChib29sZWFuIGlzRGVmYXVsdCkgewotCQlmRGVmYXVsdCA9IGlzRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE93bmVyUGx1Z2luSUQoKSB7Ci0JCXJldHVybiBmT3duZXJQbHVnaW5JRDsKLQl9Ci0KLQl2b2lkIHNldE93bmVyUGx1Z2luSUQoU3RyaW5nIHBsdWdpbklEKSB7Ci0JCWZPd25lclBsdWdpbklEID0gcGx1Z2luSUQ7Ci0JfQotCi0JLyoqCi0JICogaGlkZGVuIG9wdGlvbiA6IGxvZ2dpbmcKLQkgKi8KLQl2b2lkIHNldExvZ2dpbmcoYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCWZMb2dnaW5nID0gbG9nZ2luZzsKLQl9Ci0KLQlib29sZWFuIGdldExvZ2dpbmcoKSB7Ci0JCXJldHVybiBmTG9nZ2luZzsKLQl9Ci0KLQotCVN0cmluZyBmSUQgPSBudWxsOwotCVN0cmluZyBmTmFtZSA9IG51bGw7Ci0JVVJMIGZVUkwgPSBudWxsOwotCUNTU01ldGFNb2RlbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlTdHJpbmcgZk93bmVyUGx1Z2luSUQgPSBudWxsOwotCWJvb2xlYW4gZkRlZmF1bHQgPSBmYWxzZTsKLQlib29sZWFuIGZMb2dnaW5nID0gZmFsc2U7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjg3NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLQotCi1jbGFzcyBDU1NQcm9maWxlVGVzdCB7Ci0KLQotCS8qKgotCSAqIFRlc3QgdXNlIG9ubHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlDU1NNZXRhTW9kZWwgbWV0YW1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IG5ldyBDU1NQcm9maWxlSW1wbCgidGVzdCIsIG5ldyBVUkwoYXJnc1swXSkpOyAvLyROT04tTkxTLTEkCi0JCQltZXRhbW9kZWwgPSBwcm9maWxlLmdldE1ldGFNb2RlbCgpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAobWV0YW1vZGVsID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvKgotCQkgKiBDU1NNTVR5cGVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENTU01NVHlwZUNvbGxlY3RvcigpOwotCQkgKiBjb2xsZWN0b3IuYXBwbHkobWV0YW1vZGVsLCBDU1NNTU5vZGUuVFlQRV9QUk9QRVJUWSk7IEl0ZXJhdG9yCi0JCSAqIGlQcm9wZXJ0eSA9IGNvbGxlY3Rvci5nZXROb2RlcygpOyB3aGlsZSAoaVByb3BlcnR5Lmhhc05leHQoKSkgewotCQkgKiBDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpaVByb3BlcnR5Lm5leHQoKTsKLQkJICogU3lzdGVtLm91dC5wcmludGxuKCJQcm9wZXJ0eSAiICsgbm9kZS5nZXROYW1lKCkgKyAiIGNhbiBjb250YWluOiIpOwotCQkgKiAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQgSXRlcmF0b3IgaVZhbHVlID0KLQkJICogbm9kZS5nZXREZXNjZW5kYW50cygpOyB3aGlsZSAoaVZhbHVlLmhhc05leHQoKSkgewotCQkgKiBkZWJ1Z091dCgoQ1NTTU1Ob2RlKWlWYWx1ZS5uZXh0KCksIDAsIGZhbHNlKTsgfSB9Ci0JCSAqLwotCQlkZWJ1Z091dChtZXRhbW9kZWwsIDAsIHRydWUpOwotCX0KLQotCXN0YXRpYyB2b2lkIGRlYnVnT3V0KENTU01NTm9kZSBub2RlLCBpbnQgZGVwdGgsIGJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0JCVN0cmluZyB0eXBlID0gbm9kZS5nZXRUeXBlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnQoIlsgIiArIG5vZGUuZ2V0TmFtZSgpICsgIigiICsgdHlwZSArICIpIF0iKTsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJaWYgKHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfVU5JVCB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX1NFTEVDVE9SKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIgLT4gIiArIG5vZGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCQlpZiAocmVjdXJzaXZlKSB7Ci0JCQlqYXZhLnV0aWwuSXRlcmF0b3IgaU5vZGUgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCXdoaWxlIChpTm9kZS5oYXNOZXh0KCkpIHsKLQkJCQlkZWJ1Z091dCgoQ1NTTU1Ob2RlKSBpTm9kZS5uZXh0KCksIGRlcHRoICsgMSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvTWV0YU1vZGVsRXJyb3JzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9NZXRhTW9kZWxFcnJvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhZTU1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9NZXRhTW9kZWxFcnJvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW50ZXJmYWNlIE1ldGFNb2RlbEVycm9ycyB7Ci0KLQlzdGF0aWMgZmluYWwgc2hvcnQgTk9fRVJST1IgPSAwOwotCi0JLy8gTUFTSwotCXN0YXRpYyBmaW5hbCBzaG9ydCBNQVNLX1dBUk5JTkcgPSAweDEwMDA7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IE1BU0tfRVJST1IgPSAweDIwMDA7Ci0KLQkvLyBFUlJPUgotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9OT1RfREVGSU5FRCA9IE1BU0tfRVJST1IgKyAweDAxOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9JTlZBTElEX05BTUUgPSBNQVNLX0VSUk9SICsgMHgwNDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgRVJST1JfSU5WQUlMRF9DSElMRCA9IE1BU0tfRVJST1IgKyAweDAyOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9OT19DSElMRCA9IE1BU0tfRVJST1IgKyAweDA4OwotCS8vIHN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9OT19FU1NFTlRJQUxfQ0hJTEQgPSBNQVNLX0VSUk9SICsgMHgxMAotCi0JLy8gV0FSTklORwotCXN0YXRpYyBmaW5hbCBzaG9ydCBXQVJOSU5HX0hBU19OT19DSElMRCA9IE1BU0tfV0FSTklORyArIDB4MDE7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvTm9kZVBvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL05vZGVQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNWJmNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvTm9kZVBvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0KLWNsYXNzIE5vZGVQb29sIHsKLQotCU5vZGVQb29sKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplQ2xhc3NOYW1lVGFibGUoKTsKLQl9Ci0KLQlDU1NNTU5vZGVJbXBsIGdldE5vZGUoU3RyaW5nIHRhZ05hbWUsIFN0cmluZyBub2RlTmFtZSkgewotCQlpZiAobm9kZU5hbWUgIT0gbnVsbCkgewotCQkJbm9kZU5hbWUgPSBub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCVN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBjbGFzc05hbWVzLmdldCh0YWdOYW1lKTsKLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlNYXAgbm9kZXMgPSAoTWFwKSBub2RlUmVnaXN0cnkuZ2V0KGNsYXNzTmFtZSk7Ci0JCWlmIChub2RlcyA9PSBudWxsKSB7Ci0JCQlub2RlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlub2RlUmVnaXN0cnkucHV0KGNsYXNzTmFtZSwgbm9kZXMpOwotCQl9Ci0JCUNTU01NTm9kZUltcGwgbm9kZSA9IChDU1NNTU5vZGVJbXBsKSBub2Rlcy5nZXQobm9kZU5hbWUpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlub2RlID0gY3JlYXRlTmV3Tm9kZShjbGFzc05hbWUpOwotCQkJbm9kZXMucHV0KG5vZGVOYW1lLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcml2YXRlIENTU01NTm9kZUltcGwgY3JlYXRlTmV3Tm9kZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUNTU01NTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0JCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJY2xhc3NOYW1lID0gZ2V0UGFja2FnZU5hbWUoKSArICIuIiArIGNsYXNzTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlub2RlID0gKENTU01NTm9kZUltcGwpIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJfQotCQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQljYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihjbGFzc05hbWUgKyAiIGlzIENyZWF0ZWQiKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogRXJyb3IgY2hlY2sgZnVuY3Rpb246IGZpbmQgbm9kZXMgdGhhdCBhcmUgbm90IHJlZmVycmVkIGJ5IGFueSBub2RlCi0JICovCi0JSXRlcmF0b3IgZ2V0U3RyYXlOb2RlcygpIHsKLQkJTGlzdCBzdHJheU5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpTWFwID0gbm9kZVJlZ2lzdHJ5LnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpTWFwLmhhc05leHQoKSkgewotCQkJTWFwIG5vZGVzID0gKE1hcCkgaU1hcC5uZXh0KCk7Ci0JCQlJdGVyYXRvciBpTm9kZSA9IG5vZGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaU5vZGUuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlSW1wbCBub2RlID0gKENTU01NTm9kZUltcGwpIGlOb2RlLm5leHQoKTsKLQkJCQlpZiAobm9kZS5nZXRSZWZlcmVuY2VDb3VudCgpID09IDApIHsKLQkJCQkJc3RyYXlOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJheU5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLy8gVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBpbm5lciBjbGFzcyA6KQotCXByaXZhdGUgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlpZiAoZlBhY2thZ2VOYW1lID09IG51bGwpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCWludCBwb3MgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmICgwIDwgcG9zKSB7Ci0JCQkJZlBhY2thZ2VOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBwb3MpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlBhY2thZ2VOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlBhY2thZ2VOYW1lOwotCX0KLQotCXZvaWQgaW5pdGlhbGl6ZUNsYXNzTmFtZVRhYmxlKCkgewotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU1RZTEVTSEVFVF9ERUYsIENMQVNTX1NUWUxFX1NIRUVUKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNIQVJTRVRfUlVMRV9ERUYsIENMQVNTX0NIQVJTRVRfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5DSEFSU0VUX1JVTEUsIENMQVNTX0NIQVJTRVRfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5GT05URkFDRV9SVUxFX0RFRiwgQ0xBU1NfRk9OVF9GQUNFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuRk9OVEZBQ0VfUlVMRSwgQ0xBU1NfRk9OVF9GQUNFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuSU1QT1JUX1JVTEVfREVGLCBDTEFTU19JTVBPUlRfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5JTVBPUlRfUlVMRSwgQ0xBU1NfSU1QT1JUX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuTUVESUFfUlVMRV9ERUYsIENMQVNTX01FRElBX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuTUVESUFfUlVMRSwgQ0xBU1NfTUVESUFfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QQUdFX1JVTEVfREVGLCBDTEFTU19QQUdFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUEFHRV9SVUxFLCBDTEFTU19QQUdFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU1RZTEVfUlVMRV9ERUYsIENMQVNTX1NUWUxFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU1RZTEVfUlVMRSwgQ0xBU1NfU1RZTEVfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QUk9QRVJUWV9ERUYsIENMQVNTX1BST1BFUlRZKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBST1BFUlRZLCBDTEFTU19QUk9QRVJUWSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5ERVNDUklQVE9SX0RFRiwgQ0xBU1NfREVTQ1JJUFRPUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5ERVNDUklQVE9SLCBDTEFTU19ERVNDUklQVE9SKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNPTlRBSU5FUl9ERUYsIENMQVNTX0NPTlRBSU5FUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5DT05UQUlORVIsIENMQVNTX0NPTlRBSU5FUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5OVU1CRVJfREVGLCBDTEFTU19OVU1CRVIpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuTlVNQkVSLCBDTEFTU19OVU1CRVIpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuS0VZV09SRF9ERUYsIENMQVNTX0tFWVdPUkQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuS0VZV09SRCwgQ0xBU1NfS0VZV09SRCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5VTklULCBDTEFTU19VTklUKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlVOSVRfREVGLCBDTEFTU19VTklUKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkZVTkNUSU9OLCBDTEFTU19GVU5DVElPTik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9ERUYsIENMQVNTX0ZVTkNUSU9OKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlNFTEVDVE9SX0VYUFJFU1NJT04sIENMQVNTX1NFTEVDVE9SX0VYUFJFU1NJT04pOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFNFVURPX0VMRU1FTlQsIENMQVNTX1BTRVVET19FTEVNRU5UKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBTRVVET19FTEVNRU5UX0RFRiwgQ0xBU1NfUFNFVURPX0VMRU1FTlQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFNFVURPX0NMQVNTLCBDTEFTU19QU0VVRE9fQ0xBU1MpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFNFVURPX0NMQVNTX0RFRiwgQ0xBU1NfUFNFVURPX0NMQVNTKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlNUUklORywgQ0xBU1NfU1RSSU5HKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNBVEVHT1JZX0RFRiwgQ0xBU1NfQ0FURUdPUlkpOwotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZlBhY2thZ2VOYW1lOwotCS8qCi0JICogQ29udmVyc2lvbiBUYWJsZXMgbm9kZVJlZ2lzdHJ5IDogY2xhc3MgbmFtZSAtPiBoYXNoIG9mIG5vZGUgaW5zdGFuY2VzCi0JICogY2xhc3NOYW1lcyA6IFByb2ZpbGUgVGFnIG5hbWUgLT4gamF2YSBjbGFzcyBuYW1lCi0JICovCi0JcHJpdmF0ZSBNYXAgbm9kZVJlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIE1hcCBjbGFzc05hbWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19TVFlMRV9TSEVFVCA9ICJDU1NNTVN0eWxlU2hlZXRJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19DSEFSU0VUX1JVTEUgPSAiQ1NTTU1DaGFyc2V0UnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0ZPTlRfRkFDRV9SVUxFID0gIkNTU01NRm9udEZhY2VSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfSU1QT1JUX1JVTEUgPSAiQ1NTTU1JbXBvcnRSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTUVESUFfUlVMRSA9ICJDU1NNTU1lZGlhUnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1BBR0VfUlVMRSA9ICJDU1NNTVBhZ2VSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfU1RZTEVfUlVMRSA9ICJDU1NNTVN0eWxlUnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1BST1BFUlRZID0gIkNTU01NUHJvcGVydHlJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19ERVNDUklQVE9SID0gIkNTU01NRGVzY3JpcHRvckltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0NPTlRBSU5FUiA9ICJDU1NNTUNvbnRhaW5lckltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05VTUJFUiA9ICJDU1NNTU51bWJlckltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0tFWVdPUkQgPSAiQ1NTTU1LZXl3b3JkSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfVU5JVCA9ICJDU1NNTVVuaXRJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19GVU5DVElPTiA9ICJDU1NNTUZ1bmN0aW9uSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfU1RSSU5HID0gIkNTU01NU3RyaW5nSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfQ0FURUdPUlkgPSAiQ1NTTU1DYXRlZ29yeUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1NFTEVDVE9SX0VYUFJFU1NJT04gPSAiQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QU0VVRE9fQ0xBU1MgPSAiQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1BTRVVET19FTEVNRU5UID0gIkNTU01NUHNldWRvRWxlbWVudEltcGwiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvUHJvZmlsZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL1Byb2ZpbGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDgxYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvUHJvZmlsZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0KLWNsYXNzIFByb2ZpbGVIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHVibGljIFByb2ZpbGVIYW5kbGVyKENTU01ldGFNb2RlbEltcGwgbWV0YW1vZGVsLCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNZXRhTW9kZWwgPSBtZXRhbW9kZWw7Ci0JCWZOb2RlUG9vbCA9IG1ldGFtb2RlbC5nZXROb2RlUG9vbCgpOwotCQlmUmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLQkJZkxvZ2dpbmcgPSBsb2dnaW5nOwotCX0KLQotCXB1YmxpYyBQcm9maWxlSGFuZGxlcihDU1NNZXRhTW9kZWxJbXBsIG1ldGFtb2RlbCwgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUpIHsKLQkJc3VwZXIoKTsKLQkJZk1ldGFNb2RlbCA9IG1ldGFtb2RlbDsKLQkJZk5vZGVQb29sID0gbWV0YW1vZGVsLmdldE5vZGVQb29sKCk7Ci0JCWZSZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotCQlmTG9nZ2luZyA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleS5lcXVhbHMoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JCWlmICgha2V5LnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JCWlmIChrZXkuc3RhcnRzV2l0aCgiJSUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5LnN1YnN0cmluZygxKTsKLQkJfQotCi0JCWlmIChmUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5LnN1YnN0cmluZygxKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0RG9jdW1lbnQiKTsKLQkJLy8gZk5vZGVTdGFjay5wdXNoKG1ldGFtb2RlbCk7Ci0JCS8vIGZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJbmV3IEVycm9yQ29ycmVjdG9yKCkuZG9Db3JyZWN0KGZNZXRhTW9kZWwpOwotCQlpZiAoZkxvZ2dpbmcpIHsKLQkJCUl0ZXJhdG9yIGkgPSBmTm9kZVBvb2wuZ2V0U3RyYXlOb2RlcygpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCQlTdHJpbmcgc3RyID0gIltDU1NQcm9maWxlIFdhcm5pbmddICIgKyBub2RlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0ciArPSAiKCIgKyBub2RlLmdldFR5cGUoKSArICIpIGlzIG5vdCByZWZlcnJlZCBieSBhbnkgbm9kZS4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCBzdHIpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJVGFnTm9kZSB0YWdOb2RlID0gbnVsbDsKLQkJQ1NTTU1Ob2RlSW1wbCBwYXJlbnROb2RlID0gbnVsbDsKLQkJaWYgKDAgPCBmTm9kZVN0YWNrLnNpemUoKSkgewotCQkJdGFnTm9kZSA9IChUYWdOb2RlKSBmTm9kZVN0YWNrLnBlZWsoKTsKLQkJCXBhcmVudE5vZGUgPSB0YWdOb2RlLm5vZGU7Ci0JCX0KLQotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSBudWxsOwotCQlpZiAocU5hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5QUk9GSUxFX0lNUE9SVCkpIHsgLy8gaW1wb3J0Ci0JCQlTdHJpbmcgcHJvZmlsZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9SRUZFUkVOQ0UpOwotCQkJaW1wb3J0UHJvZmlsZShwcm9maWxlTmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNEZWZpbml0aW9uKHFOYW1lKSkgeyAvLyBub2RlIGNyZWF0aW9uCi0JCQlTdHJpbmcgbm9kZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9ERUZJTklUSU9OKTsKLQkJCW5vZGUgPSBmTm9kZVBvb2wuZ2V0Tm9kZShxTmFtZSwgbm9kZU5hbWUpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBvdmVyd3JpdGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfT1ZFUldSSVRFKTsKLQkJCQlpZiAob3ZlcndyaXRlID09IG51bGwgfHwgb3ZlcndyaXRlLmVxdWFscyhBVFRSX1ZBTFVFX09WRVJXUklURV9GQUxTRSkpIHsKLQkJCQkJbm9kZS5yZW1vdmVBbGxDaGlsZE5vZGVzKCk7Ci0JCQkJfQotCQkJCU1hcCBhdHRyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlhdHRyTWFwLnB1dChhdHRyaWJ1dGVzLmdldFFOYW1lKGkpLCBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJbm9kZS5pbml0aWFsaXplQXR0cmlidXRlKGF0dHJNYXApOwotCQkJCX0KLQkJCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSA9PSBudWxsKSB7IC8vIG5vZGUgcmVmZXJlbmNlCi0JCQlTdHJpbmcgbm9kZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9SRUZFUkVOQ0UpOwotCQkJbm9kZSA9IGZOb2RlUG9vbC5nZXROb2RlKHFOYW1lLCBub2RlTmFtZSk7Ci0JCX0KLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuY2FuQ29udGFpbihub2RlKSkgewotCQkJCVN0cmluZyBlbmFibGVkID0gYXR0cmlidXRlcy5nZXRWYWx1ZShBVFRSX0VOQUJMRUQpOwotCQkJCWlmIChlbmFibGVkICE9IG51bGwgJiYgZW5hYmxlZC5lcXVhbHMoQVRUUl9WQUxVRV9FTkFCTEVEX0ZBTFNFKSkgewotCQkJCQlwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TVFlMRV9TSEVFVCB8fCBub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9DQVRFR09SWSkgewotCQkJCWZNZXRhTW9kZWwuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZkxvZ2dpbmcgJiYgcGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBwYXJlbnROb2RlLmdldFR5cGUoKSArICIgY2Fubm90IGNvbnRhaW4gIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJbm9kZS5nZXRUeXBlKCkgKyAiICgiICsgcU5hbWUgKyAiKSIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZOb2RlU3RhY2sucHVzaChuZXcgVGFnTm9kZShxTmFtZSwgKG5vZGUgIT0gbnVsbCkgPyBub2RlIDogcGFyZW50Tm9kZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJZk5vZGVTdGFjay5wb3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJVGFnTm9kZSB0YWdOb2RlID0gKFRhZ05vZGUpIGZOb2RlU3RhY2sucGVlaygpOwotCQlTdHJpbmcgdGFnTmFtZSA9IHRhZ05vZGUudGFnOwotCQlpZiAodGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5VTklUX1ZBTFVFKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRlVOQ1RJT05fVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TRUxFQ1RPUl9WQUxVRSkgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUSU9OKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FQVElPTikpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmLmFwcGVuZChjaFtzdGFydCArIGldKTsKLQkJCX0KLQkJCVN0cmluZyB2YWx1ZSA9IGdldFJlc291cmNlU3RyaW5nKGJ1Zi50b1N0cmluZygpLnRyaW0oKSk7Ci0JCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSB0YWdOb2RlLm5vZGU7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0tFWVdPUkQgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfVkFMVUUpKSB7Ci0JCQkJCSgoQ1NTTU1LZXl3b3JkSW1wbCkgbm9kZSkuc2V0S2V5d29yZFN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1VOSVQgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfVkFMVUUpKSB7Ci0JCQkJCSgoQ1NTTU1Vbml0SW1wbCkgbm9kZSkuc2V0VW5pdFN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0ZVTkNUSU9OICYmIHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9WQUxVRSkpIHsKLQkJCQkJKChDU1NNTUZ1bmN0aW9uSW1wbCkgbm9kZSkuc2V0RnVuY3Rpb25TdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUiAmJiAoKENTU01NU2VsZWN0b3IpIG5vZGUpLmdldFNlbGVjdG9yVHlwZSgpID09IENTU01NU2VsZWN0b3IuVFlQRV9QU0VVRE9fRUxFTUVOVCkgewotCQkJCQkoKENTU01NUHNldWRvRWxlbWVudEltcGwpIG5vZGUpLnNldFNlbGVjdG9yU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfU0VMRUNUT1IgJiYgKChDU1NNTVNlbGVjdG9yKSBub2RlKS5nZXRTZWxlY3RvclR5cGUoKSA9PSBDU1NNTVNlbGVjdG9yLlRZUEVfUFNFVURPX0NMQVNTKSB7Ci0JCQkJCSgoQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwpIG5vZGUpLnNldFNlbGVjdG9yU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfQ0FURUdPUlkgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkNBUFRJT04pKSB7Ci0JCQkJCSgoQ1NTTU1DYXRlZ29yeUltcGwpIG5vZGUpLnNldENhcHRpb24odmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRJT04pKSB7Ci0JCQkJCW5vZGUuc2V0RGVzY3JpcHRpb24odmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmluaXRpb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU1RZTEVTSEVFVF9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DSEFSU0VUX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuSU1QT1JUX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUEFHRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLk1FRElBX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRk9OVEZBQ0VfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TVFlMRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuTlVNQkVSX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBST1BFUlRZX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUT1JfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ09OVEFJTkVSX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRlVOQ1RJT05fREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU1RSSU5HKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FURUdPUllfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUFNFVURPX0NMQVNTX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBTRVVET19FTEVNRU5UX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNFTEVDVE9SX0VYUFJFU1NJT04pIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TRVBBUkFUT1IpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW1wb3J0UHJvZmlsZShTdHJpbmcgcHJvZmlsZU5hbWUpIHsKLQkJVVJMIHByb2ZpbGVVUkwgPSBudWxsOwotCQlDU1NQcm9maWxlUmVnaXN0cnkgcmVnID0gQ1NTUHJvZmlsZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IHJlZy5nZXRQcm9maWxlKHByb2ZpbGVOYW1lKTsKLQkJaWYgKHByb2ZpbGUgIT0gbnVsbCkgewotCQkJLy8gZmlyc3Q6IGZpbmQgVVJMIGJ5IElECi0JCQlwcm9maWxlVVJMID0gcHJvZmlsZS5nZXRQcm9maWxlVVJMKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWNvbmQ6IGZpbmQgVVJMIGJ5IGZpbGVuYW1lIG9mIHByb2ZpbGUgVVJMCi0JCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJCVVSTCB1cmwgPSBwcm9maWxlLmdldFByb2ZpbGVVUkwoKTsKLQkJCQlpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aChwcm9maWxlTmFtZSkpIHsKLQkJCQkJcHJvZmlsZVVSTCA9IHVybDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChwcm9maWxlVVJMID09IG51bGwpIHsKLQkJCS8vIGZpbmFsOiBpdCBtYXkgYmUgdXJsIGl0c2VsZgotCQkJdHJ5IHsKLQkJCQlwcm9maWxlVVJMID0gbmV3IFVSTChwcm9maWxlTmFtZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCWlmIChwcm9maWxlVVJMICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJUHJvZmlsZUxvYWRlci5sb2FkUHJvZmlsZShmTWV0YU1vZGVsLCBwcm9maWxlVVJMLm9wZW5TdHJlYW0oKSwgZlJlc291cmNlQnVuZGxlLCBmTG9nZ2luZyk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNhbm5vdCBvcGVuIHN0cmVhbSBmb3IgcHJvZmlsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFRhZ05vZGUgewotCi0JCVN0cmluZyB0YWcgPSBudWxsOwotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSBudWxsOwotCi0JCVRhZ05vZGUoU3RyaW5nIHRhZywgQ1NTTU1Ob2RlSW1wbCBub2RlKSB7Ci0JCQl0aGlzLnRhZyA9IHRhZzsKLQkJCXRoaXMubm9kZSA9IG5vZGU7Ci0JCX0KLQl9Ci0KLQljbGFzcyBFcnJvckNvcnJlY3RvciB7Ci0KLQkJdm9pZCBkb0NvcnJlY3QoQ1NTTU1Ob2RlSW1wbCBub2RlKSB7Ci0JCQlJdGVyYXRvciBpID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGVJbXBsIGNoaWxkID0gKENTU01NTm9kZUltcGwpIGkubmV4dCgpOwotCQkJCWRvQ29ycmVjdChjaGlsZCk7Ci0JCQkJc2hvcnQgZXJyb3IgPSBjaGlsZC5nZXRFcnJvcigpOwotCQkJCWlmIChlcnJvciAhPSBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1IpIHsKLQkJCQkJbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Ci0KLQkJCQkJU3RyaW5nIHN0ciA9ICJbQ1NTUHJvZmlsZSBFcnJvcl0gIiArIG5vZGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0ciArPSAiKCIgKyBub2RlLmdldFR5cGUoKSArICIpIGNvbnRhaW5zIGVycm9yIG5vZGU6ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlzdHIgKz0gY2hpbGQuZ2V0TmFtZSgpICsgIigiICsgY2hpbGQuZ2V0VHlwZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc3RyICs9ICIgLSBlcnJvciBjb2RlID0gIiArIGVycm9yOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChmTG9nZ2luZykgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIHN0cik7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBDU1NNZXRhTW9kZWxJbXBsIGZNZXRhTW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZVBvb2wgZk5vZGVQb29sID0gbnVsbDsKLQlwcml2YXRlIFN0YWNrIGZOb2RlU3RhY2sgPSBuZXcgU3RhY2soKTsKLQlwcml2YXRlIGJvb2xlYW4gZkxvZ2dpbmcgPSBmYWxzZTsKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9OQU1FX0RFRklOSVRJT04gPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9OQU1FX1JFRkVSRU5DRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX09WRVJXUklURSA9ICJvdmVyd3JpdGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX1ZBTFVFX09WRVJXUklURV9GQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9WQUxVRV9FTkFCTEVEX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL1Byb2ZpbGVLZXl3b3Jkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvUHJvZmlsZUtleXdvcmRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjhkZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvUHJvZmlsZUtleXdvcmRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLWludGVyZmFjZSBQcm9maWxlS2V5d29yZHMgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBDU1NfUFJPRklMRSA9ICJjc3MtcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0ZJTEVfSU1QT1JUID0gInByb2ZpbGUtaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVTSEVFVF9ERUYgPSAic3R5bGVzaGVldC1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDSEFSU0VUX1JVTEUgPSAiY2hhcnNldC1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX1JVTEUgPSAiaW1wb3J0LXJ1bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQQUdFX1JVTEUgPSAicGFnZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTUVESUFfUlVMRSA9ICJtZWRpYS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRk9OVEZBQ0VfUlVMRSA9ICJmb250ZmFjZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVfUlVMRSA9ICJzdHlsZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hBUlNFVF9SVUxFX0RFRiA9ICJjaGFyc2V0LXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX1JVTEVfREVGID0gImltcG9ydC1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBBR0VfUlVMRV9ERUYgPSAicGFnZS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1FRElBX1JVTEVfREVGID0gIm1lZGlhLXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRk9OVEZBQ0VfUlVMRV9ERUYgPSAiZm9udGZhY2UtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9SVUxFX0RFRiA9ICJzdHlsZS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZVTkNUSU9OX0RFRiA9ICJmdW5jdGlvbi1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGVU5DVElPTl9WQUxVRSA9ICJmdW5jdGlvbi12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtFWVdPUkRfREVGID0gImtleXdvcmQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZV09SRF9WQUxVRSA9ICJrZXl3b3JkLXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBOVU1CRVJfREVGID0gIm51bWJlci1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVTklUID0gInVuaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVTklUX0RFRiA9ICJ1bml0LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVOSVRfVkFMVUUgPSAidW5pdC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9ERUYgPSAiY29udGFpbmVyLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0RFRiA9ICJjYXRlZ29yeS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDQVBUSU9OID0gImNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9ERUYgPSAicHJvcGVydHktZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRPUl9ERUYgPSAiZGVzY3JpcHRvci1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTRUxFQ1RPUl9FWFBSRVNTSU9OID0gInNlbGVjdG9yLWV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fQ0xBU1MgPSAicHNldWRvLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFNFVURPX0VMRU1FTlQgPSAicHNldWRvLWVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fQ0xBU1NfREVGID0gInBzZXVkby1jbGFzcy1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fRUxFTUVOVF9ERUYgPSAicHNldWRvLWVsZW1lbnQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU0VMRUNUT1JfVkFMVUUgPSAic2VsZWN0b3ItdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBOVU1CRVIgPSAibnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZV09SRCA9ICJrZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRlVOQ1RJT04gPSAiZnVuY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVIgPSAiY29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUEFSQVRPUiA9ICJzZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUT1IgPSAiZGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9Qcm9maWxlTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9Qcm9maWxlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjUzMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvUHJvZmlsZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLQotCi1jbGFzcyBQcm9maWxlTG9hZGVyIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFByb2ZpbGVMb2FkZXIuCi0JICovCi0JcHJpdmF0ZSBQcm9maWxlTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCVByb2ZpbGVMb2FkZXIoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIGJvb2xlYW4gbG9nZ2luZykgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLQkJZkxvZ2dpbmcgPSBsb2dnaW5nOwotCX0KLQotCXN0YXRpYyB2b2lkIGxvYWRQcm9maWxlKENTU01ldGFNb2RlbEltcGwgbWV0YW1vZGVsLCBJbnB1dFN0cmVhbSBpbnB1dCwgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIGJvb2xlYW4gbG9nZ2luZykgewotCQl0cnkgewotCQkJWE1MUmVhZGVyIHhtbFJlYWRlciA9IFhNTFJlYWRlclV0aWwuY3JlYXRlWE1MUmVhZGVyKFBBUlNFUl9OQU1FKTsKLQkJCS8vIFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKFBBUlNFUl9OQU1FKTsKLQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgUHJvZmlsZUhhbmRsZXIobWV0YW1vZGVsLCByZXNvdXJjZUJ1bmRsZSwgbG9nZ2luZykpOwotCQkJeG1sUmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCUNTU01ldGFNb2RlbCBsb2FkUHJvZmlsZShJbnB1dFN0cmVhbSBpbnB1dCkgewotCQlpZiAoZk1ldGFNb2RlbCA9PSBudWxsKSB7Ci0JCQlmTWV0YU1vZGVsID0gbmV3IENTU01ldGFNb2RlbEltcGwoKTsKLQkJfQotCQlsb2FkUHJvZmlsZShmTWV0YU1vZGVsLCBpbnB1dCwgZlJlc291cmNlQnVuZGxlLCBmTG9nZ2luZyk7Ci0JCWZNZXRhTW9kZWwubG9hZENvbXBsZXRlZCgpOwotCQlyZXR1cm4gZk1ldGFNb2RlbDsKLQl9Ci0KLQotCUNTU01ldGFNb2RlbEltcGwgZk1ldGFNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUlNFUl9OQU1FID0gIm9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkxvZ2dpbmcgPSBmYWxzZTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5YjI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkvLwotCXByaXZhdGUgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImNzc3Byb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgVEFHX05BTUUgPSAicHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9MT0dHSU5HID0gImxvZ2dpbmciOyAvLyBIaWRkZW4gT3B0aW9uIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNZXRhTW9kZWxSZWdpc3RyeVJlYWRlci4KLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENTU1Byb2ZpbGUgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJQ1NTUHJvZmlsZUltcGwgaW5mbyA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlTdHJpbmcgc3RySUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJU3RyaW5nIHN0ck5BTUUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRSk7Ci0JCQlTdHJpbmcgc3RyVVJJID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1VSSSk7Ci0KLQkJCWlmIChzdHJJRCAhPSBudWxsIHx8IHN0clVSSSAhPSBudWxsKSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJCQlidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChzdHJVUkkpOwotCQkJCQlVUkwgdXJsID0gUGxhdGZvcm0uZmluZChidW5kbGUsIHBhdGgpOwotCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQkJCQkJCWluZm8gPSBuZXcgQ1NTUHJvZmlsZUltcGwoc3RySUQsIHVybCk7Ci0JCQkJCQkJaW5mby5zZXRQcm9maWxlTmFtZShzdHJOQU1FKTsKLQkJCQkJCQlpbmZvLnNldERlZmF1bHQoKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERUZBVUxUKSAhPSBudWxsKSk7Ci0JCQkJCQkJaW5mby5zZXRMb2dnaW5nKChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTE9HR0lORykgIT0gbnVsbCkpOwotCQkJCQkJCWluZm8uc2V0T3duZXJQbHVnaW5JRChwbHVnaW5JZCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gdGhyb3VnaAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJFcnJvciByZWFkaW5nIENTUyBQcm9maWxlOiAiICsgc3RySUQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyoqCi0JICogV2Ugc2ltcGx5IHJlcXVpcmUgYW4gJ2FkZCcgbWV0aG9kLCBvZiB3aGF0IGV2ZXIgaXQgaXMgd2UgYXJlIHRvIHJlYWQKLQkgKiBpbnRvCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGVudW1Qcm9maWxlcygpIHsKLQkJU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ1NTUHJvZmlsZSBpbmZvID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCS8vIG51bGwgY2FuIGJlIHJldHVybmVkIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyB0aGUKLQkJCQkvLyBlbGVtZW50Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlzZXQuYWRkKGluZm8pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2V0Lml0ZXJhdG9yKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvVmFsdWVDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL1ZhbHVlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MmYzOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvVmFsdWVDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC51dGlsLkNTU01ldGFNb2RlbFRyYXZlcnNlcjsKLQotCi0KLWNsYXNzIFZhbHVlQ29sbGVjdG9yIGV4dGVuZHMgQ1NTTWV0YU1vZGVsVHJhdmVyc2VyIHsKLQlwdWJsaWMgdm9pZCBiZWdpbihDU1NNTU5vZGUgbm9kZSkgewotCQlmTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJc2hvcnQgcmMgPSBUUkFWX0NPTlQ7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gbm9kZS5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9QUk9QRVJUWSB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX0RFU0NSSVBUT1IgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9DT05UQUlORVIpIHsKLQkJCQlyYyA9IFRSQVZfQ09OVDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZk5vZGVzLmNvbnRhaW5zKG5vZGUpKSB7Ci0JCQkJCWZOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCXJjID0gVFJBVl9QUlVORTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXROb2RlcygpIHsKLQkJcmV0dXJuIGZOb2Rlcy5pdGVyYXRvcigpOwotCX0KLQotCi0JcHJpdmF0ZSBMaXN0IGZOb2RlcyA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvWE1MUmVhZGVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvWE1MUmVhZGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjJhYTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL1hNTFJlYWRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotCi1jbGFzcyBYTUxSZWFkZXJVdGlsIHsKLQotCXN0YXRpYyBwdWJsaWMgWE1MUmVhZGVyIGNyZWF0ZVhNTFJlYWRlcihTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCkuZ2V0WE1MUmVhZGVyKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NSZWdpb25VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NSZWdpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZTdmYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTUmVnaW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTUmVnaW9uVXRpbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWNsYXJhdGlvblZhbHVlVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogdGhlc2UgdHlwZSBjYW4gYmUgYmVnZ2luaW5nIG9mIHNlbGVjdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0b3JCZWdnaW5pbmdUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlY2xhcmF0aW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiB8fCBpc0RlY2xhcmF0aW9uVmFsdWVUeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUik7Ci0JfQotCi0JLyoqCi0JICogVGhlc2UgdHlwZXMgY29uc2lzdCBzZWxlY3RvciByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWxlY3RvclR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTb3VyY2VQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDEzMzdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWc7Ci0KLQotcHVibGljIGNsYXNzIENTU1NvdXJjZVBhcnNlciBpbXBsZW1lbnRzIFJlZ2lvblBhcnNlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TVFlMRVNIRUVUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMjsKLQotCXByaXZhdGUgbG9uZyBmU3RhcnRUaW1lOwotCXByaXZhdGUgbG9uZyBmU3RvcFRpbWU7Ci0JcHJpdmF0ZSBDU1NUb2tlbml6ZXIgZlRva2VuaXplcjsKLQotCXB1YmxpYyB2b2lkIHNldFBhcnNlck1vZGUoaW50IG1vZGUpIHsKLQkJaW50IGluaXRpYWxTdGF0ZTsKLQkJaW50IGJ1ZnNpemU7Ci0JCXN3aXRjaCAobW9kZSkgewotCQkJY2FzZSBNT0RFX1NUWUxFU0hFRVQgOgotCQkJCWluaXRpYWxTdGF0ZSA9IENTU1Rva2VuaXplci5ZWUlOSVRJQUw7Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9OT1JNQUw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVfREVDTEFSQVRJT04gOgotCQkJCWluaXRpYWxTdGF0ZSA9IENTU1Rva2VuaXplci5TVF9ERUNMQVJBVElPTjsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX05PUk1BTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERV9ERUNMQVJBVElPTl9WQUxVRSA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLlNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRTsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX1NNQUxMOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgwIDwgaW5pdGlhbFN0YXRlKSB7Ci0JCQlDU1NUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCQl0b2tlbml6ZXIuc2V0SW5pdGlhbFN0YXRlKGluaXRpYWxTdGF0ZSk7Ci0JCQl0b2tlbml6ZXIuc2V0SW5pdGlhbEJ1ZmZlclNpemUoYnVmc2l6ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLnBhcnNlci5SZWdpb25QYXJzZXIjZ2V0Tm9kZXMoKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkbm9kZSA9IG51bGw7Ci0JCWlmIChoZWFkbm9kZSA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcucGVyZlRlc3QpIHsKLQkJCQlmU3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQloZWFkbm9kZSA9IHBhcnNlTm9kZXMoKTsKLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCWZTdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0tIGNyZWF0aW5nIG5vZGVzIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQgLS0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBUaW1lIHBhcnNlIGFuZCBpbml0IGFsbCByZWdpb25zOiAiICsgKGZTdG9wVGltZSAtIGZTdGFydFRpbWUpICsgIiAobXNlY3MpIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZm9yICIgKyBmUmVnaW9ucy5zaXplKCkgKyAiCi0JCQkJLy8gUmVnaW9ucyIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICBhbmQgIiArIF9jb3VudE5vZGVzKGhlYWRub2RlKSArICIgTm9kZXMiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVhZG5vZGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5wYXJzZXIuUmVnaW9uUGFyc2VyI2dldFJlZ2lvbnMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlpZiAoIWdldFRva2VuaXplcigpLmlzRU9GKCkpIHsKLQkJCWhlYWROb2RlID0gZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JCQkvLyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYXJzaW5nIGhhcyBub3QgZmluaXNoZWQiKTsKLQkJfQotCQkvLyBmb3IgbWVtb3J5IHJlY292ZXJ5LCB3ZSBhc3N1bWUgaWYgc29tZW9uZQotCQkvLyByZXF1ZXN0cyBhbGwgcmVnaW9ucywgd2UgY2FuIHJlc2V0IG91ciBiaWcKLQkJLy8gbWVtb3J5IGNvbnN1bWluZyBvYmplY3RzCi0JCS8vIGJ1dCB0aGUgbmV3ICJnZXRSZWdpb25zIiBtZXRob2QgaXMgdGhlbiBtb3JlIGV4cGVuc2l2ZS4KLQkJLy8gSSBkb24ndCB0aGluayBpdHMgdXNlZCBtdWNoLCB0aG91Z2guCi0JCUxpc3QgbG9jYWxSZWdpb25zTGlzdCA9IGdldFJlZ2lvbnMoaGVhZE5vZGUpOwotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGxvY2FsUmVnaW9uc0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFJlZ2lvbnMuCi0JICogCi0JICogQHBhcmFtIGhlYWROb2RlCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlKSB7Ci0JCUxpc3QgYWxsUmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zID0gY3VycmVudE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlUmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCWFsbFJlZ2lvbnMuYWRkKG5vZGVSZWdpb25zLmdldChpKSk7Ci0JCQl9Ci0JCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gYWxsUmVnaW9uczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLnBhcnNlci5SZWdpb25QYXJzZXIjcmVzZXQoamF2YS5pby5SZWFkZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlcikgewotCQlwcmltUmVzZXQoKTsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQocmVhZGVyLCAwKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLnBhcnNlci5SZWdpb25QYXJzZXIjcmVzZXQoamF2YS5pby5SZWFkZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJlc2V0KHJlYWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5wYXJzZXIuUmVnaW9uUGFyc2VyI3Jlc2V0KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0KSB7Ci0JCXJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc3NlLm1vZGVsLnBhcnNlci5SZWdpb25QYXJzZXIjcmVzZXQoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCwgaW50IG9mZnNldCkgewotCQlyZXNldChpbnB1dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNzZS5tb2RlbC5wYXJzZXIuUmVnaW9uUGFyc2VyI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU1NvdXJjZVBhcnNlcigpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJzZU5vZGVzKCkgewotCQkvLyByZWdpb25zIGFyZSBpbml0aWFsbHkgcmVwb3J0ZWQgYXMgY29tcGxldGUgb2Zmc2V0cyB3aXRoaW4gdGhlCi0JCS8vIHNjYW5uZWQgaW5wdXQKLQkJLy8gdGhleSBhcmUgYWRqdXN0ZWQgaGVyZSB0byBiZSBpbmRleGVzIGZyb20gdGhlIGN1cnJlbnROb2RlJ3Mgc3RhcnQKLQkJLy8gb2Zmc2V0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJU3RyaW5nIGN1cnJlbnRSZWdpb25UeXBlID0gbnVsbDsKLQotCQl3aGlsZSAoKHJlZ2lvbiA9IGdldE5leHRSZWdpb24oKSkgIT0gbnVsbCkgewotCQkJdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAobXVzdEJlU3RhcnQodHlwZSwgY3VycmVudFJlZ2lvblR5cGUpICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQotCQkJaWYgKChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmlzRW5kZWQoKSkgfHwgY3VycmVudE5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmICFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCWxhc3ROb2RlID0gY3VycmVudE5vZGU7Ci0JCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJY3VycmVudFJlZ2lvblR5cGUgPSB0eXBlOwotCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJfQotCi0JCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQotCQkJaWYgKG11c3RCZUVuZCh0eXBlKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCi0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmICFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQl9Ci0KLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbih0eXBlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbXVzdEJlU3RhcnQoU3RyaW5nIHR5cGUsIFN0cmluZyBkb2NSZWdpb25UeXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0FUS0VZV09SRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHx8IChkb2NSZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB8fCAoIUNTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUoZG9jUmVnaW9uVHlwZSkgJiYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCkpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbXVzdEJlRW5kKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKTsKLQl9Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb24oKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXRUb2tlbml6ZXIoKS5nZXROZXh0VG9rZW4oKTsKLQkJCS8vIERNVzogMi8xMi8wMyBSZW1vdmVkIHN0YXRlCi0JCQkvLyBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZSZWdpb25zLmFkZChyZWdpb24pOwotCQkJLy8gfQotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiBpbnB1dCBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0VG9rZW5pemVyKCkuZ2V0T2Zmc2V0KCksIGUpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSArICIgKCIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICIpIiwgZSk7IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmltUmVzZXQoKSB7Ci0KLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQobmV3IGNoYXJbMF0pOwotCX0KLQotCXByaXZhdGUgQ1NTVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBDU1NUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBzaW1wbGUgdXRpbGl0eSB0byBjb3VudCBub2Rlcy4gVXNlZCBvbmx5IGZvciBkZWJ1ZwotCSAqIHN0YXRlbWVudHMuCi0JICovCi0JcHJpdmF0ZSBpbnQgX2NvdW50Tm9kZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlcykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBub2RlczsKLQkJd2hpbGUgKGNvdW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQrKzsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTBkOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1Rva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjRmNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDA0LzEwLzAxIDIyOjUzICovCi0KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5DU1NUZXh0UmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgPGEKLSAqIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXggPC9hPiAxLjIuMgotICovCi1wdWJsaWMgY2xhc3MgQ1NTVG9rZW5pemVyIGltcGxlbWVudHMgQ1NTUmVnaW9uQ29udGV4dHMgewotCi0JLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotCS8qKiBsZXhpY2FsIHN0YXRlcyAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FID0gMTE7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSU1QT1JUX0RFTElNSVRFUiA9IDU7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFID0gMTc7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1IgPSAwOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NIQVJTRVRfREVMSU1JVEVSID0gMjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ERUNMQVJBVElPTl9WQUxVRSA9IDE4OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BBR0VfUFNFVURPX1BBR0UgPSA4OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0lNUE9SVF9VUkkgPSAzOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQgPSAxNDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgPSAxMjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ERUNMQVJBVElPTiA9IDE1OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BBR0VfREVMSU1JVEVSID0gOTsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAxMzsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9NRURJQV9NRURJVU0gPSA2OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NIQVJTRVRfTkFNRSA9IDE7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSU1QT1JUX01FRElVTSA9IDQ7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SID0gMTY7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfRk9OVF9GQUNFX0RFTElNSVRFUiA9IDk7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVESUFfREVMSU1JVEVSID0gNzsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9NT0RJRklFUiA9IDEwOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLQkgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9ICJcMTFcMFwxXDExXDFcMTdcMVwwXDFcNFwxXDIwXDIyXDBcMVw2XDFcMzFcMVwxMCIgKyAiXDFcMjJcMVwxNlwxXDcyXDFcMTZcMVw1XDFcMjZcMVwxMlwxXDM1XDFcMTRcMVw1NSIgKyAiXDFcMTNcMVwxNVwxXDM0XDEyXDFcMVw2MlwxXDUwXDFcMzBcMVw2N1wxXDMyXDFcMjEiICsgIlwxXDM2XDFcNDNcMVwyN1wxXDQwXDFcNTdcMVw0NlwxXDY0XDFcNjFcMVw0MVwxXDUxIiArICJcMlwyXDFcMjVcMVw1MlwxXDY1XDFcNTRcMVw1M1wxXDJcMVwyNFwxXDQ0XDFcNDciICsgIlwxXDIzXDVcMlwxXDY2XDFcM1wxXDcxXDFcMTZcMVwyXDFcMTZcMVw0MlwxXDciICsgIlwxXDM3XDFcNTZcMVw0NVwxXDYzXDFcNjFcMVw0MVwxXDUxXDJcMlwxXDI1XDFcNTIiICsgIlwxXDY1XDFcNTRcMVw1M1wxXDJcMVwyNFwxXDQ0XDFcNDdcMVwyM1w1XDJcMVw2MCIgKyAiXDFcNzBcMVwzM1wxXDcwXDFcMFx1ZmY4MFwyIjsKLQotCS8qKgotCSAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXJbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCS8qKgotCSAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXBbXSA9IHswLCA1OSwgMTE4LCAxNzcsIDIzNiwgMjk1LCAzNTQsIDQxMywgNDcyLCA1MzEsIDU5MCwgNjQ5LCA3MDgsIDc2NywgODI2LCA4ODUsIDk0NCwgMTAwMywgMTA2MiwgMTEyMSwgMTE4MCwgMTIzOSwgMTI5OCwgMTM1NywgMTQxNiwgMTQ3NSwgMTUzNCwgMTEyMSwgMTU5MywgMTEyMSwgMTY1MiwgMTcxMSwgMTEyMSwgMTc3MCwgMTgyOSwgMTg4OCwgMTEyMSwgMTk0NywgMjAwNiwgMjA2NSwgMjEyNCwgMjE4MywgMjI0MiwgMTEyMSwgMjMwMSwgMjM2MCwgMjQxOSwgMTEyMSwgMTEyMSwgMjQ3OCwgMjUzNywgMjU5NiwgMTEyMSwgMjY1NSwgMjcxNCwgMTEyMSwgMTEyMSwgMjc3MywgMjgzMiwgMjg5MSwgMTEyMSwgMjk1MCwgMTEyMSwgMzAwOSwgMzA2OCwgMzEyNywgMzE4NiwgMzI0NSwgMzMwNCwgMzM2MywgMzQyMiwgMTEyMSwgMTEyMSwgMzQ4MSwgMzU0MCwgMzU5OSwgMzY1OCwgMzcxNywgMTEyMSwgMzc3NiwgMzgzNSwgMzg5NCwgMzk1MywgNDAxMiwgNDA3MSwgMTU5MywgMTEyMSwgNDEzMCwgMTIzOSwgNDE4OSwgNDI0OCwgMTQxNiwgNDMwNywgMTQ3NSwgNDM2NiwgNDQyNSwgNDQ4NCwgNDU0MywgNDYwMiwgNDY2MSwgNDcyMCwgNDc3OSwgNDgzOCwgNDg5NywgMTc3MCwgNDk1NiwgMTEyMSwgMTgyOSwgNTAxNSwgNTA3NCwgMTk0NywgNTEzMywgMTEyMSwgMjAwNiwgNTE5MiwgNTI1MSwgMjE4MywgNTMxMCwgNTM2OSwgMjM2MCwgNTQyOCwgNTQ4NywgMjUzNywgNTU0NiwgNTYwNSwgMTEyMSwgMjcxNCwgMjgzMiwgNTY2NCwgNTcyMywgMzA2OCwgNTc4MiwgMzEyNywgNTg0MSwgMTEyMSwgMzE4NiwgNTkwMCwgNTk1OSwgMzM2MywgNjAxOCwgNjA3NywgNjEzNiwgNjE5NSwgMzg5NCwgMTEyMSwgMzU5OSwgMTEyMSwgNjI1NCwgMzY1OCwgNjMxMywgMTEyMSwgMzcxNywgNjM3MiwgNjQzMSwgNjQ5MCwgNjU0OSwgMzk1MywgNjYwOCwgNjY2NywgNjcyNiwgNDA3MSwgNjc4NSwKLQkJCQkxMTIxLCA0MTMwLCA2ODQ0LCAxMTIxLCA2OTAzLCA2OTYyLCA3MDIxLCA3MDgwLCA3MTM5LCA3MTk4LCA3MjU3LCA3MzE2LCA3Mzc1LCA3NDM0LCA3NDkzLCA3NTUyLCAxNzcwLCA3NjExLCA3NjcwLCAxODI5LCA3NzI5LCA3Nzg4LCAxOTQ3LCA3ODQ3LCA3OTA2LCAyMDA2LCA3OTY1LCA4MDI0LCA4MDgzLCA4MTQyLCA4MjAxLCA4MjYwLCA4MzE5LCA4Mzc4LCAzMTI3LCA4NDM3LCA4NDk2LCAzMTg2LCA4NTU1LCA4NjE0LCA4NjczLCA4NzMyLCA4NzkxLCAzNjU4LCA4ODUwLCA4OTA5LCAzNzE3LCA4OTY4LCA5MDI3LCA5MDg2LCA5MTQ1LCA5MjA0LCA5MjYzLCA5MzIyLCA5MzgxLCAxMTIxLCAxMTIxLCA5NDQwLCA5NDk5LCA5NTU4LCA5NjE3LCA5Njc2LCA5NzM1LCA5Nzk0LCA5ODUzLCA5OTEyLCA5OTcxLCAxMDAzMCwgMTAwODksIDEwMTQ4LCAxMDIwNywgMTAyNjYsIDEwMzI1LCAxMDM4NCwgMTA0NDMsIDEwNTAyLCAxMDU2MSwgMTA2MjAsIDEwNjc5LCAxMDczOCwgMTA3OTcsIDEwODU2LCAxMDkxNSwgMTA5NzQsIDExMDMzLCAxMTA5MiwgMTExNTEsIDExMjEwLCAxMTI2OSwgMTEzMjgsIDExMzg3LCAxMTQ0NiwgMTE1MDUsIDExMjEsIDExNTY0LCAxMTYyMywgMTEyMSwgMTE2ODIsIDExNzQxLCAxMTgwMCwgMTE4NTksIDExOTE4LCAxMTk3NywgMTIwMzYsIDEyMDk1LCAxMjE1NCwgMTIyMTMsIDExMjEsIDEyMjcyLCAxMjMzMSwgMTIzOTAsIDEyNDQ5LCAxMjUwOCwgMTI1NjcsIDEyNjI2LCAxMjY4NSwgMTI3NDQsIDEyODAzLCAxMjg2MiwgMTI5MjEsIDEyOTgwLCAxMzAzOSwgMTMwOTgsIDEzMTU3LCAxMzIxNiwgMTEwOTIsIDEzMjc1LCAxMzMzNCwgMTEyMSwgMTMzOTMsIDEzNDUyLCAxMzUxMSwgMTM1NzAsIDEzNjI5LCAxMzY4OCwgMTEyMSwgMTM3NDcsIDEzODA2LCAxMzg2NSwgMTM5MjQsIDEzOTgzLCAxNDA0MiwgMTQxMDEsIDE0MTYwLCAxNDIxOSwgMTIwMzYsIDE0Mjc4LCAxNDMzNywgMTQzOTYsIDE0NDU1LAotCQkJCTE0NTE0LCAxNDU3MywgMTQ2MzIsIDE0NjkxLCAxNDc1MCwgMTQ4MDksIDE0ODY4LCAxNDkyNywgMTQ5ODYsIDE1MDQ1LCAxNTEwNCwgMTUxNjMsIDE1MjIyLCAxNTI4MSwgMTUzNDAsIDEzMTU3LCAxNTM5OSwgMTU0NTgsIDE1NTE3LCAxNTU3NiwgMTU2MzUsIDE1Njk0LCAxNTc1MywgMTEyMSwgMTU4MTIsIDE1ODcxLCAxNTkzMCwgMTU5ODksIDE2MDQ4LCAxNjEwNywgMTYxNjYsIDE2MjI1LCAxNjI4NCwgMTYzNDMsIDE2NDAyLCAxNjQ2MSwgMTY1MjAsIDE2NTc5LCAxNjYzOCwgMTY2OTcsIDE2NzU2LCAxNjgxNSwgMTY4NzQsIDE2OTMzLCAxNjk5MiwgMTcwNTEsIDE3MTEwLCAxNzE2OSwgMTcyMjgsIDE3Mjg3LCAxNzM0NiwgMTc0MDUsIDE3NDY0LCAxNzUyMywgMTc1ODIsIDE3NjQxLCAxNzcwMCwgMTc3NTksIDE3ODE4LCAxNzg3NywgMTc5MzYsIDE3OTk1LCAxODA1NCwgMTEyMSwgMTgxMTMsIDE4MTcyLCAxODIzMSwgMTgyOTAsIDE4MzQ5LCAxODQwOCwgMTg0NjcsIDE4NTI2LCAxODU4NSwgMTIxNTQsIDE4NjQ0LCAxMjIxMywgMTg3MDMsIDE4NzYyLCAxODgyMSwgMTg4ODAsIDE4OTM5LCAxODk5OCwgMTkwNTcsIDE5MTE2LCAxOTE3NSwgMTkyMzQsIDEzMjc1LCAxOTI5MywgMTMzMzQsIDE5MzUyLCAxOTQxMSwgMTk0NzAsIDE5NTI5LCAxOTU4OCwgMTk2NDcsIDE5NzA2LCAxOTc2NSwgMTk4MjQsIDE5ODgzLCAxOTk0MiwgMTEyMSwgMjAwMDEsIDIwMDYwLCAyMDExOSwgMjAxNzgsIDExMjEsIDIwMjM3LCAyMDI5NiwgMjAzNTUsIDExMjEsIDIwNDE0LCAyMDQ3MywgMjA1MzIsIDIwNTkxLCAyMDY1MCwgMjA3MDksIDIwNzY4LCAyMDgyNywgMjA4ODYsIDIwOTQ1fTsKLQotCS8qKgotCSAqIFRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9ICJcMlwyNFwxXDI1XDFcMjZcMVwyN1wxXDI0XDFcMjdcMVwyNVwxXDI0IiArICJcMVwyN1wxXDI0XDFcMzBcMVwyNFwxXDMxXDFcMjRcMlwyN1wxXDI0IiArICJcMVwzMlwzXDI1XDFcMjRcMVwyNVwxXDMzXDJcMjRcMVwzNFwxXDM1IiArICJcMVwzNlwxXDM3XDExXDI1XDFcMjRcNFwyNVwxXDI0XDJcMjVcMVwyNCIgKyAiXDFcMjVcMVw0MFwzXDI1XDFcNDFcMTBcMjRcMVwyN1wxXDQyXDFcMjciICsgIlwxXDI0XDFcNDNcMVwyN1wxXDI0XDFcNDRcM1wyNFwyXDI3XDdcMjQiICsgIlwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1w0MFwyNFwxXDI3IiArICJcMVwyNFwxXDI3XDJcMjRcMVwyN1wxXDI0XDFcNDRcM1wyNFwyXDI3IiArICJcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVwyNCIgKyAiXDFcNDVcMjZcMjRcMVwyN1wxXDQ2XDFcMjdcMVwyNFwxXDQ3XDFcMjciICsgIlwxXDI0XDFcNDRcM1wyNFwyXDI3XDJcMjRcMVw1MFw0XDI0XDFcMzMiICsgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcMjRcMVw0NVwyNFwyNCIgKyAiXDFcNTFcMVw1MlwxXDI3XDFcMjRcMVwyN1wxXDUxXDFcMjRcMVwyNyIgKyAiXDFcMjRcMVw1M1wzXDI0XDJcMjdcMlwyNFwzXDUxXDFcMjRcMVw1MSIgKyAiXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDUxXDFcNDUiICsgIlw0XDUxXDFcMjRcMlw1MVwxXDI0XDFcNTFcMVwyNFwzXDUxXDExXDI0IiArICJcMVwyN1wxXDI0XDFcMjdcMlwyNFwxXDI3XDFcMjRcMVw0NFwzXDI0IiArICJcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IiArICJcMTFcMjRcMVw0NVw0XDI0XDFcNTRcMTdcMjRcMVw1NVwxXDU2XDFcMjciICsgIlwxXDI0XDFcMjdcMVw1NVwxXDI0XDFcMjdcMVwyNFwxXDU3XDNcMjQiICsgIlwyXDI3XDJcMjRcM1w1NVwxXDI0XDFcNTVcMVwzM1wyXDI0XDFcMzQiCi0JCQkJKyAiXDFcMzVcMVwyNFwxXDM3XDExXDU1XDFcMjRcNFw1NVwxXDI0XDJcNTUiICsgIlwxXDI0XDFcNTVcMVwyNFwzXDU1XDExXDI0XDFcMjdcMVwyNFwxXDI3IiArICJcMlwyNFwxXDI3XDFcMjRcMVw0NFwzXDI0XDJcMjdcN1wyNFwxXDMzIiArICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDE2XDI0XDFcNjBcMlwyNCIgKyAiXDFcNjFcMTRcMjRcMVw2MlwxXDYzXDFcMjdcMVwyNFwxXDI3XDFcNjIiICsgIlwxXDI0XDFcMjdcMVwyNFwxXDY0XDNcMjRcMlwyN1wyXDI0XDNcNjIiICsgIlwxXDI0XDFcNjJcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciICsgIlwxMVw2MlwxXDI0XDRcNjJcMVwyNFwyXDYyXDFcNjVcMVw2MlwxXDY2IiArICJcM1w2MlwxMVwyNFwxXDI3XDFcMjRcMVwyN1wyXDI0XDFcMjdcMVwyNCIgKyAiXDFcNDRcM1wyNFwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNSIgKyAiXDFcMjRcMVwzN1wyMVwyNFwxXDY1XDE2XDI0XDFcNjdcMVwyNFwxXDY3IiArICJcMlwyNFwxXDY3XDFcMjRcMVw0NFwxXDcwXDFcMzFcMVwyNFwyXDY3IiArICJcMVwyNFwxXDMyXDVcMjRcMVwzM1wxXDI0XDFcNzBcMVwzNFwxXDM1IiArICJcMVwzNlwxXDM3XDE2XDI0XDFcNzFcMlwyNFwxXDY1XDFcMjRcMVw0MCIgKyAiXDNcMjRcMVw0MVw2XDI0XDFcNzJcMVw3M1wxXDI3XDFcMjRcMVwyNyIgKyAiXDFcNzJcMVwyNFwxXDI3XDFcMjRcMVw3NFwzXDI0XDJcMjdcMlwyNCIgKyAiXDNcNzJcMVwyNFwxXDcyXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNCIgKyAiXDFcMzdcMTFcNzJcMVwyNFw0XDcyXDFcMjRcMlw3MlwxXDI0XDFcNzIiICsgIlwxXDI0XDNcNzJcMTFcMjRcMVwyN1wxXDI0XDFcMjdcMlwyNFwxXDI3IiArICJcMVwyNFwxXDQ0XDNcMjRcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0IiArICJcMVwzNVwxXDI0XDFcMzdcMzBcMjRcMVw3NVwxXDc2XDFcNzdcM1wyNCIKLQkJCQkrICJcMVwxMDBcMVwxMDFcMVwyN1wxXDEwMlwxXDI3XDFcMTAwXDFcMTAzXDFcMjciICsgIlwxXDI0XDFcMTA0XDNcMjRcMlwyN1wyXDI0XDNcMTAwXDFcMjRcMVwxMDAiICsgIlwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVwxMDBcMVwyNCIgKyAiXDRcMTAwXDFcMjRcMlwxMDBcMVwyNFwxXDEwMFwxXDI0XDNcMTAwXDExXDI0IiArICJcMVwyN1wxXDI0XDFcMjdcMlwyNFwxXDI3XDFcMjRcMVw0NFwzXDI0IiArICJcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IiArICJcMzJcMjRcMVw3N1wzXDI0XDFcMTA1XDFcMTA2XDFcMjdcMVwyNFwxXDI3IiArICJcMVwxMDVcMVwyNFwxXDI3XDFcMjRcMVwxMDdcM1wyNFwyXDI3XDJcMjQiICsgIlwzXDEwNVwxXDI0XDFcMTA1XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNCIgKyAiXDFcMzdcMTFcMTA1XDFcMTEwXDRcMTA1XDFcMjRcMlwxMDVcMVwyNFwxXDEwNSIgKyAiXDFcMjRcM1wxMDVcMTFcMjRcMVwyN1wxXDI0XDFcMjdcMlwyNFwxXDI3IiArICJcMVwyNFwxXDQ0XDNcMjRcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0IiArICJcMVwzNVwxXDI0XDFcMzdcMTFcMjRcMVwxMTBcMTFcMjRcMVwxMTFcMTFcMjQiICsgIlwxXDExMlwxXDExM1wxXDExNFwxXDI3XDFcMTE1XDFcMjdcMVwxMTNcMVwxMTYiICsgIlwxXDI3XDFcMTE3XDFcMTIwXDFcMTIxXDFcMTIyXDFcMjRcMlwyN1wxXDI0IiArICJcMVwxMjNcMVwxMjRcMlwxMTNcMVwyNFwxXDExM1wxXDMzXDFcMTI1XDFcMjQiICsgIlwxXDM0XDFcMTI2XDFcMjRcMVwzN1wxMVwxMTNcMVwxMTBcNFwxMTNcMVwxMjciICsgIlwyXDExM1wxXDI0XDFcMTEzXDFcMjRcM1wxMTNcNlwyNFwxXDExMlwxXDExMyIgKyAiXDFcMTE0XDFcMTMwXDFcMTE1XDFcMTMwXDFcMTEzXDFcMTE2XDFcMTMwXDFcMTE3IiArICJcMVwxMjBcMVwxMjFcMVwxMjJcMVwyNFwyXDEzMFwxXDI0XDFcMTIzXDFcMTI0IgotCQkJCSsgIlwyXDExM1wxXDI0XDFcMTEzXDFcMzNcMVwxMjVcMVwyNFwxXDM0XDFcMTI2IiArICJcMVwyNFwxXDM3XDExXDExM1wxXDExMFw0XDExM1wxXDEyN1wyXDExM1wxXDI0IiArICJcMVwxMTNcMVwyNFwzXDExM1w1XDI0XDc0XDBcMlwyNVwxXDEzMVwzXDAiICsgIlwxXDI1XDNcMFwxXDI1XDdcMFwzXDI1XDFcMFwxXDI1XDdcMCIgKyAiXDExXDI1XDFcMFw0XDI1XDFcMFwyXDI1XDFcMFwxXDI1XDFcMCIgKyAiXDNcMjVcNlwwXDFcMTMyXDJcMjVcMVwwXDJcMjVcMVwxMzJcMVwyNSIgKyAiXDFcMFw1XDI1XDJcMFwxNlwyNVwxXDEzMlwyXDI1XDFcMTMyXDJcMjUiICsgIlwxXDEzMlwxMFwyNVwxXDEzMlw0XDI1XDFcMTMyXDdcMjVcNFwwXDFcMjciICsgIlwxXDBcMVwyN1wyXDBcMVwyN1w1XDBcMlwyN1w1M1wwXDJcMjUiICsgIlwxXDEzMVwzXDBcMVwyNVwzXDBcMVwxMzNcN1wwXDNcMjVcMVwwIiArICJcMVwyNVw3XDBcMTFcMjVcMVwwXDRcMjVcMVwwXDJcMjVcMVwwIiArICJcMVwyNVwxXDBcM1wyNVw2XDBcMlwxMzRcMVwxMzVcM1wwXDFcMTM0IiArICJcM1wwXDFcMTM0XDdcMFwzXDEzNFwxXDBcMVwxMzRcN1wwXDExXDEzNCIgKyAiXDFcMFw0XDEzNFwxXDBcMlwxMzRcMVwwXDFcMTM0XDFcMFwzXDEzNCIgKyAiXDZcMFwyXDEzNlwxXDEzN1wzXDBcMVwxMzZcM1wwXDFcMTM2XDdcMCIgKyAiXDNcMTM2XDFcMFwxXDEzNlw3XDBcMTFcMTM2XDFcMFw0XDEzNlwxXDAiICsgIlwyXDEzNlwxXDBcMVwxMzZcMVwwXDNcMTM2XDM2XDBcMVwxNDBcNzZcMCIgKyAiXDFcMTQxXDc0XDBcMlwxNDJcMTBcMFwxXDE0M1wxXDE0NFwxXDE0NVw3XDAiICsgIlwyXDE0NlwxMFwwXDFcMTQ3XDFcMTUwXDNcMFwxXDE0N1wzXDBcMVwxNDciICsgIlw3XDBcM1wxNDdcMVwwXDFcMTQ3XDdcMFwxMVwxNDdcMVwwXDRcMTQ3IiArICJcMVwwXDJcMTQ3XDFcMFwxXDE0N1wxXDBcM1wxNDdcNlwwXDJcMTUxIgotCQkJCSsgIlwxXDE1MlwxXDBcMVwxNTNcMTFcMTUxXDJcMFw1MlwxNTFcMVwwXDJcMTU0IiArICJcMVwxNTVcMVwwXDNcMTU0XDFcMTUzXDZcMTU0XDJcMFw1MlwxNTRcMTNcMCIgKyAiXDFcMTU2XDYwXDBcMlwxNTdcMVwxNjBcMVwwXDFcMTYxXDExXDE1N1wyXDAiICsgIlw1MlwxNTdcMVwwXDJcMTYyXDFcMTYzXDFcMFwzXDE2MlwxXDE2MVw2XDE2MiIgKyAiXDJcMFw1MlwxNjJcMjRcMFwxXDE2NFw0N1wwXDJcNTFcMVwxNjVcM1wwIiArICJcMVw1MVwzXDBcMVw1MVw3XDBcM1w1MVwxXDBcMVw1MVw3XDAiICsgIlwxMVw1MVwxXDBcNFw1MVwxXDBcMlw1MVwxXDBcMVw1MVwxXDAiICsgIlwzXDUxXDZcMFwxXDE2NlwyXDUxXDFcMFwyXDUxXDFcMTY2XDFcNTEiICsgIlwxXDBcNVw1MVwyXDBcMTZcNTFcMVwxNjZcMlw1MVwxXDE2NlwyXDUxIiArICJcMVwxNjZcMTBcNTFcMVwxNjZcNFw1MVwxXDE2Nlw3XDUxXDFcMFwyXDUxIiArICJcMVwxNjVcM1wwXDFcNTFcM1wwXDFcMTY3XDdcMFwzXDUxXDFcMCIgKyAiXDFcNTFcN1wwXDExXDUxXDFcMFw0XDUxXDFcMFwyXDUxXDFcMCIgKyAiXDFcNTFcMVwwXDNcNTFcNlwwXDJcNTVcMVwxNzBcM1wwXDFcNTUiICsgIlwzXDBcMVw1NVw3XDBcM1w1NVwxXDBcMVw1NVw3XDBcMTFcNTUiICsgIlwxXDBcNFw1NVwxXDBcMlw1NVwxXDBcMVw1NVwxXDBcM1w1NSIgKyAiXDZcMFwxXDE3MVwyXDU1XDFcMFwyXDU1XDFcMTcxXDFcNTVcMVwwIiArICJcNVw1NVwyXDBcMTZcNTVcMVwxNzFcMlw1NVwxXDE3MVwyXDU1XDFcMTcxIiArICJcMTBcNTVcMVwxNzFcNFw1NVwxXDE3MVw3XDU1XDFcMFwyXDU1XDFcMTcwIiArICJcM1wwXDFcNTVcM1wwXDFcMTcyXDdcMFwzXDU1XDFcMFwxXDU1IiArICJcN1wwXDExXDU1XDFcMFw0XDU1XDFcMFwyXDU1XDFcMFwxXDU1IiArICJcMVwwXDNcNTVcNlwwXDJcNjJcMVwxNzNcM1wwXDFcNjJcM1wwIgotCQkJCSsgIlwxXDYyXDdcMFwzXDYyXDFcMFwxXDYyXDdcMFwxMVw2MlwxXDAiICsgIlw0XDYyXDFcMFwyXDYyXDFcMFwxXDYyXDFcMFwzXDYyXDZcMCIgKyAiXDFcMTc0XDJcNjJcMVwwXDJcNjJcMVwxNzRcMVw2MlwxXDBcNVw2MiIgKyAiXDJcMFwxNlw2MlwxXDE3NFwyXDYyXDFcMTc0XDJcNjJcMVwxNzRcMTBcNjIiICsgIlwxXDE3NFw0XDYyXDFcMTc0XDdcNjJcMVwwXDJcNjJcMVwxNzNcM1wwIiArICJcMVw2MlwzXDBcMVwxNzVcN1wwXDNcNjJcMVwwXDFcNjJcN1wwIiArICJcMTFcNjJcMVwwXDRcNjJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwIiArICJcM1w2Mlw3XDBcMVw2MlwxXDE3M1wzXDBcMVw2MlwzXDBcMVw2MiIgKyAiXDdcMFwzXDYyXDFcMFwxXDYyXDdcMFwxMVw2MlwxXDBcNFw2MiIgKyAiXDFcMFwyXDYyXDFcMFwxXDYyXDFcMFwzXDYyXDVcMFw0XDE3NiIgKyAiXDFcMTc3XDFcMTc2XDFcMTc3XDJcMTc2XDFcMTc3XDJcMTc2XDFcMFwyXDE3NiIgKyAiXDJcMTc3XDExXDE3NlwxXDBcMjVcMTc2XDFcMFwxMlwxNzZcMVwwXDJcNzIiICsgIlwxXDIwMFwzXDBcMVw3MlwzXDBcMVw3Mlw3XDBcM1w3MlwxXDAiICsgIlwxXDcyXDdcMFwxMVw3MlwxXDBcNFw3MlwxXDBcMlw3MlwxXDAiICsgIlwxXDcyXDFcMFwzXDcyXDZcMFwxXDIwMVwyXDcyXDFcMFwyXDcyIiArICJcMVwyMDFcMVw3MlwxXDBcNVw3MlwyXDBcMTZcNzJcMVwyMDFcMlw3MiIgKyAiXDFcMjAxXDJcNzJcMVwyMDFcMTBcNzJcMVwyMDFcNFw3MlwxXDIwMVw3XDcyIiArICJcMVwwXDJcNzJcMVwyMDBcM1wwXDFcNzJcM1wwXDFcMjAyXDdcMCIgKyAiXDNcNzJcMVwwXDFcNzJcN1wwXDExXDcyXDFcMFw0XDcyXDFcMCIgKyAiXDJcNzJcMVwwXDFcNzJcMVwwXDNcNzJcNzRcMFwxXDc1XDRcMCIgKyAiXDJcMTAwXDFcMjAzXDNcMFwxXDEwMFwzXDBcMVwxMDBcN1wwXDNcMTAwIiArICJcMVwwXDFcMTAwXDdcMFwxMVwxMDBcMVwwXDRcMTAwXDFcMFwyXDEwMCIKLQkJCQkrICJcMVwwXDFcMTAwXDFcMFwzXDEwMFw2XDBcMVwyMDRcMlwxMDBcMVwwIiArICJcMlwxMDBcMVwyMDRcMVwxMDBcMVwwXDVcMTAwXDJcMFwxNlwxMDBcMVwyMDQiICsgIlwyXDEwMFwxXDIwNFwyXDEwMFwxXDIwNFwxMFwxMDBcMVwyMDRcNFwxMDBcMVwyMDQiICsgIlw3XDEwMFwxXDBcMlwyMDVcMVwyMDZcMVwwXDFcMjA3XDExXDIwNVwyXDAiICsgIlw1MlwyMDVcMVwwXDJcMjEwXDFcMjExXDFcMFwzXDIxMFwxXDIwN1w2XDIxMCIgKyAiXDJcMFw1MlwyMTBcMVwwXDJcMTAwXDFcMjAzXDNcMFwxXDEwMFwzXDAiICsgIlwxXDIxMlw3XDBcM1wxMDBcMVwwXDFcMTAwXDdcMFwxMVwxMDBcMVwwIiArICJcNFwxMDBcMVwwXDJcMTAwXDFcMFwxXDEwMFwxXDBcM1wxMDBcNlwwIiArICJcMlwxMDVcMVwyMTNcM1wwXDFcMTA1XDNcMFwxXDEwNVw3XDBcM1wxMDUiICsgIlwxXDBcMVwxMDVcN1wwXDExXDEwNVwxXDBcNFwxMDVcMVwwXDJcMTA1IiArICJcMVwwXDFcMTA1XDFcMFwzXDEwNVw2XDBcMVwyMTRcMlwxMDVcMVwwIiArICJcMlwxMDVcMVwyMTRcMVwxMDVcMVwwXDVcMTA1XDJcMFwxNlwxMDVcMVwyMTQiICsgIlwyXDEwNVwxXDIxNFwyXDEwNVwxXDIxNFwxMFwxMDVcMVwyMTRcNFwxMDVcMVwyMTQiICsgIlw3XDEwNVwxXDBcMlwxMDVcMVwyMTNcM1wwXDFcMTA1XDNcMFwxXDIxNSIgKyAiXDdcMFwzXDEwNVwxXDBcMVwxMDVcN1wwXDExXDEwNVwxXDBcNFwxMDUiICsgIlwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMFwzXDEwNVw2XDBcMVwxMTIiICsgIlwxXDIxNlwxXDIxN1wzXDBcMVwyMTZcM1wwXDFcMjE2XDFcMFwxXDIyMCIgKyAiXDVcMFwzXDIxNlwxXDBcMVwyMTZcN1wwXDExXDIxNlwxXDBcNFwyMTYiICsgIlwxXDBcMlwyMTZcMVwwXDFcMjE2XDFcMFwzXDIxNlw0XDBcMVwyMjEiICsgIlwxXDBcMlwxMTNcMVwyMjJcM1wwXDFcMTEzXDNcMFwxXDExM1w3XDAiCi0JCQkJKyAiXDNcMTEzXDFcMjIzXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMCIgKyAiXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTNcNlwwXDFcMjI0XDJcMTEzIiArICJcMVwwXDJcMTEzXDFcMjI0XDFcMTEzXDFcMFw1XDExM1wyXDBcMTZcMTEzIiArICJcMVwyMjRcMlwxMTNcMVwyMjRcMlwxMTNcMVwyMjRcMTBcMTEzXDFcMjI0XDRcMTEzIiArICJcMVwyMjRcN1wxMTNcMVwwXDJcMjI1XDFcMjI2XDFcMFwxXDIyN1wxMVwyMjUiICsgIlwyXDBcNTJcMjI1XDFcMFwyXDIzMFwxXDIzMVwxXDBcM1wyMzBcMVwyMjciICsgIlw2XDIzMFwyXDBcNTJcMjMwXDFcMFwxXDIzMlwxXDExM1wxXDIyMlwzXDAiICsgIlwxXDExM1wzXDBcMVwyMzNcMVwwXDFcMjIwXDVcMFwzXDExM1wxXDIyMyIgKyAiXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMFwyXDExM1wxXDAiICsgIlwxXDExM1wxXDBcM1wxMTNcNlwwXDFcMTEyXDEzXDBcMVwyMjBcNTZcMCIgKyAiXDFcMjM0XDcyXDBcMlwyMzVcMVwyMzZcM1wwXDFcMjM1XDNcMFwxXDIzNSIgKyAiXDdcMFwzXDIzNVwxXDBcMVwyMzVcN1wwXDExXDIzNVwxXDBcNFwyMzUiICsgIlwxXDBcMlwyMzVcMVwwXDFcMjM1XDFcMFwzXDIzNVw2XDBcMlwxMTMiICsgIlwxXDIyMlwzXDBcMVwxMTNcM1wwXDFcMTEzXDFcMjM3XDZcMFwxXDExMyIgKyAiXDFcMjQwXDFcMTEzXDFcMjIzXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzIiArICJcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTNcMTFcMFwxXDI0MSIgKyAiXDFcMFwxXDI0MVwyXDBcMVwyNDFcNVwwXDJcMjQxXDMwXDBcMVwyNDIiICsgIlwyMVwwXDRcMjQzXDFcMjQ0XDFcMjQzXDFcMjQ0XDJcMjQzXDFcMjQ0XDVcMjQzIiArICJcMlwyNDRcMTJcMjQzXDFcMFwxNFwyNDNcMVwwXDIyXDI0M1wxXDBcMVwyNDUiICsgIlwxXDI1XDFcMTMxXDFcMjVcMVwwXDFcMjVcMVwyNDVcMVwwXDFcMjUiCi0JCQkJKyAiXDFcMFwxXDI1XDNcMFwyXDI1XDJcMFwzXDI1XDFcMFwxXDI1IiArICJcN1wwXDFcMjQ1XDJcMjVcMVwyNDVcMlwyNVwxXDI0NVwyXDI1XDFcMCIgKyAiXDRcMjVcMVwwXDFcMjQ1XDFcMjVcMVwwXDFcMjVcMVwwXDFcMjQ1IiArICJcMlwyNVw2XDBcMlwyNVwxXDEzMVwzXDBcMVwyNVwzXDBcMVwyNSIgKyAiXDdcMFwzXDI1XDFcMFwxXDI1XDJcMFwxXDI0Nlw0XDBcMTFcMjUiICsgIlwxXDBcNFwyNVwxXDBcMlwyNVwxXDBcMVwyNVwxXDBcM1wyNSIgKyAiXDZcMFwxXDI0N1wyXDEzNFwxXDBcMlwxMzRcMVwyNDdcMVwxMzRcMVwwIiArICJcNVwxMzRcMlwwXDE2XDEzNFwxXDI0N1wyXDEzNFwxXDI0N1wyXDEzNFwxXDI0NyIgKyAiXDEwXDEzNFwxXDI0N1w0XDEzNFwxXDI0N1w3XDEzNFwxXDBcMVwyNTBcMlwxMzYiICsgIlwxXDBcMlwxMzZcMVwyNTBcMVwxMzZcMVwwXDVcMTM2XDJcMFwxNlwxMzYiICsgIlwxXDI1MFwyXDEzNlwxXDI1MFwyXDEzNlwxXDI1MFwxMFwxMzZcMVwyNTBcNFwxMzYiICsgIlwxXDI1MFw3XDEzNlwxM1wwXDFcMjUxXDU3XDBcMzVcMTQxXDFcMjUyXDM1XDE0MSIgKyAiXDQxXDBcMVwyNTNcMTAzXDBcMVwyNTRcNjVcMFwyXDI1NVw2NlwwXDJcMjU2IiArICJcMTAzXDBcMVwyNTdcMTdcMFwyXDE0N1wxXDE1MFwzXDBcMVwxNDdcM1wwIiArICJcMVwxNDdcN1wwXDNcMTQ3XDFcMjYwXDFcMTQ3XDdcMFwxMVwxNDdcMVwwIiArICJcNFwxNDdcMVwwXDJcMTQ3XDFcMFwxXDE0N1wxXDBcM1wxNDdcNlwwIiArICJcMVwyNjFcMlwxNDdcMVwwXDJcMTQ3XDFcMjYxXDFcMTQ3XDFcMFw1XDE0NyIgKyAiXDJcMFwxNlwxNDdcMVwyNjFcMlwxNDdcMVwyNjFcMlwxNDdcMVwyNjFcMTBcMTQ3IiArICJcMVwyNjFcNFwxNDdcMVwyNjFcN1wxNDdcMVwwXDFcMjYyXDFcMTUxXDFcMTUyIiArICJcMVwxNTFcMVwyNjNcMVwxNTFcMVwyNjJcMTBcMTUxXDFcMjY0XDE2XDE1MVwxXDI2MiIKLQkJCQkrICJcMlwxNTFcMVwyNjJcMlwxNTFcMVwyNjJcMTBcMTUxXDFcMjYyXDRcMTUxXDFcMjYyIiArICJcN1wxNTFcMVwwXDFcMjY1XDFcMTU0XDFcMTU1XDNcMTU0XDFcMjY1XDFcMjY2IiArICJcN1wxNTRcMVwyNjdcMTZcMTU0XDFcMjY1XDJcMTU0XDFcMjY1XDJcMTU0XDFcMjY1IiArICJcMTBcMTU0XDFcMjY1XDRcMTU0XDFcMjY1XDdcMTU0XDMyXDBcMVwyNDZcNDFcMCIgKyAiXDFcMjcwXDFcMTU3XDFcMTYwXDFcMTU3XDFcMjcxXDFcMTU3XDFcMjcwXDEwXDE1NyIgKyAiXDFcMjcyXDE2XDE1N1wxXDI3MFwyXDE1N1wxXDI3MFwyXDE1N1wxXDI3MFwxMFwxNTciICsgIlwxXDI3MFw0XDE1N1wxXDI3MFw3XDE1N1wxXDBcMVwyNzNcMVwxNjJcMVwxNjMiICsgIlwzXDE2MlwxXDI3M1wxXDI3NFw3XDE2MlwxXDI3NVwxNlwxNjJcMVwyNzNcMlwxNjIiICsgIlwxXDI3M1wyXDE2MlwxXDI3M1wxMFwxNjJcMVwyNzNcNFwxNjJcMVwyNzNcN1wxNjIiICsgIlwyNVwwXDFcMjc2XDQ2XDBcMVwyNzdcMVw1MVwxXDE2NVwxXDUxXDFcMCIgKyAiXDFcNTFcMVwyNzdcMVwwXDFcNTFcMVwwXDFcNTFcM1wwXDJcNTEiICsgIlwyXDBcM1w1MVwxXDBcMVw1MVw3XDBcMVwyNzdcMlw1MVwxXDI3NyIgKyAiXDJcNTFcMVwyNzdcMlw1MVwxXDBcNFw1MVwxXDBcMVwyNzdcMVw1MSIgKyAiXDFcMFwxXDUxXDFcMFwxXDI3N1wyXDUxXDZcMFwyXDUxXDFcMTY1IiArICJcM1wwXDFcNTFcM1wwXDFcNTFcN1wwXDNcNTFcMVwwXDFcNTEiICsgIlwyXDBcMVwyNDZcNFwwXDExXDUxXDFcMFw0XDUxXDFcMFwyXDUxIiArICJcMVwwXDFcNTFcMVwwXDNcNTFcNlwwXDFcMzAwXDFcNTVcMVwxNzAiICsgIlwxXDU1XDFcMFwxXDU1XDFcMzAwXDFcMFwxXDU1XDFcMFwxXDU1IiArICJcM1wwXDJcNTVcMlwwXDNcNTVcMVwwXDFcNTVcN1wwXDFcMzAwIiArICJcMlw1NVwxXDMwMFwyXDU1XDFcMzAwXDJcNTVcMVwwXDRcNTVcMVwwIgotCQkJCSsgIlwxXDMwMFwxXDU1XDFcMFwxXDU1XDFcMFwxXDMwMFwyXDU1XDZcMCIgKyAiXDJcNTVcMVwxNzBcM1wwXDFcNTVcM1wwXDFcNTVcN1wwXDNcNTUiICsgIlwxXDBcMVw1NVwyXDBcMVwyNDZcNFwwXDExXDU1XDFcMFw0XDU1IiArICJcMVwwXDJcNTVcMVwwXDFcNTVcMVwwXDNcNTVcNlwwXDFcMzAxIiArICJcMVw2MlwxXDE3M1wxXDYyXDFcMFwxXDYyXDFcMzAxXDFcMFwxXDYyIiArICJcMVwwXDFcNjJcM1wwXDJcNjJcMlwwXDNcNjJcMVwwXDFcNjIiICsgIlw3XDBcMVwzMDFcMlw2MlwxXDMwMVwyXDYyXDFcMzAxXDJcNjJcMVwwIiArICJcNFw2MlwxXDBcMVwzMDFcMVw2MlwxXDBcMVw2MlwxXDBcMVwzMDEiICsgIlwyXDYyXDZcMFwyXDYyXDFcMTczXDNcMFwxXDYyXDNcMFwxXDYyIiArICJcN1wwXDNcNjJcMVwwXDFcNjJcMlwwXDFcMjQ2XDRcMFwxMVw2MiIgKyAiXDFcMFw0XDYyXDFcMFwyXDYyXDFcMFwxXDYyXDFcMFwzXDYyIiArICJcNlwwXDFcMzAyXDFcNzJcMVwyMDBcMVw3MlwxXDBcMVw3MlwxXDMwMiIgKyAiXDFcMFwxXDcyXDFcMFwxXDcyXDNcMFwyXDcyXDJcMFwzXDcyIiArICJcMVwwXDFcNzJcN1wwXDFcMzAyXDJcNzJcMVwzMDJcMlw3MlwxXDMwMiIgKyAiXDJcNzJcMVwwXDRcNzJcMVwwXDFcMzAyXDFcNzJcMVwwXDFcNzIiICsgIlwxXDBcMVwzMDJcMlw3Mlw2XDBcMlw3MlwxXDIwMFwzXDBcMVw3MiIgKyAiXDNcMFwxXDcyXDdcMFwzXDcyXDFcMFwxXDcyXDJcMFwxXDI0NiIgKyAiXDRcMFwxMVw3MlwxXDBcNFw3MlwxXDBcMlw3MlwxXDBcMVw3MiIgKyAiXDFcMFwzXDcyXDZcMFwxXDMwM1wxXDEwMFwxXDIwM1wxXDEwMFwxXDAiICsgIlwxXDEwMFwxXDMwM1wxXDBcMVwxMDBcMVwwXDFcMTAwXDNcMFwyXDEwMCIgKyAiXDJcMFwzXDEwMFwxXDBcMVwxMDBcN1wwXDFcMzAzXDJcMTAwXDFcMzAzIiArICJcMlwxMDBcMVwzMDNcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXDMwM1wxXDEwMCIKLQkJCQkrICJcMVwwXDFcMTAwXDFcMFwxXDMwM1wyXDEwMFw2XDBcMVwzMDRcMVwyMDUiICsgIlwxXDIwNlwxXDIwNVwxXDMwNVwxXDIwNVwxXDMwNFwxMFwyMDVcMVwzMDZcMTZcMjA1IiArICJcMVwzMDRcMlwyMDVcMVwzMDRcMlwyMDVcMVwzMDRcMTBcMjA1XDFcMzA0XDRcMjA1IiArICJcMVwzMDRcN1wyMDVcMVwwXDFcMzA3XDFcMjEwXDFcMjExXDNcMjEwXDFcMzA3IiArICJcMVwzMTBcN1wyMTBcMVwzMTFcMTZcMjEwXDFcMzA3XDJcMjEwXDFcMzA3XDJcMjEwIiArICJcMVwzMDdcMTBcMjEwXDFcMzA3XDRcMjEwXDFcMzA3XDdcMjEwXDFcMFwyXDEwMCIgKyAiXDFcMjAzXDNcMFwxXDEwMFwzXDBcMVwxMDBcN1wwXDNcMTAwXDFcMCIgKyAiXDFcMTAwXDJcMFwxXDI0Nlw0XDBcMTFcMTAwXDFcMFw0XDEwMFwxXDAiICsgIlwyXDEwMFwxXDBcMVwxMDBcMVwwXDNcMTAwXDZcMFwxXDMxMlwxXDEwNSIgKyAiXDFcMjEzXDFcMTA1XDFcMFwxXDEwNVwxXDMxMlwxXDBcMVwxMDVcMVwwIiArICJcMVwxMDVcM1wwXDJcMTA1XDJcMFwzXDEwNVwxXDBcMVwxMDVcN1wwIiArICJcMVwzMTJcMlwxMDVcMVwzMTJcMlwxMDVcMVwzMTJcMlwxMDVcMVwwXDRcMTA1IiArICJcMVwwXDFcMzEyXDFcMTA1XDFcMFwxXDEwNVwxXDBcMVwzMTJcMlwxMDUiICsgIlw2XDBcMlwxMDVcMVwyMTNcM1wwXDFcMTA1XDNcMFwxXDEwNVw3XDAiICsgIlwzXDEwNVwxXDBcMVwxMDVcMlwwXDFcMjQ2XDRcMFwxMVwxMDVcMVwwIiArICJcNFwxMDVcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDBcM1wxMDVcNlwwIiArICJcMlwyMTZcMVwyMTdcM1wwXDFcMjE2XDNcMFwxXDIxNlw3XDBcM1wyMTYiICsgIlwxXDBcMVwyMTZcN1wwXDExXDIxNlwxXDBcNFwyMTZcMVwwXDJcMjE2IiArICJcMVwwXDFcMjE2XDFcMFwzXDIxNlw2XDBcMVwzMTNcMlwyMTZcMVwwIiArICJcMlwyMTZcMVwzMTNcMVwyMTZcMVwwXDVcMjE2XDJcMFwxNlwyMTZcMVwzMTMiCi0JCQkJKyAiXDJcMjE2XDFcMzEzXDJcMjE2XDFcMzEzXDEwXDIxNlwxXDMxM1w0XDIxNlwxXDMxMyIgKyAiXDdcMjE2XDFcMFwxXDMxNFwxXDExM1wxXDIyMlwxXDExM1wxXDBcMVwxMTMiICsgIlwxXDMxNFwxXDBcMVwxMTNcMVwwXDFcMTEzXDNcMFwyXDExM1wyXDAiICsgIlwzXDExM1wxXDIyM1wxXDExM1w3XDBcMVwzMTRcMlwxMTNcMVwzMTRcMlwxMTMiICsgIlwxXDMxNFwyXDExM1wxXDBcNFwxMTNcMVwwXDFcMzE0XDFcMTEzXDFcMCIgKyAiXDFcMTEzXDFcMFwxXDMxNFwyXDExM1w2XDBcMVwzMTVcMVwyMjVcMVwyMjYiICsgIlwxXDIyNVwxXDMxNlwxXDIyNVwxXDMxNVwxMFwyMjVcMVwzMTdcMTZcMjI1XDFcMzE1IiArICJcMlwyMjVcMVwzMTVcMlwyMjVcMVwzMTVcMTBcMjI1XDFcMzE1XDRcMjI1XDFcMzE1IiArICJcN1wyMjVcMVwwXDFcMzIwXDFcMjMwXDFcMjMxXDNcMjMwXDFcMzIwXDFcMzIxIiArICJcN1wyMzBcMVwzMjJcMTZcMjMwXDFcMzIwXDJcMjMwXDFcMzIwXDJcMjMwXDFcMzIwIiArICJcMTBcMjMwXDFcMzIwXDRcMjMwXDFcMzIwXDdcMjMwXDFcMFwxXDIzMlwxXDExMyIgKyAiXDFcMjIyXDNcMFwxXDExM1wzXDBcMVwxMTNcMVwwXDFcMjIwXDVcMCIgKyAiXDNcMTEzXDFcMjIzXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMCIgKyAiXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTNcNFwwXDFcMjIxXDFcMCIgKyAiXDJcMTEzXDFcMjIyXDNcMFwxXDExM1wzXDBcMVwxMTNcN1wwXDNcMTEzIiArICJcMVwyMjNcMVwxMTNcMlwwXDFcMjQ2XDRcMFwxMVwxMTNcMVwwXDRcMTEzIiArICJcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTNcNlwwXDFcMjM0IiArICJcMVwyMTZcMVwyMTdcM1wwXDFcMjE2XDNcMFwxXDIxNlw3XDBcM1wyMTYiICsgIlwxXDBcMVwyMTZcN1wwXDExXDIxNlwxXDBcNFwyMTZcMVwwXDJcMjE2IiArICJcMVwwXDFcMjE2XDFcMFwzXDIxNlw0XDBcMVwyMjFcMVwwXDFcMzIzIgotCQkJCSsgIlwyXDIzNVwxXDBcMlwyMzVcMVwzMjNcMVwyMzVcMVwwXDVcMjM1XDJcMCIgKyAiXDE2XDIzNVwxXDMyM1wyXDIzNVwxXDMyM1wyXDIzNVwxXDMyM1wxMFwyMzVcMVwzMjMiICsgIlw0XDIzNVwxXDMyM1w3XDIzNVwxXDBcMVwzMjRcNVwwXDFcMzI0XDExXDAiICsgIlwxXDMyNFw1XDBcMVwzMjRcN1wwXDJcMzI0XDFcMFwyXDMyNFwxXDAiICsgIlwyXDMyNFw3XDBcMlwzMjRcM1wwXDJcMzI0XDdcMFwyXDExM1wxXDIyMiIgKyAiXDNcMFwxXDExM1wzXDBcMVwxMTNcN1wwXDJcMTEzXDFcMzI1XDFcMjIzIiArICJcMVwxMTNcN1wwXDExXDExM1wxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMCIgKyAiXDFcMTEzXDFcMFwzXDExM1w1N1wwXDFcMzI2XDIxXDBcMVwzMjdcMVwyNSIgKyAiXDFcMTMxXDFcMjVcMVwwXDFcMjVcMVwzMjdcMVwwXDFcMjVcMVwwIiArICJcMVwyNVwzXDBcMlwyNVwyXDBcM1wyNVwxXDBcMVwyNVw3XDAiICsgIlwxXDMyN1wyXDI1XDFcMzI3XDJcMjVcMVwzMjdcMlwyNVwxXDBcNFwyNSIgKyAiXDFcMFwxXDMyN1wxXDI1XDFcMFwxXDI1XDFcMFwxXDMyN1wyXDI1IiArICJcNlwwXDFcMzMwXDFcMTM0XDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXDMzMCIgKyAiXDFcMFwxXDEzNFwxXDBcMVwxMzRcM1wwXDJcMTM0XDJcMFwzXDEzNCIgKyAiXDFcMFwxXDEzNFw3XDBcMVwzMzBcMlwxMzRcMVwzMzBcMlwxMzRcMVwzMzAiICsgIlwyXDEzNFwxXDBcNFwxMzRcMVwwXDFcMzMwXDFcMTM0XDFcMFwxXDEzNCIgKyAiXDFcMFwxXDMzMFwyXDEzNFw2XDBcMVwzMzFcMVwxMzZcMVwxMzdcMVwxMzYiICsgIlwxXDBcMVwxMzZcMVwzMzFcMVwwXDFcMTM2XDFcMFwxXDEzNlwzXDAiICsgIlwyXDEzNlwyXDBcM1wxMzZcMVwwXDFcMTM2XDdcMFwxXDMzMVwyXDEzNiIgKyAiXDFcMzMxXDJcMTM2XDFcMzMxXDJcMTM2XDFcMFw0XDEzNlwxXDBcMVwzMzEiCi0JCQkJKyAiXDFcMTM2XDFcMFwxXDEzNlwxXDBcMVwzMzFcMlwxMzZcMjBcMFwxXDMzMiIgKyAiXDU3XDBcMzRcMTQxXDFcMzMzXDFcMjUyXDM1XDE0MVw0MlwwXDJcMzM0XDEwMlwwIiArICJcMVwzMzVcNzVcMFwyXDMzNlw3NFwwXDFcMzM3XDc2XDBcMVwzNDBcN1wwIiArICJcMVwzNDFcMVwzNDJcMVwyNjBcMVwwXDFcMjYwXDFcMzQxXDFcMFwxXDI2MCIgKyAiXDFcMFwxXDM0MVwzXDBcMlwyNjBcMlwwXDNcMzQxXDFcMFwxXDM0MSIgKyAiXDdcMFwxMVwzNDFcMVwwXDRcMzQxXDFcMFwyXDM0MVwxXDBcMVwzNDEiICsgIlwxXDBcM1wzNDFcNlwwXDFcMzQzXDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMCIgKyAiXDFcMTQ3XDFcMzQzXDFcMFwxXDE0N1wxXDBcMVwxNDdcM1wwXDJcMTQ3IiArICJcMlwwXDNcMTQ3XDFcMjYwXDFcMTQ3XDdcMFwxXDM0M1wyXDE0N1wxXDM0MyIgKyAiXDJcMTQ3XDFcMzQzXDJcMTQ3XDFcMFw0XDE0N1wxXDBcMVwzNDNcMVwxNDciICsgIlwxXDBcMVwxNDdcMVwwXDFcMzQzXDJcMTQ3XDZcMFwxXDM0NFwxXDE1MSIgKyAiXDFcMTUyXDFcMTUxXDFcMTUzXDFcMTUxXDFcMzQ0XDI3XDE1MVwxXDM0NFwyXDE1MSIgKyAiXDFcMzQ0XDJcMTUxXDFcMzQ0XDEwXDE1MVwxXDM0NFw0XDE1MVwxXDM0NFw3XDE1MSIgKyAiXDFcMFwyXDE1MVwxXDE1MlwxXDBcMVwxNTNcMTJcMTUxXDFcMFw1MlwxNTEiICsgIlwxXDBcMVwzNDVcMVwxNTRcMVwxNTVcM1wxNTRcMVwzNDVcMVwxNTNcMjZcMTU0IiArICJcMVwzNDVcMlwxNTRcMVwzNDVcMlwxNTRcMVwzNDVcMTBcMTU0XDFcMzQ1XDRcMTU0IiArICJcMVwzNDVcN1wxNTRcMVwwXDJcMTU0XDFcMTU1XDFcMFwzXDE1NFwxXDE1MyIgKyAiXDdcMTU0XDFcMFw1MlwxNTRcMVwwXDFcMzQ2XDFcMTU3XDFcMTYwXDFcMTU3IiArICJcMVwxNjFcMVwxNTdcMVwzNDZcMjdcMTU3XDFcMzQ2XDJcMTU3XDFcMzQ2XDJcMTU3IgotCQkJCSsgIlwxXDM0NlwxMFwxNTdcMVwzNDZcNFwxNTdcMVwzNDZcN1wxNTdcMVwwXDJcMTU3IiArICJcMVwxNjBcMVwwXDFcMTYxXDEyXDE1N1wxXDBcNTJcMTU3XDFcMFwxXDM0NyIgKyAiXDFcMTYyXDFcMTYzXDNcMTYyXDFcMzQ3XDFcMTYxXDI2XDE2MlwxXDM0N1wyXDE2MiIgKyAiXDFcMzQ3XDJcMTYyXDFcMzQ3XDEwXDE2MlwxXDM0N1w0XDE2MlwxXDM0N1w3XDE2MiIgKyAiXDFcMFwyXDE2MlwxXDE2M1wxXDBcM1wxNjJcMVwxNjFcN1wxNjJcMVwwIiArICJcNTJcMTYyXDI2XDBcMVwzNTBcNDVcMFwxXDM1MVwxXDUxXDFcMTY1XDFcNTEiICsgIlwxXDBcMVw1MVwxXDM1MVwxXDBcMVw1MVwxXDBcMVw1MVwzXDAiICsgIlwyXDUxXDJcMFwzXDUxXDFcMFwxXDUxXDdcMFwxXDM1MVwyXDUxIiArICJcMVwzNTFcMlw1MVwxXDM1MVwyXDUxXDFcMFw0XDUxXDFcMFwxXDM1MSIgKyAiXDFcNTFcMVwwXDFcNTFcMVwwXDFcMzUxXDJcNTFcNlwwXDFcMzUyIiArICJcMVw1NVwxXDE3MFwxXDU1XDFcMFwxXDU1XDFcMzUyXDFcMFwxXDU1IiArICJcMVwwXDFcNTVcM1wwXDJcNTVcMlwwXDNcNTVcMVwwXDFcNTUiICsgIlw3XDBcMVwzNTJcMlw1NVwxXDM1MlwyXDU1XDFcMzUyXDJcNTVcMVwwIiArICJcNFw1NVwxXDBcMVwzNTJcMVw1NVwxXDBcMVw1NVwxXDBcMVwzNTIiICsgIlwyXDU1XDZcMFwxXDM1M1wxXDYyXDFcMTczXDFcNjJcMVwwXDFcNjIiICsgIlwxXDM1M1wxXDBcMVw2MlwxXDBcMVw2MlwzXDBcMlw2MlwyXDAiICsgIlwzXDYyXDFcMFwxXDYyXDdcMFwxXDM1M1wyXDYyXDFcMzUzXDJcNjIiICsgIlwxXDM1M1wyXDYyXDFcMFw0XDYyXDFcMFwxXDM1M1wxXDYyXDFcMCIgKyAiXDFcNjJcMVwwXDFcMzUzXDJcNjJcNlwwXDFcMzU0XDFcNzJcMVwyMDAiICsgIlwxXDcyXDFcMFwxXDcyXDFcMzU0XDFcMFwxXDcyXDFcMFwxXDcyIiArICJcM1wwXDJcNzJcMlwwXDNcNzJcMVwwXDFcNzJcN1wwXDFcMzU0IgotCQkJCSsgIlwyXDcyXDFcMzU0XDJcNzJcMVwzNTRcMlw3MlwxXDBcNFw3MlwxXDAiICsgIlwxXDM1NFwxXDcyXDFcMFwxXDcyXDFcMFwxXDM1NFwyXDcyXDZcMCIgKyAiXDFcMzU1XDFcMTAwXDFcMjAzXDFcMTAwXDFcMFwxXDEwMFwxXDM1NVwxXDAiICsgIlwxXDEwMFwxXDBcMVwxMDBcM1wwXDJcMTAwXDJcMFwzXDEwMFwxXDAiICsgIlwxXDEwMFw3XDBcMVwzNTVcMlwxMDBcMVwzNTVcMlwxMDBcMVwzNTVcMlwxMDAiICsgIlwxXDBcNFwxMDBcMVwwXDFcMzU1XDFcMTAwXDFcMFwxXDEwMFwxXDAiICsgIlwxXDM1NVwyXDEwMFw2XDBcMVwzNTZcMVwyMDVcMVwyMDZcMVwyMDVcMVwyMDciICsgIlwxXDIwNVwxXDM1NlwyN1wyMDVcMVwzNTZcMlwyMDVcMVwzNTZcMlwyMDVcMVwzNTYiICsgIlwxMFwyMDVcMVwzNTZcNFwyMDVcMVwzNTZcN1wyMDVcMVwwXDJcMjA1XDFcMjA2IiArICJcMVwwXDFcMjA3XDEyXDIwNVwxXDBcNTJcMjA1XDFcMFwxXDM1N1wxXDIxMCIgKyAiXDFcMjExXDNcMjEwXDFcMzU3XDFcMjA3XDI2XDIxMFwxXDM1N1wyXDIxMFwxXDM1NyIgKyAiXDJcMjEwXDFcMzU3XDEwXDIxMFwxXDM1N1w0XDIxMFwxXDM1N1w3XDIxMFwxXDAiICsgIlwyXDIxMFwxXDIxMVwxXDBcM1wyMTBcMVwyMDdcN1wyMTBcMVwwXDUyXDIxMCIgKyAiXDFcMFwxXDM2MFwxXDEwNVwxXDIxM1wxXDEwNVwxXDBcMVwxMDVcMVwzNjAiICsgIlwxXDBcMVwxMDVcMVwwXDFcMTA1XDNcMFwyXDEwNVwyXDBcM1wxMDUiICsgIlwxXDBcMVwxMDVcN1wwXDFcMzYwXDJcMTA1XDFcMzYwXDJcMTA1XDFcMzYwIiArICJcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXDM2MFwxXDEwNVwxXDBcMVwxMDUiICsgIlwxXDBcMVwzNjBcMlwxMDVcNlwwXDFcMzYxXDFcMjE2XDFcMjE3XDFcMjE2IiArICJcMVwwXDFcMjE2XDFcMzYxXDFcMFwxXDIxNlwxXDBcMVwyMTZcM1wwIiArICJcMlwyMTZcMlwwXDNcMjE2XDFcMFwxXDIxNlw3XDBcMVwzNjFcMlwyMTYiCi0JCQkJKyAiXDFcMzYxXDJcMjE2XDFcMzYxXDJcMjE2XDFcMFw0XDIxNlwxXDBcMVwzNjEiICsgIlwxXDIxNlwxXDBcMVwyMTZcMVwwXDFcMzYxXDJcMjE2XDZcMFwxXDM2MiIgKyAiXDFcMTEzXDFcMjIyXDFcMTEzXDFcMFwxXDExM1wxXDM2MlwxXDBcMVwxMTMiICsgIlwxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMFwzXDExM1wxXDIyM1wxXDExMyIgKyAiXDdcMFwxXDM2MlwyXDExM1wxXDM2MlwyXDExM1wxXDM2MlwyXDExM1wxXDAiICsgIlw0XDExM1wxXDBcMVwzNjJcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXDM2MiIgKyAiXDJcMTEzXDZcMFwxXDM2M1wxXDIyNVwxXDIyNlwxXDIyNVwxXDIyN1wxXDIyNSIgKyAiXDFcMzYzXDI3XDIyNVwxXDM2M1wyXDIyNVwxXDM2M1wyXDIyNVwxXDM2M1wxMFwyMjUiICsgIlwxXDM2M1w0XDIyNVwxXDM2M1w3XDIyNVwxXDBcMlwyMjVcMVwyMjZcMVwwIiArICJcMVwyMjdcMTJcMjI1XDFcMFw1MlwyMjVcMVwwXDFcMzY0XDFcMjMwXDFcMjMxIiArICJcM1wyMzBcMVwzNjRcMVwyMjdcMjZcMjMwXDFcMzY0XDJcMjMwXDFcMzY0XDJcMjMwIiArICJcMVwzNjRcMTBcMjMwXDFcMzY0XDRcMjMwXDFcMzY0XDdcMjMwXDFcMFwyXDIzMCIgKyAiXDFcMjMxXDFcMFwzXDIzMFwxXDIyN1w3XDIzMFwxXDBcNTJcMjMwXDFcMCIgKyAiXDFcMzY1XDFcMjM1XDFcMjM2XDFcMjM1XDFcMFwxXDIzNVwxXDM2NVwxXDAiICsgIlwxXDIzNVwxXDBcMVwyMzVcM1wwXDJcMjM1XDJcMFwzXDIzNVwxXDAiICsgIlwxXDIzNVw3XDBcMVwzNjVcMlwyMzVcMVwzNjVcMlwyMzVcMVwzNjVcMlwyMzUiICsgIlwxXDBcNFwyMzVcMVwwXDFcMzY1XDFcMjM1XDFcMFwxXDIzNVwxXDAiICsgIlwxXDM2NVwyXDIzNVw2XDBcMVwzNjZcNVwwXDFcMzY2XDNcMFwxXDM2NyIgKyAiXDVcMFwxXDM2Nlw1XDBcMVwzNjZcN1wwXDJcMzY2XDFcMFwyXDM2NiIgKyAiXDFcMFwyXDM2Nlw3XDBcMlwzNjZcM1wwXDJcMzY2XDdcMFwyXDExMyIKLQkJCQkrICJcMVwyMjJcM1wwXDFcMTEzXDNcMFwxXDExM1w3XDBcM1wxMTNcMVwzNzAiICsgIlwxXDExM1w3XDBcMTFcMTEzXDFcMFw0XDExM1wxXDBcMlwxMTNcMVwwIiArICJcMVwxMTNcMVwwXDNcMTEzXDYwXDBcMVwzNzFcMjBcMFwxXDM3MlwxXDI1IiArICJcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXDM3MlwxXDBcMVwyNVwxXDAiICsgIlwxXDI1XDNcMFwyXDI1XDJcMFwzXDI1XDFcMFwxXDI1XDdcMCIgKyAiXDFcMzcyXDJcMjVcMVwzNzJcMlwyNVwxXDM3MlwyXDI1XDFcMFw0XDI1IiArICJcMVwwXDFcMzcyXDFcMjVcMVwwXDFcMjVcMVwwXDFcMzcyXDJcMjUiICsgIlw2XDBcMVwzNzNcMVwxMzRcMVwxMzVcMVwxMzRcMVwwXDFcMTM0XDFcMzczIiArICJcMVwwXDFcMTM0XDFcMFwxXDEzNFwzXDBcMlwxMzRcMlwwXDNcMTM0IiArICJcMVwwXDFcMTM0XDdcMFwxXDM3M1wyXDEzNFwxXDM3M1wyXDEzNFwxXDM3MyIgKyAiXDJcMTM0XDFcMFw0XDEzNFwxXDBcMVwzNzNcMVwxMzRcMVwwXDFcMTM0IiArICJcMVwwXDFcMzczXDJcMTM0XDZcMFwxXDM3NFwxXDEzNlwxXDEzN1wxXDEzNiIgKyAiXDFcMFwxXDEzNlwxXDM3NFwxXDBcMVwxMzZcMVwwXDFcMTM2XDNcMCIgKyAiXDJcMTM2XDJcMFwzXDEzNlwxXDBcMVwxMzZcN1wwXDFcMzc0XDJcMTM2IiArICJcMVwzNzRcMlwxMzZcMVwzNzRcMlwxMzZcMVwwXDRcMTM2XDFcMFwxXDM3NCIgKyAiXDFcMTM2XDFcMFwxXDEzNlwxXDBcMVwzNzRcMlwxMzZcMzFcMFwxXDM3NSIgKyAiXDEyMlwwXDFcMzc2XDY3XDBcMVwzNzdcNjZcMFwyXHUwMTAwXDczXDBcMVx1MDEwMSIgKyAiXDI0XDBcMlwzNDFcMVwzNDJcMVx1MDEwMlwxXDBcMVx1MDEwMlwxXDM0MVwxXDAiICsgIlwxXHUwMTAyXDFcdTAxMDNcMVwzNDFcM1wwXDJcdTAxMDJcMlwwXDNcMzQxXDFcMCIgKyAiXDFcMzQxXDdcMFwxMVwzNDFcMVwwXDRcMzQxXDFcMFwyXDM0MVwxXDAiCi0JCQkJKyAiXDFcMzQxXDFcMFwzXDM0MVw2XDBcMVx1MDEwNFwyXDM0MVwxXDBcMlwzNDEiICsgIlwxXHUwMTA0XDFcMzQxXDFcMFw1XDM0MVwyXDBcMTZcMzQxXDFcdTAxMDRcMlwzNDEiICsgIlwxXHUwMTA0XDJcMzQxXDFcdTAxMDRcMTBcMzQxXDFcdTAxMDRcNFwzNDFcMVx1MDEwNFw3XDM0MSIgKyAiXDFcMFwxXHUwMTA1XDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTA1IiArICJcMVwwXDFcMTQ3XDFcMFwxXDE0N1wzXDBcMlwxNDdcMlwwXDNcMTQ3IiArICJcMVwyNjBcMVwxNDdcN1wwXDFcdTAxMDVcMlwxNDdcMVx1MDEwNVwyXDE0N1wxXHUwMTA1IiArICJcMlwxNDdcMVwwXDRcMTQ3XDFcMFwxXHUwMTA1XDFcMTQ3XDFcMFwxXDE0NyIgKyAiXDFcMFwxXHUwMTA1XDJcMTQ3XDZcMFwxXHUwMTA2XDFcMTUxXDFcMTUyXDFcMTUxIiArICJcMVwxNTNcMVwxNTFcMVx1MDEwNlwyN1wxNTFcMVx1MDEwNlwyXDE1MVwxXHUwMTA2XDJcMTUxIiArICJcMVx1MDEwNlwxMFwxNTFcMVx1MDEwNlw0XDE1MVwxXHUwMTA2XDdcMTUxXDFcMFwxXHUwMTA3IiArICJcMVwxNTRcMVwxNTVcM1wxNTRcMVx1MDEwN1wxXDE1M1wyNlwxNTRcMVx1MDEwN1wyXDE1NCIgKyAiXDFcdTAxMDdcMlwxNTRcMVx1MDEwN1wxMFwxNTRcMVx1MDEwN1w0XDE1NFwxXHUwMTA3XDdcMTU0IiArICJcMVwwXDFcdTAxMDhcMVwxNTdcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDEwOCIgKyAiXDI3XDE1N1wxXHUwMTA4XDJcMTU3XDFcdTAxMDhcMlwxNTdcMVx1MDEwOFwxMFwxNTdcMVx1MDEwOCIgKyAiXDRcMTU3XDFcdTAxMDhcN1wxNTdcMVwwXDFcdTAxMDlcMVwxNjJcMVwxNjNcM1wxNjIiICsgIlwxXHUwMTA5XDFcMTYxXDI2XDE2MlwxXHUwMTA5XDJcMTYyXDFcdTAxMDlcMlwxNjJcMVx1MDEwOSIgKyAiXDEwXDE2MlwxXHUwMTA5XDRcMTYyXDFcdTAxMDlcN1wxNjJcMVwwXDJcdTAxMGFcMVx1MDEwYiIKLQkJCQkrICJcMVwzNTBcMVx1MDEwY1wxXDM1MFwxXHUwMTBhXDFcdTAxMGRcMVwzNTBcMVx1MDEwZVw0XHUwMTBhIiArICJcMlwzNTBcNVx1MDEwYVwxXDBcNDRcdTAxMGFcMVwwXDFcdTAxMGZcMVw1MVwxXDE2NSIgKyAiXDFcNTFcMVwwXDFcNTFcMVx1MDEwZlwxXDBcMVw1MVwxXDBcMVw1MSIgKyAiXDNcMFwyXDUxXDJcMFwzXDUxXDFcMFwxXDUxXDdcMFwxXHUwMTBmIiArICJcMlw1MVwxXHUwMTBmXDJcNTFcMVx1MDEwZlwyXDUxXDFcMFw0XDUxXDFcMCIgKyAiXDFcdTAxMGZcMVw1MVwxXDBcMVw1MVwxXDBcMVx1MDEwZlwyXDUxXDZcMCIgKyAiXDFcdTAxMTBcMVw1NVwxXDE3MFwxXDU1XDFcMFwxXDU1XDFcdTAxMTBcMVwwIiArICJcMVw1NVwxXDBcMVw1NVwzXDBcMlw1NVwyXDBcM1w1NVwxXDAiICsgIlwxXDU1XDdcMFwxXHUwMTEwXDJcNTVcMVx1MDExMFwyXDU1XDFcdTAxMTBcMlw1NSIgKyAiXDFcMFw0XDU1XDFcMFwxXHUwMTEwXDFcNTVcMVwwXDFcNTVcMVwwIiArICJcMVx1MDExMFwyXDU1XDZcMFwxXHUwMTExXDFcNjJcMVwxNzNcMVw2MlwxXDAiICsgIlwxXDYyXDFcdTAxMTFcMVwwXDFcNjJcMVwwXDFcNjJcM1wwXDJcNjIiICsgIlwyXDBcM1w2MlwxXDBcMVw2Mlw3XDBcMVx1MDExMVwyXDYyXDFcdTAxMTEiICsgIlwyXDYyXDFcdTAxMTFcMlw2MlwxXDBcNFw2MlwxXDBcMVx1MDExMVwxXDYyIiArICJcMVwwXDFcNjJcMVwwXDFcdTAxMTFcMlw2Mlw2XDBcMVx1MDExMlwxXDcyIiArICJcMVwyMDBcMVw3MlwxXDBcMVw3MlwxXHUwMTEyXDFcMFwxXDcyXDFcMCIgKyAiXDFcNzJcM1wwXDJcNzJcMlwwXDNcNzJcMVwwXDFcNzJcN1wwIiArICJcMVx1MDExMlwyXDcyXDFcdTAxMTJcMlw3MlwxXHUwMTEyXDJcNzJcMVwwXDRcNzIiICsgIlwxXDBcMVx1MDExMlwxXDcyXDFcMFwxXDcyXDFcMFwxXHUwMTEyXDJcNzIiICsgIlw2XDBcMVx1MDExM1wxXDEwMFwxXDIwM1wxXDEwMFwxXDBcMVwxMDBcMVx1MDExMyIKLQkJCQkrICJcMVwwXDFcMTAwXDFcMFwxXDEwMFwzXDBcMlwxMDBcMlwwXDNcMTAwIiArICJcMVwwXDFcMTAwXDdcMFwxXHUwMTEzXDJcMTAwXDFcdTAxMTNcMlwxMDBcMVx1MDExMyIgKyAiXDJcMTAwXDFcMFw0XDEwMFwxXDBcMVx1MDExM1wxXDEwMFwxXDBcMVwxMDAiICsgIlwxXDBcMVx1MDExM1wyXDEwMFw2XDBcMVx1MDExNFwxXDIwNVwxXDIwNlwxXDIwNSIgKyAiXDFcMjA3XDFcMjA1XDFcdTAxMTRcMjdcMjA1XDFcdTAxMTRcMlwyMDVcMVx1MDExNFwyXDIwNSIgKyAiXDFcdTAxMTRcMTBcMjA1XDFcdTAxMTRcNFwyMDVcMVx1MDExNFw3XDIwNVwxXDBcMVx1MDExNSIgKyAiXDFcMjEwXDFcMjExXDNcMjEwXDFcdTAxMTVcMVwyMDdcMjZcMjEwXDFcdTAxMTVcMlwyMTAiICsgIlwxXHUwMTE1XDJcMjEwXDFcdTAxMTVcMTBcMjEwXDFcdTAxMTVcNFwyMTBcMVx1MDExNVw3XDIxMCIgKyAiXDFcMFwxXHUwMTE2XDFcMTA1XDFcMjEzXDFcMTA1XDFcMFwxXDEwNVwxXHUwMTE2IiArICJcMVwwXDFcMTA1XDFcMFwxXDEwNVwzXDBcMlwxMDVcMlwwXDNcMTA1IiArICJcMVwwXDFcMTA1XDdcMFwxXHUwMTE2XDJcMTA1XDFcdTAxMTZcMlwxMDVcMVx1MDExNiIgKyAiXDJcMTA1XDFcMFw0XDEwNVwxXDBcMVx1MDExNlwxXDEwNVwxXDBcMVwxMDUiICsgIlwxXDBcMVx1MDExNlwyXDEwNVw2XDBcMVx1MDExN1wxXDIxNlwxXDIxN1wxXDIxNiIgKyAiXDFcMFwxXDIxNlwxXHUwMTE3XDFcMFwxXDIxNlwxXDBcMVwyMTZcM1wwIiArICJcMlwyMTZcMlwwXDNcMjE2XDFcMFwxXDIxNlw3XDBcMVx1MDExN1wyXDIxNiIgKyAiXDFcdTAxMTdcMlwyMTZcMVx1MDExN1wyXDIxNlwxXDBcNFwyMTZcMVwwXDFcdTAxMTciICsgIlwxXDIxNlwxXDBcMVwyMTZcMVwwXDFcdTAxMTdcMlwyMTZcNlwwXDFcdTAxMTgiICsgIlwxXDExM1wxXDIyMlwxXDExM1wxXDBcMVwxMTNcMVx1MDExOFwxXDBcMVwxMTMiCi0JCQkJKyAiXDFcMFwxXDExM1wzXDBcMlwxMTNcMlwwXDNcMTEzXDFcMjIzXDFcMTEzIiArICJcN1wwXDFcdTAxMThcMlwxMTNcMVx1MDExOFwyXDExM1wxXHUwMTE4XDJcMTEzXDFcMCIgKyAiXDRcMTEzXDFcMFwxXHUwMTE4XDFcMTEzXDFcMFwxXDExM1wxXDBcMVx1MDExOCIgKyAiXDJcMTEzXDZcMFwxXHUwMTE5XDFcMjI1XDFcMjI2XDFcMjI1XDFcMjI3XDFcMjI1IiArICJcMVx1MDExOVwyN1wyMjVcMVx1MDExOVwyXDIyNVwxXHUwMTE5XDJcMjI1XDFcdTAxMTlcMTBcMjI1IiArICJcMVx1MDExOVw0XDIyNVwxXHUwMTE5XDdcMjI1XDFcMFwxXHUwMTFhXDFcMjMwXDFcMjMxIiArICJcM1wyMzBcMVx1MDExYVwxXDIyN1wyNlwyMzBcMVx1MDExYVwyXDIzMFwxXHUwMTFhXDJcMjMwIiArICJcMVx1MDExYVwxMFwyMzBcMVx1MDExYVw0XDIzMFwxXHUwMTFhXDdcMjMwXDFcMFwxXHUwMTFiIiArICJcMVwyMzVcMVwyMzZcMVwyMzVcMVwwXDFcMjM1XDFcdTAxMWJcMVwwXDFcMjM1IiArICJcMVwwXDFcMjM1XDNcMFwyXDIzNVwyXDBcM1wyMzVcMVwwXDFcMjM1IiArICJcN1wwXDFcdTAxMWJcMlwyMzVcMVx1MDExYlwyXDIzNVwxXHUwMTFiXDJcMjM1XDFcMCIgKyAiXDRcMjM1XDFcMFwxXHUwMTFiXDFcMjM1XDFcMFwxXDIzNVwxXDBcMVx1MDExYiIgKyAiXDJcMjM1XDZcMFwxXHUwMTFjXDVcMFwxXHUwMTFjXDNcMFwxXDM2N1w1XDAiICsgIlwxXHUwMTFjXDVcMFwxXHUwMTFjXDdcMFwyXHUwMTFjXDFcMFwyXHUwMTFjXDFcMCIgKyAiXDJcdTAxMWNcN1wwXDJcdTAxMWNcM1wwXDJcdTAxMWNcN1wwXDFcdTAxMWRcNVwwIiArICJcMVx1MDExZFwxMVwwXDFcdTAxMWRcNVwwXDFcdTAxMWRcN1wwXDJcdTAxMWRcMVwwIiArICJcMlx1MDExZFwxXDBcMlx1MDExZFw3XDBcMlx1MDExZFwzXDBcMlx1MDExZFw3XDAiICsgIlwyXHUwMTFlXDFcdTAxMWZcMVx1MDEyMFwxXHUwMTIxXDFcdTAxMjBcMVx1MDExZVwxXHUwMTIyXDFcdTAxMjAiCi0JCQkJKyAiXDFcdTAxMjNcNFx1MDExZVwyXHUwMTIwXDVcdTAxMWVcMVwwXDQ0XHUwMTFlXDU0XDBcMVx1MDEyNCIgKyAiXDE3XDBcMVx1MDEyNVwxXDI1XDFcMTMxXDFcMjVcMVwwXDFcMjVcMVx1MDEyNSIgKyAiXDFcMFwxXDI1XDFcMFwxXDI1XDNcMFwyXDI1XDJcMFwzXDI1IiArICJcMVwwXDFcMjVcN1wwXDFcdTAxMjVcMlwyNVwxXHUwMTI1XDJcMjVcMVx1MDEyNSIgKyAiXDJcMjVcMVwwXDRcMjVcMVwwXDFcdTAxMjVcMVwyNVwxXDBcMVwyNSIgKyAiXDFcMFwxXHUwMTI1XDJcMjVcNlwwXDFcdTAxMjZcMVwxMzRcMVwxMzVcMVwxMzQiICsgIlwxXDBcMVwxMzRcMVx1MDEyNlwxXDBcMVwxMzRcMVwwXDFcMTM0XDNcMCIgKyAiXDJcMTM0XDJcMFwzXDEzNFwxXDBcMVwxMzRcN1wwXDFcdTAxMjZcMlwxMzQiICsgIlwxXHUwMTI2XDJcMTM0XDFcdTAxMjZcMlwxMzRcMVwwXDRcMTM0XDFcMFwxXHUwMTI2IiArICJcMVwxMzRcMVwwXDFcMTM0XDFcMFwxXHUwMTI2XDJcMTM0XDZcMFwxXHUwMTI3IiArICJcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcdTAxMjdcMVwwXDFcMTM2IiArICJcMVwwXDFcMTM2XDNcMFwyXDEzNlwyXDBcM1wxMzZcMVwwXDFcMTM2IiArICJcN1wwXDFcdTAxMjdcMlwxMzZcMVx1MDEyN1wyXDEzNlwxXHUwMTI3XDJcMTM2XDFcMCIgKyAiXDRcMTM2XDFcMFwxXHUwMTI3XDFcMTM2XDFcMFwxXDEzNlwxXDBcMVx1MDEyNyIgKyAiXDJcMTM2XDUxXDBcMVx1MDEyOFw1MlwwXDFcdTAxMjlcMTEwXDBcMlx1MDEyYVw0MlwwIiArICJcMVx1MDEyYlw2M1wwXDFcdTAxMDJcMVwwXDFcdTAxMDJcMlwwXDFcdTAxMDJcMVx1MDEwMyIgKyAiXDRcMFwyXHUwMTAyXDUzXDBcMVx1MDEyY1wxXDM0MVwxXDM0MlwxXDM0MVwxXDAiICsgIlwxXDM0MVwxXHUwMTJjXDFcMFwxXDM0MVwxXHUwMTAzXDFcMzQxXDNcMFwyXDM0MSIgKyAiXDJcMFwzXDM0MVwxXDBcMVwzNDFcN1wwXDFcdTAxMmNcMlwzNDFcMVx1MDEyYyIKLQkJCQkrICJcMlwzNDFcMVx1MDEyY1wyXDM0MVwxXDBcNFwzNDFcMVwwXDFcdTAxMmNcMVwzNDEiICsgIlwxXDBcMVwzNDFcMVwwXDFcdTAxMmNcMlwzNDFcNlwwXDFcdTAxMmRcMVwxNDciICsgIlwxXDE1MFwxXDE0N1wxXDBcMVwxNDdcMVx1MDEyZFwxXDBcMVwxNDdcMVwwIiArICJcMVwxNDdcM1wwXDJcMTQ3XDJcMFwzXDE0N1wxXDI2MFwxXDE0N1w3XDAiICsgIlwxXHUwMTJkXDJcMTQ3XDFcdTAxMmRcMlwxNDdcMVx1MDEyZFwyXDE0N1wxXDBcNFwxNDciICsgIlwxXDBcMVx1MDEyZFwxXDE0N1wxXDBcMVwxNDdcMVwwXDFcdTAxMmRcMlwxNDciICsgIlw2XDBcMVx1MDEyZVwxXDE1MVwxXDE1MlwxXDE1MVwxXDE1M1wxXDE1MVwxXHUwMTJlIiArICJcMjdcMTUxXDFcdTAxMmVcMlwxNTFcMVx1MDEyZVwyXDE1MVwxXHUwMTJlXDEwXDE1MVwxXHUwMTJlIiArICJcNFwxNTFcMVx1MDEyZVw3XDE1MVwxXDBcMVx1MDEyZlwxXDE1NFwxXDE1NVwzXDE1NCIgKyAiXDFcdTAxMmZcMVwxNTNcMjZcMTU0XDFcdTAxMmZcMlwxNTRcMVx1MDEyZlwyXDE1NFwxXHUwMTJmIiArICJcMTBcMTU0XDFcdTAxMmZcNFwxNTRcMVx1MDEyZlw3XDE1NFwxXDBcMVx1MDEzMFwxXDE1NyIgKyAiXDFcMTYwXDFcMTU3XDFcMTYxXDFcMTU3XDFcdTAxMzBcMjdcMTU3XDFcdTAxMzBcMlwxNTciICsgIlwxXHUwMTMwXDJcMTU3XDFcdTAxMzBcMTBcMTU3XDFcdTAxMzBcNFwxNTdcMVx1MDEzMFw3XDE1NyIgKyAiXDFcMFwxXHUwMTMxXDFcMTYyXDFcMTYzXDNcMTYyXDFcdTAxMzFcMVwxNjFcMjZcMTYyIiArICJcMVx1MDEzMVwyXDE2MlwxXHUwMTMxXDJcMTYyXDFcdTAxMzFcMTBcMTYyXDFcdTAxMzFcNFwxNjIiICsgIlwxXHUwMTMxXDdcMTYyXDFcMFwyXHUwMTBhXDFcdTAxMGJcMVx1MDEzMlwxXDBcMlx1MDEwYSIgKyAiXDFcMFwxXHUwMTMyXDFcdTAxMGVcNFx1MDEwYVwyXHUwMTMyXDVcdTAxMGFcMVwwXDQ0XHUwMTBhIgotCQkJCSsgIlwxXDBcMVx1MDEzM1wxXHUwMTBhXDFcdTAxMGJcMVx1MDEzMlwyXHUwMTBhXDFcdTAxMzNcMVx1MDEwYSIgKyAiXDFcdTAxMzJcMVx1MDEzNFw0XHUwMTBhXDJcdTAxMzJcMTZcdTAxMGFcMVx1MDEzM1wyXHUwMTBhXDFcdTAxMzMiICsgIlwyXHUwMTBhXDFcdTAxMzNcMTBcdTAxMGFcMVx1MDEzM1w0XHUwMTBhXDFcdTAxMzNcN1x1MDEwYVwxXDAiICsgIlwyXHUwMTBjXDFcdTAxMzVcMVwwXDFcdTAxMzJcMTFcdTAxMGNcMlwwXDUyXHUwMTBjXDFcMCIgKyAiXDJcdTAxMGRcMVx1MDEzNlwxXDBcM1x1MDEwZFwxXHUwMTMyXDZcdTAxMGRcMlwwXDUyXHUwMTBkIiArICJcMVwwXDFcdTAxMzdcMVw1MVwxXDE2NVwxXDUxXDFcMFwxXDUxXDFcdTAxMzciICsgIlwxXDBcMVw1MVwxXDBcMVw1MVwzXDBcMlw1MVwyXDBcM1w1MSIgKyAiXDFcMFwxXDUxXDdcMFwxXHUwMTM3XDJcNTFcMVx1MDEzN1wyXDUxXDFcdTAxMzciICsgIlwyXDUxXDFcMFw0XDUxXDFcMFwxXHUwMTM3XDFcNTFcMVwwXDFcNTEiICsgIlwxXDBcMVx1MDEzN1wyXDUxXDZcMFwxXHUwMTM4XDFcNTVcMVwxNzBcMVw1NSIgKyAiXDFcMFwxXDU1XDFcdTAxMzhcMVwwXDFcNTVcMVwwXDFcNTVcM1wwIiArICJcMlw1NVwyXDBcM1w1NVwxXDBcMVw1NVw3XDBcMVx1MDEzOFwyXDU1IiArICJcMVx1MDEzOFwyXDU1XDFcdTAxMzhcMlw1NVwxXDBcNFw1NVwxXDBcMVx1MDEzOCIgKyAiXDFcNTVcMVwwXDFcNTVcMVwwXDFcdTAxMzhcMlw1NVw2XDBcMVx1MDEzOSIgKyAiXDFcNjJcMVwxNzNcMVw2MlwxXDBcMVw2MlwxXHUwMTM5XDFcMFwxXDYyIiArICJcMVwwXDFcNjJcM1wwXDJcNjJcMlwwXDNcNjJcMVwwXDFcNjIiICsgIlw3XDBcMVx1MDEzOVwyXDYyXDFcdTAxMzlcMlw2MlwxXHUwMTM5XDJcNjJcMVwwIiArICJcNFw2MlwxXDBcMVx1MDEzOVwxXDYyXDFcMFwxXDYyXDFcMFwxXHUwMTM5IgotCQkJCSsgIlwyXDYyXDZcMFwxXHUwMTNhXDFcNzJcMVwyMDBcMVw3MlwxXDBcMVw3MiIgKyAiXDFcdTAxM2FcMVwwXDFcNzJcMVwwXDFcNzJcM1wwXDJcNzJcMlwwIiArICJcM1w3MlwxXDBcMVw3Mlw3XDBcMVx1MDEzYVwyXDcyXDFcdTAxM2FcMlw3MiIgKyAiXDFcdTAxM2FcMlw3MlwxXDBcNFw3MlwxXDBcMVx1MDEzYVwxXDcyXDFcMCIgKyAiXDFcNzJcMVwwXDFcdTAxM2FcMlw3Mlw2XDBcMVx1MDEzYlwxXDEwMFwxXDIwMyIgKyAiXDFcMTAwXDFcMFwxXDEwMFwxXHUwMTNiXDFcMFwxXDEwMFwxXDBcMVwxMDAiICsgIlwzXDBcMlwxMDBcMlwwXDNcMTAwXDFcMFwxXDEwMFw3XDBcMVx1MDEzYiIgKyAiXDJcMTAwXDFcdTAxM2JcMlwxMDBcMVx1MDEzYlwyXDEwMFwxXDBcNFwxMDBcMVwwIiArICJcMVx1MDEzYlwxXDEwMFwxXDBcMVwxMDBcMVwwXDFcdTAxM2JcMlwxMDBcNlwwIiArICJcMVx1MDEzY1wxXDIwNVwxXDIwNlwxXDIwNVwxXDIwN1wxXDIwNVwxXHUwMTNjXDI3XDIwNSIgKyAiXDFcdTAxM2NcMlwyMDVcMVx1MDEzY1wyXDIwNVwxXHUwMTNjXDEwXDIwNVwxXHUwMTNjXDRcMjA1IiArICJcMVx1MDEzY1w3XDIwNVwxXDBcMVx1MDEzZFwxXDIxMFwxXDIxMVwzXDIxMFwxXHUwMTNkIiArICJcMVwyMDdcMjZcMjEwXDFcdTAxM2RcMlwyMTBcMVx1MDEzZFwyXDIxMFwxXHUwMTNkXDEwXDIxMCIgKyAiXDFcdTAxM2RcNFwyMTBcMVx1MDEzZFw3XDIxMFwxXDBcMVx1MDEzZVwxXDEwNVwxXDIxMyIgKyAiXDFcMTA1XDFcMFwxXDEwNVwxXHUwMTNlXDFcMFwxXDEwNVwxXDBcMVwxMDUiICsgIlwzXDBcMlwxMDVcMlwwXDNcMTA1XDFcMFwxXDEwNVw3XDBcMVx1MDEzZSIgKyAiXDJcMTA1XDFcdTAxM2VcMlwxMDVcMVx1MDEzZVwyXDEwNVwxXDBcNFwxMDVcMVwwIiArICJcMVx1MDEzZVwxXDEwNVwxXDBcMVwxMDVcMVwwXDFcdTAxM2VcMlwxMDVcNlwwIgotCQkJCSsgIlwxXHUwMTNmXDFcMjE2XDFcMjE3XDFcMjE2XDFcMFwxXDIxNlwxXHUwMTNmXDFcMCIgKyAiXDFcMjE2XDFcMFwxXDIxNlwzXDBcMlwyMTZcMlwwXDNcMjE2XDFcMCIgKyAiXDFcMjE2XDdcMFwxXHUwMTNmXDJcMjE2XDFcdTAxM2ZcMlwyMTZcMVx1MDEzZlwyXDIxNiIgKyAiXDFcMFw0XDIxNlwxXDBcMVx1MDEzZlwxXDIxNlwxXDBcMVwyMTZcMVwwIiArICJcMVx1MDEzZlwyXDIxNlw2XDBcMVx1MDE0MFwxXDExM1wxXDIyMlwxXDExM1wxXDAiICsgIlwxXDExM1wxXHUwMTQwXDFcMFwxXDExM1wxXDBcMVwxMTNcM1wwXDJcMTEzIiArICJcMlwwXDNcMTEzXDFcMjIzXDFcMTEzXDdcMFwxXHUwMTQwXDJcMTEzXDFcdTAxNDAiICsgIlwyXDExM1wxXHUwMTQwXDJcMTEzXDFcMFw0XDExM1wxXDBcMVx1MDE0MFwxXDExMyIgKyAiXDFcMFwxXDExM1wxXDBcMVx1MDE0MFwyXDExM1w2XDBcMVx1MDE0MVwxXDIyNSIgKyAiXDFcMjI2XDFcMjI1XDFcMjI3XDFcMjI1XDFcdTAxNDFcMjdcMjI1XDFcdTAxNDFcMlwyMjUiICsgIlwxXHUwMTQxXDJcMjI1XDFcdTAxNDFcMTBcMjI1XDFcdTAxNDFcNFwyMjVcMVx1MDE0MVw3XDIyNSIgKyAiXDFcMFwxXHUwMTQyXDFcMjMwXDFcMjMxXDNcMjMwXDFcdTAxNDJcMVwyMjdcMjZcMjMwIiArICJcMVx1MDE0MlwyXDIzMFwxXHUwMTQyXDJcMjMwXDFcdTAxNDJcMTBcMjMwXDFcdTAxNDJcNFwyMzAiICsgIlwxXHUwMTQyXDdcMjMwXDFcMFwxXHUwMTQzXDFcMjM1XDFcMjM2XDFcMjM1XDFcMCIgKyAiXDFcMjM1XDFcdTAxNDNcMVwwXDFcMjM1XDFcMFwxXDIzNVwzXDBcMlwyMzUiICsgIlwyXDBcM1wyMzVcMVwwXDFcMjM1XDdcMFwxXHUwMTQzXDJcMjM1XDFcdTAxNDMiICsgIlwyXDIzNVwxXHUwMTQzXDJcMjM1XDFcMFw0XDIzNVwxXDBcMVx1MDE0M1wxXDIzNSIgKyAiXDFcMFwxXDIzNVwxXDBcMVx1MDE0M1wyXDIzNVw2XDBcMVx1MDE0NFw1XDAiCi0JCQkJKyAiXDFcdTAxNDRcM1wwXDFcMzY3XDVcMFwxXHUwMTQ0XDVcMFwxXHUwMTQ0XDdcMCIgKyAiXDJcdTAxNDRcMVwwXDJcdTAxNDRcMVwwXDJcdTAxNDRcN1wwXDJcdTAxNDRcM1wwIiArICJcMlx1MDE0NFw3XDBcMVx1MDE0NVw1XDBcMVx1MDE0NVwxMVwwXDFcdTAxNDVcNVwwIiArICJcMVx1MDE0NVw3XDBcMlx1MDE0NVwxXDBcMlx1MDE0NVwxXDBcMlx1MDE0NVw3XDAiICsgIlwyXHUwMTQ1XDNcMFwyXHUwMTQ1XDdcMFwyXHUwMTFlXDFcdTAxMWZcMVx1MDE0NlwxXDAiICsgIlwyXHUwMTFlXDFcMFwxXHUwMTQ2XDFcdTAxMjNcNFx1MDExZVwyXHUwMTQ2XDVcdTAxMWVcMVwwIiArICJcNDRcdTAxMWVcMVwwXDFcdTAxNDdcMVx1MDExZVwxXHUwMTFmXDFcdTAxNDZcMlx1MDExZVwxXHUwMTQ3IiArICJcMVx1MDExZVwxXHUwMTQ2XDFcdTAxNDhcNFx1MDExZVwyXHUwMTQ2XDE2XHUwMTFlXDFcdTAxNDdcMlx1MDExZSIgKyAiXDFcdTAxNDdcMlx1MDExZVwxXHUwMTQ3XDEwXHUwMTFlXDFcdTAxNDdcNFx1MDExZVwxXHUwMTQ3XDdcdTAxMWUiICsgIlwxXDBcMlx1MDEyMVwxXHUwMTQ5XDFcMFwxXHUwMTQ2XDExXHUwMTIxXDJcMFw1Mlx1MDEyMSIgKyAiXDFcMFwyXHUwMTIyXDFcdTAxNGFcMVwwXDNcdTAxMjJcMVx1MDE0Nlw2XHUwMTIyXDJcMCIgKyAiXDUyXHUwMTIyXDI0XDBcMVx1MDE0Ylw0N1wwXDFcdTAxNGNcMVwyNVwxXDEzMVwxXDI1IiArICJcMVwwXDFcMjVcMVx1MDE0Y1wxXDBcMVwyNVwxXDBcMVwyNVwzXDAiICsgIlwyXDI1XDJcMFwzXDI1XDFcMFwxXDI1XDdcMFwxXHUwMTRjXDJcMjUiICsgIlwxXHUwMTRjXDJcMjVcMVx1MDE0Y1wyXDI1XDFcMFw0XDI1XDFcMFwxXHUwMTRjIiArICJcMVwyNVwxXDBcMVwyNVwxXDBcMVx1MDE0Y1wyXDI1XDZcMFwxXHUwMTRkIiArICJcMVwxMzRcMVwxMzVcMVwxMzRcMVwwXDFcMTM0XDFcdTAxNGRcMVwwXDFcMTM0IgotCQkJCSsgIlwxXDBcMVwxMzRcM1wwXDJcMTM0XDJcMFwzXDEzNFwxXDBcMVwxMzQiICsgIlw3XDBcMVx1MDE0ZFwyXDEzNFwxXHUwMTRkXDJcMTM0XDFcdTAxNGRcMlwxMzRcMVwwIiArICJcNFwxMzRcMVwwXDFcdTAxNGRcMVwxMzRcMVwwXDFcMTM0XDFcMFwxXHUwMTRkIiArICJcMlwxMzRcNlwwXDFcdTAxNGVcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2IiArICJcMVx1MDE0ZVwxXDBcMVwxMzZcMVwwXDFcMTM2XDNcMFwyXDEzNlwyXDAiICsgIlwzXDEzNlwxXDBcMVwxMzZcN1wwXDFcdTAxNGVcMlwxMzZcMVx1MDE0ZVwyXDEzNiIgKyAiXDFcdTAxNGVcMlwxMzZcMVwwXDRcMTM2XDFcMFwxXHUwMTRlXDFcMTM2XDFcMCIgKyAiXDFcMTM2XDFcMFwxXHUwMTRlXDJcMTM2XDUyXDBcMlx1MDE0Zlw3M1wwXDFcdTAxNTAiICsgIlwxMDZcMFwyXHUwMTUxXDdcMFwxXHUwMTUyXDFcMzQxXDFcMzQyXDFcMzQxXDFcMCIgKyAiXDFcMzQxXDFcdTAxNTJcMVwwXDFcMzQxXDFcdTAxMDNcMVwzNDFcM1wwXDJcMzQxIiArICJcMlwwXDNcMzQxXDFcMFwxXDM0MVw3XDBcMVx1MDE1MlwyXDM0MVwxXHUwMTUyIiArICJcMlwzNDFcMVx1MDE1MlwyXDM0MVwxXDBcNFwzNDFcMVwwXDFcdTAxNTJcMVwzNDEiICsgIlwxXDBcMVwzNDFcMVwwXDFcdTAxNTJcMlwzNDFcNlwwXDFcdTAxNTNcMVwxNDciICsgIlwxXDE1MFwxXDE0N1wxXDBcMVwxNDdcMVx1MDE1M1wxXDBcMVwxNDdcMVwwIiArICJcMVwxNDdcM1wwXDJcMTQ3XDJcMFwzXDE0N1wxXDI2MFwxXDE0N1w3XDAiICsgIlwxXHUwMTUzXDJcMTQ3XDFcdTAxNTNcMlwxNDdcMVx1MDE1M1wyXDE0N1wxXDBcNFwxNDciICsgIlwxXDBcMVx1MDE1M1wxXDE0N1wxXDBcMVwxNDdcMVwwXDFcdTAxNTNcMlwxNDciICsgIlw2XDBcMVx1MDE1NFwxXDE1MVwxXDE1MlwxXDE1MVwxXDE1M1wxXDE1MVwxXHUwMTU0IgotCQkJCSsgIlwyN1wxNTFcMVx1MDE1NFwyXDE1MVwxXHUwMTU0XDJcMTUxXDFcdTAxNTRcMTBcMTUxXDFcdTAxNTQiICsgIlw0XDE1MVwxXHUwMTU0XDdcMTUxXDFcMFwxXHUwMTU1XDFcMTU0XDFcMTU1XDNcMTU0IiArICJcMVx1MDE1NVwxXDE1M1wyNlwxNTRcMVx1MDE1NVwyXDE1NFwxXHUwMTU1XDJcMTU0XDFcdTAxNTUiICsgIlwxMFwxNTRcMVx1MDE1NVw0XDE1NFwxXHUwMTU1XDdcMTU0XDFcMFwxXHUwMTU2XDFcMTU3IiArICJcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDE1NlwyN1wxNTdcMVx1MDE1NlwyXDE1NyIgKyAiXDFcdTAxNTZcMlwxNTdcMVx1MDE1NlwxMFwxNTdcMVx1MDE1Nlw0XDE1N1wxXHUwMTU2XDdcMTU3IiArICJcMVwwXDFcdTAxNTdcMVwxNjJcMVwxNjNcM1wxNjJcMVx1MDE1N1wxXDE2MVwyNlwxNjIiICsgIlwxXHUwMTU3XDJcMTYyXDFcdTAxNTdcMlwxNjJcMVx1MDE1N1wxMFwxNjJcMVx1MDE1N1w0XDE2MiIgKyAiXDFcdTAxNTdcN1wxNjJcNFwwXDFcdTAxMzJcMVwwXDFcdTAxMzJcMlwwXDFcdTAxMzIiICsgIlwxXHUwMTBlXDRcMFwyXHUwMTMyXDUzXDBcMVx1MDE1OFwxXHUwMTBhXDFcdTAxMGJcMVx1MDEwYSIgKyAiXDFcMFwxXHUwMTBhXDFcdTAxNThcMVwwXDFcdTAxMGFcMVx1MDEwZVwxM1x1MDEwYVwxXDAiICsgIlwxMFx1MDEwYVwxXHUwMTU4XDJcdTAxMGFcMVx1MDE1OFwyXHUwMTBhXDFcdTAxNThcMTBcdTAxMGFcMVx1MDE1OCIgKyAiXDRcdTAxMGFcMVx1MDE1OFw3XHUwMTBhXDFcMFwxXHUwMTU5XDFcdTAxMGNcMVx1MDEzNVwxXHUwMTBjIiArICJcMVx1MDE1YVwxXHUwMTBjXDFcdTAxNTlcMTBcdTAxMGNcMVx1MDE1YlwxNlx1MDEwY1wxXHUwMTU5XDJcdTAxMGMiICsgIlwxXHUwMTU5XDJcdTAxMGNcMVx1MDE1OVwxMFx1MDEwY1wxXHUwMTU5XDRcdTAxMGNcMVx1MDE1OVw3XHUwMTBjIgotCQkJCSsgIlwxXDBcMVx1MDE1Y1wxXHUwMTBkXDFcdTAxMzZcM1x1MDEwZFwxXHUwMTVjXDFcdTAxNWRcN1x1MDEwZCIgKyAiXDFcdTAxNWVcMTZcdTAxMGRcMVx1MDE1Y1wyXHUwMTBkXDFcdTAxNWNcMlx1MDEwZFwxXHUwMTVjXDEwXHUwMTBkIiArICJcMVx1MDE1Y1w0XHUwMTBkXDFcdTAxNWNcN1x1MDEwZFwxXDBcMVx1MDE1ZlwxXDUxXDFcMTY1IiArICJcMVw1MVwxXDBcMVw1MVwxXHUwMTVmXDFcMFwxXDUxXDFcMFwxXDUxIiArICJcM1wwXDJcNTFcMlwwXDNcNTFcMVwwXDFcNTFcN1wwXDFcdTAxNWYiICsgIlwyXDUxXDFcdTAxNWZcMlw1MVwxXHUwMTVmXDJcNTFcMVwwXDRcNTFcMVwwIiArICJcMVx1MDE1ZlwxXDUxXDFcMFwxXDUxXDFcMFwxXHUwMTVmXDJcNTFcNlwwIiArICJcMVx1MDE2MFwxXDU1XDFcMTcwXDFcNTVcMVwwXDFcNTVcMVx1MDE2MFwxXDAiICsgIlwxXDU1XDFcMFwxXDU1XDNcMFwyXDU1XDJcMFwzXDU1XDFcMCIgKyAiXDFcNTVcN1wwXDFcdTAxNjBcMlw1NVwxXHUwMTYwXDJcNTVcMVx1MDE2MFwyXDU1IiArICJcMVwwXDRcNTVcMVwwXDFcdTAxNjBcMVw1NVwxXDBcMVw1NVwxXDAiICsgIlwxXHUwMTYwXDJcNTVcNlwwXDFcdTAxNjFcMVw2MlwxXDE3M1wxXDYyXDFcMCIgKyAiXDFcNjJcMVx1MDE2MVwxXDBcMVw2MlwxXDBcMVw2MlwzXDBcMlw2MiIgKyAiXDJcMFwzXDYyXDFcMFwxXDYyXDdcMFwxXHUwMTYxXDJcNjJcMVx1MDE2MSIgKyAiXDJcNjJcMVx1MDE2MVwyXDYyXDFcMFw0XDYyXDFcMFwxXHUwMTYxXDFcNjIiICsgIlwxXDBcMVw2MlwxXDBcMVx1MDE2MVwyXDYyXDZcMFwxXHUwMTYyXDFcNzIiICsgIlwxXDIwMFwxXDcyXDFcMFwxXDcyXDFcdTAxNjJcMVwwXDFcNzJcMVwwIiArICJcMVw3MlwzXDBcMlw3MlwyXDBcM1w3MlwxXDBcMVw3Mlw3XDAiICsgIlwxXHUwMTYyXDJcNzJcMVx1MDE2MlwyXDcyXDFcdTAxNjJcMlw3MlwxXDBcNFw3MiIKLQkJCQkrICJcMVwwXDFcdTAxNjJcMVw3MlwxXDBcMVw3MlwxXDBcMVx1MDE2MlwyXDcyIiArICJcNlwwXDFcdTAxNjNcMVwxMDBcMVwyMDNcMVwxMDBcMVwwXDFcMTAwXDFcdTAxNjMiICsgIlwxXDBcMVwxMDBcMVwwXDFcMTAwXDNcMFwyXDEwMFwyXDBcM1wxMDAiICsgIlwxXDBcMVwxMDBcN1wwXDFcdTAxNjNcMlwxMDBcMVx1MDE2M1wyXDEwMFwxXHUwMTYzIiArICJcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXHUwMTYzXDFcMTAwXDFcMFwxXDEwMCIgKyAiXDFcMFwxXHUwMTYzXDJcMTAwXDZcMFwxXHUwMTY0XDFcMjA1XDFcMjA2XDFcMjA1IiArICJcMVwyMDdcMVwyMDVcMVx1MDE2NFwyN1wyMDVcMVx1MDE2NFwyXDIwNVwxXHUwMTY0XDJcMjA1IiArICJcMVx1MDE2NFwxMFwyMDVcMVx1MDE2NFw0XDIwNVwxXHUwMTY0XDdcMjA1XDFcMFwxXHUwMTY1IiArICJcMVwyMTBcMVwyMTFcM1wyMTBcMVx1MDE2NVwxXDIwN1wyNlwyMTBcMVx1MDE2NVwyXDIxMCIgKyAiXDFcdTAxNjVcMlwyMTBcMVx1MDE2NVwxMFwyMTBcMVx1MDE2NVw0XDIxMFwxXHUwMTY1XDdcMjEwIiArICJcMVwwXDFcdTAxNjZcMVwxMDVcMVwyMTNcMVwxMDVcMVwwXDFcMTA1XDFcdTAxNjYiICsgIlwxXDBcMVwxMDVcMVwwXDFcMTA1XDNcMFwyXDEwNVwyXDBcM1wxMDUiICsgIlwxXDBcMVwxMDVcN1wwXDFcdTAxNjZcMlwxMDVcMVx1MDE2NlwyXDEwNVwxXHUwMTY2IiArICJcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXHUwMTY2XDFcMTA1XDFcMFwxXDEwNSIgKyAiXDFcMFwxXHUwMTY2XDJcMTA1XDZcMFwxXHUwMTY3XDFcMjE2XDFcMjE3XDFcMjE2IiArICJcMVwwXDFcMjE2XDFcdTAxNjdcMVwwXDFcMjE2XDFcMFwxXDIxNlwzXDAiICsgIlwyXDIxNlwyXDBcM1wyMTZcMVwwXDFcMjE2XDdcMFwxXHUwMTY3XDJcMjE2IiArICJcMVx1MDE2N1wyXDIxNlwxXHUwMTY3XDJcMjE2XDFcMFw0XDIxNlwxXDBcMVx1MDE2NyIKLQkJCQkrICJcMVwyMTZcMVwwXDFcMjE2XDFcMFwxXHUwMTY3XDJcMjE2XDZcMFwxXHUwMTY4IiArICJcMVwxMTNcMVwyMjJcMVwxMTNcMVwwXDFcMTEzXDFcdTAxNjhcMVwwXDFcMTEzIiArICJcMVwwXDFcMTEzXDNcMFwyXDExM1wyXDBcM1wxMTNcMVwyMjNcMVwxMTMiICsgIlw3XDBcMVx1MDE2OFwyXDExM1wxXHUwMTY4XDJcMTEzXDFcdTAxNjhcMlwxMTNcMVwwIiArICJcNFwxMTNcMVwwXDFcdTAxNjhcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXHUwMTY4IiArICJcMlwxMTNcNlwwXDFcdTAxNjlcMVwyMjVcMVwyMjZcMVwyMjVcMVwyMjdcMVwyMjUiICsgIlwxXHUwMTY5XDI3XDIyNVwxXHUwMTY5XDJcMjI1XDFcdTAxNjlcMlwyMjVcMVx1MDE2OVwxMFwyMjUiICsgIlwxXHUwMTY5XDRcMjI1XDFcdTAxNjlcN1wyMjVcMVwwXDFcdTAxNmFcMVwyMzBcMVwyMzEiICsgIlwzXDIzMFwxXHUwMTZhXDFcMjI3XDI2XDIzMFwxXHUwMTZhXDJcMjMwXDFcdTAxNmFcMlwyMzAiICsgIlwxXHUwMTZhXDEwXDIzMFwxXHUwMTZhXDRcMjMwXDFcdTAxNmFcN1wyMzBcMVwwXDFcdTAxNmIiICsgIlwxXDIzNVwxXDIzNlwxXDIzNVwxXDBcMVwyMzVcMVx1MDE2YlwxXDBcMVwyMzUiICsgIlwxXDBcMVwyMzVcM1wwXDJcMjM1XDJcMFwzXDIzNVwxXDBcMVwyMzUiICsgIlw3XDBcMVx1MDE2YlwyXDIzNVwxXHUwMTZiXDJcMjM1XDFcdTAxNmJcMlwyMzVcMVwwIiArICJcNFwyMzVcMVwwXDFcdTAxNmJcMVwyMzVcMVwwXDFcMjM1XDFcMFwxXHUwMTZiIiArICJcMlwyMzVcNlwwXDFcdTAxNmNcNVwwXDFcdTAxNmNcM1wwXDFcMzY3XDVcMCIgKyAiXDFcdTAxNmNcNVwwXDFcdTAxNmNcN1wwXDJcdTAxNmNcMVwwXDJcdTAxNmNcMVwwIiArICJcMlx1MDE2Y1w3XDBcMlx1MDE2Y1wzXDBcMlx1MDE2Y1w3XDBcMVx1MDE2ZFw1XDAiICsgIlwxXHUwMTZkXDExXDBcMVx1MDE2ZFw1XDBcMVx1MDE2ZFw3XDBcMlx1MDE2ZFwxXDAiCi0JCQkJKyAiXDJcdTAxNmRcMVwwXDJcdTAxNmRcN1wwXDJcdTAxNmRcM1wwXDJcdTAxNmRcMTJcMCIgKyAiXDFcdTAxNDZcMVwwXDFcdTAxNDZcMlwwXDFcdTAxNDZcMVx1MDEyM1w0XDBcMlx1MDE0NiIgKyAiXDUzXDBcMVx1MDE2ZVwxXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDBcMVx1MDExZVwxXHUwMTZlIiArICJcMVwwXDFcdTAxMWVcMVx1MDEyM1wxM1x1MDExZVwxXDBcMTBcdTAxMWVcMVx1MDE2ZVwyXHUwMTFlIiArICJcMVx1MDE2ZVwyXHUwMTFlXDFcdTAxNmVcMTBcdTAxMWVcMVx1MDE2ZVw0XHUwMTFlXDFcdTAxNmVcN1x1MDExZSIgKyAiXDFcMFwxXHUwMTZmXDFcdTAxMjFcMVx1MDE0OVwxXHUwMTIxXDFcdTAxNzBcMVx1MDEyMVwxXHUwMTZmIiArICJcMTBcdTAxMjFcMVx1MDE3MVwxNlx1MDEyMVwxXHUwMTZmXDJcdTAxMjFcMVx1MDE2ZlwyXHUwMTIxXDFcdTAxNmYiICsgIlwxMFx1MDEyMVwxXHUwMTZmXDRcdTAxMjFcMVx1MDE2Zlw3XHUwMTIxXDFcMFwxXHUwMTcyXDFcdTAxMjIiICsgIlwxXHUwMTRhXDNcdTAxMjJcMVx1MDE3MlwxXHUwMTczXDdcdTAxMjJcMVx1MDE3NFwxNlx1MDEyMlwxXHUwMTcyIiArICJcMlx1MDEyMlwxXHUwMTcyXDJcdTAxMjJcMVx1MDE3MlwxMFx1MDEyMlwxXHUwMTcyXDRcdTAxMjJcMVx1MDE3MiIgKyAiXDdcdTAxMjJcNDdcMFwxXHUwMTc1XDI0XDBcMlwyNVwxXDEzMVwxXDI1XDFcMCIgKyAiXDJcMjVcMVwwXDFcMjVcMVwwXDFcMjVcM1wwXDJcMjVcMlwwIiArICJcM1wyNVwxXDBcMVwyNVw3XDBcMTFcMjVcMVwwXDRcMjVcMVwwIiArICJcMlwyNVwxXDBcMVwyNVwxXDBcM1wyNVw2XDBcMVx1MDE3NlwxXDEzNCIgKyAiXDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXHUwMTc2XDFcMFwxXDEzNFwxXDAiICsgIlwxXDEzNFwzXDBcMlwxMzRcMlwwXDNcMTM0XDFcMFwxXDEzNFw3XDAiICsgIlwxXHUwMTc2XDJcMTM0XDFcdTAxNzZcMlwxMzRcMVx1MDE3NlwyXDEzNFwxXDBcNFwxMzQiCi0JCQkJKyAiXDFcMFwxXHUwMTc2XDFcMTM0XDFcMFwxXDEzNFwxXDBcMVx1MDE3NlwyXDEzNCIgKyAiXDZcMFwxXHUwMTc3XDFcMTM2XDFcMTM3XDFcMTM2XDFcMFwxXDEzNlwxXHUwMTc3IiArICJcMVwwXDFcMTM2XDFcMFwxXDEzNlwzXDBcMlwxMzZcMlwwXDNcMTM2IiArICJcMVwwXDFcMTM2XDdcMFwxXHUwMTc3XDJcMTM2XDFcdTAxNzdcMlwxMzZcMVx1MDE3NyIgKyAiXDJcMTM2XDFcMFw0XDEzNlwxXDBcMVx1MDE3N1wxXDEzNlwxXDBcMVwxMzYiICsgIlwxXDBcMVx1MDE3N1wyXDEzNlw1NFwwXDFcdTAxNzhcNjVcMFwyXHUwMTc5XDMwXDAiICsgIlwxXHUwMTdhXDFcMzQxXDFcMzQyXDFcMzQxXDFcMFwxXDM0MVwxXHUwMTdhXDFcMCIgKyAiXDFcMzQxXDFcdTAxMDNcMVwzNDFcM1wwXDJcMzQxXDJcMFwzXDM0MVwxXDAiICsgIlwxXDM0MVw3XDBcMVx1MDE3YVwyXDM0MVwxXHUwMTdhXDJcMzQxXDFcdTAxN2FcMlwzNDEiICsgIlwxXDBcNFwzNDFcMVwwXDFcdTAxN2FcMVwzNDFcMVwwXDFcMzQxXDFcMCIgKyAiXDFcdTAxN2FcMlwzNDFcNlwwXDFcdTAxN2JcMVwxNDdcMVwxNTBcMVwxNDdcMVwwIiArICJcMVwxNDdcMVx1MDE3YlwxXDBcMVwxNDdcMVwwXDFcMTQ3XDNcMFwyXDE0NyIgKyAiXDJcMFwzXDE0N1wxXDI2MFwxXDE0N1w3XDBcMVx1MDE3YlwyXDE0N1wxXHUwMTdiIiArICJcMlwxNDdcMVx1MDE3YlwyXDE0N1wxXDBcNFwxNDdcMVwwXDFcdTAxN2JcMVwxNDciICsgIlwxXDBcMVwxNDdcMVwwXDFcdTAxN2JcMlwxNDdcNlwwXDFcdTAxN2NcMVwxNTEiICsgIlwxXDE1MlwxXDE1MVwxXDE1M1wxXDE1MVwxXHUwMTdjXDI3XDE1MVwxXHUwMTdjXDJcMTUxIiArICJcMVx1MDE3Y1wyXDE1MVwxXHUwMTdjXDEwXDE1MVwxXHUwMTdjXDRcMTUxXDFcdTAxN2NcN1wxNTEiICsgIlwxXDBcMVx1MDE3ZFwxXDE1NFwxXDE1NVwzXDE1NFwxXHUwMTdkXDFcMTUzXDI2XDE1NCIKLQkJCQkrICJcMVx1MDE3ZFwyXDE1NFwxXHUwMTdkXDJcMTU0XDFcdTAxN2RcMTBcMTU0XDFcdTAxN2RcNFwxNTQiICsgIlwxXHUwMTdkXDdcMTU0XDFcMFwxXHUwMTdlXDFcMTU3XDFcMTYwXDFcMTU3XDFcMTYxIiArICJcMVwxNTdcMVx1MDE3ZVwyN1wxNTdcMVx1MDE3ZVwyXDE1N1wxXHUwMTdlXDJcMTU3XDFcdTAxN2UiICsgIlwxMFwxNTdcMVx1MDE3ZVw0XDE1N1wxXHUwMTdlXDdcMTU3XDFcMFwxXHUwMTdmXDFcMTYyIiArICJcMVwxNjNcM1wxNjJcMVx1MDE3ZlwxXDE2MVwyNlwxNjJcMVx1MDE3ZlwyXDE2MlwxXHUwMTdmIiArICJcMlwxNjJcMVx1MDE3ZlwxMFwxNjJcMVx1MDE3Zlw0XDE2MlwxXHUwMTdmXDdcMTYyXDFcMCIgKyAiXDFcdTAxODBcMVx1MDEwYVwxXHUwMTBiXDFcdTAxMGFcMVwwXDFcdTAxMGFcMVx1MDE4MFwxXDAiICsgIlwxXHUwMTBhXDFcdTAxMGVcMTNcdTAxMGFcMVwwXDEwXHUwMTBhXDFcdTAxODBcMlx1MDEwYVwxXHUwMTgwIiArICJcMlx1MDEwYVwxXHUwMTgwXDEwXHUwMTBhXDFcdTAxODBcNFx1MDEwYVwxXHUwMTgwXDdcdTAxMGFcMVwwIiArICJcMVx1MDE4MVwxXHUwMTBjXDFcdTAxMzVcMVx1MDEwY1wxXHUwMTMyXDFcdTAxMGNcMVx1MDE4MVwyN1x1MDEwYyIgKyAiXDFcdTAxODFcMlx1MDEwY1wxXHUwMTgxXDJcdTAxMGNcMVx1MDE4MVwxMFx1MDEwY1wxXHUwMTgxXDRcdTAxMGMiICsgIlwxXHUwMTgxXDdcdTAxMGNcMVwwXDJcdTAxMGNcMVx1MDEzNVwyXHUwMTMyXDFcdTAxNWFcMlx1MDEwYyIgKyAiXDFcdTAxNWFcMVx1MDE4Mlw0XHUwMTBjXDJcdTAxMzJcNTJcdTAxMGNcMVwwXDJcdTAxMGNcMVx1MDEzNSIgKyAiXDFcMFwxXHUwMTMyXDEyXHUwMTBjXDFcMFw1Mlx1MDEwY1wxXDBcMVx1MDE4M1wxXHUwMTBkIiArICJcMVx1MDEzNlwzXHUwMTBkXDFcdTAxODNcMVx1MDEzMlwyNlx1MDEwZFwxXHUwMTgzXDJcdTAxMGRcMVx1MDE4MyIKLQkJCQkrICJcMlx1MDEwZFwxXHUwMTgzXDEwXHUwMTBkXDFcdTAxODNcNFx1MDEwZFwxXHUwMTgzXDdcdTAxMGRcMVwwIiArICJcMlx1MDEwZFwxXHUwMTM2XDFcdTAxMzJcMVx1MDEwZFwxXHUwMTVkXDFcdTAxMGRcMVx1MDEzMlwxXHUwMTVkIiArICJcMVx1MDE4NFw0XHUwMTBkXDJcdTAxMzJcNTJcdTAxMGRcMVwwXDJcdTAxMGRcMVx1MDEzNlwxXDAiICsgIlwzXHUwMTBkXDFcdTAxMzJcN1x1MDEwZFwxXDBcNTJcdTAxMGRcMVwwXDJcNTFcMVwxNjUiICsgIlwxXDUxXDFcMFwyXDUxXDFcMFwxXDUxXDFcMFwxXDUxXDNcMCIgKyAiXDJcNTFcMlwwXDNcNTFcMVwwXDFcNTFcN1wwXDExXDUxXDFcMCIgKyAiXDRcNTFcMVwwXDJcNTFcMVwwXDFcNTFcMVwwXDNcNTFcNlwwIiArICJcMlw1NVwxXDE3MFwxXDU1XDFcMFwyXDU1XDFcMFwxXDU1XDFcMCIgKyAiXDFcNTVcM1wwXDJcNTVcMlwwXDNcNTVcMVwwXDFcNTVcN1wwIiArICJcMTFcNTVcMVwwXDRcNTVcMVwwXDJcNTVcMVwwXDFcNTVcMVwwIiArICJcM1w1NVw2XDBcMlw2MlwxXDE3M1wxXDYyXDFcMFwyXDYyXDFcMCIgKyAiXDFcNjJcMVwwXDFcNjJcM1wwXDJcNjJcMlwwXDNcNjJcMVwwIiArICJcMVw2Mlw3XDBcMTFcNjJcMVwwXDRcNjJcMVwwXDJcNjJcMVwwIiArICJcMVw2MlwxXDBcM1w2Mlw2XDBcMlw3MlwxXDIwMFwxXDcyXDFcMCIgKyAiXDJcNzJcMVwwXDFcNzJcMVwwXDFcNzJcM1wwXDJcNzJcMlwwIiArICJcM1w3MlwxXDBcMVw3Mlw3XDBcMTFcNzJcMVwwXDRcNzJcMVwwIiArICJcMlw3MlwxXDBcMVw3MlwxXDBcM1w3Mlw2XDBcMlwxMDBcMVwyMDMiICsgIlwxXDEwMFwxXDBcMlwxMDBcMVwwXDFcMTAwXDFcMFwxXDEwMFwzXDAiICsgIlwyXDEwMFwyXDBcM1wxMDBcMVwwXDFcMTAwXDdcMFwxMVwxMDBcMVwwIiArICJcNFwxMDBcMVwwXDJcMTAwXDFcMFwxXDEwMFwxXDBcM1wxMDBcNlwwIgotCQkJCSsgIlwxXHUwMTg1XDFcMjA1XDFcMjA2XDFcMjA1XDFcMjA3XDFcMjA1XDFcdTAxODVcMjdcMjA1IiArICJcMVx1MDE4NVwyXDIwNVwxXHUwMTg1XDJcMjA1XDFcdTAxODVcMTBcMjA1XDFcdTAxODVcNFwyMDUiICsgIlwxXHUwMTg1XDdcMjA1XDFcMFwxXHUwMTg2XDFcMjEwXDFcMjExXDNcMjEwXDFcdTAxODYiICsgIlwxXDIwN1wyNlwyMTBcMVx1MDE4NlwyXDIxMFwxXHUwMTg2XDJcMjEwXDFcdTAxODZcMTBcMjEwIiArICJcMVx1MDE4Nlw0XDIxMFwxXHUwMTg2XDdcMjEwXDFcMFwyXDEwNVwxXDIxM1wxXDEwNSIgKyAiXDFcMFwyXDEwNVwxXDBcMVwxMDVcMVwwXDFcMTA1XDNcMFwyXDEwNSIgKyAiXDJcMFwzXDEwNVwxXDBcMVwxMDVcN1wwXDExXDEwNVwxXDBcNFwxMDUiICsgIlwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMFwzXDEwNVw2XDBcMVx1MDE4NyIgKyAiXDFcMjE2XDFcMjE3XDFcMjE2XDFcMFwxXDIxNlwxXHUwMTg3XDFcMFwxXDIxNiIgKyAiXDFcMFwxXDIxNlwzXDBcMlwyMTZcMlwwXDNcMjE2XDFcMFwxXDIxNiIgKyAiXDdcMFwxXHUwMTg3XDJcMjE2XDFcdTAxODdcMlwyMTZcMVx1MDE4N1wyXDIxNlwxXDAiICsgIlw0XDIxNlwxXDBcMVx1MDE4N1wxXDIxNlwxXDBcMVwyMTZcMVwwXDFcdTAxODciICsgIlwyXDIxNlw2XDBcMlwxMTNcMVwyMjJcMVwxMTNcMVwwXDJcMTEzXDFcMCIgKyAiXDFcMTEzXDFcMFwxXDExM1wzXDBcMlwxMTNcMlwwXDNcMTEzXDFcMjIzIiArICJcMVwxMTNcN1wwXDExXDExM1wxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMCIgKyAiXDFcMTEzXDFcMFwzXDExM1w2XDBcMVx1MDE4OFwxXDIyNVwxXDIyNlwxXDIyNSIgKyAiXDFcMjI3XDFcMjI1XDFcdTAxODhcMjdcMjI1XDFcdTAxODhcMlwyMjVcMVx1MDE4OFwyXDIyNSIgKyAiXDFcdTAxODhcMTBcMjI1XDFcdTAxODhcNFwyMjVcMVx1MDE4OFw3XDIyNVwxXDBcMVx1MDE4OSIKLQkJCQkrICJcMVwyMzBcMVwyMzFcM1wyMzBcMVx1MDE4OVwxXDIyN1wyNlwyMzBcMVx1MDE4OVwyXDIzMCIgKyAiXDFcdTAxODlcMlwyMzBcMVx1MDE4OVwxMFwyMzBcMVx1MDE4OVw0XDIzMFwxXHUwMTg5XDdcMjMwIiArICJcMVwwXDFcdTAxOGFcMVwyMzVcMVwyMzZcMVwyMzVcMVwwXDFcMjM1XDFcdTAxOGEiICsgIlwxXDBcMVwyMzVcMVwwXDFcMjM1XDNcMFwyXDIzNVwyXDBcM1wyMzUiICsgIlwxXDBcMVwyMzVcN1wwXDFcdTAxOGFcMlwyMzVcMVx1MDE4YVwyXDIzNVwxXHUwMThhIiArICJcMlwyMzVcMVwwXDRcMjM1XDFcMFwxXHUwMThhXDFcMjM1XDFcMFwxXDIzNSIgKyAiXDFcMFwxXHUwMThhXDJcMjM1XDZcMFwxXHUwMThiXDVcMFwxXHUwMThiXDNcMCIgKyAiXDFcMzY3XDVcMFwxXHUwMThiXDVcMFwxXHUwMThiXDdcMFwyXHUwMThiXDFcMCIgKyAiXDJcdTAxOGJcMVwwXDJcdTAxOGJcN1wwXDJcdTAxOGJcM1wwXDJcdTAxOGJcN1wwIiArICJcMVx1MDE4Y1w1XDBcMVx1MDE4Y1wxMVwwXDFcdTAxOGNcNVwwXDFcdTAxOGNcN1wwIiArICJcMlx1MDE4Y1wxXDBcMlx1MDE4Y1wxXDBcMlx1MDE4Y1w3XDBcMlx1MDE4Y1wzXDAiICsgIlwyXHUwMThjXDdcMFwxXHUwMThkXDFcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMFwxXHUwMTFlIiArICJcMVx1MDE4ZFwxXDBcMVx1MDExZVwxXHUwMTIzXDEzXHUwMTFlXDFcMFwxMFx1MDExZVwxXHUwMThkIiArICJcMlx1MDExZVwxXHUwMThkXDJcdTAxMWVcMVx1MDE4ZFwxMFx1MDExZVwxXHUwMThkXDRcdTAxMWVcMVx1MDE4ZCIgKyAiXDdcdTAxMWVcMVwwXDFcdTAxOGVcMVx1MDEyMVwxXHUwMTQ5XDFcdTAxMjFcMVx1MDE0NlwxXHUwMTIxIiArICJcMVx1MDE4ZVwyN1x1MDEyMVwxXHUwMThlXDJcdTAxMjFcMVx1MDE4ZVwyXHUwMTIxXDFcdTAxOGVcMTBcdTAxMjEiICsgIlwxXHUwMThlXDRcdTAxMjFcMVx1MDE4ZVw3XHUwMTIxXDFcMFwyXHUwMTIxXDFcdTAxNDlcMlx1MDE0NiIKLQkJCQkrICJcMVx1MDE3MFwyXHUwMTIxXDFcdTAxNzBcMVx1MDE4Zlw0XHUwMTIxXDJcdTAxNDZcNTJcdTAxMjFcMVwwIiArICJcMlx1MDEyMVwxXHUwMTQ5XDFcMFwxXHUwMTQ2XDEyXHUwMTIxXDFcMFw1Mlx1MDEyMVwxXDAiICsgIlwxXHUwMTkwXDFcdTAxMjJcMVx1MDE0YVwzXHUwMTIyXDFcdTAxOTBcMVx1MDE0NlwyNlx1MDEyMlwxXHUwMTkwIiArICJcMlx1MDEyMlwxXHUwMTkwXDJcdTAxMjJcMVx1MDE5MFwxMFx1MDEyMlwxXHUwMTkwXDRcdTAxMjJcMVx1MDE5MCIgKyAiXDdcdTAxMjJcMVwwXDJcdTAxMjJcMVx1MDE0YVwxXHUwMTQ2XDFcdTAxMjJcMVx1MDE3M1wxXHUwMTIyIiArICJcMVx1MDE0NlwxXHUwMTczXDFcdTAxOTFcNFx1MDEyMlwyXHUwMTQ2XDUyXHUwMTIyXDFcMFwyXHUwMTIyIiArICJcMVx1MDE0YVwxXDBcM1x1MDEyMlwxXHUwMTQ2XDdcdTAxMjJcMVwwXDUyXHUwMTIyXDQyXDAiICsgIlwyXHUwMTkyXDMwXDBcMlwxMzRcMVwxMzVcMVwxMzRcMVwwXDJcMTM0XDFcMCIgKyAiXDFcMTM0XDFcMFwxXDEzNFwzXDBcMlwxMzRcMlwwXDNcMTM0XDFcMCIgKyAiXDFcMTM0XDdcMFwxMVwxMzRcMVwwXDRcMTM0XDFcMFwyXDEzNFwxXDAiICsgIlwxXDEzNFwxXDBcM1wxMzRcNlwwXDJcMTM2XDFcMTM3XDFcMTM2XDFcMCIgKyAiXDJcMTM2XDFcMFwxXDEzNlwxXDBcMVwxMzZcM1wwXDJcMTM2XDJcMCIgKyAiXDNcMTM2XDFcMFwxXDEzNlw3XDBcMTFcMTM2XDFcMFw0XDEzNlwxXDAiICsgIlwyXDEzNlwxXDBcMVwxMzZcMVwwXDNcMTM2XDQ0XDBcMlx1MDE5M1wzM1wwIiArICJcMVx1MDE5NFwxXDM0MVwxXDM0MlwxXDM0MVwxXDBcMVwzNDFcMVx1MDE5NFwxXDAiICsgIlwxXDM0MVwxXHUwMTAzXDFcMzQxXDNcMFwyXDM0MVwyXDBcM1wzNDFcMVwwIiArICJcMVwzNDFcN1wwXDFcdTAxOTRcMlwzNDFcMVx1MDE5NFwyXDM0MVwxXHUwMTk0XDJcMzQxIgotCQkJCSsgIlwxXDBcNFwzNDFcMVwwXDFcdTAxOTRcMVwzNDFcMVwwXDFcMzQxXDFcMCIgKyAiXDFcdTAxOTRcMlwzNDFcNlwwXDJcMTQ3XDFcMTUwXDFcMTQ3XDFcMFwyXDE0NyIgKyAiXDFcMFwxXDE0N1wxXDBcMVwxNDdcM1wwXDJcMTQ3XDJcMFwzXDE0NyIgKyAiXDFcMjYwXDFcMTQ3XDdcMFwxMVwxNDdcMVwwXDRcMTQ3XDFcMFwyXDE0NyIgKyAiXDFcMFwxXDE0N1wxXDBcM1wxNDdcNlwwXDJcMTUxXDFcMTUyXDFcMTUxIiArICJcMVwxNTNcNjVcMTUxXDFcMFwyXDE1NFwxXDE1NVw0XDE1NFwxXDE1M1w2MlwxNTQiICsgIlwxXDBcMlwxNTdcMVwxNjBcMVwxNTdcMVwxNjFcNjVcMTU3XDFcMFwyXDE2MiIgKyAiXDFcMTYzXDRcMTYyXDFcMTYxXDYyXDE2MlwxXDBcMVx1MDE5NVwxXHUwMTBhXDFcdTAxMGIiICsgIlwxXHUwMTBhXDFcMFwxXHUwMTBhXDFcdTAxOTVcMVwwXDFcdTAxMGFcMVx1MDEwZVwxM1x1MDEwYSIgKyAiXDFcMFwxMFx1MDEwYVwxXHUwMTk1XDJcdTAxMGFcMVx1MDE5NVwyXHUwMTBhXDFcdTAxOTVcMTBcdTAxMGEiICsgIlwxXHUwMTk1XDRcdTAxMGFcMVx1MDE5NVw3XHUwMTBhXDFcMFwxXHUwMTk2XDFcdTAxMGNcMVx1MDEzNSIgKyAiXDFcdTAxMGNcMVx1MDEzMlwxXHUwMTBjXDFcdTAxOTZcMjdcdTAxMGNcMVx1MDE5NlwyXHUwMTBjXDFcdTAxOTYiICsgIlwyXHUwMTBjXDFcdTAxOTZcMTBcdTAxMGNcMVx1MDE5Nlw0XHUwMTBjXDFcdTAxOTZcN1x1MDEwY1wxXDAiICsgIlwxXHUwMTk3XDFcdTAxMGRcMVx1MDEzNlwzXHUwMTBkXDFcdTAxOTdcMVx1MDEzMlwyNlx1MDEwZFwxXHUwMTk3IiArICJcMlx1MDEwZFwxXHUwMTk3XDJcdTAxMGRcMVx1MDE5N1wxMFx1MDEwZFwxXHUwMTk3XDRcdTAxMGRcMVx1MDE5NyIgKyAiXDdcdTAxMGRcMVwwXDJcMjA1XDFcMjA2XDFcMjA1XDFcMjA3XDY1XDIwNVwxXDAiICsgIlwyXDIxMFwxXDIxMVw0XDIxMFwxXDIwN1w2MlwyMTBcMVwwXDJcMjE2XDFcMjE3IgotCQkJCSsgIlwxXDIxNlwxXDBcMlwyMTZcMVwwXDFcMjE2XDFcMFwxXDIxNlwzXDAiICsgIlwyXDIxNlwyXDBcM1wyMTZcMVwwXDFcMjE2XDdcMFwxMVwyMTZcMVwwIiArICJcNFwyMTZcMVwwXDJcMjE2XDFcMFwxXDIxNlwxXDBcM1wyMTZcNlwwIiArICJcMlwyMjVcMVwyMjZcMVwyMjVcMVwyMjdcNjVcMjI1XDFcMFwyXDIzMFwxXDIzMSIgKyAiXDRcMjMwXDFcMjI3XDYyXDIzMFwxXDBcMlwyMzVcMVwyMzZcMVwyMzVcMVwwIiArICJcMlwyMzVcMVwwXDFcMjM1XDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwIiArICJcM1wyMzVcMVwwXDFcMjM1XDdcMFwxMVwyMzVcMVwwXDRcMjM1XDFcMCIgKyAiXDJcMjM1XDFcMFwxXDIzNVwxXDBcM1wyMzVcMjBcMFwxXDM2N1w2MFwwIiArICJcMVx1MDE5OFw1XDBcMVx1MDE5OFwxMVwwXDFcdTAxOThcNVwwXDFcdTAxOThcN1wwIiArICJcMlx1MDE5OFwxXDBcMlx1MDE5OFwxXDBcMlx1MDE5OFw3XDBcMlx1MDE5OFwzXDAiICsgIlwyXHUwMTk4XDdcMFwxXHUwMTk5XDFcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMFwxXHUwMTFlIiArICJcMVx1MDE5OVwxXDBcMVx1MDExZVwxXHUwMTIzXDEzXHUwMTFlXDFcMFwxMFx1MDExZVwxXHUwMTk5IiArICJcMlx1MDExZVwxXHUwMTk5XDJcdTAxMWVcMVx1MDE5OVwxMFx1MDExZVwxXHUwMTk5XDRcdTAxMWVcMVx1MDE5OSIgKyAiXDdcdTAxMWVcMVwwXDFcdTAxOWFcMVx1MDEyMVwxXHUwMTQ5XDFcdTAxMjFcMVx1MDE0NlwxXHUwMTIxIiArICJcMVx1MDE5YVwyN1x1MDEyMVwxXHUwMTlhXDJcdTAxMjFcMVx1MDE5YVwyXHUwMTIxXDFcdTAxOWFcMTBcdTAxMjEiICsgIlwxXHUwMTlhXDRcdTAxMjFcMVx1MDE5YVw3XHUwMTIxXDFcMFwxXHUwMTliXDFcdTAxMjJcMVx1MDE0YSIgKyAiXDNcdTAxMjJcMVx1MDE5YlwxXHUwMTQ2XDI2XHUwMTIyXDFcdTAxOWJcMlx1MDEyMlwxXHUwMTliXDJcdTAxMjIiCi0JCQkJKyAiXDFcdTAxOWJcMTBcdTAxMjJcMVx1MDE5Ylw0XHUwMTIyXDFcdTAxOWJcN1x1MDEyMlw2NVwwXDFcdTAxOWMiICsgIlw1MlwwXDJcdTAxOWRcMjVcMFwxXHUwMTllXDFcMzQxXDFcMzQyXDFcMzQxXDFcMCIgKyAiXDFcMzQxXDFcdTAxOWVcMVwwXDFcMzQxXDFcdTAxMDNcMVwzNDFcM1wwXDJcMzQxIiArICJcMlwwXDNcMzQxXDFcMFwxXDM0MVw3XDBcMVx1MDE5ZVwyXDM0MVwxXHUwMTllIiArICJcMlwzNDFcMVx1MDE5ZVwyXDM0MVwxXDBcNFwzNDFcMVwwXDFcdTAxOWVcMVwzNDEiICsgIlwxXDBcMVwzNDFcMVwwXDFcdTAxOWVcMlwzNDFcNlwwXDFcdTAxOWZcMVx1MDEwYSIgKyAiXDFcdTAxMGJcMVx1MDEwYVwxXDBcMVx1MDEwYVwxXHUwMTlmXDFcMFwxXHUwMTBhXDFcdTAxMGUiICsgIlwxM1x1MDEwYVwxXDBcMTBcdTAxMGFcMVx1MDE5ZlwyXHUwMTBhXDFcdTAxOWZcMlx1MDEwYVwxXHUwMTlmIiArICJcMTBcdTAxMGFcMVx1MDE5Zlw0XHUwMTBhXDFcdTAxOWZcN1x1MDEwYVwxXDBcMVx1MDFhMFwxXHUwMTBjIiArICJcMVx1MDEzNVwxXHUwMTBjXDFcdTAxMzJcMVx1MDEwY1wxXHUwMWEwXDI3XHUwMTBjXDFcdTAxYTBcMlx1MDEwYyIgKyAiXDFcdTAxYTBcMlx1MDEwY1wxXHUwMWEwXDEwXHUwMTBjXDFcdTAxYTBcNFx1MDEwY1wxXHUwMWEwXDdcdTAxMGMiICsgIlwxXDBcMVx1MDFhMVwxXHUwMTBkXDFcdTAxMzZcM1x1MDEwZFwxXHUwMWExXDFcdTAxMzJcMjZcdTAxMGQiICsgIlwxXHUwMWExXDJcdTAxMGRcMVx1MDFhMVwyXHUwMTBkXDFcdTAxYTFcMTBcdTAxMGRcMVx1MDFhMVw0XHUwMTBkIiArICJcMVx1MDFhMVw3XHUwMTBkXDFcMFwxXHUwMWEyXDVcMFwxXHUwMWEyXDExXDBcMVx1MDFhMiIgKyAiXDVcMFwxXHUwMWEyXDdcMFwyXHUwMWEyXDFcMFwyXHUwMWEyXDFcMFwyXHUwMWEyIiArICJcN1wwXDJcdTAxYTJcM1wwXDJcdTAxYTJcN1wwXDFcdTAxYTNcMVx1MDExZVwxXHUwMTFmIgotCQkJCSsgIlwxXHUwMTFlXDFcMFwxXHUwMTFlXDFcdTAxYTNcMVwwXDFcdTAxMWVcMVx1MDEyM1wxM1x1MDExZSIgKyAiXDFcMFwxMFx1MDExZVwxXHUwMWEzXDJcdTAxMWVcMVx1MDFhM1wyXHUwMTFlXDFcdTAxYTNcMTBcdTAxMWUiICsgIlwxXHUwMWEzXDRcdTAxMWVcMVx1MDFhM1w3XHUwMTFlXDFcMFwxXHUwMWE0XDFcdTAxMjFcMVx1MDE0OSIgKyAiXDFcdTAxMjFcMVx1MDE0NlwxXHUwMTIxXDFcdTAxYTRcMjdcdTAxMjFcMVx1MDFhNFwyXHUwMTIxXDFcdTAxYTQiICsgIlwyXHUwMTIxXDFcdTAxYTRcMTBcdTAxMjFcMVx1MDFhNFw0XHUwMTIxXDFcdTAxYTRcN1x1MDEyMVwxXDAiICsgIlwxXHUwMWE1XDFcdTAxMjJcMVx1MDE0YVwzXHUwMTIyXDFcdTAxYTVcMVx1MDE0NlwyNlx1MDEyMlwxXHUwMWE1IiArICJcMlx1MDEyMlwxXHUwMWE1XDJcdTAxMjJcMVx1MDFhNVwxMFx1MDEyMlwxXHUwMWE1XDRcdTAxMjJcMVx1MDFhNSIgKyAiXDdcdTAxMjJcNDdcMFwxXHUwMWE2XDI0XDBcMlwzNDFcMVwzNDJcMVwzNDFcMVwwIiArICJcMlwzNDFcMVwwXDFcMzQxXDFcdTAxMDNcMVwzNDFcM1wwXDJcMzQxXDJcMCIgKyAiXDNcMzQxXDFcMFwxXDM0MVw3XDBcMTFcMzQxXDFcMFw0XDM0MVwxXDAiICsgIlwyXDM0MVwxXDBcMVwzNDFcMVwwXDNcMzQxXDZcMFwxXHUwMWE3XDFcdTAxMGEiICsgIlwxXHUwMTBiXDFcdTAxMGFcMVwwXDFcdTAxMGFcMVx1MDFhN1wxXDBcMVx1MDEwYVwxXHUwMTBlIiArICJcMTNcdTAxMGFcMVwwXDEwXHUwMTBhXDFcdTAxYTdcMlx1MDEwYVwxXHUwMWE3XDJcdTAxMGFcMVx1MDFhNyIgKyAiXDEwXHUwMTBhXDFcdTAxYTdcNFx1MDEwYVwxXHUwMWE3XDdcdTAxMGFcMVwwXDFcdTAxYThcMVx1MDEwYyIgKyAiXDFcdTAxMzVcMVx1MDEwY1wxXHUwMTMyXDFcdTAxMGNcMVx1MDFhOFwyN1x1MDEwY1wxXHUwMWE4XDJcdTAxMGMiCi0JCQkJKyAiXDFcdTAxYThcMlx1MDEwY1wxXHUwMWE4XDEwXHUwMTBjXDFcdTAxYThcNFx1MDEwY1wxXHUwMWE4XDdcdTAxMGMiICsgIlwxXDBcMVx1MDFhOVwxXHUwMTBkXDFcdTAxMzZcM1x1MDEwZFwxXHUwMWE5XDFcdTAxMzJcMjZcdTAxMGQiICsgIlwxXHUwMWE5XDJcdTAxMGRcMVx1MDFhOVwyXHUwMTBkXDFcdTAxYTlcMTBcdTAxMGRcMVx1MDFhOVw0XHUwMTBkIiArICJcMVx1MDFhOVw3XHUwMTBkXDFcMFwxXHUwMWFhXDFcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMCIgKyAiXDFcdTAxMWVcMVx1MDFhYVwxXDBcMVx1MDExZVwxXHUwMTIzXDEzXHUwMTFlXDFcMFwxMFx1MDExZSIgKyAiXDFcdTAxYWFcMlx1MDExZVwxXHUwMWFhXDJcdTAxMWVcMVx1MDFhYVwxMFx1MDExZVwxXHUwMWFhXDRcdTAxMWUiICsgIlwxXHUwMWFhXDdcdTAxMWVcMVwwXDFcdTAxYWJcMVx1MDEyMVwxXHUwMTQ5XDFcdTAxMjFcMVx1MDE0NiIgKyAiXDFcdTAxMjFcMVx1MDFhYlwyN1x1MDEyMVwxXHUwMWFiXDJcdTAxMjFcMVx1MDFhYlwyXHUwMTIxXDFcdTAxYWIiICsgIlwxMFx1MDEyMVwxXHUwMWFiXDRcdTAxMjFcMVx1MDFhYlw3XHUwMTIxXDFcMFwxXHUwMWFjXDFcdTAxMjIiICsgIlwxXHUwMTRhXDNcdTAxMjJcMVx1MDFhY1wxXHUwMTQ2XDI2XHUwMTIyXDFcdTAxYWNcMlx1MDEyMlwxXHUwMWFjIiArICJcMlx1MDEyMlwxXHUwMWFjXDEwXHUwMTIyXDFcdTAxYWNcNFx1MDEyMlwxXHUwMWFjXDdcdTAxMjJcMVwwIiArICJcMlx1MDEwYVwxXHUwMTBiXDFcdTAxMGFcMVwwXDJcdTAxMGFcMVwwXDFcdTAxMGFcMVx1MDEwZSIgKyAiXDEzXHUwMTBhXDFcMFw0NFx1MDEwYVwxXDBcMVx1MDFhZFwxXHUwMTBjXDFcdTAxMzVcMVx1MDEwYyIgKyAiXDFcdTAxMzJcMVx1MDEwY1wxXHUwMWFkXDI3XHUwMTBjXDFcdTAxYWRcMlx1MDEwY1wxXHUwMWFkXDJcdTAxMGMiCi0JCQkJKyAiXDFcdTAxYWRcMTBcdTAxMGNcMVx1MDFhZFw0XHUwMTBjXDFcdTAxYWRcN1x1MDEwY1wxXDBcMVx1MDFhZSIgKyAiXDFcdTAxMGRcMVx1MDEzNlwzXHUwMTBkXDFcdTAxYWVcMVx1MDEzMlwyNlx1MDEwZFwxXHUwMWFlXDJcdTAxMGQiICsgIlwxXHUwMWFlXDJcdTAxMGRcMVx1MDFhZVwxMFx1MDEwZFwxXHUwMWFlXDRcdTAxMGRcMVx1MDFhZVw3XHUwMTBkIiArICJcMVwwXDJcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMFwyXHUwMTFlXDFcMFwxXHUwMTFlIiArICJcMVx1MDEyM1wxM1x1MDExZVwxXDBcNDRcdTAxMWVcMVwwXDFcdTAxYWZcMVx1MDEyMVwxXHUwMTQ5IiArICJcMVx1MDEyMVwxXHUwMTQ2XDFcdTAxMjFcMVx1MDFhZlwyN1x1MDEyMVwxXHUwMWFmXDJcdTAxMjFcMVx1MDFhZiIgKyAiXDJcdTAxMjFcMVx1MDFhZlwxMFx1MDEyMVwxXHUwMWFmXDRcdTAxMjFcMVx1MDFhZlw3XHUwMTIxXDFcMCIgKyAiXDFcdTAxYjBcMVx1MDEyMlwxXHUwMTRhXDNcdTAxMjJcMVx1MDFiMFwxXHUwMTQ2XDI2XHUwMTIyXDFcdTAxYjAiICsgIlwyXHUwMTIyXDFcdTAxYjBcMlx1MDEyMlwxXHUwMWIwXDEwXHUwMTIyXDFcdTAxYjBcNFx1MDEyMlwxXHUwMWIwIiArICJcN1x1MDEyMlwxXDBcMlx1MDEwY1wxXHUwMTM1XDFcdTAxMGNcMVx1MDEzMlw2NVx1MDEwY1wxXDAiICsgIlwyXHUwMTBkXDFcdTAxMzZcNFx1MDEwZFwxXHUwMTMyXDYyXHUwMTBkXDFcMFwyXHUwMTIxXDFcdTAxNDkiICsgIlwxXHUwMTIxXDFcdTAxNDZcNjVcdTAxMjFcMVwwXDJcdTAxMjJcMVx1MDE0YVw0XHUwMTIyXDFcdTAxNDYiICsgIlw2Mlx1MDEyMiI7Ci0KLQkvKioKLQkgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnNbXSA9IHl5X3VucGFjayh5eV9wYWNrZWQpOwotCi0KLQkvKiBlcnJvciBjb2RlcyAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLS8vdHJpdmlhbCBoYW5kIGVkaXQgdG8gcmVtb3ZlICJub3QgdXNlZCIgd2FybmluZwlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLS8vCXRyaXZpYWwgaGFuZCBlZGl0IHRvIHJlbW92ZSAibm90IHVzZWQiIHdhcm5pbmcJZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0JLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLCAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLCAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSJ9OwotCi0JLyoqCi0JICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUKLQkgKiA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA5LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCA5LCAxLCA5LCAxLCAxLCA5LCAxLCAxLCAxLCA5LCAxLCAxLCAxLCAxLCAxLCAxLCA5LCAxLCAxLCAxLCA5LCA5LCAxLCAxLCAxLCA5LCAxLCAzLCA5LCA5LCAxLCAxLCAxLCA5LCAxLCA5LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCA5LCA5LCAxLCAxLCAxLCAxLCAxLCA5LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCA5LCAzLCAwLCAxLCAxLCAxLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCA5LCAwLCAwLCAwLCAwLCAwLCA5LCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAxLCAxLCAxMywgNywgMCwgMSwgMSwgMCwgMSwgMCwgMCwgOSwgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMCwgMCwgOSwgMCwgOSwgMSwgMCwgMCwgOSwgMCwgMCwgMSwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgMCwgMTMsIDcsIDEsIDksIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDEsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDksIDksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDAsIDAsIDAsIDksIDAsIDAsIDksIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDksIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDksIDAsIDEsIDEsIDEsIDAsIDAsIDksIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDAsCi0JCQkJMCwgMSwgMSwgMSwgMCwgMCwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMSwgMSwgMCwgOSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMSwgMSwgMSwgMCwgMCwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgOSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgOSwgMCwgMCwgMCwgMCwgOSwgMCwgMCwgMCwgOSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0KLQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCXByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0JLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQlwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotCS8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotCS8qKgotCSAqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMgdGhlIHNvdXJjZQotCSAqIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQlwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQlwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotCS8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQlwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0JLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCXByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotCS8qKgotCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZCBmcm9tCi0JICogaW5wdXQKLQkgKi8KLQlwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0JLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXByaXZhdGUgaW50IHl5bGluZTsKLQotCS8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQlwcml2YXRlIGludCB5eWNoYXI7Ci0KLQkvKioKLQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUKLQkgKiBtYXRjaGVkIHRleHQKLQkgKi8KLS8vCXRyaXZpYWwgaGFuZCBlZGl0IHRvIHJlbW92ZSAibm90IHVzZWQiIHdhcm5pbmcJcHJpdmF0ZSBpbnQgeXljb2x1bW47Ci0KLQkvKioKLQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PnRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKLQkgKiBsaW5lCi0JICovCi0vLwl0cml2aWFsIGhhbmQgZWRpdCB0byByZW1vdmUgIm5vdCB1c2VkIiB3YXJuaW5nCXByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PnRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLQkvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVGSU5FRCA9ICJ1bmRlZmluZWQiOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0OwotCS8vIHByaXZhdGUgaW50IGZCdWZmZXJlZFRleHRMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoOwotCS8vIHByaXZhdGUgU3RyaW5nQnVmZmVyIGZCdWZmZXJlZFRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfTk9STUFMID0gMTYzODQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7Ci0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOwotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgewotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbEJ1ZmZlclNpemUoaW50IHNpemUpIHsKLQkJZkluaXRpYWxCdWZmZXJTaXplID0gc2l6ZTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dDsKLQkJU3RyaW5nIG5leHRUb2tlblR5cGU7Ci0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOwotCQkvLyBTdHJpbmdCdWZmZXIgdGV4dDsKLQkJaW50IHN0YXJ0OwotCQlpbnQgdGV4dExlbmd0aDsKLQkJaW50IGxlbmd0aDsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgewotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCQkvLyB0ZXh0ID0gZkJ1ZmZlcmVkVGV4dDsKLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOwotCi0JCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkvLyB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJLy8gdW5kZWYgLT4gY29uY2F0ZW5hdGUgdW5kZWYncwotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJCS8vIHRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLQkJCQkvLyBmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOwotCQkJCXNwYWNlRm9sbG93cyA9IGZhbHNlOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoY29udGV4dCkpIHsgLy8gZGVjbGFyYXRpb24KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIHZhbHVlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBjYW4KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbnRhaW4KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIFZBTFVFX1MKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjYW5Db250YWluU3BhY2UoY29udGV4dCkpIHsKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX1MpOwotCQkJCX0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQKLQkJCQkJaWYgKHNwYWNlRm9sbG93cykgewotCQkJCQkJLy8gbmV4dCBpcyBzcGFjZSAtPiBhcHBlbmQKLQkJCQkJCS8vIHRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsCi0JCQkJCQkvLyByZXR1cm4gaXRzZWxmCi0JCQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLQkJCQkJCS8vIGZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQkJCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCWNvbnRleHQgPSBDU1NfVU5LTk9XTjsKLQkJCX0KLQkJCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovCi0JcHVibGljIGZpbmFsIExpc3QgcGFyc2VUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsKLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOwotCQkJdG9rZW4ua2luZCA9IGtpbmQ7Ci0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsKLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOwotCQkJdG9rZW5zLmFkZCh0b2tlbik7Ci0JCX0KLQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkNvbnRhaW5TcGFjZShTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBDU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHl5Y2hhcjsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQotCQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IGZJbml0aWFsU3RhdGU7IC8vIFlZSU5JVElBTDsKLQotCQkvKioKLQkJICogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcyB0aGUKLQkJICogc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcKLQkJICovCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IGZJbml0aWFsQnVmZmVyU2l6ZSkgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbZkluaXRpYWxCdWZmZXJTaXplXTsKLQkJfQotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikgMCk7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfc3RhcnRSZWFkID0gMDsKLQotCQkvKioKLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCSAqIGZyb20gaW5wdXQKLQkJICovCi0JCXl5X2VuZFJlYWQgPSAwOwotCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0KLQkJLyoqCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mCi0JCSAqIHRoZSBtYXRjaGVkIHRleHQKLQkJICovCi0vLwkJdHJpdmlhbCBoYW5kIGVkaXQgdG8gcmVtb3ZlICJub3QgdXNlZCIgd2FybmluZwkJeXljb2x1bW4gPSAwOwotCi0JCS8qKgotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PnRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKLQkJICogbGluZQotCQkgKi8KLS8vCQl0cml2aWFsIGhhbmQgZWRpdCB0byByZW1vdmUgIm5vdCB1c2VkIiB3YXJuaW5nCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0JCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PnRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQotCQkvKiB1c2VyIHZhcmlhYmxlcyAqLwotCQkvLyBmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBDU1NUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lciBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mCi0JICogdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0JICovCi0JcHVibGljIENTU1Rva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotCQl0aGlzLnl5X3JlYWRlciA9IGluOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4gVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMKLQkgKiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLQkgKi8KLQlwdWJsaWMgQ1NTVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0JICogCi0JICogQHBhcmFtIHBhY2tlZAotCSAqICAgICAgICAgICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0JICogQHJldHVybiB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0JCWludFtdIHRyYW5zID0gbmV3IGludFsyMTAwNF07Ci0JCWludCBpID0gMDsgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAqLwotCQlpbnQgaiA9IDA7IC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0JCXdoaWxlIChpIDwgMTM5MDYpIHsKLQkJCWludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCXZhbHVlLS07Ci0JCQlkbwotCQkJCXRyYW5zW2orK10gPSB2YWx1ZTsKLQkJCXdoaWxlICgtLWNvdW50ID4gMCk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwYWNrZWQKLQkgKiAgICAgICAgICAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICogQHJldHVybiB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLQkJY2hhcltdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotCQlpbnQgaSA9IDA7IC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgKi8KLQkJaW50IGogPSAwOyAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotCQl3aGlsZSAoaSA8IDE3MCkgewotCQkJaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotCQkJY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWRvCi0JCQkJbWFwW2orK10gPSB2YWx1ZTsKLQkJCXdoaWxlICgtLWNvdW50ID4gMCk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgc3RyZWFtIGlzIHJlYWNoZWQuCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0JICovCi0JcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotCQkvKiBzdGFuZGFyZCBjYXNlICovCi0JCWlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkKLQkJCXJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotCQkvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovCi0JCWlmICh5eV9hdEVPRikKLQkJCXJldHVybiBZWUVPRjsKLQotCQkvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotCQkvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotCQlpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfYnVmZmVyLCAwLCB5eV9lbmRSZWFkIC0geXlfc3RhcnRSZWFkKTsKLQotCQkJLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLQkJCXl5X2VuZFJlYWQgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfY3VycmVudFBvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9tYXJrZWRQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfcHVzaGJhY2tQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfc3RhcnRSZWFkID0gMDsKLQkJfQotCi0JCS8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLQkJaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJLyogaWYgbm90OiBibG93IGl0IHVwICovCi0JCQljaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0JCQl5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0JCX0KLQotCQkvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLQkJaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIHl5X2J1ZmZlci5sZW5ndGggLSB5eV9lbmRSZWFkKTsKLQotCQlpZiAobnVtUmVhZCA9PSAtMSkKLQkJCXJldHVybiBZWUVPRjsKLQotCQl5eV9lbmRSZWFkICs9IG51bVJlYWQ7Ci0KLQkJcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCX0KLQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJeXlfYXRFT0YgPSB0cnVlOyAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotCQl5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAqLwotCQl5eV9yZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0JCXJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotCX0KLQotCS8qKgotCSAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0JICogCi0JICogQHBhcmFtIG5ld1N0YXRlCi0JICogICAgICAgICAgICB0aGUgbmV3IGxleGljYWwgc3RhdGUKLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotCQl5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCWZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zIC0geXlfc3RhcnRSZWFkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0JICovCi0JZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLQkJcmV0dXJuIHl5X21hcmtlZFBvcyAtIHl5X3N0YXJ0UmVhZDsKLQl9Ci0KLQotCS8qKgotCSAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckNvZGUKLQkgKiAgICAgICAgICAgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotCSAqLwotCXByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLQkJfQotCQljYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQotCQl9Ci0KLQkJLy8gU3lzdGVtLmV4aXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG51bWJlcgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uIFRoaXMgbnVtYmVyIG11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLQkgKi8KLS8vCXRyaXZpYWwgaGFuZCBlZGl0IHRvIHJlbW92ZSAibm90IHVzZWQiIHdhcm5pbmcKLS8vCXByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLS8vCQlpZiAobnVtYmVyID4geXlsZW5ndGgoKSkKLS8vCQkJeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotLy8KLS8vCQl5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotLy8JfQotCi0KLQkvKioKLQkgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLCB0aGUgZW5kCi0JICogb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IHRva2VuCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlpbnQgeXlfaW5wdXQ7Ci0JCWludCB5eV9hY3Rpb247Ci0KLQkJeXlfcHVzaGJhY2tQb3MgPSAtMTsKLQkJYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQotCQkJeXljaGFyICs9IHl5bGVuZ3RoKCk7Ci0KLQkJCWJvb2xlYW4geXlfY291bnRlZCA9IGZhbHNlOwotCQkJZm9yICh5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zIDwgeXlfbWFya2VkUG9zOyB5eV9jdXJyZW50UG9zKyspIHsKLQkJCQlzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotCQkJCQljYXNlICdccicgOgotCQkJCQkJeXlsaW5lKys7Ci0JCQkJCQl5eV9jb3VudGVkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICdcbicgOgotCQkJCQkJaWYgKHl5X2NvdW50ZWQpCi0JCQkJCQkJeXlfY291bnRlZCA9IGZhbHNlOwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJeXlsaW5lKys7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl5eV9jb3VudGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoeXlfY291bnRlZCkgewotCQkJCWlmICh5eV9hZHZhbmNlKCkgPT0gJ1xuJykKLQkJCQkJeXlsaW5lLS07Ci0JCQkJaWYgKCF5eV9hdEVPRikKLQkJCQkJeXlfY3VycmVudFBvcy0tOwotCQkJfQotCi0JCQl5eV9hY3Rpb24gPSAtMTsKLQotCQkJeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotCQkJeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0JCQl5eV93YXNfcHVzaGJhY2sgPSBmYWxzZTsKLQotCQkJeXlfZm9yQWN0aW9uIDogewotCQkJCXdoaWxlICh0cnVlKSB7Ci0KLQkJCQkJeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLQkJCQkJaWYgKHl5X2lucHV0ID09IFlZRU9GKQotCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0JCQkJCWludCB5eV9uZXh0ID0geXl0cmFuc1t5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XV07Ci0JCQkJCWlmICh5eV9uZXh0ID09IC0xKQotCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQl5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLQkJCQkJaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotCQkJCQlpZiAoKHl5X2F0dHJpYnV0ZXMgJiAyKSA+IDApCi0JCQkJCQl5eV9wdXNoYmFja1BvcyA9IHl5X2N1cnJlbnRQb3M7Ci0KLQkJCQkJaWYgKCh5eV9hdHRyaWJ1dGVzICYgMSkgPiAwKSB7Ci0JCQkJCQl5eV93YXNfcHVzaGJhY2sgPSAoeXlfYXR0cmlidXRlcyAmIDQpID4gMDsKLQkJCQkJCXl5X2FjdGlvbiA9IHl5X3N0YXRlOwotCQkJCQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJCQkJCWlmICgoeXlfYXR0cmlidXRlcyAmIDgpID4gMCkKLQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHl5X3dhc19wdXNoYmFjaykKLQkJCQl5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvczsKLQotCQkJc3dpdGNoICh5eV9hY3Rpb24pIHsKLQotCQkJCWNhc2UgNDIxIDogewotCQkJCQl5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQ7Ci0JCQkJfQotCQkJCWNhc2UgNDMzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MTIgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfRk9OVF9GQUNFX0RFTElNSVRFUik7Ci0JCQkJCXJldHVybiBDU1NfRk9OVF9GQUNFOwotCQkJCX0KLQkJCQljYXNlIDQzNCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzc1IDogewotCQkJCQl5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7Ci0JCQkJCXJldHVybiBDU1NfQ0hBUlNFVDsKLQkJCQl9Ci0JCQkJY2FzZSA0MzUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMzNSA6IHsKLQkJCQkJeXliZWdpbihTVF9JTVBPUlRfVVJJKTsKLQkJCQkJcmV0dXJuIENTU19JTVBPUlQ7Ci0JCQkJfQotCQkJCWNhc2UgNDM2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOTcgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsKLQkJCQkJcmV0dXJuIENTU19NRURJQTsKLQkJCQl9Ci0JCQkJY2FzZSA0MzcgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI5MCA6Ci0JCQkJY2FzZSAzMjcgOgotCQkJCWNhc2UgMzk4IDoKLQkJCQljYXNlIDQwMCA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7Ci0JCQkJCXJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJOwotCQkJCX0KLQkJCQljYXNlIDQzOCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjY5IDoKLQkJCQljYXNlIDMwNyA6Ci0JCQkJY2FzZSAzODUgOgotCQkJCWNhc2UgMzg3IDogewotCQkJCQl5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOwotCQkJCQlyZXR1cm4gQ1NTX1VSSTsKLQkJCQl9Ci0JCQkJY2FzZSA0MzkgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI1NSA6IHsKLQkJCQkJeXliZWdpbihTVF9QQUdFX1BTRVVET19QQUdFKTsKLQkJCQkJcmV0dXJuIENTU19QQUdFOwotCQkJCX0KLQkJCQljYXNlIDQ0MCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjE4IDogewotCQkJCQlyZXR1cm4gQ1NTX0NPTU1FTlQ7Ci0JCQkJfQotCQkJCWNhc2UgNDQxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMTcgOiB7Ci0JCQkJCXJldHVybiBDU1NfQ0RPOwotCQkJCX0KLQkJCQljYXNlIDQ0MiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjExIDoKLQkJCQljYXNlIDI0NSA6Ci0JCQkJY2FzZSAyODMgOgotCQkJCWNhc2UgMjg0IDoKLQkJCQljYXNlIDMyMyA6Ci0JCQkJY2FzZSAzMjQgOgotCQkJCWNhc2UgMzYzIDoKLQkJCQljYXNlIDM2NCA6Ci0JCQkJY2FzZSAzOTQgOgotCQkJCWNhc2UgMzk1IDoKLQkJCQljYXNlIDQwNyA6Ci0JCQkJY2FzZSA0MTcgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOwotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7Ci0JCQkJfQotCQkJCWNhc2UgNDQzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNjUgOiB7Ci0JCQkJCXJldHVybiBDU1NfQ0RDOwotCQkJCX0KLQkJCQljYXNlIDQ0NCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTYyIDogewotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7Ci0JCQkJfQotCQkJCWNhc2UgNDQ1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNTYgOgotCQkJCWNhc2UgMjEwIDoKLQkJCQljYXNlIDI0NCA6Ci0JCQkJY2FzZSAyODIgOgotCQkJCWNhc2UgMzIyIDoKLQkJCQljYXNlIDM2MiA6Ci0JCQkJY2FzZSAzOTMgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOwotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7Ci0JCQkJfQotCQkJCWNhc2UgNDQ2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNTAgOgotCQkJCWNhc2UgMjA1IDoKLQkJCQljYXNlIDIwOCA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7Ci0JCQkJCXJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HOwotCQkJCX0KLQkJCQljYXNlIDQ0NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNTcgOgotCQkJCWNhc2UgNTkgOgotCQkJCWNhc2UgMTI4IDoKLQkJCQljYXNlIDEyOSA6Ci0JCQkJY2FzZSAxOTMgOgotCQkJCWNhc2UgMjM1IDoKLQkJCQljYXNlIDI3MyA6Ci0JCQkJY2FzZSAzMTMgOgotCQkJCWNhc2UgMzUzIDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUik7Ci0JCQkJCXJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUU7Ci0JCQkJfQotCQkJCWNhc2UgNDQ4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1NiA6IHsKLQkJCQkJeXliZWdpbihTVF9TRUxFQ1RPUik7Ci0JCQkJCXJldHVybiBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SOwotCQkJCX0KLQkJCQljYXNlIDQ0OSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNTUgOgotCQkJCWNhc2UgMTI1IDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SOwotCQkJCX0KLQkJCQljYXNlIDQ1MCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNTIgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfREVDTEFSQVRJT04pOwotCQkJCQlyZXR1cm4gQ1NTX0xCUkFDRTsKLQkJCQl9Ci0JCQkJY2FzZSA0NTEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ5IDoKLQkJCQljYXNlIDUxIDoKLQkJCQljYXNlIDEyMyA6Ci0JCQkJY2FzZSAxMjQgOgotCQkJCWNhc2UgMTkyIDoKLQkJCQljYXNlIDIzNCA6Ci0JCQkJY2FzZSAyNzIgOgotCQkJCWNhc2UgMzEyIDoKLQkJCQljYXNlIDM1MiA6IHsKLQkJCQkJeXliZWdpbihTVF9QQUdFX0RFTElNSVRFUik7Ci0JCQkJCXJldHVybiBDU1NfUEFHRV9TRUxFQ1RPUjsKLQkJCQl9Ci0JCQkJY2FzZSA0NTIgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ4IDogewotCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCXJldHVybiBDU1NfTEJSQUNFOwotCQkJCX0KLQkJCQljYXNlIDQ1MyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDcgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsKLQkJCQkJcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7Ci0JCQkJfQotCQkJCWNhc2UgNDU0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0NCA6Ci0JCQkJY2FzZSA0NiA6Ci0JCQkJY2FzZSAxMjAgOgotCQkJCWNhc2UgMTIxIDoKLQkJCQljYXNlIDE5MSA6Ci0JCQkJY2FzZSAyMzMgOgotCQkJCWNhc2UgMjcxIDoKLQkJCQljYXNlIDMxMSA6Ci0JCQkJY2FzZSAzNTEgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsKLQkJCQkJcmV0dXJuIENTU19NRURJVU07Ci0JCQkJfQotCQkJCWNhc2UgNDU1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MyA6IHsKLQkJCQkJeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsKLQkJCQkJcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7Ci0JCQkJfQotCQkJCWNhc2UgNDU2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMCA6Ci0JCQkJY2FzZSAyMyA6Ci0JCQkJY2FzZSA4OSA6Ci0JCQkJY2FzZSA5MCA6Ci0JCQkJY2FzZSAxNjQgOgotCQkJCWNhc2UgMjE0IDoKLQkJCQljYXNlIDI0OSA6Ci0JCQkJY2FzZSAyOTIgOgotCQkJCWNhc2UgMzMxIDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUU7Ci0JCQkJfQotCQkJCWNhc2UgNDU3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMiA6Ci0JCQkJY2FzZSA1NCA6Ci0JCQkJY2FzZSA4NyA6Ci0JCQkJY2FzZSAxMjYgOgotCQkJCWNhc2UgMTYzIDogewotCQkJCQlyZXR1cm4gQ1NTX1M7Ci0JCQkJfQotCQkJCWNhc2UgNDU4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNyA6IHsKLQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCQlyZXR1cm4gQ1NTX1JCUkFDRTsKLQkJCQl9Ci0JCQkJY2FzZSA0NTkgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI5IDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7Ci0JCQkJfQotCQkJCWNhc2UgNDYwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMiA6IHsKLQkJCQkJeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSk7Ci0JCQkJCXJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUOwotCQkJCX0KLQkJCQljYXNlIDQ2MSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzYgOiB7Ci0JCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQkJcmV0dXJuIENTU19ERUxJTUlURVI7Ci0JCQkJfQotCQkJCWNhc2UgNDYyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MCA6Ci0JCQkJY2FzZSA0MiA6Ci0JCQkJY2FzZSAxMTcgOgotCQkJCWNhc2UgMTE4IDoKLQkJCQljYXNlIDE5MCA6Ci0JCQkJY2FzZSAyMzIgOgotCQkJCWNhc2UgMjcwIDoKLQkJCQljYXNlIDMxMCA6Ci0JCQkJY2FzZSAzNTAgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7Ci0JCQkJCXJldHVybiBDU1NfTUVESVVNOwotCQkJCX0KLQkJCQljYXNlIDQ2MyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjAgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7Ci0JCQkJfQotCQkJCWNhc2UgNDY0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2MiA6IHsKLQkJCQkJeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7Ci0JCQkJCXJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsKLQkJCQl9Ci0JCQkJY2FzZSA0NjUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDYzIDoKLQkJCQljYXNlIDY3IDoKLQkJCQljYXNlIDEzMSA6Ci0JCQkJY2FzZSAxMzQgOgotCQkJCWNhc2UgMTM3IDoKLQkJCQljYXNlIDE5NCA6Ci0JCQkJY2FzZSAxOTYgOgotCQkJCWNhc2UgMTk5IDoKLQkJCQljYXNlIDIzNiA6Ci0JCQkJY2FzZSAyNzQgOgotCQkJCWNhc2UgMzE0IDoKLQkJCQljYXNlIDM1NCA6IHsKLQkJCQkJeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU7Ci0JCQkJfQotCQkJCWNhc2UgNDY2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2OCA6Ci0JCQkJY2FzZSA3MCA6Ci0JCQkJY2FzZSAxMzkgOgotCQkJCWNhc2UgMTQwIDoKLQkJCQljYXNlIDIwMSA6Ci0JCQkJY2FzZSAyMzkgOgotCQkJCWNhc2UgMjc3IDoKLQkJCQljYXNlIDMxNyA6Ci0JCQkJY2FzZSAzNTcgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsKLQkJCQl9Ci0JCQkJY2FzZSA0NjcgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDcxIDogewotCQkJCQl5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7Ci0JCQkJfQotCQkJCWNhc2UgNDY4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA3MiA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUpOwotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUjsKLQkJCQl9Ci0JCQkJY2FzZSA0NjkgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDczIDoKLQkJCQljYXNlIDE1NSA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7Ci0JCQkJCXJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOwotCQkJCX0KLQkJCQljYXNlIDQ3MCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNzQgOgotCQkJCWNhc2UgNzkgOgotCQkJCWNhc2UgODMgOgotCQkJCWNhc2UgMTQ3IDoKLQkJCQljYXNlIDE1MyA6Ci0JCQkJY2FzZSAxNTQgOgotCQkJCWNhc2UgMTU5IDoKLQkJCQljYXNlIDIwMyA6Ci0JCQkJY2FzZSAyMTIgOgotCQkJCWNhc2UgMjQxIDoKLQkJCQljYXNlIDI3OSA6Ci0JCQkJY2FzZSAzMTkgOgotCQkJCWNhc2UgMzU5IDogewotCQkJCQl5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsKLQkJCQl9Ci0JCQkJY2FzZSA0NzEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDc4IDogewotCQkJCQl5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsKLQkJCQl9Ci0JCQkJY2FzZSA0NzIgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDg1IDoKLQkJCQljYXNlIDg2IDogewotCQkJCQl5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUjsKLQkJCQl9Ci0JCQkJY2FzZSA0NzMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDkxIDoKLQkJCQljYXNlIDE2NiA6Ci0JCQkJY2FzZSAyMTUgOgotCQkJCWNhc2UgMjUwIDoKLQkJCQljYXNlIDI5MyA6Ci0JCQkJY2FzZSAzMzIgOgotCQkJCWNhc2UgMzczIDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9DTEFTUzsKLQkJCQl9Ci0JCQkJY2FzZSA0NzQgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDkzIDoKLQkJCQljYXNlIDE2NyA6Ci0JCQkJY2FzZSAyMTYgOgotCQkJCWNhc2UgMjUxIDoKLQkJCQljYXNlIDI5NCA6Ci0JCQkJY2FzZSAzMzMgOgotCQkJCWNhc2UgMzc0IDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9JRDsKLQkJCQl9Ci0JCQkJY2FzZSA0NzUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDEwMiA6Ci0JCQkJY2FzZSAxNzYgOgotCQkJCWNhc2UgMjI2IDoKLQkJCQljYXNlIDI1OCA6Ci0JCQkJY2FzZSAyNjAgOgotCQkJCWNhc2UgMzAwIDoKLQkJCQljYXNlIDMzOCA6Ci0JCQkJY2FzZSAzNzggOiB7Ci0JCQkJCXl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOwotCQkJCQlyZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsKLQkJCQl9Ci0JCQkJY2FzZSA0NzYgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDEwNiA6Ci0JCQkJY2FzZSAxNzggOgotCQkJCWNhc2UgMTgxIDogewotCQkJCQl5eWJlZ2luKFNUX0NIQVJTRVRfREVMSU1JVEVSKTsKLQkJCQkJcmV0dXJuIENTU19TVFJJTkc7Ci0JCQkJfQotCQkJCWNhc2UgNDc3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxMTIgOgotCQkJCWNhc2UgMTg0IDoKLQkJCQljYXNlIDE4NyA6IHsKLQkJCQkJeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsKLQkJCQkJcmV0dXJuIENTU19TVFJJTkc7Ci0JCQkJfQotCQkJCWNhc2UgNDc4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNDEgOgotCQkJCWNhc2UgMjAyIDoKLQkJCQljYXNlIDI0MCA6Ci0JCQkJY2FzZSAyNzggOgotCQkJCWNhc2UgMzE4IDoKLQkJCQljYXNlIDM1OCA6Ci0JCQkJY2FzZSAzOTAgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOwotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTjsKLQkJCQl9Ci0JCQkJY2FzZSA0NzkgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE0NCA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7Ci0JCQkJCXJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRTsKLQkJCQl9Ci0JCQkJY2FzZSA0ODAgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE0NiA6Ci0JCQkJY2FzZSAyNDcgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOwotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OOwotCQkJCX0KLQkJCQljYXNlIDQ4MSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTkgOgotCQkJCWNhc2UgMjEgOgotCQkJCWNhc2UgMjQgOgotCQkJCWNhc2UgMjUgOgotCQkJCWNhc2UgMjYgOgotCQkJCWNhc2UgMjggOgotCQkJCWNhc2UgMzAgOgotCQkJCWNhc2UgMzEgOgotCQkJCWNhc2UgMzMgOgotCQkJCWNhc2UgMzQgOgotCQkJCWNhc2UgMzUgOgotCQkJCWNhc2UgMzcgOgotCQkJCWNhc2UgMzggOgotCQkJCWNhc2UgMzkgOgotCQkJCWNhc2UgNDEgOgotCQkJCWNhc2UgNDUgOgotCQkJCWNhc2UgNTAgOgotCQkJCWNhc2UgNTMgOgotCQkJCWNhc2UgNTggOgotCQkJCWNhc2UgNjEgOgotCQkJCWNhc2UgNjQgOgotCQkJCWNhc2UgNjUgOgotCQkJCWNhc2UgNjYgOgotCQkJCWNhc2UgNjkgOgotCQkJCWNhc2UgNzUgOgotCQkJCWNhc2UgNzYgOgotCQkJCWNhc2UgNzcgOgotCQkJCWNhc2UgODAgOgotCQkJCWNhc2UgODEgOgotCQkJCWNhc2UgODIgOgotCQkJCWNhc2UgODQgOiB7Ci0JCQkJCXJldHVybiBVTkRFRklORUQ7Ci0JCQkJfQotCQkJCWNhc2UgNDgyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotCQkJCQkJeXlfYXRFT0YgPSB0cnVlOwotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotCSAqIAotCSAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4gSXQgcHJpbnRzCi0JICogZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkLCBvcgotCSAqIGFuIGVycm9yIG9jY3VyZWQuCi0JICogCi0JICogQHBhcmFtIGFyZ3YKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuIHRoZSBzY2FubmVyCi0JICogICAgICAgICAgICBvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotCQkJQ1NTVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzY2FubmVyID0gbmV3IENTU1Rva2VuaXplcihuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIiArIGFyZ3ZbaV0gKyAiXCIiKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQkJCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIENTU1Rva2VuaXplciA8aW5wdXRmaWxlPiIpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWRvIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQ1NTQ29udGV4dFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NDb250ZXh0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDhmNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NDb250ZXh0UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIENTU0NvbnRleHRSZWdpb24gZXh0ZW5kcyBDb250ZXh0UmVnaW9uIHsKLQlwdWJsaWMgQ1NTQ29udGV4dFJlZ2lvbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQlmVHlwZSA9IGNvbnRleHQ7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NUZXh0UmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NUZXh0UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmNmYTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBDU1NUZXh0UmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1RleHRSZWdpb25GYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlUmVnaW9uKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXJlZ2lvbiA9IG5ldyBDU1NDb250ZXh0UmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Rhc2tzL0NTU1Rhc2tUYWdTZWVrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGFza3MvQ1NTVGFza1RhZ1NlZWtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWJiODJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGFza3MvQ1NTVGFza1RhZ1NlZWtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnRpY2lwYW50cy5UYXNrVGFnU2Vla2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIENTU1Rhc2tUYWdTZWVrZXIgZXh0ZW5kcyBUYXNrVGFnU2Vla2VyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuYnVpbGRlci5wYXJ0aWNpcGFudHMuVGFza1RhZ1NlZWtlciNnZXRDb21tZW50ZWRUZXh0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tZW50ZWRUZXh0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgdGV4dCA9IHN1cGVyLmdldENvbW1lbnRlZFRleHQoZG9jdW1lbnQsIGJlZ2luLCBsZW5ndGgpOwotCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQuZW5kc1dpdGgoIiovIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoKCkgLSAyKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHRleHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNGI0ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgcGxhY2UgdG8gcHV0ICJyZXBhcnNpbmciIGxvZ2ljLiBUaGlzIGlzCi0gKiB0aGUgbG9naWMgdGhhdCByZXBhcnNlcyB0aGUgdGV4dCBpbmNyZW1lbnRhbGx5LCBhcyBhIHVzZXIgdHlwZXMgaW4gbmV3Ci0gKiBjaGFyYWN0ZXJzLCBvciBET00gbm9kZXMgYXJlIGluc2VydGVkIG9yIGRlbGV0ZWQuIE5vdGU6IGl0IGlzIG5vdCBhIHRocmVhZAotICogc2FmZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JY2xhc3MgUmVwYXJzZVJhbmdlIHsKLQkJUmVwYXJzZVJhbmdlKCkgewotCQkJcmVzZXQoKTsKLQkJfQotCi0JCVJlcGFyc2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCWZSYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCQlmUmFuZ2VFbmQgPSBlbmQ7Ci0JCX0KLQotCQl2b2lkIHNldFN0YXJ0KGludCBzdGFydCkgewotCQkJZlJhbmdlU3RhcnQgPSBzdGFydDsKLQkJfQotCi0JCXZvaWQgc2V0RW5kKGludCBlbmQpIHsKLQkJCWZSYW5nZUVuZCA9IGVuZDsKLQkJfQotCi0JCWludCBnZXRTdGFydCgpIHsKLQkJCXJldHVybiBmUmFuZ2VTdGFydDsKLQkJfQotCi0JCWludCBnZXRFbmQoKSB7Ci0JCQlyZXR1cm4gZlJhbmdlRW5kOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1ZhbGlkKCkgewotCQkJcmV0dXJuICgwIDwgZlJhbmdlRW5kIC0gZlJhbmdlU3RhcnQpID8gdHJ1ZSA6IGZhbHNlOwotCQl9Ci0KLQkJdm9pZCByZXNldCgpIHsKLQkJCWZSYW5nZVN0YXJ0ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQlmUmFuZ2VFbmQgPSAwOwotCQl9Ci0KLQkJdm9pZCBleHBhbmQoUmVwYXJzZVJhbmdlIHJhbmdlKSB7Ci0JCQlpZiAocmFuZ2UgPT0gbnVsbCB8fCAhcmFuZ2UuaXNWYWxpZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IHN0YXJ0ID0gcmFuZ2UuZ2V0U3RhcnQoKTsKLQkJCWlmIChzdGFydCA8IGZSYW5nZVN0YXJ0KSB7Ci0JCQkJZlJhbmdlU3RhcnQgPSBzdGFydDsKLQkJCX0KLQkJCWludCBlbmQgPSByYW5nZS5nZXRFbmQoKTsKLQkJCWlmIChmUmFuZ2VFbmQgPCBlbmQpIHsKLQkJCQlmUmFuZ2VFbmQgPSBlbmQ7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGludCBmUmFuZ2VTdGFydDsKLQkJcHJpdmF0ZSBpbnQgZlJhbmdlRW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQkvLyBwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkvLyBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzMigpIHsKLQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBzcGVjaWFsUG9zaXRpb25VcGRhdGUoZlN0YXJ0LCBmU3RhcnQgKwotCS8vIGZMZW5ndGhUb1JlcGxhY2UgLSAxKTsKLQkvLyBpZiAocmVzdWx0ID09IG51bGwpIHsKLQkvLyByZXN1bHQgPSBjaGVja0luc2lkZUJyYWNlKCk7Ci0JLy8gfQotCS8vIHJldHVybiByZXN1bHQ7Ci0JLy8gfQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uU3ludGF4KCkgewotCQlpbnQgY2hlY2tTdGFydCA9IGZTdGFydDsKLQkJaW50IGNoZWNrRW5kID0gZlN0YXJ0ICsgZkxlbmd0aFRvUmVwbGFjZSAtIDE7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChjaGVja0VuZCk7Ci0JCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJY2hlY2tFbmQgPSBlbmRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKGNoZWNrU3RhcnQsIGNoZWNrRW5kKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JEZWxpbWl0ZXIocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yVW5rbm93blJlZ2lvbihyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclF1b3RlcyhyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JDb21tZW50cyhyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JCcmFjZXMocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQ7Ci0KLQkJcmVzdWx0ID0gY2hlY2tJbnNpZGVCcmFjZShyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZXBhcnNlKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JVbmtub3duUmVnaW9uKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpbnQgbmV3U3RhcnQgPSBzdGFydDsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQgLSAxKTsKLQkJaWYgKGl0ZXJhdG9yLmhhc1ByZXYoKSkgewotCQkJaXRlcmF0b3IucHJldigpOyAvLyBza2lwIG15c2VsZgotCQl9Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNQcmV2KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXJhdG9yLnByZXYoKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKSB7Ci0JCQkJbmV3U3RhcnQgPSBpdGVyYXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3RhcnQgIT0gbmV3U3RhcnQpIHsKLQkJCXJldHVybiBuZXcgUmVwYXJzZVJhbmdlKG5ld1N0YXJ0LCBlbmQpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JEZWxpbWl0ZXIoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChkaXJ0eVN0YXJ0ICE9IG51bGwgJiYgZGlydHlTdGFydC5nZXRTdGFydCgpIDwgc3RhcnQpIHsKLQkJCXN0YXJ0ID0gZGlydHlTdGFydC5nZXRTdGFydCgpOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCWlmIChkb2NSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGRvY1JlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2UmVnaW9uID0gZG9jUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBSZXBhcnNlUmFuZ2UocHJldlJlZ2lvbi5nZXRTdGFydCgpLCBlbmQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JRdW90ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCVJlcGFyc2VSYW5nZSByYW5nZSA9IG5ldyBSZXBhcnNlUmFuZ2UoKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICJcIiIsICJcIiIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiXCciLCAiXCciKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChyYW5nZS5pc1ZhbGlkKCkpID8gcmFuZ2UgOiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yQ29tbWVudHMoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCVJlcGFyc2VSYW5nZSByYW5nZSA9IG5ldyBSZXBhcnNlUmFuZ2UoKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICIvKiIsICIqLyIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiPCUiLCAiJT4iKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChyYW5nZS5pc1ZhbGlkKCkpID8gcmFuZ2UgOiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yQnJhY2VzKGludCBzdGFydCwgaW50IGVuZCkgewotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiWyIsICJdIikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICIoIiwgIikiKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgInsiLCAifSIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKHJhbmdlLmlzVmFsaWQoKSkgPyByYW5nZSA6IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0luc2lkZUJyYWNlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWJvb2xlYW4gYkRlY2xhcmF0aW9uID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblR5cGUodHlwZSkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJYkRlY2xhcmF0aW9uID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWJEZWNsYXJhdGlvbikgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2UmVnaW9uID0gQ1NTVXRpbC5maW5kUHJldmlvdXNTaWduaWZpY2FudE5vZGUocmVnaW9uKTsKLQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQl0eXBlID0gcHJldlJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblR5cGUodHlwZSkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJCWJEZWNsYXJhdGlvbiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghYkRlY2xhcmF0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRSZWdpb24gPSBDU1NVdGlsLmZpbmROZXh0U2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IG5leHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25UeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCQliRGVjbGFyYXRpb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiRGVjbGFyYXRpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24gPSBmaW5kUnVsZVN0YXJ0KHJlZ2lvbik7Ci0JCQlpZiAoc3RhcnRSZWdpb24gIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQpOwotCQkJCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSByZXBhcnNlKHN0YXJ0UmVnaW9uLCBlbmRSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kUnVsZVN0YXJ0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBzdGFydFJlZ2lvbjsKLQkJLy8gZmluZCAneycKLQkJd2hpbGUgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJcmVnaW9uID0gcmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCX0KLQkJLy8gaWYgKHJlZ2lvbiA9PSBzdGFydFJlZ2lvbikgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyBlbHNlCi0JCWlmIChyZWdpb24gIT0gbnVsbCkgeyAvLyAneycgaXMgZm91bmQKLQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJaWYgKGlzTGVhZGluZ0RlY2xhcmF0aW9uVHlwZShyZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGVhZGluZ0RlY2xhcmF0aW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFIHx8IENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvclR5cGUodHlwZSkpOwotCX0KLQotCS8vIHB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCS8vIGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Cb3VuZHJ5Q2FzZXMoKSB7Ci0JLy8gcmV0dXJuIHNwZWNpYWxQb3NpdGlvblVwZGF0ZShmU3RhcnQsIGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxKTsKLQkvLyB9Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIG9wZW5lciwgU3RyaW5nIGNsb3NlcikgewotCQlTdHJpbmdCdWZmZXIgZGVsZXRpb25CdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ0J1ZmZlciBpbnNlcnRpb25CdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBxdW90ZUxlbiA9IE1hdGgubWF4KG9wZW5lci5sZW5ndGgoKSwgY2xvc2VyLmxlbmd0aCgpKTsKLQkJaWYgKDEgPCBxdW90ZUxlbikgewotCQkJLyoqCi0JCQkgKiBleCkgb3BlbmVyID0gIkFCQyIsIGNsb3NlciA9ICJYWVoiIG1vZGVsOiBBQkNERUYuLi4uLi4uVVZXWFlaCi0JCQkgKiBkZWxldGlvbjogQ0RFRi4uLi4uLi5VVldYIHByZS9wb3N0OiBBQiAvIFlaCi0JCQkgKi8KLQkJCWludCBhZGRTdGFydCA9IHN0YXJ0IC0gKHF1b3RlTGVuIC0gMSk7Ci0JCQlpZiAoMCA8PSBhZGRTdGFydCkgewotCQkJCVN0cmluZyBhZGRTdHIgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChhZGRTdGFydCwgcXVvdGVMZW4gLSAxKTsKLQkJCQlkZWxldGlvbkJ1Zi5hcHBlbmQoYWRkU3RyKTsKLQkJCQlpbnNlcnRpb25CdWYuYXBwZW5kKGFkZFN0cik7Ci0JCQl9Ci0JCQlkZWxldGlvbkJ1Zi5hcHBlbmQoZkRlbGV0ZWRUZXh0KTsKLQkJCWluc2VydGlvbkJ1Zi5hcHBlbmQoZkNoYW5nZXMpOwotCQkJaWYgKGVuZCArIChxdW90ZUxlbiAtIDEpIDwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCVN0cmluZyBhZGRTdHIgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChlbmQgKyAxLCBxdW90ZUxlbiAtIDEpOwotCQkJCWRlbGV0aW9uQnVmLmFwcGVuZChhZGRTdHIpOwotCQkJCWluc2VydGlvbkJ1Zi5hcHBlbmQoYWRkU3RyKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWRlbGV0aW9uQnVmLmFwcGVuZChmRGVsZXRlZFRleHQpOwotCQkJaW5zZXJ0aW9uQnVmLmFwcGVuZChmQ2hhbmdlcyk7Ci0JCX0KLQkJU3RyaW5nIGRlbGV0aW9uID0gZGVsZXRpb25CdWYudG9TdHJpbmcoKTsKLQkJU3RyaW5nIGluc2VydGlvbiA9IGluc2VydGlvbkJ1Zi50b1N0cmluZygpOwotCi0JCWludCByYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCWludCByYW5nZUVuZCA9IGVuZDsKLQotCQlpZiAoMCA8PSBkZWxldGlvbi5pbmRleE9mKG9wZW5lcikgfHwgMCA8PSBkZWxldGlvbi5pbmRleE9mKGNsb3NlcikgfHwgMCA8PSBpbnNlcnRpb24uaW5kZXhPZihvcGVuZXIpIHx8IDAgPD0gaW5zZXJ0aW9uLmluZGV4T2YoY2xvc2VyKSkgewotCQkJaW50IHMsIGU7Ci0JCQl0cnkgewotCQkJCWlmIChzdGFydCA8PSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJCUlSZWdpb24gc3RhcnRSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoc3RhcnQgLSAxLCBvcGVuZXIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJaWYgKHN0YXJ0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCXMgPSBzdGFydFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXMgPSAtMTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcyA9IC0xOwotCQkJCX0KLQkJCQlpZiAoZW5kIDwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpIHsKLQkJCQkJSVJlZ2lvbiBlbmRSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoZW5kICsgMSwgY2xvc2VyLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQllID0gZW5kUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZSA9IC0xOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllID0gLTE7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpZiAoMCA8PSBzKSB7Ci0JCQkJcmFuZ2VTdGFydCA9IE1hdGgubWluKHJhbmdlU3RhcnQsIHMpOwotCQkJfQotCQkJaWYgKDAgPD0gZSkgewotCQkJCXJhbmdlRW5kID0gTWF0aC5tYXgocmFuZ2VFbmQsIGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJhbmdlU3RhcnQgPCBzdGFydCB8fCBlbmQgPCByYW5nZUVuZCkgewotCQkJcmV0dXJuIG5ldyBSZXBhcnNlUmFuZ2UocmFuZ2VTdGFydCwgcmFuZ2VFbmQpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEEgbWV0aG9kIHRvIGFsbG93IGFueSBoZXVyaXN0aWMgInF1aWNrIGNoZWNrcyIgdGhhdCBtaWdodCBjb3ZlciBtYW55Ci0JLy8gKiBtYW55IGNhc2VzLCBiZWZvcmUgZXhwZW5kaW5nIHRoZSB0aW1lIG9uIGEgZnVsbCByZXBhcnNlLgotCS8vICoKLQkvLyAqLwotCS8vIHB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBxdWlja0NoZWNrMigpIHsKLQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCS8vIGludCBlbmQgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMTsKLQkvLwkJCi0JLy8gcmVzdWx0ID0gc3BlY2lhbE5vZGVVcGRhdGUoZlN0YXJ0LCBlbmQpOwotCS8vCi0JLy8gaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JLy8gcmVzdWx0ID0gc3VwZXIucXVpY2tDaGVjaygpOwotCS8vIH0KLQkvLwotCS8vIHJldHVybiByZXN1bHQ7Ci0JLy8gfQotCi0JLy8gLyoqCi0JLy8gKgotCS8vICovCi0JLy8gcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBzcGVjaWFsTm9kZVVwZGF0ZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkvLyBpbnQgcmVwYXJzZVN0YXJ0ID0gc3RhcnQ7Ci0JLy8gaW50IHJlcGFyc2VFbmQgPSBlbmQ7Ci0JLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YXJnZXROb2RlOwotCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZTsKLQkvLyAvLyB0YXJnZXROb2RlID0gc2tpcExlYWRpbmdCbGFuayhub2RlKTsKLQkvLyAvLyBpZiAodGFyZ2V0Tm9kZSAhPSBudWxsICYmIHRhcmdldE5vZGUgIT0gbm9kZSAmJgotCS8vIC8vICh0YXJnZXROb2RlIGluc3RhbmNlb2YKLQkvLyAvLyBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuaW1wbC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCS8vIG5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkvLyB0YXJnZXROb2RlID0gQ1NTVXRpbC5maW5kUHJldmlvdXNTaWduaWZpY2FudE5vZGUobm9kZSk7Ci0JLy8gaWYgKHRhcmdldE5vZGUgIT0gbnVsbCAmJiB0YXJnZXROb2RlICE9IG5vZGUpIHsKLQkvLyByZXBhcnNlU3RhcnQgPSBNYXRoLm1pbihyZXBhcnNlU3RhcnQsIHRhcmdldE5vZGUuZ2V0U3RhcnQoKSk7Ci0JLy8gfQotCS8vCi0JLy8gLy8gdGFyZ2V0Tm9kZSA9IHNraXBUcmFpbGluZ0JsYW5rKG5vZGUpOwotCS8vIC8vIGlmICh0YXJnZXROb2RlICE9IG51bGwgJiYgdGFyZ2V0Tm9kZSAhPSBub2RlICYmCi0JLy8gLy8gKHRhcmdldE5vZGUgaW5zdGFuY2VvZgotCS8vIC8vIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5pbXBsLklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JLy8gbm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kKTsKLQkvLyB0YXJnZXROb2RlID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShub2RlKTsKLQkvLyBpZiAodGFyZ2V0Tm9kZSAhPSBudWxsICYmIHRhcmdldE5vZGUgIT0gbm9kZSkgewotCS8vIHJlcGFyc2VFbmQgPSBNYXRoLm1heChyZXBhcnNlRW5kLCB0YXJnZXROb2RlLmdldEVuZCgpKTsKLQkvLyB9Ci0JLy8KLQkvLyBpZiAocmVwYXJzZVN0YXJ0ICE9IHN0YXJ0IHx8IHJlcGFyc2VFbmQgIT0gZW5kKSB7Ci0JLy8gcmV0dXJuIHJlcGFyc2UocmVwYXJzZVN0YXJ0LCByZXBhcnNlRW5kKTsKLQkvLyB9IGVsc2UgewotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBJZiBmb2xsb3dpbmcgY2hhcmF0ZXIocykgaXMgaW4gY2hhbmdlcywgSXQgaXMgbmVjZXNzYXJ5IHRvIHBhcnNlCi0JLy8gbm9kZXMKLQkvLyAqIHdoaWNoIGFyZSBpbiBmb3J3YXJkIGFuZC9vciBiYWNrd2FyZC4KLQkvLyAqCi0JLy8gKiBvcGVuZXJzIDogWywgKCwgXC9cKiBjbG9zZXJzIDogXSwgKSwgXCpcLyBxdW90ZXMgOiAiLCAnCi0JLy8gKi8KLQkvLyBwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHNwZWNpYWxQb3NpdGlvblVwZGF0ZShpbnQgc3RhcnQsIGludAotCS8vIGVuZCkgewotCS8vIFN0cmluZ1tdIG9wZW5lcnMgPSB7ICJbIiwgIigiLCAiLyoiLCAiXCIiLCAiJyIsICI8JSIgfTsKLQkvLyAvLyROT04tTkxTLTYkLy8kTk9OLU5MUy01JC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkvLyBTdHJpbmdbXSBjbG9zZXJzID0geyAiXSIsICIpIiwgIiovIiwgIlwiIiwgIiciLCAiJT4iIH07Ci0JLy8gLy8kTk9OLU5MUy02JC8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JLy8KLQkvLyBpbnQgcmFuZ2VTdGFydCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCS8vIGludCByYW5nZUVuZCA9IDA7Ci0JLy8KLQkvLyBmb3IgKGludCBpID0gMDsgaSA8IG9wZW5lcnMubGVuZ3RoICYmIGkgPCBjbG9zZXJzLmxlbmd0aDsgaSsrKSB7Ci0JLy8gUmVwYXJzZVJhbmdlIHJhbmdlID0gZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsIG9wZW5lcnNbaV0sCi0JLy8gY2xvc2Vyc1tpXSk7Ci0JLy8gaWYgKHJhbmdlICE9IG51bGwpIHsKLQkvLyByYW5nZVN0YXJ0ID0gTWF0aC5taW4ocmFuZ2VTdGFydCwgcmFuZ2UuZ2V0U3RhcnQoKSk7Ci0JLy8gcmFuZ2VFbmQgPSBNYXRoLm1heChyYW5nZUVuZCwgcmFuZ2UuZ2V0RW5kKCkpOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyBpZiAocmFuZ2VTdGFydCA8IHJhbmdlRW5kKSB7Ci0JLy8gcmV0dXJuIHJlcGFyc2UocmFuZ2VTdGFydCwgcmFuZ2VFbmQpOwotCS8vIH0gZWxzZSB7Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zc2UubW9kZWwuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDUxNTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTU19HRU5FUklDID0gMTAxMTA5OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIENTU19HRU5FUklDIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjU3ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFdhbGtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VdGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgewotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgPSBudWxsOwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZlN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JU3RyaW5nIGZPcmlnaW5hbENoYW5nZXMgPSBudWxsOwotCWludCBmT3JpZ2luYWxPZmZzZXQgPSAwOwotCWludCBmT3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UgPSAwOwotCWludCBmTGVuZ3RoRGlmZmVyZW5jZSA9IDA7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyKCkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaW5pdGlhbGl6ZShldmVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBPbGQgTm9kZXM6IC0tW08xXS0tW08yXS0tW08zXS0tLSA6IC8gXCBDdXJyZW50IE5vZGVzOgotCSAqIC0tLVtDMV0tLS0tLVtDMl0tLS0tLVtDM10tLS0tLVtDNF0tLS0KLQkgKiAKLQkgKiBJbnB1dDogTzEgLT4gT3V0cHV0OiBPMiBJbnB1dDogTzIgLT4gT3V0cHV0OiBPMyBJbnB1dDogTzMgLT4gT3V0cHV0OiBDNAotCSAqIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuKzEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCW5leHROb2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCQlpZiAobmV4dE5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCQkJLy8gdGhpcyBtYXkgYmUgdGhlIGVuZCBvZiBvbGQgZmxhdG5vZGVzCi0JCQkJCWludCBuZXdTdGFydCA9IG5vZGUuZ2V0RW5kKCkgLSBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCQkJbmV4dE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5ld1N0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPKiAtPiBPdXRwdXQ6IEM0IElucHV0OiBDbiAtPiBPdXRwdXQ6IENuKzEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0Tm9kZUluQ3VycmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSA9IG51bGw7Ci0JCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkRW5kTm9kZSA9IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0Lml0ZW0oZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCWludCBuZXdTdGFydCA9IG9sZEVuZE5vZGUuZ2V0RW5kKCkgLSBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCW5leHROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXdTdGFydCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQluZXh0Tm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBuZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBPbGQgTm9kZXM6IC0tW08xXS0tW08yXS0tW08zXS0tLSA6IC8gXCBDdXJyZW50IE5vZGVzOgotCSAqIC0tLVtDMV0tLS0tLVtDMl0tLS0tLVtDM10tLS0tLVtDNF0tLS0KLQkgKiAKLQkgKiBJbnB1dDogTzEgLT4gT3V0cHV0OiBDMSBJbnB1dDogTzIgLT4gT3V0cHV0OiBPMSBJbnB1dDogTzMgLT4gT3V0cHV0OiBPMgotCSAqIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuLTEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXByZXZOb2RlID0gbm9kZS5nZXRQcmV2aW91cygpOwotCQkJaWYgKHByZXZOb2RlID09IG51bGwpIHsKLQkJCQlpZiAoaXNPbGROb2RlKG5vZGUpKSB7Ci0JCQkJCS8vIHRoaXMgbWF5IGJlIHRoZSBzdGFydCBvZiBvbGQgZmxhdG5vZGVzCi0JCQkJCWludCBuZXdFbmQgPSBub2RlLmdldFN0YXJ0KCkgLSAxOwotCQkJCQlwcmV2Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3RW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZXZOb2RlOwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPKiAtPiBPdXRwdXQ6IEMxIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuLTEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2Tm9kZUluQ3VycmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RhcnROb2RlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuaXRlbSgwKTsKLQkJCWludCBuZXdFbmQgPSBvbGRTdGFydE5vZGUuZ2V0U3RhcnQoKSAtIDE7Ci0JCQlwcmV2Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3RW5kKTsKLQkJfQotCQllbHNlIGlmIChub2RlICE9IG51bGwpIHsKLQkJCXByZXZOb2RlID0gbm9kZS5nZXRQcmV2aW91cygpOwotCQl9Ci0JCXJldHVybiBwcmV2Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJZk9yaWdpbmFsQ2hhbmdlcyA9IGV2ZW50LmdldFRleHQoKTsKLQkJZk9yaWdpbmFsT2Zmc2V0ID0gZXZlbnQuZ2V0T3JpZ2luYWxTdGFydCgpOwotCQlmT3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UgPSBldmVudC5nZXRMZW5ndGgoKTsKLQkJZkxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShmT3JpZ2luYWxDaGFuZ2VzLCBmT3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UpOwotCi0JCWlmIChldmVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSB7Ci0JCQlmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIGV2ZW50KS5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09sZE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWJvb2xlYW4gYk9sZCA9IGZhbHNlOwotCQlpZiAoZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgIT0gbnVsbCkgewotCQkJRW51bWVyYXRpb24gZSA9IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0LmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCWlmIChlLm5leHRFbGVtZW50KCkgPT0gbm9kZSkgewotCQkJCQliT2xkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBiT2xkOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2NmEyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVF9TVFlMRSA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gbGVnYWxUeXBlcyA9IG5ldyBTdHJpbmdbXXtTVF9TVFlMRSwgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5TVF9ERUZBVUxUX1BBUlRJVElPTn07Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBTVF9TVFlMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBsZWdhbFR5cGVzOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhNTdkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1DYXRlZ29yeSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0Q2FwdGlvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NQ2hhcnNldFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NQ2hhcnNldFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2ZjI2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUNoYXJzZXRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NQ2hhcnNldFJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmZTE0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUNvbnRhaW5lciBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMzY0ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NRGVzY3JpcHRvciBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlJdGVyYXRvciBnZXRWYWx1ZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUZvbnRGYWNlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1Gb250RmFjZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5NjU1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUZvbnRGYWNlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUZvbnRGYWNlUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NRnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3OWM2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NRnVuY3Rpb24gZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JU3RyaW5nIGdldEZ1bmN0aW9uU3RyaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1JbXBvcnRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUltcG9ydFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwYTBmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUltcG9ydFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1JbXBvcnRSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1LZXl3b3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUtleXdvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQzYTFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTUtleXdvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1LZXl3b3JkIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRLZXl3b3JkU3RyaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1NZWRpYVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NTWVkaWFSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzN2MzOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1NZWRpYVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1NZWRpYVJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDMyZmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTU5vZGUgewotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQlTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKTsKLQotCUl0ZXJhdG9yIGdldENoaWxkTm9kZXMoKTsKLQotCUl0ZXJhdG9yIGdldERlc2NlbmRhbnRzKCk7Ci0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgX1BSRUZJWCA9ICJDU1NNTS4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0tFWVdPUkQgPSBfUFJFRklYICsgIktleXdvcmQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1VOSVQgPSBfUFJFRklYICsgIlVuaXQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZVTkNUSU9OID0gX1BSRUZJWCArICJGdW5jdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1RSSU5HID0gX1BSRUZJWCArICJTdHJpbmciOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NUWUxFX1NIRUVUID0gX1BSRUZJWCArICJTdHlsZVNoZWV0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QUk9QRVJUWSA9IF9QUkVGSVggKyAiUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFU0NSSVBUT1IgPSBfUFJFRklYICsgIkRlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NPTlRBSU5FUiA9IF9QUkVGSVggKyAiQ29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OVU1CRVIgPSBfUFJFRklYICsgIk51bWJlciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VQQVJBVE9SID0gX1BSRUZJWCArICJTZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NIQVJTRVRfUlVMRSA9IF9QUkVGSVggKyAiQ2hhcnNldFJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lNUE9SVF9SVUxFID0gX1BSRUZJWCArICJJbXBvcnRSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVFlMRV9SVUxFID0gX1BSRUZJWCArICJTdHlsZVJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01FRElBX1JVTEUgPSBfUFJFRklYICsgIk1lZGlhUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUEFHRV9SVUxFID0gX1BSRUZJWCArICJQYWdlUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRk9OVF9GQUNFX1JVTEUgPSBfUFJFRklYICsgIkZvbnRGYWNlUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ0FURUdPUlkgPSBfUFJFRklYICsgIkNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NRVRBX01PREVMID0gX1BSRUZJWCArICJNZXRhTW9kZWwiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NFTEVDVE9SID0gX1BSRUZJWCArICJTZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1OdW1iZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiODAxNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1OdW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1OdW1iZXIgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTVBhZ2VSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTVBhZ2VSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMTgzOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1QYWdlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVBhZ2VSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjlhNmIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1Qcm9wZXJ0eSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0Q2F0ZWdvcnlOYW1lKCk7Ci0KLQlJdGVyYXRvciBnZXRWYWx1ZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OGM5ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1TZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NU2VsZWN0b3IgZXh0ZW5kcyBDU1NNTU5vZGUgewotCVN0cmluZyBnZXRTZWxlY3RvclR5cGUoKTsKLQotCVN0cmluZyBnZXRTZWxlY3RvclN0cmluZygpOwotCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRVhQUkVTU0lPTiA9ICJFeHByZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QU0VVRE9fQ0xBU1MgPSAiUHNldWRvQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BTRVVET19FTEVNRU5UID0gIlBzZXVkb0VsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBlbWJlZGRlZCBleHByZXNzaW9uIHR5cGUKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fREVTQ0VOREFOVCA9ICJkZXNjZW5kYW50IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9DSElMRCA9ICJjaGlsZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fQURKQUNFTlQgPSAiYWRqYWNlbnQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1VOSVZFUlNBTCA9ICJ1bml2ZXJzYWwiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX0FUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1TdHJpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNGE5OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1TdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1TdHJpbmcgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NU3R5bGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNTdjYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1TdHlsZVJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTVN0eWxlU2hlZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NU3R5bGVTaGVldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzdiMTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NU3R5bGVTaGVldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVN0eWxlU2hlZXQgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNTVVuaXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTg1OTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01NVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVVuaXQgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JU3RyaW5nIGdldFVuaXRTdHJpbmcoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NNZXRhTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01ldGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2VkMmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL0NTU01ldGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBDU1NNZXRhTW9kZWwgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JLy8gcHVibGljIGludGVyZmFjZSBDU1NNZXRhTW9kZWwgewotCUNTU01NU3R5bGVTaGVldCBnZXRTdHlsZVNoZWV0KCk7Ci0KLQkvKgotCSAqIFNob3J0Y3V0IHRvIGFjY2VzcyBwcm9wZXJ0eSBub2RlCi0JICovCi0JLy8gSXRlcmF0b3IgZ2V0UHJvcGVydGllcygpOwotCS8vIEl0ZXJhdG9yIGdldERlc2NyaXB0b3JzKCk7Ci0JLy8gQ1NTTU1Qcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQkvKgotCSAqIGFjY2VzcyB0byBjYXRlZ29yeSBpbmZvcm1hdGlvbgotCSAqLwotCUl0ZXJhdG9yIGdldENhdGVnb3JpZXMoKTsKLQotCS8qCi0JICogVXRpbGl0aWVzCi0JICovCi0JLy8gSXRlcmF0b3IgY29sbGVjdE5vZGVzQnlUeXBlKFN0cmluZyB0eXBlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NQcm9maWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NQcm9maWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMTUwNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1Byb2ZpbGUgewotCi0JU3RyaW5nIGdldFByb2ZpbGVJRCgpOwotCi0JU3RyaW5nIGdldFByb2ZpbGVOYW1lKCk7Ci0KLQlVUkwgZ2V0UHJvZmlsZVVSTCgpOwotCi0JQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQotCVN0cmluZyBnZXRPd25lclBsdWdpbklEKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvQ1NTUHJvZmlsZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NQcm9maWxlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwYjc5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC9DU1NQcm9maWxlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLlJlZ2lzdHJ5UmVhZGVyOwotCi0KLQotcHVibGljIGNsYXNzIENTU1Byb2ZpbGVSZWdpc3RyeSB7Ci0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTUHJvZmlsZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NQcm9maWxlUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRQcm9maWxlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oZlByb2ZpbGVzLnZhbHVlcygpKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBDU1NQcm9maWxlIGdldFByb2ZpbGUoU3RyaW5nIHByb2ZpbGVJRCkgewotCQlyZXR1cm4gKENTU1Byb2ZpbGUpIGZQcm9maWxlcy5nZXQocHJvZmlsZUlEKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBnZXREZWZhdWx0UHJvZmlsZSgpIHsKLQkJSXRlcmF0b3IgaSA9IGdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJaWYgKHByb2ZpbGUuaXNEZWZhdWx0KCkpIHsKLQkJCQlyZXR1cm4gcHJvZmlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTUHJvZmlsZVJlZ2lzdHJ5LgotCSAqLwotCXByaXZhdGUgQ1NTUHJvZmlsZVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCQlmUHJvZmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlJdGVyYXRvciBpID0gbmV3IFJlZ2lzdHJ5UmVhZGVyKCkuZW51bVByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHByb2ZpbGUgPSBpLm5leHQoKTsKLQkJCWlmIChwcm9maWxlIGluc3RhbmNlb2YgQ1NTUHJvZmlsZSkgewotCQkJCWZQcm9maWxlcy5wdXQoKChDU1NQcm9maWxlKSBwcm9maWxlKS5nZXRQcm9maWxlSUQoKSwgcHJvZmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIENTU1Byb2ZpbGVSZWdpc3RyeSBmSW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgTWFwIGZQcm9maWxlcyA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NGdW5jdGlvbklELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU0Z1bmN0aW9uSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkYzhkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU0Z1bmN0aW9uSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0Z1bmN0aW9uSUQgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0FUVFIgPSAiYXR0ciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfQ09VTlRFUiA9ICJjb3VudGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9SR0IgPSAicmdiIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9SRUNUID0gInJlY3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0ZPUk1BVCA9ICJmb3JtYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0xPQ0FMID0gImxvY2FsIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTS2V5d29yZElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU0tleXdvcmRJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmUxY2UxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTS2V5d29yZElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTS2V5d29yZElEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18xMDAgPSAiMTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18yMDAgPSAiMjAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18zMDAgPSAiMzAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS180MDAgPSAiNDAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS181MDAgPSAiNTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS182MDAgPSAiNjAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS183MDAgPSAiNzAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS184MDAgPSAiODAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS185MDAgPSAiOTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BQk9WRSA9ICJhYm92ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUJTT0xVVEUgPSAiYWJzb2x1dGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FDVElWRUJPUkRFUiA9ICJBY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FDVElWRUNBUFRJT04gPSAiQWN0aXZlQ2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUxMID0gImFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUxXQVlTID0gImFsd2F5cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVBQV09SS1NQQUNFID0gIkFwcFdvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVFVQSA9ICJhcXVhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BUk1FTklBTiA9ICJhcm1lbmlhbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVVUTyA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BVk9JRCA9ICJhdm9pZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkFDS0dST1VORCA9ICJCYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CQVNFTElORSA9ICJiYXNlbGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkVISU5EID0gImJlaGluZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkVMT1cgPSAiYmVsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JJRElfT1ZFUlJJREUgPSAiYmlkaS1vdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxBQ0sgPSAiYmxhY2siOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JMSU5LID0gImJsaW5rIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CTE9DSyA9ICJibG9jayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxVRSA9ICJibHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPTERFUiA9ICJib2xkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPVEggPSAiYm90aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9ORkFDRSA9ICJCdXR0b25GYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05ISUdITElHSFQgPSAiQnV0dG9uSGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05TSEFET1cgPSAiQnV0dG9uU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05URVhUID0gIkJ1dHRvblRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NBUElUQUxJWkUgPSAiY2FwaXRhbGl6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0FQVElPTiA9ICJjYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DQVBUSU9OVEVYVCA9ICJDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0VOVEVSID0gImNlbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0VOVEVSX0xFRlQgPSAiY2VudGVyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NFTlRFUl9SSUdIVCA9ICJjZW50ZXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NISUxEID0gImNoaWxkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSVJDTEUgPSAiY2lyY2xlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSktfSURFT0dSQVBISUMgPSAiY2prLWlkZW9ncmFwaGljIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DTE9TRV9RVU9URSA9ICJjbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT05ERU5TRUQgPSAiY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT0xMQVBTRSA9ICJjb2xsYXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09NUEFDVCA9ICJjb21wYWN0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1AgPSAiY3JvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ1JPU1MgPSAiY3Jvc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1NTSEFJUiA9ICJjcm9zc2hhaXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NVUlNJVkUgPSAiY3Vyc2l2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREFTSEVEID0gImRhc2hlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVDSU1BTCA9ICJkZWNpbWFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ERUNJTUFMX0xFQURJTkdfWkVSTyA9ICJkZWNpbWFsLWxlYWRpbmctemVybyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ESUdJVFMgPSAiZGlnaXRzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ESVNDID0gImRpc2MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RPVFRFRCA9ICJkb3R0ZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VfUkVTSVpFID0gImUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FTUJFRCA9ICJlbWJlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYVFJBX0NPTkRFTlNFRCA9ICJleHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYVFJBX0VYUEFOREVEID0gImV4dHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQU5UQVNZID0gImZhbnRhc3kiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZBUl9MRUZUID0gImZhci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVJfUklHSFQgPSAiZmFyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVNUID0gImZhc3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZBU1RFUiA9ICJmYXN0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZFTUFMRSA9ICJmZW1hbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZJWEVEID0gImZpeGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GVUNIU0lBID0gImZ1Y2hzaWEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dFT1JHSUFOID0gImdlb3JnaWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkFZID0gImdyYXkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dSQVlURVhUID0gIkdyYXlUZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkVFTiA9ICJncmVlbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfR1JPT1ZFID0gImdyb292ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSEVCUkVXID0gImhlYnJldyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSEVMUCA9ICJoZWxwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISURERU4gPSAiaGlkZGVuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISURFID0gImhpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJR0ggPSAiaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSExJR0hUID0gIkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSExJR0hUVEVYVCA9ICJIaWdobGlnaHRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISUdIRVIgPSAiaGlnaGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISVJBR0FOQSA9ICJoaXJhZ2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElSQUdBTkFfSVJPSEEgPSAiaGlyYWdhbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5BQ1RJVkVCT1JERVIgPSAiSW5hY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQ0FQVElPTiA9ICJJbmFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQ0FQVElPTlRFWFQgPSAiSW5hY3RpdmVDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5GT0JBQ0tHUk9VTkQgPSAiSW5mb0JhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lORk9URVhUID0gIkluZm9UZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkxJTkUgPSAiaW5saW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkxJTkVfVEFCTEUgPSAiaW5saW5lLXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTlNFVCA9ICJpbnNldCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5TSURFID0gImluc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5WRVJUID0gImludmVydCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSlVTVElGWSA9ICJqdXN0aWZ5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19LQVRBS0FOQSA9ICJrYXRha2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfS0FUQUtBTkFfSVJPSEEgPSAia2F0YWthbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xBTkRTQ0FQRSA9ICJsYW5kc2NhcGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xBUkdFID0gImxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MQVJHRVIgPSAibGFyZ2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRUZUID0gImxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFRlRfU0lERSA9ICJsZWZ0LXNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFRlRXQVJEUyA9ICJsZWZ0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFVkVMID0gImxldmVsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MSUdIVEVSID0gImxpZ2h0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xJTUUgPSAibGltZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElORV9USFJPVUdIID0gImxpbmUtdGhyb3VnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElTVF9JVEVNID0gImxpc3QtaXRlbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9VRCA9ICJsb3VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1cgPSAibG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUiA9ICJsb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfQUxQSEEgPSAibG93ZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSX0dSRUVLID0gImxvd2VyLWdyZWVrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUl9MQVRJTiA9ICJsb3dlci1sYXRpbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfUk9NQU4gPSAibG93ZXItcm9tYW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSQ0FTRSA9ICJsb3dlcmNhc2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xUUiA9ICJsdHIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01BTEUgPSAibWFsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUFSS0VSID0gIm1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUFST09OID0gIm1hcm9vbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVESVVNID0gIm1lZGl1bSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVOVSA9ICJtZW51IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NRU5VVEVYVCA9ICJNZW51VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVTU0FHRV9CT1ggPSAibWVzc2FnZS1ib3giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01JWCA9ICJtaXgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01PTk9TUEFDRSA9ICJtb25vc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01PVkUgPSAibW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTl9SRVNJWkUgPSAibi1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05BUlJPV0VSID0gIm5hcnJvd2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OQVZZID0gIm5hdnkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05FX1JFU0laRSA9ICJuZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PX0NMT1NFX1FVT1RFID0gIm5vLWNsb3NlLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT19PUEVOX1FVT1RFID0gIm5vLW9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PX1JFUEVBVCA9ICJuby1yZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PTkUgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9STUFMID0gIm5vcm1hbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9XUkFQID0gIm5vd3JhcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTldfUkVTSVpFID0gIm53LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT0JMSVFVRSA9ICJvYmxpcXVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PTElWRSA9ICJvbGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT05DRSA9ICJvbmNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PUEVOX1FVT1RFID0gIm9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09VVFNFVCA9ICJvdXRzZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09VVFNJREUgPSAib3V0c2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT1ZFUkxJTkUgPSAib3ZlcmxpbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BPSU5URVIgPSAicG9pbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUE9SVFJBSVQgPSAicG9ydHJhaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BSRSA9ICJwcmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BVUlBMRSA9ICJwdXJwbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFRCA9ICJyZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFTEFUSVZFID0gInJlbGF0aXZlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRVBFQVQgPSAicmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRVBFQVRfWCA9ICJyZXBlYXQteCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUkVQRUFUX1kgPSAicmVwZWF0LXkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JJREdFID0gInJpZGdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUklHSFRfU0lERSA9ICJyaWdodC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSUdIVFdBUkRTID0gInJpZ2h0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JUTCA9ICJydGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JVTl9JTiA9ICJydW4taW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NfUkVTSVpFID0gInMtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TQU5TX1NFUklGID0gInNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NDUk9MTCA9ICJzY3JvbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NDUk9MTEJBUiA9ICJTY3JvbGxiYXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFX1JFU0laRSA9ICJzZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFTUlfQ09OREVOU0VEID0gInNlbWktY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRU1JX0VYUEFOREVEID0gInNlbWktZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFUEFSQVRFID0gInNlcGFyYXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRVJJRiA9ICJzZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0hPVyA9ICJzaG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TSUxFTlQgPSAic2lsZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TSUxWRVIgPSAic2lsdmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTE9XID0gInNsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NMT1dFUiA9ICJzbG93ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMID0gInNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTUFMTF9DQVBTID0gInNtYWxsLWNhcHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMX0NBUFRJT04gPSAic21hbGwtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU01BTExFUiA9ICJzbWFsbGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TT0ZUID0gInNvZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NPTElEID0gInNvbGlkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TUEVMTF9PVVQgPSAic3BlbGwtb3V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TUVVBUkUgPSAic3F1YXJlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVEFUVVNfQkFSID0gInN0YXR1cy1iYXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NVQiA9ICJzdWIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NVUEVSID0gInN1cGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TV19SRVNJWkUgPSAic3ctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRSA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEFCTEVfQ0FQVElPTiA9ICJ0YWJsZS1jYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9DRUxMID0gInRhYmxlLWNlbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NPTFVNTiA9ICJ0YWJsZS1jb2x1bW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NPTFVNTl9HUk9VUCA9ICJ0YWJsZS1jb2x1bW4tZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0ZPT1RFUl9HUk9VUCA9ICJ0YWJsZS1mb290ZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0hFQURFUl9HUk9VUCA9ICJ0YWJsZS1oZWFkZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX1JPVyA9ICJ0YWJsZS1yb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX1JPV19HUk9VUCA9ICJ0YWJsZS1yb3ctZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RFQUwgPSAidGVhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19URVhUX1RPUCA9ICJ0ZXh0LXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVF9CT1RUT00gPSAidGV4dC1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RISUNLID0gInRoaWNrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USElOID0gInRoaW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RIUkVFRERBUktTSEFET1cgPSAiVGhyZWVERGFya1NoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVERkFDRSA9ICJUaHJlZURGYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRURISUdITElHSFQgPSAiVGhyZWVESGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRURMSUdIVFNIQURPVyA9ICJUaHJlZURMaWdodFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVEU0hBRE9XID0gIlRocmVlRFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVFJBTlNQQVJFTlQgPSAidHJhbnNwYXJlbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VMVFJBX0NPTkRFTlNFRCA9ICJ1bHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VMVFJBX0VYUEFOREVEID0gInVsdHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VTkRFUkxJTkUgPSAidW5kZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUl9BTFBIQSA9ICJ1cHBlci1hbHBoYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVVBQRVJfTEFUSU4gPSAidXBwZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VQUEVSX1JPTUFOID0gInVwcGVyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUkNBU0UgPSAidXBwZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19WSVNJQkxFID0gInZpc2libGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dfUkVTSVpFID0gInctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XQUlUID0gIndhaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dISVRFID0gIndoaXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XSURFUiA9ICJ3aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lORE9XID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lORE9XRlJBTUUgPSAiV2luZG93RnJhbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dJTkRPV1RFWFQgPSAiV2luZG93VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9GQVNUID0gIngtZmFzdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9ISUdIID0gIngtaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9MQVJHRSA9ICJ4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX0xPVUQgPSAieC1sb3VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX0xPVyA9ICJ4LWxvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TTE9XID0gIngtc2xvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TTUFMTCA9ICJ4LXNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX1NPRlQgPSAieC1zb2Z0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YWF9TTUFMTCA9ICJ4eC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWFhfTEFSR0UgPSAieHgtbGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1lFTExPVyA9ICJ5ZWxsb3ciOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NNTVR5cGVDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTTU1UeXBlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MWNhODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NNTVR5cGVDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTTU1UeXBlQ29sbGVjdG9yIGV4dGVuZHMgQ1NTTWV0YU1vZGVsVHJhdmVyc2VyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUeXBlQ29sbGVjdG9yLgotCSAqLwotCXB1YmxpYyBDU1NNTVR5cGVDb2xsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHkoQ1NTTU1Ob2RlIG5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCWZUeXBlID0gdHlwZTsKLQkJZk5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhcHBseShub2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0TmVzdGVkVHlwZShib29sZWFuIG5lc3RlZCkgewotCQlmTmVzdGVkID0gbmVzdGVkOwotCX0KLQotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKENTU01NTm9kZSBub2RlKSB7Ci0JCXNob3J0IHJjID0gVFJBVl9DT05UOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAoZlR5cGUgPT0gbm9kZS5nZXRUeXBlKCkpIHsKLQkJCQlpZiAoIWZOb2Rlcy5jb250YWlucyhub2RlKSkgewotCQkJCQlmTm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCQlpZiAoIWZOZXN0ZWQpIHsKLQkJCQkJcmMgPSBUUkFWX1BSVU5FOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldE5vZGVzKCkgewotCQlyZXR1cm4gZk5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gZk5lc3RlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZUeXBlID0gbnVsbDsKLQlMaXN0IGZOb2RlcyA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NNZWRpYUdyb3VwSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTTWVkaWFHcm91cElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNDJkNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NNZWRpYUdyb3VwSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01lZGlhR3JvdXBJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9QQUdFRCA9ICJwYWdlZCI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9WSVNVQUwgPSAidmlzdWFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BVVJBTCA9ICJhdXJhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fVEFDVElMRSA9ICJ0YWN0aWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0dSSUQgPSAiZ3JpZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQklUTUFQID0gImJpdG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9JTlRFUkFDVElWRSA9ICJpbnRlcmFjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BTEwgPSAiYWxsIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbEZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzRlMDVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTTWV0YU1vZGVsRmluZGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTWV0YU1vZGVsRmluZGVyLgotCSAqLwotCXByaXZhdGUgQ1NTTWV0YU1vZGVsRmluZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgcHVibGljIENTU01ldGFNb2RlbEZpbmRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTTWV0YU1vZGVsRmluZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGZpbmRNZXRhTW9kZWxGb3IoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gQ1NTUHJvZmlsZUZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRQcm9maWxlRm9yKG5vZGUpLmdldE1ldGFNb2RlbCgpOwotCX0KLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZmluZE1ldGFNb2RlbEZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXJldHVybiBDU1NQcm9maWxlRmluZGVyLmdldEluc3RhbmNlKCkuZmluZFByb2ZpbGVGb3IobW9kZWwpLmdldE1ldGFNb2RlbCgpOwotCi0JfQotCi0JLy8gZmluZE1ldGFNb2RlbEZvcihOb2RlKSBpcyBub3QgdXNlZC4KLQkvLyBFdmVuIGlmIGl0IGlzIHVzZWQsIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoCi0JLy8gZmluZE1ldGFNb2RlbEZvcihJU3RydWN0dXJlZE1vZGVsKSBlYXNpbHkKLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZmluZE1ldGFNb2RlbEZvcihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCXJldHVybiBDU1NQcm9maWxlRmluZGVyLmdldEluc3RhbmNlKCkuZmluZFByb2ZpbGVGb3IoYmFzZUxvY2F0aW9uKS5nZXRNZXRhTW9kZWwoKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBDU1NNZXRhTW9kZWxGaW5kZXIgZkluc3RhbmNlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFRyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2MDg3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFRyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLQotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ1NTTWV0YU1vZGVsVHJhdmVyc2VyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUcmF2ZXJzZXIuCi0JICovCi0JcHVibGljIENTU01ldGFNb2RlbFRyYXZlcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBhcHBseShDU1NNTU5vZGUgbm9kZSkgewotCQlmVHJhdlN0YWNrID0gbmV3IFN0YWNrKCk7Ci0KLQkJYmVnaW4obm9kZSk7Ci0JCXRyYXZlcnNlKG5vZGUpOwotCQllbmQobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzaG9ydCB0cmF2ZXJzZShDU1NNTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0KLQkJZlRyYXZTdGFjay5wdXNoKG5vZGUpOwotCi0JCXNob3J0IHJjOwotCQlyYyA9IHByZU5vZGUobm9kZSk7Ci0KLQkJaWYgKHJjID09IFRSQVZfQ09OVCkgewotCQkJSXRlcmF0b3IgaSA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlIGNoaWxkID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQkJc2hvcnQgcmNDaGlsZCA9IHRyYXZlcnNlKGNoaWxkKTsKLQkJCQlpZiAocmNDaGlsZCA9PSBUUkFWX1NUT1ApIHsKLQkJCQkJZlRyYXZTdGFjay5wb3AoKTsKLQkJCQkJcmV0dXJuIFRSQVZfU1RPUDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmMgPT0gVFJBVl9TVE9QKSB7Ci0JCQlmVHJhdlN0YWNrLnBvcCgpOwotCQkJcmV0dXJuIFRSQVZfU1RPUDsKLQkJfQotCi0JCXJjID0gcG9zdE5vZGUobm9kZSk7Ci0KLQkJZlRyYXZTdGFjay5wb3AoKTsKLQkJcmV0dXJuIChyYyA9PSBUUkFWX1BSVU5FKSA/IFRSQVZfQ09OVCA6IHJjOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJlZ2luKENTU01NTm9kZSBub2RlKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmQoQ1NTTU1Ob2RlIG5vZGUpIHsKLQotCX0KLQotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKENTU01NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0JcHJvdGVjdGVkIHNob3J0IHBvc3ROb2RlKENTU01NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0KLQlTdGFjayBmVHJhdlN0YWNrID0gbnVsbDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgVFJBVl9DT05UID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IFRSQVZfU1RPUCA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCBUUkFWX1BSVU5FID0gMjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWEwY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NNZXRhTW9kZWxVdGlsIHsKLQlwdWJsaWMgQ1NTTWV0YU1vZGVsVXRpbChDU1NNZXRhTW9kZWwgbWV0YW1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNZXRhTW9kZWwgPSBtZXRhbW9kZWw7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBjb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9ERVNDUklQVE9SKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgY29sbGVjdE5vZGVzQnlUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCUNTU01NVHlwZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgQ1NTTU1UeXBlQ29sbGVjdG9yKCk7Ci0JCWNvbGxlY3Rvci5hcHBseShmTWV0YU1vZGVsLCB0eXBlKTsKLQkJcmV0dXJuIGNvbGxlY3Rvci5nZXROb2RlcygpOwotCX0KLQotCXB1YmxpYyBDU1NNTVByb3BlcnR5IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSXRlcmF0b3IgaVByb3BlcnR5ID0gZ2V0UHJvcGVydGllcygpOwotCQl3aGlsZSAoaVByb3BlcnR5Lmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpUHJvcGVydHkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHlOYW1lKSkgewotCQkJCXJldHVybiAoQ1NTTU1Qcm9wZXJ0eSkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTU1EZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIGRlc2NyaXB0b3JOYW1lKSB7Ci0JCUl0ZXJhdG9yIGlEZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcnMoKTsKLQkJd2hpbGUgKGlEZXNjcmlwdG9yLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpRGVzY3JpcHRvci5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShkZXNjcmlwdG9yTmFtZSkpIHsKLQkJCQlyZXR1cm4gKENTU01NRGVzY3JpcHRvcikgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTU1Ob2RlIGdldE1ldGFNb2RlbE5vZGVGb3IoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydHkoKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKSB7Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0b3IoKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJfQotCQl9Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGZUeXBlTWFwID09IG51bGwpIHsKLQkJCWZUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZUeXBlTWFwLnB1dChuZXcgU2hvcnQoSUNTU05vZGUuU1RZTEVSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9TVFlMRV9SVUxFKTsKLQkJCWZUeXBlTWFwLnB1dChuZXcgU2hvcnQoSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9GT05UX0ZBQ0VfUlVMRSk7Ci0JCQlmVHlwZU1hcC5wdXQobmV3IFNob3J0KElDU1NOb2RlLlBBR0VSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9QQUdFX1JVTEUpOwotCQl9Ci0KLQkJU3RyaW5nIG5vZGVUeXBlID0gKFN0cmluZykgZlR5cGVNYXAuZ2V0KG5ldyBTaG9ydChub2RlLmdldE5vZGVUeXBlKCkpKTsKLQkJaWYgKG5vZGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSXRlcmF0b3IgaU5vZGVzID0gY29sbGVjdE5vZGVzQnlUeXBlKG5vZGVUeXBlKTsKLQkJaWYgKGlOb2Rlcy5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSB0YXJnZXROb2RlID0gKENTU01NTm9kZSkgaU5vZGVzLm5leHQoKTsKLQkJCWlmICghaU5vZGVzLmhhc05leHQoKSkgeyAvLyBpdCdzIG9ubHkgb25lCi0JCQkJcmV0dXJuIHRhcmdldE5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKLQkJcmV0dXJuIGZNZXRhTW9kZWw7Ci0JfQotCi0KLQlwcml2YXRlIENTU01ldGFNb2RlbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmVHlwZU1hcCA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NOdW1iZXJJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NOdW1iZXJJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQ5YjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTTnVtYmVySUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU051bWJlcklEIHsKLQotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fQU5HTEUgPSAiYW5nbGUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0ZSRVFVRU5DWSA9ICJmcmVxdWVuY3kiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0lOVEVHRVIgPSAiaW50ZWdlciI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fTEVOR1RIID0gImxlbmd0aCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fUEVSQ0VOVEFHRSA9ICJwZXJjZW50YWdlIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9USU1FID0gInRpbWUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0hBU0ggPSAiaGFzaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX05VTSA9ICJudW1iZXIiOy8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU1Byb2ZpbGVGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvZmlsZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDZmOTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvZmlsZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC5DU1NQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50cHJvcGVydGllcy5Db250ZW50U2V0dGluZ3NDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudHByb3BlcnRpZXMuSUNvbnRlbnRTZXR0aW5nczsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTUHJvZmlsZUZpbmRlciB7Ci0KLQlmaW5hbCBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgQ1NTX1BST0ZJTEUgPSAiY3NzLXByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTUHJvZmlsZUZpbmRlci4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVGaW5kZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBwdWJsaWMgQ1NTUHJvZmlsZUZpbmRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTUHJvZmlsZUZpbmRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZmluZFByb2ZpbGVGb3IoSUNTU05vZGUgbm9kZSkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQltb2RlbCA9IGRvYy5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaW5kUHJvZmlsZUZvcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZmluZFByb2ZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlPYmplY3QgbW9kZWxUeXBlID0gKChJQ1NTTW9kZWwpIG1vZGVsKS5nZXRTdHlsZVNoZWV0VHlwZSgpOwotCQkJaWYgKG1vZGVsVHlwZSA9PSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG1vZGVsVHlwZSA9PSBJQ1NTTW9kZWwuRU1CRURERUQgfHwgbW9kZWxUeXBlID09IElDU1NNb2RlbC5JTkxJTkUpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsgLy8gbWF5IGJlIG51bGwKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gZmluZFByb2ZpbGVGb3IoYmFzZUxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBmaW5kUHJvZmlsZUZvcihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gbnVsbDsKLQotCQlpZiAoYmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCUlDb250ZW50U2V0dGluZ3MgY3MgPSBDb250ZW50U2V0dGluZ3NDcmVhdG9yLmNyZWF0ZSgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCQkJCXJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCS8vIGF0IGZpcnN0LCBpbml0aWFsaXplZCB3aXRoIHByb2plY3Qgc2V0dGluZ3MKLQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwcm9maWxlSUQgPSBjcy5nZXRQcm9wZXJ0eShwcm9qZWN0LCBDU1NfUFJPRklMRSk7Ci0JCQkJCWlmIChwcm9maWxlSUQgIT0gbnVsbCAmJiAwIDwgcHJvZmlsZUlELmxlbmd0aCgpKSB7Ci0JCQkJCQlwcm9maWxlID0gcmVnLmdldFByb2ZpbGUocHJvZmlsZUlEKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBpZiByZXNvdXJjZSBzZXR0aW5ncyBleGlzdCwgb3ZlcndyaXRlIHdpdGggcHJvamVjdCBzZXR0aW5ncwotCQkJCVN0cmluZyBwcm9maWxlSUQgPSBjcy5nZXRQcm9wZXJ0eShyZXNvdXJjZSwgQ1NTX1BST0ZJTEUpOwotCQkJCWlmIChwcm9maWxlSUQgIT0gbnVsbCAmJiAwIDwgcHJvZmlsZUlELmxlbmd0aCgpKSB7Ci0JCQkJCXByb2ZpbGUgPSByZWcuZ2V0UHJvZmlsZShwcm9maWxlSUQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAocHJvZmlsZSAhPSBudWxsKSA/IHByb2ZpbGUgOiByZWcuZ2V0RGVmYXVsdFByb2ZpbGUoKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBDU1NQcm9maWxlRmluZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NQcm9wZXJ0eUlELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU1Byb3BlcnR5SUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyZDYzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU1Byb3BlcnR5SUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NQcm9wZXJ0eUlEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9BWklNVVRIID0gImF6aW11dGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JHID0gImJhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX0FUVEFDSE1FTlQgPSAiYmFja2dyb3VuZC1hdHRhY2htZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19DT0xPUiA9ICJiYWNrZ3JvdW5kLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19JTUFHRSA9ICJiYWNrZ3JvdW5kLWltYWdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19QT1NJVElPTiA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19SRVBFQVQgPSAiYmFja2dyb3VuZC1yZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUiA9ICJib3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xMQVBTRSA9ICJib3JkZXItY29sbGFwc2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xPUiA9ICJib3JkZXItY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9TUEFDSU5HID0gImJvcmRlci1zcGFjaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1RZTEUgPSAiYm9yZGVyLXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QID0gImJvcmRlci10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVCA9ICJib3JkZXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT00gPSAiYm9yZGVyLWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlQgPSAiYm9yZGVyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfQ09MT1IgPSAiYm9yZGVyLXRvcC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX0NPTE9SID0gImJvcmRlci1yaWdodC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9DT0xPUiA9ICJib3JkZXItYm90dG9tLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9DT0xPUiA9ICJib3JkZXItbGVmdC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9TVFlMRSA9ICJib3JkZXItdG9wLXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfU1RZTEUgPSAiYm9yZGVyLXJpZ2h0LXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1NUWUxFID0gImJvcmRlci1ib3R0b20tc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1NUWUxFID0gImJvcmRlci1sZWZ0LXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX1dJRFRIID0gImJvcmRlci10b3Atd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9XSURUSCA9ICJib3JkZXItcmlnaHQtd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fV0lEVEggPSAiYm9yZGVyLWJvdHRvbS13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfV0lEVEggPSAiYm9yZGVyLWxlZnQtd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9XSURUSCA9ICJib3JkZXItd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPVFRPTSA9ICJib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NBUFRJT05fU0lERSA9ICJjYXB0aW9uLXNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NMRUFSID0gImNsZWFyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTElQID0gImNsaXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NPTE9SID0gImNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT05URU5UID0gImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NPVU5URVJfSU5DUkVNRU5UID0gImNvdW50ZXItaW5jcmVtZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX1JFU0VUID0gImNvdW50ZXItcmVzZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRSA9ICJjdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9BRlRFUiA9ICJjdWUtYWZ0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9CRUZPUkUgPSAiY3VlLWJlZm9yZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VSU09SID0gImN1cnNvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElTUExBWSA9ICJkaXNwbGF5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTEVWQVRJT04gPSAiZWxldmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTVBUWV9DRUxMUyA9ICJlbXB0eS1jZWxscyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRkxPQVQgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlQgPSAiZm9udCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRSA9ICJmb250LXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRV9BREpVU1QgPSAiZm9udC1zaXplLWFkanVzdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFJFVENIID0gImZvbnQtc3RyZXRjaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1ZBUklBTlQgPSAiZm9udC12YXJpYW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1dFSUdIVCA9ICJmb250LXdlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfSEVJR0hUID0gImhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MRVRURVJfU1BBQ0lORyA9ICJsZXR0ZXItc3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElORV9IRUlHSFQgPSAibGluZS1oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEUgPSAibGlzdC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9JTUFHRSA9ICJsaXN0LXN0eWxlLWltYWdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1BPU0lUSU9OID0gImxpc3Qtc3R5bGUtcG9zaXRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfVFlQRSA9ICJsaXN0LXN0eWxlLXR5cGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTiA9ICJtYXJnaW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9UT1AgPSAibWFyZ2luLXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX1JJR0hUID0gIm1hcmdpbi1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0JPVFRPTSA9ICJtYXJnaW4tYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fTEVGVCA9ICJtYXJnaW4tbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS0VSX09GRlNFVCA9ICJtYXJrZXItb2Zmc2V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJLUyA9ICJtYXJrcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX0hFSUdIVCA9ICJtYXgtaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVhfV0lEVEggPSAibWF4LXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fSEVJR0hUID0gIm1pbi1oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01JTl9XSURUSCA9ICJtaW4td2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09SUEhBTlMgPSAib3JwaGFucyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORSA9ICJvdXRsaW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX0NPTE9SID0gIm91dGxpbmUtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfU1RZTEUgPSAib3V0bGluZS1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9XSURUSCA9ICJvdXRsaW5lLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVkVSRkxPVyA9ICJvdmVyZmxvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElORyA9ICJwYWRkaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX1RPUCA9ICJwYWRkaW5nLXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19SSUdIVCA9ICJwYWRkaW5nLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX0JPVFRPTSA9ICJwYWRkaW5nLWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19MRUZUID0gInBhZGRpbmctbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0FGVEVSID0gInBhZ2UtYnJlYWstYWZ0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0VfQlJFQUtfQkVGT1JFID0gInBhZ2UtYnJlYWstYmVmb3JlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0lOU0lERSA9ICJwYWdlLWJyZWFrLWluc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0UgPSAicGF1c2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFX0FGVEVSID0gInBhdXNlLWFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9CRUZPUkUgPSAicGF1c2UtYmVmb3JlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QSVRDSCA9ICJwaXRjaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0hfUkFOR0UgPSAicGl0Y2gtcmFuZ2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BMQVlfRFVSSU5HID0gInBsYXktZHVyaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QT1NJVElPTiA9ICJwb3NpdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUVVPVEVTID0gInF1b3RlcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUklDSE5FU1MgPSAicmljaG5lc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1JJR0hUID0gInJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TSVpFID0gInNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLID0gInNwZWFrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19IRUFERVIgPSAic3BlYWstaGVhZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19OVU1FUkFMID0gInNwZWFrLW51bWVyYWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLX1BVTkNUVUFUSU9OID0gInNwZWFrLXB1bmN0dWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVFQ0hfUkFURSA9ICJzcGVlY2gtcmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1RSRVNTID0gInN0cmVzcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEFCTEVfTEFZT1VUID0gInRhYmxlLWxheW91dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9BTElHTiA9ICJ0ZXh0LWFsaWduIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0RFQ09SQVRJT04gPSAidGV4dC1kZWNvcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0lOREVOVCA9ICJ0ZXh0LWluZGVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9TSEFET1cgPSAidGV4dC1zaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfVFJBTlNGT1JNID0gInRleHQtdHJhbnNmb3JtIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9UT1AgPSAidG9wIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9VTklDT0RFX0JJREkgPSAidW5pY29kZS1iaWRpIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WRVJUSUNBTF9BTElHTiA9ICJ2ZXJ0aWNhbC1hbGlnbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVklTSUJJTElUWSA9ICJ2aXNpYmlsaXR5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0lDRV9GQU1JTFkgPSAidm9pY2UtZmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0xVTUUgPSAidm9sdW1lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XSElURV9TUEFDRSA9ICJ3aGl0ZS1zcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lET1dTID0gIndpZG93cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1dPUkRfU1BBQ0lORyA9ICJ3b3JkLXNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1pfSU5ERVggPSAiei1pbmRleCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU1N0cmluZ0lELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21ldGFtb2RlbC91dGlsL0NTU1N0cmluZ0lELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNTc4ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NTdHJpbmdJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU3RyaW5nSUQgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX0FOWSA9ICJhbnkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX0NPVU5URVJfSURFTlRJRklFUiA9ICJjb3VudGVyLWlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX0ZBTUlMWV9OQU1FID0gImZhbWlseS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19GT05UX0ZBQ0VfTkFNRSA9ICJmb250LWZhY2UtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfUEFHRV9JREVOVElGSUVSID0gInBhZ2UtaWRlbnRpZmllciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfU1BFQ0lGSUNfVk9JQ0UgPSAic3BlY2lmaWMtdm9pY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX1VSQU5HRSA9ICJ1cmFuZ2UiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NVbml0SUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbWV0YW1vZGVsL3V0aWwvQ1NTVW5pdElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Y2ZhYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tZXRhbW9kZWwvdXRpbC9DU1NVbml0SUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1VuaXRJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfQ00gPSAiY20iOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfREVHID0gImRlZyI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9FTVMgPSAiZW0iOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfRVhTID0gImV4IjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0dSQUQgPSAiZ3JhZCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9IQVNIID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfSFogPSAiSHoiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfSU4gPSAiaW4iOy8vJE5PTi1OTFMtMSQKLQkvLyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVfSU5URUdFUiA9ICJJTlRFR0VSIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0tIWiA9ICJrSHoiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfTU0gPSAibW0iOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfTVMgPSAibXMiOy8vJE5PTi1OTFMtMSQKLQkvLyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVfTlVNQkVSID0gIk5VTUJFUiI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QQyA9ICJwYyI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QRVJDRU5UQUdFID0gIiUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUFQgPSAicHQiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUFggPSAicHgiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUkFEID0gInJhZCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9TID0gInMiOy8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9tb2RlbGhhbmRsZXIvQ1NTTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2YjdiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWxoYW5kbGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTTW9kZWxMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsTG9hZGVyIHsKLQkvKioKLQkgKiBDU1NMb2FkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTTW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsTG9hZGVyI25ld01vZGVsKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ldyBDU1NNb2RlbEltcGwoKTsKLQkJLy8gbm93IGRvbmUgaW4gY3JlYXRlCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCS8vIG1vZGVsLnNldEZhY3RvcnlSZWdpc3RyeShkZWZhdWx0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIE1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU01vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUwMmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudFR5cGVEZXNjcmlwdGlvbiNnZXRNb2RlbExvYWRlcigpCi0JICovCi0JcHVibGljIE1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IENTU01vZGVsTG9hZGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9wYXJzZXIvQ1NTUmVnaW9uQ29udGV4dHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvcGFyc2VyL0NTU1JlZ2lvbkNvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDNkZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9wYXJzZXIvQ1NTUmVnaW9uQ29udGV4dHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTUmVnaW9uQ29udGV4dHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DT01NRU5UID0gIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NETyA9ICJDRE8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NEQyA9ICJDREMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1MgPSAiUyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUxJTUlURVIgPSAiREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19MQlJBQ0UgPSAiTEJSQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19SQlJBQ0UgPSAiUkJSQUNFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0lNUE9SVCA9ICJJTVBPUlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BBR0UgPSAiUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTUVESUEgPSAiTUVESUEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0ZPTlRfRkFDRSA9ICJGT05UX0ZBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NIQVJTRVQgPSAiQ0hBUlNFVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQVRLRVlXT1JEID0gIkFUS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TVFJJTkcgPSAiU1RSSU5HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19VUkkgPSAiVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19NRURJVU0gPSAiTUVESVVNIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19NRURJQV9TRVBBUkFUT1IgPSAiTUVESUFfU0VQQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NIQVJTRVRfTkFNRSA9ICJDSEFSU0VUX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUEFHRV9TRUxFQ1RPUiA9ICJDU1NfUEFHRV9TRUxFQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgPSAiU0VMRUNUT1JfRUxFTUVOVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9VTklWRVJTQUwgPSAiU0VMRUNUT1JfVU5JVkVSU0FMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9QU0VVRE8gPSAiU0VMRUNUT1JfUFNFVURPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9DTEFTUyA9ICJTRUxFQ1RPUl9DTEFTUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfSUQgPSAiU0VMRUNUT1JfSUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IgPSAiU0VMRUNUT1JfQ09NQklOQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SID0gIlNFTEVDVE9SX1NFUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQgPSAiU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EID0gIlNFTEVDVE9SX0FUVFJJQlVURV9FTkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FID0gIlNFTEVDVE9SX0FUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAiU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgPSAiU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZID0gIkRFQ0xBUkFUSU9OX1BST1BFUlRZIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IgPSAiREVDTEFSQVRJT05fU0VQQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgPSAiREVDTEFSQVRJT05fREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCA9ICJERUNMQVJBVElPTl9WQUxVRV9JREVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSA9ICJERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgPSAiREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiA9ICJERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UgPSAiREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyA9ICJERUNMQVJBVElPTl9WQUxVRV9TVFJJTkciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSA9ICJERUNMQVJBVElPTl9WQUxVRV9VUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0ggPSAiREVDTEFSQVRJT05fVkFMVUVfSEFTSCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSA9ICJERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQgPSAiQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgPSAiREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MgPSAiREVDTEFSQVRJT05fVkFMVUVfUyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19VTktOT1dOID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGb3IgbnVsbCBvYmplY3QgOiBDU1NUb2tlbml6ZXIgbmV2ZXIgc2V0IHRoaXMgdmFsdWUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfVU5ERUZJTkVEID0gIlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3BhcnNlci9DU1NUZXh0UGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3BhcnNlci9DU1NUZXh0UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwY2JhNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9wYXJzZXIvQ1NTVGV4dFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NUb2tlbml6ZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTVGV4dFBhcnNlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TVFlMRVNIRUVUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlKSB7Ci0JCWluaXRpYWxpemVQYXJzZXJNb2RlKHBhcnNlck1vZGUpOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCWluaXRpYWxpemVQYXJzZXJNb2RlKHBhcnNlck1vZGUpOwotCQlyZXNldChyZWFkZXIpOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlLCBTdHJpbmcgaW5wdXQpIHsKLQkJaW5pdGlhbGl6ZVBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JCXJlc2V0KGlucHV0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KHJlYWRlciwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0KSB7Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpLCAwKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTVGV4dFRva2VuW10gZ2V0VG9rZW5zKCkgewotCQlMaXN0IHRva2VuTGlzdCA9IGdldFRva2VuTGlzdCgpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBuZXcgQ1NTVGV4dFRva2VuW3Rva2VuTGlzdC5zaXplKCldOwotCQlyZXR1cm4gKENTU1RleHRUb2tlbltdKSB0b2tlbkxpc3QudG9BcnJheSh0b2tlbnMpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRva2VuTGlzdCgpIHsKLQkJTGlzdCB0b2tlbnM7Ci0JCXRyeSB7Ci0JCQl0b2tlbnMgPSBnZXRUb2tlbml6ZXIoKS5wYXJzZVRleHQoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdG9rZW5zID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUGFyc2VyTW9kZShpbnQgcGFyc2VyTW9kZSkgewotCQlpbnQgaW5pdGlhbFN0YXRlOwotCQlpbnQgYnVmc2l6ZTsKLQkJc3dpdGNoIChwYXJzZXJNb2RlKSB7Ci0JCQljYXNlIE1PREVfU1RZTEVTSEVFVCA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLllZSU5JVElBTDsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX05PUk1BTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERV9ERUNMQVJBVElPTiA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLlNUX0RFQ0xBUkFUSU9OOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfU01BTEw7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKDAgPCBpbml0aWFsU3RhdGUpIHsKLQkJCUNTU1Rva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tlbml6ZXIoKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsU3RhdGUoaW5pdGlhbFN0YXRlKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsQnVmZmVyU2l6ZShidWZzaXplKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ1NTVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBDU1NUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIENTU1Rva2VuaXplciBmVG9rZW5pemVyID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3BhcnNlci9DU1NUZXh0VG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvcGFyc2VyL0NTU1RleHRUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjhiODU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvcGFyc2VyL0NTU1RleHRUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NUZXh0VG9rZW4gewotCXB1YmxpYyBTdHJpbmcga2luZDsKLQlwdWJsaWMgU3RyaW5nIGltYWdlOwotCXB1YmxpYyBpbnQgc3RhcnQ7Ci0JcHVibGljIGludCBsZW5ndGg7Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gKGltYWdlICE9IG51bGwpID8gaW1hZ2UgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3ByZWZlcmVuY2VzL0NTU01vZGVsUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3ByZWZlcmVuY2VzL0NTU01vZGVsUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Y2E3MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9wcmVmZXJlbmNlcy9DU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfSURFTlRJRklFUiA9ICJpZGVudGlmaWVyQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNFX1BSRVNFUlZFX0NBU0UgPSAicHJlc2VydmVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfUFJPUEVSVFlfTkFNRSA9ICJwcm9wTmFtZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9QUk9QRVJUWV9WQUxVRSA9ICJwcm9wVmFsdWVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9CRVRXRUVOX1ZBTFVFID0gImJldHdlZW5WYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUFJPUF9QT1NUX0RFTElNID0gInBvc3REZWxpbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUFJPUF9QUkVfREVMSU0gPSAicHJlRGVsaW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1FVT1RFID0gInF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9RVU9URV9JTl9VUkkgPSAicXVvdGVJblVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UgPSAibmV3TGluZU9uT3BlbkJyYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQSU5HX09ORV9QRVJfTElORSA9ICJvbmVQcm9wZXJ0eVBlckxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSID0gInByb2hpYml0V3JhcE9uQXR0ciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENTUyBjbGVhbnVwIHByZWZlcmVuY2UgbmFtZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0NBU0VfSURFTlRJRklFUiA9ICJjbGVhbnVwSWRlbnRpZmllckNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1BST1BFUlRZX05BTUUgPSAiY2xlYW51cFByb3BOYW1lQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUgPSAiY2xlYW51cFByb3BWYWx1ZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1NFTEVDVE9SID0gImNsZWFudXBTZWxlY3RvckNhc2UiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9wcmVmZXJlbmNlcy9DU1NQcmVmZXJlbmNlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3ByZWZlcmVuY2VzL0NTU1ByZWZlcmVuY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiNTdjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3ByZWZlcmVuY2VzL0NTU1ByZWZlcmVuY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiB0aGlzIGEgdGVtcCBkdW1teSBjbGFzcyB0byBtYXAgdG8gTW9kZWxQcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgQ1NTUHJlZmVyZW5jZUhlbHBlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NQcmVmZXJlbmNlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NQcmVmZXJlbmNlSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRGVmYXVsdFByZWZlcmVuY2VzKFByZWZlcmVuY2VzIHByZWZzKSB7Ci0JCS8vIHNldEJvb2xlYW5BdHRyaWJ1dGUoQ09MT1JfRU5BQkxFRCwgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNLCAwKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNLCAxKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUsICJcIiIpOy8vJE5PTi1OTFMtMSQKLQkJcHJlZnMuc2V0RGVmYXVsdChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQkVUV0VFTl9WQUxVRSwgIiAiKTsvLyROT04tTkxTLTEkCi0JCXByZWZzLnNldERlZmF1bHQoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSwgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIsIHRydWUpOwotCQlwcmVmcy5zZXREZWZhdWx0KENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSwgZmFsc2UpOwotCQlwcmVmcy5zZXREZWZhdWx0KENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUiwgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlwcmVmcy5zZXREZWZhdWx0KENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSwgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlwcmVmcy5zZXREZWZhdWx0KENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DQVNFX1BSRVNFUlZFX0NBU0UsIHRydWUpOwotCQkvLyBzZXRCb29sZWFuQXR0cmlidXRlKEFTU0lTVF9DQVRFR09SSVpFLCB0cnVlKTsKLQotCQkvLyBDU1MgY2xlYW51cCBwcmVmZXJlbmNlcwotCQlwcmVmcy5zZXREZWZhdWx0KENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9JREVOVElGSUVSLCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfTkFNRSwgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1BST1BFUlRZX1ZBTFVFLCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfU0VMRUNUT1IsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmV0d2VlblZhbHVlU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX0JFVFdFRU5fVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCWJvb2xlYW4gYlVzZVRhYiA9IHByZWZzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuSU5ERU5UX1VTSU5HX1RBQlMpOwotCQlpZiAoYlVzZVRhYikgewotCQkJcmV0dXJuICJcdCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWludCBuID0gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFCX1dJRFRIKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl3aGlsZSAoMCA8IG4tLSkgewotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNYXhMaW5lV2lkdGgoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHByZWZzLmdldEludChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1b3RlU3RyaW5nKElDU1NNb2RlbCBtb2RlbCkgewotCQkvLyBuYWthbW9yaV9UT0RPIGNzcyBwcmVmIHRyYW5zaXRpb24KLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRTcGFjZXNQb3N0RGVsaW1pdGVyKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUE9TVF9ERUxJTSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRTcGFjZXNQcmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRVcHBlckNhc2UoKSB7Ci0JCWlmIChnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld0xpbmVPbk9wZW5CcmFjZSgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT25lUHJvcGVydHlQZXJMaW5lKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZUNhc2UoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUkVTRVJWRV9DQVNFKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2hpYml0V3JhcE9uQXR0cigpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcE5hbWVVcHBlckNhc2UoKSB7Ci0JCWlmIChnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpIHsKLQkJaWYgKGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1F1b3RlSW5VUkkoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QmV0d2VlblZhbHVlU3RyaW5nKFN0cmluZyBuZXdCZXR3ZWVuVmFsdWVTdHJpbmcpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQkVUV0VFTl9WQUxVRSwgbmV3QmV0d2VlblZhbHVlU3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJZGVudFVwcGVyQ2FzZShib29sZWFuIG5ld0lkZW50VXBwZXJDYXNlKSB7Ci0JCWludCB0aGVDYXNlID0gQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCWlmIChuZXdJZGVudFVwcGVyQ2FzZSkKLQkJCXRoZUNhc2UgPSBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIsIHRoZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE9uZVByb3BlcnR5UGVyTGluZShib29sZWFuIG5ld09uZVByb3BlcnR5UGVyTGluZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSwgbmV3T25lUHJvcGVydHlQZXJMaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcmVzZXJ2ZUNhc2UoYm9vbGVhbiBuZXdQcmVzZXJ2ZUNhc2UpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NNb2RlbFByZWZlcmVuY2VOYW1lcy5DQVNFX1BSRVNFUlZFX0NBU0UsIG5ld1ByZXNlcnZlQ2FzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvaGliaXRXcmFwT25BdHRyKGJvb2xlYW4gbmV3UHJvaGliaXRXcmFwT25BdHRyKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSLCBuZXdQcm9oaWJpdFdyYXBPbkF0dHIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByb3BOYW1lVXBwZXJDYXNlKGJvb2xlYW4gbmV3UHJvcE5hbWVVcHBlckNhc2UpIHsKLQkJaW50IHRoZUNhc2UgPSBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJaWYgKG5ld1Byb3BOYW1lVXBwZXJDYXNlKQotCQkJdGhlQ2FzZSA9IENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSwgdGhlQ2FzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcFZhbHVlVXBwZXJDYXNlKGJvb2xlYW4gbmV3UHJvcFZhbHVlVXBwZXJDYXNlKSB7Ci0JCWludCB0aGVDYXNlID0gQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCWlmIChuZXdQcm9wVmFsdWVVcHBlckNhc2UpCi0JCQl0aGVDYXNlID0gQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSwgdGhlQ2FzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVvdGVTdHJpbmcoU3RyaW5nIHF1b3RlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFLCBxdW90ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BhY2VzUG9zdERlbGltaXRlcihpbnQgbnVtKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUE9TVF9ERUxJTSwgbnVtKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGFjZXNQcmVEZWxpbWl0ZXIoaW50IG51bSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU01vZGVsUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSwgbnVtKTsKLQl9Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlDU1NDb3JlUGx1Z2luIGNzc01vZGVsUGx1Z2luID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBjc3NNb2RlbFBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgQ1NTUHJlZmVyZW5jZUhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NQcmVmZXJlbmNlSGVscGVyIGZJbnN0YW5jZSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL0Fic3RyYWN0Q3NzVHJhdmVyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvQWJzdHJhY3RDc3NUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxOGVmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvQWJzdHJhY3RDc3NUcmF2ZXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JcHVibGljIHN0YXRpYyBzaG9ydCBUUkFWX0NPTlQgPSAwOwotCXB1YmxpYyBzdGF0aWMgc2hvcnQgVFJBVl9QUlVORSA9IDE7Ci0JcHVibGljIHN0YXRpYyBzaG9ydCBUUkFWX1NUT1AgPSAyOwotCXByb3RlY3RlZCBqYXZhLnV0aWwuU3RhY2sgdHJhdlN0YWNrOwotCXByaXZhdGUgYm9vbGVhbiBmVHJhdmVyc2VJbXBvcnRlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmVHJhdmVyc2VJbXBvcnRGaXJzdCA9IGZhbHNlOwotCXByaXZhdGUgamF2YS51dGlsLlZlY3RvciB0cmF2ZXJzZWRTaGVldHM7Ci0KLQkvKioKLQkgKiBDc3NQcm9wQ01Ob2RlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0Q3NzVHJhdmVyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYXBwbHkoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCWFwcGx5KG1vZGVsLmdldERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByb290Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5KElDU1NOb2RlIHJvb3QpIHsKLQkJdHJhdlN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCWlmIChmVHJhdmVyc2VJbXBvcnRlZCkgewotCQkJdHJhdmVyc2VkU2hlZXRzID0gbmV3IFZlY3RvcigpOwotCQkJaWYgKHJvb3QgIT0gbnVsbCAmJiByb290LmdldE93bmVyRG9jdW1lbnQoKSAhPSBudWxsICYmIHJvb3QuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQkJdHJhdmVyc2VkU2hlZXRzLmFkZChyb290LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBmaXJzdCBjYWxsIGJlZ2luKCkKLQkJYmVnaW4ocm9vdCk7Ci0KLQkJLy8gdHJhdmVyc2UKLQkJdHJhdmVyc2Uocm9vdCk7Ci0KLQkJLy8gbGFzdCBjYWxsIGVuZCgpCi0JCWVuZChyb290KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZChJQ1NTTm9kZSBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNUcmF2ZXJzZUltcG9ydGVkKCkgewotCQlyZXR1cm4gZlRyYXZlcnNlSW1wb3J0ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwb3N0Tm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoc2hvcnQpIDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5jc3MuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChzaG9ydCkgMDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VHJhdmVyc2VJbXBvcnRlZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRyYXZlcnNlSW1wb3J0ZWQoYm9vbGVhbiBuZXdUcmF2ZXJzZUltcG9ydGVkKSB7Ci0JCWZUcmF2ZXJzZUltcG9ydGVkID0gbmV3VHJhdmVyc2VJbXBvcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VHJhdmVyc2VJbXBvcnRGaXJzdAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRyYXZlcnNlSW1wb3J0Rmlyc3QoYm9vbGVhbiBuZXdUcmF2ZXJzZUltcG9ydEZpcnN0KSB7Ci0JCWZUcmF2ZXJzZUltcG9ydEZpcnN0ID0gbmV3VHJhdmVyc2VJbXBvcnRGaXJzdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLmNzcy5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzaG9ydCB0cmF2ZXJzZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gVFJBVl9DT05UOwotCi0JCXRyYXZTdGFjay5wdXNoKG5vZGUpOwotCi0JCS8vIHByZS1hY3Rpb24KLQkJc2hvcnQgcmV0ID0gcHJlTm9kZShub2RlKTsKLQotCQlpZiAocmV0ID09IFRSQVZfQ09OVCkgewotCQkJaWYgKGZUcmF2ZXJzZUltcG9ydGVkICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSkgewotCQkJCUlDU1NJbXBvcnRSdWxlIHJ1bGUgPSAoSUNTU0ltcG9ydFJ1bGUpIG5vZGU7Ci0JCQkJLy8gdHJhdmVyc2UgZXh0ZXJuYWwgc3R5bGUtc2hlZXQKLQkJCQlJQ1NTU3R5bGVTaGVldCBzaGVldCA9IChJQ1NTU3R5bGVTaGVldCkgcnVsZS5nZXRTdHlsZVNoZWV0KCk7Ci0JCQkJaWYgKHNoZWV0ICE9IG51bGwgJiYgIXRyYXZlcnNlZFNoZWV0cy5jb250YWlucyhzaGVldCkpIHsgLy8gcHJldmVudAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvb3AKLQkJCQkJdHJhdmVyc2VkU2hlZXRzLmFkZChzaGVldCk7Ci0JCQkJCXNob3J0IHJldEV4dCA9IHRyYXZlcnNlKHNoZWV0KTsKLQkJCQkJaWYgKHJldEV4dCA9PSBUUkFWX1NUT1ApIHsKLQkJCQkJCXRyYXZTdGFjay5wb3AoKTsKLQkJCQkJCXJldHVybiByZXRFeHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNvbGxlY3QgY2hpbGRyZW4KLQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoZlRyYXZlcnNlSW1wb3J0Rmlyc3QpIHsKLQkJCQlBcnJheUxpc3Qgb3RoZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKQotCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJZWxzZQotCQkJCQkJb3RoZXJzLmFkZChjaGlsZCk7Ci0JCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQkJY2hpbGRyZW4uYWRkQWxsKG90aGVycyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyB0cmF2ZXJzZSBjaGlsZHJlbgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCWNoaWxkID0gKElDU1NOb2RlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQkJc2hvcnQgcmV0Q2hpbGQgPSB0cmF2ZXJzZShjaGlsZCk7Ci0JCQkJaWYgKHJldENoaWxkID09IFRSQVZfU1RPUCkgewotCQkJCQl0cmF2U3RhY2sucG9wKCk7Ci0JCQkJCXJldHVybiByZXRDaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmV0ID09IFRSQVZfU1RPUCkgewotCQkJdHJhdlN0YWNrLnBvcCgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCS8vIHBvc3QtYWN0aW9uCi0JCXJldCA9IHBvc3ROb2RlKG5vZGUpOwotCi0JCXRyYXZTdGFjay5wb3AoKTsKLQkJcmV0dXJuIChyZXQgPT0gVFJBVl9QUlVORSkgPyBUUkFWX0NPTlQgOiByZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9DU1NDbGFzc1RyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL0NTU0NsYXNzVHJhdmVyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MmEzMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL0NTU0NsYXNzVHJhdmVyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU0NsYXNzVHJhdmVyc2VyIGV4dGVuZHMgQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JQXJyYXlMaXN0IGZDbGFzc05hbWVzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU0NsYXNzVHJhdmVyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDbGFzc05hbWVzKElDU1NTdHlsZVJ1bGUgcnVsZSkgewotCQlJQ1NTU2VsZWN0b3JMaXN0IHNlbGVjdG9yTGlzdCA9IHJ1bGUuZ2V0U2VsZWN0b3JzKCk7Ci0JCUl0ZXJhdG9yIGlTZWxlY3RvciA9IHNlbGVjdG9yTGlzdC5nZXRJdGVyYXRvcigpOwotCQl3aGlsZSAoaVNlbGVjdG9yLmhhc05leHQoKSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gKElDU1NTZWxlY3RvcikgaVNlbGVjdG9yLm5leHQoKTsKLQkJCUl0ZXJhdG9yIGlJdGVtID0gc2VsZWN0b3IuZ2V0SXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpSXRlbS5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSAoSUNTU1NlbGVjdG9ySXRlbSkgaUl0ZW0ubmV4dCgpOwotCQkJCWlmIChpdGVtLmdldEl0ZW1UeXBlKCkgPT0gSUNTU1NlbGVjdG9ySXRlbS5TSU1QTEUpIHsKLQkJCQkJSUNTU1NpbXBsZVNlbGVjdG9yIHNlbCA9IChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW07Ci0JCQkJCWludCBuQ2xhc3NlcyA9IHNlbC5nZXROdW1PZkNsYXNzZXMoKTsKLQkJCQkJZm9yIChpbnQgaUNsYXNzID0gMDsgaUNsYXNzIDwgbkNsYXNzZXM7IGlDbGFzcysrKSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gc2VsLmdldENsYXNzKGlDbGFzcyk7Ci0JCQkJCQlpZiAoIWZDbGFzc05hbWVzLmNvbnRhaW5zKGNsYXNzTmFtZSkpCi0JCQkJCQkJZkNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChmQ2xhc3NOYW1lcyA9PSBudWxsKQotCQkJZkNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5kKElDU1NOb2RlIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDbGFzc05hbWVzKCkgewotCQlyZXR1cm4gKGZDbGFzc05hbWVzICE9IG51bGwpID8gZkNsYXNzTmFtZXMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwb3N0Tm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlzaG9ydCByZXQ7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJYWRkQ2xhc3NOYW1lcygoSUNTU1N0eWxlUnVsZSkgbm9kZSk7Ci0JCQlyZXQgPSBUUkFWX1BSVU5FOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCB8fCBub2RlIGluc3RhbmNlb2YgSUNTU01lZGlhUnVsZSB8fCBub2RlIGluc3RhbmNlb2YgSUNTU0ltcG9ydFJ1bGUpIHsKLQkJCXJldCA9IFRSQVZfQ09OVDsKLQkJfQotCQllbHNlIHsKLQkJCXJldCA9IFRSQVZfUFJVTkU7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL0NTU0xpbmtDb252ZXJ0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9DU1NMaW5rQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YThhODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL0NTU0xpbmtDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wcmVmZXJlbmNlcy5DU1NQcmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU0xpbmtDb252ZXJ0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9CRUdJTiA9ICJ1cmwoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5EID0gIikiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRF9RVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU19RVU9URSA9ICJcJyI7IC8vJE5PTi1OTFMtMSQKLQotCUlTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU0xpbmtDb252ZXJ0ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQliYXNlTW9kZWwgPSBtb2RlbDsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsICYmICgoSUNTU01vZGVsKSBtb2RlbCkuZ2V0U3R5bGVTaGVldFR5cGUoKSAhPSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCVhNTE5vZGUgbm9kZSA9IChYTUxOb2RlKSAoKElDU1NNb2RlbCkgbW9kZWwpLmdldE93bmVyRE9NTm9kZSgpOwotCQkJYmFzZU1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkRnVuYyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKCF2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTF9CRUdJTikpIHsKLQkJCS8vIHBhX1RPRE8gY3NzIHByZWYKLQkJCUNTU1ByZWZlcmVuY2VIZWxwZXIgbWdyID0gQ1NTUHJlZmVyZW5jZUhlbHBlci5nZXRJbnN0YW5jZSgpOwotCQkJU3RyaW5nIHF1b3RlID0gbWdyLmdldFF1b3RlU3RyaW5nKG51bGwpOwotCQkJdmFsdWUgPSBDU1NVdGlsLnN0cmlwUXVvdGVzKHZhbHVlKTsKLQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZSh2YWx1ZSwgcXVvdGUpOwotCQkJU3RyaW5nIHN0ciA9IFVSTF9CRUdJTjsKLQkJCWlmIChtZ3IuaXNQcm9wVmFsdWVVcHBlckNhc2UoKSkKLQkJCQlzdHIgPSBzdHIudG9VcHBlckNhc2UoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cik7Ci0JCQlidWYuYXBwZW5kKHF1b3RlKTsKLQkJCWJ1Zi5hcHBlbmQodmFsdWUpOwotCQkJYnVmLmFwcGVuZChxdW90ZSk7Ci0JCQlidWYuYXBwZW5kKFVSTF9FTkQpOwotCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCQlpZiAoYmFzZU1vZGVsID09IG51bGwpIHsKLQkJCWJhc2VNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQlpZiAoYmFzZU1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsICYmICgoSUNTU01vZGVsKSBiYXNlTW9kZWwpLmdldFN0eWxlU2hlZXRUeXBlKCkgIT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQkJWE1MTm9kZSB4bWxOb2RlID0gKFhNTE5vZGUpICgoSUNTU01vZGVsKSBiYXNlTW9kZWwpLmdldE93bmVyRE9NTm9kZSgpOwotCQkJCWJhc2VNb2RlbCA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcmwoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXNvdXJjZSA9IHNvdXJjZS50cmltKCkudG9Mb3dlckNhc2UoKTsKLQkJcmV0dXJuIHNvdXJjZS5zdGFydHNXaXRoKFVSTF9CRUdJTik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUpIHsKLQkJCXRvQWJzb2x1dGUoKENTU1ZhbHVlKSBub2RlKTsKLQkJfQotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQlJQ1NTSW1wb3J0UnVsZSBpUnVsZSA9IChJQ1NTSW1wb3J0UnVsZSkgbm9kZTsKLQkJCWlSdWxlLnNldEhyZWYodG9BYnNvbHV0ZShhZGRGdW5jKGlSdWxlLmdldEhyZWYoKSkpKTsKLQkJfQotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUZ1bmMoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZOwotCQlTdHJpbmcgZmllbGQgPSB2YWx1ZS50cmltKCk7Ci0JCS8vIGZpcnN0IDogdGVhciAidXJsKC4uLi4pIgotCQlpZiAoZmllbGQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTF9CRUdJTikpIHsKLQkJCWludCB1cmwgPSBmaWVsZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoVVJMX0JFR0lOKTsKLQkJCWludCBlbmRQYXJlbnRoZXNpcyA9IGZpZWxkLmxhc3RJbmRleE9mKFVSTF9FTkQpOwotCQkJaWYgKGVuZFBhcmVudGhlc2lzID4gdXJsKSB7Ci0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcodXJsICsgNCwgZW5kUGFyZW50aGVzaXMpOwotCQkJfQotCQkJZWxzZQotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHVybCArIDQpOwotCQl9Ci0JCXJldHVybiBmaWVsZC50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBGdW5jKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWTsKLQkJLy8gZmlyc3QgOiB0ZWFyICJ1cmwoLi4uLikiCi0JCVN0cmluZyBmaWVsZCA9IHJlbW92ZUZ1bmModmFsdWUpOwotCQkvLyBzZWNvbmQgOiB0ZWFyIHF1b3RhdGlvbnMKLQkJaWYgKGZpZWxkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChEX1FVT1RFKSkgewotCQkJaW50IHF1b3RlID0gZmllbGQuaW5kZXhPZihEX1FVT1RFKTsKLQkJCWludCBlbmQgPSBmaWVsZC5sYXN0SW5kZXhPZihEX1FVT1RFKTsKLQkJCWlmIChlbmQgPiBxdW90ZSkgewotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHF1b3RlICsgMSwgZW5kKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyhxdW90ZSArIDEpOwotCQl9Ci0JCWVsc2UgaWYgKGZpZWxkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChTX1FVT1RFKSkgewotCQkJaW50IHF1b3RlID0gZmllbGQuaW5kZXhPZihTX1FVT1RFKTsKLQkJCWludCBlbmQgPSBmaWVsZC5sYXN0SW5kZXhPZihTX1FVT1RFKTsKLQkJCWlmIChlbmQgPiBxdW90ZSkgewotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHF1b3RlICsgMSwgZW5kKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyhxdW90ZSArIDEpOwotCQl9Ci0KLQkJcmV0dXJuIGZpZWxkLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQWJzb2x1dGUoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoaXNVcmwoc291cmNlKSkgewotCQkJU3RyaW5nIHVybCA9IENTU1BhdGhTZXJ2aWNlLmdldEFic29sdXRlVVJMKGJhc2VNb2RlbCwgc3RyaXBGdW5jKHNvdXJjZSkpOwotCQkJcmV0dXJuICh1cmwgIT0gbnVsbCkgPyBhZGRGdW5jKHVybCkgOiAoVVJMX0JFR0lOICsgVVJMX0VORCk7Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0b0Fic29sdXRlKENTU1ZhbHVlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JCQlpZiAodmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkpIHsKLQkJCQl2YWx1ZS5zZXRWYWx1ZShzdHJpcEZ1bmModG9BYnNvbHV0ZShVUkxfQkVHSU4gKyB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpICsgVVJMX0VORCkpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9DU1NQYXRoU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL0NTU1BhdGhTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNGFmODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL0NTU1BhdGhTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NQYXRoU2VydmljZSB7Ci0KLQkvLyBDb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRVVSTFNDSEVNRSA9ICJmaWxlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTENPTE9OID0gIjoiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVVUkxQUkVGSVggPSBGSUxFVVJMU0NIRU1FICsgVVJMQ09MT04gKyAiLy8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMU0VQQVJBVE9SID0gIi8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYmFzZU1vZGVsCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5tb2RlbC5JU3RydWN0dXJlZE1vZGVsCi0JICogQHBhcmFtIHJlZgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlVVJMKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB7Ci0JCVN0cmluZyBhYnNMaW5rID0gVVJMTW9kZWxQcm92aWRlckNTUy5yZXNvbHZlVVJJKGJhc2VNb2RlbCwgcmVmLCB0cnVlKTsKLQkJU3RyaW5nIHVybCA9IGFic0xpbms7Ci0JCWlmIChhYnNMaW5rICE9IG51bGwpIHsgLy8gaWYgaXQgaGFzIG5vdCBzY2hlbWUsIHdlIG11c3QgYWRkICJmaWxlIgotCQkJCQkJCQkvLyBzY2hlbWUKLQkJCXRyeSB7Ci0JCQkJbmV3IGphdmEubmV0LlVSTChhYnNMaW5rKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChhYnNMaW5rKTsKLQkJCQlpZiAocGF0aCAhPSBudWxsKQotCQkJCQl1cmwgPSB0b1VSTChwYXRoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGxvY2F0aW9uMkZpbGUoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQlpZiAoZmlsZSA9PSBudWxsICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGZpbGUgVVJMIGZvciB0aGUgcGF0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9VUkwoSVBhdGggcGF0aCkgewotCQlwYXRoID0gbmV3IFBhdGgocGF0aC50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWlmIChwYXRoLmlzVU5DKCkgPT0gdHJ1ZSkgewotCQkJLy8gaXQncyBVTkMuIHJldHVybiBmaWxlOi8vaG9zdC9mb28vYmFyL2Jhei5odG1sCi0JCQlyZXR1cm4gRklMRVVSTFNDSEVNRSArIFVSTENPTE9OICsgcGF0aC50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBGSUxFVVJMUFJFRklYICsgVVJMU0VQQVJBVE9SICsgcGF0aC50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL0NTU1NlbGVjdG9yTGlzdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzZTFmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTZWxlY3Rvckxpc3RJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5IHsKLQlzdGF0aWMgc3luY2hyb25pemVkIHB1YmxpYyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSUNTU1NlbGVjdG9yTGlzdCBjcmVhdGVTZWxlY3Rvckxpc3QoU3RyaW5nIHNlbGVjdG9yU3RyaW5nKSB7Ci0JCXJldHVybiBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChzZWxlY3RvclN0cmluZyk7Ci0JfQotCi0KLQlwcml2YXRlIENTU1NlbGVjdG9yTGlzdEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeSBmSW5zdGFuY2U7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL0NTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFlYzExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGV4dGVuZHMgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0IHsKLQotCXByaXZhdGUgc3RhdGljIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGZJbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqIEBwYXJhbSBkZWNsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVTdHlsZURlY2xhcmF0aW9uKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gMTEvMjIvMjAwNCwgbnNkLCBub3RoaW5nJ3MgZG9uZSB3aXRoIHRoaXMgdmFyaWFibGUKLS8vCQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBuZXdOb2RlID0gY3JlYXRlU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCS8vIDA1LzExLzIwMDQsIGRtdywgdW5uZWNlc3NhcnkgY2FzdCwgbG9va3MgbGlrZSBpdCB3YXMgYWx3YXlzCi0JCS8vIHJldHVybmluZyBudWxsIQotCQkvLyBzbyBzb21ldGhpbmcgaXMgcHJvYmFibHkgYW1pc3MKLQkJLy8gaWYgKCEobmV3Tm9kZSBpbnN0YW5jZW9mIElDU1NEb2N1bWVudCkpIHsKLQkJcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8gZk93bmVyRG9jdW1lbnQgPSBuZXdOb2RlOwotCQkvLyBjbG9uZUNoaWxkTm9kZXMoZGVjbCwgbmV3Tm9kZSk7Ci0JCS8vIHJldHVybiBuZXdOb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9DU1NVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvQ1NTVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDgwNWVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9DU1NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTVXRpbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWdPdXQoU3RyaW5nIHN0cikgewotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiY3NzIHdhcm5pbmc6ICIgKyBzdHIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHVibGljIHN0YXRpYyBWZWN0b3IgZXh0cmFjdE1lZGlhQ29udGVudHMoVmVjdG9yIHJlZ2lvbnMpIHsKLQkvLyBWZWN0b3IgbWVkaWEgPSBuZXcgVmVjdG9yKCk7Ci0JLy8gaWYgKHJlZ2lvbnMgPT0gbnVsbCkgeyByZXR1cm4gbWVkaWE7IH0KLQkvLwotCS8vIGJvb2xlYW4gYlJlYWR5ID0gdHJ1ZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkvLyBJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24paS5uZXh0KCk7Ci0JLy8gaWYgKHJlZ2lvbiA9PSBudWxsKSB7IGNvbnRpbnVlOyB9Ci0JLy8gU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCS8vIGlmIChiUmVhZHkpIHsKLQkvLyBpZiAodHlwZSA9PSBJREVOVCkgewotCS8vIG1lZGlhLmFkZEVsZW1lbnQocmVnaW9uLmdldFRleHQoKSk7Ci0JLy8gYlJlYWR5ID0gZmFsc2U7Ci0JLy8gfQotCS8vIH0gZWxzZSB7Ci0JLy8gaWYgKHR5cGUgPT0gQ09NTUEpIHsKLQkvLyBiUmVhZHkgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gcmV0dXJuIG1lZGlhOwotCS8vIH0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0U3RyaW5nQ29udGVudHMoU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHN0cmlwUXVvdGVzKHRleHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RVcmlDb250ZW50cyhTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgY29udGVudHMgPSB0ZXh0LnRyaW0oKTsKLQkJaWYgKGNvbnRlbnRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgidXJsKCIpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGVudHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiKSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJLy8gc3RyaXAgInVybCgiLCAiKSIKLQkJCWNvbnRlbnRzID0gY29udGVudHMuc3Vic3RyaW5nKDQsIGNvbnRlbnRzLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJY29udGVudHMgPSBzdHJpcFF1b3Rlcyhjb250ZW50cyk7Ci0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTmV4dFNpZ25pZmljYW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSkgewotCQlpZiAoc3RhcnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHN0YXJ0Tm9kZS5nZXROZXh0KCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKTsKLQkJCWlmICh0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTm9kZUJhY2t3YXJkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZTsKLQkJZm9yIChub2RlID0gc3RhcnROb2RlOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFByZXZpb3VzKCkpIHsKLQkJCWlmIChub2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBlbmROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQlub2RlID0gbnVsbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobm9kZSkgPT0gdHlwZSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTm9kZUZvcndhcmQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kTm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlOwotCQlmb3IgKG5vZGUgPSBzdGFydE5vZGU7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dCgpKSB7Ci0JCQlpZiAoZW5kTm9kZS5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJbm9kZSA9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5vZGUpID09IHR5cGUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlKSB7Ci0JCWlmIChzdGFydE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gc3RhcnROb2RlLmdldFByZXZpb3VzKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKTsKLQkJCWlmICh0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc1N0cmluZyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIG5hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS50b1N0cmluZygpOwotCQkJaW50IGxhc3RQZXJpb2QgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobGFzdFBlcmlvZCArIDEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOREVGSU5FRDsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOREVGSU5FRDsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJcmV0dXJuIHJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGVuZ3RoRGlmZmVyZW5jZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdOb2RlcywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkTm9kZXMpIHsKLQkJaW50IG5ld0xlbiA9IGdldFRleHRMZW5ndGgobmV3Tm9kZXMpOwotCQlpbnQgb2xkTGVuID0gZ2V0VGV4dExlbmd0aChvbGROb2Rlcyk7Ci0JCXJldHVybiBuZXdMZW4gLSBvbGRMZW47Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVnaW9uVGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAocmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlidWYuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGV4dExlbmd0aChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBub2RlcykgewotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gbm9kZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsZW5ndGggKz0gZmxhdE5vZGUuZ2V0VGV4dCgpLmxlbmd0aCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlbmd0aChDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJaWYgKHRva2VuID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJZG91YmxlIG51bWJlciA9IERvdWJsZS5wYXJzZURvdWJsZSh0b2tlbi5pbWFnZSk7Ci0JCQlpZiAobnVtYmVyID09IDAuMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0b3JUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShyZWdpb24pOwotCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZSh0eXBlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJLy8gU3RyaW5nIHRleHQgPSBmbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JCQkvLyBpZiAodGV4dCAhPSBudWxsICYmIHRleHQuaW5kZXhPZignLicpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQkJLy8gfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwUXVvdGVzKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRzID0gdGV4dC50cmltKCk7Ci0JCWlmICgyIDw9IGNvbnRlbnRzLmxlbmd0aCgpKSB7Ci0JCQljaGFyIGZpcnN0ID0gY29udGVudHMuY2hhckF0KDApOwotCQkJY2hhciBsYXN0ID0gY29udGVudHMuY2hhckF0KGNvbnRlbnRzLmxlbmd0aCgpIC0gMSk7Ci0JCQlpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInKSB8fCAoZmlyc3QgPT0gJ1wnJyAmJiBsYXN0ID09ICdcJycpKSB7Ci0JCQkJY29udGVudHMgPSBjb250ZW50cy5zdWJzdHJpbmcoMSwgY29udGVudHMubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0ZWN0UXVvdGUoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlZmF1bHRRdW90ZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZGVmYXVsdFF1b3RlOwotCQlmaW5hbCBTdHJpbmcgRF9RVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFNfUVVPVEUgPSAiXCciOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IGRJbmRleCA9IHNvdXJjZS5pbmRleE9mKERfUVVPVEUpOwotCQlpbnQgc0luZGV4ID0gc291cmNlLmluZGV4T2YoU19RVU9URSk7Ci0JCWlmIChkSW5kZXggPCAwICYmIHNJbmRleCA8IDApIHsKLQkJCXJldHVybiBkZWZhdWx0UXVvdGU7Ci0JCX0KLQkJZWxzZSBpZiAoZEluZGV4IDwgMCkgewotCQkJcmV0dXJuIERfUVVPVEU7Ci0JCX0KLQkJZWxzZSBpZiAoc0luZGV4IDwgMCkgewotCQkJcmV0dXJuIFNfUVVPVEU7Ci0JCX0KLQkJZWxzZSBpZiAoZEluZGV4IDwgc0luZGV4KSB7Ci0JCQlyZXR1cm4gU19RVU9URTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBEX1FVT1RFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0cmlwU3Vycm91bmRpbmdTcGFjZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlpZiAocmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJcmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl3aGlsZSAoIXJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCXJlZ2lvbnMucmVtb3ZlKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvSW1wb3J0UnVsZUNvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL0ltcG9ydFJ1bGVDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5Zjg5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvSW1wb3J0UnVsZUNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFJ1bGVDb2xsZWN0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLlZlY3RvciBydWxlcyA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgSUNTU1N0eWxlU2hlZXQgdGFyZ2V0ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbXBvcnRSdWxlQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRUcmF2ZXJzZUltcG9ydGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1wb3J0UnVsZUNvbGxlY3RvcihJQ1NTU3R5bGVTaGVldCBzaGVldCkgewotCQlzdXBlcigpOwotCQl0YXJnZXQgPSBzaGVldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLlZlY3RvciBnZXRSdWxlcygpIHsKLQkJcmV0dXJuIHJ1bGVzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQlJQ1NTSW1wb3J0UnVsZSBpbXAgPSAoSUNTU0ltcG9ydFJ1bGUpIG5vZGU7Ci0JCQkJaWYgKGltcC5nZXRTdHlsZVNoZWV0KCkgIT0gdGFyZ2V0KQotCQkJCQlyZXR1cm4gVFJBVl9QUlVORTsKLQkJCX0KLQkJCWlmICghcnVsZXMuY29udGFpbnMobm9kZSkpCi0JCQkJcnVsZXMuYWRkKG5vZGUpOwotCQl9Ci0JCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvSW1wb3J0ZWRDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9JbXBvcnRlZENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmRmYzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9JbXBvcnRlZENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRlZENvbGxlY3RvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXByb3RlY3RlZCBqYXZhLnV0aWwuVmVjdG9yIGV4dGVybmFscyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbXBvcnRlZENvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VHJhdmVyc2VJbXBvcnRlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlcm5hbHMoKSB7Ci0JCXJldHVybiBleHRlcm5hbHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBUlVMRV9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQlpZiAoIWV4dGVybmFscy5jb250YWlucyhub2RlKSkgewotCQkJCWV4dGVybmFscy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvUmVnaW9uSXRlcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9SZWdpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzJmODdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9SZWdpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uSXRlcmF0b3IgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VyRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgaW50IGN1cnJlbnQgPSAtMTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZWdpb25JdGVyYXRvcihJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJcmVzZXQoc3RydWN0dXJlZERvY3VtZW50LCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlzdXBlcigpOwotCQlyZXNldChmbGF0Tm9kZSwgcmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBjdXJEb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlpZiAoZG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGN1cnJlbnQgPCAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY3VycmVudCA8IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1ByZXYoKSB7Ci0JCS8vIHRoZSBzYW1lIGFzIGhhc05leHQoKQotCQlyZXR1cm4gaGFzTmV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBuZXh0KCkgewotCQlpZiAoZG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY3VycmVudCA8IDAgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpID09IG51bGwgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA8PSBjdXJyZW50KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldChjdXJyZW50KTsKLQkJY3VyRG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbjsKLQotCQlpZiAoY3VycmVudCA+PSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQljdXJyZW50ID0gLTE7Ci0JCX0KLQkJY3VycmVudCsrOwotCi0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIHByZXYoKSB7Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjdXJyZW50IDwgMCB8fCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkgPT0gbnVsbCB8fCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpIDw9IGN1cnJlbnQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KGN1cnJlbnQpOwotCQljdXJEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCi0JCWlmIChjdXJyZW50ID09IDApIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCWN1cnJlbnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpOwotCQkJZWxzZQotCQkJCWN1cnJlbnQgPSAwOwotCQl9Ci0JCWN1cnJlbnQtLTsKLQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJZG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXgpOwotCQljdXJEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCQlpZiAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXgpOwotCQkJY3VycmVudCA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5pbmRleE9mKHJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXRoaXMuZG9jdW1lbnRSZWdpb24gPSBmbGF0Tm9kZTsKLQkJCWN1ckRvY3VtZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0JCQljdXJyZW50ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmluZGV4T2YocmVnaW9uKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvU2VsZWN0aW9uQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvU2VsZWN0aW9uQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGRlZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL1NlbGVjdGlvbkNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uQ29sbGVjdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JaW50IHN0YXJ0LCBlbmQ7Ci0JTGlzdCBzZWxlY3RlZE5vZGVzOwotCi0JLyoqCi0JICogU2VsZWN0aW9uQ29sbGVjdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlbGVjdGlvbkNvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCXNlbGVjdGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWROb2RlcygpIHsKLQkJaWYgKHNlbGVjdGVkTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KHNlbGVjdGVkTm9kZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8PSBlbmQgJiYgc3RhcnQgPCBpTm9kZS5nZXRFbmRPZmZzZXQoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCQlJbmRleGVkUmVnaW9uIGlGaXJzdENoaWxkID0gKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCUluZGV4ZWRSZWdpb24gaUxhc3RDaGlsZCA9IChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJCWlmIChpRmlyc3RDaGlsZCA9PSBudWxsIHx8IHN0YXJ0IDwgaUZpcnN0Q2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSB8fCBpTGFzdENoaWxkLmdldEVuZE9mZnNldCgpIDw9IGVuZCkKLQkJCQkJc2VsZWN0ZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChpTm9kZS5nZXRTdGFydE9mZnNldCgpID4gZW5kKQotCQkJcmV0dXJuIFRSQVZfU1RPUDsKLQkJZWxzZQotCQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVnaW9uKGludCBuZXdTdGFydCwgaW50IG5ld0VuZCkgewotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQllbmQgPSBuZXdFbmQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9TZWxlY3RvclZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL1NlbGVjdG9yVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwY2E0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL1NlbGVjdG9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTU2VsZWN0b3JMaXN0SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0b3JWYWxpZGF0b3IgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFNlbGVjdG9yVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBTZWxlY3RvclZhbGlkYXRvcihTdHJpbmcgdGV4dCkgewotCQlzdXBlcigpOwotCQlmVGV4dCA9IHRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0ZXh0IGNvbnNpc3RzIG9mIG9uZSBDTEFTUyBzZWxlY3Rvci4gc3ludGF4IGNoZWNrCi0JICogaXMgYSBsaXR0bGUgbG9vc2UgKC4xMjMgaXMgcGFzc2VkKQotCSAqIAotCSAqICIuY2xhc3MiIC0+IHRydWUgIi4xMjMiIC0+IHRydWUgIi5jbGFzcyAsIC5jbGFzczIiIC0+IGZhbHNlCi0JICogIi5jbGFzcy5jbGFzczIiIC0+IGZhbHNlICIuMTIze30iIC0+IGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsKLQkJSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yID0gZ2V0T25seU9uZVNpbXBsZVNlbGVjdG9yKCk7Ci0JCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHNlbGVjdG9yLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mQXR0cmlidXRlcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCkgPT0gMSAmJiBzZWxlY3Rvci5nZXROdW1PZklEcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpID09IDApOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgY29uc2lzdHMgb2Ygb25lIElEIHNlbGVjdG9yLgotCSAqIAotCSAqICIjSUQiIC0+IHRydWUgIkgxI215SUQiIC0+IGZhbHNlICIjYWJje30iIC0+IGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJRCgpIHsKLQkJSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yID0gZ2V0T25seU9uZVNpbXBsZVNlbGVjdG9yKCk7Ci0JCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHNlbGVjdG9yLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mQXR0cmlidXRlcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZklEcygpID09IDEgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpID09IDApOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBvdmVyYWxsIGNoZWNrCi0JICogCi0JICogIlAjaG9nZTk4ICsgKjpob3ZlciA+IEE6bGluaywgQS5leHRlcm5hbDp2aXNpdGVkIiAtPiB0cnVlICJIMSBIMiB7fSIgLT4KLQkgKiBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXBhcnNlKCk7Ci0JCXJldHVybiAoZlNlbGVjdG9yTGlzdCAhPSBudWxsICYmIGZTZWxlY3Rvckxpc3QuZ2V0RXJyb3JDb3VudCgpID09IDApOwotCX0KLQotCXByaXZhdGUgSUNTU1NpbXBsZVNlbGVjdG9yIGdldE9ubHlPbmVTaW1wbGVTZWxlY3RvcigpIHsKLQkJcGFyc2UoKTsKLQkJaWYgKGZTZWxlY3Rvckxpc3QgIT0gbnVsbCAmJiBmU2VsZWN0b3JMaXN0LmdldExlbmd0aCgpID09IDEpIHsKLQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IGZTZWxlY3Rvckxpc3QuZ2V0U2VsZWN0b3IoMCk7Ci0JCQlpbnQgbkl0ZW0gPSBzZWxlY3Rvci5nZXRMZW5ndGgoKTsKLQkJCWlmIChuSXRlbSA9PSAxKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gc2VsZWN0b3IuZ2V0SXRlbSgwKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIElDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCQlyZXR1cm4gKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlKCkgewotCQlpZiAoZlNlbGVjdG9yTGlzdCA9PSBudWxsKSB7Ci0JCQlpZiAoZlRleHQgIT0gbnVsbCkgewotCQkJCWZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChmVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0ID0gbnVsbDsKLQlwcml2YXRlIElDU1NTZWxlY3Rvckxpc3QgZlNlbGVjdG9yTGlzdCA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL1NlbGVjdG9yc0NvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL1NlbGVjdG9yc0NvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE0M2MwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9TZWxlY3RvcnNDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdG9yc0NvbGxlY3RvciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXByb3RlY3RlZCBWZWN0b3Igc2VsZWN0b3JzID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBWZWN0b3Igc2VsZWN0b3JzVG9Bdm9pZCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2VsZWN0b3JzQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRUcmF2ZXJzZUltcG9ydGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RvclRvQXZvaWQoSUNTU1NlbGVjdG9yIHNlbFRvQXZvaWQpIHsKLQkJaWYgKHNlbFRvQXZvaWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNlbGVjdG9yc1RvQXZvaWQgPT0gbnVsbCkKLQkJCXNlbGVjdG9yc1RvQXZvaWQgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaWYgKCFzZWxlY3RvcnNUb0F2b2lkLmNvbnRhaW5zKHNlbFRvQXZvaWQpKQotCQkJc2VsZWN0b3JzVG9Bdm9pZC5hZGQoc2VsVG9Bdm9pZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0b3JUb0F2b2lkKElDU1NTdHlsZVJ1bGUgcnVsZSkgewotCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBydWxlLmdldFNlbGVjdG9ycygpOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuZ2V0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbCA9IChJQ1NTU2VsZWN0b3IpIGl0Lm5leHQoKTsKLQkJCWFkZFNlbGVjdG9yVG9Bdm9pZChzZWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJcmV0dXJuIHNlbGVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVSVUxFX05PREUpIHsKLQkJCUlDU1NTdHlsZVJ1bGUgcnVsZSA9IChJQ1NTU3R5bGVSdWxlKSBub2RlOwotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gcnVsZS5nZXRTZWxlY3RvcnMoKTsKLQkJCUl0ZXJhdG9yIGl0ID0gbGlzdC5nZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHNlbGVjdG9yc1RvQXZvaWQgIT0gbnVsbCAmJiBzZWxlY3RvcnNUb0F2b2lkLmNvbnRhaW5zKG9iaikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICghc2VsZWN0b3JzLmNvbnRhaW5zKG9iaikpCi0JCQkJCXNlbGVjdG9ycy5hZGQob2JqKTsKLQkJCX0KLQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JzVG9Bdm9pZChqYXZhLnV0aWwuVmVjdG9yIG5ld1NlbGVjdG9yc1RvQXZvaWQpIHsKLQkJc2VsZWN0b3JzVG9Bdm9pZCA9IG5ld1NlbGVjdG9yc1RvQXZvaWQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9VUkxIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9VUkxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhM2EwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvVVJMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlBhdGhIZWxwZXI7Ci0KLS8qKgotICogSHlwZXJsaW5rIG1hbmFnZXIuIFByb3ZlZCB1c2VmdWwgc2VydmljZXMgbGlrZSBsaW5rIGNvbnZlcnNpb24gQW4gdXRpbGl0eQotICogY2xhc3MgdG8gaGVscCBvdGhlciBwYXJzcmUgbW9kdWxlcyB0byBjb252ZXJ0IGxpbmtzCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxIZWxwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0xfU0VBUkNIX1NJRyA9ICJmaWxlOi8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTF9TSUcgPSAiZmlsZTovLy8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVMQVRJVkVfUEFUSF9TSUcgPSAiLi4iOy8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfU0xBU0ggPSAiLyI7Ly8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIFVSTCBmQmFzZVVybCA9IG51bGw7IC8vIGJhc2UgdXJsLiBhc3N1bWVkIHRvIGEgYWJzdWx1dGUgdXJsCi0JcHJpdmF0ZSBTdHJpbmcgZkJhc2VVcmxTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgVVJMIGZEb2NSb290ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRG9jUm9vdFN0cmluZyA9IG51bGw7Ci0KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsKSB7Ci0JCWluaXRpYWxpemUoYmFzZVVybCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFVSTEhlbHBlcihTdHJpbmcgYmFzZVVybCwgU3RyaW5nIGRvY1Jvb3QpIHsKLQkJaW5pdGlhbGl6ZShiYXNlVXJsLCBkb2NSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWFsIGFkdWp1c3QgZm9yIGZpbGUgdXJsCi0JICovCi0JcHVibGljIFN0cmluZyBhZGp1c3RGaWxlUHJvdG9jb2xVcmwoU3RyaW5nIHVybCkgewotCQlpZiAodXJsLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTF9TRUFSQ0hfU0lHKSkgewotCQkJdXJsID0gRklMRV9QUk9UT0NPTF9TSUcgKyB1cmwuc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0xfU0VBUkNIX1NJRy5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0KFN0cmluZyB1cmwsIFVSTCBiYXNlVXJsLCBTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCVN0cmluZyBhYnNVcmwgPSB1cmw7Ci0JCWlmIChiYXNlVXJsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gZG8gc3BlY2lhbCB0aGluZyBmaWxlIHByb3RvY29sCi0JCQkJaWYgKGJhc2VVcmwuZ2V0UHJvdG9jb2woKS5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikpIHsvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJlbW92ZSB0aGUgZmlzdAotCQkJCQlpZiAodXJsLnN0YXJ0c1dpdGgoIi8iKSkvLyROT04tTkxTLTEkCi0JCQkJCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDEpOwotCQkJCQkvLyBlbXB0eSBzdHJpbmcgY2F1c2VzIG1hbGZvcm1lZCBleGNlcHRpb24KLQkJCQkJU3RyaW5nIHRlbXBVcmwgPSB1cmw7Ci0JCQkJCWlmICgiIi5lcXVhbHModXJsKSkvLyROT04tTkxTLTEkCi0JCQkJCQl0ZW1wVXJsID0gIiAiOy8vJE5PTi1OTFMtMSQKLQkJCQkJVVJMIG5ld1VybCA9IG5ldyBVUkwoYmFzZVVybCwgdGVtcFVybCk7Ci0JCQkJCS8vIGRvIGV4dHJhIG1hdGggZm9yIGZpbGUgcHJvdG9jb2wgdG8gc3VwcG9ydCBpZSBiYXNlZAotCQkJCQlhYnNVcmwgPSBhZGp1c3RGaWxlUHJvdG9jb2xVcmwobmV3VXJsLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJVVJMIG5ld1VybCA9IG5ldyBVUkwoZkJhc2VVcmwsIHVybCk7Ci0JCQkJCWFic1VybCA9IG5ld1VybC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLQkJCX0KLQkJCS8vIGNvbnZlcnQgZXZlcnl0aGluZyB0byBmb3J3YXJkIHNsYXNoCi0JCQlhYnNVcmwgPSBQYXRoSGVscGVyLnN3aXRjaFRvRm9yd2FyZFNsYXNoZXMoYWJzVXJsKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRoZSBnaXZlbiBtYXkgYmUgYmFzZWQgb24gZmlsZQotCQkJaWYgKHVybFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJLy8gc3dpY2ggdGhlIHVybCB0byBwcm9wZXIgZGlyZWN0aW9uCi0JCQkJdXJsID0gUGF0aEhlbHBlci5yZW1vdmVMZWFkaW5nU2VwYXJhdG9yKHVybCk7Ci0JCQkJRmlsZSBmbGUgPSBuZXcgRmlsZSh1cmxTdHJpbmcsIHVybCk7Ci0JCQkJYWJzVXJsID0gZmxlLmdldFBhdGgoKTsKLQotCQkJfQotCQkJLy8gY29udmVydCBldmVyeXRoaW5nIHRvIGZvcndhcmQgc2xhc2gKLQkJCWFic1VybCA9IFBhdGhIZWxwZXIuc3dpdGNoVG9Gb3J3YXJkU2xhc2hlcyhhYnNVcmwpOwotCi0JCQkvLyBpZiB0aGUgcGF0aCBlbmRzIHdpdGggIi4uIiB3ZSBuZWVkIHRvIGFkZCBhIHRlcm1pbmF0aW5nIHNsYXNoCi0JCQkvLyBvcgotCQkJLy8gZWxzZSB0aGUgbGluayB3aWxsIG5vdCBiZSByZXNvbHZlZCBjb3JyZWN0bHkuIChpdCB3aWxsIGxvb2sKLQkJCS8vIGxpa2UKLQkJCS8vIC91cmwvcGF0aC90by9zb21ld2hlcmUvLi4gaW5zdGVhZCBvZiAvdXJsL3BhdGgvdG8vCi0JCQlpZiAoYWJzVXJsLmVuZHNXaXRoKEZPUldBUkRfU0xBU0ggKyBSRUxBVElWRV9QQVRIX1NJRykpIHsKLQkJCQlhYnNVcmwgKz0gRk9SV0FSRF9TTEFTSDsKLQkJCX0KLQkJfQotCi0JCS8vIHJlc29sdmUgcmVsYXRpdmUgcGF0aCB0byBhYnNvbHV0ZQotCQlhYnNVcmwgPSBQYXRoSGVscGVyLmFkanVzdFBhdGgoYWJzVXJsKTsKLQkJcmV0dXJuIGFic1VybDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgYmFzZVVybCwgU3RyaW5nIGRvY1Jvb3QpIHsKLQkJLy8KLQkJLy8gRmluZCBvdXQgd2hldGhlciBiYWVzIHVybCBpcyBhIHVybCBvciBmaWxlIG5hbWUKLQkJLy8KLQkJdHJ5IHsKLQkJCVN0cmluZyB0ZW1wID0gUGF0aEhlbHBlci5hcHBlbmRUcmFpbGluZ1VSTFNsYXNoKGJhc2VVcmwpOwotCQkJZkJhc2VVcmwgPSBuZXcgVVJMKHRlbXApOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCX0KLQkJaWYgKGZCYXNlVXJsID09IG51bGwpIHsKLQkJCS8vIGl0IGlzIGEgZmlsZSBiYXNlZCB1cmwKLQkJCWZCYXNlVXJsU3RyaW5nID0gYmFzZVVybDsKLQkJfQotCi0JCS8vIGRvIHRoZSBzYW1lIGZvciBkb2Mgcm9vdAotCQlpZiAoZG9jUm9vdCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB0ZW1wID0gUGF0aEhlbHBlci5hcHBlbmRUcmFpbGluZ1VSTFNsYXNoKGRvY1Jvb3QpOwotCQkJCWZEb2NSb290ID0gbmV3IFVSTCh0ZW1wKTsKLQotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKLQkJCX0KLQkJCWlmIChmRG9jUm9vdCA9PSBudWxsKSB7Ci0JCQkJLy8gaXQgaXMgYSBmaWxlIGJhc2VkIHVybAotCQkJCWZEb2NSb290U3RyaW5nID0gZG9jUm9vdDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGdpdmVuIHVybCB0byBhIGFib2x1dGUgdXJsIHVzaW5nIHRoZSBiYXNlIHVybCBJbnB1dCB1cmwgY2FuCi0JICogYmUgb2YgYW55IG90aGUgZm9sbG93aW5nIGZvcm1hdCBBYnNvbHV0ZSB1cmxzIC0tLS0tLS0tLS0tLS0tIC4KLQkgKiBodHRwOi8vd3d3LmZvby5jb20vIC4gaHR0cDovL3d3dy5mb28uY29tIC4gaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlciAuCi0JICogaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlci8gLiBodHRwOi8vd3d3LmZvby5jb20vaW5kZXguaHRtbCAuCi0JICogaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlci9pbmRleC5odG1sIC4KLQkgKiBodHRwOi8vd3d3LmZvby5jb20vZm9sZGVyLy4uL2luZGV4Lmh0bWwgVXJsIHJlbGF0aXZlIG9uIGRvY3VtZW50IHJvb3QKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC4gLyAuIC9mb2xkZXIgLiAvaW5kZXguaHRtbCAuCi0JICogL2ZvbGRlci9pbmRleC5odG1sIC4gL2ZvbGRlci8uLi9pbmRleC5odG1sCi0JICogCi0JICogU2VsZiByZWxhdGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC4gaW5kZXguaHRtbCAuIC4vaW5kZXguaHRtbCAuCi0JICogLi4vaW5kZXguaHRtbCAuIGZvbGRlci9pbmRleC5odG1sIC4gZm9sZGVyLy4uL2luZGV4Lmh0bWwKLQkgKiAKLQkgKiBmaWxlIGJhc2VkIHVybCBhZGRzIGFub3RoZXIgZGltZW5zaW9uIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBhIGRvY3VtZW50Ci0JICogcm9vdCBTbyB1c2VzIGZEb2NSb290IGlmIHByb3ZpZGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b0Fic29sdXRlKFN0cmluZyB1cmwpIHsKLQkJU3RyaW5nIGFic1VybCA9IHVybDsKLQotCQlVUkwgbmV3VXJsID0gbnVsbDsKLQkJLy8gdHJ5IHRvIHNlZSBpdCBpcyBhIGFic29sdXRlIHVybAotCQl0cnkgewotCQkJbmV3VXJsID0gbmV3IFVSTCh1cmwpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLQkJfQotCQkvLyBpZiBkb2N1bWVudCByb290IGlzIHByb3ZpZGVkCi0JCS8vIGRvIHNwZWNpYWwgY2FzZQotCQlpZiAobmV3VXJsID09IG51bGwpIHsKLQkJCWlmIChmRG9jUm9vdCA9PSBudWxsICYmIGZEb2NSb290U3RyaW5nID09IG51bGwpIHsKLQkJCQkvLyB0cnkgdG8gY2hlY2sgcmVsYXRpdmUgdXJsCi0JCQkJYWJzVXJsID0gY29udmVydCh1cmwsIGZCYXNlVXJsLCBmQmFzZVVybFN0cmluZyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBkb2Mgcm9vdCBpcyBwcm92aWRlZAotCQkJCS8vIGlmIHRoZSB1cmwgaXMgYSBkb2Mgcm9vdCBiYXNlZCB1c2UgZG9jIHJvb3QKLQotCQkJCWlmICh1cmwuc3RhcnRzV2l0aCgiLyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJYWJzVXJsID0gY29udmVydCh1cmwsIGZEb2NSb290LCBmRG9jUm9vdFN0cmluZyk7Ci0JCQkJZWxzZQotCQkJCQlhYnNVcmwgPSBjb252ZXJ0KHVybCwgZkJhc2VVcmwsIGZCYXNlVXJsU3RyaW5nKTsKLQotCQkJfQotCQl9Ci0JCXJldHVybiBhYnNVcmw7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBmcm9tIGFuIGFic29sdXRlIHVybCB0byByZWxhdGl2ZSB1cmwgYmFzZWQgb24gdGhlIGdpdmVuIHVybAotCSAqIEJvdGggYXJlIGFzc3VtZWQgdG8gYmUgYWJsc3V0ZSB1cmwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvUmVsYXRpdmUoU3RyaW5nIHVybCwgU3RyaW5nIGRvY3VtZW50VXJsKSB7Ci0JCVN0cmluZyBvdXRwdXQgPSB1cmw7Ci0JCS8vIGFzc3VtaW5nIGJvdGggdXJscyBhcmUgYWJzb2x1dGUKLQkJdHJ5IHsKLQkJCVVSTCBpbnB1dFVybCA9IG5ldyBVUkwodXJsKTsKLQkJCVVSTCBkb2NVcmwgPSBuZXcgVVJMKGRvY3VtZW50VXJsKTsKLQkJCS8vIGZpbHRlciBvdXQgaWYgdGhlIHVybHMgYXJlIG5vdCBmcm8gdGhlIHNhbWUgZG9tYWluCi0JCQlpZiAoIWlucHV0VXJsLmdldFByb3RvY29sKCkuZXF1YWxzKGRvY1VybC5nZXRQcm90b2NvbCgpKSB8fCAhaW5wdXRVcmwuZ2V0SG9zdCgpLmVxdWFscyhkb2NVcmwuZ2V0SG9zdCgpKSB8fCBpbnB1dFVybC5nZXRQb3J0KCkgIT0gZG9jVXJsLmdldFBvcnQoKSkKLQkJCQlyZXR1cm4gb3V0cHV0OwotCQkJLy8gYm90aCB1cmwgYXJlIGNvbWluZyBmb3JtIHRoZSBzYW1lIHBsYWNlCi0JCQkvLyBzdHJpcCBvZmYgdGhlIGRvbWFpbiBwYXJ0cwotCQkJU3RyaW5nIGlucHV0TmFtZSA9IGlucHV0VXJsLmdldEZpbGUoKTsKLQkJCVN0cmluZyBkb2NOYW1lID0gZG9jVXJsLmdldEZpbGUoKTsKLQkJCW91dHB1dCA9IFBhdGhIZWxwZXIuY29udmVydFRvUmVsYXRpdmUoaW5wdXROYW1lLCBkb2NOYW1lKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0JCQlvdXRwdXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9VUkxNb2RlbFByb3ZpZGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvVVJMTW9kZWxQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTE5NTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9VUkxNb2RlbFByb3ZpZGVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5QYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlByb2plY3RSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VUklSZXNvbHZlcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxNb2RlbFByb3ZpZGVyQ1NTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTU9ERUxfRk9SX1JFQUQgPSAxOwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTkVXX01PREVMX0ZPUl9SRUFEID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX01PREVMX0ZPUl9FRElUID0gMzsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX05FV19NT0RFTF9GT1JfRURJVCA9IDQ7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURfQlVGRkVSX1NJWkUgPSA0MDk2OwotCS8vIElNb2RlbE1hbmFnZXIKLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBVUkxNb2RlbFByb3ZpZGVyQ1NTKCkgewotCQlzdXBlcigpOwotCi0JCS8vIG9idGFpbiBtb2RlbCBtYW5hZ2VyCi0JCW1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIElEIGZyb20gYSBmaWxlbmFtZS4gVGhpcyBtdXN0IGJlIHNhbWUgYXMKLQkgKiBGaWxlTW9kZWxQcm92aWRlci5jYWxjdWxhdGVJZChJRmlsZSkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSVBhdGggZnVsbElQYXRoKSB7Ci0JCXJldHVybiBmdWxsSVBhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0Q29tbW9uTW9kZWxGb3IoZmluYWwgSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIGZpbmFsIFN0cmluZyByZWYsIGZpbmFsIGludCB3aGljaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZmlyc3QsIGNyZWF0ZSBhYnNvbHV0ZSB1cmwKLQkJU3RyaW5nIGFic1VSTCA9IHJlc29sdmVVUkkoYmFzZU1vZGVsLCByZWYsIHRydWUpOwotCQlpZiAoKGFic1VSTCA9PSBudWxsKSB8fCAoYWJzVVJMLmxlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG5lZWQgdG8gcmVtb3ZlIGZpbGU6Ly8gc2NoZW1lIGlmIG5lY2Vzc2FyeQotCQkvLyBzZWUgY29tLmlibS5zZWQudXRpbC5Qcm9qZWN0UmVzb2x2ZXIuZ2V0TG9jYXRpb25CeVVSSSgpCi0JCXRyeSB7Ci0JCQlmaW5hbCBVUkwgYVVSTCA9IG5ldyBVUkwoYWJzVVJMKTsKLQkJCS8vIEFuIGFjdHVhbCBVUkwgd2FzIGdpdmVuLCBvbmx5IGZpbGU6Ly8vIGlzIHN1cHBvcnRlZAotCQkJLy8gcmVzb2x2ZSBpdCBieSBmaW5kaW5nIHRoZSBmaWxlIGl0IHBvaW50cyB0bwotCQkJaWYgKCFhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpICYmIChhVVJMLmdldEhvc3QoKS5lcXVhbHMoImxvY2FsaG9zdCIpIHx8IGFVUkwuZ2V0SG9zdCgpLmxlbmd0aCgpID09IDApKSB7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCWFic1VSTCA9IGFVUkwuZ2V0RmlsZSgpOwotCQkJCQlmaW5hbCBJUGF0aCBpcGF0aCA9IG5ldyBQYXRoKGFic1VSTCk7Ci0JCQkJCS8vIGlmIHBhdGggaGFzIGEgZGV2aWNlLCBhbmQgaWYgaXQgYmVnaW5zIHdpdGgKLQkJCQkJLy8gSVBhdGguU0VQQVJBVE9SLCByZW1vdmUgaXQKLQkJCQkJZmluYWwgU3RyaW5nIGRldmljZSA9IGlwYXRoLmdldERldmljZSgpOwotCQkJCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCWlmIChkZXZpY2UuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCQkJCWZpbmFsIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2Uuc3Vic3RyaW5nKDEpOwotCQkJCQkJCWFic1VSTCA9IGlwYXRoLnNldERldmljZShuZXdEZXZpY2UpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1mdUV4YykgewotCQl9Ci0KLQkJLy8gbmV4dCwgZGVjaWRlIHByb2plY3QKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWZpbmFsIElQYXRoIGZ1bGxJUGF0aCA9IG5ldyBQYXRoKGFic1VSTCk7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gd29ya3NwYWNlLmdldENvbnRhaW5lckZvckxvY2F0aW9uKGZ1bGxJUGF0aCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJLy8gZnVsbElQYXRoIGRvZXNuJ3QgZXhpc3QgaW4gd29ya3NwYWNlCi0JCQlwcm9qZWN0ID0gY29udGFpbmVyLmdldFByb2plY3QoKTsKLQkJfQotCi0JCS8vIElmIEhUTUwgZG9jdW1lbnQgaGFzIGEgbGluayB0byBhbiBleHRlcm4gQ1NTIHdoaWNoIGlzIG5vdCBpbgotCQkvLyBJUHJvamVjdAotCQkvLyB3b3Jrc3BhY2UuZ2V0Q29udGFpbmVyRm9yTG9hdGlvbigpIG1heSByZXR1cm4gbnVsbC4gV2UgbmVlZCB0byB0YWtlCi0JCS8vIGNhcmUKLQkJLy8gb2YgdGhpcyBjYXNlCi0KLQkJLy8gbm93LCBnZXQgYWJzVVJMJ3MgSUZpbGUKLQkJaWYgKChwcm9qZWN0ICE9IG51bGwpICYmIChwcm9qZWN0LmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihmdWxsSVBhdGgpID09IGZhbHNlKSkgewotCQkJLy8gaXQncyBhdCBvdXRzaWRlIG9mIFByb2plY3QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlQYXRoIGZpbGVQYXRoID0gZnVsbElQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocHJvamVjdC5nZXRMb2NhdGlvbigpLnNlZ21lbnRDb3VudCgpKTsKLQkJCUlGaWxlIGZpbGUgPSAoZmlsZVBhdGggIT0gbnVsbCAmJiAhZmlsZVBhdGguaXNFbXB0eSgpKSA/IHByb2plY3QuZ2V0RmlsZShmaWxlUGF0aCkgOiBudWxsOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBvYnRhaW4gbW9kZWwKLQkJCWlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX0VESVQpIHsKLQkJCQltb2RlbCA9IGdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfUkVBRCkgewotCQkJCW1vZGVsID0gZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJfQotCi0JCQkvLyBzZXR0aW5nIHN5bmNocm9uaXphdGlvbiBzdGFtcCBpcyBJTW9kZWxNYW5hZ2VyJ3MgY2xpZW50J3MKLQkJCS8vIHJlc3BvbnNpYmlsaXR5Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpID09IElSZXNvdXJjZS5OVUxMX1NUQU1QKQotCQkJCW1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgaWQgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQkJLy8gb2J0YWluIHJlc29sdmVyCi0JCQlVUklSZXNvbHZlciByZXNvbHZlciA9IChwcm9qZWN0ICE9IG51bGwpID8gKFVSSVJlc29sdmVyKSBwcm9qZWN0LmdldEFkYXB0ZXIoVVJJUmVzb2x2ZXIuY2xhc3MpIDogbnVsbDsKLQkJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQkJLy8gUHJvamVjdFJlc29sdmVyIGNhbiB0YWtlIGNhcmUgb2YgdGhlIGNhc2UgaWYgcHJvamVjdCBpcwotCQkJCS8vIG51bGwuCi0JCQkJcmVzb2x2ZXIgPSBuZXcgUHJvamVjdFJlc29sdmVyKHByb2plY3QpOwotCQkJfQotCQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gdGhlcmUgaXMgbm8gcHJvamVjdC4gd2UgY2FuJ3QgZXhwZWN0IElQcm9qZWN0IGhlbHAgdG8gY3JlYXRlCi0JCQkvLyBpZC9pbnB1dFN0cmVhbQotCQkJRmlsZSBmaWxlID0gZnVsbElQYXRoLnRvRmlsZSgpOwotCi0JCQkvLyBvYmF0aW4gaWQKLQkJCWlkID0gY2FsY3VsYXRlSWQoZnVsbElQYXRoKTsKLQotCQkJLy8gb2J0YWluIElucHV0U3RyZWFtCi0JCQl0cnkgewotCQkJCWluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotCQkJCS8vIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciB3ZSBkb24ndCBoYXZlIHJlYWQgcGVybWlzc2lvbgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBvYnRhaW4gbW9kZWwKLQkJCXRyeSB7Ci0JCQkJaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfRURJVCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChpZCwgaW5TdHJlYW0sIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9SRUFEKSB7Ci0JCQkJCW1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpblN0cmVhbSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlKSB7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBjbG9zZSBub3cgIQotCQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2V0IGxvY2F0aW9uaWQKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkgPT0gbnVsbCkgewotCQkJbW9kZWwuc2V0QmFzZUxvY2F0aW9uKGZ1bGxJUGF0aC50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25Nb2RlbEZvcihiYXNlTW9kZWwsIHJlZiwgR0VUX01PREVMX0ZPUl9FRElUKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJLy8gY3JlYXRlIGEgZmFrZSBJbnB1dFN0cmVhbQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGZpbGUsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uTW9kZWxGb3IoYmFzZU1vZGVsLCByZWYsIEdFVF9NT0RFTF9GT1JfUkVBRCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCi0JCS8vIGNyZWF0ZSBhIGZha2UgSW5wdXRTdHJlYW0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB7Ci0JCWlmIChpRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TmV3TW9kZWxGb3JFZGl0KGlGaWxlLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2Ugcml1KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlQWxyZWFkeUV4aXN0cyByYWUpIHsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXROZXdNb2RlbEZvckVkaXQoaUZpbGUsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSByaXUpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VBbHJlYWR5RXhpc3RzIHJhZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqIDxjb2RlPnJlc29sdmVDcm9zc1Byb2plY3RMaW5rczwvY29kZT46IElmIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcwotCSAqIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcHJvcGVybHkgcmVzb2x2ZSB0aGUgVVJJIGlmIGl0IGlzCi0JICogYSB2YWxpZCBVUkkgcG9pbnRpbmcgdG8gYW5vdGhlciAoYXBwcm9wcmlhdGUpIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVSSShJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZiwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gZ2V0IHJlc29sdmVyIGluIE1vZGVsCi0JCWZpbmFsIFVSSVJlc29sdmVyIHJlc29sdmVyID0gYmFzZU1vZGVsLmdldFJlc29sdmVyKCk7Ci0KLQkJLy8gcmVzb2x2ZSB0byBhYnNvbHV0ZSB1cmwKLQkJZmluYWwgU3RyaW5nIGFic3VybCA9IChyZXNvbHZlciAhPSBudWxsKSA/IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkocmVmLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIDogbnVsbDsKLQkJaWYgKChyZXNvbHZlciAhPSBudWxsKSAmJiAoYWJzdXJsID09IG51bGwpICYmIChyZWYgIT0gbnVsbCkgJiYgKHJlZi50cmltKCkubGVuZ3RoKCkgPiAwKSAmJiAocmVmLnRyaW0oKS5jaGFyQXQoMCkgPT0gJy8nKSkgewotCQkJLy8gdG8gcmVhY2ggaGVyZSBtZWFucyA6Ci0JCQkvLyByZWYgaXMgYSBEb2Nyb290IHJlbGF0aXZlCi0JCQkvLyByZXNvbHZlciBjYW4ndCByZXNvbHZlIHJlZgotCQkJLy8gc28gdGhhdCBocmVmIGlzIGEgYnJva2VuIGFuZCBzaG91bGQgbm90IGNyZWF0ZSBtb2RlbAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKChhYnN1cmwgIT0gbnVsbCkgJiYgKGFic3VybC5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXR1cm4gYWJzdXJsOwotCQl9Ci0KLQkJLy8gbWF5YmUgcmVmIGlzIGF0IG91dHNpZGUgb2YgdGhlIFByb2plY3QKLQkJLy8gb2J0YWluIGRvY3Jvb3Q7Ci0JCWZpbmFsIElDb250YWluZXIgY29udGFpbmVyID0gKHJlc29sdmVyICE9IG51bGwpID8gcmVzb2x2ZXIuZ2V0Um9vdExvY2F0aW9uKCkgOiBudWxsOwotCQlTdHJpbmcgZG9jcm9vdCA9IG51bGw7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJZG9jcm9vdCA9IGNvbnRhaW5lci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKGRvY3Jvb3QgPT0gbnVsbCkgewotCQkJZG9jcm9vdCA9IGJhc2VNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlpZiAoZG9jcm9vdCA9PSBudWxsKSB7Ci0JCQkvLyBzaG91bGQgbm90IGJlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG9idGFpbiBkb2N1bWVudCB1cmwKLQkJU3RyaW5nIG1vZGVsQmFzZUxvY2F0aW9uID0gYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAoKG1vZGVsQmFzZUxvY2F0aW9uID09IG51bGwpIHx8IChtb2RlbEJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZmFsbGJhY2suLi4KLQkJCW1vZGVsQmFzZUxvY2F0aW9uID0gYmFzZU1vZGVsLmdldElkKCk7Ci0JCX0KLQkJaWYgKChtb2RlbEJhc2VMb2NhdGlvbiA9PSBudWxsKSB8fCAobW9kZWxCYXNlTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGkgY2FuJ3QgcmVzb2x2ZSB1cmkgIQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyByZXNvbHZlIHVybAotCQlVUkxIZWxwZXIgaGVscGVyID0gbmV3IFVSTEhlbHBlcihQYXRoSGVscGVyLmdldENvbnRhaW5pbmdGb2xkZXJQYXRoKG1vZGVsQmFzZUxvY2F0aW9uKSwgUGF0aEhlbHBlci5nZXRDb250YWluaW5nRm9sZGVyUGF0aChQYXRoSGVscGVyLmFwcGVuZFRyYWlsaW5nVVJMU2xhc2goZG9jcm9vdCkpKTsKLQkJcmV0dXJuIGhlbHBlci50b0Fic29sdXRlKHJlZik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZjk0ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1ZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLklWYWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiBmb3IgaG9yaXpvbnRhbCB2YWx1ZSBvZiAnYmFja2dyb3VuZC1wb3NpdGlvbicKLSAqLwotcHVibGljIGNsYXNzIEJhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIgaW1wbGVtZW50cyBJU3ViUHJvcGVydHlBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDU1NUZXh0VG9rZW5bXSBjb3JyZWN0TWVhbmluZ1Rva2VuKENTU1RleHRUb2tlbltdIHNyYykgewotCQlqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWxpc3QuYWRkKHNyY1tpXSk7Ci0JCX0KLQkJQ1NTVGV4dFRva2VuW10gcmV0ID0gbmV3IENTU1RleHRUb2tlbltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCVN0cmluZyBzdHIgPSBudWxsOwotCQlPYmplY3Qgb2JqID0gcHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7Ci0JCQkJSUNTU1ZhbHVlTGlzdCBsaXN0ID0gKElDU1NWYWx1ZUxpc3QpIG9iajsKLQkJCQlJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMCk7Ci0JCQkJaWYgKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsKLQkJCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsKLQkJCQkJaWYgKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgewotCQkJCQkJLy8gY2hlY2sgbm90IHRvcCBvciBib3R0b20KLQkJCQkJCWlmICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgewotCQkJCQkJCS8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4gaG9yaXpvbnRhbAotCQkJCQkJCXZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXN0ciA9IHZhbHVlLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJaWYgKHN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHN0cik7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCi0JCQkJdG9rZW5zID0gY29ycmVjdE1lYW5pbmdUb2tlbih0b2tlbnMpOwotCQkJCWlmICh0b2tlbnMubGVuZ3RoID09IDApCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmICh0b2tlbnMubGVuZ3RoID09IDEgJiYgKHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgdG9rZW5zWzBdLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkpCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQllbHNlCi0JCQkJCXN0ciA9IHRva2Vuc1swXS5pbWFnZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyB2YWxIID0gdmFsdWU7Ci0JCVN0cmluZyB2YWxWID0gcHJvcGVydGllcy5nZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKCk7Ci0JCWlmICh2YWxWID09IG51bGwgfHwgdmFsVi5sZW5ndGgoKSA9PSAwKQotCQkJbmV3VmFsdWUgPSB2YWxIOwotCQllbHNlIGlmICh2YWxIID09IG51bGwgfHwgdmFsSC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlDb2xsZWN0aW9uIHZhbFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkuZ2V0VmFsdWVzKCk7Ci0JCQlDb2xsZWN0aW9uIHZhbFkgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkuZ2V0VmFsdWVzKCk7Ci0JCQlQcm9wQ01VdGlsLm1pbnVzKHZhbFksIHZhbFgpOwotCQkJSXRlcmF0b3IgaXQgPSB2YWxZLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqLnRvU3RyaW5nKCkuZXF1YWxzKHZhbFYudG9Mb3dlckNhc2UoKSkpIHsKLQkJCQkJLy8gbmVlZCBub3QgY29tcGVuc2F0ZSBmb3IgLi4uCi0JCQkJCW5ld1ZhbHVlID0gdmFsVjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLy8gY29tcGVuc2F0ZSBmb3IgSG9yaXpvbnRhbCB2YWx1ZQotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayB2YWxWIGlzIGxlbmd0aCBvciBub3QKLQkJCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgdmFsVi50cmltKCkpOwotCQkJCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJCQlpZiAodG9rZW5zICE9IG51bGwgJiYgdG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCW5ld1ZhbHVlID0gSVZhbElELlZfTEVGVCArICIgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlCi0JCQkJCW5ld1ZhbHVlID0gIjAlICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlCi0JCQluZXdWYWx1ZSA9IHZhbEggKyAiICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJcHJvcGVydGllcy5zZXRCYWNrZ3JvdW5kUG9zaXRpb24obmV3VmFsdWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyMzQ2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTVmFsdWVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIGZvciB2ZXJ0aWNhbCB2YWx1ZSBvZiAnYmFja2dyb3VuZC1wb3NpdGlvbicKLSAqLwotcHVibGljIGNsYXNzIEJhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIgaW1wbGVtZW50cyBJU3ViUHJvcGVydHlBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDU1NUZXh0VG9rZW5bXSBjb3JyZWN0TWVhbmluZ1Rva2VuKENTU1RleHRUb2tlbltdIHNyYykgewotCQlqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWxpc3QuYWRkKHNyY1tpXSk7Ci0JCX0KLQkJQ1NTVGV4dFRva2VuW10gcmV0ID0gbmV3IENTU1RleHRUb2tlbltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCVN0cmluZyBzdHIgPSBudWxsOwotCQlPYmplY3Qgb2JqID0gcHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7Ci0JCQkJSUNTU1ZhbHVlTGlzdCBsaXN0ID0gKElDU1NWYWx1ZUxpc3QpIG9iajsKLQkJCQlpbnQgaW5kZXggPSAxOwotCQkJCUlDU1NWYWx1ZSB2YWx1ZSA9IChJQ1NTVmFsdWUpIGxpc3QuaXRlbSgwKTsKLQkJCQlpZiAodmFsdWUuZ2V0Q3NzVmFsdWVUeXBlKCkgPT0gQ1NTVmFsdWUuQ1NTX1BSSU1JVElWRV9WQUxVRSkgewotCQkJCQlJQ1NTUHJpbWl0aXZlVmFsdWUgcHJpbSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbHVlOwotCQkJCQlpZiAocHJpbS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UKSB7Ci0JCQkJCQkvLyBjaGVjayBub3QgdG9wIG9yIGJvdHRvbQotCQkJCQkJaWYgKCFwcm9wWC5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkgJiYgcHJvcFkuY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpKSB7Ci0JCQkJCQkJLy8gY2FzZSBvcmRlciBpcyB2ZXJ0aWNhbCAtPiBob3Jpem9udGFsCi0JCQkJCQkJaW5kZXggPSAwOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oaW5kZXgpKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgewotCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBvYmopLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCWlmICghc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQk9UVE9NKSAmJiAhc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHN0cik7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCi0JCQkJdG9rZW5zID0gY29ycmVjdE1lYW5pbmdUb2tlbih0b2tlbnMpOwotCQkJCWlmICh0b2tlbnMubGVuZ3RoID09IDEgJiYgKHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgdG9rZW5zWzBdLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkpCi0JCQkJCXN0ciA9IHRva2Vuc1swXS5pbWFnZTsKLQkJCQllbHNlIGlmICh0b2tlbnMubGVuZ3RoID4gMSkKLQkJCQkJc3RyID0gdG9rZW5zWzFdLmltYWdlOwotCQkJCWVsc2UKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIHZhbEggPSBwcm9wZXJ0aWVzLmdldEJhY2tncm91bmRQb3NpdGlvblgoKTsKLQkJU3RyaW5nIHZhbFYgPSB2YWx1ZTsKLQkJaWYgKHZhbEggIT0gbnVsbCAmJiAodmFsSC50cmltKCkuZXF1YWxzKCIwJSIpIC8qIGRlZmF1bHQgdmFsdWUgKi98fCAvLyROT04tTkxTLTEkCi0JCQkJCXZhbEgudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfTEVGVCkgLyoKLQkJCQkJCQkJCQkJCQkJCQkgKiBhbm90aGVyCi0JCQkJCQkJCQkJCQkJCQkJICogZGVmYXVsdAotCQkJCQkJCQkJCQkJCQkJCSAqIHZhbHVlCi0JCQkJCQkJCQkJCQkJCQkJICovKSkKLQkJCXZhbEggPSBudWxsOwotCQlpZiAodmFsViA9PSBudWxsIHx8IHZhbFYubGVuZ3RoKCkgPT0gMCkKLQkJCW5ld1ZhbHVlID0gdmFsSDsKLQkJZWxzZSBpZiAodmFsSCA9PSBudWxsIHx8IHZhbEgubGVuZ3RoKCkgPT0gMCkgewotCQkJQ29sbGVjdGlvbiB2YWxYID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLmdldFZhbHVlcygpOwotCQkJQ29sbGVjdGlvbiB2YWxZID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLmdldFZhbHVlcygpOwotCQkJUHJvcENNVXRpbC5taW51cyh2YWxZLCB2YWxYKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdmFsWS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iai50b1N0cmluZygpLmVxdWFscyh2YWxWLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCS8vIG5lZWQgbm90IGNvbXBlbnNhdGUgZm9yIC4uLgotCQkJCQluZXdWYWx1ZSA9IHZhbFY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNvbXBlbnNhdGUgZm9yIEhvcml6b250YWwgdmFsdWUKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgdmFsViBpcyBsZW5ndGggb3Igbm90Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHZhbFYudHJpbSgpKTsKLQkJCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCQkJaWYgKHRva2VucyAhPSBudWxsICYmIHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCQluZXdWYWx1ZSA9IElWYWxJRC5WX0xFRlQgKyAiICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQluZXdWYWx1ZSA9ICIwJSAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJbmV3VmFsdWUgPSB2YWxIICsgIiAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCXByb3BlcnRpZXMuc2V0QmFja2dyb3VuZFBvc2l0aW9uKG5ld1ZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0MmRkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JhY2tncm91bmQnIHByb3BlcnR5ICdiYWNrZ3JvdW5kJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYmFja2dyb3VuZC1hdHRhY2htZW50JywgJ2JhY2tncm91bmQtY29sb3InLCAnYmFja2dyb3VuZC1pbWFnZScsCi0gKiAnYmFja2dyb3VuZC1wb3NpdGlvbicsICdiYWNrZ3JvdW5kLXJlcGVhdCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBpbWFnZSA9ICIiLCByZXBlYXQgPSAiIiwgYXR0YWNoID0gIiIsIHBvcyA9ICIiOy8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BJbWFnZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BSZXBlYXQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEF0dGFjaCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFBvcyA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcEltYWdlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFJlcGVhdC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXJlcGVhdCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQXR0YWNoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJYXR0YWNoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BQb3MuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCWlmIChwb3MgPT0gbnVsbCB8fCBwb3MubGVuZ3RoKCkgPD0gMCkKLQkJCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZQotCQkJCQkJcG9zID0gcG9zICsgIiAiICsgdG9rZW5zW2ldLmltYWdlOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCWlmIChwb3MgPT0gbnVsbCB8fCBwb3MubGVuZ3RoKCkgPD0gMCkKLQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UKLQkJCQkJcG9zID0gcG9zICsgIiAiICsgdG9rZW5zW2ldLmltYWdlOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wSW1hZ2UuZ2V0TmFtZSgpLCBpbWFnZSk7Ci0JCWRlc3Quc2V0KHByb3BSZXBlYXQuZ2V0TmFtZSgpLCByZXBlYXQpOwotCQlkZXN0LnNldChwcm9wQXR0YWNoLmdldE5hbWUoKSwgYXR0YWNoKTsKLQkJZGVzdC5zZXQocHJvcFBvcy5nZXROYW1lKCksIHBvcyk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIGltYWdlID0gbnVsbCwgcmVwZWF0ID0gbnVsbCwgYXR0YWNoID0gbnVsbCwgcG9zID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEltYWdlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFJlcGVhdCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQXR0YWNoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wSW1hZ2UuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wUmVwZWF0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJcmVwZWF0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BBdHRhY2guY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlhdHRhY2ggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQkJaWYgKHBvcyA9PSBudWxsKQotCQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlCi0JCQkJCQlwb3MgPSBwb3MgKyAiICIgKyB0b2tlbnNbaV0uaW1hZ2U7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKSB7Ci0JCQkJaWYgKHBvcyA9PSBudWxsKQotCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZQotCQkJCQlwb3MgPSBwb3MgKyAiICIgKyB0b2tlbnNbaV0uaW1hZ2U7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wSW1hZ2UgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gaW1hZ2U7Ci0JCWVsc2UgaWYgKHByb3BSZXBlYXQgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gcmVwZWF0OwotCQllbHNlIGlmIChwcm9wQXR0YWNoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGF0dGFjaDsKLQkJZWxzZSBpZiAocHJvcFBvcyA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBwb3M7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmODUxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLWJvdHRvbScgcHJvcGVydHkgJ2JvcmRlci1ib3R0b20nIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItYm90dG9tLWNvbG9yJywgJ2JvcmRlci1ib3R0b20tc3R5bGUnLCAnYm9yZGVyLWJvdHRvbS13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFhMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLWNvbG9yJyBwcm9wZXJ0eSAnYm9yZGVyLWNvbG9yJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXRvcC1jb2xvcicsICdib3JkZXItcmlnaHQtY29sb3InLCAnYm9yZGVyLWJvdHRvbS1jb2xvcicsCi0gKiAnYm9yZGVyLWxlZnQtY29sb3InLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQlpZGVudHNbaisrXSA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUiwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUiwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IsIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUiwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJaWRlbnRzW2orK10gPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1NjRlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1sZWZ0JyBwcm9wZXJ0eSAnYm9yZGVyLWxlZnQnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItbGVmdC1jb2xvcicsICdib3JkZXItbGVmdC1zdHlsZScsICdib3JkZXItbGVmdC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyMTk3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItcmlnaHQnIHByb3BlcnR5ICdib3JkZXItcmlnaHQnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItcmlnaHQtY29sb3InLCAnYm9yZGVyLXJpZ2h0LXN0eWxlJywgJ2JvcmRlci1yaWdodC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODIxODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlcicgcHJvcGVydHkgJ2JvcmRlcicgd2lsbCBiZSBleHBhbmRlZCB0byAnYm9yZGVyLWNvbG9yJywKLSAqICdib3JkZXItc3R5bGUnLCAnYm9yZGVyLXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlclNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3NTYwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItc3R5bGUnIHByb3BlcnR5ICdib3JkZXItc3R5bGUnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItdG9wLXN0eWxlJywgJ2JvcmRlci1yaWdodC1zdHlsZScsICdib3JkZXItYm90dG9tLXN0eWxlJywKLSAqICdib3JkZXItbGVmdC1zdHlsZScsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFLCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTllZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci10b3AnIHByb3BlcnR5ICdib3JkZXItdG9wJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXRvcC1jb2xvcicsICdib3JkZXItdG9wLXN0eWxlJywgJ2JvcmRlci10b3Atd2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0JvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQxYWQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci13aWR0aCcgcHJvcGVydHkgJ2JvcmRlci13aWR0aCcgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci10b3Atd2lkdGgnLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJywgJ2JvcmRlci1ib3R0b20td2lkdGgnLAotICogJ2JvcmRlci1sZWZ0LXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgsIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaiA9PSAxKQotCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCB8fCBwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbM107Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQ1NTUHJvcGVydHlDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQ1NTUHJvcGVydHlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTcxNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0NTU1Byb3BlcnR5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1Byb3BlcnR5Q29udGV4dCBpbXBsZW1lbnRzIElDU1MyUHJvcGVydGllcyB7Ci0KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGZQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCUhhc2hTZXQgZk1vZGlmaWVkID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIHN1YlByb3BlcnR5QWRhcHRlcnM7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBzaG9ydGhhbmRBZGFwdGVyczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NQcm9wZXJ0eUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRTaG9ydGhhbmRBZGFwdGVycygpOwotCQlpbml0U3ViUHJvcGVydHlBZGFwdGVycygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NQcm9wZXJ0eUNvbnRleHQoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlzdXBlcigpOwotCQlpbml0U2hvcnRoYW5kQWRhcHRlcnMoKTsKLQkJaW5pdFN1YlByb3BlcnR5QWRhcHRlcnMoKTsKLQkJaW5pdGlhbGl6ZShkZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGV4cG9ydHMgYWxsIHByb3BlcnR5L3ZhbHVlIHBhaXJzIHRvICdkZWNsJyBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5RnVsbChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVudW1lcmF0aW9uIGtleXMgPSBmUHJvcGVydGllcy5rZXlzKCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJT2JqZWN0IHZhbCA9IGZQcm9wZXJ0aWVzLmdldChrZXkpOwotCQkJU3RyaW5nIHZhbHVlID0gKHZhbCBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgPyAoKElDU1NWYWx1ZSkgdmFsKS5nZXRDU1NWYWx1ZVRleHQoKSA6IHZhbC50b1N0cmluZygpOwotCi0JCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCWRlY2wucmVtb3ZlUHJvcGVydHkoa2V5LnRvU3RyaW5nKCkpOwotCQkJZWxzZQotCQkJCWRlY2wuc2V0UHJvcGVydHkoa2V5LnRvU3RyaW5nKCksIHZhbHVlLnRyaW0oKSwgKHZhbCBpbnN0YW5jZW9mIFZhbHVlRGF0YSAmJiAoKFZhbHVlRGF0YSkgdmFsKS5pbXBvcnRhbnQpID8gIiFpbXBvcnRhbnQiIDogIiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGV4cG9ydHMgbW9kaWZpZWQgcHJvcGVydHkvdmFsdWUgcGFpcnMgdG8gJ2RlY2wnCi0JICogZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseU1vZGlmaWVkKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCB8fCBmTW9kaWZpZWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSBmTW9kaWZpZWQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLQkJCU9iamVjdCB2YWwgPSBmUHJvcGVydGllcy5nZXQoa2V5KTsKLQkJCVN0cmluZyB2YWx1ZSA9ICh2YWwgaW5zdGFuY2VvZiBJQ1NTVmFsdWUpID8gKChJQ1NTVmFsdWUpIHZhbCkuZ2V0Q1NTVmFsdWVUZXh0KCkgOiAoKHZhbCAhPSBudWxsKSA/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+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vm9sdW1lKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0xVTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHdoaXRlLXNwYWNlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaGl0ZVNwYWNlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSElURV9TUEFDRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd2lkb3dzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaWRvd3MoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRE9XUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd29yZC1zcGFjaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXb3JkU3BhY2luZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV09SRF9TUEFDSU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB6LWluZGV4IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRaSW5kZXgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1pfSU5ERVgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJZlByb3BlcnRpZXMuY2xlYXIoKTsKLQkJaWYgKGZNb2RpZmllZCAhPSBudWxsKQotCQkJZk1vZGlmaWVkLmNsZWFyKCk7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IG5Qcm9wZXJ0aWVzID0gZGVjbC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUHJvcGVydGllczsgaSsrKSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWUgPSBkZWNsLml0ZW0oaSk7Ci0JCQlpZiAocHJvcE5hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcm9wTiA9IHByb3BOYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChwcm9wTi5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCUNTU1ZhbHVlIHZhbCA9IGRlY2wuZ2V0UHJvcGVydHlDU1NWYWx1ZShwcm9wTmFtZSk7Ci0JCQkJCWlmICh2YWwgIT0gbnVsbCkKLQkJCQkJCWZQcm9wZXJ0aWVzLnB1dChwcm9wTiwgdmFsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgdm9pZCBpbml0U2hvcnRoYW5kQWRhcHRlcnMoKSB7Ci0JCWlmIChzaG9ydGhhbmRBZGFwdGVycyA9PSBudWxsKSB7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCS8vIHJlZ2lzdGVyCi0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHKSwgbmV3IEJhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVIpLCBuZXcgQm9yZGVyU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKSwgbmV3IEJvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKSwgbmV3IEJvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKSwgbmV3IEJvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUCksIG5ldyBCb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFQpLCBuZXcgQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NKSwgbmV3IEJvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUKSwgbmV3IEJvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKSwgbmV3IEZvbnRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKSwgbmV3IExpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTiksIG5ldyBNYXJnaW5TaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKSwgbmV3IFBhZGRpbmdTaG9ydGhhbmRBZGFwdGVyKCkpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgdm9pZCBpbml0U3ViUHJvcGVydHlBZGFwdGVycygpIHsKLQkJaWYgKHN1YlByb3BlcnR5QWRhcHRlcnMgPT0gbnVsbCkgewotCQkJc3ViUHJvcGVydHlBZGFwdGVycyA9IG5ldyBIYXNodGFibGUoKTsKLQotCQkJLy8gcmVnaXN0ZXIKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCwgbmV3IEJhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1ksIG5ldyBCYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCwgbmV3IENsaXBUb3BTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQsIG5ldyBDbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NLCBuZXcgQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZULCBuZXcgQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotCQlyZXR1cm4gKGZNb2RpZmllZCAhPSBudWxsICYmIGZNb2RpZmllZC5zaXplKCkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIHByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmUHJvcGVydGllcy5rZXlzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIHByb3BlcnRpZXNNb2RpZmllZCgpIHsKLQkJaWYgKGZNb2RpZmllZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uKSBmTW9kaWZpZWQuY2xvbmUoKSkuaXRlcmF0b3IoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl9Ci0JCQl9OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyB0aGUgdmFsdWUgb2Ygc2hvcnRoYW5kICdwcm9wJyB0byAnZm9yZWlnbicKLQkgKiBjb250ZXh0LiBOb3RlIHRoYXQgaWYgdGhpcyBoYXMgcGFyZW50IHNob3J0aGFuZCBwcm9wZXJ0aWVzIG9mICdwcm9wJywKLQkgKiB0aGV5IGFyZSBhbGwgZXhwYW5kZWQgdG8gJ2ZvcmVpZ24nIGNvbnRleHQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVjdXJzaXZlRXh0cmFjdChQcm9wQ01Qcm9wZXJ0eSBwcm9wLCBDU1NQcm9wZXJ0eUNvbnRleHQgZm9yZWlnbikgewotCQkvLyBleHBhbmQgc2hvcnRoYW5kIHByb3BlcnR5Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpOyBpKyspIHsKLQkJCXJlY3Vyc2l2ZUV4dHJhY3QocHJvcC5zaG9ydGhhbmRDb250YWluZXJBdChpKSwgZm9yZWlnbik7Ci0JCX0KLQkJU3RyaW5nIHN0ciA9IGdldChwcm9wLmdldE5hbWUoKSk7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlzdHIgPSBmb3JlaWduLmdldChwcm9wLmdldE5hbWUoKSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJSVNob3J0aGFuZEFkYXB0ZXIgYWRhcHRlciA9IChJU2hvcnRoYW5kQWRhcHRlcikgc2hvcnRoYW5kQWRhcHRlcnMuZ2V0KHByb3ApOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuZXhwYW5kKHN0ciwgZm9yZWlnbik7Ci0JCQkJZm9yZWlnbi5zZXQocHJvcC5nZXROYW1lKCksICIiKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVEZXNjZW5kYW50cyhQcm9wQ01Qcm9wZXJ0eSBwcm9wKSB7Ci0JCWlmIChwcm9wLmlzU2hvcnRoYW5kKCkpIHsKLQkJCS8vIHJlbW92ZSBwcm9wZXJ0aWVzCi0JCQlpbnQgbiA9IHByb3AuZ2V0TnVtQ2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IHByb3AuZ2V0Q2hpbGRBdChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvcENNUHJvcGVydHkpIHsKLQkJCQkJcmVtb3ZlRGVzY2VuZGFudHMoKFByb3BDTVByb3BlcnR5KSBvYmopOwotCi0JCQkJCVN0cmluZyBzdHIgPSBnZXQob2JqLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJCXNldChvYmoudG9TdHJpbmcoKSwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldE1vZGlmaWVkKCkgewotCQlpZiAoZk1vZGlmaWVkICE9IG51bGwpCi0JCQlmTW9kaWZpZWQuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHBhaXIgb2YgJ3Byb3AnLyd2YWx1ZScuIElmIHNob3J0aGFuZCBwcm9wZXJ0aWVzCi0JICogcmVsYXRlZCB0byAncHJvcCcgYXJlIGFscmVhZHkgZGVmaW5lZCwgdGhleSB3aWxsIGJlIGV4cGFuZGVkIHRvIGF2b2lkCi0JICogcHJvcGVydHkgY29uZmxpY3Rpb24uIElmIGRlc2NlbmRhbnQgcHJvcGVydGllcyBvZiAncHJvcCcgYXJlIGFscmVhZHkKLQkgKiBkZWZpbmVkLCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCB0byBhdm9pZCBwcm9wZXJ0eSBjb25mbGljdGlvbi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eSBwcm9wLCBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHByb3AgaW5zdGFuY2VvZiBQcm9wQ01TdWJQcm9wZXJ0eSkgewotCQkJSVN1YlByb3BlcnR5QWRhcHRlciBhZGFwdGVyID0gKElTdWJQcm9wZXJ0eUFkYXB0ZXIpIHN1YlByb3BlcnR5QWRhcHRlcnMuZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnNldCh0aGlzLCB2YWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCkgPiAwKSB7Ci0JCQkvLyBleHBhbmQgc2hvcnRoYW5kIHByb3BlcnR5Ci0JCQlDU1NQcm9wZXJ0eUNvbnRleHQgY29udGV4dCA9IG5ldyBDU1NQcm9wZXJ0eUNvbnRleHQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpOyBpKyspIHsKLQkJCQlyZWN1cnNpdmVFeHRyYWN0KHByb3Auc2hvcnRoYW5kQ29udGFpbmVyQXQoaSksIGNvbnRleHQpOwotCQkJfQotCQkJRW51bWVyYXRpb24gcHJvcGVydGllcyA9IGNvbnRleHQucHJvcGVydGllcygpOwotCQkJd2hpbGUgKHByb3BlcnRpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgcHJvcEZvcmVpZ24gPSBwcm9wZXJ0aWVzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQlzZXQocHJvcEZvcmVpZ24sIGNvbnRleHQuZ2V0KHByb3BGb3JlaWduKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZW1vdmVEZXNjZW5kYW50cyhwcm9wKTsKLQotCQlzZXQocHJvcC5nZXROYW1lKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHBhaXIgb2YgJ3Byb3BOYW1lJy8ndmFsdWUnIHJlZ2FyZGxlc3Mgb2YgaXRzCi0JICogc2hvcnRoYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0KFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGtleSA9IHByb3BOYW1lOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCWZQcm9wZXJ0aWVzLnJlbW92ZShrZXkpOwotCQllbHNlCi0JCQlmUHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JCWlmIChmTW9kaWZpZWQgPT0gbnVsbCkKLQkJCWZNb2RpZmllZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZNb2RpZmllZC5hZGQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBemltdXRoKFN0cmluZyBhemltdXRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9BWklNVVRIKSwgYXppbXV0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChTdHJpbmcgYmFja2dyb3VuZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkcpLCBiYWNrZ3JvdW5kKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQXR0YWNobWVudChTdHJpbmcgYmFja2dyb3VuZEF0dGFjaG1lbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpLCBiYWNrZ3JvdW5kQXR0YWNobWVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKFN0cmluZyBiYWNrZ3JvdW5kQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKSwgYmFja2dyb3VuZENvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kSW1hZ2UoU3RyaW5nIGJhY2tncm91bmRJbWFnZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpLCBiYWNrZ3JvdW5kSW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvbihTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTiksIGJhY2tncm91bmRQb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uWChqYXZhLmxhbmcuU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvblgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLCBiYWNrZ3JvdW5kUG9zaXRpb25YKTsKLQkJLyoKLQkJICogU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsgU3RyaW5nIHZhbEggPSBiYWNrZ3JvdW5kUG9zaXRpb25YOyBTdHJpbmcKLQkJICogdmFsViA9IGdldEJhY2tncm91bmRQb3NpdGlvblkoKTsgaWYgKHZhbFYgPT0gbnVsbCB8fAotCQkgKiB2YWxWLmxlbmd0aCgpPT0gMCkgbmV3VmFsdWUgPSB2YWxIOyBlbHNlIGlmICh2YWxIID09IG51bGwgfHwKLQkJICogdmFsSC5sZW5ndGgoKSA9PSAwKSB7IENvbGxlY3Rpb24gdmFsWCA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKS5nZXRWYWx1ZXMoKTsKLQkJICogQ29sbGVjdGlvbiB2YWxZID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLmdldFZhbHVlcygpOwotCQkgKiBQcm9wQ01VdGlsLm1pbnVzKHZhbFksdmFsWCk7IEl0ZXJhdG9yIGl0ID0gdmFsWS5pdGVyYXRvcigpOwotCQkgKiB3aGlsZShpdC5oYXNOZXh0KCkpIHsgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsgaWYKLQkJICogKG9iai50b1N0cmluZygpLmVxdWFscyh2YWxWLnRvTG93ZXJDYXNlKCkpKSB7IC8vIG5lZWQgbm90Ci0JCSAqIGNvbXBlbnNhdGUgZm9yIC4uLiBuZXdWYWx1ZSA9IHZhbFY7IGJyZWFrOyB9IH0gLy8gY29tcGVuc2F0ZSBmb3IKLQkJICogSG9yaXpvbnRhbCB2YWx1ZSBpZiAobmV3VmFsdWUgPT0gbnVsbCkgbmV3VmFsdWUgPSAiMCUgIiArIHZhbFY7IH0KLQkJICogZWxzZSBuZXdWYWx1ZSA9IHZhbEggKyAiICIgKyB2YWxWOyBzZXRCYWNrZ3JvdW5kUG9zaXRpb24obmV3VmFsdWUpOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKGphdmEubGFuZy5TdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uWSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSksIGJhY2tncm91bmRQb3NpdGlvblkpOwotCQkvKgotCQkgKiBTdHJpbmcgbmV3VmFsdWUgPSBudWxsOyBTdHJpbmcgdmFsSCA9IGdldEJhY2tncm91bmRQb3NpdGlvblgoKTsKLQkJICogU3RyaW5nIHZhbFYgPSBiYWNrZ3JvdW5kUG9zaXRpb25ZOyBpZiAodmFsViA9PSBudWxsIHx8Ci0JCSAqIHZhbFYubGVuZ3RoKCk9PSAwKSBuZXdWYWx1ZSA9IHZhbEg7IGVsc2UgaWYgKHZhbEggPT0gbnVsbCB8fAotCQkgKiB2YWxILmxlbmd0aCgpID09IDApIHsgQ29sbGVjdGlvbiB2YWxYID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLmdldFZhbHVlcygpOwotCQkgKiBDb2xsZWN0aW9uIHZhbFkgPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkuZ2V0VmFsdWVzKCk7Ci0JCSAqIFByb3BDTVV0aWwubWludXModmFsWSx2YWxYKTsgSXRlcmF0b3IgaXQgPSB2YWxZLml0ZXJhdG9yKCk7Ci0JCSAqIHdoaWxlKGl0Lmhhc05leHQoKSkgeyBPYmplY3Qgb2JqID0gaXQubmV4dCgpOyBpZgotCQkgKiAob2JqLnRvU3RyaW5nKCkuZXF1YWxzKHZhbFYudG9Mb3dlckNhc2UoKSkpIHsgLy8gbmVlZCBub3QKLQkJICogY29tcGVuc2F0ZSBmb3IgLi4uIG5ld1ZhbHVlID0gdmFsVjsgYnJlYWs7IH0gfSAvLyBjb21wZW5zYXRlIGZvcgotCQkgKiBIb3Jpem9udGFsIHZhbHVlIGlmIChuZXdWYWx1ZSA9PSBudWxsKSBuZXdWYWx1ZSA9ICIwJSAiICsgdmFsVjsgfQotCQkgKiBlbHNlIG5ld1ZhbHVlID0gdmFsSCArICIgIiArIHZhbFY7IHNldEJhY2tncm91bmRQb3NpdGlvbihuZXdWYWx1ZSk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRSZXBlYXQoU3RyaW5nIGJhY2tncm91bmRSZXBlYXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCksIGJhY2tncm91bmRSZXBlYXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlcihTdHJpbmcgYm9yZGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVIpLCBib3JkZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbShTdHJpbmcgYm9yZGVyQm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NKSwgYm9yZGVyQm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b21Db2xvcihTdHJpbmcgYm9yZGVyQm90dG9tQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpLCBib3JkZXJCb3R0b21Db2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQm90dG9tU3R5bGUoU3RyaW5nIGJvcmRlckJvdHRvbVN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKSwgYm9yZGVyQm90dG9tU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbVdpZHRoKFN0cmluZyBib3JkZXJCb3R0b21XaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCksIGJvcmRlckJvdHRvbVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJDb2xsYXBzZShTdHJpbmcgYm9yZGVyQ29sbGFwc2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xMQVBTRSksIGJvcmRlckNvbGxhcHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJDb2xvcihTdHJpbmcgYm9yZGVyQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUiksIGJvcmRlckNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0KFN0cmluZyBib3JkZXJMZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVCksIGJvcmRlckxlZnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnRDb2xvcihTdHJpbmcgYm9yZGVyTGVmdENvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUiksIGJvcmRlckxlZnRDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVmdFN0eWxlKFN0cmluZyBib3JkZXJMZWZ0U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKSwgYm9yZGVyTGVmdFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0V2lkdGgoU3RyaW5nIGJvcmRlckxlZnRXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpLCBib3JkZXJMZWZ0V2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0KFN0cmluZyBib3JkZXJSaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUKSwgYm9yZGVyUmlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0Q29sb3IoU3RyaW5nIGJvcmRlclJpZ2h0Q29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUiksIGJvcmRlclJpZ2h0Q29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0U3R5bGUoU3RyaW5nIGJvcmRlclJpZ2h0U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSksIGJvcmRlclJpZ2h0U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0V2lkdGgoU3RyaW5nIGJvcmRlclJpZ2h0V2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCksIGJvcmRlclJpZ2h0V2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclNwYWNpbmcoU3RyaW5nIGJvcmRlclNwYWNpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TUEFDSU5HKSwgYm9yZGVyU3BhY2luZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyU3R5bGUoU3RyaW5nIGJvcmRlclN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpLCBib3JkZXJTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wKFN0cmluZyBib3JkZXJUb3ApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1ApLCBib3JkZXJUb3ApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcENvbG9yKFN0cmluZyBib3JkZXJUb3BDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUiksIGJvcmRlclRvcENvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3BTdHlsZShTdHJpbmcgYm9yZGVyVG9wU3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpLCBib3JkZXJUb3BTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wV2lkdGgoU3RyaW5nIGJvcmRlclRvcFdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKSwgYm9yZGVyVG9wV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlcldpZHRoKFN0cmluZyBib3JkZXJXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKSwgYm9yZGVyV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvdHRvbShTdHJpbmcgYm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1RUT00pLCBib3R0b20pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhcHRpb25TaWRlKFN0cmluZyBjYXB0aW9uU2lkZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0FQVElPTl9TSURFKSwgY2FwdGlvblNpZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsZWFyKFN0cmluZyBjbGVhcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xFQVIpLCBjbGVhcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcChTdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBCb3R0b20oamF2YS5sYW5nLlN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBMZWZ0KGphdmEubGFuZy5TdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcFJpZ2h0KGphdmEubGFuZy5TdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBUb3AoamF2YS5sYW5nLlN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBjb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09MT1IpLCBjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09OVEVOVCksIGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvdW50ZXJJbmNyZW1lbnQoU3RyaW5nIGNvdW50ZXJJbmNyZW1lbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfSU5DUkVNRU5UKSwgY291bnRlckluY3JlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q291bnRlclJlc2V0KFN0cmluZyBjb3VudGVyUmVzZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfUkVTRVQpLCBjb3VudGVyUmVzZXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc0Zsb2F0KFN0cmluZyBjc3NGbG9hdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRkxPQVQpLCBjc3NGbG9hdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VlKFN0cmluZyBjdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRSksIGN1ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VlQWZ0ZXIoU3RyaW5nIGN1ZUFmdGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQUZURVIpLCBjdWVBZnRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VlQmVmb3JlKFN0cmluZyBjdWVCZWZvcmUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9CRUZPUkUpLCBjdWVCZWZvcmUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnNvcihTdHJpbmcgY3Vyc29yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVVJTT1IpLCBjdXJzb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcmVjdGlvbihTdHJpbmcgZGlyZWN0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVJFQ1RJT04pLCBkaXJlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXkoU3RyaW5nIGRpc3BsYXkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJU1BMQVkpLCBkaXNwbGF5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGV2YXRpb24oU3RyaW5nIGVsZXZhdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRUxFVkFUSU9OKSwgZWxldmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbXB0eUNlbGxzKFN0cmluZyBlbXB0eUNlbGxzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTVBUWV9DRUxMUyksIGVtcHR5Q2VsbHMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnQoU3RyaW5nIGZvbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpLCBmb250KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250RmFtaWx5KFN0cmluZyBmb250RmFtaWx5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSksIGZvbnRGYW1pbHkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRTaXplKFN0cmluZyBmb250U2l6ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKSwgZm9udFNpemUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRTaXplQWRqdXN0KFN0cmluZyBmb250U2l6ZUFkanVzdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFX0FESlVTVCksIGZvbnRTaXplQWRqdXN0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U3RyZXRjaChTdHJpbmcgZm9udFN0cmV0Y2gpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RSRVRDSCksIGZvbnRTdHJldGNoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U3R5bGUoU3RyaW5nIGZvbnRTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSksIGZvbnRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFZhcmlhbnQoU3RyaW5nIGZvbnRWYXJpYW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpLCBmb250VmFyaWFudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFdlaWdodChTdHJpbmcgZm9udFdlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpLCBmb250V2VpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoU3RyaW5nIGhlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfSEVJR0hUKSwgaGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWZ0KFN0cmluZyBsZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRUZUKSwgbGVmdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV0dGVyU3BhY2luZyhTdHJpbmcgbGV0dGVyU3BhY2luZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVUVEVSX1NQQUNJTkcpLCBsZXR0ZXJTcGFjaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5lSGVpZ2h0KFN0cmluZyBsaW5lSGVpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCksIGxpbmVIZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZShTdHJpbmcgbGlzdFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKSwgbGlzdFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGVJbWFnZShTdHJpbmcgbGlzdFN0eWxlSW1hZ2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpLCBsaXN0U3R5bGVJbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlUG9zaXRpb24oU3RyaW5nIGxpc3RTdHlsZVBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKSwgbGlzdFN0eWxlUG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZVR5cGUoU3RyaW5nIGxpc3RTdHlsZVR5cGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSksIGxpc3RTdHlsZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpbihTdHJpbmcgbWFyZ2luKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU4pLCBtYXJnaW4pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpbkJvdHRvbShTdHJpbmcgbWFyZ2luQm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKSwgbWFyZ2luQm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5MZWZ0KFN0cmluZyBtYXJnaW5MZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCksIG1hcmdpbkxlZnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpblJpZ2h0KFN0cmluZyBtYXJnaW5SaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKSwgbWFyZ2luUmlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpblRvcChTdHJpbmcgbWFyZ2luVG9wKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKSwgbWFyZ2luVG9wKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJrZXJPZmZzZXQoU3RyaW5nIG1hcmtlck9mZnNldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS0VSX09GRlNFVCksIG1hcmtlck9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFya3MoU3RyaW5nIG1hcmtzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLUyksIG1hcmtzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXhIZWlnaHQoU3RyaW5nIG1heEhlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX0hFSUdIVCksIG1heEhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4V2lkdGgoU3RyaW5nIG1heFdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfV0lEVEgpLCBtYXhXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWluSGVpZ2h0KFN0cmluZyBtaW5IZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9IRUlHSFQpLCBtaW5IZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbldpZHRoKFN0cmluZyBtaW5XaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX1dJRFRIKSwgbWluV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9ycGhhbnMoU3RyaW5nIG9ycGhhbnMpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09SUEhBTlMpLCBvcnBoYW5zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lKFN0cmluZyBvdXRsaW5lKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FKSwgb3V0bGluZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZUNvbG9yKFN0cmluZyBvdXRsaW5lQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfQ09MT1IpLCBvdXRsaW5lQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVTdHlsZShTdHJpbmcgb3V0bGluZVN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1NUWUxFKSwgb3V0bGluZVN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lV2lkdGgoU3RyaW5nIG91dGxpbmVXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9XSURUSCksIG91dGxpbmVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcmZsb3coU3RyaW5nIG92ZXJmbG93KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVkVSRkxPVyksIG92ZXJmbG93KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nKFN0cmluZyBwYWRkaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKSwgcGFkZGluZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ0JvdHRvbShTdHJpbmcgcGFkZGluZ0JvdHRvbSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pLCBwYWRkaW5nQm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nTGVmdChTdHJpbmcgcGFkZGluZ0xlZnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCksIHBhZGRpbmdMZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nUmlnaHQoU3RyaW5nIHBhZGRpbmdSaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCksIHBhZGRpbmdSaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ1RvcChTdHJpbmcgcGFkZGluZ1RvcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApLCBwYWRkaW5nVG9wKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlKFN0cmluZyBwYWdlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFKSwgcGFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUJyZWFrQWZ0ZXIoU3RyaW5nIHBhZ2VCcmVha0FmdGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0FGVEVSKSwgcGFnZUJyZWFrQWZ0ZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VCcmVha0JlZm9yZShTdHJpbmcgcGFnZUJyZWFrQmVmb3JlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0JFRk9SRSksIHBhZ2VCcmVha0JlZm9yZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUJyZWFrSW5zaWRlKFN0cmluZyBwYWdlQnJlYWtJbnNpZGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfSU5TSURFKSwgcGFnZUJyZWFrSW5zaWRlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXVzZShTdHJpbmcgcGF1c2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFKSwgcGF1c2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdXNlQWZ0ZXIoU3RyaW5nIHBhdXNlQWZ0ZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0FGVEVSKSwgcGF1c2VBZnRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF1c2VCZWZvcmUoU3RyaW5nIHBhdXNlQmVmb3JlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9CRUZPUkUpLCBwYXVzZUJlZm9yZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGl0Y2goU3RyaW5nIHBpdGNoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSCksIHBpdGNoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaXRjaFJhbmdlKFN0cmluZyBwaXRjaFJhbmdlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSF9SQU5HRSksIHBpdGNoUmFuZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBsYXlEdXJpbmcoU3RyaW5nIHBsYXlEdXJpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BMQVlfRFVSSU5HKSwgcGxheUR1cmluZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zaXRpb24oU3RyaW5nIHBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QT1NJVElPTiksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZXMoU3RyaW5nIHF1b3RlcykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUVVPVEVTKSwgcXVvdGVzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWNobmVzcyhTdHJpbmcgcmljaG5lc3MpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJQ0hORVNTKSwgcmljaG5lc3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpZ2h0KFN0cmluZyByaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklHSFQpLCByaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShTdHJpbmcgc2l6ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU0laRSksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWFrKFN0cmluZyBzcGVhaykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUspLCBzcGVhayk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlYWtIZWFkZXIoU3RyaW5nIHNwZWFrSGVhZGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19IRUFERVIpLCBzcGVha0hlYWRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlYWtOdW1lcmFsKFN0cmluZyBzcGVha051bWVyYWwpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX05VTUVSQUwpLCBzcGVha051bWVyYWwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWFrUHVuY3R1YXRpb24oU3RyaW5nIHNwZWFrUHVuY3R1YXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX1BVTkNUVUFUSU9OKSwgc3BlYWtQdW5jdHVhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlZWNoUmF0ZShTdHJpbmcgc3BlZWNoUmF0ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFRUNIX1JBVEUpLCBzcGVlY2hSYXRlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJlc3MoU3RyaW5nIHN0cmVzcykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1RSRVNTKSwgc3RyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZUxheW91dChTdHJpbmcgdGFibGVMYXlvdXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RBQkxFX0xBWU9VVCksIHRhYmxlTGF5b3V0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0QWxpZ24oU3RyaW5nIHRleHRBbGlnbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9BTElHTiksIHRleHRBbGlnbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dERlY29yYXRpb24oU3RyaW5nIHRleHREZWNvcmF0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0RFQ09SQVRJT04pLCB0ZXh0RGVjb3JhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dEluZGVudChTdHJpbmcgdGV4dEluZGVudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9JTkRFTlQpLCB0ZXh0SW5kZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0U2hhZG93KFN0cmluZyB0ZXh0U2hhZG93KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1NIQURPVyksIHRleHRTaGFkb3cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRUcmFuc2Zvcm0oU3RyaW5nIHRleHRUcmFuc2Zvcm0pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfVFJBTlNGT1JNKSwgdGV4dFRyYW5zZm9ybSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wKFN0cmluZyB0b3ApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RPUCksIHRvcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pY29kZUJpZGkoU3RyaW5nIHVuaWNvZGVCaWRpKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9VTklDT0RFX0JJREkpLCB1bmljb2RlQmlkaSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVydGljYWxBbGlnbihTdHJpbmcgdmVydGljYWxBbGlnbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVkVSVElDQUxfQUxJR04pLCB2ZXJ0aWNhbEFsaWduKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmlsaXR5KFN0cmluZyB2aXNpYmlsaXR5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WSVNJQklMSVRZKSwgdmlzaWJpbGl0eSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vm9pY2VGYW1pbHkoU3RyaW5nIHZvaWNlRmFtaWx5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0lDRV9GQU1JTFkpLCB2b2ljZUZhbWlseSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vm9sdW1lKFN0cmluZyB2b2x1bWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPTFVNRSksIHZvbHVtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2hpdGVTcGFjZShTdHJpbmcgd2hpdGVTcGFjZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0hJVEVfU1BBQ0UpLCB3aGl0ZVNwYWNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWRvd3MoU3RyaW5nIHdpZG93cykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lET1dTKSwgd2lkb3dzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRFRIKSwgd2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmRTcGFjaW5nKFN0cmluZyB3b3JkU3BhY2luZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV09SRF9TUEFDSU5HKSwgd29yZFNwYWNpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFpJbmRleChTdHJpbmcgekluZGV4KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9aX0lOREVYKSwgekluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0NsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9DbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjM2RmY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0NsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLQotLyoqCi0gKiBGb3IgYm90dG9tIHZhbHVlIG9mICdjbGlwJyBwcm9wZXJ0eSdzIHJlY3QoKSBmdW5jdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlciBleHRlbmRzIENsaXBTdWJTdHlsZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChvcmcudzNjLmRvbS5jc3MuUmVjdCByZWN0KSB7Ci0JCXJldHVybiByZWN0LmdldEJvdHRvbSgpLmdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgaW5kZXgoKSB7Ci0JCXJldHVybiAyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvcCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCQlTdHJpbmcgcmlnaHQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCQlTdHJpbmcgbGVmdCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpKTsKLQotCQlzZXQocHJvcGVydGllcywgdG9wLCByaWdodCwgdmFsdWUsIGxlZnQsIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9DbGlwTGVmdFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0NsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjExMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0NsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci0KLS8qKgotICogRm9yIGxlZnQgdmFsdWUgb2YgJ2NsaXAnIHByb3BlcnR5J3MgcmVjdCgpIGZ1bmN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGlwTGVmdFN1YlN0eWxlQWRhcHRlciBleHRlbmRzIENsaXBTdWJTdHlsZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQob3JnLnczYy5kb20uY3NzLlJlY3QgcmVjdCkgewotCQlyZXR1cm4gcmVjdC5nZXRMZWZ0KCkuZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBpbmRleCgpIHsKLQkJcmV0dXJuIDM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgdG9wID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSk7Ci0JCVN0cmluZyByaWdodCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSk7Ci0JCVN0cmluZyBib3R0b20gPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQotCQlzZXQocHJvcGVydGllcywgdG9wLCByaWdodCwgYm90dG9tLCB2YWx1ZSwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0NsaXBSaWdodFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0NsaXBSaWdodFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDc5Njc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9DbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLQotLyoqCi0gKiBGb3IgcmlnaHQgdmFsdWUgb2YgJ2NsaXAnIHByb3BlcnR5J3MgcmVjdCgpIGZ1bmN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChvcmcudzNjLmRvbS5jc3MuUmVjdCByZWN0KSB7Ci0JCXJldHVybiByZWN0LmdldFJpZ2h0KCkuZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBpbmRleCgpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgdG9wID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSk7Ci0JCVN0cmluZyBib3R0b20gPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQkJU3RyaW5nIGxlZnQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHRvcCwgdmFsdWUsIGJvdHRvbSwgbGVmdCwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0NsaXBTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9DbGlwU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzc5MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0NsaXBTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5JVmFsSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUmVjdDsKLQotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIGZvciBjbGlwIHN1Yi1wcm9wZXJ0aWVzCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDbGlwU3ViU3R5bGVBZGFwdGVyIGltcGxlbWVudHMgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLmNzcy5SZWN0KSB7Ci0JCQkJc3RyID0gZ2V0KChvcmcudzNjLmRvbS5jc3MuUmVjdCkgb2JqKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsKLQkJCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdHIgPSBvYmoudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJc3RyID0gc3RyLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJCWludCBwb3MgPSBzdHIuaW5kZXhPZigicmVjdCgiKTsvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCVN0cmluZyBzdWJTdHIgPSBudWxsOwotCQkJCQlwb3MgKz0gNTsKLQkJCQkJaW50IGkgPSAwOwotCQkJCQlkbyB7Ci0JCQkJCQlpbnQgcG9zRW5kID0gc3RyLmluZGV4T2YoIiwiLCBwb3MpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChwb3NFbmQgPCAwKQotCQkJCQkJCXBvc0VuZCA9IHN0ci5pbmRleE9mKCIpIiwgcG9zKTsvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAocG9zRW5kIDwgMCAmJiBwb3MgPCBzdHIubGVuZ3RoKCkpCi0JCQkJCQkJcG9zRW5kID0gc3RyLmxlbmd0aCgpOwotCQkJCQkJaWYgKHBvc0VuZCA+PSBwb3MpIHsKLQkJCQkJCQlzdWJTdHIgPSBzdHIuc3Vic3RyaW5nKHBvcywgcG9zRW5kKTsKLQkJCQkJCQlwb3MgPSBwb3NFbmQgKyAxOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCXBvcyA9IC0xOwotCQkJCQl9Ci0JCQkJCXdoaWxlIChpKysgPCBpbmRleCgpICYmIHBvcyA+IDApOwotCi0JCQkJCWlmIChwb3MgPiAwKQotCQkJCQkJc3RyID0gc3ViU3RyLnRyaW0oKTsKLQkJCQkJZWxzZQotCQkJCQkJc3RyID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdHIgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IFN0cmluZyBnZXQoUmVjdCByZWN0KTsKLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IGludCBpbmRleCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMTAvMDQKLQkgKiAxOToyNTo0NikKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydGllcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb24uSUNTUzJQcm9wZXJ0aWVzCi0JICogQHBhcmFtIHRvcAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByaWdodAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBib3R0b20KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbGVmdAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZW1vdmVDaGVjawotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdG9wLCBTdHJpbmcgcmlnaHQsIFN0cmluZyBib3R0b20sIFN0cmluZyBsZWZ0LCBib29sZWFuIHJlbW92ZUNoZWNrKSB7Ci0JCWlmICh0b3AgPT0gbnVsbCB8fCB0b3AubGVuZ3RoKCkgPT0gMCkKLQkJCXRvcCA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChyaWdodCA9PSBudWxsIHx8IHJpZ2h0Lmxlbmd0aCgpID09IDApCi0JCQlyaWdodCA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChib3R0b20gPT0gbnVsbCB8fCBib3R0b20ubGVuZ3RoKCkgPT0gMCkKLQkJCWJvdHRvbSA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgbGVmdC5sZW5ndGgoKSA9PSAwKQotCQkJbGVmdCA9IElWYWxJRC5WX0FVVE87Ci0KLQkJaWYgKHJlbW92ZUNoZWNrICYmIHRvcC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSAmJiByaWdodC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSAmJiBib3R0b20udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQVVUTykgJiYgbGVmdC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSkgewotCQkJcHJvcGVydGllcy5zZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApLCBudWxsKTsKLQkJfQotCQllbHNlCi0JCQlwcm9wZXJ0aWVzLnNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCksICJyZWN0KCIgKyB0b3AgKyAiLCAiICsgcmlnaHQgKyAiLCAiICsgYm90dG9tICsgIiwgIiArIGxlZnQgKyAiKSIpOy8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9DbGlwVG9wU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFRvcFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzg2ZGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9DbGlwVG9wU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci0KLS8qKgotICogRm9yIHRvcCB2YWx1ZSBvZiAnY2xpcCcgcHJvcGVydHkncyByZWN0KCkgZnVuY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIENsaXBUb3BTdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwVG9wU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQob3JnLnczYy5kb20uY3NzLlJlY3QgcmVjdCkgewotCQlyZXR1cm4gcmVjdC5nZXRUb3AoKS5nZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGluZGV4KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByaWdodCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSk7Ci0JCVN0cmluZyBib3R0b20gPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQkJU3RyaW5nIGxlZnQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHZhbHVlLCByaWdodCwgYm90dG9tLCBsZWZ0LCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vRm9udFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9Gb250U2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZiZWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9Gb250U2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5JVmFsSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUucGFyc2VyLkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnZm9udCcgcHJvcGVydHkgJ2ZvbnQnIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsCi0gKiAnZm9udC1zdHlsZScsICdmb250LXZhcmlhbnQnLCAnZm9udC13ZWlnaHQnLCAnbGluZS1oZWlnaHQnLAotICovCi1wdWJsaWMgY2xhc3MgRm9udFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRm9udFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgc3R5bGUgPSBudWxsLCB2YXJpYW50ID0gbnVsbCwgd2VpZ2h0ID0gbnVsbCwgc2l6ZSA9IG51bGwsIGhlaWdodCA9IG51bGwsIGZhbWlseSA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BGb250ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BWYXJpYW50ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXZWlnaHQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU2l6ZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpOwotCQlib29sZWFuIGJOb3JtYWxTcGVjaWZpZWQgPSBmYWxzZTsKLQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJLy8gZmlyc3Qgb2YgYWxsLCBjaGVjayBmb250IGlkZW50cwotCQkJCWlmIChpID09IDApIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wRm9udC5nZXROdW1DaGlsZCgpOyBqKyspIHsKLQkJCQkJCU9iamVjdCBvYmogPSBwcm9wRm9udC5nZXRDaGlsZEF0KGkpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZyAmJiB0b2tlbnNbaV0uaW1hZ2UuY29tcGFyZVRvSWdub3JlQ2FzZShvYmoudG9TdHJpbmcoKSkgPT0gMCkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gdmFsdWUgIm5vcm1hbCIgaXMgc2hhcmVkICEhCi0JCQkJaWYgKHRva2Vuc1tpXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX05PUk1BTCkpIHsKLQkJCQkJYk5vcm1hbFNwZWNpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wVmFyaWFudC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl2YXJpYW50ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wV2VpZ2h0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXdlaWdodCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFNpemUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCQlzaXplID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgJiYgd2VpZ2h0ID09IG51bGwgJiYgcHJvcFdlaWdodC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQl3ZWlnaHQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCXNpemUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCX0KLQkJfQotCi0JCWlmIChiTm9ybWFsU3BlY2lmaWVkKSB7Ci0JCQlpZiAoc3R5bGUgPT0gbnVsbCkKLQkJCQlzdHlsZSA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh2YXJpYW50ID09IG51bGwpCi0JCQkJdmFyaWFudCA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh3ZWlnaHQgPT0gbnVsbCkKLQkJCQl3ZWlnaHQgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCX0KLQotCQkvLyBza2lwIHdoaXRlc3BhY2UKLQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUykKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIGxpbmUtaGVpZ2h0ID8KLQkJaWYgKGkgPCB0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiB0b2tlbnNbaV0uaW1hZ2UuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCWhlaWdodCA9IHRva2Vuc1tpKytdLmltYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBmb250LWZhbWlseQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQl9Ci0JCWZhbWlseSA9IGJ1Zi50b1N0cmluZygpLnRyaW0oKTsKLQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUsIHN0eWxlKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQsIHZhcmlhbnQpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hULCB3ZWlnaHQpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSwgc2l6ZSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQsIGhlaWdodCk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFksIGZhbWlseSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBzdHlsZSA9IG51bGwsIHZhcmlhbnQgPSBudWxsLCB3ZWlnaHQgPSBudWxsLCBzaXplID0gbnVsbCwgaGVpZ2h0ID0gbnVsbCwgZmFtaWx5ID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEZvbnQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFZhcmlhbnQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdlaWdodCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTaXplID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BIZWlnaHQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wRmFtaWx5ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKTsKLQkJYm9vbGVhbiBiTm9ybWFsU3BlY2lmaWVkID0gZmFsc2U7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCS8vIGZpcnN0IG9mIGFsbCwgY2hlY2sgZm9udCBpZGVudHMKLQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcEZvbnQuZ2V0TnVtQ2hpbGQoKTsgaisrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gcHJvcEZvbnQuZ2V0Q2hpbGRBdChpKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcgJiYgdG9rZW5zW2ldLmltYWdlLmNvbXBhcmVUb0lnbm9yZUNhc2Uob2JqLnRvU3RyaW5nKCkpID09IDApCi0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gdmFsdWUgIm5vcm1hbCIgaXMgc2hhcmVkICEhCi0JCQkJaWYgKHRva2Vuc1tpXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX05PUk1BTCkpIHsKLQkJCQkJYk5vcm1hbFNwZWNpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wVmFyaWFudC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl2YXJpYW50ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wV2VpZ2h0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXdlaWdodCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFNpemUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCQlzaXplID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgJiYgd2VpZ2h0ID09IG51bGwgJiYgcHJvcFdlaWdodC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQl3ZWlnaHQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCXNpemUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCX0KLQkJfQotCi0JCWlmIChiTm9ybWFsU3BlY2lmaWVkKSB7Ci0JCQlpZiAoc3R5bGUgPT0gbnVsbCkKLQkJCQlzdHlsZSA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh2YXJpYW50ID09IG51bGwpCi0JCQkJdmFyaWFudCA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh3ZWlnaHQgPT0gbnVsbCkKLQkJCQl3ZWlnaHQgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCX0KLQotCQkvLyBza2lwIHdoaXRlc3BhY2UKLQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUykKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIGxpbmUtaGVpZ2h0ID8KLQkJaWYgKGkgPCB0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiB0b2tlbnNbaV0uaW1hZ2UuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCWhlaWdodCA9IHRva2Vuc1tpKytdLmltYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBmb250LWZhbWlseQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQl9Ci0JCWZhbWlseSA9IGJ1Zi50b1N0cmluZygpLnRyaW0oKTsKLQotCQlpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wVmFyaWFudCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB2YXJpYW50OwotCQllbHNlIGlmIChwcm9wV2VpZ2h0ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdlaWdodDsKLQkJZWxzZSBpZiAocHJvcFNpemUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc2l6ZTsKLQkJZWxzZSBpZiAocHJvcEhlaWdodCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBoZWlnaHQ7Ci0JCWVsc2UgaWYgKHByb3BGYW1pbHkgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gZmFtaWx5OwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0lDU1MyUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0lDU1MyUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDNiMWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9JQ1NTMlByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTMlByb3BlcnRpZXM7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTMlByb3BlcnRpZXMgZXh0ZW5kcyBDU1MyUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFwcGx5RnVsbChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYXBwbHlNb2RpZmllZChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQoUHJvcENNUHJvcGVydHkgcHJvcCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uWCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvblkoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwQm90dG9tKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xpcExlZnQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwUmlnaHQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwVG9wKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzTW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUVudW1lcmF0aW9uIHByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIHByb3BlcnRpZXNNb2RpZmllZCgpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXNldE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldChQcm9wQ01Qcm9wZXJ0eSBwcm9wLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvblgoU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uWShTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwQm90dG9tKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldENsaXBMZWZ0KFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldENsaXBSaWdodChTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwVG9wKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0lTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vSVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwM2YyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vSVNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0lTdWJQcm9wZXJ0eUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9JU3ViUHJvcGVydHlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZTE5Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL0lTdWJQcm9wZXJ0eUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdWJQcm9wZXJ0eUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcyk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9MaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmYyMDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9MaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdsaXN0LXN0eWxlJyBwcm9wZXJ0eSAnbGlzdC1zdHlsZScgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2xpc3Qtc3R5bGUtaW1hZ2UnLCAnbGlzdC1zdHlsZS1wb3NpdGlvbicsICdsaXN0LXN0eWxlLXR5cGUnLAotICovCi1wdWJsaWMgY2xhc3MgTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBMaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGltYWdlID0gIiIsIHBvcyA9ICIiLCB0eXBlID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BQb3MgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BUeXBlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BJbWFnZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wUG9zLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgeyAvLyB2YWx1ZT0ibm9uZSIgaXMgc2hhcmVkICEhCi0JCQkJCWlmIChwcm9wVHlwZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl0eXBlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQlpZiAocHJvcEltYWdlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BQb3MuZ2V0TmFtZSgpLCBwb3MpOwotCQlkZXN0LnNldChwcm9wVHlwZS5nZXROYW1lKCksIHR5cGUpOwotCQlkZXN0LnNldChwcm9wSW1hZ2UuZ2V0TmFtZSgpLCBpbWFnZSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBpbWFnZSA9IG51bGwsIHBvcyA9IG51bGwsIHR5cGUgPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wVHlwZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSW1hZ2UgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIHsgLy8gdmFsdWU9Im5vbmUiIGlzIHNoYXJlZCAhIQotCQkJCQlpZiAocHJvcFR5cGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJdHlwZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJaWYgKHByb3BJbWFnZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcFBvcyA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBwb3M7Ci0JCWVsc2UgaWYgKHByb3BUeXBlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHR5cGU7Ci0JCWVsc2UgaWYgKHByb3BJbWFnZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBpbWFnZTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9NYXJnaW5TaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vTWFyZ2luU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODdhYmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9NYXJnaW5TaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdtYXJnaW4nIHByb3BlcnR5ICdtYXJnaW4nIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ21hcmdpbi10b3AnLAotICogJ21hcmdpbi1yaWdodCcsICdtYXJnaW4tYm90dG9tJywgJ21hcmdpbi1sZWZ0JywKLSAqLwotcHVibGljIGNsYXNzIE1hcmdpblNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTWFyZ2luU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nW10gZGVzdHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGogPT0gMSkgewotCQkJZGVzdHNbMF0gPSBkZXN0c1sxXSA9IGRlc3RzWzJdID0gZGVzdHNbM10gPSBpZGVudHNbMF07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzJdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWRlc3RzWzBdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJCWRlc3RzWzJdID0gaWRlbnRzWzJdOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJZGVzdHNba10gPSBpZGVudHNba107Ci0JCX0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QLCBkZXN0c1swXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hULCBkZXN0c1sxXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSwgZGVzdHNbMl0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZULCBkZXN0c1szXSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1AgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9QYWRkaW5nU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL1BhZGRpbmdTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGRkNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS91dGlsL2RlY2xhcmF0aW9uL1BhZGRpbmdTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnBhcnNlci5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5wYXJzZXIuQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdwYWRkaW5nJyBwcm9wZXJ0eSAncGFkZGluZycgd2lsbCBiZSBleHBhbmRlZCB0byAncGFkZGluZy10b3AnLAotICogJ3BhZGRpbmctcmlnaHQnLCAncGFkZGluZy1ib3R0b20nLCAncGFkZGluZy1sZWZ0JywKLSAqLwotcHVibGljIGNsYXNzIFBhZGRpbmdTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFBhZGRpbmdTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1AsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hULCBkZXN0c1sxXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00sIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaiA9PSAxKQotCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1AgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9WYWx1ZURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdXRpbC9kZWNsYXJhdGlvbi9WYWx1ZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMjA3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3V0aWwvZGVjbGFyYXRpb24vVmFsdWVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlRGF0YSB7Ci0KLQlwdWJsaWMgU3RyaW5nIHZhbHVlOwotCXB1YmxpYyBib29sZWFuIGltcG9ydGFudCA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFZhbHVlRGF0YSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVmFsdWVEYXRhKFN0cmluZyB2YWwsIGJvb2xlYW4gaW1wKSB7Ci0JCXN1cGVyKCk7Ci0JCXZhbHVlID0gdmFsOwotCQlpbXBvcnRhbnQgPSBpbXA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTUzJQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTUzJQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMWUyYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1MyUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sCi0gKiAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAqIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbAotICogUmlnaHRzIFJlc2VydmVkLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQydzIFNvZnR3YXJlCi0gKiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTGljZW5zZS4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZQotICogaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbgotICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4KLSAqIFNlZSBXM0MgTGljZW5zZSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20uY3NzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSA8Y29kZT5DU1MyUHJvcGVydGllczwvY29kZT4gaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjb252ZW5pZW5jZQotICogbWVjaGFuaXNtIGZvciByZXRyaWV2aW5nIGFuZCBzZXR0aW5nIHByb3BlcnRpZXMgd2l0aGluIGEKLSAqIDxjb2RlPkNTU1N0eWxlRGVjbGFyYXRpb248L2NvZGU+LiBUaGUgYXR0cmlidXRlcyBvZiB0aGlzIGludGVyZmFjZQotICogY29ycmVzcG9uZCB0byBhbGwgdGhlIHByb3BlcnRpZXMgc3BlY2lmaWVkIGluIENTUzIuIEdldHRpbmcgYW4gYXR0cmlidXRlIG9mCi0gKiB0aGlzIGludGVyZmFjZSBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIDxjb2RlPmdldFByb3BlcnR5VmFsdWU8L2NvZGU+Ci0gKiBtZXRob2Qgb2YgdGhlIDxjb2RlPkNTU1N0eWxlRGVjbGFyYXRpb248L2NvZGU+IGludGVyZmFjZS4gU2V0dGluZyBhbgotICogYXR0cmlidXRlIG9mIHRoaXMgaW50ZXJmYWNlIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUKLSAqIDxjb2RlPnNldFByb3BlcnR5PC9jb2RlPiBtZXRob2Qgb2YgdGhlIDxjb2RlPkNTU1N0eWxlRGVjbGFyYXRpb248L2NvZGU+Ci0gKiBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIEEgY29uZm9ybWFudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ1NTIG1vZHVsZSBpcyBub3QgcmVxdWlyZWQgdG8gaW1wbGVtZW50Ci0gKiB0aGUgPGNvZGU+Q1NTMlByb3BlcnRpZXM8L2NvZGU+IGludGVyZmFjZS4gSWYgYW4gaW1wbGVtZW50YXRpb24gZG9lcwotICogaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCB0aGUgZXhwZWN0YXRpb24gaXMgdGhhdCBsYW5ndWFnZS1zcGVjaWZpYyBtZXRob2RzCi0gKiBjYW4gYmUgdXNlZCB0byBjYXN0IGZyb20gYW4gaW5zdGFuY2Ugb2YgdGhlCi0gKiA8Y29kZT5DU1NTdHlsZURlY2xhcmF0aW9uPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlCi0gKiA8Y29kZT5DU1MyUHJvcGVydGllczwvY29kZT4gaW50ZXJmYWNlLgotICogPHA+Ci0gKiBJZiBhbiBpbXBsZW1lbnRhdGlvbiBkb2VzIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgaXQgaXMgZXhwZWN0ZWQgdG8KLSAqIHVuZGVyc3RhbmQgdGhlIHNwZWNpZmljIHN5bnRheCBvZiB0aGUgc2hvcnRoYW5kIHByb3BlcnRpZXMsIGFuZCBhcHBseSB0aGVpcgotICogc2VtYW50aWNzOyB3aGVuIHRoZSA8Y29kZT5tYXJnaW48L2NvZGU+IHByb3BlcnR5IGlzIHNldCwgZm9yIGV4YW1wbGUsIHRoZQotICogPGNvZGU+bWFyZ2luVG9wPC9jb2RlPiw8Y29kZT5tYXJnaW5SaWdodDwvY29kZT4sCi0gKiA8Y29kZT5tYXJnaW5Cb3R0b208L2NvZGU+IGFuZCA8Y29kZT5tYXJnaW5MZWZ0PC9jb2RlPiBwcm9wZXJ0aWVzIGFyZQotICogYWN0dWFsbHkgYmVpbmcgc2V0IGJ5IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBXaGVuIGRlYWxpbmcgd2l0aCBDU1MgInNob3J0aGFuZCIgcHJvcGVydGllcywgdGhlIHNob3J0aGFuZCBwcm9wZXJ0aWVzCi0gKiBzaG91bGQgYmUgZGVjb21wb3NlZCBpbnRvIHRoZWlyIGNvbXBvbmVudCBsb25naGFuZCBwcm9wZXJ0aWVzIGFzCi0gKiBhcHByb3ByaWF0ZSwgYW5kIHdoZW4gcXVlcnlpbmcgZm9yIHRoZWlyIHZhbHVlLCB0aGUgZm9ybSByZXR1cm5lZCBzaG91bGQgYmUKLSAqIHRoZSBzaG9ydGVzdCBmb3JtIGV4YWN0bHkgZXF1aXZhbGVudCB0byB0aGUgZGVjbGFyYXRpb25zIG1hZGUgaW4gdGhlCi0gKiBydWxlc2V0LiBIb3dldmVyLCBpZiB0aGVyZSBpcyBubyBzaG9ydGhhbmQgZGVjbGFyYXRpb24gdGhhdCBjb3VsZCBiZSBhZGRlZAotICogdG8gdGhlIHJ1bGVzZXQgd2l0aG91dCBjaGFuZ2luZyBpbiBhbnkgd2F5IHRoZSBydWxlcyBhbHJlYWR5IGRlY2xhcmVkIGluCi0gKiB0aGUgcnVsZXNldCAoaS5lLiwgYnkgYWRkaW5nIGxvbmdoYW5kIHJ1bGVzIHRoYXQgd2VyZSBwcmV2aW91c2x5IG5vdAotICogZGVjbGFyZWQgaW4gdGhlIHJ1bGVzZXQpLCB0aGVuIHRoZSBlbXB0eSBzdHJpbmcgc2hvdWxkIGJlIHJldHVybmVkIGZvciB0aGUKLSAqIHNob3J0aGFuZCBwcm9wZXJ0eS4KLSAqIDxwPgotICogRm9yIGV4YW1wbGUsIHF1ZXJ5aW5nIGZvciB0aGUgPGNvZGU+Zm9udDwvY29kZT4gcHJvcGVydHkgc2hvdWxkIG5vdAotICogcmV0dXJuICJub3JtYWwgbm9ybWFsIG5vcm1hbCAxNHB0L25vcm1hbCBBcmlhbCwgc2Fucy1zZXJpZiIsIHdoZW4gIjE0cHQKLSAqIEFyaWFsLCBzYW5zLXNlcmlmIiBzdWZmaWNlcy4gKFRoZSBub3JtYWxzIGFyZSBpbml0aWFsIHZhbHVlcywgYW5kIGFyZQotICogaW1wbGllZCBieSB1c2Ugb2YgdGhlIGxvbmdoYW5kIHByb3BlcnR5LikKLSAqIDxwPgotICogSWYgdGhlIHZhbHVlcyBmb3IgYWxsIHRoZSBsb25naGFuZCBwcm9wZXJ0aWVzIHRoYXQgY29tcG9zZSBhIHBhcnRpY3VsYXIKLSAqIHN0cmluZyBhcmUgdGhlIGluaXRpYWwgdmFsdWVzLCB0aGVuIGEgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgYWxsIHRoZSBpbml0aWFsCi0gKiB2YWx1ZXMgc2hvdWxkIGJlIHJldHVybmVkIChlLmcuIGEgPGNvZGU+Ym9yZGVyLXdpZHRoPC9jb2RlPiB2YWx1ZSBvZgotICogIm1lZGl1bSIgc2hvdWxkIGJlIHJldHVybmVkIGFzIHN1Y2gsIG5vdCBhcyAiIikuCi0gKiA8cD4KLSAqIEZvciBzb21lIHNob3J0aGFuZCBwcm9wZXJ0aWVzIHRoYXQgdGFrZSBtaXNzaW5nIHZhbHVlcyBmcm9tIG90aGVyIHNpZGVzLAotICogc3VjaCBhcyB0aGUgPGNvZGU+bWFyZ2luPC9jb2RlPiw8Y29kZT5wYWRkaW5nPC9jb2RlPiwgYW5kCi0gKiA8Y29kZT5ib3JkZXItW3dpZHRofHN0eWxlfGNvbG9yXTwvY29kZT4gcHJvcGVydGllcywgdGhlIG1pbmltdW0gbnVtYmVyIG9mCi0gKiBzaWRlcyBwb3NzaWJsZSBzaG91bGQgYmUgdXNlZDsgaS5lLiwgIjBweCAxMHB4IiB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YKLSAqICIwcHggMTBweCAwcHggMTBweCIuCi0gKiA8cD4KLSAqIElmIHRoZSB2YWx1ZSBvZiBhIHNob3J0aGFuZCBwcm9wZXJ0eSBjYW4gbm90IGJlIGRlY29tcG9zZWQgaW50byBpdHMKLSAqIGNvbXBvbmVudCBsb25naGFuZCBwcm9wZXJ0aWVzLCBhcyBpcyB0aGUgY2FzZSBmb3IgdGhlIDxjb2RlPmZvbnQ8L2NvZGU+Ci0gKiBwcm9wZXJ0eSB3aXRoIGEgdmFsdWUgb2YgIm1lbnUiLCBxdWVyeWluZyBmb3IgdGhlIHZhbHVlcyBvZiB0aGUgY29tcG9uZW50Ci0gKiBsb25naGFuZCBwcm9wZXJ0aWVzIHNob3VsZCByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTMlByb3BlcnRpZXMgewotCS8qKgotCSAqIFNlZSB0aGUgYXppbXV0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF6aW11dGgoKTsKLQotCXB1YmxpYyB2b2lkIHNldEF6aW11dGgoU3RyaW5nIGF6aW11dGgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyBiYWNrZ3JvdW5kKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kQXR0YWNobWVudCgpOwotCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEF0dGFjaG1lbnQoU3RyaW5nIGJhY2tncm91bmRBdHRhY2htZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZENvbG9yKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoU3RyaW5nIGJhY2tncm91bmRDb2xvcikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1pbWFnZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRJbWFnZSgpOwotCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEltYWdlKFN0cmluZyBiYWNrZ3JvdW5kSW1hZ2UpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtcG9zaXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kUG9zaXRpb24oKTsKLQotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvbihTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLXJlcGVhdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRSZXBlYXQoKTsKLQotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRSZXBlYXQoU3RyaW5nIGJhY2tncm91bmRSZXBlYXQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlcigpOwotCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyKFN0cmluZyBib3JkZXIpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1jb2xsYXBzZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckNvbGxhcHNlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJDb2xsYXBzZShTdHJpbmcgYm9yZGVyQ29sbGFwc2UpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckNvbG9yKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJDb2xvcihTdHJpbmcgYm9yZGVyQ29sb3IpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1zcGFjaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyU3BhY2luZygpOwotCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyU3BhY2luZyhTdHJpbmcgYm9yZGVyU3BhY2luZykgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyU3R5bGUoKTsKLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlclN0eWxlKFN0cmluZyBib3JkZXJTdHlsZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXRvcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclRvcCgpOwotCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wKFN0cmluZyBib3JkZXJUb3ApIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1yaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclJpZ2h0KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodChTdHJpbmcgYm9yZGVyUmlnaHQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1ib3R0b20gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJCb3R0b20oKTsKLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbShTdHJpbmcgYm9yZGVyQm90dG9tKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItbGVmdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckxlZnQoKTsKLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnQoU3RyaW5nIGJvcmRlckxlZnQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci10b3AtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJUb3BDb2xvcigpOwotCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wQ29sb3IoU3RyaW5nIGJvcmRlclRvcENvbG9yKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItcmlnaHQtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJSaWdodENvbG9yKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodENvbG9yKFN0cmluZyBib3JkZXJSaWdodENvbG9yKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItYm90dG9tLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQm90dG9tQ29sb3IoKTsKLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbUNvbG9yKFN0cmluZyBib3JkZXJCb3R0b21Db2xvcikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWxlZnQtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJMZWZ0Q29sb3IoKTsKLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnRDb2xvcihTdHJpbmcgYm9yZGVyTGVmdENvbG9yKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItdG9wLXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyVG9wU3R5bGUoKTsKLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcFN0eWxlKFN0cmluZyBib3JkZXJUb3BTdHlsZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXJpZ2h0LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyUmlnaHRTdHlsZSgpOwotCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyUmlnaHRTdHlsZShTdHJpbmcgYm9yZGVyUmlnaHRTdHlsZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWJvdHRvbS1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckJvdHRvbVN0eWxlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b21TdHlsZShTdHJpbmcgYm9yZGVyQm90dG9tU3R5bGUpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1sZWZ0LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyTGVmdFN0eWxlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0U3R5bGUoU3RyaW5nIGJvcmRlckxlZnRTdHlsZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXRvcC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclRvcFdpZHRoKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3BXaWR0aChTdHJpbmcgYm9yZGVyVG9wV2lkdGgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1yaWdodC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclJpZ2h0V2lkdGgoKTsKLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0V2lkdGgoU3RyaW5nIGJvcmRlclJpZ2h0V2lkdGgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1ib3R0b20td2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJCb3R0b21XaWR0aCgpOwotCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQm90dG9tV2lkdGgoU3RyaW5nIGJvcmRlckJvdHRvbVdpZHRoKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItbGVmdC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckxlZnRXaWR0aCgpOwotCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVmdFdpZHRoKFN0cmluZyBib3JkZXJMZWZ0V2lkdGgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlcldpZHRoKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJXaWR0aChTdHJpbmcgYm9yZGVyV2lkdGgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvdHRvbSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvdHRvbSgpOwotCi0JcHVibGljIHZvaWQgc2V0Qm90dG9tKFN0cmluZyBib3R0b20pIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNhcHRpb24tc2lkZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhcHRpb25TaWRlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXB0aW9uU2lkZShTdHJpbmcgY2FwdGlvblNpZGUpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNsZWFyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xlYXIoKTsKLQotCXB1YmxpYyB2b2lkIHNldENsZWFyKFN0cmluZyBjbGVhcikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgY2xpcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXAoKTsKLQotCXB1YmxpYyB2b2lkIHNldENsaXAoU3RyaW5nIGNsaXApIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKTsKLQotCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBjb2xvcikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgY29udGVudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKTsKLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNvdW50ZXItaW5jcmVtZW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q291bnRlckluY3JlbWVudCgpOwotCi0JcHVibGljIHZvaWQgc2V0Q291bnRlckluY3JlbWVudChTdHJpbmcgY291bnRlckluY3JlbWVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgY291bnRlci1yZXNldCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvdW50ZXJSZXNldCgpOwotCi0JcHVibGljIHZvaWQgc2V0Q291bnRlclJlc2V0KFN0cmluZyBjb3VudGVyUmVzZXQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1ZSgpOwotCi0JcHVibGljIHZvaWQgc2V0Q3VlKFN0cmluZyBjdWUpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1ZS1hZnRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1ZUFmdGVyKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdWVBZnRlcihTdHJpbmcgY3VlQWZ0ZXIpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1ZS1iZWZvcmUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdWVCZWZvcmUoKTsKLQotCXB1YmxpYyB2b2lkIHNldEN1ZUJlZm9yZShTdHJpbmcgY3VlQmVmb3JlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBjdXJzb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJzb3IoKTsKLQotCXB1YmxpYyB2b2lkIHNldEN1cnNvcihTdHJpbmcgY3Vyc29yKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBkaXJlY3Rpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXJlY3Rpb24oKTsKLQotCXB1YmxpYyB2b2lkIHNldERpcmVjdGlvbihTdHJpbmcgZGlyZWN0aW9uKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBkaXNwbGF5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheSgpOwotCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheShTdHJpbmcgZGlzcGxheSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgZWxldmF0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxldmF0aW9uKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGV2YXRpb24oU3RyaW5nIGVsZXZhdGlvbikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgZW1wdHktY2VsbHMgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbXB0eUNlbGxzKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbXB0eUNlbGxzKFN0cmluZyBlbXB0eUNlbGxzKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBmbG9hdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENzc0Zsb2F0KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDc3NGbG9hdChTdHJpbmcgY3NzRmxvYXQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb250KFN0cmluZyBmb250KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LWZhbWlseSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRGYW1pbHkoKTsKLQotCXB1YmxpYyB2b2lkIHNldEZvbnRGYW1pbHkoU3RyaW5nIGZvbnRGYW1pbHkpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtc2l6ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTaXplKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb250U2l6ZShTdHJpbmcgZm9udFNpemUpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtc2l6ZS1hZGp1c3QgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250U2l6ZUFkanVzdCgpOwotCi0JcHVibGljIHZvaWQgc2V0Rm9udFNpemVBZGp1c3QoU3RyaW5nIGZvbnRTaXplQWRqdXN0KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXN0cmV0Y2ggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250U3RyZXRjaCgpOwotCi0JcHVibGljIHZvaWQgc2V0Rm9udFN0cmV0Y2goU3RyaW5nIGZvbnRTdHJldGNoKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFN0eWxlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb250U3R5bGUoU3RyaW5nIGZvbnRTdHlsZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC12YXJpYW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFZhcmlhbnQoKTsKLQotCXB1YmxpYyB2b2lkIHNldEZvbnRWYXJpYW50KFN0cmluZyBmb250VmFyaWFudCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC13ZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250V2VpZ2h0KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb250V2VpZ2h0KFN0cmluZyBmb250V2VpZ2h0KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBoZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIZWlnaHQoKTsKLQotCXB1YmxpYyB2b2lkIHNldEhlaWdodChTdHJpbmcgaGVpZ2h0KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBsZWZ0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGVmdCgpOwotCi0JcHVibGljIHZvaWQgc2V0TGVmdChTdHJpbmcgbGVmdCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgbGV0dGVyLXNwYWNpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXR0ZXJTcGFjaW5nKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZXR0ZXJTcGFjaW5nKFN0cmluZyBsZXR0ZXJTcGFjaW5nKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBsaW5lLWhlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmVIZWlnaHQoKTsKLQotCXB1YmxpYyB2b2lkIHNldExpbmVIZWlnaHQoU3RyaW5nIGxpbmVIZWlnaHQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpc3Qtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGUoKTsKLQotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZShTdHJpbmcgbGlzdFN0eWxlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBsaXN0LXN0eWxlLWltYWdlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlSW1hZ2UoKTsKLQotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZUltYWdlKFN0cmluZyBsaXN0U3R5bGVJbWFnZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgbGlzdC1zdHlsZS1wb3NpdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZVBvc2l0aW9uKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGVQb3NpdGlvbihTdHJpbmcgbGlzdFN0eWxlUG9zaXRpb24pIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpc3Qtc3R5bGUtdHlwZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZVR5cGUoKTsKLQotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZVR5cGUoU3RyaW5nIGxpc3RTdHlsZVR5cGUpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbigpOwotCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luKFN0cmluZyBtYXJnaW4pIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbi10b3AgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5Ub3AoKTsKLQotCXB1YmxpYyB2b2lkIHNldE1hcmdpblRvcChTdHJpbmcgbWFyZ2luVG9wKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4tcmlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5SaWdodCgpOwotCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luUmlnaHQoU3RyaW5nIG1hcmdpblJpZ2h0KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4tYm90dG9tIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luQm90dG9tKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5Cb3R0b20oU3RyaW5nIG1hcmdpbkJvdHRvbSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luLWxlZnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5MZWZ0KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5MZWZ0KFN0cmluZyBtYXJnaW5MZWZ0KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJrZXItb2Zmc2V0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFya2VyT2Zmc2V0KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXJrZXJPZmZzZXQoU3RyaW5nIG1hcmtlck9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgbWFya3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJrcygpOwotCi0JcHVibGljIHZvaWQgc2V0TWFya3MoU3RyaW5nIG1hcmtzKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBtYXgtaGVpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF4SGVpZ2h0KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhIZWlnaHQoU3RyaW5nIG1heEhlaWdodCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgbWF4LXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF4V2lkdGgoKTsKLQotCXB1YmxpYyB2b2lkIHNldE1heFdpZHRoKFN0cmluZyBtYXhXaWR0aCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgbWluLWhlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbkhlaWdodCgpOwotCi0JcHVibGljIHZvaWQgc2V0TWluSGVpZ2h0KFN0cmluZyBtaW5IZWlnaHQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1pbi13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbldpZHRoKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaW5XaWR0aChTdHJpbmcgbWluV2lkdGgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG9ycGhhbnMgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcnBoYW5zKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcnBoYW5zKFN0cmluZyBvcnBoYW5zKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBvdXRsaW5lIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZSgpOwotCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZShTdHJpbmcgb3V0bGluZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgb3V0bGluZS1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dGxpbmVDb2xvcigpOwotCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZUNvbG9yKFN0cmluZyBvdXRsaW5lQ29sb3IpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG91dGxpbmUtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRsaW5lU3R5bGUoKTsKLQotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVTdHlsZShTdHJpbmcgb3V0bGluZVN0eWxlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBvdXRsaW5lLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZVdpZHRoKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lV2lkdGgoU3RyaW5nIG91dGxpbmVXaWR0aCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgb3ZlcmZsb3cgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdmVyZmxvdygpOwotCi0JcHVibGljIHZvaWQgc2V0T3ZlcmZsb3coU3RyaW5nIG92ZXJmbG93KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZygpOwotCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZyhTdHJpbmcgcGFkZGluZykgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZy10b3AgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nVG9wKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nVG9wKFN0cmluZyBwYWRkaW5nVG9wKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nLXJpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nUmlnaHQoU3RyaW5nIHBhZGRpbmdSaWdodCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZy1ib3R0b20gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nQm90dG9tKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nQm90dG9tKFN0cmluZyBwYWRkaW5nQm90dG9tKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nLWxlZnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nTGVmdCgpOwotCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ0xlZnQoU3RyaW5nIHBhZGRpbmdMZWZ0KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBwYWdlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZSgpOwotCi0JcHVibGljIHZvaWQgc2V0UGFnZShTdHJpbmcgcGFnZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgcGFnZS1icmVhay1hZnRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VCcmVha0FmdGVyKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWdlQnJlYWtBZnRlcihTdHJpbmcgcGFnZUJyZWFrQWZ0ZXIpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZ2UtYnJlYWstYmVmb3JlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUJyZWFrQmVmb3JlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWdlQnJlYWtCZWZvcmUoU3RyaW5nIHBhZ2VCcmVha0JlZm9yZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgcGFnZS1icmVhay1pbnNpZGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlQnJlYWtJbnNpZGUoKTsKLQotCXB1YmxpYyB2b2lkIHNldFBhZ2VCcmVha0luc2lkZShTdHJpbmcgcGFnZUJyZWFrSW5zaWRlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBwYXVzZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdXNlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXVzZShTdHJpbmcgcGF1c2UpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhdXNlLWFmdGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF1c2VBZnRlcigpOwotCi0JcHVibGljIHZvaWQgc2V0UGF1c2VBZnRlcihTdHJpbmcgcGF1c2VBZnRlcikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgcGF1c2UtYmVmb3JlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF1c2VCZWZvcmUoKTsKLQotCXB1YmxpYyB2b2lkIHNldFBhdXNlQmVmb3JlKFN0cmluZyBwYXVzZUJlZm9yZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgcGl0Y2ggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaXRjaCgpOwotCi0JcHVibGljIHZvaWQgc2V0UGl0Y2goU3RyaW5nIHBpdGNoKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBwaXRjaC1yYW5nZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBpdGNoUmFuZ2UoKTsKLQotCXB1YmxpYyB2b2lkIHNldFBpdGNoUmFuZ2UoU3RyaW5nIHBpdGNoUmFuZ2UpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBsYXktZHVyaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGxheUR1cmluZygpOwotCi0JcHVibGljIHZvaWQgc2V0UGxheUR1cmluZyhTdHJpbmcgcGxheUR1cmluZykgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgcG9zaXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3NpdGlvbigpOwotCi0JcHVibGljIHZvaWQgc2V0UG9zaXRpb24oU3RyaW5nIHBvc2l0aW9uKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBxdW90ZXMgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdW90ZXMoKTsKLQotCXB1YmxpYyB2b2lkIHNldFF1b3RlcyhTdHJpbmcgcXVvdGVzKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSByaWNobmVzcyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpY2huZXNzKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRSaWNobmVzcyhTdHJpbmcgcmljaG5lc3MpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHJpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmlnaHQoKTsKLQotCXB1YmxpYyB2b2lkIHNldFJpZ2h0KFN0cmluZyByaWdodCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgc2l6ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpemUoKTsKLQotCXB1YmxpYyB2b2lkIHNldFNpemUoU3RyaW5nIHNpemUpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWFrIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWsoKTsKLQotCXB1YmxpYyB2b2lkIHNldFNwZWFrKFN0cmluZyBzcGVhaykgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlYWstaGVhZGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWtIZWFkZXIoKTsKLQotCXB1YmxpYyB2b2lkIHNldFNwZWFrSGVhZGVyKFN0cmluZyBzcGVha0hlYWRlcikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlYWstbnVtZXJhbCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWFrTnVtZXJhbCgpOwotCi0JcHVibGljIHZvaWQgc2V0U3BlYWtOdW1lcmFsKFN0cmluZyBzcGVha051bWVyYWwpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWFrLXB1bmN0dWF0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWtQdW5jdHVhdGlvbigpOwotCi0JcHVibGljIHZvaWQgc2V0U3BlYWtQdW5jdHVhdGlvbihTdHJpbmcgc3BlYWtQdW5jdHVhdGlvbikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlZWNoLXJhdGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVlY2hSYXRlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVlY2hSYXRlKFN0cmluZyBzcGVlY2hSYXRlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSBzdHJlc3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJlc3MoKTsKLQotCXB1YmxpYyB2b2lkIHNldFN0cmVzcyhTdHJpbmcgc3RyZXNzKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSB0YWJsZS1sYXlvdXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZUxheW91dCgpOwotCi0JcHVibGljIHZvaWQgc2V0VGFibGVMYXlvdXQoU3RyaW5nIHRhYmxlTGF5b3V0KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LWFsaWduIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEFsaWduKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0QWxpZ24oU3RyaW5nIHRleHRBbGlnbikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC1kZWNvcmF0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dERlY29yYXRpb24oKTsKLQotCXB1YmxpYyB2b2lkIHNldFRleHREZWNvcmF0aW9uKFN0cmluZyB0ZXh0RGVjb3JhdGlvbikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC1pbmRlbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0SW5kZW50KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0SW5kZW50KFN0cmluZyB0ZXh0SW5kZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LXNoYWRvdyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRTaGFkb3coKTsKLQotCXB1YmxpYyB2b2lkIHNldFRleHRTaGFkb3coU3RyaW5nIHRleHRTaGFkb3cpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtdHJhbnNmb3JtIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFRyYW5zZm9ybSgpOwotCi0JcHVibGljIHZvaWQgc2V0VGV4dFRyYW5zZm9ybShTdHJpbmcgdGV4dFRyYW5zZm9ybSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgdG9wIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9wKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb3AoU3RyaW5nIHRvcCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgdW5pY29kZS1iaWRpIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5pY29kZUJpZGkoKTsKLQotCXB1YmxpYyB2b2lkIHNldFVuaWNvZGVCaWRpKFN0cmluZyB1bmljb2RlQmlkaSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgdmVydGljYWwtYWxpZ24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJ0aWNhbEFsaWduKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJ0aWNhbEFsaWduKFN0cmluZyB2ZXJ0aWNhbEFsaWduKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSB2aXNpYmlsaXR5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmlzaWJpbGl0eSgpOwotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShTdHJpbmcgdmlzaWJpbGl0eSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgdm9pY2UtZmFtaWx5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vm9pY2VGYW1pbHkoKTsKLQotCXB1YmxpYyB2b2lkIHNldFZvaWNlRmFtaWx5KFN0cmluZyB2b2ljZUZhbWlseSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgdm9sdW1lIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vm9sdW1lKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRWb2x1bWUoU3RyaW5nIHZvbHVtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNlZSB0aGUgd2hpdGUtc3BhY2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaGl0ZVNwYWNlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaGl0ZVNwYWNlKFN0cmluZyB3aGl0ZVNwYWNlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSB3aWRvd3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaWRvd3MoKTsKLQotCXB1YmxpYyB2b2lkIHNldFdpZG93cyhTdHJpbmcgd2lkb3dzKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2VlIHRoZSB3aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHdvcmQtc3BhY2luZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdvcmRTcGFjaW5nKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRXb3JkU3BhY2luZyhTdHJpbmcgd29yZFNwYWNpbmcpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHotaW5kZXggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRaSW5kZXgoKTsKLQotCXB1YmxpYyB2b2lkIHNldFpJbmRleChTdHJpbmcgekluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NDaGFyc2V0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NDaGFyc2V0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzQ0YjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTQ2hhcnNldFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwKLSAqIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICogUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsCi0gKiBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVzNDJ3MgU29mdHdhcmUKLSAqIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlCi0gKiBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuCi0gKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLgotICogU2VlIFczQyBMaWNlbnNlIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS5jc3M7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLS8qKgotICogVGhlIDxjb2RlPkNTU0NoYXJzZXRSdWxlPC9jb2RlPiBpbnRlcmZhY2UgcmVwcmVzZW50cyBhCi0gKiAKLSAqIEBjaGFyc2V0IHJ1bGUgaW4gYSBDU1Mgc3R5bGUgc2hlZXQuIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+ZW5jb2Rpbmc8L2NvZGU+Ci0gKiAgICAgICAgICBhdHRyaWJ1dGUgZG9lcyBub3QgYWZmZWN0IHRoZSBlbmNvZGluZyBvZiB0ZXh0IGRhdGEgaW4gdGhlIERPTQotICogICAgICAgICAgb2JqZWN0czsgdGhpcyBlbmNvZGluZyBpcyBhbHdheXMgVVRGLTE2LiBBZnRlciBhIHN0eWxlc2hlZXQgaXMKLSAqICAgICAgICAgIGxvYWRlZCwgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5lbmNvZGluZzwvY29kZT4gYXR0cmlidXRlIGlzIHRoZQotICogICAgICAgICAgdmFsdWUgZm91bmQgaW4gdGhlIDxjb2RlPkBjaGFyc2V0PC9jb2RlPiBydWxlLiBJZiB0aGVyZSB3YXMgbm8gPGNvZGU+QGNoYXJzZXQ8L2NvZGU+IGluIHRoZSBvcmlnaW5hbCBkb2N1bWVudCwgdGhlbiBubwotICogICAgICAgICAgPGNvZGU+Q1NTQ2hhcnNldFJ1bGU8L2NvZGU+IGlzIGNyZWF0ZWQuIFRoZSB2YWx1ZSBvZiB0aGUKLSAqICAgICAgICAgIDxjb2RlPmVuY29kaW5nPC9jb2RlPiBhdHRyaWJ1dGUgbWF5IGFsc28gYmUgdXNlZCBhcyBhIGhpbnQgZm9yCi0gKiAgICAgICAgICB0aGUgZW5jb2RpbmcgdXNlZCBvbiBzZXJpYWxpemF0aW9uIG9mIHRoZSBzdHlsZSBzaGVldC4KLSAqICAgICAgICAgIDxwPgotICogICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZQotICogQGNoYXJzZXQgcnVsZSAoYW5kIHRoZXJlZm9yZSBvZiB0aGUgPGNvZGU+Q1NTQ2hhcnNldFJ1bGU8L2NvZGU+KSBtYXkgbm90Ci0gKiAgICAgICAgICBjb3JyZXNwb25kIHRvIHRoZSBlbmNvZGluZyB0aGUgZG9jdW1lbnQgYWN0dWFsbHkgY2FtZSBpbjsKLSAqICAgICAgICAgIGNoYXJhY3RlciBlbmNvZGluZyBpbmZvcm1hdGlvbiBlLmcuIGluIGFuIEhUVFAgaGVhZGVyLCBoYXMKLSAqICAgICAgICAgIHByaW9yaXR5IChzZWUgQ1NTIGRvY3VtZW50IHJlcHJlc2VudGF0aW9uKSBidXQgdGhpcyBpcyBub3QKLSAqICAgICAgICAgIHJlZmxlY3RlZCBpbiB0aGUgPGNvZGU+Q1NTQ2hhcnNldFJ1bGU8L2NvZGU+LgotICogICAgICAgICAgPHA+Ci0gKiAgICAgICAgICBTZWUgYWxzbyB0aGUgPGEKLSAqICAgICAgICAgIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVN0eWxlLTIwMDAxMTEzJz5Eb2N1bWVudAotICogICAgICAgICAgT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgU3R5bGUgU3BlY2lmaWNhdGlvbiA8L2E+LgotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTQ2hhcnNldFJ1bGUgZXh0ZW5kcyBDU1NSdWxlIHsKLQkvKioKLQkgKiBUaGUgZW5jb2RpbmcgaW5mb3JtYXRpb24gdXNlZCBpbiB0aGlzIDxjb2RlPkBjaGFyc2V0PC9jb2RlPiBydWxlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgdmFsdWUgaGFzIGEKLQkgKiAgICAgICAgICAgICAgICBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGVuY29kaW5nCi0JICogICAgICAgICAgICAgICAgcnVsZSBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBET01FeGNlcHRpb247Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU0ZvbnRGYWNlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NGb250RmFjZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhZmY2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU0ZvbnRGYWNlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q1NTRm9udEZhY2VSdWxlPC9jb2RlPiBpbnRlcmZhY2UgcmVwcmVzZW50cyBhCi0gKiAKLSAqIEBmb250LWZhY2UgcnVsZSBpbiBhIENTUyBzdHlsZSBzaGVldC4gVGhlIDxjb2RlPkBmb250LWZhY2U8L2NvZGU+IHJ1bGUgaXMgdXNlZCB0byBob2xkIGEgc2V0IG9mIGZvbnQgZGVzY3JpcHRpb25zLgotICogICAgICAgICAgICA8cD4KLSAqICAgICAgICAgICAgU2VlIGFsc28gdGhlIDxhCi0gKiAgICAgICAgICAgIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVN0eWxlLTIwMDAxMTEzJz5Eb2N1bWVudAotICogICAgICAgICAgICBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBTdHlsZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiBAc2luY2UgRE9NIExldmVsIDIKLSAqLwotcHVibGljIGludGVyZmFjZSBDU1NGb250RmFjZVJ1bGUgZXh0ZW5kcyBDU1NSdWxlIHsKLQkvKioKLQkgKiBUaGUgZGVjbGFyYXRpb24tYmxvY2sgb2YgdGhpcyBydWxlLgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU0ltcG9ydFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTSW1wb3J0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzA4ZDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTSW1wb3J0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q1NTSW1wb3J0UnVsZTwvY29kZT4gaW50ZXJmYWNlIHJlcHJlc2VudHMgYQotICogCi0gKiBAaW1wb3J0IHJ1bGUgd2l0aGluIGEgQ1NTIHN0eWxlIHNoZWV0LiBUaGUgPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSBpcyB1c2VkIHRvIGltcG9ydCBzdHlsZSBydWxlcyBmcm9tIG90aGVyIHN0eWxlIHNoZWV0cy4KLSAqICAgICAgICAgPHA+Ci0gKiAgICAgICAgIFNlZSBhbHNvIHRoZSA8YQotICogICAgICAgICBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqICAgICAgICAgT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgU3R5bGUgU3BlY2lmaWNhdGlvbiA8L2E+LgotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTSW1wb3J0UnVsZSBleHRlbmRzIENTU1J1bGUgewotCS8qKgotCSAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3R5bGUgc2hlZXQgdG8gYmUgaW1wb3J0ZWQuIFRoZSBhdHRyaWJ1dGUgd2lsbCBub3QKLQkgKiBjb250YWluIHRoZSA8Y29kZT4idXJsKC4uLikiPC9jb2RlPiBzcGVjaWZpZXIgYXJvdW5kIHRoZSBVUkkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCk7Ci0KLQkvKioKLQkgKiBBIGxpc3Qgb2YgbWVkaWEgdHlwZXMgZm9yIHdoaWNoIHRoaXMgc3R5bGUgc2hlZXQgbWF5IGJlIHVzZWQuCi0JICovCi0JcHVibGljIE1lZGlhTGlzdCBnZXRNZWRpYSgpOwotCi0JLyoqCi0JICogVGhlIHN0eWxlIHNoZWV0IHJlZmVycmVkIHRvIGJ5IHRoaXMgcnVsZSwgaWYgaXQgaGFzIGJlZW4gbG9hZGVkLiBUaGUKLQkgKiB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3R5bGUgc2hlZXQgaGFzCi0JICogbm90IHlldCBiZWVuIGxvYWRlZCBvciBpZiBpdCB3aWxsIG5vdCBiZSBsb2FkZWQgKGUuZy4gaWYgdGhlIHN0eWxlCi0JICogc2hlZXQgaXMgZm9yIGEgbWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB1c2VyIGFnZW50KS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVTaGVldCBnZXRTdHlsZVNoZWV0KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU01lZGlhUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NNZWRpYVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxYzVhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU01lZGlhUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLS8qKgotICogVGhlIDxjb2RlPkNTU01lZGlhUnVsZTwvY29kZT4gaW50ZXJmYWNlIHJlcHJlc2VudHMgYQotICogCi0gKiBAbWVkaWEgcnVsZSBpbiBhIENTUyBzdHlsZSBzaGVldC4gQSA8Y29kZT5AbWVkaWE8L2NvZGU+IHJ1bGUgY2FuIGJlIHVzZWQgdG8gZGVsaW1pdCBzdHlsZSBydWxlcyBmb3Igc3BlY2lmaWMgbWVkaWEKLSAqICAgICAgICB0eXBlcy4KLSAqICAgICAgICA8cD4KLSAqICAgICAgICBTZWUgYWxzbyB0aGUgPGEKLSAqICAgICAgICBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqICAgICAgICBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBTdHlsZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiBAc2luY2UgRE9NIExldmVsIDIKLSAqLwotcHVibGljIGludGVyZmFjZSBDU1NNZWRpYVJ1bGUgZXh0ZW5kcyBDU1NSdWxlIHsKLQkvKioKLQkgKiBBIGxpc3Qgb2YgbWVkaWEgdHlwZXMgZm9yIHRoaXMgcnVsZS4KLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGdldE1lZGlhKCk7Ci0KLQkvKioKLQkgKiBBIGxpc3Qgb2YgYWxsIENTUyBydWxlcyBjb250YWluZWQgd2l0aGluIHRoZSBtZWRpYSBibG9jay4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZUxpc3QgZ2V0Q3NzUnVsZXMoKTsKLQotCS8qKgotCSAqIFVzZWQgdG8gaW5zZXJ0IGEgbmV3IHJ1bGUgaW50byB0aGUgbWVkaWEgYmxvY2suCi0JICogCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIFRoZSBwYXJzYWJsZSB0ZXh0IHJlcHJlc2VudGluZyB0aGUgcnVsZS4gRm9yIHJ1bGUgc2V0cyB0aGlzCi0JICogICAgICAgICAgICBjb250YWlucyBib3RoIHRoZSBzZWxlY3RvciBhbmQgdGhlIHN0eWxlIGRlY2xhcmF0aW9uLiBGb3IKLQkgKiAgICAgICAgICAgIGF0LXJ1bGVzLCB0aGlzIHNwZWNpZmllcyBib3RoIHRoZSBhdC1pZGVudGlmaWVyIGFuZCB0aGUgcnVsZQotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrJ3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZQotCSAqICAgICAgICAgICAgcnVsZSBiZWZvcmUgd2hpY2ggdG8gaW5zZXJ0IHRoZSBzcGVjaWZpZWQgcnVsZS4gSWYgdGhlCi0JICogICAgICAgICAgICBzcGVjaWZpZWQgaW5kZXggaXMgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgbWVkaWEgYmxvY2tzJ3MKLQkgKiAgICAgICAgICAgIHJ1bGUgY29sbGVjdGlvbiwgdGhlIHJ1bGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgICAgbWVkaWEgYmxvY2suCi0JICogQHJldHVybiBUaGUgaW5kZXggd2l0aGluIHRoZSBtZWRpYSBibG9jaydzIHJ1bGUgY29sbGVjdGlvbiBvZiB0aGUgbmV3bHkKLQkgKiAgICAgICAgIGluc2VydGVkIHJ1bGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgcnVsZSBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgICAgICBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBlLmcuLCBpZiBhbgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkBpbXBvcnQ8L2NvZGU+IHJ1bGUgaXMgaW5zZXJ0ZWQgYWZ0ZXIgYSBzdGFuZGFyZCBydWxlIHNldCBvciBvdGhlcgotCSAqICAgICAgICAgYXQtcnVsZS4gPGJyPgotCSAqICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGlzIG5vdCBhIHZhbGlkCi0JICogICAgICAgICBpbnNlcnRpb24gcG9pbnQuIDxicj4KLQkgKiAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbWVkaWEgcnVsZSBpcwotCSAqICAgICAgICAgcmVhZG9ubHkuIDxicj4KLQkgKiAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHJ1bGUgaGFzIGEgc3ludGF4IGVycm9yIGFuZAotCSAqICAgICAgICAgaXMgdW5wYXJzYWJsZS4KLQkgKi8KLQlwdWJsaWMgaW50IGluc2VydFJ1bGUoU3RyaW5nIHJ1bGUsIGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVzZWQgdG8gZGVsZXRlIGEgcnVsZSBmcm9tIHRoZSBtZWRpYSBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrJ3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZQotCSAqICAgICAgICAgICAgcnVsZSB0byByZW1vdmUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggZG9lcyBub3QKLQkgKiAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIGEgcnVsZSBpbiB0aGUgbWVkaWEgcnVsZSBsaXN0LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZWRpYSBydWxlCi0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUnVsZShpbnQgaW5kZXgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU1BhZ2VSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU1BhZ2VSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Y2RhMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NQYWdlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q1NTUGFnZVJ1bGU8L2NvZGU+IGludGVyZmFjZSByZXByZXNlbnRzIGEKLSAqIAotICogQHBhZ2UgcnVsZSB3aXRoaW4gYSBDU1Mgc3R5bGUgc2hlZXQuIFRoZSA8Y29kZT5AcGFnZTwvY29kZT4gcnVsZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpbWVuc2lvbnMsIG9yaWVudGF0aW9uLCBtYXJnaW5zLAotICogICAgICAgZXRjLiBvZiBhIHBhZ2UgYm94IGZvciBwYWdlZCBtZWRpYS4KLSAqICAgICAgIDxwPgotICogICAgICAgU2VlIGFsc28gdGhlIDxhCi0gKiAgICAgICBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqICAgICAgIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENTU1BhZ2VSdWxlIGV4dGVuZHMgQ1NTUnVsZSB7Ci0JLyoqCi0JICogVGhlIHBhcnNhYmxlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhZ2Ugc2VsZWN0b3IgZm9yIHRoZSBydWxlLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgQ1NTIHN0cmluZyB2YWx1ZSBoYXMKLQkgKiAgICAgICAgICAgICAgICBhIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcnVsZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUZXh0KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RvclRleHQoU3RyaW5nIHNlbGVjdG9yVGV4dCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWNsYXJhdGlvbi1ibG9jayBvZiB0aGlzIHJ1bGUuCi0JICovCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTUHJpbWl0aXZlVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTUHJpbWl0aXZlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3ZjRjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU1ByaW1pdGl2ZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q1NTUHJpbWl0aXZlVmFsdWU8L2NvZGU+IGludGVyZmFjZSByZXByZXNlbnRzIGEgc2luZ2xlIENTUwotICogdmFsdWUgLiBUaGlzIGludGVyZmFjZSBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMKLSAqIHN0eWxlIHByb3BlcnR5IGN1cnJlbnRseSBzZXQgaW4gYSBibG9jayBvciB0byBzZXQgYSBzcGVjaWZpYyBzdHlsZSBwcm9wZXJ0eQotICogZXhwbGljaXRseSB3aXRoaW4gdGhlIGJsb2NrLiBBbiBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBtaWdodCBiZQotICogb2J0YWluZWQgZnJvbSB0aGUgPGNvZGU+Z2V0UHJvcGVydHlDU1NWYWx1ZTwvY29kZT4gbWV0aG9kIG9mIHRoZQotICogPGNvZGU+Q1NTU3R5bGVEZWNsYXJhdGlvbjwvY29kZT4gaW50ZXJmYWNlLiBBCi0gKiA8Y29kZT5DU1NQcmltaXRpdmVWYWx1ZTwvY29kZT4gb2JqZWN0IG9ubHkgb2NjdXJzIGluIGEgY29udGV4dCBvZiBhIENTUwotICogcHJvcGVydHkuCi0gKiA8cD4KLSAqIENvbnZlcnNpb25zIGFyZSBhbGxvd2VkIGJldHdlZW4gYWJzb2x1dGUgdmFsdWVzIChmcm9tIG1pbGxpbWV0ZXJzIHRvCi0gKiBjZW50aW1ldGVycywgZnJvbSBkZWdyZWVzIHRvIHJhZGlhbnMsIGFuZCBzbyBvbikgYnV0IG5vdCBiZXR3ZWVuIHJlbGF0aXZlCi0gKiB2YWx1ZXMuIChGb3IgZXhhbXBsZSwgYSBwaXhlbCB2YWx1ZSBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgY2VudGltZXRlcgotICogdmFsdWUuKSBQZXJjZW50YWdlIHZhbHVlcyBjYW4ndCBiZSBjb252ZXJ0ZWQgc2luY2UgdGhleSBhcmUgcmVsYXRpdmUgdG8gdGhlCi0gKiBwYXJlbnQgdmFsdWUgKG9yIGFub3RoZXIgcHJvcGVydHkgdmFsdWUpLiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uIGZvciBjb2xvcgotICogcGVyY2VudGFnZSB2YWx1ZXM6IHNpbmNlIGEgY29sb3IgcGVyY2VudGFnZSB2YWx1ZSBpcyByZWxhdGl2ZSB0byB0aGUgcmFuZ2UKLSAqIDAtMjU1LCBhIGNvbG9yIHBlcmNlbnRhZ2UgdmFsdWUgY2FuIGJlIGNvbnZlcnRlZCB0byBhIG51bWJlcjsgKHNlZSBhbHNvIHRoZQotICogPGNvZGU+UkdCQ29sb3I8L2NvZGU+IGludGVyZmFjZSkuCi0gKiA8cD4KLSAqIFNlZSBhbHNvIHRoZSA8YQotICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItU3R5bGUtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBTdHlsZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiAKLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENTU1ByaW1pdGl2ZVZhbHVlIGV4dGVuZHMgQ1NTVmFsdWUgewotCS8vIFVuaXRUeXBlcwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBub3QgYSByZWNvZ25pemVkIENTUzIgdmFsdWUuIFRoZSB2YWx1ZSBjYW4gb25seSBiZQotCSAqIG9idGFpbmVkIGJ5IHVzaW5nIHRoZSA8Y29kZT5jc3NUZXh0PC9jb2RlPiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfVU5LTk9XTiA9IDA7Ci0JLyoqCi0JICogVGhlIHZhbHVlIGlzIGEgc2ltcGxlIG51bWJlci4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRGbG9hdFZhbHVlPC9jb2RlPiBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfTlVNQkVSID0gMTsKLQkvKioKLQkgKiBUaGUgdmFsdWUgaXMgYSBwZXJjZW50YWdlLiBUaGUgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZQotCSAqIDxjb2RlPmdldEZsb2F0VmFsdWU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTU19QRVJDRU5UQUdFID0gMjsKLQkvKioKLQkgKiBUaGUgdmFsdWUgaXMgYSBsZW5ndGggKGVtcykuIFRoZSB2YWx1ZSBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcgdGhlCi0JICogPGNvZGU+Z2V0RmxvYXRWYWx1ZTwvY29kZT4gbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NTX0VNUyA9IDM7Ci0JLyoqCi0JICogVGhlIHZhbHVlIGlzIGEgbGVuZ3RoIChleHMpLiBUaGUgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZQotCSAqIDxjb2RlPmdldEZsb2F0VmFsdWU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTU19FWFMgPSA0OwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhIGxlbmd0aCAocHgpLiBUaGUgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZQotCSAqIDxjb2RlPmdldEZsb2F0VmFsdWU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTU19QWCA9IDU7Ci0JLyoqCi0JICogVGhlIHZhbHVlIGlzIGEgbGVuZ3RoIChjbSkuIFRoZSB2YWx1ZSBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcgdGhlCi0JICogPGNvZGU+Z2V0RmxvYXRWYWx1ZTwvY29kZT4gbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NTX0NNID0gNjsKLQkvKioKLQkgKiBUaGUgdmFsdWUgaXMgYSBsZW5ndGggKG1tKS4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRGbG9hdFZhbHVlPC9jb2RlPiBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfTU0gPSA3OwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhIGxlbmd0aCAoaW4pLiBUaGUgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZQotCSAqIDxjb2RlPmdldEZsb2F0VmFsdWU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTU19JTiA9IDg7Ci0JLyoqCi0JICogVGhlIHZhbHVlIGlzIGEgbGVuZ3RoIChwdCkuIFRoZSB2YWx1ZSBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcgdGhlCi0JICogPGNvZGU+Z2V0RmxvYXRWYWx1ZTwvY29kZT4gbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NTX1BUID0gOTsKLQkvKioKLQkgKiBUaGUgdmFsdWUgaXMgYSBsZW5ndGggKHBjKS4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRGbG9hdFZhbHVlPC9jb2RlPiBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfUEMgPSAxMDsKLQkvKioKLQkgKiBUaGUgdmFsdWUgaXMgYW4gYW5nbGUgKGRlZykuIFRoZSB2YWx1ZSBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcgdGhlCi0JICogPGNvZGU+Z2V0RmxvYXRWYWx1ZTwvY29kZT4gbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NTX0RFRyA9IDExOwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhbiBhbmdsZSAocmFkKS4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRGbG9hdFZhbHVlPC9jb2RlPiBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfUkFEID0gMTI7Ci0JLyoqCi0JICogVGhlIHZhbHVlIGlzIGFuIGFuZ2xlIChncmFkKS4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRGbG9hdFZhbHVlPC9jb2RlPiBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfR1JBRCA9IDEzOwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhIHRpbWUgKG1zKS4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRGbG9hdFZhbHVlPC9jb2RlPiBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfTVMgPSAxNDsKLQkvKioKLQkgKiBUaGUgdmFsdWUgaXMgYSB0aW1lIChzKS4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRGbG9hdFZhbHVlPC9jb2RlPiBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfUyA9IDE1OwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhIGZyZXF1ZW5jeSAoSHopLiBUaGUgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZQotCSAqIDxjb2RlPmdldEZsb2F0VmFsdWU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTU19IWiA9IDE2OwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhIGZyZXF1ZW5jeSAoa0h6KS4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRGbG9hdFZhbHVlPC9jb2RlPiBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfS0haID0gMTc7Ci0JLyoqCi0JICogVGhlIHZhbHVlIGlzIGEgbnVtYmVyIHdpdGggYW4gdW5rbm93biBkaW1lbnNpb24uIFRoZSB2YWx1ZSBjYW4gYmUKLQkgKiBvYnRhaW5lZCBieSB1c2luZyB0aGUgPGNvZGU+Z2V0RmxvYXRWYWx1ZTwvY29kZT4gbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NTX0RJTUVOU0lPTiA9IDE4OwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhIFNUUklORy4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRTdHJpbmdWYWx1ZTwvY29kZT4gbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NTX1NUUklORyA9IDE5OwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhIFVSSS4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRTdHJpbmdWYWx1ZTwvY29kZT4gbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NTX1VSSSA9IDIwOwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhbiBpZGVudGlmaWVyLiBUaGUgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZQotCSAqIDxjb2RlPmdldFN0cmluZ1ZhbHVlPC9jb2RlPiBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfSURFTlQgPSAyMTsKLQkvKioKLQkgKiBUaGUgdmFsdWUgaXMgYSBhdHRyaWJ1dGUgZnVuY3Rpb24uIFRoZSB2YWx1ZSBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcKLQkgKiB0aGUgPGNvZGU+Z2V0U3RyaW5nVmFsdWU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTU19BVFRSID0gMjI7Ci0JLyoqCi0JICogVGhlIHZhbHVlIGlzIGEgY291bnRlciBvciBjb3VudGVycyBmdW5jdGlvbi4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZAotCSAqIGJ5IHVzaW5nIHRoZSA8Y29kZT5nZXRDb3VudGVyVmFsdWU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTU19DT1VOVEVSID0gMjM7Ci0JLyoqCi0JICogVGhlIHZhbHVlIGlzIGEgcmVjdCBmdW5jdGlvbi4gVGhlIHZhbHVlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUKLQkgKiA8Y29kZT5nZXRSZWN0VmFsdWU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTU19SRUNUID0gMjQ7Ci0JLyoqCi0JICogVGhlIHZhbHVlIGlzIGEgUkdCIGNvbG9yLiBUaGUgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZQotCSAqIDxjb2RlPmdldFJHQkNvbG9yVmFsdWU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTU19SR0JDT0xPUiA9IDI1OwotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIGNvbnN0YW50cyBzcGVjaWZpZWQgYWJvdmUuCi0JICovCi0JcHVibGljIHNob3J0IGdldFByaW1pdGl2ZVR5cGUoKTsKLQotCS8qKgotCSAqIEEgbWV0aG9kIHRvIHNldCB0aGUgZmxvYXQgdmFsdWUgd2l0aCBhIHNwZWNpZmllZCB1bml0LiBJZiB0aGUgcHJvcGVydHkKLQkgKiBhdHRhY2hlZCB3aXRoIHRoaXMgdmFsdWUgY2FuIG5vdCBhY2NlcHQgdGhlIHNwZWNpZmllZCB1bml0IG9yIHRoZSBmbG9hdAotCSAqIHZhbHVlLCB0aGUgdmFsdWUgd2lsbCBiZSB1bmNoYW5nZWQgYW5kIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPgotCSAqIHdpbGwgYmUgcmFpc2VkLgotCSAqIAotCSAqIEBwYXJhbSB1bml0VHlwZQotCSAqICAgICAgICAgICAgQSB1bml0IGNvZGUgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIHVuaXQgY29kZSBjYW4gb25seSBiZSBhCi0JICogICAgICAgICAgICBmbG9hdCB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX05VTUJFUjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEVSQ0VOVEFHRTwvY29kZT4sPGNvZGU+Q1NTX0VNUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRVhTPC9jb2RlPiw8Y29kZT5DU1NfUFg8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0NNPC9jb2RlPiw8Y29kZT5DU1NfTU08L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0lOPC9jb2RlPiw8Y29kZT5DU1NfUFQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BDPC9jb2RlPiw8Y29kZT5DU1NfREVHPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19SQUQ8L2NvZGU+LDxjb2RlPkNTU19HUkFEPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19NUzwvY29kZT4sPGNvZGU+Q1NTX1M8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0haPC9jb2RlPiw8Y29kZT5DU1NfS0haPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19ESU1FTlNJT048L2NvZGU+KS4KLQkgKiBAcGFyYW0gZmxvYXRWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyBmbG9hdCB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBhdHRhY2hlZCBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZmxvYXQgdmFsdWUgb3IgdGhlIHVuaXQgdHlwZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGbG9hdFZhbHVlKHNob3J0IHVuaXRUeXBlLCBmbG9hdCBmbG9hdFZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgYSBmbG9hdCB2YWx1ZSBpbiBhIHNwZWNpZmllZCB1bml0LiBJZiB0aGlzCi0JICogQ1NTIHZhbHVlIGRvZXNuJ3QgY29udGFpbiBhIGZsb2F0IHZhbHVlIG9yIGNhbid0IGJlIGNvbnZlcnRlZCBpbnRvIHRoZQotCSAqIHNwZWNpZmllZCB1bml0LCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIAotCSAqIEBwYXJhbSB1bml0VHlwZQotCSAqICAgICAgICAgICAgQSB1bml0IGNvZGUgdG8gZ2V0IHRoZSBmbG9hdCB2YWx1ZS4gVGhlIHVuaXQgY29kZSBjYW4gb25seQotCSAqICAgICAgICAgICAgYmUgYSBmbG9hdCB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX05VTUJFUjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEVSQ0VOVEFHRTwvY29kZT4sPGNvZGU+Q1NTX0VNUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRVhTPC9jb2RlPiw8Y29kZT5DU1NfUFg8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0NNPC9jb2RlPiw8Y29kZT5DU1NfTU08L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0lOPC9jb2RlPiw8Y29kZT5DU1NfUFQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BDPC9jb2RlPiw8Y29kZT5DU1NfREVHPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19SQUQ8L2NvZGU+LDxjb2RlPkNTU19HUkFEPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19NUzwvY29kZT4sPGNvZGU+Q1NTX1M8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0haPC9jb2RlPiw8Y29kZT5DU1NfS0haPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19ESU1FTlNJT048L2NvZGU+KS4KLQkgKiBAcmV0dXJuIFRoZSBmbG9hdCB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgZmxvYXQgdmFsdWUgb3IgaWYgdGhlIGZsb2F0IHZhbHVlIGNhbid0IGJlCi0JICogICAgICAgICAgICAgICAgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCB1bml0LgotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRGbG9hdFZhbHVlKHNob3J0IHVuaXRUeXBlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQSBtZXRob2QgdG8gc2V0IHRoZSBzdHJpbmcgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIHVuaXQuIElmIHRoZQotCSAqIHByb3BlcnR5IGF0dGFjaGVkIHRvIHRoaXMgdmFsdWUgY2FuJ3QgYWNjZXB0IHRoZSBzcGVjaWZpZWQgdW5pdCBvciB0aGUKLQkgKiBzdHJpbmcgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHVuY2hhbmdlZCBhbmQgYQotCSAqIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSByYWlzZWQuCi0JICogCi0JICogQHBhcmFtIHN0cmluZ1R5cGUKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nIGNvZGUgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIHN0cmluZyBjb2RlIGNhbiBvbmx5IGJlCi0JICogICAgICAgICAgICBhIHN0cmluZyB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX1NUUklORzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfVVJJPC9jb2RlPiw8Y29kZT5DU1NfSURFTlQ8L2NvZGU+LCBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19BVFRSPC9jb2RlPikuCi0JICogQHBhcmFtIHN0cmluZ1ZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHN0cmluZyB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBzdHJpbmcgdmFsdWUgb3IgaWYgdGhlIHN0cmluZyB2YWx1ZSBjYW4ndCBiZQotCSAqICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgdW5pdC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdWYWx1ZShzaG9ydCBzdHJpbmdUeXBlLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgc3RyaW5nIHZhbHVlLiBJZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgc3RyaW5nIHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLiBTb21lCi0JICogcHJvcGVydGllcyAobGlrZSAnZm9udC1mYW1pbHknIG9yICd2b2ljZS1mYW1pbHknKSBjb252ZXJ0IGEgd2hpdGVzcGFjZQotCSAqIHNlcGFyYXRlZCBsaXN0IG9mIGlkZW50cyB0byBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgdmFsdWUgaW4gdGhlIGN1cnJlbnQgdW5pdC4gVGhlIGN1cnJlbnQKLQkgKiAgICAgICAgIDxjb2RlPnByaW1pdGl2ZVR5cGU8L2NvZGU+IGNhbiBvbmx5IGJlIGEgc3RyaW5nIHVuaXQgdHlwZQotCSAqICAgICAgICAgKGkuZS4gPGNvZGU+Q1NTX1NUUklORzwvY29kZT4sPGNvZGU+Q1NTX1VSSTwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5DU1NfSURFTlQ8L2NvZGU+IGFuZCA8Y29kZT5DU1NfQVRUUjwvY29kZT4pLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIHN0cmluZyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBDb3VudGVyIHZhbHVlLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIGNvdW50ZXIgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5Db3VudGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgQ291bnRlciB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBDb3VudGVyIHZhbHVlIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX0NPVU5URVI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgQ291bnRlciBnZXRDb3VudGVyVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIFJlY3QgdmFsdWUuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgcmVjdCB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiBNb2RpZmljYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgY2FuIGJlIGFjaGlldmVkIHVzaW5nCi0JICogdGhlIDxjb2RlPlJlY3Q8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBSZWN0IHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIFJlY3QgdmFsdWUuIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX1JFQ1Q8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgUmVjdCBnZXRSZWN0VmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIFJHQiBjb2xvci4gSWYgdGhpcyBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSBSR0IgY29sb3IgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5SR0JDb2xvcjwvY29kZT4gaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFJHQiBjb2xvciB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBhdHRhY2hlZCBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgICAgIGNhbid0IHJldHVybiBhIFJHQiBjb2xvciB2YWx1ZSAoZS5nLiB0aGlzIGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkNTU19SR0JDT0xPUjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBSR0JDb2xvciBnZXRSR0JDb2xvclZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTNiMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGludGVyZmFjZSBmb3IgYW55Ci0gKiB0eXBlIG9mIENTUyBzdGF0ZW1lbnQuIFRoaXMgaW5jbHVkZXMgYm90aCBydWxlIHNldHMgYW5kIGF0LXJ1bGVzLiBBbgotICogaW1wbGVtZW50YXRpb24gaXMgZXhwZWN0ZWQgdG8gcHJlc2VydmUgYWxsIHJ1bGVzIHNwZWNpZmllZCBpbiBhIENTUyBzdHlsZQotICogc2hlZXQsIGV2ZW4gaWYgdGhlIHJ1bGUgaXMgbm90IHJlY29nbml6ZWQgYnkgdGhlIHBhcnNlci4gVW5yZWNvZ25pemVkIHJ1bGVzCi0gKiBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgdGhlIDxjb2RlPkNTU1Vua25vd25SdWxlPC9jb2RlPiBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIFNlZSBhbHNvIHRoZSA8YQotICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItU3R5bGUtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBTdHlsZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiAKLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENTU1J1bGUgewotCS8vIFJ1bGVUeXBlCi0JLyoqCi0JICogVGhlIHJ1bGUgaXMgYSA8Y29kZT5DU1NVbmtub3duUnVsZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBVTktOT1dOX1JVTEUgPSAwOwotCS8qKgotCSAqIFRoZSBydWxlIGlzIGEgPGNvZGU+Q1NTU3R5bGVSdWxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFNUWUxFX1JVTEUgPSAxOwotCS8qKgotCSAqIFRoZSBydWxlIGlzIGEgPGNvZGU+Q1NTQ2hhcnNldFJ1bGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ0hBUlNFVF9SVUxFID0gMjsKLQkvKioKLQkgKiBUaGUgcnVsZSBpcyBhIDxjb2RlPkNTU0ltcG9ydFJ1bGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgSU1QT1JUX1JVTEUgPSAzOwotCS8qKgotCSAqIFRoZSBydWxlIGlzIGEgPGNvZGU+Q1NTTWVkaWFSdWxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IE1FRElBX1JVTEUgPSA0OwotCS8qKgotCSAqIFRoZSBydWxlIGlzIGEgPGNvZGU+Q1NTRm9udEZhY2VSdWxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEZPTlRfRkFDRV9SVUxFID0gNTsKLQkvKioKLQkgKiBUaGUgcnVsZSBpcyBhIDxjb2RlPkNTU1BhZ2VSdWxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFBBR0VfUlVMRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFRoZSBwYXJzYWJsZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBydWxlLiBUaGlzIHJlZmxlY3RzIHRoZQotCSAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJ1bGUgYW5kIG5vdCBpdHMgaW5pdGlhbCB2YWx1ZS4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIENTUyBzdHJpbmcgdmFsdWUgaGFzCi0JICogICAgICAgICAgICAgICAgYSBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX01PRElGSUNBVElPTl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIENTUwotCSAqICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSByZXByZXNlbnRzIGEgZGlmZmVyZW50IHR5cGUgb2YgcnVsZSB0aGFuCi0JICogICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgb25lLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIHJ1bGUgY2Fubm90IGJlCi0JICogICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYXQgdGhpcyBwb2ludCBpbiB0aGUgc3R5bGUgc2hlZXQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGUgcnVsZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3NzVGV4dCgpOwotCi0JcHVibGljIHZvaWQgc2V0Q3NzVGV4dChTdHJpbmcgY3NzVGV4dCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoZSBzdHlsZSBzaGVldCB0aGF0IGNvbnRhaW5zIHRoaXMgcnVsZS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVTaGVldCBnZXRQYXJlbnRTdHlsZVNoZWV0KCk7Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHJ1bGUgaXMgY29udGFpbmVkIGluc2lkZSBhbm90aGVyIHJ1bGUgKGUuZy4gYSBzdHlsZSBydWxlIGluc2lkZQotCSAqIGFuCi0JICogCi0JICogQG1lZGlhIGJsb2NrKSwgdGhpcyBpcyB0aGUgY29udGFpbmluZyBydWxlLiBJZiB0aGlzIHJ1bGUgaXMgbm90IG5lc3RlZAotCSAqICAgICAgICBpbnNpZGUgYW55IG90aGVyIHJ1bGVzLCB0aGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIENTU1J1bGUgZ2V0UGFyZW50UnVsZSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NSdWxlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NSdWxlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmVkMWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTUnVsZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwKLSAqIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICogUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsCi0gKiBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVzNDJ3MgU29mdHdhcmUKLSAqIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlCi0gKiBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuCi0gKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLgotICogU2VlIFczQyBMaWNlbnNlIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS5jc3M7Ci0KLS8qKgotICogVGhlIDxjb2RlPkNTU1J1bGVMaXN0PC9jb2RlPiBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIGFic3RyYWN0aW9uIG9mIGFuCi0gKiBvcmRlcmVkIGNvbGxlY3Rpb24gb2YgQ1NTIHJ1bGVzLgotICogPHA+Ci0gKiBUaGUgaXRlbXMgaW4gdGhlIDxjb2RlPkNTU1J1bGVMaXN0PC9jb2RlPiBhcmUgYWNjZXNzaWJsZSB2aWEgYW4gaW50ZWdyYWwKLSAqIGluZGV4LCBzdGFydGluZyBmcm9tIDAuCi0gKiA8cD4KLSAqIFNlZSBhbHNvIHRoZSA8YQotICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItU3R5bGUtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBTdHlsZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiAKLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENTU1J1bGVMaXN0IHsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIDxjb2RlPkNTU1J1bGVzPC9jb2RlPiBpbiB0aGUgbGlzdC4gVGhlIHJhbmdlIG9mIHZhbGlkCi0JICogY2hpbGQgcnVsZSBpbmRpY2VzIGlzIDxjb2RlPjA8L2NvZGU+IHRvIDxjb2RlPmxlbmd0aC0xPC9jb2RlPgotCSAqIGluY2x1c2l2ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSBhIENTUyBydWxlIGJ5IG9yZGluYWwgaW5kZXguIFRoZSBvcmRlciBpbiB0aGlzCi0JICogY29sbGVjdGlvbiByZXByZXNlbnRzIHRoZSBvcmRlciBvZiB0aGUgcnVsZXMgaW4gdGhlIENTUyBzdHlsZSBzaGVldC4gSWYKLQkgKiBpbmRleCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBydWxlcyBpbiB0aGUgbGlzdCwgdGhpcwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGluZGV4SW5kZXgKLQkgKiAgICAgICAgICAgIGludG8gdGhlIGNvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBzdHlsZSBydWxlIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5DU1NSdWxlTGlzdDwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQgaXMKLQkgKiAgICAgICAgIG5vdCBhIHZhbGlkIGluZGV4LgotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGl0ZW0oaW50IGluZGV4KTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTU3R5bGVEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NTdHlsZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzNiNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NTdHlsZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q1NTU3R5bGVEZWNsYXJhdGlvbjwvY29kZT4gaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBzaW5nbGUgQ1NTCi0gKiBkZWNsYXJhdGlvbiBibG9jay4gVGhpcyBpbnRlcmZhY2UgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdHlsZQotICogcHJvcGVydGllcyBjdXJyZW50bHkgc2V0IGluIGEgYmxvY2sgb3IgdG8gc2V0IHN0eWxlIHByb3BlcnRpZXMgZXhwbGljaXRseQotICogd2l0aGluIHRoZSBibG9jay4KLSAqIDxwPgotICogV2hpbGUgYW4gaW1wbGVtZW50YXRpb24gbWF5IG5vdCByZWNvZ25pemUgYWxsIENTUyBwcm9wZXJ0aWVzIHdpdGhpbiBhIENTUwotICogZGVjbGFyYXRpb24gYmxvY2ssIGl0IGlzIGV4cGVjdGVkIHRvIHByb3ZpZGUgYWNjZXNzIHRvIGFsbCBzcGVjaWZpZWQKLSAqIHByb3BlcnRpZXMgaW4gdGhlIHN0eWxlIHNoZWV0IHRocm91Z2ggdGhlIDxjb2RlPkNTU1N0eWxlRGVjbGFyYXRpb248L2NvZGU+Ci0gKiBpbnRlcmZhY2UuIEZ1cnRoZXJtb3JlLCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IGEgc3BlY2lmaWMgbGV2ZWwgb2YKLSAqIENTUyBzaG91bGQgY29ycmVjdGx5IGhhbmRsZSBDU1Mgc2hvcnRoYW5kIHByb3BlcnRpZXMgZm9yIHRoYXQgbGV2ZWwuIEZvciBhCi0gKiBmdXJ0aGVyIGRpc2N1c3Npb24gb2Ygc2hvcnRoYW5kIHByb3BlcnRpZXMsIHNlZSB0aGUKLSAqIDxjb2RlPkNTUzJQcm9wZXJ0aWVzPC9jb2RlPiBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGFsc28gdXNlZCB0byBwcm92aWRlIGEgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgY29tcHV0ZWQKLSAqIHZhbHVlcyBvZiBhbiBlbGVtZW50LiBTZWUgYWxzbyB0aGUgPGNvZGU+Vmlld0NTUzwvY29kZT4gaW50ZXJmYWNlLiBUaGUKLSAqIENTUyBPYmplY3QgTW9kZWwgZG9lc24ndCBwcm92aWRlIGFuIGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIG9yIGFjdHVhbAotICogdmFsdWVzIG9mIHRoZSBDU1MgY2FzY2FkZS4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU3R5bGVEZWNsYXJhdGlvbiB7Ci0JLyoqCi0JICogVGhlIHBhcnNhYmxlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlY2xhcmF0aW9uIGJsb2NrIChleGNsdWRpbmcKLQkgKiB0aGUgc3Vycm91bmRpbmcgY3VybHkgYnJhY2VzKS4gU2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB3aWxsIHJlc3VsdCBpbgotCSAqIHRoZSBwYXJzaW5nIG9mIHRoZSBuZXcgdmFsdWUgYW5kIHJlc2V0dGluZyBvZiBhbGwgdGhlIHByb3BlcnRpZXMgaW4gdGhlCi0JICogZGVjbGFyYXRpb24gYmxvY2sgaW5jbHVkaW5nIHRoZSByZW1vdmFsIG9yIGFkZGl0aW9uIG9mIHByb3BlcnRpZXMuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBDU1Mgc3RyaW5nIHZhbHVlIGhhcwotCSAqICAgICAgICAgICAgICAgIGEgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBkZWNsYXJhdGlvbgotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5IG9yIGEgcHJvcGVydHkgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDc3NUZXh0KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDc3NUZXh0KFN0cmluZyBjc3NUZXh0KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBDU1MgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseQotCSAqIHNldCB3aXRoaW4gdGhpcyBkZWNsYXJhdGlvbiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldAotCSAqICAgICAgICAgZm9yIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGUKLQkgKiAgICAgICAgIHByb3BlcnR5IGhhcyBub3QgYmVlbiBzZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiBhIENTUwotCSAqIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IHdpdGhpbiB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIGEgc2hvcnRoYW5kCi0JICogcHJvcGVydHkuIFNob3J0aGFuZCBwcm9wZXJ0eSB2YWx1ZXMgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYW5kIG1vZGlmaWVkCi0JICogYXMgc3RyaW5ncywgdXNpbmcgdGhlIDxjb2RlPmdldFByb3BlcnR5VmFsdWU8L2NvZGU+IGFuZAotCSAqIDxjb2RlPnNldFByb3BlcnR5PC9jb2RlPiBtZXRob2RzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0Ci0JICogICAgICAgICBmb3IgdGhpcyBkZWNsYXJhdGlvbiBibG9jay4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIHByb3BlcnR5IGhhcyBub3QgYmVlbiBzZXQuCi0JICovCi0JcHVibGljIENTU1ZhbHVlIGdldFByb3BlcnR5Q1NTVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJlbW92ZSBhIENTUyBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCB3aXRoaW4gdGhpcwotCSAqIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0Ci0JICogICAgICAgICBmb3IgdGhpcyBkZWNsYXJhdGlvbiBibG9jay4gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZQotCSAqICAgICAgICAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNldCBvciB0aGUgcHJvcGVydHkgbmFtZSBkb2VzIG5vdAotCSAqICAgICAgICAgY29ycmVzcG9uZCB0byBhIGtub3duIENTUyBwcm9wZXJ0eS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgZGVjbGFyYXRpb24KLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seSBvciB0aGUgcHJvcGVydHkgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyByZW1vdmVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgcHJpb3JpdHkgb2YgYSBDU1MgcHJvcGVydHkgKGUuZy4gdGhlCi0JICogPGNvZGU+ImltcG9ydGFudCI8L2NvZGU+IHF1YWxpZmllcikgaWYgdGhlIHByb3BlcnR5IGhhcyBiZWVuCi0JICogZXhwbGljaXRseSBzZXQgaW4gdGhpcyBkZWNsYXJhdGlvbiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJpb3JpdHkgKGUuZy4KLQkgKiAgICAgICAgIDxjb2RlPiJpbXBvcnRhbnQiPC9jb2RlPikgaWYgb25lIGV4aXN0cy4gVGhlIGVtcHR5IHN0cmluZyBpZgotCSAqICAgICAgICAgbm9uZSBleGlzdHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVByaW9yaXR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogVXNlZCB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZSBhbmQgcHJpb3JpdHkgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24KLQkgKiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqIEBwYXJhbSBwcmlvcml0eQotCSAqICAgICAgICAgICAgVGhlIG5ldyBwcmlvcml0eSBvZiB0aGUgcHJvcGVydHkgKGUuZy4KLQkgKiAgICAgICAgICAgIDxjb2RlPiJpbXBvcnRhbnQiPC9jb2RlPikuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBoYXMgYSBzeW50YXgKLQkgKiAgICAgICAgICAgICAgICBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgZGVjbGFyYXRpb24KLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seSBvciB0aGUgcHJvcGVydHkgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgcHJpb3JpdHkpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gZXhwbGljaXRseSBzZXQgaW4gdGhpcwotCSAqIGRlY2xhcmF0aW9uIGJsb2NrLiBUaGUgcmFuZ2Ugb2YgdmFsaWQgaW5kaWNlcyBpcyAwIHRvIGxlbmd0aC0xCi0JICogaW5jbHVzaXZlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgc2V0IGluIHRoaXMKLQkgKiBkZWNsYXJhdGlvbiBibG9jay4gVGhlIG9yZGVyIG9mIHRoZSBwcm9wZXJ0aWVzIHJldHJpZXZlZCB1c2luZyB0aGlzCi0JICogbWV0aG9kIGRvZXMgbm90IGhhdmUgdG8gYmUgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBzZXQuIFRoaXMKLQkgKiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIGFsbCBwcm9wZXJ0aWVzIGluIHRoaXMgZGVjbGFyYXRpb24KLQkgKiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IG9mIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIHJldHJpZXZlLgotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGF0IHRoaXMgb3JkaW5hbCBwb3NpdGlvbi4gVGhlIGVtcHR5Ci0JICogICAgICAgICBzdHJpbmcgaWYgbm8gcHJvcGVydHkgZXhpc3RzIGF0IHRoaXMgcG9zaXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBpdGVtKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBUaGUgQ1NTIHJ1bGUgdGhhdCBjb250YWlucyB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgdGhpcyA8Y29kZT5DU1NTdHlsZURlY2xhcmF0aW9uPC9jb2RlPiBpcyBub3QgYXR0YWNoZWQgdG8gYQotCSAqIDxjb2RlPkNTU1J1bGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGdldFBhcmVudFJ1bGUoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTU3R5bGVSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU1N0eWxlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjI0NjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTU3R5bGVSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sCi0gKiAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAqIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbAotICogUmlnaHRzIFJlc2VydmVkLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQydzIFNvZnR3YXJlCi0gKiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTGljZW5zZS4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZQotICogaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbgotICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4KLSAqIFNlZSBXM0MgTGljZW5zZSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20uY3NzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSA8Y29kZT5DU1NTdHlsZVJ1bGU8L2NvZGU+IGludGVyZmFjZSByZXByZXNlbnRzIGEgc2luZ2xlIHJ1bGUgc2V0IGluIGEKLSAqIENTUyBzdHlsZSBzaGVldC4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU3R5bGVSdWxlIGV4dGVuZHMgQ1NTUnVsZSB7Ci0JLyoqCi0JICogVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlbGVjdG9yIGZvciB0aGUgcnVsZSBzZXQuIFRoZQotCSAqIGltcGxlbWVudGF0aW9uIG1heSBoYXZlIHN0cmlwcGVkIG91dCBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2Ugd2hpbGUKLQkgKiBwYXJzaW5nIHRoZSBzZWxlY3Rvci4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIENTUyBzdHJpbmcgdmFsdWUgaGFzCi0JICogICAgICAgICAgICAgICAgYSBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHJ1bGUgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVGV4dCgpOwotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JUZXh0KFN0cmluZyBzZWxlY3RvclRleHQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGUgZGVjbGFyYXRpb24tYmxvY2sgb2YgdGhpcyBydWxlIHNldC4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRTdHlsZSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NTdHlsZVNoZWV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU1N0eWxlU2hlZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiNTkzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU1N0eWxlU2hlZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwKLSAqIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICogUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsCi0gKiBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVzNDJ3MgU29mdHdhcmUKLSAqIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlCi0gKiBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuCi0gKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLgotICogU2VlIFczQyBMaWNlbnNlIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS5jc3M7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q1NTU3R5bGVTaGVldDwvY29kZT4gaW50ZXJmYWNlIGlzIGEgY29uY3JldGUgaW50ZXJmYWNlIHVzZWQgdG8KLSAqIHJlcHJlc2VudCBhIENTUyBzdHlsZSBzaGVldCBpLmUuLCBhIHN0eWxlIHNoZWV0IHdob3NlIGNvbnRlbnQgdHlwZSBpcwotICogInRleHQvY3NzIi4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU3R5bGVTaGVldCBleHRlbmRzIFN0eWxlU2hlZXQgewotCS8qKgotCSAqIElmIHRoaXMgc3R5bGUgc2hlZXQgY29tZXMgZnJvbSBhbiA8Y29kZT5AaW1wb3J0PC9jb2RlPiBydWxlLCB0aGUgPGNvZGU+b3duZXJSdWxlPC9jb2RlPiBhdHRyaWJ1dGUgd2lsbAotCSAqICAgICAgICAgY29udGFpbiB0aGUgPGNvZGU+Q1NTSW1wb3J0UnVsZTwvY29kZT4uIEluIHRoYXQgY2FzZSwgdGhlCi0JICogICAgICAgICA8Y29kZT5vd25lck5vZGU8L2NvZGU+IGF0dHJpYnV0ZSBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPlN0eWxlU2hlZXQ8L2NvZGU+IGludGVyZmFjZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqICAgICAgICAgSWYgdGhlIHN0eWxlIHNoZWV0IGNvbWVzIGZyb20gYW4gZWxlbWVudCBvciBhIHByb2Nlc3NpbmcKLQkgKiAgICAgICAgIGluc3RydWN0aW9uLCB0aGUgPGNvZGU+b3duZXJSdWxlPC9jb2RlPiBhdHRyaWJ1dGUgd2lsbCBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZSA8Y29kZT5vd25lck5vZGU8L2NvZGU+IGF0dHJpYnV0ZQotCSAqICAgICAgICAgd2lsbCBjb250YWluIHRoZSA8Y29kZT5Ob2RlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBnZXRPd25lclJ1bGUoKTsKLQotCS8qKgotCSAqIFRoZSBsaXN0IG9mIGFsbCBDU1MgcnVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQuIFRoaXMKLQkgKiBpbmNsdWRlcyBib3RoIHJ1bGUgc2V0cyBhbmQgYXQtcnVsZXMuCi0JICovCi0JcHVibGljIENTU1J1bGVMaXN0IGdldENzc1J1bGVzKCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGluc2VydCBhIG5ldyBydWxlIGludG8gdGhlIHN0eWxlIHNoZWV0LiBUaGUgbmV3IHJ1bGUgbm93Ci0JICogYmVjb21lcyBwYXJ0IG9mIHRoZSBjYXNjYWRlLgotCSAqIAotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBUaGUgcGFyc2FibGUgdGV4dCByZXByZXNlbnRpbmcgdGhlIHJ1bGUuIEZvciBydWxlIHNldHMgdGhpcwotCSAqICAgICAgICAgICAgY29udGFpbnMgYm90aCB0aGUgc2VsZWN0b3IgYW5kIHRoZSBzdHlsZSBkZWNsYXJhdGlvbi4gRm9yCi0JICogICAgICAgICAgICBhdC1ydWxlcywgdGhpcyBzcGVjaWZpZXMgYm90aCB0aGUgYXQtaWRlbnRpZmllciBhbmQgdGhlIHJ1bGUKLQkgKiAgICAgICAgICAgIGNvbnRlbnQuCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBUaGUgaW5kZXggd2l0aGluIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUgbGlzdCBvZiB0aGUgcnVsZQotCSAqICAgICAgICAgICAgYmVmb3JlIHdoaWNoIHRvIGluc2VydCB0aGUgc3BlY2lmaWVkIHJ1bGUuIElmIHRoZSBzcGVjaWZpZWQKLQkgKiAgICAgICAgICAgIGluZGV4IGlzIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0eWxlIHNoZWV0J3MgcnVsZQotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiwgdGhlIHJ1bGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBzdHlsZQotCSAqICAgICAgICAgICAgc2hlZXQuCi0JICogQHJldHVybiBUaGUgaW5kZXggd2l0aGluIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUgY29sbGVjdGlvbiBvZiB0aGUgbmV3bHkKLQkgKiAgICAgICAgIGluc2VydGVkIHJ1bGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgcnVsZSBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgICAgICBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGUuZy4gaWYgYW4KLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5AaW1wb3J0PC9jb2RlPiBydWxlIGlzIGluc2VydGVkIGFmdGVyIGEgc3RhbmRhcmQgcnVsZSBzZXQgb3Igb3RoZXIKLQkgKiAgICAgICAgIGF0LXJ1bGUuIDxicj4KLQkgKiAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBpcyBub3QgYSB2YWxpZAotCSAqICAgICAgICAgaW5zZXJ0aW9uIHBvaW50LiA8YnI+Ci0JICogICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHN0eWxlIHNoZWV0IGlzCi0JICogICAgICAgICByZWFkb25seS4gPGJyPgotCSAqICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcnVsZSBoYXMgYSBzeW50YXggZXJyb3IgYW5kCi0JICogICAgICAgICBpcyB1bnBhcnNhYmxlLgotCSAqLwotCXB1YmxpYyBpbnQgaW5zZXJ0UnVsZShTdHJpbmcgcnVsZSwgaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCB0byBkZWxldGUgYSBydWxlIGZyb20gdGhlIHN0eWxlIHNoZWV0LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGxpc3Qgb2YgdGhlIHJ1bGUgdG8KLQkgKiAgICAgICAgICAgIHJlbW92ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBkb2VzIG5vdAotCSAqICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gYSBydWxlIGluIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBzdHlsZSBzaGVldAotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJ1bGUoaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NVbmtub3duUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NVbmtub3duUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmUyMGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTVW5rbm93blJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwKLSAqIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICogUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsCi0gKiBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVzNDJ3MgU29mdHdhcmUKLSAqIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlCi0gKiBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuCi0gKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLgotICogU2VlIFczQyBMaWNlbnNlIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS5jc3M7Ci0KLS8qKgotICogVGhlIDxjb2RlPkNTU1Vua25vd25SdWxlPC9jb2RlPiBpbnRlcmZhY2UgcmVwcmVzZW50cyBhbiBhdC1ydWxlIG5vdAotICogc3VwcG9ydGVkIGJ5IHRoaXMgdXNlciBhZ2VudC4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTVW5rbm93blJ1bGUgZXh0ZW5kcyBDU1NSdWxlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU1ZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NTU1ZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYTA0NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q1NTVmFsdWU8L2NvZGU+IGludGVyZmFjZSByZXByZXNlbnRzIGEgc2ltcGxlIG9yIGEgY29tcGxleAotICogdmFsdWUuIEEgPGNvZGU+Q1NTVmFsdWU8L2NvZGU+IG9iamVjdCBvbmx5IG9jY3VycyBpbiBhIGNvbnRleHQgb2YgYSBDU1MKLSAqIHByb3BlcnR5LgotICogPHA+Ci0gKiBTZWUgYWxzbyB0aGUgPGEKLSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVN0eWxlLTIwMDAxMTEzJz5Eb2N1bWVudAotICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgU3R5bGUgU3BlY2lmaWNhdGlvbiA8L2E+LgotICogCi0gKiBAc2luY2UgRE9NIExldmVsIDIKLSAqLwotcHVibGljIGludGVyZmFjZSBDU1NWYWx1ZSB7Ci0JLy8gVW5pdFR5cGVzCi0JLyoqCi0JICogVGhlIHZhbHVlIGlzIGluaGVyaXRlZCBhbmQgdGhlIDxjb2RlPmNzc1RleHQ8L2NvZGU+IGNvbnRhaW5zCi0JICogImluaGVyaXQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NTX0lOSEVSSVQgPSAwOwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhIHByaW1pdGl2ZSB2YWx1ZSBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhlCi0JICogPGNvZGU+Q1NTUHJpbWl0aXZlVmFsdWU8L2NvZGU+IGludGVyZmFjZSBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBvbiB0aGlzIGluc3RhbmNlIG9mIHRoZQotCSAqIDxjb2RlPkNTU1ZhbHVlPC9jb2RlPiBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU1NfUFJJTUlUSVZFX1ZBTFVFID0gMTsKLQkvKioKLQkgKiBUaGUgdmFsdWUgaXMgYSA8Y29kZT5DU1NWYWx1ZTwvY29kZT4gbGlzdCBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhlCi0JICogPGNvZGU+Q1NTVmFsdWVMaXN0PC9jb2RlPiBpbnRlcmZhY2UgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nCi0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgb24gdGhpcyBpbnN0YW5jZSBvZiB0aGUKLQkgKiA8Y29kZT5DU1NWYWx1ZTwvY29kZT4gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NTX1ZBTFVFX0xJU1QgPSAyOwotCS8qKgotCSAqIFRoZSB2YWx1ZSBpcyBhIGN1c3RvbSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTU19DVVNUT00gPSAzOwotCi0JLyoqCi0JICogQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgdmFsdWUuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBDU1Mgc3RyaW5nIHZhbHVlIGhhcwotCSAqICAgICAgICAgICAgICAgIGEgc3ludGF4IGVycm9yIChhY2NvcmRpbmcgdG8gdGhlIGF0dGFjaGVkIHByb3BlcnR5KSBvcgotCSAqICAgICAgICAgICAgICAgIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX01PRElGSUNBVElPTl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIENTUwotCSAqICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSByZXByZXNlbnRzIGEgZGlmZmVyZW50IHR5cGUgb2YgdmFsdWVzIHRoYW4KLQkgKiAgICAgICAgICAgICAgICB0aGUgdmFsdWVzIGFsbG93ZWQgYnkgdGhlIENTUyBwcm9wZXJ0eS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgdmFsdWUgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENzc1RleHQoKTsKLQotCXB1YmxpYyB2b2lkIHNldENzc1RleHQoU3RyaW5nIGNzc1RleHQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBIGNvZGUgZGVmaW5pbmcgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGFzIGRlZmluZWQgYWJvdmUuCi0JICovCi0JcHVibGljIHNob3J0IGdldENzc1ZhbHVlVHlwZSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NWYWx1ZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ1NTVmFsdWVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MTNjYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9DU1NWYWx1ZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwKLSAqIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICogUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsCi0gKiBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVzNDJ3MgU29mdHdhcmUKLSAqIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlCi0gKiBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuCi0gKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLgotICogU2VlIFczQyBMaWNlbnNlIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS5jc3M7Ci0KLS8qKgotICogVGhlIDxjb2RlPkNTU1ZhbHVlTGlzdDwvY29kZT4gaW50ZXJmYWNlIHByb3ZpZGVzIHRoZSBhYnN0cmFjdGlvbiBvZiBhbgotICogb3JkZXJlZCBjb2xsZWN0aW9uIG9mIENTUyB2YWx1ZXMuCi0gKiA8cD4KLSAqIFNvbWUgcHJvcGVydGllcyBhbGxvdyBhbiBlbXB0eSBsaXN0IGludG8gdGhlaXIgc3ludGF4LiBJbiB0aGF0IGNhc2UsIHRoZXNlCi0gKiBwcm9wZXJ0aWVzIHRha2UgdGhlIDxjb2RlPm5vbmU8L2NvZGU+IGlkZW50aWZpZXIuIFNvLCBhbiBlbXB0eSBsaXN0IG1lYW5zCi0gKiB0aGF0IHRoZSBwcm9wZXJ0eSBoYXMgdGhlIHZhbHVlIDxjb2RlPm5vbmU8L2NvZGU+LgotICogPHA+Ci0gKiBUaGUgaXRlbXMgaW4gdGhlIDxjb2RlPkNTU1ZhbHVlTGlzdDwvY29kZT4gYXJlIGFjY2Vzc2libGUgdmlhIGFuIGludGVncmFsCi0gKiBpbmRleCwgc3RhcnRpbmcgZnJvbSAwLgotICogPHA+Ci0gKiBTZWUgYWxzbyB0aGUgPGEKLSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVN0eWxlLTIwMDAxMTEzJz5Eb2N1bWVudAotICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgU3R5bGUgU3BlY2lmaWNhdGlvbiA8L2E+LgotICogCi0gKiBAc2luY2UgRE9NIExldmVsIDIKLSAqLwotcHVibGljIGludGVyZmFjZSBDU1NWYWx1ZUxpc3QgZXh0ZW5kcyBDU1NWYWx1ZSB7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiA8Y29kZT5DU1NWYWx1ZXM8L2NvZGU+IGluIHRoZSBsaXN0LiBUaGUgcmFuZ2Ugb2YgdmFsaWQKLQkgKiB2YWx1ZXMgb2YgdGhlIGluZGljZXMgaXMgPGNvZGU+MDwvY29kZT4gdG8gPGNvZGU+bGVuZ3RoLTE8L2NvZGU+Ci0JICogaW5jbHVzaXZlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIGEgPGNvZGU+Q1NTVmFsdWU8L2NvZGU+IGJ5IG9yZGluYWwgaW5kZXguIFRoZSBvcmRlcgotCSAqIGluIHRoaXMgY29sbGVjdGlvbiByZXByZXNlbnRzIHRoZSBvcmRlciBvZiB0aGUgdmFsdWVzIGluIHRoZSBDU1Mgc3R5bGUKLQkgKiBwcm9wZXJ0eS4gSWYgaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdmFsdWVzIGluCi0JICogdGhlIGxpc3QsIHRoaXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhJbmRleAotCSAqICAgICAgICAgICAgaW50byB0aGUgY29sbGVjdGlvbi4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5DU1NWYWx1ZTwvY29kZT4gYXQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPgotCSAqICAgICAgICAgcG9zaXRpb24gaW4gdGhlIDxjb2RlPkNTU1ZhbHVlTGlzdDwvY29kZT4sIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGlzIG5vdCBhIHZhbGlkIGluZGV4LgotCSAqLwotCXB1YmxpYyBDU1NWYWx1ZSBpdGVtKGludCBpbmRleCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0NvdW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWU4OGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvQ291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q291bnRlcjwvY29kZT4gaW50ZXJmYWNlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGFueSBjb3VudGVyIG9yCi0gKiBjb3VudGVycyBmdW5jdGlvbiB2YWx1ZS4gVGhpcyBpbnRlcmZhY2UgcmVmbGVjdHMgdGhlIHZhbHVlcyBpbiB0aGUKLSAqIHVuZGVybHlpbmcgc3R5bGUgcHJvcGVydHkuCi0gKiA8cD4KLSAqIFNlZSBhbHNvIHRoZSA8YQotICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItU3R5bGUtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBTdHlsZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiAKLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvdW50ZXIgewotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb3VudGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHN0eWxlIG9mIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgc2VwYXJhdG9yIG9mIHRoZSBuZXN0ZWQgY291bnRlcnMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXBhcmF0b3IoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvRE9NSW1wbGVtZW50YXRpb25DU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvRE9NSW1wbGVtZW50YXRpb25DU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiZGY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0RPTUltcGxlbWVudGF0aW9uQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sCi0gKiAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAqIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbAotICogUmlnaHRzIFJlc2VydmVkLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQydzIFNvZnR3YXJlCi0gKiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTGljZW5zZS4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZQotICogaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbgotICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4KLSAqIFNlZSBXM0MgTGljZW5zZSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20uY3NzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyB0aGUgRE9NIHVzZXIgdG8gY3JlYXRlIGEgPGNvZGU+Q1NTU3R5bGVTaGVldDwvY29kZT4KLSAqIG91dHNpZGUgdGhlIGNvbnRleHQgb2YgYSBkb2N1bWVudC4gVGhlcmUgaXMgbm8gd2F5IHRvIGFzc29jaWF0ZSB0aGUgbmV3Ci0gKiA8Y29kZT5DU1NTdHlsZVNoZWV0PC9jb2RlPiB3aXRoIGEgZG9jdW1lbnQgaW4gRE9NIExldmVsIDIuCi0gKiA8cD4KLSAqIFNlZSBhbHNvIHRoZSA8YQotICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItU3R5bGUtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBTdHlsZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiAKLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERPTUltcGxlbWVudGF0aW9uQ1NTIGV4dGVuZHMgRE9NSW1wbGVtZW50YXRpb24gewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q1NTU3R5bGVTaGVldDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgYWR2aXNvcnkgdGl0bGUuIFNlZSBhbHNvIHRoZSBzZWN0aW9uLgotCSAqIEBwYXJhbSBtZWRpYQotCSAqICAgICAgICAgICAgVGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3Ci0JICogICAgICAgICAgICBzdHlsZSBzaGVldC4gU2VlIGFsc28gdGhlIHNlY3Rpb24uCi0JICogQHJldHVybiBBIG5ldyBDU1Mgc3R5bGUgc2hlZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBtZWRpYSBzdHJpbmcgdmFsdWUKLQkgKiAgICAgICAgICAgICAgICBoYXMgYSBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuCi0JICovCi0JcHVibGljIENTU1N0eWxlU2hlZXQgY3JlYXRlQ1NTU3R5bGVTaGVldChTdHJpbmcgdGl0bGUsIFN0cmluZyBtZWRpYSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvRG9jdW1lbnRDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvRG9jdW1lbnRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBkMzQ1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0RvY3VtZW50Q1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sCi0gKiAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAqIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbAotICogUmlnaHRzIFJlc2VydmVkLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQydzIFNvZnR3YXJlCi0gKiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTGljZW5zZS4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZQotICogaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbgotICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4KLSAqIFNlZSBXM0MgTGljZW5zZSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20uY3NzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5Eb2N1bWVudFN0eWxlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBkb2N1bWVudCB3aXRoIGEgQ1NTIHZpZXcuCi0gKiA8cD4KLSAqIFRoZSA8Y29kZT5nZXRPdmVycmlkZVN0eWxlPC9jb2RlPiBtZXRob2QgcHJvdmlkZXMgYSBtZWNoYW5pc20gdGhyb3VnaAotICogd2hpY2ggYSBET00gYXV0aG9yIGNvdWxkIGVmZmVjdCBpbW1lZGlhdGUgY2hhbmdlIHRvIHRoZSBzdHlsZSBvZiBhbiBlbGVtZW50Ci0gKiB3aXRob3V0IG1vZGlmeWluZyB0aGUgZXhwbGljaXRseSBsaW5rZWQgc3R5bGUgc2hlZXRzIG9mIGEgZG9jdW1lbnQgb3IgdGhlCi0gKiBpbmxpbmUgc3R5bGUgb2YgZWxlbWVudHMgaW4gdGhlIHN0eWxlIHNoZWV0cy4gVGhpcyBzdHlsZSBzaGVldCBjb21lcyBhZnRlcgotICogdGhlIGF1dGhvciBzdHlsZSBzaGVldCBpbiB0aGUgY2FzY2FkZSBhbGdvcml0aG0gYW5kIGlzIGNhbGxlZCBvdmVycmlkZQotICogc3R5bGUgc2hlZXQuIFRoZSBvdmVycmlkZSBzdHlsZSBzaGVldCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYXV0aG9yIHN0eWxlCi0gKiBzaGVldHMuIEFuICIhaW1wb3J0YW50IiBkZWNsYXJhdGlvbiBzdGlsbCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYSBub3JtYWwKLSAqIGRlY2xhcmF0aW9uLiBPdmVycmlkZSwgYXV0aG9yLCBhbmQgdXNlciBzdHlsZSBzaGVldHMgYWxsIG1heSBjb250YWluCi0gKiAiIWltcG9ydGFudCIgZGVjbGFyYXRpb25zLiBVc2VyICIhaW1wb3J0YW50IiBydWxlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlcgotICogYm90aCBvdmVycmlkZSBhbmQgYXV0aG9yICIhaW1wb3J0YW50IiBydWxlcywgYW5kIG92ZXJyaWRlICIhaW1wb3J0YW50IgotICogcnVsZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgYXV0aG9yICIhaW1wb3J0YW50IiBydWxlcy4KLSAqIDxwPgotICogVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQgYW4gaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkRvY3VtZW50Q1NTPC9jb2RlPgotICogaW50ZXJmYWNlIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBvbiBhbgotICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPiBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIFNlZSBhbHNvIHRoZSA8YQotICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItU3R5bGUtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBTdHlsZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiAKLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50Q1NTIGV4dGVuZHMgRG9jdW1lbnRTdHlsZSB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgb3ZlcnJpZGUgc3R5bGUgZGVjbGFyYXRpb24gZm9yIGEKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBhbmQgYSBzcGVjaWZpZWQgcHNldWRvLWVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsdAotCSAqICAgICAgICAgICAgVGhlIGVsZW1lbnQgd2hvc2Ugc3R5bGUgaXMgdG8gYmUgbW9kaWZpZWQuIFRoaXMgcGFyYW1ldGVyCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gcHNldWRvRWx0Ci0JICogICAgICAgICAgICBUaGUgcHNldWRvLWVsZW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIFRoZSBvdmVycmlkZSBzdHlsZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRPdmVycmlkZVN0eWxlKEVsZW1lbnQgZWx0LCBTdHJpbmcgcHNldWRvRWx0KTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvRWxlbWVudENTU0lubGluZVN0eWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL0VsZW1lbnRDU1NJbmxpbmVTdHlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTkwZWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvRWxlbWVudENTU0lubGluZVN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sCi0gKiAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAqIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbAotICogUmlnaHRzIFJlc2VydmVkLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQydzIFNvZnR3YXJlCi0gKiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTGljZW5zZS4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZQotICogaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbgotICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4KLSAqIFNlZSBXM0MgTGljZW5zZSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20uY3NzOwotCi0vKioKLSAqIElubGluZSBzdHlsZSBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBlbGVtZW50cyBpcyBleHBvc2VkIHRocm91Z2ggdGhlCi0gKiA8Y29kZT5zdHlsZTwvY29kZT4gYXR0cmlidXRlLiBUaGlzIHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBTVFlMRQotICogYXR0cmlidXRlIGZvciBIVE1MIGVsZW1lbnRzIChvciBlbGVtZW50cyBpbiBvdGhlciBzY2hlbWFzIG9yIERURHMgd2hpY2ggdXNlCi0gKiB0aGUgU1RZTEUgYXR0cmlidXRlIGluIHRoZSBzYW1lIHdheSkuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGFuIGluc3RhbmNlCi0gKiBvZiB0aGUgRWxlbWVudENTU0lubGluZVN0eWxlIGludGVyZmFjZSBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcKLSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIG9uIGFuIGluc3RhbmNlIG9mIHRoZSBFbGVtZW50IGludGVyZmFjZQotICogd2hlbiB0aGUgZWxlbWVudCBzdXBwb3J0cyBpbmxpbmUgQ1NTIHN0eWxlIGluZm9ybWF0aW9ucy4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudENTU0lubGluZVN0eWxlIHsKLQkvKioKLQkgKiBUaGUgc3R5bGUgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL1JHQkNvbG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL1JHQkNvbG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjZmMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9SR0JDb2xvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotLyoqCi0gKiBUaGUgPGNvZGU+UkdCQ29sb3I8L2NvZGU+IGludGVyZmFjZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhbnkgUkdCIGNvbG9yCi0gKiB2YWx1ZS4gVGhpcyBpbnRlcmZhY2UgcmVmbGVjdHMgdGhlIHZhbHVlcyBpbiB0aGUgdW5kZXJseWluZyBzdHlsZSBwcm9wZXJ0eS4KLSAqIEhlbmNlLCBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhlIDxjb2RlPkNTU1ByaW1pdGl2ZVZhbHVlPC9jb2RlPiBvYmplY3RzCi0gKiBtb2RpZnkgdGhlIHN0eWxlIHByb3BlcnR5LgotICogPHA+Ci0gKiBBIHNwZWNpZmllZCBSR0IgY29sb3IgaXMgbm90IGNsaXBwZWQgKGV2ZW4gaWYgdGhlIG51bWJlciBpcyBvdXRzaWRlIHRoZQotICogcmFuZ2UgMC0yNTUgb3IgMCUtMTAwJSkuIEEgY29tcHV0ZWQgUkdCIGNvbG9yIGlzIGNsaXBwZWQgZGVwZW5kaW5nIG9uIHRoZQotICogZGV2aWNlLgotICogPHA+Ci0gKiBFdmVuIGlmIGEgc3R5bGUgc2hlZXQgY2FuIG9ubHkgY29udGFpbiBhbiBpbnRlZ2VyIGZvciBhIGNvbG9yIHZhbHVlLCB0aGUKLSAqIGludGVybmFsIHN0b3JhZ2Ugb2YgdGhpcyBpbnRlZ2VyIGlzIGEgZmxvYXQsIGFuZCB0aGlzIGNhbiBiZSB1c2VkIGFzIGEKLSAqIGZsb2F0IGluIHRoZSBzcGVjaWZpZWQgb3IgdGhlIGNvbXB1dGVkIHN0eWxlLgotICogPHA+Ci0gKiBBIGNvbG9yIHBlcmNlbnRhZ2UgdmFsdWUgY2FuIGFsd2F5cyBiZSBjb252ZXJ0ZWQgdG8gYSBudW1iZXIgYW5kIHZpY2UKLSAqIHZlcnNhLgotICogPHA+Ci0gKiBTZWUgYWxzbyB0aGUgPGEKLSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVN0eWxlLTIwMDAxMTEzJz5Eb2N1bWVudAotICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgU3R5bGUgU3BlY2lmaWNhdGlvbiA8L2E+LgotICogCi0gKiBAc2luY2UgRE9NIExldmVsIDIKLSAqLwotcHVibGljIGludGVyZmFjZSBSR0JDb2xvciB7Ci0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHJlZCB2YWx1ZSBvZiB0aGUgUkdCIGNvbG9yLgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRSZWQoKTsKLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBncmVlbiB2YWx1ZSBvZiB0aGUgUkdCIGNvbG9yLgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRHcmVlbigpOwotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGJsdWUgdmFsdWUgb2YgdGhlIFJHQiBjb2xvci4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0Qmx1ZSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL2Nzcy9SZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL1JlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0NWM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL1JlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwKLSAqIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICogUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsCi0gKiBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVzNDJ3MgU29mdHdhcmUKLSAqIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlCi0gKiBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuCi0gKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLgotICogU2VlIFczQyBMaWNlbnNlIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS5jc3M7Ci0KLS8qKgotICogVGhlIDxjb2RlPlJlY3Q8L2NvZGU+IGludGVyZmFjZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhbnkgcmVjdCB2YWx1ZS4gVGhpcwotICogaW50ZXJmYWNlIHJlZmxlY3RzIHRoZSB2YWx1ZXMgaW4gdGhlIHVuZGVybHlpbmcgc3R5bGUgcHJvcGVydHkuIEhlbmNlLAotICogbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZSA8Y29kZT5DU1NQcmltaXRpdmVWYWx1ZTwvY29kZT4gb2JqZWN0cyBtb2RpZnkKLSAqIHRoZSBzdHlsZSBwcm9wZXJ0eS4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVjdCB7Ci0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHRvcCBvZiB0aGUgcmVjdC4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0VG9wKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgcmlnaHQgb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldFJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgYm90dG9tIG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRCb3R0b20oKTsKLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBsZWZ0IG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRMZWZ0KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vY3NzL1ZpZXdDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvVmlld0NTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjU3MzlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9jc3MvVmlld0NTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLmNzczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20udmlld3MuQWJzdHJhY3RWaWV3OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBDU1Mgdmlldy4gVGhlIDxjb2RlPmdldENvbXB1dGVkU3R5bGU8L2NvZGU+Ci0gKiBtZXRob2QgcHJvdmlkZXMgYSByZWFkIG9ubHkgYWNjZXNzIHRvIHRoZSBjb21wdXRlZCB2YWx1ZXMgb2YgYW4gZWxlbWVudC4KLSAqIDxwPgotICogVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQgYW4gaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPlZpZXdDU1M8L2NvZGU+IGludGVyZmFjZQotICogY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIG9uIGFuIGluc3RhbmNlIG9mCi0gKiB0aGUgPGNvZGU+QWJzdHJhY3RWaWV3PC9jb2RlPiBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIFNpbmNlIGEgY29tcHV0ZWQgc3R5bGUgaXMgcmVsYXRlZCB0byBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPiBub2RlLCBpZgotICogdGhpcyBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQsIHRoZSBhc3NvY2lhdGVkCi0gKiA8Y29kZT5DU1NTdHlsZURlY2xhcmF0aW9uPC9jb2RlPiBhbmQgPGNvZGU+Q1NTVmFsdWU8L2NvZGU+IHJlbGF0ZWQgdG8KLSAqIHRoaXMgZGVjbGFyYXRpb24gYXJlIG5vIGxvbmdlciB2YWxpZC4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlld0NTUyBleHRlbmRzIEFic3RyYWN0VmlldyB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIGNvbXB1dGVkIHN0eWxlIGFzIGl0IGlzIGRlZmluZWQgaW4gLgotCSAqIAotCSAqIEBwYXJhbSBlbHQKLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IHdob3NlIHN0eWxlIGlzIHRvIGJlIGNvbXB1dGVkLiBUaGlzIHBhcmFtZXRlcgotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuCi0JICogQHBhcmFtIHBzZXVkb0VsdAotCSAqICAgICAgICAgICAgVGhlIHBzZXVkby1lbGVtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogQHJldHVybiBUaGUgY29tcHV0ZWQgc3R5bGUuIFRoZSA8Y29kZT5DU1NTdHlsZURlY2xhcmF0aW9uPC9jb2RlPiBpcwotCSAqICAgICAgICAgcmVhZC1vbmx5IGFuZCBjb250YWlucyBvbmx5IGFic29sdXRlIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRDb21wdXRlZFN0eWxlKEVsZW1lbnQgZWx0LCBTdHJpbmcgcHNldWRvRWx0KTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9zdHlsZXNoZWV0cy9Eb2N1bWVudFN0eWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vc3R5bGVzaGVldHMvRG9jdW1lbnRTdHlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2MwNGQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9zdHlsZXNoZWV0cy9Eb2N1bWVudFN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sCi0gKiAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAqIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbAotICogUmlnaHRzIFJlc2VydmVkLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQydzIFNvZnR3YXJlCi0gKiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTGljZW5zZS4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZQotICogaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbgotICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4KLSAqIFNlZSBXM0MgTGljZW5zZSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20uc3R5bGVzaGVldHM7Ci0KLS8qKgotICogVGhlIDxjb2RlPkRvY3VtZW50U3R5bGU8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyBhIG1lY2hhbmlzbSBieSB3aGljaAotICogdGhlIHN0eWxlIHNoZWV0cyBlbWJlZGRlZCBpbiBhIGRvY3VtZW50IGNhbiBiZSByZXRyaWV2ZWQuIFRoZSBleHBlY3RhdGlvbgotICogaXMgdGhhdCBhbiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+RG9jdW1lbnRTdHlsZTwvY29kZT4gaW50ZXJmYWNlIGNhbiBiZQotICogb2J0YWluZWQgYnkgdXNpbmcgYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgb24gYW4gaW5zdGFuY2Ugb2YgdGhlCi0gKiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gaW50ZXJmYWNlLgotICogPHA+Ci0gKiBTZWUgYWxzbyB0aGUgPGEKLSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVN0eWxlLTIwMDAxMTEzJz5Eb2N1bWVudAotICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgU3R5bGUgU3BlY2lmaWNhdGlvbiA8L2E+LgotICogCi0gKiBAc2luY2UgRE9NIExldmVsIDIKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFN0eWxlIHsKLQkvKioKLQkgKiBBIGxpc3QgY29udGFpbmluZyBhbGwgdGhlIHN0eWxlIHNoZWV0cyBleHBsaWNpdGx5IGxpbmtlZCBpbnRvIG9yCi0JICogZW1iZWRkZWQgaW4gYSBkb2N1bWVudC4gRm9yIEhUTUwgZG9jdW1lbnRzLCB0aGlzIGluY2x1ZGVzIGV4dGVybmFsCi0JICogc3R5bGUgc2hlZXRzLCBpbmNsdWRlZCB2aWEgdGhlIEhUTUwgTElOSyBlbGVtZW50LCBhbmQgaW5saW5lIFNUWUxFCi0JICogZWxlbWVudHMuIEluIFhNTCwgdGhpcyBpbmNsdWRlcyBleHRlcm5hbCBzdHlsZSBzaGVldHMsIGluY2x1ZGVkIHZpYQotCSAqIHN0eWxlIHNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIChzZWUgKS4KLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldExpc3QgZ2V0U3R5bGVTaGVldHMoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9zdHlsZXNoZWV0cy9MaW5rU3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9zdHlsZXNoZWV0cy9MaW5rU3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxMTE5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vc3R5bGVzaGVldHMvTGlua1N0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sCi0gKiAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAqIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbAotICogUmlnaHRzIFJlc2VydmVkLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQydzIFNvZnR3YXJlCi0gKiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTGljZW5zZS4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZQotICogaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbgotICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4KLSAqIFNlZSBXM0MgTGljZW5zZSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20uc3R5bGVzaGVldHM7Ci0KLS8qKgotICogVGhlIDxjb2RlPkxpbmtTdHlsZTwvY29kZT4gaW50ZXJmYWNlIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIGEKLSAqIHN0eWxlIHNoZWV0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbm9kZSByZXNwb25zaWJsZSBmb3IgbGlua2luZyBpdCBpbnRvCi0gKiBhIGRvY3VtZW50LiBBbiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+TGlua1N0eWxlPC9jb2RlPiBpbnRlcmZhY2UgY2FuIGJlCi0gKiBvYnRhaW5lZCB1c2luZyBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBvbiBhbiBpbnN0YW5jZSBvZiBhIGxpbmtpbmcKLSAqIG5vZGUgKDxjb2RlPkhUTUxMaW5rRWxlbWVudDwvY29kZT4sPGNvZGU+SFRNTFN0eWxlRWxlbWVudDwvY29kZT4gb3IKLSAqIDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4gaW4gRE9NIExldmVsIDIpLgotICogPHA+Ci0gKiBTZWUgYWxzbyB0aGUgPGEKLSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVN0eWxlLTIwMDAxMTEzJz5Eb2N1bWVudAotICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgU3R5bGUgU3BlY2lmaWNhdGlvbiA8L2E+LgotICogCi0gKiBAc2luY2UgRE9NIExldmVsIDIKLSAqLwotcHVibGljIGludGVyZmFjZSBMaW5rU3R5bGUgewotCS8qKgotCSAqIFRoZSBzdHlsZSBzaGVldC4KLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldCBnZXRTaGVldCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL3N0eWxlc2hlZXRzL01lZGlhTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL3N0eWxlc2hlZXRzL01lZGlhTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGYwN2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9zdHlsZXNoZWV0cy9NZWRpYUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwKLSAqIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICogUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsCi0gKiBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVzNDJ3MgU29mdHdhcmUKLSAqIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlCi0gKiBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuCi0gKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLgotICogU2VlIFczQyBMaWNlbnNlIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS5zdHlsZXNoZWV0czsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+TWVkaWFMaXN0PC9jb2RlPiBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIGFic3RyYWN0aW9uIG9mIGFuCi0gKiBvcmRlcmVkIGNvbGxlY3Rpb24gb2YgbWVkaWEsIHdpdGhvdXQgZGVmaW5pbmcgb3IgY29uc3RyYWluaW5nIGhvdyB0aGlzCi0gKiBjb2xsZWN0aW9uIGlzIGltcGxlbWVudGVkLiBBbiBlbXB0eSBsaXN0IGlzIHRoZSBzYW1lIGFzIGEgbGlzdCB0aGF0Ci0gKiBjb250YWlucyB0aGUgbWVkaXVtIDxjb2RlPiJhbGwiPC9jb2RlPi4KLSAqIDxwPgotICogVGhlIGl0ZW1zIGluIHRoZSA8Y29kZT5NZWRpYUxpc3Q8L2NvZGU+IGFyZSBhY2Nlc3NpYmxlIHZpYSBhbiBpbnRlZ3JhbAotICogaW5kZXgsIHN0YXJ0aW5nIGZyb20gMC4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVkaWFMaXN0IHsKLQkvKioKLQkgKiBUaGUgcGFyc2FibGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgbGlzdC4gVGhpcyBpcyBhCi0JICogY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgdmFsdWUgaGFzIGEKLQkgKiAgICAgICAgICAgICAgICBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG1lZGlhIGxpc3QKLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lZGlhVGV4dCgpOwotCi0JcHVibGljIHZvaWQgc2V0TWVkaWFUZXh0KFN0cmluZyBtZWRpYVRleHQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIG1lZGlhIGluIHRoZSBsaXN0LiBUaGUgcmFuZ2Ugb2YgdmFsaWQgbWVkaWEgaXMKLQkgKiA8Y29kZT4wPC9jb2RlPiB0byA8Y29kZT5sZW5ndGgtMTwvY29kZT4gaW5jbHVzaXZlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gdGggaW4gdGhlIGxpc3QuIElmIDxjb2RlPmluZGV4PC9jb2RlPgotCSAqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIG1lZGlhIGluIHRoZSBsaXN0LCB0aGlzCi0JICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IGludG8gdGhlIGNvbGxlY3Rpb24uCi0JICogQHJldHVybiBUaGUgbWVkaXVtIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gdGggcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5NZWRpYUxpc3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGlzCi0JICogICAgICAgICBub3QgYSB2YWxpZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGl0ZW0oaW50IGluZGV4KTsKLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIG1lZGl1bSBpbmRpY2F0ZWQgYnkgPGNvZGU+b2xkTWVkaXVtPC9jb2RlPiBmcm9tIHRoZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBvbGRNZWRpdW1UaGUKLQkgKiAgICAgICAgICAgIG1lZGl1bSB0byBkZWxldGUgaW4gdGhlIG1lZGlhIGxpc3QuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGxpc3QgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PVF9GT1VORF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5vbGRNZWRpdW08L2NvZGU+IGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZU1lZGl1bShTdHJpbmcgb2xkTWVkaXVtKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQWRkcyB0aGUgbWVkaXVtIDxjb2RlPm5ld01lZGl1bTwvY29kZT4gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gSWYgdGhlCi0JICogPGNvZGU+bmV3TWVkaXVtPC9jb2RlPiBpcyBhbHJlYWR5IHVzZWQsIGl0IGlzIGZpcnN0IHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIG5ld01lZGl1bVRoZQotCSAqICAgICAgICAgICAgbmV3IG1lZGl1bSB0byBhZGQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IElmIHRoZSBtZWRpdW0gY29udGFpbnMgY2hhcmFjdGVycwotCSAqICAgICAgICAgICAgICAgIHRoYXQgYXJlIGludmFsaWQgaW4gdGhlIHVuZGVybHlpbmcgc3R5bGUgbGFuZ3VhZ2UuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGxpc3QgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRNZWRpdW0oU3RyaW5nIG5ld01lZGl1bSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9zdHlsZXNoZWV0cy9TdHlsZVNoZWV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vc3R5bGVzaGVldHMvU3R5bGVTaGVldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2NlYTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS9zdHlsZXNoZWV0cy9TdHlsZVNoZWV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGUgPGNvZGU+U3R5bGVTaGVldDwvY29kZT4gaW50ZXJmYWNlIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGludGVyZmFjZSBmb3IKLSAqIGFueSB0eXBlIG9mIHN0eWxlIHNoZWV0LiBJdCByZXByZXNlbnRzIGEgc2luZ2xlIHN0eWxlIHNoZWV0IGFzc29jaWF0ZWQgd2l0aAotICogYSBzdHJ1Y3R1cmVkIGRvY3VtZW50LiBJbiBIVE1MLCB0aGUgU3R5bGVTaGVldCBpbnRlcmZhY2UgcmVwcmVzZW50cyBlaXRoZXIKLSAqIGFuIGV4dGVybmFsIHN0eWxlIHNoZWV0LCBpbmNsdWRlZCB2aWEgdGhlIEhUTUwgTElOSyBlbGVtZW50LCBvciBhbiBpbmxpbmUKLSAqIFNUWUxFIGVsZW1lbnQuIEluIFhNTCwgdGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhbiBleHRlcm5hbCBzdHlsZSBzaGVldCwKLSAqIGluY2x1ZGVkIHZpYSBhIHN0eWxlIHNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0gKiA8cD4KLSAqIFNlZSBhbHNvIHRoZSA8YQotICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItU3R5bGUtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBTdHlsZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiAKLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0eWxlU2hlZXQgewotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIHRoZSBzdHlsZSBzaGVldCBsYW5ndWFnZSBmb3IgdGhpcyBzdHlsZSBzaGVldC4gVGhlIHN0eWxlCi0JICogc2hlZXQgbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkIGFzIGEgY29udGVudCB0eXBlIChlLmcuICJ0ZXh0L2NzcyIpLiBUaGUKLQkgKiBjb250ZW50IHR5cGUgaXMgb2Z0ZW4gc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5vd25lck5vZGU8L2NvZGU+LiBBbHNvCi0JICogc2VlIHRoZSB0eXBlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUgPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudAotCSAqIGluIEhUTUwgNC4wLCBhbmQgdGhlIHR5cGUgcHNldWRvLWF0dHJpYnV0ZSBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldAotCSAqIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHN0eWxlIHNoZWV0IGlzIGFwcGxpZWQgdG8gdGhlIGRvY3VtZW50LgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIG5vdC4gTW9kaWZ5aW5nIHRoaXMgYXR0cmlidXRlIG1heSBjYXVzZSBhCi0JICogbmV3IHJlc29sdXRpb24gb2Ygc3R5bGUgZm9yIHRoZSBkb2N1bWVudC4gQSBzdHlsZXNoZWV0IG9ubHkgYXBwbGllcyBpZgotCSAqIGJvdGggYW4gYXBwcm9wcmlhdGUgbWVkaXVtIGRlZmluaXRpb24gaXMgcHJlc2VudCBhbmQgdGhlIGRpc2FibGVkCi0JICogYXR0cmlidXRlIGlzIGZhbHNlLiBTbywgaWYgdGhlIG1lZGlhIGRvZXNuJ3QgYXBwbHkgdG8gdGhlIGN1cnJlbnQgdXNlcgotCSAqIGFnZW50LCB0aGUgPGNvZGU+ZGlzYWJsZWQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc2FibGVkKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlZChib29sZWFuIGRpc2FibGVkKTsKLQotCS8qKgotCSAqIFRoZSBub2RlIHRoYXQgYXNzb2NpYXRlcyB0aGlzIHN0eWxlIHNoZWV0IHdpdGggdGhlIGRvY3VtZW50LiBGb3IgSFRNTCwKLQkgKiB0aGlzIG1heSBiZSB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5MSU5LPC9jb2RlPiBvciA8Y29kZT5TVFlMRTwvY29kZT4KLQkgKiBlbGVtZW50LiBGb3IgWE1MLCBpdCBtYXkgYmUgdGhlIGxpbmtpbmcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gRm9yCi0JICogc3R5bGUgc2hlZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IG90aGVyIHN0eWxlIHNoZWV0cywgdGhlIHZhbHVlIG9mIHRoaXMKLQkgKiBhdHRyaWJ1dGUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIE5vZGUgZ2V0T3duZXJOb2RlKCk7Ci0KLQkvKioKLQkgKiBGb3Igc3R5bGUgc2hlZXQgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCB0aGUgY29uY2VwdCBvZiBzdHlsZSBzaGVldAotCSAqIGluY2x1c2lvbiwgdGhpcyBhdHRyaWJ1dGUgcmVwcmVzZW50cyB0aGUgaW5jbHVkaW5nIHN0eWxlIHNoZWV0LCBpZiBvbmUKLQkgKiBleGlzdHMuIElmIHRoZSBzdHlsZSBzaGVldCBpcyBhIHRvcC1sZXZlbCBzdHlsZSBzaGVldCwgb3IgdGhlIHN0eWxlCi0JICogc2hlZXQgbGFuZ3VhZ2UgZG9lcyBub3Qgc3VwcG9ydCBpbmNsdXNpb24sIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZQotCSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGdldFBhcmVudFN0eWxlU2hlZXQoKTsKLQotCS8qKgotCSAqIElmIHRoZSBzdHlsZSBzaGVldCBpcyBhIGxpbmtlZCBzdHlsZSBzaGVldCwgdGhlIHZhbHVlIG9mIGl0cyBhdHRyaWJ1dGUKLQkgKiBpcyBpdHMgbG9jYXRpb24uIEZvciBpbmxpbmUgc3R5bGUgc2hlZXRzLCB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUKLQkgKiBpcyA8Y29kZT5udWxsPC9jb2RlPi4gU2VlIHRoZSBocmVmIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUKLQkgKiA8Y29kZT5MSU5LPC9jb2RlPiBlbGVtZW50IGluIEhUTUwgNC4wLCBhbmQgdGhlIGhyZWYgcHNldWRvLWF0dHJpYnV0ZQotCSAqIGZvciB0aGUgWE1MIHN0eWxlIHNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCk7Ci0KLQkvKioKLQkgKiBUaGUgYWR2aXNvcnkgdGl0bGUuIFRoZSB0aXRsZSBpcyBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlCi0JICogPGNvZGU+b3duZXJOb2RlPC9jb2RlPi4gU2VlIHRoZSB0aXRsZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlCi0JICogPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudCBpbiBIVE1MIDQuMCwgYW5kIHRoZSB0aXRsZSBwc2V1ZG8tYXR0cmlidXRlCi0JICogZm9yIHRoZSBYTUwgc3R5bGUgc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCk7Ci0KLQkvKioKLQkgKiBUaGUgaW50ZW5kZWQgZGVzdGluYXRpb24gbWVkaWEgZm9yIHN0eWxlIGluZm9ybWF0aW9uLiBUaGUgbWVkaWEgaXMKLQkgKiBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPm93bmVyTm9kZTwvY29kZT4uIElmIG5vIG1lZGlhIGhhcyBiZWVuCi0JICogc3BlY2lmaWVkLCB0aGUgPGNvZGU+TWVkaWFMaXN0PC9jb2RlPiB3aWxsIGJlIGVtcHR5LiBTZWUgdGhlIG1lZGlhCi0JICogYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZSA8Y29kZT5MSU5LPC9jb2RlPiBlbGVtZW50IGluIEhUTUwgNC4wLAotCSAqIGFuZCB0aGUgbWVkaWEgcHNldWRvLWF0dHJpYnV0ZSBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldCBwcm9jZXNzaW5nCi0JICogaW5zdHJ1Y3Rpb24gLiBNb2RpZnlpbmcgdGhlIG1lZGlhIGxpc3QgbWF5IGNhdXNlIGEgY2hhbmdlIHRvIHRoZQotCSAqIGF0dHJpYnV0ZSA8Y29kZT5kaXNhYmxlZDwvY29kZT4uCi0JICovCi0JcHVibGljIE1lZGlhTGlzdCBnZXRNZWRpYSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL3N0eWxlc2hlZXRzL1N0eWxlU2hlZXRMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vc3R5bGVzaGVldHMvU3R5bGVTaGVldExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5MWRlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vc3R5bGVzaGVldHMvU3R5bGVTaGVldExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwKLSAqIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICogUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsCi0gKiBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVzNDJ3MgU29mdHdhcmUKLSAqIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlCi0gKiBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuCi0gKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLgotICogU2VlIFczQyBMaWNlbnNlIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS5zdHlsZXNoZWV0czsKLQotLyoqCi0gKiBUaGUgPGNvZGU+U3R5bGVTaGVldExpc3Q8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyB0aGUgYWJzdHJhY3Rpb24gb2YgYW4KLSAqIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBzdHlsZSBzaGVldHMuCi0gKiA8cD4KLSAqIFRoZSBpdGVtcyBpbiB0aGUgPGNvZGU+U3R5bGVTaGVldExpc3Q8L2NvZGU+IGFyZSBhY2Nlc3NpYmxlIHZpYSBhbgotICogaW50ZWdyYWwgaW5kZXgsIHN0YXJ0aW5nIGZyb20gMC4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1TdHlsZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFN0eWxlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3R5bGVTaGVldExpc3QgewotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgPGNvZGU+U3R5bGVTaGVldHM8L2NvZGU+IGluIHRoZSBsaXN0LiBUaGUgcmFuZ2Ugb2YKLQkgKiB2YWxpZCBjaGlsZCBzdHlsZXNoZWV0IGluZGljZXMgaXMgPGNvZGU+MDwvY29kZT4gdG8KLQkgKiA8Y29kZT5sZW5ndGgtMTwvY29kZT4gaW5jbHVzaXZlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIGEgc3R5bGUgc2hlZXQgYnkgb3JkaW5hbCBpbmRleC4gSWYgaW5kZXggaXMgZ3JlYXRlcgotCSAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBzdHlsZSBzaGVldHMgaW4gdGhlIGxpc3QsIHRoaXMgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleEluZGV4Ci0JICogICAgICAgICAgICBpbnRvIHRoZSBjb2xsZWN0aW9uCi0JICogQHJldHVybiBUaGUgc3R5bGUgc2hlZXQgYXQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBwb3NpdGlvbiBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPlN0eWxlU2hlZXRMaXN0PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhhdAotCSAqICAgICAgICAgaXMgbm90IGEgdmFsaWQgaW5kZXguCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgaXRlbShpbnQgaW5kZXgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL3ZpZXdzL0Fic3RyYWN0Vmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL3ZpZXdzL0Fic3RyYWN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTljZTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvdzNjL2RvbS92aWV3cy9BYnN0cmFjdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwKLSAqIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICogUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsCi0gKiBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVzNDJ3MgU29mdHdhcmUKLSAqIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlCi0gKiBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuCi0gKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLgotICogU2VlIFczQyBMaWNlbnNlIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS52aWV3czsKLQotLyoqCi0gKiBBIGJhc2UgaW50ZXJmYWNlIHRoYXQgYWxsIHZpZXdzIHNoYWxsIGRlcml2ZSBmcm9tLgotICogPHA+Ci0gKiBTZWUgYWxzbyB0aGUgPGEKLSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVZpZXdzLTIwMDAxMTEzJz5Eb2N1bWVudAotICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgVmlld3MgU3BlY2lmaWNhdGlvbiA8L2E+LgotICogCi0gKiBAc2luY2UgRE9NIExldmVsIDIKLSAqLwotcHVibGljIGludGVyZmFjZSBBYnN0cmFjdFZpZXcgewotCS8qKgotCSAqIFRoZSBzb3VyY2UgPGNvZGU+RG9jdW1lbnRWaWV3PC9jb2RlPiBvZiB3aGljaCB0aGlzIGlzIGFuCi0JICogPGNvZGU+QWJzdHJhY3RWaWV3PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRWaWV3IGdldERvY3VtZW50KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vdmlld3MvRG9jdW1lbnRWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL3czYy9kb20vdmlld3MvRG9jdW1lbnRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNjNmN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy93M2MvZG9tL3ZpZXdzL0RvY3VtZW50Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLnZpZXdzOwotCi0vKioKLSAqIFRoZSA8Y29kZT5Eb2N1bWVudFZpZXc8L2NvZGU+IGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieQotICogPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdHMgaW4gRE9NIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0aW5nIERPTQotICogVmlld3MuIEl0IHByb3ZpZGVzIGFuIGF0dHJpYnV0ZSB0byByZXRyaWV2ZSB0aGUgZGVmYXVsdCB2aWV3IG9mIGEgZG9jdW1lbnQuCi0gKiA8cD4KLSAqIFNlZSBhbHNvIHRoZSA8YQotICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItVmlld3MtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBWaWV3cyBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiAKLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50VmlldyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgPGNvZGU+QWJzdHJhY3RWaWV3PC9jb2RlPiBmb3IgdGhpcyA8Y29kZT5Eb2N1bWVudDwvY29kZT4sCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIEFic3RyYWN0VmlldyBnZXREZWZhdWx0VmlldygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1NGZkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWR0ZG1vZGVsLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyNDllNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MzFkNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotI1dlZCBKYW4gMTIgMTY6MTI6MjQgRVNUIDIwMDUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4YjdjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1RodSBEZWMgMTYgMDc6NDA6NTggRVNUIDIwMDQNCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MA0KLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTANCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MA0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MA0KLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTANCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL1JFQURNRS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjcxZTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIHBsdWdpbiBleHRlbmRzIHRoZSBjb3JlIG1vZGVsIHRvIGltcGxlbWVudCBhIGR0ZCBzcGVjaWZpYyBtb2RlbC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2N2FiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIGR0ZC5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KLXNvdXJjZS5kdGRtb2RlbC5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlZTUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hbnkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDE3ZDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYjdiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9saXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTVlYjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzJjY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0ODg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9yZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDlhY2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9yZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzhlNjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW1wdHljb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5MTg4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwYjI2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWMxMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjJjYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfbm90LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA5NjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl91bnJlYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZDgyZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2F0dGxpc3Rfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2F0dGxpc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0OWM3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9hdHRsaXN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfY29tbWVudHNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmMDk0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9nZW5odG1mb3JtX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2dlbmh0bWZvcm1fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1NDcwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2dlbmh0bWZvcm1fd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvbmV3ZHRkX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzExNWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvbmV3ZHRkX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTlkZjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRjMjZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzYmEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZWNob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmIzNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVjaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVjaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjM5OGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVzZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWRiMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVzZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZXNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjk2NThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MjJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxjaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbGNob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNGY5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbGNob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsc2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkNTI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsc2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE3YTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi91bnJlY29nbml6ZWRfY29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODk5N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi91bnJlY29nbml6ZWRfY29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmNTE0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWMxMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkNGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVzZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZhNzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBQcm9wZXJ0aWVzIGZpbGUgZm9yIGNvbXBvbmVudDogWE1MIHRvb2xzIFNTRSBEVEQgTW9kZWwKLSEgUGFja2FnZWQgZm9yIHRyYW5zbGF0aW9uIGluOiAgeG1sLnppcAotCi0hcGx1Z2luLnhtbAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIERURCBNb2RlbAotbmxGZWF0dXJlTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBEVEQgTW9kZWwgTkwgU3VwcG9ydAotCi0hIFN0cmluZ3MgZm9yIERUREJhc2ljVHlwZUltcGwgdHlwZSBkZXNjcmlwdGlvbnMKLV9VSV9OT05FX0RFU0M9Tm9uZQotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1I6IERvIG5vdCB0cmFuc2xhdGUgZm9sbG93aW5nIHRleHQgaW4gcGFyZW50aGVzZXMgb24gZm9sbG93aW5nIDEwIGxpbmVzIGkuZS4oQ0RBVEEpCi1fVUlfQ0hBUkFDVEVSX0RBVEFfREVTQz1DaGFyYWN0ZXIgRGF0YSAoQ0RBVEEpCi1fVUlfSURFTlRJRklFUl9ERVNDPUlkZW50aWZpZXIgKElEKQotX1VJX0lEX1JFRkVSRU5DRV9ERVNDPUlEIFJlZmVyZW5jZSAoSURSRUYpCi1fVUlfSURfUkVGRVJFTkNFU19ERVNDPUlEIFJlZmVyZW5jZXMgKElEUkVGUykKLV9VSV9FTlRJVFlfTkFNRV9ERVNDPUVudGl0eSBOYW1lIChFTlRJVFkpCi1fVUlfRU5USVRZX05BTUVTX0RFU0M9RW50aXR5IE5hbWVzIChFTlRJVElFUykKLV9VSV9OQU1FX1RPS0VOX0RFU0M9TmFtZSBUb2tlbiAoTk1UT0tFTikKLV9VSV9OQU1FX1RPS0VOU19ERVNDPU5hbWUgVG9rZW5zIChOTVRPS0VOUykKLV9VSV9FTlVNX05BTUVfVE9LRU5TX0RFU0M9RW51bWVyYXRlZCBOYW1lIFRva2VucwotX1VJX0VOVU1fTk9UQVRJT05fREVTQz1FbnVtZXJhdGVkIE5PVEFUSU9OCi0KLSFkdGQvdXRpbC9DcmVhdGVMaXN0SXRlbXMuamF2YQotX1VJX0xBQkVMX05PTkU9KG5vbmUpCi0KLSEgU3RyaW5ncyBmcm9tIHNlZC9tb2RlbAotCi0hIEF0dHJpYnV0ZS5qYXZhCi1fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX1ZBTD1BdHRyaWJ1dGUgRGVmYXVsdCBDaGFuZ2UgVmFsdWUKLV9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfS0lORD1DaGFuZ2UgQXR0cmlidXRlIERlZmF1bHQgVmFsdWUKLV9VSV9MQUJFTF9BVFRSX1RZUEU9Q2hhbmdlIEF0dHJpYnV0ZSBUeXBlCi0KLSEgQXR0cmlidXRlRW51bUxpc3QKLV9VSV9MQUJFTF9BVFRSX0VOVU1fSVRFTVM9Q2hhbmdlIEF0dHJpYnV0ZSBFbnVtZXJhdGlvbiBWYWx1ZQotCi0hIEF0dHJpYnV0ZUxpc3QKLV9VSV9MQUJFTF9BVFRSX0xJU1RfQUREPUFkZCBBdHRyaWJ1dGUKLQotISBDTUdyb3VwTm9kZQotX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0NPTk5FQ1RPUj1DaGFuZ2UgQ29ubmVjdG9yCi1fVUlfTEFCRUxfQ01fR1JQX05PREVfSU5TRVJUX0VMRU1FTlQ9SW5zZXJ0IEVsZW1lbnQKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfR1JQPUFkZCBHcm91cAotX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9DSElMRD1BZGQgQ2hpbGQgRWxlbWVudAotCi0hIENNTm9kZQotX1VJX0xBQkVMX0NNX05PREVfTUlYX0NPTlRFTlQ9TWl4ZWQgQ29udGVudAotX1VJX0xBQkVMX0NNX05PREVfQ0hJTERfQ09OVEVOVD1DaGlsZHJlbiBDb250ZW50Ci1fVUlfTEFCRUxfQ01fTk9ERV9TRVRfTUlYX0NPTlRFTlQ9U2V0IE1peGVkIENvbnRlbnQKLV9VSV9MQUJFTF9DTV9OT0RFX1NFVF9DSElMRF9DT05URU5UPVNldCBDaGlsZHJlbiBDb250ZW50Ci0KLSEhIE5PVEUgVE8gVFJBTlNMQVRPUiAtIFVTQUdFOiAiU2V0IDx2YXJpYWJsZSBjb250ZW50PiBDb250ZW50IgotX1VJX0xBQkVMX0NNX05PREVfU0VUPVNldAotX1VJX0xBQkVMX0NNX05PREVfQ09OVEVOVD1Db250ZW50Ci0KLSEhIE5PVEUgVE8gVFJBTlNMQVRPUiAtIERPIE5PVCBUUkFOU0xBVEUgRk9MTE9XSU5HIDMgTElORVMKLV9VSV9MQUJFTF9DTV9OT0RFX1BDREFUQT0oI1BDREFUQSkKLV9VSV9MQUJFTF9DTV9OT0RFX0FOWT1BTlkKLV9VSV9MQUJFTF9DTV9OT0RFX0VNUFRZPUVNUFRZCi0KLSEgQ01SZXBlYXRhYmxlTm9kZQotX1VJX0xBQkVMX0NNX1JFUF9OT0RFX0NIR19PQ0NVUj1DaGFuZ2UgT2NjdXJyZW5jZQotCi0hIENvbW1lbnQKLV9VSV9MQUJFTF9DT01NRU5UX0NIRz1Db21tZW50IENoYW5nZQotCi0hIERUREZpbGUKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfRUxFTUVOVD1BZGQgRWxlbWVudAotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTlRJVFk9QWRkIEVudGl0eQotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9DT01NRU5UPUFkZCBDb21tZW50Ci1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX1BBUk1fRU5USVRZX1JFRj1BZGQgUGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2UKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfTk9UQVRJT049QWRkIE5vdGF0aW9uCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0FUVFJfTElTVD1BZGQgQXR0cmlidXRlIExpc3QKLV9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEU9RGVsZXRlCi0KLSEgRFRETm9kZQotX1VJX0xBQkVMX0RURF9OT0RFX05BTUVfQ0hHPU5hbWUgQ2hhbmdlCi1fVUlfTEFCRUxfRFREX05PREVfREVMRVRFPURlbGV0ZQotCi0hIEVsZW1lbnQKLV9VSV9MQUJFTF9FTEVNRU5UX0FERF9BVFRSPUFkZCBBdHRyaWJ1dGUKLV9VSV9MQUJFTF9FTEVNRU5UX0FERF9HUlA9QWRkIEdyb3VwCi1fVUlfTEFCRUxfRUxFTUVOVF9BRERfQ0hJTEQ9QWRkIENoaWxkIEVsZW1lbnQKLQotISBFbnRpdHkKLV9VSV9MQUJFTF9FTlRJVFlfU0VUX1BBUk1fRU5USVRZPVNldCBQYXJhbWV0ZXIgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9HRU5FUkFMX0VOVElUWT1TZXQgR2VuZXJhbCBFbnRpdHkKLV9VSV9MQUJFTF9FTlRJVFlfU0VUX0VYVF9FTlRJVFk9U2V0IEV4dGVybmFsIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9TRVRfSU5UX0VOVElUWT1TZXQgSW50ZXJuYWwgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1ZBTFVFX0NIRz1FbnRpdHkgVmFsdWUgQ2hhbmdlCi0KLSEhIE5PVEUgVE8gVFJBTlNMQVRPUiAtIFVTQUdFOiAiTkRBVEEgQ2hhbmdlIgotX1VJX0xBQkVMX0VOVElUWV9OREFUQV9DSEFOR0U9Q2hhbmdlCi0KLSEgRXh0ZXJuYWxOb2RlCi1fVUlfTEFCRUxfRVhUX05PREVfUFVCTElDX0lEX0NIRz1QdWJsaWMgSUQgQ2hhbmdlCi1fVUlfTEFCRUxfRVhUX05PREVfU1lTVEVNX0lEX0NIRz1TeXN0ZW0gSUQgQ2hhbmdlCi0KLSEgTm9kZUxpc3QKLV9VSV9MQUJFTF9OT0RFX0xJU1RfRUxFTUVOVFM9RWxlbWVudHMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfRU5USVRJRVM9RW50aXRpZXMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfTk9UQVRJT05TPU5vdGF0aW9ucwotX1VJX0xBQkVMX05PREVfTElTVF9DT01NRU5UUz1Db21tZW50cwotX1VJX0xBQkVMX05PREVfTElTVF9PVEhFUj1PdGhlcgotX1VJX0xBQkVMX05PREVfTElTVF9BVFRSSUJVVEVTPUF0dHJpYnV0ZXMKLQotISBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKLV9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ0hHX0VOVElUWV9SRUY9Q2hhbmdlIEVudGl0eSBSZWZlcmVuY2UKLV9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ09NTUVOVF9DSEc9Q29tbWVudCBDaGFuZ2UKLQotISBUb3BMZXZlbE5vZGUKLV9VSV9MQUJFTF9UT1BfTEVWRUxfTk9ERV9ERUxFVEU9RGVsZXRlCi0jCi1TdHJ1Y3R1cmVkX0RURF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPVN0cnVjdHVyZWQgRFREIERvY3VtZW50IEZhY3RvcnkgRXh0ZW5zaW9uCi1EVERfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9RFREIENvbnRlbnQgVHlwZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMWI1NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0JaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSIKLQluYW1lPSIlcGx1Z2luTmFtZSIKLQl2ZXJzaW9uPSIxLjAuMCIKLQlwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbiI+Ci0KLQk8cnVudGltZT4KLQkJPGxpYnJhcnkgbmFtZT0iZHRkbW9kZWwuamFyIj4KLQkJCTxleHBvcnQgbmFtZT0iKiIgLz4KLQkJPC9saWJyYXJ5PgotCTwvcnVudGltZT4KLQk8cmVxdWlyZXM+Ci0JCTxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiIC8+Ci0JCTxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIgLz4KLQkJPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiIC8+Ci0JCTxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIgLz4KLQkJPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiIC8+Ci0JCTxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nIiAvPgotCQk8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiAvPgotCQk8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIiAvPgotCQk8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIC8+Ci0JCTxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiIC8+Ci0JCTxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgLz4KLQk8L3JlcXVpcmVzPgotCi0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yRFREIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyZGVsZWdhdGUiCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuYnVpbGRlcmRlbGVnYXRlLnRvZG8iPgotCQk8cGFydGljaXBhbnQKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuYnVpbGRlci5kZWxlZ2F0ZXMuRFREVGFza1RhZ1NlZWtlciIKLQkJCWNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIgotCQkvPgotCTwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzIgotICAgICAgICAgbmFtZT0iJVN0cnVjdHVyZWRfRFREX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIvPgotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iZHRkIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJtb2QiIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImVudCIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQkgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0gICAgICAgICA8Y29udGVudC10eXBlCi0gICAgICAgICAgICAgICBmaWxlLWV4dGVuc2lvbnM9ImR0ZCxtb2QsZW50IgotICAgICAgICAgICAgICAgcHJpb3JpdHk9Im5vcm1hbCIKLSAgICAgICAgICAgICAgIG5hbWU9IiVEVERfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0gICAgICAgICAgICAgICBpZD0iZHRkc291cmNlIgotICAgICAgICAgICAgICAgYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCIKLQkJCSAgIGRlZmF1bHQtY2hhcnNldD0iVVRGLTgiPgotCQkJPGRlc2NyaWJlciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmNvbnRlbnQuQ29udGVudERlc2NyaWJlckZvckRURCIvPgotCQk8L2NvbnRlbnQtdHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCQotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0F0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1NDMzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0F0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gYmFzZSBjbGFzcyBmb3IgYW4gRWxlbWVudCdzIGNvbnRlbnRtb2RlbAotcHVibGljIGNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIERURE5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEEgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTID0gRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9FTlRJVFlfTkFNRVNfREVTQyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9FTlRJVFlfTkFNRV9ERVNDIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNRVJBVEVEX05BTUUgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0VOVU1fTkFNRV9UT0tFTlNfREVTQyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTUVSQVRFRF9OT1RBVElPTiA9IERURENvcmVQbHVnaW4uZ2V0RFREU3RyaW5nKCJfVUlfRU5VTV9OT1RBVElPTl9ERVNDIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSVhFRCA9ICIjRklYRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0lERU5USUZJRVJfREVTQyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUYgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0lEX1JFRkVSRU5DRV9ERVNDIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRlMgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0lEX1JFRkVSRU5DRVNfREVTQyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMSUVEID0gIiNJTVBMSUVEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU4gPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX05BTUVfVE9LRU5fREVTQyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlMgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX05BTUVfVE9LRU5TX0RFU0MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEID0gIiNSRVFVSVJFRCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgSGFzaHRhYmxlIHR5cGVIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB0eXBlcyA9IHtDREFUQSwgSUQsIElEUkVGLCBJRFJFRlMsIEVOVElUWSwgRU5USVRJRVMsIE5NVE9LRU4sIE5NVE9LRU5TLCBFTlVNRVJBVEVEX05BTUUsIEVOVU1FUkFURURfTk9UQVRJT059OwotCi0JewotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCwgQ0RBVEEpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCwgSUQpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCwgSURSRUYpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQsIElEUkVGUyk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCwgRU5USVRZKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQsIEVOVElUSUVTKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLk5NVE9LRU5fS0VZV09SRCwgTk1UT0tFTik7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JELCBOTVRPS0VOUyk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JELCBFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJLy8gdGhpcyBvbmUncyBhIHNwZWNpYWwgY2FzZSBzaW5jZSB0aGVyZSBpcyBubyBrZXl3b3JkIGZvcgotCQkvLyBlbnVtZXJhdGVkIG5hbWUgdG9rZW5zCi0JCXR5cGVIYXNoLnB1dCgiKCkiLCBFTlVNRVJBVEVEX05BTUUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbm93IHB1dCB0aGUgcmV2ZXJzZSBpbiBwbGFjZS4gVGhpcyBnaXZlcyB1cyBhIDIgd2F5IGxvb2t1cAotCQkvLyBmb3Igd2hlbiB3ZSB3YW50IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhbmQgd2hlbiB3ZSB3YW50IHRvIHNldCBpdAotCQl0eXBlSGFzaC5wdXQoQ0RBVEEsICJDREFUQSIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChJRCwgIklEIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KElEUkVGLCAiSURSRUYiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoSURSRUZTLCAiSURSRUZTIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KEVOVElUWSwgIkVOVElUWSIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlRJVElFUywgIkVOVElUSUVTIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KE5NVE9LRU4sICJOTVRPS0VOIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KE5NVE9LRU5TLCAiTk1UT0tFTlMiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoRU5VTUVSQVRFRF9OQU1FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KEVOVU1FUkFURURfTk9UQVRJT04sICJOT1RBVElPTiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBBdHRyaWJ1dGVFbnVtTGlzdCBlbnVtTGlzdCA9IG51bGw7Ci0KLQkvLyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElFRCA9ICJJTVBMSUVEIjsKLQotCXB1YmxpYyBBdHRyaWJ1dGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLaW5kKCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChkZWZhdWx0S2luZFJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RGVmYXVsdEtpbmRSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0VmFsdWUgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUVudW1MaXN0IGdldEVudW1MaXN0KCkgewotCQlyZXR1cm4gZW51bUxpc3Q7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkFUVFJJQlVURUlDT04pOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRRdW90ZWRMaXRlcmFsKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldE9mZnNldEFmdGVyVHlwZSgpIHsKLQkJSVRleHRSZWdpb24gdHlwZVJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQotCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUoKTsKLQkJYm9vbGVhbiBpc0VudW1lcmF0aW9uID0gdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSB8fCB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJaWYgKGlzRW51bWVyYXRpb24pIHsKLQkJCS8vIG5vdyBjaGVjayBpZiBtYXliZSB0aGlzIGlzIGFuIGVudW1lcmF0aW9uCi0JCQlpZiAoZ2V0RW51bUxpc3QoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldEVudW1MaXN0KCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHR5cGVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCh0eXBlUmVnaW9uKTsKLQkJfSBlbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJLy8gICAgICAgIC8vIGNyZWF0ZSBvbmUKLQkJCS8vICAgICAgICB0eXBlUmVnaW9uID0KLQkJCS8vIGZpbmRPckNyZWF0ZVR5cGVSZWdpb24oKFN0cmluZyl0eXBlSGFzaC5nZXQoQ0RBVEEpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0VHlwZVJlZ2lvbigpOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gKFN0cmluZykgdHlwZUhhc2guZ2V0KHJlZ2lvbi5nZXRUeXBlKCkpOwotCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCS8vIGp1c3QgcmV0dXJuIHRoZSB0ZXh0IG9mIHRoZSB0eXBlIHJlZ2lvbiBzaW5jZSB0aGlzIG1heSBiZQotCQkJCS8vIGFuIGVudGl0eSByZXByZXNlbnRpbmcgdGhlIHR5cGU7Ci0JCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJCXJldHVybiB0eXBlOwotCQl9IGVsc2UgaWYgKGdldEVudW1MaXN0KCkgIT0gbnVsbCkgewotCQkJLy8gZW51bWVyYXRlZCBuYW1lIHRva2VucyBkb24ndCBoYXZlIGEgdHlwZSBrZXl3b3JkLiBqdXN0Ci0JCQkvLyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBsZWZ0IHBhcmVuIGlzIGVub3VnaAotCQkJcmV0dXJuIChTdHJpbmcpIHR5cGVIYXNoLmdldCgiKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFR5cGVSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JRFJFRlNfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5NVE9LRU5fS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUEFSTV9FTlRJVFlfVFlQRSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUuZXF1YWxzKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKSB8fCB0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVnaW9ucygpIHsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikpIHsKLQkJCQllbnVtTGlzdCA9IG5ldyBBdHRyaWJ1dGVFbnVtTGlzdChnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCX0KLQkJCWlmIChlbnVtTGlzdCAhPSBudWxsKSB7Ci0JCQkJZW51bUxpc3QuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTikgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0S2luZChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcga2luZCkgewotCi0JCUlUZXh0UmVnaW9uIGRlZmF1bHRLaW5kUmVnaW9uID0gZ2V0RGVmYXVsdEtpbmRSZWdpb24oKTsKLQkJU3RyaW5nIG9sZERlZmF1bHRLaW5kID0gZGVmYXVsdEtpbmRSZWdpb24gPT0gbnVsbCA/ICIiIDogZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChkZWZhdWx0S2luZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFraW5kLmVxdWFscyhvbGREZWZhdWx0S2luZCkpIHsKLQkJCVN0cmluZyBuZXdUZXh0ID0ga2luZDsKLQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChkZWZhdWx0S2luZFJlZ2lvbik7Ci0JCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKSAtIHN0YXJ0T2Zmc2V0OwotCQkJfSBlbHNlIHsKLQkJCQlzdGFydE9mZnNldCA9IGdldE9mZnNldEFmdGVyVHlwZSgpOwotCQkJCW5ld1RleHQgPSAiICIgKyBuZXdUZXh0OyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUlUZXh0UmVnaW9uIGRlZmF1bHRWYWx1ZSA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXJhdG9yKCkpOwotCi0JCQlpZiAoa2luZC5lcXVhbHMoQXR0cmlidXRlLkZJWEVEKSB8fCBraW5kLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgewotCQkJCQkvLyB3ZSBhcmUgY2hhbmdpbmcgdG8gZml4ZWQgYW5kIHdlaGF2ZSBubyBxdW90ZWQgcmVnaW9uLgotCQkJCQkvLyBwdXQgaW4gYW4gZW1wdHkgdmFsdWUKLQkJCQkJbmV3VGV4dCArPSAiIFwiXCIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRWYWx1ZSkgLSBzdGFydE9mZnNldDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsIG5ld1RleHQpOwotCQkJLy8gZG8gc29tZXRoaW5nIGlmIHRoZXJlIGlzIG5vICJraW5kIiByZWdpb24KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRLaW5kKFN0cmluZyBraW5kKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVQbHVnaW4uZ2V0RFREU3RyaW5nKCJfVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVmYXVsdEtpbmQodGhpcywga2luZCk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGZpeGVkKSB7Ci0JCUlUZXh0UmVnaW9uIGRlZmF1bHRWYWx1ZSA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXJhdG9yKCkpOwotCQlTdHJpbmcgcXVvdGVDaGFyID0gdmFsdWUuaW5kZXhPZigiXCIiKSA9PSAtMSA/ICJcIiIgOiAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCWludCBlbmRPZmZzZXQgPSAwOwotCQlTdHJpbmcgbmV3VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIG9sZFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCWJvb2xlYW4gb2xkS2luZElzRml4ZWQgPSBnZXREZWZhdWx0S2luZCgpLmVxdWFscyhBdHRyaWJ1dGUuRklYRUQpOwotCQlpZiAob2xkVmFsdWUuZXF1YWxzKHZhbHVlKSAmJiBmaXhlZCA9PSBvbGRLaW5kSXNGaXhlZCkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGRlZmF1bHRWYWx1ZSk7Ci0JCQllbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZGVmYXVsdFZhbHVlKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIGRlZmF1bHRLaW5kUmVnaW9uID0gZ2V0RGVmYXVsdEtpbmRSZWdpb24oKTsKLQkJaWYgKGRlZmF1bHRLaW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZGVmYXVsdEtpbmRSZWdpb24pOwotCQkJZW5kT2Zmc2V0ID0gZW5kT2Zmc2V0ID09IDAgPyBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZGVmYXVsdEtpbmRSZWdpb24pIDogZW5kT2Zmc2V0OwotCQl9IGVsc2UgewotCQkJaWYgKHN0YXJ0T2Zmc2V0ID09IDApIHsKLQkJCQllbmRPZmZzZXQgPSBzdGFydE9mZnNldCA9IGdldE9mZnNldEFmdGVyVHlwZSgpOwotCQkJCW5ld1RleHQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlJVGV4dFJlZ2lvbiB0eXBlUmVnaW9uID0gZ2V0VHlwZVJlZ2lvbigpOwotCQkJaWYgKHR5cGVSZWdpb24gPT0gbnVsbCAmJiBnZXRFbnVtTGlzdCgpID09IG51bGwpIHsKLQkJCQkvLyB0YWNrIG9uIGEgZGVmYXVsdCB0eXBlCi0JCQkJLy8gICAgICAgIG5ld1RleHQgKz0gIkNEQVRBICI7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpeGVkKSB7Ci0JCQluZXdUZXh0ICs9ICIjRklYRUQgIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJaWYgKGdldERlZmF1bHRLaW5kKCkuZXF1YWxzKCIiKSAmJiB2YWx1ZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIGlmIG5vdCBmaXhlZCBhbmQgdmFsdWUgaXMgIiIgdGhlbiByZXNldCB0aGUgZGVmYXVsdCBraW5kIHRvCi0JCQkJLy8gaW1wbGllZAotCQkJCW5ld1RleHQgKz0gIiNJTVBMSUVEIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKCFnZXRUeXBlKCkuZXF1YWxzKCIiKSAmJiAhdmFsdWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW5ld1RleHQgKz0gcXVvdGVDaGFyICsgdmFsdWUgKyBxdW90ZUNoYXI7Ci0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZml4ZWQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfVkFMIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlZmF1bHRWYWx1ZSh0aGlzLCB2YWx1ZSwgZml4ZWQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgdHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IGdldFR5cGUoKTsKLQkJaWYgKCF0eXBlLmVxdWFscyhvbGRUeXBlKSkgewotCQkJYm9vbGVhbiB3YXNFbnVtZXJhdGlvbiA9IG9sZFR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSkgfHwgb2xkVHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OT1RBVElPTik7Ci0JCQlib29sZWFuIGlzRW51bWVyYXRpb24gPSB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpIHx8IHR5cGUuZXF1YWxzKEVOVU1FUkFURURfTk9UQVRJT04pOwotCQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCWludCBlbmRPZmZzZXQgPSAwOwotCi0JCQlpZiAod2FzRW51bWVyYXRpb24gJiYgIWlzRW51bWVyYXRpb24pIHsKLQkJCQkvLyBnZXQgcmlkIG9mIHRoZSBvbGQgZW51bWxpc3QKLQkJCQlBdHRyaWJ1dGVFbnVtTGlzdCBlbnVtTGlzdCA9IGdldEVudW1MaXN0KCk7Ci0JCQkJaWYgKGVudW1MaXN0ICE9IG51bGwpIHsKLQkJCQkJc3RhcnRPZmZzZXQgPSBlbnVtTGlzdC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQllbmRPZmZzZXQgPSBlbnVtTGlzdC5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlpZiAoZW5kT2Zmc2V0ID09IDApIHsKLQkJCQkJZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCQluZXdUZXh0ICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJCWVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJfQotCi0JCQlTdHJpbmcgbmV3VHlwZVdvcmQgPSAoU3RyaW5nKSB0eXBlSGFzaC5nZXQodHlwZSk7Ci0JCQlpZiAobmV3VHlwZVdvcmQgPT0gbnVsbCkgewotCQkJCS8vIHRoZW4gdGhpcyBtdXN0IGJlIGEgcGFybSBlbnRpdHkgYmVpbmcgdXNlZCBpbiB0aGUgdHlwZQotCQkJCS8vIHVzZSB0aGUgdHlwZSB0ZXh0IGRpcmVjdGx5Ci0JCQkJbmV3VHlwZVdvcmQgPSB0eXBlOwotCQkJfQotCi0JCQluZXdUZXh0ICs9IG5ld1R5cGVXb3JkOwotCi0JCQlpZiAoaXNFbnVtZXJhdGlvbiAmJiAhd2FzRW51bWVyYXRpb24pIHsKLQkJCQkvLyBwdXQgaW4gYSBuZXcgbnVtbGlzdAotCQkJCWJvb2xlYW4gaXNTcGFjZU5lZWRlZCA9ICF0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpOwotCQkJCW5ld1RleHQgKz0gaXNTcGFjZU5lZWRlZCA/ICIgIiA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQluZXdUZXh0ICs9ICIoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBuZXdUZXh0KTsKLQkJCWlmIChuZXdUeXBlV29yZC5lcXVhbHMoIiIpICYmICF0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyB0aGUgc2V0IHRoZSBkZWZhdWx0a2luZCB0byAiIgotCQkJCS8vICAgICAgICBzZXREZWZhdWx0S2luZChyZXF1ZXN0b3IsICIiKTsKLQkJCQlzZXREZWZhdWx0VmFsdWUocmVxdWVzdG9yLCAiIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9BVFRSX1RZUEUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VHlwZSh0aGlzLCB0eXBlKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvQXR0cmlidXRlRW51bUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvQXR0cmlidXRlRW51bUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyMWY3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0F0dHJpYnV0ZUVudW1MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVFbnVtTGlzdCBleHRlbmRzIERURE5vZGUgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBBdHRyaWJ1dGVFbnVtTGlzdChEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gbmV2ZXIgZXhwb3NlZCBpbiB0cmVlCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgaW4gdGhpcyBlbnVtZXJhdGVkIGxpc3QKLQlwdWJsaWMgTGlzdCBnZXRJdGVtcygpIHsKLQkJbGlzdC5jbGVhcigpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5OQU1FKTsKLQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQlsaXN0LmFkZChnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KG5hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmdbXSBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRleHQgPSAiKCI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJdGV4dCArPSAiIHwgIiArIGl0ZW1zW2ldOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJdGV4dCArPSBpdGVtc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXh0ICs9ICIpIjsgLy8kTk9OLU5MUy0xJAotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksIHRleHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9BVFRSX0VOVU1fSVRFTVMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SXRlbXModGhpcywgaXRlbXMpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9BdHRyaWJ1dGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0F0dHJpYnV0ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0YjliNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0F0dHJpYnV0ZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVMaXN0IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCXB1YmxpYyBBdHRyaWJ1dGVMaXN0KERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0FUVFJfTElTVF9BREQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlEVEROb2RlIGxhc3RBdHRyaWJ1dGUgPSAoRFRETm9kZSkgZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChsYXN0QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGxhc3RBdHRyaWJ1dGUuZ2V0RW5kT2Zmc2V0KCksIDAsICJcblx0IiArIG5hbWUgKyAiIENEQVRBICNJTVBMSUVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbiksIDAsICJcblx0IiArIG5hbWUgKyAiIENEQVRBICNJTVBMSUVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCX0KLQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkFUVFJJQlVURUxJU1RJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRJbnRvTW9kZWwoT2JqZWN0IHJlcXVlc3RvciwgQXR0cmlidXRlIHJlZmVyZW5jZSwgQXR0cmlidXRlIG5vZGUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbm9kZVRleHQgPSBub2RlLmdldEZ1bGxOb2RlVGV4dCgpOwotCQlpZiAoIWlzQWZ0ZXIpIHsKLQkJCW9mZnNldCA9IHJlZmVyZW5jZS5nZXRTdGFydE9mZnNldCgpOwotCQl9IGVsc2UgewotCQkJLy8gdHJ5IGFuZCBnZXQgbmV4dCBjaGlsZAotCQkJQXR0cmlidXRlIGF0dHIgPSAoQXR0cmlidXRlKSByZWZlcmVuY2UuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlvZmZzZXQgPSBhdHRyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGp1c3QgdXNlIHRoZSBlbmQgb2Zmc2V0Ci0JCQkJb2Zmc2V0ID0gcmVmZXJlbmNlLmdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQluZXdUZXh0ICs9IG5vZGVUZXh0Oy8vICsgKGlzTGFzdENoaWxkID8gIlxuIiA6ICJcblx0Iik7Ci0JCWlmICghbm9kZS5oYXNUcmFpbGluZ1doaXRlc3BhY2UoKSkgewotCQkJbmV3VGV4dCArPSAiXG5cdCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIG9mZnNldCwgMCwgbmV3VGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JCXJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJaWYgKGdldE5hbWVSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkvLyB3ZSBza2lwIHBhc3QgdGhlIG5hbWUgdG9rZW4gaXMgb3VyIG5hbWUKLQkJCXNraXBQYXN0TmFtZShpdGVyKTsKLQkJfQotCi0JCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXR0cmlidXRlIGF0dHJpYnV0ZSA9IG51bGw7Ci0JCWJvb2xlYW4gdHJhaWxpbmdXaGl0ZXNwYWNlID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlhdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCWNoaWxkcmVuLmFkZChhdHRyaWJ1dGUpOwotCQkJCWFwcGVuZENoaWxkKGF0dHJpYnV0ZSk7Ci0JCQkJdHJhaWxpbmdXaGl0ZXNwYWNlID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoYXR0cmlidXRlICE9IG51bGwgJiYgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgIT0gRFREUmVnaW9uVHlwZXMuRU5EX1RBRykgewotCQkJCWlmICghdHJhaWxpbmdXaGl0ZXNwYWNlKSB7Ci0JCQkJCWF0dHJpYnV0ZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpIHsKLQkJCQkJCWF0dHJpYnV0ZS5hZGRXaGl0ZXNwYWNlUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gdGhlIGZvbGxvd2luZyBwcmV2ZW50cyBleHRyYSB3aGl0ZXNwYWNlIGZyb20gYmVpbmcgcGlja2VkCi0JCQkJLy8gdXAgYnkgdGhlIGF0dHJpYnV0ZQotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEIHx8IGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkgewotCQkJCQl0cmFpbGluZ1doaXRlc3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnQgbnVtS2lkcyA9IGNoaWxkcmVuLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LaWRzOyBpKyspIHsKLQkJCSgoQXR0cmlidXRlKSBjaGlsZHJlbi5nZXQoaSkpLnJlc29sdmVSZWdpb25zKCk7Ci0JCX0gLy8gZW5kIG9mIGZvciAoKQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvQ01CYXNpY05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvQ01CYXNpY05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViNzBmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0NNQmFzaWNOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qCi0gKiBDTUJhc2ljTm9kZSBjb21iaW5lcyBhbGwgdGhlIGRpZmZlcmVudCBjb250ZW50IHR5cGVzIGludG8gb25lLiBUaGUgaWRlYQotICogYmVoaW5kIHRoaXMgaXMgdG8gYWxsb3cgYXJiaXRyYXJ5IG5hbWUgY2hhbmdlcyB0byBub3QgcmVxdWlyZSBhIHRyZWUKLSAqIHVwZGF0ZS4KLSAqLwotcHVibGljIGNsYXNzIENNQmFzaWNOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0KLQkvLyAgICBzdGF0aWMgZmluYWwgaW50IEVNUFRZID0gMDsKLQkvLyAgICBzdGF0aWMgZmluYWwgaW50IEFOWSA9IDE7Ci0JLy8gICAgc3RhdGljIGZpbmFsIGludCBQQ0RBVEEgPSAyOwotCi0JcHVibGljIENNQmFzaWNOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5QQ0RBVEFJQ09OKTsKLQkJfQotCi0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoRU1QVFkpKSB7Ci0JCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTVBUWUlDT04pOwotCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscyhBTlkpKSB7Ci0JCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5BTllJQ09OKTsKLQkJCX0KLQkJfQotCi0JCS8vIE90aGVyd2lzZSB0aGlzIGlzIGp1c3QgYW4gZWxlbWVudCByZWZlcmVuY2Ugbm9kZS4gSnVzdCByZXR1cm4KLQkJLy8gd2hhdCBDTVJlcGVhdGFibGVOb2RlIHdvdWxkIGdpdmUgdXMKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyByZXR1cm5zIHRoZSBvY2N1cnJlbmNldG9rZW4sIG9yIHRoZSB0b2tlbiB3aGVyZSB0aGUgb2NjdXJyZW5jZSB0b2tlbgotCS8vIHNob3VsZCBhcHBlYXIgYWZ0ZXIKLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0T2NjdXJyZW5jZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXNraXBQYXN0TmFtZShpdGVyKTsKLQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXROYW1lUmVnaW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlJVGV4dFJlZ2lvbiBwY2RhdGEgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsKLQkJaWYgKHBjZGF0YSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gUENEQVRBOwotCQl9Ci0KLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWZpbmFsIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCQlpZiAobmFtZS5lcXVhbHMoRU1QVFkpKSB7Ci0JCQkJCXJldHVybiBFTVBUWTsKLQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEFOWSkpIHsKLQkJCQkJcmV0dXJuIEFOWTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBvdGhlcndpc2UganVzdCByZXR1cm4gaXQncyBuYW1lIGFzIHRoZSB0eXBlCi0JCQkJCXJldHVybiBuYW1lOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHlBbnlPclBDRGF0YSgpIHsKLQkJaWYgKGlzUENEYXRhKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhFTVBUWSkgfHwgbmFtZS5lcXVhbHMoQU5ZKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BDRGF0YSgpIHsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vICAgIHB1YmxpYyBOb2RlIGluc2VydFJlZ2lvbihSZWdpb24gdG9rZW4pCi0JLy8gICAgewotCS8vICAgICAgaWYgKCF0b2tlblN0cmVhbS5jb250YWluc1Rva2VuKHRva2VuKSAmJiB0b2tlbi5nZXRUeXBlKCkgPT0KLQkvLyBUb2tlbi5PQ0NVUl9UWVBFKQotCS8vICAgICAgewotCS8vICAgICAgICAvLyB0aGVuIGFkZCBpdCBzbyB0aGF0IG91ciByYW5nZSBjb250YWlucyBpdAotCS8vICAgICAgICBpbnNlcnRJbnRvVG9rZW5TdHJlYW0odG9rZW4pOwotCS8vICAgICAgfQotCS8vICAgICAgcmV0dXJuIHRoaXM7Ci0JLy8gICAgfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAhaXNFbXB0eUFueU9yUENEYXRhKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmFtZSkgewotCQkvLyAgICBiZWdpblJlY29yZGluZyhyZXF1ZXN0b3IsICJOYW1lIENoYW5nZSIpOwotCi0JCXN1cGVyLnNldE5hbWUocmVxdWVzdG9yLCBuYW1lKTsKLQkJaWYgKCFpc1JlZmVyZW5jZSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBubyBsb25nZXIgYSByZWZlcmVuY2Ugbm9kZSwgcmVtb3ZlIHRoZSBvY2N1cnJlbmNlCi0JCQkvLyB0b2tlbgotCQkJc2V0T2NjdXJyZW5jZShyZXF1ZXN0b3IsIENNUmVwZWF0YWJsZU5vZGUuT05DRSk7Ci0JCX0KLQotCQkvLyAgICBlbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoaW50IHR5cGUpIHsgc3dpdGNoICh0eXBlKSB7IGNhc2UgRU1QVFk6Ci0JICogcmV0dXJuIGVtcHR5U3RyaW5nOyBjYXNlIEFOWTogcmV0dXJuIGFueVN0cmluZzsgY2FzZSBQQ0RBVEE6IHJldHVybgotCSAqIHBjZGF0YVN0cmluZzsgZGVmYXVsdDogYnJlYWs7IH0gLy8gZW5kIG9mIHN3aXRjaCAoKSByZXR1cm4gIiI7IH0KLQkgKi8KLQotfS8vIENNQmFzaWNOb2RlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0NNR3JvdXBOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0NNR3JvdXBOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZjEzYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9DTUdyb3VwTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudXRpbC5EVERVbmlxdWVOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIENNR3JvdXBOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hPSUNFID0gJ3wnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTRVFVRU5DRSA9ICcsJzsKLQotCXByb3RlY3RlZCBjaGFyIGNvbm5lY3RvciA9IFNFUVVFTkNFOwotCi0JLy8gIHByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQ01Hcm91cE5vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfQ0hJTEQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJRFRETm9kZSBsYXN0Tm9kZSA9IChEVEROb2RlKSBnZXRMYXN0Q2hpbGQoKTsKLQkJU3RyaW5nIGVsZW1lbnROYW1lID0gRFREVW5pcXVlTmFtZUhlbHBlci5nZXRVbmlxdWVOYW1lKGdldENoaWxkcmVuTGlzdCgpLCAiQ2hpbGROb2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGxhc3ROb2RlLmdldEVuZE9mZnNldCgpLCAwLCBTdHJpbmcudmFsdWVPZihnZXRDb25uZWN0b3IoKSkgKyBlbGVtZW50TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCkgKyAxLCAwLCBlbGVtZW50TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRHcm91cCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfR1JQIikpOyAvLyROT04tTkxTLTEkCi0JCURURE5vZGUgbGFzdE5vZGUgPSAoRFRETm9kZSkgZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBsYXN0Tm9kZS5nZXRFbmRPZmZzZXQoKSwgMCwgU3RyaW5nLnZhbHVlT2YoZ2V0Q29ubmVjdG9yKCkpICsgIiAoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpICsgMSwgMCwgIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSBjaGlsZCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAxICYmIGdldEZpcnN0Q2hpbGQoKSA9PSBjaGlsZCkgewotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBjaGlsZC5nZXRTdGFydE9mZnNldCgpLCBjaGlsZC5nZXROb2RlTGVuZ3RoKCksIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxOyBpKyspIHsKLQkJCURURE5vZGUgY2hpbGRBID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJRFRETm9kZSBjaGlsZEIgPSAoRFRETm9kZSkgY2hpbGRyZW5baSArIDFdOwotCi0JCQlib29sZWFuIGNoaWxkQURlbGV0ZWQgPSBjaGlsZEEgPT0gY2hpbGQ7Ci0JCQlib29sZWFuIGNoaWxkQkRlbGV0ZWQgPSBjaGlsZEIgPT0gY2hpbGQ7Ci0JCQlpZiAoY2hpbGRBRGVsZXRlZCB8fCBjaGlsZEJEZWxldGVkKSB7Ci0JCQkJLy8gd2UgZm91bmQgdGhlIGNoaWxkCi0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gY2hpbGRBRGVsZXRlZCA/IGNoaWxkQS5nZXRTdGFydE9mZnNldCgpIDogY2hpbGRBLmdldEVuZE9mZnNldCgpOwotCQkJCWludCBlbmRPZmZzZXQgPSBjaGlsZEFEZWxldGVkID8gY2hpbGRCLmdldFN0YXJ0T2Zmc2V0KCkgOiBjaGlsZEIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgY29ubmVjdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgY29ubmVjdG9yLgotCSAqLwotCXB1YmxpYyBjaGFyIGdldENvbm5lY3RvcigpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkrKykgewotCQkJRFRETm9kZSBjaGlsZEEgPSAoRFRETm9kZSkgY2hpbGRyZW5baV07Ci0JCQlEVEROb2RlIGNoaWxkQiA9IChEVEROb2RlKSBjaGlsZHJlbltpICsgMV07Ci0KLQkJCS8vIGNyZWF0ZSBhIHN0cmVhbSBiZXR3ZWVuIHRoZSB0d28gc2libGluZ3MgYW5kIHdhbGsgaXQKLQkJCS8vIG5vdGUgdGhhdCB0aGlzIHN0cmVhbSBpbmNsdWRlcyB0aGUgbGFzdCByZWdpb24gb2YgdGhlIGZpcnN0Ci0JCQkvLyBzaWJsaW5nIGFuZCB0aGUgZmlyc3QgcmVnaW9uIG9mIHRoZSBuZXh0IHNpYmxpbmcuCi0JCQkvLyBib3RoIHRoZXNlIHNob3VsZCBiZSBpZ25vcmVkCi0JCQlSZWdpb25JdGVyYXRvciBpdGVyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLCBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIGNoaWxkQi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCS8vICAgICAgc3RyZWFtLnNldEZpcnN0UmVnaW9uKGNoaWxkQS5nZXRMYXN0UmVnaW9uKCkpOwotCQkJLy8gICAgICBzdHJlYW0uc2V0TGFzdFJlZ2lvbihjaGlsZEIuZ2V0Rmlyc3RSZWdpb24oKSk7Ci0JCQkvLyAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBzdHJlYW0uaXRlcmF0b3IoKTsKLQkJCS8vIHNraXAgdGhlIGZpcnN0IHJlZ2lvbiB3aGljaCBpcyB0aGUgbGFzdCByZWdpb24gb2YgY2hpbGRBCi0JCQkvL2RvIHdlIG5lZWQgdGhpcyBub3cgPwotCQkJLy8gICAgICBpdGVyLm5leHQoKTsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBudWxsOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIGN1cnJlbnRSZWdpb24gIT0gY2hpbGRCLmdldFN0YXJ0UmVnaW9uKCkpIHsKLQkJCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUikgewotCQkJCQljb25uZWN0b3IgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KGN1cnJlbnRSZWdpb24pLmNoYXJBdCgwKTsKLQkJCQkJcmV0dXJuIGNvbm5lY3RvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbm5lY3RvcjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCURURENvcmVQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JCXN3aXRjaCAoZ2V0Q29ubmVjdG9yKCkpIHsKLQkJCWNhc2UgU0VRVUVOQ0UgOgotCQkJCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVTRVFVRU5DRUlDT04pOwotCQkJLyoKLQkJCSAqIHN3aXRjaCAoZ2V0T2NjdXJyZW5jZSgpKSB7IGNhc2UgT05DRSA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FU0VRVUVOQ0VJQ09OKTsgY2FzZQotCQkJICogT1BUSU9OQUwgOiByZXR1cm4KLQkJCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9QVElPTkFMU0VRVUVOQ0VJQ09OKTsgY2FzZQotCQkJICogT05FX09SX01PUkUgOiByZXR1cm4KLQkJCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORU9STU9SRVNFUVVFTkNFSUNPTik7Ci0JCQkgKiBjYXNlIFpFUk9fT1JfTU9SRSA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuWkVST09STU9SRVNFUVVFTkNFSUNPTik7IH0KLQkJCSAqLwotCQkJY2FzZSBDSE9JQ0UgOgotCQkJCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVDSE9JQ0VJQ09OKTsKLQkJLyoKLQkJICogc3dpdGNoIChnZXRPY2N1cnJlbmNlKCkpIHsgY2FzZSBPTkNFIDogcmV0dXJuCi0JCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORUNIT0lDRUlDT04pOyBjYXNlIE9QVElPTkFMIDoKLQkJICogcmV0dXJuIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9QVElPTkFMQ0hPSUNFSUNPTik7Ci0JCSAqIGNhc2UgT05FX09SX01PUkUgOiByZXR1cm4KLQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FT1JNT1JFQ0hPSUNFSUNPTik7IGNhc2UKLQkJICogWkVST19PUl9NT1JFIDogcmV0dXJuCi0JCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLlpFUk9PUk1PUkVDSE9JQ0VJQ09OKTsgfQotCQkgKi8KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHJldHVybnMgdGhlIG9jY3VycmVuY2VyZWdpb24sIG9yIHRoZSBsYXN0IHJlZ2lvbiB3aGVyZSB0aGUgb2NjdXJyZW5jZQotCS8vIHJlZ2lvbiBzaG91bGQgYXBwZWFyIGFmdGVyCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE9jY3VycmVuY2VSZWdpb24oKSB7Ci0JCWludCBuZXN0aW5nID0gMDsKLQotCQkvLyB3ZSBza2lwIHBhc3QgdGhlIGZpcnN0IGxlZnQgcGFyZW4gd2Ugc2VlIHNpbmNlIHRoYXQgaXMgdGhlCi0JCS8vIGJlZ2lubmluZyBvZiBvdXIgb3duIG5vZGUKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCS8vIHdlIGFzc3VtZSB0aGUgZmlyc3QgcmVnaW9uIGlzIHRoZSAnKCcKLQkJaXRlci5uZXh0KCk7Ci0JCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgbmVzdGluZyA+PSAwKSB7Ci0JCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikgewotCQkJCW5lc3RpbmcrKzsKLQkJCX0KLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTikgewotCQkJCW5lc3RpbmctLTsKLQkJCX0KLQkJfQotCQlpZiAobmVzdGluZyA8IDApIHsKLQkJCS8vIFRoaXMgbWVhbnMgd2UgaGF2ZSBwYXNzZWQgb3ZlciB0aGUgcmlnaHQgcGFyZW4gdGhhdCBtYXJrcyB0aGUKLQkJCS8vIGVuZCBvZiBvdXIgZ3JvdXBpbmcuCi0JCQkvLyBMb29rIGZvciBhbiBvY2N1cnJlbmNlIHJlZ2lvbgotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQkJCXJldHVybiBjdXJyZW50UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSdyZSBoZXJlLCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gb2NjdXIgcmVnaW9uLiByZXR1cm4gdGhlCi0JCS8vIGxhc3QgcmVnaW9uCi0JCXJldHVybiBpdGVyLnByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKGdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSB7Ci0JCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBnZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKG5vZGUuZ2V0VHlwZSgpLmVxdWFscyhQQ0RBVEEpKSB7Ci0JCQkJCXJldHVybiBNSVhFRDsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gQ0hJTERSRU47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydENoaWxkTm9kZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbm9kZVRleHQsIGludCBwb3NpdGlvbikgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0KLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAocG9zaXRpb24gPCBjaGlsZHJlbi5sZW5ndGgpIHsKLQkJCURURE5vZGUgcmVmZXJlbmNlID0gKERURE5vZGUpIGNoaWxkcmVuW3Bvc2l0aW9uXTsKLQkJCXN0YXJ0T2Zmc2V0ID0gcmVmZXJlbmNlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQluZXdUZXh0ID0gbm9kZVRleHQgKyAiICIgKyBTdHJpbmcudmFsdWVPZihnZXRDb25uZWN0b3IoKSkgKyAiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgaWYgKHBvc2l0aW9uID09IGNoaWxkcmVuLmxlbmd0aCkgewotCQkJLy8gYWRkIHRvIGVuZAotCQkJRFRETm9kZSByZWZlcmVuY2UgPSAoRFRETm9kZSkgY2hpbGRyZW5bcG9zaXRpb24gLSAxXTsKLQkJCXN0YXJ0T2Zmc2V0ID0gcmVmZXJlbmNlLmdldEVuZE9mZnNldCgpOwotCQkJbmV3VGV4dCA9ICIgIiArIFN0cmluZy52YWx1ZU9mKGdldENvbm5lY3RvcigpKSArICIgIiArIG5vZGVUZXh0OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCAwLCBuZXdUZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRDaGlsZE5vZGUoU3RyaW5nIG5vZGVUZXh0LCBpbnQgcG9zaXRpb24pIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9DTV9HUlBfTk9ERV9JTlNFUlRfRUxFTUVOVCIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbnNlcnRDaGlsZE5vZGUodGhpcywgbm9kZVRleHQsIHBvc2l0aW9uKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydEludG9Nb2RlbChPYmplY3QgcmVxdWVzdG9yLCBDTU5vZGUgcmVmZXJlbmNlLCBDTU5vZGUgbm9kZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCVN0cmluZyBub2RlVGV4dCA9IG5vZGUuZ2V0Tm9kZVRleHQoKTsKLQkJTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuTGlzdCgpOwotCi0JCWludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YocmVmZXJlbmNlKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBubyByZWZlcmVuY2Ugbm9kZSwgYWRkIGl0IHRvIHRoZSBlbmQ/PwotCQkJaW5kZXggPSBjaGlsZHJlbi5zaXplKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBnb3QgYW4gaW5kZXguIGlmIHdlIHdhbnQgdG8gYWRkIGFmdGVyLCBpbmNyZWFzZSBieSAxCi0JCQlpbmRleCA9IGlzQWZ0ZXIgPyBpbmRleCArIDEgOiBpbmRleDsKLQkJfQotCQlpbnNlcnRDaGlsZE5vZGUocmVxdWVzdG9yLCBub2RlVGV4dCwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQlpbnQgbmVzdGluZyA9IDA7Ci0JCS8vICAgIGNoaWxkcmVuLmNsZWFyKCk7Ci0JCXJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJRFRETm9kZSBjdXJyZW50R3JvdXBOb2RlID0gbnVsbDsKLQkJQ01CYXNpY05vZGUgY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJLy8gd2UgYXNzdW1lIHRoZSBmaXJzdCByZWdpb24gaXMgdGhlICcoJwotCQlpdGVyLm5leHQoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIG5lc3RpbmcgPj0gMCkgewotCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG5lc3RpbmcgPT0gMCkgewotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpKSB7Ci0JCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBjdXJyZW50UmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCQkJCURURE5vZGUgcGNEYXRhID0gbmV3IENNQmFzaWNOb2RlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCQlwY0RhdGEuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQlhcHBlbmRDaGlsZChwY0RhdGEpOwotCQkJCQkvLyAgICAgICAgICBjaGlsZHJlbi5hZGQocGNEYXRhKTsKLQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OQU1FKSkgewotCQkJCQkvLyB3ZSBoYXZlIGhpdCBhIG5ldyByZWZlcmVuY2Ugbm9kZS4gTWFrZSBzdXJlIHdlIHJlc2V0Ci0JCQkJCS8vIHRoZSBncm91cG5vZGUgdmFyIHNvIGl0IGRvZXNuJ3QgY29sbGVjdCBtb3JlIHJlZ2lvbnMKLQkJCQkJY3VycmVudEdyb3VwTm9kZSA9IG51bGw7Ci0JCQkJCWN1cnJlbnRSZWZlcmVuY2VOb2RlID0gbmV3IENNQmFzaWNOb2RlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCQljdXJyZW50UmVmZXJlbmNlTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJCWFwcGVuZENoaWxkKGN1cnJlbnRSZWZlcmVuY2VOb2RlKTsKLQkJCQkJLy8gICAgICAgICAgY2hpbGRyZW4uYWRkKGN1cnJlbnRSZWZlcmVuY2VOb2RlKTsKLQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQkvLyB3ZSBjb3VsZCBwb3RlbnRpYWxseSBmbGFnIGFuIGVycm9yIGhlcmUgaWYgd2UgaGl0IGFuCi0JCQkJCS8vIG9jY3VycmVuY2UgdHlwZSBhbmQgY3VycmVudFJlZk5vZGUgYW5kIGN1cnJlbnRHcm91cE5vZGUKLQkJCQkJLy8gYXJlIG51bGwKLQkJCQkJaWYgKGN1cnJlbnRSZWZlcmVuY2VOb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vICAgICAgICAgICBjdXJyZW50UmVmZXJlbmNlTm9kZS5zZXRPY2N1cnJlbmNlKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SKSkgewotCQkJCQkvLyBub3RlIHRoYXQgaWYgY29ubmVjdG9yIGlzIGFscmVhZHkgc2V0IGFuZCBpdCBpcwotCQkJCQkvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBjb25uZWN0b3IgcmVnaW9uLCB0aGVuIHdlCi0JCQkJCS8vIGhhdmUgYW4gZXJyb3IhCi0JCQkJCS8vICAgICAgICAgc2V0Q29ubmVjdG9yKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCX0gZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJCWlmIChjdXJyZW50R3JvdXBOb2RlID09IG51bGwpIHsKLQkJCQkJCS8vIHdlIGhhdmUgaGl0IGEgbmV3IGdyb3VwLiBNYWtlIHN1cmUgd2UgcmVzZXQgdGhlCi0JCQkJCQkvLyByZWZlcmVuY2Vub2RlIHZhciBzbyBpdCBkb2Vzbid0IGNvbGxlY3QgYW55IG1vcmUKLQkJCQkJCS8vIHJlZ2lvbnMKLQkJCQkJCWN1cnJlbnRSZWZlcmVuY2VOb2RlID0gbnVsbDsKLQkJCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBuZXcgQ01Hcm91cE5vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJCQlhcHBlbmRDaGlsZChjdXJyZW50R3JvdXBOb2RlKTsKLQkJCQkJCS8vICAgICAgICAgICAgY2hpbGRyZW4uYWRkKGN1cnJlbnRHcm91cE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJbmVzdGluZysrOwotCQkJfQotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTikpIHsKLQkJCQluZXN0aW5nLS07Ci0JCQkJaWYgKG5lc3RpbmcgPT0gMCAmJiBjdXJyZW50R3JvdXBOb2RlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudEdyb3VwTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJCS8vIHBlZWsgYXQgbmV4dCByZWdpb24gdG8gc2VlIGlmIGl0IGlzIGFuIG9jY3VyIHJlZ2lvbi4gaWYKLQkJCQkJLy8gc28sIGFkZCBpdCB0byB0aGUgZ3JvdXBub2RlCi0JCQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKG5leHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQkJCWN1cnJlbnRHcm91cE5vZGUuYWRkUmVnaW9uKG5leHRSZWdpb24pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBPdGhlcndpc2UsIHB1c2ggaXQgYmFjayBhcyB0aGUgbmV4dCBpdGVtIHRvIGJlCi0JCQkJCQkJLy8gcmV0cmlldmVkIGJ5IGEgZnV0dXJlIG5leHQoKSBjYWxsCi0JCQkJCQkJaXRlci5wcmV2aW91cygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjdXJyZW50R3JvdXBOb2RlICE9IG51bGwpIHsKLQkJCQljdXJyZW50R3JvdXBOb2RlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuZXN0aW5nIDwgMCkgewotCQkJLy8gVGhpcyBtZWFucyB3ZSBoYXZlIHBhc3NlZCBvdmVyIHRoZSByaWdodCBwYXJlbiB0aGF0IG1hcmtzIHRoZQotCQkJLy8gZW5kIG9mIG91ciBncm91cGluZy4KLQkJCS8vIExvb2sgZm9yIGFuIG9jY3VycmVuY2UgcmVnaW9uCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQkvLyAgICAgICAgICBzZXRPY2N1cnJlbmNlKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0JCX0KLQotCQkvLyAgICAgIGZvciAob3JnLnczYy5kb20uTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQKLQkJLy8gPSBjaGlsZC5nZXROZXh0U2libGluZygpKQotCQkvLyAgICAgIHsKLQkJLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hpbGQgZm91bmQgPSAiICsgY2hpbGQpOwotCQkvLyAgICAgIH0KLQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hpbGRyZW4gbGVnbnRoID0gIiArIGNoaWxkcmVuLmxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCWN1cnJlbnROb2RlLnJlc29sdmVSZWdpb25zKCk7Ci0JCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGNvbm5lY3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGNvbm5lY3Rvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3IoY2hhciB2KSB7Ci0JCWlmIChjb25uZWN0b3IgIT0gdikgewotCQkJY29ubmVjdG9yID0gdjsKLQkJCS8vIHdhbGsgdGhyb3VnaCBvdXIga2lkcyBhbmQgc2VlIGlmIHRoZXJlIGlzIGEgY29ubmVjdG9yIGJldHdlZW4KLQkJCS8vIGVhY2ggc2libGluZy4gaWYgbm90LCBjcmVhdGUgb25lIGFuZCBzZXQgdGhlIGNvbm5lY3Rvci4gaWYKLQkJCS8vIHRoZXJlIGlzCi0JCQkvLyB0aGVuIGp1c3QgY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjb25uZWN0b3IKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChjaGlsZHJlbi5sZW5ndGggPD0gMSkgewotCQkJCS8vIHRoZXJlIHdvbid0IGJlIGFueSBjb25uZWN0b3IgZXhpc3RpbmcgYmV0d2VlbiB0aGUgY2hpbGRyZW4KLQkJCQkvLyBqdXN0IG5vdGlmeSBhIGNoYW5nZSBpbiB0aGUgbm9kZSBhbmQgcmV0dXJuOwotCQkJCWdldERUREZpbGUoKS5ub3RpZnlOb2RlQ2hhbmdlZCh0aGlzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0NPTk5FQ1RPUiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxOyBpKyspIHsKLQkJCQlEVEROb2RlIGNoaWxkQSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCQlEVEROb2RlIGNoaWxkQiA9IChEVEROb2RlKSBjaGlsZHJlbltpICsgMV07Ci0KLQkJCQkvLyBjcmVhdGUgYSBzdHJlYW0gYmV0d2VlbiB0aGUgdHdvIHNpYmxpbmdzIGFuZCB3YWxrIGl0Ci0JCQkJLy8gbm90ZSB0aGF0IHRoaXMgc3RyZWFtIGluY2x1ZGVzIHRoZSBsYXN0IHJlZ2lvbiBvZiB0aGUgZmlyc3QKLQkJCQkvLyBzaWJsaW5nIGFuZCB0aGUgZmlyc3QgcmVnaW9uIG9mIHRoZSBuZXh0IHNpYmxpbmcuCi0JCQkJLy8gYm90aCB0aGVzZSBzaG91bGQgYmUgaWdub3JlZAotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCksIGNoaWxkQS5nZXRFbmRPZmZzZXQoKSwgY2hpbGRCLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCS8vIHNraXAgdGhlIGZpcnN0IHJlZ2lvbiB3aGljaCBpcyB0aGUgbGFzdCByZWdpb24gb2YgY2hpbGRBCi0KLQkJCQkvLyBkbyB3ZSBzdGlsbCBuZWVkIHRoaXMKLQkJCQkvLyAgICAgICAgaXRlci5uZXh0KCk7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IG51bGw7Ci0JCQkJYm9vbGVhbiBmb3VuZENvbm5lY3RvciA9IGZhbHNlOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBjdXJyZW50UmVnaW9uICE9IGNoaWxkQi5nZXRTdGFydFJlZ2lvbigpKSB7Ci0JCQkJCWN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUikgewotCQkJCQkJZm91bmRDb25uZWN0b3IgPSB0cnVlOwotCQkJCQkJLy8gICAgICAgICAgICBSZWdpb24gb2xkUmVnaW9uID0gY3VycmVudFJlZ2lvbi5jcmVhdGVDb3B5KCk7Ci0JCQkJCQkvLyBmb3VuZCBhIGNvbm5lY3RvciEgb24gdG8gdGhlIG5leHQgc2libGluZyBwYWlyCi0JCQkJCQkvLyAgICAgICAgICAgIGN1cnJlbnRSZWdpb24udXBkYXRlVGV4dChTdHJpbmcudmFsdWVPZih2KSk7Ci0JCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChjdXJyZW50UmVnaW9uKSwgMSwgU3RyaW5nLnZhbHVlT2YoY29ubmVjdG9yKSk7Ci0JCQkJCQkvL2NoYW5nZVN0cnVjdHVyZWREb2N1bWVudChvbGRSZWdpb24sIGN1cnJlbnRSZWdpb24pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoIWZvdW5kQ29ubmVjdG9yKSB7Ci0JCQkJCS8vaWYgd2UncmUgaGVyZSwgdGhhdCBtZWFucyB3ZSBuZWVkIHRvIGluc2VydCBhIG5ldwotCQkJCQkvLyBjb25uZWN0b3IgcmVnaW9uIGFmdGVyIGNoaWxkQQotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIDAsIFN0cmluZy52YWx1ZU9mKGNvbm5lY3RvcikpOwotCQkJCQkvLyAgICAgICAgICBEVERSZWdpb24gY29ubmVjdG9yUmVnaW9uID0gbmV3Ci0JCQkJCS8vIERURFJlZ2lvbihEVERSZWdpb25UeXBlcy5DT05ORUNUT1IsCi0JCQkJCS8vIGNoaWxkQS5nZXRFbmRPZmZzZXQoKSwgMSk7Ci0JCQkJCS8vICAgICAgICAgIGluc2VydEludG9TdHJ1Y3R1cmVkRG9jdW1lbnQoY29ubmVjdG9yUmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvLyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKQotCS8vICAgIHsKLQkvLyAgICAgIHJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JLy8gICAgfQotfS8vIENNR3JvdXBOb2RlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0NNTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9DTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5ZGNkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0NNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLy8gYmFzZSBjbGFzcyBmb3IgYW4gRWxlbWVudCdzIGNvbnRlbnRtb2RlbAotcHVibGljIGFic3RyYWN0IGNsYXNzIENNTm9kZSBleHRlbmRzIERURE5vZGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWSA9IERURENvcmVQbHVnaW4uZ2V0RFREU3RyaW5nKCJfVUlfTEFCRUxfQ01fTk9ERV9BTlkiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENISUxEUkVOID0gRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9DTV9OT0RFX0NISUxEX0NPTlRFTlQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0NNX05PREVfRU1QVFkiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JWEVEID0gRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9DTV9OT0RFX01JWF9DT05URU5UIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0RBVEEgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0NNX05PREVfUENEQVRBIik7IC8vJE5PTi1OTFMtMSQKLQotCi0JYm9vbGVhbiByb290RWxlbWVudENvbnRlbnQ7Ci0KLQlwdWJsaWMgQ01Ob2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JLy8gdGhpcyBpcyBvbmx5IHZhbGlkIHRvIGFzayBpZiB0aGUgY29udGVudCBpcyBhIHJvb3QgZWxlbWVudCBjb250ZW50Ci0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4gVGhpcyB0ZWxscyB1cyB3aGV0aGVyIHRoaXMgZWxlbWVudAotCSAqIGNvbnRlbnQncyBwYXJlbnQgaXMgYSBkaXJlY3QgZGVjZW5kZW50IG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3RFbGVtZW50Q29udGVudCgpIHsKLQkJcmV0dXJuIHJvb3RFbGVtZW50Q29udGVudDsKLQl9Ci0KLQkvLyBpZiB0aGlzIGlzIGEgcm9vdCBlbGVtZW50LCBjaGFuZ2UgdGhlIGNvbnRlbnQgdG8gY2hpbGRyZW4KLQkvLyBpZSAuIChjaGlsZDEpCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW5Db250ZW50KFN0cmluZyBuZXdDaGlsZCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKCFuZXdDaGlsZC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksICIoIiArIG5ld0NoaWxkICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKCFnZXRUeXBlKCkuZXF1YWxzKENISUxEUkVOKSkgewotCQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVQbHVnaW4uZ2V0RFREU3RyaW5nKCJfVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh0aGlzIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0Tm9kZUxlbmd0aCgpLCAiKG5ld0NoaWxkKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gbm93IG11c3QgY29udmVydCBmcm9tIG1peGVkIGNvbnRlbnQgdG8gdGhpcyBvbmUuIG11c3QKLQkJCQkJLy8gcHJlc2VydmUgdGhlIHJlbWFpbmluZyBjaGlsZHJlbgotCQkJCQlDTUdyb3VwTm9kZSBncm91cCA9IChDTUdyb3VwTm9kZSkgdGhpczsKLQkJCQkJQ01Ob2RlIGZpcnN0Q2hpbGQgPSAoQ01Ob2RlKSBncm91cC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCWlmIChmaXJzdENoaWxkLmdldFR5cGUoKS5lcXVhbHMoUENEQVRBKSkgewotCQkJCQkJZ3JvdXAuZGVsZXRlKGZpcnN0Q2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9DTV9OT0RFX1NFVCIpICsgIiAiICsgY29udGVudCArICIgIiArIERURENvcmVQbHVnaW4uZ2V0RFREU3RyaW5nKCJfVUlfTEFCRUxfQ01fTk9ERV9DT05URU5UIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksIGNvbnRlbnQpOwotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLy8gaWYgdGhpcyBpcyBhIHJvb3QgZWxlbWVudCwgY2hhbmdlIHRoZSBjb250ZW50IHRvIG1peGVkCi0JLy8gaWUgLiAoI1BDREFUQSwgY2hpbGQxKQotCXB1YmxpYyB2b2lkIHNldE1peGVkQ29udGVudCgpIHsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWlmICghZ2V0VHlwZSgpLmVxdWFscyhNSVhFRCkpIHsKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0NNX05PREVfU0VUX01JWF9DT05URU5UIikpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksICIoI1BDREFUQSB8IG5ld0NoaWxkKSoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIG5vdyBtdXN0IGNvbnZlcnQgZnJvbSBjaGlsZHJlbiBjb250ZW50IHRvIHRoaXMgb25lLgotCQkJCQkvLyBtdXN0Ci0JCQkJCS8vIHByZXNlcnZlIHRoZSBjaGlsZHJlbgotCQkJCQlDTUdyb3VwTm9kZSBncm91cCA9IChDTUdyb3VwTm9kZSkgdGhpczsKLQkJCQkJZ3JvdXAuc2V0Q29ubmVjdG9yKENNR3JvdXBOb2RlLkNIT0lDRSk7Ci0JCQkJCWdyb3VwLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUpOwotCQkJCQlDTU5vZGUgZmlyc3RDaGlsZCA9IChDTU5vZGUpIGdyb3VwLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJaWYgKCFmaXJzdENoaWxkLmdldFR5cGUoKS5lcXVhbHMoUENEQVRBKSkgewotCQkJCQkJZ3JvdXAuaW5zZXJ0Q2hpbGROb2RlKCIjUENEQVRBIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb290RWxlbWVudENvbnRlbnQoYm9vbGVhbiB2KSB7Ci0JCXRoaXMucm9vdEVsZW1lbnRDb250ZW50ID0gdjsKLQl9Ci0KLQkvLyAgICBwdWJsaWMgdm9pZCBkZWxldGUoKQotCS8vICAgIHsKLQkvLyAgICAgIGlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKQotCS8vICAgICAgewotCS8vICAgICAgICAvLyB0aGVuIHRoZSBzdXBlcmNsYXNzZXMgZGVsZXRlIHdpbGwgYmUgZmluZQotCS8vICAgICAgICBzdXBlci5kZWxldGUoKTsKLQkvLyAgICAgICAgcmV0dXJuOwotCS8vICAgICAgfQotCi0JLy8gICAgICBDTUdyb3VwTm9kZSBwYXJlbnQgPSAoQ01Hcm91cE5vZGUpIGdldFBhcmVudE5vZGUoKTsKLQkvLyAgICAgIHBhcmVudC5yZW1vdmVDaGlsZE5vZGUodGhpcyk7Ci0JLy8gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvQ01SZXBlYXRhYmxlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9DTVJlcGVhdGFibGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MTU1ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9DTVJlcGVhdGFibGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNUmVwZWF0YWJsZU5vZGUgZXh0ZW5kcyBDTU5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9OQ0UgPSAnMSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9ORV9PUl9NT1JFID0gJysnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUFRJT05BTCA9ICc/JzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgWkVST19PUl9NT1JFID0gJyonOwotCi0KLQlwdWJsaWMgQ01SZXBlYXRhYmxlTm9kZShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJRFREQ29yZVBsdWdpbiByZXNvdXJjZVBsdWdpbiA9IERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQkJcmV0dXJuIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLkVMRU1FTlRSRUZJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXRPY2N1cnJlbmNlKCkgewotCQlJVGV4dFJlZ2lvbiBvY2N1clJlZ2lvbiA9IGdldE9jY3VycmVuY2VSZWdpb24oKTsKLQkJaWYgKG9jY3VyUmVnaW9uICE9IG51bGwgJiYgb2NjdXJSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpIHsKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KG9jY3VyUmVnaW9uKS5jaGFyQXQoMCk7Ci0JCX0KLQkJcmV0dXJuIENNUmVwZWF0YWJsZU5vZGUuT05DRTsKLQl9Ci0KLQkvLyByZXR1cm5zIHRoZSBvY2N1cnJlbmNlcmVnaW9uLCBvciB0aGUgbGFzdCByZWdpb24gd2hlcmUgdGhlIG9jY3VycmVuY2UKLQkvLyByZWdpb24gc2hvdWxkIGFwcGVhciBhZnRlcgotCWFic3RyYWN0IHB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRPY2N1cnJlbmNlUmVnaW9uKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRPY2N1cnJlbmNlKGNoYXIgb2NjdXJyZW5jZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0NNX1JFUF9OT0RFX0NIR19PQ0NVUiIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRPY2N1cnJlbmNlKHRoaXMsIG9jY3VycmVuY2UpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2NjdXJyZW5jZShPYmplY3QgcmVxdWVzdG9yLCBjaGFyIG9jY3VycmVuY2UpIHsKLQkJaWYgKGdldE9jY3VycmVuY2UoKSAhPSBvY2N1cnJlbmNlKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRPY2N1cnJlbmNlUmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkpIHsKLQkJCQkJaWYgKG9jY3VycmVuY2UgPT0gQ01SZXBlYXRhYmxlTm9kZS5PTkNFKSB7Ci0JCQkJCQkvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgb2NjdXIgcmVnaW9uIGZyb20gdGhlIGZsYXQKLQkJCQkJCS8vIG1vZGVsOwotCQkJCQkJZ2V0RFRERmlsZSgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgMSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyAgICAgICAgICAgIFJlZ2lvbiBvbGRPY2N1ciA9IHJlZ2lvbi5jcmVhdGVDb3B5KCk7Ci0JCQkJCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pLCAxLCBTdHJpbmcudmFsdWVPZihvY2N1cnJlbmNlKSk7Ci0JCQkJCQkvLyAgICAgICAgICAgIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudChvbGRPY2N1ciwgcmVnaW9uKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAob2NjdXJyZW5jZSAhPSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpIHsKLQkJCQkJLy8gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldFN0cmluZygpKTsKLQkJCQkJLy8gd2UgbmVlZCB0byBjcmVhdGUgYW4gb2NjdXJyZW5jZVJlZ2lvbgotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pLCAwLCBTdHJpbmcudmFsdWVPZihvY2N1cnJlbmNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19Ly8gQ01SZXBlYXRhYmxlTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9Db21tZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0NvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2NzI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0NvbW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWVudCBleHRlbmRzIE5hbWVkVG9wTGV2ZWxOb2RlIHsKLQotCXB1YmxpYyBjbGFzcyBTdGFydEVuZFBhaXIgewotCQlwdWJsaWMgaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0JfQotCi0JcHVibGljIENvbW1lbnQoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuQ09NTUVOVElDT04pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KCk7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpIDw9IDMwKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygwLCAyOSkgKyAiLi4uIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChTdGFydEVuZFBhaXIgcGFpcikgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gY29tbWVudFN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcoaXRlcik7Ci0JCUlUZXh0UmVnaW9uIGVuZENvbW1lbnRUYWcgPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKTsKLQkJcGFpci5lbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGNvbW1lbnRTdGFydFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLnN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGNvbW1lbnRTdGFydFRhZyk7Ci0JCX0KLQkJaWYgKGVuZENvbW1lbnRUYWcgIT0gbnVsbCkgewotCQkJcGFpci5lbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChlbmRDb21tZW50VGFnKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0JCWludCBmbGF0Tm9kZVN0YXJ0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJU3RhcnRFbmRQYWlyIHBhaXIgPSBuZXcgU3RhcnRFbmRQYWlyKCk7Ci0JCWdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChwYWlyKTsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHBhaXIuc3RhcnRPZmZzZXQgLSBmbGF0Tm9kZVN0YXJ0LCBwYWlyLmVuZE9mZnNldCAtIGZsYXROb2RlU3RhcnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9DT01NRU5UX0NIRyIpKTsgLy8kTk9OLU5MUy0xJAotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXBsYWNlVGV4dCh0aGlzLCBwYWlyLnN0YXJ0T2Zmc2V0LCBwYWlyLmVuZE9mZnNldCAtIHBhaXIuc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0RUREZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvRFRERmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjM2M2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvRFRERmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZXZlbnQuTm9kZXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS51dGlsLkRUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudXRpbC5EVERNb2RlbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnV0aWwuRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgRFRERmlsZSBpbXBsZW1lbnRzIEluZGV4ZWRSZWdpb24gewotCXByb3RlY3RlZCBOb2RlTGlzdCBhdHRsaXN0TGlzdCA9IG5ldyBOb2RlTGlzdCh0aGlzLCBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyk7Ci0JcHJvdGVjdGVkIE5vZGVMaXN0IGNvbW1lbnRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOwotCi0JYm9vbGVhbiBjcmVhdGluZ05ld01vZGVsID0gZmFsc2U7Ci0JcHJvdGVjdGVkIERURE1vZGVsSW1wbCBkdGRNb2RlbDsKLQotCXByb3RlY3RlZCBOb2RlTGlzdCBlbGVtZW50TGlzdCA9IG5ldyBOb2RlTGlzdCh0aGlzLCBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7Ci0JcHJvdGVjdGVkIE5vZGVMaXN0IGVudGl0eUxpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmb2xkZXJMaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBpc01vdmluZ05vZGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBMaXN0IGxpc3RzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExpc3QgbW9kZWxMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBub2RlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTm9kZUxpc3Qgbm90YXRpb25MaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7Ci0JcHJvdGVjdGVkIE5vZGVMaXN0IHVucmVjb2duaXplZExpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsKLQotCXB1YmxpYyBEVERGaWxlKERURE1vZGVsSW1wbCBkdGRNb2RlbCkgewotCQl0aGlzLmR0ZE1vZGVsID0gZHRkTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRFRERmlsZUxpc3RlbmVyKElEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbW9kZWxMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlKERURE5vZGUgbm9kZSkgewotCQlhZGROb2RlKG5vZGVMaXN0LnNpemUoKSwgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9kZShpbnQgaW5kZXgsIERURE5vZGUgbm9kZSkgewotCQlub2RlTGlzdC5hZGQoaW5kZXgsIG5vZGUpOwotCQkvKgotCQkgKiBpZiAoaW5kZXggPCBub2RlTGlzdC5zaXplKCkpIHsgaW5zZXJ0QmVmb3JlKG5vZGUsIChEVEROb2RlKQotCQkgKiBub2RlTGlzdC5nZXQoaW5kZXgpKTsgfSBlbHNlIHsgYXBwZW5kQ2hpbGQobm9kZSk7IH0KLQkJICovCi0JfQotCi0JcHVibGljIERURE5vZGUgYnVpbGROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJLy8gICAgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCURURE5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChpc0VsZW1lbnQoZmxhdE5vZGUpKSB7Ci0JCQkvLyB0aGVuIHRoaXMgaXMgYW4gZWxlbWVudAotCQkJbm9kZSA9IG5ldyBFbGVtZW50KHRoaXMsIGZsYXROb2RlKTsKLQkJfSBlbHNlIGlmIChpc0VudGl0eShmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgRW50aXR5KHRoaXMsIGZsYXROb2RlKTsKLQkJfSBlbHNlIGlmIChpc05vdGF0aW9uKGZsYXROb2RlKSkgewotCQkJbm9kZSA9IG5ldyBOb3RhdGlvbih0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0gZWxzZSBpZiAoaXNBdHRyaWJ1dGVMaXN0KGZsYXROb2RlKSkgewotCQkJbm9kZSA9IG5ldyBBdHRyaWJ1dGVMaXN0KHRoaXMsIGZsYXROb2RlKTsKLQkJfSBlbHNlIGlmIChpc0NvbW1lbnQoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IENvbW1lbnQodGhpcywgZmxhdE5vZGUpOwotCQl9IGVsc2UgaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKGZsYXROb2RlKSkgewotCQkJbm9kZSA9IG5ldyBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UodGhpcywgZmxhdE5vZGUpOwotCQl9IGVsc2UgaWYgKCFmbGF0Tm9kZS5nZXRUZXh0KCkudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJbm9kZSA9IG5ldyBVbnJlY29nbml6ZWQodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWluc2VydE5vZGUobm9kZSk7Ci0JCQlub2RlLnJlc29sdmVSZWdpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYnVpbGROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBsaXN0KSB7Ci0JCU5vZGVzRXZlbnQgYWRkZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0KLQkJVG9wTGV2ZWxOb2RlIHByZXZpb3VzTm9kZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbGlzdC5pdGVtKGkpOwotCQkJVG9wTGV2ZWxOb2RlIG5vZGUgPSAoVG9wTGV2ZWxOb2RlKSBidWlsZE5vZGUoZmxhdE5vZGUpOwotCQkJLy8gaWYgd2UgZG9uJ3QgY3JlYXRlIGEgbm9kZSwgdGhlbiB3ZSBhc3N1bWUgdGhhdCB0aGUgZmxhdAotCQkJLy8gbm9kZSB3YXMgd2hpdGVzcGFjZS4gVGFjayBpdCBvbiB0byBhIHByZXZpb3VzIHRvcGxldmVsCi0JCQkvLyBub2RlCi0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJcHJldmlvdXNOb2RlID0gbm9kZTsKLQkJCQlhZGRlZERURE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChwcmV2aW91c05vZGUgIT0gbnVsbCkgewotCQkJCQlwcmV2aW91c05vZGUuYWRkV2hpdGVzcGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGFkZGVkRFRETm9kZXMuZ2V0Tm9kZXMoKS5zaXplKCkgPiAwKS8vICYmCi0JCS8vICAgICAgICBjcmVhdGluZ05ld01vZGVsID09IGZhbHNlKQotCQl7Ci0JCQkvLyBub3cgdGVsbCBwZW9wbGUgYWJvdXQgdGhlIGFkZGl0aW9ucwotCQkJbm90aWZ5Tm9kZXNBZGRlZChhZGRlZERURE5vZGVzKTsKLQkJfQotCX0KLQotCS8vIEltcGxlbWVudHMgSW5kZXhlZFJlZ2lvbgotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRlc3RQb3NpdGlvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSA8PSB0ZXN0UG9zaXRpb24gJiYgdGVzdFBvc2l0aW9uIDw9IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUF0dHJpYnV0ZUxpc3QoRFRETm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9EVERfRklMRV9BRERfQVRUUl9MSVNUIikpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSAiPCFBVFRMSVNUICIgKyBuYW1lICsgIj5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbW1lbnQoRFRETm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9EVERfRklMRV9BRERfQ09NTUVOVCIpKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhLS0gIiArIG5hbWUgKyAiIC0tPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRWxlbWVudChEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTEVNRU5UIikpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSAiPCFFTEVNRU5UICIgKyBuYW1lICsgIiBFTVBUWT5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVudGl0eShEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTlRJVFkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9ICI8IUVOVElUWSAiICsgbmFtZSArICIgXCJcIj5cbiI7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlTm90YXRpb24oRFRETm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9EVERfRklMRV9BRERfTk9UQVRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9ICI8IU5PVEFUSU9OICIgKyBuYW1lICsgIiBTWVNURU0gXCJcIj5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9IG5hbWUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURSIpKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGVOb2RlKHRoaXMsIG5vZGUpOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVOb2RlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgbm9kZSkgewotCQlEVEROb2RlIHBhcmVudCA9IChEVEROb2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGVsZXRlKHJlcXVlc3Rvciwgbm9kZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWlzTW92aW5nTm9kZSkgewotCQkJCURURE1vZGVsVXBkYXRlciB1cGRhdGVyID0gbmV3IERURE1vZGVsVXBkYXRlcigpOwotCQkJCXVwZGF0ZXIub2JqZWN0QWJvdXRUb0JlRGVsZXRlZChyZXF1ZXN0b3IsIG5vZGUpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSB7Ci0JCQkJCUVudGl0eSByZWZlcmVuY2VkRW50aXR5ID0gKChQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG5vZGUpLmdldEVudGl0eU9iamVjdCgpOwotCQkJCQlpZiAocmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCQkvLyByZW1vdmUgcmVmZXJlbmNlcyB0byBhbGwgZWxlbWVudHMgYW5kIHBhcm0gZW50aXRpZXMKLQkJCQkJCS8vIGNvbnRhaW5lZCBpbiBvdXIgY3VycmVudCBtb2RlbAotCQkJCQkJRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyIHJlbW92ZXIgPSBuZXcgRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyKCk7Ci0JCQkJCQlyZW1vdmVyLmV4dGVybmFsUmVmZXJlbmNlQWJvdXRUb0NoYW5nZShyZXF1ZXN0b3IsIHJlZmVyZW5jZWRFbnRpdHkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCQkJTm90YXRpb24gbm90YXRpb24gPSAoKE5vdGF0aW9uKSBub2RlKTsKLQkJCQkJRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyIHJlbW92ZXIgPSBuZXcgRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyKCk7Ci0JCQkJCXJlbW92ZXIubm90YXRpb25BYm91dFRvQmVEZWxldGVkKHJlcXVlc3Rvciwgbm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gbm8gcGFyZW50PyB0aGVuIGRlbGV0ZSB1cCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbm9kZQotCQkJLy8gaWYgaXQgaXMgYSB0b3AgbGV2ZWwgbm9kZQotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZE9mZnNldCA9IG5vZGUuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCQllbmRPZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgdHJ1ZSk7Ci0JCQl9Ci0JCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q29tbWVudHMoKSB7Ci0JCXJldHVybiBjb21tZW50TGlzdDsKLQl9Ci0KLQlwdWJsaWMgRFRETW9kZWxJbXBsIGdldERURE1vZGVsKCkgewotCQlyZXR1cm4gZHRkTW9kZWw7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGVsZW1lbnRMaXN0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiByZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIGVudGl0eUxpc3Q7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkRUREZJTEVJQ09OKTsKLQl9Ci0KLQotCi0JcHVibGljIGludCBnZXRJbnNlcnRPZmZzZXQoRFRETm9kZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChpc0FmdGVyKSB7Ci0JCQkJLy8gdGhlbiBnZXQgdGhlIG5leHQgbm9kZSBhbmQgdXNlIGl0J3Mgc3RhcnQgb2Zmc2V0Ci0JCQkJaW50IGluZGV4ID0gZ2V0Tm9kZXMoKS5pbmRleE9mKGdldE5vZGUobm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSkpOwotCi0JCQkJRFRETm9kZSBhZnRlck5vZGUgPSBudWxsOwotCQkJCWlmIChpbmRleCArIDEgPCBnZXROb2RlcygpLnNpemUoKSkgewotCQkJCQlhZnRlck5vZGUgPSAoRFRETm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaW5kZXggKyAxKTsKLQkJCQl9Ci0JCQkJaWYgKGFmdGVyTm9kZSAhPSBudWxsKSB7Ci0JCQkJCW9mZnNldCA9IGFmdGVyTm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGFkZCB0byBlbmQKLQkJCQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlvZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW9mZnNldCA9IG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIGFkZCB0byBlbmQKLQkJCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCW9mZnNldCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGggcGF0aCA9IG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aChnZXREVERNb2RlbCgpLmdldElkKCkudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JfQotCi0JcHVibGljIERURE5vZGUgZ2V0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2RlTGlzdC5nZXQoaSk7Ci0JCQlpZiAobm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSA9PSBmbGF0Tm9kZSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldFRvcExldmVsTm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBub2RlLmdldERlZXBlc3ROb2RlKG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEluZGV4ZWRSZWdpb24gZ2V0Tm9kZUF0KGludCBzdGFydE9mZnNldCwgaW50IGVuZE9mZnNldCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRUb3BMZXZlbE5vZGVBdChzdGFydE9mZnNldCk7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBub2RlLmdldERlZXBlc3ROb2RlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vZGVMaXN0cygpIHsKLQkJaWYgKGZvbGRlckxpc3QgPT0gbnVsbCkgewotCQkJZm9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvbGRlckxpc3QuYWRkKG5vdGF0aW9uTGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChlbnRpdHlMaXN0KTsKLQkJCWZvbGRlckxpc3QuYWRkKGVsZW1lbnRMaXN0KTsKLQkJCS8vIGh0dHA6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQyMDAKLQkJCS8vZm9sZGVyTGlzdC5hZGQoYXR0bGlzdExpc3QpOwotCQkJLy9mb2xkZXJMaXN0LmFkZChjb21tZW50TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZCh1bnJlY29nbml6ZWRMaXN0KTsKLQkJfQotCQlyZXR1cm4gZm9sZGVyTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb2RlcygpIHsKLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXROb3RhdGlvbnMoKSB7Ci0JCXJldHVybiBub3RhdGlvbkxpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAocmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGR0ZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldFRvcExldmVsTm9kZUF0KGludCBvZmZzZXQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIG5vZGVMaXN0LmdldChpKTsKLQkJCWlmIChub2RlLmNvbnRhaW5zKG9mZnNldCkpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0VW5yZWNvZ25pemVkKCkgewotCQlyZXR1cm4gdW5yZWNvZ25pemVkTGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRJbnRvTW9kZWwoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSByZWZlcmVuY2UsIERURE5vZGUgbm9kZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCVN0cmluZyBub2RlVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlIGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSB7Ci0JCQlub2RlVGV4dCA9ICgoVG9wTGV2ZWxOb2RlKSBub2RlKS5nZXRGdWxsVGV4dCgpOwotCQl9IGVsc2UgewotCQkJbm9kZVRleHQgPSBub2RlLmdldE5vZGVUZXh0KCk7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChyZWZlcmVuY2UsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dChyZXF1ZXN0b3IsIG9mZnNldCwgMCwgbm9kZVRleHQpOwotCX0KLQotCi0JcHVibGljIHZvaWQgaW5zZXJ0Tm9kZShEVEROb2RlIG5vZGUpIHsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgaW5zZXJ0SW5kZXggPSAtMTsKLQkJLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJzdGFydG9mZnNldCA9ICIgKyBzdGFydE9mZnNldCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0Tm9kZXMoKS5zaXplKCk7IGkrKykgewotCQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IChEVEROb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJCS8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50Tm9kZSBlbmRPZmZzZXQgPSAiCi0JCQkvLyArY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkpOwotCi0JCQlpZiAoY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkgPiBzdGFydE9mZnNldCkgewotCQkJCS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVuZG9mZnNldCAiICsKLQkJCQkvLyBjdXJyZW50Tm9kZS5nZXRFbmRPZmZzZXQoKSArICIgPiAiICsgc3RhcnRPZmZzZXQpOwotCQkJCWluc2VydEluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaW5zZXJ0SW5kZXggPT0gLTEpIHsKLQkJCWluc2VydEluZGV4ID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0JCX0KLQotCi0JCS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaW5zZXJ0IGluZGV4ID0gIiArIGluc2VydEluZGV4KTsKLQotCQlhZGROb2RlKGluc2VydEluZGV4LCBub2RlKTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVMaXN0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gaXQgaXMgYXNzdW1lZCB0aGF0IGZsYXRub2RlIGNvbnRhaW5zIGF0IGxlYXN0IDMgcmVnaW9ucwotCXB1YmxpYyBib29sZWFuIGlzQ29tbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDIpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gaXQgaXMgYXNzdW1lZCB0aGF0IGZsYXRub2RlIGNvbnRhaW5zIGF0IGxlYXN0IDMgcmVnaW9ucwotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCUlUZXh0UmVnaW9uIHNlY29uZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiB0aGlyZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMik7Ci0JCQlpZiAoc2Vjb25kLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pICYmIHRoaXJkLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc0VudGl0eShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCUlUZXh0UmVnaW9uIHNlY29uZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiB0aGlyZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMik7Ci0JCQlpZiAoc2Vjb25kLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pICYmIHRoaXJkLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gaXQgaXMgYXNzdW1lZCB0aGF0IGZsYXRub2RlIGNvbnRhaW5zIGF0IGxlYXN0IDMgcmVnaW9ucwotCXB1YmxpYyBib29sZWFuIGlzTm90YXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzZWNvbmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gdGhpcmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDIpOwotCQkJaWYgKHNlY29uZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSAmJiB0aGlyZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gaXQgaXMgYXNzdW1lZCB0aGF0IGZsYXRub2RlIGNvbnRhaW5zIGF0IGxlYXN0IDMgcmVnaW9ucwotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPT0gMSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgwKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JYm9vbGVhbiBpc1NhbWVUb3BMZXZlbFR5cGUoRFRETm9kZSBhZmZlY3RlZE5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGFmZmVjdGVkTm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gcmV0dXJuIHRydWUgaWYgdGhlIGZsYXRub2RlIHN0aWxsIG1hdGNoZXMgd2hhdCB0aGUgYWZmZWN0ZWROb2RlCi0JCS8vIGlzIHJlcHJlc2VudGluZwotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiBpc0VsZW1lbnQoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgRW50aXR5ICYmIGlzRW50aXR5KGZsYXROb2RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGFmZmVjdGVkTm9kZSBpbnN0YW5jZW9mIENvbW1lbnQgJiYgaXNDb21tZW50KGZsYXROb2RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGFmZmVjdGVkTm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QgJiYgaXNBdHRyaWJ1dGVMaXN0KGZsYXROb2RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGFmZmVjdGVkTm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uICYmIGlzTm90YXRpb24oZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgVW5yZWNvZ25pemVkICYmIGlzVW5yZWNvZ25pemVkKGZsYXROb2RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVW5yZWNvZ25pemVkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJcmV0dXJuICFpc0VsZW1lbnQoZmxhdE5vZGUpICYmICFpc0VudGl0eShmbGF0Tm9kZSkgJiYgIWlzTm90YXRpb24oZmxhdE5vZGUpICYmICFpc1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZShmbGF0Tm9kZSkgJiYgIWlzQXR0cmlidXRlTGlzdChmbGF0Tm9kZSkgJiYgIWlzQ29tbWVudChmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZU5vZGUoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSByZWZlcmVuY2VOb2RlLCBEVEROb2RlIG5vZGVUb01vdmUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlpc01vdmluZ05vZGUgPSB0cnVlOwotCi0JCWRlbGV0ZU5vZGUocmVxdWVzdG9yLCBub2RlVG9Nb3ZlKTsKLQkJaW5zZXJ0SW50b01vZGVsKHJlcXVlc3RvciwgcmVmZXJlbmNlTm9kZSwgbm9kZVRvTW92ZSwgaXNBZnRlcik7Ci0JCWlzTW92aW5nTm9kZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJY3JlYXRpbmdOZXdNb2RlbCA9IHRydWU7Ci0JCW5vZGVMaXN0LmNsZWFyKCk7Ci0JCU5vZGVzRXZlbnQgcmVtb3ZlRXZlbnQgPSBuZXcgTm9kZXNFdmVudCgpOwotCQlyZW1vdmVFdmVudC5nZXROb2RlcygpLmFkZEFsbChub2RlTGlzdCk7Ci0JCW5vdGlmeU5vZGVzUmVtb3ZlZChyZW1vdmVFdmVudCk7Ci0JCS8qIHJlbW92ZUNoaWxkTm9kZXMoKTsgKi8KLQotCQlpZiAoZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgIT0gbnVsbCAmJiBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25MaXN0KCkgIT0gbnVsbCkgewotCQkJYnVpbGROb2RlcyhldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25MaXN0KCkpOwotCQl9Ci0JCWNyZWF0aW5nTmV3TW9kZWwgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZE5vZGVzID0gZXZlbnQuZ2V0T2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlOb2Rlc0V2ZW50IHJlbW92ZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG9sZE5vZGVzLml0ZW0oaSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChub2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpID09IGZsYXROb2RlKSB7Ci0JCQkJCXJlbW92ZWREVEROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYnVpbGROb2RlcyhldmVudC5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkpOwotCi0JCWlmIChyZW1vdmVkRFRETm9kZXMuZ2V0Tm9kZXMoKS5zaXplKCkgPiAwKSB7Ci0JCQlub3RpZnlOb2Rlc1JlbW92ZWQocmVtb3ZlZERURE5vZGVzKTsKLQkJCXJlbW92ZU5vZGVzKHJlbW92ZWREVEROb2Rlcy5nZXROb2RlcygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeU5vZGVDaGFuZ2VkKERURE5vZGUgbm9kZSkgewotCQlJdGVyYXRvciBpdGVyID0gbW9kZWxMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJRFRERmlsZUxpc3RlbmVyIGxpc3RlbmVyID0gKElEVERGaWxlTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJbGlzdGVuZXIubm9kZUNoYW5nZWQobm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlOb2Rlc0FkZGVkKE5vZGVzRXZlbnQgYWRkZWROb2RlcykgewotCQlJdGVyYXRvciBpdGVyID0gbW9kZWxMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJRFRERmlsZUxpc3RlbmVyIGxpc3RlbmVyID0gKElEVERGaWxlTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJbGlzdGVuZXIubm9kZXNBZGRlZChhZGRlZE5vZGVzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBtb2RlbExpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURUREZpbGVMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub2Rlc1JlbW92ZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVidWlsZE5vZGVzKExpc3Qgbm9kZXMpIHsKLQkJLy8gcmVtb3ZlIHRoZSBvbGQgbm9kZXMKLQkJcmVtb3ZlTm9kZXMobm9kZXMpOwotCi0JCS8vIG5vdyByZWJ1aWxkIHRoZW0KLQkJTm9kZXNFdmVudCBhZGRlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJSXRlcmF0b3IgZHRkTm9kZXMgPSBub2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZHRkTm9kZXMuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIGR0ZE5vZGUgPSAoRFRETm9kZSkgZHRkTm9kZXMubmV4dCgpOwotCQkJLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlYnVpbGRpbmcgIiArCi0JCQkvLyBkdGROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKSk7Ci0KLQkJCURURE5vZGUgbm9kZSA9IGJ1aWxkTm9kZShkdGROb2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlhZGRlZERURE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCS8vIG5vdyB0ZWxsIHBlb3BsZSBhYm91dCB0aGUgYWRkaXRpb25zCi0JCQlub3RpZnlOb2Rlc0FkZGVkKGFkZGVkRFRETm9kZXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVRleHRSZWdpb24gY2hhbmdlZFJlZ2lvbiA9IGV2ZW50LmdldFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCURURE5vZGUgYWZmZWN0ZWROb2RlID0gKERURE5vZGUpIGdldE5vZGVBdChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChjaGFuZ2VkUmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KGNoYW5nZWRSZWdpb24pKTsKLQkJaWYgKGFmZmVjdGVkTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBubyBuZWVkIHRvIHJlc29sdmUgcmVnaW9ucyBhcyBpdCBpcyBqdXN0IGEgY2hhbmdlCi0JCQkvLyAgICAgIGFmZmVjdGVkTm9kZS5yZXNvbHZlUmVnaW9ucygpOwotCQkJbm90aWZ5Tm9kZUNoYW5nZWQoYWZmZWN0ZWROb2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlMaXN0IG5vZGVzVG9SZWJ1aWxkID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCURURE5vZGUgYWZmZWN0ZWROb2RlID0gZ2V0Tm9kZShmbGF0Tm9kZSk7Ci0KLQkJaWYgKCFpc1NhbWVUb3BMZXZlbFR5cGUoYWZmZWN0ZWROb2RlKSkgewotCQkJbm9kZXNUb1JlYnVpbGQuYWRkKGFmZmVjdGVkTm9kZSk7Ci0JCQlyZWJ1aWxkTm9kZXMobm9kZXNUb1JlYnVpbGQpOwotCQl9IGVsc2UgewotCQkJYWZmZWN0ZWROb2RlLnJlc29sdmVSZWdpb25zKCk7Ci0JCQlub3RpZnlOb2RlQ2hhbmdlZChhZmZlY3RlZE5vZGUpOwotCQkJLy8gbm93IHRyeSBhbmQgZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2VyZSBhZGRlZAotCQkJTm9kZXNFdmVudCBhZGRlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gZXZlbnQuZ2V0TmV3UmVnaW9ucygpOwotCQkJaW50IHNpemUgPSBuZXdSZWdpb25zLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbmV3UmVnaW9ucy5nZXQoaSk7Ci0JCQkJRFRETm9kZSBkZWVwZXN0Tm9kZSA9IGFmZmVjdGVkTm9kZS5nZXREZWVwZXN0Tm9kZShmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSk7Ci0JCQkJaWYgKCFhZGRlZERURE5vZGVzLmdldE5vZGVzKCkuY29udGFpbnMoZGVlcGVzdE5vZGUpKSB7Ci0JCQkJCWFkZGVkRFRETm9kZXMuYWRkKGRlZXBlc3ROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCQlub3RpZnlOb2Rlc0FkZGVkKGFkZGVkRFRETm9kZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRFRERmlsZUxpc3RlbmVyKElEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbW9kZWxMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlcyhMaXN0IG5vZGVzKSB7Ci0JCWdldE5vZGVzKCkucmVtb3ZlQWxsKG5vZGVzKTsKLQkJLyoKLQkJICogZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkgKiByZW1vdmVDaGlsZCgoRFRETm9kZSlub2Rlcy5nZXQoaSkpOyB9IC8vIGVuZCBvZiBmb3IgKCkKLQkJICovCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9EVEROb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0RURE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0YmRhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0RURE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTm9kZUNvbnRhaW5lcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRETm9kZSBleHRlbmRzIE5vZGVDb250YWluZXIgaW1wbGVtZW50cyBJbmRleGVkUmVnaW9uIHsKLQotCS8vIHRoZXNlIGFyZSBjaGFyYWN0ZXJvZmZzZXRzCi0JcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQotCS8vIGZsYXQgbm9kZSB0aGF0IGNvbnRhaW5zIHRoaXMgbm9kZQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCi0JcHJvdGVjdGVkIFRleHRSZWdpb25MaXN0SW1wbCByZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JcHJvdGVjdGVkIFRleHRSZWdpb25MaXN0SW1wbCB3aGl0ZXNwYWNlID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JcHVibGljIERURE5vZGUoRFRERmlsZSBkdGRGaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JCXRoaXMuZmxhdE5vZGUgPSBmbGF0Tm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8qCi0JCSAqIGlmIChzdGFydFJlZ2lvbiA9PSBudWxsKSB7IHN0YXJ0UmVnaW9uID0gcmVnaW9uOyB9IGVuZFJlZ2lvbiA9Ci0JCSAqIHJlZ2lvbjsKLQkJICovCi0JCXJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkV2hpdGVzcGFjZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJd2hpdGVzcGFjZS5hZGQocmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBhcHBlbmRDaGlsZChvcmcudzNjLmRvbS5Ob2RlIG5ld0NoaWxkKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhcHBlbmRjaGlsZCBjYWxsZWQgd2l0aCAiICsgbmV3Q2hpbGQpOwotCQlyZXR1cm4gc3VwZXIuYXBwZW5kQ2hpbGQobmV3Q2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBsYWJlbCkgewotCQlnZXREVERGaWxlKCkuZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyhyZXF1ZXN0b3IsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwZXN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXN0UG9zaXRpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zUmFuZ2UodGVzdFBvc2l0aW9uLCB0ZXN0UG9zaXRpb24pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpIDw9IHN0YXJ0ICYmIGVuZCA8PSBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoRFRETm9kZSBjaGlsZCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0RURF9OT0RFX0RFTEVURSIpKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGUodGhpcywgY2hpbGQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgY2hpbGQpIHsKLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBjaGlsZC5nZXRTdGFydE9mZnNldCgpLCBjaGlsZC5nZXRGdWxsTm9kZUxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RvcikgewotCQlnZXREVERGaWxlKCkuZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbkxpc3QoKS50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KCkgewotCQlvcmcudzNjLmRvbS5Ob2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBnZXREZWVwZXN0Tm9kZShpbnQgb2Zmc2V0KSB7Ci0JCWlmIChjb250YWlucyhvZmZzZXQpKSB7Ci0JCQkvLyBub3cgc2VlIGlmIGEgY2hpbGQgY29udGFpbnMgdGhpcyBvZmZzZXQKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlEVEROb2RlIGNoaWxkID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJCURURE5vZGUgZGVlcGVzdCA9IGNoaWxkLmdldERlZXBlc3ROb2RlKG9mZnNldCk7Ci0JCQkJaWYgKGRlZXBlc3QgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVlcGVzdDsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBvZiBmb3IgKCkKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldERlZXBlc3ROb2RlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAoY29udGFpbnNSYW5nZShzdGFydCwgZW5kKSkgewotCQkJLy8gbm93IHNlZSBpZiBhIGNoaWxkIGNvbnRhaW5zIHRoaXMgb2Zmc2V0Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRFRETm9kZSBjaGlsZCA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCQlEVEROb2RlIGRlZXBlc3QgPSBjaGlsZC5nZXREZWVwZXN0Tm9kZShzdGFydCwgZW5kKTsKLQkJCQlpZiAoZGVlcGVzdCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZWVwZXN0OwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIGZvciAoKQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZ2V0RW5kUmVnaW9uKCkpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFbmRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOy8vIGVuZFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSUZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCURURE1vZGVsSW1wbCBtb2RlbCA9IGR0ZEZpbGUuZ2V0RFRETW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUlGYWN0b3J5UmVnaXN0cnkgcmVnID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQlpZiAocmVnICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlZzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZ1bGxOb2RlTGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpIC0gZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOb2RlVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXROb2RlVGV4dCgpOwotCQlpZiAod2hpdGVzcGFjZS5zaXplKCkgPiAwKSB7Ci0JCQlSZWdpb25JdGVyYXRvciBpdGVyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHdoaXRlc3BhY2UpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJdGV4dCArPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIEltYWdlIGdldEltYWdlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5BTUUpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHJldHVybiB0aGUgZmlyc3QgdG9rZW4gY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHRva2VuIHR5cGUKLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbihSZWdpb25JdGVyYXRvciBpdGVyLCBTdHJpbmcgdHlwZSkgewotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE5vZGVMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRFbmRPZmZzZXQoKSAtIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVUZXh0KCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlzYi5hcHBlbmQoZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZ2V0U3RhcnRSZWdpb24oKSk7Ci0JfQotCi0JLy8gcHJpdmF0ZSBSZWdpb24gc3RhcnRSZWdpb24sZW5kUmVnaW9uOwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRTdGFydFJlZ2lvbigpIHsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KDApOwotCQkvLyByZXR1cm4gc3RhcnRSZWdpb247Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBmbGF0Tm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGZsYXROb2RlLgotCSAqIAotCSAqIElTU1VFOm5hbWVkIGNoYW5nZWQgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkCi0JICogc3VwZXIgY2xhc3MgbWV0aG9kLCBidXQgc2hvdWxkIHJlLXRoaW5rIGlmIHRoaXMgaXMgY29ycmVjdCB0ZWNobmlxdWUuCi0JICogUGVyaGFwcyBnZXRGaXJzdFJlZ2lvbj8KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQkvLyByZXR1cm4gZW5kIG9mZnNldCBpbmNsdWRpbmcgd2hpdGVzcGFjZQotCS8vIG9yIGp1c3QgdGhlIGVuZCBvZmZzZXQgaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZQotCXB1YmxpYyBpbnQgZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpIHsKLQkJaWYgKHdoaXRlc3BhY2Uuc2l6ZSgpID4gMCkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gd2hpdGVzcGFjZS5nZXQod2hpdGVzcGFjZS5zaXplKCkgLSAxKTsKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfQotCi0JCXJldHVybiBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNUcmFpbGluZ1doaXRlc3BhY2UoKSB7Ci0JCXJldHVybiB3aGl0ZXNwYWNlLnNpemUoKSA+IDA7Ci0JfQotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZSByZWdpb24gaXRlciAiICsgdGhpcy5nZXRDbGFzcygpICsgIiB3aXRoCi0JCS8vIHN0YXJ0ICwgZW5kID0gIiArIGdldFN0YXJ0T2Zmc2V0KCkgKyAiLCAiICtnZXRFbmRPZmZzZXQoKSk7Ci0JCXJldHVybiBuZXcgUmVnaW9uSXRlcmF0b3IocmVnaW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RvciwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgbmV3VGV4dCkgewotCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydCwgbGVuZ3RoLCBuZXdUZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVnaW9ucygpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBuYW1lKSB7Ci0JCWlmICghZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lVG9rZW4udXBkYXRlVGV4dChuYW1lKTsKLQkJCQlnZXREVERGaWxlKCkuZ2V0RFRETW9kZWwoKS5nZXRSZWZlcmVuY2VVcGRhdGVyKCkubmFtZUFib3V0VG9DaGFuZ2UocmVxdWVzdG9yLCB0aGlzLCBuYW1lKTsKLQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldExlbmd0aCgpLCBuYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9EVERfTk9ERV9OQU1FX0NIRyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXROYW1lKHRoaXMsIG5hbWUpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBmbGF0Tm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGZsYXROb2RlLiBJU1NVRTpuYW1lZCBjaGFuZ2VkIG5vdCB0byBiZQotCSAqICAgICAgICAgICAgY29uZnVzZWQgd2l0aCBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgc3VwZXIgY2xhc3MgbWV0aG9kLAotCSAqICAgICAgICAgICAgYnV0IHNob3VsZCByZS10aGluayBpZiB0aGlzIGlzIGNvcnJlY3QgdGVjaG5pcXVlCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB2KSB7Ci0JCXRoaXMuZmxhdE5vZGUgPSB2OwotCX0KLQotCS8vIHNraXBzIHBhc3QgbmV4dCBuYW1lIHRva2VuIGluIHRoZSBpdGVyYXRvcgotCXByb3RlY3RlZCB2b2lkIHNraXBQYXN0TmFtZShSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5BTUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKGphdmEubGFuZy5TdHJpbmcgZmVhdHVyZSwgamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvRFREUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0RURFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTlkZWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvRFREUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBpbnRlcm5hbCBEVERDb3JlUGx1Z2luIGNsYXNzIGluc3RlYWQgaWYgcG9zc2libGUKLSAqLwotcHVibGljIGNsYXNzIERURFBsdWdpbiBleHRlbmRzIERURENvcmVQbHVnaW4gewotCS8vIHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbgotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9EVERSZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9EVERSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjFkMDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvRFREUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVzb3VyY2UgewotCS8vRW51bWVyYXRpb24gQ29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2FueS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFTElTVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfbGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUREZJTEVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UUkVGSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWVJFRkVSRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTERSX0FUVExJU1QgPSAiaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfYXR0bGlzdF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfQ09NTSA9ICJpY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9FTCA9ICJpY29ucy9mdWxsL29iajE2L2ZsZHJfZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfRU5UID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfTk9UID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfVU5SRUMgPSAiaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0RURCA9ICJpY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0hUTUxGT1JNID0gImljb25zL2Z1bGwvb2JqMTYvZ2VuaHRtZm9ybV93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORUNIT0lDRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZW9ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29wdGlvbmFsY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxTRVFVRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0RBVEFJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlJFQ09HTklaRURJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVDSE9JQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNDdmMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRWxlbWVudCBleHRlbmRzIE5hbWVkVG9wTGV2ZWxOb2RlIHsKLQotCUxpc3QgYXR0TGlzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNvbnRlbnRNb2RlbDsKLQotCXB1YmxpYyBFbGVtZW50KERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlRfQUREX0FUVFIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBhdHRMaXN0cyA9IGdldEF0dHJpYnV0ZUxpc3RzKCk7Ci0JCWlmIChhdHRMaXN0cy5zaXplKCkgPT0gMCkgewotCQkJZ2V0RFRERmlsZSgpLmNyZWF0ZUF0dHJpYnV0ZUxpc3QodGhpcywgZ2V0TmFtZSgpLCB0cnVlKTsKLQkJCWF0dExpc3RzID0gZ2V0QXR0cmlidXRlTGlzdHMoKTsKLQkJfQotCQlpZiAoYXR0TGlzdHMuc2l6ZSgpID4gMCkgewotCQkJQXR0cmlidXRlTGlzdCBhdHRMaXN0ID0gKEF0dHJpYnV0ZUxpc3QpIGF0dExpc3RzLmdldChhdHRMaXN0cy5zaXplKCkgLSAxKTsKLQkJCWF0dExpc3QuYWRkQXR0cmlidXRlKG5hbWUpOwotCQl9Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9FTEVNRU5UX0FERF9DSElMRCIpKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRDb250ZW50KHRoaXMsICIgRU1QVFkiKTsgLy8kTk9OLU5MUy0xJAotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgY29udGVudCkgewotCQlJVGV4dFJlZ2lvbiB3aGl0ZXNwYWNlID0gZ2V0V2hpdGVzcGFjZUFmdGVyTmFtZSgpOwotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQkJaWYgKHdoaXRlc3BhY2UgIT0gbnVsbCkgewotCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCh3aGl0ZXNwYWNlKTsKLQkJCWxlbmd0aCA9IHdoaXRlc3BhY2UuZ2V0TGVuZ3RoKCkgPj0gMiA/IDEgOiAwOwotCQl9IGVsc2UgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuYW1lUmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVRleHRSZWdpb24gZWxlbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGVsZW1lbnRUYWcpOwotCQkJfQotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGxlbmd0aCwgY29udGVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkR3JvdXAoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVQbHVnaW4uZ2V0RFREU3RyaW5nKCJfVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQIikpOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbnRlbnQodGhpcywgIiAoKSIpOyAvLyROT04tTkxTLTEkCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudChkdGRGaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXR0cmlidXRlTGlzdHMoKSB7Ci0JCWF0dExpc3RMaXN0LmNsZWFyKCk7Ci0JCVN0cmluZyBlbGVtZW50TmFtZSA9IGdldE5hbWUoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGR0ZEZpbGUuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCAmJiBub2RlLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJYXR0TGlzdExpc3QuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRMaXN0TGlzdDsKLQl9Ci0KLQotCi0JcHVibGljIENNTm9kZSBnZXRDb250ZW50TW9kZWwoKSB7Ci0JCS8vICAgIE9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKQotCQlyZXR1cm4gKENNTm9kZSkgZ2V0Rmlyc3RDaGlsZCgpOy8vY29udGVudE1vZGVsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEVsZW1lbnRBdHRyaWJ1dGVzKCkgewotCQlhdHRyaWJ1dGVzLmNsZWFyKCk7Ci0JCUl0ZXJhdG9yIGF0dExpc3RzID0gZ2V0QXR0cmlidXRlTGlzdHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoYXR0TGlzdHMuaGFzTmV4dCgpKSB7Ci0JCQlBdHRyaWJ1dGVMaXN0IGF0dExpc3QgPSAoQXR0cmlidXRlTGlzdCkgYXR0TGlzdHMubmV4dCgpOwotCi0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGF0dExpc3QuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlhdHRyaWJ1dGVzLmFkZChjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkVMRU1FTlRJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBOb2RlLkVMRU1FTlRfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlQ29udGVudE1vZGVsKE9iamVjdCByZXF1ZXN0b3IsIENNTm9kZSBub2RlKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQkJU3RyaW5nIG5vZGVUZXh0ID0gbm9kZS5nZXROb2RlVGV4dCgpOwotCQlDTU5vZGUgY29udGVudE1vZGVsID0gZ2V0Q29udGVudE1vZGVsKCk7Ci0JCWlmIChjb250ZW50TW9kZWwgIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gY29udGVudE1vZGVsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBjb250ZW50TW9kZWwuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBvZmZzZXQsIGxlbmd0aCwgbm9kZVRleHQpOwotCQl9IGVsc2UgewotCQkJYWRkQ29udGVudChyZXF1ZXN0b3IsIG5vZGVUZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQkvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVsZW1lbnQgbm9kZSBzdHJlYW0gPSAiICsKLQkJLy8gdG9rZW5TdHJlYW0uZ2V0U3RyaW5nKCkpOwotCQljb250ZW50TW9kZWwgPSBudWxsOwotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCWlmIChnZXROYW1lUmVnaW9uKCkgIT0gbnVsbCkgewotCQkJLy8gd2Ugc2tpcCBwYXN0IHRoZSBuYW1lIHRva2VuIGlzIG91ciBuYW1lCi0JCQlza2lwUGFzdE5hbWUoaXRlcik7Ci0JCX0KLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKGNvbnRlbnRNb2RlbCA9PSBudWxsKSB7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OQU1FKSkgewotCQkJCQljb250ZW50TW9kZWwgPSBuZXcgQ01CYXNpY05vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJfSBlbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpKSB7Ci0JCQkJCWNvbnRlbnRNb2RlbCA9IG5ldyBDTUJhc2ljTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKSkgewotCQkJCQljb250ZW50TW9kZWwgPSBuZXcgQ01Hcm91cE5vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY29udGVudE1vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoIWN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTkRfVEFHKSkgewotCQkJCQkvLyBjb250ZW50IG1vZGVsIGdldHMgYWxsIHJlZ2lvbnMgZXhjZXB0IGZvciB0aGUgJz4nCi0JCQkJCWNvbnRlbnRNb2RlbC5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gaWYgaXQgaXMgZXF1YWwgdG8gdGhlIGVuZCB0YWcsIHRoZW4gZG9uJ3QgYWRkIGFueW1vcmUKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQkvLyBmb3IgdGhlIGNvbnRlbnQgbW9kZWwKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJfQotCQlpZiAoY29udGVudE1vZGVsICE9IG51bGwpIHsKLQkJCWFwcGVuZENoaWxkKGNvbnRlbnRNb2RlbCk7Ci0JCQkvLyB0aGlzIGlzIHRoZSByb290IGVsZW1lbnQgY29udGVudCBzbyBzZXQgaXQgdHJ1ZQotCQkJY29udGVudE1vZGVsLnNldFJvb3RFbGVtZW50Q29udGVudCh0cnVlKTsKLQkJCS8vIG5vdyB0ZWxsIHRoZSBjb250ZW50IG1vZGVsIHRvIHJlc29sdmUgaXQncyByZWdpb25zCi0JCQljb250ZW50TW9kZWwucmVzb2x2ZVJlZ2lvbnMoKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudE1vZGVsKENNTm9kZSBjb250ZW50TW9kZWwpIHsKLQkJdGhpcy5jb250ZW50TW9kZWwgPSBjb250ZW50TW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9FbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWQyMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9FbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gZXh0ZXJuYWwgbm9kZSBjb250YWlucyBjb2RlIHRvIGhlbHAgc2V0IGFuZCBnZXQgcHVibGljIGlkcwotcHVibGljIGNsYXNzIEVudGl0eSBleHRlbmRzIEV4dGVybmFsTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2V0RXh0ZXJuYWxFbnRpdHkgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0VOVElUWV9TRVRfRVhUX0VOVElUWSIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldEdlbmVyYWxFbnRpdHkgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0VOVElUWV9TRVRfR0VORVJBTF9FTlRJVFkiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXRJbnRlcm5hbEVudGl0eSA9IERURENvcmVQbHVnaW4uZ2V0RFREU3RyaW5nKCJfVUlfTEFCRUxfRU5USVRZX1NFVF9JTlRfRU5USVRZIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXRQYXJhbWV0ZXJFbnRpdHkgPSBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0VOVElUWV9TRVRfUEFSTV9FTlRJVFkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEVudGl0eShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTlRJVFlJQ09OKTsKLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb25OYW1lKCkgewotCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOwotCQlpZiAobmRhdGFSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQobmRhdGFSZWdpb24pOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQZXJjZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJaWYgKCFpc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0JCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24odmFsdWVSZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZXh0ZXJuYWxFbnRpdHkuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBleHRlcm5hbEVudGl0eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSAhPSBudWxsIHx8IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiBnZXRQZXJjZW50UmVnaW9uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTkRhdGEoT2JqZWN0IHJlcXVlc3RvcikgewotCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IG51bGw7Ci0KLQkJLy8gc2VlIGlmIHdlIGhhdmUgYW4gTkRBVEEga2V5d29yZAotCQluZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7Ci0JCWludCBzdGFydE9mZnNldCA9IDAsIGVuZE9mZnNldCA9IDA7Ci0JCWlmIChuZGF0YVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KG5kYXRhUmVnaW9uKTsKLQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZGF0YVJlZ2lvbik7Ci0JCX0KLQkJSVRleHRSZWdpb24gdmFsdWUgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCh2YWx1ZSk7Ci0JCQl9Ci0JCQllbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQodmFsdWUpOwotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGV4dGVybmFsRW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZXh0ZXJuYWxFbnRpdHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxFbnRpdHkoYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KSB7Ci0JCWlmIChpc0V4dGVybmFsRW50aXR5KCkgIT0gaXNFeHRlcm5hbEVudGl0eSkgewotCQkJLy8gICAgICBleHRlcm5hbEVudGl0eSA9IHY7Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCBpc0V4dGVybmFsRW50aXR5ID8gc2V0RXh0ZXJuYWxFbnRpdHkgOiBzZXRJbnRlcm5hbEVudGl0eSk7Ci0JCQlpZiAoaXNFeHRlcm5hbEVudGl0eSkgewotCQkJCS8vIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZiB0aGUgdmFsdWUgbGl0ZXJhbAotCQkJCUlUZXh0UmVnaW9uIHF1b3RlID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7Ci0JCQkJaWYgKHF1b3RlID09IG51bGwpIHsKLQkJCQkJcXVvdGUgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsKLQkJCQl9Ci0JCQkJaWYgKHF1b3RlICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocXVvdGUpLCBxdW90ZS5nZXRMZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXNldFN5c3RlbUlEKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIGdldCByaWQgb2YgdGV4dCBiZXR3ZWVuIGVuZCBvZiBuYW1lIHJlZ2lvbiBhbmQKLQkJCQkvLyB0aGUgbGFzdCBkb3VibGUgcXVvdGVkIGxpdGVyYWwKLQkJCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQlJVGV4dFJlZ2lvbiBrZXl3b3JkID0gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyKTsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCWludCBsZW5ndGggPSAwOwotCQkJCWlmIChrZXl3b3JkID09IG51bGwpIHsKLQkJCQkJLy8gcmVzZXQgdGhlIGl0ZXJhdG9yCi0JCQkJCWl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQlrZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyKTsKLQkJCQl9Ci0JCQkJaWYgKGtleXdvcmQgIT0gbnVsbCkgewotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGtleXdvcmQpOwotCQkJCQkvLyBzdGFydCB3aXRoIGEgbGVuZ3RoIGp1c3QgZXF1YWwgdG8gdGhlIGtleXdvcmQgZm9yIG5vdwotCQkJCQlsZW5ndGggPSBrZXl3b3JkLmdldExlbmd0aCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHJlc2V0IHRoZSBpdGVyYXRvciBzaW5jZSB3ZSBkaWRuJ3QgZmluZCB0aGUga2V5d29yZAotCQkJCQlpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQkJLy8ganVzdCBnbyBmcm9tIGFmdGVyIHRoZSBuYW1lCi0JCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGdldE5hbWVSZWdpb24oKSk7Ci0JCQkJfQotCi0JCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgc3RhcnQsIGxvb2sgZm9yIHRoZSBlbmQKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gbnVsbDsKLQotCQkJCWlmIChsYXN0UmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gdGhlbiBsb29rIGZvciBsYXN0IHF1b3RlZCBsaXRlcmFsCi0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJSVRleHRSZWdpb24gbGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJCQkJaWYgKGxpdGVyYWwgIT0gbnVsbCkgewotCQkJCQkJCWxhc3RSZWdpb24gPSBsaXRlcmFsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCQlsZW5ndGggPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobGFzdFJlZ2lvbikgLSBzdGFydE9mZnNldDsKLQkJCQl9Ci0JCQkJcmVwbGFjZVRleHQodGhpcywgc3RhcnRPZmZzZXQsIGxlbmd0aCwgIlwiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlbW92ZU5EYXRhKHRoaXMpOwotCQkJfQotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb25OYW1lKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBuZXdOb3RhdGlvbikgewotCQlpZiAoIWdldE5vdGF0aW9uTmFtZSgpLmVxdWFscyhuZXdOb3RhdGlvbikpIHsKLQkJCWlmICghbmV3Tm90YXRpb24uZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gCi0JCQkJSVRleHRSZWdpb24gbmRhdGFSZWdpb24gPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsKLQkJCQlpZiAobmRhdGFSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KG5kYXRhUmVnaW9uKSwgbmRhdGFSZWdpb24uZ2V0TGVuZ3RoKCksIG5ld05vdGF0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB0aW1lIHRvIGNyZWF0ZSBvbmUKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQlJVGV4dFJlZ2lvbiBuZGF0YUtleXdvcmQgPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOwotCQkJCQlpZiAobmRhdGFLZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCS8vIHdlJ2xsIG5lZWQgdG8gY3JlYXRlIG9uZSBhZnRlciB0aGUgbGFzdCBxdW90ZWQKLQkJCQkJCS8vIGxpdGVyYWwKLQkJCQkJCS8vIFJlc2V0IGl0ZXJhdG9yCi0JCQkJCQlzdHJpbmcgKz0gIiBOREFUQSAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQkJCUlUZXh0UmVnaW9uIGxhc3RRdW90ZWRMaXRlcmFsID0gbnVsbDsKLQkJCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJCUlUZXh0UmVnaW9uIGxpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJCQlpZiAobGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJCQkJCWxhc3RRdW90ZWRMaXRlcmFsID0gbGl0ZXJhbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobGFzdFF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGxhc3RRdW90ZWRMaXRlcmFsKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gY3JlYXRlZCBhZnRlciB0aGUgc3lzdGVtIG9yIHB1YmxpYyBrZXl3b3JkCi0JCQkJCQkJSVRleHRSZWdpb24ga2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQkJCQkJaWYgKGtleXdvcmQgPT0gbnVsbCkgewotCQkJCQkJCQlrZXl3b3JkID0gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gd2Ugc2hvdWxkbid0IGJlIG51bGwgaGVyZSBzaW5jZSB3ZSBjaGVjayBpZiB3ZQotCQkJCQkJCS8vIHdlcmUgZXh0ZXJuYWwgYWxyZWFkeQotCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGtleXdvcmQpOwotCQkJCQkJfQotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZGF0YUtleXdvcmQpOwotCQkJCQl9Ci0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIDAsIHN0cmluZyArIG5ld05vdGF0aW9uKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIG5lZWQgdG8gcmVtb3ZlIHRoZSBuZGF0YSBzdHVmZgotCQkJCXJlbW92ZU5EYXRhKHJlcXVlc3Rvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIG5vdGF0aW9uTmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm90YXRpb24KLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBub3RhdGlvbk5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb25OYW1lKFN0cmluZyBuZXdOb3RhdGlvbikgewotCQliZWdpblJlY29yZGluZyh0aGlzLCAiTkRBVEEgIiArIERURENvcmVQbHVnaW4uZ2V0RFREU3RyaW5nKCJfVUlfTEFCRUxfRU5USVRZX05EQVRBX0NIQU5HRSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNldE5vdGF0aW9uTmFtZSh0aGlzLCBuZXdOb3RhdGlvbik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gdikgewotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHkoKSAhPSB2KSB7Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCB2ID8gc2V0UGFyYW1ldGVyRW50aXR5IDogc2V0R2VuZXJhbEVudGl0eSk7Ci0JCQlpZiAodikgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKTsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwLCBsZW5ndGggPSAwOwotCi0JCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UgJiYgcmVnaW9uLmdldExlbmd0aCgpID4gMSkgewotCQkJCQkJbGVuZ3RoID0gMTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHN0YXJ0VGFnKTsKLQkJCQl9Ci0JCQkJcmVwbGFjZVRleHQodGhpcywgc3RhcnRPZmZzZXQsIGxlbmd0aCwgIiAlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBub3cgZ2V0IHJpZCBvZiBhbnkgTkRhdGEgc2luY2UgaXQgaXMgb25seSBhbGxvd2VkIGlmIHRoZQotCQkJCS8vIGVudGl0eSBpcyBhIGdlbmVyYWwgZW50aXR5IGFuZCBub3QgYSBwYXJhbWV0ZXIgZW50aXR5Ci0JCQkJcmVtb3ZlTkRhdGEodGhpcyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGdldCByaWQgb2YgcGVyY2VudCByZWdpb24KLQkJCQlJVGV4dFJlZ2lvbiBwZXJjZW50UmVnaW9uID0gZ2V0UGVyY2VudFJlZ2lvbigpOwotCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHBlcmNlbnRSZWdpb24pLCBwZXJjZW50UmVnaW9uLmdldExlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQlpZiAoIWdldFZhbHVlKCkuZXF1YWxzKHYpKSB7Ci0JCQkJLy8gdGhlbiBpdCBtYWtlcyBzZW5zZSB0byBjaGFuZ2UgdGhlIHZhbHVlCi0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJCQlTdHJpbmcgcXVvdGVDaGFyID0gdi5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSwgdmFsdWVSZWdpb24uZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLk5BTUUpOwotCQkJCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQkJCS8vIGNyZWF0ZSBpdCBhZnRlciB0aGUgcGVyY2VudCBpZiB0aGVyZSBpcyBvbmUKLQkJCQkJCXJlZ2lvbiA9IGdldFBlcmNlbnRSZWdpb24oKTsKLQkJCQkJfQotCQkJCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQkJCS8vIGlmIHN0aWxsIG51bGwsIHRoZW4gY3JlYXRlIGl0IGFmdGVyIHRoZSBlbGVtZW50IHRhZwotCQkJCQkJcmVnaW9uID0gZ2V0U3RhcnRUYWcoaXRlcmF0b3IoKSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCAwLCBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdikgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX0VOVElUWV9WQUxVRV9DSEciKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VmFsdWUodGhpcywgdik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvRXh0ZXJuYWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL0V4dGVybmFsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTA2OGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvRXh0ZXJuYWxOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gYmFzZSBjbGFzcyBmb3Igbm9kZXMgdGhhdCBjYW4gY29udGFpbiBleHRlcm5hbCBjb250ZW50Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZXJuYWxOb2RlIGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCi0JU3RyaW5nIHB1YmxpY0lEOwotCi0JU3RyaW5nIHN5c3RlbUlEOwotCi0JcHVibGljIEV4dGVybmFsTm9kZShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIFN0cmluZyB0YWdUeXBlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCB0YWdUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmV4dFF1b3RlZExpdGVyYWwoUmVnaW9uSXRlcmF0b3IgaXRlcikgewotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKSB8fCByZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgcHVibGljSUQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBwdWJsaWNJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotCQlJVGV4dFJlZ2lvbiBwdWJsaWNWYWx1ZSA9IGdldFB1YmxpY1ZhbHVlUmVnaW9uKCk7Ci0JCWlmIChwdWJsaWNWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKHB1YmxpY1ZhbHVlKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXJldHVybiBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JEKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UHVibGljVmFsdWVSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCUlUZXh0UmVnaW9uIHB1YmxpY0tleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXIpOwotCi0JCWlmIChwdWJsaWNLZXl3b3JkICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHF1b3RlZExpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCWlmIChxdW90ZWRMaXRlcmFsICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcXVvdGVkTGl0ZXJhbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN5c3RlbUlELgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3lzdGVtSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JRCgpIHsKLQkJSVRleHRSZWdpb24gc3lzdGVtVmFsdWUgPSBnZXRTeXN0ZW1WYWx1ZVJlZ2lvbigpOwotCQlpZiAoc3lzdGVtVmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFZhbHVlRnJvbVF1b3RlZFJlZ2lvbihzeXN0ZW1WYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN5c3RlbUtleXdvcmRSZWdpb24oUmVnaW9uSXRlcmF0b3IgaXRlcikgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN5c3RlbVZhbHVlUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlJVGV4dFJlZ2lvbiBzeXN0ZW1LZXl3b3JkID0gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyKTsKLQkJaWYgKHN5c3RlbUtleXdvcmQgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcXVvdGVkTGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJaWYgKHF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCXJldHVybiBxdW90ZWRMaXRlcmFsOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gdHJ5IGFuZCBzZWUgaWYgdGhlcmUgaXMgYSBzZWNvbmQgcXVvdGVkIGxpdGVyYWwgYWZ0ZXIgYSBwdWJsaWMKLQkJCS8vIGtleXdvcmQKLQkJCWl0ZXIgPSBpdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gcHVibGljS2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcik7Ci0KLQkJCWlmIChwdWJsaWNLZXl3b3JkICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiBxdW90ZWRMaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQkJaWYgKHF1b3RlZExpdGVyYWwgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJCQkvLyBub3cgZ2V0IHRoZSBzZWNvbmQgcXVvdGVkIGxpdGVyYWwKLQkJCQkJcXVvdGVkTGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJCQlpZiAocXVvdGVkTGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBnb3QgaXQhCi0JCQkJCQlyZXR1cm4gcXVvdGVkTGl0ZXJhbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlRnJvbVF1b3RlZFJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpIHx8IHR5cGUuZXF1YWxzKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKSkgewotCQkJU3RyaW5nIHRleHQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgcHVibGljSUQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBwdWJsaWNJRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJRChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgdikgewotCQlpZiAoIXYuZXF1YWxzKHB1YmxpY0lEKSkgewotCQkJcHVibGljSUQgPSB2OwotCQkJSVRleHRSZWdpb24gcHVibGljVmFsdWUgPSBnZXRQdWJsaWNWYWx1ZVJlZ2lvbigpOwotCQkJSVRleHRSZWdpb24gcHVibGljS2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQlJVGV4dFJlZ2lvbiBzeXN0ZW1LZXl3b3JkID0gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCUlUZXh0UmVnaW9uIHN5c3RlbVZhbHVlID0gZ2V0U3lzdGVtVmFsdWVSZWdpb24oKTsKLQotCQkJaWYgKHYuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHB1YmxpY0tleXdvcmQgIT0gbnVsbCkgewotCQkJCQkvLyB0aW1lIHRvIGdldCByaWQgb2YgdGhlIHB1YmxpYyBrZXl3b3JkIGFuZCB2YWx1ZQotCQkJCQkvLyBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBzeXN0ZW0gb25lCi0JCQkJCWludCBzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHB1YmxpY0tleXdvcmQpOwotCQkJCQlTdHJpbmcgbmV3U3RyaW5nID0gIlNZU1RFTSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHN5c3RlbVZhbHVlID09IG51bGwpIHsKLQkJCQkJCW5ld1N0cmluZyArPSAiIFwiXCIiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHB1YmxpY1ZhbHVlKSAtIHN0YXJ0T2Zmc2V0LCBuZXdTdHJpbmcpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gaGVyZSB3ZXJlIHNldHRpbmcgYSBub24gZW1wdHkgdmFsdWUKLQkJCQlTdHJpbmcgcXVvdGVDaGFyID0gdi5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpZiAocHVibGljVmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHB1YmxpY1ZhbHVlKSwgcHVibGljVmFsdWUuZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHB1YmxpY0lEICsgcXVvdGVDaGFyKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB0aW1lIHRvIGNyZWF0ZSBzdHVmZgotCQkJCQlpZiAocHVibGljS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0aGVuIGp1c3QgcHV0IG91ciBuZXcgdmFsdWUgYWZ0ZXIgdGhlIGtleXdvcmQKLQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHB1YmxpY0tleXdvcmQpLCAwLCAiICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gd2UgbmVlZCB0aGUgcHVibGljIGtleXdvcmQgYXMgd2VsbAotCQkJCQkJaWYgKHN5c3RlbUtleXdvcmQgIT0gbnVsbCkgewotCQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoc3lzdGVtS2V5d29yZCksIHN5c3RlbUtleXdvcmQuZ2V0TGVuZ3RoKCksICJQVUJMSUMgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbiksIDAsICIgUFVCTElDICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gcHVibGljSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHYpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9FWFRfTk9ERV9QVUJMSUNfSURfQ0hHIikpOyAvLyROT04tTkxTLTEkCi0JCXNldFB1YmxpY0lEKHRoaXMsIHYpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN5c3RlbUlELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlEKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghdi5lcXVhbHMoc3lzdGVtSUQpIHx8IChnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpID09IG51bGwgJiYgZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSA9PSBudWxsKSkgewotCQkJc3lzdGVtSUQgPSB2OwotCQkJU3RyaW5nIHF1b3RlQ2hhciA9IHYuaW5kZXhPZigiXCIiKSA9PSAtMSA/ICJcIiIgOiAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlJVGV4dFJlZ2lvbiBzeXN0ZW1WYWx1ZSA9IGdldFN5c3RlbVZhbHVlUmVnaW9uKCk7Ci0JCQlpZiAoc3lzdGVtVmFsdWUgIT0gbnVsbCkgewotCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoc3lzdGVtVmFsdWUpLCBzeXN0ZW1WYWx1ZS5nZXRMZW5ndGgoKSwgcXVvdGVDaGFyICsgc3lzdGVtSUQgKyBxdW90ZUNoYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlJVGV4dFJlZ2lvbiBzeXN0ZW1LZXl3b3JkID0gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQotCQkJCS8vIHRpbWUgdG8gY3JlYXRlIHN0dWZmCi0JCQkJaWYgKHN5c3RlbUtleXdvcmQgIT0gbnVsbCkgewotCQkJCQkvLyB0aGVuIGp1c3QgcHV0IG91ciBuZXcgdmFsdWUgYWZ0ZXIgdGhlIGtleXdvcmQKLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoc3lzdGVtS2V5d29yZCksIDAsICIgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gc2VlIGlmIHdlIGhhdmUgYSBwdWJsaWMga2V5d29yZAotCQkJCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCQkJaWYgKHB1YmxpY0tleXdvcmQgPT0gbnVsbCkgewotCQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQotCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbiksIDAsICIgU1lTVEVNICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gcHV0IGl0IGFmdGVyIHRoZSBwdWJsaWMgdmFsdWUgcmVnaW9uCi0JCQkJCQlJVGV4dFJlZ2lvbiBwdWJsaWNWYWx1ZVJlZ2lvbiA9IGdldFB1YmxpY1ZhbHVlUmVnaW9uKCk7Ci0JCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChwdWJsaWNWYWx1ZVJlZ2lvbiksIDAsICIgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN5c3RlbUlELgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3lzdGVtSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHYpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9FWFRfTk9ERV9TWVNURU1fSURfQ0hHIikpOyAvLyROT04tTkxTLTEkCi0JCXNldFN5c3RlbUlEKHRoaXMsIHYpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYzEyYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGludGVybmFsIHBhY2thZ2UgYmVjYXVzZSBvbmx5IHRoaXMgcGx1Z2luIHNob3VsZCBiZQotICogdXNpbmcgdGhpcyBMb2dnZXIgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTG9nZ2VyIHsKLQkvLyBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkxvZ2dlcgotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9OYW1lZFRvcExldmVsTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9OYW1lZFRvcExldmVsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTY3MjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvTmFtZWRUb3BMZXZlbE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBpbnRlcmZhY2UgZm9yIG5vZGVzIHRoYXQgY2FuIGV4aXN0IGF0IHRoZSB0b3AgbGV2ZWwgaW4gYSBkdGRmaWxlCi0vLyBlZy4gZW50aXR5LCBub3RhdGlvbiwgZWxlbWVudCwgY29tbWVudCwgYXR0bGlzdCwgb3IgdW5yZWNvZ25pemVkIHN0dWZmIChpZQotLy8gPGp1bmsgZGtmamRsPgotcHVibGljIGFic3RyYWN0IGNsYXNzIE5hbWVkVG9wTGV2ZWxOb2RlIGV4dGVuZHMgVG9wTGV2ZWxOb2RlIHsKLQotCXByaXZhdGUgU3RyaW5nIHRhZ1N0YXJ0VHlwZTsKLQotCXB1YmxpYyBOYW1lZFRvcExldmVsTm9kZShEVERGaWxlIGR0ZEZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCXN1cGVyKGR0ZEZpbGUsIGZsYXROb2RlKTsKLQkJdGFnU3RhcnRUeXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJLy8gbmFtZSByZWdpb24gaXMgbG9jYXRlZCBhZnRlciB0aGUgd2hpdGVzcGFjZSAod2hpY2ggaXMgYWZ0ZXIKLQkJLy8gdGhlIGVsZW1lbnR0YWcKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHN0YXJ0VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCB0YWdTdGFydFR5cGUpOwotCi0JCWlmICghaXRlci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCWlmICghcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFpdGVyLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0KLQkJLy8gd2Ugbm9ybWFsbHkgc3RvcCBoZXJlLCBidXQgZm9yIGVudGl0aWVzLCB3ZSBoYXZlIHRvIHNlZSBpZiB3ZSBhcmUKLQkJLy8gYXQgYSAnJScuIGlmIHNvLCB3ZSBza2lwIHRoYXQgYW5kIGZpbmQgdGhlIG5hbWUgYWZ0ZXIgdGhlCi0JCS8vIHdoaXRlc3BhY2UgYWdhaW4KLQkJaWYgKHRhZ1N0YXJ0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHICYmIHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlyZWdpb24gPSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKCFyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlpZiAoIWl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRTdGFydFRhZyhSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXJldHVybiBnZXROZXh0UmVnaW9uKGl0ZXIsIHRhZ1N0YXJ0VHlwZSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFdoaXRlc3BhY2VBZnRlck5hbWUoKSB7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkvLyBza2lwIHBhc3QgdGhlIGVsZW1lbnQgdGFnIHJlZ2lvbgotCQlJVGV4dFJlZ2lvbiBlbGVtZW50VGFnUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCB0YWdTdGFydFR5cGUpOwotCQlib29sZWFuIGZvdW5kTmFtZSA9IGZhbHNlOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFmb3VuZE5hbWUgJiYgbmFtZVJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbiA9PSBuYW1lUmVnaW9uKSB7Ci0JCQkJZm91bmROYW1lID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpKSB7Ci0JCQkJLy8gdGhlcmUgaXMgbm8gbmFtZSByZWdpb24gb3Igd2UgaGF2ZSBhbHJlYWR5IHBhc3NlZCBpdAotCQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwgfHwgZm91bmROYW1lKSB7Ci0JCQkJCXJldHVybiByZWdpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJc3VwZXIuc2V0TmFtZShyZXF1ZXN0b3IsIG5hbWUpOwotCQl9IGVsc2UgewotCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiBlbGVtZW50VGFnUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCB0YWdTdGFydFR5cGUpOwotCQkJaW50IHJlcGxhY2VMZW5ndGggPSAwOwotCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpKSB7Ci0JCQkJCWlmIChyZWdpb24uZ2V0TGVuZ3RoKCkgPj0gMikgewotCQkJCQkJLy8gdGhlcmUgYXJlIDIgc3BhY2VzIGJldHdlZW4gJ0VMRU1FTlQnIGFuZCB0aGUKLQkJCQkJCS8vIGNvbnRlbnQKLQkJCQkJCS8vIENoYW5nZSByZXBsYWNlIGxlbmd0aCB0byAxIHNvIHRoYXQgdGhlIG5ldyBuYW1lIGFuZAotCQkJCQkJLy8gdGhlIGNvbnRlbnQgYXJlIHNlcGFyYXRlZCBieSBhIHNpbmdsZSBzcGFjZQotCQkJCQkJcmVwbGFjZUxlbmd0aCA9IDE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vICAgICAgYmVnaW5SZWNvcmRpbmcocmVxdWVzdG9yLCAiTmFtZSBDaGFuZ2UiKTsKLQkJCVN0cmluZyBuZXdUZXh0ID0gIiAiICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZWxlbWVudFRhZ1JlZ2lvbiksIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCQkJLy8gICAgICBlbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9Ob2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9Ob2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjRjNzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnBhcnNlci5EVERSZWdpb25UeXBlczsKLQotCi1wdWJsaWMgY2xhc3MgTm9kZUxpc3QgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQlBcnJheUxpc3QgbGlzdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsaXN0VHlwZTsKLQotCXB1YmxpYyBOb2RlTGlzdChEVERGaWxlIGR0ZEZpbGUsIFN0cmluZyB0b2tlblR5cGUpIHsKLQkJbGlzdFR5cGUgPSB0b2tlblR5cGU7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9FTCk7Ci0JCX0gZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRykgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX0VOVCk7Ci0JCX0gZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfTk9UKTsKLQkJfSBlbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfQ09NTSk7Ci0JCX0gZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9BVFRMSVNUKTsKLQkJfSBlbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9VTlJFQyk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaXN0VHlwZSgpIHsKLQkJcmV0dXJuIGxpc3RUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9OT0RFX0xJU1RfRUxFTUVOVFMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldERURFN0cmluZygiX1VJX0xBQkVMX05PREVfTElTVF9FTlRJVElFUyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9OT0RFX0xJU1RfTk9UQVRJT05TIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9OT0RFX0xJU1RfQVRUUklCVVRFUyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9OT0RFX0xJU1RfT1RIRVIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0Tm9kZXMoKSB7Ci0JCWxpc3ROb2Rlcy5jbGVhcigpOwotCQlJdGVyYXRvciBpdGVyID0gZHRkRmlsZS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHICYmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9IGVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHICYmIG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0gZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyAmJiBub2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0gZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHICYmIG5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9IGVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQgJiYgbm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfSBlbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQgJiYgbm9kZSBpbnN0YW5jZW9mIFVucmVjb2duaXplZCkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3ROb2RlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL05vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL05vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MGI1ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9Ob3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBOb3RhdGlvbiBleHRlbmRzIEV4dGVybmFsTm9kZSB7Ci0KLQlwdWJsaWMgTm90YXRpb24oRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5OT1RBVElPTklDT04pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTU0YTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBleHRlbmRzIE5hbWVkVG9wTGV2ZWxOb2RlIHsKLQotCi0KLQlwdWJsaWMgY2xhc3MgU3RhcnRFbmRQYWlyIHsKLQkJcHVibGljIGludCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0OwotCX0KLQotCXByaXZhdGUgRW50aXR5IGNhY2hlZEVudGl0eSA9IG51bGw7Ci0KLQlwdWJsaWMgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHlPYmplY3QoKSB7Ci0JCWlmIChjYWNoZWRFbnRpdHkgIT0gbnVsbCAmJiAhY2FjaGVkRW50aXR5LmdldE5hbWUoKS5lcXVhbHMoZ2V0UmVmZXJlbmNlZEVudGl0eSgpKSkgewotCQkJLy8gaWYgd2UgaGF2ZSBhIGNhY2hlZCBlbnRpdHksIGJ1dCB0aGUgbmFtZSBkb2VzbnQgbWF0Y2gsCi0JCQkvLyBudWxsIGl0IG5vdywgc28gd2UgcGVyZm9ybSBhIGxvb2t1cAotCQkJY2FjaGVkRW50aXR5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChjYWNoZWRFbnRpdHkgPT0gbnVsbCkgewotCQkJTGlzdCBub2RlcyA9IGdldERUREZpbGUoKS5nZXROb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG5vZGU7Ci0JCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhnZXRSZWZlcmVuY2VkRW50aXR5KCkpKSB7Ci0JCQkJCQljYWNoZWRFbnRpdHkgPSBlbnRpdHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZEVudGl0eTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRU5USVRZUkVGRVJFTkNFSUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXROYW1lKCk7Ci0JCXJldHVybiBnZXROYW1lKCkuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KFN0YXJ0RW5kUGFpciBwYWlyKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50U3RhcnRUYWcgPSBnZXRTdGFydFRhZyhpdGVyKTsKLQkJSVRleHRSZWdpb24gZW5kQ29tbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoY29tbWVudFN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoY29tbWVudFN0YXJ0VGFnKTsKLQkJfQotCQlpZiAoZW5kQ29tbWVudFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChlbmRDb21tZW50VGFnKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0JCWludCBmbGF0Tm9kZVN0YXJ0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJU3RhcnRFbmRQYWlyIHBhaXIgPSBuZXcgU3RhcnRFbmRQYWlyKCk7Ci0JCWdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChwYWlyKTsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHBhaXIuc3RhcnRPZmZzZXQgLSBmbGF0Tm9kZVN0YXJ0LCBwYWlyLmVuZE9mZnNldCAtIGZsYXROb2RlU3RhcnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbnRpdHkoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRMZW5ndGgoKSwgIiUiICsgbmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ0hHX0VOVElUWV9SRUYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0UmVmZXJlbmNlZEVudGl0eSh0aGlzLCBuYW1lKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ09NTUVOVF9DSEciKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RhcnRFbmRQYWlyIHBhaXIgPSBuZXcgU3RhcnRFbmRQYWlyKCk7Ci0JCWdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChwYWlyKTsKLQkJcmVwbGFjZVRleHQodGhpcywgcGFpci5zdGFydE9mZnNldCwgcGFpci5lbmRPZmZzZXQgLSBwYWlyLnN0YXJ0T2Zmc2V0LCBuZXdUZXh0KTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9Ub3BMZXZlbE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvVG9wTGV2ZWxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTJlMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9Ub3BMZXZlbE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8vIGludGVyZmFjZSBmb3Igbm9kZXMgdGhhdCBjYW4gZXhpc3QgYXQgdGhlIHRvcCBsZXZlbCBpbiBhIGR0ZGZpbGUKLS8vIGVnLiBlbnRpdHksIG5vdGF0aW9uLCBlbGVtZW50LCBjb21tZW50LCBhdHRsaXN0LCBvciB1bnJlY29nbml6ZWQgc3R1ZmYgKGllCi0vLyA8anVuayBka2ZqZGw+Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9wTGV2ZWxOb2RlIGV4dGVuZHMgRFRETm9kZSB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBmbGF0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgVG9wTGV2ZWxOb2RlKERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSk7Ci0JCWZsYXROb2Rlcy5hZGQoZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFdoaXRlc3BhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWZsYXROb2Rlcy5hZGQobm9kZSk7Ci0JfQotCi0JLy8gc3BlY2lhbGl6ZSB0aGlzIHNvIHdlIGRlbGV0ZSB0aGUgb2JqZWN0cyBmbGF0IG5vZGUgcmFuZ2UKLQkvLyBBTkQgYW55IHdoaXRlc3BhY2UKLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKGdldERUREZpbGUoKSwgRFREQ29yZVBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9MQUJFTF9UT1BfTEVWRUxfTk9ERV9ERUxFVEUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBmbGF0Tm9kZXMuZ2V0KDApOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZmxhdE5vZGVzLmdldChmbGF0Tm9kZXMuc2l6ZSgpIC0gMSk7Ci0JCWludCBzdGFydE9mZnNldCA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmRPZmZzZXQgPSBsYXN0LmdldEVuZE9mZnNldCgpOwotCi0JCXJlcGxhY2VUZXh0KGdldERUREZpbGUoKSwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZW5kUmVjb3JkaW5nKGdldERUREZpbGUoKSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEVuZFJlZ2lvbigpIHsKLQkJaW50IHNpemUgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpOwotCQlpZiAoc2l6ZSA+IDApIHsKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KHNpemUgLSAxKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBpbmNsdWRlcyB3aGF0IGdldHRleHQgZ2l2ZXMgdXMgcGx1cyBhbnkgd2hpdGVzcGFjZQotCS8vIHRyYWlsaW5nIGl0Ci0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJdGVyYXRvciBpdGVyID0gZmxhdE5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmTm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBpdGVyLm5leHQoKTsKLQkJCXNiLmFwcGVuZChmTm9kZS5nZXRUZXh0KCkpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRTdGFydFJlZ2lvbigpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlIHJlZ2lvbiBpdGVyICIgKyB0aGlzLmdldENsYXNzKCkgKyAiIHdpdGgKLQkJLy8gc3RhcnQgLCBlbmQgPSAiICsgZ2V0U3RhcnRPZmZzZXQoKSArICIsICIgK2dldEVuZE9mZnNldCgpKTsKLQkJcmV0dXJuIG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvVW5yZWNvZ25pemVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL1VucmVjb2duaXplZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDM2ZWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvVW5yZWNvZ25pemVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBVbnJlY29nbml6ZWQgZXh0ZW5kcyBUb3BMZXZlbE5vZGUgewotCi0JcHVibGljIFVucmVjb2duaXplZChEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5VTlJFQ09HTklaRURJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA8PSAzMCkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgMjkpICsgIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9idWlsZGVyL2RlbGVnYXRlcy9EVERUYXNrVGFnU2Vla2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2J1aWxkZXIvZGVsZWdhdGVzL0RURFRhc2tUYWdTZWVrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4NTM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2J1aWxkZXIvZGVsZWdhdGVzL0RURFRhc2tUYWdTZWVrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmJ1aWxkZXIuZGVsZWdhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFydGljaXBhbnRzLlRhc2tUYWdTZWVrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgRFREVGFza1RhZ1NlZWtlciBleHRlbmRzIFRhc2tUYWdTZWVrZXIgewotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9jb250ZW50L0Fic3RyYWN0Q29udGVudERlc2NyaWJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9jb250ZW50L0Fic3RyYWN0Q29udGVudERlc2NyaWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjVjM2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvY29udGVudC9BYnN0cmFjdENvbnRlbnREZXNjcmliZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5jb250ZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbnRlbnREZXNjcmliZXIgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFR9OwotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCi0JCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQotCQkvLyBhc3N1bWUgaWYgd2UncmUgY2FsbGVkIGF0IGFsbCB0aGF0IHdlIGFyZSB2YWxpZCAoZmV3IHR5cGVzIGNvdWxkIGJlCi0JCS8vIGRpc3Byb3ZlZCwgbWF5YmUgWE1MIC0tIG9yLCBtYXliZSBpZiBleGNlcHRpb24gb2NjdXJzIGFib3ZlPykKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLlJlYWRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQotCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0KLQkJLy8gYXNzdW1lIGlmIHdlJ3JlIGNhbGxlZCBhdCBhbGwgdGhhdCB3ZSBhcmUgdmFsaWQgKGZldyB0eXBlcyBjb3VsZCBiZQotCQkvLyBkaXNwcm92ZWQsIG1heWJlIFhNTCAtLSBvciwgbWF5YmUgaWYgZXhjZXB0aW9uIG9jY3VycyBhYm92ZT8pCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNnZXRTdXBwb3J0ZWRPcHRpb25zKCkKLQkgKi8KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0KLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDYWxjdWxhdGlvbnMoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RlOiBpZiB3ZSdyZSBhc2tlZCBmb3Igb25lLCB3ZSBzZXQgdGhlbSBhbGwuIEkgbmVlZCB0byBiZSBzdXJlIGlmCi0JCS8vIGNhbGxlZAotCQkvLyBtdWxpdGlwbGUgdGltZXMgKG9uZSBmb3IgZWFjaCwgc2F5KSB0aGF0IHdlIGRvbid0IHdhc3RlIHRpbWUKLQkJLy8gcHJvY2Vzc2luZyBzYW1lCi0JCS8vIGNvbnRlbnQgYWdhaW4uCi0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSBkZXRlY3Rvci5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQudGhlCi0JCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZ2V0RGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYXZvaWQgYWRkaW5nIGFueXRoaW5nIGlmIG5vdCBhYnNvbHV0bHkgbmVlZGVkLCBzaW5jZSBhbHdheXMKLQkJLy8gImNhY2hlZCIgcGVyIHNlc3Npb24KLQkJLy9kZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuRU5DT0RJTkdfTUVNRU5UTywKLQkJLy8gZW5jb2RpbmdNZW1lbnRvKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4KLQkJLy8gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsIGhhcHBlbiwgZm9yIGV4YW1wbGUsCi0JCS8vIGlmIHRoZXJlJ3MKLQkJLy8gZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMgZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLwkJCWlmICghZGV0ZWN0ZWRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCS8vCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULAotCQkJLy8gZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJCS8vCQkJfQotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCS8vCQllbHNlIGlmCi0JCS8vIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuRU5DT0RJTkdfTUVNRU5UTykpCi0JCS8vCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9jb250ZW50L0NvbnRlbnREZXNjcmliZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDg4NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9jb250ZW50L0NvbnRlbnREZXNjcmliZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmNvbnRlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLQotCi0KLQotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JEVEQgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnREZXNjcmliZXIgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCi0JLy8gc2FtZSBydWxlcyBhcyBmb3IgWE1MCi0JcHJvdGVjdGVkIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYWY4NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MsIHdpdGggaXRzIG9uZSBmaWVsZCwgaXMgYSBjb252aWVuY2UgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUKLSAqIHNhZmV0eSB3aGVuIHJlZmVyaW5nIHRvIGEgY29udGVudFR5cGUgSUQuIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQKLSAqIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbCBmaWxlLgotICovCi0KLXB1YmxpYyBjbGFzcyBDb250ZW50VHlwZUlkRm9yRFREIHsKLQotCS8qCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IG5vdCBkZWNsYXJlZCBhcyBmaW5hbCwKLQkgKiBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfRFREID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9kb2N1bWVudC9EVERNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9kb2N1bWVudC9EVERNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRjZjJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvZG9jdW1lbnQvRFRETW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIDI4LUF1Zy0wMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kb2N1bWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGtib28KLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERNb2RlbCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvZG9jdW1lbnQvRFRETW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2RvY3VtZW50L0RURE1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2VjOGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvZG9jdW1lbnQvRFRETW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZXZlbnQuTm9kZXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudXRpbC5EVERSZWZlcmVuY2VVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS51dGlsLkxhYmVsVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRETW9kZWxJbXBsIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIsIERURE1vZGVsIHsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVGaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCS8vIGNyZWF0ZSB0aGUgdGVtcCBGaWxlIG9iamVjdAotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCWlmIChmaWxlLmV4aXN0cygpKQotCQkJcmVzdWx0ID0gZmlsZS5kZWxldGUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIERUREZpbGUgZG9jdW1lbnQ7Ci0KLQkvL3ByaXZhdGUgTGlzdCBlcnJvck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gZW50aXR5IHJlZmVyZW5jZSBuYW1lcyBmb3VuZCBpbiB0aGUgY29uZGl0aW9uYWwgSUdOT1JFIHNlY3Rpb25zCi0JcHJpdmF0ZSBWZWN0b3IgaWdub3JlZEVudGl0eVJlZnM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgRFREUmVmZXJlbmNlVXBkYXRlciByZWZVcGRhdGVyID0gbmV3IERURFJlZmVyZW5jZVVwZGF0ZXIoKTsKLQotCXB1YmxpYyBEVERNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWRvY3VtZW50ID0gbmV3IERUREZpbGUodGhpcyk7Ci0JCWRvY3VtZW50LmFkZERUREZpbGVMaXN0ZW5lcihuZXcgSURUREZpbGVMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKSB7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG5vZGU7Ci0JCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCQkvLyBqdXN0IHNheSB0aGV5IGhhdmUgY2hhbmdlZCBmb3Igbm93Ci0JCQkJCQlzZXRSZWZlcmVuY2VkTW9kZWxzQ2hhbmdlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJCQljaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCQkJY2hlY2tJZkV4dGVybmFsUmVmZXJlbmNlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCk7Ci0JCS8vIGNsZWFyIHJlZmVyZW5jZSB1cGRhdGVyIGNhY2hlCi0JCWdldFJlZmVyZW5jZVVwZGF0ZXIoKS5jbGVhckNhY2hlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSWZFeHRlcm5hbFJlZmVyZW5jZXNDaGFuZ2VkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBub2RlOwotCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCS8vIGp1c3Qgc2F5IHRoZXkgaGF2ZSBjaGFuZ2VkIGZvciBub3cKLQkJCQkJc2V0UmVmZXJlbmNlZE1vZGVsc0NoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaGVscHMgZGV0ZXJtaW5lIHRoZSBsaXN0IG9mIHRoaW5ncyB0aGF0Ci0JLy8gY2FuIGJlIHVzZWQgaW4gYSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZSBjb250ZW50Ci0JLy8gT3B0aW9uYWwgcGFyYW1ldGVyIGlzIHRvIGFsbG93IHRoZSBjdXJyZW50bHkgdXNlZCBEVERFbnRpdHkgdG8KLQkvLyBiZSBpbmNsdWRlZCBpbiB0aGUgY29tYm9ib3guCi0JLy8KLQlwdWJsaWMgTGFiZWxWYWx1ZVBhaXJbXSBjcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKEVudGl0eSBlbnRpdHkpIHsKLQkJTm9kZUxpc3QgZW50aXRpZXMgPSBnZXREVERGaWxlKCkuZ2V0RW50aXRpZXMoKTsKLQotCQlWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICIlIiArIGVudGl0eS5nZXROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaXRlbXMuYWRkRWxlbWVudChuZXcgTGFiZWxWYWx1ZVBhaXIobmFtZSwgbmFtZSkpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpID0gZW50aXRpZXMuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUVudGl0eSBlbnRpdHlBdCA9IChFbnRpdHkpIGkubmV4dCgpOwotCQkJaWYgKGVudGl0eUF0LmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgZW50aXR5QXQuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAiJSIgKyBlbnRpdHlBdC5nZXROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWl0ZW1zLmFkZEVsZW1lbnQobmV3IExhYmVsVmFsdWVQYWlyKG5hbWUsIG5hbWUpKTsKLQkJCX0KLQkJfQotCQlMYWJlbFZhbHVlUGFpcltdIGNvbWJvQXJyYXkgPSBuZXcgTGFiZWxWYWx1ZVBhaXJbaXRlbXMuc2l6ZSgpXTsKLQkJaXRlbXMuY29weUludG8oY29tYm9BcnJheSk7Ci0JCXJldHVybiBjb21ib0FycmF5OwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCXN1cGVyLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIpOwotCQkvLyBjbGVhciByZWZlcmVuY2UgdXBkYXRlciBjYWNoZQotCQlnZXRSZWZlcmVuY2VVcGRhdGVyKCkuY2xlYXJDYWNoZSgpOwotCX0KLQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8vIFJldHVybnMgZW50aXR5IHJlZmVyZW5jZSBuYW1lcyB0aGF0IGFyZSBpbgotCS8vIHRoZSBjb25kaXRpb25hbCBJR05PUkUgc2VjdGlvbnMuCi0JcHVibGljIFZlY3RvciBnZXRJZ25vcmVkRW50aXR5UmVmcygpIHsKLQkJaWYgKGlnbm9yZWRFbnRpdHlSZWZzID09IG51bGwpCi0JCQlpZ25vcmVkRW50aXR5UmVmcyA9IG5ldyBWZWN0b3IoKTsKLQkJcmV0dXJuIGlnbm9yZWRFbnRpdHlSZWZzOwotCX0KLQotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Tm9kZSBhdCAiICsgb2Zmc2V0ICsgIiByZXR1cm5pbmcgPSAiICsKLQkJLy8gdGhpcy5kb2N1bWVudC5nZXROb2RlQXQob2Zmc2V0KSk7Ci0KLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JfQotCi0JcHVibGljIERURFJlZmVyZW5jZVVwZGF0ZXIgZ2V0UmVmZXJlbmNlVXBkYXRlcigpIHsKLQkJcmV0dXJuIHJlZlVwZGF0ZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkTW9kZWxzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIHJlZnJlc2hSZXF1aXJlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZnJlc2hSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlZnJlc2hSZXF1aXJlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCWRvY3VtZW50Lm5ld01vZGVsKGZsYXRNb2RlbEV2ZW50KTsKLQkJLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJcbm5ld21vZGVsIik7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBmbGF0TW9kZWxFdmVudCkgewotCQkvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxubm9jaGFuZ2UiKTsKLQkJb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KGZsYXRNb2RlbEV2ZW50KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJcbm5vZGVzcmVwbGFjZWQiKTsKLQkJZG9jdW1lbnQubm9kZXNSZXBsYWNlZChmbGF0TW9kZWxFdmVudCk7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0cnVjdHVyZWREb2N1bWVudCBzb3VyY2UgPSAnIiArCi0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFRleHQoKSArICInIik7Ci0JCS8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJuZXcgU3RyaW5nID0gJyIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRPcmlnaW5hbENoYW5nZXMoKSArIiciKTsKLQkJLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRlbGV0ZWQgU3RyaW5nID0gJyIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXREZWxldGVkVGV4dCgpICsiJyIpOwotCQkvLyAgICAgIEVudW1lcmF0aW9uIGUgPQotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXROb2RlcygpLmVsZW1lbnRzKCk7Ci0JCS8vICAgICAgaW50IGkgPSAwOwotCQkvLyAgICAgIGZvciAoOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0JCS8vICAgICAgewotCQkvLyAgICAgICAgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9Ci0JCS8vIChCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkvLyAgICAgICAgb3V0cHV0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5vZGUpOwotCQkvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIiArIGkgKyIuICIgKyBub2RlLmhhc2hDb2RlKCkgKyAiICciCi0JCS8vICtub2RlLmdldFRleHQoKSArICInIik7Ci0JCS8vICAgICAgICB9Ci0JfQotCi0JcHVibGljIHZvaWQgb3V0cHV0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJLy8gICAgICBpbnQgc2l6ZSA9IGZsYXROb2RlLmdldE51bWJlck9mUmVnaW9ucygpOwotCQkvLyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkvLyAgICAgIHsKLQkJLy8gICAgICAgIFJlZ2lvbiByZWdpb24gPSAoUmVnaW9uKSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGkgKyAiLiAiICsgcmVnaW9uLmdldFR5cGUoKSk7Ci0KLQkJLy8gICAgICB9IC8vIGVuZCBvZiBmb3IgKCkKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5yZWdpb24gY2hhbmdlZCIpOwotCQlkb2N1bWVudC5yZWdpb25DaGFuZ2VkKGZsYXRNb2RlbEV2ZW50KTsKLQkJLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj0gIiArCi0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKSk7Ci0JCS8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWdpb24gY2hhbmdlZCAiICsKLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0UmVnaW9uKCkuaGFzaENvZGUoKSArICIgPSAiICsKLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0UmVnaW9uKCkpOwotCi0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5yZWdpb24gcmVwbGFjZWQiKTsKLQkJZG9jdW1lbnQucmVnaW9uc1JlcGxhY2VkKGZsYXRNb2RlbEV2ZW50KTsKLQkJb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KGZsYXRNb2RlbEV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkTW9kZWxzQ2hhbmdlZCgpIHsKLQkJcmVmcmVzaFJlcXVpcmVkID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoUmVxdWlyZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlyZWZyZXNoUmVxdWlyZWQgPSB2YWx1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdXBlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlyZXR1cm47IC8vIG5vdGluZyB0byBkbwotCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID4gMCkgewotCQkJbmV3TW9kZWwobmV3IE5ld0RvY3VtZW50RXZlbnQobmV3U3RydWN0dXJlZERvY3VtZW50LCB0aGlzKSk7Ci0JCX0KLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMmRhOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9lbmNvZGluZy9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmludGVybmFsLkJ5dGVSZWFkZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQotCXByb3RlY3RlZCBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0KLQlwcm90ZWN0ZWQgUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uYWRkVHJhY2UocmVhc29uKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0byByZXR1cm4gYSBkZWZhdWx0IGVuY29kaW5nIC0tIGFzIHNwZWNpZmllZCBieSBhbiBpbmR1c3RyeQotCSAqIGNvbnRlbnQgdHlwZSBzcGVjIC0tIHdoZW4gbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgZm9yIGV4YW1wbGUsIFhNTAotCSAqIHNwZWNpZmllcyBVVEYtOCwgSlNQIHNwZWNpZmllcyBJU08tODg1OS0xLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuCi0JICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoICJzcGVjIGRlZmF1bHQiLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy9jcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5hZGRUcmFjZShFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvZW5jb2RpbmcvRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvZW5jb2RpbmcvRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhNDBiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2VuY29kaW5nL0RURERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiAyOC1BdWctMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5lbmNvZGluZy5YTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLQotCi0vKioKLSAqIEBhdXRob3Iga2JvbwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IFhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JCWRvY3VtZW50RW5jb2RpbmdEZXRlY3Rvci5zZXQoZlJlYWRlcik7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NjdkMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9lbmNvZGluZy9EVEREb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LkRURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5wYXJzZXIuRFREUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIHsKLQotCXB1YmxpYyBEVEREb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURCgpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IERURERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBuZXcgRFREUmVnaW9uUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQlEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciByZVBhcnNlciA9IG5ldyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCQlyZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnNldFJlUGFyc2VyKHJlUGFyc2VyKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNmFkYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9lbmNvZGluZy9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gRW5jb2RpbmdNZW1lbnRvIChpdHMgc3VwZXIgY2xhc3MpLAotICogd2hlbiB0aGVyZSBpcyBub3QgaW4gZmFjdCBBTlkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB3aGVuIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBTdHJpbmcKLSAqLwotcHVibGljIGNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIE51bGxNZW1lbnRvKCkgewotCQlzdXBlcigpOwotCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldEFwcHJvcHJpYXRlRGVmYXVsdChkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JCWFkZFRyYWNlKERFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvZXZlbnQvSURUREZpbGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9ldmVudC9JRFRERmlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWI2MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9ldmVudC9JRFRERmlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5EVEROb2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEVERGaWxlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKTsKLQotCXB1YmxpYyB2b2lkIG5vZGVzQWRkZWQoTm9kZXNFdmVudCBldmVudCk7Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlbW92ZWQoTm9kZXNFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2V2ZW50L05vZGVzRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvZXZlbnQvTm9kZXNFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFjYTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvZXZlbnQvTm9kZXNFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkRURE5vZGU7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIE5vZGVzRXZlbnQgewotCXByaXZhdGUgQXJyYXlMaXN0IGNoYW5nZWROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyB2b2lkIGFkZChEVEROb2RlIGNoYW5nZWROb2RlKSB7Ci0JCWNoYW5nZWROb2Rlcy5hZGQoY2hhbmdlZE5vZGUpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vZGVzKCkgewotCQlyZXR1cm4gY2hhbmdlZE5vZGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyOTAzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEVERDb3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgRFREQ29yZVBsdWdpbiBpbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RFRESW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldEltYWdlKGljb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXREVERJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGljb25OYW1lKSB7Ci0JCVN0cmluZyB0aGlzSUQgPSBnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHRoaXNJRCwgaWNvbk5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERURFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCS8vIEluIGNhc2UgaXQgaXMgaW52b2tlZCBmcm9tIGEgY29tbWFuZCBsaW5lCi0JCWlmIChnZXRJbnN0YW5jZSgpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRFREQ29yZVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRFREQ29yZVBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JcHVibGljIERURENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoUGxhdGZvcm0KLQkJCQkJLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlIikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvL0IyQlV0aWxQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoQjJCVXRpbFBsdWdpbi5nZXRHVUlTdHJpbmcoIl9XQVJOX1BMVUdJTl9QUk9QRVJUSUVTX01JU1NJTkciKQotCQkJLy8gKyBkZXNjcmlwdG9yLmdldExhYmVsKCkpOwotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uTmFtZSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCi0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdGhpc0lEID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHRoaXNJRCwKLQkJCQkJaWNvbk5hbWUpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W10geyBzMSB9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBhbmQgZG9lcyB0d28gc3Vic3RpdHV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXSB7IHMxLCBzMiB9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCkgewotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYmE3OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZDI0ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZlN0YXJ0KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JCXJldHVybiByZXBhcnNlKHN0YXJ0Tm9kZS5nZXRTdGFydCgpLCBlbmROb2RlLmdldEVuZCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJcmV0dXJuIHN1cGVyLnJlcGFyc2UoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTZmZmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFREX0dFTkVSSUMgPSA1OwotCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIERURF9HRU5FUklDIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9SZWdpb25JdGVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1JlZ2lvbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNjNhMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1JlZ2lvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgUmVnaW9uSXRlcmF0b3IgewotCi0JcHJpdmF0ZSBpbnQgY3VycmVudEluZGV4OwotCi0JLy9wcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uczsKLQkvL3ByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBzdGFydFJlZ2lvbiwgZW5kUmVnaW9uOwotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQl0aGlzKG5vZGUsIG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0JCXJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJc3RhcnRSZWdpb24gPSBub2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJZW5kUmVnaW9uID0gbm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmRPZmZzZXQgLSAxKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHN0YXJ0UmVnaW9uID09IHJlZ2lvbikgewotCQkJCWN1cnJlbnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJdGhpcy5yZWdpb25zID0gcmVnaW9uczsKLQkJc3RhcnRSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJZW5kUmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJY3VycmVudEluZGV4ID0gMDsKLQkJLy8gICAgdGhpcyhub2RlLCBub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCWlmIChjdXJyZW50SW5kZXggPCByZWdpb25zLnNpemUoKSkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCA8PSByZWdpb25zLmluZGV4T2YoZW5kUmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCWlmIChjdXJyZW50SW5kZXggPj0gMCkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCA+PSByZWdpb25zLmluZGV4T2Yoc3RhcnRSZWdpb24pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gbmV4dCgpIHsKLQkJaWYgKGhhc05leHQoKSkgewotCQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KGN1cnJlbnRJbmRleCsrKTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBwcmV2aW91cygpIHsKLQkJaWYgKGhhc1ByZXZpb3VzKCkpIHsKLQkJCXJldHVybiByZWdpb25zLmdldCgtLWN1cnJlbnRJbmRleCk7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL21vZGVsaGFuZGxlci9EVERNb2RlbER1bXBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9tb2RlbGhhbmRsZXIvRFRETW9kZWxEdW1wZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkZjc0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL21vZGVsaGFuZGxlci9EVERNb2RlbER1bXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuTW9kZWxEdW1wZXI7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIERURE1vZGVsRHVtcGVyIGltcGxlbWVudHMgTW9kZWxEdW1wZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuTW9kZWxEdW1wZXIjZHVtcChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCwKLQkgKiAgICAgIGphdmEuaW8uT3V0cHV0U3RyZWFtLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nUnVsZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGR1bXAoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSwgSUZpbGUgaUZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJJbXBsZW1lbnQgRFRETW9kZWxEdW1wZXIuZHVtcCgpIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvbW9kZWxoYW5kbGVyL0RURE1vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL21vZGVsaGFuZGxlci9EVERNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZjMjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvbW9kZWxoYW5kbGVyL0RURE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5lbmNvZGluZy5EVEREb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCXB1YmxpYyBEVERNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IERURERvY3VtZW50TG9hZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIE1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IERURE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBuZXcgRFRETW9kZWxJbXBsKCk7Ci0JCS8vIG5vdyBkb25lIGluIGNyZWF0ZQotCQkvL21vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCS8vbW9kZWwuc2V0RmFjdG9yeVJlZ2lzdHJ5KGRlZmF1bHRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWY0ZGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmVuY29kaW5nLkRURERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5lbmNvZGluZy5EVEREb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNb2RlbEhhbmRsZXJGb3JEVEQgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJZCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJZCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBEVEREb2N1bWVudExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBEVERNb2RlbExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9wYXJzZXIvRFREUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3BhcnNlci9EVERSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllZmFkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3BhcnNlci9EVERSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgRFREUmVnaW9uIGV4dGVuZHMgQ29udGV4dFJlZ2lvbiB7Ci0KLQotCXB1YmxpYyBEVERSZWdpb24oU3RyaW5nIG5ld0NvbnRleHQsIGludCBuZXdTdGFydCwgaW50IG5ld0xlbmd0aCkgewotCQlzdXBlcihuZXdDb250ZXh0LCBuZXdTdGFydCwgbmV3TGVuZ3RoLCBuZXdMZW5ndGgpOwotCX0KLQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgcmVxdWVzdExlbmd0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3BhcnNlci9EVERSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3BhcnNlci9EVERSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiY2RlZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9wYXJzZXIvRFREUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBEVERSZWdpb25GYWN0b3J5IGltcGxlbWVudHMgRFREUmVnaW9uVHlwZXMgewotCXB1YmxpYyBzdGF0aWMgSVRleHRSZWdpb24gY3JlYXRlUmVnaW9uKFN0cmluZyB0b2tlbktpbmQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpZiAodG9rZW5LaW5kICE9IG51bGwpIHsKLQkJCXJlZ2lvbiA9IG5ldyBEVERSZWdpb24odG9rZW5LaW5kLCBzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9wYXJzZXIvRFREUmVnaW9uUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhMmI5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudG9rZW5pemVyLkRURFRva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudG9rZW5pemVyLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIERURFJlZ2lvblBhcnNlciBpbXBsZW1lbnRzIFJlZ2lvblBhcnNlciB7Ci0JcHJpdmF0ZSBWZWN0b3IgY2FjaGVkUmVnaW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBEVERUb2tlbml6ZXIgdG9rZW5pemVyID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY2FjaGVkTm9kZSA9IG51bGw7IC8vIHRvcCBvZiBub2RlIGNoYWluCi0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IERURFJlZ2lvblBhcnNlcigpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhZGROZXdOb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlLCBWZWN0b3IgcmVnaW9ucykgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxlYWRpbmdTcGFjZU5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0cmFpbGluZ1NwYWNlTm9kZSA9IG51bGw7Ci0JCUxpbmtlZExpc3Qgbm9kZVNlZWRzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJaW50IG5SZWdpb25zID0gcmVnaW9ucy5zaXplKCk7Ci0JCWludCBsZWFkaW5nU3BhY2VFbmQgPSAtMTsKLQkJaW50IHRyYWlsaW5nU3BhY2VCZWdpbiA9IG5SZWdpb25zOwotCi0JCS8vIGZpbmQgbGVhZGluZyBzcGFjZQotCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVnaW9uczsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzQmxhbmtSZWdpb24odHlwZSkpIHsKLQkJCQlsZWFkaW5nU3BhY2VFbmQgPSBpOwotCQkJCW5vZGVTZWVkcy5hZGRMYXN0KHJlZ2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSkgewotCQkJbGVhZGluZ1NwYWNlTm9kZSA9IGNyZWF0ZU5vZGUobm9kZVNlZWRzKTsKLQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJbGFzdE5vZGUuc2V0TmV4dChsZWFkaW5nU3BhY2VOb2RlKTsKLQkJCQlsZWFkaW5nU3BhY2VOb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCX0KLQkJCWxhc3ROb2RlID0gbGVhZGluZ1NwYWNlTm9kZTsKLQkJfQotCi0JCS8vIGZpbmQgdHJhaWxpbmcgc3BhY2UKLQkJaWYgKGxlYWRpbmdTcGFjZUVuZCA8IG5SZWdpb25zIC0gMSkgewotCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQlmb3IgKGludCBpID0gblJlZ2lvbnMgLSAxOyAwIDw9IGk7IGktLSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5nZXQoaSk7Ci0JCQkJU3RyaW5nIHR5cGUgPSAoKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKSkuZ2V0VHlwZSgpOwotCQkJCWlmIChpc0JsYW5rUmVnaW9uKHR5cGUpKSB7Ci0JCQkJCXRyYWlsaW5nU3BhY2VCZWdpbiA9IGk7Ci0JCQkJCW5vZGVTZWVkcy5hZGRGaXJzdChyZWdpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSkgewotCQkJCXRyYWlsaW5nU3BhY2VOb2RlID0gY3JlYXRlTm9kZShub2RlU2VlZHMpOwotCQkJfQotCi0JCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJCWZvciAoaW50IGkgPSBsZWFkaW5nU3BhY2VFbmQgKyAxOyBpIDwgdHJhaWxpbmdTcGFjZUJlZ2luOyBpKyspIHsKLQkJCQlub2RlU2VlZHMuYWRkTGFzdChyZWdpb25zLmdldChpKSk7Ci0JCQl9Ci0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCQljb250ZW50Tm9kZSA9IGNyZWF0ZU5vZGUobm9kZVNlZWRzKTsKLQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGNvbnRlbnROb2RlKTsKLQkJCQkJY29udGVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCX0KLQkJCQlsYXN0Tm9kZSA9IGNvbnRlbnROb2RlOwotCQkJfQotCQkJaWYgKHRyYWlsaW5nU3BhY2VOb2RlICE9IG51bGwpIHsKLQkJCQlsYXN0Tm9kZS5zZXROZXh0KHRyYWlsaW5nU3BhY2VOb2RlKTsKLQkJCQl0cmFpbGluZ1NwYWNlTm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJbGFzdE5vZGUgPSB0cmFpbGluZ1NwYWNlTm9kZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsYXN0Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlTm9kZShMaW5rZWRMaXN0IHJlZ2lvbnMpIHsKLQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5EVERfR0VORVJJQyk7Ci0JCWludCBzdGFydCA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0Rmlyc3QoKSkuZ2V0U3RhcnQoKTsKLQkJaW50IGxlbmd0aCA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0TGFzdCgpKS5nZXRFbmQoKSAtIHN0YXJ0OwotCQlub2RlLnNldFN0YXJ0KHN0YXJ0KTsKLQkJbm9kZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3IgaSA9IHJlZ2lvbnMubGlzdEl0ZXJhdG9yKDApOyBpLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlub2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1zdGFydCk7Ci0JCX0KLQkJbm9kZS5zZXRFbmRlZCh0cnVlKTsKLQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlTm9kZUNoYWluKExpc3QgcmVnaW9ucykgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCVZlY3RvciBub2RlU2VlZHMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOyBlLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyBJZiB0aGUgZm9sbG93aW5nIHJlZ2lvbnMgYXBwZWFyLAotCQkJLy8gYSBwcmV2aW91cyBub2RlIGlzIGNsb3NlZCBpbiBmcm9udCBvZiBpdC4KLQkJCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSAmJiBpc0JlZ2lubmluZ1JlZ2lvbih0eXBlKSkgewotCQkJCWxhc3ROb2RlID0gYWRkTmV3Tm9kZXMobGFzdE5vZGUsIG5vZGVTZWVkcyk7Ci0JCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlub2RlU2VlZHMuYWRkRWxlbWVudChyZWdpb24pOwotCi0JCQkvLyBUaGUgZm9sbG93aW5nIHJlZ2lvbnMgY2xvc2UgdGhlIGN1cnJlbnQgbm9kZS4KLQkJCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSAmJiBpc0VuZGluZ1JlZ2lvbih0eXBlKSkgewotCQkJCWxhc3ROb2RlID0gYWRkTmV3Tm9kZXMobGFzdE5vZGUsIG5vZGVTZWVkcyk7Ci0JCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCWlmIChoZWFkTm9kZSA9PSBudWxsICYmIGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQloZWFkTm9kZSA9IGZpbmRGaXJzdE5vZGUobGFzdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2xvc2UgY3VycmVudCBub2RlIGZvcmNpYmx5LgotCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCWxhc3ROb2RlID0gYWRkTmV3Tm9kZXMobGFzdE5vZGUsIG5vZGVTZWVkcyk7Ci0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBmaW5kRmlyc3ROb2RlKGxhc3ROb2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmRGaXJzdE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gbm9kZTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCXdoaWxlICgocHJldk5vZGUgPSBmaXJzdE5vZGUuZ2V0UHJldmlvdXMoKSkgIT0gbnVsbCkgewotCQkJZmlyc3ROb2RlID0gcHJldk5vZGU7Ci0JCX0KLQkJcmV0dXJuIGZpcnN0Tm9kZTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCWlmIChjYWNoZWROb2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBjYWNoZWROb2RlOwotCQl9Ci0KLQkJTGlzdCByZWdpb25zID0gZ2V0UmVnaW9ucygpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gY3JlYXRlTm9kZUNoYWluKHJlZ2lvbnMpOwotCQljYWNoZWROb2RlID0gaGVhZE5vZGU7Ci0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCWlmIChjYWNoZWRSZWdpb25zICE9IG51bGwpIHsKLQkJCXJldHVybiBjYWNoZWRSZWdpb25zOwotCQl9Ci0KLQkJVmVjdG9yIHJlZ2lvbnMgPSBuZXcgVmVjdG9yKCk7Ci0JCVRva2VuIGN1cnJlbnRUb2tlbiA9IG51bGw7Ci0JCWRvIHsKLQkJCXRyeSB7Ci0JCQkJY3VycmVudFRva2VuID0gKFRva2VuKSB0b2tlbml6ZXIueXlsZXgoKTsKLQkJCQlpZiAoY3VycmVudFRva2VuICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gRFREUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY3VycmVudFRva2VuLmdldFR5cGUoKSwgY3VycmVudFRva2VuLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnRUb2tlbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCXJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IHdoaWxlIChjdXJyZW50VG9rZW4gIT0gbnVsbCk7Ci0KLQkJY2FjaGVkUmVnaW9ucyA9IHJlZ2lvbnM7Ci0JCXJldHVybiByZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJaWYgKHRva2VuaXplciA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRva2VuaXplciA9IG5ldyBEVERUb2tlbml6ZXIocmVhZGVyKTsKLQkJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgRFREVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJdG9rZW5pemVyLnl5cmVzZXQocmVhZGVyKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWNhY2hlZE5vZGUgPSBudWxsOwotCQljYWNoZWRSZWdpb25zID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIG9mZnNldCBmb3IgdXNlIHdpdGggYW55IHBvc2l0aW9uLWRlcGVuZGFudCBwYXJzaW5nIHJ1bGVzCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlciwgaW50IG9mZnNldCkgewotCQlyZXNldChyZWFkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCkgewotCQlyZXNldChuZXcgU3RyaW5nUmVhZGVyKGlucHV0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0LCBpbnQgb2Zmc2V0KSB7Ci0JCXJlc2V0KGlucHV0KTsKLQl9Ci0KLQkvLyBuZXZlciB1c2VkCi0JIERURFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCXJldHVybiB0b2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQmVnaW5uaW5nUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcpIHx8ICh0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNCbGFua1JlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kaW5nUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTkRfVEFHKSB8fCAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSkgfHwgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvcGFyc2VyL0RURFJlZ2lvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3BhcnNlci9EVERSZWdpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjVlNTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvcGFyc2VyL0RURFJlZ2lvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5wYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVnaW9uVHlwZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJlZ2lvblByZWZpeCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudXRpbC5wYXJzZXIuRFREUmVnaW9uVHlwZXMuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9IHJlZ2lvblByZWZpeCArICJOQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBRyA9IHJlZ2lvblByZWZpeCArICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTkRfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfUEFSRU4gPSByZWdpb25QcmVmaXggKyAiTEVGVF9QQVJFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSUdIVF9QQVJFTiA9IHJlZ2lvblByZWZpeCArICJSSUdIVF9QQVJFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVNQQUNFID0gcmVnaW9uUHJlZml4ICsgIldISVRFU1BBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SID0gcmVnaW9uUHJlZml4ICsgIkNPTk5FQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9DQ1VSX1RZUEUgPSByZWdpb25QcmVmaXggKyAiT0NDVVJfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMQU1BVElPTiA9IHJlZ2lvblByZWZpeCArICJFWENMQU1BVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJDRU5UID0gcmVnaW9uUHJlZml4ICsgIlBFUkNFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VNSUNPTE9OID0gcmVnaW9uUHJlZml4ICsgIlNFTUlDT0xPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX1NUQVJUID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlRfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VORCA9IHJlZ2lvblByZWZpeCArICJDT01NRU5UX0VORCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1RBRyA9IHJlZ2lvblByZWZpeCArICJOT1RBVElPTl9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fQ09OVEVOVCA9IHJlZ2lvblByZWZpeCArICJOT1RBVElPTl9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTlRJVFlfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9QQVJNID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9QQVJNIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVRBX1ZBTFVFID0gcmVnaW9uUHJlZml4ICsgIk5EQVRBX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUcgPSByZWdpb25QcmVmaXggKyAiRUxFTUVOVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkVMRU1FTlRfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0VNUFRZID0gcmVnaW9uUHJlZml4ICsgIkNPTlRFTlRfRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BTlkgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9BTlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQ0RBVEEgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9QQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRMSVNUX1RBRyA9IHJlZ2lvblByZWZpeCArICJBVFRMSVNUX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlNZU1RFTV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlBVQkxJQ19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVRBX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTkRBVEFfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVRVU9URURfTElURVJBTCA9IHJlZ2lvblByZWZpeCArICJTSU5HTEVRVU9URURfTElURVJBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVRVU9URURfTElURVJBTCA9IHJlZ2lvblByZWZpeCArICJET1VCTEVRVU9URURfTElURVJBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiVU5LTk9XTl9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSByZWdpb25QcmVmaXggKyAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBhdHRyaWJ1dGUgdHlwZSBrZXl3b3JkcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiQ0RBVEFfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJJRFJFRl9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGU19LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEUkVGU19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiRU5USVRJRVNfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk1UT0tFTl9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk1UT0tFTlNfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIk5PVEFUSU9OX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTV9DSE9JQ0UgPSByZWdpb25QcmVmaXggKyAiRU5VTV9DSE9JQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9FTlRJVFlfVFlQRSA9IHJlZ2lvblByZWZpeCArICJQQVJNX0VOVElUWV9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gYXR0cmlidXRlIGRlZmF1bHRzIGtleXdvcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJSRVFVSVJFRF9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJJTVBMSUVEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklYRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJGSVhFRF9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotfS8vIERURFJlZ2lvblR5cGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjViMzcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUucnVsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RfRFREX0RFRkFVTFQgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyI2dldERlZmF1bHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIFNUX0RURF9ERUZBVUxUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNpbml0TGVnYWxDb250ZW50VHlwZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IFN0cmluZ1tde1NUX0RURF9ERUZBVUxULCBTVF9VTktOT1dOX1BBUlRJVElPTn07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90b2tlbml6ZXIvRFREVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3Rva2VuaXplci9EVERUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFiZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3Rva2VuaXplci9EVERUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnBhcnNlci5EVERSZWdpb25UeXBlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleAotICogPC9hPiAxLjMuNSBvbiAwNS8wNC8wMiAxMTozOCBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5kdGQuZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERUb2tlbml6ZXIgewotCi0JLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotCS8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfQlVGRkVSU0laRSA9IDE2Mzg0OwotCWZpbmFsICBzdGF0aWMgU3RyaW5nIHl5X05MID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0JLyoqIGxleGljYWwgc3RhdGVzICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0VOVU1FUkFUSU9OID0gMTM7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTk9UQVRJT05fTkFNRSA9IDY7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9DSElMRCA9IDE7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRU5USVRZX0NPTlRFTlQgPSA0OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IENPTU1FTlRfQ09OVEVOVCA9IDg7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUTElTVF9OQU1FID0gOTsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFWFRFUk5BTElEX0NPTlRFTlQgPSA3OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVMRU1FTlRfQ09OVEVOVCA9IDE7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9NSVhFRCA9IDE7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9NSVhFRF9PUl9DSElMRCA9IDE7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0NPTlRFTlQgPSAxMTsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTlRJVFlfTkFNRSA9IDM7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0RFRkFVTFQgPSAxMjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX05BTUUgPSAyOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTkRBVEFfQ09OVEVOVCA9IDU7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUTElTVF9DT05URU5UID0gMTA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTk9ERSA9IDE7Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLQkgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9ICJcMTBcMFwxXDBcMVw1XDFcM1wxXDBcMVwwXDFcMlwyMlwwXDFcNVwxXDYiICsgIlwxXDFcMVwzN1wxXDBcMVwyM1wxXDBcMVw0NlwxXDQyXDFcNDNcMVw0XDFcNyIgKyAiXDFcNDVcMVwxMlwxXDBcMVwwXDEyXDBcMVwwXDFcMTBcMVwxMVwxXDBcMVwxMyIgKyAiXDFcNFwxXDBcMVwyNVwxXDMxXDFcMzJcMVwzM1wxXDE0XDFcMzVcMlwwXDFcMjEiICsgIlwxXDBcMVwzNlwxXDE1XDFcMTZcMVwxN1wxXDI0XDFcMjdcMVw0MFwxXDM0XDFcMjYiICsgIlwxXDIwXDFcMzBcMlwwXDFcNDFcMVwyMlwxXDBcMVwwXDFcMFwyXDBcMVwwIiArICJcMVwwXDMyXDBcMVwwXDFcNDRcdWZmODNcMCI7Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLQkgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLQkgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwW10gPSB7MCwgMzksIDc4LCAxMTcsIDE1NiwgMTk1LCAyMzQsIDI3MywgMzEyLCAzNTEsIDM5MCwgNDI5LCA0NjgsIDUwNywgNTQ2LCA1ODUsIDYyNCwgMzksIDM5LCAzOSwgNjYzLCA3MDIsIDc0MSwgNzgwLCA4MTksIDM5LCAzOSwgODU4LCA4OTcsIDM5LCAzOSwgOTM2LCA5MzYsIDk3NSwgMTAxNCwgMTA1MywgMTA5MiwgMTEzMSwgMTE3MCwgMTIwOSwgMTI0OCwgMTI4NywgMTMyNiwgMTM2NSwgMTQwNCwgMTQ0MywgMzksIDE0ODIsIDE1MjEsIDE1NjAsIDE1OTksIDE2MzgsIDM5LCAxNjc3LCAxNzE2LCAxNzU1LCAxNzk0LCAxODMzLCAxODcyLCAzOSwgMzksIDE5MTEsIDE5NTAsIDE5ODksIDIwMjgsIDIwNjcsIDIxMDYsIDM5LCAzOSwgMzksIDIxNDUsIDIxODQsIDIyMjMsIDIyNjIsIDIzMDEsIDIzNDAsIDIzNzksIDg5NywgMjQxOCwgOTc1LCAyNDU3LCAyNDk2LCAyNTM1LCAyNTc0LCA5NzUsIDI2MTMsIDI2NTIsIDI2OTEsIDI3MzAsIDE1NjAsIDI3NjksIDI4MDgsIDI4NDcsIDI4ODYsIDI5MjUsIDI5NjQsIDMwMDMsIDMwNDIsIDMwODEsIDMxMjAsIDE5NTAsIDMxNTksIDMxOTgsIDMyMzcsIDMyNzYsIDMzMTUsIDE5NTAsIDM5LCAzMzU0LCAzMzkzLCAzNDMyLCAzOSwgMzQ3MSwgMzUxMCwgMzU0OSwgMzksIDM1ODgsIDM2MjcsIDM5LCAzNjY2LCAzNzA1LCAzNzQ0LCAzOSwgMzksIDM3ODMsIDM4MjIsIDM4NjEsIDM5MDAsIDM5MzksIDM5NzgsIDQwMTcsIDQwNTYsIDM5LCA0MDk1LCA0MTM0LCA0MTczLCAzOSwgNDIxMiwgNDI1MSwgNDI5MCwgNDMyOSwgNDM2OCwgNDQwNywgNDQ0NiwgNDQ4NSwgNDUyNCwgNDU2MywgNDYwMiwgNDY0MSwgNDY4MCwgNDcxOSwgNDc1OCwgNDc5NywgNDgzNiwgNDg3NSwgNDkxNCwgNDk1MywgNDk5MiwgNTAzMSwgNTA3MCwgNTEwOSwgNTE0OCwgNTE4NywgNTIyNiwgNTI2NSwgNTMwNCwgNTM0MywgOTc1LCA1MzgyLCA1NDIxLCA1NDYwLCA1NDk5LAotCQkJCTU1MzgsIDU1NzcsIDE1NjAsIDU2MTYsIDU2NTUsIDU2OTQsIDU3MzMsIDU3NzIsIDU4MTEsIDU4NTAsIDU0NiwgNTg4OSwgNTkyOCwgNTk2NywgNjAwNiwgOTc1LCA5NzUsIDk3NSwgNjA0NSwgMTU2MCwgNjA4NCwgNjEyMywgMTU2MCwgNjE2MiwgNjIwMSwgNjI0MCwgMTk1MCwgNTQ2LCA2Mjc5LCA1NDYsIDgxOSwgNjMxOCwgNjM1NywgNjM5NiwgNjQzNSwgNjQ3NCwgNjUxMywgNTQ2LCA2NTUyLCAxNTYwLCAxNTYwLCAxNTYwLCAxOTUwLCA2NTkxLCAzOSwgMTk1MH07Ci0KLQkvKioKLQkgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQSAocGFydCAwKQotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQwID0gIlwyXDE3XDJcMjBcMVwxN1wxXDIwXDFcMjFcMVwxN1wxXDIyXDFcMjMiICsgIlwxXDE3XDFcMjRcMVwyNVwyXDE3XDFcMjZcM1wxN1wxXDI3XDFcMTciICsgIlwxXDMwXDIxXDE3XDQ3XDBcMlwzMVwyXDIwXDFcMzJcMVwyMFwxXDAiICsgIlwxXDMyXDFcMzFcMVwzM1wxXDMxXDFcMzNcMjNcMzFcMVwzNFwyXDMxIiArICJcMVwzNVwxXDM2XDJcMzdcMVwzMVwyXDQwXDJcMjBcMVwwXDFcMjAiICsgIlwzXDQwXDFcMzNcMVw0MFwxXDMzXDdcNDBcMVw0MVwxNlw0MFw0XDAiICsgIlwxXDQwXDFcNDJcMVw0M1wyXDIwXDFcNDJcMVwyMFwzXDQyXDFcMzMiICsgIlwxXDQyXDFcMzNcMTJcNDJcMVw0NFwxXDQ1XDE2XDQyXDFcNDZcMlw0NyIgKyAiXDJcMjBcMVw0N1wxXDIwXDNcNDdcMVwzM1wxXDQ3XDFcMzNcMzNcNDciICsgIlwyXDUwXDJcMjBcMVwwXDFcMjBcMlwwXDFcNTBcMVwzM1wxXDUwIiArICJcMVwzM1wyNlw1MFw0XDBcMVw1MFwxXDQyXDFcNDNcMlwyMFwxXDQyIiArICJcMVwyMFwzXDQyXDFcMzNcMVw0MlwxXDMzXDNcNDJcMVw1MVw2XDQyIiArICJcMVw1MlwxXDUzXDE2XDQyXDFcNDZcMlw1NFwyXDU1XDFcNTRcMVw1NSIgKyAiXDRcNTRcMVw1NlwxXDU3XDMzXDU0XDJcNjBcMlwyMFwxXDQyXDFcMjAiICsgIlwyXDQyXDFcNjBcMVwzM1wxXDYwXDFcMzNcMjZcNjBcNFw0MlwxXDYwIiArICJcMlw2MVwyXDIwXDFcNDJcMVwyMFwyXDQyXDFcNjFcMVwzM1wxXDYxIiArICJcMVwzM1wyNlw2MVw0XDQyXDFcNjFcMVw2MlwxXDYzXDFcNjRcMVw2NSIgKyAiXDFcNjJcMVw2NlwzXDYyXDFcMzNcMVw2MlwxXDMzXDFcNjdcMlw2MiIgKyAiXDFcNzBcMVw2MlwxXDcxXDEwXDYyXDFcNzJcNFw2MlwxXDczXDJcNjIiICsgIlwxXDc0XDJcNzVcMVw2MlwxXDc2XDFcNzdcMVwxMDBcMlwyMFwxXDc3IiArICJcMVwyMFwzXDc3XDFcMzNcMVw3N1wxXDMzXDIzXDc3XDFcMTAxXDZcNzciCi0JCQkJKyAiXDFcMTAyXDJcMTAzXDJcMjBcMVwxMDNcMVwyMFwzXDEwM1wxXDMzXDFcMTAzIiArICJcMVwzM1wyNlwxMDNcMVwxMDRcMVwxMDVcMVwxMDZcMlwxMDNcMlwxN1wyXDAiICsgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw3XDE3XDFcMCIgKyAiXDIzXDE3XDJcMFwyXDIwXDFcMFwxXDIwXDUzXDBcMVwxMDdcMzRcMCIgKyAiXDJcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwIiArICJcMVwxN1wxXDExMFwxXDE3XDFcMTExXDNcMTdcMVwwXDI1XDE3XDJcMCIgKyAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDdcMTdcMVwwIiArICJcMVwxMTJcMjJcMTdcMlwxMTNcMlwwXDFcMTEzXDJcMFwxXDExM1wyXDAiICsgIlwxXDExM1wxXDBcN1wxMTNcMVwwXDIzXDExM1wyXDE3XDJcMFwxXDE3IiArICJcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTdcMVwxMTRcMlwxNyIgKyAiXDFcMFwyM1wxN1wyXDMxXDZcMFwxXDMxXDFcMFwxXDMxXDFcMCIgKyAiXDI2XDMxXDRcMFwzXDMxXDZcMFwxXDMxXDFcMFwxXDMxXDFcMCIgKyAiXDEzXDMxXDFcMTE1XDEyXDMxXDRcMFwxXDMxXDJcMFwyXDExNlwxXDAiICsgIlwxXDExNlwzMVwwXDFcMTE3XDdcMFwyXDQwXDRcMFwzXDQwXDFcMCIgKyAiXDFcNDBcMVwwXDI2XDQwXDRcMFwxXDQwXDJcNDJcMlwwXDFcNDIiICsgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMzNcNDJcMVw0M1wxXDEyMCIgKyAiXDJcMTIxXDFcNDNcMVwxMjFcM1w0M1wxXDEyMVwxXDQzXDFcMTIxXDMzXDQzIiArICJcMlw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDAiICsgIlw2XDQyXDFcMTIyXDI2XDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMCIgKyAiXDFcNDJcMVwwXDE0XDQyXDFcMTIzXDE2XDQyXDJcNDZcMlwxMjRcMVw0NiIgKyAiXDFcMTI0XDNcNDZcMVwxMjRcMVw0NlwxXDEyNFwzMlw0NlwxXDEyNVwyXDQ3IgotCQkJCSsgIlwyXDBcMVw0N1wxXDBcM1w0N1wxXDBcMVw0N1wxXDBcMzNcNDciICsgIlwyXDUwXDZcMFwxXDUwXDFcMFwxXDUwXDFcMFwyNlw1MFw0XDAiICsgIlwxXDUwXDJcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDIiICsgIlwxXDBcMTdcNDJcMVwxMjZcMTVcNDJcMlwwXDFcNDJcMVwwXDNcNDIiICsgIlwxXDBcMVw0MlwxXDBcNlw0MlwxXDEyN1wyNlw0MlwyXDBcMVw0MiIgKyAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxNFw0MlwxXDEzMFwxNlw0MiIgKyAiXDEyXDU0XDJcMFwzNVw1NFwyXDU1XDFcNTRcMVw1NVw0XDU0XDJcMCIgKyAiXDMzXDU0XDEyXDBcMVwxMzFcMzRcMFwyXDYwXDJcMFwxXDQyXDFcMCIgKyAiXDJcNDJcMVw2MFwxXDBcMVw2MFwxXDBcMjZcNjBcNFw0MlwxXDYwIiArICJcMlw2MVwyXDBcMVw0MlwxXDBcMlw0MlwxXDYxXDFcMFwxXDYxIiArICJcMVwwXDI2XDYxXDRcNDJcMVw2MVwyXDYyXDJcMFwxXDYyXDFcMCIgKyAiXDNcNjJcMVwwXDFcNjJcMVwwXDI2XDYyXDNcMFwyXDYyXDFcNjMiICsgIlwxXDEzMlwyXDEzM1wxXDYzXDFcMTMzXDNcNjNcMVwxMzNcMVw2M1wxXDEzMyIgKyAiXDI2XDYzXDNcMTMzXDJcNjNcM1wwXDFcNjVcNTBcMFwxXDY2XDQxXDAiICsgIlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIgKyAiXDNcNjJcMVwxMzRcMjJcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwIiArICJcM1w2MlwxXDBcMVw2MlwxXDBcMlw2MlwxXDEzNVw1XDYyXDFcMTM2IiArICJcMTVcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIiArICJcMVw2MlwxXDBcMTdcNjJcMVwxMzdcNlw2MlwzXDBcNFw2MlwyXDAiICsgIlwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxN1w2MlwxXDE0MCIgKyAiXDZcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIiArICJcMVw2MlwxXDBcNVw2MlwxXDE0MVwxMlw2MlwxXDE0MlwxXDE0M1w0XDYyIgotCQkJCSsgIlwzXDBcMlw2MlwyXDc2XDJcMTQ0XDFcNzZcMVwxNDRcM1w3NlwxXDE0NCIgKyAiXDFcNzZcMVwxNDRcMjZcNzZcM1wxNDRcMVw3NlwxXDEzMlwyXDc3XDJcMCIgKyAiXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDMzXDc3XDFcMTAwIiArICJcMVwxNDVcMlwxNDZcMVwxMDBcMVwxNDZcM1wxMDBcMVwxNDZcMVwxMDBcMVwxNDYiICsgIlwzM1wxMDBcMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIgKyAiXDFcMFw1XDc3XDFcMTQ3XDEyXDc3XDFcMTUwXDFcMTUxXDExXDc3XDJcMTAyIiArICJcMlwxNTJcMVwxMDJcMVwxNTJcM1wxMDJcMVwxNTJcMVwxMDJcMVwxNTJcMzJcMTAyIiArICJcMVwxNTNcMlwxMDNcMlwwXDFcMTAzXDFcMFwzXDEwM1wxXDBcMVwxMDMiICsgIlwxXDBcMjZcMTAzXDNcMFwyXDEwM1wxMlwwXDFcMTU0XDM0XDBcMlwxNyIgKyAiXDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFwxXDE1NSIgKyAiXDZcMTdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIgKyAiXDFcMTdcMVwwXDRcMTdcMVwxNTZcMlwxN1wxXDBcMjVcMTdcMlwwIiArICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDE1NyIgKyAiXDJcMTdcMVwwXDIzXDE3XDJcMTEzXDJcMFwxXDExM1wyXDBcMVwxMTMiICsgIlwxXDE2MFwxXDBcMVwxMTNcMVwwXDdcMTEzXDFcMFwyM1wxMTNcMlwxNyIgKyAiXDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3IiArICJcMVwxNjFcMlwxN1wxXDBcMjNcMTdcMlwzMVw2XDBcMVwzMVwxXDAiICsgIlwxXDMxXDFcMFwxNlwzMVwxXDE2Mlw3XDMxXDRcMFwxXDMxXDI3XDAiICsgIlwxXDE2M1wxN1wwXDFcMTIxXDFcMTY0XDQ1XDEyMVwyXDQyXDJcMFwxXDQyIiArICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDEyXDQyXDFcMTY1XDIyXDQyIiArICJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDE1XDQyIgotCQkJCSsgIlwxXDE2NlwxNVw0Mlw0NlwxMjRcMVwxNjdcMlw0MlwyXDBcMVw0MlwxXDAiICsgIlwzXDQyXDFcMFwxXDQyXDFcMFwxMVw0MlwxXDE3MFwyM1w0MlwyXDAiICsgIlwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxMlw0MlwxXDE3MSIgKyAiXDIyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMCIgKyAiXDE1XDQyXDFcMTcyXDE1XDQyXDEzXDBcMVwxNzNcMzNcMFwxXDEzM1wxXDE3NCIgKyAiXDQ1XDEzM1wyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIiArICJcMVwwXDRcNjJcMVwxNzVcMjFcNjJcM1wwXDRcNjJcMlwwXDFcNjIiICsgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcNFw2MlwxXDE3NlwyMVw2MiIgKyAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIiArICJcMVwwXDRcNjJcMVwxNzdcMjFcNjJcM1wwXDRcNjJcMlwwXDFcNjIiICsgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMjBcNjJcMVwyMDBcNVw2MiIgKyAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIiArICJcMVwwXDExXDYyXDFcMjAxXDE0XDYyXDNcMFw0XDYyXDJcMFwxXDYyIiArICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDJcNjJcMVwyMDJcMjNcNjIiICsgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIgKyAiXDFcMFwxXDIwM1wyNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiICsgIlwzXDYyXDFcMFwxXDYyXDFcMFw1XDYyXDFcMjA0XDIwXDYyXDNcMCIgKyAiXDJcNjJcNDZcMTQ0XDFcMTc0XDFcMTQ2XDFcMjA1XDQ1XDE0NlwyXDc3XDJcMCIgKyAiXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDJcNzdcMVwyMDYiICsgIlwzMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDAiICsgIlwxXDIwN1wzNFw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIgKyAiXDFcMFw1XDc3XDFcMjEwXDI1XDc3XDQ2XDE1MlwxXDIxMVwyXDE3XDJcMCIKLQkJCQkrICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcMlwxN1wxXDIxMiIgKyAiXDRcMTdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIgKyAiXDFcMTdcMVwwXDVcMTdcMVwyMTNcMVwxN1wxXDBcMjVcMTdcMlwwIiArICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiICsgIlwxXDE3XDFcMjE0XDIzXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIgKyAiXDFcMTdcMVwwXDFcMTdcMVwyMTVcNVwxN1wxXDBcMjNcMTdcMlwzMSIgKyAiXDZcMFwxXDMxXDFcMFwxXDMxXDFcMFwxN1wzMVwxXDIxNlw2XDMxIiArICJcNFwwXDFcMzFcMzJcMFwxXDIxN1wxNFwwXDJcNDJcMlwwXDFcNDIiICsgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcNFw0MlwxXDIyMFwzMFw0MiIgKyAiXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxXDQyIiArICJcMVwyMjFcMzNcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDIiICsgIlwxXDBcNFw0MlwxXDIyMlwzMFw0MlwyXDBcMVw0MlwxXDBcM1w0MiIgKyAiXDFcMFwxXDQyXDFcMFw0XDQyXDFcMjIzXDMwXDQyXDJcMFwxXDQyIiArICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDFcNDJcMVwyMjRcMzFcNDIiICsgIlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIgKyAiXDVcNjJcMVwyMjVcMjBcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwIiArICJcM1w2MlwxXDBcMVw2MlwxXDBcMTBcNjJcMVwyMjZcMTVcNjJcM1wwIiArICJcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDAiICsgIlwxMVw2MlwxXDIyN1wxNFw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiICsgIlwzXDYyXDFcMFwxXDYyXDFcMFwxXDIzMFwyNVw2MlwzXDBcNFw2MiIgKyAiXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyIiArICJcMVwyMzFcMjFcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjIiCi0JCQkJKyAiXDFcMFwxXDYyXDFcMFwxM1w2MlwxXDIzMlwxMlw2MlwzXDBcNFw2MiIgKyAiXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwyNFw2MiIgKyAiXDFcMjMzXDFcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjIiICsgIlwxXDBcMVw2MlwxXDBcMjVcNjJcMVwyMzRcM1wwXDJcNjJcMlw3NyIgKyAiXDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMFwxM1w3NyIgKyAiXDFcMjM1XDIxXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IiArICJcMVwwXDI0XDc3XDFcMjM2XDEwXDc3XDJcMFwxXDc3XDFcMFwzXDc3IiArICJcMVwwXDFcNzdcMVwwXDI1XDc3XDFcMjM3XDVcNzdcMlwxN1wyXDAiICsgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFwxXDI0MFw2XDE3IiArICJcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3IiArICJcMVwwXDRcMTdcMVwyNDFcMlwxN1wxXDBcMjVcMTdcMlwwXDFcMTciICsgIlwyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDI0MlwyXDE3IiArICJcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3IiArICJcMVwwXDVcMTdcMVwyNDNcMVwxN1wxXDBcMjNcMTdcMlwzMVw2XDAiICsgIlwxXDMxXDFcMFwxXDMxXDFcMFwxMVwzMVwxXDI0NFwxNFwzMVw0XDAiICsgIlwxXDMxXDMzXDBcMVwyNDVcMTNcMFwyXDQyXDJcMFwxXDQyXDFcMCIgKyAiXDNcNDJcMVwwXDFcNDJcMVwwXDFcMjQ2XDM0XDQyXDJcMFwxXDQyIiArICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDVcNDJcMVwyNDdcMjdcNDIiICsgIlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTFcNDIiICsgIlwxXDI1MFwyM1w0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MiIgKyAiXDFcMFwxXDI1MVwzNFw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDAiICsgIlwxXDQyXDFcMFw1XDQyXDFcMjUyXDI1XDQyXDJcNjJcMlwwXDFcNjIiCi0JCQkJKyAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyXDFcMjUzXDIxXDYyIiArICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiICsgIlwxXDBcMjJcNjJcMVwyNTRcM1w2MlwzXDBcNFw2MlwyXDBcMVw2MiIgKyAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyXDFcMjU1XDIxXDYyIiArICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiICsgIlwxXDBcMjFcNjJcMVwyNTZcNFw2MlwzXDBcNFw2MlwyXDBcMVw2MiIgKyAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxMVw2MlwxXDI1N1wxNFw2MiIgKyAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIiArICJcMVwwXDFcNjJcMVwyNjBcMjRcNjJcM1wwXDRcNjJcMlwwXDFcNjIiICsgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTRcNjJcMVwyNjFcMTFcNjIiICsgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIgKyAiXDFcMFwxXDI2MlwyNVw2MlwzXDBcMlw2MlwyXDc3XDJcMFwxXDc3IiArICJcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDFcNzdcMVwyNjNcMzNcNzciICsgIlwyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcMTRcNzciICsgIlwxXDI2NFwyMFw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIgKyAiXDFcMFwxXDI2NVwzMlw3N1wyXDE3XDJcMFwxXDE3XDJcMFwxXDE3IiArICJcMlwwXDFcMTdcMVwwXDNcMTdcMVwyNjZcM1wxN1wxXDBcMjVcMTciICsgIlwyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNlwxNyIgKyAiXDFcMjY3XDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDAiICsgIlwxXDE3XDFcMFw1XDE3XDFcMjcwXDFcMTdcMVwwXDI1XDE3XDJcMCIgKyAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDdcMTdcMVwwIiArICJcMlwxN1wxXDI3MVwyMFwxN1wyXDMxXDZcMFwxXDMxXDFcMFwxXDMxIgotCQkJCSsgIlwxXDBcNFwzMVwxXDI3MlwyMVwzMVw0XDBcMVwzMVwyNVwwXDFcMjczIiArICJcMjFcMFwyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyIiArICJcMVwwXDJcNDJcMVwyNzRcMzJcNDJcMlwwXDFcNDJcMVwwXDNcNDIiICsgIlwxXDBcMVw0MlwxXDBcMTZcNDJcMVwyNzRcMTZcNDJcMlwwXDFcNDIiICsgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMlw0MlwxXDI3NVwzMlw0MiIgKyAiXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxNlw0MiIgKyAiXDFcMjc2XDE0XDQyXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIiArICJcMVw2MlwxXDBcNVw2MlwxXDI3N1wxXDMwMFwxN1w2MlwzXDBcNFw2MiIgKyAiXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxXDMwMSIgKyAiXDI1XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIgKyAiXDFcNjJcMVwwXDVcNjJcMVwzMDJcMjBcNjJcM1wwXDRcNjJcMlwwIiArICJcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTJcNjJcMVwzMDMiICsgIlwxM1w2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiICsgIlwxXDYyXDFcMFw1XDYyXDFcMjM0XDIwXDYyXDNcMFw0XDYyXDJcMCIgKyAiXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDVcNjJcMVwzMDQiICsgIlwyMFw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiICsgIlwxXDYyXDFcMFwxN1w2MlwxXDEzMlw2XDYyXDNcMFwyXDYyXDJcNzciICsgIlwyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcNVw3NyIgKyAiXDFcMzA1XDI3XDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IiArICJcMVwwXDVcNzdcMVwzMDZcMjdcNzdcMlwwXDFcNzdcMVwwXDNcNzciICsgIlwxXDBcMVw3N1wxXDBcMTdcNzdcMVwzMDdcMTNcNzdcMlwxN1wyXDAiICsgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMzEwIgotCQkJCSsgIlwyXDE3XDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDAiICsgIlwxXDE3XDFcMFw3XDE3XDFcMFwxXDMxMVwyNFwxN1wyXDBcMVwxNyIgKyAiXDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMzEyXDJcMTciICsgIlwxXDBcMjNcMTdcMlwzMVw2XDBcMVwzMVwxXDBcMVwzMVwxXDAiICsgIlwxMVwzMVwxXDMxM1wxNFwzMVw0XDBcMVwzMVwyMFwwXDFcMzE0XDI2XDAiICsgIlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIgKyAiXDFcMzE1XDI1XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyIiArICJcMVwwXDFcNjJcMVwwXDNcNjJcMVwzMTZcMjJcNjJcM1wwXDRcNjIiICsgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTBcNjIiICsgIlwxXDMxN1wxNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIgKyAiXDFcMFwxXDYyXDFcMFwyMFw2MlwxXDIzNFw1XDYyXDNcMFwyXDYyIiArICJcMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDAiICsgIlwxXDMyMFwzNFw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIgKyAiXDFcMFwyMFw3N1wxXDMyMVwxMlw3N1wyXDE3XDJcMFwxXDE3XDJcMCIgKyAiXDFcMTdcMlwwXDFcMTdcMVwwXDNcMTdcMVwzMjJcM1wxN1wxXDAiICsgIlwyM1wxN1wyNVwwXDFcMzIzXDIxXDBcMlw2MlwyXDBcMVw2MlwxXDAiICsgIlwzXDYyXDFcMFwxXDYyXDFcMFwxMlw2MlwxXDMyNFwxM1w2MlwzXDAiICsgIlw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIgKyAiXDEyXDYyXDFcMzI1XDEzXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIgKyAiXDNcNjJcMVwwXDFcNjJcMVwwXDNcNjJcMVwzMjZcMjJcNjJcM1wwIiArICJcMlw2MlwyXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IiArICJcMVwwXDE3XDc3XDFcMzI3XDE1XDc3XDJcMFwxXDc3XDFcMFwzXDc3IgotCQkJCSsgIlwxXDBcMVw3N1wxXDBcMVwzMzBcMzJcNzdcMlwwXDJcMzIzXDFcMCIgKyAiXDFcMzIzXDM1XDBcMVwzMzFcM1wwXDJcNzdcMlwwXDFcNzdcMVwwIiArICJcM1w3N1wxXDBcMVw3N1wxXDBcMTdcNzdcMVwzMzJcMTNcNzciOwotCi0JLyoqCi0JICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zW10gPSB5eV91bnBhY2soKTsKLQotCi0JLyogZXJyb3IgY29kZXMgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0JZmluYWwgIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLQkvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0geyJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIn07Ci0KLQkvKioKLQkgKiBZWV9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZQotCSAqIDxjb2RlPmFTdGF0ZTwvY29kZT4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFlZX0FUVFJJQlVURVtdID0gezAsIDgsIDAsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDksIDksIDksIDEsIDEsIDEsIDEsIDEsIDksIDksIDEsIDEsIDksIDksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDksIDEsIDEsIDEsIDEsIDEsIDksIDEsIDEsIDEsIDEsIDEsIDEsIDksIDksIDEsIDEsIDEsIDEsIDEsIDEsIDksIDksIDksIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDAsIDEsIDksIDEsIDEsIDEsIDksIDEsIDEsIDAsIDksIDEsIDEsIDksIDEsIDEsIDEsIDksIDksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDksIDEsIDEsIDEsIDksIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDksIDF9OwotCi0JLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQlwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKioKLQkgKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzIHRoZSBzb3VyY2UKLQkgKiBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbWVlfQlVGRkVSU0laRV07Ci0KLQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQlwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQlwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotCS8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQlwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0JLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCXByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotCS8qKgotCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZCBmcm9tCi0JICogaW5wdXQKLQkgKi8KLQlwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0JLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXByaXZhdGUgaW50IHl5bGluZTsKLQotCS8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQlwcml2YXRlIGludCB5eWNoYXI7Ci0KLQkvKioKLQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUKLQkgKiBtYXRjaGVkIHRleHQKLQkgKi8KLQkgaW50IHl5Y29sdW1uOwotCi0JLyoqCi0JICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT50aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhCi0JICogbGluZQotCSAqLwotCSBib29sZWFuIHl5X2F0Qk9MID0gdHJ1ZTsKLQotCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PnRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLQkvKiB1c2VyIGNvZGU6ICovCi0JIGludCBub2RlX2NvdW50ID0gMDsKLQkgU3RyaW5nIGN1cnJlbnRTdHJpbmc7Ci0KLQlwcml2YXRlIFRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBuZXcgVG9rZW4odHlwZSwgeXl0ZXh0KCksIHl5bGluZSwgeXljaGFyICsgc3RhcnRPZmZzZXQsIHl5bGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBzdGFydE9mZnNldCkgewotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZShpbnQgbGluZSkgewotCQl0aGlzLnl5bGluZSA9IGxpbmU7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIgVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZgotCSAqIHRoaXMgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotCSAqLwotCXB1YmxpYyBEVERUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLQkJdGhpcy55eV9yZWFkZXIgPSBpbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzCi0JICogY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0JICovCi0JcHVibGljIERURFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0JCXRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBVbnBhY2tzIHRoZSBzcGxpdCwgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10geXlfdW5wYWNrKCkgewotCQlpbnRbXSB0cmFucyA9IG5ldyBpbnRbNjYzMF07Ci0JCWludCBvZmZzZXQgPSAwOwotCQlvZmZzZXQgPSB5eV91bnBhY2soeXlfcGFja2VkMCwgb2Zmc2V0LCB0cmFucyk7Ci0JCXJldHVybiB0cmFuczsKLQl9Ci0KLQkvKioKLQkgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwYWNrZWQKLQkgKiAgICAgICAgICAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotCSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IGVudHJ5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3VucGFjayhTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnRbXSB0cmFucykgewotCQlpbnQgaSA9IDA7IC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgKi8KLQkJaW50IGogPSBvZmZzZXQ7IC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0JCWludCBsID0gcGFja2VkLmxlbmd0aCgpOwotCQl3aGlsZSAoaSA8IGwpIHsKLQkJCWludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCXZhbHVlLS07Ci0JCQlkbwotCQkJCXRyYW5zW2orK10gPSB2YWx1ZTsKLQkJCXdoaWxlICgtLWNvdW50ID4gMCk7Ci0JCX0KLQkJcmV0dXJuIGo7Ci0JfQotCi0JLyoqCi0JICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0JICogCi0JICogQHBhcmFtIHBhY2tlZAotCSAqICAgICAgICAgICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLQkgKiBAcmV0dXJuIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotCQljaGFyW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0JCWludCBpID0gMDsgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAqLwotCQlpbnQgaiA9IDA7IC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0JCXdoaWxlIChpIDwgMTMwKSB7Ci0JCQlpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0JCQljaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotCQkJZG8KLQkJCQltYXBbaisrXSA9IHZhbHVlOwotCQkJd2hpbGUgKC0tY291bnQgPiAwKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCi0JLyoqCi0JICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9yZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLQkJLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLQkJaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X2J1ZmZlciwgMCwgeXlfZW5kUmVhZCAtIHl5X3N0YXJ0UmVhZCk7Ci0KLQkJCS8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0JCQl5eV9lbmRSZWFkIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X2N1cnJlbnRQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfbWFya2VkUG9zIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X3B1c2hiYWNrUG9zIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0JCX0KLQotCQkvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0JCWlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCS8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotCQkJY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MgKiAyXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotCQkJeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotCQl9Ci0KLQkJLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0JCWludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCB5eV9idWZmZXIubGVuZ3RoIC0geXlfZW5kUmVhZCk7Ci0KLQkJaWYgKG51bVJlYWQgPCAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXl5X2VuZFJlYWQgKz0gbnVtUmVhZDsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJeXlfYXRFT0YgPSB0cnVlOyAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotCQl5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAqLwotCi0JCWlmICh5eV9yZWFkZXIgIT0gbnVsbCkKLQkJCXl5X3JlYWRlci5jbG9zZSgpOwotCX0KLQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBjdXJyZW50IHN0cmVhbSwgYW5kIHJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcKLQkgKiBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIDxiPmNhbm5vdCA8L2I+Ci0JICogYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4gTGV4aWNhbCBzdGF0ZSBpcyBzZXQKLQkgKiB0byA8dHQ+WVlfSU5JVElBTDwvdHQ+LgotCSAqIAotCSAqIEBwYXJhbSByZWFkZXIKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJeXljbG9zZSgpOwotCQl5eV9yZWFkZXIgPSByZWFkZXI7Ci0JCXl5X2F0Qk9MID0gdHJ1ZTsKLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQkJeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZCA9IDA7Ci0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvcyA9IDA7Ci0JCXl5bGluZSA9IHl5Y2hhciA9IHl5Y29sdW1uID0gMDsKLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0JCXJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotCX0KLQotCi0JLyoqCi0JICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U3RhdGUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0JCXl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0JICovCi0JZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MgLSB5eV9zdGFydFJlYWQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSBtYXRjaGVkIHRleHQuCi0JICogCi0JICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotCSAqIAotCSAqIEBwYXJhbSBwb3MKLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiBBIHZhbHVlIGZyb20gMCB0bwotCSAqICAgICAgICAgICAgeXlsZW5ndGgoKS0xLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLQkgKi8KLQlmaW5hbCBwdWJsaWMgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0JCXJldHVybiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgcG9zXTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotCQlyZXR1cm4geXlfbWFya2VkUG9zIC0geXlfc3RhcnRSZWFkOwotCX0KLQotCi0JLyoqCi0JICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0JICogCi0JICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiB5eXB1c2hiYWNrKGludCkKLQkgKiBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoCi0JICogdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwKLQkgKiBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eQotCSAqIHNjYW5uZXIgZXRjLikuCi0JICogCi0JICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUgaW4gZXJyb3IKLQkgKiBmYWxsYmFjayBydWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JDb2RlCi0JICogICAgICAgICAgICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLQkJU3RyaW5nIG1lc3NhZ2U7Ci0JCXRyeSB7Ci0JCQltZXNzYWdlID0gWVlfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0JCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQltZXNzYWdlID0gWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdOwotCQl9Ci0KLQkJdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotCX0KLQotCi0JLyoqCi0JICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBudW1iZXIKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLiBUaGlzIG51bWJlciBtdXN0Ci0JICogICAgICAgICAgICBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0JICovCi0JcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotCQlpZiAobnVtYmVyID4geXlsZW5ndGgoKSkKLQkJCXl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotCQl5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotCX0KLQotCi0JLyoqCi0JICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwgdGhlIGVuZAotCSAqIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV4dCB0b2tlbgotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotCSAqLwotCXB1YmxpYyBZeXRva2VuIHl5bGV4KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlpbnQgeXlfaW5wdXQ7Ci0JCWludCB5eV9hY3Rpb247Ci0KLQkJLy8gY2FjaGVkIGZpZWxkczoKLQkJaW50IHl5X2N1cnJlbnRQb3NfbDsKLS8vIHRyaXZpYWwgaGFkIGVkaXQgdG8gcmVtb3ZlIHVudXNlZCBjb2RlCQlpbnQgeXlfc3RhcnRSZWFkX2w7Ci0JCWludCB5eV9tYXJrZWRQb3NfbDsKLQkJaW50IHl5X2VuZFJlYWRfbCA9IHl5X2VuZFJlYWQ7Ci0JCWNoYXJbXSB5eV9idWZmZXJfbCA9IHl5X2J1ZmZlcjsKLQkJY2hhcltdIHl5Y21hcF9sID0geXljbWFwOwotCi0JCWludFtdIHl5dHJhbnNfbCA9IHl5dHJhbnM7Ci0JCWludFtdIHl5X3Jvd01hcF9sID0geXlfcm93TWFwOwotCQlieXRlW10geXlfYXR0cl9sID0gWVlfQVRUUklCVVRFOwotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQl5eV9tYXJrZWRQb3NfbCA9IHl5X21hcmtlZFBvczsKLQotCQkJeXljaGFyICs9IHl5X21hcmtlZFBvc19sIC0geXlfc3RhcnRSZWFkOwotCi0JCQlib29sZWFuIHl5X3IgPSBmYWxzZTsKLQkJCWZvciAoeXlfY3VycmVudFBvc19sID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zX2wgPCB5eV9tYXJrZWRQb3NfbDsgeXlfY3VycmVudFBvc19sKyspIHsKLQkJCQlzd2l0Y2ggKHl5X2J1ZmZlcl9sW3l5X2N1cnJlbnRQb3NfbF0pIHsKLQkJCQkJY2FzZSAnXHUwMDBCJyA6Ci0JCQkJCWNhc2UgJ1x1MDAwQycgOgotCQkJCQljYXNlICdcdTAwODUnIDoKLQkJCQkJY2FzZSAnXHUyMDI4JyA6Ci0JCQkJCWNhc2UgJ1x1MjAyOScgOgotCQkJCQkJeXlsaW5lKys7Ci0JCQkJCQl5eV9yID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnXHInIDoKLQkJCQkJCXl5bGluZSsrOwotCQkJCQkJeXlfciA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnXG4nIDoKLQkJCQkJCWlmICh5eV9yKQotCQkJCQkJCXl5X3IgPSBmYWxzZTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCXl5bGluZSsrOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJeXlfciA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHl5X3IpIHsKLQkJCQkvLyBwZWVrIG9uZSBjaGFyYWN0ZXIgYWhlYWQgaWYgaXQgaXMgXG4gKGlmIHdlIGhhdmUgY291bnRlZAotCQkJCS8vIG9uZSBsaW5lIHRvbyBtdWNoKQotCQkJCWJvb2xlYW4geXlfcGVlazsKLQkJCQlpZiAoeXlfbWFya2VkUG9zX2wgPCB5eV9lbmRSZWFkX2wpCi0JCQkJCXl5X3BlZWsgPSB5eV9idWZmZXJfbFt5eV9tYXJrZWRQb3NfbF0gPT0gJ1xuJzsKLQkJCQllbHNlIGlmICh5eV9hdEVPRikKLQkJCQkJeXlfcGVlayA9IGZhbHNlOwotCQkJCWVsc2UgewotCQkJCQlib29sZWFuIGVvZiA9IHl5X3JlZmlsbCgpOwotCQkJCQl5eV9tYXJrZWRQb3NfbCA9IHl5X21hcmtlZFBvczsKLQkJCQkJeXlfYnVmZmVyX2wgPSB5eV9idWZmZXI7Ci0JCQkJCWlmIChlb2YpCi0JCQkJCQl5eV9wZWVrID0gZmFsc2U7Ci0JCQkJCWVsc2UKLQkJCQkJCXl5X3BlZWsgPSB5eV9idWZmZXJfbFt5eV9tYXJrZWRQb3NfbF0gPT0gJ1xuJzsKLQkJCQl9Ci0JCQkJaWYgKHl5X3BlZWspCi0JCQkJCXl5bGluZS0tOwotCQkJfQotCQkJeXlfYWN0aW9uID0gLTE7Ci0KLS8vIHRyaXZpYWwgaGFuZCBlZGl0IHRvIHJlbW92ZSB1bnVzZWQgY29kZSB5eV9zdGFydFJlYWRfbCA9IAotCQkJCXl5X2N1cnJlbnRQb3NfbCA9IHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3NfbDsKLQotCQkJeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0KLQkJCXl5X2ZvckFjdGlvbiA6IHsKLQkJCQl3aGlsZSAodHJ1ZSkgewotCi0JCQkJCWlmICh5eV9jdXJyZW50UG9zX2wgPCB5eV9lbmRSZWFkX2wpCi0JCQkJCQl5eV9pbnB1dCA9IHl5X2J1ZmZlcl9sW3l5X2N1cnJlbnRQb3NfbCsrXTsKLQkJCQkJZWxzZSBpZiAoeXlfYXRFT0YpIHsKLQkJCQkJCXl5X2lucHV0ID0gWVlFT0Y7Ci0JCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLQkJCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9jdXJyZW50UG9zX2w7Ci0JCQkJCQl5eV9tYXJrZWRQb3MgPSB5eV9tYXJrZWRQb3NfbDsKLQkJCQkJCWJvb2xlYW4gZW9mID0geXlfcmVmaWxsKCk7Ci0JCQkJCQkvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLQkJCQkJCXl5X2N1cnJlbnRQb3NfbCA9IHl5X2N1cnJlbnRQb3M7Ci0JCQkJCQl5eV9tYXJrZWRQb3NfbCA9IHl5X21hcmtlZFBvczsKLQkJCQkJCXl5X2J1ZmZlcl9sID0geXlfYnVmZmVyOwotCQkJCQkJeXlfZW5kUmVhZF9sID0geXlfZW5kUmVhZDsKLQkJCQkJCWlmIChlb2YpIHsKLQkJCQkJCQl5eV9pbnB1dCA9IFlZRU9GOwotCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJeXlfaW5wdXQgPSB5eV9idWZmZXJfbFt5eV9jdXJyZW50UG9zX2wrK107Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaW50IHl5X25leHQgPSB5eXRyYW5zX2xbeXlfcm93TWFwX2xbeXlfc3RhdGVdICsgeXljbWFwX2xbeXlfaW5wdXRdXTsKLQkJCQkJaWYgKHl5X25leHQgPT0gLTEpCi0JCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCXl5X3N0YXRlID0geXlfbmV4dDsKLQotCQkJCQlpbnQgeXlfYXR0cmlidXRlcyA9IHl5X2F0dHJfbFt5eV9zdGF0ZV07Ci0JCQkJCWlmICgoeXlfYXR0cmlidXRlcyAmIDEpID09IDEpIHsKLQkJCQkJCXl5X2FjdGlvbiA9IHl5X3N0YXRlOwotCQkJCQkJeXlfbWFya2VkUG9zX2wgPSB5eV9jdXJyZW50UG9zX2w7Ci0JCQkJCQlpZiAoKHl5X2F0dHJpYnV0ZXMgJiA4KSA9PSA4KQotCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCi0JCQkvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotCQkJeXlfbWFya2VkUG9zID0geXlfbWFya2VkUG9zX2w7Ci0KLQkJCXN3aXRjaCAoeXlfYWN0aW9uKSB7Ci0KLQkJCQljYXNlIDI2IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzE5N10geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOwotCQkJCS8vIHl5YmVnaW4oWVlJTklUSUFMKTsgfSIpOwotCQkJCXsKLQkJCQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsKLQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCX0KLQkJCQljYXNlIDIxOSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgODkgOgotCQkJCWNhc2UgMTIzIDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzIzMV0geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOwotCQkJCS8vIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyB9Iik7Ci0JCQkJewotCQkJCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOwotCQkJCQl5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsKLQkJCQl9Ci0JCQkJY2FzZSAyMjAgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDEyIDoKLQkJCQljYXNlIDYyIDoKLQkJCQljYXNlIDYzIDoKLQkJCQljYXNlIDY0IDoKLQkJCQljYXNlIDY1IDoKLQkJCQljYXNlIDEwMiA6Ci0JCQkJY2FzZSAxMDMgOgotCQkJCWNhc2UgMTA0IDoKLQkJCQljYXNlIDEzMyA6Ci0JCQkJY2FzZSAxMzQgOgotCQkJCWNhc2UgMTM1IDoKLQkJCQljYXNlIDE1NiA6Ci0JCQkJY2FzZSAxNTcgOgotCQkJCWNhc2UgMTU4IDoKLQkJCQljYXNlIDE3OCA6Ci0JCQkJY2FzZSAxNzkgOgotCQkJCWNhc2UgMTgwIDoKLQkJCQljYXNlIDE5NiA6Ci0JCQkJY2FzZSAxOTcgOgotCQkJCWNhc2UgMjA3IDoKLQkJCQljYXNlIDIwOCA6Ci0JCQkJY2FzZSAyMTUgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjQ3XSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7Ci0JCQkJLy8geXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyB9Iik7Ci0JCQkJewotCQkJCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOwotCQkJCQl5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7Ci0JCQkJfQotCQkJCWNhc2UgMjIxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1MSA6Ci0JCQkJY2FzZSA1MiA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyMTddIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsKLQkJCQkvLyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5cHVzaGJhY2soeXlsZW5ndGgoKSk7Ci0JCQkJCXl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsKLQkJCQl9Ci0JCQkJY2FzZSAyMjIgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDIwNSA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyMjddIHsKLQkJCQkvLyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JEKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQpOwotCQkJCX0KLQkJCQljYXNlIDIyMyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTk0IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzIyNF0gewotCQkJCS8vIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRFJFRlNfS0VZV09SRCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOwotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQpOwotCQkJCX0KLQkJCQljYXNlIDIyNCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTkxIDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzIyNV0gewotCQkJCS8vIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOwotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQpOwotCQkJCX0KLQkJCQljYXNlIDIyNSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTA3IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzE3NF0gewotCQkJCS8vIHl5YmVnaW4oQ09NTUVOVF9DT05URU5UKTsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oQ09NTUVOVF9DT05URU5UKTsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOwotCQkJCX0KLQkJCQljYXNlIDIyNiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDggOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjExXSB7Ci0JCQkJLy8geXliZWdpbihBVFRSSUJVVEVfQ09OVEVOVCk7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkFUVFJJQlVURV9OQU1FKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihBVFRSSUJVVEVfQ09OVEVOVCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7Ci0JCQkJfQotCQkJCWNhc2UgMjI3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOSA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyODNdIHsKLQkJCQkvLyB5eWJlZ2luKEVYVEVSTkFMSURfQ09OVEVOVCk7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Iik7Ci0JCQkJewotCQkJCQl5eWJlZ2luKEVYVEVSTkFMSURfQ09OVEVOVCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsKLQkJCQl9Ci0JCQkJY2FzZSAyMjggOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDEwNiA6Ci0JCQkJY2FzZSAxMzYgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjQ1XSB7Ci0JCQkJLy8geXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsKLQkJCQl9Ci0JCQkJY2FzZSAyMjkgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDEwMCA6Ci0JCQkJY2FzZSAxMzIgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjQ2XSB7Ci0JCQkJLy8geXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsKLQkJCQl9Ci0JCQkJY2FzZSAyMzAgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDIwMiA6Ci0JCQkJY2FzZSAyMTYgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMTg5XSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsKLQkJCQl9Ci0JCQkJY2FzZSAyMzEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE4OSA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyOTBdIHsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUFVCTElDX0tFWVdPUkQpOyB9Iik7Ci0JCQkJewotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUFVCTElDX0tFWVdPUkQpOwotCQkJCX0KLQkJCQljYXNlIDIzMiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTg4IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzI4OV0geyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCk7Ci0JCQkJfQotCQkJCWNhc2UgMjMzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNCA6Ci0JCQkJY2FzZSAyMCA6Ci0JCQkJY2FzZSAyMSA6Ci0JCQkJY2FzZSAyMyA6Ci0JCQkJY2FzZSA3MSA6Ci0JCQkJY2FzZSA3MiA6Ci0JCQkJY2FzZSA3MyA6Ci0JCQkJY2FzZSA3NSA6Ci0JCQkJY2FzZSAxMDggOgotCQkJCWNhc2UgMTA5IDoKLQkJCQljYXNlIDExMCA6Ci0JCQkJY2FzZSAxMTIgOgotCQkJCWNhc2UgMTM3IDoKLQkJCQljYXNlIDEzOCA6Ci0JCQkJY2FzZSAxMzkgOgotCQkJCWNhc2UgMTQwIDoKLQkJCQljYXNlIDE1OSA6Ci0JCQkJY2FzZSAxNjAgOgotCQkJCWNhc2UgMTYxIDoKLQkJCQljYXNlIDE2MiA6Ci0JCQkJY2FzZSAxODEgOgotCQkJCWNhc2UgMTgzIDoKLQkJCQljYXNlIDE4NCA6Ci0JCQkJY2FzZSAyMDAgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMTgyXSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOwotCQkJCX0KLQkJCQljYXNlIDIzNCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNCA6Ci0JCQkJY2FzZSAzMyA6Ci0JCQkJY2FzZSAzNCA6Ci0JCQkJY2FzZSAzNSA6Ci0JCQkJY2FzZSAzNiA6Ci0JCQkJY2FzZSAzNyA6Ci0JCQkJY2FzZSA4MSA6Ci0JCQkJY2FzZSA4MiA6Ci0JCQkJY2FzZSAxMTYgOgotCQkJCWNhc2UgMTE3IDoKLQkJCQljYXNlIDE0MyA6Ci0JCQkJY2FzZSAxNDQgOgotCQkJCWNhc2UgMTY1IDoKLQkJCQljYXNlIDE2NiA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyNzVdIHsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7Ci0JCQkJfQotCQkJCWNhc2UgMjM1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA3IDoKLQkJCQljYXNlIDQwIDoKLQkJCQljYXNlIDQxIDoKLQkJCQljYXNlIDQyIDoKLQkJCQljYXNlIDg1IDoKLQkJCQljYXNlIDg2IDoKLQkJCQljYXNlIDg3IDoKLQkJCQljYXNlIDExOSA6Ci0JCQkJY2FzZSAxMjAgOgotCQkJCWNhc2UgMTIxIDoKLQkJCQljYXNlIDE0NSA6Ci0JCQkJY2FzZSAxNDYgOgotCQkJCWNhc2UgMTQ3IDoKLQkJCQljYXNlIDE2OCA6Ci0JCQkJY2FzZSAxNjkgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjk0XSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOwotCQkJCX0KLQkJCQljYXNlIDIzNiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgOSA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyMDVdIHsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7Ci0JCQkJfQotCQkJCWNhc2UgMjM3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxMCA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyMTJdIHsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7Ci0JCQkJfQotCQkJCWNhc2UgMjM4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MyA6Ci0JCQkJY2FzZSA0NSA6Ci0JCQkJY2FzZSA0NiA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFszMDldIHsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCk7Ci0JCQkJfQotCQkJCWNhc2UgMjM5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2MCA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyMzZdIHsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7Ci0JCQkJfQotCQkJCWNhc2UgMjQwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOTggOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjQ0XSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpOyB9Iik7Ci0JCQkJewotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRklYRURfS0VZV09SRCk7Ci0JCQkJfQotCQkJCWNhc2UgMjQxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMTQgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjQzXSB7Ci0JCQkJLy8geXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQpOyB9Iik7Ci0JCQkJewotCQkJCQl5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQpOwotCQkJCX0KLQkJCQljYXNlIDI0MiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjEyIDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzIyOF0gewotCQkJCS8vIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNDMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDIxMSA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyMjZdIHsKLQkJCQkvLyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOwotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCk7Ci0JCQkJfQotCQkJCWNhc2UgMjQ0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMDkgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMTc2XSB7IHl5YmVnaW4oTk9UQVRJT05fTkFNRSk7Ci0JCQkJLy8gcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oTk9UQVRJT05fTkFNRSk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpOwotCQkJCX0KLQkJCQljYXNlIDI0NSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjAxIDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzE3N10geyB5eWJlZ2luKEFUVExJU1RfTkFNRSk7Ci0JCQkJLy8gcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihBVFRMSVNUX05BTUUpOwotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOwotCQkJCX0KLQkJCQljYXNlIDI0NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTk5IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzE3M10geyB5eWJlZ2luKEVMRU1FTlRfTkFNRSk7Ci0JCQkJLy8gcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihFTEVNRU5UX05BTUUpOwotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCQkJCX0KLQkJCQljYXNlIDI0NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTgyIDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzE3NV0geyB5eWJlZ2luKEVOVElUWV9OQU1FKTsKLQkJCQkvLyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oRU5USVRZX05BTUUpOwotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7Ci0JCQkJfQotCQkJCWNhc2UgMjQ4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNjcgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjkzXSB7IHl5YmVnaW4oTkRBVEFfQ09OVEVOVCk7Ci0JCQkJLy8gcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOyB9Iik7Ci0JCQkJewotCQkJCQl5eWJlZ2luKE5EQVRBX0NPTlRFTlQpOwotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7Ci0JCQkJfQotCQkJCWNhc2UgMjQ5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxMTEgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMTc5XSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNTAgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDk0IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzIyMl0gewotCQkJCS8vIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNTEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI1IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzE5NF0geyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpOwotCQkJCX0KLQkJCQljYXNlIDI1MiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTYgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMTY5XSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNTMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE1IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzE4NF0geyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOwotCQkJCX0KLQkJCQljYXNlIDI1NCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTEgOgotCQkJCWNhc2UgNDkgOgotCQkJCWNhc2UgNTAgOgotCQkJCWNhc2UgNTQgOgotCQkJCWNhc2UgNTUgOgotCQkJCWNhc2UgNTYgOgotCQkJCWNhc2UgNTcgOgotCQkJCWNhc2UgNTggOgotCQkJCWNhc2UgNjEgOgotCQkJCWNhc2UgOTEgOgotCQkJCWNhc2UgOTIgOgotCQkJCWNhc2UgOTMgOgotCQkJCWNhc2UgOTUgOgotCQkJCWNhc2UgOTYgOgotCQkJCWNhc2UgOTcgOgotCQkJCWNhc2UgOTggOgotCQkJCWNhc2UgMTI0IDoKLQkJCQljYXNlIDEyNSA6Ci0JCQkJY2FzZSAxMjYgOgotCQkJCWNhc2UgMTI3IDoKLQkJCQljYXNlIDEyOCA6Ci0JCQkJY2FzZSAxMjkgOgotCQkJCWNhc2UgMTMwIDoKLQkJCQljYXNlIDEzMSA6Ci0JCQkJY2FzZSAxNDggOgotCQkJCWNhc2UgMTQ5IDoKLQkJCQljYXNlIDE1MCA6Ci0JCQkJY2FzZSAxNTEgOgotCQkJCWNhc2UgMTUyIDoKLQkJCQljYXNlIDE1MyA6Ci0JCQkJY2FzZSAxNTQgOgotCQkJCWNhc2UgMTU1IDoKLQkJCQljYXNlIDE3MCA6Ci0JCQkJY2FzZSAxNzEgOgotCQkJCWNhc2UgMTcyIDoKLQkJCQljYXNlIDE3NSA6Ci0JCQkJY2FzZSAxNzYgOgotCQkJCWNhc2UgMTc3IDoKLQkJCQljYXNlIDE5MCA6Ci0JCQkJY2FzZSAxOTIgOgotCQkJCWNhc2UgMTkzIDoKLQkJCQljYXNlIDE5NSA6Ci0JCQkJY2FzZSAyMDQgOgotCQkJCWNhc2UgMjA2IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzIzNV0gewotCQkJCS8vIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QQVJNX0VOVElUWV9UWVBFKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QQVJNX0VOVElUWV9UWVBFKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNTUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI4IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzE5Ml0geyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOwotCQkJCX0KLQkJCQljYXNlIDI1NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjkgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMTk1XSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNTcgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ0IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzMwOF0geyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOwotCQkJCX0KLQkJCQljYXNlIDI1OCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNTMgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjE4XSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Iik7Ci0JCQkJewotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7Ci0JCQkJfQotCQkJCWNhc2UgMjU5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1OSA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyMzRdIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsKLQkJCQkvLyB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5cHVzaGJhY2soeXlsZW5ndGgoKSk7Ci0JCQkJCXl5YmVnaW4oQVRUUklCVVRFX0VOVU1FUkFUSU9OKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNjAgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDY3IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzI1M10geyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOwotCQkJCX0KLQkJCQljYXNlIDI2MSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjggOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjU1XSB7Ci0JCQkJLy8geXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTik7Ci0JCQkJfQotCQkJCWNhc2UgMjYyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2OSA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyNTRdIHsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5VTV9DSE9JQ0UpOyB9Iik7Ci0JCQkJewotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5VTV9DSE9JQ0UpOwotCQkJCX0KLQkJCQljYXNlIDI2MyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzEgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjY1XSB7IHl5YmVnaW4oRU5USVRZX0NPTlRFTlQpOwotCQkJCS8vIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihFTlRJVFlfQ09OVEVOVCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNjQgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ3IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzIwNF0gewotCQkJCS8vIHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOwotCQkJCX0KLQkJCQljYXNlIDI2NSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTg3IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzI3Ml0geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOwotCQkJCS8vIHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgfSIpOwotCQkJCXsKLQkJCQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsKLQkJCQkJeXliZWdpbihFWFRFUk5BTElEX0NPTlRFTlQpOwotCQkJCX0KLQkJCQljYXNlIDI2NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjEzIDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzIyOV0gewotCQkJCS8vIHl5YmVnaW4oQVRUUklCVVRFX0VOVU1FUkFUSU9OKTsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oQVRUUklCVVRFX0VOVU1FUkFUSU9OKTsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX0tFWVdPUkQpOwotCQkJCX0KLQkJCQljYXNlIDI2NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTc0IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzIyMF0gewotCQkJCS8vIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNjggOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE3MyA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyMjNdIHsKLQkJCQkvLyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOwotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCk7Ci0JCQkJfQotCQkJCWNhc2UgMjY5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMTcgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjQyXSB7Ci0JCQkJLy8geXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEKTsgfSIpOwotCQkJCXsKLQkJCQkJeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOwotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCk7Ci0JCQkJfQotCQkJCWNhc2UgMjcwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxMjIgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMzA3XSB7IHl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQkvLyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOyB9Iik7Ci0JCQkJewotCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCk7Ci0JCQkJfQotCQkJCWNhc2UgMjcxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA4NCA6Ci0JCQkJY2FzZSAxMTggOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMjczXSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNzIgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDc5IDoKLQkJCQljYXNlIDExNSA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsyNzRdIHsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyB9Iik7Ci0JCQkJewotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOwotCQkJCX0KLQkJCQljYXNlIDI3MyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjQgOgotCQkJCWNhc2UgMjcgOgotCQkJCWNhc2UgNzYgOgotCQkJCWNhc2UgMTEzIDoKLQkJCQljYXNlIDE0MSA6Ci0JCQkJY2FzZSAxNjMgOgotCQkJCWNhc2UgMTg1IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzE5MF0geyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOwotCQkJCX0KLQkJCQljYXNlIDI3NCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNSA6Ci0JCQkJY2FzZSAzOCA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFszMDBdIHsgeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCS8vIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSk7IH0iKTsKLQkJCQl7Ci0JCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsKLQkJCQl9Ci0JCQkJY2FzZSAyNzUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDEzIDoKLQkJCQljYXNlIDY2IDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzI1Nl0geyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOwotCQkJCX0KLQkJCQljYXNlIDI3NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTggOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMTY3XSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRyk7IH0iKTsKLQkJCQl7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcpOwotCQkJCX0KLQkJCQljYXNlIDI3NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTcgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMTcxXSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNFTUlDT0xPTik7IH0iKTsKLQkJCQl7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TRU1JQ09MT04pOwotCQkJCX0KLQkJCQljYXNlIDI3OCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzAgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMTkzXSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUik7IH0iKTsKLQkJCQl7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpOwotCQkJCX0KLQkJCQljYXNlIDI3OSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjIgOgotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiKyh5eWxpbmUrMSkrIiAiKyJtYXRjaDoKLQkJCQkvLyAtLSIreXl0ZXh0KCkrIi0tIik7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFjdGlvbiBbMTcwXSB7IHJldHVybgotCQkJCS8vIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOyB9Iik7Ci0JCQkJewotCQkJCQlyZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCk7Ci0JCQkJfQotCQkJCWNhc2UgMjgwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOSA6Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU6ICIrKHl5bGluZSsxKSsiICIrIm1hdGNoOgotCQkJCS8vIC0tIit5eXRleHQoKSsiLS0iKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aW9uIFsxNjhdIHsgcmV0dXJuCi0JCQkJLy8gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5EX1RBRyk7IH0iKTsKLQkJCQl7Ci0JCQkJCXJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTkRfVEFHKTsKLQkJCQl9Ci0JCQkJY2FzZSAyODEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMyIDoKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGluZTogIisoeXlsaW5lKzEpKyIgIisibWF0Y2g6Ci0JCQkJLy8gLS0iK3l5dGV4dCgpKyItLSIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb24gWzI2NF0geyByZXR1cm4KLQkJCQkvLyBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgfSIpOwotCQkJCXsKLQkJCQkJcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOwotCQkJCX0KLQkJCQljYXNlIDI4MiA6Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLQkJCQkJCXl5X2F0RU9GID0gdHJ1ZTsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLQkgKiAKLQkgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuIEl0IHByaW50cwotCSAqIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlCi0JICogZW5kIG9mIGZpbGUgaXMgcmVhY2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYXJndgotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4gdGhlIHNjYW5uZXIKLQkgKiAgICAgICAgICAgIG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLQkJaWYgKGFyZ3YubGVuZ3RoID09IDApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIERURFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJRFREVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXNjYW5uZXIgPSBuZXcgRFREVG9rZW5pemVyKG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkpOwotCQkJCQlkbyB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci55eWxleCgpKTsKLQkJCQkJfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0JCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiICsgYXJndltpXSArICJcIiIpOwotCQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklPIGVycm9yIHNjYW5uaW5nIGZpbGUgXCIiICsgYXJndltpXSArICJcIiIpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbjoiKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90b2tlbml6ZXIvVG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdG9rZW5pemVyL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjODA3MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90b2tlbml6ZXIvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFRva2VuIGV4dGVuZHMgWXl0b2tlbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVF9TVEFSVCA9IDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVE9SID0gNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0FOWSA9IDQzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfRU1QVFkgPSA0MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1BDREFUQSA9IDQ0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQ09OVEVOVCA9IDQxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9UQUcgPSA0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfVEFHID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfQ09OVEVOVCA9IDMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9QQVJNID0gMzE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfVEFHID0gMzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDTEFNQVRJT04gPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfUEFSRU4gPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVEFUSU9OX0NPTlRFTlQgPSAyMTsKLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UQVRJT05fVEFHID0gMjA7Ci0KLQkvLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0NIT0lDRSA9IDU7Ci0JLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9TRVFVRU5DRSA9IDY7Ci0JLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NDVVJfT1BUSU9OQUwgPSA3OwotCS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX09ORV9PUl9NT1JFID0gODsKLQkvLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQ0NVUl9aRVJPX09SX01PUkUgPSA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX1RZUEUgPSA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1BBUkVOID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UQUcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFU1BBQ0UgPSA1OwotCi0KLQlwdWJsaWMgVG9rZW4oU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIodHlwZSk7Ci0JfQotCi0JcHVibGljIFRva2VuKFN0cmluZyB0eXBlLCBTdHJpbmcgdGV4dCwgaW50IGxpbmUsIGludCBjaGFyQmVnaW4sIGludCBsZW5ndGgpIHsKLQkJc3VwZXIodHlwZSwgdGV4dCwgbGluZSwgY2hhckJlZ2luLCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyBUb2tlbiBjcmVhdGVDb3B5KCkgewotCQlUb2tlbiBjb3B5ID0gbmV3IFRva2VuKGdldFR5cGUoKSwgZ2V0VGV4dCgpLCBnZXRTdGFydExpbmUoKSwgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0TGVuZ3RoKCkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdG9rZW5pemVyL1l5dG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdG9rZW5pemVyL1l5dG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlYWQ1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3Rva2VuaXplci9ZeXRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50b2tlbml6ZXI7Ci0KLWNsYXNzIFl5dG9rZW4gewotCXB1YmxpYyBpbnQgbV9jaGFyQmVnaW47Ci0JcHVibGljIGludCBtX2xlbmd0aDsKLQlwdWJsaWMgaW50IG1fbGluZTsKLQlwdWJsaWMgU3RyaW5nIG1fdGV4dDsKLQlwdWJsaWMgU3RyaW5nIG1fdHlwZTsKLQotCVl5dG9rZW4oU3RyaW5nIHR5cGUpIHsKLQkJbV90eXBlID0gdHlwZTsKLQl9Ci0KLQlZeXRva2VuKFN0cmluZyB0eXBlLCBTdHJpbmcgdGV4dCwgaW50IGxpbmUsIGludCBjaGFyQmVnaW4sIGludCBsZW5ndGgpIHsKLQkJbV90eXBlID0gdHlwZTsKLQkJbV90ZXh0ID0gbmV3IFN0cmluZyh0ZXh0KTsKLQkJbV9saW5lID0gbGluZTsKLQkJbV9jaGFyQmVnaW4gPSBjaGFyQmVnaW47Ci0JCW1fbGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJaW50IHN0cmluZ1N0YXJ0ID0gc3RhcnQgLSBtX2NoYXJCZWdpbjsKLQkJU3RyaW5nIG9sZFN0cmluZyA9IG1fdGV4dDsKLQkJbV90ZXh0ID0gb2xkU3RyaW5nLnN1YnN0cmluZygwLCBzdHJpbmdTdGFydCk7Ci0JCW1fdGV4dCArPSBvbGRTdHJpbmcuc3Vic3RyaW5nKHN0cmluZ1N0YXJ0ICsgbGVuZ3RoKTsKLQotCQltX2xlbmd0aCA9IG1fdGV4dC5sZW5ndGgoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJuZXcgc3RyaW5nID0gIiArIG1fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhZeXRva2VuIG90aGVyKSB7Ci0JCXJldHVybiBtX3R5cGUgPT0gb3RoZXIuZ2V0VHlwZSgpICYmIG1fdGV4dC5lcXVhbHMob3RoZXIuZ2V0VGV4dCgpKSAmJiBtX2xpbmUgPT0gb3RoZXIuZ2V0U3RhcnRMaW5lKCkgJiYgbV9jaGFyQmVnaW4gPT0gb3RoZXIuZ2V0U3RhcnRPZmZzZXQoKSAmJiBtX2xlbmd0aCA9PSBvdGhlci5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIG1fY2hhckJlZ2luICsgbV9sZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBtX2xlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0TGluZSgpIHsKLQkJcmV0dXJuIG1fbGluZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbV9jaGFyQmVnaW47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gbV90ZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIG1fdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgc3RhcnRPZmZzZXQpIHsKLQkJbV9jaGFyQmVnaW4gPSBzdGFydE9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlRleHQgICA6ICIgKyBtX3RleHQgKyAiXG50eXBlIDogIiArIG1fdHlwZSArICJcbmxpbmUgIDogIiArIG1fbGluZSArICJcbmNCZWcuIDogIiArIG1fY2hhckJlZ2luICsgIlxuY0VuZC4gOiAiICsgZ2V0RW5kT2Zmc2V0KCkgKyAiXG5jTGVuZ3RoLiA6ICIgKyBtX2xlbmd0aDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVPZmZzZXQoaW50IGRlbHRhKSB7Ci0JCW1fY2hhckJlZ2luICs9IGRlbHRhOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJbV90ZXh0ID0gbmV3VGV4dDsKLQkJbV9sZW5ndGggPSBuZXdUZXh0Lmxlbmd0aCgpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90b2tlbml6ZXIvZHRkLmZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3Rva2VuaXplci9kdGQuZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5YjdmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3Rva2VuaXplci9kdGQuZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKiB0aGlzIGlzIGEgc2Nhbm5lciBmb3IgRFREIGZpbGVzICovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudG9rZW5pemVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUucGFyc2VyLkRURFJlZ2lvblR5cGVzOw0KLQ0KLSUlDQotDQotJXsNCi0gIHByaXZhdGUgaW50IG5vZGVfY291bnQgPSAwOw0KLSAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFN0cmluZzsNCi0NCi0gIHByaXZhdGUgVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIHR5cGUpDQotICB7DQotICAgIHJldHVybiBuZXcgVG9rZW4odHlwZSwgeXl0ZXh0KCksIHl5bGluZSwgeXljaGFyICsgc3RhcnRPZmZzZXQsIHl5bGVuZ3RoKCkpOw0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAwOw0KLSAgcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHN0YXJ0T2Zmc2V0KQ0KLSAgew0KLSAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmZzZXQ7DQotICB9DQotDQotICBwdWJsaWMgdm9pZCBzZXRMaW5lKGludCBsaW5lKQ0KLSAgew0KLSAgICB0aGlzLnl5bGluZSA9IGxpbmU7DQotICB9DQotJX0gDQotDQotJWNsYXNzIERURFRva2VuaXplcg0KLSVwdWJsaWMNCi0ldW5pY29kZQ0KLSVkZWJ1Zw0KLSVsaW5lDQotJWNoYXINCi0lc3RhdGUgTk9ERQ0KLSVzdGF0ZSBFTEVNRU5UX05BTUUNCi0lc3RhdGUgRUxFTUVOVF9DT05URU5UDQotJXN0YXRlIEVMRU1FTlRfTUlYRURfT1JfQ0hJTEQNCi0lc3RhdGUgRUxFTUVOVF9NSVhFRA0KLSVzdGF0ZSBFTEVNRU5UX0NISUxEDQotJXN0YXRlIEVOVElUWV9OQU1FDQotJXN0YXRlIEVOVElUWV9DT05URU5UDQotJXN0YXRlIE5EQVRBX0NPTlRFTlQNCi0NCi0lc3RhdGUgTk9UQVRJT05fTkFNRQ0KLSVzdGF0ZSBFWFRFUk5BTElEX0NPTlRFTlQNCi0NCi0lc3RhdGUgQ09NTUVOVF9DT05URU5UDQotJXN0YXRlIEFUVExJU1RfTkFNRQ0KLSVzdGF0ZSBBVFRMSVNUX0NPTlRFTlQNCi0lc3RhdGUgQVRUUklCVVRFX0NPTlRFTlQNCi0lc3RhdGUgQVRUUklCVVRFX0RFRkFVTFQNCi0lc3RhdGUgQVRUUklCVVRFX0VOVU1FUkFUSU9ODQotDQotDQotQUxQSEE9W0EtWmEtel0NCi1ESUdJVD1bMC05XQ0KLU5PTk5FV0xJTkVfV0hJVEVfU1BBQ0VfQ0hBUj1bXCBcdFxiXDAxMl0NCi1TVFJJTkdfVEVYVD0oXFxcInxbXlxuXHJcIl18XFx7V0hJVEVfU1BBQ0VfQ0hBUn0rXFwpKg0KLUNPTU1FTlRfVEVYVD0oW14qL1xuXXxbXipcbl0iLyJbXipcbl18W14vXG5dIioiW14vXG5dfCIqIlteL1xuXXwiLyJbXipcbl0pKg0KLUlkZW50ID0ge0FMUEhBfSh7QUxQSEF9fHtESUdJVH18XykqDQotSW5wdXRDaGFyYWN0ZXIgPSBbXlxyXG5dDQotDQotTGluZVRlcm1pbmF0b3IgPSBccnxcbnxcclxuDQotDQotLyogMyAtIFdoaXRlIFNwYWNlICovDQotUyAgICAgICAgICAgICAgPSAgICAoXHgyMCB8IFx4MDkgfCBceDBEIHwgXHgwQSkrDQotTm9uTGluZVRlcm1pbmF0b3JXaGl0ZXNwYWNlID0gKFx4MjAgfCBceDA5KSsNCi0NCi1XaGl0ZVNwYWNlICAgICA9IHtMaW5lVGVybWluYXRvcn0gfCBbIFx0XGZdDQotDQotLyogODQgKi8NCi0vKkxldHRlciAgICAgICAgID0gICAge0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30NCi0NCi0vKiA4NSAqLw0KLUJhc2VDaGFyICAgICAgID0gICAgW1x1MDA0MS1cdTAwNUFdIHwgW1x1MDA2MS1cdTAwN0FdIHwgW1x1MDBDMC1cdTAwRDZdIHwgW1x1MDBEOC1cdTAwRjZdIHwgW1x1MDBGOC1cdTAwRkZdIHwgW1x1MDEwMC1cdTAxMzFdIHwgW1x1MDEzNC1cdTAxM0VdIHwgW1x1MDE0MS1cdTAxNDhdIHwgW1x1MDE0QS1cdTAxN0VdIHwgW1x1MDE4MC1cdTAxQzNdIHwgW1x1MDFDRC1cdTAxRjBdIHwgW1x1MDFGNC1cdTAxRjVdIHwgW1x1MDFGQS1cdTAyMTddIHwgW1x1MDI1MC1cdTAyQThdIHwgW1x1MDJCQi1cdTAyQzFdIHwgXHUwMzg2IHwgW1x1MDM4OC1cdTAzOEFdIHwgXHUwMzhDIHwgW1x1MDM4RS1cdTAzQTFdIHwgW1x1MDNBMy1cdTAzQ0VdIHwgW1x1MDNEMC1cdTAzRDZdIHwgXHUwM0RBIHwgXHUwM0RDIHwgXHUwM0RFIHwgXHUwM0UwIHwgW1x1MDNFMi1cdTAzRjNdIHwgW1x1MDQwMS1cdTA0MENdIHwgW1x1MDQwRS1cdTA0NEZdIHwgW1x1MDQ1MS1cdTA0NUNdIHwgW1x1MDQ1RS1cdTA0ODFdIHwgW1x1MDQ5MC1cdTA0QzRdIHwgW1x1MDRDNy1cdTA0QzhdIHwgW1x1MDRDQi1cdTA0Q0NdIHwgW1x1MDREMC1cdTA0RUJdIHwgW1x1MDRFRS1cdTA0RjVdIHwgW1x1MDRGOC1cdTA0RjldIHwgW1x1MDUzMS1cdTA1NTZdIHwgXHUwNTU5IHwgW1x1MDU2MS1cdTA1ODZdIHwgW1x1MDVEMC1cdTA1RUFdIHwgW1x1MDVGMC1cdTA1RjJdIHwgW1x1MDYyMS1cdTA2M0FdIHwgW1x1MDY0MS1cdTA2NEFdIHwgW1x1MDY3MS1cdTA2QjddIHwgW1x1MDZCQS1cdTA2QkVdIHwgW1x1MDZDMC1cdTA2Q0VdIHwgW1x1MDZEMC1cdTA2RDNdIHwgXHUwNkQ1IHwgW1x1MDZFNS1cdTA2RTZdIHwgW1x1MDkwNS1cdTA5MzldIHwgXHUwOTNEIHwgW1x1MDk1OC1cdTA5NjFdIHwgW1x1MDk4NS1cdTA5OENdIHwgW1x1MDk4Ri1cdTA5OTBdIHwgW1x1MDk5My1cdTA5QThdIHwgW1x1MDlBQS1cdTA5QjBdIHwgXHUwOUIyIHwgW1x1MDlCNi1cdTA5QjldIHwgW1x1MDlEQy1cdTA5RERdIHwgW1x1MDlERi1cdTA5RTFdIHwgW1x1MDlGMC1cdTA5RjFdIHwgW1x1MEEwNS1cdTBBMEFdIHwgW1x1MEEwRi1cdTBBMTBdIHwgW1x1MEExMy1cdTBBMjhdIHwgW1x1MEEyQS1cdTBBMzBdIHwgW1x1MEEzMi1cdTBBMzNdIHwgW1x1MEEzNS1cdTBBMzZdIHwgW1x1MEEzOC1cdTBBMzldIHwgW1x1MEE1OS1cdTBBNUNdIHwgXHUwQTVFIHwgW1x1MEE3Mi1cdTBBNzRdIHwgW1x1MEE4NS1cdTBBOEJdIHwgXHUwQThEIHwgW1x1MEE4Ri1cdTBBOTFdIHwgW1x1MEE5My1cdTBBQThdIHwgW1x1MEFBQS1cdTBBQjBdIHwgW1x1MEFCMi1cdTBBQjNdIHwgW1x1MEFCNS1cdTBBQjldIHwgXHUwQUJEIHwgXHUwQUUwIHwgW1x1MEIwNS1cdTBCMENdIHwgW1x1MEIwRi1cdTBCMTBdIHwgW1x1MEIxMy1cdTBCMjhdIHwgW1x1MEIyQS1cdTBCMzBdIHwgW1x1MEIzMi1cdTBCMzNdIHwgW1x1MEIzNi1cdTBCMzldIHwgXHUwQjNEIHwgW1x1MEI1Qy1cdTBCNURdIHwgW1x1MEI1Ri1cdTBCNjFdIHwgW1x1MEI4NS1cdTBCOEFdIHwgW1x1MEI4RS1cdTBCOTBdIHwgW1x1MEI5Mi1cdTBCOTVdIHwgW1x1MEI5OS1cdTBCOUFdIHwgXHUwQjlDIHwgW1x1MEI5RS1cdTBCOUZdIHwgW1x1MEJBMy1cdTBCQTRdIHwgW1x1MEJBOC1cdTBCQUFdIHwgW1x1MEJBRS1cdTBCQjVdIHwgW1x1MEJCNy1cdTBCQjldIHwgW1x1MEMwNS1cdTBDMENdIHwgW1x1MEMwRS1cdTBDMTBdIHwgW1x1MEMxMi1cdTBDMjhdIHwgW1x1MEMyQS1cdTBDMzNdIHwgW1x1MEMzNS1cdTBDMzldIHwgW1x1MEM2MC1cdTBDNjFdIHwgW1x1MEM4NS1cdTBDOENdIHwgW1x1MEM4RS1cdTBDOTBdIHwgW1x1MEM5Mi1cdTBDQThdIHwgW1x1MENBQS1cdTBDQjNdIHwgW1x1MENCNS1cdTBDQjldIHwgXHUwQ0RFIHwgW1x1MENFMC1cdTBDRTFdIHwgW1x1MEQwNS1cdTBEMENdIHwgW1x1MEQwRS1cdTBEMTBdIHwgW1x1MEQxMi1cdTBEMjhdIHwgW1x1MEQyQS1cdTBEMzldIHwgW1x1MEQ2MC1cdTBENjFdIHwgW1x1MEUwMS1cdTBFMkVdIHwgXHUwRTMwIHwgW1x1MEUzMi1cdTBFMzNdIHwgW1x1MEU0MC1cdTBFNDVdIHwgW1x1MEU4MS1cdTBFODJdIHwgXHUwRTg0IHwgW1x1MEU4Ny1cdTBFODhdIHwgXHUwRThBIHwgXHUwRThEIHwgW1x1MEU5NC1cdTBFOTddIHwgW1x1MEU5OS1cdTBFOUZdIHwgW1x1MEVBMS1cdTBFQTNdIHwgXHUwRUE1IHwgXHUwRUE3IHwgW1x1MEVBQS1cdTBFQUJdIHwgW1x1MEVBRC1cdTBFQUVdIHwgXHUwRUIwIHwgW1x1MEVCMi1cdTBFQjNdIHwgXHUwRUJEIHwgW1x1MEVDMC1cdTBFQzRdIHwgW1x1MEY0MC1cdTBGNDddIHwgW1x1MEY0OS1cdTBGNjldIHwgW1x1MTBBMC1cdTEwQzVdIHwgW1x1MTBEMC1cdTEwRjZdIHwgXHUxMTAwIHwgW1x1MTEwMi1cdTExMDNdIHwgW1x1MTEwNS1cdTExMDddIHwgXHUxMTA5IHwgW1x1MTEwQi1cdTExMENdIHwgW1x1MTEwRS1cdTExMTJdIHwgXHUxMTNDIHwgXHUxMTNFIHwgXHUxMTQwIHwgXHUxMTRDIHwgXHUxMTRFIHwgXHUxMTUwIHwgW1x1MTE1NC1cdTExNTVdIHwgXHUxMTU5IHwgW1x1MTE1Ri1cdTExNjFdIHwgXHUxMTYzIHwgXHUxMTY1IHwgXHUxMTY3IHwgXHUxMTY5IHwgW1x1MTE2RC1cdTExNkVdIHwgW1x1MTE3Mi1cdTExNzNdIHwgXHUxMTc1IHwgXHUxMTlFIHwgXHUxMUE4IHwgXHUxMUFCIHwgW1x1MTFBRS1cdTExQUZdIHwgW1x1MTFCNy1cdTExQjhdIHwgXHUxMUJBIHwgW1x1MTFCQy1cdTExQzJdIHwgXHUxMUVCIHwgXHUxMUYwIHwgXHUxMUY5IHwgW1x1MUUwMC1cdTFFOUJdIHwgW1x1MUVBMC1cdTFFRjldIHwgW1x1MUYwMC1cdTFGMTVdIHwgW1x1MUYxOC1cdTFGMURdIHwgW1x1MUYyMC1cdTFGNDVdIHwgW1x1MUY0OC1cdTFGNERdIHwgW1x1MUY1MC1cdTFGNTddIHwgXHUxRjU5IHwgXHUxRjVCIHwgXHUxRjVEIHwgW1x1MUY1Ri1cdTFGN0RdIHwgW1x1MUY4MC1cdTFGQjRdIHwgW1x1MUZCNi1cdTFGQkNdIHwgXHUxRkJFIHwgW1x1MUZDMi1cdTFGQzRdIHwgW1x1MUZDNi1cdTFGQ0NdIHwgW1x1MUZEMC1cdTFGRDNdIHwgW1x1MUZENi1cdTFGREJdIHwgW1x1MUZFMC1cdTFGRUNdIHwgW1x1MUZGMi1cdTFGRjRdIHwgW1x1MUZGNi1cdTFGRkNdIHwgXHUyMTI2IHwgW1x1MjEyQS1cdTIxMkJdIHwgXHUyMTJFIHwgW1x1MjE4MC1cdTIxODJdIHwgW1x1MzA0MS1cdTMwOTRdIHwgW1x1MzBBMS1cdTMwRkFdIHwgW1x1MzEwNS1cdTMxMkNdIHwgW1x1QUMwMC1cdUQ3QTNdICANCi0NCi0vKiA4NiAqLw0KLUlkZW9ncmFwaGljICAgID0gICAgW1x1NEUwMC1cdTlGQTVdIHwgXHUzMDA3IHwgW1x1MzAyMS1cdTMwMjldICANCi0NCi0vKiA0ICovICAvKiBpcyAnLicgdG8gYmUgZXNjYXBlZD8/ICovDQotTmFtZUNoYXIgICAgICAgPSAgICB7TGV0dGVyfSB8IHtEaWdpdH0gfCAuIHwgLSB8IF8gfCA6IHwge0NvbWJpbmluZ0NoYXJ9IHwge0V4dGVuZGVyfQ0KLQ0KLS8qIDUgKi8NCi1OYW1lICAgICAgICAgICA9ICh7TGV0dGVyfSB8IF8gfCA6KSB7TmFtZUNoYXJ9KiANCi0NCi0vKiA4NyAqLw0KLUNvbWJpbmluZ0NoYXIgID0gICAgW1x1MDMwMC1cdTAzNDVdIHwgW1x1MDM2MC1cdTAzNjFdIHwgW1x1MDQ4My1cdTA0ODZdIHwgW1x1MDU5MS1cdTA1QTFdIHwgW1x1MDVBMy1cdTA1QjldIHwgW1x1MDVCQi1cdTA1QkRdIHwgXHUwNUJGIHwgW1x1MDVDMS1cdTA1QzJdIHwgXHUwNUM0IHwgW1x1MDY0Qi1cdTA2NTJdIHwgXHUwNjcwIHwgW1x1MDZENi1cdTA2RENdIHwgW1x1MDZERC1cdTA2REZdIHwgW1x1MDZFMC1cdTA2RTRdIHwgW1x1MDZFNy1cdTA2RThdIHwgW1x1MDZFQS1cdTA2RURdIHwgW1x1MDkwMS1cdTA5MDNdIHwgXHUwOTNDIHwgW1x1MDkzRS1cdTA5NENdIHwgXHUwOTREIHwgW1x1MDk1MS1cdTA5NTRdIHwgW1x1MDk2Mi1cdTA5NjNdIHwgW1x1MDk4MS1cdTA5ODNdIHwgXHUwOUJDIHwgXHUwOUJFIHwgXHUwOUJGIHwgW1x1MDlDMC1cdTA5QzRdIHwgW1x1MDlDNy1cdTA5QzhdIHwgW1x1MDlDQi1cdTA5Q0RdIHwgXHUwOUQ3IHwgW1x1MDlFMi1cdTA5RTNdIHwgXHUwQTAyIHwgXHUwQTNDIHwgXHUwQTNFIHwgXHUwQTNGIHwgW1x1MEE0MC1cdTBBNDJdIHwgW1x1MEE0Ny1cdTBBNDhdIHwgW1x1MEE0Qi1cdTBBNERdIHwgW1x1MEE3MC1cdTBBNzFdIHwgW1x1MEE4MS1cdTBBODNdIHwgXHUwQUJDIHwgW1x1MEFCRS1cdTBBQzVdIHwgW1x1MEFDNy1cdTBBQzldIHwgW1x1MEFDQi1cdTBBQ0RdIHwgW1x1MEIwMS1cdTBCMDNdIHwgXHUwQjNDIHwgW1x1MEIzRS1cdTBCNDNdIHwgW1x1MEI0Ny1cdTBCNDhdIHwgW1x1MEI0Qi1cdTBCNERdIHwgW1x1MEI1Ni1cdTBCNTddIHwgW1x1MEI4Mi1cdTBCODNdIHwgW1x1MEJCRS1cdTBCQzJdIHwgW1x1MEJDNi1cdTBCQzhdIHwgW1x1MEJDQS1cdTBCQ0RdIHwgXHUwQkQ3IHwgW1x1MEMwMS1cdTBDMDNdIHwgW1x1MEMzRS1cdTBDNDRdIHwgW1x1MEM0Ni1cdTBDNDhdIHwgW1x1MEM0QS1cdTBDNERdIHwgW1x1MEM1NS1cdTBDNTZdIHwgW1x1MEM4Mi1cdTBDODNdIHwgW1x1MENCRS1cdTBDQzRdIHwgW1x1MENDNi1cdTBDQzhdIHwgW1x1MENDQS1cdTBDQ0RdIHwgW1x1MENENS1cdTBDRDZdIHwgW1x1MEQwMi1cdTBEMDNdIHwgW1x1MEQzRS1cdTBENDNdIHwgW1x1MEQ0Ni1cdTBENDhdIHwgW1x1MEQ0QS1cdTBENERdIHwgXHUwRDU3IHwgXHUwRTMxIHwgW1x1MEUzNC1cdTBFM0FdIHwgW1x1MEU0Ny1cdTBFNEVdIHwgXHUwRUIxIHwgW1x1MEVCNC1cdTBFQjldIHwgW1x1MEVCQi1cdTBFQkNdIHwgW1x1MEVDOC1cdTBFQ0RdIHwgW1x1MEYxOC1cdTBGMTldIHwgXHUwRjM1IHwgXHUwRjM3IHwgXHUwRjM5IHwgXHUwRjNFIHwgXHUwRjNGIHwgW1x1MEY3MS1cdTBGODRdIHwgW1x1MEY4Ni1cdTBGOEJdIHwgW1x1MEY5MC1cdTBGOTVdIHwgXHUwRjk3IHwgW1x1MEY5OS1cdTBGQURdIHwgW1x1MEZCMS1cdTBGQjddIHwgXHUwRkI5IHwgW1x1MjBEMC1cdTIwRENdIHwgXHUyMEUxIHwgW1x1MzAyQS1cdTMwMkZdIHwgXHUzMDk5IHwgXHUzMDlBICANCi0NCi0vKiA4OCAqLw0KLURpZ2l0ICAgICAgICAgID0gICAgW1x1MDAzMC1cdTAwMzldIHwgW1x1MDY2MC1cdTA2NjldIHwgW1x1MDZGMC1cdTA2RjldIHwgW1x1MDk2Ni1cdTA5NkZdIHwgW1x1MDlFNi1cdTA5RUZdIHwgW1x1MEE2Ni1cdTBBNkZdIHwgW1x1MEFFNi1cdTBBRUZdIHwgW1x1MEI2Ni1cdTBCNkZdIHwgW1x1MEJFNy1cdTBCRUZdIHwgW1x1MEM2Ni1cdTBDNkZdIHwgW1x1MENFNi1cdTBDRUZdIHwgW1x1MEQ2Ni1cdTBENkZdIHwgW1x1MEU1MC1cdTBFNTldIHwgW1x1MEVEMC1cdTBFRDldIHwgW1x1MEYyMC1cdTBGMjldICANCi0NCi0vKiA4OSAqLw0KLUV4dGVuZGVyICAgICAgID0gICAgXHUwMEI3IHwgXHUwMkQwIHwgXHUwMkQxIHwgXHUwMzg3IHwgXHUwNjQwIHwgXHUwRTQ2IHwgXHUwRUM2IHwgXHUzMDA1IHwgW1x1MzAzMS1cdTMwMzVdIHwgW1x1MzA5RC1cdTMwOUVdIHwgW1x1MzBGQy1cdTMwRkVdICANCi0qLw0KLQ0KLUxldHRlciAgICAgICAgID0gW2EtekEtWl0NCi1OYW1lQ2hhciAgICAgICA9IHtMZXR0ZXJ9IHwgWzAtOV0NCi0vL05hbWUgICAgICAgICAgID0gKHtMZXR0ZXJ9IHwgXyB8IDopIHtOYW1lQ2hhcn0qIA0KLS8vTmFtZSAgICAgICAgICAgPSBbXlx4MjBceDA5XHgwRFx4MEFdKw0KLU5hbWUgICAgICAgICAgID0gW15ceDIwXHgwOVx4MERceDBBXHwsXCFcP1wrXCpcKFwpPD5dKw0KLUVsZW1lbnRSZWZOYW1lID0gW15ceDIwXHgwOVx4MERceDBBXHwsXD9cK1wqXChcKTw+XSsNCi1FbnRpdHlOYW1lICAgICA9IFteXHgyMFx4MDlceDBEXHgwQVx8LFw/XCpcKFwpPD5dKw0KLVBhcm1FbnRpdHlOYW1lID0gW15ceDIwXHgwOVx4MERceDBBXCElOzw+XSsNCi0NCi1Db21tZW50U3RhcnQgICA9IFwhLS0NCi1Db21tZW50Q29udGVudCA9IFteLT5dKw0KLUNvbW1lbnRFbmQgICAgID0gLS0+DQotRWxlbWVudFN0YXJ0ICAgPSBFTEVNRU5UDQotRWxlbWVudENvbnRlbnQgPSBbXjw+XSoNCi0NCi1FbnRpdHlTdGFydCAgICA9IEVOVElUWQ0KLUVudGl0eV9QYXJtICAgID0gJXtTfQ0KLUVudGl0eUNvbnRlbnQgID0ge1N9W148Pl0qDQotDQotTm90YXRpb25TdGFydCAgPSBOT1RBVElPTg0KLU5vdGF0aW9uQ29udGVudCA9IHtTfVtePD5dKg0KLUF0dExpc3QgICAgICAgID0gQVRUTElTVA0KLUV4dGVybmFsUGFybUVudGl0eVJlZiA9ICV7UGFybUVudGl0eU5hbWV9Ow0KLUVuZFRhZyAgICAgICAgID0gPg0KLVN0YXJ0VGFnICAgICAgID0gPA0KLVN5c3RlbSAgICAgICAgID0gU1lTVEVNDQotUHVibGljICAgICAgICAgPSBQVUJMSUMNCi1ORGF0YSAgICAgICAgICA9IE5EQVRBDQotDQotLy8gdGhlc2UgYXJlIGF0dHJpYnV0ZSB0eXBlIGtleXdvcmRzDQotLy8gICB3ZSByZXVzZSBOT1RBVElPTiBmcm9tIE5vdGF0aW9uU3RhcnQNCi0vLyAgIHdlIHJldXNlIEVOVElUWSBmcm9tIEVudGl0eVN0YXJ0DQotQ0RhdGEgICAgICAgICAgPSBDREFUQQ0KLUlEICAgICAgICAgICAgID0gSUQNCi1JRFJlZiAgICAgICAgICA9IElEUkVGDQotSURSZWZzICAgICAgICAgPSBJRFJFRlMNCi1FbnRpdGllcyAgICAgICA9IEVOVElUSUVTDQotTk1Ub2tlbiAgICAgICAgPSBOTVRPS0VODQotTk1Ub2tlbnMgICAgICAgPSBOTVRPS0VOUw0KLQ0KLS8vIHRoZXNlIGFyZSBhdHRyaWJ1dGUgZGVmYXVsdHMga2V5d29yZHMNCi1SZXF1aXJlZCAgICAgICA9ICNSRVFVSVJFRA0KLUltcGxpZWQgICAgICAgID0gI0lNUExJRUQNCi1GaXhlZCAgICAgICAgICA9ICNGSVhFRA0KLQ0KLQ0KLUVtcHR5ICAgICAgICAgID0gRU1QVFkNCi1BbnkgICAgICAgICAgICA9IEFOWQ0KLVBjRGF0YSAgICAgICAgID0gI1BDREFUQQ0KLUxlZnRQYXJlbiAgICAgID0gXCgNCi1SaWdodFBhcmVuICAgICA9IFwpDQotDQotUGVyY2VudCAgICAgICAgPSAlDQotU2VtaWNvbG9uICAgICAgPSA7DQotUGx1cyAgICAgICAgICAgPSBcKw0KLUNob2ljZSAgPSBcfA0KLVNlcXVlbmNlID0gLA0KLUNvbm5lY3RvciAgICAgID0ge0Nob2ljZX18e1NlcXVlbmNlfQ0KLU9jY3VyT3B0aW9uYWwgID0gXD8NCi1PY2N1ck9uZU9yTW9yZSA9IFwrDQotT2NjdXJaZXJvT3JNb3JlID0gXCoNCi1PY2N1clR5cGUgICAgICA9IHtPY2N1ck9wdGlvbmFsfXx7T2NjdXJPbmVPck1vcmV9fHtPY2N1clplcm9Pck1vcmV9DQotRXhjbGFtYXRpb24gICA9IFwhDQotU2luZ2xlUXVvdGVkTGl0ZXJhbCA9ICdbXiddKicNCi1Eb3VibGVRdW90ZWRMaXRlcmFsID0gXCJbXlwiXSpcIg0KLU5vblRhZ0NvbnRlbnQgPSBbXlx4MjBceDA5XHgwRFx4MEE8Pl0qDQotTm9uRW51bUNvbnRlbnQgPSBbXlx4MjBceDA5XHgwRFx4MEE8PlwoXClcfF0qDQotJSUgDQotDQotPFlZSU5JVElBTD4gew0KLSAge1N0YXJ0VGFnfSAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcpOyB9DQotICB7RW5kVGFnfSAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVORF9UQUcpOyB9DQotICB7RXhjbGFtYXRpb259ICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKTsgfQ0KLSAge1BlcmNlbnR9ICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgfQ0KLSAge1NlbWljb2xvbn0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TRU1JQ09MT04pOyB9DQotDQotICB7RWxlbWVudFN0YXJ0fSAgIHsgeXliZWdpbihFTEVNRU5UX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOyB9DQotICB7Q29tbWVudFN0YXJ0fSAgIHsgeXliZWdpbihDT01NRU5UX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7IH0NCi0gIHtFbnRpdHlTdGFydH0gICAgeyB5eWJlZ2luKEVOVElUWV9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOyB9DQotICB7Tm90YXRpb25TdGFydH0gIHsgeXliZWdpbihOT1RBVElPTl9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7IH0NCi0gIHtBdHRMaXN0fSAgICAgICAgeyB5eWJlZ2luKEFUVExJU1RfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyk7IH0NCi0NCi0gIHtFeHRlcm5hbFBhcm1FbnRpdHlSZWZ9ICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pOyB9DQotLy8ganVzdCBhIHBhcm1lbnRpdHluYW1lIGJ5IGl0c2VsZiBpcyBubyBnb29kLiAgd2UgdXNlIHRoaXMNCi0vLyB0byBjYXB0dXJlIGdhcmJhZ2UgY29udGVudCBhdCB0aGUgdG9wIGxldmVsDQotICB7UGFybUVudGl0eU5hbWV9ICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0NCi0NCi0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0NCi19DQotDQotPEVMRU1FTlRfTkFNRT4gew0KLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQ0KLSAge1BjRGF0YX18XCh7U30qe1BjRGF0YX17U30qXCkgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpOyB9DQotICB7TmFtZX0gICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9DQotDQotICB7TGVmdFBhcmVufSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyB9DQotICB7Q29ubmVjdG9yfSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUik7IH0gICAgDQotICB7T2NjdXJUeXBlfSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpOyB9DQotICB7UmlnaHRQYXJlbn0gICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKTsgfQ0KLQ0KLSAge1N0YXJ0VGFnfSAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQ0KLSAge0VuZFRhZ30gICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQ0KLX0NCi0NCi0vLyAqKioqKioqKiA8IUFUVExJU1QuLi4+DQotPEFUVExJU1RfTkFNRT4gew0KLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQ0KLSAge05hbWV9ICAgICAgICAgICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9DQotICB7Tm9uVGFnQ29udGVudH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0NCi0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQ0KLX0NCi0NCi08QVRUTElTVF9DT05URU5UPiB7DQotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9DQotICB7TmFtZX0gICAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7IH0NCi0gIHtOb25UYWdDb250ZW50fSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQ0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9DQotfQ0KLQ0KLTxBVFRSSUJVVEVfQ09OVEVOVD4gew0KLSAge0xpbmVUZXJtaW5hdG9yfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgfQ0KLSAge05vbkxpbmVUZXJtaW5hdG9yV2hpdGVzcGFjZX0NCi0gICAgICAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0NCi0gIHtDRGF0YX0gICAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQpOyB9ICANCi0NCi0gIHtJRH0gICAgICAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQpOyB9ICAgICAgIA0KLSAge0lEUmVmfSAgICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCk7IH0gIA0KLSAge0lEUmVmc30gICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQpOyB9ICANCi0gIHtFbnRpdHlTdGFydH0gICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JEKTsgfSAgDQotICB7RW50aXRpZXN9ICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JEKTsgfSAgDQotICB7Tk1Ub2tlbn0gICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQpOyB9ICANCi0gIHtOTVRva2Vuc30gICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQpOyB9ICANCi0gIHtOb3RhdGlvblN0YXJ0fSAgeyB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JEKTsgfSAgDQotDQotICB7UmVxdWlyZWR9IHwge0ltcGxpZWR9IHwge0ZpeGVkfSB8IHtTaW5nbGVRdW90ZWRMaXRlcmFsfSB8IHsgRG91YmxlUXVvdGVkTGl0ZXJhbH0NCi0gICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgfQ0KLQ0KLSAge0xlZnRQYXJlbn0gICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUUklCVVRFX0VOVU1FUkFUSU9OKTsgfSAgDQotICB7Tm9uRW51bUNvbnRlbnR9IHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QQVJNX0VOVElUWV9UWVBFKTsgfQ0KLSAge05vbkVudW1Db250ZW50fXx7UmlnaHRQYXJlbn18e0Nob2ljZX0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0NCi0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQ0KLX0NCi0NCi08QVRUUklCVVRFX0RFRkFVTFQ+IHsNCi0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0NCi0gIHtSZXF1aXJlZH0gICAgICAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEKTsgfQ0KLSAge0ltcGxpZWR9ICAgICAgICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCk7IH0NCi0gIHtGaXhlZH0gICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRklYRURfS0VZV09SRCk7IH0NCi0gIHtTaW5nbGVRdW90ZWRMaXRlcmFsfSAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7IH0NCi0gIHtEb3VibGVRdW90ZWRMaXRlcmFsfSAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7IH0NCi0gIHtOb25UYWdDb250ZW50fSAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyB9IC8vcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0NCi0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQ0KLX0NCi0NCi08QVRUUklCVVRFX0VOVU1FUkFUSU9OPiB7DQotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9DQotICB7TGVmdFBhcmVufSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyB9DQotICB7Q2hvaWNlfSAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVU1fQ0hPSUNFKTsgfQ0KLSAge1JpZ2h0UGFyZW59ICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pOyB9DQotICB7Tm9uRW51bUNvbnRlbnR9ICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7IH0NCi0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQ0KLX0NCi0NCi0NCi0vLyAqKioqKioqKiA8IUVOVElUWS4uLj4NCi08RU5USVRZX05BTUU+IHsNCi0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0NCi0gIHtQZXJjZW50fSAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCk7IH0NCi0gIHtFbnRpdHlOYW1lfSAgICAgeyB5eWJlZ2luKEVOVElUWV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9DQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0NCi19DQotDQotPEVOVElUWV9DT05URU5UPiB7DQotLy8gIHtFbnRpdHlDb250ZW50fSB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9DT05URU5UKTsgfQ0KLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQ0KLSAge1N5c3RlbX0gfCB7UHVibGljfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgfQ0KLSAge1NpbmdsZVF1b3RlZExpdGVyYWx9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7IH0NCi0gIHtEb3VibGVRdW90ZWRMaXRlcmFsfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyB9DQotICB7Tm9uVGFnQ29udGVudH0gICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9DQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0NCi19DQotDQotDQotLy8gKioqKioqKiogPCFOT1RBVElPTi4uLj4NCi08Tk9UQVRJT05fTkFNRT4gew0KLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQ0KLSAge05hbWV9ICAgICAgICAgICB7IHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9DQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0NCi19DQotDQotPEVYVEVSTkFMSURfQ09OVEVOVD4gew0KLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQ0KLSAge1N5c3RlbX0gICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCk7IH0gIA0KLSAge1B1YmxpY30gICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCk7IH0gIA0KLSAge1NpbmdsZVF1b3RlZExpdGVyYWx9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7IH0NCi0gIHtEb3VibGVRdW90ZWRMaXRlcmFsfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyB9DQotICB7TkRhdGF9ICAgICAgICAgIHsgeXliZWdpbihOREFUQV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOyB9DQotICB7Tm9uVGFnQ29udGVudH0gICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9DQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0NCi19DQotDQotPE5EQVRBX0NPTlRFTlQ+IHsNCi0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0NCi0gIHtOb25UYWdDb250ZW50fSAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSk7IH0NCi0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQ0KLX0NCi0gIA0KLQ0KLS8vICoqKioqKioqIDwhLS0gLi4uPg0KLTxDT01NRU5UX0NPTlRFTlQ+IHsNCi0gIHtDb21tZW50RW5kfSAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCk7IH0NCi0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0NCi0gIHtDb21tZW50Q29udGVudH0gfCAiLSIgfCAiPiIgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCk7IH0NCi19DQotDQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RUREJhdGNoTm9kZURlbGV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RUREJhdGNoTm9kZURlbGV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjcxMDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdXRpbC9EVERCYXRjaE5vZGVEZWxldGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkRURE5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERUREJhdGNoTm9kZURlbGV0ZSB7Ci0JcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQotCXByb3RlY3RlZCBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIERUREJhdGNoTm9kZURlbGV0ZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJdGhpcy5kdGRGaWxlID0gZHRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGROb2RlKERURE5vZGUgbm9kZSkgewotCQkvLyBmaXJzdCBjaGVjayBpZiB0aGUgbm9kZSBpcyBjb250YWluZWQgYnkgYW55b25lCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgbm9kZXMuZ2V0KGkpOwotCi0JCQlpZiAoY3VycmVudE5vZGUuY29udGFpbnNSYW5nZShub2RlLmdldFN0YXJ0T2Zmc2V0KCksIG5vZGUuZ2V0RW5kT2Zmc2V0KCkpKSB7Ci0JCQkJLy8gdGhlbiBubyBuZWVkIHRvIGFkZCB0aGUgbm9kZSB0byB0aGUgbGlzdCB0byBiZSBkZWxldGVkCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAobm9kZS5nZXRTdGFydE9mZnNldCgpIDwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSAmJiBub2RlLmdldEVuZE9mZnNldCgpIDw9IGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQlub2Rlcy5hZGQoaSwgbm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGdldCBoZXJlLCB0aGVuIGFkZCBpdCB0byB0aGUgZW5kCi0JCW5vZGVzLmFkZChub2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVOb2RlcyhPYmplY3QgcmVxdWVzdG9yKSB7Ci0JCWZvciAoaW50IGkgPSBub2Rlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCWR0ZEZpbGUuZGVsZXRlTm9kZShyZXF1ZXN0b3IsIChEVEROb2RlKSBub2Rlcy5nZXQoaSkpOwotCQl9Ci0JCW5vZGVzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RUREV4dGVybmFsUmVmZXJlbmNlUmVtb3Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RUREV4dGVybmFsUmVmZXJlbmNlUmVtb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjhjYzA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdXRpbC9EVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5FbnRpdHk7Ci0KLQotLyoKLSAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIHRoZSBtb2RlbCB3aGVuIGl0ZW1zIGFyZSBkZWxldGVkIG9yCi0gKiBzbyB0aGF0IGl0ZW1zIHJlZmVyZW5jZWQgYnkgaXQgYXJlIGNsZWFuZWQgdXAgbm90ZSB0aGF0IHRvcCBsZXZlbCBub2RlcyBhcmUKLSAqIHF1ZXVlZCB1cCBmb3IgZGVsZXRpb24gc28gdGhhdCBpdGVyYXRpb24gb3ZlciB0aGUgbGlzdCBvZiBub2RlcyBmcm9tIHRoZQotICogZHRkZmlsZSBpcyBub3QgbWVzc2VkIHVwLiBOb3RlIHRoYXQgd2hlbiBhbiBleHRlcm5hbCBwYXJtZXRlciBlbnRpdHkKLSAqIGNoYW5nZXMsIHRoZSBjbGllbnQgb2YgdGhlIG1vZGVsIChlLmcuIGVkaXRvcikgbXVzdCBiZSBhIERUREZpbGVMaXN0ZW5lcgotICogaW1wbGVtZW50aW5nIHRoZSBsaXN0ZW5lcidzIGludGVyZmFjZSB0byBrZWVwIHRoZSBtb2RlbCdzIHJlZmVyZW50aWFsCi0gKiBpbnRlZ3JpdHkgKFNlZSBEVERNb2RlbEltcGwgZm9yIGV4YW1wbGUpLgotICovCi0KLXB1YmxpYyBjbGFzcyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQotCXByb3RlY3RlZCBEVERCYXRjaE5vZGVEZWxldGUgYmF0Y2hEZWxldGU7Ci0JcHJvdGVjdGVkIExpc3QgZXh0ZXJuYWxFbGVtZW50c0FuZFBhcm1FbnRpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFybUVudGl0eSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBEVEROb2RlIG5vZGVUb0RlbGV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFJlZk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcigpIHsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBleHRlcm5hbFJlZmVyZW5jZUFib3V0VG9DaGFuZ2UoT2JqZWN0IHJlcXVlc3RvciwgRW50aXR5IGVudGl0eSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgfHwgIWVudGl0eS5pc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCS8vIGlmIGl0IGlzIG5vdCBhbiBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCi0JCURUREZpbGUgZHRkRmlsZSA9IGVudGl0eS5nZXREVERGaWxlKCk7Ci0JCWlmIChiYXRjaERlbGV0ZSA9PSBudWxsKSB7Ci0JCQliYXRjaERlbGV0ZSA9IG5ldyBEVERCYXRjaE5vZGVEZWxldGUoZHRkRmlsZSk7Ci0JCX0KLQotCQkvLyBTZWUgdGhlIGNvbW1lbnQgYXQgdGhlIGhlYWQgb2YgdGhpcyBmaWxlIHJlZ2FyZGluZwotCQkvLyBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMuCi0JCS8vZXh0ZXJuYWxFbGVtZW50c0FuZFBhcm1FbnRpdGllcyA9Ci0JCS8vIGR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5nZXRFeHRlcm5hbE1vZGVscygpLmdldEVsZW1lbnRDb250ZW50TmFtZXMoZW50aXR5LmdldFB1YmxpY0lEKCksCi0JCS8vIGR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5yZXNvbHZlSUQoZW50aXR5LmdldFB1YmxpY0lEKCksCi0JCS8vIGVudGl0eS5nZXRTeXN0ZW1JRCgpKSk7Ci0KLQkJdmlzaXQoZHRkRmlsZSk7Ci0KLQkJYmF0Y2hEZWxldGUuZGVsZXRlTm9kZXMocmVxdWVzdG9yKTsKLQotCQlpc1VwZGF0aW5nID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaGluZ05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGV4dGVybmFsRWxlbWVudHNBbmRQYXJtRW50aXRpZXMuY29udGFpbnMobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlTdHJpbmcgYXR0clR5cGUgPSBhdHRyLmdldFR5cGUoKTsKLQotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWYoYXR0ck5hbWUpKSB7Ci0JCQlpZiAoaXNNYXRjaGluZ05hbWUoYXR0ck5hbWUpKSB7Ci0JCQkJYXR0ci5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWYoYXR0clR5cGUpKSB7Ci0JCQlpZiAoaXNNYXRjaGluZ05hbWUoYXR0clR5cGUpKSB7Ci0JCQkJYXR0ci5zZXRUeXBlKHJlcXVlc3RvciwgQXR0cmlidXRlLkNEQVRBKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGVMaXN0KGF0dExpc3QpOwotCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSBhdHRMaXN0LmdldE5hbWUoKTsKLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGF0dExpc3ROYW1lKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGF0dExpc3ROYW1lKSkgewotCQkJCWF0dExpc3Quc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBlbGVtZW50TmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWYoZWxlbWVudE5hbWUpKSB7Ci0JCQlpZiAoaXNNYXRjaGluZ05hbWUoZWxlbWVudE5hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzdXBlci52aXNpdEVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRSZWZlcmVuY2UoQ01CYXNpY05vZGUgbm9kZSkgewotCQlzdXBlci52aXNpdFJlZmVyZW5jZShub2RlKTsKLQkJU3RyaW5nIHJlZk5hbWUgPSBub2RlLmdldE5hbWUoKTsKLQkJaWYgKGlzTWF0Y2hpbmdOYW1lKHJlZk5hbWUpKSB7Ci0JCQlEVEROb2RlIHBhcmVudCA9IChEVEROb2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWJhdGNoRGVsZXRlLmFkZE5vZGUobm9kZSk7Ci0JCQkvLyAgICAgIHBhcmVudC5kZWxldGUocmVxdWVzdG9yLCBub2RlKTsKLQkJfQotCX0KLQotCS8vICAgIHB1YmxpYyB2b2lkCi0JLy8gdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKLQkvLyBwYXJtRW50aXR5UmVmKQotCS8vICAgIHsKLQkvLyAgICAgIHN1cGVyLnZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eVJlZik7Ci0JLy8gICAgICBpZiAoaXNQYXJtRW50aXR5ICYmIHBhcm1FbnRpdHlSZWYuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkKLQkvLyAgICAgIHsKLQkvLyAgICAgICAgbm9kZXNUb0RlbGV0ZS5hZGQocGFybUVudGl0eVJlZik7Ci0JLy8gICAgICB9Ci0JLy8gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RURE1vZGVsVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RURE1vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjBlMTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdXRpbC9EVERNb2RlbFVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLlBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLQotCi0vLyB0aGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyB0aGUgbW9kZWwgd2hlbiBpdGVtcwotLy8gYXJlIGRlbGV0ZWQgb3IgYSBleHRlcm5hbCBwYXJtIGVudGl0eSBjaGFuZ2VzIHNvIHRoYXQKLS8vIGl0ZW1zIHJlZmVyZW5jZWQgYnkgaXQgYXJlIGNsZWFuZWQgdXAKLS8vIG5vdGUgdGhhdCB0b3AgbGV2ZWwgbm9kZXMgYXJlIHF1ZXVlZCB1cCBmb3IgZGVsZXRpb24gc28gdGhhdAotLy8gaXRlcmF0aW9uIG92ZXIgdGhlIGxpc3Qgb2Ygbm9kZXMgZnJvbSB0aGUgZHRkZmlsZSBpcyBub3QgbWVzc2VkIHVwCi1wdWJsaWMgY2xhc3MgRFRETW9kZWxVcGRhdGVyIGV4dGVuZHMgRFREVmlzaXRvciB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBMaXN0IG5vZGVzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIERURE5vZGUgbm9kZVRvRGVsZXRlOwotCXByb3RlY3RlZCBTdHJpbmcgb2xkUmVmTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0b3I7Ci0KLQlwdWJsaWMgRFRETW9kZWxVcGRhdGVyKCkgewotCi0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9iamVjdEFib3V0VG9CZURlbGV0ZWQoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSBub2RlKSB7Ci0JCWlmIChpc1VwZGF0aW5nKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIEVudGl0eSB8fCBub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHsKLQkJCS8vIGp1c3QgaWdub3JlIGlmIGl0IGlzIG5vdCBvbmUgb2YgdGhlc2UKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAhKChFbnRpdHkpIG5vZGUpLmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQkJCS8vIGlmIGl0IGlzIG5vdCBhIHBhcmFtZXRlciBlbnRpdHksIGlnbm9yZSBhcyB3ZWxsCi0JCQlyZXR1cm47Ci0JCX0KLQotCi0JCWlzVXBkYXRpbmcgPSB0cnVlOwotCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQkJdGhpcy5ub2RlVG9EZWxldGUgPSBub2RlOwotCQlvbGRSZWZOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCWlzUGFybUVudGl0eSA9IGZhbHNlOwotCQlub2Rlc1RvRGVsZXRlLmNsZWFyKCk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCWlzUGFybUVudGl0eSA9IHRydWU7Ci0JCQlvbGRSZWZOYW1lID0gIiUiICsgb2xkUmVmTmFtZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlEVERGaWxlIGR0ZEZpbGUgPSBub2RlLmdldERUREZpbGUoKTsKLQkJdmlzaXQoZHRkRmlsZSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlc1RvRGVsZXRlLnNpemUoKTsgaSsrKSB7Ci0JCQlkdGRGaWxlLmRlbGV0ZU5vZGUocmVxdWVzdG9yLCAoRFRETm9kZSkgbm9kZXNUb0RlbGV0ZS5nZXQoaSkpOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQlpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJYXR0ci5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChhdHRyLmdldFR5cGUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQlhdHRyLnNldFR5cGUocmVxdWVzdG9yLCBBdHRyaWJ1dGUuQ0RBVEEpOwotCQkJfQotCQl9Ci0JCS8vIGNoZWNrIHRoZSBhdHRyIG5hbWUgYW5kIHRoZSBhdHRyIHR5cGUgdG8gc2VlIGlmIGl0Ci0JCS8vIG5lZWRzIHVwZGF0aW5nCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVMaXN0KEF0dHJpYnV0ZUxpc3QgYXR0TGlzdCkgewotCQlzdXBlci52aXNpdEF0dHJpYnV0ZUxpc3QoYXR0TGlzdCk7Ci0JCWlmIChhdHRMaXN0LmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCQlhdHRMaXN0LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQkvLyBzYXZlIHVwIGZvciBsYXRlciBkZWxldGlvbgotCQkJCW5vZGVzVG9EZWxldGUuYWRkKGF0dExpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzdXBlci52aXNpdEVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eVJlZikgewotCQlzdXBlci52aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHBhcm1FbnRpdHlSZWYpOwotCQlpZiAoaXNQYXJtRW50aXR5ICYmIHBhcm1FbnRpdHlSZWYuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJbm9kZXNUb0RlbGV0ZS5hZGQocGFybUVudGl0eVJlZik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JCXN1cGVyLnZpc2l0UmVmZXJlbmNlKG5vZGUpOwotCi0JCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCURURE5vZGUgcGFyZW50ID0gKERURE5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJcGFyZW50LmRlbGV0ZShyZXF1ZXN0b3IsIG5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmNiOWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdXRpbC9EVEROb3RhdGlvblJlZmVyZW5jZVJlbW92ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5BdHRyaWJ1dGVFbnVtTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5Ob3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyIHsKLQlwcm90ZWN0ZWQgTm90YXRpb24gbm90YXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBub3RhdGlvbk5hbWU7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlcXVlc3RvcjsKLQotCXB1YmxpYyBEVEROb3RhdGlvblJlZmVyZW5jZVJlbW92ZXIoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RhdGlvbkFib3V0VG9CZURlbGV0ZWQoT2JqZWN0IHJlcXVlc3RvciwgTm90YXRpb24gbm90YXRpb24pIHsKLQkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0JCXRoaXMubm90YXRpb24gPSBub3RhdGlvbjsKLQkJbm90YXRpb25OYW1lID0gbm90YXRpb24uZ2V0TmFtZSgpOwotCi0JCXZpc2l0KG5vdGF0aW9uLmdldERUREZpbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXQoRFRERmlsZSBmaWxlKSB7Ci0JCUxpc3Qgbm9kZXMgPSBmaWxlLmdldE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgbm9kZXMuZ2V0KGkpOwotCQkJaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJdmlzaXRFbnRpdHkoKEVudGl0eSkgY3VycmVudE5vZGUpOwotCQkJfSBlbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQl2aXNpdEF0dHJpYnV0ZUxpc3QoKEF0dHJpYnV0ZUxpc3QpIGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCWlmIChhdHRyLmdldFR5cGUoKS5lcXVhbHMoQXR0cmlidXRlLkVOVU1FUkFURURfTk9UQVRJT04pKSB7Ci0JCQlBdHRyaWJ1dGVFbnVtTGlzdCBlbnVtTGlzdCA9IGF0dHIuZ2V0RW51bUxpc3QoKTsKLQkJCUxpc3Qgbm90YXRpb25OYW1lcyA9IGVudW1MaXN0LmdldEl0ZW1zKCk7Ci0JCQlJdGVyYXRvciBpdGVyID0gbm90YXRpb25OYW1lcy5pdGVyYXRvcigpOwotCQkJYm9vbGVhbiB1cGRhdGVSZXF1aXJlZCA9IGZhbHNlOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIG5vdGF0aW9uID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG5vdGF0aW9uLmVxdWFscyhub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCXVwZGF0ZVJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodXBkYXRlUmVxdWlyZWQpIHsKLQkJCQlTdHJpbmdbXSBuZXdJdGVtcyA9IG5ldyBTdHJpbmdbbm90YXRpb25OYW1lcy5zaXplKCldOwotCQkJCW5vdGF0aW9uTmFtZXMudG9BcnJheShuZXdJdGVtcyk7Ci0JCQkJZW51bUxpc3Quc2V0SXRlbXMocmVxdWVzdG9yLCBuZXdJdGVtcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCUF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgYXR0TGlzdC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChhdHRyICE9IG51bGwpIHsKLQkJCXZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQkJYXR0ciA9IChBdHRyaWJ1dGUpIGF0dHIuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RW50aXR5KEVudGl0eSBlbnRpdHkpIHsKLQkJaWYgKGVudGl0eS5nZXROb3RhdGlvbk5hbWUoKS5lcXVhbHMobm90YXRpb25OYW1lKSkgewotCQkJZW50aXR5LnNldE5vdGF0aW9uTmFtZShyZXF1ZXN0b3IsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19Ly8gRFRETm90YXRpb25SZW1vdmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3V0aWwvRFREUmVmZXJlbmNlVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RURFJlZmVyZW5jZVVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1MDk3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3V0aWwvRFREUmVmZXJlbmNlVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuQXR0cmlidXRlRW51bUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLk5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci0KLQotLy8gdGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgYW55IGR0ZCBub2RlIGluCi0vLyByZXNwb25zZSB0byBhIGNoYW5nZSBpbiB0aGUgbm9kZSB0aGF0IHRoZXkgcmVmZXJlbmNlCi1wdWJsaWMgY2xhc3MgRFREUmVmZXJlbmNlVXBkYXRlciBleHRlbmRzIERURFZpc2l0b3IgewotCXByb3RlY3RlZCBib29sZWFuIGlzTm90YXRpb24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFybUVudGl0eSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBTdHJpbmcgbmV3TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBvbGRSZWZOYW1lID0gIiIsIG5ld1JlZk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJvdGVjdGVkIERURE5vZGUgcmVmZXJlbmNlZE5vZGUgPSBudWxsOwotCi0JLy8gdGhlIHJlZmVyZW5jZXMgTGlzdCBpcyBhIGNhY2hlIG9mIHRoZSBEVEROb2RlcyB0aGF0IGFyZSBjaGFuZ2VkCi0JLy8gYXMgYSByZXN1bHQgb2YgYSBjYWxsIHRvIG5hbWVBYm91dFRvQ2hhbmdlKCkuIFRoZSBpZGVhIGlzIHRoYXQKLQkvLyBpZiBhIHN1YnNlcXVlbnQgY2FsbCBjb21lcyBpbiB0aGF0IGNoYW5nZXMgdGhlIG5hbWUgb2YgdGhlIHNhbWUKLQkvLyBvYmplY3QgZm9yIHdoaWNoIHRoaXMgY2FjaGUgZXhpc3RzIGZvciwgdGhlbiB3ZSBvcHRpbWl6ZSB0aGUKLQkvLyBwYXRoIGJ5IGp1c3Qgd2Fsa2luZyB0aGUgY2FjaGUKLQlwcml2YXRlIExpc3QgcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgT2JqZWN0IHJlcXVlc3RvcjsKLQotCXB1YmxpYyBEVERSZWZlcmVuY2VVcGRhdGVyKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJcmVmZXJlbmNlZE5vZGUgPSBudWxsOwotCQlyZWZlcmVuY2VzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5hbWVBYm91dFRvQ2hhbmdlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgcmVmZXJlbmNlZE5vZGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChpc1VwZGF0aW5nKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEocmVmZXJlbmNlZE5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgfHwgcmVmZXJlbmNlZE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgTm90YXRpb24pKSB7Ci0JCQkvLyBqdXN0IGlnbm9yZSBpZiBpdCBpcyBub3Qgb25lIG9mIHRoZXNlCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgRW50aXR5ICYmICEoKEVudGl0eSkgcmVmZXJlbmNlZE5vZGUpLmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQkJCS8vIGlmIGl0IGlzIG5vdCBhIHBhcmFtZXRlciBlbnRpdHksIGlnbm9yZSBhcyB3ZWxsCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpc1VwZGF0aW5nID0gdHJ1ZTsKLQkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0JCW9sZFJlZk5hbWUgPSByZWZlcmVuY2VkTm9kZS5nZXROYW1lKCk7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld1JlZk5hbWUgPSBuZXdOYW1lOwotCQlpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQkJaXNOb3RhdGlvbiA9IHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgTm90YXRpb247Ci0KLQkJaWYgKHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlpc1Bhcm1FbnRpdHkgPSB0cnVlOwotCQkJb2xkUmVmTmFtZSA9ICIlIiArIG9sZFJlZk5hbWUgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbmV3UmVmTmFtZSA9ICIlIiArIG5ld1JlZk5hbWUgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKHRoaXMucmVmZXJlbmNlZE5vZGUgIT0gbnVsbCkgewotCQkJLy8gY2hlY2sgaWYgdGhlIHByZXZpb3VzIHJlZmVyZW5jZWQgbm9kZSB0aGF0IHdhcyBjaGFuZ2VkCi0JCQkvLyBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHRoYXQgaXMgY29taW5nIGluLiBpZiBzbywganVzdAotCQkJLy8gY2hhbmdlIHRoZSBwcmV2aW91cyByZWdpb25zCi0JCQlpZiAodGhpcy5yZWZlcmVuY2VkTm9kZSA9PSByZWZlcmVuY2VkTm9kZSkgewotCQkJCXF1aWNrVXBkYXRlKCk7Ci0JCQkJaXNVcGRhdGluZyA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIGNsZWFyIHRoZSBjYWNoZSBpZiB3ZSBnZXQgaGVyZQotCQl0aGlzLnJlZmVyZW5jZWROb2RlID0gcmVmZXJlbmNlZE5vZGU7Ci0JCXJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJRFRERmlsZSBkdGRGaWxlID0gcmVmZXJlbmNlZE5vZGUuZ2V0RFRERmlsZSgpOwotCQl2aXNpdChkdGRGaWxlKTsKLQkJaXNVcGRhdGluZyA9IGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHF1aWNrVXBkYXRlKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSByZWZlcmVuY2VzLmdldChpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCXZpc2l0RWxlbWVudCgoRWxlbWVudCkgbm9kZSk7Ci0JCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJdmlzaXRBdHRyaWJ1dGVMaXN0KChBdHRyaWJ1dGVMaXN0KSBub2RlKTsKLQkJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCXZpc2l0QXR0cmlidXRlKChBdHRyaWJ1dGUpIG5vZGUpOwotCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQl2aXNpdFJlZmVyZW5jZSgoQ01CYXNpY05vZGUpIG5vZGUpOwotCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSB7Ci0JCQkJdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBub2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQkvLyBjaGVjayB0aGUgYXR0ciBuYW1lIGFuZCB0aGUgYXR0ciB0eXBlIHRvIHNlZSBpZiBpdAotCQkJLy8gbmVlZHMgdXBkYXRpbmcKLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQlhdHRyLnNldE5hbWUocmVxdWVzdG9yLCBuZXdSZWZOYW1lKTsKLQkJCQlyZWZlcmVuY2VzLmFkZChhdHRyKTsKLQkJCX0KLQkJCWlmIChhdHRyLmdldFR5cGUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQlhdHRyLnNldFR5cGUocmVxdWVzdG9yLCBuZXdSZWZOYW1lKTsKLQkJCQlyZWZlcmVuY2VzLmFkZChhdHRyKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpc05vdGF0aW9uICYmIGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OT1RBVElPTikpIHsKLQkJCUF0dHJpYnV0ZUVudW1MaXN0IGVudW1MaXN0ID0gYXR0ci5nZXRFbnVtTGlzdCgpOwotCQkJTGlzdCBpdGVtcyA9IGVudW1MaXN0LmdldEl0ZW1zKCk7Ci0JCQlib29sZWFuIHVwZGF0ZU5lZWRlZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyBub3RhdGlvbk5hbWUgPSAoU3RyaW5nKSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG5vdGF0aW9uTmFtZS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQkJdXBkYXRlTmVlZGVkID0gdHJ1ZTsKLQkJCQkJaXRlbXMuc2V0KGksIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1cGRhdGVOZWVkZWQpIHsKLQkJCQlTdHJpbmdbXSBuZXdJdGVtcyA9IG5ldyBTdHJpbmdbaXRlbXMuc2l6ZSgpXTsKLQotCQkJCWVudW1MaXN0LnNldEl0ZW1zKChTdHJpbmdbXSkgaXRlbXMudG9BcnJheShuZXdJdGVtcykpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCWlmICghaXNOb3RhdGlvbiAmJiBhdHRMaXN0LmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCWF0dExpc3Quc2V0TmFtZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJcmVmZXJlbmNlcy5hZGQoYXR0TGlzdCk7Ci0JCX0KLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGVMaXN0KGF0dExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGlzUGFybUVudGl0eSkgewotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWVsZW1lbnQuc2V0TmFtZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmKSB7Ci0JCXN1cGVyLnZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eVJlZik7Ci0JCWlmIChwYXJtRW50aXR5UmVmLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCXBhcm1FbnRpdHlSZWYuc2V0UmVmZXJlbmNlZEVudGl0eShyZXF1ZXN0b3IsIG5ld05hbWUpOwotCQkJcmVmZXJlbmNlcy5hZGQocGFybUVudGl0eVJlZik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JCXN1cGVyLnZpc2l0UmVmZXJlbmNlKG5vZGUpOwotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWYob2xkUmVmTmFtZSkgJiYgIWlzUGFybUVudGl0eSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJbm9kZS5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChub2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdXRpbC9EVERTQVhQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdXRpbC9EVERTQVhQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmMDk3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3V0aWwvRFREU0FYUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5QYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotLyoqCi0gKiBUT0RPOiBLaWh1cCBhbmQgTml0aW4sIHJlZXZhbHVhdGUgdGhlIHVzZSBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcwotICovCi0KLS8vaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyOwotLy9pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnM7Ci0vL2ltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvcjsKLS8vaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxTdHJpbmc7Ci0vL2ltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotcHVibGljIGNsYXNzIERURFNBWFBhcnNlciBleHRlbmRzIFNBWFBhcnNlciB7Ci0KLQlwcml2YXRlIExpc3QgaWdub3JlZEVudGl0eVJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyAgcHJpdmF0ZSBYTUxMb2NhdG9yIGxvY2F0b3I7Ci0JLy8KLQlwdWJsaWMgTGlzdCBnZXRJZ25vcmVkRW50aXR5UmVmcygpIHsKLQkJcmV0dXJuIGlnbm9yZWRFbnRpdHlSZWZzOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIjZ2V0UGFyc2VyKCkKLQkgKi8KLQlwdWJsaWMgUGFyc2VyIGdldFBhcnNlcigpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyI2dldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIjZ2V0WE1MUmVhZGVyKCkKLQkgKi8KLQlwdWJsaWMgWE1MUmVhZGVyIGdldFhNTFJlYWRlcigpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8vCi0JLy8gIHB1YmxpYyBYTUxMb2NhdG9yIGdldExvY2F0b3IoKQotCS8vICB7Ci0JLy8gICAgcmV0dXJuIGxvY2F0b3I7Ci0JLy8gIH0KLQkvLwotCS8vICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50Ci0JLy8gICAgKFhNTExvY2F0b3IgbG9jYXRvciwKLQkvLyAgICAgU3RyaW5nIGVuY29kaW5nLAotCS8vICAgICBBdWdtZW50YXRpb25zIGF1Z3MpCi0JLy8gIHsKLQkvLyAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOwotCS8vICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQobG9jYXRvcixlbmNvZGluZyxhdWdzKTsKLQkvLyAgfQotCS8vCi0JLy8gIHB1YmxpYyB2b2lkIGlnbm9yZWRDaGFyYWN0ZXJzKFhNTFN0cmluZyB0ZXh0LCBBdWdtZW50YXRpb25zIGF1Z3MpCi0JLy8gICAgdGhyb3dzIFhOSUV4Y2VwdGlvbgotCS8vICB7Ci0JLy8gICAgU3RyaW5nIHMgPQotCS8vICAgICAgdGV4dC5sZW5ndGggPiAwID8gbmV3IFN0cmluZyh0ZXh0LmNoLHRleHQub2Zmc2V0LHRleHQubGVuZ3RoKSA6ICIiOwotCS8vICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpZ25vcmVkQ2hhcmFjdGVyczogIiArIHMpOwotCS8vCi0JLy8gICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywiOyIpOwotCS8vICAgIHRyeQotCS8vICAgIHsKLQkvLyAgICAgIFN0cmluZyB0b2tlbiA9IG51bGw7Ci0JLy8gICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLQkvLyAgICAgIHsKLQkvLyAgICAgICAgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JLy8gICAgICAgIGlmIChpc0VudGl0eVJlZih0b2tlbikpCi0JLy8gICAgICAgICAgcmVnaXN0ZXJFbnRpdHlSZWYodG9rZW4pOwotCS8vICAgICAgfQotCS8vICAgIH0KLQkvLyAgICBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKQotCS8vICAgIHsKLQkvLyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JLy8gICAgfQotCS8vICB9Ci0JLy8KLQkvLyBUT0RPOiBuZXZlciB1c2VkCi0JIGJvb2xlYW4gaXNFbnRpdHlSZWYoU3RyaW5nIHRva2VuKSB7Ci0JCS8vIExvb2tpbmcgZm9yIHRoZSBwYXR0ZXJuICJubm5uJW5ubm5uIi4KLQkJaWYgKHRva2VuLmluZGV4T2YoJyUnKSAhPSAtMSkKLQkJCXJldHVybiB0cnVlOyAvLyBjYW5kaWRhdGUgZm9yIGVudGl0eSByZWZlcmVuY2UKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyI2lzTmFtZXNwYWNlQXdhcmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyI2lzVmFsaWRhdGluZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW5nKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBUT0RPOiBuZXZlciB1c2VkCi0JIHZvaWQgcmVnaXN0ZXJFbnRpdHlSZWYoU3RyaW5nIHRva2VuKSB7Ci0JCWludCBpbmRleCA9IHRva2VuLmxhc3RJbmRleE9mKCclJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgcmVmTmFtZSA9IHRva2VuLnN1YnN0cmluZyhpbmRleCwgdG9rZW4ubGVuZ3RoKCkpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZW50aXR5IHJlZiBuYW1lIGlzOiAiICsgcmVmTmFtZSk7Ci0JCWlmIChyZWZOYW1lLmluZGV4T2YoJyAnKSAhPSAtMSB8fCByZWZOYW1lLmluZGV4T2YoJ1x0JykgIT0gLTEgfHwgcmVmTmFtZS5pbmRleE9mKCdcbicpICE9IC0xKQotCQkJcmV0dXJuOwotCQllbHNlCi0JCQkvLyB3ZSBmb3VuZCBlbnRpdHkgcmVmZXJlbmNlCi0JCQlpZ25vcmVkRW50aXR5UmVmcy5hZGQocmVmTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciNzZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1NWMyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLk5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEVERVbmlxdWVOYW1lSGVscGVyIHsKLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlyZXR1cm4gKChFbnRpdHkpIG9iaikuZ2V0TmFtZSgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gKChOb3RhdGlvbikgb2JqKS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gKChBdHRyaWJ1dGUpIG9iaikuZ2V0TmFtZSgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSAvLyBNb2RlbCBHcm91cCBDb250ZW50Ci0JCXsKLQkJCXJldHVybiAoKENNQmFzaWNOb2RlKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVBdHRyaWJ1dGVOYW1lKEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IGF0dHJzID0gZWxlbWVudC5nZXRFbGVtZW50QXR0cmlidXRlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShhdHRycywgIk5ld0F0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBkdGRGaWxlLmdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpLmdldE5vZGVzKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVsZW1lbnRzLCAiTmV3RWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRW50aXR5TmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBlbnRpdGllcyA9IGR0ZEZpbGUuZ2V0RW50aXRpZXMoKS5nZXROb2RlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbnRpdGllcywgIk5ld0VudGl0eSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZShMaXN0IG9ianMsIFN0cmluZyB0b2tlbikgewotCQlpbnQgY291bnRlciA9IDE7Ci0KLQkJYm9vbGVhbiB1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCXdoaWxlICghdW5pcXVlTmFtZSkgewotCQkJU3RyaW5nIG5ld05hbWUgPSB0b2tlbiArIG5ldyBJbnRlZ2VyKGNvdW50ZXIrKyk7Ci0JCQl1bmlxdWVOYW1lID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBvYmpzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9iak5hbWUgPSBnZXROYW1lKG9iaik7Ci0JCQkJaWYgKG9iak5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCXVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVuaXF1ZU5hbWUpIHsKLQkJCQlyZXR1cm4gbmV3TmFtZTsKLQkJCX0KLQkJfQotCQkvLyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJcmV0dXJuICJObyBOYW1lIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5vdGF0aW9uTmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBub3RhdGlvbnMgPSBkdGRGaWxlLmdldE5vdGF0aW9ucygpLmdldE5vZGVzKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKG5vdGF0aW9ucywgIk5ld05vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFREVW5pcXVlTmFtZUhlbHBlcigpIHsKLQl9Ci0KLX0gLy8gRFREVW5pcXVlTmFtZUhlbHBlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RURFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdXRpbC9EVERWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NDRkZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0RURFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERWaXNpdG9yIHsKLQotCXB1YmxpYyBEVERWaXNpdG9yKCkgewotCi0JfQotCi0JLy8gdXRpbGl0eSBtZXRob2QKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckVudGl0eVJlZihTdHJpbmcgcmVmZXJlbmNlKSB7Ci0JCWlmIChyZWZlcmVuY2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlLmNoYXJBdCgwKSA9PSAnJScgJiYgcmVmZXJlbmNlLmNoYXJBdChyZWZlcmVuY2UubGVuZ3RoKCkgLSAxKSA9PSAnOyc7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0KERUREZpbGUgZmlsZSkgewotCQlMaXN0IG5vZGVzID0gZmlsZS5nZXROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQl2aXNpdEVsZW1lbnQoKEVsZW1lbnQpIGN1cnJlbnROb2RlKTsKLQkJCX0gZWxzZSBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJdmlzaXRBdHRyaWJ1dGVMaXN0KChBdHRyaWJ1dGVMaXN0KSBjdXJyZW50Tm9kZSk7Ci0JCQl9IGVsc2UgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSB7Ci0JCQkJdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJLy8gbm90ZSB0aGF0IHdlIGRvbid0IHZpc2l0IGF0dHJpYnV0ZXMgaGVyZSBiZWNhdXNlIHdlCi0JCS8vIHdhbnQgdGhlIGVsZW1lbnQgdG8gdmlzaXQgdGhlbSB3aXRoIGl0J3MgY29uc29saWRhdGVkIGxpc3QKLQkJLy8gdGhhdCBpdCBjcmVhdGVzIGJ5IGdhdGhlcmluZyBhbGwgYXR0cmlidXRlIGxpc3RzIHRvZ2V0aGVyCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVzKExpc3QgYXR0cmlidXRlcykgewotCQlpbnQgc2l6ZSA9IGF0dHJpYnV0ZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQXR0cmlidXRlIGF0dHIgPSAoQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCXZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRDb250ZW50Tm9kZShDTU5vZGUgY29udGVudCkgewotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQlDTUJhc2ljTm9kZSBiYXNpY05vZGUgPSAoQ01CYXNpY05vZGUpIGNvbnRlbnQ7Ci0JCQlpZiAoYmFzaWNOb2RlLmlzUmVmZXJlbmNlKCkpIHsKLQkJCQl2aXNpdFJlZmVyZW5jZShiYXNpY05vZGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJdmlzaXRHcm91cE5vZGUoKENNR3JvdXBOb2RlKSBjb250ZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01Ob2RlIGNvbnRlbnQgPSBlbGVtZW50LmdldENvbnRlbnRNb2RlbCgpOwotCQl2aXNpdENvbnRlbnROb2RlKGNvbnRlbnQpOwotCQl2aXNpdEF0dHJpYnV0ZXMoZWxlbWVudC5nZXRFbGVtZW50QXR0cmlidXRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRHcm91cE5vZGUoQ01Hcm91cE5vZGUgZ3JvdXApIHsKLQkJTGlzdCBjaGlsZHJlbiA9IGdyb3VwLmdldENoaWxkcmVuTGlzdCgpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXZpc2l0Q29udGVudE5vZGUoKENNTm9kZSkgY2hpbGRyZW4uZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS91dGlsL0xhYmVsVmFsdWVQYWlyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3V0aWwvTGFiZWxWYWx1ZVBhaXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwNGNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3V0aWwvTGFiZWxWYWx1ZVBhaXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotcHVibGljIGNsYXNzIExhYmVsVmFsdWVQYWlyIHsKLQotCXB1YmxpYyBTdHJpbmcgZkxhYmVsOwotCXB1YmxpYyBPYmplY3QgZlZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBuYW1lL3ZhbHVlIGl0ZW0KLQkgKi8KLQlwdWJsaWMgTGFiZWxWYWx1ZVBhaXIoU3RyaW5nIGxhYmVsLCBPYmplY3QgdmFsdWUpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsYWJlbCAhPSBudWxsKTsKLQkJZkxhYmVsID0gbGFiZWw7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzYjYxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1odG1sbW9kZWwuamFyCi10ZW1wLmZvbGRlcgotZGV2LnByb3BlcnRpZXMKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjZhNTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RlYnVnL3RyYWNlZmlsdGVyPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhOWZhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2VkYTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jV2VkIEphbiAxMiAxMzo0Njo0NCBFU1QgMjAwNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMDBhMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jU2F0IERlYyAxMSAwMDo0ODoyOCBFU1QgMjAwNA0KLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MA0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wDQotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5NjM2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIGh0bWwuamFyLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGRhdGEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBkYXRhLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLmh0bWxtb2RlbC5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q0NjBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFUYWdJbmZvPUEgbGluayBpZiB0aGUgaHJlZiBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgYW5kIHRoZSB0YXJnZXQgZm9yIGEgbGluayBpZiB0aGUgbmFtZSBhdHRyaWJ1dGUgaXMgcHJlc2VudAotQUJCUlRhZ0luZm89QW4gYWJicmV2aWF0aW9uIChmb3IgZXhhbXBsZSwgV1dXLCBIVFRQKQotQUNST05ZTVRhZ0luZm89QW4gYWNyb255bSAoZm9yIGV4YW1wbGUsIFNDVUJBKQotQUREUkVTU1RhZ0luZm89QWRkcmVzcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGF1dGhvciBvZiB0aGUgcGFnZQotQVBQTEVUVGFnSW5mbz1BIEphdmEgYXBwbGV0Ci1BUkVBVGFnSW5mbz1EZWZpbmVzIGEgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIGFyZWEKLUJUYWdJbmZvPURpc3BsYXlzIGNvbnRhaW5lZCB0ZXh0IGFzIGJvbGQKLUJBU0VUYWdJbmZvPVRoZSBiYXNlIFVSSSBmb3IgdGhlIHBhZ2UsIHRvIGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyByZWxhdGl2ZSBwYXRocwotQkFTRUZPTlRUYWdJbmZvPVRoZSBiYXNlIGZvbnQgc2l6ZSBmb3IgdGhlIHBhZ2UKLUJET1RhZ0luZm89T3ZlcnJpZGVzIGRlZmF1bHQgYmlkaXJlY3Rpb25hbCBkaXNwbGF5LiBGb3IgdXNlIHdpdGggYmlkaXJlY3Rpb25hbCBsYW5ndWFnZXMuCi1CSUdUYWdJbmZvPURpc3BsYXlzIGNvbnRhaW5lZCB0ZXh0IGFzIGxhcmdlCi1CR1NPVU5EVGFnSW5mbz1EZWZpbmVzIGEgc291bmQgZmlsZSBmb3IgdGhlIHBhZ2UuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLUJMSU5LVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIGJsaW5raW5nLiBOb3Qgc3VwcG9ydGVkIGJ5IFczQyBIVE1MIDQuMDEuCi1CTE9DS1FVT1RFVGFnSW5mbz1BIGxvbmcgcXVvdGF0aW9uCi1CT0RZVGFnSW5mbz1UaGUgZG9jdW1lbnQgYm9keS4gQ29udGFpbnMgYWxsIHRoZSBjb250ZW50IGZvciB0aGUgcGFnZS4KLUJSVGFnSW5mbz1Gb3JjZXMgYSBsaW5lIGJyZWFrCi1CVVRUT05UYWdJbmZvPURlZmluZXMgYSBwdXNoIGJ1dHRvbgotQ0FQVElPTlRhZ0luZm89RGVmaW5lcyBhIHRhYmxlIGNhcHRpb24KLUNFTlRFUlRhZ0luZm89RGlzcGxheXMgY29udGFpbmVkIHRleHQgY2VudGVyZWQuIEVxdWl2YWxlbnQgdG8gRElWIHdpdGggYWxpZ249Y2VudGVyLgotQ0lURVRhZ0luZm89QSBjaXRhdGlvbgotQ09ERVRhZ0luZm89QSBjb21wdXRlciBjb2RlIGZyYWdtZW50Ci1DT0xUYWdJbmZvPUEgdGFibGUgY29sdW1uCi1DT0xHUk9VUFRhZ0luZm89QSBncm91cCBvZiB0YWJsZSBjb2x1bW5zCi1ERFRhZ0luZm89QSBkZWZpbml0aW9uIG9yIGRlc2NyaXB0aW9uIGluIGEgZGVmaW5pdGlvbiBvciBkZXNjcmlwdGlvbiBsaXN0Ci1ERUxUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgZGVsZXRlZAotREZOVGFnSW5mbz1BIGRlZmluaXRpb24KLURJUlRhZ0luZm89QSBkaXJlY3RvcnkgbGlzdGluZwotRElWVGFnSW5mbz1BIGdlbmVyaWMgY29udGFpbmVyLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVmaW5pbmcgbGFuZ3VhZ2Ugb3Igc3R5bGUgZm9yIHRoZSBjb250ZW50cwotRExUYWdJbmZvPUEgZGVmaW5pdGlvbiBvciBkZXNjcmlwdGlvbiBsaXN0Ci1EVFRhZ0luZm89QSB0ZXJtIG9yIHN1YmplY3QgaW4gYSBkZWZpbml0aW9uIG9yIGRlc2NyaXB0aW9uIGxpc3QKLUVNVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGVtcGhhc2l6ZWQgKGdlbmVyYWxseSBpdGFsaWNpemVkKQotRU1CRURUYWdJbmZvPURlZmluZXMgYW4gZW1iZWRkZWQgcGx1Zy1pbi4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgotRklFTERTRVRUYWdJbmZvPURlZmluZXMgYSBmb3JtIGNvbnRyb2wgZ3JvdXAKLUZPTlRUYWdJbmZvPURpc3BsYXlzIHRleHQgaW4gdGhlIGdpdmVuIGZvbnQKLUZPUk1UYWdJbmZvPURlZmluZXMgYW4gaW50ZXJhY3RpdmUgZm9ybQotRlJBTUVUYWdJbmZvPURlZmluZXMgYSBmcmFtZSB3aXRoaW4gdGhlIGN1cnJlbnQgd2luZG93Ci1GUkFNRVNFVFRhZ0luZm89RGVmaW5lcyBhIGZyYW1lc2V0IHRoYXQgZGl2aWRlcyB0aGUgd2luZG93IGludG8gZnJhbWVzCi1IMVRhZ0luZm89QSB0b3AtbGV2ZWwgaGVhZGluZwotSDJUYWdJbmZvPUEgc2Vjb25kLWxldmVsIGhlYWRpbmcKLUgzVGFnSW5mbz1BIHRoaXJkLWxldmVsIGhlYWRpbmcKLUg0VGFnSW5mbz1BIGZvdXJ0aC1sZXZlbCBoZWFkaW5nCi1INVRhZ0luZm89QSBmaWZ0aC1sZXZlbCBoZWFkaW5nCi1INlRhZ0luZm89QSBzaXh0aC1sZXZlbCBoZWFkaW5nCi1IRUFEVGFnSW5mbz1Db250YWlucyBtZXRhZGF0YSBhbmQgd2luZG93IHRpdGxlIGluZm9ybWF0aW9uIGZvciB0aGUgZG9jdW1lbnQKLUhSVGFnSW5mbz1BIGhvcml6b250YWwgcnVsZQotSFRNTFRhZ0luZm89VGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIGRvY3VtZW50LgotSVRhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBpdGFsaWMKLUlGUkFNRVRhZ0luZm89RGVmaW5lcyBhbiBpbmxpbmUgc3Vid2luZG93Ci1JTUdUYWdJbmZvPURpc3BsYXlzIHRoZSByZWZlcmVuY2VkIGltYWdlIGFzIGVtYmVkZGVkIGNvbnRlbnQKLUlOUFVUVGFnSW5mbz1EZWZpbmVzIGEgZm9ybSBjb250cm9sIGZvciB1c2VyIGlucHV0Ci1JTlNUYWdJbmZvPURlZmluZXMgaW5zZXJ0ZWQgdGV4dAotSVNJTkRFWFRhZ0luZm89RGVmaW5lcyBhIHNpbmdsZSBsaW5lIHByb21wdAotS0JEVGFnSW5mbz1EZWZpbmVzIHRleHQgdG8gYmUgZW50ZXJlZCBieSB0aGUgdXNlcgotTEFCRUxUYWdJbmZvPURlZmluZXMgdGhlIGxhYmVsIGZvciBhIGZvcm0gZmllbGQKLUxFR0VORFRhZ0luZm89RGVmaW5lcyB0aGUgbGFiZWwgZm9yIGEgc2V0IG9mIGZvcm0gZmllbGRzCi1MSVRhZ0luZm89RGVmaW5lcyBhIGxpc3QgaXRlbSB3aXRoaW4gYSBsaXN0Ci1MSU5LVGFnSW5mbz1BIG1lZGlhLWluZGVwZW5kZW50IGxpbmsKLU1BUFRhZ0luZm89RGVmaW5lcyBhIGNsaWVudC1zaWRlIGltYWdlIG1hcAotTUFSUVVFRVRhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBzY3JvbGxpbmcuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLU1FTlVUYWdJbmZvPURlZmluZXMgYSBtZW51IGxpc3QKLU1FVEFUYWdJbmZvPURlZmluZXMgbWV0YWRhdGEgaW5mb3JtYXRpb24gZm9yIHRoZSBkb2N1bWVudAotTk9CUlRhZ0luZm89T3ZlcnJpZGVzIGFuZCBwcmV2ZW50cyBsaW5lIGJyZWFrcy4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgotTk9GUkFNRVNUYWdJbmZvPVByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGZyYW1lcwotTk9TQ1JJUFRUYWdJbmZvPVByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHNjcmlwdGluZwotT0JKRUNUVGFnSW5mbz1EZWZpbmVzIGEgZ2VuZXJpYyBlbWJlZGRlZCBvYmplY3QKLU9MVGFnSW5mbz1BbiBvcmRlcmVkIGxpc3QKLU9QVEdST1VQVGFnSW5mbz1BbiBvcHRpb24gZ3JvdXAKLU9QVElPTlRhZ0luZm89QSBzZWxlY3RhYmxlIGNob2ljZQotUFRhZ0luZm89QSBwYXJhZ3JhcGgKLVBBUkFNVGFnSW5mbz1BIG5hbWVkIHByb3BlcnR5IHZhbHVlCi1QUkVUYWdJbmZvPVByZWZvcm1hdHRlZCB0ZXh0Ci1RVGFnSW5mbz1BIHNob3J0IGlubGluZSBxdW90YXRpb24KLVNUYWdJbmZvPURpc3BsYXkgdGV4dCBpbiBzdHJpa2UtdGhyb3VnaCBzdHlsZQotU0FNUFRhZ0luZm89U2FtcGxlIHByb2dyYW0gb3V0cHV0LCBzY3JpcHRzLCBldGMuIERpc3BsYXlzIGluIG1vbm9zcGFjZSBmb250LgotU0NSSVBUVGFnSW5mbz1TY3JpcHQgc3RhdGVtZW50cwotU0VMRUNUVGFnSW5mbz1BbiBvcHRpb24gc2VsZWN0b3IKLVNNQUxMVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIHNtYWxsCi1TUEFOVGFnSW5mbz1BIGdlbmVyaWMgY29udGFpbmVyLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVmaW5pbmcgbGFuZ3VhZ2Ugb3Igc3R5bGUgZm9yIHRoZSBjb250ZW50cwotU1RSSUtFVGFnSW5mbz1EaXNwbGF5IHRleHQgaW4gc3RyaWtlLXRocm91Z2ggc3R5bGUKLVNUUk9OR1RhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBzdHJvbmdseSBlbXBoYXNpemVkIChnZW5lcmFsbHkgYm9sZCkKLVNUWUxFVGFnSW5mbz1EZWZpbmVzIGEgc3R5bGUgZm9yIHRoZSBjb250YWluZWQgaW5mb3JtYXRpb24KLVNVQlRhZ0luZm89RGlzcGxheSBhcyBzdWJzY3JpcHQKLVNVUFRhZ0luZm89RGlzcGxheSBhcyBzdXBlcnNjcmlwdAotVEFCTEVUYWdJbmZvPURlZmluZXMgYSB0YWJsZQotVEJPRFlUYWdJbmZvPVRoZSBib2R5IG9mIHRoZSB0YWJsZQotVERUYWdJbmZvPUEgY2VsbCB3aXRoaW4gYSB0YWJsZQotVEVYVEFSRUFUYWdJbmZvPUEgbXVsdGktbGluZSB0ZXh0IGZpZWxkCi1URk9PVFRhZ0luZm89QSB0YWJsZSBmb290ZXIKLVRIVGFnSW5mbz1BIHRhYmxlIGhlYWRlciBjZWxsCi1USEVBRFRhZ0luZm89QSB0YWJsZSBoZWFkZXIKLVRJVExFVGFnSW5mbz1UaGUgZG9jdW1lbnQgdGl0bGUsIGRpc3BsYXllZCBpbiB0aGUgYnJvd3NlcidzIHRpdGxlIGJhcgotVFJUYWdJbmZvPUEgdGFibGUgcm93Ci1UVFRhZ0luZm89RGlzcGxheXMgdGV4dCBpbiB0ZWxldHlwZSBvciBtb25vc3BhY2VkIHRleHQgc3R5bGUKLVVUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgdW5kZXJsaW5lZAotVUxUYWdJbmZvPUFuIHVub3JkZXJlZCBsaXN0Ci1WQVJUYWdJbmZvPUFuIGluc3RhbmNlIG9mIGEgdmFyaWFibGUgb3IgcHJvZ3JhbSBhcmd1bWVudAotV0JSVGFnSW5mbz1BbGxvd3MgYSBsaW5lIGJyZWFrIHdpdGhpbiA8Qj4mbHQ7Tk9CUiZndDs8L0I+IHRhZy4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNWI3NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGFic3RyYWN0R3JhbW1hckFubm90YXRpb25zIHByb3BlcnRpZXNMb2NhdGlvbj0iaHRtcmVmIiBjYXNlU2Vuc2l0aXZlPSJmYWxzZSI+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBQkJSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBQkJSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkFDUk9OWU0iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFDUk9OWU1UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQUREUkVTUyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQUREUkVTU1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBUFBMRVQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFQUExFVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBUkVBIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBUkVBVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkFTRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkFTRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCQVNFRk9OVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkFTRUZPTlRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkRPIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCRE9UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkdTT1VORCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkdTT1VORFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCSUciPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJJR1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCTElOSyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkxJTktUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkxPQ0tRVU9URSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkxPQ0tRVU9URVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCT0RZIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCT0RZVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCVVRUT04iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJVVFRPTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDQVBUSU9OIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVDQVBUSU9OVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNFTlRFUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ0VOVEVSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNJVEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNJVEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ09ERSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ09ERVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDT0wiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNPTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDT0xHUk9VUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ09MR1JPVVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iREQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUREVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRFTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lREVMVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRGTiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lREZOVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRJUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRElSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRJViI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRElWVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRMIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVETFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJEVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRFRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRU0iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUVNVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkVNQkVEIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVFTUJFRFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGSUVMRFNFVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRklFTERTRVRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRk9OVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRk9OVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGT1JNIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVGT1JNVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkZSQU1FIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVGUkFNRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGUkFNRVNFVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRlJBTUVTRVRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUgxVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkgyIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVIMlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIMyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDNUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUg0VGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ikg1Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVINVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJINiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDZUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSEVBRCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSEVBRFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSFJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSFRNTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSFRNTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklGUkFNRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSUZSQU1FVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklNRyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSU1HVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklOUFVUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJTlBVVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJTlMiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUlOU1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJU0lOREVYIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJU0lOREVYVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IktCRCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lS0JEVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkxBQkVMIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVMQUJFTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJMRUdFTkQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUxFR0VORFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJMSSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTElUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTElOSyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTElOS1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJNQVAiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU1BUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJNQVJRVUVFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVNQVJRVUVFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik1FTlUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU1FTlVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTUVUQSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTUVUQVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJOT0JSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVOT0JSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik5PRlJBTUVTIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVOT0ZSQU1FU1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJOT1NDUklQVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTk9TQ1JJUFRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iT0JKRUNUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVPQkpFQ1RUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iT0wiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU9MVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik9QVEdST1VQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVPUFRHUk9VUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJPUFRJT04iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU9QVElPTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVQVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlBBUkFNIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVQQVJBTVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJQUkUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVBSRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJRIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVRVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlMiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU0FNUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU0FNUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTQ1JJUFQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNDUklQVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTRUxFQ1QiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNFTEVDVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTTUFMTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU01BTExUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1BBTiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1BBTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVFJJS0UiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUUklLRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVFJPTkciPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUUk9OR1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVFlMRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1RZTEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1VCIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVUJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1VQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEFCTEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRBQkxFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRCT0RZIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUQk9EWVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJURCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVERUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEVYVEFSRUEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRFWFRBUkVBVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRGT09UIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVURk9PVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUSCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVEhUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEhFQUQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRIRUFEVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRJVExFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUSVRMRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVFJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVFQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVUwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVVMVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlZBUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVkFSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IldCUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lV0JSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotPC9hYnN0cmFjdEdyYW1tYXJBbm5vdGF0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWZfZGUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmNiZDZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFUYWdJbmZvPUVpbiBMaW5rLCBmYWxscyBkYXMgQXR0cmlidXQgJ2hyZWYnIHZvcmhhbmRlbiBpc3QsIGJ6dy4gZGFzIFppZWwgZlx1MDBmY3IgZWluZW4gTGluaywgd2VubiBkYXMgQXR0cmlidXQgJ25hbWUnIHZvcmhhbmRlbiBpc3QKLUFCQlJUYWdJbmZvPUFia1x1MDBmY3J6dW5nICh6LiBCLiBXV1csIEhUVFApCi1BQ1JPTllNVGFnSW5mbz1Ba3JvbnltICh6LiBCLiBTQ1VCQSkKLUFERFJFU1NUYWdJbmZvPUFkcmVzc2luZm9ybWF0aW9uZW4gZlx1MDBmY3IgZGVuIEF1dG9yIGRlciBTZWl0ZQotQVBQTEVUVGFnSW5mbz1KYXZhLUFwcGxldAotQVJFQVRhZ0luZm89RGVmaW5pZXJ0IGVpbmVuIGNsaWVudHNlaXRpZ2VuIEltYWdlenVvcmRudW5nc2JlcmVpY2gKLUJUYWdJbmZvPVplaWd0IGVudGhhbHRlbmVuIFRleHQgaW4gRmV0dGZvcm1hdGllcnVuZyBhbgotQkFTRVRhZ0luZm89QmFzaXMtVVJJIGZcdTAwZmNyIGRpZSBTZWl0ZSwgd2lyZCBiZWkgZGVyIEJlcmVjaG51bmcgcmVsYXRpdmVyIFBmYWRlIHZlcndlbmRldAotQkFTRUZPTlRUYWdJbmZvPUJhc2lzc2NocmlmdGFydGdyXHUwMGY2XHUwMGRmZSBmXHUwMGZjciBkaWUgU2VpdGUKLUJET1RhZ0luZm89XHUwMGRjYmVyc2NocmVpYnQgU3RhbmRhcmRhbnplaWdlIGltIEJpZGlyZWt0aW9uYWxmb3JtYXQsIHdpcmQgbWl0IGJpZGlyZWt0aW9uYWxlbiBTcHJhY2hlbiAoQklESS1TcHJhY2hlbikgdmVyd2VuZGV0Ci1CSUdUYWdJbmZvPVplaWd0IGVudGhhbHRlbmVuIFRleHQgaW4gZ3JvXHUwMGRmZXIgU2NocmlmdCBhbgotQkdTT1VORFRhZ0luZm89RGVmaW5pZXJ0IGVpbmUgQXVkaW9kYXRlaSBmXHUwMGZjciBkaWUgU2VpdGUuIFdpcmQgZHVyY2ggVzNDIEhUTUwgNC4wMSBuaWNodCB1bnRlcnN0XHUwMGZjdHp0LgotQkxJTktUYWdJbmZvPVplaWd0IFRleHQgYmxpbmtlbmQgYW4uIFdpcmQgZHVyY2ggVzNDIEhUTUwgNC4wMSBuaWNodCB1bnRlcnN0XHUwMGZjdHp0LgotQkxPQ0tRVU9URVRhZ0luZm89TGFuZ2VzIFppdGF0Ci1CT0RZVGFnSW5mbz1Eb2t1bWVudGhhdXB0dGVpbCwgZGVyIGRlbiBnZXNhbXRlbiBJbmhhbHQgZlx1MDBmY3IgZGllIFNlaXRlIGVudGhcdTAwZTRsdAotQlJUYWdJbmZvPUVyendpbmd0IGVpbmVuIFplaWxlbnVtYnJ1Y2gKLUJVVFRPTlRhZ0luZm89RGVmaW5pZXJ0IGVpbmUgU2NoYWx0ZmxcdTAwZTRjaGUKLUNBUFRJT05UYWdJbmZvPURlZmluaWVydCBlaW5lIFRhYmVsbGVuXHUwMGZjYmVyc2NocmlmdAotQ0VOVEVSVGFnSW5mbz1aZWlndCBlbnRoYWx0ZW5lbiBUZXh0IGluIHplbnRyaWVydCBhbi4gSXN0IFx1MDBlNHF1aXZhbGVudCB6dSBESVYgbWl0ICdhbGlnbj1jZW50ZXInLgotQ0lURVRhZ0luZm89Wml0YXQKLUNPREVUYWdJbmZvPUNvbXB1dGVyLUNvZGVmcmFnbWVudAotQ09MVGFnSW5mbz1UYWJlbGxlbnNwYWx0ZQotQ09MR1JPVVBUYWdJbmZvPUdydXBwZSB2b24gVGFiZWxsZW5zcGFsdGVuCi1ERFRhZ0luZm89RGVmaW5pdGlvbiBvZGVyIEJlc2NocmVpYnVuZyBpbiBlaW5lciBEZWZpbml0aW9ucy0gb2RlciBCZXNjaHJlaWJ1bmdzbGlzdGUKLURFTFRhZ0luZm89WmVpZ3QgVGV4dCBhbHMgZ2VsXHUwMGY2c2NodCBhbgotREZOVGFnSW5mbz1EZWZpbml0aW9uCi1ESVJUYWdJbmZvPVZlcnplaWNobmlzbGlzdGUKLURJVlRhZ0luZm89R2VuZXJpc2NoZXIgQ29udGFpbmVyLCBkZXIgenVtIERlZmluaWVyZW4gdm9uIFNwcmFjaGUgb2RlciBEYXJzdGVsbHVuZyBmXHUwMGZjciBkZW4gSW5oYWx0IHZlcndlbmRldCB3ZXJkZW4ga2FubgotRExUYWdJbmZvPURlZmluaXRpb25zLSBvZGVyIEJlc2NocmVpYnVuZ3NsaXN0ZQotRFRUYWdJbmZvPUJlZ3JpZmYgb2RlciBUaGVtYSBpbiBlaW5lciBEZWZpbml0aW9ucy0gb2RlciBCZXNjaHJlaWJ1bmdzbGlzdGUKLUVNVGFnSW5mbz1aZWlndCBUZXh0IGhlcnZvcmdlaG9iZW4gYW4gKG5vcm1hbGVyd2Vpc2Uga3Vyc2l2KQotRU1CRURUYWdJbmZvPURlZmluaWVydCBlaW4gZWluZ2ViZXR0ZXRlcyBQbHVnLWluLiBXaXJkIGR1cmNoIFczQyBIVE1MIDQuMDEgbmljaHQgdW50ZXJzdFx1MDBmY3R6dC4KLUZJRUxEU0VUVGFnSW5mbz1EZWZpbmllcnQgZWluZSBHcnVwcGUgdm9uIEZvcm11bGFyc3RldWVyZWxlbWVudGVuCi1GT05UVGFnSW5mbz1aZWlndCBUZXh0IGluIGRlciBhbmdlZ2ViZW5lbiBTY2hyaWZ0YXJ0IGFuCi1GT1JNVGFnSW5mbz1EZWZpbmllcnQgZWluIGludGVyYWt0aXZlcyBGb3JtdWxhcgotRlJBTUVUYWdJbmZvPURlZmluaWVydCBlaW5lbiBGcmFtZSBpbSBha3R1ZWxsZW4gRmVuc3RlcgotRlJBTUVTRVRUYWdJbmZvPURlZmluaWVydCBlaW4gRnJhbWVzZXQsIGRhcyBkYXMgRmVuc3RlciBpbiB6d2VpIEZyYW1lcyB1bnRlcnRlaWx0Ci1IMVRhZ0luZm89XHUwMGRjYmVyc2NocmlmdCBkZXIgaFx1MDBmNmNoc3RlbiBFYmVuZQotSDJUYWdJbmZvPVx1MDBkY2JlcnNjaHJpZnQgZGVyIHp3ZWl0ZW4gRWJlbmUKLUgzVGFnSW5mbz1cdTAwZGNiZXJzY2hyaWZ0IGRlciBkcml0dGVuIEViZW5lCi1INFRhZ0luZm89XHUwMGRjYmVyc2NocmlmdCBkZXIgdmllcnRlbiBFYmVuZQotSDVUYWdJbmZvPVx1MDBkY2JlcnNjaHJpZnQgZGVyIGZcdTAwZmNuZnRlbiBFYmVuZQotSDZUYWdJbmZvPVx1MDBkY2JlcnNjaHJpZnQgZGVyIHNlY2hzdGVuIEViZW5lCi1IRUFEVGFnSW5mbz1FbnRoXHUwMGU0bHQgTWV0YWRhdGVuIHVuZCBGZW5zdGVydGl0ZWxpbmZvcm1hdGlvbmVuIGZcdTAwZmNyIGRhcyBEb2t1bWVudAotSFJUYWdJbmZvPUhvcml6b250YWxlIFNrYWxhIChMaW5lYWwpCi1IVE1MVGFnSW5mbz1TdGFtbWVsZW1lbnQgZlx1MDBmY3IgZGFzIERva3VtZW50Ci1JVGFnSW5mbz1aZWlndCBUZXh0IGt1cnNpdiBhbi4KLUlGUkFNRVRhZ0luZm89RGVmaW5pZXJ0IGVpbiBJbmxpbmUtVW50ZXJmZW5zdGVyCi1JTUdUYWdJbmZvPVplaWd0IGRhcyBJbWFnZSwgYXVmIGRhcyB2ZXJ3aWVzZW4gd2lyZCwgYWxzIGVpbmdlYmV0dGV0ZW4gSW5oYWx0IGFuCi1JTlBVVFRhZ0luZm89RGVmaW5pZXJ0IGVpbiBGb3JtdWxhcnN0ZXVlcmVsZW1lbnQgZlx1MDBmY3IgZGllIEJlbnV0emVyZWluZ2FiZQotSU5TVGFnSW5mbz1EZWZpbmllcnQgZWluZ2VmXHUwMGZjZ3RlbiBUZXh0Ci1JU0lOREVYVGFnSW5mbz1EZWZpbmllcnQgZWluZSBlaW56ZWlsaWdlIEVpbmdhYmVhdWZmb3JkZXJ1bmcKLUtCRFRhZ0luZm89RGVmaW5pZXJ0IFRleHQsIGRlciBkdXJjaCBkZW4gQmVudXR6ZXIgZWluZ2VnZWJlbiB3ZXJkZW4gbXVzcwotTEFCRUxUYWdJbmZvPURlZmluaWVydCBkaWUgQmVzY2hyaWZ0dW5nIGZcdTAwZmNyIGVpbiBGb3JtdWxhcmZlbGQKLUxFR0VORFRhZ0luZm89RGVmaW5pZXJ0IGRpZSBCZXNjaHJpZnR1bmcgZlx1MDBmY3IgZWluZSBHcnVwcGUgdm9uIEZvcm11bGFyZmVsZGVybgotTElUYWdJbmZvPURlZmluaWVydCBlaW5lbiBMaXN0ZW5laW50cmFnIGluIGVpbmVyIExpc3RlCi1MSU5LVGFnSW5mbz1EYXRlbnRyXHUwMGU0Z2VydW5hYmhcdTAwZTRuZ2lnZXIgTGluawotTUFQVGFnSW5mbz1EZWZpbmllcnQgZWluZSBjbGllbnRzZWl0aWdlIEltYWdlenVvcmRudW5nCi1NQVJRVUVFVGFnSW5mbz1aZWlndCBUZXh0IHZlcnNjaGllYmJhciBhbi4gV2lyZCBkdXJjaCBXM0MgSFRNTCA0LjAxIG5pY2h0IHVudGVyc3RcdTAwZmN0enQuCi1NRU5VVGFnSW5mbz1EZWZpbmllcnQgZWluZSBNZW5cdTAwZmNsaXN0ZQotTUVUQVRhZ0luZm89RGVmaW5pZXJ0IE1ldGFkYXRlbmluZm9ybWF0aW9uZW4gZlx1MDBmY3IgZGFzIERva3VtZW50Ci1OT0JSVGFnSW5mbz1cdTAwZGNiZXJzY2hyZWlidCB1bmQgdmVyaGluZGVydCBaZWlsZW51bWJyXHUwMGZjY2hlLiBXaXJkIGR1cmNoIFczQyBIVE1MIDQuMDEgbmljaHQgdW50ZXJzdFx1MDBmY3R6dC4KLU5PRlJBTUVTVGFnSW5mbz1TdGVsbHQgSW5mb3JtYXRpb25lbiBiZXJlaXQsIGRpZSBhbmdlemVpZ3Qgd2VyZGVuIHNvbGxlbiwgd2VubiBkZXIgYWt0dWVsbGUgQnJvd3NlciBrZWluZSBGcmFtZXMgdW50ZXJzdFx1MDBmY3R6dAotTk9TQ1JJUFRUYWdJbmZvPVN0ZWxsdCBJbmZvcm1hdGlvbmVuIGJlcmVpdCwgZGllIGFuZ2V6ZWlndCB3ZXJkZW4gc29sbGVuLCB3ZW5uIGRlciBha3R1ZWxsZSBCcm93c2VyIGtlaW5lIFNjcmlwdGVyc3RlbGx1bmcgdW50ZXJzdFx1MDBmY3R6dAotT0JKRUNUVGFnSW5mbz1EZWZpbmllcnQgZWluIGdlbmVyaXNjaGVzIGVpbmdlYmV0dGV0ZXMgT2JqZWt0Ci1PTFRhZ0luZm89U29ydGllcnRlIExpc3RlCi1PUFRHUk9VUFRhZ0luZm89T3B0aW9uc2dydXBwZQotT1BUSU9OVGFnSW5mbz1BdXN3XHUwMGU0aGxiYXJlIE9wdGlvbgotUFRhZ0luZm89QWJzYXR6Ci1QQVJBTVRhZ0luZm89QmVuYW5udGVyIEVpZ2Vuc2NoYWZ0c3dlcnQKLVBSRVRhZ0luZm89Vm9yZm9ybWF0aWVydGVyIFRleHQKLVFUYWdJbmZvPUt1cnplcyBJbmxpbmUtWml0YXQKLVNUYWdJbmZvPVplaWd0IFRleHQgaW4gZHVyY2hnZXN0cmljaGVuZXIgRGFyc3RlbGx1bmcgYW4KLVNBTVBUYWdJbmZvPUJlaXNwaWVscHJvZ3JhbW1hdXNnYWJlLCBTa3JpcHRzIHVzdy4sIHdpcmQgaW4gTW9ub3NwYWNlc2NocmlmdCBhbmdlemVpZ3QKLVNDUklQVFRhZ0luZm89U2NyaXB0YW53ZWlzdW5nZW4KLVNFTEVDVFRhZ0luZm89T3B0aW9uc3NlbGVrdG9yCi1TTUFMTFRhZ0luZm89WmVpZ3QgVGV4dCBpbiBrbGVpbmVyIFNjaHJpZnQgYW4KLVNQQU5UYWdJbmZvPUdlbmVyaXNjaGVyIENvbnRhaW5lciwgZGVyIHp1bSBEZWZpbmllcmVuIHZvbiBTcHJhY2hlIG9kZXIgRGFyc3RlbGx1bmcgZlx1MDBmY3IgZGVuIEluaGFsdCB2ZXJ3ZW5kZXQgd2VyZGVuIGthbm4KLVNUUklLRVRhZ0luZm89WmVpZ3QgVGV4dCBpbiBkdXJjaGdlc3RyaWNoZW5lciBEYXJzdGVsbHVuZyBhbgotU1RST05HVGFnSW5mbz1aZWlndCBUZXh0IHN0YXJrIGhlcnZvcmdlaG9iZW4gYW4gKG5vcm1hbGVyd2Vpc2UgZmV0dCkKLVNUWUxFVGFnSW5mbz1EZWZpbmllcnQgZWluZSBEYXJzdGVsbHVuZyBmXHUwMGZjciBkaWUgZW50aGFsdGVuZW4gSW5mb3JtYXRpb25lbgotU1VCVGFnSW5mbz1aZWlndCBaZWljaGVuIHRpZWZnZXN0ZWxsdCBhbgotU1VQVGFnSW5mbz1aZWlndCBaZWljaGVuIGhvY2hnZXN0ZWxsdCBhbgotVEFCTEVUYWdJbmZvPURlZmluaWVydCBlaW5lIFRhYmVsbGUKLVRCT0RZVGFnSW5mbz1IYXVwdHRlaWwgZGVyIFRhYmVsbGUKLVREVGFnSW5mbz1aZWxsZSBpbiBlaW5lciBUYWJlbGxlCi1URVhUQVJFQVRhZ0luZm89TWVocnplaWxpZ2VzIFRleHRmZWxkCi1URk9PVFRhZ0luZm89VGFiZWxsZW5mdVx1MDBkZnplaWxlCi1USFRhZ0luZm89VGFiZWxsZW5cdTAwZmNiZXJzY2hyaWZ0c3plbGxlCi1USEVBRFRhZ0luZm89VGFiZWxsZW5cdTAwZmNiZXJzY2hyaWZ0Ci1USVRMRVRhZ0luZm89RG9rdW1lbnR0aXRlbCwgZGVyIGluIGRlciBUaXRlbGxlaXN0ZSBkZXMgQnJvd3NlcnMgYW5nZXplaWd0IHdpcmQKLVRSVGFnSW5mbz1UYWJlbGxlbnplaWxlCi1UVFRhZ0luZm89WmVpZ3QgVGV4dCBpbiBUZWxldHlwZS1TY2hyaWZ0YXJ0IG9kZXIgTW9ub3NwYWNlc2NocmlmdCBhbgotVVRhZ0luZm89WmVpZ3QgVGV4dCB1bnRlcnN0cmljaGVuIGFuCi1VTFRhZ0luZm89VW5nZW9yZG5ldGUgTGlzdGUKLVZBUlRhZ0luZm89RXhlbXBsYXIgZWluZXIgVmFyaWFibGVuIG9kZXIgZWluZXMgUHJvZ3JhbW1hcmd1bWVudHMKLVdCUlRhZ0luZm89TFx1MDBlNHNzdCBlaW5lbiBaZWlsZW51bWJydWNoIGluIFRhZ3MgPEI+Jmx0O05PQlImZ3Q7PC9CPiB6dS4gV2lyZCBkdXJjaCBXM0MgSFRNTCA0LjAxIG5pY2h0IHVudGVyc3RcdTAwZmN0enQuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWZfZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTY2ZGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFUYWdJbmZvPUVubGFjZSBzaSBlc3RcdTAwZTEgcHJlc2VudGUgZWwgYXRyaWJ1dG8gaHJlZiwgeSBkZXN0aW5vIGRlIHVuIGVubGFjZSBzaSBlc3RcdTAwZTEgcHJlc2VudGUgZWwgYXRyaWJ1dG8gbmFtZQotQUJCUlRhZ0luZm89QWJyZXZpYXR1cmEgKHBvciBlamVtcGxvLCBXV1csIEhUVFApCi1BQ1JPTllNVGFnSW5mbz1BY3JcdTAwZjNuaW1vIChwb3IgZWplbXBsbywgU0NVQkEpCi1BRERSRVNTVGFnSW5mbz1JbmZvcm1hY2lcdTAwZjNuIGRlIGRpcmVjY2lcdTAwZjNuIHBhcmEgZWwgYXV0b3IgZGUgbGEgcFx1MDBlMWdpbmEKLUFQUExFVFRhZ0luZm89QXBwbGV0IEphdmEKLUFSRUFUYWdJbmZvPURlZmluZSB1biBcdTAwZTFyZWEgZGUgbWFwYSBkZSBpbWFnZW4gZGVsIGxhZG8gZGVsIGNsaWVudGUKLUJUYWdJbmZvPVZpc3VhbGl6YSB0ZXh0byBjb250ZW5pZG8gZW4gbmVncml0YQotQkFTRVRhZ0luZm89VVJJIGJhc2UgZGUgbGEgcFx1MDBlMWdpbmEsIHF1ZSBkZWJlIHV0aWxpemFyc2UgYWwgY2FsY3VsYXIgdlx1MDBlZGFzIGRlIGFjY2VzbyByZWxhdGl2YXMKLUJBU0VGT05UVGFnSW5mbz1UYW1hXHUwMGYxbyBkZSBmb250IGJhc2UgZGUgbGEgcFx1MDBlMWdpbmEKLUJET1RhZ0luZm89QWx0ZXJhIHRlbXBvcmFsbWVudGUgbGEgdmlzdWFsaXphY2lcdTAwZjNuIGJpZGlyZWNjaW9uYWwgcHJlZGV0ZXJtaW5hZGEuIFBhcmEgdXRpbGl6YXJsbyBjb24gbGVuZ3VhamVzIGJpZGlyZWNjaW9uYWxlcy4KLUJJR1RhZ0luZm89VmlzdWFsaXphIHRleHRvIGNvbnRlbmlkbyBlbiBmb3JtYSBleHRlbnNhCi1CR1NPVU5EVGFnSW5mbz1EZWZpbmUgdW4gYXJjaGl2byBkZSBzb25pZG8gcGFyYSBsYSBwXHUwMGUxZ2luYS4gTm8gc29wb3J0YWRvIGVuIFczQyBIVE1MIDQuMDEuCi1CTElOS1RhZ0luZm89VmlzdWFsaXphIHRleHRvIHBhcnBhZGVhbnRlLiBObyBzb3BvcnRhZG8gZW4gVzNDIEhUTUwgNC4wMS4KLUJMT0NLUVVPVEVUYWdJbmZvPUNpdGEgbGFyZ2EKLUJPRFlUYWdJbmZvPUN1ZXJwbyBkZWwgZG9jdW1lbnRvLiBDb250aWVuZSB0b2RvcyBsb3MgZWxlbWVudG9zIGRlIGxhIHBcdTAwZTFnaW5hLgotQlJUYWdJbmZvPUZ1ZXJ6YSB1biBzYWx0byBkZSBsXHUwMGVkbmVhCi1CVVRUT05UYWdJbmZvPURlZmluZSB1biBwdWxzYWRvcgotQ0FQVElPTlRhZ0luZm89RGVmaW5lIHVuIHRcdTAwZWR0dWxvIGRlIHRhYmxhCi1DRU5URVJUYWdJbmZvPVZpc3VhbGl6YSB0ZXh0byBjZW50cmFkby4gRXF1aXZhbGVudGUgYSBESVYgY29uIGFsaWduPWNlbnRlci4KLUNJVEVUYWdJbmZvPUNpdGEKLUNPREVUYWdJbmZvPUZyYWdtZW50byBkZSBjXHUwMGYzZGlnbyBkZSBzaXN0ZW1hCi1DT0xUYWdJbmZvPUNvbHVtbmEgZGUgdGFibGEKLUNPTEdST1VQVGFnSW5mbz1HcnVwbyBkZSBjb2x1bW5hcyBkZSB0YWJsYQotRERUYWdJbmZvPURlZmluaWNpXHUwMGYzbiBvIGRlc2NyaXBjaVx1MDBmM24gZGUgdW5hIGxpc3RhIGRlIGRlZmluaWNpb25lcyBvIGRlc2NyaXBjaW9uZXMKLURFTFRhZ0luZm89VmlzdWFsaXphIHRleHRvIHN1cHJpbWlkbwotREZOVGFnSW5mbz1EZWZpbmljaVx1MDBmM24KLURJUlRhZ0luZm89TGlzdGEgZGUgZGlyZWN0b3Jpb3MKLURJVlRhZ0luZm89Q29udGVuZWRvciBnZW5cdTAwZTlyaWNvLCBxdWUgcHVlZGUgdXRpbGl6YXJzZSBwYXJhIGRlZmluaXIgZWwgaWRpb21hIG8gZWwgZXN0aWxvIGRlbCBjb250ZW5pZG8KLURMVGFnSW5mbz1MaXN0YSBkZSBkZWZpbmljaW9uZXMgbyBkZXNjcmlwY2lvbmVzCi1EVFRhZ0luZm89VFx1MDBlOXJtaW5vIG8gdGVtYSBkZSB1bmEgbGlzdGEgZGUgZGVmaW5pY2lvbmVzIG8gZGVzY3JpcGNpb25lcwotRU1UYWdJbmZvPVZpc3VhbGl6YSB0ZXh0byBlbmZhdGl6YWRvIChnZW5lcmFsbWVudGUgZW4gY3Vyc2l2YSkKLUVNQkVEVGFnSW5mbz1EZWZpbmUgdW4gY29uZWN0b3IgaW5jb3Jwb3JhZG8uIE5vIHNvcG9ydGFkbyBlbiBXM0MgSFRNTCA0LjAxLgotRklFTERTRVRUYWdJbmZvPURlZmluZSB1biBncnVwbyBkZSBjb250cm9sIGRlIGZvcm11bGFyaW9zCi1GT05UVGFnSW5mbz1WaXN1YWxpemEgdGV4dG8gZW4gZWwgZm9udCBkYWRvCi1GT1JNVGFnSW5mbz1EZWZpbmUgdW4gZm9ybXVsYXJpbyBpbnRlcmFjdGl2bwotRlJBTUVUYWdJbmZvPURlZmluZSB1biBtYXJjbyBkZW50cm8gZGUgbGEgdmVudGFuYSBhY3R1YWwKLUZSQU1FU0VUVGFnSW5mbz1EZWZpbmUgdW4gY29uanVudG8gZGUgbWFyY29zIHF1ZSBkaXZpZGUgbGEgdmVudGFuYSBlbiBtYXJjb3MKLUgxVGFnSW5mbz1DYWJlY2VyYSBkZSBhbHRvIG5pdmVsCi1IMlRhZ0luZm89Q2FiZWNlcmEgZGUgc2VndW5kbyBuaXZlbAotSDNUYWdJbmZvPUNhYmVjZXJhIGRlIHRlcmNlciBuaXZlbAotSDRUYWdJbmZvPUNhYmVjZXJhIGRlIGN1YXJ0byBuaXZlbAotSDVUYWdJbmZvPUNhYmVjZXJhIGRlIHF1aW50byBuaXZlbAotSDZUYWdJbmZvPUNhYmVjZXJhIGRlIHNleHRvIG5pdmVsCi1IRUFEVGFnSW5mbz1Db250aWVuZSBtZXRhZGF0b3MgZSBpbmZvcm1hY2lcdTAwZjNuIGRlIHRcdTAwZWR0dWxvIGRlIHZlbnRhbmFzIHBhcmEgZWwgZG9jdW1lbnRvCi1IUlRhZ0luZm89UmVnbGEgaG9yaXpvbnRhbAotSFRNTFRhZ0luZm89RWxlbWVudG8gcmFcdTAwZWR6IHBhcmEgZWwgZG9jdW1lbnRvCi1JVGFnSW5mbz1WaXN1YWxpemEgdGV4dG8gZW4gY3Vyc2l2YQotSUZSQU1FVGFnSW5mbz1EZWZpbmUgdW5hIHN1YnZlbnRhbmEgaW5jb3Jwb3JhZGEKLUlNR1RhZ0luZm89VmlzdWFsaXphIGxhIGltYWdlbiBhIGxhIHF1ZSBzZSBoYWNlIHJlZmVyZW5jaWEgZW4gZm9ybWEgZGUgY29udGVuaWRvIGludGVyY2FsYWRvCi1JTlBVVFRhZ0luZm89RGVmaW5lIHVuIGNvbnRyb2wgZGUgZm9ybXVsYXJpbyBwYXJhIGxhIGVudHJhZGEgZGVsIHVzdWFyaW8KLUlOU1RhZ0luZm89RGVmaW5lIHRleHRvIGluc2VydGFkbwotSVNJTkRFWFRhZ0luZm89RGVmaW5lIHVuYSBzb2xpY2l0dWQgZGUgdW5hIHNvbGEgbFx1MDBlZG5lYQotS0JEVGFnSW5mbz1EZWZpbmUgdGV4dG8gcXVlIGVsIHVzdWFyaW8gZGViZSBlc3BlY2lmaWNhcgotTEFCRUxUYWdJbmZvPURlZmluZSBsYSBldGlxdWV0YSBkZSB1biBjYW1wbyBkZSBmb3JtdWxhcmlvCi1MRUdFTkRUYWdJbmZvPURlZmluZSBsYSBldGlxdWV0YSBkZSB1biBjb25qdW50byBkZSBjYW1wb3MgZGUgZm9ybXVsYXJpbwotTElUYWdJbmZvPURlZmluZSB1biBlbGVtZW50byBkZSBsaXN0YSBkZSB1bmEgbGlzdGEKLUxJTktUYWdJbmZvPUVubGFjZSBpbmRlcGVuZGllbnRlIGRlIG1lZGlvcwotTUFQVGFnSW5mbz1EZWZpbmUgdW4gbWFwYSBkZSBpbWFnZW4gZGVsIGxhZG8gZGVsIGNsaWVudGUKLU1BUlFVRUVUYWdJbmZvPVZpc3VhbGl6YSB0ZXh0byBlbiBmb3JtYSBkZXNwbGF6YWJsZS4gTm8gc29wb3J0YWRvIGVuIFczQyBIVE1MIDQuMDEuCi1NRU5VVGFnSW5mbz1EZWZpbmUgdW5hIGxpc3RhIGRlIG1lblx1MDBmYXMKLU1FVEFUYWdJbmZvPURlZmluZSBpbmZvcm1hY2lcdTAwZjNuIGRlIG1ldGFkYXRvcyBwYXJhIGVsIGRvY3VtZW50bwotTk9CUlRhZ0luZm89QWx0ZXJhIHRlbXBvcmFsbWVudGUgZSBpbXBpZGUgbG9zIHNhbHRvcyBkZSBsXHUwMGVkbmVhLiBObyBzb3BvcnRhZG8gZW4gVzNDIEhUTUwgNC4wMS4KLU5PRlJBTUVTVGFnSW5mbz1Qcm9wb3JjaW9uYSBpbmZvcm1hY2lcdTAwZjNuIGRlIHZpc3VhbGl6YWNpXHUwMGYzbiBzaSBlbCBuYXZlZ2Fkb3IgYWN0dWFsIG5vIGRhIHNvcG9ydGUgYSBtYXJjb3MuCi1OT1NDUklQVFRhZ0luZm89UHJvcG9yY2lvbmEgaW5mb3JtYWNpXHUwMGYzbiBkZSB2aXN1YWxpemFjaVx1MDBmM24gc2kgZWwgbmF2ZWdhZG9yIGFjdHVhbCBubyBkYSBzb3BvcnRlIGEgc2NyaXB0cy4KLU9CSkVDVFRhZ0luZm89RGVmaW5lIHVuIG9iamV0byBnZW5cdTAwZTlyaWNvIGluY29ycG9yYWRvCi1PTFRhZ0luZm89TGlzdGEgb3JkZW5hZGEKLU9QVEdST1VQVGFnSW5mbz1HcnVwbyBkZSBvcGNpb25lcwotT1BUSU9OVGFnSW5mbz1PcGNpXHUwMGYzbiBzZWxlY2Npb25hYmxlCi1QVGFnSW5mbz1QXHUwMGUxcnJhZm8KLVBBUkFNVGFnSW5mbz1WYWxvciBkZSBwcm9waWVkYWQgY29uIG5vbWJyZQotUFJFVGFnSW5mbz1UZXh0byBwcmVmb3JtYXRlYWRvCi1RVGFnSW5mbz1DaXRhIGNvcnRhIGluY29ycG9yYWRhCi1TVGFnSW5mbz1WaXN1YWxpemEgdGV4dG8gZW4gZXN0aWxvIHRhY2hhZG8KLVNBTVBUYWdJbmZvPVNhbGlkYSBkZSBwcm9ncmFtYSBkZSBlamVtcGxvLCBzY3JpcHRzLCBldGMuIFNlIHZpc3VhbGl6YSBlbiBmb250IG1vbm9lc3BhY2lvLgotU0NSSVBUVGFnSW5mbz1TZW50ZW5jaWFzIGRlIHNjcmlwdAotU0VMRUNUVGFnSW5mbz1TZWxlY3RvciBkZSBvcGNpb25lcwotU01BTExUYWdJbmZvPVZpc3VhbGl6YSB0ZXh0byBlbiBmb3JtYSByZWR1Y2lkYQotU1BBTlRhZ0luZm89Q29udGVuZWRvciBnZW5cdTAwZTlyaWNvLCBxdWUgcHVlZGUgdXRpbGl6YXJzZSBwYXJhIGRlZmluaXIgZWwgaWRpb21hIG8gZWwgZXN0aWxvIGRlbCBjb250ZW5pZG8KLVNUUklLRVRhZ0luZm89VmlzdWFsaXphIHRleHRvIGVuIGVzdGlsbyB0YWNoYWRvCi1TVFJPTkdUYWdJbmZvPVZpc3VhbGl6YSB0ZXh0byBtdXkgZW5mYXRpemFkbyAoZ2VuZXJhbG1lbnRlIGVuIG5lZ3JpdGEpCi1TVFlMRVRhZ0luZm89RGVmaW5lIHVuIGVzdGlsbyBwYXJhIGxhIGluZm9ybWFjaVx1MDBmM24gcXVlIGNvbnRpZW5lCi1TVUJUYWdJbmZvPVZpc3VhbGl6YXIgY29tbyBzdWJzY3JpcHQKLVNVUFRhZ0luZm89VmlzdWFsaXphciBjb21vIHN1cGVyc2NyaXB0Ci1UQUJMRVRhZ0luZm89RGVmaW5lIHVuYSB0YWJsYQotVEJPRFlUYWdJbmZvPUN1ZXJwbyBkZSBsYSB0YWJsYQotVERUYWdJbmZvPUNhc2lsbGEgZGUgbGEgdGFibGEKLVRFWFRBUkVBVGFnSW5mbz1DYW1wbyBkZSB0ZXh0byBtdWx0aWxcdTAwZWRuZWEKLVRGT09UVGFnSW5mbz1QaWUgZGUgZGUgcFx1MDBlMWdpbmEgZGUgdGFibGEKLVRIVGFnSW5mbz1DYXNpbGxhIGRlIGNhYmVjZXJhIGRlIHRhYmxhCi1USEVBRFRhZ0luZm89Q2FiZWNlcmEgZGUgdGFibGEKLVRJVExFVGFnSW5mbz1UXHUwMGVkdHVsbyBkZWwgZG9jdW1lbnRvLCB2aXN1YWxpemFkbyBlbiBsYSBiYXJyYSBkZSB0XHUwMGVkdHVsbyBkZWwgbmF2ZWdhZG9yCi1UUlRhZ0luZm89RmlsYSBkZSB0YWJsYQotVFRUYWdJbmZvPVZpc3VhbGl6YSB0ZXh0byBlbiBlc3RpbG8gZGUgdGV4dG8gdGVsZXRpcG8gbyBtb25vZXNwYWNpbwotVVRhZ0luZm89VmlzdWFsaXphIHRleHRvIHN1YnJheWFkbwotVUxUYWdJbmZvPUxpc3RhIGRlc29yZGVuYWRhCi1WQVJUYWdJbmZvPUluc3RhbmNpYSBkZSB1bmEgdmFyaWFibGUgbyBhcmd1bWVudG8gZGUgcHJvZ3JhbWEKLVdCUlRhZ0luZm89UGVybWl0ZSB1biBzYWx0byBkZSBsXHUwMGVkbmVhIGRlbnRybyBkZWwgY1x1MDBmM2RpZ28gPEI+Jmx0O05PQlImZ3Q7PC9CPi4gTm8gc29wb3J0YWRvIGVuIFczQyBIVE1MIDQuMDEuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWZfZnIucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODgxN2JiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFUYWdJbmZvPUxpZW4gc2kgbCdhdHRyaWJ1dCAiaHJlZiIgZXN0IGluZGlxdVx1MDBlOS4gQ2libGUgZCd1biBsaWVuIHNpIGwnYXR0cmlidXQgIm5hbWUiIGVzdCBpbmRpcXVcdTAwZTkKLUFCQlJUYWdJbmZvPUFiclx1MDBlOXZpYXRpb24gKHBhciBleGVtcGxlLCBXV1csIEhUVFApCi1BQ1JPTllNVGFnSW5mbz1BY3JvbnltZSAocGFyIGV4ZW1wbGUsIFNDVUJBKQotQUREUkVTU1RhZ0luZm89SW5mb3JtYXRpb25zIHJlbGF0aXZlcyBhdXggYWRyZXNzZXMgZGUgbCdhdXRldXIgZGUgbGEgcGFnZQotQVBQTEVUVGFnSW5mbz1BcHBsZXQgSmF2YQotQVJFQVRhZ0luZm89RFx1MDBlOWZpbml0IGxhIHpvbmUgZCd1bmUgaW1hZ2UgaHlwZXJ0ZXh0ZSBjXHUwMGY0dFx1MDBlOSBjbGllbnQKLUJUYWdJbmZvPUFmZmljaGUgZW4gZ3JhcyBsZSB0ZXh0ZSBpbmRpcXVcdTAwZTkKLUJBU0VUYWdJbmZvPVVSSSBkZSBiYXNlIGRlIGxhIHBhZ2UgXHUwMGUwIHV0aWxpc2VyIGxvcnMgZHUgY2FsY3VsIGRlcyBjaGVtaW5zIHJlbGF0aWZzCi1CQVNFRk9OVFRhZ0luZm89VGFpbGxlIGRlIGJhc2UgZGUgbGEgcG9saWNlIGRhbnMgbGEgcGFnZQotQkRPVGFnSW5mbz1SZW1wbGFjZSBsJ2FmZmljaGFnZSBiaWRpcmVjdGlvbm5lbCBwYXIgZFx1MDBlOWZhdXQuIFMnYXBwbGlxdWUgYXV4IGxhbmd1ZXMgYmlkaXJlY3Rpb25uZWxsZXMKLUJJR1RhZ0luZm89QWZmaWNoZSBsZSB0ZXh0ZSBlbiBncm9zIGNhcmFjdFx1MDBlOHJlcwotQkdTT1VORFRhZ0luZm89RFx1MDBlOWZpbml0IHVuIGZpY2hpZXIgc29uIHBvdXIgbGEgcGFnZS4gUGFzIHByaXMgZW4gY2hhcmdlIHBhciBXM0MgSFRNTCA0LjAuMQotQkxJTktUYWdJbmZvPUFmZmljaGUgdW4gdGV4dGUgcXVpIGNsaWdub3RlLiBQYXMgcHJpcyBlbiBjaGFyZ2UgcGFyIFczQyBIVE1MIDQuMC4xCi1CTE9DS1FVT1RFVGFnSW5mbz1Mb25ndWUgY2l0YXRpb24KLUJPRFlUYWdJbmZvPUNvcnBzIGR1IGRvY3VtZW50LiBJbmNsdXQgdG91dCBsZSBjb250ZW51IGRlIGxhIHBhZ2UKLUJSVGFnSW5mbz1Gb3JjZSB1biByZXRvdXIgXHUwMGUwIGxhIGxpZ25lCi1CVVRUT05UYWdJbmZvPURcdTAwZTlmaW5pdCB1biBib3V0b24gZGUgZm9uY3Rpb24KLUNBUFRJT05UYWdJbmZvPURcdTAwZTlmaW5pdCBsYSBsXHUwMGU5Z2VuZGUgZCd1biB0YWJsZWF1Ci1DRU5URVJUYWdJbmZvPUNlbnRyZSBsZSB0ZXh0ZSBpbmRpcXVcdTAwZTkuIENvcnJlc3BvbmQgXHUwMGUwIERJViBhdmVjIGFsaWduPWNlbnRlcgotQ0lURVRhZ0luZm89Q2l0YXRpb24KLUNPREVUYWdJbmZvPUZyYWdtZW50IGRlIGNvZGUgZGUgbCdvcmRpbmF0ZXVyCi1DT0xUYWdJbmZvPUNvbG9ubmUgZCd1biB0YWJsZWF1Ci1DT0xHUk9VUFRhZ0luZm89R3JvdXBlIGRlIGNvbG9ubmVzIGQndW4gdGFibGVhdQotRERUYWdJbmZvPURcdTAwZTlmaW5pdGlvbiBvdSBkZXNjcmlwdGlvbiBkYW5zIHVuZSBsaXN0ZSBkZSBkXHUwMGU5ZmluaXRpb25zIG91IGRlIGRlc2NyaXB0aW9ucwotREVMVGFnSW5mbz1BZmZpY2hlIGxlIHRleHRlIGNvbW1lIFx1MDBlOXRhbnQgc3VwcHJpbVx1MDBlOQotREZOVGFnSW5mbz1EXHUwMGU5ZmluaXRpb24KLURJUlRhZ0luZm89TGlzdGUgZGUgclx1MDBlOXBlcnRvaXJlcwotRElWVGFnSW5mbz1Db250ZW5ldXIgZ1x1MDBlOW5cdTAwZTlyaXF1ZSBwZXJtZXR0YW50IGRlIGRcdTAwZTlmaW5pciBsYSBsYW5ndWUgb3UgbGUgc3R5bGUgZHUgY29udGVudQotRExUYWdJbmZvPUxpc3RlIGRlIGRcdTAwZTlmaW5pdGlvbnMgb3UgZGUgZGVzY3JpcHRpb25zCi1EVFRhZ0luZm89VGVybWUgb3Ugc3VqZXQgZGFucyB1bmUgbGlzdGUgZGUgZFx1MDBlOWZpbml0aW9ucyBvdSBkZSBkZXNjcmlwdGlvbnMKLUVNVGFnSW5mbz1NZXQgbGUgdGV4dGUgZW4gXHUwMGU5dmlkZW5jZSAoZW4gZ1x1MDBlOW5cdTAwZTlyYWwgZW4gaXRhbGlxdWUpCi1FTUJFRFRhZ0luZm89RFx1MDBlOWZpbml0IHVuIHBsdWctaW4gaW1icmlxdVx1MDBlOS4gUGFzIHByaXMgZW4gY2hhcmdlIHBhciBXM0MgSFRNTCA0LjAuMQotRklFTERTRVRUYWdJbmZvPURcdTAwZTlmaW5pdCB1biBncm91cGUgZGUgY29udHJcdTAwZjRsZSBkdSBmb3JtdWxhaXJlCi1GT05UVGFnSW5mbz1BZmZpY2hlIGxlIHRleHRlIGRhbnMgbGEgcG9saWNlIGluZGlxdVx1MDBlOWUKLUZPUk1UYWdJbmZvPURcdTAwZTlmaW5pdCB1biBmb3JtdWxhaXJlIGludGVyYWN0aWYKLUZSQU1FVGFnSW5mbz1EXHUwMGU5ZmluaXQgdW4gY2FkcmUgZGFucyBsYSBmZW5cdTAwZWF0cmUgZW4gY291cnMKLUZSQU1FU0VUVGFnSW5mbz1EXHUwMGU5ZmluaXQgdW4gZW5zZW1ibGUgZGUgY2FkcmVzIHF1aSBkaXZpc2VudCBsYSBmZW5cdTAwZWF0cmUgZW4gcGx1c2lldXJzIGNhZHJlcwotSDFUYWdJbmZvPVRpdHJlIGRlIG5pdmVhdSBzdXBcdTAwZTlyaWV1cgotSDJUYWdJbmZvPVRpdHJlIGRlIGRldXhpXHUwMGU4bWUgbml2ZWF1Ci1IM1RhZ0luZm89VGl0cmUgZGUgdHJvaXNpXHUwMGU4bWUgbml2ZWF1Ci1INFRhZ0luZm89VGl0cmUgZGUgcXVhdHJpXHUwMGU4bWUgbml2ZWF1Ci1INVRhZ0luZm89VGl0cmUgZGUgY2lucXVpXHUwMGU4bWUgbml2ZWF1Ci1INlRhZ0luZm89VGl0cmUgZGUgc2l4aVx1MDBlOG1lIG5pdmVhdQotSEVBRFRhZ0luZm89Q29udGllbnQgZGVzIGluZm9ybWF0aW9ucyBzdXIgbGVzIG1cdTAwZTl0YWRvbm5cdTAwZTllcyBldCBsZSB0aXRyZSBkZSBsYSBmZW5cdTAwZWF0cmUgZCd1biBkb2N1bWVudAotSFJUYWdJbmZvPVJcdTAwZThnbGUgaG9yaXpvbnRhbGUKLUhUTUxUYWdJbmZvPUVsXHUwMGU5bWVudCByYWNpbmUgZHUgZG9jdW1lbnQKLUlUYWdJbmZvPUFmZmljaGUgbGUgdGV4dGUgZW4gaXRhbGlxdWUKLUlGUkFNRVRhZ0luZm89RFx1MDBlOWZpbml0IHVuZSBzb3VzLWZlblx1MDBlYXRyZSBpbnRcdTAwZTlnclx1MDBlOWUKLUlNR1RhZ0luZm89QWZmaWNoZSBsJ2ltYWdlIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOWUgc291cyBsYSBmb3JtZSBkJ3VuIGNvbnRlbnUgaW1icmlxdVx1MDBlOQotSU5QVVRUYWdJbmZvPURcdTAwZTlmaW5pdCB1biBjb250clx1MDBmNGxlIGRlIGZvcm11bGFpcmUgcG91ciBsZXMgZG9ublx1MDBlOWVzIGVudHJcdTAwZTllcyBwYXIgbCd1dGlsaXNhdGV1cgotSU5TVGFnSW5mbz1EXHUwMGU5ZmluaXQgbGUgdGV4dGUgaW5zXHUwMGU5clx1MDBlOQotSVNJTkRFWFRhZ0luZm89RFx1MDBlOWZpbml0IHVuIG1lc3NhZ2UgZCd1bmUgc2V1bGUgbGlnbmUKLUtCRFRhZ0luZm89RFx1MDBlOWZpbml0IGxlIHRleHRlIHF1ZSBsJ3V0aWxpc2F0ZXVyIGRvaXQgZW50cmVyCi1MQUJFTFRhZ0luZm89RFx1MDBlOWZpbml0IGxlIGxpYmVsbFx1MDBlOSBkJ3VuZSB6b25lIGR1IGZvcm11bGFpcmUKLUxFR0VORFRhZ0luZm89RFx1MDBlOWZpbml0IGxlIGxpYmVsbFx1MDBlOSBkJ3VuIGVuc2VtYmxlIGRlIHpvbmVzIGR1IGZvcm11bGFpcmUKLUxJVGFnSW5mbz1EXHUwMGU5ZmluaXQgdW4gXHUwMGU5bFx1MDBlOW1lbnQgZGFucyB1bmUgbGlzdGUKLUxJTktUYWdJbmZvPUxpZW4gaW5kXHUwMGU5cGVuZGFudCBkJ3VuIHN1cHBvcnQKLU1BUFRhZ0luZm89RFx1MDBlOWZpbml0IHVuZSBpbWFnZSBoeXBlcnRleHRlIGNcdTAwZjR0XHUwMGU5IGNsaWVudAotTUFSUVVFRVRhZ0luZm89QWZmaWNoZSB1biB0ZXh0ZSBxdWkgZFx1MDBlOWZpbGUuIFBhcyBwcmlzIGVuIGNoYXJnZSBwYXIgVzNDIEhUTUwgNC4wLjEKLU1FTlVUYWdJbmZvPURcdTAwZTlmaW5pdCB1bmUgbGlzdGUgZGUgdHlwZSBtZW51Ci1NRVRBVGFnSW5mbz1EXHUwMGU5ZmluaXQgZGVzIGluZm9ybWF0aW9ucyBzdXIgbGVzIG1cdTAwZTl0YWRvbm5cdTAwZTllcyBkdSBkb2N1bWVudAotTk9CUlRhZ0luZm89UmVtcGxhY2UgZXQgZW1wXHUwMGVhY2hlIGxlcyByZXRvdXJzIFx1MDBlMCBsYSBsaWduZS4gUGFzIHByaXMgZW4gY2hhcmdlIHBhciBXM0MgSFRNTCA0LjAuMQotTk9GUkFNRVNUYWdJbmZvPUZvdXJuaXQgbGVzIGluZm9ybWF0aW9ucyBcdTAwZTAgYWZmaWNoZXIgc2kgbGUgbmF2aWdhdGV1ciBlbiBjb3VycyBuZSBwcmVuZCBwYXMgZW4gY2hhcmdlIGxlcyBjYWRyZXMKLU5PU0NSSVBUVGFnSW5mbz1Gb3Vybml0IGxlcyBpbmZvcm1hdGlvbnMgXHUwMGUwIGFmZmljaGVyIHNpIGxlIG5hdmlnYXRldXIgZW4gY291cnMgbmUgcHJlbmQgcGFzIGVuIGNoYXJnZSBsZSBzY3JpcHRhZ2UKLU9CSkVDVFRhZ0luZm89RFx1MDBlOWZpbml0IHVuIG9iamV0IGltYnJpcXVcdTAwZTkgZ1x1MDBlOW5cdTAwZTlyaXF1ZQotT0xUYWdJbmZvPUxpc3RlIG51bVx1MDBlOXJvdFx1MDBlOWUKLU9QVEdST1VQVGFnSW5mbz1Hcm91cGUgZCdvcHRpb25zCi1PUFRJT05UYWdJbmZvPU9wdGlvbiBkaXNwb25pYmxlIHBvdXIgZWZmZWN0dWVyIHVuZSBzXHUwMGU5bGVjdGlvbgotUFRhZ0luZm89UGFyYWdyYXBoZQotUEFSQU1UYWdJbmZvPVZhbGV1ciBkZSBsYSBwcm9wcmlcdTAwZTl0XHUwMGU5IGluZGlxdVx1MDBlOWUKLVBSRVRhZ0luZm89VGV4dGUgcHJcdTAwZTlmb3JtYXRcdTAwZTkKLVFUYWdJbmZvPUNpdGF0aW9uIGNvdXJ0ZSBldCBpbnNcdTAwZTlyXHUwMGU5ZQotU1RhZ0luZm89QWZmaWNoZSB1biB0ZXh0ZSBiYXJyXHUwMGU5Ci1TQU1QVGFnSW5mbz1FeGVtcGxlIGRlIGRvbm5cdTAwZTllcyBnXHUwMGU5blx1MDBlOXJcdTAwZTllcyBwYXIgdW4gcHJvZ3JhbW1lLCBzY3JpcHRzLCBldGMuIEFmZmljaGUgbGVzIGRvbm5cdTAwZTllcyBkYW5zIHVuZSBwb2xpY2UgXHUwMGUwIGNoXHUwMGUyc3NlIGZpeGUKLVNDUklQVFRhZ0luZm89SW5zdHJ1Y3Rpb25zIGR1IHNjcmlwdAotU0VMRUNUVGFnSW5mbz1Gb25jdGlvbiBkZSBzXHUwMGU5bGVjdGlvbiBkJ29wdGlvbnMKLVNNQUxMVGFnSW5mbz1BZmZpY2hlIGxlIHRleHRlIGVuIHBldGl0cyBjYXJhY3RcdTAwZThyZXMKLVNQQU5UYWdJbmZvPUNvbnRlbmV1ciBnXHUwMGU5blx1MDBlOXJpcXVlIHBlcm1ldHRhbnQgZGUgZFx1MDBlOWZpbmlyIGxhIGxhbmd1ZSBvdSBsZSBzdHlsZSBkdSBjb250ZW51Ci1TVFJJS0VUYWdJbmZvPUFmZmljaGUgdW4gdGV4dGUgYmFyclx1MDBlOQotU1RST05HVGFnSW5mbz1NZXQgbGUgdGV4dGUgZW4gXHUwMGU5dmlkZW5jZSAoZW4gZ1x1MDBlOW5cdTAwZTlyYWwgZW4gZ3JhcykKLVNUWUxFVGFnSW5mbz1EXHUwMGU5ZmluaXQgdW4gc3R5bGUgcG91ciBsZXMgaW5mb3JtYXRpb25zIGluZGlxdVx1MDBlOWVzCi1TVUJUYWdJbmZvPUFmZmljaGUgbGVzIGRvbm5cdTAwZTllcyBzb3VzIGxhIGZvcm1lIGQndW4gaW5kaWNlCi1TVVBUYWdJbmZvPUFmZmljaGUgbGVzIGRvbm5cdTAwZTllcyBzb3VzIGxhIGZvcm1lIGQndW4gZXhwb3NhbnQKLVRBQkxFVGFnSW5mbz1EXHUwMGU5ZmluaXQgdW4gdGFibGVhdQotVEJPRFlUYWdJbmZvPUNvcnBzIGQndW4gdGFibGVhdQotVERUYWdJbmZvPUNlbGx1bGUgZCd1biB0YWJsZWF1Ci1URVhUQVJFQVRhZ0luZm89Wm9uZSBkZSB0ZXh0ZSBjb21wb3J0YW50IHBsdXNpZXVycyBsaWduZXMKLVRGT09UVGFnSW5mbz1QaWVkIGRlIHBhZ2UgZCd1biB0YWJsZWF1Ci1USFRhZ0luZm89Q2VsbHVsZSBkJ2VuLXRcdTAwZWF0ZSBkJ3VuIHRhYmxlYXUKLVRIRUFEVGFnSW5mbz1Fbi10XHUwMGVhdGUgZCd1biB0YWJsZWF1Ci1USVRMRVRhZ0luZm89VGl0cmUgZHUgZG9jdW1lbnQgYWZmaWNoXHUwMGU5IGRhbnMgbGEgYmFycmUgZGUgdGl0cmUgZHUgbmF2aWdhdGV1cgotVFJUYWdJbmZvPUxpZ25lIGQndW4gdGFibGVhdQotVFRUYWdJbmZvPUFmZmljaGUgbGUgdGV4dGUgZW4gbW9kZSB0XHUwMGU5bFx1MDBlOXR5cGUgb3UgYXZlYyB1bmUgcG9saWNlIFx1MDBlMCBjaFx1MDBlMnNzZSBmaXhlCi1VVGFnSW5mbz1Tb3VsaWduZSBsZSB0ZXh0ZQotVUxUYWdJbmZvPUxpc3RlIG5vbiBudW1cdTAwZTlyb3RcdTAwZTllCi1WQVJUYWdJbmZvPUluc3RhbmNlIGQndW5lIHZhcmlhYmxlIG91IGQndW4gYXJndW1lbnQgZGUgcHJvZ3JhbW1lCi1XQlJUYWdJbmZvPVBlcm1ldCB1biByZXRvdXIgXHUwMGUwIGxhIGxpZ25lIFx1MDBlMCBsJ2ludFx1MDBlOXJpZXVyIGRlIGxhIGJhbGlzZSA8Qj4mbHQ7Tk9CUiZndDs8L0I+LiBQYXMgcHJpcyBlbiBjaGFyZ2UgcGFyIFczQyBIVE1MIDQuMC4xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWZfaXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTZlMGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFUYWdJbmZvPUNvbGxlZ2FtZW50bywgc2UgXHUwMGU4IHByZXNlbnRlIGwnYXR0cmlidXRvIGhyZWYsIGUgZGVzdGluYXppb25lIHBlciBpbCBjb2xsZWdhbWVudG8sIHNlIFx1MDBlOCBwcmVzZW50ZSBsJ2F0dHJpYnV0byBub21lCi1BQkJSVGFnSW5mbz1BYmJyZXZpYXppb25lIChhZCBlc2VtcGlvLCBXV1csIEhUVFApCi1BQ1JPTllNVGFnSW5mbz1BY3JvbmltbyAoYWQgZXNlbXBpbywgU0NVQkEpCi1BRERSRVNTVGFnSW5mbz1JbmZvcm1hemlvbmkgcmVsYXRpdmUgYWxsJ2luZGlyaXp6byBkZWxsJ2F1dG9yZSBkZWxsYSBwYWdpbmEKLUFQUExFVFRhZ0luZm89QXBwbGV0IEphdmEKLUFSRUFUYWdJbmZvPURlZmluaXNjZSB1bidhcmVhIGRpIG1hcHBlIGltbWFnaW5pIHN1bCBsYXRvIGNsaWVudAotQlRhZ0luZm89VmlzdWFsaXp6YSBpbCB0ZXN0byBjb250ZW51dG8gY29tZSBncmFzc2V0dG8KLUJBU0VUYWdJbmZvPVVSSSBkaSBiYXNlIGRlbGxhIHBhZ2luYSwgZGEgdXRpbGl6emFyZSBkdXJhbnRlIGlsIGNhbGNvbG8gZGVpIHBlcmNvcnNpIHJlbGF0aXZpCi1CQVNFRk9OVFRhZ0luZm89RGltZW5zaW9uZSBkaSBiYXNlIGRlbCB0aXBvIGRpIGNhcmF0dGVyZSBkZWxsYSBwYWdpbmEKLUJET1RhZ0luZm89U29zdGl0dWlzY2UgbGEgdmlzdWFsaXp6YXppb25lIGJpZGlyZXppb25hbGUgcHJlZGVmaW5pdGEuIFBlciBsJ3V0aWxpenpvIGNvbiBsaW5ndWFnZ2kgYmlkaXJlemlvbmFsaS4KLUJJR1RhZ0luZm89VmlzdWFsaXp6YSBpbCB0ZXN0byBjb250ZW51dG8gY29tZSBncmFuZGUKLUJHU09VTkRUYWdJbmZvPURlZmluaXNjZSB1biBmaWxlIGF1ZGlvIGRlbGxhIHBhZ2luYS4gTm9uIHN1cHBvcnRhdG8gZGEgVzNDIEhUTUwgNC4wMS4KLUJMSU5LVGFnSW5mbz1WaXN1YWxpenphIGlsIHRlc3RvIGNvbWUgbGFtcGVnZ2lhbnRlLiBOb24gc3VwcG9ydGF0byBkYSBXM0MgSFRNTCA0LjAxLgotQkxPQ0tRVU9URVRhZ0luZm89THVuZ2EgY2l0YXppb25lCi1CT0RZVGFnSW5mbz1Db3JwbyBkZWwgZG9jdW1lbnRvLiBSYWNjaGl1ZGUgdHV0dG8gaWwgY29udGVudXRvIGRlbGxhIHBhZ2luYS4KLUJSVGFnSW5mbz1EZXRlcm1pbmEgdW4naW50ZXJydXppb25lIGRpIHJpZ2EKLUJVVFRPTlRhZ0luZm89RGVmaW5pc2NlIHVuIHB1bHNhbnRlIGRpIGNvbWFuZG8KLUNBUFRJT05UYWdJbmZvPURlZmluaXNjZSBsYSBkaWRhc2NhbGlhIGRpIHVuYSB0YWJlbGxhCi1DRU5URVJUYWdJbmZvPVZpc3VhbGl6emEgaWwgdGVzdG8gY29udGVudXRvIGNvbWUgY2VudHJhdG8uIEVxdWl2YWxlbnRlIGEgRElWIGNvbiBhbGlnbj1jZW50ZXIuCi1DSVRFVGFnSW5mbz1DaXRhemlvbmUKLUNPREVUYWdJbmZvPUZyYW1tZW50byBkaSBjb2RpY2UgZGVsIGNvbXB1dGVyCi1DT0xUYWdJbmZvPUNvbG9ubmEgZGkgdGFiZWxsYQotQ09MR1JPVVBUYWdJbmZvPUdydXBwbyBkaSBjb2xvbm5lIGRpIHRhYmVsbGEKLUREVGFnSW5mbz1EZWZpbml6aW9uZSBvIGRlc2NyaXppb25lIGluIHVuJ2VsZW5jbyBkaSBkZWZpbml6aW9uaSBvIGRlc2NyaXppb25pCi1ERUxUYWdJbmZvPVZpc3VhbGl6emEgaWwgdGVzdG8gY29tZSBlbGltaW5hdG8KLURGTlRhZ0luZm89RGVmaW5pemlvbmUKLURJUlRhZ0luZm89RWxlbmNvIGRpIGRpcmVjdG9yeQotRElWVGFnSW5mbz1Db250ZW5pdG9yZSBnZW5lcmljbywgY2hlIHB1XHUwMGYyIGVzc2VyZSB1dGlsaXp6YXRvIHBlciBsYSBkZWZpbml6aW9uZSBkZWwgbGluZ3VhZ2dpbyBvIGRlbGxvIHN0aWxlIGRlbCBjb250ZW51dG8KLURMVGFnSW5mbz1FbGVuY28gZGkgZGVmaW5pemlvbmkgbyBkZXNjcml6aW9uaQotRFRUYWdJbmZvPVRlcm1pbmUgbyBhcmdvbWVudG8gaW4gdW4gZWxlbmNvIGRpIGRlZmluaXppb25pIG8gZGVzY3JpemlvbmkKLUVNVGFnSW5mbz1WaXN1YWxpenphIGlsIHRlc3RvIGV2aWRlbnppYXRvIChpbiBnZW5lcmUgaW4gY29yc2l2bykKLUVNQkVEVGFnSW5mbz1EZWZpbmlzY2UgdW4gcGx1Z2luIGluY29ycG9yYXRvLiBOb24gc3VwcG9ydGF0byBkYSBXM0MgSFRNTCA0LjAxLgotRklFTERTRVRUYWdJbmZvPURlZmluaXNjZSB1biBncnVwcG8gZGkgY29udHJvbGxvIG1vZHVsbwotRk9OVFRhZ0luZm89VmlzdWFsaXp6YSBpbCB0ZXN0byBuZWwgdGlwbyBkaSBjYXJhdHRlcmUgZGF0bwotRk9STVRhZ0luZm89RGVmaW5pc2NlIHVuIGZvcm0gaW50ZXJhdHRpdm8KLUZSQU1FVGFnSW5mbz1EZWZpbmlzY2UgdW4gZnJhbWUgYWxsJ2ludGVybmkgZGVsbGEgZmluZXN0cmEgY29ycmVudGUKLUZSQU1FU0VUVGFnSW5mbz1EZWZpbmlzY2UgdW4gZnJhbWVzZXQgY2hlIGRpdmlkZSBsYSBmaW5lc3RyYSBpbiBmcmFtZQotSDFUYWdJbmZvPUludGVzdGF6aW9uZSBkaSBwcmltbyBsaXZlbGxvCi1IMlRhZ0luZm89SW50ZXN0YXppb25lIGRpIHNlY29uZG8gbGl2ZWxsbwotSDNUYWdJbmZvPUludGVzdGF6aW9uZSBkaSB0ZXJ6byBsaXZlbGxvCi1INFRhZ0luZm89SW50ZXN0YXppb25lIGRpIHF1YXJ0byBsaXZlbGxvCi1INVRhZ0luZm89SW50ZXN0YXppb25lIGRpIHF1aW50byBsaXZlbGxvCi1INlRhZ0luZm89SW50ZXN0YXppb25lIGRpIHNlc3RvIGxpdmVsbG8KLUhFQURUYWdJbmZvPUNvbnRpZW5lIG1ldGFkYXRpIGUgaW5mb3JtYXppb25pIHN1bCB0aXRvbG8gZGVsbGEgZmluZXN0cmEgZGVsIGRvY3VtZW50bwotSFJUYWdJbmZvPVJpZ2Egb3JpenpvbnRhbGUKLUhUTUxUYWdJbmZvPUVsZW1lbnRvIHByaW5jaXBhbGUgZGVsIGRvY3VtZW50by4KLUlUYWdJbmZvPVZpc3VhbGl6emEgaWwgdGVzdG8gY29tZSBjb3JzaXZvCi1JRlJBTUVUYWdJbmZvPURlZmluaXNjZSB1bmEgZmluZXN0cmEgc2Vjb25kYXJpYSBpbmNvcnBvcmF0YQotSU1HVGFnSW5mbz1WaXN1YWxpenphIGwnaW1tYWdpbmUgZGkgcmlmZXJpbWVudG8gY29tZSBjb250ZW51dG8gaW5jb3Jwb3JhdG8KLUlOUFVUVGFnSW5mbz1EZWZpbmlzY2UgdW4gY29udHJvbGxvIG1vZHVsbyBwZXIgbCdpbnB1dCBkZWxsJ3V0ZW50ZQotSU5TVGFnSW5mbz1EZWZpbmlzY2UgdW4gdGVzdG8gaW5zZXJpdG8KLUlTSU5ERVhUYWdJbmZvPURlZmluaXNjZSB1biBwcm9tcHQgYSByaWdhIHNpbmdvbGEKLUtCRFRhZ0luZm89RGVmaW5pc2NlIGlsIHRlc3RvIGNoZSBkZXZlIGVzc2VyZSBpbW1lc3NvIGRhbGwndXRlbnRlCi1MQUJFTFRhZ0luZm89RGVmaW5pc2NlIGwnZXRpY2hldHRhIHBlciB1biBjYW1wbyBtb2R1bG8KLUxFR0VORFRhZ0luZm89RGVmaW5pc2NlIGwnZXRpY2hldHRhIHBlciB1biBpbnNpZW1lIGRpIGNhbXBpIG1vZHVsbwotTElUYWdJbmZvPURlZmluaXNjZSB1bmEgdm9jZSBkaSBlbGVuY28gYWxsJ2ludGVybm8gZGkgdW4gZWxlbmNvCi1MSU5LVGFnSW5mbz1Db2xsZWdhbWVudG8gaW5kaXBlbmRlbnRlIGRhbCBzdXBwb3J0bwotTUFQVGFnSW5mbz1EZWZpbmlzY2UgdW5hIG1hcHBhIGltbWFnaW5pIHN1bCBsYXRvIGNsaWVudAotTUFSUVVFRVRhZ0luZm89VmlzdWFsaXp6YSBpbCB0ZXN0byBpbiBzY29ycmltZW50by4gTm9uIHN1cHBvcnRhdG8gZGEgVzNDIEhUTUwgNC4wMS4KLU1FTlVUYWdJbmZvPURlZmluaXNjZSB1biBlbGVuY28gZGkgbWVudQotTUVUQVRhZ0luZm89RGVmaW5pc2NlIGxlIGluZm9ybWF6aW9uaSBzdWkgbWV0YWRhdGkgZGVsIGRvY3VtZW50bwotTk9CUlRhZ0luZm89U29zdGl0dWlzY2UgZWQgZXZpdGEgbGUgaW50ZXJydXppb25pIGRpIHJpZ2EuIE5vbiBzdXBwb3J0YXRvIGRhIFczQyBIVE1MIDQuMDEuCi1OT0ZSQU1FU1RhZ0luZm89Rm9ybmlzY2UgaW5mb3JtYXppb25pIHBlciB2aXN1YWxpenphcmUgc2UgaWwgYnJvd3NlciBjb3JyZW50ZSBub24gc3VwcG9ydGEgZnJhbWUKLU5PU0NSSVBUVGFnSW5mbz1Gb3JuaXNjZSBpbmZvcm1hemlvbmkgcGVyIHZpc3VhbGl6emFyZSBzZSBpbCBicm93c2VyIGNvcnJlbnRlIG5vbiBzdXBwb3J0YSBzY3JpcHQKLU9CSkVDVFRhZ0luZm89RGVmaW5pc2NlIHVuIG9nZ2V0dG8gaW5jb3Jwb3JhdG8gZ2VuZXJpY28KLU9MVGFnSW5mbz1FbGVuY28gb3JkaW5hdG8KLU9QVEdST1VQVGFnSW5mbz1HcnVwcG8gZGkgb3B6aW9uaQotT1BUSU9OVGFnSW5mbz1PcHppb25lIHNlbGV6aW9uYWJpbGUKLVBUYWdJbmZvPVBhcmFncmFmbwotUEFSQU1UYWdJbmZvPVZhbG9yZSBwcm9wcmlldFx1MDBlMCBkZW5vbWluYXRhCi1QUkVUYWdJbmZvPVRlc3RvIHByZWZvcm1hdHRhdG8KLVFUYWdJbmZvPUJyZXZlIGNpdGF6aW9uZSBpbmNvcnBvcmF0YQotU1RhZ0luZm89VmlzdWFsaXp6YSBpbCB0ZXN0byBpbiBzdGlsZSBiYXJyYXRvCi1TQU1QVGFnSW5mbz1PdXRwdXQgZGkgcHJvZ3JhbW1pIGRpIGVzZW1waW8sIHNjcmlwdCBlIGNvc1x1MDBlYyB2aWEuIFZpZW5lIHZpc3VhbGl6emF0byBpbiB1biB0aXBvIGRpIGNhcmF0dGVyZSBtb25vc3BhemlvLgotU0NSSVBUVGFnSW5mbz1Jc3RydXppb25pIGRpIHNjcmlwdAotU0VMRUNUVGFnSW5mbz1TZWxldHRvcmUgZGkgb3B6aW9uaQotU01BTExUYWdJbmZvPVZpc3VhbGl6emEgaWwgdGVzdG8gY29tZSBwaWNjb2xvCi1TUEFOVGFnSW5mbz1Db250ZW5pdG9yZSBnZW5lcmljbywgY2hlIHB1XHUwMGYyIGVzc2VyZSB1dGlsaXp6YXRvIHBlciBsYSBkZWZpbml6aW9uZSBkZWwgbGluZ3VhZ2dpbyBvIGRlbGxvIHN0aWxlIGRlbCBjb250ZW51dG8KLVNUUklLRVRhZ0luZm89VmlzdWFsaXp6YSBpbCB0ZXN0byBpbiBzdGlsZSBiYXJyYXRvCi1TVFJPTkdUYWdJbmZvPVZpc3VhbGl6emEgaWwgdGVzdG8gZXZpZGVuemlhdG8gaW4gbWFuaWVyYSBuZXR0YSAoaW4gZ2VuZXJlIGluIGdyYXNzZXR0bykKLVNUWUxFVGFnSW5mbz1EZWZpbmlzY2UgdW5vIHN0aWxlIHBlciBsZSBpbmZvcm1hemlvbmkgY29udGVudXRlCi1TVUJUYWdJbmZvPVZpc3VhbGl6emEgY29tZSBwZWRpY2UKLVNVUFRhZ0luZm89VmlzdWFsaXp6YSBjb21lIGFwaWNlCi1UQUJMRVRhZ0luZm89RGVmaW5pc2NlIHVuYSB0YWJlbGxhCi1UQk9EWVRhZ0luZm89Q29ycG8gZGVsbGEgdGFiZWxsYQotVERUYWdJbmZvPUNlbGxhIGFsbCdpbnRlcm5vIGRpIHVuYSB0YWJlbGxhCi1URVhUQVJFQVRhZ0luZm89Q2FtcG8gZGkgdGVzdG8gYSBwaVx1MDBmOSByaWdoZQotVEZPT1RUYWdJbmZvPVBpXHUwMGU4IGRpIHBhZ2luYSB0YWJlbGxhCi1USFRhZ0luZm89Q2VsbGEgZGkgaW50ZXN0YXppb25lIGRpIHVuYSB0YWJlbGxhCi1USEVBRFRhZ0luZm89SW50ZXN0YXppb25lIHRhYmVsbGEKLVRJVExFVGFnSW5mbz1UaXRvbG8gZGVsIGRvY3VtZW50bywgdmlzdWFsaXp6YXRvIG5lbGxhIGJhcnJhIGRlbCB0aXRvbG8gZGVsIGJyb3dzZXIKLVRSVGFnSW5mbz1SaWdhIGRpIHRhYmVsbGEKLVRUVGFnSW5mbz1WaXN1YWxpenphIGlsIHRlc3RvIGluIHN0aWxlIHRlc3RvIHRlbGVzY3JpdmVudGUgbyBtb25vc3BhemlvCi1VVGFnSW5mbz1WaXN1YWxpenphIGlsIHRlc3RvIGNvbWUgc290dG9saW5lYXRvCi1VTFRhZ0luZm89RWxlbmNvIG5vbiBvcmRpbmF0bwotVkFSVGFnSW5mbz1Jc3RhbnphIGRpIHVuYSB2YXJpYWJpbGUgbyBkaSB1biBhcmdvbWVudG8gZGVsIHByb2dyYW1tYQotV0JSVGFnSW5mbz1Db25zZW50ZSB1bidpbnRlcnJ1emlvbmUgZGkgcmlnYSBhbGwnaW50ZXJubyBkZWwgdGFnIDxCPiZsdDtOT0JSJmd0OzwvQj4uIE5vbiBzdXBwb3J0YXRvIGRhIFczQyBIVE1MIDQuMDEuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWZfamEucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTk3NDQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFUYWdJbmZvPWhyZWYgXHU1YzVlXHU2MDI3XHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU5XHUzMDhiXHU1ODM0XHU1NDA4XHUzMDZmXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDAxXHUzMDRhXHUzMDg4XHUzMDczIG5hbWUgXHU1YzVlXHU2MDI3XHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU5XHUzMDhiXHU1ODM0XHU1NDA4XHUzMDZmXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDZlXHUzMGJmXHUzMGZjXHUzMGIyXHUzMGMzXHUzMGM4Ci1BQkJSVGFnSW5mbz1cdTc3MDFcdTc1NjVcdTVmNjIgKFx1MzA1Zlx1MzA2OFx1MzA0OFx1MzA3MCBXV1dcdTMwMDFIVFRQIFx1MzA2YVx1MzA2OSkKLUFDUk9OWU1UYWdJbmZvPVx1OTgyZFx1NWI1N1x1OGE5ZSAoXHUzMDVmXHUzMDY4XHUzMDQ4XHUzMDcwIFNDVUJBIFx1MzA2YVx1MzA2OSkKLUFERFJFU1NUYWdJbmZvPVx1MzBkYVx1MzBmY1x1MzBiOFx1NGY1Y1x1NjIxMFx1ODAwNVx1MzA2ZVx1MzBhMlx1MzBjOVx1MzBlY1x1MzBiOVx1NjBjNVx1NTgzMQotQVBQTEVUVGFnSW5mbz1KYXZhIFx1MzBhMlx1MzBkN1x1MzBlY1x1MzBjM1x1MzBjOAotQVJFQVRhZ0luZm89XHUzMGFmXHUzMGU5XHUzMGE0XHUzMGEyXHUzMGYzXHUzMGM4XHUzMGZiXHUzMGI1XHUzMGE0XHUzMGM5XHUzMGZiXHUzMGE0XHUzMGUxXHUzMGZjXHUzMGI4XHUzMGZiXHUzMGRlXHUzMGMzXHUzMGQ3XHUzMGZiXHUzMGE4XHUzMGVhXHUzMGEyXHUzMDkyXHU1YjlhXHU3ZmE5Ci1CVGFnSW5mbz1cdTU0MmJcdTMwN2VcdTMwOGNcdTMwNjZcdTMwNDRcdTMwOGJcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwOTJcdTU5MmFcdTViNTdcdTMwNjdcdTg4NjhcdTc5M2EKLUJBU0VUYWdJbmZvPVx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2ZVx1NTdmYVx1NjcyYyBVUkkgKFx1NzZmOFx1NWJmZVx1MzBkMVx1MzBiOVx1MzA2ZVx1OGEwOFx1N2I5N1x1NjY0Mlx1MzA2Ylx1NGY3Zlx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA4YikKLUJBU0VGT05UVGFnSW5mbz1cdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmVcdTU3ZmFcdTY3MmNcdTMwZDVcdTMwYTlcdTMwZjNcdTMwYzhcdTMwZmJcdTMwYjVcdTMwYTRcdTMwYmEKLUJET1RhZ0luZm89XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDZlXHU1M2NjXHU2NWI5XHU1NDExXHU4ODY4XHU3OTNhXHUzMDkyXHU2MzA3XHU1YjlhXHU1OTA5XHU2NmY0XHUzMDAyIFx1NTNjY1x1NjViOVx1NTQxMVx1OGEwMFx1OGE5ZVx1MzA2OFx1NTE3MVx1MzA2Ylx1NGY3Zlx1NzUyOFx1MzAwMgotQklHVGFnSW5mbz1cdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwOTJcdTMwZTlcdTMwZmNcdTMwYjhcdTMwZmJcdTMwZDVcdTMwYTlcdTMwZjNcdTMwYzhcdTMwNjdcdTg4NjhcdTc5M2EKLUJHU09VTkRUYWdJbmZvPVx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2ZVx1MzBiNVx1MzBhNlx1MzBmM1x1MzBjOVx1MzBmYlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NWI5YVx1N2ZhOVx1MzAwMiBXM0MgSFRNTCA0LjAxIFx1MzA2N1x1MzA2Zlx1OTc1ZVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzAwMgotQkxJTktUYWdJbmZvPVx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA5Mlx1NjYwZVx1NmVjNVx1MzA2N1x1ODg2OFx1NzkzYVx1MzAwMiBXM0MgSFRNTCA0LjAxIFx1MzA2N1x1MzA2Zlx1OTc1ZVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzAwMgotQkxPQ0tRVU9URVRhZ0luZm89XHU5NTc3XHUzMDQ0XHU1ZjE1XHU3NTI4Ci1CT0RZVGFnSW5mbz1cdTY1ODdcdTY2ZjhcdTY3MmNcdTY1ODdcdTMwMDJcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmVcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVcdTUxODVcdTViYjlcdTMwOTJcdTU0MmJcdTMwODBcdTMwMDIKLUJSVGFnSW5mbz1cdTY1MzlcdTg4NGNcdTMwOTJcdTVmMzdcdTUyMzYKLUJVVFRPTlRhZ0luZm89XHUzMGQ3XHUzMGMzXHUzMGI3XHUzMGU1XHUzMGRjXHUzMGJmXHUzMGYzXHUzMDkyXHU1YjlhXHU3ZmE5Ci1DQVBUSU9OVGFnSW5mbz1cdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWJcdTg4NjhcdTk4NGNcdTMwOTJcdTViOWFcdTdmYTkKLUNFTlRFUlRhZ0luZm89XHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHU0ZTJkXHU1OTJlXHUzMDVkXHUzMDhkXHUzMDQ4XHUzMDY3XHU4ODY4XHU3OTNhXHUzMDAyIGFsaWduPWNlbnRlciBcdTMwOTJcdTYzMDFcdTMwNjQgRElWIFx1MzA2Ylx1NzZmOFx1NWY1M1x1MzAwMgotQ0lURVRhZ0luZm89XHU1ZjE1XHU3NTI4Ci1DT0RFVGFnSW5mbz1cdTMwYjNcdTMwZjNcdTMwZDRcdTMwZTVcdTMwZmNcdTMwYmZcdTMwZmNcdTMwZmJcdTMwYjNcdTMwZmNcdTMwYzlcdTMwZmJcdTMwZDVcdTMwZTlcdTMwYjBcdTMwZTFcdTMwZjNcdTMwYzgKLUNPTFRhZ0luZm89XHUzMGM2XHUzMGZjXHUzMGQ2XHUzMGViXHU1MjE3Ci1DT0xHUk9VUFRhZ0luZm89XHUzMGM2XHUzMGZjXHUzMGQ2XHUzMGViXHU1MjE3XHUzMDZlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3Ci1ERFRhZ0luZm89XHU1YjlhXHU3ZmE5XHUzMDdlXHUzMDVmXHUzMDZmXHU4YTE4XHU4ZmYwXHUzMGVhXHUzMGI5XHUzMGM4XHU1MTg1XHUzMDZlXHU1YjlhXHU3ZmE5XHUzMDQyXHUzMDhiXHUzMDQ0XHUzMDZmXHU4YTE4XHU4ZmYwCi1ERUxUYWdJbmZvPVx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA5Mlx1NTI0YVx1OTY2NFx1NmUwOFx1MzA3Zlx1MzA2OFx1MzA1N1x1MzA2Nlx1ODg2OFx1NzkzYQotREZOVGFnSW5mbz1cdTViOWFcdTdmYTkKLURJUlRhZ0luZm89XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGVhXHUzMGI5XHUzMGM4Ci1ESVZUYWdJbmZvPVx1NmM0ZVx1NzUyOFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYyAoXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU4YTAwXHU4YTllXHUzMDdlXHUzMDVmXHUzMDZmXHUzMGI5XHUzMGJmXHUzMGE0XHUzMGViXHUzMDkyXHU1YjlhXHU3ZmE5XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDhiKQotRExUYWdJbmZvPVx1NWI5YVx1N2ZhOVx1MzA3ZVx1MzA1Zlx1MzA2Zlx1OGExOFx1OGZmMFx1MzBlYVx1MzBiOVx1MzBjOAotRFRUYWdJbmZvPVx1NWI5YVx1N2ZhOVx1MzA3ZVx1MzA1Zlx1MzA2Zlx1OGExOFx1OGZmMFx1MzBlYVx1MzBiOVx1MzBjOFx1NTE4NVx1MzA2ZVx1NzUyOFx1OGE5ZVx1MzA3ZVx1MzA1Zlx1MzA2Zlx1MzBiNVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOAotRU1UYWdJbmZvPVx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA5Mlx1NWYzN1x1OGFiZlx1ODg2OFx1NzkzYSAoXHU0ZTAwXHU4MjJjXHU3Njg0XHUzMDZiXHUzMDZmXHUzMGE0XHUzMGJmXHUzMGVhXHUzMGMzXHUzMGFmXHU4ODY4XHU3OTNhKQotRU1CRURUYWdJbmZvPVx1N2Q0NFx1MzA3Zlx1OGZiY1x1MzA3Zlx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzA5Mlx1NWI5YVx1N2ZhOVx1MzAwMiBXM0MgSFRNTCA0LjAxIFx1MzA2N1x1MzA2Zlx1OTc1ZVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzAwMgotRklFTERTRVRUYWdJbmZvPVx1NjZmOFx1NWYwZlx1NTIzNlx1NWZhMVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA5Mlx1NWI5YVx1N2ZhOQotRk9OVFRhZ0luZm89XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDZlXHUzMGQ1XHUzMGE5XHUzMGYzXHUzMGM4XHUzMDY3XHU4ODY4XHU3OTNhCi1GT1JNVGFnSW5mbz1cdTViZmVcdThhNzFcdTVmMGZcdTY2ZjhcdTVmMGZcdTMwOTJcdTViOWFcdTdmYTkKLUZSQU1FVGFnSW5mbz1cdTczZmVcdTg4NGNcdTMwYTZcdTMwYTNcdTMwZjNcdTMwYzlcdTMwYTZcdTUxODVcdTMwNmVcdTMwZDVcdTMwZWNcdTMwZmNcdTMwZTBcdTMwOTJcdTViOWFcdTdmYTkKLUZSQU1FU0VUVGFnSW5mbz1cdTMwYTZcdTMwYTNcdTMwZjNcdTMwYzlcdTMwYTZcdTMwOTJcdTUyMDZcdTUyNzJcdTMwNTdcdTMwNjZcdTMwZDVcdTMwZWNcdTMwZmNcdTMwZTBcdTMwNmJcdTMwNTlcdTMwOGJcdTMwZDVcdTMwZWNcdTMwZmNcdTMwZTBcdTMwZmJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwOTJcdTViOWFcdTdmYTkKLUgxVGFnSW5mbz1cdTMwYzhcdTMwYzNcdTMwZDdcdTMwZWNcdTMwZDlcdTMwZWJcdTg5OGJcdTUxZmFcdTMwNTcKLUgyVGFnSW5mbz0yIFx1NmIyMVx1MzBlY1x1MzBkOVx1MzBlYlx1ODk4Ylx1NTFmYVx1MzA1NwotSDNUYWdJbmZvPTMgXHU2YjIxXHUzMGVjXHUzMGQ5XHUzMGViXHU4OThiXHU1MWZhXHUzMDU3Ci1INFRhZ0luZm89NCBcdTZiMjFcdTMwZWNcdTMwZDlcdTMwZWJcdTg5OGJcdTUxZmFcdTMwNTcKLUg1VGFnSW5mbz01IFx1NmIyMVx1MzBlY1x1MzBkOVx1MzBlYlx1ODk4Ylx1NTFmYVx1MzA1NwotSDZUYWdJbmZvPTYgXHU2YjIxXHUzMGVjXHUzMGQ5XHUzMGViXHU4OThiXHU1MWZhXHUzMDU3Ci1IRUFEVGFnSW5mbz1cdTY1ODdcdTY2ZjhcdTMwNmVcdTMwZTFcdTMwYmZcdTMwYzdcdTMwZmNcdTMwYmZcdTMwNjhcdTMwYTZcdTMwYTNcdTMwZjNcdTMwYzlcdTMwYTZcdTMwZmJcdTMwYmZcdTMwYTRcdTMwYzhcdTMwZWJcdTMwNmVcdTYwYzVcdTU4MzFcdTMwOTJcdTU0MmJcdTMwODAKLUhSVGFnSW5mbz1cdTZjMzRcdTVlNzNcdTMwNTFcdTMwNDRcdTdkZGEKLUhUTUxUYWdJbmZvPVx1NjU4N1x1NjZmOFx1MzA2ZVx1MzBlYlx1MzBmY1x1MzBjOFx1MzBmYlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOAotSVRhZ0luZm89XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHUzMGE0XHUzMGJmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDY3XHU4ODY4XHU3OTNhCi1JRlJBTUVUYWdJbmZvPVx1MzBhNFx1MzBmM1x1MzBlOVx1MzBhNFx1MzBmM1x1MzBmYlx1MzBiNVx1MzBkNlx1MzBhNlx1MzBhM1x1MzBmM1x1MzBjOVx1MzBhNlx1MzA5Mlx1NWI5YVx1N2ZhOQotSU1HVGFnSW5mbz1cdTdkNDRcdTMwN2ZcdThmYmNcdTMwN2ZcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNjhcdTMwNTdcdTMwNjZcdTUzYzJcdTcxNjdcdTMwYTRcdTMwZTFcdTMwZmNcdTMwYjhcdTMwOTJcdTg4NjhcdTc5M2EKLUlOUFVUVGFnSW5mbz1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZmNcdTUxNjVcdTUyOWJcdTc1MjhcdTMwNmVcdTY2ZjhcdTVmMGZcdTUyMzZcdTVmYTFcdTMwOTJcdTViOWFcdTdmYTkKLUlOU1RhZ0luZm89XHU2MzNmXHU1MTY1XHUzMDU1XHUzMDhjXHUzMDhiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHU1YjlhXHU3ZmE5Ci1JU0lOREVYVGFnSW5mbz1cdTUzNThcdTRlMDBcdTg4NGNcdTMwZDdcdTMwZWRcdTMwZjNcdTMwZDdcdTMwYzhcdTMwOTJcdTViOWFcdTdmYTkKLUtCRFRhZ0luZm89XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGZjXHUzMDRjXHU1MTY1XHU1MjliXHUzMDU5XHUzMDhiXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHU1YjlhXHU3ZmE5Ci1MQUJFTFRhZ0luZm89XHU2NmY4XHU1ZjBmXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGViXHUzMGM5XHUzMDZlXHUzMGU5XHUzMGQ5XHUzMGViXHUzMDkyXHU1YjlhXHU3ZmE5Ci1MRUdFTkRUYWdJbmZvPVx1NjZmOFx1NWYwZlx1MzBkNVx1MzBhM1x1MzBmY1x1MzBlYlx1MzBjOVx1MzA2ZVx1MzBiYlx1MzBjM1x1MzBjOFx1MzA2ZVx1MzBlOVx1MzBkOVx1MzBlYlx1MzA5Mlx1NWI5YVx1N2ZhOQotTElUYWdJbmZvPVx1MzBlYVx1MzBiOVx1MzBjOFx1NTE4NVx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjOFx1OTgwNVx1NzZlZVx1MzA5Mlx1NWI5YVx1N2ZhOQotTElOS1RhZ0luZm89XHUzMGUxXHUzMGM3XHUzMGEzXHUzMGEyXHU5NzVlXHU0ZjlkXHU1YjU4XHUzMDZlXHUzMGVhXHUzMGYzXHUzMGFmCi1NQVBUYWdJbmZvPVx1MzBhZlx1MzBlOVx1MzBhNFx1MzBhMlx1MzBmM1x1MzBjOFx1MzBmYlx1MzBiNVx1MzBhNFx1MzBjOVx1MzA2ZVx1MzBhNFx1MzBlMVx1MzBmY1x1MzBiOFx1MzBmYlx1MzBkZVx1MzBjM1x1MzBkN1x1MzA5Mlx1NWI5YVx1N2ZhOQotTUFSUVVFRVRhZ0luZm89XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHUzMGI5XHUzMGFmXHUzMGVkXHUzMGZjXHUzMGViXHU4ODY4XHU3OTNhXHUzMDAyIFczQyBIVE1MIDQuMDEgXHUzMDY3XHUzMDZmXHU5NzVlXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDAyCi1NRU5VVGFnSW5mbz1cdTMwZTFcdTMwY2JcdTMwZTVcdTMwZmNcdTMwZmJcdTMwZWFcdTMwYjlcdTMwYzhcdTMwOTJcdTViOWFcdTdmYTkKLU1FVEFUYWdJbmZvPVx1NjU4N1x1NjZmOFx1MzA2ZVx1MzBlMVx1MzBiZlx1MzBjN1x1MzBmY1x1MzBiZlx1NjBjNVx1NTgzMVx1MzA5Mlx1NWI5YVx1N2ZhOQotTk9CUlRhZ0luZm89XHU2NTM5XHU4ODRjXHUzMDkyXHU2MzA3XHU1YjlhXHU1OTA5XHU2NmY0XHUzMDRhXHUzMDg4XHUzMDczXHU5NjMyXHU2YjYyXHUzMDAyIFczQyBIVE1MIDQuMDEgXHUzMDY3XHUzMDZmXHU5NzVlXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDAyCi1OT0ZSQU1FU1RhZ0luZm89XHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGI2XHUzMGZjXHUzMDRjXHUzMGQ1XHUzMGVjXHUzMGZjXHUzMGUwXHUzMDkyXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDZhXHUzMDQ0XHU1ODM0XHU1NDA4XHUzMDZiXHU4ODY4XHU3OTNhXHUzMDU5XHUzMDhiXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliCi1OT1NDUklQVFRhZ0luZm89XHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGI2XHUzMGZjXHUzMDRjXHUzMGI5XHUzMGFmXHUzMGVhXHUzMGQ3XHUzMGM4XHUzMDkyXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDZhXHUzMDQ0XHU1ODM0XHU1NDA4XHUzMDZiXHU4ODY4XHU3OTNhXHUzMDU5XHUzMDhiXHU2MGM1XHU1ODMxXHUzMDkyXHU2M2QwXHU0ZjliCi1PQkpFQ1RUYWdJbmZvPVx1NmM0ZVx1NzUyOFx1N2Q0NFx1MzA3Zlx1OGZiY1x1MzA3Zlx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOFx1MzA5Mlx1NWI5YVx1N2ZhOQotT0xUYWdJbmZvPVx1OTgwNlx1NWU4Zlx1NGVkOFx1MzA0ZFx1MzBlYVx1MzBiOVx1MzBjOAotT1BUR1JPVVBUYWdJbmZvPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBmYlx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkNwotT1BUSU9OVGFnSW5mbz1cdTkwNzhcdTYyOWVcdTUzZWZcdTgwZmRcdTk4MDVcdTc2ZWUKLVBUYWdJbmZvPVx1NmJiNVx1ODQzZAotUEFSQU1UYWdJbmZvPVx1NTQwZFx1NTI0ZFx1NGVkOFx1MzA0ZFx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1NTAyNAotUFJFVGFnSW5mbz1cdTMwZDlcdTMwYmZcdTY2ZjhcdTMwNGRcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzgKLVFUYWdJbmZvPVx1NzdlZFx1MzA0NFx1MzBhNFx1MzBmM1x1MzBlOVx1MzBhNFx1MzBmM1x1NWYxNVx1NzUyOAotU1RhZ0luZm89XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHU2MjUzXHUzMDYxXHU2ZDg4XHUzMDU3XHU3ZGRhXHUzMGI5XHUzMGJmXHUzMGE0XHUzMGViXHUzMDY3XHU4ODY4XHU3OTNhCi1TQU1QVGFnSW5mbz1cdTMwYjVcdTMwZjNcdTMwZDdcdTMwZWJcdTMwZmJcdTMwZDdcdTMwZWRcdTMwYjBcdTMwZTlcdTMwZTBcdTMwNmVcdTUxZmFcdTUyOWJcdTMwMDFcdTMwYjlcdTMwYWZcdTMwZWFcdTMwZDdcdTMwYzhcdTMwMDFcdTMwNWRcdTMwNmVcdTRlZDZcdTMwMDIgXHUzMGUyXHUzMGNlXHUzMGI5XHUzMGRhXHUzMGZjXHUzMGI5XHUzMGZiXHUzMGQ1XHUzMGE5XHUzMGYzXHUzMGM4XHUzMDY3XHU4ODY4XHU3OTNhXHUzMDAyCi1TQ1JJUFRUYWdJbmZvPVx1MzBiOVx1MzBhZlx1MzBlYVx1MzBkN1x1MzBjOFx1MzBmYlx1MzBiOVx1MzBjNlx1MzBmY1x1MzBjOFx1MzBlMVx1MzBmM1x1MzBjOAotU0VMRUNUVGFnSW5mbz1cdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwZmJcdTMwYmJcdTMwZWNcdTMwYWZcdTMwYmZcdTMwZmMKLVNNQUxMVGFnSW5mbz1cdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwOTJcdTMwYjlcdTMwZTJcdTMwZmNcdTMwZWJcdTMwZmJcdTMwZDVcdTMwYTlcdTMwZjNcdTMwYzhcdTMwNjdcdTg4NjhcdTc5M2EKLVNQQU5UYWdJbmZvPVx1NmM0ZVx1NzUyOFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYyAoXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXHU4YTAwXHU4YTllXHUzMDdlXHUzMDVmXHUzMDZmXHUzMGI5XHUzMGJmXHUzMGE0XHUzMGViXHUzMDkyXHU1YjlhXHU3ZmE5XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDhiKQotU1RSSUtFVGFnSW5mbz1cdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwOTJcdTYyNTNcdTMwNjFcdTZkODhcdTMwNTdcdTdkZGFcdTMwYjlcdTMwYmZcdTMwYTRcdTMwZWJcdTMwNjdcdTg4NjhcdTc5M2EKLVNUUk9OR1RhZ0luZm89XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHU1ZjM3XHU4YWJmXHU4ODY4XHU3OTNhIChcdTRlMDBcdTgyMmNcdTc2ODRcdTMwNmJcdTMwNmZcdTU5MmFcdTViNTdcdTg4NjhcdTc5M2EpCi1TVFlMRVRhZ0luZm89XHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHU2MGM1XHU1ODMxXHUzMDZlXHUzMGI5XHUzMGJmXHUzMGE0XHUzMGViXHUzMDkyXHU1YjlhXHU3ZmE5Ci1TVUJUYWdJbmZvPVx1NGUwYlx1NGVkOFx1MzA0ZFx1MzA2OFx1MzA1N1x1MzA2Nlx1ODg2OFx1NzkzYQotU1VQVGFnSW5mbz1cdTRlMGFcdTRlZDhcdTMwNGRcdTMwNjhcdTMwNTdcdTMwNjZcdTg4NjhcdTc5M2EKLVRBQkxFVGFnSW5mbz1cdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWJcdTMwOTJcdTViOWFcdTdmYTkKLVRCT0RZVGFnSW5mbz1cdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWJcdTMwNmVcdTY3MmNcdTY1ODcKLVREVGFnSW5mbz1cdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWJcdTUxODVcdTMwNmVcdTMwYmJcdTMwZWIKLVRFWFRBUkVBVGFnSW5mbz1cdTg5MDdcdTY1NzBcdTg4NGNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZmJcdTMwZDVcdTMwYTNcdTMwZmNcdTMwZWJcdTMwYzkKLVRGT09UVGFnSW5mbz1cdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWJcdTMwZmJcdTMwZDVcdTMwYzNcdTMwYmZcdTMwZmMKLVRIVGFnSW5mbz1cdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWJcdTMwZmJcdTMwZDhcdTMwYzNcdTMwYzBcdTMwZmNcdTMwZmJcdTMwYmJcdTMwZWIKLVRIRUFEVGFnSW5mbz1cdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWJcdTMwZmJcdTMwZDhcdTMwYzNcdTMwYzBcdTMwZmMKLVRJVExFVGFnSW5mbz1cdTY1ODdcdTY2ZjhcdTMwYmZcdTMwYTRcdTMwYzhcdTMwZWIgKFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmY1x1MzA2ZVx1MzBiZlx1MzBhNFx1MzBjOFx1MzBlYlx1MzBmYlx1MzBkMFx1MzBmY1x1MzA2Ylx1ODg2OFx1NzkzYVx1MzA1NVx1MzA4Y1x1MzA4YikKLVRSVGFnSW5mbz1cdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWJcdTg4NGMKLVRUVGFnSW5mbz1cdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwOTJcdTMwYzZcdTMwZWNcdTMwYmZcdTMwYTRcdTMwZDdcdTMwN2VcdTMwNWZcdTMwNmZcdTMwZTJcdTMwY2VcdTMwYjlcdTMwZGFcdTMwZmNcdTMwYjlcdTMwZmJcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZmJcdTMwYjlcdTMwYmZcdTMwYTRcdTMwZWJcdTMwNjdcdTg4NjhcdTc5M2EKLVVUYWdJbmZvPVx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA5Mlx1NGUwYlx1N2RkYVx1NGVkOFx1MzA0ZFx1MzA2N1x1ODg2OFx1NzkzYQotVUxUYWdJbmZvPVx1OTgwNlx1NGUwZFx1NTQwY1x1MzBlYVx1MzBiOVx1MzBjOAotVkFSVGFnSW5mbz1cdTU5MDlcdTY1NzBcdTMwN2VcdTMwNWZcdTMwNmZcdTMwZDdcdTMwZWRcdTMwYjBcdTMwZTlcdTMwZTBcdTVmMTVcdTMwNGRcdTY1NzBcdTMwNmVcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjkKLVdCUlRhZ0luZm89PEI+Jmx0O05PQlImZ3Q7PC9CPiBcdTMwYmZcdTMwYjBcdTUxODVcdTMwNmVcdTY1MzlcdTg4NGNcdTMwOTJcdThhOGRcdTMwODFcdTMwOGJcdTMwMDIgVzNDIEhUTUwgNC4wMSBcdTMwNjdcdTMwNmZcdTk3NWVcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdTMwMDIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl9rby5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MzM2MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQVRhZ0luZm89aHJlZiBcdWMxOGRcdWMxMzFcdWM3NzQgXHVjNzg4XHViMjk0IFx1YWNiZFx1YzZiMCwgXHViOWMxXHVkMDZjIFx1YWRmOFx1YjlhY1x1YWNlMCBcdWM3NzRcdWI5ODQgXHVjMThkXHVjMTMxXHVjNzc0IFx1Yzc4OFx1YjI5NCBcdWFjYmRcdWM2YjAsIFx1YjljMVx1ZDA2Y1x1Yzc1OCBcdWIzMDBcdWMwYzEKLUFCQlJUYWdJbmZvPVx1YzU3ZFx1YzViNChcdWM2MDg6IFdXVywgSFRUUCkKLUFDUk9OWU1UYWdJbmZvPVx1YmEzOFx1YjlhY1x1YWUwMFx1Yzc5MChcdWM2MDg6IFNDVUJBKQotQUREUkVTU1RhZ0luZm89XHVkMzk4XHVjNzc0XHVjOWMwIFx1Yzc5MVx1YzEzMVx1Yzc5MFx1Yzc1OCBcdWM4ZmNcdWMxOGMgXHVjODE1XHViY2Y0Ci1BUFBMRVRUYWdJbmZvPUphdmEgXHVjNTYwXHVkNTBjXHViOWJmCi1BUkVBVGFnSW5mbz1cdWQwNzRcdWI3N2NcdWM3NzRcdWM1YjhcdWQyYjhcdWNlMjEgXHVjNzc0XHViYmY4XHVjOWMwIFx1YjlmNSBcdWM2MDFcdWM1ZWRcdWM3NDQgXHVjODE1XHVjNzU4XHVkNTY5XHViMmM4XHViMmU0LgotQlRhZ0luZm89XHVkM2VjXHVkNTY4XHViNDFjIFx1ZDE0ZFx1YzJhNFx1ZDJiOFx1Yjk3YyBcdWFkNzVcdWM3NDBcdWNjYjRcdWI4NWMgXHVkNDVjXHVjMmRjXHVkNTY5XHViMmM4XHViMmU0LgotQkFTRVRhZ0luZm89XHVkMzk4XHVjNzc0XHVjOWMwXHVjNzU4IFx1YWUzMFx1YzkwMCBVUkkoXHVjMGMxXHViMzAwIFx1YWNiZFx1Yjg1YyBcdWFjYzRcdWMwYjAgXHVjMmRjIFx1YzBhY1x1YzZhOVx1YjQyOCkKLUJBU0VGT05UVGFnSW5mbz1cdWQzOThcdWM3NzRcdWM5YzBcdWM3NTggXHVhZTMwXHVjOTAwIFx1YWUwMFx1YWYzNCBcdWQwNmNcdWFlMzAKLUJET1RhZ0luZm89XHVhZTMwXHViY2Y4IFx1YzU5MVx1YmMyOVx1ZDVhNSBcdWQ0NWNcdWMyZGNcdWI5N2MgXHViMzAwXHVjY2I0XHVkNTY5XHViMmM4XHViMmU0LiBcdWM1OTFcdWJjMjlcdWQ1YTUgXHVjNWI4XHVjNWI0XHVjNWQwIFx1YzBhY1x1YzZhOVx1ZDU2OVx1YjJjOFx1YjJlNC4KLUJJR1RhZ0luZm89XHVkM2VjXHVkNTY4XHViNDFjIFx1ZDE0ZFx1YzJhNFx1ZDJiOFx1Yjk3YyBcdWQwNmNcdWFjOGMgXHVkNDVjXHVjMmRjXHVkNTY5XHViMmM4XHViMmU0LgotQkdTT1VORFRhZ0luZm89XHVkMzk4XHVjNzc0XHVjOWMwXHVjNzU4IFx1YzBhY1x1YzZiNFx1YjRkYyBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjODE1XHVjNzU4XHVkNTY5XHViMmM4XHViMmU0LiBXM0MgSFRNTCA0LjAxXHVjNWQwXHVjMTFjXHViMjk0IFx1YzljMFx1YzZkMFx1YjQxOFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuCi1CTElOS1RhZ0luZm89XHVkMTRkXHVjMmE0XHVkMmI4XHViOTdjIFx1YWU1Y1x1YmMxNVx1Yzc4NFx1YzczY1x1Yjg1YyBcdWQ0NWNcdWMyZGNcdWQ1NjlcdWIyYzhcdWIyZTQuIFczQyBIVE1MIDQuMDFcdWM1ZDBcdWMxMWNcdWIyOTQgXHVjOWMwXHVjNmQwXHViNDE4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4KLUJMT0NLUVVPVEVUYWdJbmZvPVx1YWUzNCBcdWM3NzhcdWM2YTlcdWJiMzgKLUJPRFlUYWdJbmZvPVx1YmIzOFx1YzExYyBcdWJjZjhcdWJiMzguIFx1ZDM5OFx1Yzc3NFx1YzljMFx1Yzc1OCBcdWJhYThcdWI0ZTAgXHVjZWU4XHVkMTUwXHVjZTIwXHViOTdjIFx1ZDNlY1x1ZDU2OFx1ZDU2OVx1YjJjOFx1YjJlNC4KLUJSVGFnSW5mbz1cdWQ1ODkgXHViYzE0XHVhZmI4XHVhZTMwXHViOTdjIFx1YWMxNVx1YzgxYyBcdWMyZTRcdWQ1ODlcdWQ1NjlcdWIyYzhcdWIyZTQuCi1CVVRUT05UYWdJbmZvPVx1YjIwNFx1Yjk4NCBcdWIyZThcdWNkOTRcdWI5N2MgXHVjODE1XHVjNzU4XHVkNTY5XHViMmM4XHViMmU0LgotQ0FQVElPTlRhZ0luZm89XHVkMTRjXHVjNzc0XHViZTE0IFx1Y2VhMVx1YzE1OFx1Yzc0NCBcdWM4MTVcdWM3NThcdWQ1NjlcdWIyYzhcdWIyZTQuCi1DRU5URVJUYWdJbmZvPVx1ZDNlY1x1ZDU2OFx1YjQxYyBcdWQxNGRcdWMyYTRcdWQyYjhcdWFjMDAgXHVhYzAwXHVjNmI0XHViMzcwXHViODVjIFx1YzYyNFx1YjNjNFx1Yjg1ZCBcdWQ0NWNcdWMyZGNcdWQ1NjlcdWIyYzhcdWIyZTQuIGFsaWduPWNlbnRlclx1Yjk3YyBcdWMxMjRcdWM4MTVcdWQ1NWMgRElWIFx1ZDBkY1x1YWRmOFx1YzY0MCBcdWIzZDlcdWM3N2NcdWQ1NjlcdWIyYzhcdWIyZTQuCi1DSVRFVGFnSW5mbz1cdWM3NzhcdWM2YTlcdWJiMzgKLUNPREVUYWdJbmZvPVx1Y2VmNFx1ZDRlOFx1ZDEzMCBcdWNmNTRcdWI0ZGMgXHViMmU4XHVkM2I4Ci1DT0xUYWdJbmZvPVx1ZDE0Y1x1Yzc3NFx1YmUxNCBcdWM1ZjQKLUNPTEdST1VQVGFnSW5mbz1cdWQxNGNcdWM3NzRcdWJlMTQgXHVjNWY0XHVjNzU4IFx1YWRmOFx1YjhmOQotRERUYWdJbmZvPVx1YzgxNVx1Yzc1OCBcdWI2MTBcdWIyOTQgXHVjMTI0XHViYTg1IFx1YmFhOVx1Yjg1ZFx1Yzc1OCBcdWMxMjRcdWJhODUgXHViNjEwXHViMjk0IFx1YzgxNVx1Yzc1OAotREVMVGFnSW5mbz1cdWQxNGRcdWMyYTRcdWQyYjhcdWI5N2MgXHVjMGFkXHVjODFjIFx1ZDQ1Y1x1YzJkY1x1ZDU2OVx1YjJjOFx1YjJlNC4KLURGTlRhZ0luZm89XHVjODE1XHVjNzU4Ci1ESVJUYWdJbmZvPVx1YjUxNFx1YjgwOVx1ZDFhMFx1YjlhYyBcdWJhYTlcdWI4NWQKLURJVlRhZ0luZm89XHVjZWU4XHVkMTUwXHVjZTIwXHVjNzU4IFx1YzJhNFx1ZDBjMFx1Yzc3YyBcdWI2MTBcdWIyOTQgXHVjNWI4XHVjNWI0XHViOTdjIFx1YzgxNVx1Yzc1OFx1ZDU1OFx1YjI5NCBcdWIzNzAgXHVjMGFjXHVjNmE5IFx1YWMwMFx1YjJhNVx1ZDU1YyBcdWM3N2NcdWJjMTggXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4Ci1ETFRhZ0luZm89XHVjODE1XHVjNzU4IFx1YjYxMFx1YjI5NCBcdWMxMjRcdWJhODUgXHViYWE5XHViODVkCi1EVFRhZ0luZm89XHVjODE1XHVjNzU4IFx1YjYxMFx1YjI5NCBcdWMxMjRcdWJhODUgXHViYWE5XHViODVkXHVjNzU4IFx1YzZhOVx1YzViNCBcdWI2MTBcdWIyOTQgXHVjOGZjXHVjODFjCi1FTVRhZ0luZm89XHVkMTRkXHVjMmE0XHVkMmI4XHViOTdjIFx1YWMxNVx1Yzg3MFx1ZDQ1Y1x1YzJkY1x1ZDU2OVx1YjJjOFx1YjJlNChcdWM3N2NcdWJjMThcdWM4MDFcdWM3M2NcdWI4NWMgXHVhZTMwXHVjNmI4XHVjNzg0XHVjY2I0KS4KLUVNQkVEVGFnSW5mbz1cdWM3ODRcdWJjYTBcdWI1MTRcdWI0ZGMgXHVkNTBjXHViN2VjXHVhZGY4XHVjNzc4XHVjNzQ0IFx1YzgxNVx1Yzc1OFx1ZDU2OVx1YjJjOFx1YjJlNC4gVzNDIEhUTUwgNC4wMVx1YzVkMFx1YzExY1x1YjI5NCBcdWM5YzBcdWM2ZDBcdWI0MThcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LgotRklFTERTRVRUYWdJbmZvPVx1YzU5MVx1YzJkZCBcdWM4MWNcdWM1YjQgXHVhZGY4XHViOGY5IFx1YzgxNVx1Yzc1OAotRk9OVFRhZ0luZm89XHVkMTRkXHVjMmE0XHVkMmI4XHViOTdjIFx1YzljMFx1YzgxNVx1YjQxYyBcdWFlMDBcdWFmMzRcdWI4NWMgXHVkNDVjXHVjMmRjXHVkNTY5XHViMmM4XHViMmU0LgotRk9STVRhZ0luZm89XHViMzAwXHVkNjU0XHVjMmRkIFx1YzU5MVx1YzJkZFx1Yzc0NCBcdWM4MTVcdWM3NThcdWQ1NjlcdWIyYzhcdWIyZTQuCi1GUkFNRVRhZ0luZm89XHVkNjA0XHVjN2FjIFx1Y2MzZCBcdWIwYjRcdWJkODBcdWM3NTggXHVkNTA0XHViODA4XHVjNzg0XHVjNzQ0IFx1YzgxNVx1Yzc1OFx1ZDU2OVx1YjJjOFx1YjJlNC4KLUZSQU1FU0VUVGFnSW5mbz1cdWNjM2RcdWM3NDQgXHVkNTA0XHViODA4XHVjNzg0XHVjNzNjXHViODVjIFx1YjA5OFx1YjIwNFx1YjI5NCBcdWQ1MDRcdWI4MDhcdWM3ODRcdWMxMzhcdWQyYjhcdWI5N2MgXHVjODE1XHVjNzU4XHVkNTY5XHViMmM4XHViMmU0LgotSDFUYWdJbmZvPVx1Y2Q1Y1x1YzBjMVx1YzcwNCBcdWI4MDhcdWJjYTggXHVkNDVjXHVjODFjCi1IMlRhZ0luZm89XHViNDUwIFx1YmM4OFx1YzlmOCBcdWI4MDhcdWJjYTggXHVkNDVjXHVjODFjCi1IM1RhZ0luZm89XHVjMTM4IFx1YmM4OFx1YzlmOCBcdWI4MDhcdWJjYTggXHVkNDVjXHVjODFjCi1INFRhZ0luZm89XHViMTI0IFx1YmM4OFx1YzlmOCBcdWI4MDhcdWJjYTggXHVkNDVjXHVjODFjCi1INVRhZ0luZm89XHViMmU0XHVjMTJmIFx1YmM4OFx1YzlmOCBcdWI4MDhcdWJjYTggXHVkNDVjXHVjODFjCi1INlRhZ0luZm89XHVjNWVjXHVjMTJmIFx1YmM4OFx1YzlmOCBcdWI4MDhcdWJjYTggXHVkNDVjXHVjODFjCi1IRUFEVGFnSW5mbz1cdWJiMzhcdWMxMWNcdWM3NTggXHViYTU0XHVkMGMwXHViMzcwXHVjNzc0XHVkMTMwIFx1YmMwZiBcdWNjM2QgXHVjODFjXHViYWE5IFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWQzZWNcdWQ1NjhcdWQ1NjlcdWIyYzhcdWIyZTQuCi1IUlRhZ0luZm89XHVjMjE4XHVkM2M5IFx1Yzc5MAotSFRNTFRhZ0luZm89XHViYjM4XHVjMTFjXHVjNzU4IFx1YjhlOFx1ZDJiOCBcdWM2OTRcdWMxOGMKLUlUYWdJbmZvPVx1ZDE0ZFx1YzJhNFx1ZDJiOFx1Yjk3YyBcdWFlMzBcdWM2YjhcdWM3ODRcdWFmMzRcdWI4NWMgXHVkNDVjXHVjMmRjXHVkNTY5XHViMmM4XHViMmU0LgotSUZSQU1FVGFnSW5mbz1cdWM3NzhcdWI3N2NcdWM3NzggXHVkNTU4XHVjNzA0IFx1Y2MzZFx1Yzc0NCBcdWM4MTVcdWM3NThcdWQ1NjlcdWIyYzhcdWIyZTQuCi1JTUdUYWdJbmZvPVx1Y2MzOFx1Yzg3MFx1YjQxYyBcdWM3NzRcdWJiZjhcdWM5YzBcdWI5N2MgXHVjNzg0XHViY2EwXHViNTE0XHViNGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1Yjg1YyBcdWQ0NWNcdWMyZGNcdWQ1NjlcdWIyYzhcdWIyZTQuCi1JTlBVVFRhZ0luZm89XHVjMGFjXHVjNmE5XHVjNzkwIFx1Yzc4NVx1YjgyNVx1Yzc0NCBcdWM3MDRcdWQ1NWMgXHVjNTkxXHVjMmRkIFx1YzgxY1x1YzViNFx1Yjk3YyBcdWM4MTVcdWM3NThcdWQ1NjlcdWIyYzhcdWIyZTQuCi1JTlNUYWdJbmZvPVx1YzBiZFx1Yzc4NVx1YjQxYyBcdWQxNGRcdWMyYTRcdWQyYjhcdWI5N2MgXHVjODE1XHVjNzU4XHVkNTY5XHViMmM4XHViMmU0LgotSVNJTkRFWFRhZ0luZm89XHViMmU4XHVjNzdjIFx1ZDU4OSBcdWQ1MDRcdWI4NmNcdWQ1MDRcdWQyYjhcdWI5N2MgXHVjODE1XHVjNzU4XHVkNTY5XHViMmM4XHViMmU0LgotS0JEVGFnSW5mbz1cdWMwYWNcdWM2YTlcdWM3OTBcdWFjMDAgXHVjNzg1XHViODI1XHVkNTYwIFx1ZDE0ZFx1YzJhNFx1ZDJiOFx1Yjk3YyBcdWM4MTVcdWM3NThcdWQ1NjlcdWIyYzhcdWIyZTQuCi1MQUJFTFRhZ0luZm89XHVjNTkxXHVjMmRkIFx1ZDU0NFx1YjRkY1x1Yzc1OCBcdWI4MDhcdWM3NzRcdWJlMTRcdWM3NDQgXHVjODE1XHVjNzU4XHVkNTY5XHViMmM4XHViMmU0LgotTEVHRU5EVGFnSW5mbz1cdWM1OTFcdWMyZGQgXHVkNTQ0XHViNGRjIFx1YzEzOFx1ZDJiOFx1Yzc1OCBcdWI4MDhcdWM3NzRcdWJlMTRcdWM3NDQgXHVjODE1XHVjNzU4XHVkNTY5XHViMmM4XHViMmU0LgotTElUYWdJbmZvPVx1YmFhOVx1Yjg1ZCBcdWIwYjRcdWJkODBcdWM3NTggXHViYWE5XHViODVkIFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWM4MTVcdWM3NThcdWQ1NjlcdWIyYzhcdWIyZTQuCi1MSU5LVGFnSW5mbz1cdWI5ZTRcdWNjYjQgXHViM2M1XHViOWJkXHVjODAxIFx1YjljMVx1ZDA2YwotTUFQVGFnSW5mbz1cdWQwNzRcdWI3N2NcdWM3NzRcdWM1YjhcdWQyYjhcdWNlMjEgXHVjNzc0XHViYmY4XHVjOWMwIFx1YjlmNVx1Yzc0NCBcdWM4MTVcdWM3NThcdWQ1NjlcdWIyYzhcdWIyZTQuCi1NQVJRVUVFVGFnSW5mbz1cdWQxNGRcdWMyYTRcdWQyYjhcdWM1ZDAgXHVkNzUwXHViOTc0XHViMjk0IFx1ZDZhOFx1YWNmY1x1Yjk3YyBcdWM5MGRcdWIyYzhcdWIyZTQuIFczQyBIVE1MIDQuMDFcdWM1ZDBcdWMxMWNcdWIyOTQgXHVjOWMwXHVjNmQwXHViNDE4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4KLU1FTlVUYWdJbmZvPVx1YmE1NFx1YjI3NCBcdWJhYTlcdWI4NWRcdWM3NDQgXHVjODE1XHVjNzU4XHVkNTY5XHViMmM4XHViMmU0LgotTUVUQVRhZ0luZm89XHViYjM4XHVjMTFjXHVjNzU4IFx1YmE1NFx1ZDBjMFx1YjM3MFx1Yzc3NFx1ZDEzMCBcdWM4MTVcdWJjZjRcdWI5N2MgXHVjODE1XHVjNzU4XHVkNTY5XHViMmM4XHViMmU0LgotTk9CUlRhZ0luZm89XHVkNTg5IFx1YmMxNFx1YWZiOFx1YWUzMFx1Yjk3YyBcdWIzMDBcdWNjYjRcdWQ1NThcdWFjNzBcdWIwOTggXHViYzI5XHVjOWMwXHVkNTY5XHViMmM4XHViMmU0LiBXM0MgSFRNTCA0LjAxXHVjNWQwXHVjMTFjXHViMjk0IFx1YzljMFx1YzZkMFx1YjQxOFx1YzljMCBcdWM1NGFcdWMyYjVcdWIyYzhcdWIyZTQuCi1OT0ZSQU1FU1RhZ0luZm89XHVkNjA0XHVjN2FjIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMFx1YWMwMCBcdWQ1MDRcdWI4MDhcdWM3ODRcdWM3NDQgXHVjOWMwXHVjNmQwXHVkNTU4XHVjOWMwIFx1YzU0YVx1YjI5NCBcdWFjYmRcdWM2YjAgXHVkNDVjXHVjMmRjXHVkNTYwIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NjlcdWIyYzhcdWIyZTQuCi1OT1NDUklQVFRhZ0luZm89XHVkNjA0XHVjN2FjIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMFx1YWMwMCBcdWMyYTRcdWQwNmNcdWI5YmRcdWQyYjhcdWI5N2MgXHVjOWMwXHVjNmQwXHVkNTU4XHVjOWMwIFx1YzU0YVx1YjI5NCBcdWFjYmRcdWM2YjAgXHVkNDVjXHVjMmRjXHVkNTYwIFx1YzgxNVx1YmNmNFx1Yjk3YyBcdWM4MWNcdWFjZjVcdWQ1NjlcdWIyYzhcdWIyZTQuCi1PQkpFQ1RUYWdJbmZvPVx1Yzc4NFx1YmNhMFx1YjUxNFx1YjRkYyBcdWM3N2NcdWJjMTggXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4XHViOTdjIFx1YzgxNVx1Yzc1OFx1ZDU2OVx1YjJjOFx1YjJlNC4KLU9MVGFnSW5mbz1cdWMyMWNcdWMxMWNcdWQ2NTRcdWI0MWMgXHViYWE5XHViODVkCi1PUFRHUk9VUFRhZ0luZm89XHVjNjM1XHVjMTU4IFx1YWRmOFx1YjhmOQotT1BUSU9OVGFnSW5mbz1cdWMxMjBcdWQwZGQgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzEyMFx1ZDBkZFx1YzBhY1x1ZDU2ZAotUFRhZ0luZm89XHViMmU4XHViNzdkCi1QQVJBTVRhZ0luZm89XHVjNzc0XHViOTg0XHVjNzc0IFx1YzljMFx1YzgxNVx1YjQxYyBcdWQyYjlcdWMxMzEgXHVhYzEyCi1QUkVUYWdJbmZvPVx1YmJmOFx1YjlhYyBcdWQ2MTVcdWMyZGRcdWQ2NTRcdWI0MWMgXHVkMTRkXHVjMmE0XHVkMmI4Ci1RVGFnSW5mbz1cdWNkOTVcdWM1N2RcdWQ2MTUgXHVjNzc4XHViNzdjXHVjNzc4IFx1Yzc3OFx1YzZhOVx1YmIzOAotU1RhZ0luZm89XHVjZGU4XHVjMThjXHVjMTIwIFx1YzJhNFx1ZDBjMFx1Yzc3Y1x1Yjg1YyBcdWQxNGRcdWMyYTRcdWQyYjhcdWI5N2MgXHVkNDVjXHVjMmRjXHVkNTY5XHViMmM4XHViMmU0LgotU0FNUFRhZ0luZm89XHVjMGQ4XHVkNTBjIFx1ZDUwNFx1Yjg1Y1x1YWRmOFx1YjdhOCBcdWNkOWNcdWI4MjUsIFx1YzJhNFx1ZDA2Y1x1YjliZFx1ZDJiOCBcdWI0ZjFcdWM1ZDAgXHVjMGFjXHVjNmE5XHVkNTY5XHViMmM4XHViMmU0LiBcdWJhYThcdWIxNzhcdWMyYTRcdWQzOThcdWM3NzRcdWMyYTQgXHVhZTAwXHVhZjM0XHViODVjIFx1ZDQ1Y1x1YzJkY1x1ZDU2OVx1YjJjOFx1YjJlNC4KLVNDUklQVFRhZ0luZm89XHVjMmE0XHVkMDZjXHViOWJkXHVkMmI4IFx1YmIzOAotU0VMRUNUVGFnSW5mbz1cdWM2MzVcdWMxNTggXHVjMTIwXHVkMGRkXHVhZTMwCi1TTUFMTFRhZ0luZm89XHVkMTRkXHVjMmE0XHVkMmI4XHViOTdjIFx1Yzc5MVx1YWM4YyBcdWQ0NWNcdWMyZGNcdWQ1NjlcdWIyYzhcdWIyZTQuCi1TUEFOVGFnSW5mbz1cdWNlZThcdWQxNTBcdWNlMjBcdWM3NTggXHVjMmE0XHVkMGMwXHVjNzdjIFx1YjYxMFx1YjI5NCBcdWM1YjhcdWM1YjRcdWI5N2MgXHVjODE1XHVjNzU4XHVkNTU4XHViMjk0IFx1YjM3MCBcdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTVjIFx1Yzc3Y1x1YmMxOCBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgKLVNUUklLRVRhZ0luZm89XHVjZGU4XHVjMThjXHVjMTIwIFx1YzJhNFx1ZDBjMFx1Yzc3Y1x1Yjg1YyBcdWQxNGRcdWMyYTRcdWQyYjhcdWI5N2MgXHVkNDVjXHVjMmRjXHVkNTY5XHViMmM4XHViMmU0LgotU1RST05HVGFnSW5mbz1cdWQxNGRcdWMyYTRcdWQyYjhcdWI5N2MgXHVhYzE1XHVjODcwXHVkNDVjXHVjMmRjXHVkNTY5XHViMmM4XHViMmU0KFx1Yzc3Y1x1YmMxOFx1YzgwMVx1YzczY1x1Yjg1YyBcdWFkNzVcdWM3NDBcdWNjYjQpLgotU1RZTEVUYWdJbmZvPVx1ZDNlY1x1ZDU2OFx1YjQxYyBcdWM4MTVcdWJjZjRcdWM3NTggXHVjMmE0XHVkMGMwXHVjNzdjXHVjNzQ0IFx1YzgxNVx1Yzc1OFx1ZDU2OVx1YjJjOFx1YjJlNC4KLVNVQlRhZ0luZm89XHVjNTQ0XHViNzk4IFx1Y2NhOFx1Yzc5MFx1Yjg1YyBcdWQ0NWNcdWMyZGNcdWQ1NjlcdWIyYzhcdWIyZTQuCi1TVVBUYWdJbmZvPVx1YzcwNCBcdWNjYThcdWM3OTBcdWI4NWMgXHVkNDVjXHVjMmRjXHVkNTY5XHViMmM4XHViMmU0LgotVEFCTEVUYWdJbmZvPVx1ZDE0Y1x1Yzc3NFx1YmUxNFx1Yzc0NCBcdWM4MTVcdWM3NThcdWQ1NjlcdWIyYzhcdWIyZTQuCi1UQk9EWVRhZ0luZm89XHVkMTRjXHVjNzc0XHViZTE0IFx1YmNmOFx1YmIzOAotVERUYWdJbmZvPVx1ZDE0Y1x1Yzc3NFx1YmUxNCBcdWIwYjRcdWM3NTggXHVjMTQwCi1URVhUQVJFQVRhZ0luZm89XHViMmU0XHVjOTExIFx1ZDU4OSBcdWQxNGRcdWMyYTRcdWQyYjggXHVkNTQ0XHViNGRjCi1URk9PVFRhZ0luZm89XHVkMTRjXHVjNzc0XHViZTE0IFx1YmMxNFx1YjJlNVx1YWUwMAotVEhUYWdJbmZvPVx1ZDE0Y1x1Yzc3NFx1YmUxNCBcdWQ1ZTRcdWIzNTQgXHVjMTQwCi1USEVBRFRhZ0luZm89XHVkMTRjXHVjNzc0XHViZTE0IFx1ZDVlNFx1YjM1NAotVElUTEVUYWdJbmZvPVx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMCBcdWM4MWNcdWJhYTkgXHVkNDVjXHVjMmRjXHVjOTA0XHVjNWQwIFx1ZDQ1Y1x1YzJkY1x1YjQxOFx1YjI5NCBcdWJiMzhcdWMxMWMgXHVjODFjXHViYWE5Ci1UUlRhZ0luZm89XHVkMTRjXHVjNzc0XHViZTE0IFx1ZDU4OQotVFRUYWdJbmZvPVx1ZDE0ZFx1YzJhNFx1ZDJiOFx1Yjk3YyBcdWQxNTRcdWI4MDhcdWQwYzBcdWM3NzRcdWQ1MDQgXHViNjEwXHViMjk0IFx1YmFhOFx1YjE3OFx1YzJhNFx1ZDM5OFx1Yzc3NFx1YzJhNCBcdWQxNGRcdWMyYTRcdWQyYjggXHVjMmE0XHVkMGMwXHVjNzdjXHViODVjIFx1ZDQ1Y1x1YzJkY1x1ZDU2OVx1YjJjOFx1YjJlNC4KLVVUYWdJbmZvPVx1ZDE0ZFx1YzJhNFx1ZDJiOFx1YzVkMCBcdWJjMTFcdWM5MDRcdWM3NDQgXHVhZGY4XHVjNWI0IFx1ZDQ1Y1x1YzJkY1x1ZDU2OVx1YjJjOFx1YjJlNC4KLVVMVGFnSW5mbz1cdWMyMWNcdWMxMWMgXHVjNWM2XHViMjk0IFx1YmFhOVx1Yjg1ZAotVkFSVGFnSW5mbz1cdWJjYzBcdWMyMTggXHViNjEwXHViMjk0IFx1ZDUwNFx1Yjg1Y1x1YWRmOFx1YjdhOCBcdWM3NzhcdWMyMThcdWM3NTggXHVjNzc4XHVjMmE0XHVkMTM0XHVjMmE0Ci1XQlJUYWdJbmZvPTxCPiZsdDtOT0JSJmd0OzwvQj4gXHVkMGRjXHVhZGY4IFx1YjBiNFx1YzVkMCBcdWQ1ODkgXHViYzE0XHVhZmI4XHVhZTMwXHViOTdjIFx1ZDVjOFx1YzZhOVx1ZDU2OVx1YjJjOFx1YjJlNC4gVzNDIEhUTUwgNC4wMVx1YzVkMFx1YzExY1x1YjI5NCBcdWM5YzBcdWM2ZDBcdWI0MThcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmX3B0X0JSLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWZfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlMzMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWZfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1BVGFnSW5mbz1VbSBsaW5rIHNlIG8gYXRyaWJ1dG8gaHJlZiBlc3RpdmVyIHByZXNlbnRlIGUgbyBkZXN0aW5vIGRlIHVtIGxpbmsgc2UgbyBhdHJpYnV0byBuYW1lIGVzdGl2ZXIgcHJlc2VudGUuCi1BQkJSVGFnSW5mbz1VbWEgYWJyZXZpYVx1MDBlN1x1MDBlM28gKHBvciBleGVtcGxvLCBXV1csIEhUVFApCi1BQ1JPTllNVGFnSW5mbz1VbSBhY3JcdTAwZjRuaW1vIChwb3IgZXhlbXBsbywgU0NVQkEpCi1BRERSRVNTVGFnSW5mbz1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgbyBlbmRlcmVcdTAwZTdvIGRvIGF1dG9yIGRhIHBcdTAwZTFnaW5hCi1BUFBMRVRUYWdJbmZvPVVtIGFwcGxldCBKYXZhCi1BUkVBVGFnSW5mbz1EZWZpbmUgdW1hIFx1MDBlMXJlYSBkZSBtYXBhIGRlIGltYWdlbSBkbyBsYWRvIGRvIGNsaWVudGUKLUJUYWdJbmZvPUV4aWJlIG8gdGV4dG8gY29udGlkbyBjb21vIG5lZ3JpdG8KLUJBU0VUYWdJbmZvPU8gVVJJIGJhc2UgcGFyYSBhIHBcdTAwZTFnaW5hIGEgc2VyIHV0aWxpemFkbyBhbyBjYWxjdWxhciBjYW1pbmhvcyByZWxhdGl2b3MKLUJBU0VGT05UVGFnSW5mbz1PIHRhbWFuaG8gZGEgZm9udGUgYmFzZSBwYXJhIGEgcFx1MDBlMWdpbmEKLUJET1RhZ0luZm89U3Vic3RpdHVpIGEgZXhpYmlcdTAwZTdcdTAwZTNvIGJpZGlyZWNpb25hbCBwYWRyXHUwMGUzby4gUGFyYSBzZXIgdXRpbGl6YWRvIGNvbSBpZGlvbWFzIGJpZGlyZWNpb25haXMuCi1CSUdUYWdJbmZvPUV4aWJlIG8gdGV4dG8gY29udGlkbyBlbSB0YW1hbmhvIGdyYW5kZQotQkdTT1VORFRhZ0luZm89RGVmaW5lIHVtIGFycXVpdm8gZGUgc29tIHBhcmEgYSBwXHUwMGUxZ2luYS4gTlx1MDBlM28gc3Vwb3J0YWRvIHBlbG8gVzNDIEhUTUwgNC4wMS4KLUJMSU5LVGFnSW5mbz1FeGliZSBvIHRleHRvIHBpc2NhbmRvLiBOXHUwMGUzbyBzdXBvcnRhZG8gcGVsbyBXM0MgSFRNTCA0LjAxLgotQkxPQ0tRVU9URVRhZ0luZm89VW1hIGNpdGFcdTAwZTdcdTAwZTNvIGxvbmdhCi1CT0RZVGFnSW5mbz1PIGNvcnBvIGRvIGRvY3VtZW50by4gQ29udFx1MDBlOW0gdG9kbyBvIGNvbnRlXHUwMGZhZG8gcGFyYSBhIHBcdTAwZTFnaW5hLgotQlJUYWdJbmZvPUZvclx1MDBlN2EgdW1hIHF1ZWJyYSBkZSBsaW5oYQotQlVUVE9OVGFnSW5mbz1EZWZpbmUgdW0gYm90XHUwMGUzbyBkZSBjb21hbmRvCi1DQVBUSU9OVGFnSW5mbz1EZWZpbmUgdW1hIGxlZ2VuZGEgZGUgdGFiZWxhCi1DRU5URVJUYWdJbmZvPUV4aWJlIG8gdGV4dG8gY29udGlkbyBjZW50cmFsaXphZG8uIEVxdWl2YWxlbnRlIGEgRElWIGNvbSBhbGlnbj1jZW50ZXIuCi1DSVRFVGFnSW5mbz1VbWEgY2l0YVx1MDBlN1x1MDBlM28KLUNPREVUYWdJbmZvPVVtIGZyYWdtZW50byBkZSBjXHUwMGYzZGlnbyBkZSBjb21wdXRhZG9yCi1DT0xUYWdJbmZvPVVtYSBjb2x1bmEgZGUgdGFiZWxhCi1DT0xHUk9VUFRhZ0luZm89VW0gZ3J1cG8gZGUgY29sdW5hcyBkYSB0YWJlbGEKLUREVGFnSW5mbz1VbWEgZGVmaW5pXHUwMGU3XHUwMGUzbyBvdSBkZXNjcmlcdTAwZTdcdTAwZTNvIGVtIHVtYSBsaXN0YSBkZSBkZWZpbmlcdTAwZTdcdTAwZjVlcyBvdSBkZXNjcmlcdTAwZTdcdTAwZjVlcwotREVMVGFnSW5mbz1FeGliZSB0ZXh0byBjb21vIGV4Y2x1XHUwMGVkZG8KLURGTlRhZ0luZm89VW1hIGRlZmluaVx1MDBlN1x1MDBlM28KLURJUlRhZ0luZm89VW1hIGxpc3RhZ2VtIGRlIGRpcmV0XHUwMGYzcmlvcwotRElWVGFnSW5mbz1VbSBjb250XHUwMGVhaW5lciBnZW5cdTAwZTlyaWNvLCBxdWUgcG9kZSBzZXIgdXRpbGl6YWRvIHBhcmEgZGVmaW5pciBpZGlvbWEgb3UgZXN0aWxvIGRvIGNvbnRlXHUwMGZhZG8KLURMVGFnSW5mbz1VbWEgbGlzdGEgZGUgZGVmaW5pXHUwMGU3XHUwMGY1ZXMgb3UgZGVzY3JpXHUwMGU3XHUwMGY1ZXMKLURUVGFnSW5mbz1VbSB0ZXJtbyBvdSBhc3N1bnRvIGVtIHVtYSBsaXN0YSBkZSBkZWZpbmlcdTAwZTdcdTAwZjVlcyBvdSBkZXNjcmlcdTAwZTdcdTAwZjVlcwotRU1UYWdJbmZvPUV4aWJlIG8gdGV4dG8gZW5mYXRpemFkbyAoZ2VyYWxtZW50ZSBlbSBpdFx1MDBlMWxpY28pCi1FTUJFRFRhZ0luZm89RGVmaW5lIHVtIHBsdWctaW4gaW5jb3Jwb3JhZG8uIE5cdTAwZTNvIHN1cG9ydGFkbyBwZWxvIFczQyBIVE1MIDQuMDEuCi1GSUVMRFNFVFRhZ0luZm89RGVmaW5lIHVtIGdydXBvIGRlIGNvbnRyb2xlIGRlIGZvcm11bFx1MDBlMXJpbwotRk9OVFRhZ0luZm89RXhpYmUgdGV4dG8gbmEgZm9udGUgZm9ybmVjaWRhCi1GT1JNVGFnSW5mbz1EZWZpbmUgdW0gZm9ybXVsXHUwMGUxcmlvIGludGVyYXRpdm8KLUZSQU1FVGFnSW5mbz1EZWZpbmUgdW0gcXVhZHJvIGRlbnRybyBkYSBqYW5lbGEgYXR1YWwKLUZSQU1FU0VUVGFnSW5mbz1EZWZpbmUgdW0gY29uanVudG8gZGUgcXVhZHJvcyBxdWUgZGl2aWRlIGEgamFuZWxhIGVtIHF1YWRyb3MKLUgxVGFnSW5mbz1VbSB0XHUwMGVkdHVsbyBkZSBuXHUwMGVkdmVsIHN1cGVyaW9yCi1IMlRhZ0luZm89VW0gdFx1MDBlZHR1bG8gZGUgc2VndW5kbyBuXHUwMGVkdmVsCi1IM1RhZ0luZm89VW0gdFx1MDBlZHR1bG8gZGUgdGVyY2Vpcm8gblx1MDBlZHZlbAotSDRUYWdJbmZvPVVtIHRcdTAwZWR0dWxvIGRlIHF1YXJ0byBuXHUwMGVkdmVsCi1INVRhZ0luZm89VW0gdFx1MDBlZHR1bG8gZGUgcXVpbnRvIG5cdTAwZWR2ZWwKLUg2VGFnSW5mbz1VbSB0XHUwMGVkdHVsbyBkZSBzZXh0byBuXHUwMGVkdmVsCi1IRUFEVGFnSW5mbz1Db250XHUwMGU5bSBtZXRhZGFkb3MgZSBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgbyB0XHUwMGVkdHVsbyBkYSBqYW5lbGEgcGFyYSBvIGRvY3VtZW50bwotSFJUYWdJbmZvPVVtYSByXHUwMGU5Z3VhIGhvcml6b250YWwKLUhUTUxUYWdJbmZvPU8gZWxlbWVudG8gcmFpeiBkbyBkb2N1bWVudG8uCi1JVGFnSW5mbz1FeGliZSBvIHRleHRvIGVtIGl0XHUwMGUxbGljbwotSUZSQU1FVGFnSW5mbz1EZWZpbmUgdW1hIHN1YmphbmVsYSBlbSBsaW5oYQotSU1HVGFnSW5mbz1FeGliZSBhIGltYWdlbSByZWZlcmlkYSBjb21vIGNvbnRlXHUwMGZhZG8gaW5jb3Jwb3JhZG8KLUlOUFVUVGFnSW5mbz1EZWZpbmUgdW0gY29udHJvbGUgZGUgZm9ybXVsXHUwMGUxcmlvIHBhcmEgZW50cmFkYSBkbyB1c3VcdTAwZTFyaW8KLUlOU1RhZ0luZm89RGVmaW5lIG8gdGV4dG8gaW5zZXJpZG8KLUlTSU5ERVhUYWdJbmZvPURlZmluZSB1bSBwcm9tcHQgZGUgbGluaGEgXHUwMGZhbmljYQotS0JEVGFnSW5mbz1EZWZpbmUgdGV4dG8gYSBzZXIgaW5zZXJpZG8gcGVsbyB1c3VcdTAwZTFyaW8KLUxBQkVMVGFnSW5mbz1EZWZpbmUgbyByXHUwMGYzdHVsbyBwYXJhIHVtIGNhbXBvIGRlIGZvcm11bFx1MDBlMXJpbwotTEVHRU5EVGFnSW5mbz1EZWZpbmUgbyByXHUwMGYzdHVsbyBwYXJhIHVtIGNvbmp1bnRvIGRlIGNhbXBvcyBkZSBmb3JtdWxcdTAwZTFyaW8KLUxJVGFnSW5mbz1EZWZpbmUgdW0gaXRlbSBkZSBsaXN0YSBkZW50cm8gZGUgdW1hIGxpc3RhCi1MSU5LVGFnSW5mbz1VbSBsaW5rIGluZGVwZW5kZW50ZSBkZSBtXHUwMGVkZGlhCi1NQVBUYWdJbmZvPURlZmluZSB1bSBtYXBhIGRlIGltYWdlbSBkbyBsYWRvIGRvIGNsaWVudGUKLU1BUlFVRUVUYWdJbmZvPUV4aWJlIHRleHRvIHJvbGFuZG8uIE5cdTAwZTNvIHN1cG9ydGFkbyBwZWxvIFczQyBIVE1MIDQuMDEuCi1NRU5VVGFnSW5mbz1EZWZpbmUgdW1hIGxpc3RhIGRlIG1lbnVzCi1NRVRBVGFnSW5mbz1EZWZpbmUgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGRlIG1ldGFkYWRvcyBwYXJhIG8gZG9jdW1lbnRvCi1OT0JSVGFnSW5mbz1TdWJzdGl0dWkgZSBpbXBlZGUgcXVlYnJhcyBkZSBsaW5oYS4gTlx1MDBlM28gc3Vwb3J0YWRvIHBlbG8gVzNDIEhUTUwgNC4wMS4KLU5PRlJBTUVTVGFnSW5mbz1Gb3JuZWNlIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhIHNlcmVtIGV4aWJpZGFzIHNlIG8gbmF2ZWdhZG9yIGF0dWFsIG5cdTAwZTNvIHN1cG9ydGFyIHF1YWRyb3MKLU5PU0NSSVBUVGFnSW5mbz1Gb3JuZWNlIGluZm9ybWFcdTAwZTdcdTAwZjVlcyBhIHNlcmVtIGV4aWJpZGFzIHNlIG8gbmF2ZWdhZG9yIGF0dWFsIG5cdTAwZTNvIHN1cG9ydGFyIHNjcmlwdAotT0JKRUNUVGFnSW5mbz1EZWZpbmUgdW0gb2JqZXRvIGluY29ycG9yYWRvIGdlblx1MDBlOXJpY28KLU9MVGFnSW5mbz1VbWEgbGlzdGEgb3JkZW5hZGEKLU9QVEdST1VQVGFnSW5mbz1VbSBncnVwbyBkZSBvcFx1MDBlN1x1MDBmNWVzCi1PUFRJT05UYWdJbmZvPVVtYSBvcFx1MDBlN1x1MDBlM28gc2VsZWNpb25cdTAwZTF2ZWwKLVBUYWdJbmZvPVVtIHBhclx1MDBlMWdyYWZvCi1QQVJBTVRhZ0luZm89TyB2YWxvciBkZSB1bWEgcHJvcHJpZWRhZGUgZGVub21pbmFkYQotUFJFVGFnSW5mbz1UZXh0byBwclx1MDBlOS1mb3JtYXRhZG8KLVFUYWdJbmZvPVVtYSBjaXRhXHUwMGU3XHUwMGUzbyBjdXJ0YSBlbSBsaW5oYQotU1RhZ0luZm89RXhpYmlyIHRleHRvIG5vIGVzdGlsbyB0YWNoYWRvCi1TQU1QVGFnSW5mbz1TYVx1MDBlZGRhLCBzY3JpcHRzLCBldGMgZG8gcHJvZ3JhbWEgZGUgYW1vc3RyYS4gRXhpYmUgZW0gZm9udGUgZGUgZXNwYVx1MDBlN2FtZW50byB1bmlmb3JtZS4KLVNDUklQVFRhZ0luZm89SW5zdHJ1XHUwMGU3XHUwMGY1ZXMgZGUgc2NyaXB0Ci1TRUxFQ1RUYWdJbmZvPVVtIHNlbGV0b3IgZGUgb3BcdTAwZTdcdTAwZjVlcwotU01BTExUYWdJbmZvPUV4aWJlIHRleHRvIGVtIHRhbWFuaG8gcGVxdWVubwotU1BBTlRhZ0luZm89VW0gY29udFx1MDBlYWluZXIgZ2VuXHUwMGU5cmljbywgcXVlIHBvZGUgc2VyIHV0aWxpemFkbyBwYXJhIGRlZmluaXIgaWRpb21hIG91IGVzdGlsbyBkbyBjb250ZVx1MDBmYWRvCi1TVFJJS0VUYWdJbmZvPUV4aWJpciB0ZXh0byBubyBlc3RpbG8gdGFjaGFkbwotU1RST05HVGFnSW5mbz1FeGliZSBvIHRleHRvIG11aXRvIGVuZmF0aXphZG8gKGdlcmFsbWVudGUgZW0gbmVncml0bykKLVNUWUxFVGFnSW5mbz1EZWZpbmUgdW0gZXN0aWxvIHBhcmEgYXMgaW5mb3JtYVx1MDBlN1x1MDBmNWVzIGNvbnRpZGFzCi1TVUJUYWdJbmZvPUV4aWJlIGNvbW8gc3Vic2NyaXRvCi1TVVBUYWdJbmZvPUV4aWJlIGNvbW8gc29icmVzY3JpdG8KLVRBQkxFVGFnSW5mbz1EZWZpbmUgdW1hIHRhYmVsYQotVEJPRFlUYWdJbmZvPU8gY29ycG8gZGEgdGFiZWxhCi1URFRhZ0luZm89VW1hIGNcdTAwZTlsdWxhIGRlIHVtYSB0YWJlbGEKLVRFWFRBUkVBVGFnSW5mbz1VbSBjYW1wbyBkZSB0ZXh0byBkZSB2XHUwMGUxcmlhcyBsaW5oYXMKLVRGT09UVGFnSW5mbz1VbSByb2RhcFx1MDBlOSBkZSB0YWJlbGEKLVRIVGFnSW5mbz1VbWEgY1x1MDBlOWx1bGEgZGUgY2FiZVx1MDBlN2FsaG8gZGUgdGFiZWxhCi1USEVBRFRhZ0luZm89VW0gY2FiZVx1MDBlN2FsaG8gZGUgdGFiZWxhCi1USVRMRVRhZ0luZm89TyB0XHUwMGVkdHVsbyBkbyBkb2N1bWVudG8sIGV4aWJpZG8gbmEgYmFycmEgZGUgdFx1MDBlZHR1bG8gZG8gbmF2ZWdhZG9yCi1UUlRhZ0luZm89VW1hIGxpbmhhIGRhIHRhYmVsYQotVFRUYWdJbmZvPUV4aWJlIG8gdGV4dG8gZW0gdGVsZXRpcG8gb3UgZW0gZXN0aWxvIGRlIHRleHRvIGRlIGVzcGFcdTAwZTdhbWVudG8gdW5pZm9ybWUKLVVUYWdJbmZvPUV4aWJlIHRleHRvIGNvbW8gc3VibGluaGFkbwotVUxUYWdJbmZvPVVtYSBsaXN0YSBkZXNvcmRlbmFkYQotVkFSVGFnSW5mbz1VbWEgaW5zdFx1MDBlMm5jaWEgZGUgdW0gYXJndW1lbnRvIGRlIHZhcmlcdTAwZTF2ZWwgb3UgcHJvZ3JhbWEKLVdCUlRhZ0luZm89UGVybWl0ZSB1bWEgcXVlYnJhIGRlIGxpbmhhIG5hIG1hcmNhXHUwMGU3XHUwMGUzbyAgPEI+Jmx0O05PQlImZ3Q7PC9CPi4gTlx1MDBlM28gc3Vwb3J0YWRvIHBlbG8gVzNDIEhUTUwgNC4wMS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl96aF9DTi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOWYzMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQVRhZ0luZm89XHU1OTgyXHU2NzljIGhyZWYgXHU1YzVlXHU2MDI3XHU1YjU4XHU1NzI4XHVmZjBjXHU1MjE5XHU2NjJmXHU0ZTAwXHU0ZTJhXHU5NGZlXHU2M2E1XHVmZjBjXHU4MDBjXHU1OTgyXHU2NzljXHU1NDBkXHU3OWYwXHU1YzVlXHU2MDI3XHU1YjU4XHU1NzI4XHVmZjBjXHU1MjE5XHU2NjJmXHU5NGZlXHU2M2E1XHU3Njg0XHU3NmVlXHU2ODA3Ci1BQkJSVGFnSW5mbz1cdTdmMjlcdTUxOTlcdWZmMDhcdTRmOGJcdTU5ODJcdWZmMGNXV1cgXHU1NDhjIEhUVFBcdWZmMDkKLUFDUk9OWU1UYWdJbmZvPVx1OTk5Nlx1NWI1N1x1NmJjZFx1N2YyOVx1NTE5OVx1OGJjZFx1ZmYwOFx1NGY4Ylx1NTk4Mlx1ZmYwY1NDVUJBXHVmZjA5Ci1BRERSRVNTVGFnSW5mbz1cdTk4NzVcdTk3NjJcdTc2ODRcdTRmNWNcdTgwMDVcdTc2ODRcdTU3MzBcdTU3NDBcdTRmZTFcdTYwNmYKLUFQUExFVFRhZ0luZm89SmF2YSBhcHBsZXQKLUFSRUFUYWdJbmZvPVx1NWI5YVx1NGU0OVx1NWJhMlx1NjIzN1x1NjczYVx1N2FlZlx1NTZmZVx1NTBjZlx1NjYyMFx1NWMwNFx1NTMzYVx1NTdkZgotQlRhZ0luZm89XHU3NTI4XHU3Yzk3XHU0ZjUzXHU1YjU3XHU2NjNlXHU3OTNhXHU2MjQwXHU1MzA1XHU1NDJiXHU3Njg0XHU2NTg3XHU2NzJjCi1CQVNFVGFnSW5mbz1cdTk4NzVcdTk3NjJcdTc2ODRcdTU3ZmFcdTUxYzYgVVJJXHVmZjBjXHU1NzI4XHU4YmExXHU3Yjk3XHU3NmY4XHU1YmY5XHU4ZGVmXHU1Zjg0XHU2NWY2XHU0ZjdmXHU3NTI4Ci1CQVNFRk9OVFRhZ0luZm89XHU5ODc1XHU5NzYyXHU3Njg0XHU1N2ZhXHU2NzJjXHU1YjU3XHU0ZjUzXHU1OTI3XHU1YzBmCi1CRE9UYWdJbmZvPVx1ODk4Nlx1NzZkNlx1N2YzYVx1NzcwMVx1NTNjY1x1NTQxMVx1NjYzZVx1NzkzYVx1MzAwMlx1ODk4MVx1NGUwZVx1NTNjY1x1NTQxMVx1OGJlZFx1OGEwMFx1OTE0ZFx1NTQwOFx1NGY3Zlx1NzUyOFx1MzAwMgotQklHVGFnSW5mbz1cdTc1MjhcdTU5MjdcdTViNTdcdTRmNTNcdTY2M2VcdTc5M2FcdTYyNDBcdTUzMDVcdTU0MmJcdTc2ODRcdTY1ODdcdTY3MmMKLUJHU09VTkRUYWdJbmZvPVx1NGUzYVx1OTg3NVx1OTc2Mlx1NWI5YVx1NGU0OVx1NThmMFx1OTdmM1x1NjU4N1x1NGVmNlx1MzAwMlczQyBIVE1MIDQuMDEgXHU0ZTBkXHU2NTJmXHU2MzAxXHU1YjgzXHUzMDAyCi1CTElOS1RhZ0luZm89XHU0ZWU1XHU5NWVhXHU3MGMxXHU2NWI5XHU1ZjBmXHU2NjNlXHU3OTNhXHU2NTg3XHU2NzJjXHUzMDAyVzNDIEhUTUwgNC4wMSBcdTRlMGRcdTY1MmZcdTYzMDFcdTViODNcdTMwMDIKLUJMT0NLUVVPVEVUYWdJbmZvPVx1OTU3Zlx1NWYxNVx1NzUyOAotQk9EWVRhZ0luZm89XHU2NTg3XHU2ODYzXHU0ZTNiXHU0ZjUzXHUzMDAyXHU1MzA1XHU1NDJiXHU5ODc1XHU5NzYyXHU3Njg0XHU2MjQwXHU2NzA5XHU1MTg1XHU1YmI5XHUzMDAyCi1CUlRhZ0luZm89XHU1ZjNhXHU1MjM2XHU2MzYyXHU4ODRjCi1CVVRUT05UYWdJbmZvPVx1NWI5YVx1NGU0OVx1NjMwOVx1OTRhZQotQ0FQVElPTlRhZ0luZm89XHU1YjlhXHU0ZTQ5XHU4ODY4XHU2ODA3XHU5ODk4Ci1DRU5URVJUYWdJbmZvPVx1NWM0NVx1NGUyZFx1NjYzZVx1NzkzYVx1NjI0MFx1NTMwNVx1NTQyYlx1NzY4NFx1NjU4N1x1NjcyY1x1MzAwMlx1N2I0OVx1NGVmN1x1NGU4ZVx1OGJiZVx1N2Y2ZVx1NGU4NiBhbGlnbj1jZW50ZXIgXHU3Njg0IERJVlx1MzAwMgotQ0lURVRhZ0luZm89XHU1ZjE1XHU3NTI4Ci1DT0RFVGFnSW5mbz1cdThiYTFcdTdiOTdcdTY3M2FcdTRlZTNcdTc4MDFcdTZiYjUKLUNPTFRhZ0luZm89XHU4ODY4XHU1MjE3Ci1DT0xHUk9VUFRhZ0luZm89XHU0ZTAwXHU3ZWM0XHU4ODY4XHU1MjE3Ci1ERFRhZ0luZm89XHU1YjlhXHU0ZTQ5XHU2MjE2XHU2M2NmXHU4ZmYwXHU1MjE3XHU4ODY4XHU0ZTJkXHU3Njg0XHU1YjlhXHU0ZTQ5XHU2MjE2XHU2M2NmXHU4ZmYwCi1ERUxUYWdJbmZvPVx1NWMwNlx1NjU4N1x1NjcyY1x1NjYzZVx1NzkzYVx1NGUzYVx1NWRmMlx1NTIyMFx1OTY2NAotREZOVGFnSW5mbz1cdTViOWFcdTRlNDkKLURJUlRhZ0luZm89XHU3NmVlXHU1ZjU1XHU1MjE3XHU4ODY4Ci1ESVZUYWdJbmZvPVx1NGUwMFx1NGUyYVx1NGUwMFx1ODIyY1x1NWJiOVx1NTY2OFx1ZmYwY1x1NTNlZlx1NzUyOFx1NGU4ZVx1NGUzYVx1NTE4NVx1NWJiOVx1NWI5YVx1NGU0OVx1OGJlZFx1OGEwMFx1NjIxNlx1NjgzN1x1NWYwZgotRExUYWdJbmZvPVx1NWI5YVx1NGU0OVx1NjIxNlx1NjNjZlx1OGZmMFx1NTIxN1x1ODg2OAotRFRUYWdJbmZvPVx1NWI5YVx1NGU0OVx1NjIxNlx1NjNjZlx1OGZmMFx1NTIxN1x1ODg2OFx1NGUyZFx1NzY4NFx1NjcyZlx1OGJlZFx1NjIxNlx1NGUzYlx1OTg5OAotRU1UYWdJbmZvPVx1NGVlNVx1NWYzYVx1OGMwM1x1NjViOVx1NWYwZlx1ZmYwOFx1OTAxYVx1NWUzOFx1OTFjN1x1NzUyOFx1NjU5Y1x1NGY1M1x1ZmYwOVx1Njc2NVx1NjYzZVx1NzkzYVx1NjU4N1x1NjcyYwotRU1CRURUYWdJbmZvPVx1NWI5YVx1NGU0OVx1NWQ0Y1x1NTE2NVx1NWYwZlx1NjNkMlx1NGVmNlx1MzAwMlczQyBIVE1MIDQuMDEgXHU0ZTBkXHU2NTJmXHU2MzAxXHU1YjgzXHUzMDAyCi1GSUVMRFNFVFRhZ0luZm89XHU1YjlhXHU0ZTQ5XHU4ODY4XHU1MzU1XHU2M2E3XHU0ZWY2XHU3ZWM0Ci1GT05UVGFnSW5mbz1cdTYzMDlcdTdlZDlcdTViOWFcdTc2ODRcdTViNTdcdTRmNTNcdTY3NjVcdTY2M2VcdTc5M2FcdTY1ODdcdTY3MmMKLUZPUk1UYWdJbmZvPVx1NWI5YVx1NGU0OVx1NGVhNFx1NGU5Mlx1NWYwZlx1ODg2OFx1NTM1NQotRlJBTUVUYWdJbmZvPVx1NTcyOFx1NWY1M1x1NTI0ZFx1N2E5N1x1NTNlM1x1NGUyZFx1NWI5YVx1NGU0OVx1Njg0Nlx1NjdiNgotRlJBTUVTRVRUYWdJbmZvPVx1NWI5YVx1NGU0OVx1NWMwNlx1N2E5N1x1NTNlM1x1NTIwNlx1NjIxMFx1NTkxYVx1NGUyYVx1Njg0Nlx1NjdiNlx1NzY4NFx1Njg0Nlx1NjdiNlx1OTZjNgotSDFUYWdJbmZvPVx1OTg3Nlx1N2VhN1x1NjgwN1x1OTg5OAotSDJUYWdJbmZvPVx1N2IyY1x1NGU4Y1x1N2VhN1x1NjgwN1x1OTg5OAotSDNUYWdJbmZvPVx1N2IyY1x1NGUwOVx1N2VhN1x1NjgwN1x1OTg5OAotSDRUYWdJbmZvPVx1N2IyY1x1NTZkYlx1N2VhN1x1NjgwN1x1OTg5OAotSDVUYWdJbmZvPVx1N2IyY1x1NGU5NFx1N2VhN1x1NjgwN1x1OTg5OAotSDZUYWdJbmZvPVx1N2IyY1x1NTE2ZFx1N2VhN1x1NjgwN1x1OTg5OAotSEVBRFRhZ0luZm89XHU1MzA1XHU1NDJiXHU2NTg3XHU2ODYzXHU3Njg0XHU1MTQzXHU2NTcwXHU2MzZlXHU1NDhjXHU3YTk3XHU1M2UzXHU2ODA3XHU5ODk4XHU0ZmUxXHU2MDZmCi1IUlRhZ0luZm89XHU2YzM0XHU1ZTczXHU3ZWJmCi1IVE1MVGFnSW5mbz1cdTY1ODdcdTY4NjNcdTc2ODRcdTY4MzlcdTUxNDNcdTdkMjBcdTMwMDIKLUlUYWdJbmZvPVx1NzUyOFx1NjU5Y1x1NGY1M1x1NjYzZVx1NzkzYVx1NjU4N1x1NjcyYwotSUZSQU1FVGFnSW5mbz1cdTViOWFcdTRlNDlcdTc2ZjRcdTYzYTVcdTYzZDJcdTUxNjVcdTc2ODRcdTViNTBcdTdhOTdcdTUzZTMKLUlNR1RhZ0luZm89XHU1YzA2XHU1ZjE1XHU3NTI4XHU3Njg0XHU1NmZlXHU1MGNmXHU0ZjVjXHU0ZTNhXHU1ZDRjXHU1MTY1XHU1MTg1XHU1YmI5XHU2NzY1XHU2NjNlXHU3OTNhCi1JTlBVVFRhZ0luZm89XHU0ZTNhXHU3NTI4XHU2MjM3XHU4ZjkzXHU1MTY1XHU1YjlhXHU0ZTQ5XHU4ODY4XHU1MzU1XHU2M2E3XHU0ZWY2Ci1JTlNUYWdJbmZvPVx1NWI5YVx1NGU0OVx1NjNkMlx1NTE2NVx1NzY4NFx1NjU4N1x1NjcyYwotSVNJTkRFWFRhZ0luZm89XHU1YjlhXHU0ZTQ5XHU1MzU1XHU4ODRjXHU2M2QwXHU3OTNhXHU3YjI2Ci1LQkRUYWdJbmZvPVx1NWI5YVx1NGU0OVx1ODk4MVx1NzUzMVx1NzUyOFx1NjIzN1x1OGY5M1x1NTE2NVx1NzY4NFx1NjU4N1x1NjcyYwotTEFCRUxUYWdJbmZvPVx1NGUzYVx1ODg2OFx1NTM1NVx1NWI1N1x1NmJiNVx1NWI5YVx1NGU0OVx1NjgwN1x1NTNmNwotTEVHRU5EVGFnSW5mbz1cdTRlM2FcdTRlMDBcdTdlYzRcdTg4NjhcdTUzNTVcdTViNTdcdTZiYjVcdTViOWFcdTRlNDlcdTY4MDdcdTUzZjcKLUxJVGFnSW5mbz1cdTU3MjhcdTUyMTdcdTg4NjhcdTRlMmRcdTViOWFcdTRlNDlcdTUyMTdcdTg4NjhcdTk4NzkKLUxJTktUYWdJbmZvPVx1NGUwZVx1NGVjYlx1OGQyOFx1NjVlMFx1NTE3M1x1NzY4NFx1OTRmZVx1NjNhNQotTUFQVGFnSW5mbz1cdTViOWFcdTRlNDlcdTViYTJcdTYyMzdcdTY3M2FcdTdhZWZcdTU2ZmVcdTUwY2ZcdTY2MjBcdTVjMDQKLU1BUlFVRUVUYWdJbmZvPVx1NmVkYVx1NTJhOFx1NjYzZVx1NzkzYVx1NjU4N1x1NjcyY1x1MzAwMlczQyBIVE1MIDQuMDEgXHU0ZTBkXHU2NTJmXHU2MzAxXHU1YjgzXHUzMDAyCi1NRU5VVGFnSW5mbz1cdTViOWFcdTRlNDlcdTgzZGNcdTUzNTVcdTUyMTdcdTg4NjgKLU1FVEFUYWdJbmZvPVx1NGUzYVx1NjU4N1x1Njg2M1x1NWI5YVx1NGU0OVx1NTE0M1x1NjU3MFx1NjM2ZVx1NGZlMVx1NjA2ZgotTk9CUlRhZ0luZm89XHU4OTg2XHU3NmQ2XHU1ZTc2XHU5NjMyXHU2YjYyXHU2MzYyXHU4ODRjXHUzMDAyVzNDIEhUTUwgNC4wMSBcdTRlMGRcdTY1MmZcdTYzMDFcdTViODNcdTMwMDIKLU5PRlJBTUVTVGFnSW5mbz1cdTgyZTVcdTVmNTNcdTUyNGRcdTZkNGZcdTg5YzhcdTU2NjhcdTRlMGRcdTY1MmZcdTYzMDFcdTY4NDZcdTY3YjZcdWZmMGNcdTYzZDBcdTRmOWJcdTY2M2VcdTc5M2FcdTc2ODRcdTRmZTFcdTYwNmYKLU5PU0NSSVBUVGFnSW5mbz1cdTgyZTVcdTVmNTNcdTUyNGRcdTZkNGZcdTg5YzhcdTU2NjhcdTRlMGRcdTY1MmZcdTYzMDFcdTgxMWFcdTY3MmNcdTdmMTZcdTUyMzZcdWZmMGNcdTYzZDBcdTRmOWJcdTY2M2VcdTc5M2FcdTc2ODRcdTRmZTFcdTYwNmYKLU9CSkVDVFRhZ0luZm89XHU1YjlhXHU0ZTQ5XHU0ZTAwXHU4MjJjXHU1ZDRjXHU1MTY1XHU1ZjBmXHU1YmY5XHU4YzYxCi1PTFRhZ0luZm89XHU2NzA5XHU1ZThmXHU1MjE3XHU4ODY4Ci1PUFRHUk9VUFRhZ0luZm89XHU5MDA5XHU5ODc5XHU3ZWM0Ci1PUFRJT05UYWdJbmZvPVx1NTNlZlx1OTAwOVx1NjJlOVx1NzY4NFx1OTAwOVx1OTg3OQotUFRhZ0luZm89XHU2YmI1XHU4NDNkCi1QQVJBTVRhZ0luZm89XHU1ZGYyXHU1NDdkXHU1NDBkXHU3Njg0XHU1YzVlXHU2MDI3XHU1MDNjCi1QUkVUYWdJbmZvPVx1OTg4NFx1NTE0OFx1NjgzY1x1NWYwZlx1NTMxNlx1NzY4NFx1NjU4N1x1NjcyYwotUVRhZ0luZm89XHU3N2VkXHU3Njg0XHU3NmY0XHU2M2E1XHU2M2QyXHU1MTY1XHU3Njg0XHU1ZjE1XHU3NTI4Ci1TVGFnSW5mbz1cdTc1MjhcdTUyMjBcdTk2NjRcdTdlYmZcdTY4MzdcdTVmMGZcdTY2M2VcdTc5M2FcdTY1ODdcdTY3MmMKLVNBTVBUYWdJbmZvPVx1NjgzN1x1NjcyY1x1N2EwYlx1NWU4Zlx1OGY5M1x1NTFmYVx1NTQ4Y1x1ODExYVx1NjcyY1x1N2I0OVx1N2I0OVx1MzAwMlx1NzUyOFx1N2I0OVx1NWJiZFx1NWI1N1x1NGY1M1x1NjYzZVx1NzkzYVx1MzAwMgotU0NSSVBUVGFnSW5mbz1cdTgxMWFcdTY3MmNcdThiZWRcdTUzZTUKLVNFTEVDVFRhZ0luZm89XHU5MDA5XHU5ODc5XHU5MDA5XHU2MmU5XHU1NjY4Ci1TTUFMTFRhZ0luZm89XHU3NTI4XHU1YzBmXHU1YjU3XHU0ZjUzXHU2NjNlXHU3OTNhXHU2NTg3XHU2NzJjCi1TUEFOVGFnSW5mbz1cdTRlMDBcdTRlMmFcdTRlMDBcdTgyMmNcdTViYjlcdTU2NjhcdWZmMGNcdTUzZWZcdTc1MjhcdTRlOGVcdTRlM2FcdTUxODVcdTViYjlcdTViOWFcdTRlNDlcdThiZWRcdThhMDBcdTYyMTZcdTY4MzdcdTVmMGYKLVNUUklLRVRhZ0luZm89XHU3NTI4XHU1MjIwXHU5NjY0XHU3ZWJmXHU2ODM3XHU1ZjBmXHU2NjNlXHU3OTNhXHU2NTg3XHU2NzJjCi1TVFJPTkdUYWdJbmZvPVx1NGVlNVx1NzI3OVx1NTIyYlx1NWYzYVx1OGMwM1x1NjViOVx1NWYwZlx1ZmYwOFx1OTAxYVx1NWUzOFx1OTFjN1x1NzUyOFx1N2M5N1x1NGY1M1x1NWI1N1x1ZmYwOVx1Njc2NVx1NjYzZVx1NzkzYVx1NjU4N1x1NjcyYwotU1RZTEVUYWdJbmZvPVx1NGUzYVx1NTMwNVx1NTQyYlx1NzY4NFx1NGZlMVx1NjA2Zlx1NWI5YVx1NGU0OVx1NjgzN1x1NWYwZgotU1VCVGFnSW5mbz1cdTY2M2VcdTc5M2FcdTRlM2FcdTRlMGJcdTY4MDcKLVNVUFRhZ0luZm89XHU2NjNlXHU3OTNhXHU0ZTNhXHU0ZTBhXHU2ODA3Ci1UQUJMRVRhZ0luZm89XHU1YjlhXHU0ZTQ5XHU4ODY4Ci1UQk9EWVRhZ0luZm89XHU4ODY4XHU3Njg0XHU0ZTNiXHU0ZjUzCi1URFRhZ0luZm89XHU4ODY4XHU0ZTJkXHU3Njg0XHU1MzU1XHU1MTQzCi1URVhUQVJFQVRhZ0luZm89XHU1OTFhXHU4ODRjXHU2NTg3XHU2NzJjXHU1YjU3XHU2YmI1Ci1URk9PVFRhZ0luZm89XHU4ODY4XHU5ODc1XHU4MTFhCi1USFRhZ0luZm89XHU4ODY4XHU5ODc1XHU3NzA5XHU1MzU1XHU1MTQzCi1USEVBRFRhZ0luZm89XHU4ODY4XHU5ODc1XHU3NzA5Ci1USVRMRVRhZ0luZm89XHU2NjNlXHU3OTNhXHU1NzI4XHU2ZDRmXHU4OWM4XHU1NjY4XHU3Njg0XHU2ODA3XHU5ODk4XHU2ODBmXHU0ZTJkXHU3Njg0XHU2NTg3XHU2ODYzXHU2ODA3XHU5ODk4Ci1UUlRhZ0luZm89XHU4ODY4XHU4ODRjCi1UVFRhZ0luZm89XHU0ZWU1XHU3NTM1XHU0ZjIwXHU2MjUzXHU1YjU3XHU2NzNhXHU2MjE2XHU3YjQ5XHU1YmJkXHU2NTg3XHU2NzJjXHU2ODM3XHU1ZjBmXHU2NzY1XHU2NjNlXHU3OTNhXHU2NTg3XHU2NzJjCi1VVGFnSW5mbz1cdTRlZTVcdTUyYTBcdTRlMGJcdTUyMTJcdTdlYmZcdTc2ODRcdTY1YjlcdTVmMGZcdTY3NjVcdTY2M2VcdTc5M2FcdTY1ODdcdTY3MmMKLVVMVGFnSW5mbz1cdTY1ZTBcdTVlOGZcdTUyMTdcdTg4NjgKLVZBUlRhZ0luZm89XHU1M2Q4XHU5MWNmXHU2MjE2XHU3YTBiXHU1ZThmXHU4MWVhXHU1M2Q4XHU5MWNmXHU3Njg0XHU1YjllXHU0ZjhiCi1XQlJUYWdJbmZvPTxCPiZsdDtOT0JSJmd0OzwvQj4gXHU2ODA3XHU4YmIwXHU0ZTJkXHU1MTQxXHU4YmI4XHU2MzYyXHU4ODRjXHUzMDAyVzNDIEhUTUwgNC4wMSBcdTRlMGRcdTY1MmZcdTYzMDFcdTViODNcdTMwMDIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZl96aF9UVy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDQ1ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQVRhZ0luZm89XHU1OTgyXHU2NzljXHU1MWZhXHU3M2ZlIGhyZWYgXHU1YzZjXHU2MDI3XHU3Njg0XHU4YTcxXHVmZjBjXHU1MjQ3XHU3MGJhXHU0ZTAwXHU1MDBiXHU5M2M4XHU3ZDUwXHVmZjFiXHU1OTgyXHU2NzljXHU1MWZhXHU3M2ZlIG5hbWUgXHU1YzZjXHU2MDI3XHU3Njg0XHU4YTcxXHVmZjBjXHU1MjQ3XHU3MGJhXHU0ZTAwXHU1MDBiXHU5M2M4XHU3ZDUwXHU3NmVlXHU2YTE5Ci1BQkJSVGFnSW5mbz1cdTdlMmVcdTViZWJcdWZmMDhcdTU5ODIgV1dXXHUzMDAxSFRUUFx1ZmYwOQotQUNST05ZTVRhZ0luZm89XHU1YjU3XHU5OTk2XHU4YTllXHVmZjA4XHU1OTgyIFNDVUJBXHVmZjA5Ci1BRERSRVNTVGFnSW5mbz1cdTk4MDFcdTk3NjJcdTRmNWNcdTgwMDVcdTc2ODRcdTRmNGRcdTU3NDBcdThjYzdcdThhMGEKLUFQUExFVFRhZ0luZm89SmF2YSBBcHBsZXQKLUFSRUFUYWdJbmZvPVx1NWI5YVx1N2ZhOVx1NzUyOFx1NjIzNlx1N2FlZlx1NWY3MVx1NTBjZlx1OTNjOFx1N2Q1MFx1NTcxNlx1NTM0MAotQlRhZ0luZm89XHU3NTI4XHU3Yzk3XHU5YWQ0XHU1YjU3XHU5ODZmXHU3OTNhXHU1MTY3XHU1NDJiXHU3Njg0XHU2NTg3XHU1YjU3Ci1CQVNFVGFnSW5mbz1cdThhMDhcdTdiOTdcdTc2ZjhcdTVjMGRcdThkZWZcdTVmOTFcdTY2NDJcdTg5ODFcdTc1MjhcdTc2ODRcdTk4MDFcdTk3NjJcdTU3ZmFcdTc5MGUgVVJJCi1CQVNFRk9OVFRhZ0luZm89XHU5ODAxXHU5NzYyXHU1N2ZhXHU3OTBlXHU1YjU3XHU1NzhiXHU1OTI3XHU1YzBmCi1CRE9UYWdJbmZvPVx1N2Y2ZVx1NjNkYlx1OTgxMFx1OGEyZFx1OTZkOVx1NTQxMVx1OTg2Zlx1NzkzYVx1MzAwMlx1NGY5Ylx1OTZkOVx1NTQxMVx1OGE5ZVx1OGEwMFx1NGY3Zlx1NzUyOFx1MzAwMgotQklHVGFnSW5mbz1cdTc1MjhcdTU5MjdcdTViNTdcdTU3OGJcdTk4NmZcdTc5M2FcdTUxNjdcdTU0MmJcdTc2ODRcdTY1ODdcdTViNTcKLUJHU09VTkRUYWdJbmZvPVx1NWI5YVx1N2ZhOVx1OTgwMVx1OTc2Mlx1NzY4NFx1OTdmM1x1NjU0OFx1NmE5NFx1MzAwMlx1NGUwZFx1NTNkNyBXM0MgSFRNTCA0LjAxIFx1NjUyZlx1NjNmNFx1MzAwMgotQkxJTktUYWdJbmZvPVx1NzUyOFx1OTU4M1x1NzIwZFx1NjViOVx1NWYwZlx1OTg2Zlx1NzkzYVx1NjU4N1x1NWI1N1x1MzAwMlx1NGUwZFx1NTNkNyBXM0MgSFRNTCA0LjAxIFx1NjUyZlx1NjNmNFx1MzAwMgotQkxPQ0tRVU9URVRhZ0luZm89XHU0ZTBkXHU5NTc3XHU3Njg0XHU1ZjE1XHU2NTg3Ci1CT0RZVGFnSW5mbz1cdTY1ODdcdTRlZjZcdTRlM2JcdTlhZDRcdTMwMDJcdTU0MmJcdTY3MDlcdTk4MDFcdTk3NjJcdTc2ODRcdTYyNDBcdTY3MDlcdTUxNjdcdTViYjlcdTMwMDIKLUJSVGFnSW5mbz1cdTVmMzdcdTUyMzZcdTYzZGJcdTg4NGMKLUJVVFRPTlRhZ0luZm89XHU1YjlhXHU3ZmE5XHU2MzA5XHU5MjE1Ci1DQVBUSU9OVGFnSW5mbz1cdTViOWFcdTdmYTlcdTg4NjhcdTY4M2NcdTZhMTlcdTk4NGMKLUNFTlRFUlRhZ0luZm89XHU3ZjZlXHU0ZTJkXHU1YzBkXHU5ZjRhXHU5ODZmXHU3OTNhXHU1MTY3XHU1NDJiXHU3Njg0XHU2NTg3XHU1YjU3XHUzMDAyXHU3NmY4XHU3NTc2XHU2NWJjIGFsaWduPWNlbnRlciBcdTc2ODQgRElWXHUzMDAyCi1DSVRFVGFnSW5mbz1cdTVmMTVcdTc1MjgKLUNPREVUYWdJbmZvPVx1OGEwOFx1N2I5N1x1NmE1Zlx1NzhiY1x1NzI0N1x1NmJiNQotQ09MVGFnSW5mbz1cdTg4NjhcdTY4M2NcdTc2ZjRcdTZiMDQKLUNPTEdST1VQVGFnSW5mbz1cdTg4NjhcdTY4M2NcdTc2ZjRcdTZiMDRcdTdmYTRcdTdkNDQKLUREVGFnSW5mbz1cdTViOWFcdTdmYTlcdTYyMTZcdThhYWFcdTY2MGVcdTZlMDVcdTU1YWVcdTRlMmRcdTc2ODRcdTViOWFcdTdmYTlcdTYyMTZcdThhYWFcdTY2MGUKLURFTFRhZ0luZm89XHU1YzA3XHU2NTg3XHU1YjU3XHU5ODZmXHU3OTNhXHU3MGJhXHU1ZGYyXHU1MjJhXHU5NjY0Ci1ERk5UYWdJbmZvPVx1NWI5YVx1N2ZhOQotRElSVGFnSW5mbz1cdTc2ZWVcdTkzMDRcdTZlMDVcdTU1YWUKLURJVlRhZ0luZm89XHU1M2VmXHU3NTI4XHU0Zjg2XHU1YjlhXHU3ZmE5XHU1MTY3XHU1YmI5XHU4YTllXHU4YTAwXHU2MjE2XHU2YTIzXHU1ZjBmXHU3Njg0XHU5MDFhXHU3NTI4XHU1MTMyXHU1YjU4XHU1NjY4XHUzMDAyCi1ETFRhZ0luZm89XHU1YjlhXHU3ZmE5XHU2MjE2XHU4YWFhXHU2NjBlXHU2ZTA1XHU1NWFlCi1EVFRhZ0luZm89XHU1YjlhXHU3ZmE5XHU2MjE2XHU4YWFhXHU2NjBlXHU2ZTA1XHU1NWFlXHU0ZTJkXHU3Njg0XHU4YTVlXHU1ZjU5XHU2MjE2XHU0ZTNiXHU5ODRjCi1FTVRhZ0luZm89XHU1ZjM3XHU4YWJmXHU5ODZmXHU3OTNhXHU2NTg3XHU1YjU3XHVmZjA4XHU5MDFhXHU1ZTM4XHU2NjJmXHU2NTljXHU5YWQ0XHVmZjA5Ci1FTUJFRFRhZ0luZm89XHU1YjlhXHU3ZmE5XHU1MTY3XHU1ZDRjXHU1OTE2XHU2MzliXHU3YTBiXHU1ZjBmXHUzMDAyXHU0ZTBkXHU1M2Q3IFczQyBIVE1MIDQuMDEgXHU2NTJmXHU2M2Y0XHUzMDAyCi1GSUVMRFNFVFRhZ0luZm89XHU1YjlhXHU3ZmE5XHU4ODY4XHU1NWFlXHU2M2E3XHU1MjM2XHU5ODA1XHU3ZmE0XHU3ZDQ0Ci1GT05UVGFnSW5mbz1cdTRlZTVcdTdkNjZcdTViOWFcdTc2ODRcdTViNTdcdTU3OGJcdTRmODZcdTk4NmZcdTc5M2FcdTY1ODdcdTViNTcKLUZPUk1UYWdJbmZvPVx1NWI5YVx1N2ZhOVx1NGU5Mlx1NTJkNVx1NWYwZlx1ODg2OFx1NTVhZQotRlJBTUVUYWdJbmZvPVx1NWI5YVx1N2ZhOVx1NzNmZVx1ODg0Y1x1ODk5Nlx1N2E5N1x1NTE2N1x1NzY4NFx1OTgwMVx1Njg0NgotRlJBTUVTRVRUYWdJbmZvPVx1NWI5YVx1N2ZhOVx1NTIwNlx1NTI3Mlx1ODk5Nlx1N2E5N1x1NzY4NFx1OTgwMVx1Njg0Nlx1N2Q0NAotSDFUYWdJbmZvPVx1NjcwMFx1NGUwYVx1NWM2NFx1NmExOVx1OTg0YwotSDJUYWdJbmZvPVx1N2IyY1x1NGU4Y1x1NWM2NFx1NmExOVx1OTg0YwotSDNUYWdJbmZvPVx1N2IyY1x1NGUwOVx1NWM2NFx1NmExOVx1OTg0YwotSDRUYWdJbmZvPVx1N2IyY1x1NTZkYlx1NWM2NFx1NmExOVx1OTg0YwotSDVUYWdJbmZvPVx1N2IyY1x1NGU5NFx1NWM2NFx1NmExOVx1OTg0YwotSDZUYWdJbmZvPVx1N2IyY1x1NTE2ZFx1NWM2NFx1NmExOVx1OTg0YwotSEVBRFRhZ0luZm89XHU1NDJiXHU2NzA5XHU2NTg3XHU0ZWY2XHU3Njg0IE1ldGEgXHU4Y2M3XHU2NTk5XHU1NDhjXHU4OTk2XHU3YTk3XHU2YTE5XHU5ODRjXHU4Y2M3XHU4YTBhCi1IUlRhZ0luZm89XHU2YzM0XHU1ZTczXHU1YzNhXHU4OThmCi1IVE1MVGFnSW5mbz1cdTY1ODdcdTRlZjZcdTc2ODRcdTY4MzlcdTUxNDNcdTdkMjBcdTMwMDIKLUlUYWdJbmZvPVx1NzUyOFx1NjU5Y1x1OWFkNFx1OTg2Zlx1NzkzYVx1NjU4N1x1NWI1NwotSUZSQU1FVGFnSW5mbz1cdTViOWFcdTdmYTlcdTUyMTdcdTUxNjVcdTViNTBcdTg5OTZcdTdhOTcKLUlNR1RhZ0luZm89XHU1YzA3XHU1M2MzXHU3MTY3XHU3Njg0XHU1ZjcxXHU1MGNmXHU5ODZmXHU3OTNhXHU2MjEwXHU1MTY3XHU1ZDRjXHU1MTY3XHU1YmI5Ci1JTlBVVFRhZ0luZm89XHU1YjlhXHU3ZmE5XHU0ZjdmXHU3NTI4XHU4MDA1XHU4ZjM4XHU1MTY1XHU3Njg0XHU4ODY4XHU1NWFlXHU2M2E3XHU1MjM2Ci1JTlNUYWdJbmZvPVx1NWI5YVx1N2ZhOVx1NjNkMlx1NTE2NVx1NzY4NFx1NjU4N1x1NWI1NwotSVNJTkRFWFRhZ0luZm89XHU1YjlhXHU3ZmE5XHU1NWFlXHU4ODRjXHU2M2QwXHU3OTNhCi1LQkRUYWdJbmZvPVx1NWI5YVx1N2ZhOVx1NGY3Zlx1NzUyOFx1ODAwNVx1ODk4MVx1OGYzOFx1NTE2NVx1NzY4NFx1NjU4N1x1NWI1NwotTEFCRUxUYWdJbmZvPVx1NWI5YVx1N2ZhOVx1ODg2OFx1NTVhZVx1NmIwNFx1NGY0ZFx1NzY4NFx1NmExOVx1N2M2NAotTEVHRU5EVGFnSW5mbz1cdTViOWFcdTdmYTlcdTRlMDBcdTdkNDRcdTg4NjhcdTU1YWVcdTZiMDRcdTRmNGRcdTc2ODRcdTZhMTlcdTdjNjQKLUxJVGFnSW5mbz1cdTViOWFcdTdmYTlcdTZlMDVcdTU1YWVcdTUxNjdcdTc2ODRcdTZlMDVcdTU1YWVcdTk4MDVcdTc2ZWUKLUxJTktUYWdJbmZvPVx1NWE5Mlx1OWFkNFx1NzM2OFx1N2FjYlx1OTNjOFx1N2Q1MAotTUFQVGFnSW5mbz1cdTViOWFcdTdmYTlcdTc1MjhcdTYyMzZcdTdhZWZcdTVmNzFcdTUwY2ZcdTkzYzhcdTdkNTBcdTU3MTYKLU1BUlFVRUVUYWdJbmZvPVx1NzUyOFx1NjM3Mlx1NTJkNVx1NjViOVx1NWYwZlx1OTg2Zlx1NzkzYVx1NjU4N1x1NWI1N1x1MzAwMlx1NGUwZFx1NTNkNyBXM0MgSFRNTCA0LjAxIFx1NjUyZlx1NjNmNFx1MzAwMgotTUVOVVRhZ0luZm89XHU1YjlhXHU3ZmE5XHU1MjlmXHU4MGZkXHU4ODY4XHU2ZTA1XHU1NWFlCi1NRVRBVGFnSW5mbz1cdTViOWFcdTdmYTlcdTY1ODdcdTRlZjZcdTc2ODQgTWV0YSBcdThjYzdcdTY1OTlcdThjYzdcdThhMGEKLU5PQlJUYWdJbmZvPVx1N2Y2ZVx1NjNkYlx1NTQ4Y1x1OTYzMlx1NmI2Mlx1NjNkYlx1ODg0Y1x1MzAwMlx1NGUwZFx1NTNkNyBXM0MgSFRNTCA0LjAxIFx1NjUyZlx1NjNmNFx1MzAwMgotTk9GUkFNRVNUYWdJbmZvPVx1NjNkMFx1NGY5Ylx1NzNmZVx1ODg0Y1x1NzAwZlx1ODliZFx1NTY2OFx1NGUwZFx1NjUyZlx1NjNmNFx1OTgwMVx1Njg0Nlx1NjY0Mlx1ZmYwY1x1NjI0MFx1OTg2Zlx1NzkzYVx1NzY4NFx1OGNjN1x1OGEwYQotTk9TQ1JJUFRUYWdJbmZvPVx1NjNkMFx1NGY5Ylx1NzNmZVx1ODg0Y1x1NzAwZlx1ODliZFx1NTY2OFx1NGUwZFx1NjUyZlx1NjNmNCBTY3JpcHRpbmcgXHU2NjQyXHVmZjBjXHU2MjQwXHU5ODZmXHU3OTNhXHU3Njg0XHU4Y2M3XHU4YTBhCi1PQkpFQ1RUYWdJbmZvPVx1NWI5YVx1N2ZhOVx1OTAxYVx1NzUyOFx1NTE2N1x1NWQ0Y1x1NzI2OVx1NGVmNgotT0xUYWdJbmZvPVx1NjM5Mlx1NWU4Zlx1NmUwNVx1NTVhZQotT1BUR1JPVVBUYWdJbmZvPVx1OTA3OFx1OTgwNVx1N2ZhNFx1N2Q0NAotT1BUSU9OVGFnSW5mbz1cdTUzZWZcdTkwNzhcdTUzZDZcdTc2ODRcdTkwNzhcdTk4MDUKLVBUYWdJbmZvPVx1NmJiNVx1ODQzZAotUEFSQU1UYWdJbmZvPVx1NTE3N1x1NTQwZFx1NTE2N1x1NWJiOVx1NTAzYwotUFJFVGFnSW5mbz1cdTk4MTBcdTUxNDhcdTY4M2NcdTVmMGZcdTUzMTZcdTc2ODRcdTY1ODdcdTViNTcKLVFUYWdJbmZvPVx1NzdlZFx1NzY4NFx1NTIxN1x1NTE2NVx1NWYxNVx1NjU4NwotU1RhZ0luZm89XHU3NTI4IHN0cmlrZS10aHJvdWdoIFx1NmEyM1x1NWYwZlx1OTg2Zlx1NzkzYVx1NjU4N1x1NWI1NwotU0FNUFRhZ0luZm89XHU3YmM0XHU0ZjhiXHU3YTBiXHU1ZjBmXHU4ZjM4XHU1MWZhXHUzMDAxU2NyaXB0IFx1N2I0OVx1MzAwMlx1NzUyOFx1NTVhZVx1OGRkZFx1NWI1N1x1NTc4Ylx1OTg2Zlx1NzkzYVx1MzAwMgotU0NSSVBUVGFnSW5mbz1TY3JpcHQgXHU5NjczXHU4ZmYwXHU1ZjBmCi1TRUxFQ1RUYWdJbmZvPVx1OTA3OFx1OTgwNVx1OTA3OFx1NTNkNlx1NTE0MwotU01BTExUYWdJbmZvPVx1NzUyOFx1NWMwZlx1NWI1N1x1NTc4Ylx1OTg2Zlx1NzkzYVx1NjU4N1x1NWI1NwotU1BBTlRhZ0luZm89XHU1M2VmXHU3NTI4XHU0Zjg2XHU1YjlhXHU3ZmE5XHU1MTY3XHU1YmI5XHU4YTllXHU4YTAwXHU2MjE2XHU2YTIzXHU1ZjBmXHU3Njg0XHU5MDFhXHU3NTI4XHU1MTMyXHU1YjU4XHU1NjY4XHUzMDAyCi1TVFJJS0VUYWdJbmZvPVx1NzUyOCBzdHJpa2UtdGhyb3VnaCBcdTZhMjNcdTVmMGZcdTk4NmZcdTc5M2FcdTY1ODdcdTViNTcKLVNUUk9OR1RhZ0luZm89XHU3Mjc5XHU1MjI1XHU1ZjM3XHU4YWJmXHU5ODZmXHU3OTNhXHU2NTg3XHU1YjU3XHVmZjA4XHU5MDFhXHU1ZTM4XHU2NjJmXHU3Yzk3XHU5YWQ0XHVmZjA5Ci1TVFlMRVRhZ0luZm89XHU1YjlhXHU3ZmE5XHU1MTY3XHU1NDJiXHU4Y2M3XHU4YTBhXHU3Njg0XHU2YTIzXHU1ZjBmCi1TVUJUYWdJbmZvPVx1OTg2Zlx1NzkzYVx1NjIxMFx1NGUwYlx1NmExOQotU1VQVGFnSW5mbz1cdTk4NmZcdTc5M2FcdTYyMTBcdTRlMGFcdTZhMTkKLVRBQkxFVGFnSW5mbz1cdTViOWFcdTdmYTlcdTg4NjhcdTY4M2MKLVRCT0RZVGFnSW5mbz1cdTg4NjhcdTY4M2NcdTRlM2JcdTlhZDQKLVREVGFnSW5mbz1cdTg4NjhcdTY4M2NcdTUxNjdcdTc2ODRcdThjYzdcdTY1OTlcdTY4M2MKLVRFWFRBUkVBVGFnSW5mbz1cdTU5MWFcdTg4NGNcdTY1ODdcdTViNTdcdTZiMDRcdTRmNGQKLVRGT09UVGFnSW5mbz1cdTg4NjhcdTY4M2NcdTZhMTlcdTVlOTUKLVRIVGFnSW5mbz1cdTg4NjhcdTY4M2NcdTZhMTlcdTk4MmRcdThjYzdcdTY1OTlcdTY4M2MKLVRIRUFEVGFnSW5mbz1cdTg4NjhcdTY4M2NcdTZhMTlcdTk4MmQKLVRJVExFVGFnSW5mbz1cdTk4NmZcdTc5M2FcdTU3MjhcdTcwMGZcdTg5YmRcdTU2NjhcdTZhMTlcdTk4NGNcdTUyMTdcdTc2ODRcdTY1ODdcdTRlZjZcdTZhMTlcdTk4NGMKLVRSVGFnSW5mbz1cdTg4NjhcdTY4M2NcdTUyMTcKLVRUVGFnSW5mbz1cdTc1MjhcdTYyNTNcdTViNTdcdTZhNWZcdTViNTdcdTlhZDRcdTYyMTZcdTU1YWVcdThkZGRcdTY1ODdcdTViNTdcdTZhMjNcdTVmMGZcdTRmODZcdTk4NmZcdTc5M2FcdTY1ODdcdTViNTcKLVVUYWdJbmZvPVx1NzUyOFx1OTY0NFx1NTJhMFx1NWU5NVx1N2RkYVx1NGY4Nlx1OTg2Zlx1NzkzYVx1NjU4N1x1NWI1NwotVUxUYWdJbmZvPVx1OTc1ZVx1NjM5Mlx1NWU4Zlx1NmUwNVx1NTVhZQotVkFSVGFnSW5mbz1cdThiOGFcdTY1NzhcdTYyMTZcdTdhMGJcdTVmMGZcdTVmMTVcdTY1NzhcdTc2ODRcdTViZTZcdTRmOGIKLVdCUlRhZ0luZm89XHU1MTQxXHU4YTMxXHU1NzI4IDxCPiZsdDtOT0JSJmd0OzwvQj4gXHU2YTE5XHU3OTNhXHU1MTY3XHU2M2RiXHU4ODRjXHUzMDAyXHU0ZTBkXHU1M2Q3IFczQyBIVE1MIDQuMDEgXHU2NTJmXHU2M2Y0XHUzMDAyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTc1ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBIVE1MIE1vZGVsCi1ubEZlYXR1cmVOYW1lPVN0cnVjdHVyZWQgU291cmNlIEhUTUwgTW9kZWwgTkwgU3VwcG9ydAotU3RydWN0dXJlZF9IVE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBIVE1MIERvY3VtZW50IEZhY3RvcnkgRXh0ZW5zaW9uCi1IVE1MX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUhUTUwgQ29udGVudCBUeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGU4MTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZSIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9Imh0bWxtb2RlbC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZyIvPgotICAgPC9yZXF1aXJlcz4KLQotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0gICAgICA8bW9kZWxIYW5kbGVyCi0gICAgICAgICAgICBkZWZhdWx0PSJubyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JIVE1MIgotICAgICAgICAgICAgYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVsaGFuZGxlciI+Ci0gICAgICA8L21vZGVsSGFuZGxlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5lbWJlZGRlZFR5cGVIYW5kbGVyIj4KLSAgICAgIDxlbWJlZGRlZFR5cGVIYW5kbGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbGhhbmRsZXIuRW1iZWRkZWRIVE1MIj4KLSAgICAgIDwvZW1iZWRkZWRUeXBlSGFuZGxlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuaHRtbC5jb3JlLmJ1aWxkZXJkZWxlZ2F0ZS50b2RvIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyZGVsZWdhdGUiPgotICAgICAgPHBhcnRpY2lwYW50Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmJ1aWxkZXIuZGVsZWdhdGVzLlhNTFRhc2tUYWdTZWVrZXIiCi0gICAgICAgICAgICBjb250ZW50VHlwZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLSAgICAgIDwvcGFydGljaXBhbnQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzIgotICAgICAgICAgbmFtZT0iJVN0cnVjdHVyZWRfSFRNTF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbW1lbnRFbGVtZW50SGFuZGxlciI+Ci0gICAgICA8aGFuZGxlci1jdXN0b20KLSAgICAgICAgICAgIGNvbW1lbnR0eXBlPSJ4bWwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb21tZW50ZWxlbWVudC5oYW5kbGVycy5Db21tZW50RWxlbWVudEhhbmRsZXJGb3JTU0kiPgotICAgICAgICAgPHN0YXJ0d2l0aAotICAgICAgICAgICAgICAgcHJlZml4PSIjIj4KLSAgICAgICAgIDwvc3RhcnR3aXRoPgotICAgICAgPC9oYW5kbGVyLWN1c3RvbT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0iaHRtbCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249Imh0bSI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249InhodG1sIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0iaHRwbCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249IndtbCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249InNodG1sIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0ic2h0bSI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXRQcm9jZXNzb3JzIj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCIKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSBFeHRlbnNpb24gcG9pbnQgZm9yIHRhZ2hlbHAgZG9jdW1lbnRhdGlvbiAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uRmlsZXMiPgotICAgICAgPGFubm90YXRpb25GaWxlCi0gICAgICAgICAgICBsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIj4KLSAgICAgIDwvYW5ub3RhdGlvbkZpbGU+Ci0gICAgICA8YW5ub3RhdGlvbkZpbGUKLSAgICAgICAgICAgIGxvY2F0aW9uPSJkYXRhL2h0bXJlZi54bWwiCi0gICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iPgotICAgICAgPC9hbm5vdGF0aW9uRmlsZT4KLSAgICAgIDxhbm5vdGF0aW9uRmlsZQotICAgICAgICAgICAgbG9jYXRpb249ImRhdGEvaHRtcmVmLnhtbCIKLSAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOIj4KLSAgICAgIDwvYW5ub3RhdGlvbkZpbGU+Ci0gICAgICA8YW5ub3RhdGlvbkZpbGUKLSAgICAgICAgICAgIGxvY2F0aW9uPSJkYXRhL2h0bXJlZi54bWwiCi0gICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiI+Ci0gICAgICA8L2Fubm90YXRpb25GaWxlPgotICAgICAgPGFubm90YXRpb25GaWxlCi0gICAgICAgICAgICBsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iPgotICAgICAgPC9hbm5vdGF0aW9uRmlsZT4KLSAgICAgIDxhbm5vdGF0aW9uRmlsZQotICAgICAgICAgICAgbG9jYXRpb249ImRhdGEvaHRtcmVmLnhtbCIKLSAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIj4KLSAgICAgIDwvYW5ub3RhdGlvbkZpbGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgICAgICAgIDxjb250ZW50LXR5cGUKLSAgICAgICAgICAgICAgIGZpbGUtZXh0ZW5zaW9ucz0iaHRtbCxodG0seGh0bWwsaHRwbCx3bWwsc2h0bWwsc2h0bSIKLSAgICAgICAgICAgICAgIHByaW9yaXR5PSJoaWdoIgotICAgICAgICAgICAgICAgbmFtZT0iJUhUTUxfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0gICAgICAgICAgICAgICBpZD0iaHRtbHNvdXJjZSIKLSAgICAgICAgICAgICAgIGJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiPgotCQkJPCEtLSBub3RlOiBubyBkZWZhdWx0LWNoYXJzZXQgZm9yIEhUTUwsIHNob3VsZCB1c2UgJ3BsYXRmb3JtJyAtLT4KLQkJCTxkZXNjcmliZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvckhUTUwiLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50VHlwZXMiPgotICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9Imh0bWwiCi0gICAgICAgICAgICBkaXNwbGF5TmFtZT0iWEhUTUwgMS4wIFN0cmljdCIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgIGlzWEhUTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci0gICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgIDxkb2N1bWVudFR5cGUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lPSJodG1sIgotICAgICAgICAgICAgZGlzcGxheU5hbWU9IlhIVE1MIDEuMCBUcmFuc2l0aW9uYWwiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAgICAgZGVmYXVsdFhIVE1MPSJ0cnVlIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotICAgICAgPC9kb2N1bWVudFR5cGU+Ci0gICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSJYSFRNTCAxLjAgRnJhbWVzZXQiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9InRydWUiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIKLSAgICAgICAgICAgIHN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQiPgotICAgICAgPC9kb2N1bWVudFR5cGU+Ci0gICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSJYSFRNTCBCYXNpYyAxLjAiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMC8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtYmFzaWMveGh0bWwtYmFzaWMxMC5kdGQiPgotICAgICAgPC9kb2N1bWVudFR5cGU+Ci0gICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSJYSFRNTCAxLjEiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotICAgICAgPC9kb2N1bWVudFR5cGU+Ci0gICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSJYSFRNTCBNUCAxLjAiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLmR0ZCI+Ci0gICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgIDxkb2N1bWVudFR5cGUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lPSJ3bWwiCi0gICAgICAgICAgICBkaXNwbGF5TmFtZT0iV01MIDEuMyIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iIgotICAgICAgICAgICAgaXNXTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vV0FQRk9SVU0vL0RURCBXTUwgMS4zLy9FTiIKLSAgICAgICAgICAgIGRlZmF1bHRXTUw9InRydWUiCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbDEzLmR0ZCI+Ci0gICAgICA8L2RvY3VtZW50VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvSFRNTDQwTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvSFRNTDQwTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTQ4NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL0hUTUw0ME5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL0hUTUxDTVByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9IVE1MQ01Qcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDQ3MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL0hUTUxDTVByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7Ci0KLQotLyoqCi0gKiBIVE1MQ01Qcm9wZXJ0aWVzIGRlZmluZXMgYWxsIHByb3BlcnR5IG5hbWVzIGFuZCBwcmUtZGVmaW5lZCB2YWx1ZXMgaW4gSFRNTCBDTS4KLSAqIEFsbCBvZiB0aG9zZSBwcm9wZXJ0aWVzIGNhbiBiZSByZXRyZWl2ZWQgZnJvbSBlbGVtZW50IGRlY2xhcmF0aW9ucyBvZiBIVE1MIENNCi0gKiB2aWEgQ01Ob2RlI2dldFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTENNUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiAic2hvdWxkSWdub3JlQ2FzZSIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPVUxEX0lHTk9SRV9DQVNFID0gInNob3VsZElnbm9yZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAic2hvdWxkS2VlcFNwYWNlIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9VTERfS0VFUF9TUEFDRSA9ICJzaG91bGRLZWVwU3BhY2UiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaW5kZW50Q2hpbGRTb3VyY2UiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9JTkRFTlRfQ0hJTERfU09VUkNFID0gInNob3VsZEluZGVudENoaWxkU291cmNlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogInRlcm1pbmF0b3JzIiByZXR1cm5zIGphdmEudXRpbC5JdGVyYXRvciAoYW4gYXJyYXkgb2YgU3RyaW5nIG9iamVjdHMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1JTkFUT1JTID0gInRlcm1pbmF0b3JzIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImNvbnRlbnRIaW50IiByZXR1cm5zIENNRWxlbWVudERlY2xhcmF0aW9uIGluc3RuYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSElOVCA9ICJjb250ZW50SGludCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJwcm9oaWJpdGVkQW5jZXN0b3JzIiByZXR1cm5zIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0hJQklURURfQU5DRVNUT1JTID0gInByb2hpYml0ZWRBbmNlc3RvcnMiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaXNKU1AiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0pTUCA9ICJpc0pTUCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpc1hIVE1MIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19YSFRNTCA9ICJpc1hIVE1MIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImlzU1NJIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19TU0kgPSAiaXNTU0kiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAibGluZUJyZWFrSGludCIgcmV0dXJucyBTdHJpbmcgKG9uZSBvZiBwcmUtZGVmaW5lZCB2YWx1ZXMgaW4gVmFsdWVzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0JSRUFLX0hJTlQgPSAibGluZUJyZWFrSGludCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJsYXlvdXRUeXBlIiByZXR1cm5zIFN0cmluZyAob25lIG9mIHByZS1kZWZpbmVkIHZhbHVlcyBpbiBWYWx1ZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9UWVBFID0gImxheW91dFR5cGUiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAidGFnSW5mbyIgcmV0dXJucyBTdHJpbmcgKGRvY3VtZW50YXRpb24gZm9yIHRoaXMgZWxlbWVudCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHSU5GTyA9ICJ0YWdJbmZvIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogIm9taXRUeXBlIiByZXR1cm5zIFN0cmluZyAob25lIG9mIHByZS1kZWZpbmVkIHZhbHVlcyBpbiBWYWx1ZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfVFlQRSA9ICJvbWl0VHlwZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpbmNsdXNpb24iIHJldHVybnMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVU0lPTiA9ICJpbmNsdXNpb24iOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaXNTY3JpcHRhYmxlIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19TQ1JJUFRBQkxFID0gImlzU2NyaXB0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbHVlcyB7Ci0JCS8qCi0JCSAqIGZvciBMSU5FX0JSRUFLX0hJTlQgPSAibGluZUJyZWFrSGludCIuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkVBS19OT05FID0gImJyZWFrTm9uZSI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkVBS19BRlRFUl9TVEFSVCA9ICJicmVha0FmdGVyU3RhcnQiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgPSAiYnJlYWtCZWZvcmVTdGFydEFuZEFmdGVyRW5kIjsvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIGZvciBMQVlPVVRfVFlQRSA9ICJsYXlvdXRUeXBlIgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX0JMT0NLID0gImxheW91dEJsb2NrIjsvLyROT04tTkxTLTEkCi0JCS8qKiBCUiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfQlJFQUsgPSAibGF5b3V0QnJlYWsiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIEhpZGRlbiBvYmplY3Q7IGxpa2UgSFRNTCBvciBIRUFEICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9ISURERU4gPSAibGF5b3V0SGlkZGVuIjsvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9OT05FID0gImxheW91dE5vbmUiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIE5vIHdyYXAgb2JqZWN0OyBsaWtlIElNRywgQVBQTEVULC4uLiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfT0JKRUNUID0gImxheW91dE9iamVjdCI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfV1JBUCA9ICJsYXlvdXRXcmFwIjsvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIGZvciBPTUlUX1RZUEUgPSAib21pdFR5cGUiCi0JCSAqLwotCQkvKiogTm90IG9tbWlzaWJsZS4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9OT05FID0gIm9taXROb25lIjsvLyROT04tTkxTLTEkCi0JCS8qKiBCb3RoIHRhZ3MgYXJlIG9tbWlzaWJsZS4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9CT1RIID0gIm9taXRCb3RoIjsvLyROT04tTkxTLTEkCi0JCS8qKiBUaGUgZW5kIHRhZyBpcyBvbW1pc2libGUuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfRU5EID0gIm9taXRFbmQiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIFRoZSBlbmQgdGFnIGlzIG9tbWl0dGVkIHdoZW4gY3JlYXRlZC4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9FTkRfREVGQVVMVCA9ICJvbWl0RW5kRGVmYXVsdCI7Ly8kTk9OLU5MUy0xJAotCQkvKiogVGhlIGVuZCB0YWcgbXVzdCBiZSBvbWl0dGVkLiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlUX0VORF9NVVNUID0gIm9taXRFbmRNdXN0IjsvLyROT04tTkxTLTEkCi0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL0hUTUxDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvSFRNTENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiMjYzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvSFRNTENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBpbnRlcm5hbCBIVE1MQ29yZVBsdWdpbiBjbGFzcyBpbnN0ZWFkIGlmIHBvc3NpYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29yZVBsdWdpbiBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW4gewotCS8vIHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTA3MTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9IVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnByZWZlcmVuY2VzLkNvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIEFkZGl0aW9uYWwgcHJlZmVyZW5jZXMgZm9yIG5ldyBIVE1MIEZpbGVzIGdlbmVyYXRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMgZXh0ZW5kcyBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcyB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VGRklYID0gImRlZmF1bHRTdWZmaXgiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfU1VGRklYID0gImh0bWwiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0RPQ1VNRU5UX1RZUEUgPSAiZ2VuZXJhdGVEb2N1bWVudFR5cGUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0dFTkVSQVRPUiA9ICJnZW5lcmF0ZUdlbmVyYXRvciI7Ly8kTk9OLU5MUy0xJAotCS8vIGFkZGVkIHRoaXMgYXMgYSBwb3RlbnRpYWwgd2F5IHRvIGhhbmRsZSBjaGFuZ2luZwotCS8vIHByb2R1Y3QgbmFtZXMgInVwIiB0aGUgc3RhY2suIE5vdGUsIG5vdCBkZWNsYXJlZCBmaW5hbCAKLQkvLyB0byBhdm9pZCBnZXR0aW5nICdpbmxpbmVkJyBieSBjb21waWxlci4KLQlzdGF0aWMgSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKLQkvLyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkgaXMgc3BlYydkIHNvIGl0IG1pZ2h0IHJldHVybiBudWxsLgotCS8vIEl0cyBleHBlY3RlZCBmb3IgYW55IGZpbmFsIHByb2R1Y3QgaXQgd291bGQgbm90IGJlLCBzbyB3ZSdsbCByZXR1cm4gCi0JLy8gIldUUCIgZm9yIGRldmVsb3BtZW50L2ludGVyaW0gYnVpbGRzLiBObyBuZWVkIHRvIHRyYW5zbGF0ZS4gCi0Jc3RhdGljIFN0cmluZyBHRU5FUkFUT1IgPSAocHJvZHVjdCA9PSBudWxsKSA/ICJXVFAiOiBwcm9kdWN0LmdldE5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvSFRNTEZvcm1hdENvbnRyYWludHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9IVE1MRm9ybWF0Q29udHJhaW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ2NzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9IVE1MRm9ybWF0Q29udHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqIFBsZWFzZSB1bi1kZXByZWNhdGUgdGhpcyBpZiBQYWdlIERlc2lnbmVyIHRoaW5rcyB0aGV5IGFyZSBuZWVkZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTEZvcm1hdENvbnRyYWludHMgZXh0ZW5kcyBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgewotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogCUl0J3MgdmVyeSBoYXJkIHRvIGtlZXAgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGFjY3VyYXRlLgotCSAqIAlTb21ldGltZXMgYSBub2RlIHdhbnRzIHRvIHN0YXJ0IG9uIGEgbmV3IGxpbmUsIHNvbWV0aW1lcyBpdCBkb2Vzbid0LgotCSAqIAlJdCdzIGJlc3QgZm9yIHRoZSBub2RlIHRvIGZpZ3VyZSBvdXQgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9uIHRoZSBmbHkuCi0JICovCi0JaW50IGdldEF2YWlsYWJsZUxpbmVXaWR0aCgpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAJSXQncyB2ZXJ5IGhhcmQgdG8ga2VlcCB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggYWNjdXJhdGUuCi0JICogCVNvbWV0aW1lcyBhIG5vZGUgd2FudHMgdG8gc3RhcnQgb24gYSBuZXcgbGluZSwgc29tZXRpbWVzIGl0IGRvZXNuJ3QuCi0JICogCUl0J3MgYmVzdCBmb3IgdGhlIG5vZGUgdG8gZmlndXJlIG91dCB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggb24gdGhlIGZseS4KLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJsZUxpbmVXaWR0aChpbnQgYXZhaWxhYmxlTGluZVdpZHRoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDY2ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL1ByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUHJlZmVyZW5jZU5hbWVzIHsKLQotCVN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBZRVMgPSAieWVzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBOTyA9ICJubyI7IC8vJE5PTi1OTFMtMSQKLQotCi0JU3RyaW5nIFNFVFRJTkdTID0gInNldHRpbmdzIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFRSRUVWSUVXID0gInRyZWV2aWV3IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUZBVUxUX0RFUFRIID0gImRlZmF1bHRkZXB0aCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBU0lTID0gImFzLWlzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBMT1dFUiA9ICJsb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVBQRVIgPSAidXBwZXIiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgUFJFRkVSUkVEX0NBU0UgPSAicHJlZmVycmVkLWNhc2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBR05BTUUgPSAidGFnbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUklCVVRFTkFNRSA9ICJhdHRyaWJ1dGVuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NsZWFudXAvQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jbGVhbnVwL0Fic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNTVmZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NsZWFudXAvQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY2xlYW51cC5TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnByZWZlcmVuY2VzLkNvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGZDbGVhbnVwUHJlZmVyZW5jZXMgPSBudWxsOwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCi0JcHVibGljIHZvaWQgc2V0Q2xlYW51cFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcykgewotCi0JCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBjbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5wYXJ0aXRpb25DbGVhbnVwLkNsZWFudXBIYW5kbGVyI2dldENsZWFudXBQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0JCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRUYWdOYW1lQ2FzZShwcmVmZXJlbmNlcy5nZXRJbnQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRBdHRyTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Rm9ybWF0U291cmNlKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmQ2xlYW51cFByZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQucGFydGl0aW9uQ2xlYW51cC5DbGVhbnVwSGFuZGxlciNzZXRQcm9ncmVzc01vbml0b3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0KLQkJZlByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VTb3VyY2UoWE1MTW9kZWwgbW9kZWwsIE9iamVjdCByZXF1ZXN0ZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzb3VyY2UpIHsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKSkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWlmIChyZXF1ZXN0ZXIgPT0gbnVsbCkgewotCQkJcmVxdWVzdGVyID0gc3RydWN0dXJlZERvY3VtZW50OwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQocmVxdWVzdGVyLCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY2xlYW51cC9DU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY2xlYW51cC9DU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWE4YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NsZWFudXAvQ1NTVGV4dE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNsZWFudXA7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZm9ybWF0LkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUKLQotcHVibGljIGNsYXNzIENTU1RleHROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5vZGU7Ci0JCVhNTE1vZGVsIG1vZGVsID0gKChYTUxOb2RlKSBub2RlKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQotCQlTdHJpbmcgY29udGVudCA9IGdldENTU0NvbnRlbnQobm9kZSk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQotCQlpbnQgb2Zmc2V0ID0gKChYTUxOb2RlKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gKChYTUxOb2RlKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQkJcmVwbGFjZVNvdXJjZShtb2RlbCwgdGhpcywgb2Zmc2V0LCBsZW5ndGgsIGNvbnRlbnQpOwotCQlyZXR1cm4gKFhNTE5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDU1NDb250ZW50KE5vZGUgdGV4dCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRDU1NNb2RlbCh0ZXh0KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU05vZGUgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgYWRhcHRlcjsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IGZvcm1hdHRlci5jbGVhbnVwKGRvY3VtZW50KTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCBnZXRDU1NNb2RlbChOb2RlIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3R5bGVTaGVldEFkYXB0ZXIgc3R5bGVBZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIHN0eWxlQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDY3ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jbGVhbnVwOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZm9ybWF0LkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnByZWZlcmVuY2VzLkNvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUgQ1NTIGZvcm1hdHRpbmcKLQotcHVibGljIGNsYXNzIEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQkvKiogTm9uLU5MUyBzdHJpbmdzICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEFHX09QRU4gPSAiPCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHX09QRU4gPSAiPC8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIj4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfVEFHX0NMT1NFID0gIi8+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URVMgPSAiJyciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFUyA9ICJcIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBTSU5HTEVfUVVPVEUgPSAnXCcnOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCVhNTE5vZGUgcmVuYW1lZE5vZGUgPSAoWE1MTm9kZSkgY2xlYW51cENoaWxkcmVuKG5vZGUpOwotCi0JCS8vIGNhbGwgcXVvdGVBdHRyVmFsdWUoKSBmaXJzdCBzbyBpdCB3aWxsIGNsb3NlIGFueSB1bmNsb3NlZCBhdHRyCi0JCS8vIHF1b3RlQXR0clZhbHVlKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBzdGFydCB0YWcgaWYgdGhlcmUgaXMgYSBzdHJ1Y3R1cmUgY2hhbmdlCi0JCXJlbmFtZWROb2RlID0gcXVvdGVBdHRyVmFsdWUocmVuYW1lZE5vZGUpOwotCi0JCS8vIGluc2VydCB0YWcgY2xvc2UgaWYgbWlzc2luZwotCQkvLyBpZiBub2RlIGlzIG5vdCBjb21tZW50IHRhZwotCQkvLyBhbmQgbm90IGltcGxpY2l0IHRhZwotCQlpZiAoISgoWE1MRWxlbWVudCkgcmVuYW1lZE5vZGUpLmlzQ29tbWVudFRhZygpICYmIChyZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQlYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSByZW5hbWVkTm9kZS5nZXRNb2RlbCgpOwotCi0JCQkvLyBzYXZlIHN0YXJ0IG9mZnNldCBiZWZvcmUgaW5zZXJ0VGFnQ2xvc2UoKQotCQkJLy8gb3IgZWxzZSByZW5hbWVkTm9kZS5nZXRTdGFydE9mZnNldCgpIHdpbGwgYmUgemVybyBpZiByZW5hbWVkTm9kZSByZXBsYWNlZCBieSBpbnNlcnRUYWdDbG9zZSgpCi0JCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCS8vIGZvciBzdGFydCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCS8vIHVwZGF0ZSByZW5hbWVkTm9kZSBhbmQgc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWZ0ZXIgaW5zZXJ0VGFnQ2xvc2UoKQotCQkJcmVuYW1lZE5vZGUgPSAoWE1MTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7Ci0JCQlzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJCS8vIGZvciBlbmQgdGFnCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQlpbnNlcnRUYWdDbG9zZShzdHJ1Y3R1cmVkTW9kZWwsIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQotCQkvLyBjYWxsIGluc2VydE1pc3NpbmdUYWdzKCkgbmV4dCwgaXQgd2lsbCBnZW5lcmF0ZSBpbXBsaWNpdCB0YWdzIGlmIHRoZXJlIGFyZSBhbnkKLQkJLy8gaW5zZXJ0TWlzc2luZ1RhZ3MoKSB3aWxsIHJldHVybiB0aGUgbmV3IG1pc3Npbmcgc3RhcnQgdGFnIGlmIG9uZSBpcyBtaXNzaW5nCi0JCS8vIGFwcGx5VGFnTmFtZUNhc2UoKSB3aWxsIHJldHVybiB0aGUgcmVuYW1lZCBub2RlLgotCQkvLyBUaGUgcmVuYW1lZC9uZXcgbm9kZSB3aWxsIGJlIHNhdmVkIGFuZCByZXR1cm5lZCB0byBjYWxsZXIgd2hlbiBhbGwgY2xlYW51cCBpcyBkb25lLgotCQlyZW5hbWVkTm9kZSA9IGluc2VydE1pc3NpbmdUYWdzKHJlbmFtZWROb2RlKTsKLQkJcmVuYW1lZE5vZGUgPSBpbnNlcnRSZXF1aXJlZEF0dHJzKHJlbmFtZWROb2RlKTsKLQkJcmVuYW1lZE5vZGUgPSBhcHBseVRhZ05hbWVDYXNlKHJlbmFtZWROb2RlKTsKLQkJYXBwbHlBdHRyTmFtZUNhc2UocmVuYW1lZE5vZGUpOwotCQljbGVhbnVwQ1NTQXR0clZhbHVlKHJlbmFtZWROb2RlKTsKLQotCQlyZXR1cm4gcmVuYW1lZE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZElnbm9yZUNhc2UoWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIGNhc2Ugb3B0aW9uIGNhbiBiZSBhcHBsaWVkIHRvIG5vIG5hbWVzcGFjZSB0YWdzCi0JCXJldHVybiBlbGVtZW50LmlzR2xvYmFsVGFnKCk7Ci0JCS8qCi0JCSBNb2RlbFF1ZXJ5QWRhcHRlciBtcWFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpIGVsZW1lbnQuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCSBNb2RlbFF1ZXJ5IG1xID0gbnVsbDsKLQkJIENNTm9kZSBub2RlZGVjbCA9IG51bGw7Ci0JCSBpZiAobXFhZGFwdGVyICE9IG51bGwpCi0JCSBtcSA9IG1xYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCk7Ci0JCSBpZiAobXEgIT0gbnVsbCkKLQkJIG5vZGVkZWNsID0gbXEuZ2V0Q01Ob2RlKG5vZGUpOwotCQkgLy8gaWYgYSBOb2RlIGlzbid0IHJlY29nbml6ZWQgYXMgSFRNTCBvciBpcyBhbmQgY2FyZXMgYWJvdXQgY2FzZSwgZG8gbm90IGFsdGVyIGl0Ci0JCSAvLwlpZiAobm9kZWRlY2wgPT0gbnVsbCB8fCAobm9kZWRlY2wgaW5zdGFuY2VvZiBIVE1MQ01Ob2RlICYmICgoSFRNTENNTm9kZSkgbm9kZWRlY2wpLnNob3VsZElnbm9yZUNhc2UoKSkpCi0JCSBpZiAoISBub2RlZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHJldHVybiBmYWxzZTsKLQkJIHJldHVybiAoKEJvb2xlYW4pY21ub2RlLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqLwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFwcGx5QXR0ck5hbWVDYXNlKFhNTE5vZGUgbm9kZSkgewotCQlYTUxFbGVtZW50IGVsZW1lbnQgPSAoWE1MRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm47IC8vIGRvIG5vdGhpbmcKLQotCQlpbnQgYXR0ck5hbWVDYXNlID0gQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQVNJUzsKLQotCQlpZiAoc2hvdWxkSWdub3JlQ2FzZShlbGVtZW50KSkKLQkJCWF0dHJOYW1lQ2FzZSA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEF0dHJOYW1lQ2FzZSgpOwotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJWE1MTm9kZSBlYWNoQXR0ciA9IChYTUxOb2RlKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgb2xkQXR0ck5hbWUgPSBlYWNoQXR0ci5nZXROb2RlTmFtZSgpOwotCQkJU3RyaW5nIG5ld0F0dHJOYW1lID0gb2xkQXR0ck5hbWU7Ci0JCQkvLyAyNTQ5NjEgLSBhbGwgSFRNTCB0YWcgbmFtZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgYmUgaW4gRW5nbGlzaAotCQkJLy8gICAgICAgICAgZXZlbiBmb3IgSFRNTCBmaWxlcyBpbiBvdGhlciBsYW5ndWFnZXMgbGlrZSBKYXBhbmVzZSBvciBUdXJraXNoLgotCQkJLy8gICAgICAgICAgRW5nbGlzaCBsb2NhbGUgc2hvdWxkIGJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlCi0JCQkvLyAgICAgICAgICAob3RoZXJ3aXNlICJsaW5rIiB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8gIkzdTksiIGluIFR1cmtpc2gsIHdoZXJlICc/JyBpbiAiTN1OSyIKLQkJCS8vICAgICAgICAgIGlzIHRoZSAiSSBPdmVyZG90IENhcGl0YWwiIGluIFR1cmtpc2gpLgotCQkJaWYgKGF0dHJOYW1lQ2FzZSA9PSBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQluZXdBdHRyTmFtZSA9IG9sZEF0dHJOYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7Ci0JCQllbHNlIGlmIChhdHRyTmFtZUNhc2UgPT0gQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJbmV3QXR0ck5hbWUgPSBvbGRBdHRyTmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwotCi0JCQlpZiAobmV3QXR0ck5hbWUuY29tcGFyZVRvKG9sZEF0dHJOYW1lKSAhPSAwKSB7Ci0JCQkJaW50IGF0dHJOYW1lU3RhcnRPZmZzZXQgPSBlYWNoQXR0ci5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBhdHRyTmFtZUxlbmd0aCA9IG9sZEF0dHJOYW1lLmxlbmd0aCgpOwotCi0JCQkJWE1MTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGF0dHJOYW1lU3RhcnRPZmZzZXQsIGF0dHJOYW1lTGVuZ3RoLCBuZXdBdHRyTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTm9kZSBhcHBseVRhZ05hbWVDYXNlKFhNTE5vZGUgbm9kZSkgewotCQlYTUxFbGVtZW50IGVsZW1lbnQgPSAoWE1MRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWludCB0YWdOYW1lQ2FzZSA9IENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkFTSVM7Ci0KLQkJaWYgKHNob3VsZElnbm9yZUNhc2UoZWxlbWVudCkpCi0JCQl0YWdOYW1lQ2FzZSA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldFRhZ05hbWVDYXNlKCk7Ci0KLQkJU3RyaW5nIG9sZFRhZ05hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCVN0cmluZyBuZXdUYWdOYW1lID0gb2xkVGFnTmFtZTsKLQkJWE1MTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQkvLyAyNTQ5NjEgLSBhbGwgSFRNTCB0YWcgbmFtZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgYmUgaW4gRW5nbGlzaAotCQkvLyAgICAgICAgICBldmVuIGZvciBIVE1MIGZpbGVzIGluIG90aGVyIGxhbmd1YWdlcyBsaWtlIEphcGFuZXNlIG9yIFR1cmtpc2guCi0JCS8vICAgICAgICAgIEVuZ2xpc2ggbG9jYWxlIHNob3VsZCBiZSB1c2VkIHRvIGNvbnZlcnQgYmV0d2VlbiB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZQotCQkvLyAgICAgICAgICAob3RoZXJ3aXNlICJsaW5rIiB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8gIkzdTksiIGluIFR1cmtpc2gsIHdoZXJlICc/JyBpbiAiTN1OSyIKLQkJLy8gICAgICAgICAgaXMgdGhlICJJIE92ZXJkb3QgQ2FwaXRhbCIgaW4gVHVya2lzaCkuCi0JCWlmICh0YWdOYW1lQ2FzZSA9PSBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCW5ld1RhZ05hbWUgPSBvbGRUYWdOYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7Ci0JCWVsc2UgaWYgKHRhZ05hbWVDYXNlID09IENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJbmV3VGFnTmFtZSA9IG9sZFRhZ05hbWUudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQotCQlYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQkJSVRleHRSZWdpb24gc3RhcnRUYWdOYW1lUmVnaW9uID0gcmVnaW9ucy5nZXQoMSk7Ci0JCQkJaW50IHN0YXJ0VGFnTmFtZVN0YXJ0T2Zmc2V0ID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoc3RhcnRUYWdOYW1lUmVnaW9uKTsKLQkJCQlpbnQgc3RhcnRUYWdOYW1lTGVuZ3RoID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChzdGFydFRhZ05hbWVSZWdpb24pIC0gc3RhcnRUYWdOYW1lU3RhcnRPZmZzZXQ7Ci0KLQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFRhZ05hbWVTdGFydE9mZnNldCwgc3RhcnRUYWdOYW1lTGVuZ3RoLCBuZXdUYWdOYW1lKTsKLQkJCQluZXdOb2RlID0gKFhNTE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnTmFtZVN0YXJ0T2Zmc2V0KTsgLy8gc2F2ZSBuZXcgbm9kZQotCQkJfQotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQkJSVRleHRSZWdpb24gZW5kVGFnTmFtZVJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCWludCBlbmRUYWdOYW1lU3RhcnRPZmZzZXQgPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZW5kVGFnTmFtZVJlZ2lvbik7Ci0JCQkJaW50IGVuZFRhZ05hbWVMZW5ndGggPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChlbmRUYWdOYW1lUmVnaW9uKSAtIGVuZFRhZ05hbWVTdGFydE9mZnNldDsKLQotCQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVuZFRhZ05hbWVTdGFydE9mZnNldCwgZW5kVGFnTmFtZUxlbmd0aCwgbmV3VGFnTmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBjbGVhbnVwQ2hpbGRyZW4oTm9kZSBub2RlKSB7Ci0JCU5vZGUgcGFyZW50Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCUhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkgZmFjdG9yeSA9IEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIGNsZWFudXAgdGhpcyBjaGlsZCBub2RlCi0JCQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGZhY3RvcnkuY3JlYXRlSGFuZGxlcihjaGlsZE5vZGUsIGdldENsZWFudXBQcmVmZXJlbmNlcygpKTsKLQkJCQljaGlsZE5vZGUgPSBjbGVhbnVwSGFuZGxlci5jbGVhbnVwKGNoaWxkTm9kZSk7Ci0KLQkJCQkvLyBnZXQgbmV3IHBhcmVudCBub2RlCi0JCQkJcGFyZW50Tm9kZSA9IChYTUxOb2RlKSBjaGlsZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJLy8gZ2V0IG5leHQgY2hpbGQgbm9kZQotCQkJCWNoaWxkTm9kZSA9IChYTUxOb2RlKSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFudXBDU1NBdHRyVmFsdWUoWE1MTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuOwotCQlYTUxFbGVtZW50IGVsZW1lbnQgPSAoWE1MRWxlbWVudCkgbm9kZTsKLQkJaWYgKCFlbGVtZW50LmlzR2xvYmFsVGFnKCkpCi0JCQlyZXR1cm47Ci0KLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB2YWx1ZSA9IGdldENTU1ZhbHVlKGF0dHIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG9sZFZhbHVlID0gKChYTUxOb2RlKSBhdHRyKS5nZXRWYWx1ZVNvdXJjZSgpOwotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKQotCQkJcmV0dXJuOwotCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCBnZXRDU1NNb2RlbChBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHlsZURlY2xhcmF0aW9uQWRhcHRlciBzdHlsZUFkYXB0ZXIgPSAoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gc3R5bGVBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q1NTVmFsdWUoQXR0ciBhdHRyKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldENTU01vZGVsKGF0dHIpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTm9kZSBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQ7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSBhZGFwdGVyOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gZm9ybWF0dGVyLmNsZWFudXAoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5RWxlbWVudChYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpOwotCX0KLQotCXByb3RlY3RlZCBYTUxOb2RlIGluc2VydEVuZFRhZyhYTUxOb2RlIG5vZGUpIHsKLQkJWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIG5vZGU7Ci0KLQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCVhNTE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJWE1MTm9kZSBuZXdOb2RlID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCWVsc2UgaWYgKGlzRW1wdHlFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobGFzdFJlZ2lvbiksIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCksIEVNUFRZX1RBR19DTE9TRSk7Ci0KLQkJCWlmIChyZWdpb25zLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb25CZWZvcmVUYWdDbG9zZSA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSAtIDEpOwotCi0JCQkJLy8gaW5zZXJ0IGEgc3BhY2Ugc2VwYXJhdG9yIGJlZm9yZSB0YWcgY2xvc2UgaWYgdGhlIHByZXZpb3VzIHJlZ2lvbiBkb2VzIG5vdCBoYXZlIGV4dHJhIHNwYWNlcwotCQkJCWlmIChyZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRUZXh0TGVuZ3RoKCkgPT0gcmVnaW9uQmVmb3JlVGFnQ2xvc2UuZ2V0TGVuZ3RoKCkpCi0JCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZyBlbmRUYWcgPSBFTkRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCi0JCQlYTUxOb2RlIGxhc3RDaGlsZCA9IChYTUxOb2RlKSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaW50IGVuZFRhZ1N0YXJ0T2Zmc2V0ID0gMDsKLQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkKLQkJCQkvLyBpZiB0aGlzIG5vZGUgaGFzIGNoaWxkcmVuLCBpbnNlcnQgdGhlIGVuZCB0YWcgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQKLQkJCQllbmRUYWdTdGFydE9mZnNldCA9IGxhc3RDaGlsZC5nZXRFbmRPZmZzZXQoKTsKLQkJCWVsc2UKLQkJCQkvLyBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGFzIGNoaWxkcmVuLCBpbnNlcnQgdGhlIGVuZCB0YWcgYWZ0ZXIgdGhlIHN0YXJ0IHRhZwotCQkJCWVuZFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBlbmRUYWdTdGFydE9mZnNldCwgMCwgZW5kVGFnKTsKLQkJfQotCi0JCW5ld05vZGUgPSAoWE1MTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUgbmV3IG5vZGUKLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTm9kZSBpbnNlcnRNaXNzaW5nVGFncyhYTUxOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0JCVhNTE5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKGluc2VydE1pc3NpbmdUYWdzKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkvLyBpbXBsaWNpdCBzdGFydCB0YWc7IGdlbmVyYXRlIHRhZyBmb3IgaXQKLQkJCQluZXdOb2RlID0gaW5zZXJ0U3RhcnRUYWcobm9kZSk7Ci0JCQkJc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl9Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiByZWdpb25MaXN0ICE9IG51bGwgJiYgcmVnaW9uTGlzdC5nZXQocmVnaW9uTGlzdC5zaXplKCkgLSAxKS5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIHN0YXJ0IHRhZyBtaXNzaW5nCi0JCQkJCWlmIChpc1N0YXJ0VGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0U3RhcnRUYWcobmV3Tm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIGVuZCB0YWcgbWlzc2luZwotCQkJCQlpZiAoaXNFbmRUYWdSZXF1aXJlZChuZXdOb2RlKSkKLQkJCQkJCW5ld05vZGUgPSBpbnNlcnRFbmRUYWcobmV3Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTE5vZGUgaW5zZXJ0U3RhcnRUYWcoWE1MTm9kZSBub2RlKSB7Ci0JCVhNTEVsZW1lbnQgZWxlbWVudCA9IChYTUxFbGVtZW50KSBub2RlOwotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBub2RlOyAvLyBkbyBub3RoaW5nCi0KLQkJWE1MTm9kZSBuZXdOb2RlID0gbnVsbDsKLQotCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnID0gU1RBUlRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFRhZ1N0YXJ0T2Zmc2V0LCAwLCBzdGFydFRhZyk7Ci0JCW5ld05vZGUgPSAoWE1MTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUgbmV3IG5vZGUKLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRUYWdDbG9zZShYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKChmbGF0Tm9kZSAhPSBudWxsKSAmJiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpICE9IG51bGwpKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25MaXN0LmdldChyZWdpb25MaXN0LnNpemUoKSAtIDEpOwotCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyByZWdpb25UeXBlID0gbGFzdFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKChyZWdpb25UeXBlICE9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgJiYgKHJlZ2lvblR5cGUgIT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQkvLyBpbnNlcnQgIj4iIGFmdGVyIGxhc3RSZWdpb24gb2YgZmxhdE5vZGUKLQkJCQkJLy8gYXMgaW4gIjxhPC9hPiIgaWYgZmxhdE5vZGUgaXMgZm9yIHN0YXJ0IHRhZywgb3IgaW4gIjxhPjwvYSIgaWYgZmxhdE5vZGUgaXMgZm9yIGVuZCB0YWcKLQkJCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChsYXN0UmVnaW9uKSwgMCwgIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5kVGFnUmVxdWlyZWQoWE1MTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBub2RlLmlzQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVuZCB0YWdzIG9mIEhUTUwgRU1QVFkgY29udGVudCB0eXBlLCBzdWNoIGFzIElNRywKLQkgKiBhbmQgSFRNTCB1bmRlZmluZWQgdGFncyBhcmUgcGFyc2VkIHNlcGFyYXRlbHkgZnJvbSB0aGUgc3RhcnQgdGFncy4KLQkgKiBTbyBpbnNlcnRpbmcgdGhlIG1pc3Npbmcgc3RhcnQgdGFnIGlzIHVzZWxlc3MgYW5kIGV2ZW4gaGFybWZ1bC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N0YXJ0VGFnUmVxdWlyZWQoWE1MTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBub2RlLmlzQ29udGFpbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYTUxUeXBlKFhNTE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCAmJiBzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQkJcmVzdWx0ID0gZG9jdW1lbnQuaXNYTUxUeXBlKCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBYTUxOb2RlIHF1b3RlQXR0clZhbHVlKFhNTE5vZGUgbm9kZSkgewotCQlYTUxFbGVtZW50IGVsZW1lbnQgPSAoWE1MRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0JCVhNTE5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKHF1b3RlQXR0clZhbHVlcykgewotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBuZXdOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWludCBhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCVhNTEdlbmVyYXRvciBnZW5lcmF0b3IgPSBub2RlLmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0xlbmd0aDsgaSsrKSB7Ci0JCQkJYXR0cmlidXRlcyA9IG5ld05vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCWF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCVhNTEF0dHIgZWFjaEF0dHIgPSAoWE1MQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCS8vSVRleHRSZWdpb24gb2xkQXR0clZhbHVlUmVnaW9uID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQlTdHJpbmcgb2xkQXR0clZhbHVlID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJaWYgKG9sZEF0dHJWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCVhNTE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKGlzWE1MVHlwZShzdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCQkvLyBUT0RPOiBLaXQsIHBsZWFzZSBjaGVjay4gSXMgdGhlcmUgYW55IHdheSB0byBub3QgcmVseSBvbiBnZXR0aW5nIHJlZ2lvbnMgZnJvbSBhdHRyaWJ1dGVzPwotCQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9ICI9XCIiICsgZWFjaEF0dHIuZ2V0TmFtZVJlZ2lvblRleHQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVhY2hBdHRyLmdldE5hbWVSZWdpb25FbmRPZmZzZXQoKSwgMCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCW5ld05vZGUgPSAoWE1MTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24obm9kZS5nZXRTdGFydE9mZnNldCgpKTsgLy8gc2F2ZSBuZXcgbm9kZQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCi0JCQkJCWNoYXIgcXVvdGUgPSBTdHJpbmdVdGlscy5pc1F1b3RlZChvbGRBdHRyVmFsdWUpID8gb2xkQXR0clZhbHVlLmNoYXJBdCgwKSA6IERPVUJMRV9RVU9URTsKLQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShlYWNoQXR0ciwgcXVvdGUpOwotCi0JCQkJCS8vIFRoZXJlIGlzIGEgcHJvYmxlbSBpbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShJVGV4dFJlZ2lvbikgd2hlbiB0aGUgcmVnaW9uIGlzIGluc3RhbmNlb2YgQ29udGV4dFJlZ2lvbi4KLQkJCQkJLy8gV29ya2Fyb3VuZCBmb3Igbm93Li4uCi0JCQkJCWlmIChvbGRBdHRyVmFsdWUubGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJY2hhciBmaXJzdENoYXIgPSBvbGRBdHRyVmFsdWUuY2hhckF0KDApOwotCQkJCQkJaWYgKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEUpCi0JCQkJCQkJbmV3QXR0clZhbHVlID0gU0lOR0xFX1FVT1RFUzsKLQkJCQkJCWVsc2UgaWYgKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEUpCi0JCQkJCQkJbmV3QXR0clZhbHVlID0gRE9VQkxFX1FVT1RFUzsKLQkJCQkJfQotCi0JCQkJCWlmIChuZXdBdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZS5jb21wYXJlVG8ob2xkQXR0clZhbHVlKSAhPSAwKSB7Ci0JCQkJCQkJaW50IGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0ID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQkJCWludCBhdHRyVmFsdWVMZW5ndGggPSBvbGRBdHRyVmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCQkJCQlYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgYXR0clZhbHVlU3RhcnRPZmZzZXQsIGF0dHJWYWx1ZUxlbmd0aCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCQluZXdOb2RlID0gKFhNTE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlIG5ldyBub2RlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIFhNTE5vZGUgaW5zZXJ0UmVxdWlyZWRBdHRycyhYTUxOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycygpOwotCQlYTUxOb2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpbnNlcnRSZXF1aXJlZEF0dHJzKSB7Ci0JCQlMaXN0IHJlcXVpcmVkQXR0cnMgPSBnZXRSZXF1aXJlZEF0dHJzKG5ld05vZGUpOwotCQkJaWYgKHJlcXVpcmVkQXR0cnMuc2l6ZSgpID4gMCkgewotCQkJCU5hbWVkTm9kZU1hcCBjdXJyZW50QXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlMaXN0IGluc2VydEF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCkgPT0gMCkKLQkJCQkJaW5zZXJ0QXR0cnMuYWRkQWxsKHJlcXVpcmVkQXR0cnMpOwotCQkJCWVsc2UgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVkQXR0cnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJOYW1lID0gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSByZXF1aXJlZEF0dHJzLmdldChpKSkuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3VycmVudEF0dHJzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQlTdHJpbmcgY3VycmVudEF0dHJOYW1lID0gY3VycmVudEF0dHJzLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQlpZiAocmVxdWlyZWRBdHRyTmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKGN1cnJlbnRBdHRyTmFtZSkgPT0gMCkgewotCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghZm91bmQpCi0JCQkJCQkJaW5zZXJ0QXR0cnMuYWRkKHJlcXVpcmVkQXR0cnMuZ2V0KGkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaW5zZXJ0QXR0cnMuc2l6ZSgpID4gMCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpbnQgaW5kZXggPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExhc3RSZWdpb24oKTsgCi0JCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4LS07Ci0JCQkJCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4ID0gaW5kZXggLSAyOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0KLQkJCQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvciAoaW50IGkgPSBpbnNlcnRBdHRycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5zZXJ0QXR0cnMuZ2V0KGkpOwotCQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgPSBhdHRyRGVjbC5nZXRBdHRyTmFtZSgpOwotCQkJCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRyRGVjbC5nZXREZWZhdWx0VmFsdWUoKTsKLQkJCQkJCQlpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpCi0JCQkJCQkJCWRlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG5hbWVBbmREZWZhdWx0VmFsdWUgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoaSA9PSAwICYmIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCkgPiBsYXN0UmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSArPSByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgKyAiPVwiIiArIGRlZmF1bHRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoaW5kZXgsIG5hbWVBbmREZWZhdWx0VmFsdWUpKTsKLQkJCQkJCQkvLyBCVUczMzgxOiBNdWx0aVRleHRFZGl0IGFwcGxpZXMgYWxsIGNoaWxkIFRleHRFZGl0J3MgYmFzaW5nIG9uIG9mZnNldHMKLQkJCQkJCQkvLyAgICAgICAgICBpbiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBmaXJzdCBUZXh0RWRpdCwgbm90IGFmdGVyIGVhY2gKLQkJCQkJCQkvLyAgICAgICAgICBjaGlsZCBUZXh0RWRpdC4gVGhlcmVmb3JlLCBkbyBub3QgbmVlZCB0byBhZHZhbmNlIHRoZSBpbmRleC4KLQkJCQkJCQkvL2luZGV4ICs9IG5hbWVBbmREZWZhdWx0VmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQltdWx0aVRleHRFZGl0LmFwcGx5KG5ld05vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoRG9jdW1lbnQpIG5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWRBdHRycyhOb2RlIG5vZGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gZ2V0TW9kZWxRdWVyeShub2RlKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jbGVhbnVwL0hUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jbGVhbnVwL0hUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzNWU3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY2xlYW51cC9IVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNsZWFudXA7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUgQ1NTIGZvcm1hdHRpbmcKLQotY2xhc3MgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5IGZJbnN0YW5jZSA9IG51bGw7Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNyZWF0ZUhhbmRsZXIoTm9kZSBub2RlLCBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpIHsKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXsKLQkJCQkJaWYgKGlzSlNQVGFnKG5vZGUpKQotCQkJCQkJaGFuZGxlciA9IG5ldyBKU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWhhbmRsZXIgPSBuZXcgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQl7Ci0JCQkJCWlmIChpc1BhcmVudFN0eWxlVGFnKG5vZGUpKQotCQkJCQkJaGFuZGxlciA9IG5ldyBDU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWRlZmF1bHQgOgotCQkJCXsKLQkJCQkJaGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQl9Ci0JCX0KLQotCQloYW5kbGVyLnNldENsZWFudXBQcmVmZXJlbmNlcyhjbGVhbnVwUHJlZmVyZW5jZXMpOwotCi0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFRhZyhOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFhNTE5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKFhNTE5vZGUpIG5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkvLyBpbiBzb21lIGNhc2VzLCB0aGUgbm9kZXMgZXhpc3RzLCBidXQgaGFzbid0IGJlZW4gYXNzb2NpYXRlZCB3aXRoCi0JCQkvLyBhIGZsYXRub2RlIHlldCAodGhlIHNjcmVlbiB1cGRhdGVzIGNhbiBiZSBpbml0aWF0ZWQgb24gYSBkaWZmZXJlbnQgdGhyZWFkLAotCQkJLy8gc28gdGhlIHJlcXVlc3QgZm9yIGEgZmxhdG5vZGUgY2FuIGNvbWUgaW4gYmVmb3JlIHRoZSBub2RlIGlzIGZ1bGx5IGZvcm1lZC4KLQkJCS8vIGlmIHRoZSBmbGF0bm9kZSBpcyBudWxsLCB3ZSdsbCBqdXN0IGFsbG93IHRoZSBkZWZhdWx0cyB0byBhcHBseS4KLQkJCS8vIChodG1sIGFkYXB0ZXIgaW4gdGhpcyBjYXNlKS4KLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZsYXROb2RlVHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJCQlpZiAoKGZsYXROb2RlVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgfHwgKGZsYXROb2RlVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCAoZmxhdE5vZGVUeXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgKGZsYXROb2RlVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgKGZsYXROb2RlVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFKSB8fCAoZmxhdE5vZGVUeXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgfHwgKGZsYXROb2RlVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pIHx8IChmbGF0Tm9kZVR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFyZW50U3R5bGVUYWcoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBYTUxOb2RlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoWE1MTm9kZSkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChmbGF0Tm9kZS5nZXRUeXBlKCkgIT0gWE1MUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGNoZWNrIGlmIHRoZSBwYXJlbnQgaXMgU1RZTEUgZWxlbWVudAotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG5hbWUgPSBwYXJlbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlNUWUxFIikpLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY2xlYW51cC9IVE1MQ2xlYW51cFByb2Nlc3NvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jbGVhbnVwL0hUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDBmNGVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jbGVhbnVwL0hUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2xlYW51cC5DbGVhbnVwUHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQ2xlYW51cFByb2Nlc3NvckltcGwgZXh0ZW5kcyBDbGVhbnVwUHJvY2Vzc29yWE1MIHsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQucGFydGl0aW9uQ2xlYW51cC5BYnN0cmFjdENsZWFudXBQcm9jZXNzb3JJbXBsI2dldENvbnRlbnRUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQucGFydGl0aW9uQ2xlYW51cC5BYnN0cmFjdENsZWFudXBQcm9jZXNzb3JJbXBsI2dldENsZWFudXBIYW5kbGVyKGNvbS5pYm0uc2VkLm1vZGVsLnhtbC5YTUxOb2RlKQotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUhhbmRsZXIobm9kZSwgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBnZXRGb3JtYXRQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBuZXcgSFRNTEZvcm1hdFByb2Nlc3NvckltcGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY2xlYW51cC9KU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY2xlYW51cC9KU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTQzYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NsZWFudXAvSlNQRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNsZWFudXA7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEpTUEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5YzdkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jbGVhbnVwOwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbW1lbnRlbGVtZW50L2hhbmRsZXJzL0NvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbW1lbnRlbGVtZW50L2hhbmRsZXJzL0NvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjRiMTA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb21tZW50ZWxlbWVudC9oYW5kbGVycy9Db21tZW50RWxlbWVudEhhbmRsZXJGb3JTU0kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29tbWVudGVsZW1lbnQuaGFuZGxlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29tbWVudGVsZW1lbnQudXRpbC5Db21tZW50RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbW1lbnRlbGVtZW50LnV0aWwuVGFnU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJIGltcGxlbWVudHMgQ29tbWVudEVsZW1lbnRIYW5kbGVyIHsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQubW9kZWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyI2NyZWF0ZUVsZW1lbnQoRG9jdW1lbnQsIFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ01Eb2N1bWVudCBjbSA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoY20gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ01OYW1lZE5vZGVNYXAgbWFwID0gY20uZ2V0RWxlbWVudHMoKTsKLQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVRhZ1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBUYWdTY2FubmVyKGRhdGEsIDEpOwotCQlTdHJpbmcgbmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKSArIDQpOwotCQlidWZmZXIuYXBwZW5kKFNTSV9QUkVGSVgpOwotCQlidWZmZXIuYXBwZW5kKCc6Jyk7Ci0JCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCVN0cmluZyB0YWdOYW1lID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCS8vIGNoZWNrIGlmIHZhbGlkIChkZWZpbmVkKSBTU0kgdGFnIG9yIG5vdAotCQlpZiAobWFwLmdldE5hbWVkSXRlbSh0YWdOYW1lKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNvbW1lbnRFbGVtZW50RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENvbW1lbnRFbGVtZW50RmFjdG9yeShkb2N1bWVudCwgaXNKU1BUYWcsIHRoaXMpOwotCQlFbGVtZW50IGVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZSh0YWdOYW1lLCBDb21tZW50RWxlbWVudEZhY3RvcnkuSVNfU1RBUlQpOwotCi0JCS8vIHNldCBhdHRyaWJ1dGVzCi0JCVN0cmluZyBhdHRyTmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJd2hpbGUgKGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBzY2FubmVyLm5leHRWYWx1ZSgpOwotCQkJQXR0ciBhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGF0dHJOYW1lKTsKLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0clZhbHVlICE9IG51bGwpCi0JCQkJCWF0dHIuc2V0VmFsdWUoYXR0clZhbHVlKTsKLQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCQlhdHRyTmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLm1vZGVsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50SGFuZGxlciNnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChYTUxFbGVtZW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTdGFydFRhZ0NvbnRlbnQoWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JCVhNTEdlbmVyYXRvciBnZW5lcmF0b3IgPSBlbGVtZW50LmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYnVmZmVyLmFwcGVuZCgnIycpOwotCQlidWZmZXIuYXBwZW5kKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0ck5hbWUoYXR0cik7Ci0JCQlpZiAoYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0ck5hbWUpOwotCQkJfQotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCS8vIGF0dHIgbmFtZSBvbmx5IGZvciBIVE1MIGJvb2xlYW4gYW5kIEpTUAotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5tb2RlbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXIjZ2VuZXJhdGVFbmRUYWdDb250ZW50KFhNTEVsZW1lbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOyAvLyBhbHdheXMgZW1wdHkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnNlZC5tb2RlbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXIjaXNDb21tZW50RWxlbWVudChjb20uaWJtLnNlZC5tb2RlbC54bWwuWE1MRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnRFbGVtZW50KFhNTEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDTURvY3VtZW50IGNtID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCWlmIChjbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ01OYW1lZE5vZGVNYXAgbWFwID0gY20uZ2V0RWxlbWVudHMoKTsKLQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCB8fCAhcHJlZml4LmVxdWFscyhTU0lfUFJFRklYKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lLmxlbmd0aCgpIDw9IDQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobWFwLmdldE5hbWVkSXRlbSh0YWdOYW1lKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfUFJFRklYID0gInNzaSI7Ly8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNWU4Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0gKi8KLWZpbmFsIGNsYXNzIEF0dHJpYnV0ZUNvbGxlY3Rpb24gZXh0ZW5kcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBIVE1MNDBOYW1lc3BhY2UgewotCi0JLyoqIGJvZHljb2xvcnMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQk9EWUNPTE9SUyA9IHtBVFRSX05BTUVfQkdDT0xPUiwgQVRUUl9OQU1FX1RFWFQsIEFUVFJfTkFNRV9MSU5LLCBBVFRSX05BTUVfVkxJTkssIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJTkt9OwotCS8qKiBjb3JlYXR0cnMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09SRSA9IHtBVFRSX05BTUVfSUQsIEFUVFJfTkFNRV9DTEFTUywgQVRUUl9OQU1FX1NUWUxFLCBBVFRSX05BTUVfVElUTEV9OwotCS8qKiBldmVudHMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVZFTlRTID0ge0FUVFJfTkFNRV9PTkNMSUNLLCBBVFRSX05BTUVfT05EQkxDTElDSywgQVRUUl9OQU1FX09OTU9VU0VET1dOLCBBVFRSX05BTUVfT05NT1VTRVVQLCBBVFRSX05BTUVfT05NT1VTRU9WRVIsIEFUVFJfTkFNRV9PTk1PVVNFTU9WRSwgQVRUUl9OQU1FX09OTU9VU0VPVVQsIEFUVFJfTkFNRV9PTktFWVBSRVNTLCBBVFRSX05BTUVfT05LRVlET1dOLCBBVFRSX05BTUVfT05LRVlVUCwgQVRUUl9OQU1FX09OSEVMUH07Ci0JLyoqIGkxOG4uIGxhbmcsIGRpciAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEkxOE4gPSB7QVRUUl9OQU1FX0xBTkcsIEFUVFJfTkFNRV9ESVJ9OwotCS8qKiBjZWxsaGFsaWdoLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENFTExIQUxJR04gPSB7QVRUUl9OQU1FX0NIQVIsIEFUVFJfTkFNRV9DSEFST0ZGfTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVDb2xsZWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5IVE1MQXR0ckRlY2xJbXBsCi0JICogQHBhcmFtIGF0dHJOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlKFN0cmluZyBhdHRyTmFtZSkgewotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCi0JCWlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQkJSKSkgewotCQkJLy8gKGFiYnIgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQkJSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ0NFUFQpKSB7Ci0JCQkvLyAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDQ0VQVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUNDRVBUX0NIQVJTRVQpKSB7Ci0JCQkvLyAoYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOzsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUlNFVFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQ0NFUFRfQ0hBUlNFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUNUSU9OKSkgewotCQkJLy8gKGFjdGlvbiAlVVJJICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDVElPTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVJDSElWRSkpIHsKLQkJCS8vIChhcmNoaXZlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BUkNISVZFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ0NFU1NLRVkpKSB7Ci0JCQkvLyAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNIQVJBQ1RFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDQ0VTU0tFWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUxJTkspKSB7Ci0JCQkvLyAoYWxpbmsgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSU5LLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BTFQpKSB7Ci0JCQkvLyAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVVUT1NUQVJUKSkgewotCQkJLy8gKGF1dG9zdGFydCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BVVRPU1RBUlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FVVE9QTEFZKSkgewotCQkJLy8gKGF1dG9wbGF5ICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FVVE9QTEFZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BVVRPU0laRSkpIHsKLQkJCS8vIChhdXRvc2l6ZSAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BVVRPU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVhJUykpIHsKLQkJCS8vIChheGlzIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BWElTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CQUNLR1JPVU5EKSkgewotCQkJLy8gKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CQUNLR1JPVU5ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CRUhBVklPUikpIHsKLQkJCS8vIChiZWhhdmlvciAoc2Nyb2xsfHNsaWRlfGFsdGVybmF0ZSkgc2Nyb2xsKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9TQ1JPTEwsIEFUVFJfVkFMVUVfU0xJREUsIEFUVFJfVkFMVUVfQUxURVJOQVRFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9TQ1JPTEwpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CRUhBVklPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQkdDT0xPUikpIHsKLQkJCS8vIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CR0NPTE9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CT1JERVIpKSB7Ci0JCQkvLyAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0VMTFNQQUNJTkcpKSB7Ci0JCQkvLyAoY2VsbHNwYWNpbmcgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0VMTFNQQUNJTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NFTExQQURESU5HKSkgewotCQkJLy8gKGNlbGxwYWRkaW5nICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NFTExQQURESU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DR0kpKSB7Ci0JCQkvLyAoY2dpICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0dJLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DSEFSKSkgewotCQkJLy8gKGNoYXIgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUkFDVEVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hBUk9GRikpIHsKLQkJCS8vIChjaGFyb2ZmICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIQVJPRkYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIQVJTRVQpKSB7Ci0JCQkvLyAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUlNFVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIQVJTRVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NJVEUpKSB7Ci0JCQkvLyAoY2l0ZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NJVEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NMQVNTKSkgewotCQkJLy8gKGNsYXNzIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEFTUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xBU1NJRCkpIHsKLQkJCS8vIChjbGFzc2lkICVVUkkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEFTU0lELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DTUQpKSB7Ci0JCQkvLyAoY21kIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIRUNLRUQpKSB7Ci0JCQkvLyAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfQ0hFQ0tFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIRUNLRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NMRUFSKSkgewotCQkJLy8gKGNsZWFyIChsZWZ0IHwgYWxsIHwgcmlnaHQgfCBub25lKSBub25lKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0FMTCwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9OT05FfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9OT05FKTsKLQotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEVBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09ERSkpIHsKLQkJCS8vIChjb2RlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0RFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0RFQkFTRSkpIHsKLQkJCS8vIChjb2RlYmFzZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPREVCQVNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0RFVFlQRSkpIHsKLQkJCS8vIChjb2RldHlwZSAlQ290ZW50VHlwZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09ERVRZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTE9SKSkgewotCQkJLy8gKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09NUEFDVCkpIHsKLQkJCS8vIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9DT01QQUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09NUEFDVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09MUykpIHsKLQkJCS8vIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0xTUEFOKSkgewotCQkJLy8gKGNvbHNwYW4gTlVNQkVSIDEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xTUEFOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT05URU5UKSkgewotCQkJLy8gKGNvbnRlbnQgQ0RBVEEgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT05URU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT05UUk9MTEVSKSkgewotCQkJLy8gKGNvbnRyb2xsZXIgKHRydWV8ZmFsc2UpIHRydWUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT05UUk9MTEVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT09SRFMpKSB7Ci0JCQkvLyAoY29vcmRzICVDb29yZHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPT1JEUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPT1JEUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREFUQSkpIHsKLQkJCS8vIChkYXRhICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfREFUQSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREFURVRJTUUpKSB7Ci0JCQkvLyAoZGF0ZXRpbWUgJURhdGV0aW1lOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5EQVRFVElNRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RBVEVUSU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9EQVRBUEFHRVNJWkUpKSB7Ci0JCQkvLyAoZGF0YXBhZ2VzaXplIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9EQVRBUEFHRVNJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RFQ0xBUkUpKSB7Ci0JCQkvLyAoZGVjbGFyZSAoZGVjbGFyZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfREVDTEFSRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RFQ0xBUkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RFRkVSKSkgewotCQkJLy8gKGRlZmVyIChkZWZlcikgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfREVGRVJ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ERUZFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRElSKSkgewotCQkJLy8gKGRpciAobHRyfHJ0bCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xUUiwgQVRUUl9WQUxVRV9SVEx9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ESVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RJUkVDVElPTikpIHsKLQkJCS8vIChkaXJlY3Rpb24gKGxlZnR8cmlnaHR8dXB8ZG93bikgbGVmdCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9VUCwgQVRUUl9WQUxVRV9ET1dOfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRElSRUNUSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ESVJFQ1RLRVkpKSB7Ci0JCQkvLyAoZGlyZWN0a2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNIQVJBQ1RFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RJUkVDVEtFWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRElTQUJMRUQpKSB7Ci0JCQkvLyAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJLy8gYm9vbGVhbiBhdHRyaWJ1dGUgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGl0cyBuYW1lLgotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9ESVNBQkxFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RJU0FCTEVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9FTkNUWVBFKSkgewotCQkJLy8gKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1dXV19GT1JNX1VSTEVOQ09ERUQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FTkNUWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9FUlJNU0cpKSB7Ci0JCQkvLyAoZXJybXNnIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FUlJNU0csIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VWRU5UKSkgewotCQkJLy8gKGV2ZW50IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FVkVOVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRkFDRSkpIHsKLQkJCS8vIChmYWNlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GSUxFKSkgewotCQkJLy8gKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GT1IpKSB7Ci0JCQkvLyAoZm9yICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRk9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GUkFNRSkpIHsKLQkJCS8vIChmcmFtZSAlVEZyYW1lOyAjSU1QTElFRCkKLQkJCS8vICVURnJhbWU7IGlzICh2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVk9JRCwgQVRUUl9WQUxVRV9BQk9WRSwgQVRUUl9WQUxVRV9CRUxPVywgQVRUUl9WQUxVRV9IU0lERVMsIEFUVFJfVkFMVUVfTEhTLCBBVFRSX1ZBTFVFX1JIUywgQVRUUl9WQUxVRV9WU0lERVMsIEFUVFJfVkFMVUVfQk9YLCBBVFRSX1ZBTFVFX0JPUkRFUn07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZSQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GUkFNRUJPUkRFUikpIHsKLQkJCS8vIChmcmFtZWJvcmRlciAoMXwwKSAxKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV8xLCBBVFRSX1ZBTFVFXzB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCQkvLzw8RDIxNTY4NAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0ZSQU1FU1BBQ0lORykpIHsKLQkJCS8vIChmcmFtZXNwYWNpbmcgQ0RBVEE7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GUkFNRVNQQUNJTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCS8vRDIxNTY4NAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFQURFUlMpKSB7Ci0JCQkvLyAoSEVBREVSUyBJRFJFRlM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLklEUkVGUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hFQURFUlMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFSUdIVCkpIHsKLQkJCS8vIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSEVJR0hULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ISURERU4pKSB7Ci0JCQkvLyAoaGlkZGVuIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ISURERU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hSRUYpKSB7Ci0JCQkvLyAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hSRUYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hSRUZMQU5HKSkgewotCQkJLy8gKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxBTkdVQUdFX0NPREUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IUkVGTEFORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFNQQUNFKSkgewotCQkJLy8gKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hUVFBfRVFVSVYpKSB7Ci0JCQkvLyAoaHR0cC1lcXVpdiBOQU1FICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IVFRQX0VRVUlWLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9JRCkpIHsKLQkJCS8vIChpZCBJRCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0lTTUFQKSkgewotCQkJLy8gKGlzbWFwIChpc21hcCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfSVNNQVB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9JU01BUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSVNUWUxFKSkgewotCQkJLy8gKGlzdHlsZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSVNUWUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MQUJFTCkpIHsKLQkJCS8vIChsYWJlbCAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBQkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MQU5HKSkgewotCQkJLy8gKGxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEFOR1VBR0VfQ09ERSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xBTkdVQUdFKSkgewotCQkJLy8gKGxhbmd1YWdlICVDREFUQTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBTkdVQUdFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MSU5LKSkgewotCQkJLy8gKGxpbmsgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xJTkssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xPTkdERVNDKSkgewotCQkJLy8gKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTE9OR0RFU0MsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xPT1ApKSB7Ci0JCQkvLyAobG9vcCBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTE9PUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFDUk8pKSB7Ci0JCQkvLyAobWFjcm8gQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BQ1JPLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVBGSUxFKSkgewotCQkJLy8gKG1hcGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVBGSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVJHSU5XSURUSCkpIHsKLQkJCS8vIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVJHSU5XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFSR0lOSEVJR0hUKSkgewotCQkJLy8gKG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVJHSU5IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BWExFTkdUSCkpIHsKLQkJCS8vIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFYTEVOR1RILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVlTQ1JJUFQpKSB7Ci0JCQkvLyAobWF5c2NyaXB0IChtYXlzY3JpcHQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01BWVNDUklQVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BWVNDUklQVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUVESUEpKSB7Ci0JCQkvLyAobWVkaWEgJU1lZGlhRGVzYzsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTUVESUFfREVTQyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01FRElBLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NRVRIT0QpKSB7Ci0JCQkvLyAobWV0aG9kIChHRVR8UE9TVCkgR0VUKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9HRVQsIEFUVFJfVkFMVUVfUE9TVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUVUSE9ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NVUxUSVBMRSkpIHsKLQkJCS8vIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01VTFRJUExFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTVVMVElQTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05BTUUpKSB7Ci0JCQkvLyAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9IUkVGKSkgewotCQkJLy8gKG5vaHJlZiAobm9ocmVmKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT0hSRUZ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT0hSRUYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05PUkVTSVpFKSkgewotCQkJLy8gKG5vcmVzaXplIChub3Jlc2l6ZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTk9SRVNJWkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1JFU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9TSEFERSkpIHsKLQkJCS8vIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1NIQURFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTk9TSEFERSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9XUkFQKSkgewotCQkJLy8gKG5vd3JhcCAobm93cmFwKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1dSQVB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1dSQVAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09CSkVDVCkpIHsKLQkJCS8vIChvYmplY3QgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfT0JKRUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT0JKRUNULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkJMVVIpKSB7Ci0JCQkvLyAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQkxVUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05DTElDSykpIHsKLQkJCS8vIChvbmNsaWNrICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ0xJQ0ssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OQ0hBTkdFKSkgewotCQkJLy8gKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ0hBTkdFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkRCTENMSUNLKSkgewotCQkJLy8gKG9uZGJsY2xpY2sgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05EQkxDTElDSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05GT0NVUykpIHsKLQkJCS8vCShvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09ORk9DVVMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OSEVMUCkpIHsKLQkJCS8vIChvbmhlbHAgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05IRUxQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTktFWVBSRVNTKSkgewotCQkJLy8gKG9ua2V5cHJlc3MgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05LRVlQUkVTUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05LRVlET1dOKSkgewotCQkJLy8gKG9ua2V5ZG93biAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTktFWURPV04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OS0VZVVApKSB7Ci0JCQkvLyAob25reWV1cCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTktFWVVQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkxPQUQpKSB7Ci0JCQkvLyAob25sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OTE9BRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRURPV04pKSB7Ci0JCQkvLyAob25tb3VzZWRvd24gJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRURPV04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTU9VU0VVUCkpIHsKLQkJCS8vIChvbm1vdXNldXAgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRVVQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTk1PVVNFT1ZFUikpIHsKLQkJCS8vIChvbm1vdXNlb3ZlciAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFT1ZFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRU1PVkUpKSB7Ci0JCQkvLyAob25tb3VzZW1vdmUgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRU1PVkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTU9VU0VPVVQpKSB7Ci0JCQkvLyAob25tb3VzZW91dCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFT1VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlJFU0VUKSkgewotCQkJLy8gKG9ucmVzZXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05SRVNFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05TRUxFQ1QpKSB7Ci0JCQkvLyAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TRUxFQ1QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OU1VCTUlUKSkgewotCQkJLy8gKG9uc3VibWl0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OU1VCTUlULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlVOTE9BRCkpIHsKLQkJCS8vIChvbnVubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlVOTE9BRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUEFMRVRURSkpIHsKLQkJCS8vIChwYWxldHRlIENEQVRBOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUEFMRVRURSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUEFORUwpKSB7Ci0JCQkvLyAocGFuZWwgQ0RBVEE7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QQU5FTCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUExBWUNPVU5UKSkgewotCQkJLy8gKHBsYXljb3VudCBOVU1CRVI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUExBWUNPVU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QUk9GSUxFKSkgewotCQkJLy8gKHByb2ZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QUk9GSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QUk9NUFQpKSB7Ci0JCQkvLyAocHJvbXB0ICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUFJPTVBULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SRUFET05MWSkpIHsKLQkJCS8vIChyZWFkb25seSAocmVhZG9ubHkpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1JFQURPTkxZfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVBRE9OTFksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JFUEVBVCkpIHsKLQkJCS8vIChyZXBlYXQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JFUEVBVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUkVMKSkgewotCQkJLy8gKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MSU5LX1RZUEVTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SRVYpKSB7Ci0JCQkvLyAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxJTktfVFlQRVMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SRVYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JPV1MpKSB7Ci0JCQkvLyAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUk9XUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUk9XU1BBTikpIHsKLQkJCS8vIChyb3dzcGFuIE5VTUJFUiAxKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV8xKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUk9XU1BBTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUlVMRVMpKSB7Ci0JCQkvLyAocnVsZXMgJVRSdWxlczsgI0lNUExJRUQpCi0JCQkvLyAlVFJ1bGVzOyBpcyAobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTk9ORSwgQVRUUl9WQUxVRV9HUk9VUFMsIEFUVFJfVkFMVUVfUk9XUywgQVRUUl9WQUxVRV9DT0xTLCBBVFRSX1ZBTFVFX0FMTH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JVTEVTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ0FMRSkpIHsKLQkJCS8vIChzY2FsZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NBTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDSEVNRSkpIHsKLQkJCS8vIChzY2hlbWUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDSEVNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0VMRUNURUQpKSB7Ci0JCQkvLyAoc2VsZWN0ZWQgKHNlbGVjdGVkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9TRUxFQ1RFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NFTEVDVEVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ09QRSkpIHsKLQkJCS8vIChTQ09QRSAlU2NvcGU7ICNJTVBMSUVEKQotCQkJLy8gJVNjb3BlOyBpcyAocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUk9XLCBBVFRSX1ZBTFVFX0NPTCwgQVRUUl9WQUxVRV9ST1dHUk9VUCwgQVRUUl9WQUxVRV9DT0xHUk9VUH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDT1BFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ1JPTExBTU9VTlQpKSB7Ci0JCQkvLyAoc2Nyb2xsYW1vdW50IE5VTUJFUiAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDUk9MTEFNT1VOVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0NST0xMREVMQVkpKSB7Ci0JCQkvLyAoc2Nyb2xsZGVsYXkgTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NST0xMREVMQVksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDUk9MTElORykpIHsKLQkJCS8vIChzY3JvbGxpbmcgKHllc3xub3xhdXRvKSBhdXRvKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9ZRVMsIEFUVFJfVkFMVUVfTk8sIEFUVFJfVkFMVUVfQVVUT307Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQVVUTyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDUk9MTElORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0hBUEUpKSB7Ci0JCQkvLyAoc2hhcGUgJVNoYXBlOyByZWN0KTogJVNoYXBlOyBpcyAocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUkVDVCwgQVRUUl9WQUxVRV9DSVJDTEUsIEFUVFJfVkFMVUVfUE9MWSwgQVRUUl9WQUxVRV9ERUZBVUxUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9SRUNUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0hBUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NIT1dDT05UUk9MUykpIHsKLQkJCS8vIChzaG93Y29udHJvbHMgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0hPV0NPTlRST0xTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TSVpFKSkgewotCQkJLy8gKHNpemUgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0laRUZNVCkpIHsKLQkJCS8vIChzaXplZm10IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSVpFRk1ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUEFOKSkgewotCQkJLy8gKHNwYW4gTlVNQkVSIDEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TUEFOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUkMpKSB7Ci0JCQkvLyAoc3JjICVVUkk7ICNJTVBMSUVEKQotCQkJLy8gTk9URTogInNyYyIgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiBzZXZlcmFsIGVsZW1lbnRzLgotCQkJLy8JCSBUaGUgZGVmaW5pdGlvbiBvZiBJTUcgaXMgZGlmZmVyZW50IGZyb20gb3RoZXJzLgotCQkJLy8JCSBTbywgaXQgc2hvdWxkIGJlIGxvY2FsbHkgZGVmaW5lZC4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU1RBUlQpKSB7Ci0JCQkvLyAoc3RhcnQgTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1RBUlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NUQU5EQlkpKSB7Ci0JCQkvLyAoc3RhbmRieSAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NUQU5EQlksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NUWUxFKSkgewotCQkJLy8gKHN0eWxlICVTdHlsZVNoZWV0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TVFlMRV9TSEVFVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NUWUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TVU1NQVJZKSkgewotCQkJLy8gKHN1bW1hcnkgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TVU1NQVJZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UQUJJTkRFWCkpIHsKLQkJCS8vICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UQUJJTkRFWCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVEFSR0VUKSkgewotCQkJLy8gKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkZSQU1FX1RBUkdFVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RBUkdFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVEVYVCkpIHsKLQkJCS8vICh0ZXh0IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9URVhULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9URVhURk9DVVMpKSB7Ci0JCQkvLyAodGV4dGZvY3VzIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9URVhURk9DVVMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RJVExFKSkgewotCQkJLy8gKHRpdGxlICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVElUTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RJTUVGTVQpKSB7Ci0JCQkvLyAodGltZWZtdCBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVElNRUZNVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVFJVRVNQRUVEKSkgewotCQkJLy8gKHRydWVzcGVlZCAodHJ1ZXNwZWVkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9UUlVFU1BFRUR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UUlVFU1BFRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RZUEUpKSB7Ci0JCQkvLyAodHlwZSAlQ290ZW50VHlwZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVVNFTUFQKSkgewotCQkJLy8gKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1VTRU1BUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkFMSUdOKSkgewotCQkJLy8gKHZhbGlnbiAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9CQVNFTElORX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZBTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkFMVUUpKSB7Ci0JCQkvLyAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZBTFVFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQUxVRVRZUEUpKSB7Ci0JCQkvLyAodmFsdWV0eXBlIChEQVRBfFJFRnxPQkpFQ1QpIERBVEEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0RBVEEsIEFUVFJfVkFMVUVfUkVGLCBBVFRSX1ZBTFVFX09CSkVDVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZBTFVFVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkFSKSkgewotCQkJLy8gKHZhciBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WRVJTSU9OKSkgewotCQkJLy8gKHZlcnNpb24gQ0RBVEEgI0ZJWEVEICclSFRNTC5WZXJzaW9uOykKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQsIEFUVFJfVkFMVUVfVkVSU0lPTl9UUkFOU0lUSU9OQUwpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WRVJTSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5GSVhFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WSVJUVUFMKSkgewotCQkJLy8gKHZpcnR1YWwgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WSVJUVUFMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WTElOSykpIHsKLQkJCS8vICh2bGluayAlQ29sb3I7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTE9SKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkxJTkssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZPTFVNRSkpIHsKLQkJCS8vICh2b2x1bWUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZPTFVNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfV0lEVEgpKSB7Ci0JCQkvLyAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZTUEFDRSkpIHsKLQkJCS8vICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVlNQQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJCS8vIDw8RDIwNTUxNAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RPUE1BUkdJTikpIHsKLQkJCS8vICh0b3BtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVE9QTUFSR0lOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CT1RUT01NQVJHSU4pKSB7Ci0JCQkvLyAoYm90dG9tbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JPVFRPTU1BUkdJTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTEVGVE1BUkdJTikpIHsKLQkJCS8vIChsZWZ0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xFRlRNQVJHSU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JJR0hUTUFSR0lOKSkgewotCQkJLy8gKHJpZ2h0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JJR0hUTUFSR0lOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CT1JERVJDT0xPUikpIHsKLQkJCS8vIChib3JkZXJjb2xvciwgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JPUkRFUkNPTE9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQkvLyBEMjA1NTE0Ci0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHVua25vd24gYXR0cmlidXRlOyBtYXliZSBlcnJvci4KLQkJCS8vIHNob3VsZCB3YXJuLgotCQkJYXR0ciA9IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxpZ24gYXR0cmlidXRlIHdoaWNoIGhhcyAlQ0FsaWduOyBhcyB2YWx1ZXMuLgotCSAqIEF0IHRoaXMgdGltZSAoNC8xOS8yMDAxKSwgaXQgaXMgaWRlbnRpY2FsIHRvICVMQWxpZ247LgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNNTmFtZWROb2RlTWFwSW1wbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvckNhcHRpb24oKSB7Ci0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXMKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxpZ24gYXR0cmlidXRlIHdoaWNoIGhhcyAlSUFsaWduOyBhcyB2YWx1ZXMuLgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNNTmFtZWROb2RlTWFwSW1wbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvckltYWdlKCkgewotCQkvLyBhbGlnbiAobG9jYWwpCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9NSURETEUsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGlnbiBhdHRyaWJ1dGUgd2hpY2ggaGFzICVMQWxpZ247IGFzIHZhbHVlcy4uCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ01OYW1lZE5vZGVNYXBJbXBsCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9yTGVnZW5kKCkgewotCQkvLyBhbGlnbiAobG9jYWwpCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBmb3IgPGNvZGU+YWxpZ248L2NvZGU+Ci0JICogaW4gc2V2ZXJhbCBlbGVtZW50cywgbGlrZSA8Y29kZT5QPC9jb2RlPiwgPGNvZGU+RElWPC9jb2RlPi4KLQkgKiBUaGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQgZnJvbSBhdHRyaWJ1dGVzIHRob3NlIGhhdmUgdGhlIHNhbWUgbmFtZQotCSAqIGluIG90aGVyIGVsZW1lbnRzICg8Y29kZT5JTUc8L2NvZGU+IGFuZCA8Y29kZT5UQUJMRTwvY29kZT4pLgotCSAqIFNvLCBpdCBjYW4ndCB0cmVhdCBhcyBnbG9iYWwgYXR0cmlidXRlcy4KLQkgKiA8c3Ryb25nPk5PVEU6IFRoZXNlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBoYXMKLQkgKiBubyBvd25lciBDTURvY3VtZW50IGluc3RhbmNlLjwvc3Ryb25nPgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTEF0dHJEZWNsSW1wbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpIHsKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXM6IGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9DRU5URVIsIEFUVFJfVkFMVUVfUklHSFQsIEFUVFJfVkFMVUVfSlVTVElGWX07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVhdHRyczsgZGVjbGFyYXRpb25zLgotCSAqICVhdHRyczsgY29uc2lzdHMgb2YgJWNvcmVhdHRyczssICVpMThuLCBhbmQgJWV2ZW50czsuCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ01OYW1lZE5vZGVNYXBJbXBsCi0JICovCi0JcHVibGljIHZvaWQgZ2V0QXR0cnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQkvLyAlY29yZWF0dHJzOwotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQ09SRSkuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCQkvLyAlaTE4bjsKLQkJbmFtZXMgPSBBcnJheXMuYXNMaXN0KEkxOE4pLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQkJLy8gJWV2ZW50czsKLQkJbmFtZXMgPSBBcnJheXMuYXNMaXN0KEVWRU5UUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlYm9keWNvbG9yczsgZGVjbGFyYXRpb25zLgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNNTmFtZWROb2RlTWFwSW1wbAotCSAqLwotCXB1YmxpYyB2b2lkIGdldEJvZHljb2xvcnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQk9EWUNPTE9SUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlY2VsbGhhbGlnbjsgZGVjbGFyYXRpb25zLgotCSAqICVjZWxsaGFsaWdoOyBjb25zaXN0cyBvZjoKLQkgKiAgLSAoYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQpCi0JICogIC0gKGNoYXIgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogIC0gKGNoYXJvZmYgJUxlbmd0aDsgI0lNUExJRUQpCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ01OYW1lZE5vZGVNYXBJbXBsCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Q2VsbGhhbGlnbihDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCS8vIChhbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRCkgc2hvdWxkIGJlIGRlZmluZWQKLQkJLy8gbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXMKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9DRU5URVIsIEFUVFJfVkFMVUVfUklHSFQsIEFUVFJfVkFMVUVfSlVTVElGWSwgQVRUUl9WQUxVRV9DSEFSfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQ0VMTEhBTElHTikuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlY2VsbHZhbGlnbjsgZGVjbGFyYXRpb25zLgotCSAqICVjZWxsaGFsaWdoOyBpczoKLQkgKiAgLSAodmFsaWduICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQpCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ01OYW1lZE5vZGVNYXBJbXBsCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Q2VsbHZhbGlnbihDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBkZWMgPSBnZXREZWNsYXJhdGlvbihIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTElHTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxJR04sIGRlYyk7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVjb3JlYXR0cnM7IGRlY2xhcmF0aW9ucy4KLQkgKiBAcGFyYW0gYXR0cmlidXRlcyBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5DTU5hbWVkTm9kZU1hcEltcGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDb3JlKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQkJSXRlcmF0b3IgbmFtZXMgPSBBcnJheXMuYXNMaXN0KENPUkUpLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBnbG9iYWwgYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTEF0dHJyaWJ1dGVEZWNsYXJhdGlvbgotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJQ01Ob2RlIGNtbm9kZSA9IGdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCWlmIChjbW5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCi0JCUhUTUxBdHRyRGVjbEltcGwgZGVjID0gY3JlYXRlKGF0dHJOYW1lKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJcHV0TmFtZWRJdGVtKGF0dHJOYW1lLCBkZWMpOwotCi0JCXJldHVybiBkZWM7Ci0JfQotCi0JLyoqCi0JICogR2V0IGRlY2xhcmF0aW9ucyB3aGljaCBhcmUgc3BlY2lmaWVkIGJ5IG5hbWVzLgotCSAqIEBwYXJhbSBkZWNsYXJhdGlvbnMgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ01OYW1lZE5vZGVNYXBJbXBsCi0JICogQHBhcmFtIG5hbWVzIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGdldERlY2xhcmF0aW9ucyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zLCBJdGVyYXRvciBuYW1lcykgewotCQl3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0KCk7Ci0JCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZGVjID0gZ2V0RGVjbGFyYXRpb24oYXR0ck5hbWUpOwotCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oYXR0ck5hbWUsIGRlYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWV2ZW50czsgZGVjbGFyYXRpb25zLgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNNTmFtZWROb2RlTWFwSW1wbAotCSAqLwotCXB1YmxpYyB2b2lkIGdldEV2ZW50cyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChFVkVOVFMpLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWkxOG47IGRlY2xhcmF0aW9ucy4KLQkgKiBAcGFyYW0gYXR0cmlidXRlcyBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5DTU5hbWVkTm9kZU1hcEltcGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRJMThuKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQkJSXRlcmF0b3IgbmFtZXMgPSBBcnJheXMuYXNMaXN0KEkxOE4pLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0NNQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzNDFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0NNQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci0KLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIENNQ29udGVudCBmb3IgSFRNTCBDTS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Db250ZW50SW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTUNvbnRlbnQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5CT1VOREVEID0gLTE7Ci0JLyoqICAtMTogaXQncyBVTkJPVU5ERUQuICovCi0JcHJpdmF0ZSBpbnQgbWF4T2NjdXIgPSBVTkJPVU5ERUQ7Ci0JLyoqICAwOiBpdCdzIE9QVElPTkFMLCAxLCBpdCdzIFJFUVVJUkVELiAqLwotCXByaXZhdGUgaW50IG1pbk9jY3VyID0gMDsKLQotCS8qKgotCSAqIFRoZSBwcmltYXJ5IGNvbnN0dXJjdG9yLgotCSAqIFVzZSB0aGlzIG9uZSBmb3IgdXN1YWwgY2FzZXMuPGJyPgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnRJbXBsKFN0cmluZyBuYW1lLCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0JCXN1cGVyKG5hbWUpOwotCQltaW5PY2N1ciA9IG1pbjsKLQkJbWF4T2NjdXIgPSBtYXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQlyZXR1cm4gbWF4T2NjdXI7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0JICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gbWluT2NjdXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ01Hcm91cEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ01Hcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiZTM3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0NNR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLS8qKgotICovCi1jbGFzcyBDTUdyb3VwSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUdyb3VwIHsKLQotCXByaXZhdGUgaW50IG9wZXJhdG9yID0gQ01Hcm91cC5TRVFVRU5DRTsKLQlwcml2YXRlIENNTm9kZUxpc3RJbXBsIGNoaWxkcmVuID0gbnVsbDsKLQotCS8qKgotCSAqIENNR3JvdXBJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNR3JvdXBJbXBsKGludCBvcCwgaW50IG1pbk9jY3VyLCBpbnQgbWF4T2NjdXIpIHsKLQkJc3VwZXIobnVsbCwgbWluT2NjdXIsIG1heE9jY3VyKTsKLQkJc3dpdGNoIChvcCkgewotCQkJY2FzZSBDTUdyb3VwLkFMTCA6Ci0JCQljYXNlIENNR3JvdXAuQ0hPSUNFIDoKLQkJCWNhc2UgQ01Hcm91cC5TRVFVRU5DRSA6Ci0JCQkJb3BlcmF0b3IgPSBvcDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCB3YXJuLgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBhcHBlbmRDaGlsZChDTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQlyZXR1cm4gY2hpbGRyZW4uYXBwZW5kTm9kZShjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0Ci0JICovCi0JcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogRUxFTUVOVF9ERUNMQVJBVElPTiwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBHUk9VUCwgRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuR1JPVVA7Ci0JfQotCi0JLyoqCi0JICogZ2V0T3BlcmF0aW9uIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0JICovCi0JcHVibGljIGludCBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIG9wZXJhdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3NzVmNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENNTmFtZWROb2RlTWFwIGludGVyZmFjZS4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW50ZWQgdG8gYmUgdXNlZCBhcyBhIGNvbnRhaW5lciBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotICogSWYgc29tZW9uZSB3YW50cyB0byB1c2UgdGhpcyBjbGFzcyBmb3Igb3RoZXIgcHVycG9zZSwgaGUgbXVzdCBwYXkgYXR0ZW50aW9uCi0gKiB0byB0aGUgZmFjdCB0aGF0IHRoaXMgY2xhc3MgaXMgdG9sZXJhbnQgb2YgdGhlIGtleSBuYW1lIGNhc2UuICBUaGF0IGlzLCB0aGlzCi0gKiBjbGFzcyBkb2VzIG5vdCBkaXN0aW5ndWlzaCAibmFtZSIsICJOQU1FIiwgYW5kICJOYW1lIiBhcyBhIGtleSBuYW1lLgotICovCi1jbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSBpdGVtcyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKCkgewotCQlzdXBlcigpOwotCQlpdGVtcyA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGl0ZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHVua25vd24ga2V5cy4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGNvb2tlZE5hbWUgPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lKTsKLQkJaWYgKCFpdGVtcy5jb250YWluc0tleShjb29rZWROYW1lKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTm9kZSkgaXRlbXMuZ2V0KGNvb2tlZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDTU5vZGUgbm9kZSA9IChDTU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKC0taW5kZXggPCAwKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gaXRlbXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmF3Rm9ybSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZUNhbm9uaWNhbEZvcm0oU3RyaW5nIHJhd0Zvcm0pIHsKLQkJcmV0dXJuIHJhd0Zvcm0udG9VcHBlckNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaXRlbSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBwdXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUsIENNTm9kZSBpdGVtKSB7Ci0JCVN0cmluZyBjb29rZWROYW1lID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZSk7Ci0JCWlmIChpdGVtcy5jb250YWluc0tleShjb29rZWROYW1lKSkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSByZWdpc3RlcmVkLgotCQlpdGVtcy5wdXQoY29va2VkTmFtZSwgaXRlbSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjRhNjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDTU5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotY2xhc3MgQ01OYW1lc3BhY2VJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTmFtZXNwYWNlIHsKLQotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0JLyoqCi0JICogQ01OYW1lc3BhY2VJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTmFtZXNwYWNlSW1wbChTdHJpbmcgdXJpLCBTdHJpbmcgcGZ4KSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCXByZWZpeCA9IHBmeDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5OQU1FX1NQQUNFOwotCX0KLQotCS8qKgotCSAqIGdldFByZWZpeCBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRVUkkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0NNTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQ1ZjE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUxDTVByb3BlcnRpZXM7Ci0KLQotCi0vKioKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTm9kZSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUltcGwoU3RyaW5nIG5tKSB7Ci0JCXN1cGVyKCk7Ci0JCW5hbWUgPSBubTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODIxZmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLS8qKgotICogQW5hbG9nIG9mIGRvbS5Ob2RlTGlzdCBmb3IgQ00uCi0gKiBTbywgdGhlIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgc2ltaWxhciB0bwotICoge0BsaW5rIGNvbS5pYm0uc2VkLm1vZGVsLnhtbC5Ob2RlTGlzdEltcGx9Ljxicj4KLSAqLwotY2xhc3MgQ01Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBDTU5vZGVMaXN0IHsKLQotCXByaXZhdGUgamF2YS51dGlsLlZlY3RvciBub2RlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVMaXN0SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5vZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJbm9kZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBhcHBlbmROb2RlKENNTm9kZSBub2RlKSB7Ci0JCW5vZGVzLmFkZEVsZW1lbnQobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTm9kZSkgbm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9Db21wbGV4VHlwZURlZmluaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZGI3NzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9Db21wbGV4VHlwZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0gKiBpbiBYTUwgU2NoZW1hLjxicj4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCXByb3RlY3RlZCBDTUdyb3VwSW1wbCBjb250ZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb21wbGV4VHlwZURlZmluaXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29tcGxleFR5cGVEZWZpbml0aW9uKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbGxlY3Rpb24gPSBlbGVtZW50Q29sbGVjdGlvbjsKLQkJY3JlYXRlQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhY3R1YWwgY29udGVudCBtb2RlbC4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYW5kIG9ubHkgb25jZSBpbiB0aGUgY29uc3RydWN0b3IuPGJyPgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cAotCSAqLwotCXB1YmxpYyBDTUdyb3VwIGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCS8qIE5PVEU6IERvIHdlIG5lZWQgTE9HSUNBTCB0eXBlPwotCSAqIC0tIDMvNy8yMDAxCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRDb250ZW50VHlwZSgpOwotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgaGludC4KLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRQcmltYXJ5Q2FuZGlkYXRlKCkgewotCQlpZiAocHJpbWFyeUNhbmRpZGF0ZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKHByaW1hcnlDYW5kaWRhdGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y2ZjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEZhY3Rvcnkgb2YgQ29tcGxleFR5cGVEZWZpbml0aW9uLgotICovCi1maW5hbCBjbGFzcyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBkZWZpbml0aW9ucyA9IG51bGw7Ci0JLy8gY29uc3RhbnRzIGZvciBjb21wbGV4IHR5cGUgbmFtZQotCS8qKiBmb3IgQUREUkVTUy4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9BRERSRVNTID0gIkNUWVBFX0FERFJFU1MiOy8vJE5PTi1OTFMtMSQKLQkvKiogQ0RBVEEgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNodWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfQ0RBVEEgPSAiQ1RZUEVfQ0RBVEEiOy8vJE5PTi1OTFMtMSQKLQkvKiogY29sIGdyb3VwIGNvbnRlbnQuIENPTCogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9DT0xVTU5fR1JPVVAgPSAiQ1RZUEVfQ09MVU1OX0dST1VQIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBETC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9ERUZJTklUSU9OX0xJU1QgPSAiQ1RZUEVfREVGSU5JVElPTl9MSVNUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBFTUJFRC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9FTUJFRCA9ICJDVFlQRV9FTUJFRCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBlbXB0eSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2hvdWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRU1QVFkgPSAiQ1RZUEVfRU1QVFkiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEZJRUxEU0VULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZJRUxEU0VUID0gIkNUWVBFX0ZJRUxEU0VUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBGUkFNRVNFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GUkFNRVNFVCA9ICJDVFlQRV9GUkFNRVNFVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmbG93IGNvbnRlbnQuICglZmxvdzspKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZMT1dfQ09OVEFJTkVSID0gIkNUWVBFX0ZMT1dfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGh0bWwgY29udGVudC4gSEVBRCwgKEZSQU1FU0VUfEJPRFkpICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSFRNTCA9ICJDVFlQRV9IVE1MIjsvLyROT04tTkxTLTEkCi0JLyoqIGhlYWQgY29udGVudC4gVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/ICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSEVBRCA9ICJDVFlQRV9IRUFEIjsvLyROT04tTkxTLTEkCi0JLyoqIGlubGluZSBjb250ZW50LiAoJWlubGluZTspKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0lOTElORV9DT05UQUlORVIgPSAiQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBsaXN0IGl0ZW0gY29udGFpbmVyLiAoTEkpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0xJX0NPTlRBSU5FUiA9ICJDVFlQRV9MSV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIE1BUC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9NQVAgPSAiQ1RZUEVfTUFQIjsvLyROT04tTkxTLTEkCi0JLyoqIG5vZnJhbWVzIGNvbnRlbnQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCA9ICJDVFlQRV9OT0ZSQU1FU19DT05URU5UIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBPUFRHUk9VUC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9PUFRJT05fQ09OVEFJTkVSID0gIkNUWVBFX09QVElPTl9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogcGFyYW0gY29udGFpbmVyLiBGb3IgT0JKRUNUL0FQUExFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9QQVJBTV9DT05UQUlORVIgPSAiQ1RZUEVfUEFSQU1fQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIFBDREFUQSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2h1bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9QQ0RBVEEgPSAiQ1RZUEVfUENEQVRBIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBTRUxFQ1QuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfU0VMRUNUID0gIkNUWVBFX1NFTEVDVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSBjb250ZW50LiBDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RBQkxFID0gIkNUWVBFX1RBQkxFIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIGNlbGwgY29udGFpZXIuIChUSHxURCkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVENFTExfQ09OVEFJTkVSID0gIkNUWVBFX1RDRUxMX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSByZWNvcmQgY29udGFpbmVyLiAoVFIpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RSX0NPTlRBSU5FUiA9ICJDVFlQRV9UUl9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCWRlZmluaXRpb25zID0gbmV3IGphdmEudXRpbC5IYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCBmb3IgQ29tcGxleFR5cGVEZWZpbml0aW9uLgotCSAqIEVhY2ggaW5zdGFuY2UgY3JlYXRlZCBpbiB0aGlzIG1ldGhvZCBtdXN0IGJlIHJlZ2lzdGVyZWQgaW50bwotCSAqIHRoZSBtYXAgd2l0aCBpdHMgbmFtZS4KLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqIEBwYXJhbSBkZWZpbml0aW9uTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlRGVmaW5pdGlvbihTdHJpbmcgZGVmaW5pdGlvbk5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCWlmIChkZWZpbml0aW9ucy5jb250YWluc0tleShkZWZpbml0aW9uTmFtZSkpIHsKLQkJCXJldHVybiAoQ29tcGxleFR5cGVEZWZpbml0aW9uKSBkZWZpbml0aW9ucy5nZXQoZGVmaW5pdGlvbk5hbWUpOwotCQl9Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0JCWlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9BRERSRVNTKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkQWRkcmVzcyhlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9DT0xVTU5fR1JPVVApIHsKLQkJCWRlZiA9IG5ldyBDdGRDb2x1bW5Hcm91cChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9ERUZJTklUSU9OX0xJU1QpIHsKLQkJCWRlZiA9IG5ldyBDdGREbChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9FTUJFRCkgewotCQkJZGVmID0gbmV3IEN0ZEVtYmVkKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZJRUxEU0VUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRmllbGRzZXQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfRkxPV19DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRGbG93Q29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZSQU1FU0VUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRnJhbWVzZXQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSEVBRCkgewotCQkJZGVmID0gbmV3IEN0ZEhlYWQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSFRNTCkgewotCQkJZGVmID0gbmV3IEN0ZEh0bWwoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZElubGluZUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9MSV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRMaUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9NQVApIHsKLQkJCWRlZiA9IG5ldyBDdGRNYXAoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCkgewotCQkJZGVmID0gbmV3IEN0ZE5vZnJhbWVzQ29udGVudChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9PUFRJT05fQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkT3B0aW9uQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX1BBUkFNX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZFBhcmFtQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX1NFTEVDVCkgewotCQkJZGVmID0gbmV3IEN0ZFNlbGVjdChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9UQUJMRSkgewotCQkJZGVmID0gbmV3IEN0ZFRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX1RDRUxMX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZFRhYmxlQ2VsbENvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9UUl9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRUckNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIHsKLQkJCWRlZiA9IG51bGw7Ci0JCX0KLQkJaWYgKGRlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhaWwgdG8gY3JlYXRlLgotCQlkZWZpbml0aW9ucy5wdXQoZGVmaW5pdGlvbk5hbWUsIGRlZik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCi0JLyoqCi0JICogRm9yIHNpbmdsZXRvbi48YnI+Ci0JICogQHJldHVybiBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5Ci0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZEFkZHJlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTI0YTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBmb3IgQUREUkVTUy4KLSAqLwotZmluYWwgY2xhc3MgQ3RkQWRkcmVzcyBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkQWRkcmVzcyhFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCglaW5saW5lKSB8IFApKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkqCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gKCVpbmxpbmUpCi0JCUNNR3JvdXBJbXBsIGlubGluZXMgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlpZiAoaW5saW5lcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldElubGluZShpbmxpbmVzKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChpbmxpbmVzKTsKLQkJLy8gUAotCQlDTU5vZGUgcCA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QKTsKLQkJaWYgKHAgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQocCk7Ci0JfQotCi0JLyoqCi0JICogKCglaW5saW5lKSB8IFApKi4KLQkgKiBCZWNhdXNlICVpbmxpbmU7IGNvbnRhaW5zICNQQ0RBVEEsIHRoZSB0eXBlIGlzIE1JWEVELgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9BRERSRVNTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZENvbHVtbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZENvbHVtbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjhlNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRDb2x1bW5Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBDT0wgZ3JvdXAuCi0gKiAoQ09MKSoKLSAqLwotZmluYWwgY2xhc3MgQ3RkQ29sdW1uR3JvdXAgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZENvbHVtbkdyb3VwKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoQ09MKSoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApKgotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gQ09MCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChDT0wpKgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ09MVU1OX0dST1VQOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZERsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZERsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDNkZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGREbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBmb3IgREwuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZERsIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGREbChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gRFQKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gREQKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfREVGSU5JVElPTl9MSVNUOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZEVtYmVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZEVtYmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YWJkZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRFbWJlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBmb3IgRU1CRUQuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEVtYmVkIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRFbWJlZChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRU1CRUQ7Ci0JfQotCi0JLyoqCi0JICogKE5PRU1CRUQpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJLy8gTk9FTUJFRAotCQlDTU5vZGUgbm9lbWJlZCA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0VNQkVEKTsKLQkJaWYgKG5vZW1iZWQgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQobm9lbWJlZCk7Ci0JfQotCi0JLyoqCi0JICogKE5PRU1CRUQpLgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNQkVEOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZEZpZWxkc2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZEZpZWxkc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NGU4ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRGaWVsZHNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBmb3IgRklFTERTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEZpZWxkc2V0IGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRGaWVsZHNldChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxFR0VORDsKLQl9Ci0KLQkvKioKLQkgKiAoI1BDREFUQSwgTEVHRU5ELCAoJWZsb3c7KSopCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggLCAsICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJLy8gI1BDREFUQQotCQkvLyAuLi4/PwotCi0JCS8vIExFR0VORAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxFR0VORCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gKCVmbG93OykqCi0JCUNNR3JvdXBJbXBsIGZsb3dzID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmIChmbG93cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldEZsb3coZmxvd3MpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGZsb3dzKTsKLQl9Ci0KLQkvKioKLQkgKiAoI1BDREFUQSwgTEVHRU5ELCAoJWZsb3c7KSopCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZJRUxEU0VUOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZEZsb3dDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkRmxvd0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjIwMmJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkRmxvd0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciBjb250YWluZXJzIG9mIDxjb2RlPiVmbG93OzwvY29kZT4uCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEZsb3dDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEZsb3dDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICglZmxvdzspKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWNvbGxlY3Rpb24uZ2V0Rmxvdyhjb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZMT1dfQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZEZyYW1lc2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZEZyYW1lc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OWQ5ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRGcmFtZXNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBmb3IgRlJBTUVTRVQuCi0gKiAoKEZSQU1FU0VUIHwgRlJBTUUpKyAmIE5PRlJBTUVTPykKLSAqLwotZmluYWwgY2xhc3MgQ3RkRnJhbWVzZXQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZEZyYW1lc2V0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUU7Ci0JfQotCi0JLyoqCi0JICogKChGUkFNRVNFVCB8IEZSQU1FKSsgJiBOT0ZSQU1FUz8pLgotCSAqIC0tPiAoKEZSQU1FU0VUIHwgRlJBTUUpKyAmIChOT0ZSQU1FUyk/KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICYgKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQUxMLCAxLCAxKTsKLQotCQkvLyAoIHwgKSsKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCi0JCS8vIEZSQU1FU0VUCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBGUkFNRQotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUUpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vICggKT8KLQkJZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBOT0ZSQU1FUwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqICgoRlJBTUVTRVQgfCBGUkFNRSkrICYgTk9GUkFNRVM/KQotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRlJBTUVTRVQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkSGVhZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRIZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NDI0MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRIZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBoZWFkIGNvbnRlbnQuCi0gKiBDb250ZW50IE1vZGVsOiAoVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/KQotICovCi1maW5hbCBjbGFzcyBDdGRIZWFkIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRIZWFkKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEU7Ci0JfQotCi0JLyoqCi0JICogZm9yIEhFQUQuCi0JICogVG8gYXZvaWQgdXNpbmcgaW5jbHVzaW9uLCB0aGUgY29udGVudCBtb2RlbCBjb21lcyBmcm9tIHRoZSBYSFRNTCAxLjAuCi0JICoKLQkgKiAoJWhlYWQubWlzYzssICgodGl0bGUsICVoZWFkLm1pc2M7LCAoYmFzZSwgJWhlYWQubWlzYzspPykgfCAoYmFzZSwgJWhlYWQubWlzYzssICh0aXRsZSwgJWhlYWQubWlzYzspKSkpCi0JICogQW5kICVoZWFkLm1pc2M7IGlzOgotCSAqIChzY3JpcHR8c3R5bGV8bWV0YXxsaW5rfG9iamVjdHxpc2luZGV4KSoKLQkgKgotCSAqIDA6ICglaGVhZC5taXNjLCBBKQotCSAqIEE6IChCIHwgQykKLQkgKiBCOiAodGl0bGUsICVoZWFkLm1pc2M7LCBEKQotCSAqIEM6IChiYXNlLCAlaGVhZC5taXNjOywgRSkKLQkgKiBEOiAoYmFzZSwgJWhlYWQubWlzYzspPwotCSAqIEU6ICh0aXRsZSwgJWhlYWQubWlzYzspCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEF0IDFzdCwgY3JlYXRlICVoZWFkLm1pc2M7IGNvbnRlbnQuCi0JCS8vICVoZWFkLm1pc2M7Ci0JCS8vICAgKCB8ICkqCi0JCUNNR3JvdXBJbXBsIG1pc2MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKG1pc2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkssIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1QsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JU0lOREVYfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobWlzYywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vIDJuZCwgZ2V0IGEgdGl0bGUKLQkJQ01Ob2RlIHRpdGxlID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFKTsKLQkJLy8gM3JkLCBnZXQgYSBiYXNlCi0JCUNNTm9kZSBiYXNlID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UpOwotCQlpZiAodGl0bGUgPT0gbnVsbCB8fCBiYXNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gVG9wIGxldmVsIGNvbnRlbnQgaXMgYSBzZXF1ZW5jZSBvZiAlaGVhZC5taXNjOyBhbmQgQS4KLQkJLy8gMDogKCVoZWFkLm1pc2M7LCBBKQotCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCS8vICAgY3JlYXRlIEEgYW5kIGFwcGVuZCBpdCB0byB0aGUgdG9wIGxldmVsLgotCQl7Ci0JCQkvLyBBIGlzIGEgY2hvaWNlIG9mIEIgYW5kIEMuCi0JCQkvLyBBOiAoQiB8IEMpCi0JCQkvLyAgIGNyZWF0ZSBhIGNob2ljZQotCQkJQ01Hcm91cEltcGwgZ0EgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQkJaWYgKGdBID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJLy8gICBhcHBlbmQgQSB0byB0aGUgdG9wIGxldmVsLgotCQkJY29udGVudC5hcHBlbmRDaGlsZChnQSk7Ci0KLQkJCS8vIGNyZWF0ZSBCIGFuZCBhcHBlbmQgaXQgdG8gQQotCQkJewotCQkJCS8vIEIgaXMgYSBzZXF1ZW5jZSBvZiB0aXRsZSwgJWhlYWQubWlzYzssIGFuZCBELgotCQkJCS8vIEI6ICh0aXRsZSwgJWhlYWQubWlzYzssIEQpCi0JCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCUNNR3JvdXBJbXBsIGdCID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCWlmIChnQiA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gICBhcHBlbmQgQiB0byBBLgotCQkJCWdBLmFwcGVuZENoaWxkKGdCKTsKLQotCQkJCS8vICAgYXBwZW5kIHRpdGxlIHRvIEIKLQkJCQlnQi5hcHBlbmRDaGlsZCh0aXRsZSk7Ci0JCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gQgotCQkJCWdCLmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCS8vICAgY3JlYXRlIEQgYW5kIGFwcGVuZCBpdCB0byBCLgotCQkJCXsKLQkJCQkJLy8gRCBpcyBhIHNlcXVlbmNlIG9mIGJhc2UsICVoZWFkLm1pc2M7LgotCQkJCQkvLyBEOiAoYmFzZSwgJWhlYWQubWlzYzspPwotCQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJCUNNR3JvdXBJbXBsIGdEID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIDEpOwotCQkJCQlpZiAoZ0QgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJLy8gICBhcHBlbmQgRCB0byBCLgotCQkJCQlnQi5hcHBlbmRDaGlsZChnRCk7Ci0KLQkJCQkJLy8gICBhcHBlbmQgYmFzZSB0byBECi0JCQkJCWdELmFwcGVuZENoaWxkKGJhc2UpOwotCQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBELgotCQkJCQlnRC5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjcmVhdGUgQyBhbmQgYXBwZW5kIGl0IHRvIEEKLQkJCXsKLQkJCQkvLyBDIGlzIGEgc2VxdWVuY2Ugb2YgYmFzZSwgJWhlYWQubWlzYzssIGFuZCBFCi0JCQkJLy8gQzogKGJhc2UsICVoZWFkLm1pc2M7LCBFKQotCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQlDTUdyb3VwSW1wbCBnQyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQlpZiAoZ0MgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCS8vICAgYXBwZW5kIEMgdG8gQS4KLQkJCQlnQS5hcHBlbmRDaGlsZChnQyk7Ci0KLQkJCQkvLyAgIGFwcGVuZCBiYXNlIHRvIEMKLQkJCQlnQy5hcHBlbmRDaGlsZChiYXNlKTsKLQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBDCi0JCQkJZ0MuYXBwZW5kQ2hpbGQobWlzYyk7Ci0KLQkJCQkvLyAgIGNyZWF0ZSBFIGFuZCBhcHBlbmQgaXQgdG8gQy4KLQkJCQl7Ci0JCQkJCS8vIEUgaXMgYSBzZXF1ZW5jZSBvZiB0aXRsZSBhbmQgJWhlYWQubWlzYzsuCi0JCQkJCS8vIEU6ICh0aXRsZSwgJWhlYWQubWlzYzspCi0JCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQkJQ01Hcm91cEltcGwgZ0UgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJCWlmIChnRSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQkvLyAgIGFwcGVuZCBFIHRvIEMuCi0JCQkJCWdDLmFwcGVuZENoaWxkKGdFKTsKLQotCQkJCQkvLyAgIGFwcGVuZCB0aXRsZSB0byBFCi0JCQkJCWdFLmFwcGVuZENoaWxkKHRpdGxlKTsKLQkJCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gRS4KLQkJCQkJZ0UuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRWxlbWVudCBjb250ZW50Ljxicj4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSEVBRDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRIdG1sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZEh0bWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzYmE2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZEh0bWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciA8Y29kZT5IVE1MPC9jb2RlPi48YnI+Ci0gKiBDb250ZW50IE1vZGVsOgotICogSEVBRCwgKEZSQU1FU0VUfEJPRFkpPGJyPgotICovCi1maW5hbCBjbGFzcyBDdGRIdG1sIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRIdG1sKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRDsKLQl9Ci0KLQkvKioKLQkgKiAoJWh0bWwuY29udGVudDspLgotCSAqICVodG1sLmNvbnRlbnQ7IGlzIEhFQUQsIChGUkFNRVNFVCB8IEJPRFkpLgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ29tcGxleFR5cGVEZWZpbml0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEhFQUQKLQkJQ01Ob2RlIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JCS8vICggfCApCi0JCUNNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChncm91cCk7Ci0KLQkJLy8gRlJBTUVTRVQsIEJPRFkKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWX07Ci0JCWNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50IGNvbnRlbnQuCi0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5Db21wbGV4VHlwZURlZmluaXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hUTUw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVlNmI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yICglaW5saW5lOykqLgotICovCi1maW5hbCBjbGFzcyBDdGRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZElubGluZUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCVpbmxpbmUpKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldElubGluZShjb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkTGlDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkTGlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1NmYwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZExpQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIExpc3QgaXRlbSBjb250YWluZXIuCi0gKiAoTEkpKwotICovCi1maW5hbCBjbGFzcyBDdGRMaUNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVuQ29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRMaUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJOwotCX0KLQotCS8qKgotCSAqIChMSSkrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoTEkpKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJQ01Ob2RlIGxpID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJKTsKLQkJaWYgKGxpICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGxpKTsKLQl9Ci0KLQkvKioKLQkgKiBFTEVNRU5UIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTElfQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZE1hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyOTVlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBmb3IgTUFQLgotICovCi1maW5hbCBjbGFzcyBDdGRNYXAgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZE1hcChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFSRUE7Ci0JfQotCi0JLyoqCi0JICogKCglYmxvY2s7KSB8IEFSRUEpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gKCVibG9jazspCi0JCUNNR3JvdXBJbXBsIGJsb2NrcyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChibG9ja3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29sbGVjdGlvbi5nZXRCbG9jayhibG9ja3MpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGJsb2Nrcyk7Ci0JCS8vIEFSRUEKLQkJQ01Ob2RlIGFyZWEgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVJFQSk7Ci0JCWlmIChhcmVhICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGFyZWEpOwotCX0KLQotCS8qKgotCSAqICgoJWJsb2NrOykgfCBBUkVBKSsuCi0JICogQmVjYXVzZSAlYmxvY2s7IGNvbnNpc3RzIG9mIGVsZW1lbnRzIG9ubHksIHRoZSB0eXBlIGlzIEVMRU1FTlQuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTUFQOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZE5vZnJhbWVzQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGROb2ZyYW1lc0NvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyMjBhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZE5vZnJhbWVzQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBmb3IgTk9GUkFNRVMuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZE5vZnJhbWVzQ29udGVudCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTm9mcmFtZXNDb250ZW50KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWTsKLQl9Ci0KLQkvKioKLQkgKiAoQk9EWSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkvLyBCT0RZCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoQk9EWSkKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9OT0ZSQU1FU19DT05URU5UOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRPcHRpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyMzdiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBPUFRJT04gY29udGFpbmVyLgotICogKE9QVElPTikrCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZE9wdGlvbkNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkT3B0aW9uQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OOwotCX0KLQotCS8qKgotCSAqIChPUFRJT04pKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gT1BUSU9OCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChPUFRJT04pKwotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRQYXJhbUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRQYXJhbUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODdlYzM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkUGFyYW1Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogUEFSQU0gY29udGFpbmVyLiAgRm9yIE9CSkVDVCBhbmQgQVBQTEVULgotICovCi1maW5hbCBjbGFzcyBDdGRQYXJhbUNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkUGFyYW1Db250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIChQQVJBTSB8ICVmbG93OykqLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSoKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBQQVJBTQotCQlDTU5vZGUgcGFyYW0gPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU0pOwotCQlpZiAocGFyYW0gIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQocGFyYW0pOwotCQkvLyAlZmxvdzsKLQkJQ01Hcm91cEltcGwgZmxvd3MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlpZiAoZmxvd3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29sbGVjdGlvbi5nZXRJbmxpbmUoZmxvd3MpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGZsb3dzKTsKLQl9Ci0KLQkvKioKLQkgKiAoUEFSQU0gfCAlZmxvdzspKi4KLQkgKiBCZWNhdXNlICVmbG93OyBjb250YWlucyAjUENEQVRBLCB0aGUgdHlwZSBpcyBNSVhFRC4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUEFSQU1fQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZFNlbGVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRTZWxlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwM2YyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZFNlbGVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBmb3IgU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBDdGRTZWxlY3QgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFNlbGVjdChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUR1JPVVAgfCBPUFRJT04pKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gT1BUR1JPVVAKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRHUk9VUCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gT1BUSU9OCi0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT04pOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKE9QVEdST1VQIHwgT1BUSU9OKSsuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfU0VMRUNUOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZFRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZFRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNWY0YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogZm9yIFRBQkxFLgotICogKENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrKQotICovCi1maW5hbCBjbGFzcyBDdGRUYWJsZSBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkVGFibGUoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWTsKLQl9Ci0KLQkvKioKLQkgKiAoQ0FQVElPTj8sIChDT0wqfENPTEdST1VQKiksIFRIRUFEPywgVEZPT1Q/LCBUQk9EWSspCi0JICogLS0+ICgoQ0FQVElPTik/LCAoKENPTCkqIHwgKENPTEdST1VQKSopLCAoVEhFQUQpPywgKFRGT09UKT8sIChUQk9EWSkrKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICwgLCAsICwpCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0KLQkJLy8gKENBUFRJT04pPwotCQkvLyAgICAgKCApPwotCQlDTUdyb3VwSW1wbCB3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIDEpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKHdyYXApOwotCQkvLyAgICAgQ0FQVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNBUFRJT04pOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gKChDT0wpKiB8IChDT0xHUk9VUCkqKQotCQkvLyAgICAgKCB8ICkKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZChncm91cCk7Ci0JCS8vICAgICAgICAgKENPTCkqCi0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlncm91cC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gICAgICAgICAoQ09MR1JPVVApKgotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ3JvdXAuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0xHUk9VUCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQotCQkvLyAoVEhFQUQpPwotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIDEpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gKFRGT09UKT8KLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vIChUQk9EWSkrCi0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFkpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKChGUkFNRVNFVCB8IEZSQU1FKSsgJiBOT0ZSQU1FUz8pCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UQUJMRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRUYWJsZUNlbGxDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkVGFibGVDZWxsQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjIxZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9DdGRUYWJsZUNlbGxDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogVGFibGUgY2VsbCBjb250YWluZXIuCi0gKiAoVEggfCBURCkrCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFRhYmxlQ2VsbENvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkVGFibGVDZWxsQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEQ7Ci0JfQotCi0JLyoqCi0JICogKFRIIHwgVEQpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIFRICi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEgpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JCS8vIFRECi0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoVEggfCBURCkrCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UQ0VMTF9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkVHJDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvQ3RkVHJDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0OTRiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0N0ZFRyQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIFRhYmxlIHJlY29yZCBjb250YWluZXIuCi0gKiAoVFIpKwotICovCi1maW5hbCBjbGFzcyBDdGRUckNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkVHJDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUjsKLQl9Ci0KLQkvKioKLQkgKiAoVFIpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKFRSKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCUNNTm9kZSB0ciA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUik7Ci0JCWlmICh0ciAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZCh0cik7Ci0JfQotCi0JLyoqCi0JICogRUxFTUVOVCBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RSX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9EZWNsQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9EZWNsQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTQ0OWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvRGVjbENvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRHVhbE1hcCB7Ci0JCXB1YmxpYyBEdWFsTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBEdWFsTWFwKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpbml0aWFsaXplKG9iamVjdHMpOwotCQl9Ci0KLQkJcHVibGljIGludCBzaXplKCkgewotCQkJcmV0dXJuIHRhYmxlLmxlbmd0aDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoaW50IGtleSkgewotCQkJaWYgKCFpc1ZhbGlkSW5kZXgoa2V5KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiB0YWJsZVtrZXldOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRLZXkoT2JqZWN0IHZhbHVlKSB7Ci0JCQlJbnRlZ2VyIGtleU9iaiA9IChJbnRlZ2VyKSBtYXAuZ2V0KHZhbHVlKTsKLQkJCWlmIChrZXlPYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gSURfVU5LTk9XTjsKLQkJCXJldHVybiBrZXlPYmouaW50VmFsdWUoKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoT2JqZWN0W10gb2JqZWN0cykgewotCQkJaWYgKG9iamVjdHMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl0YWJsZSA9IG9iamVjdHM7Ci0JCQltYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQga2V5ID0gMDsga2V5IDwgb2JqZWN0cy5sZW5ndGg7IGtleSsrKSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gdGFibGVba2V5XTsKLQkJCQltYXAucHV0KHZhbHVlLCBuZXcgSW50ZWdlcihrZXkpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgT2JqZWN0W10gdGFibGUgPSBudWxsOwotCQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbnVsbDsKLQotCQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZEluZGV4KGludCBpbmRleCkgewotCQkJcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCB0YWJsZS5sZW5ndGg7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVG9sZXJhbnRTdHJpbmdEdWFsTWFwIGV4dGVuZHMgRHVhbE1hcCB7Ci0JCXB1YmxpYyBUb2xlcmFudFN0cmluZ0R1YWxNYXAoU3RyaW5nW10gbmFtZXMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFtuYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCW9iamVjdHNbaV0gPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lc1tpXSk7Ci0JCQl9Ci0JCQlpbml0aWFsaXplKG9iamVjdHMpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRLZXkoT2JqZWN0IHZhbHVlKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEtleShtYWtlQ2Fub25pY2FsRm9ybShuYW1lKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gSURfVU5LTk9XTjsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIG1ha2VDYW5vbmljYWxGb3JtKFN0cmluZyByYXcpIHsKLQkJCXJldHVybiByYXcudG9VcHBlckNhc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRGVjbEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwdWJsaWMgRGVjbEl0ZXJhdG9yKCkgewotCQkJbWF4aWQgPSBmRGVjbHMubGVuZ3RoIC0gMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gaWQgPCBtYXhpZDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCWlmICghaGFzTmV4dCgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGl0ZW0oKytpZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7IC8qIG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUuICovCi0JCX0KLQotCQlwcml2YXRlIGludCBpZCA9IC0xOwotCQlwcml2YXRlIGludCBtYXhpZCA9IC0xOwotCX0KLQotCUNNTm9kZVtdIGZEZWNscyA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFNUUklDVF9DQVNFID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFRPTEVSQU5UX0NBU0UgPSB0cnVlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IElEX1VOS05PV04gPSAtMTsKLQlwcml2YXRlIER1YWxNYXAgZk1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRGVjbENvbGxlY3Rpb24oU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gdG9sZXJhbnQpIHsKLQkJc3VwZXIoKTsKLQkJZkRlY2xzID0gbmV3IENNTm9kZVtuYW1lcy5sZW5ndGhdOwotCQlpZiAodG9sZXJhbnQpIHsKLQkJCWZNYXAgPSBuZXcgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKG5hbWVzKTsKLQkJfQotCQllbHNlIHsKLQkJCWZNYXAgPSBuZXcgRHVhbE1hcChuYW1lcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBpZCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RGVjbGFyYXRpb25zKFN0cmluZ1tdIG5hbWVzKSB7Ci0JCUNNTmFtZWROb2RlTWFwSW1wbCBtYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gbmFtZXNbaV07Ci0JCQlDTU5vZGUgbm9kZSA9IGdldE5hbWVkSXRlbShuYW1lKTsKLQkJCWlmIChub2RlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQltYXAucHV0TmFtZWRJdGVtKG5hbWUsIG5vZGUpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlY2xhcmF0aW9ucyBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5DTUdyb3VwSW1wbAotCSAqIEBwYXJhbSBuYW1lcyBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXREZWNsYXJhdGlvbnMoQ01Hcm91cEltcGwgZ3JvdXAsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOwotCQkJQ01Ob2RlIGRlYyA9IGdldE5hbWVkSXRlbShlbnRpdHlOYW1lKTsKLQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFwIG5hbWUgdG8gaWQuCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRJRChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZk1hcC5nZXRLZXkobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmRGVjbHMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpZCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoaW50IGlkKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBmTWFwLmdldFZhbHVlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQobmFtZSk7Ci0JCWlmICghaXNWYWxpZElEKGlkKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaXRlbShpZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGlkIGludAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSUQoaW50IGlkKSB7Ci0JCXJldHVybiBpZCA+PSAwICYmIGlkIDwgZkRlY2xzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1ZhbGlkSUQoaW5kZXgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNTm9kZSBkZWNsID0gZkRlY2xzW2luZGV4XTsKLQkJaWYgKGRlY2wgIT0gbnVsbCkKLQkJCXJldHVybiBkZWNsOyAvLyBhbHJlYWR5IGV4aXN0LgotCi0JCWRlY2wgPSBjcmVhdGUoZ2V0TmFtZShpbmRleCkpOwotCQlmRGVjbHNbaW5kZXhdID0gZGVjbDsKLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IERlY2xJdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZGEwMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9FbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCi0KLQkvLyBFbGVtZW50IElEcwotCXByaXZhdGUgc3RhdGljIGNsYXNzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0EgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQkJSID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNST05ZTSA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FERFJFU1MgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUFBMRVQgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUkVBID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQiA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JBU0UgPSA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CQVNFRk9OVCA9IDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JETyA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JJRyA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CTElOSyA9IDExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CTE9DS1FVT1RFID0gMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JPRFkgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlIgPSAxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlVUVE9OID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NBUFRJT04gPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VOVEVSID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NJVEUgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09ERSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT0wgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09MR1JPVVAgPSAyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREQgPSAyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVMID0gMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RGTiA9IDI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVIgPSAyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElWID0gMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RMID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RUID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNQkVEID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZJRUxEU0VUID0gMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPTlQgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk9STSA9IDMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFNRSA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFNRVNFVCA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMSA9IDM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMiA9IDM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMyA9IDM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INCA9IDM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INSA9IDQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INiA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IRUFEID0gNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hSID0gNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hUTUwgPSA0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSSA9IDQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JRlJBTUUgPSA0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1HID0gNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOUFVUID0gNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOUyA9IDQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JU0lOREVYID0gNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0tCRCA9IDUxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQUJFTCA9IDUyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRUdFTkQgPSA1MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEkgPSA1NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTElOSyA9IDU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NQVAgPSA1NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUVOVSA9IDU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NRVRBID0gNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PRU1CRUQgPSA1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9GUkFNRVMgPSA2MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9TQ1JJUFQgPSA2MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0JKRUNUID0gNjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09MID0gNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QVEdST1VQID0gNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QVElPTiA9IDY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QID0gNjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNID0gNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSRSA9IDY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9RID0gNjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1MgPSA3MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0FNUCA9IDcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ1JJUFQgPSA3MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VMRUNUID0gNzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NNQUxMID0gNzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NQQU4gPSA3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1RSSUtFID0gNzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NUUk9ORyA9IDc3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVFlMRSA9IDc4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVUIgPSA3OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQID0gODA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RBQkxFID0gODE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RCT0RZID0gODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1REID0gODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RFWFRBUkVBID0gODQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RGT09UID0gODU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIID0gODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRUFEID0gODc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJVExFID0gODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RSID0gODk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RUID0gOTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1UgPSA5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUwgPSA5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVkFSID0gOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01BUlFVRUUgPSA5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0NPTkZJRyA9IDk1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRUNITyA9IDk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRVhFQyA9IDk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRlNJWkUgPSA5ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0ZMQVNUTU9EID0gOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9JTkNMVURFID0gMTAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfUFJJTlRFTlYgPSAxMDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9TRVQgPSAxMDI7Ci0JCS8vIDw8RDIwNTUxMwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CR1NPVU5EID0gMTAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT0JSID0gMTA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9XQlIgPSAxMDU7Ci0KLQkJLy8gRDIwNTUxMwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMTA1LgotCQkJLy8gLS0gNS8yNS8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JLyoqICVmb250c3R5bGU7LiBUVCB8IEkgfCBCIHwgVSB8IFMgfCBTVFJJS0UgfCBCSUcgfCBTTUFMTCB8IEJMSU5LICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRk9OVFNUWUxFID0ge1RULCBJLCBCLCBVLCBTLCBTVFJJS0UsIEJJRywgU01BTEwsIEJMSU5LfTsKLQkvKiogJWZvcm1jdGw7LiBJTlBVVCB8IFNFTEVDVCB8IFRFWFRBUkVBIHwgTEFCRUwgfCBCVVRUT04gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGT1JNQ1RMID0ge0lOUFVULCBTRUxFQ1QsIFRFWFRBUkVBLCBMQUJFTCwgQlVUVE9OfTsKLQkvKiogJXBocmFzZTsuCi0JICogRU0gfCBTVFJPTkcgfCBERk4gfCBDT0RFIHwgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIUkFTRSA9IHtFTSwgU1RST05HLCBERk4sIENPREUsIFNBTVAsIEtCRCwgVkFSLCBDSVRFLCBBQkJSLCBBQ1JPTllNfTsKLQkvKiogJXNwZWNpYWw7LgotCSAqIEEgfCBJTUcgfCBBUFBMRVQgfCBPQkpFQ1QgfCBGT05UIHwgQkFTRUZPTlQgfCBCUiB8IFNDUklQVCB8Ci0JICogTUFQIHwgUSB8IFNVQiB8IFNVUCB8IFNQQU4gfCBCRE8gfCBJRlJBTUUgfCBFTUJFRCB8IE1BUlFVRUUgfAotCSAqIEQyVyB8IFNVQk1JVAotCSAqIFdCUiB8IE5PQlIgfCBCR1NPVU5ECi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1BFQ0lBTCA9IHtBLCBJTUcsIEFQUExFVCwgT0JKRUNULCBGT05ULCBCQVNFRk9OVCwgQlIsIFdCUiwgLy8gRDIwNTUxMwotCQkJCVNDUklQVCwgTUFQLCBRLCBTVUIsIFNVUCwgU1BBTiwgQkRPLCBJRlJBTUUsIEVNQkVELCBCR1NPVU5ELCAvLyBEMjA1NTEzCi0JCQkJTUFSUVVFRSwgTk9CUiAvLyBEMjA1NTEzCi0JfTsKLQkvKiogJWhlYWRpbmc7LiBIWzEtNl0gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBIRUFESU5HID0ge0gxLCBIMiwgSDMsIEg0LCBINSwgSDZ9OwotCS8qKiAlbGlzdDsuIFVMIHwgT0wgfCBESVIgfCBNRU5VICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTElTVCA9IHtVTCwgT0wsIERJUiwgTUVOVX07Ci0JLyoqICVwcmVmb3JtYXR0ZWQ7LiBQUkUgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUkVGT1JNQVRURUQgPSB7UFJFfTsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlQ29sbGVjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZk5hbWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCWZOYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQlmTmFtZXNbSWRzLklEX0FdID0gQTsKLQkJZk5hbWVzW0lkcy5JRF9BQkJSXSA9IEFCQlI7Ci0JCWZOYW1lc1tJZHMuSURfQUNST05ZTV0gPSBBQ1JPTllNOwotCQlmTmFtZXNbSWRzLklEX0FERFJFU1NdID0gQUREUkVTUzsKLQkJZk5hbWVzW0lkcy5JRF9BUFBMRVRdID0gQVBQTEVUOwotCQlmTmFtZXNbSWRzLklEX0FSRUFdID0gQVJFQTsKLQkJZk5hbWVzW0lkcy5JRF9CXSA9IEI7Ci0JCWZOYW1lc1tJZHMuSURfQkFTRV0gPSBCQVNFOwotCQlmTmFtZXNbSWRzLklEX0JBU0VGT05UXSA9IEJBU0VGT05UOwotCQlmTmFtZXNbSWRzLklEX0JET10gPSBCRE87Ci0JCWZOYW1lc1tJZHMuSURfQklHXSA9IEJJRzsKLQkJZk5hbWVzW0lkcy5JRF9CTElOS10gPSBCTElOSzsKLQkJZk5hbWVzW0lkcy5JRF9CTE9DS1FVT1RFXSA9IEJMT0NLUVVPVEU7Ci0JCWZOYW1lc1tJZHMuSURfQk9EWV0gPSBCT0RZOwotCQlmTmFtZXNbSWRzLklEX0JSXSA9IEJSOwotCQlmTmFtZXNbSWRzLklEX0JVVFRPTl0gPSBCVVRUT047Ci0JCWZOYW1lc1tJZHMuSURfQ0FQVElPTl0gPSBDQVBUSU9OOwotCQlmTmFtZXNbSWRzLklEX0NFTlRFUl0gPSBDRU5URVI7Ci0JCWZOYW1lc1tJZHMuSURfQ0lURV0gPSBDSVRFOwotCQlmTmFtZXNbSWRzLklEX0NPREVdID0gQ09ERTsKLQkJZk5hbWVzW0lkcy5JRF9DT0xdID0gQ09MOwotCQlmTmFtZXNbSWRzLklEX0NPTEdST1VQXSA9IENPTEdST1VQOwotCQlmTmFtZXNbSWRzLklEX0REXSA9IEREOwotCQlmTmFtZXNbSWRzLklEX0RFTF0gPSBERUw7Ci0JCWZOYW1lc1tJZHMuSURfREZOXSA9IERGTjsKLQkJZk5hbWVzW0lkcy5JRF9ESVJdID0gRElSOwotCQlmTmFtZXNbSWRzLklEX0RJVl0gPSBESVY7Ci0JCWZOYW1lc1tJZHMuSURfRExdID0gREw7Ci0JCWZOYW1lc1tJZHMuSURfRFRdID0gRFQ7Ci0JCWZOYW1lc1tJZHMuSURfRU1dID0gRU07Ci0JCWZOYW1lc1tJZHMuSURfRU1CRURdID0gRU1CRUQ7Ci0JCWZOYW1lc1tJZHMuSURfRklFTERTRVRdID0gRklFTERTRVQ7Ci0JCWZOYW1lc1tJZHMuSURfRk9OVF0gPSBGT05UOwotCQlmTmFtZXNbSWRzLklEX0ZPUk1dID0gRk9STTsKLQkJZk5hbWVzW0lkcy5JRF9GUkFNRV0gPSBGUkFNRTsKLQkJZk5hbWVzW0lkcy5JRF9GUkFNRVNFVF0gPSBGUkFNRVNFVDsKLQkJZk5hbWVzW0lkcy5JRF9IMV0gPSBIMTsKLQkJZk5hbWVzW0lkcy5JRF9IMl0gPSBIMjsKLQkJZk5hbWVzW0lkcy5JRF9IM10gPSBIMzsKLQkJZk5hbWVzW0lkcy5JRF9INF0gPSBINDsKLQkJZk5hbWVzW0lkcy5JRF9INV0gPSBINTsKLQkJZk5hbWVzW0lkcy5JRF9INl0gPSBINjsKLQkJZk5hbWVzW0lkcy5JRF9IRUFEXSA9IEhFQUQ7Ci0JCWZOYW1lc1tJZHMuSURfSFJdID0gSFI7Ci0JCWZOYW1lc1tJZHMuSURfSFRNTF0gPSBIVE1MOwotCQlmTmFtZXNbSWRzLklEX0ldID0gSTsKLQkJZk5hbWVzW0lkcy5JRF9JRlJBTUVdID0gSUZSQU1FOwotCQlmTmFtZXNbSWRzLklEX0lNR10gPSBJTUc7Ci0JCWZOYW1lc1tJZHMuSURfSU5QVVRdID0gSU5QVVQ7Ci0JCWZOYW1lc1tJZHMuSURfSU5TXSA9IElOUzsKLQkJZk5hbWVzW0lkcy5JRF9JU0lOREVYXSA9IElTSU5ERVg7Ci0JCWZOYW1lc1tJZHMuSURfS0JEXSA9IEtCRDsKLQkJZk5hbWVzW0lkcy5JRF9MQUJFTF0gPSBMQUJFTDsKLQkJZk5hbWVzW0lkcy5JRF9MRUdFTkRdID0gTEVHRU5EOwotCQlmTmFtZXNbSWRzLklEX0xJXSA9IExJOwotCQlmTmFtZXNbSWRzLklEX0xJTktdID0gTElOSzsKLQkJZk5hbWVzW0lkcy5JRF9NQVBdID0gTUFQOwotCQlmTmFtZXNbSWRzLklEX01FTlVdID0gTUVOVTsKLQkJZk5hbWVzW0lkcy5JRF9NRVRBXSA9IE1FVEE7Ci0JCWZOYW1lc1tJZHMuSURfTk9FTUJFRF0gPSBOT0VNQkVEOwotCQlmTmFtZXNbSWRzLklEX05PRlJBTUVTXSA9IE5PRlJBTUVTOwotCQlmTmFtZXNbSWRzLklEX05PU0NSSVBUXSA9IE5PU0NSSVBUOwotCQlmTmFtZXNbSWRzLklEX09CSkVDVF0gPSBPQkpFQ1Q7Ci0JCWZOYW1lc1tJZHMuSURfT0xdID0gT0w7Ci0JCWZOYW1lc1tJZHMuSURfT1BUR1JPVVBdID0gT1BUR1JPVVA7Ci0JCWZOYW1lc1tJZHMuSURfT1BUSU9OXSA9IE9QVElPTjsKLQkJZk5hbWVzW0lkcy5JRF9QXSA9IFA7Ci0JCWZOYW1lc1tJZHMuSURfUEFSQU1dID0gUEFSQU07Ci0JCWZOYW1lc1tJZHMuSURfUFJFXSA9IFBSRTsKLQkJZk5hbWVzW0lkcy5JRF9RXSA9IFE7Ci0JCWZOYW1lc1tJZHMuSURfU10gPSBTOwotCQlmTmFtZXNbSWRzLklEX1NBTVBdID0gU0FNUDsKLQkJZk5hbWVzW0lkcy5JRF9TQ1JJUFRdID0gU0NSSVBUOwotCQlmTmFtZXNbSWRzLklEX1NFTEVDVF0gPSBTRUxFQ1Q7Ci0JCWZOYW1lc1tJZHMuSURfU01BTExdID0gU01BTEw7Ci0JCWZOYW1lc1tJZHMuSURfU1BBTl0gPSBTUEFOOwotCQlmTmFtZXNbSWRzLklEX1NUUklLRV0gPSBTVFJJS0U7Ci0JCWZOYW1lc1tJZHMuSURfU1RST05HXSA9IFNUUk9ORzsKLQkJZk5hbWVzW0lkcy5JRF9TVFlMRV0gPSBTVFlMRTsKLQkJZk5hbWVzW0lkcy5JRF9TVUJdID0gU1VCOwotCQlmTmFtZXNbSWRzLklEX1NVUF0gPSBTVVA7Ci0JCWZOYW1lc1tJZHMuSURfVEFCTEVdID0gVEFCTEU7Ci0JCWZOYW1lc1tJZHMuSURfVEJPRFldID0gVEJPRFk7Ci0JCWZOYW1lc1tJZHMuSURfVERdID0gVEQ7Ci0JCWZOYW1lc1tJZHMuSURfVEVYVEFSRUFdID0gVEVYVEFSRUE7Ci0JCWZOYW1lc1tJZHMuSURfVEZPT1RdID0gVEZPT1Q7Ci0JCWZOYW1lc1tJZHMuSURfVEhdID0gVEg7Ci0JCWZOYW1lc1tJZHMuSURfVEhFQURdID0gVEhFQUQ7Ci0JCWZOYW1lc1tJZHMuSURfVElUTEVdID0gVElUTEU7Ci0JCWZOYW1lc1tJZHMuSURfVFJdID0gVFI7Ci0JCWZOYW1lc1tJZHMuSURfVFRdID0gVFQ7Ci0JCWZOYW1lc1tJZHMuSURfVV0gPSBVOwotCQlmTmFtZXNbSWRzLklEX1VMXSA9IFVMOwotCQlmTmFtZXNbSWRzLklEX1ZBUl0gPSBWQVI7Ci0JCWZOYW1lc1tJZHMuSURfTUFSUVVFRV0gPSBNQVJRVUVFOwotCQlmTmFtZXNbSWRzLklEX1NTSV9DT05GSUddID0gU1NJX0NPTkZJRzsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfRUNIT10gPSBTU0lfRUNITzsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfRVhFQ10gPSBTU0lfRVhFQzsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfRlNJWkVdID0gU1NJX0ZTSVpFOwotCQlmTmFtZXNbSWRzLklEX1NTSV9GTEFTVE1PRF0gPSBTU0lfRkxBU1RNT0Q7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX0lOQ0xVREVdID0gU1NJX0lOQ0xVREU7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX1BSSU5URU5WXSA9IFNTSV9QUklOVEVOVjsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfU0VUXSA9IFNTSV9TRVQ7Ci0JCWZOYW1lc1tJZHMuSURfQkdTT1VORF0gPSBCR1NPVU5EOwotCQlmTmFtZXNbSWRzLklEX05PQlJdID0gTk9CUjsKLQkJZk5hbWVzW0lkcy5JRF9XQlJdID0gV0JSOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50Q29sbGVjdGlvbihBdHRyaWJ1dGVDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZk5hbWVzLCBUT0xFUkFOVF9DQVNFKTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQWN0dWFsbHkgY3JlYXRlcyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGluc3RhbmNlLgotCSAqIEByZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlIVE1MRWxlbURlY2xJbXBsIGVkZWMgPSBudWxsOwotCi0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEEodGhpcyk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBQkJSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoQUJCUiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFDUk9OWU0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShBQ1JPTllNLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQUREUkVTUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQUREUkVTUyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVBQTEVUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBUFBMRVQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFSRUEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEFSRUEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShCLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkFTRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkFTRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkFTRUZPTlQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJBU0VGT05UKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCRE8pKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJETyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQklHKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoQklHLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkxJTkspKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShCTElOSywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJMT0NLUVVPVEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJMT0NLUVVPVEUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJPRFkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJPRFkodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQlVUVE9OKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCVVRUT04odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENBUFRJT04pKSB7Ci0JCQllZGVjID0gbmV3IEhlZENBUFRJT04odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENFTlRFUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ0VOVEVSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDSVRFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoQ0lURSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENPREUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShDT0RFLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ09MKSkgewotCQkJZWRlYyA9IG5ldyBIZWRDT0wodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENPTEdST1VQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRDT0xHUk9VUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEREKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1hcmtDaGFuZ2VzKERFTCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERGTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKERGTiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERJUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVOVShESVIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShESVYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERJVih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShEVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRFQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEVNKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoRU0sIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShFTUJFRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRU1CRUQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZJRUxEU0VUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGSUVMRFNFVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRk9OVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRk9OVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRk9STSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRk9STSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRlJBTUUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZSQU1FKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGUkFNRVNFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRlJBTUVTRVQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgxKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgxLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg0KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg0LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhFQUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhFQUQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSFRNTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKEksIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJRlJBTUUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZElGUkFNRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU1HKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJTUcodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElOUFVUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJTlBVVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU5TKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNYXJrQ2hhbmdlcyhJTlMsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJU0lOREVYKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJU0lOREVYKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShLQkQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShLQkQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShMQUJFTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTEFCRUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKExFR0VORCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTEVHRU5EKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShMSSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTEkodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKExJTkspKSB7Ci0JCQllZGVjID0gbmV3IEhlZExJTksodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1BUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUFQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNQVJRVUVFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNQVJRVUVFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRU5VKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRU5VKE1FTlUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRVRBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShOT0VNQkVEKSkgewotCQkJZWRlYyA9IG5ldyBIZWROT0VNQkVEKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShOT0ZSQU1FUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTk9GUkFNRVModGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5PU0NSSVBUKSkgewotCQkJZWRlYyA9IG5ldyBIZWROT1NDUklQVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT0JKRUNUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRPQkpFQ1QodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9MKSkgewotCQkJZWRlYyA9IG5ldyBIZWRPTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT1BUR1JPVVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9QVEdST1VQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPUFRJT04pKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9QVElPTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUEFSQU0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBBUkFNKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQUkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBSRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFMsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTQU1QKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoU0FNUCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNDUklQVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU0NSSVBUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTRUxFQ1QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNFTEVDVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU01BTEwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShTTUFMTCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNQQU4pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNQQU4odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNUUklLRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFNUUklLRSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNUUk9ORykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKFNUUk9ORywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNUWUxFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTVFlMRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1VCKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTY3JpcHRzKFNVQiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNVUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU2NyaXB0cyhTVVAsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUQUJMRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVEFCTEUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRCT0RZKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUYWJsZUJvZHkoVEJPRFksIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShURCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVGFibGVDZWxsKFRELCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEVYVEFSRUEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRFWFRBUkVBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShURk9PVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVGFibGVCb2R5KFRGT09ULCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEgpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRhYmxlQ2VsbChUSCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRIRUFEKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUYWJsZUJvZHkoVEhFQUQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUSVRMRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVElUTEUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShUVCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShVLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFVMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShWQVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShWQVIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfQ09ORklHKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lDb25maWcodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9FQ0hPKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lFY2hvKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRVhFQykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRXhlYyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0ZTSVpFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lGc2l6ZSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0ZMQVNUTU9EKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lGbGFzdG1vZCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0lOQ0xVREUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUluY2x1ZGUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9QUklOVEVOVikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJUHJpbnRlbnYodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9TRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSVNldCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkdTT1VORCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkdTT1VORCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTk9CUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTk9CUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoV0JSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRXQlIodGhpcyk7Ci0KLQkJfSAvLyB1bmtub3duCi0JCWVsc2UgewotCQkJLy8gTk9URTogV2UgZG9uJ3QgZGVmaW5lIHRoZSBVTktOT1dOIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0JCQkvLyA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYSBkZWNsYXJhdGlvbiBpcyBhIHNpZ24gb2YKLQkJCS8vIHRoZSB0YXJnZXQgZWxlbWVudCBpcyB1bmtub3duLgotCQkJLy8gLS0gMy85LzIwMDEKLQkJCWVkZWMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlZGVjOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQXR0cmlidXRlQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVDb2xsZWN0aW9uIGdldEF0dHJpYnV0ZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVDb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uIGdldE5hbWVzT2ZCbG9jaygpIHsKLQkJLy8gUCwgREwsIERJViwgQ0VOVEVSLCBOT1NDUklQVCwgTk9GUkFNRVMsIEJMT0NLUVVPVEUsIEZPUk0sIElTSU5ERVgsIEhSLAotCQkvLyBUQUJMRSwgRklFTERTRVQsIEFERFJFU1MKLQkJU3RyaW5nW10gYmxvY2tNaXNjID0ge1AsIERMLCBESVYsIENFTlRFUiwgTk9TQ1JJUFQsIE5PRlJBTUVTLCBCTE9DS1FVT1RFLCBGT1JNLCBJU0lOREVYLCBIUiwgVEFCTEUsIEZJRUxEU0VULCBBRERSRVNTfTsKLQkJVmVjdG9yIG5hbWVzID0gbmV3IFZlY3RvcihBcnJheXMuYXNMaXN0KGJsb2NrTWlzYykpOwotCQkvLyAlaGVhZGluZzsKLQkJbmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoSEVBRElORykpOwotCQkvLyAlbGlzdDsKLQkJbmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoTElTVCkpOwotCQkvLyAlcHJlZm9ybWF0dGVkOwotCQluYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChQUkVGT1JNQVRURUQpKTsKLQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogJWJsb2NrOy4KLQkgKiAlYmxvY2s7IGlzOgotCSAqIFAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgQ0VOVEVSIHwKLQkgKiBOT1NDUklQVCB8IE5PRlJBTUVTIHwgQkxPQ0tRVU9URSB8IEZPUk0gfCBJU0lOREVYIHwgSFIgfAotCSAqIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRCbG9jayhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBnZXROYW1lc09mQmxvY2soKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0KLQkgKiBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+IGluc3RhbmNlLgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEZsb3coQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldEJsb2NrKGdyb3VwKTsKLQkJZ2V0SW5saW5lKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGb250c3R5bGUoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChGT05UU1RZTEUpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEZvcm1jdHJsKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoRk9STUNUTCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogJWhlYWRpbmc7LgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEhlYWRpbmcoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEhFQURJTkcpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbQotCSAqIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4gaW5zdGFuY2UuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0SW5saW5lKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRGb250c3R5bGUoZ3JvdXApOwotCQlnZXRQaHJhc2UoZ3JvdXApOwotCQlnZXRTcGVjaWFsKGdyb3VwKTsKLQkJZ2V0Rm9ybWN0cmwoZ3JvdXApOwotCX0KLQotCS8qKgotCSAqICVsaXN0Oy4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRMaXN0KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChMSVNUKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRQaHJhc2UoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChQSFJBU0UpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqICVwcmVmb3JtYXR0ZWQ7Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0UHJlZm9ybWF0dGVkKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChQUkVGT1JNQVRURUQpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFNwZWNpYWwoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChTUEVDSUFMKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0VudGl0eUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlY2JhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0VudGl0eUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGVudGl0eSBkZWNsYXJhdGlvbnMuCi0gKi8KLWZpbmFsIGNsYXNzIEVudGl0eUNvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlLkVudGl0eU5hbWUgewotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQUNVVEVfTCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FBQ1VURV9VID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNJUkNfTCA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDSVJDX1UgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ1VURSA9IDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FFTElHX0wgPSA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRUxJR19VID0gNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUdSQVZFX0wgPSA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BR1JBVkVfVSA9IDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FMRUZTWU0gPSA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTFBIQV9MID0gMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FMUEhBX1UgPSAxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU1QID0gMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FORCA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTkcgPSAxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJJTkdfTCA9IDE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUklOR19VID0gMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FTWU1QID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FUSUxERV9MID0gMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FUSUxERV9VID0gMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FVTUxfTCA9IDIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVU1MX1UgPSAyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkRRVU8gPSAyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkVUQV9MID0gMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JFVEFfVSA9IDI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CUlZCQVIgPSAyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlVMTCA9IDI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQVAgPSAyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0NFRElMX0wgPSAyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0NFRElMX1UgPSAyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VESUwgPSAzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VOVCA9IDMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSElfTCA9IDMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSElfVSA9IDMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSVJDID0gMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NMVUJTID0gMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPTkcgPSAzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09QWSA9IDM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DUkFSUiA9IDM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DVVAgPSAzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VSUkVOID0gNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBR0dFUl9MID0gNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBR0dFUl9VID0gNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBUlJfTCA9IDQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQVJSX1UgPSA0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVHID0gNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTFRBX0wgPSA0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVMVEFfVSA9IDQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESUFNUyA9IDQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVZJREUgPSA0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUFDVVRFX0wgPSA1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUFDVVRFX1UgPSA1MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUNJUkNfTCA9IDUyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQ0lSQ19VID0gNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VHUkFWRV9MID0gNTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VHUkFWRV9VID0gNTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNUFRZID0gNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNU1AgPSA1NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU5TUCA9IDU4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUFNJTE9OX0wgPSA1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVBTSUxPTl9VID0gNjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VRVUlWID0gNjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUQV9MID0gNjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUQV9VID0gNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUSF9MID0gNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUSF9VID0gNjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVTUxfTCA9IDY2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVU1MX1UgPSA2NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVSTyA9IDY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FWElTVCA9IDY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GTk9GID0gNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUkFMTCA9IDcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMTIgPSA3MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzE0ID0gNzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMzNCA9IDc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFTTCA9IDc1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HQU1NQV9MID0gNzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dBTU1BX1UgPSA3NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0UgPSA3ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR1QgPSA3OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEFSUl9MID0gODA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hBUlJfVSA9IDgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IRUFSVFMgPSA4MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVMTElQID0gODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lBQ1VURV9MID0gODQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lBQ1VURV9VID0gODU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lDSVJDX0wgPSA4NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUNJUkNfVSA9IDg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JRVhDTCA9IDg4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JR1JBVkVfTCA9IDg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JR1JBVkVfVSA9IDkwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTUFHRSA9IDkxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTkZJTiA9IDkyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlQgPSA5MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU9UQV9MID0gOTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lPVEFfVSA9IDk1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JUVVFU1QgPSA5NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVNJTiA9IDk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JVU1MX0wgPSA5ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVVNTF9VID0gOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0tBUFBBX0wgPSAxMDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0tBUFBBX1UgPSAxMDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTUJEQV9MID0gMTAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU1CREFfVSA9IDEwMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFORyA9IDEwNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFRVU8gPSAxMDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUlJfTCA9IDEwNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFSUl9VID0gMTA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQ0VJTCA9IDEwODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTERRVU8gPSAxMDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xFID0gMTEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRkxPT1IgPSAxMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xPV0FTVCA9IDExMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTE9aID0gMTEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MUk0gPSAxMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xTQVFVTyA9IDExNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFNRVU8gPSAxMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xUID0gMTE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NQUNSID0gMTE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NREFTSCA9IDExOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUlDUk8gPSAxMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JRERPVCA9IDEyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUlOVVMgPSAxMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01VX0wgPSAxMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01VX1UgPSAxMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05BQkxBID0gMTI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OQlNQID0gMTI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OREFTSCA9IDEyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkUgPSAxMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05JID0gMTI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT1QgPSAxMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PVElOID0gMTMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OU1VCID0gMTMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVElMREVfTCA9IDEzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlRJTERFX1UgPSAxMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05VX0wgPSAxMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05VX1UgPSAxMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09BQ1VURV9MID0gMTM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQUNVVEVfVSA9IDEzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0NJUkNfTCA9IDEzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0NJUkNfVSA9IDE0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0VMSUdfTCA9IDE0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0VMSUdfVSA9IDE0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0dSQVZFX0wgPSAxNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09HUkFWRV9VID0gMTQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTElORSA9IDE0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01FR0FfTCA9IDE0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01FR0FfVSA9IDE0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01JQ1JPTl9MID0gMTQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUlDUk9OX1UgPSAxNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QTFVTID0gMTUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUiA9IDE1MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1JERiA9IDE1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1JETSA9IDE1MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1NMQVNIX0wgPSAxNTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09TTEFTSF9VID0gMTU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElMREVfTCA9IDE1NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTERFX1UgPSAxNTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USU1FUyA9IDE1ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VNTF9MID0gMTU5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVU1MX1UgPSAxNjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkEgPSAxNjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUlQgPSAxNjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BFUk1JTCA9IDE2MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEVSUCA9IDE2NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEhJX0wgPSAxNjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BISV9VID0gMTY2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSVYgPSAxNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BJX0wgPSAxNjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BJX1UgPSAxNjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BMVVNNTiA9IDE3MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUE9VTkQgPSAxNzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSSU1FX0wgPSAxNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSSU1FX1UgPSAxNzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BST0QgPSAxNzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BST1AgPSAxNzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BTSV9MID0gMTc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QU0lfVSA9IDE3NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUVVPVCA9IDE3ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFESUMgPSAxNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBTkcgPSAxODA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBUVVPID0gMTgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVJSX0wgPSAxODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBUlJfVSA9IDE4MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkNFSUwgPSAxODQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JEUVVPID0gMTg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRUFMID0gMTg2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRUcgPSAxODc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JGTE9PUiA9IDE4ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkhPX0wgPSAxODk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JIT19VID0gMTkwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9STE0gPSAxOTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JTQVFVTyA9IDE5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUlNRVU8gPSAxOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NCUVVPID0gMTk0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ0FST05fTCA9IDE5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NBUk9OX1UgPSAxOTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NET1QgPSAxOTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NFQ1QgPSAxOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NIWSA9IDE5OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFGID0gMjAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSUdNQV9MID0gMjAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSUdNQV9VID0gMjAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSU0gPSAyMDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NQQURFUyA9IDIwNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCID0gMjA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVUJFID0gMjA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVU0gPSAyMDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUCA9IDIwODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQMSA9IDIwOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQMiA9IDIxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQMyA9IDIxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQRSA9IDIxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1pMSUcgPSAyMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RBVV9MID0gMjE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQVVfVSA9IDIxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFUkU0ID0gMjE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVUQVNZTSA9IDIxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFfTCA9IDIxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFfVSA9IDIxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhJTlNQID0gMjIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USE9STl9MID0gMjIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USE9STl9VID0gMjIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USUxERSA9IDIyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElNRVMgPSAyMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RSQURFID0gMjI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQUNVVEVfTCA9IDIyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFDVVRFX1UgPSAyMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBUlJfTCA9IDIyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFSUl9VID0gMjI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQ0lSQ19MID0gMjMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQ0lSQ19VID0gMjMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VR1JBVkVfTCA9IDIzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUdSQVZFX1UgPSAyMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VNTCA9IDIzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVBTSUggPSAyMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lMT05fTCA9IDIzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVBTSUxPTl9VID0gMjM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VVU1MX0wgPSAyMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VVTUxfVSA9IDIzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfV0VJRVJQID0gMjQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9YSV9MID0gMjQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9YSV9VID0gMjQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZQUNVVEVfTCA9IDI0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUFDVVRFX1UgPSAyNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lFTiA9IDI0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWVVNTF9MID0gMjQ2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZVU1MX1UgPSAyNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pFVEFfTCA9IDI0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWkVUQV9VID0gMjQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aV0ogPSAyNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pXTkogPSAyNTE7Ci0KLQkJcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtT2ZJZHMoKSB7Ci0JCQlpZiAobnVtb2ZpZHMgIT0gLTEpCi0JCQkJcmV0dXJuIG51bW9maWRzOwotCi0JCQkvLyBOT1RFOiBJZiB0aGUgcmVmbGVjdGlvbiBpcyB0b28gc2xvdywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JCQkvLyBqdXN0IHJldHVybiB0aGUgbGl0ZXJhbCB2YWx1ZSwgbGlrZSAyNTIuCi0JCQkvLyAtLSA1LzI0LzIwMDEKLQkJCUNsYXNzIGNsYXp6ID0gSWRzLmNsYXNzOwotCQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJCW51bW9maWRzID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIklEXyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJbnVtb2ZpZHMrKzsKLQkJCX0KLQkJCXJldHVybiBudW1vZmlkczsKLQkJfQotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfQUFDVVRFX0xdID0gQUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9BQUNVVEVfVV0gPSBBQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0FDSVJDX0xdID0gQUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0FDSVJDX1VdID0gQUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0FDVVRFXSA9IEFDVVRFOwotCQluYW1lc1tJZHMuSURfQUVMSUdfTF0gPSBBRUxJR19MOwotCQluYW1lc1tJZHMuSURfQUVMSUdfVV0gPSBBRUxJR19VOwotCQluYW1lc1tJZHMuSURfQUdSQVZFX0xdID0gQUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9BR1JBVkVfVV0gPSBBR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX0FMRUZTWU1dID0gQUxFRlNZTTsKLQkJbmFtZXNbSWRzLklEX0FMUEhBX0xdID0gQUxQSEFfTDsKLQkJbmFtZXNbSWRzLklEX0FMUEhBX1VdID0gQUxQSEFfVTsKLQkJbmFtZXNbSWRzLklEX0FNUF0gPSBBTVA7Ci0JCW5hbWVzW0lkcy5JRF9BTkRdID0gQU5EOwotCQluYW1lc1tJZHMuSURfQU5HXSA9IEFORzsKLQkJbmFtZXNbSWRzLklEX0FSSU5HX0xdID0gQVJJTkdfTDsKLQkJbmFtZXNbSWRzLklEX0FSSU5HX1VdID0gQVJJTkdfVTsKLQkJbmFtZXNbSWRzLklEX0FTWU1QXSA9IEFTWU1QOwotCQluYW1lc1tJZHMuSURfQVRJTERFX0xdID0gQVRJTERFX0w7Ci0JCW5hbWVzW0lkcy5JRF9BVElMREVfVV0gPSBBVElMREVfVTsKLQkJbmFtZXNbSWRzLklEX0FVTUxfTF0gPSBBVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9BVU1MX1VdID0gQVVNTF9VOwotCQluYW1lc1tJZHMuSURfQkRRVU9dID0gQkRRVU87Ci0JCW5hbWVzW0lkcy5JRF9CRVRBX0xdID0gQkVUQV9MOwotCQluYW1lc1tJZHMuSURfQkVUQV9VXSA9IEJFVEFfVTsKLQkJbmFtZXNbSWRzLklEX0JSVkJBUl0gPSBCUlZCQVI7Ci0JCW5hbWVzW0lkcy5JRF9CVUxMXSA9IEJVTEw7Ci0JCW5hbWVzW0lkcy5JRF9DQVBdID0gQ0FQOwotCQluYW1lc1tJZHMuSURfQ0NFRElMX0xdID0gQ0NFRElMX0w7Ci0JCW5hbWVzW0lkcy5JRF9DQ0VESUxfVV0gPSBDQ0VESUxfVTsKLQkJbmFtZXNbSWRzLklEX0NFRElMXSA9IENFRElMOwotCQluYW1lc1tJZHMuSURfQ0VOVF0gPSBDRU5UOwotCQluYW1lc1tJZHMuSURfQ0hJX0xdID0gQ0hJX0w7Ci0JCW5hbWVzW0lkcy5JRF9DSElfVV0gPSBDSElfVTsKLQkJbmFtZXNbSWRzLklEX0NJUkNdID0gQ0lSQzsKLQkJbmFtZXNbSWRzLklEX0NMVUJTXSA9IENMVUJTOwotCQluYW1lc1tJZHMuSURfQ09OR10gPSBDT05HOwotCQluYW1lc1tJZHMuSURfQ09QWV0gPSBDT1BZOwotCQluYW1lc1tJZHMuSURfQ1JBUlJdID0gQ1JBUlI7Ci0JCW5hbWVzW0lkcy5JRF9DVVBdID0gQ1VQOwotCQluYW1lc1tJZHMuSURfQ1VSUkVOXSA9IENVUlJFTjsKLQkJbmFtZXNbSWRzLklEX0RBR0dFUl9MXSA9IERBR0dFUl9MOwotCQluYW1lc1tJZHMuSURfREFHR0VSX1VdID0gREFHR0VSX1U7Ci0JCW5hbWVzW0lkcy5JRF9EQVJSX0xdID0gREFSUl9MOwotCQluYW1lc1tJZHMuSURfREFSUl9VXSA9IERBUlJfVTsKLQkJbmFtZXNbSWRzLklEX0RFR10gPSBERUc7Ci0JCW5hbWVzW0lkcy5JRF9ERUxUQV9MXSA9IERFTFRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9ERUxUQV9VXSA9IERFTFRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9ESUFNU10gPSBESUFNUzsKLQkJbmFtZXNbSWRzLklEX0RJVklERV0gPSBESVZJREU7Ci0JCW5hbWVzW0lkcy5JRF9FQUNVVEVfTF0gPSBFQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX0VBQ1VURV9VXSA9IEVBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfRUNJUkNfTF0gPSBFQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfRUNJUkNfVV0gPSBFQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfRUdSQVZFX0xdID0gRUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9FR1JBVkVfVV0gPSBFR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX0VNUFRZXSA9IEVNUFRZOwotCQluYW1lc1tJZHMuSURfRU1TUF0gPSBFTVNQOwotCQluYW1lc1tJZHMuSURfRU5TUF0gPSBFTlNQOwotCQluYW1lc1tJZHMuSURfRVBTSUxPTl9MXSA9IEVQU0lMT05fTDsKLQkJbmFtZXNbSWRzLklEX0VQU0lMT05fVV0gPSBFUFNJTE9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9FUVVJVl0gPSBFUVVJVjsKLQkJbmFtZXNbSWRzLklEX0VUQV9MXSA9IEVUQV9MOwotCQluYW1lc1tJZHMuSURfRVRBX1VdID0gRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9FVEhfTF0gPSBFVEhfTDsKLQkJbmFtZXNbSWRzLklEX0VUSF9VXSA9IEVUSF9VOwotCQluYW1lc1tJZHMuSURfRVVNTF9MXSA9IEVVTUxfTDsKLQkJbmFtZXNbSWRzLklEX0VVTUxfVV0gPSBFVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9FVVJPXSA9IEVVUk87Ci0JCW5hbWVzW0lkcy5JRF9FWElTVF0gPSBFWElTVDsKLQkJbmFtZXNbSWRzLklEX0ZOT0ZdID0gRk5PRjsKLQkJbmFtZXNbSWRzLklEX0ZPUkFMTF0gPSBGT1JBTEw7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMTJdID0gRlJBQzEyOwotCQluYW1lc1tJZHMuSURfRlJBQzE0XSA9IEZSQUMxNDsKLQkJbmFtZXNbSWRzLklEX0ZSQUMzNF0gPSBGUkFDMzQ7Ci0JCW5hbWVzW0lkcy5JRF9GUkFTTF0gPSBGUkFTTDsKLQkJbmFtZXNbSWRzLklEX0dBTU1BX0xdID0gR0FNTUFfTDsKLQkJbmFtZXNbSWRzLklEX0dBTU1BX1VdID0gR0FNTUFfVTsKLQkJbmFtZXNbSWRzLklEX0dFXSA9IEdFOwotCQluYW1lc1tJZHMuSURfR1RdID0gR1Q7Ci0JCW5hbWVzW0lkcy5JRF9IQVJSX0xdID0gSEFSUl9MOwotCQluYW1lc1tJZHMuSURfSEFSUl9VXSA9IEhBUlJfVTsKLQkJbmFtZXNbSWRzLklEX0hFQVJUU10gPSBIRUFSVFM7Ci0JCW5hbWVzW0lkcy5JRF9IRUxMSVBdID0gSEVMTElQOwotCQluYW1lc1tJZHMuSURfSUFDVVRFX0xdID0gSUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9JQUNVVEVfVV0gPSBJQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0lDSVJDX0xdID0gSUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0lDSVJDX1VdID0gSUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0lFWENMXSA9IElFWENMOwotCQluYW1lc1tJZHMuSURfSUdSQVZFX0xdID0gSUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9JR1JBVkVfVV0gPSBJR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX0lNQUdFXSA9IElNQUdFOwotCQluYW1lc1tJZHMuSURfSU5GSU5dID0gSU5GSU47Ci0JCW5hbWVzW0lkcy5JRF9JTlRdID0gSU5UOwotCQluYW1lc1tJZHMuSURfSU9UQV9MXSA9IElPVEFfTDsKLQkJbmFtZXNbSWRzLklEX0lPVEFfVV0gPSBJT1RBX1U7Ci0JCW5hbWVzW0lkcy5JRF9JUVVFU1RdID0gSVFVRVNUOwotCQluYW1lc1tJZHMuSURfSVNJTl0gPSBJU0lOOwotCQluYW1lc1tJZHMuSURfSVVNTF9MXSA9IElVTUxfTDsKLQkJbmFtZXNbSWRzLklEX0lVTUxfVV0gPSBJVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9LQVBQQV9MXSA9IEtBUFBBX0w7Ci0JCW5hbWVzW0lkcy5JRF9LQVBQQV9VXSA9IEtBUFBBX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQU1CREFfTF0gPSBMQU1CREFfTDsKLQkJbmFtZXNbSWRzLklEX0xBTUJEQV9VXSA9IExBTUJEQV9VOwotCQluYW1lc1tJZHMuSURfTEFOR10gPSBMQU5HOwotCQluYW1lc1tJZHMuSURfTEFRVU9dID0gTEFRVU87Ci0JCW5hbWVzW0lkcy5JRF9MQVJSX0xdID0gTEFSUl9MOwotCQluYW1lc1tJZHMuSURfTEFSUl9VXSA9IExBUlJfVTsKLQkJbmFtZXNbSWRzLklEX0xDRUlMXSA9IExDRUlMOwotCQluYW1lc1tJZHMuSURfTERRVU9dID0gTERRVU87Ci0JCW5hbWVzW0lkcy5JRF9MRV0gPSBMRTsKLQkJbmFtZXNbSWRzLklEX0xGTE9PUl0gPSBMRkxPT1I7Ci0JCW5hbWVzW0lkcy5JRF9MT1dBU1RdID0gTE9XQVNUOwotCQluYW1lc1tJZHMuSURfTE9aXSA9IExPWjsKLQkJbmFtZXNbSWRzLklEX0xSTV0gPSBMUk07Ci0JCW5hbWVzW0lkcy5JRF9MU0FRVU9dID0gTFNBUVVPOwotCQluYW1lc1tJZHMuSURfTFNRVU9dID0gTFNRVU87Ci0JCW5hbWVzW0lkcy5JRF9MVF0gPSBMVDsKLQkJbmFtZXNbSWRzLklEX01BQ1JdID0gTUFDUjsKLQkJbmFtZXNbSWRzLklEX01EQVNIXSA9IE1EQVNIOwotCQluYW1lc1tJZHMuSURfTUlDUk9dID0gTUlDUk87Ci0JCW5hbWVzW0lkcy5JRF9NSURET1RdID0gTUlERE9UOwotCQluYW1lc1tJZHMuSURfTUlOVVNdID0gTUlOVVM7Ci0JCW5hbWVzW0lkcy5JRF9NVV9MXSA9IE1VX0w7Ci0JCW5hbWVzW0lkcy5JRF9NVV9VXSA9IE1VX1U7Ci0JCW5hbWVzW0lkcy5JRF9OQUJMQV0gPSBOQUJMQTsKLQkJbmFtZXNbSWRzLklEX05CU1BdID0gTkJTUDsKLQkJbmFtZXNbSWRzLklEX05EQVNIXSA9IE5EQVNIOwotCQluYW1lc1tJZHMuSURfTkVdID0gTkU7Ci0JCW5hbWVzW0lkcy5JRF9OSV0gPSBOSTsKLQkJbmFtZXNbSWRzLklEX05PVF0gPSBOT1Q7Ci0JCW5hbWVzW0lkcy5JRF9OT1RJTl0gPSBOT1RJTjsKLQkJbmFtZXNbSWRzLklEX05TVUJdID0gTlNVQjsKLQkJbmFtZXNbSWRzLklEX05USUxERV9MXSA9IE5USUxERV9MOwotCQluYW1lc1tJZHMuSURfTlRJTERFX1VdID0gTlRJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9OVV9MXSA9IE5VX0w7Ci0JCW5hbWVzW0lkcy5JRF9OVV9VXSA9IE5VX1U7Ci0JCW5hbWVzW0lkcy5JRF9PQUNVVEVfTF0gPSBPQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX09BQ1VURV9VXSA9IE9BQ1VURV9VOwotCQluYW1lc1tJZHMuSURfT0NJUkNfTF0gPSBPQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfT0NJUkNfVV0gPSBPQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfT0VMSUdfTF0gPSBPRUxJR19MOwotCQluYW1lc1tJZHMuSURfT0VMSUdfVV0gPSBPRUxJR19VOwotCQluYW1lc1tJZHMuSURfT0dSQVZFX0xdID0gT0dSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PR1JBVkVfVV0gPSBPR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX09MSU5FXSA9IE9MSU5FOwotCQluYW1lc1tJZHMuSURfT01FR0FfTF0gPSBPTUVHQV9MOwotCQluYW1lc1tJZHMuSURfT01FR0FfVV0gPSBPTUVHQV9VOwotCQluYW1lc1tJZHMuSURfT01JQ1JPTl9MXSA9IE9NSUNST05fTDsKLQkJbmFtZXNbSWRzLklEX09NSUNST05fVV0gPSBPTUlDUk9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9PUExVU10gPSBPUExVUzsKLQkJbmFtZXNbSWRzLklEX09SXSA9IE9SOwotCQluYW1lc1tJZHMuSURfT1JERl0gPSBPUkRGOwotCQluYW1lc1tJZHMuSURfT1JETV0gPSBPUkRNOwotCQluYW1lc1tJZHMuSURfT1NMQVNIX0xdID0gT1NMQVNIX0w7Ci0JCW5hbWVzW0lkcy5JRF9PU0xBU0hfVV0gPSBPU0xBU0hfVTsKLQkJbmFtZXNbSWRzLklEX09USUxERV9MXSA9IE9USUxERV9MOwotCQluYW1lc1tJZHMuSURfT1RJTERFX1VdID0gT1RJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PVElNRVNdID0gT1RJTUVTOwotCQluYW1lc1tJZHMuSURfT1VNTF9MXSA9IE9VTUxfTDsKLQkJbmFtZXNbSWRzLklEX09VTUxfVV0gPSBPVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9QQVJBXSA9IFBBUkE7Ci0JCW5hbWVzW0lkcy5JRF9QQVJUXSA9IFBBUlQ7Ci0JCW5hbWVzW0lkcy5JRF9QRVJNSUxdID0gUEVSTUlMOwotCQluYW1lc1tJZHMuSURfUEVSUF0gPSBQRVJQOwotCQluYW1lc1tJZHMuSURfUEhJX0xdID0gUEhJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QSElfVV0gPSBQSElfVTsKLQkJbmFtZXNbSWRzLklEX1BJVl0gPSBQSVY7Ci0JCW5hbWVzW0lkcy5JRF9QSV9MXSA9IFBJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QSV9VXSA9IFBJX1U7Ci0JCW5hbWVzW0lkcy5JRF9QTFVTTU5dID0gUExVU01OOwotCQluYW1lc1tJZHMuSURfUE9VTkRdID0gUE9VTkQ7Ci0JCW5hbWVzW0lkcy5JRF9QUklNRV9MXSA9IFBSSU1FX0w7Ci0JCW5hbWVzW0lkcy5JRF9QUklNRV9VXSA9IFBSSU1FX1U7Ci0JCW5hbWVzW0lkcy5JRF9QUk9EXSA9IFBST0Q7Ci0JCW5hbWVzW0lkcy5JRF9QUk9QXSA9IFBST1A7Ci0JCW5hbWVzW0lkcy5JRF9QU0lfTF0gPSBQU0lfTDsKLQkJbmFtZXNbSWRzLklEX1BTSV9VXSA9IFBTSV9VOwotCQluYW1lc1tJZHMuSURfUVVPVF0gPSBRVU9UOwotCQluYW1lc1tJZHMuSURfUkFESUNdID0gUkFESUM7Ci0JCW5hbWVzW0lkcy5JRF9SQU5HXSA9IFJBTkc7Ci0JCW5hbWVzW0lkcy5JRF9SQVFVT10gPSBSQVFVTzsKLQkJbmFtZXNbSWRzLklEX1JBUlJfTF0gPSBSQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9SQVJSX1VdID0gUkFSUl9VOwotCQluYW1lc1tJZHMuSURfUkNFSUxdID0gUkNFSUw7Ci0JCW5hbWVzW0lkcy5JRF9SRFFVT10gPSBSRFFVTzsKLQkJbmFtZXNbSWRzLklEX1JFQUxdID0gUkVBTDsKLQkJbmFtZXNbSWRzLklEX1JFR10gPSBSRUc7Ci0JCW5hbWVzW0lkcy5JRF9SRkxPT1JdID0gUkZMT09SOwotCQluYW1lc1tJZHMuSURfUkhPX0xdID0gUkhPX0w7Ci0JCW5hbWVzW0lkcy5JRF9SSE9fVV0gPSBSSE9fVTsKLQkJbmFtZXNbSWRzLklEX1JMTV0gPSBSTE07Ci0JCW5hbWVzW0lkcy5JRF9SU0FRVU9dID0gUlNBUVVPOwotCQluYW1lc1tJZHMuSURfUlNRVU9dID0gUlNRVU87Ci0JCW5hbWVzW0lkcy5JRF9TQlFVT10gPSBTQlFVTzsKLQkJbmFtZXNbSWRzLklEX1NDQVJPTl9MXSA9IFNDQVJPTl9MOwotCQluYW1lc1tJZHMuSURfU0NBUk9OX1VdID0gU0NBUk9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9TRE9UXSA9IFNET1Q7Ci0JCW5hbWVzW0lkcy5JRF9TRUNUXSA9IFNFQ1Q7Ci0JCW5hbWVzW0lkcy5JRF9TSFldID0gU0hZOwotCQluYW1lc1tJZHMuSURfU0lHTUFGXSA9IFNJR01BRjsKLQkJbmFtZXNbSWRzLklEX1NJR01BX0xdID0gU0lHTUFfTDsKLQkJbmFtZXNbSWRzLklEX1NJR01BX1VdID0gU0lHTUFfVTsKLQkJbmFtZXNbSWRzLklEX1NJTV0gPSBTSU07Ci0JCW5hbWVzW0lkcy5JRF9TUEFERVNdID0gU1BBREVTOwotCQluYW1lc1tJZHMuSURfU1VCXSA9IFNVQjsKLQkJbmFtZXNbSWRzLklEX1NVQkVdID0gU1VCRTsKLQkJbmFtZXNbSWRzLklEX1NVTV0gPSBTVU07Ci0JCW5hbWVzW0lkcy5JRF9TVVBdID0gU1VQOwotCQluYW1lc1tJZHMuSURfU1VQMV0gPSBTVVAxOwotCQluYW1lc1tJZHMuSURfU1VQMl0gPSBTVVAyOwotCQluYW1lc1tJZHMuSURfU1VQM10gPSBTVVAzOwotCQluYW1lc1tJZHMuSURfU1VQRV0gPSBTVVBFOwotCQluYW1lc1tJZHMuSURfU1pMSUddID0gU1pMSUc7Ci0JCW5hbWVzW0lkcy5JRF9UQVVfTF0gPSBUQVVfTDsKLQkJbmFtZXNbSWRzLklEX1RBVV9VXSA9IFRBVV9VOwotCQluYW1lc1tJZHMuSURfVEhFUkU0XSA9IFRIRVJFNDsKLQkJbmFtZXNbSWRzLklEX1RIRVRBU1lNXSA9IFRIRVRBU1lNOwotCQluYW1lc1tJZHMuSURfVEhFVEFfTF0gPSBUSEVUQV9MOwotCQluYW1lc1tJZHMuSURfVEhFVEFfVV0gPSBUSEVUQV9VOwotCQluYW1lc1tJZHMuSURfVEhJTlNQXSA9IFRISU5TUDsKLQkJbmFtZXNbSWRzLklEX1RIT1JOX0xdID0gVEhPUk5fTDsKLQkJbmFtZXNbSWRzLklEX1RIT1JOX1VdID0gVEhPUk5fVTsKLQkJbmFtZXNbSWRzLklEX1RJTERFXSA9IFRJTERFOwotCQluYW1lc1tJZHMuSURfVElNRVNdID0gVElNRVM7Ci0JCW5hbWVzW0lkcy5JRF9UUkFERV0gPSBUUkFERTsKLQkJbmFtZXNbSWRzLklEX1VBQ1VURV9MXSA9IFVBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfVUFDVVRFX1VdID0gVUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9VQVJSX0xdID0gVUFSUl9MOwotCQluYW1lc1tJZHMuSURfVUFSUl9VXSA9IFVBUlJfVTsKLQkJbmFtZXNbSWRzLklEX1VDSVJDX0xdID0gVUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX1VDSVJDX1VdID0gVUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX1VHUkFWRV9MXSA9IFVHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfVUdSQVZFX1VdID0gVUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9VTUxdID0gVU1MOwotCQluYW1lc1tJZHMuSURfVVBTSUhdID0gVVBTSUg7Ci0JCW5hbWVzW0lkcy5JRF9VUFNJTE9OX0xdID0gVVBTSUxPTl9MOwotCQluYW1lc1tJZHMuSURfVVBTSUxPTl9VXSA9IFVQU0lMT05fVTsKLQkJbmFtZXNbSWRzLklEX1VVTUxfTF0gPSBVVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9VVU1MX1VdID0gVVVNTF9VOwotCQluYW1lc1tJZHMuSURfV0VJRVJQXSA9IFdFSUVSUDsKLQkJbmFtZXNbSWRzLklEX1hJX0xdID0gWElfTDsKLQkJbmFtZXNbSWRzLklEX1hJX1VdID0gWElfVTsKLQkJbmFtZXNbSWRzLklEX1lBQ1VURV9MXSA9IFlBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfWUFDVVRFX1VdID0gWUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9ZRU5dID0gWUVOOwotCQluYW1lc1tJZHMuSURfWVVNTF9MXSA9IFlVTUxfTDsKLQkJbmFtZXNbSWRzLklEX1lVTUxfVV0gPSBZVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9aRVRBX0xdID0gWkVUQV9MOwotCQluYW1lc1tJZHMuSURfWkVUQV9VXSA9IFpFVEFfVTsKLQkJbmFtZXNbSWRzLklEX1pXSl0gPSBaV0o7Ci0JCW5hbWVzW0lkcy5JRF9aV05KXSA9IFpXTko7Ci0JfQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB2YWx1ZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJdmFsdWVzID0gbmV3IGNoYXJbSWRzLmdldE51bU9mSWRzKCldOwotCQl2YWx1ZXNbSWRzLklEX0FBQ1VURV9MXSA9IDIyNTsKLQkJdmFsdWVzW0lkcy5JRF9BQUNVVEVfVV0gPSAxOTM7Ci0JCXZhbHVlc1tJZHMuSURfQUNJUkNfTF0gPSAyMjY7Ci0JCXZhbHVlc1tJZHMuSURfQUNJUkNfVV0gPSAxOTQ7Ci0JCXZhbHVlc1tJZHMuSURfQUNVVEVdID0gMTgwOwotCQl2YWx1ZXNbSWRzLklEX0FFTElHX0xdID0gMjMwOwotCQl2YWx1ZXNbSWRzLklEX0FFTElHX1VdID0gMTk4OwotCQl2YWx1ZXNbSWRzLklEX0FHUkFWRV9MXSA9IDIyNDsKLQkJdmFsdWVzW0lkcy5JRF9BR1JBVkVfVV0gPSAxOTI7Ci0JCXZhbHVlc1tJZHMuSURfQUxFRlNZTV0gPSA4NTAxOwotCQl2YWx1ZXNbSWRzLklEX0FMUEhBX0xdID0gOTQ1OwotCQl2YWx1ZXNbSWRzLklEX0FMUEhBX1VdID0gOTEzOwotCQl2YWx1ZXNbSWRzLklEX0FNUF0gPSAzODsKLQkJdmFsdWVzW0lkcy5JRF9BTkRdID0gODc0MzsKLQkJdmFsdWVzW0lkcy5JRF9BTkddID0gODczNjsKLQkJdmFsdWVzW0lkcy5JRF9BUklOR19MXSA9IDIyOTsKLQkJdmFsdWVzW0lkcy5JRF9BUklOR19VXSA9IDE5NzsKLQkJdmFsdWVzW0lkcy5JRF9BU1lNUF0gPSA4Nzc2OwotCQl2YWx1ZXNbSWRzLklEX0FUSUxERV9MXSA9IDIyNzsKLQkJdmFsdWVzW0lkcy5JRF9BVElMREVfVV0gPSAxOTU7Ci0JCXZhbHVlc1tJZHMuSURfQVVNTF9MXSA9IDIyODsKLQkJdmFsdWVzW0lkcy5JRF9BVU1MX1VdID0gMTk2OwotCQl2YWx1ZXNbSWRzLklEX0JEUVVPXSA9IDgyMjI7Ci0JCXZhbHVlc1tJZHMuSURfQkVUQV9MXSA9IDk0NjsKLQkJdmFsdWVzW0lkcy5JRF9CRVRBX1VdID0gOTE0OwotCQl2YWx1ZXNbSWRzLklEX0JSVkJBUl0gPSAxNjY7Ci0JCXZhbHVlc1tJZHMuSURfQlVMTF0gPSA4MjI2OwotCQl2YWx1ZXNbSWRzLklEX0NBUF0gPSA4NzQ1OwotCQl2YWx1ZXNbSWRzLklEX0NDRURJTF9MXSA9IDIzMTsKLQkJdmFsdWVzW0lkcy5JRF9DQ0VESUxfVV0gPSAxOTk7Ci0JCXZhbHVlc1tJZHMuSURfQ0VESUxdID0gMTg0OwotCQl2YWx1ZXNbSWRzLklEX0NFTlRdID0gMTYyOwotCQl2YWx1ZXNbSWRzLklEX0NISV9MXSA9IDk2NzsKLQkJdmFsdWVzW0lkcy5JRF9DSElfVV0gPSA5MzU7Ci0JCXZhbHVlc1tJZHMuSURfQ0lSQ10gPSA3MTA7Ci0JCXZhbHVlc1tJZHMuSURfQ0xVQlNdID0gOTgyNzsKLQkJdmFsdWVzW0lkcy5JRF9DT05HXSA9IDg3NzM7Ci0JCXZhbHVlc1tJZHMuSURfQ09QWV0gPSAxNjk7Ci0JCXZhbHVlc1tJZHMuSURfQ1JBUlJdID0gODYyOTsKLQkJdmFsdWVzW0lkcy5JRF9DVVBdID0gODc0NjsKLQkJdmFsdWVzW0lkcy5JRF9DVVJSRU5dID0gMTY0OwotCQl2YWx1ZXNbSWRzLklEX0RBR0dFUl9MXSA9IDgyMjQ7Ci0JCXZhbHVlc1tJZHMuSURfREFHR0VSX1VdID0gODIyNTsKLQkJdmFsdWVzW0lkcy5JRF9EQVJSX0xdID0gODU5NTsKLQkJdmFsdWVzW0lkcy5JRF9EQVJSX1VdID0gODY1OTsKLQkJdmFsdWVzW0lkcy5JRF9ERUddID0gMTc2OwotCQl2YWx1ZXNbSWRzLklEX0RFTFRBX0xdID0gOTQ4OwotCQl2YWx1ZXNbSWRzLklEX0RFTFRBX1VdID0gOTE2OwotCQl2YWx1ZXNbSWRzLklEX0RJQU1TXSA9IDk4MzA7Ci0JCXZhbHVlc1tJZHMuSURfRElWSURFXSA9IDI0NzsKLQkJdmFsdWVzW0lkcy5JRF9FQUNVVEVfTF0gPSAyMzM7Ci0JCXZhbHVlc1tJZHMuSURfRUFDVVRFX1VdID0gMjAxOwotCQl2YWx1ZXNbSWRzLklEX0VDSVJDX0xdID0gMjM0OwotCQl2YWx1ZXNbSWRzLklEX0VDSVJDX1VdID0gMjAyOwotCQl2YWx1ZXNbSWRzLklEX0VHUkFWRV9MXSA9IDIzMjsKLQkJdmFsdWVzW0lkcy5JRF9FR1JBVkVfVV0gPSAyMDA7Ci0JCXZhbHVlc1tJZHMuSURfRU1QVFldID0gODcwOTsKLQkJdmFsdWVzW0lkcy5JRF9FTVNQXSA9IDgxOTU7Ci0JCXZhbHVlc1tJZHMuSURfRU5TUF0gPSA4MTk0OwotCQl2YWx1ZXNbSWRzLklEX0VQU0lMT05fTF0gPSA5NDk7Ci0JCXZhbHVlc1tJZHMuSURfRVBTSUxPTl9VXSA9IDkxNzsKLQkJdmFsdWVzW0lkcy5JRF9FUVVJVl0gPSA4ODAxOwotCQl2YWx1ZXNbSWRzLklEX0VUQV9MXSA9IDk1MTsKLQkJdmFsdWVzW0lkcy5JRF9FVEFfVV0gPSA5MTk7Ci0JCXZhbHVlc1tJZHMuSURfRVRIX0xdID0gMjQwOwotCQl2YWx1ZXNbSWRzLklEX0VUSF9VXSA9IDIwODsKLQkJdmFsdWVzW0lkcy5JRF9FVU1MX0xdID0gMjM1OwotCQl2YWx1ZXNbSWRzLklEX0VVTUxfVV0gPSAyMDM7Ci0JCXZhbHVlc1tJZHMuSURfRVVST10gPSA4MzY0OwotCQl2YWx1ZXNbSWRzLklEX0VYSVNUXSA9IDg3MDc7Ci0JCXZhbHVlc1tJZHMuSURfRk5PRl0gPSA0MDI7Ci0JCXZhbHVlc1tJZHMuSURfRk9SQUxMXSA9IDg3MDQ7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzEyXSA9IDE4OTsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMTRdID0gMTg4OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMzNF0gPSAxOTA7Ci0JCXZhbHVlc1tJZHMuSURfRlJBU0xdID0gODI2MDsKLQkJdmFsdWVzW0lkcy5JRF9HQU1NQV9MXSA9IDk0NzsKLQkJdmFsdWVzW0lkcy5JRF9HQU1NQV9VXSA9IDkxNTsKLQkJdmFsdWVzW0lkcy5JRF9HRV0gPSA4ODA1OwotCQl2YWx1ZXNbSWRzLklEX0dUXSA9IDYyOwotCQl2YWx1ZXNbSWRzLklEX0hBUlJfTF0gPSA4NTk2OwotCQl2YWx1ZXNbSWRzLklEX0hBUlJfVV0gPSA4NjYwOwotCQl2YWx1ZXNbSWRzLklEX0hFQVJUU10gPSA5ODI5OwotCQl2YWx1ZXNbSWRzLklEX0hFTExJUF0gPSA4MjMwOwotCQl2YWx1ZXNbSWRzLklEX0lBQ1VURV9MXSA9IDIzNzsKLQkJdmFsdWVzW0lkcy5JRF9JQUNVVEVfVV0gPSAyMDU7Ci0JCXZhbHVlc1tJZHMuSURfSUNJUkNfTF0gPSAyMzg7Ci0JCXZhbHVlc1tJZHMuSURfSUNJUkNfVV0gPSAyMDY7Ci0JCXZhbHVlc1tJZHMuSURfSUVYQ0xdID0gMTYxOwotCQl2YWx1ZXNbSWRzLklEX0lHUkFWRV9MXSA9IDIzNjsKLQkJdmFsdWVzW0lkcy5JRF9JR1JBVkVfVV0gPSAyMDQ7Ci0JCXZhbHVlc1tJZHMuSURfSU1BR0VdID0gODQ2NTsKLQkJdmFsdWVzW0lkcy5JRF9JTkZJTl0gPSA4NzM0OwotCQl2YWx1ZXNbSWRzLklEX0lOVF0gPSA4NzQ3OwotCQl2YWx1ZXNbSWRzLklEX0lPVEFfTF0gPSA5NTM7Ci0JCXZhbHVlc1tJZHMuSURfSU9UQV9VXSA9IDkyMTsKLQkJdmFsdWVzW0lkcy5JRF9JUVVFU1RdID0gMTkxOwotCQl2YWx1ZXNbSWRzLklEX0lTSU5dID0gODcxMjsKLQkJdmFsdWVzW0lkcy5JRF9JVU1MX0xdID0gMjM5OwotCQl2YWx1ZXNbSWRzLklEX0lVTUxfVV0gPSAyMDc7Ci0JCXZhbHVlc1tJZHMuSURfS0FQUEFfTF0gPSA5NTQ7Ci0JCXZhbHVlc1tJZHMuSURfS0FQUEFfVV0gPSA5MjI7Ci0JCXZhbHVlc1tJZHMuSURfTEFNQkRBX0xdID0gOTU1OwotCQl2YWx1ZXNbSWRzLklEX0xBTUJEQV9VXSA9IDkyMzsKLQkJdmFsdWVzW0lkcy5JRF9MQU5HXSA9IDkwMDE7Ci0JCXZhbHVlc1tJZHMuSURfTEFRVU9dID0gMTcxOwotCQl2YWx1ZXNbSWRzLklEX0xBUlJfTF0gPSA4NTkyOwotCQl2YWx1ZXNbSWRzLklEX0xBUlJfVV0gPSA4NjU2OwotCQl2YWx1ZXNbSWRzLklEX0xDRUlMXSA9IDg5Njg7Ci0JCXZhbHVlc1tJZHMuSURfTERRVU9dID0gODIyMDsKLQkJdmFsdWVzW0lkcy5JRF9MRV0gPSA4ODA0OwotCQl2YWx1ZXNbSWRzLklEX0xGTE9PUl0gPSA4OTcwOwotCQl2YWx1ZXNbSWRzLklEX0xPV0FTVF0gPSA4NzI3OwotCQl2YWx1ZXNbSWRzLklEX0xPWl0gPSA5Njc0OwotCQl2YWx1ZXNbSWRzLklEX0xSTV0gPSA4MjA2OwotCQl2YWx1ZXNbSWRzLklEX0xTQVFVT10gPSA4MjQ5OwotCQl2YWx1ZXNbSWRzLklEX0xTUVVPXSA9IDgyMTY7Ci0JCXZhbHVlc1tJZHMuSURfTFRdID0gNjA7Ci0JCXZhbHVlc1tJZHMuSURfTUFDUl0gPSAxNzU7Ci0JCXZhbHVlc1tJZHMuSURfTURBU0hdID0gODIxMjsKLQkJdmFsdWVzW0lkcy5JRF9NSUNST10gPSAxODE7Ci0JCXZhbHVlc1tJZHMuSURfTUlERE9UXSA9IDE4MzsKLQkJdmFsdWVzW0lkcy5JRF9NSU5VU10gPSA4NzIyOwotCQl2YWx1ZXNbSWRzLklEX01VX0xdID0gOTU2OwotCQl2YWx1ZXNbSWRzLklEX01VX1VdID0gOTI0OwotCQl2YWx1ZXNbSWRzLklEX05BQkxBXSA9IDg3MTE7Ci0JCXZhbHVlc1tJZHMuSURfTkJTUF0gPSAxNjA7Ci0JCXZhbHVlc1tJZHMuSURfTkRBU0hdID0gODIxMTsKLQkJdmFsdWVzW0lkcy5JRF9ORV0gPSA4ODAwOwotCQl2YWx1ZXNbSWRzLklEX05JXSA9IDg3MTU7Ci0JCXZhbHVlc1tJZHMuSURfTk9UXSA9IDE3MjsKLQkJdmFsdWVzW0lkcy5JRF9OT1RJTl0gPSA4NzEzOwotCQl2YWx1ZXNbSWRzLklEX05TVUJdID0gODgzNjsKLQkJdmFsdWVzW0lkcy5JRF9OVElMREVfTF0gPSAyNDE7Ci0JCXZhbHVlc1tJZHMuSURfTlRJTERFX1VdID0gMjA5OwotCQl2YWx1ZXNbSWRzLklEX05VX0xdID0gOTU3OwotCQl2YWx1ZXNbSWRzLklEX05VX1VdID0gOTI1OwotCQl2YWx1ZXNbSWRzLklEX09BQ1VURV9MXSA9IDI0MzsKLQkJdmFsdWVzW0lkcy5JRF9PQUNVVEVfVV0gPSAyMTE7Ci0JCXZhbHVlc1tJZHMuSURfT0NJUkNfTF0gPSAyNDQ7Ci0JCXZhbHVlc1tJZHMuSURfT0NJUkNfVV0gPSAyMTI7Ci0JCXZhbHVlc1tJZHMuSURfT0VMSUdfTF0gPSAzMzk7Ci0JCXZhbHVlc1tJZHMuSURfT0VMSUdfVV0gPSAzMzg7Ci0JCXZhbHVlc1tJZHMuSURfT0dSQVZFX0xdID0gMjQyOwotCQl2YWx1ZXNbSWRzLklEX09HUkFWRV9VXSA9IDIxMDsKLQkJdmFsdWVzW0lkcy5JRF9PTElORV0gPSA4MjU0OwotCQl2YWx1ZXNbSWRzLklEX09NRUdBX0xdID0gOTY5OwotCQl2YWx1ZXNbSWRzLklEX09NRUdBX1VdID0gOTM3OwotCQl2YWx1ZXNbSWRzLklEX09NSUNST05fTF0gPSA5NTk7Ci0JCXZhbHVlc1tJZHMuSURfT01JQ1JPTl9VXSA9IDkyNzsKLQkJdmFsdWVzW0lkcy5JRF9PUExVU10gPSA4ODUzOwotCQl2YWx1ZXNbSWRzLklEX09SXSA9IDg3NDQ7Ci0JCXZhbHVlc1tJZHMuSURfT1JERl0gPSAxNzA7Ci0JCXZhbHVlc1tJZHMuSURfT1JETV0gPSAxODY7Ci0JCXZhbHVlc1tJZHMuSURfT1NMQVNIX0xdID0gMjQ4OwotCQl2YWx1ZXNbSWRzLklEX09TTEFTSF9VXSA9IDIxNjsKLQkJdmFsdWVzW0lkcy5JRF9PVElMREVfTF0gPSAyNDU7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTERFX1VdID0gMjEzOwotCQl2YWx1ZXNbSWRzLklEX09USU1FU10gPSA4ODU1OwotCQl2YWx1ZXNbSWRzLklEX09VTUxfTF0gPSAyNDY7Ci0JCXZhbHVlc1tJZHMuSURfT1VNTF9VXSA9IDIxNDsKLQkJdmFsdWVzW0lkcy5JRF9QQVJBXSA9IDE4MjsKLQkJdmFsdWVzW0lkcy5JRF9QQVJUXSA9IDg3MDY7Ci0JCXZhbHVlc1tJZHMuSURfUEVSTUlMXSA9IDgyNDA7Ci0JCXZhbHVlc1tJZHMuSURfUEVSUF0gPSA4ODY5OwotCQl2YWx1ZXNbSWRzLklEX1BISV9MXSA9IDk2NjsKLQkJdmFsdWVzW0lkcy5JRF9QSElfVV0gPSA5MzQ7Ci0JCXZhbHVlc1tJZHMuSURfUElWXSA9IDk4MjsKLQkJdmFsdWVzW0lkcy5JRF9QSV9MXSA9IDk2MDsKLQkJdmFsdWVzW0lkcy5JRF9QSV9VXSA9IDkyODsKLQkJdmFsdWVzW0lkcy5JRF9QTFVTTU5dID0gMTc3OwotCQl2YWx1ZXNbSWRzLklEX1BPVU5EXSA9IDE2MzsKLQkJdmFsdWVzW0lkcy5JRF9QUklNRV9MXSA9IDgyNDI7Ci0JCXZhbHVlc1tJZHMuSURfUFJJTUVfVV0gPSA4MjQzOwotCQl2YWx1ZXNbSWRzLklEX1BST0RdID0gODcxOTsKLQkJdmFsdWVzW0lkcy5JRF9QUk9QXSA9IDg3MzM7Ci0JCXZhbHVlc1tJZHMuSURfUFNJX0xdID0gOTY4OwotCQl2YWx1ZXNbSWRzLklEX1BTSV9VXSA9IDkzNjsKLQkJdmFsdWVzW0lkcy5JRF9RVU9UXSA9IDM0OwotCQl2YWx1ZXNbSWRzLklEX1JBRElDXSA9IDg3MzA7Ci0JCXZhbHVlc1tJZHMuSURfUkFOR10gPSA5MDAyOwotCQl2YWx1ZXNbSWRzLklEX1JBUVVPXSA9IDE4NzsKLQkJdmFsdWVzW0lkcy5JRF9SQVJSX0xdID0gODU5NDsKLQkJdmFsdWVzW0lkcy5JRF9SQVJSX1VdID0gODY1ODsKLQkJdmFsdWVzW0lkcy5JRF9SQ0VJTF0gPSA4OTY5OwotCQl2YWx1ZXNbSWRzLklEX1JEUVVPXSA9IDgyMjE7Ci0JCXZhbHVlc1tJZHMuSURfUkVBTF0gPSA4NDc2OwotCQl2YWx1ZXNbSWRzLklEX1JFR10gPSAxNzQ7Ci0JCXZhbHVlc1tJZHMuSURfUkZMT09SXSA9IDg5NzE7Ci0JCXZhbHVlc1tJZHMuSURfUkhPX0xdID0gOTYxOwotCQl2YWx1ZXNbSWRzLklEX1JIT19VXSA9IDkyOTsKLQkJdmFsdWVzW0lkcy5JRF9STE1dID0gODIwNzsKLQkJdmFsdWVzW0lkcy5JRF9SU0FRVU9dID0gODI1MDsKLQkJdmFsdWVzW0lkcy5JRF9SU1FVT10gPSA4MjE3OwotCQl2YWx1ZXNbSWRzLklEX1NCUVVPXSA9IDgyMTg7Ci0JCXZhbHVlc1tJZHMuSURfU0NBUk9OX0xdID0gMzUzOwotCQl2YWx1ZXNbSWRzLklEX1NDQVJPTl9VXSA9IDM1MjsKLQkJdmFsdWVzW0lkcy5JRF9TRE9UXSA9IDg5MDE7Ci0JCXZhbHVlc1tJZHMuSURfU0VDVF0gPSAxNjc7Ci0JCXZhbHVlc1tJZHMuSURfU0hZXSA9IDE3MzsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQUZdID0gOTYyOwotCQl2YWx1ZXNbSWRzLklEX1NJR01BX0xdID0gOTYzOwotCQl2YWx1ZXNbSWRzLklEX1NJR01BX1VdID0gOTMxOwotCQl2YWx1ZXNbSWRzLklEX1NJTV0gPSA4NzY0OwotCQl2YWx1ZXNbSWRzLklEX1NQQURFU10gPSA5ODI0OwotCQl2YWx1ZXNbSWRzLklEX1NVQl0gPSA4ODM0OwotCQl2YWx1ZXNbSWRzLklEX1NVQkVdID0gODgzODsKLQkJdmFsdWVzW0lkcy5JRF9TVU1dID0gODcyMTsKLQkJdmFsdWVzW0lkcy5JRF9TVVBdID0gODgzNTsKLQkJdmFsdWVzW0lkcy5JRF9TVVAxXSA9IDE4NTsKLQkJdmFsdWVzW0lkcy5JRF9TVVAyXSA9IDE3ODsKLQkJdmFsdWVzW0lkcy5JRF9TVVAzXSA9IDE3OTsKLQkJdmFsdWVzW0lkcy5JRF9TVVBFXSA9IDg4Mzk7Ci0JCXZhbHVlc1tJZHMuSURfU1pMSUddID0gMjIzOwotCQl2YWx1ZXNbSWRzLklEX1RBVV9MXSA9IDk2NDsKLQkJdmFsdWVzW0lkcy5JRF9UQVVfVV0gPSA5MzI7Ci0JCXZhbHVlc1tJZHMuSURfVEhFUkU0XSA9IDg3NTY7Ci0JCXZhbHVlc1tJZHMuSURfVEhFVEFTWU1dID0gOTc3OwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBX0xdID0gOTUyOwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBX1VdID0gOTIwOwotCQl2YWx1ZXNbSWRzLklEX1RISU5TUF0gPSA4MjAxOwotCQl2YWx1ZXNbSWRzLklEX1RIT1JOX0xdID0gMjU0OwotCQl2YWx1ZXNbSWRzLklEX1RIT1JOX1VdID0gMjIyOwotCQl2YWx1ZXNbSWRzLklEX1RJTERFXSA9IDczMjsKLQkJdmFsdWVzW0lkcy5JRF9USU1FU10gPSAyMTU7Ci0JCXZhbHVlc1tJZHMuSURfVFJBREVdID0gODQ4MjsKLQkJdmFsdWVzW0lkcy5JRF9VQUNVVEVfTF0gPSAyNTA7Ci0JCXZhbHVlc1tJZHMuSURfVUFDVVRFX1VdID0gMjE4OwotCQl2YWx1ZXNbSWRzLklEX1VBUlJfTF0gPSA4NTkzOwotCQl2YWx1ZXNbSWRzLklEX1VBUlJfVV0gPSA4NjU3OwotCQl2YWx1ZXNbSWRzLklEX1VDSVJDX0xdID0gMjUxOwotCQl2YWx1ZXNbSWRzLklEX1VDSVJDX1VdID0gMjE5OwotCQl2YWx1ZXNbSWRzLklEX1VHUkFWRV9MXSA9IDI0OTsKLQkJdmFsdWVzW0lkcy5JRF9VR1JBVkVfVV0gPSAyMTc7Ci0JCXZhbHVlc1tJZHMuSURfVU1MXSA9IDE2ODsKLQkJdmFsdWVzW0lkcy5JRF9VUFNJSF0gPSA5Nzg7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUxPTl9MXSA9IDk2NTsKLQkJdmFsdWVzW0lkcy5JRF9VUFNJTE9OX1VdID0gOTMzOwotCQl2YWx1ZXNbSWRzLklEX1VVTUxfTF0gPSAyNTI7Ci0JCXZhbHVlc1tJZHMuSURfVVVNTF9VXSA9IDIyMDsKLQkJdmFsdWVzW0lkcy5JRF9XRUlFUlBdID0gODQ3MjsKLQkJdmFsdWVzW0lkcy5JRF9YSV9MXSA9IDk1ODsKLQkJdmFsdWVzW0lkcy5JRF9YSV9VXSA9IDkyNjsKLQkJdmFsdWVzW0lkcy5JRF9ZQUNVVEVfTF0gPSAyNTM7Ci0JCXZhbHVlc1tJZHMuSURfWUFDVVRFX1VdID0gMjIxOwotCQl2YWx1ZXNbSWRzLklEX1lFTl0gPSAxNjU7Ci0JCXZhbHVlc1tJZHMuSURfWVVNTF9MXSA9IDI1NTsKLQkJdmFsdWVzW0lkcy5JRF9ZVU1MX1VdID0gMzc2OwotCQl2YWx1ZXNbSWRzLklEX1pFVEFfTF0gPSA5NTA7Ci0JCXZhbHVlc1tJZHMuSURfWkVUQV9VXSA9IDkxODsKLQkJdmFsdWVzW0lkcy5JRF9aV0pdID0gODIwNTsKLQkJdmFsdWVzW0lkcy5JRF9aV05KXSA9IDgyMDQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVudGl0eUNvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKG5hbWVzLCBTVFJJQ1RfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGVudGl0eSBkZWNsYXJhdGlvbi4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQoZW50aXR5TmFtZSk7Ci0JCWlmIChpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHZhbHVlID0gU3RyaW5nLnZhbHVlT2YodmFsdWVzW2lkXSk7Ci0JCUhUTUxFbnRpdHlEZWNsSW1wbCBkZWMgPSBuZXcgSFRNTEVudGl0eURlY2xJbXBsKGVudGl0eU5hbWUsIHZhbHVlKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hDTURvY0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSENNRG9jSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQ1MDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSENNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEhUTUwuCi0gKi8KLWNsYXNzIEhDTURvY0ltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTENNRG9jdW1lbnQgewotCi0JLyoqIE5hbWVzcGFjZSBmb3IgYWxsIG5hbWVzIG9mIGVsZW1lbnRzLCBlbnRpdGllcyBhbmQgYXR0cmlidXRlcy4gKi8KLQlwcml2YXRlIENNTmFtZXNwYWNlSW1wbCBuYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudHMgPSBudWxsOwotCXByaXZhdGUgRW50aXR5Q29sbGVjdGlvbiBlbnRpdGllcyA9IG51bGw7Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb2xsZWN0aW9uIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhDTURvY0ltcGwoU3RyaW5nIGRvY1R5cGVOYW1lLCBDTU5hbWVzcGFjZUltcGwgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lKTsKLQkJbmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQlhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZUNvbGxlY3Rpb24oKTsKLQkJZWxlbWVudHMgPSBuZXcgRWxlbWVudENvbGxlY3Rpb24oYXR0cmlidXRlcyk7Ci0JCWVudGl0aWVzID0gbmV3IEVudGl0eUNvbGxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkF0dHJpYnV0ZUNvbGxlY3Rpb24KLQkgKi8KLQlBdHRyaWJ1dGVDb2xsZWN0aW9uIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTENNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBlbnRpdGllczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxDTURvY3VtZW50Ci0JICovCi0JcHVibGljIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiBnZXRFbnRpdHlEZWNsYXJhdGlvbihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlpZiAoZW50aXRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbnRpdHlEZWNsYXJhdGlvbikgZW50aXRpZXMuZ2V0TmFtZWRJdGVtKGVudGl0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxBdHRyRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMxMWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTENNUHJvcGVydGllczsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiB7QGxpbmsgPGNvZGU+SFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uPC9jb2RlPn0gaW50ZXJmYWNlLjxicj4KLSAqLwotY2xhc3MgSFRNTEF0dHJEZWNsSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBIVE1MQ01EYXRhVHlwZUltcGwgdHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdXNhZ2UgPSAwOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxBdHRyRGVjbEltcGwoU3RyaW5nIGF0dHJOYW1lLCBIVE1MQ01EYXRhVHlwZUltcGwgdmFsdWVUeXBlLCBpbnQgdmFsdWVVc2FnZSkgewotCQlzdXBlcihhdHRyTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHZhbHVlVHlwZTsKLQotCQlzd2l0Y2ggKHZhbHVlVXNhZ2UpIHsKLQkJCWNhc2UgT1BUSU9OQUwgOgotCQkJY2FzZSBSRVFVSVJFRCA6Ci0JCQljYXNlIEZJWEVEIDoKLQkJCWNhc2UgUFJPSElCSVRFRCA6Ci0JCQkJdGhpcy51c2FnZSA9IHZhbHVlVXNhZ2U7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgd2Fybi4uLgotCQkJCXRoaXMudXNhZ2UgPSBPUFRJT05BTDsgLy8gZmFsbCBiYWNrCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIENNRGF0YVR5cGUKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgYnkgc3VwZXJpbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJaWYgKHR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxUKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0eXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGJ5IHN1cGVyaW50ZXJmYWNlCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSkpOwotCQlyZXR1cm4gdi5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogRUxFTUVOVF9ERUNMQVJBVElPTiwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBHUk9VUCwgRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRVc2FnZSgpIHsKLQkJcmV0dXJuIHVzYWdlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TQ1JJUFRBQkxFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU0NSSVBUQUJMRSkpIHsKLQkJCXJldHVybiBnZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpID09IEhUTUxDTURhdGFUeXBlLlNDUklQVCA/IG5ldyBCb29sZWFuKHRydWUpIDogbmV3IEJvb2xlYW4oZmFsc2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IVE1MQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhOTc2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGEgcHVibGljIGludGVyZmFjZSB3aGljaCBoYXMKLSAqIGludGVyZmFjZXMgZGVmaW5lZCBpbiBib3RoIG9mIHtAbGluayA8Y29kZT5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uPC9jb2RlPn0KLSAqIGFuZCB7QGxpbmsgPGNvZGU+SFRNTENNTm9kZTwvY29kZT59Ljxicj4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZXh0ZW5kcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwZTE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogSFRNTCBleHRlbnNpb24gZm9yIGRhdGEgdHlwZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTENNRGF0YVR5cGUgZXh0ZW5kcyBDTURhdGFUeXBlIHsKLQotCS8qKiBCb29sZWFuOyBpdCBzaG91bGQgYmUgZGVmaW5lZCBpbiBDTURhdGFUeXBlLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU4gPSAiQk9PTEVBTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUiA9ICJDT0xPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVCA9ICJFVkVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRlMgPSAiSURSRUZTIjsgLy8kTk9OLU5MUy0xJAotCS8qKiBOYW1lOyBpdCBzaG91bGQgYmUgZGVmaW5lZCBpbiBDTURhdGFUeXBlLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBGb2xsb3dpbmcgdHlwZXMgYXJlIGp1c3QgYWxpYXNlcy4KLQkvKiogJUNoYXJhY3RlcjsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVIgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlQ2hhcnNldDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUNoYXJzZXRzOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJTRVRTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUNvbnRlbnRUeXBlOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVDb29yZHM7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09PUkRTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJURhdGV0aW1lOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVUSU1FID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUZyYW1lVGFyZ2V0OyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FX1RBUkdFVCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVMYW5ndWFnZUNvZGU7ID09IE5BTUUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HVUFHRV9DT0RFID0gTkFNRTsKLQkvKiogJUxlbmd0aDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRU5HVEggPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTGlua1R5cGVzOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfVFlQRVMgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTElTdHlsZTsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSV9TVFlMRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVNZWRpYURlc2M7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfREVTQyA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVNdWx0aUxlbmd0aDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSV9MRU5HVEggPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlT0xTdHlsZTsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTF9TVFlMRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVQaXhsZXM7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElYRUxTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJVNjcmlwdDsgPT0gRVZFTlQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFQgPSBFVkVOVDsKLQkvKiogJVN0eWxlU2hlZXQ7ID09IEVWRU5UICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfU0hFRVQgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlVGV4dDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gQ01EYXRhVHlwZS5DREFUQTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2NzQ3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgSFRNTENNRGF0YVR5cGVJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxDTURhdGFUeXBlIHsKLQotCXByaXZhdGUgaW50IGltcGxpZWRWYWx1ZUtpbmQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JcHJpdmF0ZSBTdHJpbmcgaW1wbGllZFZhbHVlID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBlbXB0eUFycmF5ID0gbmV3IFN0cmluZ1swXTsKLQlwcml2YXRlIFN0cmluZ1tdIGVudW1WYWx1ZXMgPSBlbXB0eUFycmF5OwotCXByaXZhdGUgU3RyaW5nIGluc3RhbmNlVmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogSFRNTENNRGF0YVR5cGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5tIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTENNRGF0YVR5cGVJbXBsKFN0cmluZyB0eXBlTmFtZSkgewotCQlzdXBlcih0eXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSFRNTENNRGF0YVR5cGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5tIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTENNRGF0YVR5cGVJbXBsKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGluc3RhbmNlVmFsdWUpIHsKLQkJc3VwZXIodHlwZU5hbWUpOwotCQl0aGlzLmluc3RhbmNlVmFsdWUgPSBpbnN0YW5jZVZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIHR5cGUgaXMgY3JlYXRlZC4KLQkgKiBUaGlzIHJldHVybnMgbnVsbCBvZiBhIHN1aXRhYmxlIGRlZmF1bHQgaXMgbm90IGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpIHsKLQkJcmV0dXJuIGVudW1WYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nICAKLQkgKgotCSAqIFJldHVybnMgdGhlIGltcGxpZWQgdmFsdWUgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGltcGxpZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0JICovCi0JcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQlyZXR1cm4gaW1wbGllZFZhbHVlS2luZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RW51bVZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJZW51bVZhbHVlcyA9IG5ldyBTdHJpbmdbdmFsdWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQllbnVtVmFsdWVzW2ldID0gdmFsdWVzW2ldOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcGFja2FnZSBzY29wZS4KLQkgKi8KLQl2b2lkIHNldEltcGxpZWRWYWx1ZShpbnQga2luZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX0ZJWEVEIDoKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9ERUZBVUxUIDoKLQkJCQlpbXBsaWVkVmFsdWVLaW5kID0ga2luZDsKLQkJCQlpbXBsaWVkVmFsdWUgPSB2YWx1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9OT05FIDoKLQkJCWRlZmF1bHQgOgotCQkJCWltcGxpZWRWYWx1ZUtpbmQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JCQkJaW1wbGllZFZhbHVlID0gbnVsbDsgLy8gbWF5YmUgYSBudWxsIHN0cmluZz8KLQkJCQlicmVhazsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTc3Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIEhUTUwgZXh0ZW5zaW9uIGZvciBDTURvY3VtZW50LgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgc29tZSBzaG9ydCBoYW5kIG1ldGhvZHMgdG8gZ2V0IGRlY2xhcmF0aW9ucwotICogYnkgYSBuYW1lLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxDTURvY3VtZW50IGV4dGVuZHMgQ01Eb2N1bWVudCB7Ci0KLQkvKioKLQkgKiBBIHNob3J0IGhhbmQgbWV0aG9kIHRvIGdldCBhIGVsZW1lbnQgZGVjbGFyYXRpb24gZm9yIGEgSFRNTCBlbGVtZW50Ljxicj4KLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUhUTUxFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50TmFtZSk7Ci0KLQkvKioKLQkgKiBBIHNob3J0IGhhbmQgbWV0aG9kIHRvIGdldCBhIGVudGl0eSBkZWNsYXJhdGlvbiBvZiBIVE1MIGRvY3VtZW50cy48YnI+Ci0JICogQHJldHVybiBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5IVE1MRW50aXR5RGVjbGFyYXRpb24KLQkgKiBAcGFyYW0gZW50aXR5TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3ZWE2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbC5DSENNRG9jSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLQotLyoqCi0gKiBJTm9kZUFkYXB0ZXIgZmFjdG9yeSBmb3IgSFRNTCBhbmQgSlNQIGRvY3VtZW50cy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEhUTUxDTURvY3VtZW50RmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgY21kb2NzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0Jc3RhdGljIHsKLQkJQ01OYW1lc3BhY2VJbXBsIGg0MG5zID0gbmV3IENNTmFtZXNwYWNlSW1wbChIVE1MNDBOYW1lc3BhY2UuSFRNTDQwX1VSSSwgSFRNTDQwTmFtZXNwYWNlLkhUTUw0MF9UQUdfUFJFRklYKTsKLQkJQ01OYW1lc3BhY2VJbXBsIGoxMW5zID0gbmV3IENNTmFtZXNwYWNlSW1wbChKU1AxMU5hbWVzcGFjZS5KU1AxMV9VUkksIEpTUDExTmFtZXNwYWNlLkpTUF9UQUdfUFJFRklYKTsKLQotCQlIQ01Eb2NJbXBsIGh0bWw0MGRvYyA9IG5ldyBIQ01Eb2NJbXBsKENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFLCBoNDBucyk7Ci0JCUNIQ01Eb2NJbXBsIGNodG1sZG9jID0gbmV3IENIQ01Eb2NJbXBsKENNRG9jVHlwZS5DSFRNTF9ET0NfVFlQRSwgaDQwbnMpOwotCQlKQ01Eb2NJbXBsIGpzcDExZG9jID0gbmV3IEpDTURvY0ltcGwoQ01Eb2NUeXBlLkpTUDExX0RPQ19UWVBFLCBqMTFucyk7Ci0KLQkJY21kb2NzLnB1dChDTURvY1R5cGUuSFRNTF9ET0NfVFlQRSwgaHRtbDQwZG9jKTsKLQkJY21kb2NzLnB1dChDTURvY1R5cGUuQ0hUTUxfRE9DX1RZUEUsIGNodG1sZG9jKTsKLQkJY21kb2NzLnB1dChDTURvY1R5cGUuSlNQMTFfRE9DX1RZUEUsIGpzcDExZG9jKTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MQ01BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIEhUTUxDTURvY3VtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKiBAcGFyYW0gY210eXBlIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgY210eXBlKSB7Ci0JCU9iamVjdCBvYmogPSBjbWRvY3MuZ2V0KGNtdHlwZSk7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoQ01Eb2N1bWVudCkgb2JqOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxDTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSFRNTENNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2E3ODNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSFRNTENNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0vKioKLSAqIEluIEhUTUwgRG9jdW1lbnRzLCBuYW1lIGFuZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkKLSAqIHNob3VsZCBiZSB0cmVhdGVkIGlnbm9yaW5nIHRoZWlycyBjYXNlLiAgSG93ZXZlciwgaW4gWE1MIGRvY3VtZW50cywKLSAqIHRoZXkgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQgd2l0aCBzZW5zaXRpdmVuZXNzIG9mIHRoZWlyIGNhc2UuCi0gKiBDTU5vZGUgaXMgYmFzaWNhbGx5IGRlc2lnbmVkIHRvIHJlcHJlc2VudCBEVERzIG9yIFNjaGVtYXMgZm9yIFhNTAotICogZG9jdW1lbnRzLiAgU28sIGl0IGRvZXNuJ3QgaGF2ZSBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBIb3dldmVyLCBkZWNsYXJhdGlvbnMgaW4gdGhlIEhUTUwgQ00gc2hvdWxkIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbi4KLSAqIFRoaXMgaW50ZXJtZWRpYXRlIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHdoZXRoZXIgaWdub3JlIGNhc2VzCi0gKiBvciBub3QuPGJyPgotICovCi1pbnRlcmZhY2UgSFRNTENNTm9kZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCBpZiBkZWNsYXJhdGlvbiBpcyBmb3IgSFRNTCBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkuCi0JICogT3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHNob3VsZElnbm9yZUNhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxFbGVtRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODE0Y2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTENNUHJvcGVydGllczsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgSGVkPz8/PyBjbGFzc2VzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIVE1MRWxlbURlY2xJbXBsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24sIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIHsKLQotCS8vIERURAotCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgYXR0cmlidXRlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZOwotCS8qKiBOZXZlciBhY2Nlc3MgdGhpcyBmaWVsZCBkaXJlY3RseS4gIEluc3RlYWQsIHVzZSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24gbWV0aG9kLiAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgaW5jbHVzaW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgZXhjbHVzaW9uID0gbnVsbDsKLQkvLyBhZHZhbmNlZCBpbmZvcm1hdGlvbgotCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcCBwcm9oaWJpdGVkQW5jZXN0b3JzID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9OT05FOwotCXByb3RlY3RlZCBpbnQgZm9ybWF0VHlwZSA9IEZPUk1BVF9IVE1MOwotCXByb3RlY3RlZCBpbnQgbGF5b3V0VHlwZSA9IExBWU9VVF9OT05FOwotCXByb3RlY3RlZCBpbnQgb21pdFR5cGUgPSBPTUlUX05PTkU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4ga2VlcFNwYWNlcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGluZGVudENoaWxkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVDb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIENNTmFtZWROb2RlTWFwIEVNUFRZX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcCgpIHsKLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBIVE1MRWxlbURlY2xJbXBsIGNvbnN0cnVjdG9yLgotCSAqIEluIHRoZSBIVE1MIERURCwgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBoYXMgbm8gc3BlY2lmaWNhdGlvbgotCSAqIGZvciBpdHMgb2NjdXJyZW5jZS4gIE9jY3VycmVuY2UgaXMgc3BlY2lmZWQgaW4gY29udGVudCBtb2RlbCwgbGlrZQotCSAqIDxjb2RlPihMSSkrPC9jb2RlPi4gIFRvIGF2b2lkIGNvbmZ1c2lvbiAoYW5kIGNvbXBsZXhpdHkpLAotCSAqIG9jY3VycmVuY2Ugb2YgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBhbHdheXMgMSAoaXQgbWVhbnMsIG1pbiA9IDEgYW5kCi0JICogbWF4ID0gMSkuICBJbnN0ZWFkLCBvY2N1cnJlbmNlIG9mIENNR3JvdXAgcmVwcmVzZW50cyBhY3R1YWwgb2NjdXJyZW5jZQotCSAqIG9mIHRoZSBjb250ZW50LgotCSAqIDxicj4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxFbGVtRGVjbEltcGwoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCAxLCAxKTsKLQkJZWxlbWVudENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uID0gY29sbGVjdGlvbi5nZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uIGNyZWF0ZUNvbXBsZXhUeXBlRGVmaW5pdGlvbigpIHsKLQkJaWYgKHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9DREFUQSkgfHwgdHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZKSB8fCB0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUENEQVRBKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgZmFjdG9yeSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYXRhbCBlcnJvci4KLQotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZmFjdG9yeS5jcmVhdGVUeXBlRGVmaW5pdGlvbih0eXBlRGVmaW5pdGlvbk5hbWUsIGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotCSAqIDxicj4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7IC8vIGZhaWwgdG8gY3JlYXRlCi0JCX0KLQotCQlDTU5vZGUgY21ub2RlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIChIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsgLy8gYWxyZWFkeSBleGlzdHMuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5Db21wbGV4VHlwZURlZmluaXRpb24KLQkgKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKSB7Ci0JCWlmICh0eXBlRGVmaW5pdGlvbiA9PSBudWxsKQotCQkJdHlwZURlZmluaXRpb24gPSBjcmVhdGVDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJcmV0dXJuIHR5cGVEZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIEVsZW1lbnQgZGVjbGFyYXRpb25zIHdoaWNoIHR5cGUgaXMgRU1QVFkgb3IgQ0RBVEEgKG1heWJlIFBDREFUQSkKLQkgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFsd2F5cyByZXR1cm4gbnVsbC4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnQoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gKGRlZiAhPSBudWxsKSA/IGRlZi5nZXRDb250ZW50VHlwZSgpIDogQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uI2dldENvcnJlY3Rpb25UeXBlCi0JICovCi0JcHVibGljIGludCBnZXRDb3JyZWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGNvcnJlY3Rpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIEhUTUwgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGRhdGEgdHlwZS4gIFNvLCB0aGlzIG1ldGhvZCBhbHdheXMKLQkgKiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+Ljxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBleGNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgZXhjbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiA8YnI+Ci0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgZm9ybWF0IHR5cGUgaXMgPGNvZGU+Rk9STUFUX0hUTUw8L2NvZGU+Ljxicj4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEZvcm1hdFR5cGUoKSB7Ci0JCXJldHVybiBmb3JtYXRUeXBlOwotCX0KLQotCS8qKgotCSAqIEluY2x1c2lvbi4KLQkgKiBBbG1vc3QgZWxlbWVudHMgZG9uJ3QgaGF2ZSBhIGluY2x1c2lvbi4KLQkgKiBPbmx5IGNsYXNzZXMgdGhvc2UgaGF2ZSBpbmNsdXNpb24gc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIDxicj4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRMYXlvdXRUeXBlKCkgewotCQlyZXR1cm4gbGF5b3V0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBMaW5lIGJyZWFrIGhpbnQgaXMgc3Ryb25nbHkgcmVsYXRlZCB0byBsYXlvdXQgdHlwZS4KLQkgKiBJbmRlZWQsIGluIHRoZSBDKytET00sIGl0IGlzIGRldGVybWluZWQgZnJvbSBsYXlvdXQgdHlwZSBvbmx5LgotCSAqIFNvLCB0aGlzIGltcGxlbWVudGF0aW9uLCBhcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIGRlY2xhcmF0aW9ucywKLQkgKiBhbHNvIGRldGVybWluZXMgZnJvbSBsYXlvdXQgdHlwZSBvbmx5Ljxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZUJyZWFrSGludCgpIHsKLQkJc3dpdGNoIChnZXRMYXlvdXRUeXBlKCkpIHsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQkxPQ0sgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CUkVBSyA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQUZURVJfU1RBUlQ7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm8gSFRNTCBlbGVtZW50IGhhcyBsb2NhbCBlbGVtZW50cy4gIFNvLCB0aGlzIG1ldGhvZCBhbHdheXMKLQkgKiByZXR1cm5zIGFuIGVtcHR5IG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT047Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPbWl0VHlwZSgpIHsKLQkJcmV0dXJuIG9taXRUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlyZXR1cm4gRU1QVFlfTUFQOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotCQkJcmV0dXJuIChkZWYgIT0gbnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBwcC5zdXBwb3J0cyh0aGlzKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKGRlZiAhPSBudWxsKSA/IGRlZi5nZXRQcmltYXJ5Q2FuZGlkYXRlKCkgOiBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAocHAgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBwcC5nZXQodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZWxlbWVudCBuYW1lcyB3aGljaCB0ZXJtaW5hdGVzIHRoaXMgZWxlbWVudC48YnI+Ci0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0cnVlIHdoZW4gdGhlIGVsZW1lbnQgaXMgYSBKU1AgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0pTUCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluIHNvbWUgZWxlbWVudHMsIHN1Y2ggYXMgQVBQTEVULCBhIHNvdXJjZSBnZW5lcmF0b3Igc2hvdWxkIGluZGVudCBjaGlsZAotCSAqIGVsZW1lbnRzIHRoYXQgdGhlaXIgcGFyZW50cy4gIFRoYXQgaXMsIGEgc291cmNlIGdlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUKLQkgKiBzb3VyY2UgIG9mIEFQUExFVCBhbmQgUEFSQU1TIGxpa2UgdGhpczoKLQkgKiA8UFJFPgotCSAqICAgJmx0O0FQUExFVCAuLi4mZ3Q7Ci0JICogICAgICZsdDtQQVJBTSAuLi4gJmd0OwotCSAqICAgICAmbHQ7UEFSQU0gLi4uICZndDsKLQkgKiAgICZsdDsvQVBQTEVUJmd0OwotCSAqIDxQUkU+Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSB7Ci0JCXJldHVybiBpbmRlbnRDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBNb3N0IG9mIGVsZW1lbnRzIGNhbiBjb21wYWN0IHNwYWNlcyBpbiB0aGVpciBjaGlsZCB0ZXh0IG5vZGVzLgotCSAqIFNvbWUgc3BlY2lhbCBlbGVtZW50cyBzaG91bGQga2VlcCB0aGVtIGluIHRoZWlyIHNvdXJjZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRLZWVwU3BhY2VzKCkgewotCQlyZXR1cm4ga2VlcFNwYWNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRUZXJtaW5hdGVBdChIVE1MRWxlbWVudERlY2xhcmF0aW9uIG5leHRFbGVtZW50KSB7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRUZXJtaW5hdG9ycygpOwotCQlpZiAoaSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbmV4dE5hbWUgPSBuZXh0RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWlmIChuZXh0TmFtZS5lcXVhbHMoaS5uZXh0KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IVE1MRWxlbWVudERlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxFbGVtZW50RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllNjczNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxFbGVtZW50RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gYmUgYSBwdWJsaWMgaW50ZXJmYWNlIHdoaWNoIGhhcwotICogaW50ZXJmYWNlcyBkZWZpbmVkIGluIGJvdGggb2Yge0BsaW5rIDxjb2RlPkNNRWxlbWVudERlY2xhcmF0aW9uPC9jb2RlPn0KLSAqIGFuZCB7QGxpbmsgPGNvZGU+SFRNTENNTm9kZTwvY29kZT59Ljxicj4KLSAqIEluIGFkZGl0aW9uIHRvIHRoaXMsIHNvbWUgaW50ZXJmYWNlcyBhcmUgYWRkZWQgdG8gdGhpcyBpbnRlcmZhY2UsCi0gKiB0aG9zZSBhcmUgc3BlY2lhbGx5IHRvIEhUTUwgZWxlbWVudHMuPGJyPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZXh0ZW5kcyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0KLQkvKiogVGFnIG9tbWlzc2lvbjsgTm90IG9tbWlzaWJsZS4gKi8KLQlpbnQgT01JVF9OT05FID0gMDsKLQkvKiogVGFnIG9tbWlzc2lvbjsgQm90aCB0YWdzIGFyZSBvbW1pc2libGUuICovCi0JaW50IE9NSVRfQk9USCA9IDE7Ci0JLyoqIFRhZyBvbW1pc3Npb247IFRoZSBlbmQgdGFnIGlzIG9tbWlzaWJsZS4gKi8KLQlpbnQgT01JVF9FTkQgPSAyOwotCS8qKiBUYWcgb21taXNzaW9uOyBUaGUgZW5kIHRhZyBpcyBvbW1pdHRlZCB3aGVuIGNyZWF0ZWQuICovCi0JaW50IE9NSVRfRU5EX0RFRkFVTFQgPSAzOwotCS8qKiBUYWcgb21taXNzaW9uOyBUaGUgZW5kIHRhZyBtdXN0IGJlIG9taXR0ZWQuICovCi0JaW50IE9NSVRfRU5EX01VU1QgPSA0OwotCS8qKiBMaW5lIEJyZWFrOyBObyBicmVhay4gKi8KLQlpbnQgQlJFQUtfTk9ORSA9IDEwOwotCS8qKiBMaW5lIEJyZWFrOyBCcmVhayBhZnRlciB0aGUgc3RhcnQgdGFnLiAqLwotCWludCBCUkVBS19BRlRFUl9TVEFSVCA9IDExOwotCS8qKiBMaW5lIEJyZWFrOyBCcmVhayBib3RoIGJlZm9yZSB0aGUgc3RhcnQgdGFnbiBhbmQgYWZ0ZXIgdGhlIGVuZCB0YWcuICovCi0JaW50IEJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EID0gMTI7Ci0JLyogTGF5b3V0ICovCi0JLyoqIGluaXRpYWwgdmFsdWU7IHRoZSB2YWx1ZSBzaG91bGQgbmV2ZXIgcmV0dXJucyB0byBjbGllbnQgcHJvZ3JhbXMuICovCi0JaW50IExBWU9VVF9OT05FID0gMTAwOwotCWludCBMQVlPVVRfQkxPQ0sgPSAxMDE7Ci0JaW50IExBWU9VVF9XUkFQID0gMTAyOwotCS8qKiBObyB3cmFwIG9iamVjdDsgbGlrZSBJTUcsIEFQUExFVCwuLi4gKi8KLQlpbnQgTEFZT1VUX09CSkVDVCA9IDEwMzsKLQkvKiogQlIgKi8KLQlpbnQgTEFZT1VUX0JSRUFLID0gMTA0OwotCS8qKiBIaWRkZW4gb2JqZWN0OyBsaWtlIEhUTUwgb3IgSEVBRCAqLwotCWludCBMQVlPVVRfSElEREVOID0gMTA1OwotCS8qIENvcnJlY3Rpb24gKi8KLQkvKiogQ29ycmVjdDsgTm8gY29ycmVjdC4gKi8KLQlpbnQgQ09SUkVDVF9OT05FID0gMTAwMDsKLQkvKiogQ29ycmVjdDsgTWVhbmluZ2xlc3Mgd2hlbiB0aGUgY29udGVudCBpcyBlbXB0eS4gKi8KLQlpbnQgQ09SUkVDVF9FTVBUWSA9IDEwMDE7Ci0JLyoqIENvcnJlY3Q7IE1lYW5pbmdsZXNzIHdoZW4gbm8gYXR0cmlidXQgaXMgc2V0LiAqLwotCWludCBDT1JSRUNUX05FVVRSQUwgPSAxMDAyOwotCS8qKiBDb3JyZWN0OyBNZWFuaW5nbGVzcyB3aGVuIHNhbWUgZWxlbWVudCBpcyBuZXN0ZWQuICovCi0JaW50IENPUlJFQ1RfRFVQTElDQVRFRCA9IDEwMDM7Ci0JLyoqIEZvcm1hdDsgSFRNTCAqLwotCWludCBGT1JNQVRfSFRNTCA9IDEwMDAwOwotCS8qKiBGb3JtYXQ7IFNTSSAqLwotCWludCBGT1JNQVRfU1NJID0gMTAwMDE7Ci0JLyoqIEZvcm1hdDsgSlNQIHNjcmlwdCAqLwotCWludCBGT1JNQVRfSlNQX1NDUklQVCA9IDEwMDAyOwotCS8qKiBGb3JtYXQ7IEpTUCBkaXJlY3RpdmUgKi8KLQlpbnQgRk9STUFUX0pTUF9ESVJFQ1RJVkUgPSAxMDAwMzsKLQkvKiogRm9ybWF0OyBYTUwgKi8KLQlpbnQgRk9STUFUX1hNTCA9IDEwMDA0OwotCS8qKiBGb3JtYXQ7IE1XICovCi0JaW50IEZPUk1BVF9NVyA9IDEwMDA1OwotCi0JLyoqCi0JICogQSBzaG9ydCBoYW5kIG1ldGhvZCB0byBnZXQgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uIG9mIGEgSFRNTCBlbGVtZW50LgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uCi0JICogQHBhcmFtIGF0dHJOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oU3RyaW5nIGF0dHJOYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjN2ZkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUxDTVByb3BlcnRpZXM7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgSFRNTEVudGl0eURlY2xJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogQ01FbnRpdHlEZWNsSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBlbnRpdHlOYW1lIGphdmEubGFuZy5TdHJpbmc7IEVudGl0eSBuYW1lLgotCSAqIEBwYXJhbSBlbnRpdHlWYWx1ZSBqYXZhLmxhbmcuU3RyaW5nOyBWYWx1ZSBzdHJpbmcuCi0JICovCi0JcHVibGljIEhUTUxFbnRpdHlEZWNsSW1wbChTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIGVudGl0eVZhbHVlKSB7Ci0JCXN1cGVyKGVudGl0eU5hbWUpOwotCQl2YWx1ZSA9IGVudGl0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQ01Ob2RlIHR5cGUuPGJyPgotCSAqIEByZXR1cm4gaW50OyBBbHdheXMgcmV0dXJuIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkVOVElUWV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRW50aXRpZXMgaW4gSFRNTCBkb2N1bWVudHMgYXJlIGFsd2F5cyB0cmVhdGVkIHdpdGggaWdub3JpbmcgY2FzZXMuCi0JICogQmVjYXVzZSBubyBzcGVjaWFsIGVudGl0aWVzIGFyZSBkZWZpbmVkIGluIEpTUCAxLjAsIHRoaXMgbWV0aG9kCi0JICogY2FuIGFsd2F5cyByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiMTAxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gYmUgYSBwdWJsaWMgaW50ZXJmYWNlIHdoaWNoIGhhcwotICogaW50ZXJmYWNlcyBkZWZpbmVkIGluIGJvdGggb2Yge0BsaW5rIDxjb2RlPkNNRW50aXR5RGVjbGFyYXRpb248L2NvZGU+fQotICogYW5kIHtAbGluayA8Y29kZT5IVE1MQ01Ob2RlPC9jb2RlPn0uPGJyPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb24gewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IVE1MUHJvcGVydHlEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IVE1MUHJvcGVydHlEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmYwN2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSFRNTFByb3BlcnR5RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGNvbW1vbmx5IHVzZWQgaW4gZGVjbGFyYXRpb24gaW1wbGVtZW50YXRpb24sIGFuZCBpbnRlcm5hbCB1c2UuCi0gKiBVc2UgZ2V0UHJvcGVydHkoKSBtZXRob2QgZm9yIHB1YmxpYyB1c2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gewotCS8qKgotCSAqIFRvIGRldGVybWluIHRoZSB0eXBlLCBsb29rIHVwIHRoZSBmb2xsb3dpbmcga2V5d29yZHMgaW4gQysrRE9NL0RURFBhcnNlci5jcHA6Ci0JICogPHVsPgotCSAqICAgPGxpPkNPUlJFQ1RfRFVQTElDQVRFRCAtIDxjb2RlPkdST1VQX05PRFVQPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+Q09SUkVDVF9FTVBUWSAtIDxjb2RlPkdST1VQX0NPTVBBQ1Q8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5DT1JSRUNUX05FVVRSQUwgLSA8Y29kZT5HUk9VUF9ORVVUUkFMPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+Q09SUkVDVF9OT05FIC0gPGNvZGU+KE4vQSk8L2NvZGU+PC9saT4KLQkgKiA8L3VsPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldENvcnJlY3Rpb25UeXBlKCk7Ci0JLyoqCi0JICogR2V0IHRoZSBsaXN0IG9mIGRlY2xhcmF0aW9ucyB0aG9zZSBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgY29udGVudC48YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCk7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW4gdGhlIHR5cGUsIHNlZSB0aGUgZm9sbG93aW5nIGZpbGVzIGluIHRoZSBDKytET006Ci0JICogICBFbGVtZW50VHlwZS5jcHAgLSBFbGVtZW50VHlwZSNzZXRHcm91cCgpLgotCSAqICAgRWxlbWVudC5jcHAgLSBFbGVtZW50I2dldFN0YXJ0VGFnKCkuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0Rm9ybWF0VHlwZSgpOwotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBkZWNsYXJhdGlvbnMgdGhvc2Ugc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JQ01Db250ZW50IGdldEluY2x1c2lvbigpOwotCS8qKgotCSAqIFRvIGRldGVybWluIHRoZSB0eXBlLCBsb29rIHVwIHRoZSBmb2xsb3dpbmcga2V5d29yZHMgaW4gQysrRE9NL0RURFBhcnNlci5jcHA6Ci0JICogPHVsPgotCSAqICAgPGxpPkxBWU9VVF9CTE9DSyAtIDxjb2RlPkdST1VQX0JMT0NLPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+TEFZT1VUX0JSRUFLIC0gPGNvZGU+R1JPVVBfQlJFQUs8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfSElEREVOIC0gPGNvZGU+R1JPVVBfSElEREVOPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+TEFZT1VUX05PTkUgLSA8Y29kZT4oTi9BKTwvY29kZT48L2xpPgotCSAqICAgPGxpPkxBWU9VVF9PQkpFQ1QgLSA8Y29kZT5HUk9VUF9OT1dSQVA8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfV1JBUCAtIDxjb2RlPihOL0EpPC9jb2RlPjwvbGk+Ci0JICogPC91bD4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMYXlvdXRUeXBlKCk7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW5lIHRoZSB0eXBlLCBzZWUgPGNvZGU+RWxlbWVudDo6aXNCcmVha2luZ0JlZm9yZUVsZW1lbnQoKTwvY29kZT4KLQkgKiBhbmQgPGNvZGU+RWxlbWVudDo6aXNCcmVha2luZ0FmdGVyRWxlbWVudCgpPC9jb2RlPiBkZWZpbmVkIGluIEMrK0RPTS9FbGVtZW50LmNwcC48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGluZUJyZWFrSGludCgpOwotCS8qKgotCSAqIFRvIGRldGVybWluZSB0aGUgdHlwZSwgQ2hlY2sgdGhlIEhUTUwgRFRELgotCSAqIEFuZCBsb29rIHVwIDxjb2RlPkdST1VQX05PRU5EPC9jb2RlPiBpbiBDKytET00vRFREUGFyc2VyLmNwcC48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0T21pdFR5cGUoKTsKLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwCi0JICovCi0JQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpOwotCS8qKgotCSAqIHJldHVybiB0cnVlIHdoZW4gdGhlIGVsZW1lbnQgaXMgYSBKU1AgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIGlzSlNQKCk7Ci0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpOwotCS8qKgotCSAqIFNvbWUgZWxlbWVudHMgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBjaGlsZCB0ZXh0IG5vZGVzLgotCSAqIEZvciBleGFtcGxlLCBQUkUgYW5kIFRFWFRBUkVBLiAgVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLAotCSAqIGlmIGEgdGFyZ2V0IGVsZW1lbnQgaXMgb25lIG9mIHN1Y2ggZWxlbWVudHMuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBzaG91bGRLZWVwU3BhY2VzKCk7Ci0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiwgaWYgPGNvZGU+bmV4dEVsZW1lbnQ8L2NvZGU+IHRlcm1pbmF0ZXMKLQkgKiB0aGUgY3VycmVudCBlbGVtZW50LgotCSAqIFNvbWUgZWxlbWVudHMgbGlrZSA8Y29kZT5QPC9jb2RlPiB0ZXJtaW5hdGVzIG90aGVyIDxjb2RlPlA8L2NvZGU+LgotCSAqIFRoYXQgaXMsIHdoZW4gPGNvZGU+Jmx0O1AmZ3Q7PC9jb2RlPiBhcHBlYXJzIGF0IHRoZSBuZXh0IHRvIDxjb2RlPlA8L2NvZGU+LAotCSAqIHdoaWNoIGVuZCB0YWdzIGlzIG9taXR0ZWQsIGl0IHJlcHJlc2VudHMgbm90IG9ubHkgdGhlIGJlZ2lubmluZyBvZiB0aGUKLQkgKiBuZXcgPGNvZGU+UDwvY29kZT4gZWxlbWVudCBidXQgYWxzbyB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyA8Y29kZT5QPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogU2VlIHRoZSBDKytET00vSFRNTFBhcnNlciNfdGVybWluYXRlKEVsZW1lbnQqKSBtZXRob2QuCi0JICogQHBhcmFtIG5leHRFbGVtZW50IGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gbmV4dEVsZW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRjYjc4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaHJlZmxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCSAqIChyZWwgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JICogKHJldiAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChkaXJlY3RrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKHNoYXBlICVTaGFwZTsgcmVjdCkKLQkgKiAoY29vcmRzICVDb29yZHM7ICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSEFSU0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUZMQU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBUkdFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRUwsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUkVWLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VTU0tFWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVJFQ1RLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0hBUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09PUkRTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBQklOREVYLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09ORk9DVVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05CTFVSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPkE8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPkE8L2NvZGU+IGl0c2VsZi4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBhID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKTsKLQkJaWYgKGEgIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChhKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRBRERSRVNTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEFERFJFU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiNzIxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEFERFJFU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogQUREUkVTUy4KLSAqLwotZmluYWwgY2xhc3MgSGVkQUREUkVTUyBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEFERFJFU1MoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTUywgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQUREUkVTUzsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQVBQTEVULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEFQUExFVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGM0MjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQVBQTEVULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEFQUExFVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQVBQTEVUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQVBQTEVUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFQUExFVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUEFSQU1fQ09OVEFJTkVSOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGNvZGViYXNlICVVUkk7ICNJTVBMSUVEKQotCSAqIChhcmNoaXZlIENEQVRBICNJTVBMSUVEKQotCSAqIChjb2RlIENEQVRBICNJTVBMSUVEKQotCSAqIChvYmplY3QgQ0RBVEEgI0lNUExJRUQpCi0JICogKGFsdCAlVGV4dDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjUkVRVUlSRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjUkVRVUlSRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKQotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWF5c2NyaXB0IChtYXlzY3JpcHQpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09ERUJBU0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVJDSElWRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0RFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09CSkVDVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVlTQ1JJUFR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAlYWxpZ247IC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEFSRUEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQVJFQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDE0YjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQVJFQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBBUkVBLgotICovCi1maW5hbCBjbGFzcyBIZWRBUkVBIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEFSRUEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVJFQSwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9ISURERU4uCi0JCS8vIEJlY2F1c2UsIEFSRUEgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogQVJFQS4KLQkgKiAlYXR0cnM7Ci0JICogKHNoYXBlICVTaGFwZTsgcmVjdCkKLQkgKiAoY29vcmRzICVDb29yZHM7ICNJTVBMSUVEKQotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAobm9ocmVmIChub2hyZWYpICNJTVBMSUVEKQotCSAqIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSEFQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT09SRFMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTk9IUkVGLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVJ9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRCQVNFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJBU0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzODhjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJBU0UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogQkFTRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkFTRSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCQVNFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfSElEREVOLgotCQkvLyBCZWNhdXNlLCBCQVNFIGlzIEdST1VQX0hJRERFTiBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIEJBU0UuCi0JICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBUkdFVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJBU0VGT05ULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJBU0VGT05ULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTUzNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRCQVNFRk9OVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIEJBU0VGT05ULgotICovCi1maW5hbCBjbGFzcyBIZWRCQVNFRk9OVCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCQVNFRk9OVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFRk9OVCwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9PQkpFQ1QgLSBHUk9VUF9OT1dSQVAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIEJBU0VGT05ULgotCSAqIChpZCBJRCAjSU1QTElFRCkKLQkgKiAoc2l6ZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgbG9jYWx5IGRlZmluZWQuCi0JICogKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JICogKGZhY2UgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZBQ0V9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAoc2l6ZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgbG9jYWx5IGRlZmluZWQuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJETy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRCRE8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkZTMzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJETy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIEJETy4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkRPIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCRE8oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkRPLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JICogKGRpciAobHRyfHJ0bCkgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBTkd9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAgKGRpciAobHRyfHJ0bCkgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTFRSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SVEx9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVIsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJHU09VTkQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQkdTT1VORC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWE5MzlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQkdTT1VORC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLWZpbmFsIGNsYXNzIEhlZEJHU09VTkQgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQlwdWJsaWMgSGVkQkdTT1VORChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CR1NPVU5ELCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogKHNyYywgQ0RBVEEsICNJTVBMSUVEKQotCSAqIChsb29wLCBDREFUQSwgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQkvLyBzcmMKLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQkJLy8gbG9vcAotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0lORklOSVRFKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9PUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT09QLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRCTE9DS1FVT1RFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJMT0NLUVVPVEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwZmVkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJMT0NLUVVPVEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIEJMT0NLUVVPVEUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJMT0NLUVVPVEUgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCTE9DS1FVT1RFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaXRlICVVUkk7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NJVEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQk9EWS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRCT0RZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDViOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRCT0RZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogQk9EWS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQk9EWSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCT0RZKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJWJvZHljb2xvcnM7Ci0JICogKG9ubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob251bmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChtYXJnaW5oZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpIC4uIEQyMDU1MTQKLQkgKiAodG9wbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uLiBEMjA1NTE0Ci0JICogKGJvdHRvbW1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChsZWZ0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uIEQyMDU1MTQKLQkgKiAocmlnaHRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVib2R5Y29sb3JzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEJvZHljb2xvcnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05VTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkFDS0dST1VORCwKLQkJLy8gPDxEMjA1NTE0Ci0JCQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RPUE1BUkdJTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1RUT01NQVJHSU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEVGVE1BUkdJTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SSUdIVE1BUkdJTgotCQkvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEluY2x1c2lvbi4KLQkgKiAiTGF6eSBldmFsLiI8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJaWYgKGluY2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGluY2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIChJTlN8REVMKQotCQlpbmNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5TLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVMfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGluY2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBpbmNsdXNpb247Ci0JfQotCi0JLyoqCi0JICogQk9EWSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YWRjYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRCUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBCUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQlIgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQlIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlIsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQlJFQUsuCi0JCS8vIEJlY2F1c2UsIEJSIGlzIEdST1VQX0JSRUFLIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CUkVBSzsKLQl9Ci0KLQkvKioKLQkgKiBCUi4KLQkgKiAlY29yZWF0dHJzOwotCSAqIChjbGVhciAobGVmdCB8IGFsbCB8IHJpZ2h0IHwgbm9uZSkgbm9uZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gY2xlYXIKLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVIpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEVBUiwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQlVUVE9OLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEJVVFRPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzYwMDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQlVUVE9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIEJVVFRPTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQlVUVE9OIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQlVUVE9OKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodHlwZSAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0KSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09ORk9DVVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05CTFVSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHR5cGUgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0JVVFRPTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU1VCTUlULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SRVNFVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+Rk9STTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+Rk9STTwvY29kZT4gaXRzZWxmLgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsCi0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSVNJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZJRUxEU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSUZSQU1FfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldEZvcm1jdHJsKGV4Y2x1c2lvbik7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRDQVBUSU9OLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZENBUFRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhYjMxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZENBUFRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogQ0FQVElPTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ0FQVElPTiBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQ0FQVElPTihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DQVBUSU9OLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGFsaWduICVDQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yQ2FwdGlvbigpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQ0VOVEVSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZENFTlRFUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWUwZmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQ0VOVEVSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIENFTlRFUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ0VOVEVSIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQ0VOVEVSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRDT0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQ09MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhM2YxYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRDT0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogQ09MLgotICovCi1maW5hbCBjbGFzcyBIZWRDT0wgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQ09MKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTCwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9CTE9DSy4KLQkJLy8gQmVjYXVzZSwgQ09MIGlzIEdST1VQX0JMT0NLIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiBDT0wuCi0JICogJWF0dHJzOwotCSAqIChzcGFuIE5VTUJFUiAxKQotCSAqICh3aWR0aCAlTXVsdGlMZW5ndGg7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAlY2VsbGhhbGlnbjsKLQkgKiAlY2VsbHZhbGlnbjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoc3BhbiBOVU1CRVIgMSkKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUEFOfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHdpZHRoICVNdWx0aUxlbmd0aDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk1VTFRJX0xFTkdUSCk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0KLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRDT0xHUk9VUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRDT0xHUk9VUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzUyOGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkQ09MR1JPVVAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIENPTEdST1VQLgotICovCi1maW5hbCBjbGFzcyBIZWRDT0xHUk9VUCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTEdST1VQLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0FQVElPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFksIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSfTsKLQotCS8qKgotCSAqIEBwYXJhbSBvd25lckRvY3VtZW50IGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhDTURvY0ltcGwKLQkgKi8KLQlwdWJsaWMgSGVkQ09MR1JPVVAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MR1JPVVAsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NPTFVNTl9HUk9VUDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoc3BhbiBOVU1CRVIgMSkKLQkgKiAod2lkdGggJU11bHRpTGVuZ3RoOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUEFOfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHdpZHRoICVNdWx0aUxlbmd0aDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk1VTFRJX0xFTkdUSCk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogTEkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRERC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRERC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI0ZjZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkREQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIERELgotICovCi1maW5hbCBjbGFzcyBIZWRERCBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEREKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRELCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEREIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRElWLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZERJVi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmFhZjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRElWLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIERJVi4KLSAqLwotZmluYWwgY2xhc3MgSGVkRElWIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRElWKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVhbGlnbjsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVhbGlnbjsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JCS8vICVyZXNlcnZlZDsgLi4uIGVtcHR5Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZERMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZERMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMmFiYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogREwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERMIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREwsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0RFRklOSVRJT05fTElTVDsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWFycmF5czsKLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWREVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWREVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzdiZDQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIERULgotICovCi1maW5hbCBjbGFzcyBIZWREVCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRFQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogRFQgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRFTUJFRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRFTUJFRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjk0NDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRU1CRUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBFTUJFRC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRU1CRUQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRFTUJFRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5FTUJFRCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1CRUQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWNvcmVhdHRyczsKLQkgKiAlZXZlbnRzOwotCSAqIChzcmMgJVVSSTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobG9vcCBDREFUQSAjSU1QTElFRCkKLQkgKiAoaGlkZGVuIENEQVRBICNJTVBMSUVEKQotCSAqICh2b2x1bWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGF1dG9zdGFydCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JICogKGF1dG9wbGF5ICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkgKiAoYXV0b3NpemUgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCSAqIChjb250cm9sbGVyICh0cnVlfGZhbHNlKSB0cnVlKQotCSAqIChzY2FsZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2hvd2NvbnRyb2xzICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkgKiAocGxheWNvdW50IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAocmVwZWF0IENEQVRBICNJTVBMSUVEKQotCSAqIChwYW5lbCBDREFUQSAjSU1QTElFRCkKLQkgKiAodGV4dCBDREFUQSAjSU1QTElFRCkKLQkgKiAocGFsZXR0ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodGV4dGZvY3VzIENEQVRBICNJTVBMSUVEKQotCSAqICh0eXBlIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gJWV2ZW50czsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRFdmVudHMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT09QLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hJRERFTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WT0xVTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVVUT1NUQVJULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FVVE9QTEFZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FVVE9TSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRST0xMRVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NBTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0hPV0NPTlRST0xTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1BMQVlDT1VOVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRVBFQVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUEFORUwsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEVYVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QQUxFVFRFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RFWFRGT0NVU307Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vIChzcmMgJVVSSTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQotCQkvLyAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyAodHlwZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEVtcHR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEVtcHR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZjNkY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRFbXB0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgRU1QVFkgdHlwZSBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkRW1wdHkgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRFbXB0eShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZOwotCQkvLyBFTVBUWSB0eXBlIGhhcyBubyBlbmQgdGFnLgotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX01VU1Q7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogRU1QVFkgdHlwZSBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgdHlwZS48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGSUVMRFNFVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGSUVMRFNFVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQyOGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRklFTERTRVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogRklFTERTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZJRUxEU0VUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRklFTERTRVQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZJRUxEU0VUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRk9OVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGT05ULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZWMxYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGT05ULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogRk9OVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRk9OVCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRk9OVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT05ULCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogJWkxOG47Ci0JICogKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqIChmYWNlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRkFDRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRk9STS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGT1JNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjNiMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGT1JNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogRk9STS4KLSAqLwotZmluYWwgY2xhc3MgSGVkRk9STSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZPUk0oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhY3Rpb24gJVVSSTsgI1JFUVVJUkVEKQotCSAqIChtZXRob2QgKEdFVHxQT1NUKSBHRVQpCi0JICogKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkgKiAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChvbnN1Ym1pdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25yZXNldCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ1RJT04sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUVUSE9ELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0VOQ1RZUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVBULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05TVUJNSVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05SRVNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVBUX0NIQVJTRVR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+Rk9STTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+Rk9STTwvY29kZT4gaXRzZWxmLgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsCi0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGZvcm0gPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0pOwotCQlpZiAoZm9ybSAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGZvcm0pOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGUkFNRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGUkFNRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjdkMzczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRlJBTUUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogRlJBTUUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZSQU1FIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZSQU1FKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0hJRERFTi4KLQkJLy8gQmVjYXVzZSwgRlJBTUUgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogRlJBTUUuCi0JICogJWNvcmVhdHRyczsKLQkgKiAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAoZnJhbWVib3JkZXIgKDF8MCkgMSkKLQkgKiAobWFyZ2lud2lkdGggJVBpeGVsczsgI0lNUExJRUQpCi0JICogKG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobm9yZXNpemUgKG5vcmVzaXplKSAjSU1QTElFRCkKLQkgKiAoc2Nyb2xsaW5nICh5ZXN8bm98YXV0bykgYXV0bykKLQkgKiAoYm9yZGVyY29sb3IgJUNvbG9yICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9OR0RFU0MsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVCT1JERVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PUkVTSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDUk9MTElORywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiAvLyBEMjA1NTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRlJBTUVTRVQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRlJBTUVTRVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhYjcxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEZSQU1FU0VULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogRlJBTUVTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZSQU1FU0VUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRlJBTUVTRVQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZSQU1FU0VUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKHJvd3MgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb2xzICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAob25sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnVubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoZnJhbWVib3JkZXIgKHllc3xubykgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAoZnJhbWVzcGFjaW5nIENEQVRBICNJTVBMSUVEKSAuLi4gRDIxNTY4NAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05VTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SLCAvLyBEMjA1NTE0Ci0JCQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVTUEFDSU5HIC8vIEQyMTU2ODQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJLy8gKHJvd3MgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTVVMVElfTEVOR1RIKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIGF0dHIpOwotCi0JCS8vIChjb2xzICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFMsIGF0dHIpOwotCi0JCS8vIChmcmFtZWJvcmRlciAoeWVzfG5vKSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfWUVTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9OT307Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVCT1JERVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGbG93Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjRkZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGbG93Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWZsb3c7KSogY29udGFpbmVycy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkRmxvd0NvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZsb3dDb250YWluZXIoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GTE9XX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGb250U3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkRm9udFN0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDY3MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRGb250U3R5bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogJWZvbnRzdHlsZTsKLSAqLwotZmluYWwgY2xhc3MgSGVkRm9udFN0eWxlIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGb250U3R5bGUoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJJRykgfHwgZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU01BTEwpKSB7Ci0JCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCX0KLQkJZWxzZSB7IC8vIEIsIEksIFUsIC4uLgotCQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0RVUExJQ0FURUQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5IVE1MRWxlbURlY2xJbXBsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCVN0cmluZyBteU5hbWUgPSBnZXRFbGVtZW50TmFtZSgpOwotCQlpZiAoIW15TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CSUcpICYmICFteU5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU01BTEwpKQotCQkJcmV0dXJuIEVNUFRZX01BUDsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRIRUFELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEhFQUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0YTM2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEhFQUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEhUTUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhFQUQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSEVBRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IRUFEOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkhFQUQ8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4laTE4bjs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD5wcm9maWxlPC90ZD48dGQ+VVJJPC90ZD48dGQ+I0lNUExJRUQ8L3RkPjx0ZD5OL0E8L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQkJLy8gcHJvZmlsZQotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9GSUxFKTsKLQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJPRklMRSwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICogSEVBRCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEhSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEhSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OGExZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRIUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIEhSLgotICovCi1maW5hbCBjbGFzcyBIZWRIUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzCi0JICogKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkgKiAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9MRUZULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DRU5URVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PU0hBREUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xPUiAvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwZGZiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZEhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEhUTUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhUTUwgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIVE1MKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hUTUw7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SFRNTDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPjxjb2RlPiVpMThuOzwvY29kZT48L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgICA8dGQ+e0BsaW5rIFBEQ01Eb2NJbXBsI2dldEF0dHJEZWNsYXJhdGlvbnNJMThufTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+dmVyc2lvbjwvdGQ+PHRkPkNEQVRBPC90ZD48dGQ+I0ZJWEVEPC90ZD4KLQkgKiAgICAgPHRkPntAbGluayBIVE1MX1ZFUlNJT05fVFJBTlNJVElPTkFMfTwvdGQ+PHRkPmRlcGxlY2F0ZWQgaW4gSFRNTDQuMDE8L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+PGJyPgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQWJzdHJhY3RIVE1MRWxlbURlY2xJbXBsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCQkvLyB2ZXJzaW9uCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04pOwotCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WRVJTSU9OLCBhZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkSGVhZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRIZWFkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTcyZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRIZWFkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIEhbMS02XS4KLSAqLwotZmluYWwgY2xhc3MgSGVkSGVhZGluZyBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSGVhZGluZyhTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkgxPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWF0dHJzOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhbGlnbjs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqIDxwPjxiPiVhbGlnbjs8L2I+IG1lYW5zIDxjb2RlPmFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAjSU1QTElFRDwvY29kZT4uCi0JICogVW5mb3J0dW5hdGVseSwgdGhpcyA8Y29kZT5hbGlnbjwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gb25lIGluCi0JICogPGNvZGU+SU1HPC9jb2RlPiBvciA8Y29kZT5UQUJMRTwvY29kZT4uICBTbywgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCSAqIG9mIDxjb2RlPmFsaWduPC9jb2RlPiBzaG91bGQgYmUgbG9jYWx5IGNyZWF0ZWQgYW5kIGl0IHNob3VsZG4ndCBiZSByZWdpc3RlcmVkCi0JICogaW4gYSA8Y29kZT5IQ01Eb2NJbXBsPC9jb2RlPiBpbnN0YW5jZS48L3A+Ci0JICogPHA+SG93ZXZlciwgJWFsaWduIGlzIHVzZWQgaW4gc2V2YXJhbCB0aW1lcy4gIEkgd291bGRuJ3Qgd3JpdGUgc2FtZSBjb2RlCi0JICogaW4gbWFueSB0aW1lcy4gIFNvLCBJIGFkZCBhIG5ldyB1dGlsaXR5IG1ldGhvZCBpbnRvIDxjb2RlPkNNVXRpbDwvY29kZT4KLQkgKiB0byBjcmVhdGUgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi48L3A+Ci0JICogPGJyPgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTEVsZW1EZWNsSW1wbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkSUZSQU1FLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZElGUkFNRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmM1OTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkSUZSQU1FLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBJRlJBTUUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElGUkFNRSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElGUkFNRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JRlJBTUUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqIChsb25nZGVzYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCSAqIChmcmFtZWJvcmRlciAoMXwwKSAxKQotCSAqIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChzY3JvbGxpbmcgKHllc3xub3xhdXRvKSBhdXRvKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT05HREVTQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVJHSU5XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVJHSU5IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NST0xMSU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkSU1HLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZElNRy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjI0NGJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkSU1HLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogSU1HLgotICovCi1maW5hbCBjbGFzcyBIZWRJTUcgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSU1HKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRywgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIElNRy4KLQkgKiAlYXR0cnM7Ci0JICogKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkgKiAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChtYXBmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQWJzdHJhY3RIVE1MRWxlbURlY2xJbXBsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPTkdERVNDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1VTRU1BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU01BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVBGSUxFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gYWxpZ24gKGxvY2FsKTsgc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRJTlBVVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRJTlBVVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWRjM2QxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkSU5QVVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogSU5QVVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElOUFVUIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElOUFVUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOUFVULCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU5QVVQuCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JICogKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqIDw8RDIxNTY4NAotCSAqICh3aWR0aCBDREFUQTsgI0lNUExJRUQpCi0JICogKGhlaWdodCBDREFUQTsgI0lNUExJRUQpCi0JICogKGJvcmRlciBDREFUQTsgI0lNUExJRUQpCi0JICogRDIxNTY4NAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkvLyBOT1RFOiAlSW5wdXRUeXBlIGlzIEVOVU07Ci0JCS8vICh0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotCQkvLyAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BBU1NXT1JELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DSEVDS0JPWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkFESU8sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NVQk1JVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkVTRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0ZJTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0hJRERFTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSU1BR0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0JVVFRPTn07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9URVhUKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCS8vIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR0cik7Ci0KLQkJLy8gKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBhdHRyKTsKLQotCQkvLyAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hFQ0tFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRUFET05MWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BWExFTkdUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1VTRU1BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU01BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05TRUxFQ1QsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DSEFOR0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVBULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTVFlMRSwKLQkJLy88PEQyMTU2ODQKLQkJCQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSCi0JCS8vPEQyMTU2ODQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkSVNJTkRFWC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRJU0lOREVYLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmODRkNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRJU0lOREVYLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIElTSU5ERVguCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElTSU5ERVggZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSVNJTkRFWChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JU0lOREVYLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiBJU0lOREVYLgotCSAqICVjb3JlYXR0cnM7Ci0JICogJWkxOG47Ci0JICogKHByb21wdCAlVGV4dDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0KLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJPTVBUKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJPTVBULCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjk3YTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWlubGluZTspKiBjb250YWluZXJzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqIEhlZElubGluZUNvbnRhaW5lci4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEhlZElubGluZUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTEFCRUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTEFCRUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1MTU2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZExBQkVMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIExBQkVMLgotICovCi1maW5hbCBjbGFzcyBIZWRMQUJFTCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTEFCRUwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEFCRUwsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoZm9yIElEUkVGICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKGZvciBJRFJFRiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRFJFRik7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9SLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VTU0tFWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5MQUJFTDwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+TEFCRUw8L2NvZGU+IGl0c2VsZi4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBsYWJlbCA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEFCRUwpOwotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChsYWJlbCk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MQUJFTH07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZExFR0VORC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRMRUdFTkQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4ZjczMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZExFR0VORC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBMRUdFTkQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZExFR0VORCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTEVHRU5EKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxFR0VORCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUxBbGlnbjsgI0lNUExJRUQpIC4uLiBzaHVsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yTGVnZW5kKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRMSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRMSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJhZjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogTEkuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZExJIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEl9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExJKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAodHlwZSAlTElTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh2YWx1ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vICh0eXBlICVMSVN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTElfU1RZTEUpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQotCQkvLyAodmFsdWUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogTEkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRMSU5LLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZExJTksuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ4OWI3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZExJTksuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogTElOSy4KLSAqLwotZmluYWwgY2xhc3MgSGVkTElOSyBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMSU5LKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkssIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBMSU5LLgotCSAqICVhdHRyczsKLQkgKiAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JICogKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChyZWwgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JICogKHJldiAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkgKiAobWVkaWEgJU1lZGlhRGVzYzsgI0lNUExJRUQpCi0JICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hBUlNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUZMQU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFTCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRVYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUVESUEsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFSR0VUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzViYjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGxpc3QgaXRlbSBjb250YWluZXIgZGVjbGFyYXRpb25zLgotICogLSBPTCwgVUwsIE1FTlUsIERJUi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkTGlzdEl0ZW1Db250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMaXN0SXRlbUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTUFQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE1BUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTY3ZjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTUFQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBNQVAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1BUCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1BUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NQVAsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX01BUDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKG5hbWUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChuYW1lIENEQVRBICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTUFSUVVFRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRNQVJRVUVFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YWIwMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRNQVJRVUVFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogTUFSUVVFRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUFSUVVFRSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1BUlFVRUUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUFSUVVFRSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoYmVoYXZpb3IgKHNjcm9sbHxzbGlkZXxhbHRlcm5hdGUpIHNjcm9sbCkKLQkgKiAoYmdjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqIChkaXJlY3Rpb24gKGxlZnR8cmlnaHR8dXB8ZG93bikgbGVmdCkKLQkgKiAoaGVpZ2h0IENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaHNwYWNlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGxvb3AgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNjcm9sbGFtb3VudCBOVU1CRVIgI0lNUExJRUQpCi0JICogKHNjcm9sbGRlbGF5IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAodnNwYWNlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHdpZHRoIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAodHJ1ZXNwZWVkICh0cnVlc3BlZWQpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkVIQVZJT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkdDT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVJFQ1RJT04sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9PUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ1JPTExBTU9VTlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NST0xMREVMQVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFJVRVNQRUVEfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJLy8gKGhlaWdodCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBhdHRyKTsKLQotCQkvLyAod2lkdGggQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHRyKTsKLQotCQkvLyAoaHNwYWNlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgYXR0cik7Ci0KLQkJLy8gKHZzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0UsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE1FTlUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTUVOVS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWYwNDU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTUVOVS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogTUVOVS9ESVIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1FTlUgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUVOVShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIE1FTlUvRElSLgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTVBBQ1R9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+TUVOVS9ESVI8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVibG9jazs8L2NvZGU+LgotCSAqICVibG9jazsgaXM6Ci0JICogUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotCSAqIE5PU0NSSVBUIHwgTk9GUkFNRVMgfCBCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVggfCBIUiB8Ci0JICogVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MuCi0JICogJWhlYWRpbmc7IGlzOiBIMSB8IEgyIHwgSDMgfCBINCB8IEg1IHwgSDYuCi0JICogJWxpc3Q7IGlzIDogVUwgfCBPTCB8IERJUiB8IE1FTlUuCi0JICogJXByZWZvcm1hdHRlZDsgaXMgUFJFLgotCSAqIDxicj4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vICVibG9jazsKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlAsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDMsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1LCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDYsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FUywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSVNJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUVMRFNFVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1N9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTUVUQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRNRVRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZjA5YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRNRVRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIE1FVEEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1FVEEgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUVUQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogTUVUQS4KLQkgKiAlaTE4bjsKLQkgKiAoaHR0cC1lcXVpdiBOQU1FICNJTVBMSUVEKQotCSAqIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb250ZW50IENEQVRBICNSRVFVSVJFRCkKLQkgKiAoc2NoZW1lIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQkvLyAobmFtZSBOQU1FICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5OQU1FKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IVFRQX0VRVUlWLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRFTlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NIRU1FfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTWFya0NoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTWFya0NoYW5nZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiY2MxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE1hcmtDaGFuZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIChJTlN8REVMKQotICovCi1maW5hbCBjbGFzcyBIZWRNYXJrQ2hhbmdlcyBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1hcmtDaGFuZ2VzKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaXRlICVVUkk7ICNJTVBMSUVEKQotCSAqIChkYXRldGltZSAlRGF0ZXRpbWU7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NJVEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREFURVRJTUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWROT0JSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE5PQlIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxODg4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE5PQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIE5PQlIgLS0gbm90IHN0YW5kYXJkIHRhZyBidXQgaXQgaXMgY29tbW9ubHkgdXNlZC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTk9CUiBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQotCXB1YmxpYyBIZWROT0JSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PQlIsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQ09SUkVDVF9EVVBMSUNBVEVEOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJLy8gTm8gYXR0cmlidXRlcyBpcyBkZWZpbmVkLgotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE5PRU1CRUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTk9FTUJFRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjFhM2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTk9FTUJFRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBOT0VNQkVELgotICovCi1maW5hbCBjbGFzcyBIZWROT0VNQkVEIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTk9FTUJFRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0VNQkVELCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE5PRlJBTUVTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE5PRlJBTUVTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ODBiNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWROT0ZSQU1FUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogTk9GUkFNRVMuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE5PRlJBTUVTIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTk9GUkFNRVMoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX05PRlJBTUVTX0NPTlRFTlQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+Tk9GUkFNRVM8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPk5PRlJBTUVTPC9jb2RlPiBpdHNlbGYuCi0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgbGFiZWwgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRlJBTUVTKTsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQobGFiZWwpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRlJBTUVTfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTk9TQ1JJUFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkTk9TQ1JJUFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkMTU0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE5PU0NSSVBULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIE5PU0NSSVBULgotICovCi1maW5hbCBjbGFzcyBIZWROT1NDUklQVCBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE5PU0NSSVBUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBULCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE9CSkVDVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRPQkpFQ1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiM2M4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE9CSkVDVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogT0JKRUNULgotICovCi1maW5hbCBjbGFzcyBIZWRPQkpFQ1QgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPQkpFQ1QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0JKRUNULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQVJBTV9DT05UQUlORVI7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCSAqIChkZWNsYXJlIChkZWNsYXJlKSAjSU1QTElFRCkKLQkgKiAoY2xhc3NpZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoY29kZWJhc2UgJVVSSTsgI0lNUExJRUQpCi0JICogKGRhdGEgJVVSSTsgI0lNUExJRUQpCi0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkgKiAoY29kZXR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkgKiAoYXJjaGl2ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc3RhbmRieSAlVGV4dDsgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREVDTEFSRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEFTU0lELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPREVCQVNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RBVEEsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0RFVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BUkNISVZFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUQU5EQlksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1VTRU1BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBQklOREVYLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vICVhbGlnbjsgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkT0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkT0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0YWEyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE9MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIE9MLgotICovCi1maW5hbCBjbGFzcyBIZWRPTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogT0wuCi0JICogKHR5cGUgJU9MU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICogKHN0YXJ0IE5VTUJFUiAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAodHlwZSAlT0xTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk9MX1NUWUxFKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVEFSVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRPUFRHUk9VUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRPUFRHUk9VUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmEwMDE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkT1BUR1JPVVAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogT1BUR1JPVVAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9QVEdST1VQIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT1BUR1JPVVAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUR1JPVVAsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX09QVElPTl9DT05UQUlORVI7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChsYWJlbCAlVGV4dDsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU0FCTEVEfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKGxhYmVsICVUZXh0OyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBQkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEFCRUwsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE9QVElPTi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRPUFRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1N2Y1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZE9QVElPTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogT1BUSU9OLgotICovCi1maW5hbCBjbGFzcyBIZWRPUFRJT04gZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTn07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT1BUSU9OKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCX0KLQotCS8qKgotCSAqIE9QVElPTi4KLQkgKiAlYXR0cnM7Ci0JICogKHNlbGVjdGVkIChzZWxlY3RlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKGxhYmVsICVUZXh0OyAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TRUxFQ1RFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQUJFTCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIE9QVElPTiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJiZTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBQLgotICovCi1maW5hbCBjbGFzcyBIZWRQIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gdGVybWluYXRvcnMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+UDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhdHRyczs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYWxpZ247PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKiA8cD48Yj4lYWxpZ247PC9iPiBtZWFucyA8Y29kZT5hbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeSkgI0lNUExJRUQ8L2NvZGU+LgotCSAqIFVuZm9ydHVuYXRlbHksIHRoaXMgPGNvZGU+YWxpZ248L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tIG9uZSBpbgotCSAqIDxjb2RlPklNRzwvY29kZT4gb3IgPGNvZGU+VEFCTEU8L2NvZGU+LiAgU28sIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkgKiBvZiA8Y29kZT5hbGlnbjwvY29kZT4gc2hvdWxkIGJlIGxvY2FseSBjcmVhdGVkIGFuZCBpdCBzaG91bGRuJ3QgYmUgcmVnaXN0ZXJlZAotCSAqIGluIGEgPGNvZGU+SENNRG9jSW1wbDwvY29kZT4gaW5zdGFuY2UuPC9wPgotCSAqIDxwPkhvd2V2ZXIsICVhbGlnbiBpcyB1c2VkIGluIHNldmFyYWwgdGltZXMuICBJIHdvdWxkbid0IHdyaXRlIHNhbWUgY29kZQotCSAqIGluIG1hbnkgdGltZXMuICBTbywgSSBhZGQgYSBuZXcgdXRpbGl0eSBtZXRob2QgaW50byA8Y29kZT5DTVV0aWw8L2NvZGU+Ci0JICogdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uPC9wPgotCSAqIDxicj4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtRGVjbEltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGFkZWMgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBuYW1lcyBvZiB0ZXJtaW5hdG9ycy4KLQkgKiA8Y29kZT5QPC9jb2RlPiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCWlmICh0ZXJtaW5hdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JCS8vPDxEMjE3OTgyCi0JCXRlcm1pbmF0b3JzID0gbmV3IFZlY3RvcigpOwotCQl0ZXJtaW5hdG9ycy5hZGRBbGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZXNPZkJsb2NrKCkpOwotCQl0ZXJtaW5hdG9ycy5hZGQoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJKTsKLQkJdGVybWluYXRvcnMuYWRkKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCk7Ci0JCXRlcm1pbmF0b3JzLmFkZChIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQkvL0QyMTc5ODIKLQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkUEFSQU0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkUEFSQU0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2YzU2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFBBUkFNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogUEFSQU0uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFBBUkFNIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFBBUkFNKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogUEFSQU0uCi0JICogKGlkIElEICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZXR5cGUgKERBVEF8UkVGfE9CSkVDVCkgREFUQSkKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRVRZUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIChuYW1lIENEQVRBICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFBSRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRQUkUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljOTAxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFBSRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIFBSRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkUFJFIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIFBSRSBlbGVtZW50IHNob3VsZCBrZWVwIHNwYWNlcyBpbiBpdHMgc291cmNlLgotCSAqLwotCXB1YmxpYyBIZWRQUkUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCi0JCWtlZXBTcGFjZXMgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAod2lkdGggTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gKHdpZHRoIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5QUkU8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVwcmUuZXhjbHVzaW9uOzwvY29kZT4uCi0JICogJXByZS5leGNsdXNpb24gaXM6Ci0JICogSU1HIHwgT0JKRUNUIHwgQVBQTEVUIHwgQklHIHwgU01BTEwgfCBTVUIgfCBTVVAgfCBGT05UIHwgQkFTRUZPTlQKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTUcsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1QsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUFBMRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CSUcsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TTUFMTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNVQiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNVUCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPTlQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFRk9OVH07Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFBjZGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRQY2RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkMDUzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFBjZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgUENEQVRBIHR5cGUgZWxlbWVudCBkZWNsYXJhdGlvbnMuPGJyPgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRQY2RhdGEgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQY2RhdGEoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogUENEQVRBIHR5cGUgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFBocmFzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRQaHJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlNmNjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFBocmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogJXBocmFzZTsKLSAqLwotZmluYWwgY2xhc3MgSGVkUGhyYXNlIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQaHJhc2UoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkNPUlJFQ1RfRFVQTElDQVRFRDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5IVE1MRWxlbURlY2xJbXBsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkUS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRRLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmQwNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRRLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFEgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9EVVBMSUNBVEVEOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoY2l0ZSAlVVJJOyAjSU1QTElFRCkgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0lURX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNDUklQVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTQ1JJUFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwMTUzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNDUklQVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBTQ1JJUFQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNDUklQVCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNDUklQVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBTQ1JJUFQuCi0JICogKGNoYXJzZXQgJUNoYXJzZXQ7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobGFuZ3VhZ2UgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAoZGVmZXIgKGRlZmVyKSAjSU1QTElFRCkKLQkgKiAoZXZlbnQgQ0RBVEEgI0lNUExJRUQpCi0JICogKGZvciAlVVJJOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hBUlNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREVGRVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRVZFTlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9SfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHR5cGUgJUNvbnRlbnRUeXBlOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgInRleHQvamF2YXNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPlNDUklQVDwvY29kZT4gaXMgQ0RBVEEgdHlwZS4KLQkgKiBTbywgdGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENEQVRBIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNFTEVDVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTRUxFQ1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U3NDM4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNFTEVDVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIFNFTEVDVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU0VMRUNUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU0VMRUNUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFTEVDVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfU0VMRUNUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNpemUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobXVsdGlwbGUgKG11bHRpcGxlKSAjSU1QTElFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChzaXplIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTVVMVElQTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DSEFOR0V9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTUEFOLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNQQU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmYzRmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNQQU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogU1BBTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1BBTiBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBTUEFOLgotCSAqLwotCXB1YmxpYyBIZWRTUEFOKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNQQU4sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTU0lCYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNTSUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwYmVlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNTSUJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUxDTVByb3BlcnRpZXM7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIFNTSSBkZWNsYXJhdGlvbnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZFNTSUJhc2UgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQmFzZShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEZvcm1hdFR5cGUoKSB7Ci0JCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9TU0k7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wTmFtZSk7Ci0JfQotCi0JLyoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgewotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU1NJKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTU0lDb25maWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzIxNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTU0lDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkNPTkZJRy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJQ29uZmlnIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQ29uZmlnKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUcsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpDT05GSUcuCi0JICogKGVycm1zZyBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKiAodGltZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRVJSTVNHLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkVGTVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVElNRUZNVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNTSUVjaG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJRWNoby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTk1OGQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJRWNoby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6RUNITy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRWNobyBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUVjaG8oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VDSE8sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpFQ0hPCi0JICogKHZhciBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJRXhlYy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTU0lFeGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMThkOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTU0lFeGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpFWEVDLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lFeGVjIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRXhlYyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRVhFQywgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkVYRUMKLQkgKiAoY2dpICVVUkk7ICNJTVBMSUVEKQotCSAqIChjbWQgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NHSSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DTUR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTU0lGbGFzdG1vZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTU0lGbGFzdG1vZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjA5MmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJRmxhc3Rtb2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkZMQVNUTU9ELgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lGbGFzdG1vZCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUZsYXN0bW9kKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZMQVNUTU9ECi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJRnNpemUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJRnNpemUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiN2NiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNTSUZzaXplLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpGU0laRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRnNpemUgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lGc2l6ZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRlNJWkUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpGU0laRQotCSAqIChmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqICh2aXJ0dWFsICVVUkkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNTSUluY2x1ZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJSW5jbHVkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTQ0NTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJSW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6SU5DTFVERS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJSW5jbHVkZSBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUluY2x1ZGUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0lOQ0xVREUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpJTkNMVURFCi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJUHJpbnRlbnYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1NJUHJpbnRlbnYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliNGVkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNTSVByaW50ZW52LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIFNTSTpQUklOVEVOVi4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJUHJpbnRlbnYgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lQcmludGVudihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfUFJJTlRFTlYsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogU1NJOlBSSU5URU5WIGhhcyBubyBhdHRyaWJ1dGVzLiAgU28sIHRoaXMgbWV0aG9kIHNob3VsZAotCSAqIGFsd2F5cyByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogTm90ZTogU2luY2Ugc29tZWJvZHkgZG9lc24ndCBleHBlY3QgbnVsbCBpcyByZXR1cm5lZCwgcmV0dXJuIHRoZSBlbXB0eSBhdHRyaWJ1dGUKLQkgKiBsaWtlIGEgY3VzdG9tIHRhZyB3aGljaCBkb2Vzbid0IGhhdmUgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNTSVNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTU0lTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjMzFkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNTSVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6U0VULgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lTZXQgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lTZXQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1NFVCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOlNFVAotCSAqICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTVFlMRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRTVFlMRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjg4Y2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU1RZTEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIFNUWUxFLgotICovCi1maW5hbCBjbGFzcyBIZWRTVFlMRSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNUWUxFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9DREFUQTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogU1RZTEUKLQkgKiAlaTE4bjsKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG1lZGlhICVNZWRpYURlc2M7ICNJTVBMSUVEKQotCSAqICh0aXRsZSAlVGV4dDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUVESUEsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVElUTEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJLy8gKHR5cGUgJUNvbnRlbnRUeXBlOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIDxjb2RlPlNUWUxFPC9jb2RlPiBpcyBDREFUQSBjb250ZW50IHR5cGUuICBTbywgaXQgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENEQVRBIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFNjcmlwdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU2NyaXB0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVhODA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkU2NyaXB0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBTVUIgYW5kIFNVUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU2NyaXB0cyBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU2NyaXB0cyhTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFRBQkxFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFRBQkxFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNzdmZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRUQUJMRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIFRBQkxFLgotICovCi1maW5hbCBjbGFzcyBIZWRUQUJMRSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRBQkxFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UQUJMRTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRBQkxFLgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICogKHN1bW1hcnkgJVRleHQ7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChmcmFtZSAlVEZyYW1lOyAjSU1QTElFRCkKLQkgKiAocnVsZXMgJVRSdWxlczsgI0lNUExJRUQpCi0JICogKGNlbGxzcGFjaW5nICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChjZWxscGFkZGluZyAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJVRBbGlnbjsgI0lNUExJRUQpCi0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoZGF0YXBhZ2VzaXplIENEQVRBICNJTVBMSUVEKQotCSAqIChoZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkFic3RyYWN0SFRNTEVsZW1EZWNsSW1wbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlcmVzZXJ2ZWQ7Ci0JCS8vIC4uLiAlcmVzZXJ2ZWQ7IGlzIGVtcHR5IGluIHRoZSBjdXJyZW50IERURC4KLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NVTU1BUlksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JVTEVTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NFTExTUEFDSU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NFTExQQURESU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JHQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREFUQVBBR0VTSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CQUNLR1JPVU5ELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SIC8vIEQyMDU1MTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gYWxpZ24gKGxvY2FsKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIGFsaWduVmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0xFRlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NFTlRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGFsaWduVmFsdWVzKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhZGVjID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhZGVjKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkVEVYVEFSRUEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkVEVYVEFSRUEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1ZjcxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFRFWFRBUkVBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBURVhUQVJFQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVEVYVEFSRUEgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICogVEVYVEFSRUEgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBzb3VyY2UuCi0JICovCi0JcHVibGljIEhlZFRFWFRBUkVBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFRBUkVBLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0KLQkJa2VlcFNwYWNlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogVEVYVEFSRUEuCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5Ci0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHJvd3MgTlVNQkVSICNSRVFVSVJFRCkKLQkgKiAoY29scyBOVU1CRVIgI1JFUVVJUkVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChyZWFkb25seSAocmVhZG9ubHkpICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnNlbGVjdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGlzdHlsZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRUFET05MWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05TRUxFQ1QsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DSEFOR0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSVNUWUxFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkVElUTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkVElUTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlNzdjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFRJVExFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBUSVRMRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVElUTEUgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRJVExFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogVElUTEUuCi0JICogJWkxOG47Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5USVRMRTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JWhlYWQubWlzYzs8L2NvZGU+LgotCSAqICVoZWFkLm1pc2M7IGlzIDxjb2RlPlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyAoU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QpCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkssIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1R9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRUUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRUUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjY0MjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkVFIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFRSLgotICovCi1maW5hbCBjbGFzcyBIZWRUUiBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUiwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVENFTExfQ09OVEFJTkVSOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVjZWxsaGFsaWduOwotCSAqICVjZWxsdmFsaWduOwotCSAqIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAoaGVpZ2h0ICVMZW5ndGggI0lNUExJRUQpIGJ1ZzIyNDYKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JHQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkFDS0dST1VORCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQgLy8gRDIwNTUxNAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBUUiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFRhYmxlQm9keS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRUYWJsZUJvZHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2MDAxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFRhYmxlQm9keS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogVEhFQUQvVEZPT1QvVEJPRFkKLSAqLwotZmluYWwgY2xhc3MgSGVkVGFibGVCb2R5IGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0FQVElPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTEdST1VQLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUYWJsZUJvZHkoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UUl9DT05UQUlORVI7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaWYgKGVsZW1lbnROYW1lID09IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSkgewotCQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCQl9Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUQk9EWS9URk9PVC9USEVBRAotCSAqICVhdHRyczsKLQkgKiAlY2VsbGhhbGlnbjsKLQkgKiAlY2VsbHZhbGlnbjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBUSEVBRCwgVEZPT1QgYW5kIFRCT0RZIGhhdmUgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFRhYmxlQ2VsbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRUYWJsZUNlbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2NDE5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFRhYmxlQ2VsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogKFRIIHwgVEQpLgotICovCi1maW5hbCBjbGFzcyBIZWRUYWJsZUNlbGwgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRILCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRhYmxlQ2VsbChTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoYWJiciAlVGV4dDsgI0lNUExJRUQpCi0JICogKGF4aXMgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhlYWRlcnMgSURSRUZTICNJTVBMSUVEKQotCSAqIChzY29wZSAlU2NvcGU7ICNJTVBMSUVEKQotCSAqIChyb3dzcGFuIE5VTUJFUiAxKQotCSAqIChjb2xzcGFuIE5VTUJFUiAxKQotCSAqICVjZWxsaGFsaWduOwotCSAqICVjZWxsdmFsaWduOwotCSAqIChub3dyYXAgKG5vd3JhcCkgI0lNUExJRUQpCi0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYmFja2dyb3VuZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyY29sb3IgJUNvbG9yICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbGhhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsaGFsaWduKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbHZhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsdmFsaWduKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUJCUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BWElTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFQURFUlMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XU1BBTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTUEFOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PV1JBUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CR0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CQUNLR1JPVU5ELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SIC8vIEQyMDU1MTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogVEggYW5kIFREIGhhdmUgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFVMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0hlZFVMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZjQ4ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRVTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIFVMLgotICovCi1maW5hbCBjbGFzcyBIZWRVTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRVTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVUwuCi0JICogKHR5cGUgJVVMU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHR5cGUgJVVMU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJLy8gJVVMU3R5bGU7IGlzIChkaXNjfHNxdWFyZXxjaXJjbGUpLgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ESVNDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TUVVBUkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NJUkNMRX07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRXQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSGVkV0JSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYmVkZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9IZWRXQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLWZpbmFsIGNsYXNzIEhlZFdCUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCXB1YmxpYyBIZWRXQlIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuV0JSLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0JSRUFLLgotCQkvLyBzYW1lIGFzIEJSLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JSRUFLOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJLy8gTm8gYXR0cmlidXRlcyBpcyBkZWZpbmVkLgotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0pDTURvY0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSkNNRG9jSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDAxYWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvSkNNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgQ01Eb2N1bWVudCBmb3IgdGhlIEpTUCAxLjEuCi0gKi8KLWNsYXNzIEpDTURvY0ltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSlNQQ01Eb2N1bWVudCB7Ci0KLQkvKiogTmFtZXNwYWNlIGZvciBhbGwgbmFtZXMgb2YgZWxlbWVudHMsIGVudGl0aWVzIGFuZCBhdHRyaWJ1dGVzLiAqLwotCXByaXZhdGUgQ01OYW1lc3BhY2VJbXBsIG5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBKU1BFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBIQ01Eb2NJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpDTURvY0ltcGwoU3RyaW5nIGRvY1R5cGVOYW1lLCBDTU5hbWVzcGFjZUltcGwgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lKTsKLQkJbmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQllbGVtZW50cyA9IG5ldyBKU1BFbGVtZW50Q29sbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTENNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTENNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0pTUDExTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0pTUDExTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5M2MwMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9KU1AxMU5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotLyoqCi0gKiBKU1AgMS4xIE5hbWVzcGFjZS4gTm90ZSwgdGhpcyBpbnRlcmZhY2Ugd2FzIAotICogY29waWVkIGZvcm0gSlNQIGNvcmUgcGFja2FnZXMuIE9uZSBpbXBsaWNhdGlvbiAKLSAqIGlzIHRoYXQgZXh0cmEgY2FyZSBpcyBuZWVkZWQgaW4gdXNpbmcgJz09JyBpbnN0ZWFkIAotICogb2YgJy5lcXVhbHMnLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDExTmFtZXNwYWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIHsKLQkJLy8gRWxlbWVudCBuYW1lcwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRMRVQgPSAianNwOnNjcmlwdGxldCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTiA9ICJqc3A6ZXhwcmVzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTEFSQVRJT04gPSAianNwOmRlY2xhcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfUEFHRSA9ICJqc3A6ZGlyZWN0aXZlLnBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9JTkNMVURFID0gImpzcDpkaXJlY3RpdmUuaW5jbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1RBR0xJQiA9ICJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFQkVBTiA9ICJqc3A6dXNlQmVhbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUUFJPUEVSVFkgPSAianNwOnNldFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRQUk9QRVJUWSA9ICJqc3A6Z2V0UHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREUgPSAianNwOmluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkQgPSAianNwOmZvcndhcmQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTiA9ICJqc3A6cGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTVMgPSAianNwOnBhcmFtcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMTEJBQ0sgPSAianNwOmZhbGxiYWNrIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTSA9ICJqc3A6cGFyYW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAianNwOnJvb3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAianNwOnRleHQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQMTFfVVJJID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVEFHX1BSRUZJWCA9ICJqc3AiOyAvLyROT04tTkxTLTEkCi0JLy8gYXR0cmlidXRlIG5hbWVzCi0JLy8gICBkaXJlY3RpdmUucGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRVhURU5EUyA9ICJleHRlbmRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05URU5UX1RZUEUgPSAiY29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lNUE9SVCA9ICJpbXBvcnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NFU1NJT04gPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQlVGRkVSID0gImJ1ZmZlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVVUT0ZMVVNIID0gImF1dG9GbHVzaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNfVEhSRUFEX1NBRkUgPSAiaXNUaHJlYWRTYWZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JTkZPID0gImluZm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VSUk9SX1BBR0UgPSAiZXJyb3JQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFID0gImlzRXJyb3JQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HID0gInBhZ2VFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGRpcmVjdGl2ZS5pbmNsdWRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGRpcmVjdGl2ZS50YWdsaWIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHVzZUJlYW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDT1BFID0gInNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQkVBTl9OQU1FID0gImJlYW5OYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JLy8gICBzZXRQcm9wZXJ0eQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BST1BFUlRZID0gInByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFSQU0gPSAicGFyYW0iOyAvLyROT04tTkxTLTEkCi0JLy8gICBpbmNsdWRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRkxVU0ggPSAiZmx1c2giOyAvLyROT04tTkxTLTEkCi0JLy8gICBwbHVnaW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFQkFTRSA9ICJjb2RlYmFzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxJR04gPSAiYWxpZ24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FSQ0hJVkUgPSAiYXJjaGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSEVJR0hUID0gImhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gImhzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSlJFVkVSU0lPTiA9ICJqcmV2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSAidnNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9XSURUSCA9ICJ3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTlNQTFVHSU5VUkwgPSAibnNwbHVnaW51cmwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lFUExVR0lOVVJMID0gImllcGx1Z2ludXJsIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgcm9vdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9YTUxOU19KU1AgPSAieG1sbnM6anNwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JLy8gYXR0cmlidXRlIHZhbHVlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9KQVZBID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DVF9ERUZBVUxUID0gInRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIjsvL0QxOTUzNjYgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQlVGU0laX0RFRkFVTFQgPSAiOGtiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfU0VTU0lPTiA9ICJzZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkVRVUVTVCA9ICJyZXF1ZXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQVBQTElDQVRJT04gPSAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CRUFOID0gImJlYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BUFBMRVQgPSAiYXBwbGV0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9KVkVSMTEgPSAiMS4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfWE1MTlNfSlNQID0gImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0N2M5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEpTUCBleHRlbnNpb24gZm9yIENNRG9jdW1lbnQuCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBzb21lIHNob3J0IGhhbmQgbWV0aG9kcyB0byBnZXQgZGVjbGFyYXRpb25zCi0gKiBieSBhIG5hbWUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQQ01Eb2N1bWVudCBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQgewotCi0JLyoqCi0JICogQSBzaG9ydCBoYW5kIG1ldGhvZCB0byBnZXQgYSBlbGVtZW50IGRlY2xhcmF0aW9uIGZvciBhIEpTUCBlbGVtZW50LgotCSAqIEpTUCBkZWNsYXJhdGlvbiBjbGFzcyBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaW50ZXJmYWNlLgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbgotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0pTUEVsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL0pTUEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDY3NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9KU1BFbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTENNUHJvcGVydGllczsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucyBvZiB0aGUgSlNQIDEuMS4KLSAqLwotZmluYWwgY2xhc3MgSlNQRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCi0JcHJpdmF0ZSBjbGFzcyBUeXBlUGFja2V0IHsKLQkJcHVibGljIFN0cmluZyBuYW1lID0gbnVsbDsKLQkJcHVibGljIGludCBjb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFk7Ci0JCXB1YmxpYyBpbnQgb21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9OT05FOwotCQlwdWJsaWMgaW50IGxpbmVCcmVhayA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORTsKLQkJcHVibGljIGludCBsYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9OT05FOwotCQlwdWJsaWMgaW50IGNvcnJlY3QgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkNPUlJFQ1RfTk9ORTsKLQkJcHVibGljIGludCBmb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9YTUw7Ci0JCXB1YmxpYyBib29sZWFuIGluZGVudENoaWxkID0gZmFsc2U7Ci0KLQkJcHVibGljIFR5cGVQYWNrZXQoKSB7Ci0JCX0KLQl9Ci0KLQkvKiogSlNQIGVsZW1lbnQgZGVjbGFyYXRpb24uICovCi0JcHJpdmF0ZSBjbGFzcyBFbGVtRGVjbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uLCBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiB7Ci0JCXByaXZhdGUgVHlwZVBhY2tldCB0eXBlID0gbnVsbDsKLQkJcHJpdmF0ZSBDTUdyb3VwSW1wbCBjb250ZW50ID0gbnVsbDsKLQkJcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcEltcGwgYXR0cmlidXRlcyA9IG51bGw7Ci0KLQkJcHVibGljIEVsZW1EZWNsKFR5cGVQYWNrZXQgdCkgewotCQkJc3VwZXIodC5uYW1lLCAxLCAxKTsKLQkJCXR5cGUgPSB0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Q29udGVudChDTUdyb3VwSW1wbCBncm91cCkgewotCQkJY29udGVudCA9IGdyb3VwOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhDTU5hbWVkTm9kZU1hcEltcGwgYXR0cnMpIHsKLQkJCWF0dHJpYnV0ZXMgPSBhdHRyczsKLQkJfQotCi0JCS8vIGltcGxlbWVudGVzIENNTm9kZQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHBwID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlyZXR1cm4gcHAuc3VwcG9ydHModGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7IC8vRDIwODgzOQotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCQlTdHJpbmcgbXlOYW1lID0gZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQlpZiAobXlOYW1lID09IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBMVUdJTikgewotCQkJCQlyZXR1cm4gZ2V0TmFtZWRJdGVtKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUyk7IC8vIG91dGVyIGNsYXNzIG1ldGhvZC4KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobXlOYW1lID09IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUykgewotCQkJCQlyZXR1cm4gZ2V0TmFtZWRJdGVtKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNKTsgLy8gb3V0ZXIgY2xhc3MgbWV0aG9kLgotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHBwID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJldHVybiBwcC5nZXQodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbXBsZW1lbnRlcyBDTUVsZW1lbnREZWNsYXJhdGlvbgotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGVzOwotCQl9Ci0KLQkJcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQkJcmV0dXJuIGNvbnRlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGUuY29udGVudDsKLQkJfQotCi0JCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gaW1wbGVtZW50ZXMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbgotCQlwdWJsaWMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSkgewotCQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvcnJlY3Rpb25UeXBlKCkgewotCQkJcmV0dXJuIHR5cGUuY29ycmVjdDsKLQkJfQotCi0JCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCQlyZXR1cm4gRU1QVFlfTUFQOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRGb3JtYXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGUuZm9ybWF0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMYXlvdXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGUubGF5b3V0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMaW5lQnJlYWtIaW50KCkgewotCQkJcmV0dXJuIHR5cGUubGluZUJyZWFrOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRPbWl0VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlLm9taXQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRUZXJtaW5hdGVBdChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGRlYykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkS2VlcFNwYWNlcygpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGVudENoaWxkU291cmNlKCkgewotCQkJcmV0dXJuIHR5cGUuaW5kZW50Q2hpbGQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0pTUCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLy8gZWxlbWVudCBJRHMKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ1JJUFRMRVQgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FWFBSRVNTSU9OID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVDTEFSQVRJT04gPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVJFQ1RJVkVfUEFHRSA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUkVDVElWRV9JTkNMVURFID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1RBR0xJQiA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VTRUJFQU4gPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRVRQUk9QRVJUWSA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFVFBST1BFUlRZID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5DTFVERSA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUldBUkQgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUExVR0lOID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNUyA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GQUxMQkFDSyA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBTSA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ST09UID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RFWFQgPSAxNjsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8vIGF0dHJpYnV0ZSBjcmVhdGVyCi0JcHJpdmF0ZSBjbGFzcyBKQUNyZWF0ZXIgaW1wbGVtZW50cyBKU1AxMU5hbWVzcGFjZSB7Ci0JCS8vIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCQlwcml2YXRlIGNsYXNzIEF0dHJEZWNsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0JCQlIVE1MQ01EYXRhVHlwZUltcGwgdHlwZSA9IG51bGw7Ci0JCQlpbnQgdXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCi0JCQkvLyBtZXRob2RzCi0JCQlwdWJsaWMgQXR0ckRlY2woU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCQkJc3VwZXIoYXR0ck5hbWUpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQkJCXJldHVybiBnZXROb2RlTmFtZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJCQlyZXR1cm4gdHlwZTsKLQkJCX0KLQotCQkJLyoqIEBkZXByZWNhdGVkIGJ5IHN1cGVyY2xhc3MgKi8KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCWlmICh0eXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSAhPSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJcmV0dXJuIHR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCQl9Ci0KLQkJCS8qKiBAZGVwcmVjYXRlZCAgYnkgc3VwZXJjbGFzcyAqLwotCQkJcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQkJCVZlY3RvciB2ID0gbmV3IFZlY3RvcihBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpKSk7Ci0JCQkJcmV0dXJuIHYuZWxlbWVudHMoKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRVc2FnZSgpIHsKLQkJCQlyZXR1cm4gdXNhZ2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIHNob3VsZElnbm9yZUNhc2UoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zID0gbnVsbDsKLQotCQlwdWJsaWMgSkFDcmVhdGVyKCkgewotCQkJZGVjbGFyYXRpb25zID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCBnZXREZWNsYXJhdGlvbnMoaW50IGVpZCkgewotCQkJc3dpdGNoIChlaWQpIHsKLQkJCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfUEFHRSA6Ci0JCQkJCWNyZWF0ZUZvckRpclBhZ2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX0lOQ0xVREUgOgotCQkJCQljcmVhdGVGb3JEaXJJbmNsdWRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCQljcmVhdGVGb3JEaXJUYWdsaWIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfVVNFQkVBTiA6Ci0JCQkJCWNyZWF0ZUZvclVzZUJlYW4oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfU0VUUFJPUEVSVFkgOgotCQkJCQljcmVhdGVGb3JTZXRQcm9wZXJ0eSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9HRVRQUk9QRVJUWSA6Ci0JCQkJCWNyZWF0ZUZvckdldFByb3BlcnR5KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0lOQ0xVREUgOgotCQkJCQljcmVhdGVGb3JJbmNsdWRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0ZPUldBUkQgOgotCQkJCQljcmVhdGVGb3JGb3J3YXJkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJCWNyZWF0ZUZvclBsdWdpbigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9QQVJBTSA6Ci0JCQkJCWNyZWF0ZUZvclBhcmFtKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCQljcmVhdGVGb3JSb290KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQkvLyBzaG91bGQgd2Fybi4KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVjbGFyYXRpb25zOwotCQl9Ci0KLQkJcHJpdmF0ZSBBdHRyRGVjbCBjcmVhdGVCb29sVHlwZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZlZhbHVlKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKG5hbWUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgZGVmVmFsdWUpOwotCQkJcmV0dXJuIGFkZWM7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRGlyUGFnZSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBudWxsOwotCQkJLy8gKCJsYW5ndWFnZSIgQ0RBVEEgREVDTEFSRUQgImphdmEiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTEFOR1VBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfSkFWQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9MQU5HVUFHRSwgYWRlYyk7Ci0KLQkJCS8vICgiZXh0ZW5kcyIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0VYVEVORFMpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0VYVEVORFMsIGFkZWMpOwotCi0JCQkvLyAoImNvbnRlbnRUeXBlIiBDREFUQSBERUNMQVJFRCAidGV4dC9odG1sOyBJU08tODg1OS0xIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPTlRFTlRfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9DVF9ERUZBVUxUKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NPTlRFTlRfVFlQRSwgYWRlYyk7Ci0KLQkJCS8vICgiaW1wb3J0IiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSU1QT1JUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JTVBPUlQsIGFkZWMpOwotCi0JCQkvLyAoInNlc3Npb24iIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJ0cnVlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShBVFRSX05BTUVfU0VTU0lPTiwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU0VTU0lPTiwgYWRlYyk7Ci0KLQkJCS8vICgiYnVmZmVyIiBDREFUQSBERUNMQVJFRCAiOGtiIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0JVRkZFUik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9CVUZTSVpfREVGQVVMVCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9CVUZGRVIsIGFkZWMpOwotCi0JCQkvLyAoImF1dG9GbHVzaCIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgInRydWUiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9BVVRPRkxVU0gsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FVVE9GTFVTSCwgYWRlYyk7Ci0KLQkJCS8vICgiaXNUaHJlYWRTYWZlIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAidHJ1ZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX0lTX1RIUkVBRF9TQUZFLCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JU19USFJFQURfU0FGRSwgYWRlYyk7Ci0KLQkJCS8vICgiaW5mbyIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lORk8pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lORk8sIGFkZWMpOwotCi0JCQkvLyAoImVycm9yUGFnZSIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9FUlJPUl9QQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRVJST1JfUEFHRSwgYWRlYyk7Ci0KLQkJCS8vICgiaXNFcnJvclBhZ2UiIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJmYWxzZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX0lTX0VSUk9SX1BBR0UsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFLCBhZGVjKTsKLQotCQkJLy8gKCJwYWdlRW5jb2RpbmciIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HLCBhZGVjKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpckluY2x1ZGUoKSB7Ci0JCQkvLyAoImZpbGUiIFVSSSBSRVFVSVJFRCk7IERlZmVjdCBUT1JPOjE4NTI0MQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRklMRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRklMRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRGlyVGFnbGliKCkgewotCQkJLy8gKCJ1cmkiIFVSSSBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1VSSSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVVJJLCBhZGVjKTsKLQotCQkJLy8gKCJwcmVmaXgiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUFJFRklYKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BSRUZJWCwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yVXNlQmVhbigpIHsKLQkJCS8vICgiaWQiIElEIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSUQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSUQsIGFkZWMpOwotCi0JCQkvLyAoInNjb3BlIiBFTlVNIERFQ0xBUkVEIChwYWdlfHNlc3Npb258cmVxdWVzdHxhcHBsaWNhdGlvbikgInBhZ2UiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfU0NPUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUEFHRSwgQVRUUl9WQUxVRV9TRVNTSU9OLCBBVFRSX1ZBTFVFX1JFUVVFU1QsIEFUVFJfVkFMVUVfQVBQTElDQVRJT059OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfUEFHRSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9TQ09QRSwgYWRlYyk7Ci0KLQkJCS8vICgiY2xhc3MiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DTEFTUyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ0xBU1MsIGFkZWMpOwotCi0JCQkvLyAoImJlYW5OYW1lIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQkVBTl9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9CRUFOX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInR5cGUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9UWVBFLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JTZXRQcm9wZXJ0eSgpIHsKLQkJCS8vICgibmFtZSIgSURSRUYgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRFJFRik7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInByb3BlcnR5IiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BST1BFUlRZKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BST1BFUlRZLCBhZGVjKTsKLQotCQkJLy8gKCJ2YWx1ZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1ZBTFVFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WQUxVRSwgYWRlYyk7Ci0KLQkJCS8vICgicGFyYW0iIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQVJBTSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFSQU0sIGFkZWMpOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yR2V0UHJvcGVydHkoKSB7Ci0JCQkvLyAoIm5hbWUiIElEUkVGIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSURSRUYpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJwcm9wZXJ0eSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QUk9QRVJUWSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUk9QRVJUWSwgYWRlYyk7Ci0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JJbmNsdWRlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG51bGw7Ci0JCQkvLyAoInBhZ2UiIFVSSSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BBR0UsIGFkZWMpOwotCi0JCQkvLyAoImZsdXNoIiBFTlVNIFJFUVVJUkVEICh0cnVlfGZhbHNlKSk7IERlZmVjdCBUT1JPOjE4NTI0MQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRkxVU0gpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9GTFVTSCwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRm9yd2FyZCgpIHsKLQkJCS8vICgicGFnZSIgVVJJIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFHRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFHRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUGx1Z2luKCkgewotCQkJLy8gKCJ0eXBlIiBFTlVNIFJFUVVJUkVEIChiZWFufGFwcGxldCkpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfQkVBTiwgQVRUUl9WQUxVRV9BUFBMRVR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoImNvZGUiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09ERSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09ERSwgYWRlYyk7Ci0KLQkJCS8vICgiY29kZWJhc2UiIFVSSSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPREVCQVNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT0RFQkFTRSwgYWRlYyk7Ci0KLQkJCS8vICgiYWxpZ24iIEVOVU0gSU1QTElFRCAodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9BTElHTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBhbGlnbnMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKGFsaWducyk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0KLQkJCS8vICgiYXJjaGl2ZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0FSQ0hJVkUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FSQ0hJVkUsIGFkZWMpOwotCi0JCQkvLyAoImhlaWdodCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0hFSUdIVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSEVJR0hULCBhZGVjKTsKLQotCQkJLy8gKCJoc3BhY2UiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9IU1BBQ0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0hTUEFDRSwgYWRlYyk7Ci0KLQkJCS8vICgianJldmVyc2lvbiIgQ0RBVEEgREVDTEFSRUQgIjEuMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9KUkVWRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0pWRVIxMSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9KUkVWRVJTSU9OLCBhZGVjKTsKLQotCQkJLy8gKCJuYW1lIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgidnNwYWNlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVlNQQUNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WU1BBQ0UsIGFkZWMpOwotCi0JCQkvLyAoIndpZHRoIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfV0lEVEgpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1dJRFRILCBhZGVjKTsKLQotCQkJLy8gKCJuc3BsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OU1BMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05TUExVR0lOVVJMLCBhZGVjKTsKLQotCQkJLy8gKCJpZXBsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JRVBMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lFUExVR0lOVVJMLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JQYXJhbSgpIHsKLQkJCS8vICgibmFtZSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInZhbHVlIiBDREFUQSBSRVFVSVJFRCk7IERlZmVjdCBUT1JPOjE4NTI0MQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVkFMVUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVkFMVUUsIGFkZWMpOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUm9vdCgpIHsKLQkJCS8vICgieG1sbnM6anNwIiBDREFUQSAiaHR0cDovL2p2YS5zdW4uY29tL0pTUC9QYWdlIikKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1hNTE5TX0pTUCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9YTUxOU19KU1ApOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfWE1MTlNfSlNQLCBhZGVjKTsKLQkJCS8vICgidmVyc2lvbiIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ01OYW1lZE5vZGVNYXAgRU1QVFlfTUFQID0gbmV3IENNTmFtZWROb2RlTWFwKCkgewotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfU0NSSVBUTEVUXSA9IFNDUklQVExFVDsKLQkJbmFtZXNbSWRzLklEX0VYUFJFU1NJT05dID0gRVhQUkVTU0lPTjsKLQkJbmFtZXNbSWRzLklEX0RFQ0xBUkFUSU9OXSA9IERFQ0xBUkFUSU9OOwotCQluYW1lc1tJZHMuSURfRElSRUNUSVZFX1BBR0VdID0gRElSRUNUSVZFX1BBR0U7Ci0JCW5hbWVzW0lkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERV0gPSBESVJFQ1RJVkVfSU5DTFVERTsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9UQUdMSUJdID0gRElSRUNUSVZFX1RBR0xJQjsKLQkJbmFtZXNbSWRzLklEX1VTRUJFQU5dID0gVVNFQkVBTjsKLQkJbmFtZXNbSWRzLklEX1NFVFBST1BFUlRZXSA9IFNFVFBST1BFUlRZOwotCQluYW1lc1tJZHMuSURfR0VUUFJPUEVSVFldID0gR0VUUFJPUEVSVFk7Ci0JCW5hbWVzW0lkcy5JRF9JTkNMVURFXSA9IElOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9GT1JXQVJEXSA9IEZPUldBUkQ7Ci0JCW5hbWVzW0lkcy5JRF9QTFVHSU5dID0gUExVR0lOOwotCQluYW1lc1tJZHMuSURfUEFSQU1TXSA9IFBBUkFNUzsKLQkJbmFtZXNbSWRzLklEX0ZBTExCQUNLXSA9IEZBTExCQUNLOwotCQluYW1lc1tJZHMuSURfUEFSQU1dID0gUEFSQU07Ci0JCW5hbWVzW0lkcy5JRF9ST09UXSA9IFJPT1Q7Ci0JCW5hbWVzW0lkcy5JRF9URVhUXSA9IFRFWFQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEpTUEVsZW1lbnRDb2xsZWN0aW9uKCkgewotCQlzdXBlcihuYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRWxlbURlY2woZ2V0SUQoZWxlbWVudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNNR3JvdXBJbXBsCi0JICogQHBhcmFtIGVpZCBpbnQKLQkgKi8KLQlwcml2YXRlIENNR3JvdXBJbXBsIGNyZWF0ZUNvbnRlbnQoaW50IGVpZCkgewotCQlpZiAoZWlkID09IElEX1VOS05PV04pCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDTUdyb3VwSW1wbCBjb250ZW50ID0gbnVsbDsKLQkJQ01Ob2RlIGNoaWxkID0gbnVsbDsKLQotCQlzd2l0Y2ggKGVpZCkgewotCQkJY2FzZSBJZHMuSURfSU5DTFVERSA6Ci0JCQljYXNlIElkcy5JRF9GT1JXQVJEIDoKLQkJCQkvLyAoanNwOnBhcmFtKSoKLQkJCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJCQljaGlsZCA9IGl0ZW0oSWRzLklEX1BBUkFNKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9QTFVHSU4gOgotCQkJCS8vIChqc3A6cGFyYW1zIHwganNwOmZhbGxiYWNrKT8KLQkJCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCAxKTsKLQkJCQkvLyBqc3A6cGFyYW1zCi0JCQkJY2hpbGQgPSBpdGVtKElkcy5JRF9QQVJBTVMpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQkvLyBqc3A6ZmFsbGJhY2sKLQkJCQljaGlsZCA9IGl0ZW0oSWRzLklEX0ZBTExCQUNLKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9QQVJBTVMgOgotCQkJCS8vIChqc3A6cGFyYW0pKwotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkJCWNoaWxkID0gaXRlbShJZHMuSURfUEFSQU0pOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCS8vICVCb2R5OwotCQkJCS8vIC0tPiAoanNwOnRleHR8JURpcmVjdGl2ZXM7fCVTY3JpcHRzO3wlQWN0aW9uczspKgotCQkJCS8vICAgICAlRGlyZWN0aXZlcyAtLT4ganNwOmRpcmVjdGl2ZS5wYWdlfGpzcDpkaXJlY3RpdmUuaW5jbHVkZQotCQkJCS8vICAgICAlU2NyaXB0czsgLS0+IGpzcDpzY3JpcHRsZXR8anNwOmRlY2xhcmF0aW9ufGpzcDpleHByZXNzaW9uCi0JCQkJLy8gICAgICVBY3Rpb25zIC0tPiBqc3A6dXNlQmVhbnxqc3Auc2V0UHJvcGVydHl8anNwOmdldFByb3BlcnR5Ci0JCQkJLy8gICAgICAgICAgICAgICAgICB8anNwOmluY2x1ZGV8anNwOmZvcndhcmR8anNwOnBsdWdpbgotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJCQlpbnQgdmFsaWRDaGlsZHJlbltdID0ge0lkcy5JRF9URVhULAotCQkJCS8vICVEaXJlY3R2ZXM7Ci0JCQkJCQkJSWRzLklEX0RJUkVDVElWRV9QQUdFLCBJZHMuSURfRElSRUNUSVZFX0lOQ0xVREUsCi0JCQkJCQkJLy8gJVNjcmlwdHM7Ci0JCQkJCQkJSWRzLklEX1NDUklQVExFVCwgSWRzLklEX0RFQ0xBUkFUSU9OLCBJZHMuSURfRVhQUkVTU0lPTiwKLQkJCQkJCQkvLyAlQWN0aW9uczsKLQkJCQkJCQlJZHMuSURfVVNFQkVBTiwgSWRzLklEX1NFVFBST1BFUlRZLCBJZHMuSURfR0VUUFJPUEVSVFksIElkcy5JRF9JTkNMVURFLCBJZHMuSURfRk9SV0FSRCwgSWRzLklEX1BMVUdJTn07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWNoaWxkID0gaXRlbSh2YWxpZENoaWxkcmVuW2ldKTsKLQkJCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtRGVjbEltcGwKLQkgKiBAcGFyYW0gZWlkIGludAotCSAqLwotCXByaXZhdGUgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtRGVjbChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCVR5cGVQYWNrZXQgcGFja2V0ID0gbmV3IFR5cGVQYWNrZXQoKTsKLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgSWRzLklEX1NDUklQVExFVCA6Ci0JCQkJLy8gY29udGVudCwgb21pdCwgbGluZUJyZWFrLCBsYXlvdXQsIGNvcnJlY3QsIGZvcm1hdAotCQkJCS8vIHNjcmlwdGxldAotCQkJCXBhY2tldC5uYW1lID0gU0NSSVBUTEVUOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0VYUFJFU1NJT04gOgotCQkJCS8vIGV4cHJlc3Npb24KLQkJCQlwYWNrZXQubmFtZSA9IEVYUFJFU1NJT047Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfREVDTEFSQVRJT04gOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBERUNMQVJBVElPTjsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfUEFHRSA6Ci0JCQkJLy8gZGlyZWN0aXZlLnBhZ2UKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9QQUdFOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX0lOQ0xVREUgOgotCQkJCS8vIGRpcmVjdGl2ZS5pbmxjdWRlCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfSU5DTFVERTsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX0RJUkVDVElWRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCS8vIGRpcmVjdGl2ZS50YWdsaWIKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9UQUdMSUI7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9VU0VCRUFOIDoKLQkJCQkvLyB1c2VCZWFuCi0JCQkJcGFja2V0Lm5hbWUgPSBVU0VCRUFOOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1NFVFBST1BFUlRZIDoKLQkJCQkvLyBzZXRQcm9wZXJ0eQotCQkJCXBhY2tldC5uYW1lID0gU0VUUFJPUEVSVFk7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9HRVRQUk9QRVJUWSA6Ci0JCQkJLy8gZ2V0UHJvcGVydHkKLQkJCQlwYWNrZXQubmFtZSA9IEdFVFBST1BFUlRZOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfSU5DTFVERSA6Ci0JCQkJLy8gaW5jbHVkZQotCQkJCXBhY2tldC5uYW1lID0gSU5DTFVERTsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0ZPUldBUkQgOgotCQkJCS8vIGZvcndhcmQKLQkJCQlwYWNrZXQubmFtZSA9IEZPUldBUkQ7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9QTFVHSU4gOgotCQkJCS8vIHBsdWdpbgotCQkJCXBhY2tldC5uYW1lID0gUExVR0lOOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9QQVJBTVMgOgotCQkJCS8vIHBhcmFtcwotCQkJCXBhY2tldC5uYW1lID0gUEFSQU1TOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9GQUxMQkFDSyA6Ci0JCQkJLy8gZmFsbGJhY2sKLQkJCQlwYWNrZXQubmFtZSA9IEZBTExCQUNLOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BBUkFNIDoKLQkJCQkvLyBwYXJhbQotCQkJCXBhY2tldC5uYW1lID0gUEFSQU07Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ST09UIDoKLQkJCQlwYWNrZXQubmFtZSA9IFJPT1Q7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47IC8vIHNhbWUgYXMgSFRNTAotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfVEVYVCA6Ci0JCQkJcGFja2V0Lm5hbWUgPSBURVhUOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gdW5rbm93biBJRAotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRWxlbURlY2wgZGVjID0gbmV3IEVsZW1EZWNsKHBhY2tldCk7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IGNyZWF0ZUNvbnRlbnQoZWlkKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCWRlYy5zZXRDb250ZW50KGNvbnRlbnQpOwotCi0JCUpBQ3JlYXRlciBjcmVhdGVyID0gbmV3IEpBQ3JlYXRlcigpOwotCQlkZWMuc2V0QXR0cmlidXRlcyhjcmVhdGVyLmdldERlY2xhcmF0aW9ucyhlaWQpKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL1Byb3BlcnR5UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU1ZTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0vKioKLSAqIFByb3BlcnR5UHJvdmlkZXIgY2xhc3MuCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZXMuCi0gKi8KLWludGVyZmFjZSBQcm9wZXJ0eVByb3ZpZGVyIHsKLQotCWJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCk7Ci0KLQlPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0NzM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL1Byb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MQ01Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIFRoZSBmYWN0b3J5IG9iamVjdCBvZiBQcm9wZXJ0eVByb3ZpZGVyLgotICovCi1maW5hbCBjbGFzcyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSB7Ci0KLQotCS8qKgotCSAqIERlZmF1bHRQcm92aWRlciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciB1bmtub3duIHByb3BlcnRpZXMuCi0JICogSXQgYWx3YXlzIHJldHVybnMgbnVsbCB2YWx1ZSBmb3IgYW55IHByb3BlcnRpZXMuCi0JICovCi0JY2xhc3MgRGVmYXVsdFByb3ZpZGVyIGltcGxlbWVudHMgUHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBEZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIGltcGxlbWVudHMgUHJvcGVydHlQcm92aWRlciB7Ci0JCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCXJldHVybiAoZWRlY2wgIT0gbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlpZiAoIShlZGVjbCBpbnN0YW5jZW9mIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBnZXRFbGVtZW50UHJvcGVydHkoKEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKWVkZWNsKTsKLQkJfQotCi0JCWFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpOwotCX0KLQotCS8qCi0JICogInRhZ0luZm8iCi0JICogZ2V0cyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZWxlbWVudAotCSAqLwotCWNsYXNzIFBQVGFnSW5mbyBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgaHRtbEFubm90YXRpb25Mb2MgPSAicGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHJvdGVjdGVkIEFubm90YXRpb25NYXAgZkFubm90YXRpb25NYXAgPSBudWxsOwotCi0JCXB1YmxpYyBQUFRhZ0luZm8oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgdGhlIGFubm90YXRpb25NYXAuCi0JCSAqIEByZXR1cm4gUmV0dXJucyBhIEFubm90YXRpb25NYXAKLQkJICovCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGdldEFubm90YXRpb25NYXAoKSB7Ci0JCQlpZiAoZkFubm90YXRpb25NYXAgPT0gbnVsbCkgewotCQkJCWZBbm5vdGF0aW9uTWFwID0gbmV3IEFubm90YXRpb25NYXAoKTsKLQkJCQl0cnkgewotCQkJCQlmQW5ub3RhdGlvbk1hcC5sb2FkKGh0bWxBbm5vdGF0aW9uTG9jKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vIGFubm90YXRpb24gYXZhaWxhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZBbm5vdGF0aW9uTWFwOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJaWYgKGRlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJcmV0dXJuIGdldEFubm90YXRpb25NYXAoKS5nZXRQcm9wZXJ0eSgoKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pZGVjbCkuZ2V0RWxlbWVudE5hbWUoKSwgInRhZ0luZm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogInNob3VsZEtlZXBTcGFjZSIKLQkgKi8KLQljbGFzcyBQUFNob3VsZEtlZXBTcGFjZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBTaG91bGRLZWVwU3BhY2UoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuc2hvdWxkS2VlcFNwYWNlcygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogInNob3VsZEluZGVudENoaWxkU291cmNlIgotCSAqLwotCWNsYXNzIFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJ0ZXJtaW5hdG9ycyIKLQkgKi8KLQljbGFzcyBQUFRlcm1pbmF0b3JzIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFRlcm1pbmF0b3JzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCWlmICghIChkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1EZWNsSW1wbCkpIHJldHVybiBudWxsOwotCQkJcmV0dXJuICgoSFRNTEVsZW1EZWNsSW1wbClkZWNsKS5nZXRUZXJtaW5hdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAicHJvaGliaXRlZEFuY2VzdG9ycyIKLQkgKi8KLQljbGFzcyBQUFByb2hpYml0ZWRBbmNlc3RvcnMgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQUHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc0pTUCIKLQkgKi8KLQljbGFzcyBQUElzSlNQIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzSlNQKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLmlzSlNQKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNYSFRNTCIKLQkgKiBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGl0c2VsZiBuZXZlciByZXByZXNlbnQgYW55IFhIVE1MIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0JICogU28sIHRoaXMgcHJvcGVydHkgbXVzdCBiZSBhbHdheXMgZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1hIVE1MIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzWEhUTUwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzU1NJIgotCSAqIEVhY2ggZGVjbGFyYXRpb24gY2xhc3MgZm9yIFNTSSBlbGVtZW50cyBtdXN0IHByb3ZpZGUgdGhpcyBwcm9wZXJ0eSBpdHNlbGYsCi0JICogYW5kIHRoZW4gcmV0dXJuIHRydWUuICBPdGhlciBkZWNsYXJhdGlvbiBtdXN0IGFsd2F5cyByZXR1cm4gZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1NTSSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1NTSSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGluZUJyZWFrSGludCIKLQkgKi8KLQljbGFzcyBQUExpbmVCcmVha0hpbnQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGluZUJyZWFrSGludCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGluZUJyZWFrSGludCgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgOgotCQkJCQloaW50ID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIGhpbnQ7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJsYXlvdXRUeXBlIgotCSAqLwotCWNsYXNzIFBQTGF5b3V0VHlwZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBMYXlvdXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CTE9DSyA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfQkxPQ0s7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JSRUFLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfSElEREVOOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfT0JKRUNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX1dSQVAgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX1dSQVA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkby4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCX0KLQotCS8qCi0JICogIm9taXRUeXBlIgotCSAqLwotCWNsYXNzIFBQT21pdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQT21pdFR5cGUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIHR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0T21pdFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0JPVEggOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9ERUZBVUxUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9NVVNUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX01VU1Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpbmNsdXNpb24iCi0JICovCi0JY2xhc3MgUFBJbmNsdXNpb24gZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSW5jbHVzaW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBkZWNsLmdldEluY2x1c2lvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyIGdldFByb3ZpZGVyKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLQkJUHJvcGVydHlQcm92aWRlciBwcCA9IChQcm9wZXJ0eVByb3ZpZGVyKSBmYWN0b3J5LnJlZ2lzdHJ5LmdldChwcm9wTmFtZSk7Ci0JCWlmIChwcCAhPSBudWxsKQotCQkJcmV0dXJuIHBwOwotCi0JCXBwID0gZmFjdG9yeS5jcmVhdGUocHJvcE5hbWUpOwotCQlpZiAocHAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWN0b3J5LmRlZmF1bHRQcm92aWRlcjsKLQotCQlmYWN0b3J5LnJlZ2lzdHJ5LnB1dChwcm9wTmFtZSwgcHApOwotCQlyZXR1cm4gcHA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlQcm92aWRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgUHJvcGVydHlQcm92aWRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaHRhYmxlIHJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgRGVmYXVsdFByb3ZpZGVyKCk7Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBjcmVhdGUoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBudWxsOwotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXBwID0gbmV3IFBQSXNKU1AoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcHAgPSBuZXcgUFBJc1hIVE1MKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlwcCA9IG5ldyBQUElzU1NJKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkxBWU9VVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQTGF5b3V0VHlwZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcHAgPSBuZXcgUFBMaW5lQnJlYWtIaW50KCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKSkKLQkJCXBwID0gbmV3IFBQUHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfS0VFUF9TUEFDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEtlZXBTcGFjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEluZGVudENoaWxkU291cmNlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRFUk1JTkFUT1JTKSkKLQkJCXBwID0gbmV3IFBQVGVybWluYXRvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVEFHSU5GTykpCi0JCQlwcCA9IG5ldyBQUFRhZ0luZm8oKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQT21pdFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSU5DTFVTSU9OKSkKLQkJCXBwID0gbmV3IFBQSW5jbHVzaW9uKCk7Ci0KLQkJcmV0dXJuIHBwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjM4OGJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuSFRNTENNRGF0YVR5cGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgQXR0cmlidXRlQ29sbGVjdGlvbiBleHRlbmRzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIENIVE1MTmFtZXNwYWNlIHsKLQkvKioKLQkgKiBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlQ29sbGVjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTEF0dHJEZWNsSW1wbAotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZShTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQotCQlpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUNUSU9OKSkgewotCQkJLy8gKGFjdGlvbiAlVVJJICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDVElPTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUxUKSkgewotCQkJLy8gKGFsdCAlVGV4dDsgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JPUkRFUikpIHsKLQkJCS8vIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9SREVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DSEVDS0VEKSkgewotCQkJLy8gKGNoZWNrZWQgKGNoZWNrZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX0NIRUNLRUR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DSEVDS0VELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DTEVBUikpIHsKLQkJCS8vIChjbGVhciAobGVmdCB8IGFsbCB8IHJpZ2h0IHwgbm9uZSkgbm9uZSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9BTEwsIEFUVFJfVkFMVUVfUklHSFQsIEFUVFJfVkFMVUVfTk9ORX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfTk9ORSk7Ci0KLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0xFQVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTFMpKSB7Ci0JCQkvLyAoY29scyBOVU1CRVIgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09MUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRU5DVFlQRSkpIHsKLQkJCS8vIChlbmN0eXBlICVDb250ZW50VHlwZTsgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9XV1dfRk9STV9VUkxFTkNPREVEKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRU5DVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSEVJR0hUKSkgewotCQkJLy8gKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hSRUYpKSB7Ci0JCQkvLyAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hSRUYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hTUEFDRSkpIHsKLQkJCS8vIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSFNQQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IVFRQX0VRVUlWKSkgewotCQkJLy8gKGh0dHAtZXF1aXYgTkFNRSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5OQU1FKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSFRUUF9FUVVJViwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFYTEVOR1RIKSkgewotCQkJLy8gKG1heGxlbmd0aCBOVU1CRVIgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVhMRU5HVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01FVEhPRCkpIHsKLQkJCS8vIChtZXRob2QgKEdFVHxQT1NUKSBHRVQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0dFVCwgQVRUUl9WQUxVRV9QT1NUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9HRVQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NRVRIT0QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01VTFRJUExFKSkgewotCQkJLy8gKG11bHRpcGxlIChtdWx0aXBsZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTVVMVElQTEV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NVUxUSVBMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTkFNRSkpIHsKLQkJCS8vIChuYW1lIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9OT1NIQURFKSkgewotCQkJLy8gKG5vc2hhZGUgKG5vc2hhZGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX05PU0hBREV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1NIQURFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ST1dTKSkgewotCQkJLy8gKHJvd3MgTlVNQkVSICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JPV1MsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NFTEVDVEVEKSkgewotCQkJLy8gKHNlbGVjdGVkIChzZWxlY3RlZCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfU0VMRUNURUR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TRUxFQ1RFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0laRSkpIHsKLQkJCS8vIChzaXplICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NSQykpIHsKLQkJCS8vIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JCQkvLyBOT1RFOiAic3JjIiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGluIHNldmVyYWwgZWxlbWVudHMuCi0JCQkvLwkJIFRoZSBkZWZpbml0aW9uIG9mIElNRyBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlcnMuCi0JCQkvLwkJIFNvLCBpdCBzaG91bGQgYmUgbG9jYWxseSBkZWZpbmVkLgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UWVBFKSkgewotCQkJLy8gKHR5cGUgJUNvdGVudFR5cGU7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBTFVFKSkgewotCQkJLy8gKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQUxVRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkVSU0lPTikpIHsKLQkJCS8vICh2ZXJzaW9uIENEQVRBICNGSVhFRCAnJUhUTUwuVmVyc2lvbjspCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0ZJWEVELCBBVFRSX1ZBTFVFX1ZFUlNJT05fVFJBTlNJVElPTkFMKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkVSU0lPTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uRklYRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfV0lEVEgpKSB7Ci0JCQkvLyAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZTUEFDRSkpIHsKLQkJCS8vICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVlNQQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJCS8vIDw8RDIwNTUxNAotCQl9Ci0JCWVsc2UgewotCQkJLy8gdW5rbm93biBhdHRyaWJ1dGU7IG1heWJlIGVycm9yLgotCQkJLy8gc2hvdWxkIHdhcm4uCi0JCQlhdHRyID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEdldCAlYm9keWNvbG9yczsgZGVjbGFyYXRpb25zLgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNNTmFtZWROb2RlTWFwSW1wbAotCSAqLwotCXB1YmxpYyB2b2lkIGdldEJvZHljb2xvcnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCX0KLQotCS8qKgotCSAqIEdldCBhbGlnbiBhdHRyaWJ1dGUgd2hpY2ggaGFzICVJQWxpZ247IGFzIHZhbHVlcy4uCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ01OYW1lZE5vZGVNYXBJbXBsCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9ySW1hZ2UoKSB7Ci0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXMKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX01JRERMRSwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBmb3IgPGNvZGU+YWxpZ248L2NvZGU+Ci0JICogaW4gc2V2ZXJhbCBlbGVtZW50cywgbGlrZSA8Y29kZT5QPC9jb2RlPiwgPGNvZGU+RElWPC9jb2RlPi4KLQkgKiBUaGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQgZnJvbSBhdHRyaWJ1dGVzIHRob3NlIGhhdmUgdGhlIHNhbWUgbmFtZQotCSAqIGluIG90aGVyIGVsZW1lbnRzICg8Y29kZT5JTUc8L2NvZGU+IGFuZCA8Y29kZT5UQUJMRTwvY29kZT4pLgotCSAqIFNvLCBpdCBjYW4ndCB0cmVhdCBhcyBnbG9iYWwgYXR0cmlidXRlcy4KLQkgKiA8c3Ryb25nPk5PVEU6IFRoZXNlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBoYXMKLQkgKiBubyBvd25lciBDTURvY3VtZW50IGluc3RhbmNlLjwvc3Ryb25nPgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTEF0dHJEZWNsSW1wbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpIHsKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXM6IGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9DRU5URVIsIEFUVFJfVkFMVUVfUklHSFQsfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWF0dHJzOyBkZWNsYXJhdGlvbnMuCi0JICogJWF0dHJzOyBjb25zaXN0cyBvZiAlY29yZWF0dHJzOywgJWkxOG4sIGFuZCAlZXZlbnRzOy4KLQkgKiBAcGFyYW0gYXR0cmlidXRlcyBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5DTU5hbWVkTm9kZU1hcEltcGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRBdHRycyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVjb3JlYXR0cnM7IGRlY2xhcmF0aW9ucy4KLQkgKiBAcGFyYW0gYXR0cmlidXRlcyBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5DTU5hbWVkTm9kZU1hcEltcGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDb3JlKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBnbG9iYWwgYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTEF0dHJyaWJ1dGVEZWNsYXJhdGlvbgotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJQ01Ob2RlIGNtbm9kZSA9IGdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCWlmIChjbW5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCi0JCUhUTUxBdHRyRGVjbEltcGwgZGVjID0gY3JlYXRlKGF0dHJOYW1lKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJcHV0TmFtZWRJdGVtKGF0dHJOYW1lLCBkZWMpOwotCi0JCXJldHVybiBkZWM7Ci0JfQotCi0JLyoqCi0JICogR2V0IGRlY2xhcmF0aW9ucyB3aGljaCBhcmUgc3BlY2lmaWVkIGJ5IG5hbWVzLgotCSAqIEBwYXJhbSBkZWNsYXJhdGlvbnMgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ01OYW1lZE5vZGVNYXBJbXBsCi0JICogQHBhcmFtIG5hbWVzIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGdldERlY2xhcmF0aW9ucyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zLCBJdGVyYXRvciBuYW1lcykgewotCQl3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0KCk7Ci0JCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZGVjID0gZ2V0RGVjbGFyYXRpb24oYXR0ck5hbWUpOwotCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oYXR0ck5hbWUsIGRlYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWV2ZW50czsgZGVjbGFyYXRpb25zLgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNNTmFtZWROb2RlTWFwSW1wbAotCSAqLwotCXB1YmxpYyB2b2lkIGdldEV2ZW50cyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVpMThuOyBkZWNsYXJhdGlvbnMuCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ01OYW1lZE5vZGVNYXBJbXBsCi0JICovCi0JcHVibGljIHZvaWQgZ2V0STE4bihDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ0hDTURvY0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ0hDTURvY0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5MWY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NIQ01Eb2NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLkhUTUxFbnRpdHlEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBDTURvY3VtZW50IGltcGxlbWVudGF0aW9uIGZvciB0aGUgSFRNTC4KLSAqLwotcHVibGljIGNsYXNzIENIQ01Eb2NJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxDTURvY3VtZW50IHsKLQotCS8qKiBOYW1lc3BhY2UgZm9yIGFsbCBuYW1lcyBvZiBlbGVtZW50cywgZW50aXRpZXMgYW5kIGF0dHJpYnV0ZXMuICovCi0JcHJpdmF0ZSBDTU5hbWVzcGFjZSBuYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudHMgPSBudWxsOwotCXByaXZhdGUgRW50aXR5Q29sbGVjdGlvbiBlbnRpdGllcyA9IG51bGw7Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb2xsZWN0aW9uIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIENIQ01Eb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2UgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lKTsKLQkJbmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQlhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZUNvbGxlY3Rpb24oKTsKLQkJZWxlbWVudHMgPSBuZXcgRWxlbWVudENvbGxlY3Rpb24oYXR0cmlidXRlcyk7Ci0JCWVudGl0aWVzID0gbmV3IEVudGl0eUNvbGxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkF0dHJpYnV0ZUNvbGxlY3Rpb24KLQkgKi8KLQlBdHRyaWJ1dGVDb2xsZWN0aW9uIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuSFRNTENNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBlbnRpdGllczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxDTURvY3VtZW50Ci0JICovCi0JcHVibGljIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiBnZXRFbnRpdHlEZWNsYXJhdGlvbihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlpZiAoZW50aXRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbnRpdHlEZWNsYXJhdGlvbikgZW50aXRpZXMuZ2V0TmFtZWRJdGVtKGVudGl0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NIVE1MTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NIVE1MTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZDJkOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DSFRNTE5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogUHJvdmlkZSBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGUgSFRNTCA0LjA/IHNwZWNpZmljYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ0hUTUxOYW1lc3BhY2UgewotCi0JLy8gRWxlbWVudCBuYW1lcwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1M7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0UgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tRVU9URSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJSOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRU5URVIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElWID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJVjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREwgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREw7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk07Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgxID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDMgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg0ID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDYgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQUQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUwgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5QVVQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEEgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0wgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0w7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFAgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFTEVDVDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVEFSRUEgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0NPTkZJRyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfQ09ORklHOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRUNITyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRUNITzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0VYRUMgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VYRUM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GU0laRSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRlNJWkU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GTEFTVE1PRCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRkxBU1RNT0Q7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9JTkNMVURFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9JTkNMVURFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfUFJJTlRFTlYgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1BSSU5URU5WOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfU0VUID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9TRVQ7Ci0JfQotCi0JLy8gQ2hhcmFjdGVyIEVudGl0aWVzCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRW50aXR5TmFtZSB7Ci0JfQotCi0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSBuYW1lcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WRVJTSU9OID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WRVJTSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TUkMgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9XSURUSCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQk9SREVSID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hTUEFDRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTkFNRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0xFQVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NMRUFSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OT1NIQURFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OT1NIQURFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DSEVDS0VEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSEVDS0VEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVhMRU5HVEggPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BWExFTkdUSDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNUWUxFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU1RZTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hUVFBfRVFVSVYgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hUVFBfRVFVSVY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTlRFTlQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRFTlQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFJFRiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTVVMVElQTEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01VTFRJUExFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRUxFQ1RFRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0VMRUNURUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JPV1MgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1M7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTFMgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDVElPTiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NRVRIT0QgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01FVEhPRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRU5DVFlQRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRU5DVFlQRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0laRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMVUUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFOwotCi0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FUlJNU0cgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0VSUk1TRzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0laRUZNVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRUZNVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVElNRUZNVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVElNRUZNVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFSID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NHSSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0dJOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTUQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NNRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRklMRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRklMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVklSVFVBTCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTDsKLQotCS8vIGdsb2JhbCBhdHRyaWJ1dGUgdmFsdWVzOyBtYWlubHkgdXNlZCBpbiBlbnVtZXJhdGlvbi4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1ZFUlNJT05fVFJBTlNJVElPTkFMID0gIi0vL1czQy8vRFREIENvbXBhY3QgSFRNTCAxLjAgRHJhZnQvL0VOIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIGFsaWduICh0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVE9QID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVE9QOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTUlERExFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTUlERExFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQk9UVE9NOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0xFRlQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DRU5URVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DRU5URVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SSUdIVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUOwotCS8vICAgZm9yIGNsZWFyIChsZWZ0fGFsbHxyaWdodHxub25lKTogbGVmdCBhbmQgcmlnaHQgYXJlIGFscmVhZHkgZGVmaW5lZCBhYm92ZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FMTCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0FMTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX05PTkUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9OT05FOwotCS8vICAgZm9yIHR5cGUgb2YgSU5QVVQKLQkvLyAgICAgICAodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLQkvLyAgICAgICAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVEVYVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9QQVNTV09SRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ0hFQ0tCT1ggPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DSEVDS0JPWDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JBRElPID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkFESU87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TVUJNSVQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TVUJNSVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRVNFVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JFU0VUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSElEREVOID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSElEREVOOwotCS8vICAgZm9yIHNwYW4sIGNvbHNwYW4sIHJvd3NwYW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzEgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV8xOwotCS8vICAgZm9yIGZyYW1lYm9yZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV8wID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfMDsKLQkvLyAgIGZvciBtZXRob2Qgb2YgRk9STQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfR0VUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfR0VUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUE9TVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BPU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9XV1dfRk9STV9VUkxFTkNPREVEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRDsKLQkvLyAgIGZvciBiZWhhdmlybyBvZiBNQVJRVUVFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TQ1JPTEwgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TQ1JPTEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TTElERSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NMSURFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUxURVJOQVRFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQUxURVJOQVRFOwotCS8vICAgZm9yIGRpcmVjdGlvbiBvZiBNQVJRVUVFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9VUCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1VQOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRE9XTiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0RPV047Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NNQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmNTIxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NNQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIENNQ29udGVudCBmb3IgSFRNTCBDTS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Db250ZW50SW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5CT1VOREVEID0gLTE7Ci0JLyoqICAtMTogaXQncyBVTkJPVU5ERUQuICovCi0JcHJpdmF0ZSBpbnQgbWF4T2NjdXIgPSBVTkJPVU5ERUQ7Ci0JLyoqICAwOiBpdCdzIE9QVElPTkFMLCAxLCBpdCdzIFJFUVVJUkVELiAqLwotCXByaXZhdGUgaW50IG1pbk9jY3VyID0gMDsKLQotCS8qKgotCSAqIFRoZSBwcmltYXJ5IGNvbnN0dXJjdG9yLgotCSAqIFVzZSB0aGlzIG9uZSBmb3IgdXN1YWwgY2FzZXMuPGJyPgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnRJbXBsKFN0cmluZyBuYW1lLCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0JCXN1cGVyKG5hbWUpOwotCQltaW5PY2N1ciA9IG1pbjsKLQkJbWF4T2NjdXIgPSBtYXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQlyZXR1cm4gbWF4T2NjdXI7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0JICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gbWluT2NjdXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ01Hcm91cEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ01Hcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5YmY5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NNR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLS8qKgotICovCi1jbGFzcyBDTUdyb3VwSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUdyb3VwIHsKLQotCXByaXZhdGUgaW50IG9wZXJhdG9yID0gQ01Hcm91cC5TRVFVRU5DRTsKLQlwcml2YXRlIENNTm9kZUxpc3RJbXBsIGNoaWxkcmVuID0gbnVsbDsKLQotCS8qKgotCSAqIENNR3JvdXBJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNR3JvdXBJbXBsKGludCBvcCwgaW50IG1pbk9jY3VyLCBpbnQgbWF4T2NjdXIpIHsKLQkJc3VwZXIobnVsbCwgbWluT2NjdXIsIG1heE9jY3VyKTsKLQkJc3dpdGNoIChvcCkgewotCQkJY2FzZSBDTUdyb3VwLkFMTCA6Ci0JCQljYXNlIENNR3JvdXAuQ0hPSUNFIDoKLQkJCWNhc2UgQ01Hcm91cC5TRVFVRU5DRSA6Ci0JCQkJb3BlcmF0b3IgPSBvcDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCB3YXJuLgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBhcHBlbmRDaGlsZChDTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQlyZXR1cm4gY2hpbGRyZW4uYXBwZW5kTm9kZShjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0Ci0JICovCi0JcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogRUxFTUVOVF9ERUNMQVJBVElPTiwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBHUk9VUCwgRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuR1JPVVA7Ci0JfQotCi0JLyoqCi0JICogZ2V0T3BlcmF0aW9uIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0JICovCi0JcHVibGljIGludCBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIG9wZXJhdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhN2JhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENNTmFtZWROb2RlTWFwIGludGVyZmFjZS4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW50ZWQgdG8gYmUgdXNlZCBhcyBhIGNvbnRhaW5lciBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotICogSWYgc29tZW9uZSB3YW50cyB0byB1c2UgdGhpcyBjbGFzcyBmb3Igb3RoZXIgcHVycG9zZSwgaGUgbXVzdCBwYXkgYXR0ZW50aW9uCi0gKiB0byB0aGUgZmFjdCB0aGF0IHRoaXMgY2xhc3MgaXMgdG9sZXJhbnQgb2YgdGhlIGtleSBuYW1lIGNhc2UuICBUaGF0IGlzLCB0aGlzCi0gKiBjbGFzcyBkb2VzIG5vdCBkaXN0aW5ndWlzaCAibmFtZSIsICJOQU1FIiwgYW5kICJOYW1lIiBhcyBhIGtleSBuYW1lLgotICovCi1jbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcCB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5IYXNodGFibGUgaXRlbXMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaXRlbXMgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gaXRlbXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZSA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdW5rbm93biBrZXlzLgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgY29va2VkTmFtZSA9IG1ha2VDYW5vbmljYWxGb3JtKG5hbWUpOwotCQlpZiAoIWl0ZW1zLmNvbnRhaW5zS2V5KGNvb2tlZE5hbWUpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBpdGVtcy5nZXQoY29va2VkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNNTm9kZSBub2RlID0gKENNTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoLS1pbmRleCA8IDApCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBpdGVtcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByYXdGb3JtIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtYWtlQ2Fub25pY2FsRm9ybShTdHJpbmcgcmF3Rm9ybSkgewotCQlyZXR1cm4gcmF3Rm9ybS50b1VwcGVyQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpdGVtIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHB1dE5hbWVkSXRlbShTdHJpbmcgbmFtZSwgQ01Ob2RlIGl0ZW0pIHsKLQkJU3RyaW5nIGNvb2tlZE5hbWUgPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lKTsKLQkJaWYgKGl0ZW1zLmNvbnRhaW5zS2V5KGNvb2tlZE5hbWUpKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JCWl0ZW1zLnB1dChjb29rZWROYW1lLCBpdGVtKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3MDc5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUxDTVByb3BlcnRpZXM7Ci0KLQotCi0vKioKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUltcGwoU3RyaW5nIG5tKSB7Ci0JCXN1cGVyKCk7Ci0JCW5hbWUgPSBubTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWJhODg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ01Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEFuYWxvZyBvZiBkb20uTm9kZUxpc3QgZm9yIENNLgotICogU28sIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IHNpbWlsYXIgdG8KLSAqIHtAbGluayBjb20uaWJtLnNlZC5tb2RlbC54bWwuTm9kZUxpc3RJbXBsfS48YnI+Ci0gKi8KLWNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdCB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vZGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgYXBwZW5kTm9kZShDTU5vZGUgbm9kZSkgewotCQlub2Rlcy5hZGRFbGVtZW50KG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIG5vZGVzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBub2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTU5vZGUpIG5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Q3MzA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0gKiBpbiBYTUwgU2NoZW1hLjxicj4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCXByb3RlY3RlZCBDTUdyb3VwSW1wbCBjb250ZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb21wbGV4VHlwZURlZmluaXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29tcGxleFR5cGVEZWZpbml0aW9uKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbGxlY3Rpb24gPSBlbGVtZW50Q29sbGVjdGlvbjsKLQkJY3JlYXRlQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhY3R1YWwgY29udGVudCBtb2RlbC4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYW5kIG9ubHkgb25jZSBpbiB0aGUgY29uc3RydWN0b3IuPGJyPgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cAotCSAqLwotCXB1YmxpYyBDTUdyb3VwIGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCS8qIE5PVEU6IERvIHdlIG5lZWQgTE9HSUNBTCB0eXBlPwotCSAqIC0tIDMvNy8yMDAxCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRDb250ZW50VHlwZSgpOwotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgaGludC4KLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRQcmltYXJ5Q2FuZGlkYXRlKCkgewotCQlpZiAocHJpbWFyeUNhbmRpZGF0ZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKHByaW1hcnlDYW5kaWRhdGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0NvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDY2ZmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEZhY3Rvcnkgb2YgQ29tcGxleFR5cGVEZWZpbml0aW9uLgotICovCi1maW5hbCBjbGFzcyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBkZWZpbml0aW9ucyA9IG51bGw7Ci0JLy8gY29uc3RhbnRzIGZvciBjb21wbGV4IHR5cGUgbmFtZQotCS8qKiBmb3IgQUREUkVTUy4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9BRERSRVNTID0gIkNUWVBFX0FERFJFU1MiOy8vJE5PTi1OTFMtMSQKLQkvKiogQ0RBVEEgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNodWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfQ0RBVEEgPSAiQ1RZUEVfQ0RBVEEiOy8vJE5PTi1OTFMtMSQKLQkvKiogY29sIGdyb3VwIGNvbnRlbnQuIENPTCogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9DT0xVTU5fR1JPVVAgPSAiQ1RZUEVfQ09MVU1OX0dST1VQIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBETC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9ERUZJTklUSU9OX0xJU1QgPSAiQ1RZUEVfREVGSU5JVElPTl9MSVNUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBFTUJFRC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9FTUJFRCA9ICJDVFlQRV9FTUJFRCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBlbXB0eSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2hvdWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRU1QVFkgPSAiQ1RZUEVfRU1QVFkiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEZJRUxEU0VULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZJRUxEU0VUID0gIkNUWVBFX0ZJRUxEU0VUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBGUkFNRVNFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GUkFNRVNFVCA9ICJDVFlQRV9GUkFNRVNFVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmbG93IGNvbnRlbnQuICglZmxvdzspKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZMT1dfQ09OVEFJTkVSID0gIkNUWVBFX0ZMT1dfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGh0bWwgY29udGVudC4gSEVBRCwgKEZSQU1FU0VUfEJPRFkpICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSFRNTCA9ICJDVFlQRV9IVE1MIjsvLyROT04tTkxTLTEkCi0JLyoqIGhlYWQgY29udGVudC4gVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/ICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSEVBRCA9ICJDVFlQRV9IRUFEIjsvLyROT04tTkxTLTEkCi0JLyoqIGlubGluZSBjb250ZW50LiAoJWlubGluZTspKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0lOTElORV9DT05UQUlORVIgPSAiQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBsaXN0IGl0ZW0gY29udGFpbmVyLiAoTEkpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0xJX0NPTlRBSU5FUiA9ICJDVFlQRV9MSV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIE1BUC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9NQVAgPSAiQ1RZUEVfTUFQIjsvLyROT04tTkxTLTEkCi0JLyoqIG5vZnJhbWVzIGNvbnRlbnQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCA9ICJDVFlQRV9OT0ZSQU1FU19DT05URU5UIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBPUFRHUk9VUC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9PUFRJT05fQ09OVEFJTkVSID0gIkNUWVBFX09QVElPTl9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogcGFyYW0gY29udGFpbmVyLiBGb3IgT0JKRUNUL0FQUExFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9QQVJBTV9DT05UQUlORVIgPSAiQ1RZUEVfUEFSQU1fQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIFBDREFUQSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2h1bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9QQ0RBVEEgPSAiQ1RZUEVfUENEQVRBIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBTRUxFQ1QuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfU0VMRUNUID0gIkNUWVBFX1NFTEVDVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSBjb250ZW50LiBDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RBQkxFID0gIkNUWVBFX1RBQkxFIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIGNlbGwgY29udGFpZXIuIChUSHxURCkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVENFTExfQ09OVEFJTkVSID0gIkNUWVBFX1RDRUxMX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSByZWNvcmQgY29udGFpbmVyLiAoVFIpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RSX0NPTlRBSU5FUiA9ICJDVFlQRV9UUl9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCWRlZmluaXRpb25zID0gbmV3IGphdmEudXRpbC5IYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCBmb3IgQ29tcGxleFR5cGVEZWZpbml0aW9uLgotCSAqIEVhY2ggaW5zdGFuY2UgY3JlYXRlZCBpbiB0aGlzIG1ldGhvZCBtdXN0IGJlIHJlZ2lzdGVyZWQgaW50bwotCSAqIHRoZSBtYXAgd2l0aCBpdHMgbmFtZS4KLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqIEBwYXJhbSBkZWZpbml0aW9uTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlRGVmaW5pdGlvbihTdHJpbmcgZGVmaW5pdGlvbk5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCWlmIChkZWZpbml0aW9ucy5jb250YWluc0tleShkZWZpbml0aW9uTmFtZSkpIHsKLQkJCXJldHVybiAoQ29tcGxleFR5cGVEZWZpbml0aW9uKSBkZWZpbml0aW9ucy5nZXQoZGVmaW5pdGlvbk5hbWUpOwotCQl9Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0JCWlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9BRERSRVNTKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkQWRkcmVzcyhlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9ERUZJTklUSU9OX0xJU1QpIHsKLQkJCWRlZiA9IG5ldyBDdGREbChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9GTE9XX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZEZsb3dDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSEVBRCkgewotCQkJZGVmID0gbmV3IEN0ZEhlYWQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSFRNTCkgewotCQkJZGVmID0gbmV3IEN0ZEh0bWwoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZElubGluZUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9MSV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRMaUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX09QVElPTl9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRPcHRpb25Db250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfU0VMRUNUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkU2VsZWN0KGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgewotCQkJZGVmID0gbnVsbDsKLQkJfQotCQlpZiAoZGVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmFpbCB0byBjcmVhdGUuCi0JCWRlZmluaXRpb25zLnB1dChkZWZpbml0aW9uTmFtZSwgZGVmKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0KLQkvKioKLQkgKiBGb3Igc2luZ2xldG9uLjxicj4KLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ3RkQWRkcmVzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMjM5MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBBRERSRVNTLgotICovCi1maW5hbCBjbGFzcyBDdGRBZGRyZXNzIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRBZGRyZXNzKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVpbmxpbmUpIHwgUCkqLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSoKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyAoJWlubGluZSkKLQkJQ01Hcm91cEltcGwgaW5saW5lcyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChpbmxpbmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGlubGluZXMpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGlubGluZXMpOwotCQkvLyBQCi0JCUNNTm9kZSBwID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCk7Ci0JCWlmIChwICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKHApOwotCX0KLQotCS8qKgotCSAqICgoJWlubGluZSkgfCBQKSouCi0JICogQmVjYXVzZSAlaW5saW5lOyBjb250YWlucyAjUENEQVRBLCB0aGUgdHlwZSBpcyBNSVhFRC4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQUREUkVTUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGREbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGREbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNkNWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ3RkRGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIERMLgotICovCi1maW5hbCBjbGFzcyBDdGREbCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkRGwoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gRFQKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBERAotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoRFQgfCBERCkrLgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0RFRklOSVRJT05fTElTVDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRGbG93Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0N0ZEZsb3dDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmNzMzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0N0ZEZsb3dDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgY29udGFpbmVycyBvZiA8Y29kZT4lZmxvdzs8L2NvZGU+LgotICovCi1maW5hbCBjbGFzcyBDdGRGbG93Q29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRGbG93Q29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoJWZsb3c7KSoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldEZsb3coY29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5Db21wbGV4VHlwZURlZmluaXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5Db21wbGV4VHlwZURlZmluaXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GTE9XX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIZWFkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0N0ZEhlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxNzIzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0N0ZEhlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIGhlYWQgY29udGVudC4KLSAqIENvbnRlbnQgTW9kZWw6IChUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8pCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEhlYWQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEhlYWQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFOwotCX0KLQotCS8qKgotCSAqIGZvciBIRUFELgotCSAqIFRvIGF2b2lkIHVzaW5nIGluY2x1c2lvbiwgdGhlIGNvbnRlbnQgbW9kZWwgY29tZXMgZnJvbSB0aGUgWEhUTUwgMS4wLgotCSAqCi0JICogKCVoZWFkLm1pc2M7LCAoKHRpdGxlLCAlaGVhZC5taXNjOywgKGJhc2UsICVoZWFkLm1pc2M7KT8pIHwgKGJhc2UsICVoZWFkLm1pc2M7LCAodGl0bGUsICVoZWFkLm1pc2M7KSkpKQotCSAqIEFuZCAlaGVhZC5taXNjOyBpczoKLQkgKiAoc2NyaXB0fHN0eWxlfG1ldGF8bGlua3xvYmplY3R8aXNpbmRleCkqCi0JICoKLQkgKiAwOiAoJWhlYWQubWlzYywgQSkKLQkgKiBBOiAoQiB8IEMpCi0JICogQjogKHRpdGxlLCAlaGVhZC5taXNjOywgRCkKLQkgKiBDOiAoYmFzZSwgJWhlYWQubWlzYzssIEUpCi0JICogRDogKGJhc2UsICVoZWFkLm1pc2M7KT8KLQkgKiBFOiAodGl0bGUsICVoZWFkLm1pc2M7KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBBdCAxc3QsIGNyZWF0ZSAlaGVhZC5taXNjOyBjb250ZW50LgotCQkvLyAlaGVhZC5taXNjOwotCQkvLyAgICggfCApKgotCQlDTUdyb3VwSW1wbCBtaXNjID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmIChtaXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobWlzYywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vIDJuZCwgZ2V0IGEgdGl0bGUKLQkJQ01Ob2RlIHRpdGxlID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUpOwotCQkvLyAzcmQsIGdldCBhIGJhc2UKLQkJQ01Ob2RlIGJhc2UgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKTsKLQkJaWYgKHRpdGxlID09IG51bGwgfHwgYmFzZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFRvcCBsZXZlbCBjb250ZW50IGlzIGEgc2VxdWVuY2Ugb2YgJWhlYWQubWlzYzsgYW5kIEEuCi0JCS8vIDA6ICglaGVhZC5taXNjOywgQSkKLQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOwotCQljb250ZW50LmFwcGVuZENoaWxkKG1pc2MpOwotCQkvLyAgIGNyZWF0ZSBBIGFuZCBhcHBlbmQgaXQgdG8gdGhlIHRvcCBsZXZlbC4KLQkJewotCQkJLy8gQSBpcyBhIGNob2ljZSBvZiBCIGFuZCBDLgotCQkJLy8gQTogKEIgfCBDKQotCQkJLy8gICBjcmVhdGUgYSBjaG9pY2UKLQkJCUNNR3JvdXBJbXBsIGdBID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJCWlmIChnQSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCS8vICAgYXBwZW5kIEEgdG8gdGhlIHRvcCBsZXZlbC4KLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ0EpOwotCi0JCQkvLyBjcmVhdGUgQiBhbmQgYXBwZW5kIGl0IHRvIEEKLQkJCXsKLQkJCQkvLyBCIGlzIGEgc2VxdWVuY2Ugb2YgdGl0bGUsICVoZWFkLm1pc2M7LCBhbmQgRC4KLQkJCQkvLyBCOiAodGl0bGUsICVoZWFkLm1pc2M7LCBEKQotCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQlDTUdyb3VwSW1wbCBnQiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQlpZiAoZ0IgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCS8vICAgYXBwZW5kIEIgdG8gQS4KLQkJCQlnQS5hcHBlbmRDaGlsZChnQik7Ci0KLQkJCQkvLyAgIGFwcGVuZCB0aXRsZSB0byBCCi0JCQkJZ0IuYXBwZW5kQ2hpbGQodGl0bGUpOwotCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEIKLQkJCQlnQi5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQkvLyAgIGNyZWF0ZSBEIGFuZCBhcHBlbmQgaXQgdG8gQi4KLQkJCQl7Ci0JCQkJCS8vIEQgaXMgYSBzZXF1ZW5jZSBvZiBiYXNlLCAlaGVhZC5taXNjOy4KLQkJCQkJLy8gRDogKGJhc2UsICVoZWFkLm1pc2M7KT8KLQkJCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCQlDTUdyb3VwSW1wbCBnRCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJCQkJaWYgKGdEID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vICAgYXBwZW5kIEQgdG8gQi4KLQkJCQkJZ0IuYXBwZW5kQ2hpbGQoZ0QpOwotCi0JCQkJCS8vICAgYXBwZW5kIGJhc2UgdG8gRAotCQkJCQlnRC5hcHBlbmRDaGlsZChiYXNlKTsKLQkJCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gRC4KLQkJCQkJZ0QuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY3JlYXRlIEMgYW5kIGFwcGVuZCBpdCB0byBBCi0JCQl7Ci0JCQkJLy8gQyBpcyBhIHNlcXVlbmNlIG9mIGJhc2UsICVoZWFkLm1pc2M7LCBhbmQgRQotCQkJCS8vIEM6IChiYXNlLCAlaGVhZC5taXNjOywgRSkKLQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJQ01Hcm91cEltcGwgZ0MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJaWYgKGdDID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkvLyAgIGFwcGVuZCBDIHRvIEEuCi0JCQkJZ0EuYXBwZW5kQ2hpbGQoZ0MpOwotCi0JCQkJLy8gICBhcHBlbmQgYmFzZSB0byBDCi0JCQkJZ0MuYXBwZW5kQ2hpbGQoYmFzZSk7Ci0JCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gQwotCQkJCWdDLmFwcGVuZENoaWxkKG1pc2MpOwotCi0JCQkJLy8gICBjcmVhdGUgRSBhbmQgYXBwZW5kIGl0IHRvIEMuCi0JCQkJewotCQkJCQkvLyBFIGlzIGEgc2VxdWVuY2Ugb2YgdGl0bGUgYW5kICVoZWFkLm1pc2M7LgotCQkJCQkvLyBFOiAodGl0bGUsICVoZWFkLm1pc2M7KQotCQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJCUNNR3JvdXBJbXBsIGdFID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCQlpZiAoZ0UgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJLy8gICBhcHBlbmQgRSB0byBDLgotCQkJCQlnQy5hcHBlbmRDaGlsZChnRSk7Ci0KLQkJCQkJLy8gICBhcHBlbmQgdGl0bGUgdG8gRQotCQkJCQlnRS5hcHBlbmRDaGlsZCh0aXRsZSk7Ci0JCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEUuCi0JCQkJCWdFLmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC48YnI+Ci0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5Db21wbGV4VHlwZURlZmluaXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hFQUQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSHRtbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIdG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZGI1NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIdG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgPGNvZGU+SFRNTDwvY29kZT4uPGJyPgotICogQ29udGVudCBNb2RlbDoKLSAqIEhFQUQsIChGUkFNRVNFVHxCT0RZKTxicj4KLSAqLwotZmluYWwgY2xhc3MgQ3RkSHRtbCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ3RkSHRtbChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRDsKLQl9Ci0KLQkvKioKLQkgKiAoJWh0bWwuY29udGVudDspLgotCSAqICVodG1sLmNvbnRlbnQ7IGlzIEhFQUQsIChGUkFNRVNFVCB8IEJPRFkpLgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ29tcGxleFR5cGVEZWZpbml0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEhFQUQKLQkJQ01Ob2RlIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkJLy8gKCB8ICkKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBGUkFNRVNFVCwgQk9EWQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ29tcGxleFR5cGVEZWZpbml0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSFRNTDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRJbmxpbmVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGMzYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRJbmxpbmVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgKCVpbmxpbmU7KSouCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZElubGluZUNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkSW5saW5lQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoJWlubGluZSkqLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ29tcGxleFR5cGVEZWZpbml0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQuY29udGVudG1vZGVsLmh0bWwuQ29tcGxleFR5cGVEZWZpbml0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRMaUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRMaUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjhjYjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ3RkTGlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogTGlzdCBpdGVtIGNvbnRhaW5lci4KLSAqIChMSSkrCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZExpQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW5Db2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZExpQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSTsKLQl9Ci0KLQkvKioKLQkgKiAoTEkpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKExJKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCUNNTm9kZSBsaSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJKTsKLQkJaWYgKGxpICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGxpKTsKLQl9Ci0KLQkvKioKLQkgKiBFTEVNRU5UIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTElfQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRPcHRpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmODQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBPUFRJT04gY29udGFpbmVyLgotICogKE9QVElPTikrCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZE9wdGlvbkNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkT3B0aW9uQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JfQotCi0JLyoqCi0JICogKE9QVElPTikrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBPUFRJT04KLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX09QVElPTl9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ3RkU2VsZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0N0ZFNlbGVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTgzYzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvQ3RkU2VsZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBTRUxFQ1QuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFNlbGVjdCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkU2VsZWN0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JfQotCi0JLyoqCi0JICogKE9QVEdST1VQIHwgT1BUSU9OKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChPUFRHUk9VUCB8IE9QVElPTikrLgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1NFTEVDVDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9EZWNsQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9EZWNsQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjgwOWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvRGVjbENvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRHVhbE1hcCB7Ci0JCXB1YmxpYyBEdWFsTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBEdWFsTWFwKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpbml0aWFsaXplKG9iamVjdHMpOwotCQl9Ci0KLQkJcHVibGljIGludCBzaXplKCkgewotCQkJcmV0dXJuIHRhYmxlLmxlbmd0aDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoaW50IGtleSkgewotCQkJaWYgKCFpc1ZhbGlkSW5kZXgoa2V5KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiB0YWJsZVtrZXldOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRLZXkoT2JqZWN0IHZhbHVlKSB7Ci0JCQlJbnRlZ2VyIGtleU9iaiA9IChJbnRlZ2VyKSBtYXAuZ2V0KHZhbHVlKTsKLQkJCWlmIChrZXlPYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gSURfVU5LTk9XTjsKLQkJCXJldHVybiBrZXlPYmouaW50VmFsdWUoKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoT2JqZWN0W10gb2JqZWN0cykgewotCQkJaWYgKG9iamVjdHMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl0YWJsZSA9IG9iamVjdHM7Ci0JCQltYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQga2V5ID0gMDsga2V5IDwgb2JqZWN0cy5sZW5ndGg7IGtleSsrKSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gdGFibGVba2V5XTsKLQkJCQltYXAucHV0KHZhbHVlLCBuZXcgSW50ZWdlcihrZXkpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgT2JqZWN0W10gdGFibGUgPSBudWxsOwotCQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbnVsbDsKLQotCQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZEluZGV4KGludCBpbmRleCkgewotCQkJcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCB0YWJsZS5sZW5ndGg7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVG9sZXJhbnRTdHJpbmdEdWFsTWFwIGV4dGVuZHMgRHVhbE1hcCB7Ci0JCXB1YmxpYyBUb2xlcmFudFN0cmluZ0R1YWxNYXAoU3RyaW5nW10gbmFtZXMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFtuYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCW9iamVjdHNbaV0gPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lc1tpXSk7Ci0JCQl9Ci0JCQlpbml0aWFsaXplKG9iamVjdHMpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRLZXkoT2JqZWN0IHZhbHVlKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEtleShtYWtlQ2Fub25pY2FsRm9ybShuYW1lKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gSURfVU5LTk9XTjsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIG1ha2VDYW5vbmljYWxGb3JtKFN0cmluZyByYXcpIHsKLQkJCXJldHVybiByYXcudG9VcHBlckNhc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRGVjbEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwdWJsaWMgRGVjbEl0ZXJhdG9yKCkgewotCQkJbWF4aWQgPSBmRGVjbHMubGVuZ3RoIC0gMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gaWQgPCBtYXhpZDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCWlmICghaGFzTmV4dCgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGl0ZW0oKytpZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7IC8qIG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUuICovCi0JCX0KLQotCQlwcml2YXRlIGludCBpZCA9IC0xOwotCQlwcml2YXRlIGludCBtYXhpZCA9IC0xOwotCX0KLQotCUNNTm9kZVtdIGZEZWNscyA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFNUUklDVF9DQVNFID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFRPTEVSQU5UX0NBU0UgPSB0cnVlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IElEX1VOS05PV04gPSAtMTsKLQlwcml2YXRlIER1YWxNYXAgZk1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRGVjbENvbGxlY3Rpb24oU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gdG9sZXJhbnQpIHsKLQkJc3VwZXIoKTsKLQkJZkRlY2xzID0gbmV3IENNTm9kZVtuYW1lcy5sZW5ndGhdOwotCQlpZiAodG9sZXJhbnQpIHsKLQkJCWZNYXAgPSBuZXcgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKG5hbWVzKTsKLQkJfQotCQllbHNlIHsKLQkJCWZNYXAgPSBuZXcgRHVhbE1hcChuYW1lcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBpZCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RGVjbGFyYXRpb25zKFN0cmluZ1tdIG5hbWVzKSB7Ci0JCUNNTmFtZWROb2RlTWFwSW1wbCBtYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gbmFtZXNbaV07Ci0JCQlDTU5vZGUgbm9kZSA9IGdldE5hbWVkSXRlbShuYW1lKTsKLQkJCWlmIChub2RlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQltYXAucHV0TmFtZWRJdGVtKG5hbWUsIG5vZGUpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlY2xhcmF0aW9ucyBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5DTUdyb3VwSW1wbAotCSAqIEBwYXJhbSBuYW1lcyBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXREZWNsYXJhdGlvbnMoQ01Hcm91cEltcGwgZ3JvdXAsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOwotCQkJQ01Ob2RlIGRlYyA9IGdldE5hbWVkSXRlbShlbnRpdHlOYW1lKTsKLQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFwIG5hbWUgdG8gaWQuCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRJRChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZk1hcC5nZXRLZXkobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmRGVjbHMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpZCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoaW50IGlkKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBmTWFwLmdldFZhbHVlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQobmFtZSk7Ci0JCWlmICghaXNWYWxpZElEKGlkKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaXRlbShpZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGlkIGludAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSUQoaW50IGlkKSB7Ci0JCXJldHVybiBpZCA+PSAwICYmIGlkIDwgZkRlY2xzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1ZhbGlkSUQoaW5kZXgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNTm9kZSBkZWNsID0gZkRlY2xzW2luZGV4XTsKLQkJaWYgKGRlY2wgIT0gbnVsbCkKLQkJCXJldHVybiBkZWNsOyAvLyBhbHJlYWR5IGV4aXN0LgotCi0JCWRlY2wgPSBjcmVhdGUoZ2V0TmFtZShpbmRleCkpOwotCQlmRGVjbHNbaW5kZXhdID0gZGVjbDsKLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IERlY2xJdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NDgwNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9FbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCi0KLQkvLyBFbGVtZW50IElEcwotCXByaXZhdGUgc3RhdGljIGNsYXNzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0EgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRERSRVNTID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkFTRSA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JMT0NLUVVPVEUgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CT0RZID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlIgPSA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DRU5URVIgPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERCA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUiA9IDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJViA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RMID0gMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RUID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUk0gPSAxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDEgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDIgPSAxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDMgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDQgPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDUgPSAxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDYgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBRCA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IUiA9IDIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IVE1MID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lNRyA9IDIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlBVVCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MSSA9IDI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NRU5VID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01FVEEgPSAyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0wgPSAyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1BUSU9OID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1AgPSAyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJFID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NFTEVDVCA9IDMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9URVhUQVJFQSA9IDMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USVRMRSA9IDMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTCA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfQ09ORklHID0gMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9FQ0hPID0gMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9FWEVDID0gMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9GU0laRSA9IDM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRkxBU1RNT0QgPSAzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0lOQ0xVREUgPSA0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX1BSSU5URU5WID0gNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9TRVQgPSA0MjsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8qKiAlZm9ybWN0bDsuIElOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGT1JNQ1RMID0ge0lOUFVULCBTRUxFQ1QsIFRFWFRBUkVBfTsKLQkvKiogJXBocmFzZTsuCi0JICogREZOCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEhSQVNFID0ge0RGTn07Ci0JLyoqICVzcGVjaWFsOy4KLQkgKiBBIHwgSU1HIHwgQlIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTUEVDSUFMID0ge0EsIElNRywgQlJ9OwotCS8qKiAlaGVhZGluZzsuIEhbMS02XSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhFQURJTkcgPSB7SDEsIEgyLCBIMywgSDQsIEg1LCBINn07Ci0JLyoqICVsaXN0Oy4gVUwgfCBPTCB8IERJUiB8IE1FTlUgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMSVNUID0ge1VMLCBPTCwgRElSLCBNRU5VfTsKLQkvKiogJXByZWZvcm1hdHRlZDsuIFBSRSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBSRUZPUk1BVFRFRCA9IHtQUkV9OwotCXByaXZhdGUgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVDb2xsZWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfQV0gPSBBOwotCQluYW1lc1tJZHMuSURfQUREUkVTU10gPSBBRERSRVNTOwotCQluYW1lc1tJZHMuSURfQkFTRV0gPSBCQVNFOwotCQluYW1lc1tJZHMuSURfQkxPQ0tRVU9URV0gPSBCTE9DS1FVT1RFOwotCQluYW1lc1tJZHMuSURfQk9EWV0gPSBCT0RZOwotCQluYW1lc1tJZHMuSURfQlJdID0gQlI7Ci0JCW5hbWVzW0lkcy5JRF9DRU5URVJdID0gQ0VOVEVSOwotCQluYW1lc1tJZHMuSURfRERdID0gREQ7Ci0JCW5hbWVzW0lkcy5JRF9ESVJdID0gRElSOwotCQluYW1lc1tJZHMuSURfRElWXSA9IERJVjsKLQkJbmFtZXNbSWRzLklEX0RMXSA9IERMOwotCQluYW1lc1tJZHMuSURfRFRdID0gRFQ7Ci0JCW5hbWVzW0lkcy5JRF9GT1JNXSA9IEZPUk07Ci0JCW5hbWVzW0lkcy5JRF9IMV0gPSBIMTsKLQkJbmFtZXNbSWRzLklEX0gyXSA9IEgyOwotCQluYW1lc1tJZHMuSURfSDNdID0gSDM7Ci0JCW5hbWVzW0lkcy5JRF9INF0gPSBINDsKLQkJbmFtZXNbSWRzLklEX0g1XSA9IEg1OwotCQluYW1lc1tJZHMuSURfSDZdID0gSDY7Ci0JCW5hbWVzW0lkcy5JRF9IRUFEXSA9IEhFQUQ7Ci0JCW5hbWVzW0lkcy5JRF9IUl0gPSBIUjsKLQkJbmFtZXNbSWRzLklEX0hUTUxdID0gSFRNTDsKLQkJbmFtZXNbSWRzLklEX0lNR10gPSBJTUc7Ci0JCW5hbWVzW0lkcy5JRF9JTlBVVF0gPSBJTlBVVDsKLQkJbmFtZXNbSWRzLklEX0xJXSA9IExJOwotCQluYW1lc1tJZHMuSURfTUVOVV0gPSBNRU5VOwotCQluYW1lc1tJZHMuSURfTUVUQV0gPSBNRVRBOwotCQluYW1lc1tJZHMuSURfT0xdID0gT0w7Ci0JCW5hbWVzW0lkcy5JRF9PUFRJT05dID0gT1BUSU9OOwotCQluYW1lc1tJZHMuSURfUF0gPSBQOwotCQluYW1lc1tJZHMuSURfUFJFXSA9IFBSRTsKLQkJbmFtZXNbSWRzLklEX1NFTEVDVF0gPSBTRUxFQ1Q7Ci0JCW5hbWVzW0lkcy5JRF9URVhUQVJFQV0gPSBURVhUQVJFQTsKLQkJbmFtZXNbSWRzLklEX1RJVExFXSA9IFRJVExFOwotCQluYW1lc1tJZHMuSURfVUxdID0gVUw7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfQ09ORklHXSA9IFNTSV9DT05GSUc7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfRUNIT10gPSBTU0lfRUNITzsKLQkJbmFtZXNbSWRzLklEX1NTSV9FWEVDXSA9IFNTSV9FWEVDOwotCQluYW1lc1tJZHMuSURfU1NJX0ZTSVpFXSA9IFNTSV9GU0laRTsKLQkJbmFtZXNbSWRzLklEX1NTSV9GTEFTVE1PRF0gPSBTU0lfRkxBU1RNT0Q7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfSU5DTFVERV0gPSBTU0lfSU5DTFVERTsKLQkJbmFtZXNbSWRzLklEX1NTSV9QUklOVEVOVl0gPSBTU0lfUFJJTlRFTlY7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfU0VUXSA9IFNTSV9TRVQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnRDb2xsZWN0aW9uKEF0dHJpYnV0ZUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihuYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEFjdHVhbGx5IGNyZWF0ZXMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJSFRNTEVsZW1EZWNsSW1wbCBlZGVjID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBRERSRVNTKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBRERSRVNTKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCQVNFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCQVNFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCTE9DS1FVT1RFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCTE9DS1FVT1RFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCT0RZKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCT0RZKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQlIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENFTlRFUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ0VOVEVSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkREQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERJUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVOVShESVIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShESVYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERJVih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShEVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRFQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZPUk0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZPUk0odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgxKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgxLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg0KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg0LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhFQUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhFQUQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSFRNTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU1HKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJTUcodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElOUFVUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJTlBVVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZExJKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRU5VKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRU5VKE1FTlUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRVRBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT0wodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9QVElPTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT1BUSU9OKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQUkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBSRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTRUxFQ1QodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRFWFRBUkVBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRURVhUQVJFQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVElUTEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRJVExFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShVTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9DT05GSUcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUNvbmZpZyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0VDSE8pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUVjaG8odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9FWEVDKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lFeGVjKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRlNJWkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUZzaXplKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRkxBU1RNT0QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUZsYXN0bW9kKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfSU5DTFVERSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJSW5jbHVkZSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX1BSSU5URU5WKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lQcmludGVudih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX1NFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJU2V0KHRoaXMpOwotCi0JCX0gLy8gdW5rbm93bgotCQllbHNlIHsKLQkJCS8vIE5PVEU6IFdlIGRvbid0IGRlZmluZSB0aGUgVU5LTk9XTiBlbGVtZW50IGRlY2xhcmF0aW9uLgotCQkJLy8gPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgZGVjbGFyYXRpb24gaXMgYSBzaWduIG9mCi0JCQkvLyB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgdW5rbm93bi4KLQkJCS8vIC0tIDMvOS8yMDAxCi0JCQllZGVjID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZWRlYzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkF0dHJpYnV0ZUNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gYXR0cmlidXRlQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgQ29sbGVjdGlvbiBnZXROYW1lc09mQmxvY2soKSB7Ci0JCS8vIFAgfCAlbGlzdCB8ICVwcmVmb3JtYXR0ZWQgfCBETCB8IERJViB8IENFTlRFUiB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSFIKLQkJU3RyaW5nW10gYmxvY2tNaXNjID0ge1AsIERMLCBESVYsIENFTlRFUiwgQkxPQ0tRVU9URSwgRk9STSwgSFIsfTsKLQkJVmVjdG9yIGJsb2NrTmFtZXMgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QoYmxvY2tNaXNjKSk7Ci0JCS8vICVoZWFkaW5nOwotCQlibG9ja05hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KEhFQURJTkcpKTsKLQkJLy8gJWxpc3Q7Ci0JCWJsb2NrTmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoTElTVCkpOwotCQkvLyAlcHJlZm9ybWF0dGVkOwotCQlibG9ja05hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KFBSRUZPUk1BVFRFRCkpOwotCi0JCXJldHVybiBibG9ja05hbWVzOwotCX0KLQotCS8qKgotCSAqICVibG9jazsuCi0JICogJWJsb2NrOyBpczoKLQkgKiBQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0JICogTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLQkgKiBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUy48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0QmxvY2soQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgZ2V0TmFtZXNPZkJsb2NrKCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtCi0JICogaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGbG93KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRCbG9jayhncm91cCk7Ci0JCWdldElubGluZShncm91cCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0Rm9udHN0eWxlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGb3JtY3RybChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEZPUk1DVEwpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqICVoZWFkaW5nOy4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRIZWFkaW5nKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChIRUFESU5HKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0KLQkgKiBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+IGluc3RhbmNlLgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldElubGluZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0Rm9udHN0eWxlKGdyb3VwKTsKLQkJZ2V0UGhyYXNlKGdyb3VwKTsKLQkJZ2V0U3BlY2lhbChncm91cCk7Ci0JCWdldEZvcm1jdHJsKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiAlbGlzdDsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0TGlzdChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoTElTVCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0UGhyYXNlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUEhSQVNFKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlcHJlZm9ybWF0dGVkOwotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFByZWZvcm1hdHRlZChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUFJFRk9STUFUVEVEKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRTcGVjaWFsKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoU1BFQ0lBTCkuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvRW50aXR5Q29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTA5MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbnRpdHkgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbnRpdHlDb2xsZWN0aW9uIGV4dGVuZHMgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZS5FbnRpdHlOYW1lIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUFDVVRFX0wgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQUNVVEVfVSA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDSVJDX0wgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ0lSQ19VID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNVVEUgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRUxJR19MID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUVMSUdfVSA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FHUkFWRV9MID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUdSQVZFX1UgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTEVGU1lNID0gOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxQSEFfTCA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTFBIQV9VID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FNUCA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTkQgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU5HID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FSSU5HX0wgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJJTkdfVSA9IDE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BU1lNUCA9IDE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfTCA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfVSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVU1MX0wgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVNTF9VID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JEUVVPID0gMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JFVEFfTCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRVRBX1UgPSAyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlJWQkFSID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JVTEwgPSAyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0FQID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9MID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9VID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFRElMID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFTlQgPSAzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX0wgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX1UgPSAzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0lSQyA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DTFVCUyA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT05HID0gMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPUFkgPSAzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1JBUlIgPSAzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VQID0gMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NVUlJFTiA9IDQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfTCA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfVSA9IDQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQVJSX0wgPSA0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFSUl9VID0gNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFRyA9IDQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUxUQV9MID0gNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTFRBX1UgPSA0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElBTVMgPSA0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElWSURFID0gNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9MID0gNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9VID0gNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VDSVJDX0wgPSA1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUNJUkNfVSA9IDUzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfTCA9IDU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfVSA9IDU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVBUWSA9IDU2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVNQID0gNTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VOU1AgPSA1ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVBTSUxPTl9MID0gNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VQU0lMT05fVSA9IDYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUVVJViA9IDYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfTCA9IDYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfVSA9IDYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfTCA9IDY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfVSA9IDY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVU1MX0wgPSA2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVNTF9VID0gNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVUk8gPSA2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVhJU1QgPSA2OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk5PRiA9IDcwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT1JBTEwgPSA3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzEyID0gNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMxNCA9IDczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMzQgPSA3NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBU0wgPSA3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0FNTUFfTCA9IDc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HQU1NQV9VID0gNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFID0gNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dUID0gNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hBUlJfTCA9IDgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IQVJSX1UgPSA4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBUlRTID0gODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFTExJUCA9IDgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfTCA9IDg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfVSA9IDg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQ0lSQ19MID0gODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lDSVJDX1UgPSA4NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUVYQ0wgPSA4ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX0wgPSA4OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX1UgPSA5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1BR0UgPSA5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5GSU4gPSA5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5UID0gOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lPVEFfTCA9IDk0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JT1RBX1UgPSA5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVFVRVNUID0gOTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lTSU4gPSA5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVVNTF9MID0gOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lVTUxfVSA9IDk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9MID0gMTAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9VID0gMTAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU1CREFfTCA9IDEwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFNQkRBX1UgPSAxMDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTkcgPSAxMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUVVPID0gMTA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVJSX0wgPSAxMDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUlJfVSA9IDEwNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTENFSUwgPSAxMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xEUVVPID0gMTA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRSA9IDExMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEZMT09SID0gMTExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MT1dBU1QgPSAxMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xPWiA9IDExMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFJNID0gMTE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MU0FRVU8gPSAxMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xTUVVPID0gMTE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MVCA9IDExNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUFDUiA9IDExODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTURBU0ggPSAxMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JQ1JPID0gMTIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSURET1QgPSAxMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JTlVTID0gMTIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9MID0gMTIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9VID0gMTI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OQUJMQSA9IDEyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkJTUCA9IDEyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkRBU0ggPSAxMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05FID0gMTI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OSSA9IDEyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9UID0gMTMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT1RJTiA9IDEzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlNVQiA9IDEzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlRJTERFX0wgPSAxMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05USUxERV9VID0gMTM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9MID0gMTM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9VID0gMTM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQUNVVEVfTCA9IDEzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0FDVVRFX1UgPSAxMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX0wgPSAxMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX1UgPSAxNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX0wgPSAxNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX1UgPSAxNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09HUkFWRV9MID0gMTQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PR1JBVkVfVSA9IDE0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0xJTkUgPSAxNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX0wgPSAxNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX1UgPSAxNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NSUNST05fTCA9IDE0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01JQ1JPTl9VID0gMTQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUExVUyA9IDE1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1IgPSAxNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SREYgPSAxNTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SRE0gPSAxNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09TTEFTSF9MID0gMTU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PU0xBU0hfVSA9IDE1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTERFX0wgPSAxNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USUxERV9VID0gMTU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElNRVMgPSAxNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VTUxfTCA9IDE1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VNTF9VID0gMTYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBID0gMTYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJUID0gMTYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QRVJNSUwgPSAxNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BFUlAgPSAxNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BISV9MID0gMTY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSElfVSA9IDE2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElWID0gMTY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9MID0gMTY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9VID0gMTY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QTFVTTU4gPSAxNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BPVU5EID0gMTcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9MID0gMTcyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9VID0gMTczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9EID0gMTc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9QID0gMTc1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QU0lfTCA9IDE3NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFNJX1UgPSAxNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1FVT1QgPSAxNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBRElDID0gMTc5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQU5HID0gMTgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVFVTyA9IDE4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFSUl9MID0gMTgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVJSX1UgPSAxODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JDRUlMID0gMTg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRFFVTyA9IDE4NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVBTCA9IDE4NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVHID0gMTg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRkxPT1IgPSAxODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JIT19MID0gMTg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SSE9fVSA9IDE5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkxNID0gMTkxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SU0FRVU8gPSAxOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JTUVVPID0gMTkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQlFVTyA9IDE5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NBUk9OX0wgPSAxOTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDQVJPTl9VID0gMTk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRE9UID0gMTk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRUNUID0gMTk4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSFkgPSAxOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BRiA9IDIwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfTCA9IDIwMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfVSA9IDIwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lNID0gMjAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TUEFERVMgPSAyMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVQiA9IDIwNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCRSA9IDIwNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VNID0gMjA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAgPSAyMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDEgPSAyMDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDIgPSAyMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDMgPSAyMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUEUgPSAyMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NaTElHID0gMjEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQVVfTCA9IDIxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEFVX1UgPSAyMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVJFNCA9IDIxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFTWU0gPSAyMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX0wgPSAyMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX1UgPSAyMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RISU5TUCA9IDIyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fTCA9IDIyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fVSA9IDIyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElMREUgPSAyMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJTUVTID0gMjI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UUkFERSA9IDIyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFDVVRFX0wgPSAyMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBQ1VURV9VID0gMjI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQVJSX0wgPSAyMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBUlJfVSA9IDIyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfTCA9IDIzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfVSA9IDIzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUdSQVZFX0wgPSAyMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VHUkFWRV9VID0gMjMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTUwgPSAyMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lIID0gMjM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJTE9OX0wgPSAyMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lMT05fVSA9IDIzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVVNTF9MID0gMjM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VVU1MX1UgPSAyMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1dFSUVSUCA9IDI0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfTCA9IDI0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfVSA9IDI0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUFDVVRFX0wgPSAyNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lBQ1VURV9VID0gMjQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZRU4gPSAyNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lVTUxfTCA9IDI0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWVVNTF9VID0gMjQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aRVRBX0wgPSAyNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pFVEFfVSA9IDI0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWldKID0gMjUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aV05KID0gMjUxOwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMjUyLgotCQkJLy8gLS0gNS8yNC8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX0FBQ1VURV9MXSA9IEFBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfQUFDVVRFX1VdID0gQUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19MXSA9IEFDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19VXSA9IEFDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ1VURV0gPSBBQ1VURTsKLQkJbmFtZXNbSWRzLklEX0FFTElHX0xdID0gQUVMSUdfTDsKLQkJbmFtZXNbSWRzLklEX0FFTElHX1VdID0gQUVMSUdfVTsKLQkJbmFtZXNbSWRzLklEX0FHUkFWRV9MXSA9IEFHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfQUdSQVZFX1VdID0gQUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTEVGU1lNXSA9IEFMRUZTWU07Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9MXSA9IEFMUEhBX0w7Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9VXSA9IEFMUEhBX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTVBdID0gQU1QOwotCQluYW1lc1tJZHMuSURfQU5EXSA9IEFORDsKLQkJbmFtZXNbSWRzLklEX0FOR10gPSBBTkc7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19MXSA9IEFSSU5HX0w7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19VXSA9IEFSSU5HX1U7Ci0JCW5hbWVzW0lkcy5JRF9BU1lNUF0gPSBBU1lNUDsKLQkJbmFtZXNbSWRzLklEX0FUSUxERV9MXSA9IEFUSUxERV9MOwotCQluYW1lc1tJZHMuSURfQVRJTERFX1VdID0gQVRJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BVU1MX0xdID0gQVVNTF9MOwotCQluYW1lc1tJZHMuSURfQVVNTF9VXSA9IEFVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0JEUVVPXSA9IEJEUVVPOwotCQluYW1lc1tJZHMuSURfQkVUQV9MXSA9IEJFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0JFVEFfVV0gPSBCRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9CUlZCQVJdID0gQlJWQkFSOwotCQluYW1lc1tJZHMuSURfQlVMTF0gPSBCVUxMOwotCQluYW1lc1tJZHMuSURfQ0FQXSA9IENBUDsKLQkJbmFtZXNbSWRzLklEX0NDRURJTF9MXSA9IENDRURJTF9MOwotCQluYW1lc1tJZHMuSURfQ0NFRElMX1VdID0gQ0NFRElMX1U7Ci0JCW5hbWVzW0lkcy5JRF9DRURJTF0gPSBDRURJTDsKLQkJbmFtZXNbSWRzLklEX0NFTlRdID0gQ0VOVDsKLQkJbmFtZXNbSWRzLklEX0NISV9MXSA9IENISV9MOwotCQluYW1lc1tJZHMuSURfQ0hJX1VdID0gQ0hJX1U7Ci0JCW5hbWVzW0lkcy5JRF9DSVJDXSA9IENJUkM7Ci0JCW5hbWVzW0lkcy5JRF9DTFVCU10gPSBDTFVCUzsKLQkJbmFtZXNbSWRzLklEX0NPTkddID0gQ09ORzsKLQkJbmFtZXNbSWRzLklEX0NPUFldID0gQ09QWTsKLQkJbmFtZXNbSWRzLklEX0NSQVJSXSA9IENSQVJSOwotCQluYW1lc1tJZHMuSURfQ1VQXSA9IENVUDsKLQkJbmFtZXNbSWRzLklEX0NVUlJFTl0gPSBDVVJSRU47Ci0JCW5hbWVzW0lkcy5JRF9EQUdHRVJfTF0gPSBEQUdHRVJfTDsKLQkJbmFtZXNbSWRzLklEX0RBR0dFUl9VXSA9IERBR0dFUl9VOwotCQluYW1lc1tJZHMuSURfREFSUl9MXSA9IERBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0RBUlJfVV0gPSBEQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9ERUddID0gREVHOwotCQluYW1lc1tJZHMuSURfREVMVEFfTF0gPSBERUxUQV9MOwotCQluYW1lc1tJZHMuSURfREVMVEFfVV0gPSBERUxUQV9VOwotCQluYW1lc1tJZHMuSURfRElBTVNdID0gRElBTVM7Ci0JCW5hbWVzW0lkcy5JRF9ESVZJREVdID0gRElWSURFOwotCQluYW1lc1tJZHMuSURfRUFDVVRFX0xdID0gRUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9FQUNVVEVfVV0gPSBFQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX0xdID0gRUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX1VdID0gRUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0VHUkFWRV9MXSA9IEVHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfRUdSQVZFX1VdID0gRUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9FTVBUWV0gPSBFTVBUWTsKLQkJbmFtZXNbSWRzLklEX0VNU1BdID0gRU1TUDsKLQkJbmFtZXNbSWRzLklEX0VOU1BdID0gRU5TUDsKLQkJbmFtZXNbSWRzLklEX0VQU0lMT05fTF0gPSBFUFNJTE9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9FUFNJTE9OX1VdID0gRVBTSUxPTl9VOwotCQluYW1lc1tJZHMuSURfRVFVSVZdID0gRVFVSVY7Ci0JCW5hbWVzW0lkcy5JRF9FVEFfTF0gPSBFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0VUQV9VXSA9IEVUQV9VOwotCQluYW1lc1tJZHMuSURfRVRIX0xdID0gRVRIX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVEhfVV0gPSBFVEhfVTsKLQkJbmFtZXNbSWRzLklEX0VVTUxfTF0gPSBFVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVU1MX1VdID0gRVVNTF9VOwotCQluYW1lc1tJZHMuSURfRVVST10gPSBFVVJPOwotCQluYW1lc1tJZHMuSURfRVhJU1RdID0gRVhJU1Q7Ci0JCW5hbWVzW0lkcy5JRF9GTk9GXSA9IEZOT0Y7Ci0JCW5hbWVzW0lkcy5JRF9GT1JBTExdID0gRk9SQUxMOwotCQluYW1lc1tJZHMuSURfRlJBQzEyXSA9IEZSQUMxMjsKLQkJbmFtZXNbSWRzLklEX0ZSQUMxNF0gPSBGUkFDMTQ7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMzRdID0gRlJBQzM0OwotCQluYW1lc1tJZHMuSURfRlJBU0xdID0gRlJBU0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9MXSA9IEdBTU1BX0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9VXSA9IEdBTU1BX1U7Ci0JCW5hbWVzW0lkcy5JRF9HRV0gPSBHRTsKLQkJbmFtZXNbSWRzLklEX0dUXSA9IEdUOwotCQluYW1lc1tJZHMuSURfSEFSUl9MXSA9IEhBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0hBUlJfVV0gPSBIQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9IRUFSVFNdID0gSEVBUlRTOwotCQluYW1lc1tJZHMuSURfSEVMTElQXSA9IEhFTExJUDsKLQkJbmFtZXNbSWRzLklEX0lBQ1VURV9MXSA9IElBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfSUFDVVRFX1VdID0gSUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19MXSA9IElDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19VXSA9IElDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9JRVhDTF0gPSBJRVhDTDsKLQkJbmFtZXNbSWRzLklEX0lHUkFWRV9MXSA9IElHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfSUdSQVZFX1VdID0gSUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JTUFHRV0gPSBJTUFHRTsKLQkJbmFtZXNbSWRzLklEX0lORklOXSA9IElORklOOwotCQluYW1lc1tJZHMuSURfSU5UXSA9IElOVDsKLQkJbmFtZXNbSWRzLklEX0lPVEFfTF0gPSBJT1RBX0w7Ci0JCW5hbWVzW0lkcy5JRF9JT1RBX1VdID0gSU9UQV9VOwotCQluYW1lc1tJZHMuSURfSVFVRVNUXSA9IElRVUVTVDsKLQkJbmFtZXNbSWRzLklEX0lTSU5dID0gSVNJTjsKLQkJbmFtZXNbSWRzLklEX0lVTUxfTF0gPSBJVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9JVU1MX1VdID0gSVVNTF9VOwotCQluYW1lc1tJZHMuSURfS0FQUEFfTF0gPSBLQVBQQV9MOwotCQluYW1lc1tJZHMuSURfS0FQUEFfVV0gPSBLQVBQQV9VOwotCQluYW1lc1tJZHMuSURfTEFNQkRBX0xdID0gTEFNQkRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9MQU1CREFfVV0gPSBMQU1CREFfVTsKLQkJbmFtZXNbSWRzLklEX0xBTkddID0gTEFORzsKLQkJbmFtZXNbSWRzLklEX0xBUVVPXSA9IExBUVVPOwotCQluYW1lc1tJZHMuSURfTEFSUl9MXSA9IExBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0xBUlJfVV0gPSBMQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQ0VJTF0gPSBMQ0VJTDsKLQkJbmFtZXNbSWRzLklEX0xEUVVPXSA9IExEUVVPOwotCQluYW1lc1tJZHMuSURfTEVdID0gTEU7Ci0JCW5hbWVzW0lkcy5JRF9MRkxPT1JdID0gTEZMT09SOwotCQluYW1lc1tJZHMuSURfTE9XQVNUXSA9IExPV0FTVDsKLQkJbmFtZXNbSWRzLklEX0xPWl0gPSBMT1o7Ci0JCW5hbWVzW0lkcy5JRF9MUk1dID0gTFJNOwotCQluYW1lc1tJZHMuSURfTFNBUVVPXSA9IExTQVFVTzsKLQkJbmFtZXNbSWRzLklEX0xTUVVPXSA9IExTUVVPOwotCQluYW1lc1tJZHMuSURfTFRdID0gTFQ7Ci0JCW5hbWVzW0lkcy5JRF9NQUNSXSA9IE1BQ1I7Ci0JCW5hbWVzW0lkcy5JRF9NREFTSF0gPSBNREFTSDsKLQkJbmFtZXNbSWRzLklEX01JQ1JPXSA9IE1JQ1JPOwotCQluYW1lc1tJZHMuSURfTUlERE9UXSA9IE1JRERPVDsKLQkJbmFtZXNbSWRzLklEX01JTlVTXSA9IE1JTlVTOwotCQluYW1lc1tJZHMuSURfTVVfTF0gPSBNVV9MOwotCQluYW1lc1tJZHMuSURfTVVfVV0gPSBNVV9VOwotCQluYW1lc1tJZHMuSURfTkFCTEFdID0gTkFCTEE7Ci0JCW5hbWVzW0lkcy5JRF9OQlNQXSA9IE5CU1A7Ci0JCW5hbWVzW0lkcy5JRF9OREFTSF0gPSBOREFTSDsKLQkJbmFtZXNbSWRzLklEX05FXSA9IE5FOwotCQluYW1lc1tJZHMuSURfTkldID0gTkk7Ci0JCW5hbWVzW0lkcy5JRF9OT1RdID0gTk9UOwotCQluYW1lc1tJZHMuSURfTk9USU5dID0gTk9USU47Ci0JCW5hbWVzW0lkcy5JRF9OU1VCXSA9IE5TVUI7Ci0JCW5hbWVzW0lkcy5JRF9OVElMREVfTF0gPSBOVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX05USUxERV9VXSA9IE5USUxERV9VOwotCQluYW1lc1tJZHMuSURfTlVfTF0gPSBOVV9MOwotCQluYW1lc1tJZHMuSURfTlVfVV0gPSBOVV9VOwotCQluYW1lc1tJZHMuSURfT0FDVVRFX0xdID0gT0FDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PQUNVVEVfVV0gPSBPQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX09DSVJDX0xdID0gT0NJUkNfTDsKLQkJbmFtZXNbSWRzLklEX09DSVJDX1VdID0gT0NJUkNfVTsKLQkJbmFtZXNbSWRzLklEX09FTElHX0xdID0gT0VMSUdfTDsKLQkJbmFtZXNbSWRzLklEX09FTElHX1VdID0gT0VMSUdfVTsKLQkJbmFtZXNbSWRzLklEX09HUkFWRV9MXSA9IE9HUkFWRV9MOwotCQluYW1lc1tJZHMuSURfT0dSQVZFX1VdID0gT0dSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PTElORV0gPSBPTElORTsKLQkJbmFtZXNbSWRzLklEX09NRUdBX0xdID0gT01FR0FfTDsKLQkJbmFtZXNbSWRzLklEX09NRUdBX1VdID0gT01FR0FfVTsKLQkJbmFtZXNbSWRzLklEX09NSUNST05fTF0gPSBPTUlDUk9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9PTUlDUk9OX1VdID0gT01JQ1JPTl9VOwotCQluYW1lc1tJZHMuSURfT1BMVVNdID0gT1BMVVM7Ci0JCW5hbWVzW0lkcy5JRF9PUl0gPSBPUjsKLQkJbmFtZXNbSWRzLklEX09SREZdID0gT1JERjsKLQkJbmFtZXNbSWRzLklEX09SRE1dID0gT1JETTsKLQkJbmFtZXNbSWRzLklEX09TTEFTSF9MXSA9IE9TTEFTSF9MOwotCQluYW1lc1tJZHMuSURfT1NMQVNIX1VdID0gT1NMQVNIX1U7Ci0JCW5hbWVzW0lkcy5JRF9PVElMREVfTF0gPSBPVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX09USUxERV9VXSA9IE9USUxERV9VOwotCQluYW1lc1tJZHMuSURfT1RJTUVTXSA9IE9USU1FUzsKLQkJbmFtZXNbSWRzLklEX09VTUxfTF0gPSBPVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9PVU1MX1VdID0gT1VNTF9VOwotCQluYW1lc1tJZHMuSURfUEFSQV0gPSBQQVJBOwotCQluYW1lc1tJZHMuSURfUEFSVF0gPSBQQVJUOwotCQluYW1lc1tJZHMuSURfUEVSTUlMXSA9IFBFUk1JTDsKLQkJbmFtZXNbSWRzLklEX1BFUlBdID0gUEVSUDsKLQkJbmFtZXNbSWRzLklEX1BISV9MXSA9IFBISV9MOwotCQluYW1lc1tJZHMuSURfUEhJX1VdID0gUEhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9QSVZdID0gUElWOwotCQluYW1lc1tJZHMuSURfUElfTF0gPSBQSV9MOwotCQluYW1lc1tJZHMuSURfUElfVV0gPSBQSV9VOwotCQluYW1lc1tJZHMuSURfUExVU01OXSA9IFBMVVNNTjsKLQkJbmFtZXNbSWRzLklEX1BPVU5EXSA9IFBPVU5EOwotCQluYW1lc1tJZHMuSURfUFJJTUVfTF0gPSBQUklNRV9MOwotCQluYW1lc1tJZHMuSURfUFJJTUVfVV0gPSBQUklNRV9VOwotCQluYW1lc1tJZHMuSURfUFJPRF0gPSBQUk9EOwotCQluYW1lc1tJZHMuSURfUFJPUF0gPSBQUk9QOwotCQluYW1lc1tJZHMuSURfUFNJX0xdID0gUFNJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QU0lfVV0gPSBQU0lfVTsKLQkJbmFtZXNbSWRzLklEX1FVT1RdID0gUVVPVDsKLQkJbmFtZXNbSWRzLklEX1JBRElDXSA9IFJBRElDOwotCQluYW1lc1tJZHMuSURfUkFOR10gPSBSQU5HOwotCQluYW1lc1tJZHMuSURfUkFRVU9dID0gUkFRVU87Ci0JCW5hbWVzW0lkcy5JRF9SQVJSX0xdID0gUkFSUl9MOwotCQluYW1lc1tJZHMuSURfUkFSUl9VXSA9IFJBUlJfVTsKLQkJbmFtZXNbSWRzLklEX1JDRUlMXSA9IFJDRUlMOwotCQluYW1lc1tJZHMuSURfUkRRVU9dID0gUkRRVU87Ci0JCW5hbWVzW0lkcy5JRF9SRUFMXSA9IFJFQUw7Ci0JCW5hbWVzW0lkcy5JRF9SRUddID0gUkVHOwotCQluYW1lc1tJZHMuSURfUkZMT09SXSA9IFJGTE9PUjsKLQkJbmFtZXNbSWRzLklEX1JIT19MXSA9IFJIT19MOwotCQluYW1lc1tJZHMuSURfUkhPX1VdID0gUkhPX1U7Ci0JCW5hbWVzW0lkcy5JRF9STE1dID0gUkxNOwotCQluYW1lc1tJZHMuSURfUlNBUVVPXSA9IFJTQVFVTzsKLQkJbmFtZXNbSWRzLklEX1JTUVVPXSA9IFJTUVVPOwotCQluYW1lc1tJZHMuSURfU0JRVU9dID0gU0JRVU87Ci0JCW5hbWVzW0lkcy5JRF9TQ0FST05fTF0gPSBTQ0FST05fTDsKLQkJbmFtZXNbSWRzLklEX1NDQVJPTl9VXSA9IFNDQVJPTl9VOwotCQluYW1lc1tJZHMuSURfU0RPVF0gPSBTRE9UOwotCQluYW1lc1tJZHMuSURfU0VDVF0gPSBTRUNUOwotCQluYW1lc1tJZHMuSURfU0hZXSA9IFNIWTsKLQkJbmFtZXNbSWRzLklEX1NJR01BRl0gPSBTSUdNQUY7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9MXSA9IFNJR01BX0w7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9VXSA9IFNJR01BX1U7Ci0JCW5hbWVzW0lkcy5JRF9TSU1dID0gU0lNOwotCQluYW1lc1tJZHMuSURfU1BBREVTXSA9IFNQQURFUzsKLQkJbmFtZXNbSWRzLklEX1NVQl0gPSBTVUI7Ci0JCW5hbWVzW0lkcy5JRF9TVUJFXSA9IFNVQkU7Ci0JCW5hbWVzW0lkcy5JRF9TVU1dID0gU1VNOwotCQluYW1lc1tJZHMuSURfU1VQXSA9IFNVUDsKLQkJbmFtZXNbSWRzLklEX1NVUDFdID0gU1VQMTsKLQkJbmFtZXNbSWRzLklEX1NVUDJdID0gU1VQMjsKLQkJbmFtZXNbSWRzLklEX1NVUDNdID0gU1VQMzsKLQkJbmFtZXNbSWRzLklEX1NVUEVdID0gU1VQRTsKLQkJbmFtZXNbSWRzLklEX1NaTElHXSA9IFNaTElHOwotCQluYW1lc1tJZHMuSURfVEFVX0xdID0gVEFVX0w7Ci0JCW5hbWVzW0lkcy5JRF9UQVVfVV0gPSBUQVVfVTsKLQkJbmFtZXNbSWRzLklEX1RIRVJFNF0gPSBUSEVSRTQ7Ci0JCW5hbWVzW0lkcy5JRF9USEVUQVNZTV0gPSBUSEVUQVNZTTsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX0xdID0gVEhFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX1VdID0gVEhFVEFfVTsKLQkJbmFtZXNbSWRzLklEX1RISU5TUF0gPSBUSElOU1A7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9MXSA9IFRIT1JOX0w7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9VXSA9IFRIT1JOX1U7Ci0JCW5hbWVzW0lkcy5JRF9USUxERV0gPSBUSUxERTsKLQkJbmFtZXNbSWRzLklEX1RJTUVTXSA9IFRJTUVTOwotCQluYW1lc1tJZHMuSURfVFJBREVdID0gVFJBREU7Ci0JCW5hbWVzW0lkcy5JRF9VQUNVVEVfTF0gPSBVQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1VBQ1VURV9VXSA9IFVBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfVUFSUl9MXSA9IFVBUlJfTDsKLQkJbmFtZXNbSWRzLklEX1VBUlJfVV0gPSBVQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19MXSA9IFVDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19VXSA9IFVDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9VR1JBVkVfTF0gPSBVR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX1VHUkFWRV9VXSA9IFVHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfVU1MXSA9IFVNTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lIXSA9IFVQU0lIOwotCQluYW1lc1tJZHMuSURfVVBTSUxPTl9MXSA9IFVQU0lMT05fTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lMT05fVV0gPSBVUFNJTE9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9VVU1MX0xdID0gVVVNTF9MOwotCQluYW1lc1tJZHMuSURfVVVNTF9VXSA9IFVVTUxfVTsKLQkJbmFtZXNbSWRzLklEX1dFSUVSUF0gPSBXRUlFUlA7Ci0JCW5hbWVzW0lkcy5JRF9YSV9MXSA9IFhJX0w7Ci0JCW5hbWVzW0lkcy5JRF9YSV9VXSA9IFhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9ZQUNVVEVfTF0gPSBZQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1lBQ1VURV9VXSA9IFlBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfWUVOXSA9IFlFTjsKLQkJbmFtZXNbSWRzLklEX1lVTUxfTF0gPSBZVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9ZVU1MX1VdID0gWVVNTF9VOwotCQluYW1lc1tJZHMuSURfWkVUQV9MXSA9IFpFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1pFVEFfVV0gPSBaRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9aV0pdID0gWldKOwotCQluYW1lc1tJZHMuSURfWldOSl0gPSBaV05KOwotCX0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdmFsdWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCXZhbHVlcyA9IG5ldyBjaGFyW0lkcy5nZXROdW1PZklkcygpXTsKLQkJdmFsdWVzW0lkcy5JRF9BQUNVVEVfTF0gPSAyMjU7Ci0JCXZhbHVlc1tJZHMuSURfQUFDVVRFX1VdID0gMTkzOwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX0xdID0gMjI2OwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX1VdID0gMTk0OwotCQl2YWx1ZXNbSWRzLklEX0FDVVRFXSA9IDE4MDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19MXSA9IDIzMDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19VXSA9IDE5ODsKLQkJdmFsdWVzW0lkcy5JRF9BR1JBVkVfTF0gPSAyMjQ7Ci0JCXZhbHVlc1tJZHMuSURfQUdSQVZFX1VdID0gMTkyOwotCQl2YWx1ZXNbSWRzLklEX0FMRUZTWU1dID0gODUwMTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9MXSA9IDk0NTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9VXSA9IDkxMzsKLQkJdmFsdWVzW0lkcy5JRF9BTVBdID0gMzg7Ci0JCXZhbHVlc1tJZHMuSURfQU5EXSA9IDg3NDM7Ci0JCXZhbHVlc1tJZHMuSURfQU5HXSA9IDg3MzY7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfTF0gPSAyMjk7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfVV0gPSAxOTc7Ci0JCXZhbHVlc1tJZHMuSURfQVNZTVBdID0gODc3NjsKLQkJdmFsdWVzW0lkcy5JRF9BVElMREVfTF0gPSAyMjc7Ci0JCXZhbHVlc1tJZHMuSURfQVRJTERFX1VdID0gMTk1OwotCQl2YWx1ZXNbSWRzLklEX0FVTUxfTF0gPSAyMjg7Ci0JCXZhbHVlc1tJZHMuSURfQVVNTF9VXSA9IDE5NjsKLQkJdmFsdWVzW0lkcy5JRF9CRFFVT10gPSA4MjIyOwotCQl2YWx1ZXNbSWRzLklEX0JFVEFfTF0gPSA5NDY7Ci0JCXZhbHVlc1tJZHMuSURfQkVUQV9VXSA9IDkxNDsKLQkJdmFsdWVzW0lkcy5JRF9CUlZCQVJdID0gMTY2OwotCQl2YWx1ZXNbSWRzLklEX0JVTExdID0gODIyNjsKLQkJdmFsdWVzW0lkcy5JRF9DQVBdID0gODc0NTsKLQkJdmFsdWVzW0lkcy5JRF9DQ0VESUxfTF0gPSAyMzE7Ci0JCXZhbHVlc1tJZHMuSURfQ0NFRElMX1VdID0gMTk5OwotCQl2YWx1ZXNbSWRzLklEX0NFRElMXSA9IDE4NDsKLQkJdmFsdWVzW0lkcy5JRF9DRU5UXSA9IDE2MjsKLQkJdmFsdWVzW0lkcy5JRF9DSElfTF0gPSA5Njc7Ci0JCXZhbHVlc1tJZHMuSURfQ0hJX1VdID0gOTM1OwotCQl2YWx1ZXNbSWRzLklEX0NJUkNdID0gNzEwOwotCQl2YWx1ZXNbSWRzLklEX0NMVUJTXSA9IDk4Mjc7Ci0JCXZhbHVlc1tJZHMuSURfQ09OR10gPSA4NzczOwotCQl2YWx1ZXNbSWRzLklEX0NPUFldID0gMTY5OwotCQl2YWx1ZXNbSWRzLklEX0NSQVJSXSA9IDg2Mjk7Ci0JCXZhbHVlc1tJZHMuSURfQ1VQXSA9IDg3NDY7Ci0JCXZhbHVlc1tJZHMuSURfQ1VSUkVOXSA9IDE2NDsKLQkJdmFsdWVzW0lkcy5JRF9EQUdHRVJfTF0gPSA4MjI0OwotCQl2YWx1ZXNbSWRzLklEX0RBR0dFUl9VXSA9IDgyMjU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9MXSA9IDg1OTU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9VXSA9IDg2NTk7Ci0JCXZhbHVlc1tJZHMuSURfREVHXSA9IDE3NjsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9MXSA9IDk0ODsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9VXSA9IDkxNjsKLQkJdmFsdWVzW0lkcy5JRF9ESUFNU10gPSA5ODMwOwotCQl2YWx1ZXNbSWRzLklEX0RJVklERV0gPSAyNDc7Ci0JCXZhbHVlc1tJZHMuSURfRUFDVVRFX0xdID0gMjMzOwotCQl2YWx1ZXNbSWRzLklEX0VBQ1VURV9VXSA9IDIwMTsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19MXSA9IDIzNDsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19VXSA9IDIwMjsKLQkJdmFsdWVzW0lkcy5JRF9FR1JBVkVfTF0gPSAyMzI7Ci0JCXZhbHVlc1tJZHMuSURfRUdSQVZFX1VdID0gMjAwOwotCQl2YWx1ZXNbSWRzLklEX0VNUFRZXSA9IDg3MDk7Ci0JCXZhbHVlc1tJZHMuSURfRU1TUF0gPSA4MTk1OwotCQl2YWx1ZXNbSWRzLklEX0VOU1BdID0gODE5NDsKLQkJdmFsdWVzW0lkcy5JRF9FUFNJTE9OX0xdID0gOTQ5OwotCQl2YWx1ZXNbSWRzLklEX0VQU0lMT05fVV0gPSA5MTc7Ci0JCXZhbHVlc1tJZHMuSURfRVFVSVZdID0gODgwMTsKLQkJdmFsdWVzW0lkcy5JRF9FVEFfTF0gPSA5NTE7Ci0JCXZhbHVlc1tJZHMuSURfRVRBX1VdID0gOTE5OwotCQl2YWx1ZXNbSWRzLklEX0VUSF9MXSA9IDI0MDsKLQkJdmFsdWVzW0lkcy5JRF9FVEhfVV0gPSAyMDg7Ci0JCXZhbHVlc1tJZHMuSURfRVVNTF9MXSA9IDIzNTsKLQkJdmFsdWVzW0lkcy5JRF9FVU1MX1VdID0gMjAzOwotCQl2YWx1ZXNbSWRzLklEX0VVUk9dID0gODM2NDsKLQkJdmFsdWVzW0lkcy5JRF9FWElTVF0gPSA4NzA3OwotCQl2YWx1ZXNbSWRzLklEX0ZOT0ZdID0gNDAyOwotCQl2YWx1ZXNbSWRzLklEX0ZPUkFMTF0gPSA4NzA0OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMxMl0gPSAxODk7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzE0XSA9IDE4ODsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMzRdID0gMTkwOwotCQl2YWx1ZXNbSWRzLklEX0ZSQVNMXSA9IDgyNjA7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfTF0gPSA5NDc7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfVV0gPSA5MTU7Ci0JCXZhbHVlc1tJZHMuSURfR0VdID0gODgwNTsKLQkJdmFsdWVzW0lkcy5JRF9HVF0gPSA2MjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX0xdID0gODU5NjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX1VdID0gODY2MDsKLQkJdmFsdWVzW0lkcy5JRF9IRUFSVFNdID0gOTgyOTsKLQkJdmFsdWVzW0lkcy5JRF9IRUxMSVBdID0gODIzMDsKLQkJdmFsdWVzW0lkcy5JRF9JQUNVVEVfTF0gPSAyMzc7Ci0JCXZhbHVlc1tJZHMuSURfSUFDVVRFX1VdID0gMjA1OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX0xdID0gMjM4OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX1VdID0gMjA2OwotCQl2YWx1ZXNbSWRzLklEX0lFWENMXSA9IDE2MTsKLQkJdmFsdWVzW0lkcy5JRF9JR1JBVkVfTF0gPSAyMzY7Ci0JCXZhbHVlc1tJZHMuSURfSUdSQVZFX1VdID0gMjA0OwotCQl2YWx1ZXNbSWRzLklEX0lNQUdFXSA9IDg0NjU7Ci0JCXZhbHVlc1tJZHMuSURfSU5GSU5dID0gODczNDsKLQkJdmFsdWVzW0lkcy5JRF9JTlRdID0gODc0NzsKLQkJdmFsdWVzW0lkcy5JRF9JT1RBX0xdID0gOTUzOwotCQl2YWx1ZXNbSWRzLklEX0lPVEFfVV0gPSA5MjE7Ci0JCXZhbHVlc1tJZHMuSURfSVFVRVNUXSA9IDE5MTsKLQkJdmFsdWVzW0lkcy5JRF9JU0lOXSA9IDg3MTI7Ci0JCXZhbHVlc1tJZHMuSURfSVVNTF9MXSA9IDIzOTsKLQkJdmFsdWVzW0lkcy5JRF9JVU1MX1VdID0gMjA3OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX0xdID0gOTU0OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX1VdID0gOTIyOwotCQl2YWx1ZXNbSWRzLklEX0xBTUJEQV9MXSA9IDk1NTsKLQkJdmFsdWVzW0lkcy5JRF9MQU1CREFfVV0gPSA5MjM7Ci0JCXZhbHVlc1tJZHMuSURfTEFOR10gPSA5MDAxOwotCQl2YWx1ZXNbSWRzLklEX0xBUVVPXSA9IDE3MTsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX0xdID0gODU5MjsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX1VdID0gODY1NjsKLQkJdmFsdWVzW0lkcy5JRF9MQ0VJTF0gPSA4OTY4OwotCQl2YWx1ZXNbSWRzLklEX0xEUVVPXSA9IDgyMjA7Ci0JCXZhbHVlc1tJZHMuSURfTEVdID0gODgwNDsKLQkJdmFsdWVzW0lkcy5JRF9MRkxPT1JdID0gODk3MDsKLQkJdmFsdWVzW0lkcy5JRF9MT1dBU1RdID0gODcyNzsKLQkJdmFsdWVzW0lkcy5JRF9MT1pdID0gOTY3NDsKLQkJdmFsdWVzW0lkcy5JRF9MUk1dID0gODIwNjsKLQkJdmFsdWVzW0lkcy5JRF9MU0FRVU9dID0gODI0OTsKLQkJdmFsdWVzW0lkcy5JRF9MU1FVT10gPSA4MjE2OwotCQl2YWx1ZXNbSWRzLklEX0xUXSA9IDYwOwotCQl2YWx1ZXNbSWRzLklEX01BQ1JdID0gMTc1OwotCQl2YWx1ZXNbSWRzLklEX01EQVNIXSA9IDgyMTI7Ci0JCXZhbHVlc1tJZHMuSURfTUlDUk9dID0gMTgxOwotCQl2YWx1ZXNbSWRzLklEX01JRERPVF0gPSAxODM7Ci0JCXZhbHVlc1tJZHMuSURfTUlOVVNdID0gODcyMjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9MXSA9IDk1NjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9VXSA9IDkyNDsKLQkJdmFsdWVzW0lkcy5JRF9OQUJMQV0gPSA4NzExOwotCQl2YWx1ZXNbSWRzLklEX05CU1BdID0gMTYwOwotCQl2YWx1ZXNbSWRzLklEX05EQVNIXSA9IDgyMTE7Ci0JCXZhbHVlc1tJZHMuSURfTkVdID0gODgwMDsKLQkJdmFsdWVzW0lkcy5JRF9OSV0gPSA4NzE1OwotCQl2YWx1ZXNbSWRzLklEX05PVF0gPSAxNzI7Ci0JCXZhbHVlc1tJZHMuSURfTk9USU5dID0gODcxMzsKLQkJdmFsdWVzW0lkcy5JRF9OU1VCXSA9IDg4MzY7Ci0JCXZhbHVlc1tJZHMuSURfTlRJTERFX0xdID0gMjQxOwotCQl2YWx1ZXNbSWRzLklEX05USUxERV9VXSA9IDIwOTsKLQkJdmFsdWVzW0lkcy5JRF9OVV9MXSA9IDk1NzsKLQkJdmFsdWVzW0lkcy5JRF9OVV9VXSA9IDkyNTsKLQkJdmFsdWVzW0lkcy5JRF9PQUNVVEVfTF0gPSAyNDM7Ci0JCXZhbHVlc1tJZHMuSURfT0FDVVRFX1VdID0gMjExOwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX0xdID0gMjQ0OwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX1VdID0gMjEyOwotCQl2YWx1ZXNbSWRzLklEX09FTElHX0xdID0gMzM5OwotCQl2YWx1ZXNbSWRzLklEX09FTElHX1VdID0gMzM4OwotCQl2YWx1ZXNbSWRzLklEX09HUkFWRV9MXSA9IDI0MjsKLQkJdmFsdWVzW0lkcy5JRF9PR1JBVkVfVV0gPSAyMTA7Ci0JCXZhbHVlc1tJZHMuSURfT0xJTkVdID0gODI1NDsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9MXSA9IDk2OTsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9VXSA9IDkzNzsKLQkJdmFsdWVzW0lkcy5JRF9PTUlDUk9OX0xdID0gOTU5OwotCQl2YWx1ZXNbSWRzLklEX09NSUNST05fVV0gPSA5Mjc7Ci0JCXZhbHVlc1tJZHMuSURfT1BMVVNdID0gODg1MzsKLQkJdmFsdWVzW0lkcy5JRF9PUl0gPSA4NzQ0OwotCQl2YWx1ZXNbSWRzLklEX09SREZdID0gMTcwOwotCQl2YWx1ZXNbSWRzLklEX09SRE1dID0gMTg2OwotCQl2YWx1ZXNbSWRzLklEX09TTEFTSF9MXSA9IDI0ODsKLQkJdmFsdWVzW0lkcy5JRF9PU0xBU0hfVV0gPSAyMTY7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTERFX0xdID0gMjQ1OwotCQl2YWx1ZXNbSWRzLklEX09USUxERV9VXSA9IDIxMzsKLQkJdmFsdWVzW0lkcy5JRF9PVElNRVNdID0gODg1NTsKLQkJdmFsdWVzW0lkcy5JRF9PVU1MX0xdID0gMjQ2OwotCQl2YWx1ZXNbSWRzLklEX09VTUxfVV0gPSAyMTQ7Ci0JCXZhbHVlc1tJZHMuSURfUEFSQV0gPSAxODI7Ci0JCXZhbHVlc1tJZHMuSURfUEFSVF0gPSA4NzA2OwotCQl2YWx1ZXNbSWRzLklEX1BFUk1JTF0gPSA4MjQwOwotCQl2YWx1ZXNbSWRzLklEX1BFUlBdID0gODg2OTsKLQkJdmFsdWVzW0lkcy5JRF9QSElfTF0gPSA5NjY7Ci0JCXZhbHVlc1tJZHMuSURfUEhJX1VdID0gOTM0OwotCQl2YWx1ZXNbSWRzLklEX1BJVl0gPSA5ODI7Ci0JCXZhbHVlc1tJZHMuSURfUElfTF0gPSA5NjA7Ci0JCXZhbHVlc1tJZHMuSURfUElfVV0gPSA5Mjg7Ci0JCXZhbHVlc1tJZHMuSURfUExVU01OXSA9IDE3NzsKLQkJdmFsdWVzW0lkcy5JRF9QT1VORF0gPSAxNjM7Ci0JCXZhbHVlc1tJZHMuSURfUFJJTUVfTF0gPSA4MjQyOwotCQl2YWx1ZXNbSWRzLklEX1BSSU1FX1VdID0gODI0MzsKLQkJdmFsdWVzW0lkcy5JRF9QUk9EXSA9IDg3MTk7Ci0JCXZhbHVlc1tJZHMuSURfUFJPUF0gPSA4NzMzOwotCQl2YWx1ZXNbSWRzLklEX1BTSV9MXSA9IDk2ODsKLQkJdmFsdWVzW0lkcy5JRF9QU0lfVV0gPSA5MzY7Ci0JCXZhbHVlc1tJZHMuSURfUVVPVF0gPSAzNDsKLQkJdmFsdWVzW0lkcy5JRF9SQURJQ10gPSA4NzMwOwotCQl2YWx1ZXNbSWRzLklEX1JBTkddID0gOTAwMjsKLQkJdmFsdWVzW0lkcy5JRF9SQVFVT10gPSAxODc7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9MXSA9IDg1OTQ7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9VXSA9IDg2NTg7Ci0JCXZhbHVlc1tJZHMuSURfUkNFSUxdID0gODk2OTsKLQkJdmFsdWVzW0lkcy5JRF9SRFFVT10gPSA4MjIxOwotCQl2YWx1ZXNbSWRzLklEX1JFQUxdID0gODQ3NjsKLQkJdmFsdWVzW0lkcy5JRF9SRUddID0gMTc0OwotCQl2YWx1ZXNbSWRzLklEX1JGTE9PUl0gPSA4OTcxOwotCQl2YWx1ZXNbSWRzLklEX1JIT19MXSA9IDk2MTsKLQkJdmFsdWVzW0lkcy5JRF9SSE9fVV0gPSA5Mjk7Ci0JCXZhbHVlc1tJZHMuSURfUkxNXSA9IDgyMDc7Ci0JCXZhbHVlc1tJZHMuSURfUlNBUVVPXSA9IDgyNTA7Ci0JCXZhbHVlc1tJZHMuSURfUlNRVU9dID0gODIxNzsKLQkJdmFsdWVzW0lkcy5JRF9TQlFVT10gPSA4MjE4OwotCQl2YWx1ZXNbSWRzLklEX1NDQVJPTl9MXSA9IDM1MzsKLQkJdmFsdWVzW0lkcy5JRF9TQ0FST05fVV0gPSAzNTI7Ci0JCXZhbHVlc1tJZHMuSURfU0RPVF0gPSA4OTAxOwotCQl2YWx1ZXNbSWRzLklEX1NFQ1RdID0gMTY3OwotCQl2YWx1ZXNbSWRzLklEX1NIWV0gPSAxNzM7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFGXSA9IDk2MjsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9MXSA9IDk2MzsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9VXSA9IDkzMTsKLQkJdmFsdWVzW0lkcy5JRF9TSU1dID0gODc2NDsKLQkJdmFsdWVzW0lkcy5JRF9TUEFERVNdID0gOTgyNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJdID0gODgzNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJFXSA9IDg4Mzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VNXSA9IDg3MjE7Ci0JCXZhbHVlc1tJZHMuSURfU1VQXSA9IDg4MzU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMV0gPSAxODU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMl0gPSAxNzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VQM10gPSAxNzk7Ci0JCXZhbHVlc1tJZHMuSURfU1VQRV0gPSA4ODM5OwotCQl2YWx1ZXNbSWRzLklEX1NaTElHXSA9IDIyMzsKLQkJdmFsdWVzW0lkcy5JRF9UQVVfTF0gPSA5NjQ7Ci0JCXZhbHVlc1tJZHMuSURfVEFVX1VdID0gOTMyOwotCQl2YWx1ZXNbSWRzLklEX1RIRVJFNF0gPSA4NzU2OwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBU1lNXSA9IDk3NzsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9MXSA9IDk1MjsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9VXSA9IDkyMDsKLQkJdmFsdWVzW0lkcy5JRF9USElOU1BdID0gODIwMTsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9MXSA9IDI1NDsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9VXSA9IDIyMjsKLQkJdmFsdWVzW0lkcy5JRF9USUxERV0gPSA3MzI7Ci0JCXZhbHVlc1tJZHMuSURfVElNRVNdID0gMjE1OwotCQl2YWx1ZXNbSWRzLklEX1RSQURFXSA9IDg0ODI7Ci0JCXZhbHVlc1tJZHMuSURfVUFDVVRFX0xdID0gMjUwOwotCQl2YWx1ZXNbSWRzLklEX1VBQ1VURV9VXSA9IDIxODsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX0xdID0gODU5MzsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX1VdID0gODY1NzsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19MXSA9IDI1MTsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19VXSA9IDIxOTsKLQkJdmFsdWVzW0lkcy5JRF9VR1JBVkVfTF0gPSAyNDk7Ci0JCXZhbHVlc1tJZHMuSURfVUdSQVZFX1VdID0gMjE3OwotCQl2YWx1ZXNbSWRzLklEX1VNTF0gPSAxNjg7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUhdID0gOTc4OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lMT05fTF0gPSA5NjU7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUxPTl9VXSA9IDkzMzsKLQkJdmFsdWVzW0lkcy5JRF9VVU1MX0xdID0gMjUyOwotCQl2YWx1ZXNbSWRzLklEX1VVTUxfVV0gPSAyMjA7Ci0JCXZhbHVlc1tJZHMuSURfV0VJRVJQXSA9IDg0NzI7Ci0JCXZhbHVlc1tJZHMuSURfWElfTF0gPSA5NTg7Ci0JCXZhbHVlc1tJZHMuSURfWElfVV0gPSA5MjY7Ci0JCXZhbHVlc1tJZHMuSURfWUFDVVRFX0xdID0gMjUzOwotCQl2YWx1ZXNbSWRzLklEX1lBQ1VURV9VXSA9IDIyMTsKLQkJdmFsdWVzW0lkcy5JRF9ZRU5dID0gMTY1OwotCQl2YWx1ZXNbSWRzLklEX1lVTUxfTF0gPSAyNTU7Ci0JCXZhbHVlc1tJZHMuSURfWVVNTF9VXSA9IDM3NjsKLQkJdmFsdWVzW0lkcy5JRF9aRVRBX0xdID0gOTUwOwotCQl2YWx1ZXNbSWRzLklEX1pFVEFfVV0gPSA5MTg7Ci0JCXZhbHVlc1tJZHMuSURfWldKXSA9IDgyMDU7Ci0JCXZhbHVlc1tJZHMuSURfWldOSl0gPSA4MjA0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbnRpdHlDb2xsZWN0aW9uKCkgewotCQlzdXBlcihuYW1lcywgU1RSSUNUX0NBU0UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBlbnRpdHkgZGVjbGFyYXRpb24uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWludCBpZCA9IGdldElEKGVudGl0eU5hbWUpOwotCQlpZiAoaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHZhbHVlc1tpZF0pOwotCQlIVE1MRW50aXR5RGVjbEltcGwgZGVjID0gbmV3IEhUTUxFbnRpdHlEZWNsSW1wbChlbnRpdHlOYW1lLCB2YWx1ZSk7Ci0KLQkJcmV0dXJuIGRlYzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQXR0ckRlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hUTUxBdHRyRGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmYmM1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hUTUxBdHRyRGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIHtAbGluayA8Y29kZT5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb248L2NvZGU+fSBpbnRlcmZhY2UuPGJyPgotICovCi1jbGFzcyBIVE1MQXR0ckRlY2xJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIEhUTUxDTURhdGFUeXBlSW1wbCB0eXBlID0gbnVsbDsKLQlwcml2YXRlIGludCB1c2FnZSA9IDA7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJEZWNsSW1wbChTdHJpbmcgYXR0ck5hbWUsIEhUTUxDTURhdGFUeXBlSW1wbCB2YWx1ZVR5cGUsIGludCB2YWx1ZVVzYWdlKSB7Ci0JCXN1cGVyKGF0dHJOYW1lKTsKLQkJdGhpcy50eXBlID0gdmFsdWVUeXBlOwotCi0JCXN3aXRjaCAodmFsdWVVc2FnZSkgewotCQkJY2FzZSBPUFRJT05BTCA6Ci0JCQljYXNlIFJFUVVJUkVEIDoKLQkJCWNhc2UgRklYRUQgOgotCQkJY2FzZSBQUk9ISUJJVEVEIDoKLQkJCQl0aGlzLnVzYWdlID0gdmFsdWVVc2FnZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCB3YXJuLi4uCi0JCQkJdGhpcy51c2FnZSA9IE9QVElPTkFMOyAvLyBmYWxsIGJhY2sKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldEF0dHJOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gQ01EYXRhVHlwZQotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCWlmICh0eXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSAhPSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSkpOwotCQlyZXR1cm4gdi5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogRUxFTUVOVF9ERUNMQVJBVElPTiwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBHUk9VUCwgRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRVc2FnZSgpIHsKLQkJcmV0dXJuIHVzYWdlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1N2M2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuSFRNTENNRGF0YVR5cGU7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgSFRNTENNRGF0YVR5cGVJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxDTURhdGFUeXBlIHsKLQotCXByaXZhdGUgaW50IGltcGxpZWRWYWx1ZUtpbmQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JcHJpdmF0ZSBTdHJpbmcgaW1wbGllZFZhbHVlID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBlbXB0eUFycmF5ID0gbmV3IFN0cmluZ1swXTsKLQlwcml2YXRlIFN0cmluZ1tdIGVudW1WYWx1ZXMgPSBlbXB0eUFycmF5OwotCXByaXZhdGUgU3RyaW5nIGluc3RhbmNlVmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogSFRNTENNRGF0YVR5cGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5tIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTENNRGF0YVR5cGVJbXBsKFN0cmluZyB0eXBlTmFtZSkgewotCQlzdXBlcih0eXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSFRNTENNRGF0YVR5cGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5tIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTENNRGF0YVR5cGVJbXBsKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGluc3RhbmNlVmFsdWUpIHsKLQkJc3VwZXIodHlwZU5hbWUpOwotCQl0aGlzLmluc3RhbmNlVmFsdWUgPSBpbnN0YW5jZVZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIHR5cGUgaXMgY3JlYXRlZC4KLQkgKiBUaGlzIHJldHVybnMgbnVsbCBvZiBhIHN1aXRhYmxlIGRlZmF1bHQgaXMgbm90IGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpIHsKLQkJcmV0dXJuIGVudW1WYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nICAKLQkgKgotCSAqIFJldHVybnMgdGhlIGltcGxpZWQgdmFsdWUgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGltcGxpZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0JICovCi0JcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQlyZXR1cm4gaW1wbGllZFZhbHVlS2luZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RW51bVZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJZW51bVZhbHVlcyA9IG5ldyBTdHJpbmdbdmFsdWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQllbnVtVmFsdWVzW2ldID0gdmFsdWVzW2ldOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcGFja2FnZSBzY29wZS4KLQkgKi8KLQl2b2lkIHNldEltcGxpZWRWYWx1ZShpbnQga2luZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX0ZJWEVEIDoKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9ERUZBVUxUIDoKLQkJCQlpbXBsaWVkVmFsdWVLaW5kID0ga2luZDsKLQkJCQlpbXBsaWVkVmFsdWUgPSB2YWx1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9OT05FIDoKLQkJCWRlZmF1bHQgOgotCQkJCWltcGxpZWRWYWx1ZUtpbmQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JCQkJaW1wbGllZFZhbHVlID0gbnVsbDsgLy8gbWF5YmUgYSBudWxsIHN0cmluZz8KLQkJCQlicmVhazsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSFRNTENNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE2NjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSFRNTENNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0vKioKLSAqIEluIEhUTUwgRG9jdW1lbnRzLCBuYW1lIGFuZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkKLSAqIHNob3VsZCBiZSB0cmVhdGVkIGlnbm9yaW5nIHRoZWlycyBjYXNlLiAgSG93ZXZlciwgaW4gWE1MIGRvY3VtZW50cywKLSAqIHRoZXkgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQgd2l0aCBzZW5zaXRpdmVuZXNzIG9mIHRoZWlyIGNhc2UuCi0gKiBDTU5vZGUgaXMgYmFzaWNhbGx5IGRlc2lnbmVkIHRvIHJlcHJlc2VudCBEVERzIG9yIFNjaGVtYXMgZm9yIFhNTAotICogZG9jdW1lbnRzLiAgU28sIGl0IGRvZXNuJ3QgaGF2ZSBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBIb3dldmVyLCBkZWNsYXJhdGlvbnMgaW4gdGhlIEhUTUwgQ00gc2hvdWxkIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbi4KLSAqIFRoaXMgaW50ZXJtZWRpYXRlIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHdoZXRoZXIgaWdub3JlIGNhc2VzCi0gKiBvciBub3QuPGJyPgotICovCi1pbnRlcmZhY2UgSFRNTENNTm9kZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCBpZiBkZWNsYXJhdGlvbiBpcyBmb3IgSFRNTCBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkuCi0JICogT3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHNob3VsZElnbm9yZUNhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbGVtRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWZhYzY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5IVE1MUHJvcGVydHlEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgSGVkPz8/PyBjbGFzc2VzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIVE1MRWxlbURlY2xJbXBsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24sIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIHsKLQotCS8vIERURAotCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgYXR0cmlidXRlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZOwotCS8qKiBOZXZlciBhY2Nlc3MgdGhpcyBmaWVsZCBkaXJlY3RseS4gIEluc3RlYWQsIHVzZSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24gbWV0aG9kLiAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgaW5jbHVzaW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgZXhjbHVzaW9uID0gbnVsbDsKLQkvLyBhZHZhbmNlZCBpbmZvcm1hdGlvbgotCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcCBwcm9oaWJpdGVkQW5jZXN0b3JzID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9OT05FOwotCXByb3RlY3RlZCBpbnQgZm9ybWF0VHlwZSA9IEZPUk1BVF9IVE1MOwotCXByb3RlY3RlZCBpbnQgbGF5b3V0VHlwZSA9IExBWU9VVF9OT05FOwotCXByb3RlY3RlZCBpbnQgb21pdFR5cGUgPSBPTUlUX05PTkU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4ga2VlcFNwYWNlcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGluZGVudENoaWxkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVDb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIENNTmFtZWROb2RlTWFwIEVNUFRZX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcCgpIHsKLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBIVE1MRWxlbURlY2xJbXBsIGNvbnN0cnVjdG9yLgotCSAqIEluIHRoZSBIVE1MIERURCwgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBoYXMgbm8gc3BlY2lmaWNhdGlvbgotCSAqIGZvciBpdHMgb2NjdXJyZW5jZS4gIE9jY3VycmVuY2UgaXMgc3BlY2lmZWQgaW4gY29udGVudCBtb2RlbCwgbGlrZQotCSAqIDxjb2RlPihMSSkrPC9jb2RlPi4gIFRvIGF2b2lkIGNvbmZ1c2lvbiAoYW5kIGNvbXBsZXhpdHkpLAotCSAqIG9jY3VycmVuY2Ugb2YgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBhbHdheXMgMSAoaXQgbWVhbnMsIG1pbiA9IDEgYW5kCi0JICogbWF4ID0gMSkuICBJbnN0ZWFkLCBvY2N1cnJlbmNlIG9mIENNR3JvdXAgcmVwcmVzZW50cyBhY3R1YWwgb2NjdXJyZW5jZQotCSAqIG9mIHRoZSBjb250ZW50LgotCSAqIDxicj4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxFbGVtRGVjbEltcGwoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCAxLCAxKTsKLQkJZWxlbWVudENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uID0gY29sbGVjdGlvbi5nZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkNvbXBsZXhUeXBlRGVmaW5pdGlvbgotCSAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uIGNyZWF0ZUNvbXBsZXhUeXBlRGVmaW5pdGlvbigpIHsKLQkJaWYgKHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9DREFUQSkgfHwgdHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZKSB8fCB0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUENEQVRBKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgZmFjdG9yeSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYXRhbCBlcnJvci4KLQotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZmFjdG9yeS5jcmVhdGVUeXBlRGVmaW5pdGlvbih0eXBlRGVmaW5pdGlvbk5hbWUsIGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotCSAqIDxicj4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7IC8vIGZhaWwgdG8gY3JlYXRlCi0JCX0KLQotCQlDTU5vZGUgY21ub2RlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIChIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsgLy8gYWxyZWFkeSBleGlzdHMuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5Db21wbGV4VHlwZURlZmluaXRpb24KLQkgKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKSB7Ci0JCWlmICh0eXBlRGVmaW5pdGlvbiA9PSBudWxsKQotCQkJdHlwZURlZmluaXRpb24gPSBjcmVhdGVDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJcmV0dXJuIHR5cGVEZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIEVsZW1lbnQgZGVjbGFyYXRpb25zIHdoaWNoIHR5cGUgaXMgRU1QVFkgb3IgQ0RBVEEgKG1heWJlIFBDREFUQSkKLQkgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFsd2F5cyByZXR1cm4gbnVsbC4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnQoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gKGRlZiAhPSBudWxsKSA/IGRlZi5nZXRDb250ZW50VHlwZSgpIDogQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uI2dldENvcnJlY3Rpb25UeXBlCi0JICovCi0JcHVibGljIGludCBnZXRDb3JyZWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGNvcnJlY3Rpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIEhUTUwgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGRhdGEgdHlwZS4gIFNvLCB0aGlzIG1ldGhvZCBhbHdheXMKLQkgKiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+Ljxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBleGNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgZXhjbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiA8YnI+Ci0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgZm9ybWF0IHR5cGUgaXMgPGNvZGU+Rk9STUFUX0hUTUw8L2NvZGU+Ljxicj4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEZvcm1hdFR5cGUoKSB7Ci0JCXJldHVybiBmb3JtYXRUeXBlOwotCX0KLQotCS8qKgotCSAqIEluY2x1c2lvbi4KLQkgKiBBbG1vc3QgZWxlbWVudHMgZG9uJ3QgaGF2ZSBhIGluY2x1c2lvbi4KLQkgKiBPbmx5IGNsYXNzZXMgdGhvc2UgaGF2ZSBpbmNsdXNpb24gc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIDxicj4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRMYXlvdXRUeXBlKCkgewotCQlyZXR1cm4gbGF5b3V0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBMaW5lIGJyZWFrIGhpbnQgaXMgc3Ryb25nbHkgcmVsYXRlZCB0byBsYXlvdXQgdHlwZS4KLQkgKiBJbmRlZWQsIGluIHRoZSBDKytET00sIGl0IGlzIGRldGVybWluZWQgZnJvbSBsYXlvdXQgdHlwZSBvbmx5LgotCSAqIFNvLCB0aGlzIGltcGxlbWVudGF0aW9uLCBhcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIGRlY2xhcmF0aW9ucywKLQkgKiBhbHNvIGRldGVybWluZXMgZnJvbSBsYXlvdXQgdHlwZSBvbmx5Ljxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZUJyZWFrSGludCgpIHsKLQkJc3dpdGNoIChnZXRMYXlvdXRUeXBlKCkpIHsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQkxPQ0sgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CUkVBSyA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQUZURVJfU1RBUlQ7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm8gSFRNTCBlbGVtZW50IGhhcyBsb2NhbCBlbGVtZW50cy4gIFNvLCB0aGlzIG1ldGhvZCBhbHdheXMKLQkgKiByZXR1cm5zIGFuIGVtcHR5IG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT047Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPbWl0VHlwZSgpIHsKLQkJcmV0dXJuIG9taXRUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlyZXR1cm4gRU1QVFlfTUFQOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotCQkJcmV0dXJuIChkZWYgIT0gbnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBwcC5zdXBwb3J0cyh0aGlzKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKGRlZiAhPSBudWxsKSA/IGRlZi5nZXRQcmltYXJ5Q2FuZGlkYXRlKCkgOiBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAocHAgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBwcC5nZXQodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZWxlbWVudCBuYW1lcyB3aGljaCB0ZXJtaW5hdGVzIHRoaXMgZWxlbWVudC48YnI+Ci0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0cnVlIHdoZW4gdGhlIGVsZW1lbnQgaXMgYSBKU1AgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0pTUCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluIHNvbWUgZWxlbWVudHMsIHN1Y2ggYXMgQVBQTEVULCBhIHNvdXJjZSBnZW5lcmF0b3Igc2hvdWxkIGluZGVudCBjaGlsZAotCSAqIGVsZW1lbnRzIHRoYXQgdGhlaXIgcGFyZW50cy4gIFRoYXQgaXMsIGEgc291cmNlIGdlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUKLQkgKiBzb3VyY2UgIG9mIEFQUExFVCBhbmQgUEFSQU1TIGxpa2UgdGhpczoKLQkgKiA8UFJFPgotCSAqICAgJmx0O0FQUExFVCAuLi4mZ3Q7Ci0JICogICAgICZsdDtQQVJBTSAuLi4gJmd0OwotCSAqICAgICAmbHQ7UEFSQU0gLi4uICZndDsKLQkgKiAgICZsdDsvQVBQTEVUJmd0OwotCSAqIDxQUkU+Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSB7Ci0JCXJldHVybiBpbmRlbnRDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBNb3N0IG9mIGVsZW1lbnRzIGNhbiBjb21wYWN0IHNwYWNlcyBpbiB0aGVpciBjaGlsZCB0ZXh0IG5vZGVzLgotCSAqIFNvbWUgc3BlY2lhbCBlbGVtZW50cyBzaG91bGQga2VlcCB0aGVtIGluIHRoZWlyIHNvdXJjZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRLZWVwU3BhY2VzKCkgewotCQlyZXR1cm4ga2VlcFNwYWNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRUZXJtaW5hdGVBdChIVE1MRWxlbWVudERlY2xhcmF0aW9uIG5leHRFbGVtZW50KSB7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRUZXJtaW5hdG9ycygpOwotCQlpZiAoaSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbmV4dE5hbWUgPSBuZXh0RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWlmIChuZXh0TmFtZS5lcXVhbHMoaS5uZXh0KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MRW50aXR5RGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTFjODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MRW50aXR5RGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLkhUTUxFbnRpdHlEZWNsYXJhdGlvbjsKLQotCi0KLS8qKgotICovCi1jbGFzcyBIVE1MRW50aXR5RGVjbEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTEVudGl0eURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUVudGl0eURlY2xJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIGVudGl0eU5hbWUgamF2YS5sYW5nLlN0cmluZzsgRW50aXR5IG5hbWUuCi0JICogQHBhcmFtIGVudGl0eVZhbHVlIGphdmEubGFuZy5TdHJpbmc7IFZhbHVlIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xJbXBsKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgZW50aXR5VmFsdWUpIHsKLQkJc3VwZXIoZW50aXR5TmFtZSk7Ci0JCXZhbHVlID0gZW50aXR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCBDTU5vZGUgdHlwZS48YnI+Ci0JICogQHJldHVybiBpbnQ7IEFsd2F5cyByZXR1cm4gRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRU5USVRZX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRpdGllcyBpbiBIVE1MIGRvY3VtZW50cyBhcmUgYWx3YXlzIHRyZWF0ZWQgd2l0aCBpZ25vcmluZyBjYXNlcy4KLQkgKiBCZWNhdXNlIG5vIHNwZWNpYWwgZW50aXRpZXMgYXJlIGRlZmluZWQgaW4gSlNQIDEuMCwgdGhpcyBtZXRob2QKLQkgKiBjYW4gYWx3YXlzIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi48YnI+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWE1YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqIChocmVmbGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkgKiAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKGRpcmVjdGtleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoc2hhcGUgJVNoYXBlOyByZWN0KQotCSAqIChjb29yZHMgJUNvb3JkczsgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPkE8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPkE8L2NvZGU+IGl0c2VsZi4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBhID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEpOwotCQlpZiAoYSAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGEpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5BLH07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEFERFJFU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkQUREUkVTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTI2ZTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkQUREUkVTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBBRERSRVNTLgotICovCi1maW5hbCBjbGFzcyBIZWRBRERSRVNTIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQUREUkVTUyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1MsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0FERFJFU1M7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCQVNFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEJBU0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1NjRmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEJBU0UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBCQVNFLgotICovCi1maW5hbCBjbGFzcyBIZWRCQVNFIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJBU0UoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0hJRERFTi4KLQkJLy8gQmVjYXVzZSwgQkFTRSBpcyBHUk9VUF9ISURERU4gaW4gdGhlIEMrK0RPTS9EVERQYXJzZXIuY3BwLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBCQVNFLgotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEJMT0NLUVVPVEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkxPQ0tRVU9URS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzMwZDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkxPQ0tRVU9URS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBCTE9DS1FVT1RFLgotICovCi1maW5hbCBjbGFzcyBIZWRCTE9DS1FVT1RFIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkxPQ0tRVU9URShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaXRlICVVUkk7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEJPRFkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkQk9EWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjBiMmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkQk9EWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBCT0RZLgotICovCi1maW5hbCBjbGFzcyBIZWRCT0RZIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCT0RZKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9CT1RIOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlYm9keWNvbG9yczsKLQkgKiAob25sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnVubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoYmFja2dyb3VuZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAobWFyZ2lud2lkdGggJVBpeGVsczsgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICogKG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkgLi4gRDIwNTUxNAotCSAqICh0b3BtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uLi4uIEQyMDU1MTQKLQkgKiAoYm90dG9tbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICogKGxlZnRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uLi4gRDIwNTUxNAotCSAqIChyaWdodG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4uIEQyMDU1MTQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWJvZHljb2xvcnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Qm9keWNvbG9ycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqIEJPRFkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQxZTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIEJSLgotICovCi1maW5hbCBjbGFzcyBIZWRCUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJSLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0JSRUFLLgotCQkvLyBCZWNhdXNlLCBCUiBpcyBHUk9VUF9CUkVBSyBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQlJFQUs7Ci0JfQotCi0JLyoqCi0JICogQlIuCi0JICogJWNvcmVhdHRyczsKLQkgKiAoY2xlYXIgKGxlZnQgfCBhbGwgfCByaWdodCB8IG5vbmUpIG5vbmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vIGNsZWFyCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVIpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NMRUFSLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRDRU5URVIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkQ0VOVEVSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWY3ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRDRU5URVIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQ0VOVEVSLgotICovCi1maW5hbCBjbGFzcyBIZWRDRU5URVIgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRDRU5URVIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVIsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZERELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZERELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyN2JkMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRERC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBERC4KLSAqLwotZmluYWwgY2xhc3MgSGVkREQgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBERCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZERJVi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRESVYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTViNmM2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZERJVi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBESVYuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERJViBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERJVihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVhbGlnbjsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVhbGlnbjsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQkJLy8gJXJlc2VydmVkOyAuLi4gZW1wdHkKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZERMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZERMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNzRkZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBETC4KLSAqLwotZmluYWwgY2xhc3MgSGVkREwgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRETChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhcnJheXM7Ci0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkRFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjYTcxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZERULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIERULgotICovCi1maW5hbCBjbGFzcyBIZWREVCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogRFQgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRFbXB0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRFbXB0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODhjMTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkRW1wdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIEVNUFRZIHR5cGUgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZEVtcHR5IGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRW1wdHkoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWTsKLQkJLy8gRU1QVFkgdHlwZSBoYXMgbm8gZW5kIHRhZy4KLQkJb21pdFR5cGUgPSBPTUlUX0VORF9NVVNUOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIEVNUFRZIHR5cGUgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkRk9STS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGT1JNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMDU2NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGT1JNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRk9STS4KLSAqLwotZmluYWwgY2xhc3MgSGVkRk9STSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZPUk0oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGFjdGlvbiAlVVJJOyAjUkVRVUlSRUQpCi0JICogKG1ldGhvZCAoR0VUfFBPU1QpIEdFVCkKLQkgKiAoZW5jdHlwZSAlQ29udGVudFR5cGU7ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQotCSAqIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKG9uc3VibWl0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnJlc2V0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAoYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUNUSU9OLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTUVUSE9ELCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfRU5DVFlQRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPkZPUk08L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPkZPUk08L2NvZGU+IGl0c2VsZi4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYXRhbAotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBmb3JtID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0pOwotCQlpZiAoZm9ybSAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGZvcm0pOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0sIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGbG93Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEZsb3dDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyMDUwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEZsb3dDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yICglZmxvdzspKiBjb250YWluZXJzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRGbG93Q29udGFpbmVyIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRmxvd0NvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZMT1dfQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEhFQUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkSEVBRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjJkNGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkSEVBRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBIVE1MLgotICovCi1maW5hbCBjbGFzcyBIZWRIRUFEIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIRUFEKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSEVBRDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCW9taXRUeXBlID0gT01JVF9CT1RIOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5IRUFEPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWkxOG47PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+cHJvZmlsZTwvdGQ+PHRkPlVSSTwvdGQ+PHRkPiNJTVBMSUVEPC90ZD48dGQ+Ti9BPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogSEVBRCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEhSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEhSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NGZkMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEhSLgotICovCi1maW5hbCBjbGFzcyBIZWRIUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhSLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnMKLQkgKiAoYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG5vc2hhZGUgKG5vc2hhZGUpICNJTVBMSUVEKQotCSAqIChzaXplICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoY29sb3IgJUNvbG9yOyAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfTEVGVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9DRU5URVIsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTk9TSEFERSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzlmNjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqIEhUTUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhUTUwgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUx9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhUTUwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IVE1MOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkhUTUw8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD48Y29kZT4laTE4bjs8L2NvZGU+PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgICAgPHRkPntAbGluayBQRENNRG9jSW1wbCNnZXRBdHRyRGVjbGFyYXRpb25zSTE4bn08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPnZlcnNpb248L3RkPjx0ZD5DREFUQTwvdGQ+PHRkPiNGSVhFRDwvdGQ+Ci0JICogICAgIDx0ZD57QGxpbmsgSFRNTF9WRVJTSU9OX1RSQU5TSVRJT05BTH08L3RkPjx0ZD5kZXBsZWNhdGVkIGluIEhUTUw0LjAxPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPjxicj4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkFic3RyYWN0SFRNTEVsZW1EZWNsSW1wbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQkJLy8gdmVyc2lvbgotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04pOwotCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqIEhUTUwgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIZWFkaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEhlYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzZWNmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZEhlYWRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSFsxLTZdLgotICovCi1maW5hbCBjbGFzcyBIZWRIZWFkaW5nIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIZWFkaW5nKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SDE8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYXR0cnM7PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWFsaWduOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICogPHA+PGI+JWFsaWduOzwvYj4gbWVhbnMgPGNvZGU+YWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkpICNJTVBMSUVEPC9jb2RlPi4KLQkgKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIDxjb2RlPmFsaWduPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSBvbmUgaW4KLQkgKiA8Y29kZT5JTUc8L2NvZGU+IG9yIDxjb2RlPlRBQkxFPC9jb2RlPi4gIFNvLCB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0JICogb2YgPGNvZGU+YWxpZ248L2NvZGU+IHNob3VsZCBiZSBsb2NhbHkgY3JlYXRlZCBhbmQgaXQgc2hvdWxkbid0IGJlIHJlZ2lzdGVyZWQKLQkgKiBpbiBhIDxjb2RlPkhDTURvY0ltcGw8L2NvZGU+IGluc3RhbmNlLjwvcD4KLQkgKiA8cD5Ib3dldmVyLCAlYWxpZ24gaXMgdXNlZCBpbiBzZXZhcmFsIHRpbWVzLiAgSSB3b3VsZG4ndCB3cml0ZSBzYW1lIGNvZGUKLQkgKiBpbiBtYW55IHRpbWVzLiAgU28sIEkgYWRkIGEgbmV3IHV0aWxpdHkgbWV0aG9kIGludG8gPGNvZGU+Q01VdGlsPC9jb2RlPgotCSAqIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uLjwvcD4KLQkgKiA8YnI+Ci0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5IVE1MRWxlbURlY2xJbXBsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vIGFsaWduCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTUcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkSU1HLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWNlMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTUcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBJTUcuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElNRyBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJTUcoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTUcsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBJTUcuCi0JICogJWF0dHJzOwotCSAqIChzcmMgJVVSSTsgI1JFUVVJUkVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JICogKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh1c2VtYXAgJVVSSTsgI0lNUExJRUQpCi0JICogKGlzbWFwIChpc21hcCkgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWFwZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkFic3RyYWN0SFRNTEVsZW1EZWNsSW1wbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChzcmMgJVVSSTsgI1JFUVVJUkVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR0cik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyBhbGlnbiAobG9jYWwpOyBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTlBVVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTlBVVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDk1OTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkSU5QVVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogSU5QVVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElOUFVUIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElOUFVUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5QVVQsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBJTlBVVC4KLQkgKiAlYXR0cnM7Ci0JICogKHR5cGUgJUlucHV0VHlwZTsgVEVYVCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqIChjaGVja2VkIChjaGVja2VkKSAjSU1QTElFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAocmVhZG9ubHkgKHJlYWRvbmx5KSAjSU1QTElFRCkKLQkgKiAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG1heGxlbmd0aCBOVU1CRVIgI0lNUExJRUQpCi0JICogKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAoYWx0IENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCSAqIChpc21hcCAoaXNtYXApICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnNlbGVjdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGFjY2VwdCAlQ29udGVudFR5cGVzOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChpc3R5bGUgQ0RBVEEgI0lNUExJRUQpCi0JICogPDxEMjE1Njg0Ci0JICogKHdpZHRoIENEQVRBOyAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0IENEQVRBOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyIENEQVRBOyAjSU1QTElFRCkKLQkgKiBEMjE1Njg0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJLy8gKHR5cGUgJUlucHV0VHlwZTsgVEVYVCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCS8vIE5PVEU6ICVJbnB1dFR5cGUgaXMgRU5VTTsKLQkJLy8gKHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwgcmFkaW8gfCBzdWJtaXQgfCByZXNldCB8Ci0JCS8vICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24pCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9URVhULCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BBU1NXT1JELCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NIRUNLQk9YLCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JBRElPLCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NVQk1JVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9SRVNFVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9ISURERU4sfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEVYVCk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR0cik7Ci0KLQkJLy8gKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgYXR0cik7Ci0KLQkJLy8gKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ0hFQ0tFRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVhMRU5HVEgsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0lTVFlMRSwKLQkJLy88PEQyMTU2ODQKLQkJCQkJQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSCi0JCS8vPEQyMTU2ODQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA0YjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWlubGluZTspKiBjb250YWluZXJzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqIEhlZElubGluZUNvbnRhaW5lci4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEhlZElubGluZUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkTEkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkTEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkYjE3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZExJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIExJLgotICovCi1maW5hbCBjbGFzcyBIZWRMSSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEl9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExJKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVMSVN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHZhbHVlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBMSSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzQzZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbGlzdCBpdGVtIGNvbnRhaW5lciBkZWNsYXJhdGlvbnMuCi0gKiAtIE9MLCBVTCwgTUVOVSwgRElSLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRMaXN0SXRlbUNvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExpc3RJdGVtQ29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTElfQ09OVEFJTkVSOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRU5VLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZE1FTlUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4Y2MyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZE1FTlUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE1FTlUvRElSLgotICovCi1maW5hbCBjbGFzcyBIZWRNRU5VIGV4dGVuZHMgSGVkTGlzdEl0ZW1Db250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1FTlUoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBNRU5VL0RJUi4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+TUVOVS9ESVI8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVibG9jazs8L2NvZGU+LgotCSAqICVibG9jazsgaXM6Ci0JICogUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotCSAqIE5PU0NSSVBUIHwgTk9GUkFNRVMgfCBCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVggfCBIUiB8Ci0JICogVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MuCi0JICogJWhlYWRpbmc7IGlzOiBIMSB8IEgyIHwgSDMgfCBINCB8IEg1IHwgSDYuCi0JICogJWxpc3Q7IGlzIDogVUwgfCBPTCB8IERJUiB8IE1FTlUuCi0JICogJXByZWZvcm1hdHRlZDsgaXMgUFJFLgotCSAqIDxicj4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vICVibG9jazsKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDEsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMywgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1LCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5INiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuREwsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTU307Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkTUVUQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRVRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZWFjNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRVRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuSFRNTENNRGF0YVR5cGU7Ci0KLS8qKgotICogTUVUQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUVUQSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNRVRBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIE1FVEEuCi0JICogJWkxOG47Ci0JICogKGh0dHAtZXF1aXYgTkFNRSAjSU1QTElFRCkKLQkgKiAobmFtZSBOQU1FICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29udGVudCBDREFUQSAjUkVRVUlSRUQpCi0JICogKHNjaGVtZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0KLQkJLy8gKG5hbWUgTkFNRSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTkFNRSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHRyKTsKLQotCQkvLyAyNDk0OTMKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRFTlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRFTlQsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9IVFRQX0VRVUlWLAotCQkvLwkJQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRFTlQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkT0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkT0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwZmU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZE9MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE9MLgotICovCi1maW5hbCBjbGFzcyBIZWRPTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBPTC4KLQkgKiAodHlwZSAlT0xTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKiAoc3RhcnQgTlVNQkVSICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPUFRJT04uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkT1BUSU9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYjdjZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPUFRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogT1BUSU9OLgotICovCi1maW5hbCBjbGFzcyBIZWRPUFRJT04gZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPUFRJT04oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT04sIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQl9Ci0KLQkvKioKLQkgKiBPUFRJT04uCi0JICogJWF0dHJzOwotCSAqIChzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChsYWJlbCAlVGV4dDsgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TRUxFQ1RFRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogT1BUSU9OIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNGZmYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFAgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiB0ZXJtaW5hdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlAsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPlA8L2NvZGU+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+Ci0JICogQHNlZSBjb20uaWJtLnNlZC5jb250ZW50bW9kZWwuaHRtbC5IVE1MRWxlbURlY2xJbXBsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gYWxpZ24KLQkJSFRNTEF0dHJEZWNsSW1wbCBhZGVjID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbmFtZXMgb2YgdGVybWluYXRvcnMuCi0JICogPGNvZGU+UDwvY29kZT4gaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlpZiAodGVybWluYXRvcnMgIT0gbnVsbCkKLQkJCXJldHVybiB0ZXJtaW5hdG9ycy5pdGVyYXRvcigpOwotCQkvLzw8RDIxNzk4MgotCQl0ZXJtaW5hdG9ycyA9IG5ldyBWZWN0b3IoKTsKLQkJdGVybWluYXRvcnMuYWRkQWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVzT2ZCbG9jaygpKTsKLQkJdGVybWluYXRvcnMuYWRkKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJKTsKLQkJdGVybWluYXRvcnMuYWRkKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUKTsKLQkJdGVybWluYXRvcnMuYWRkKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREKTsKLQkJLy9EMjE3OTgyCi0JCXJldHVybiB0ZXJtaW5hdG9ycy5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFBSRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQUkUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyZDE1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFBSRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFBSRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkUFJFIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIFBSRSBlbGVtZW50IHNob3VsZCBrZWVwIHNwYWNlcyBpbiBpdHMgc291cmNlLgotCSAqLwotCXB1YmxpYyBIZWRQUkUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkUsIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0KLQkJa2VlcFNwYWNlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICh3aWR0aCBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAod2lkdGggTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5QUkU8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVwcmUuZXhjbHVzaW9uOzwvY29kZT4uCi0JICogJXByZS5leGNsdXNpb24gaXM6Ci0JICogSU1HIHwgT0JKRUNUIHwgQVBQTEVUIHwgQklHIHwgU01BTEwgfCBTVUIgfCBTVVAgfCBGT05UIHwgQkFTRUZPTlQKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRyx9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkUGNkYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFBjZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ2MDA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkUGNkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBQQ0RBVEEgdHlwZSBlbGVtZW50IGRlY2xhcmF0aW9ucy48YnI+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZFBjZGF0YSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFBjZGF0YShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BDREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBQQ0RBVEEgdHlwZSBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgdHlwZS48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkU0VMRUNULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFNFTEVDVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzg0NGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkU0VMRUNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBIZWRTRUxFQ1QgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTRUxFQ1QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRUxFQ1QsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1NFTEVDVDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOwotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChzaXplIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG11bHRpcGxlIChtdWx0aXBsZSkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoc2l6ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTVVMVElQTEUsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJQmFzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjRkNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci0KLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgU1NJIGRlY2xhcmF0aW9ucy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkU1NJQmFzZSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lCYXNlKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX1NTSTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcE5hbWUpIHsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BOYW1lKTsKLQl9Ci0KLQkvKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcE5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUNvbmZpZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4ZmI3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpDT05GSUcuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUNvbmZpZyBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUNvbmZpZyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUcsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpDT05GSUcuCi0JICogKGVycm1zZyBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKiAodGltZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9FUlJNU0csIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFRk1ULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVElNRUZNVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUVjaG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRWNoby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTU4YTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRWNoby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpFQ0hPLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lFY2hvIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRWNobyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FQ0hPLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RUNITwotCSAqICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRXhlYy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFeGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZGM3YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFeGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogU1NJOkVYRUMuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUV4ZWMgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lFeGVjKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VYRUMsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpFWEVDCi0JICogKGNnaSAlVVJJOyAjSU1QTElFRCkKLQkgKiAoY21kIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NHSSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NNRH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZsYXN0bW9kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZsYXN0bW9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNWVhYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGbGFzdG1vZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpGTEFTVE1PRC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRmxhc3Rtb2QgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lGbGFzdG1vZChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZMQVNUTU9ECi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZzaXplLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZzaXplLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYWNiNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGc2l6ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpGU0laRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRnNpemUgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lGc2l6ZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZTSVpFCi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUluY2x1ZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJSW5jbHVkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTA2Y2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJSW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpJTkNMVURFLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lJbmNsdWRlIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJSW5jbHVkZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9JTkNMVURFLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6SU5DTFVERQotCSAqIChmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqICh2aXJ0dWFsICVVUkkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lQcmludGVudi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lQcmludGVudi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI1MjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJUHJpbnRlbnYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogU1NJOlBSSU5URU5WLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lQcmludGVudiBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSVByaW50ZW52KEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1BSSU5URU5WLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCX0KLQotCS8qKgotCSAqIFNTSTpQUklOVEVOViBoYXMgbm8gYXR0cmlidXRlcy4gIFNvLCB0aGlzIG1ldGhvZCBzaG91bGQKLQkgKiBhbHdheXMgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIE5vdGU6IFNpbmNlIHNvbWVib2R5IGRvZXNuJ3QgZXhwZWN0IG51bGwgaXMgcmV0dXJuZWQsIHJldHVybiB0aGUgZW1wdHkgYXR0cmlidXRlCi0JICogbGlrZSBhIGN1c3RvbSB0YWcgd2hpY2ggZG9lc24ndCBoYXZlIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjEwOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6U0VULgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lTZXQgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lTZXQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfU0VULCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6U0VUCi0JICogKHZhciBDREFUQSAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFSLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRURVhUQVJFQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRURVhUQVJFQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjllNTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkVEVYVEFSRUEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBURVhUQVJFQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVEVYVEFSRUEgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICogVEVYVEFSRUEgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBzb3VyY2UuCi0JICovCi0JcHVibGljIEhlZFRFWFRBUkVBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQotCQlrZWVwU3BhY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBURVhUQVJFQS4KLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCSAqIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uc2VsZWN0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSVNUWUxFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkVElUTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvSGVkVElUTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1ODQ4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFRJVExFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBUSVRMRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVElUTEUgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRJVExFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBUSVRMRS4KLQkgKiAlaTE4bjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPlRJVExFPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4laGVhZC5taXNjOzwvY29kZT4uCi0JICogJWhlYWQubWlzYzsgaXMgPGNvZGU+U0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1Q8L2NvZGU+LgotCSAqIDxicj4KLQkgKiBAc2VlIGNvbS5pYm0uc2VkLmNvbnRlbnRtb2RlbC5odG1sLkhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIChTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCkKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLH07Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFVMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL0hlZFVMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YTIzYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRVTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBVTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkVUwgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVUwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVUwuCi0JICogKHR5cGUgJVVMU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL1Byb3BlcnR5UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjMxMzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIFByb3BlcnR5UHJvdmlkZXIgY2xhc3MuCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZXMuCi0gKi8KLWludGVyZmFjZSBQcm9wZXJ0eVByb3ZpZGVyIHsKLQotCWJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCk7Ci0KLQlPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUxMjAyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL2NodG1sL1Byb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuSFRNTFByb3BlcnR5RGVjbGFyYXRpb247Ci0KLS8qKgotICogVGhlIGZhY3Rvcnkgb2JqZWN0IG9mIFByb3BlcnR5UHJvdmlkZXIuCi0gKi8KLWZpbmFsIGNsYXNzIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IHsKLQotCi0JLyoqCi0JICogRGVmYXVsdFByb3ZpZGVyIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIHVua25vd24gcHJvcGVydGllcy4KLQkgKiBJdCBhbHdheXMgcmV0dXJucyBudWxsIHZhbHVlIGZvciBhbnkgcHJvcGVydGllcy4KLQkgKi8KLQljbGFzcyBEZWZhdWx0UHJvdmlkZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIERlZmF1bHRQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCWFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIChlZGVjbCAhPSBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCWlmICghKGVkZWNsIGluc3RhbmNlb2YgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGdldEVsZW1lbnRQcm9wZXJ0eSgoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pZWRlY2wpOwotCQl9Ci0KLQkJYWJzdHJhY3QgcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCk7Ci0JfQotCi0JLyoKLQkgKiAidGFnSW5mbyIKLQkgKiBnZXRzIGRvY3VtZW50YXRpb24gZm9yIHRoZSBlbGVtZW50Ci0JICovCi0JY2xhc3MgUFBUYWdJbmZvIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBodG1sQW5ub3RhdGlvbkxvYyA9ICJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYueG1sIjsgLy8kTk9OLU5MUy0xJAotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBmQW5ub3RhdGlvbk1hcCA9IG51bGw7Ci0KLQkJcHVibGljIFBQVGFnSW5mbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogR2V0cyB0aGUgYW5ub3RhdGlvbk1hcC4KLQkJICogQHJldHVybiBSZXR1cm5zIGEgQW5ub3RhdGlvbk1hcAotCQkgKi8KLQkJcHJvdGVjdGVkIEFubm90YXRpb25NYXAgZ2V0QW5ub3RhdGlvbk1hcCgpIHsKLQkJCWlmIChmQW5ub3RhdGlvbk1hcCA9PSBudWxsKSB7Ci0JCQkJZkFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotCQkJCXRyeSB7Ci0JCQkJCWZBbm5vdGF0aW9uTWFwLmxvYWQoaHRtbEFubm90YXRpb25Mb2MpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm8gYW5ub3RhdGlvbiBhdmFpbGFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZkFubm90YXRpb25NYXA7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlpZiAoZGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbk1hcCgpLmdldFByb3BlcnR5KCgoSFRNTEVsZW1lbnREZWNsYXJhdGlvbilkZWNsKS5nZXRFbGVtZW50TmFtZSgpLCAidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAic2hvdWxkS2VlcFNwYWNlIgotCSAqLwotCWNsYXNzIFBQU2hvdWxkS2VlcFNwYWNlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFNob3VsZEtlZXBTcGFjZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5zaG91bGRLZWVwU3BhY2VzKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAic2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UiCi0JICovCi0JY2xhc3MgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5zaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogInRlcm1pbmF0b3JzIgotCSAqLwotCWNsYXNzIFBQVGVybWluYXRvcnMgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQVGVybWluYXRvcnMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICghIChkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1EZWNsSW1wbCkpIHJldHVybiBudWxsOwotCQkJcmV0dXJuICgoSFRNTEVsZW1EZWNsSW1wbClkZWNsKS5nZXRUZXJtaW5hdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAicHJvaGliaXRlZEFuY2VzdG9ycyIKLQkgKi8KLQljbGFzcyBQUFByb2hpYml0ZWRBbmNlc3RvcnMgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQUHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc0pTUCIKLQkgKi8KLQljbGFzcyBQUElzSlNQIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzSlNQKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLmlzSlNQKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNYSFRNTCIKLQkgKiBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGl0c2VsZiBuZXZlciByZXByZXNlbnQgYW55IFhIVE1MIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0JICogU28sIHRoaXMgcHJvcGVydHkgbXVzdCBiZSBhbHdheXMgZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1hIVE1MIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzWEhUTUwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzU1NJIgotCSAqIEVhY2ggZGVjbGFyYXRpb24gY2xhc3MgZm9yIFNTSSBlbGVtZW50cyBtdXN0IHByb3ZpZGUgdGhpcyBwcm9wZXJ0eSBpdHNlbGYsCi0JICogYW5kIHRoZW4gcmV0dXJuIHRydWUuICBPdGhlciBkZWNsYXJhdGlvbiBtdXN0IGFsd2F5cyByZXR1cm4gZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1NTSSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1NTSSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGluZUJyZWFrSGludCIKLQkgKi8KLQljbGFzcyBQUExpbmVCcmVha0hpbnQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGluZUJyZWFrSGludCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGluZUJyZWFrSGludCgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgOgotCQkJCQloaW50ID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIGhpbnQ7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJsYXlvdXRUeXBlIgotCSAqLwotCWNsYXNzIFBQTGF5b3V0VHlwZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBMYXlvdXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CTE9DSyA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfQkxPQ0s7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JSRUFLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfSElEREVOOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfT0JKRUNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX1dSQVAgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX1dSQVA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkby4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCX0KLQotCS8qCi0JICogIm9taXRUeXBlIgotCSAqLwotCWNsYXNzIFBQT21pdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQT21pdFR5cGUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIHR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0T21pdFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0JPVEggOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9ERUZBVUxUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9NVVNUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX01VU1Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpbmNsdXNpb24iCi0JICovCi0JY2xhc3MgUFBJbmNsdXNpb24gZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSW5jbHVzaW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBkZWNsLmdldEluY2x1c2lvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyIGdldFByb3ZpZGVyKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLQkJUHJvcGVydHlQcm92aWRlciBwcCA9IChQcm9wZXJ0eVByb3ZpZGVyKSBmYWN0b3J5LnJlZ2lzdHJ5LmdldChwcm9wTmFtZSk7Ci0JCWlmIChwcCAhPSBudWxsKQotCQkJcmV0dXJuIHBwOwotCi0JCXBwID0gZmFjdG9yeS5jcmVhdGUocHJvcE5hbWUpOwotCQlpZiAocHAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWN0b3J5LmRlZmF1bHRQcm92aWRlcjsKLQotCQlmYWN0b3J5LnJlZ2lzdHJ5LnB1dChwcm9wTmFtZSwgcHApOwotCQlyZXR1cm4gcHA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlQcm92aWRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgUHJvcGVydHlQcm92aWRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaHRhYmxlIHJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgRGVmYXVsdFByb3ZpZGVyKCk7Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBjcmVhdGUoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBudWxsOwotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXBwID0gbmV3IFBQSXNKU1AoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcHAgPSBuZXcgUFBJc1hIVE1MKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlwcCA9IG5ldyBQUElzU1NJKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkxBWU9VVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQTGF5b3V0VHlwZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcHAgPSBuZXcgUFBMaW5lQnJlYWtIaW50KCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKSkKLQkJCXBwID0gbmV3IFBQUHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfS0VFUF9TUEFDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEtlZXBTcGFjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEluZGVudENoaWxkU291cmNlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRFUk1JTkFUT1JTKSkKLQkJCXBwID0gbmV3IFBQVGVybWluYXRvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVEFHSU5GTykpCi0JCQlwcCA9IG5ldyBQUFRhZ0luZm8oKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQT21pdFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSU5DTFVTSU9OKSkKLQkJCXBwID0gbmV3IFBQSW5jbHVzaW9uKCk7Ci0KLQkJcmV0dXJuIHBwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL3NzaS9TU0lDTURvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnRtb2RlbC9zc2kvU1NJQ01Eb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmYmFmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvY29udGVudG1vZGVsL3NzaS9TU0lDTURvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuc3NpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBmYWN0b3J5IGZvciBTU0kgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU1NJQ01Eb2N1bWVudEZhY3RvcnkgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZJWCA9ICJTU0kiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9DX1RZUEVfTkFNRSA9ICJTU0kiOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBjbGFzcyBDTU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cyBDTU5hbWVzcGFjZSB7Ci0JCXB1YmxpYyBDTU5hbWVzcGFjZUltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCQlyZXR1cm4gUFJFRklYOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gRE9DX1RZUEVfTkFNRTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQ01Ob2RlLk5BTUVfU1BBQ0U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgQ01Eb2NJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudCB7Ci0JCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgaGNtID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCi0JCXN0YXRpYyBjbGFzcyBFbGVtZW50cyBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQkJCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfQ09ORklHLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VDSE8sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRVhFQywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9JTkNMVURFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1BSSU5URU5WLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1NFVH07Ci0JCQlwcml2YXRlIEhhc2h0YWJsZSBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJCXB1YmxpYyBFbGVtZW50cygpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBlbGVtcyA9IGhjbS5nZXRFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtcy5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQkJCW1hcC5wdXQobmFtZSwgZGVjKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCXJldHVybiBtYXAuc2l6ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJCVN0cmluZyBjb29rZWQgPSBnZXRDYW5vbmljYWxOYW1lKG5hbWUpOwotCQkJCWlmICghbWFwLmNvbnRhaW5zS2V5KGNvb2tlZCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJldHVybiAoQ01Ob2RlKSBtYXAuZ2V0KGNvb2tlZCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKC0taW5kZXggPCAwKQotCQkJCQkJcmV0dXJuIChDTU5vZGUpIG5vZGU7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQkJcmV0dXJuIG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJfQotCi0JCQlwcml2YXRlIFN0cmluZyBnZXRDYW5vbmljYWxOYW1lKFN0cmluZyByYXdOYW1lKSB7Ci0JCQkJcmV0dXJuIHJhd05hbWUudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXN0YXRpYyBwcml2YXRlIEVsZW1lbnRzIGVsZW1lbnRzID0gbmV3IEVsZW1lbnRzKCk7Ci0KLQotCQlwdWJsaWMgQ01Eb2NJbXBsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQkJcmV0dXJuIHNzaW5zOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIENNTmFtZXNwYWNlIHNzaW5zID0gbmV3IENNTmFtZXNwYWNlSW1wbCgpOwotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgbXljbSA9IG5ldyBDTURvY0ltcGwoKTsKLQotCXByaXZhdGUgU1NJQ01Eb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBteWNtOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDg3Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzLCB3aXRoIGl0cyBvbmUgZmllbGQsIGlzIGEgY29udmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcmluZyB0byBhIGNvbnRlbnRUeXBlIElELiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkCi0gKiBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgZmlsZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29udGVudFR5cGVJZEZvckhUTUwgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBub3QgZGVjbGFyZWQgYXMgZmluYWwsCi0JICogc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0hUTUwgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRTdHlsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudFN0eWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2I5MDAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudFN0eWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuRG9jdW1lbnRDU1M7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBkYXZpZHcKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRTdHlsZUltcGwgZXh0ZW5kcyBEb2N1bWVudEltcGwgaW1wbGVtZW50cyBYTUxEb2N1bWVudCwgRG9jdW1lbnRDU1MgewotCXB1YmxpYyBEb2N1bWVudFN0eWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRTdHlsZUltcGwoRG9jdW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChJU3R5bGVTaGVldExpc3RBZGFwdGVyKSBhZGFwdGVyKS5nZXRPdmVycmlkZVN0eWxlKGVsZW1lbnQsIHBzZXVkb05hbWUpOwotCX0KLQotCXB1YmxpYyBTdHlsZVNoZWV0TGlzdCBnZXRTdHlsZVNoZWV0cygpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIpIGFkYXB0ZXIpLmdldFN0eWxlU2hlZXRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVN0eWxlU2hlZXRzKCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChJU3R5bGVTaGVldExpc3RBZGFwdGVyKSBhZGFwdGVyKS5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVFbGVtZW50IG1ldGhvZAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hlY2tUYWdOYW1lVmFsaWRpdHkodGFnTmFtZSk7Ci0KLQkJRWxlbWVudFN0eWxlSW1wbCBlbGVtZW50ID0gbmV3IEVsZW1lbnRTdHlsZUltcGwoKTsKLQkJZWxlbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQllbGVtZW50LnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcCBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlEb2N1bWVudFN0eWxlSW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRTdHlsZUltcGwodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVkLmltcG9ydENoaWxkTm9kZXModGhpcywgdHJ1ZSk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoWE1MTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvRWxlbWVudFN0eWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L0VsZW1lbnRTdHlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5Nzg5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvRWxlbWVudFN0eWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkVsZW1lbnRDU1NJbmxpbmVTdHlsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5MaW5rU3R5bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLQotcHVibGljIGNsYXNzIEVsZW1lbnRTdHlsZUltcGwgZXh0ZW5kcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFhNTEVsZW1lbnQsIEVsZW1lbnRDU1NJbmxpbmVTdHlsZSwgTGlua1N0eWxlIHsKLQlwdWJsaWMgRWxlbWVudFN0eWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudFN0eWxlSW1wbChFbGVtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBTdHlsZVNoZWV0IGdldFNoZWV0KCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChJU3R5bGVTaGVldEFkYXB0ZXIpIGFkYXB0ZXIpLmdldFNoZWV0KCk7Ci0JfQotCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikgYWRhcHRlcikuZ2V0U3R5bGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXN1cGVyLnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlFbGVtZW50SW1wbCBjbG9uZWQgPSBuZXcgRWxlbWVudFN0eWxlSW1wbCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvSFRNTENvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L0hUTUxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmZTVjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvSFRNTENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY2xlYW51cC5IVE1MQ2xlYW51cFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnByZWZlcmVuY2VzLkNvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxEb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29udmVydGVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKFhNTE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbCBwcm9jZXNzb3IgPSBuZXcgSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsKCk7Ci0JCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIHByZWYgPSBwcm9jZXNzb3IuZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gYmFja3VwIG9wdGlvbnMKLQkJYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgPSBwcmVmLmdldENvbXByZXNzRW1wdHlFbGVtZW50VGFncygpOwotCQlib29sZWFuIGluc2VydFJlcXVpcmVkQXR0cnMgPSBwcmVmLmdldEluc2VydFJlcXVpcmVkQXR0cnMoKTsKLQkJYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyA9IHByZWYuZ2V0SW5zZXJ0TWlzc2luZ1RhZ3MoKTsKLQkJYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMgPSBwcmVmLmdldFF1b3RlQXR0clZhbHVlcygpOwotCQlib29sZWFuIGZvcm1hdFNvdXJjZSA9IHByZWYuZ2V0Rm9ybWF0U291cmNlKCk7Ci0JCWludCB0YWdOYW1lQ2FzZSA9IHByZWYuZ2V0VGFnTmFtZUNhc2UoKTsKLQkJaW50IGF0dHJOYW1lQ2FzZSA9IHByZWYuZ2V0QXR0ck5hbWVDYXNlKCk7Ci0KLQkJLy8gc2V0dXAgb3B0aW9ucwotCQlwcmVmLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyh0cnVlKTsKLQkJcHJlZi5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHRydWUpOwotCQlwcmVmLnNldEluc2VydE1pc3NpbmdUYWdzKHRydWUpOwotCQlwcmVmLnNldFF1b3RlQXR0clZhbHVlcyh0cnVlKTsKLQkJcHJlZi5zZXRGb3JtYXRTb3VyY2UoZmFsc2UpOwotCQlpZiAobW9kZWwuZ2V0RG9jdW1lbnQoKS5pc1hNTFR5cGUoKSkgeyAvLyBYSFRNTAotCQkJcHJlZi5zZXRUYWdOYW1lQ2FzZShDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCQlwcmVmLnNldEF0dHJOYW1lQ2FzZShDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmVmLnNldFRhZ05hbWVDYXNlKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQkJcHJlZi5zZXRBdHRyTmFtZUNhc2UoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCX0KLQotCQlwcm9jZXNzb3IuY2xlYW51cE1vZGVsKG1vZGVsKTsKLQotCQkvLyBzZXQgYmFjayBvcHRpb25zCi0JCXByZWYuc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKGNvbXByZXNzRW1wdHlFbGVtZW50VGFncyk7Ci0JCXByZWYuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhpbnNlcnRSZXF1aXJlZEF0dHJzKTsKLQkJcHJlZi5zZXRJbnNlcnRNaXNzaW5nVGFncyhpbnNlcnRNaXNzaW5nVGFncyk7Ci0JCXByZWYuc2V0UXVvdGVBdHRyVmFsdWVzKHF1b3RlQXR0clZhbHVlcyk7Ci0JCXByZWYuc2V0Rm9ybWF0U291cmNlKGZvcm1hdFNvdXJjZSk7Ci0JCXByZWYuc2V0VGFnTmFtZUNhc2UodGFnTmFtZUNhc2UpOwotCQlwcmVmLnNldEF0dHJOYW1lQ2FzZShhdHRyTmFtZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIGRlY2xhcmF0b2luOiAiZGF0YSIgZm9yIFhNTCBkZWNsYXJhdGlvbiwgc3VjaCBhcyAidmVyc2lvbj1cIjEuMFwiIgotCSAqIHB1YmxpY0lkOiBwdWJsaWNJZCBmb3IgRE9DVFlQRSBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnZlcnQoWE1MTW9kZWwgbW9kZWwsIFN0cmluZyBkZWNsYXJhdGlvbiwgU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzZXREZWNsYXJhdGlvbihtb2RlbCwgZGVjbGFyYXRpb24sIHB1YmxpY0lkKTsKLQkJY2xlYW51cE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWNsYXJhdG9pbjogImRhdGEiIGZvciBYTUwgZGVjbGFyYXRpb24sIHN1Y2ggYXMgInZlcnNpb249XCIxLjBcIiIKLQkgKiBwdWJsaWNJZDogcHVibGljSWQgZm9yIERPQ1RZUEUgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb252ZXJ0KElucHV0U3RyZWFtIGlucHV0LCBPdXRwdXRTdHJlYW0gb3V0cHV0LCBTdHJpbmcgZGVjbGFyYXRpb24sIFN0cmluZyBwdWJsaWNJZCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJWE1MTW9kZWwgbW9kZWwgPSByZWFkTW9kZWwoaW5wdXQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWNvbnZlcnQobW9kZWwsIGRlY2xhcmF0aW9uLCBwdWJsaWNJZCk7Ci0JCQl3cml0ZU1vZGVsKG1vZGVsLCBvdXRwdXQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBkZWNsYXJhdG9pbjogImRhdGEiIGZvciBYTUwgZGVjbGFyYXRpb24sIHN1Y2ggYXMgInZlcnNpb249XCIxLjBcIiIKLQkgKiBwdWJsaWNJZDogcHVibGljSWQgZm9yIERPQ1RZUEUgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb252ZXJ0KElGaWxlIGZpbGUsIFN0cmluZyBkZWNsYXJhdGlvbiwgU3RyaW5nIHB1YmxpY0lkKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlYTUxNb2RlbCBtb2RlbCA9IHJlYWRNb2RlbChmaWxlKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQljb252ZXJ0KG1vZGVsLCBkZWNsYXJhdGlvbiwgcHVibGljSWQpOwotCQkJd3JpdGVNb2RlbChtb2RlbCwgZmlsZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5zZXJ0QnJlYWsoWE1MTW9kZWwgbW9kZWwsIE5vZGUgbm9kZSkgewotCQlpZiAobW9kZWwgPT0gbnVsbCB8fCBub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZ2V0IGRlbGltaXRlciBzdHJpbmcKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgZGVsaW0gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcigpOwotCQlpZiAoZGVsaW0gPT0gbnVsbCB8fCBkZWxpbS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRleHQgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRlbGltKTsKLQkJcGFyZW50Lmluc2VydEJlZm9yZSh0ZXh0LCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFhNTE1vZGVsIHJlYWRNb2RlbChJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gY3JlYXRlIHRlbXBvcmFyeSBtb2RlbAotCQlTdHJpbmcgaWQgPSBpbnB1dC50b1N0cmluZygpICsgIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoaWQsIGlucHV0LCBudWxsKTsKLQkJaWYgKCEobW9kZWwgaW5zdGFuY2VvZiBYTUxNb2RlbCkpIHsKLQkJCWlmIChtb2RlbCA9PSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChYTUxNb2RlbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbCByZWFkTW9kZWwoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCWlmICghKG1vZGVsIGluc3RhbmNlb2YgWE1MTW9kZWwpKSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoWE1MTW9kZWwpIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlY2xhcmF0aW9uKFhNTE1vZGVsIG1vZGVsLCBTdHJpbmcgZGVjbGFyYXRpb24sIFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IG51bGw7Ci0JCQlOb2RlIGNoaWxkID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCVN0cmluZyB0YXJnZXQgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZXF1YWxzKCJ4bWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgY2hpbGQ7Ci0JCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlYTUxEb2N1bWVudFR5cGUgZG9jVHlwZSA9IChYTUxEb2N1bWVudFR5cGUpIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQotCQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAocGkgIT0gbnVsbCkgewotCQkJCQlwaS5zZXREYXRhKGRlY2xhcmF0aW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXBpID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCBkZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKHBpLCBjaGlsZCk7Ci0JCQkJCWluc2VydEJyZWFrKG1vZGVsLCBjaGlsZCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocHVibGljSWQgIT0gbnVsbCkgewotCQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVudHJ5KHB1YmxpY0lkKTsKLQkJCQlTdHJpbmcgbmFtZSA9IChlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0TmFtZSgpIDogbnVsbCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApCi0JCQkJCW5hbWUgPSAiSFRNTCI7IC8vIGRlZmF1bHQgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKCFuYW1lLmVxdWFscyhkb2NUeXBlLmdldE5hbWUoKSkpIHsgLy8gcmVwbGFjZQotCQkJCQkJTm9kZSBwYXJlbnQgPSBkb2NUeXBlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWNoaWxkID0gZG9jVHlwZTsKLQkJCQkJCWRvY1R5cGUgPSAoWE1MRG9jdW1lbnRUeXBlKSBkb2N1bWVudC5jcmVhdGVEb2N0eXBlKG5hbWUpOwotCQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShkb2NUeXBlLCBjaGlsZCk7Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkb2NUeXBlID0gKFhNTERvY3VtZW50VHlwZSkgZG9jdW1lbnQuY3JlYXRlRG9jdHlwZShuYW1lKTsKLQkJCQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKGRvY1R5cGUsIGNoaWxkKTsKLQkJCQkJaW5zZXJ0QnJlYWsobW9kZWwsIGNoaWxkKTsKLQkJCQl9Ci0JCQkJZG9jVHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN5c3RlbUlkID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJCQkJaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JCQkJCQlkb2NUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGVudHJ5LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCQlpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLQkJCQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxucyIsIG5hbWVzcGFjZVVSSSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTW9kZWwoWE1MTW9kZWwgbW9kZWwsIE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IG91dHB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5zYXZlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTW9kZWwoWE1MTW9kZWwgbW9kZWwsIElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvL0J5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvL291dHB1dCA9IG5ldwotCQkJLy8gQnl0ZUFycmF5T3V0cHV0U3RyZWFtKHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0JCQltb2RlbC5zYXZlKCk7Ci0JCQkvL2lucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dC50b0J5dGVBcnJheSgpKTsKLQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbnB1dCwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLwkJCWlmIChvdXRwdXQgIT0gbnVsbCkKLQkJCS8vCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCQkJaW5wdXQuY2xvc2UoKTsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMTEyYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudHByb3BlcnRpZXMuQ29udGVudFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudHByb3BlcnRpZXMuQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50cHJvcGVydGllcy5JQ29udGVudFNldHRpbmdzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxEb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVySW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlciBleHRlbmRzIERvY3VtZW50VHlwZUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyLCBIVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzIHsKLQotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUeXBlID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTCA9ICJ4bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFhIVE1MID0gInhodG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXTUwgPSAid21sIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyKFhNTERvY3VtZW50IGRvY3VtZW50LCBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlcihkb2N1bWVudCk7Ci0KLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQotCQkvLyBpbml0aWFsaXplCi0JCWRvY3VtZW50VHlwZUNoYW5nZWQoKTsKLQotCQlDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmdldFN1YmplY3QoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250ZW50U2V0dGluZ3NDaGFuZ2VkKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MTW9kZWwgbW9kZWwgPSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUobW9kZWwpOwotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghcHJvamVjdC5lcXVhbHMocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSkKLQkJCXJldHVybjsKLQkJZG9jdW1lbnRUeXBlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBkb2N1bWVudFR5cGVDaGFuZ2VkKCkgewotCQlYTUxEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlYTUxNb2RlbCBtb2RlbCA9IGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKG1vZGVsKTsKLQotCQkvLyBmaW5kIERPQ1RZUEUgZGVsY2FyYXRpb24gYW5kIFB1YmxpYyBJRAotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCQlEb2N1bWVudFR5cGUgbmV3RG9jdW1lbnRUeXBlID0gZmluZERvY3VtZW50VHlwZShkb2N1bWVudCk7Ci0JCWlmIChuZXdEb2N1bWVudFR5cGUgIT0gbnVsbCkgewotCQkJcHVibGljSWQgPSBuZXdEb2N1bWVudFR5cGUuZ2V0UHVibGljSWQoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGxvb2t1cCBkZWZhdWx0IHNldCBieSBjb250ZW50c2V0dGluZ3MKLQkJCXB1YmxpY0lkID0gZ2V0RGVmYXVsdFB1YmxpY0lkKGZpbGUpOwotCQl9Ci0KLQkJLy8gbG9va3VwIERPQ1RZUEUgcmVnaXN0cnkKLQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IG5ld0VudHJ5ID0gbnVsbDsKLQkJaWYgKHB1YmxpY0lkICE9IG51bGwpIHsKLQkJCW5ld0VudHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RW50cnkocHVibGljSWQpOwotCQl9Ci0KLQkJYm9vbGVhbiBuZXdYTUxUeXBlID0gKG5ld0VudHJ5ICE9IG51bGwgPyBuZXdFbnRyeS5pc1hNTFR5cGUoKSA6IGZhbHNlKTsKLQkJYm9vbGVhbiBuZXdXTUxUeXBlID0gKG5ld0VudHJ5ICE9IG51bGwgPyBuZXdFbnRyeS5pc1dNTFR5cGUoKSA6IGZhbHNlKTsKLQotCQlpZiAoIW5ld1hNTFR5cGUpIHsKLQkJCS8vIGZpbmQgWE1MIGRlY2xhcmF0aW9uCi0JCQlpZiAoZmluZFhNTE5vZGUoZG9jdW1lbnQpICE9IG51bGwpIHsKLQkJCQluZXdYTUxUeXBlID0gdHJ1ZTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgZmlsZSBleHRlbnNpb24KLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZXh0ID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJaWYgKGV4dCAhPSBudWxsICYmIGV4dC5lcXVhbHNJZ25vcmVDYXNlKFhIVE1MKSkgewotCQkJCQluZXdYTUxUeXBlID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoZXh0ICE9IG51bGwgJiYgZXh0LmVxdWFsc0lnbm9yZUNhc2UoV01MKSkgewotCQkJCQluZXdYTUxUeXBlID0gdHJ1ZTsKLQkJCQkJbmV3V01MVHlwZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlpZiAobmV3RW50cnkgPT0gbnVsbCkgewotCQkJLy8gbG9va3VwIHN5c3RlbSBkZWZhdWx0Ci0JCQlpZiAobmV3WE1MVHlwZSAmJiBuZXdEb2N1bWVudFR5cGUgPT0gbnVsbCkgewotCQkJCS8vIHVzZSBkZWZhdWx0IFhIVE1MLCBpZiBpdCdzIFhNTCBhbmQgbm8gZG9jdW1lbnQgdHlwZQotCQkJCS8vIGRlY2xhcmVkCi0JCQkJaWYgKG5ld1dNTFR5cGUpCi0JCQkJCW5ld0VudHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdEVudHJ5KEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5ERUZBVUxUX1dNTCk7Ci0JCQkJZWxzZQotCQkJCQluZXdFbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRFbnRyeShIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuREVGQVVMVF9YSFRNTCk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJbmV3RW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RW50cnkoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkRFRkFVTFRfSFRNTCk7Ci0JCQl9Ci0JCQlpZiAobmV3RW50cnkgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCX0KLQotCQlpZiAobmV3RG9jdW1lbnRUeXBlID09IG51bGwpIHsKLQkJCURvY3VtZW50VHlwZSBvbGREb2N1bWVudFR5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQkJCWlmIChvbGREb2N1bWVudFR5cGUgPT0gbnVsbCB8fCBvbGREb2N1bWVudFR5cGUuZ2V0TmFtZSgpICE9IG5ld0VudHJ5LmdldE5hbWUoKSkgewotCQkJCS8vIGNyZWF0ZSBpbXBsaWNpdCBEb2N1bWVudFR5cGUKLQkJCQlET01JbXBsZW1lbnRhdGlvbiBpbXBsID0gZG9jdW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKLQkJCQlpZiAoaW1wbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gbmV3RW50cnkuZ2V0TmFtZSgpOwotCQkJCQlwdWJsaWNJZCA9IG5ld0VudHJ5LmdldFB1YmxpY0lkKCk7Ci0JCQkJCVN0cmluZyBzeXN0ZW1JZCA9IG5ld0VudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCQkJCW5ld0RvY3VtZW50VHlwZSA9IGltcGwuY3JlYXRlRG9jdW1lbnRUeXBlKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBub3RpZnkgPSBmYWxzZTsKLQkJaWYgKHRoaXMuZW50cnkgIT0gbnVsbCkgeyAvLyBkbyBub3Qgbm90aWZ5IG9uIGluaXRpYWxpemF0aW9uCi0JCQlub3RpZnkgPSAobmV3RW50cnkgIT0gdGhpcy5lbnRyeSB8fCBuZXdYTUxUeXBlICE9IHRoaXMuaXNYTUxUeXBlKTsKLQkJfQotCi0JCWlmIChuZXdEb2N1bWVudFR5cGUgIT0gbnVsbCkKLQkJCXNldERvY3VtZW50VHlwZShuZXdEb2N1bWVudFR5cGUpOwotCQl0aGlzLmVudHJ5ID0gbmV3RW50cnk7Ci0JCXRoaXMuaXNYTUxUeXBlID0gbmV3WE1MVHlwZTsKLQotCQlpZiAobm90aWZ5KQotCQkJbm90aWZ5RG9jdW1lbnRUeXBlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MRG9jdW1lbnRUeXBlIGZpbmREb2N1bWVudFR5cGUoWE1MRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJWE1MRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSA9IChYTUxEb2N1bWVudFR5cGUpIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQkJaWYgKGRvY3VtZW50VHlwZSAhPSBudWxsICYmIGRvY3VtZW50VHlwZS5nZXRFeGlzdGluZ0FkYXB0ZXIoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcykgPT0gbnVsbCkgewotCQkJLy8gd2F0Y2ggZnV0dXJlIGNoYW5nZXMKLQkJCWRvY3VtZW50VHlwZS5hZGRBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBOb2RlIGZpbmRYTUxOb2RlKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyB0YXJnZXQgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5lcXVhbHMoWE1MKSkgewotCQkJCXJldHVybiBjaGlsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJaWYgKGlzWE1MVHlwZSgpKQotCQkJcmV0dXJuIExPV0VSX0NBU0U7IC8vIFhIVE1MCi0JCXJldHVybiB0aGlzLmZhY3RvcnkuZ2V0QXR0ck5hbWVDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFB1YmxpY0lkKElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNvbnRlbnRTZXR0aW5ncyBzZXR0aW5ncyA9IENvbnRlbnRTZXR0aW5ncy5nZXRJbnN0YW5jZSgpOwotCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcHVibGljSWQgPSBzZXR0aW5ncy5nZXRQcm9wZXJ0eShmaWxlLCBJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSk7Ci0JCWlmIChwdWJsaWNJZCA9PSBudWxsIHx8IHB1YmxpY0lkLmxlbmd0aCgpID09IDApIHsKLQkJCS8vIGxvb2sgdXAgcHJvamVjdCBkZWZhdWx0Ci0JCQlwdWJsaWNJZCA9IHNldHRpbmdzLmdldFByb3BlcnR5KHByb2plY3QsIElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFKTsKLQkJfQotCQlyZXR1cm4gcHVibGljSWQ7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJSUZpbGUgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJcmVzdWx0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQkJaWYgKGlzWE1MVHlwZSgpKQotCQkJcmV0dXJuIExPV0VSX0NBU0U7IC8vIFhIVE1MCi0JCXJldHVybiB0aGlzLmZhY3RvcnkuZ2V0VGFnTmFtZUNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChmZWF0dXJlLmVxdWFscyhIVE1MKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZmVhdHVyZS5lcXVhbHMoU1NJKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZmVhdHVyZS5lcXVhbHMoRlJBTUVTRVQpKSB7Ci0JCQlpZiAodGhpcy5lbnRyeSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiB0aGlzLmVudHJ5Lmhhc0ZyYW1lc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNYTUxUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgWE1MRG9jdW1lbnQpIHsKLQkJCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkKLQkJCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuQ0hBTkdFKQotCQkJCXJldHVybjsKLQkJfQotCQlkb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5nZXRTdWJqZWN0KCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmJjNzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnByZWZlcmVuY2VzLkNvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxEb2N1bWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeSwgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzIHsKLQotCXByaXZhdGUgc3RhdGljIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdGFnTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLlVQUEVSX0NBU0U7Ci0JcHJpdmF0ZSBpbnQgYXR0ck5hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCS8vcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gbnVsbDsKLQlwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQl0aGlzLnByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCS8vdGhpcy5zdG9yZSA9IENvbW1vblByZWZlcmVuY2VzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoQ29udGVudFR5cGVSZWdpc3RyeS5IVE1MX0lEKTsKLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJdXBkYXRlQ2FzZXMoKTsgLy8gaW5pdGlhbGl6ZQotCQkJdGhpcy5wcmVmZXJlbmNlcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4KLQkgKiBJdCBtYXkgYmUgYSBzaW5nbGV0b24gb3Igbm90IC4uLiBkZXBlbmRpbmcgb24gdGhlIG5lZWRzIG9mIHRoZSBJTm9kZUFkYXB0ZXIgIC4uLgotCSAqIGJ1dCBpbiBnZW5lcmFsIGl0IGlzIHJlY29tbWVuZGVkIGZvciBhbiBhZGFwdGVyIHRvIGJlIHN0YXRlbGVzcywgCi0JICogc28gdGhlIGVmZmljaWVuY2llcyBvZiBhIHNpbmdsZXRvbiBjYW4gYmUgZ2FpbmVkLgotCSAqCi0JICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIGFkZEFkYXB0ZXIgb24gdGhlIGFkYXB0ZWQKLQkgKiBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJaWYgKCEobm90aWZpZXIgaW5zdGFuY2VvZiBYTUxEb2N1bWVudCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJYWRhcHRlciA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlcigoWE1MRG9jdW1lbnQpIG5vdGlmaWVyLCB0aGlzKTsKLQkJbm90aWZpZXIuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQHJldHVybiBjb20uaWJtLml3dC5jc3MuYWRhcHRlcnMuSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0JCXJldHVybiB0aGlzLnRhZ05hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCWlmIChwcm9wZXJ0eSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChwcm9wZXJ0eS5lcXVhbHMoVEFHX05BTUVfQ0FTRSkgfHwgcHJvcGVydHkuZXF1YWxzKEFUVFJfTkFNRV9DQVNFKSkgewotCQkJdXBkYXRlQ2FzZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDYXNlcygpIHsKLQkJdGhpcy50YWdOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuVVBQRVJfQ0FTRTsKLQkJdGhpcy5hdHRyTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0KLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5nZXRJbnQoVEFHX05BTUVfQ0FTRSkgPT0gTE9XRVIpIHsKLQkJCXRoaXMudGFnTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JCX0KLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuZ2V0SW50KEFUVFJfTkFNRV9DQVNFKSA9PSBVUFBFUikgewotCQkJdGhpcy5hdHRyTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLlVQUEVSX0NBU0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgY29weSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDRlNWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuZG9jdW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTERvY3VtZW50VHlwZUNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIVE1MID0gIkhUTUwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBTUVTRVQgPSAiRlJBTUVTRVQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1NJID0gIlNTSSI7IC8vJE5PTi1OTFMtMSQKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4YzExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlRW50cnkgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyBwdWJsaWNJZDsKLQlwcml2YXRlIFN0cmluZyBzeXN0ZW1JZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzWE1MVHlwZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNYSFRNTFR5cGU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzV01MVHlwZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRnJhbWVzZXQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFhIVE1MOwotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRXTUw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhIVE1MX05BTUUgPSAiaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSFRNTF9OQU1FID0gIkhUTUwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUVudHJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgYm9vbGVhbiBpc1hIVE1MVHlwZSwgYm9vbGVhbiBoYXNGcmFtZXNldCwgU3RyaW5nIGRpc3BsYXlOYW1lLCBib29sZWFuIGlzRGVmYXVsdFhIVE1MLCBib29sZWFuIGlzRGVmYXVsdFdNTCwgYm9vbGVhbiBpc1dNTFR5cGUpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGlzWE1MVHlwZSkKLQkJCQl0aGlzLm5hbWUgPSBYSFRNTF9OQU1FOy8vIG5lZWQgY29kZSBmb3Igd21sPwotCQkJZWxzZQotCQkJCXRoaXMubmFtZSA9IEhUTUxfTkFNRTsKLQkJfQotCQl0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQkJdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0JCXRoaXMuaXNYTUxUeXBlID0gaXNYSFRNTFR5cGUgfCBpc1dNTFR5cGU7Ci0JCXRoaXMuaGFzRnJhbWVzZXQgPSBoYXNGcmFtZXNldDsKLQkJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQl0aGlzLmlzRGVmYXVsdFhIVE1MID0gaXNEZWZhdWx0WEhUTUw7Ci0JCXRoaXMuaXNEZWZhdWx0V01MID0gaXNEZWZhdWx0V01MOwotCQl0aGlzLmlzWEhUTUxUeXBlID0gaXNYSFRNTFR5cGU7Ci0JCXRoaXMuaXNXTUxUeXBlID0gaXNXTUxUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiB0aGlzLnN5c3RlbUlkOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNYTUxUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0ZyYW1lc2V0KCkgewotCQlyZXR1cm4gdGhpcy5oYXNGcmFtZXNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHRYSFRNTCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNEZWZhdWx0WEhUTUw7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0V01MKCkgewotCQlyZXR1cm4gdGhpcy5pc0RlZmF1bHRXTUw7Ci0JfQotCi0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1hIVE1MVHlwZSgpIHsKLQkJcmV0dXJuIGlzWEhUTUxUeXBlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzV01MVHlwZSgpIHsKLQkJcmV0dXJuIGlzV01MVHlwZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTgzNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIEhhc2h0YWJsZSBlbnRyaWVzID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0RW50cnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRlZmF1bHRYSFRNTEVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0V01MRW50cnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRlZmF1bHRDSFRNTEVudHJ5ID0gbnVsbDsKLQotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9IVE1MID0gMDsKLQlmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfWEhUTUwgPSAxOwotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9XTUwgPSAyOwotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9DSFRNTCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSFRNTF9QVUJMSUNfSUQgPSAiLS8vVzNDLy9EVEQgQ29tcGFjdCBIVE1MIDEuMCBEcmFmdC8vRU4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMuZW50cmllcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJLy8gSFRNTCA0LjAxCi0JCVN0cmluZyBuYW1lID0gIkhUTUwiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHB1YmxpY0lkID0gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkaXNwbGF5TmFtZSA9ICJIVE1MIDQuMDEgVHJhbnNpdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRlZmF1bHRFbnRyeSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlRW50cnkobmFtZSwgcHVibGljSWQsIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSwgZGlzcGxheU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQl0aGlzLmVudHJpZXMucHV0KHB1YmxpY0lkLCB0aGlzLmRlZmF1bHRFbnRyeSk7Ci0JCXB1YmxpY0lkID0gIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iOy8vJE5PTi1OTFMtMSQKLQkJZGlzcGxheU5hbWUgPSAiSFRNTCA0LjAxIFN0cmljdCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5lbnRyaWVzLnB1dChwdWJsaWNJZCwgbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShuYW1lLCBwdWJsaWNJZCwgbnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBkaXNwbGF5TmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpOwotCQlwdWJsaWNJZCA9ICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIjsvLyROT04tTkxTLTEkCi0JCWRpc3BsYXlOYW1lID0gIkhUTUwgNC4wMSBGcmFtZXNldCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5lbnRyaWVzLnB1dChwdWJsaWNJZCwgbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShuYW1lLCBwdWJsaWNJZCwgbnVsbCwgbnVsbCwgZmFsc2UsIHRydWUsIGRpc3BsYXlOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7Ci0JCS8vIENIVE1MCi0JCW5hbWUgPSAiSFRNTCI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWNJZCA9IENIVE1MX1BVQkxJQ19JRDsKLQkJZGlzcGxheU5hbWUgPSAiQ29tcGFjdCBIVE1MIDEuMCBEcmFmdCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kZWZhdWx0Q0hUTUxFbnRyeSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlRW50cnkobmFtZSwgcHVibGljSWQsIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSwgZGlzcGxheU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQl0aGlzLmVudHJpZXMucHV0KHB1YmxpY0lkLCB0aGlzLmRlZmF1bHRDSFRNTEVudHJ5KTsKLQotCQlIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlcigpOwotCQlpZiAocmVhZGVyICE9IG51bGwpCi0JCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVnaXN0KFN0cmluZyBwaWQsIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkb2N0eXBlKSB7Ci0JCWlmIChwaWQgPT0gbnVsbCB8fCBkb2N0eXBlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuZW50cmllcy5wdXQocGlkLCBkb2N0eXBlKTsKLQkJaWYgKHRoaXMuZGVmYXVsdFhIVE1MRW50cnkgPT0gbnVsbCkgewotCQkJaWYgKGRvY3R5cGUuaXNEZWZhdWx0WEhUTUwoKSkKLQkJCQl0aGlzLmRlZmF1bHRYSFRNTEVudHJ5ID0gZG9jdHlwZTsKLQkJfQotCQlpZiAodGhpcy5kZWZhdWx0V01MRW50cnkgPT0gbnVsbCkgewotCQkJaWYgKGRvY3R5cGUuaXNEZWZhdWx0V01MKCkpCi0JCQkJdGhpcy5kZWZhdWx0V01MRW50cnkgPSBkb2N0eXBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBnZXREZWZhdWx0RW50cnkoaW50IHR5cGUpIHsKLQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIERFRkFVTFRfWEhUTUwgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0WEhUTUxFbnRyeTsKLQkJCQlicmVhazsKLQkJCWNhc2UgREVGQVVMVF9XTUwgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0V01MRW50cnk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERFRkFVTFRfQ0hUTUwgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0Q0hUTUxFbnRyeTsKLQkJCQlicmVhazsKLQkJCWNhc2UgREVGQVVMVF9IVE1MIDoKLQkJCWRlZmF1bHQgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0RW50cnk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZ2V0RGVmYXVsdEVudHJ5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RW50cnk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBnZXRYSFRNTERlZmF1bHRFbnRyeSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFhIVE1MRW50cnk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudHJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmVudHJpZXMuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUVudHJ5IGdldEVudHJ5KFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAocHVibGljSWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxEb2N1bWVudFR5cGVFbnRyeSkgdGhpcy5lbnRyaWVzLmdldChwdWJsaWNJZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwMmU4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqLwotY2xhc3MgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyIHsKLQotCS8vCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJkb2N1bWVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfTkFNRSA9ICJkb2N1bWVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9QSUQgPSAicHVibGljSUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9TSUQgPSAic3lzdGVtSUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9JU19YSFRNTCA9ICJpc1hIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSVNfV01MID0gImlzV01MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSEFTX0ZSQU1FU0VUID0gImhhc0ZyYW1lc2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfTlNVUkkgPSAibmFtZXNwYWNlVVJJIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfRU5BTUUgPSAiZWxlbWVudE5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9ETkFNRSA9ICJkaXNwbGF5TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lTX0RFRkFVTFRfWEhUTUwgPSAiZGVmYXVsdFhIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSVNfREVGQVVMVF9XTUwgPSAiZGVmYXVsdFdNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRWX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRWX05VTExfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlYWRSZWdpc3RyeShIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgcmVnKSB7Ci0JCWlmIChyZWcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZG9jdHlwZSA9IHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCQkvLyBudWxsIGNhbiBiZSByZXR1cm5lZCBpZiB0aGVyZSdzIGFuIGVycm9yIHJlYWRpbmcgdGhlIGVsZW1lbnQKLQkJCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJlZy5yZWdpc3QoZG9jdHlwZS5nZXRQdWJsaWNJZCgpLCBkb2N0eXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZG9jdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBwaWQgPSBudWxsOwotCQlTdHJpbmcgc2lkID0gbnVsbDsKLQkJU3RyaW5nIG5zdXJpID0gbnVsbDsKLQkJU3RyaW5nIHJvb3QgPSBudWxsOwotCQlib29sZWFuIHhodG1sID0gdHJ1ZTsKLQkJYm9vbGVhbiBmcmFtZXNldCA9IGZhbHNlOwotCQlTdHJpbmcgZG5hbWUgPSBudWxsOwotCQlib29sZWFuIGRlZmF1bHRYaHRtbCA9IGZhbHNlOwotCQlib29sZWFuIGRlZmF1bHRXTUwgPSBmYWxzZTsKLQkJYm9vbGVhbiBpc1dNTCA9IGZhbHNlOwotCi0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlwaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUElEKTsKLQkJCS8vIHB1YmxpY0lEIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuCi0JCQlpZiAocGlkID09IG51bGwgfHwgcGlkLmVxdWFscyhBVFZfTlVMTF9TVFJJTkcpKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlzaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU0lEKTsKLQkJCW5zdXJpID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05TVVJJKTsKLQkJCXJvb3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRU5BTUUpOwotCQkJeGh0bWwgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9JU19YSFRNTCk7Ci0JCQlmcmFtZXNldCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0hBU19GUkFNRVNFVCk7Ci0JCQlkbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ETkFNRSk7Ci0JCQlkZWZhdWx0WGh0bWwgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9JU19ERUZBVUxUX1hIVE1MKTsKLQkJCWRlZmF1bHRXTUwgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9JU19ERUZBVUxUX1dNTCk7Ci0JCQlpc1dNTCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0lTX1dNTCk7Ci0JCQlkb2N0eXBlID0gbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShyb290LCBwaWQsIHNpZCwgbnN1cmksIHhodG1sLCBmcmFtZXNldCwgZG5hbWUsIGRlZmF1bHRYaHRtbCwgZGVmYXVsdFdNTCwgaXNXTUwpOwotCQl9Ci0JCXJldHVybiBkb2N0eXBlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhBVFZfVFJVRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L0hUTUxNb2RlbFBhcnNlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiNGZiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuVGFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ01Ob2RlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTW9kZWxQYXJzZXJBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBIVE1MRG9jdW1lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyIGltcGxlbWVudHMgTW9kZWxQYXJzZXJBZGFwdGVyIHsKLQkvKioKLQkgKiBub3RlOiBJIG1hZGUgcHVibGljLCB0ZW1wYXJpbHksIHNvIGNvdWxkIGJlIHVzZWQgYnkgSlNQTG9hZGVyCi0JICovCi0JcHJvdGVjdGVkIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGQpIHsKLQkJaWYgKCFwYXJlbnQuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5URVJNSU5BVE9SUykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWphdmEudXRpbC5JdGVyYXRvciBpID0gKGphdmEudXRpbC5JdGVyYXRvcikgcGFyZW50LmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuVEVSTUlOQVRPUlMpOwotCQlpZiAoaSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbmV4dE5hbWUgPSBjaGlsZC5nZXRFbGVtZW50TmFtZSgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCS8vIE5PVEU6IENNRWxlbWVudERlY2xhcmF0aW9uIG9mIGNoaWxkIGlzIG5vdCBhbHdheXMgSFRNTENNRWxlbWVudERlY2xhcmF0aW9uLgotCQkJLy8gSXQgbWlnaHQgYmUgb25lIG9mIGJhc2VkIG9uIERURCAoZm9yIFhIVE1MIGVsZW1lbnQpLiAgU28sIGNvbXBhcmlzb24gbXVzdAotCQkJLy8gYmUgcGVyZm9ybWVkIGlnbm9yaW5nIGNhc2UuCi0JCQkvLyAtLSAzLzIwLzIwMDIKLQkJCVN0cmluZyB0ZXJtaW5hdG9yID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpZiAodGVybWluYXRvciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG5leHROYW1lLmVxdWFsc0lnbm9yZUNhc2UodGVybWluYXRvcikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRhaW4oRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJWE1MRWxlbWVudCBpbXBsID0gKFhNTEVsZW1lbnQpIGVsZW1lbnQ7Ci0KLQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWlmICghaW1wbC5pc0dsb2JhbFRhZygpKQotCQkJCXJldHVybiB0cnVlOyAvLyBub24gSFRNTCB0YWcKLQkJCVhNTEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gKFhNTEVsZW1lbnQpIGNoaWxkOwotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBteURlYyA9IENNTm9kZVV0aWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKG15RGVjID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvL2lmICghKG15RGVjIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikpIHJldHVybiB0cnVlOwotCQkJaWYgKG15RGVjLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAoIWNoaWxkRWxlbWVudC5pc0dsb2JhbFRhZygpKQotCQkJCXJldHVybiB0cnVlOyAvLyBub24gSFRNTCB0YWcKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNoaWxkRGVjID0gQ01Ob2RlVXRpbC5nZXRFbGVtZW50RGVjbGFyYXRpb24oY2hpbGRFbGVtZW50KTsKLQkJCWlmIChjaGlsZERlYyA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJLy9pZiAoIShjaGlsZERlYyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pKSByZXR1cm4gdHJ1ZTsKLQotCQkJaWYgKG15RGVjIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCWlmICgoKEJvb2xlYW4pICgoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgbXlEZWMpLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkuYm9vbGVhblZhbHVlKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKHNob3VsZFRlcm1pbmF0ZUF0KG15RGVjLCBjaGlsZERlYykgJiYgIWlzVmFsaWRDaGlsZChteURlYywgY2hpbGREZWMpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlTdHJpbmcgdGFnTmFtZSA9IGltcGwuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCVN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKGNoaWxkTmFtZSA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKCFpbXBsLmhhc1N0YXJ0VGFnKCkgJiYgIWltcGwuaGFzRW5kVGFnKCkpIHsKLQkJCQkvLyBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZEVsZW1lbnQuZ2V0VGFnTmFtZSgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpKSB7Ci0JCQkJCWlmICghY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEpICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUpICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSykgJiYgIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkgJiYgIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKSAmJiAhY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlYTUxFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoWE1MRWxlbWVudCkgcGFyZW50OwotCQkJCQlpZiAoIXBhcmVudEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiAhcGFyZW50RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQkJaWYgKCFjYW5Db250YWluKHBhcmVudEVsZW1lbnQsIGNoaWxkKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8vIGNvbnRleHVhbCB0ZXJtaW5hdGlvbiBmb3IgVEFCTEUgY29udGVudCB0YWdzCi0JCQlib29sZWFuIGlzVGFibGVDb250ZW50ID0gZmFsc2U7Ci0JCQlpZiAoY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKSB8fCBjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQpIHx8IGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCkpIHsKLQkJCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlzVGFibGVDb250ZW50ID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUikpIHsKLQkJCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlzVGFibGVDb250ZW50ID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URCkgfHwgY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIKSkgewotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFEKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaXNUYWJsZUNvbnRlbnQgPSB0cnVlOwotCQkJfQotCQkJaWYgKGlzVGFibGVDb250ZW50KSB7Ci0JCQkJLy8gVEFCTEUgY29udGVudCB0YWdzIHNob3VsZCB0ZXJtaW5hdGUgbm9uIFRBQkxFIGNvbnRlbnQgdGFncywKLQkJCQkvLyBpZiBpbiBUQUJMRQotCQkJCWZvciAoTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJYnJlYWs7Ci0JCQkJCVhNTEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChYTUxFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJCVN0cmluZyBwYXJlbnROYW1lID0gcGFyZW50RWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJCWlmIChwYXJlbnROYW1lID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKHBhcmVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVNQkVEKSkgewotCQkJCWlmICghY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRU1CRUQpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBpbXBsLmdldFRhZ05hbWUoKTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5FTUJFRCkpIHsKLQkJCQlYTUxUZXh0IHRleHQgPSAoWE1MVGV4dCkgY2hpbGQ7Ci0JCQkJaWYgKCF0ZXh0LmlzV2hpdGVzcGFjZSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJaWYgKGltcGwuaXNJbXBsaWNpdFRhZygpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsIHx8IGRhdGEgPT0gbnVsbCB8fCBkYXRhLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gY3JlYXRlTWV0YUVsZW1lbnQoZG9jdW1lbnQsIGRhdGEsIGlzSlNQVGFnKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJvdXRpbmUgY3JlYXRlIGFuIGltcGxpY2l0IEVsZW1lbnQgZm9yIGdpdmVuIHBhcmVudCBhbmQgY2hpbGQsCi0JICogc3VjaCBhcyBIVE1MLCBCT0RZLCBIRUFELCBhbmQgVEJPRFkgZm9yIEhUTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlSW1wbGljaXRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgY3JlYXRlTWV0YUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCWlmIChkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoZGF0YSwgMCwgdHJ1ZSk7IC8vIG9uZSBsaW5lCi0JCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8ICFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuTUVUQURBVEEpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlib29sZWFuIGlzU3RhcnRTcGFuID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXNFbmRTcGFuID0gZmFsc2U7Ci0JCW5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCXdoaWxlIChuYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHNjYW5uZXIubmV4dFZhbHVlKCk7Ci0JCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLlRZUEUpKSB7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkRFU0lHTkVSX0NPTlRST0wpKSB7Ci0JCQkJCXR5cGUgPSBNZXRhRGF0YS5ERVNJR05FUl9DT05UUk9MOwotCQkJCX0KLQkJCQllbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkRZTkFNSUNfREFUQSkpIHsKLQkJCQkJdHlwZSA9IE1ldGFEYXRhLkRZTkFNSUNfREFUQTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5BVVRIT1JfVElNRV9WSVNVQUwpKSB7Ci0JCQkJCXR5cGUgPSBNZXRhRGF0YS5BVVRIT1JfVElNRV9WSVNVQUw7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuQU5OT1RBVElPTikpIHsKLQkJCQkJdHlwZSA9IE1ldGFEYXRhLkFOTk9UQVRJT047Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuU1RBUlRTUEFOKSkgewotCQkJCWlzU3RhcnRTcGFuID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5FTkRTUEFOKSkgewotCQkJCWlmICghaXNTdGFydFNwYW4pCi0JCQkJCWlzRW5kU3BhbiA9IHRydWU7Ci0JCQl9Ci0JCQluYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQl9Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFpc1N0YXJ0U3BhbiAmJiAhaXNFbmRTcGFuKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBtZXRhRGF0YSA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSBzY2FubmVyLmdldE5leHRPZmZzZXQoKTsgLy8gc2tpcCBuZXcgbGluZQotCQlpZiAob2Zmc2V0IDwgZGF0YS5sZW5ndGgoKSkKLQkJCW1ldGFEYXRhID0gZGF0YS5zdWJzdHJpbmcob2Zmc2V0KTsKLQkJaWYgKG1ldGFEYXRhID09IG51bGwpCi0JCQltZXRhRGF0YSA9IG5ldyBTdHJpbmcoKTsKLQotCQlYTUxFbGVtZW50IGVsZW1lbnQgPSAoWE1MRWxlbWVudCkgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChNZXRhRGF0YS5QUkVGSVggKyB0eXBlKTsKLQotCQlNZXRhRGF0YUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNZXRhRGF0YUFkYXB0ZXIodHlwZSk7Ci0JCWlmIChpc1N0YXJ0U3BhbikgewotCQkJaWYgKG1ldGFEYXRhICE9IG51bGwpCi0JCQkJYWRhcHRlci5zZXREYXRhKG1ldGFEYXRhKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChtZXRhRGF0YSAhPSBudWxsKQotCQkJCWFkYXB0ZXIuc2V0RW5kRGF0YShtZXRhRGF0YSk7Ci0JCX0KLQkJZWxlbWVudC5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCQlhZGFwdGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCWVsZW1lbnQuc2V0SlNQVGFnKGlzSlNQVGFnKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbmRSb290TmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIHRhZyBtYXRjaGluZyBzaG91bGQgbm90IGJleW9uZCBUQUJMRSB0YWcgZXhjZXB0IEJPRFkgdGFnCi0JCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZyhYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJVGFnQWRhcHRlciBhZGFwdGVyID0gKFRhZ0FkYXB0ZXIpIGVsZW1lbnQuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuaXNFbmRUYWcoKTsKLQkJcmV0dXJuIGVsZW1lbnQuaXNFbmRUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDaGlsZChDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGNoaWxkKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDTUNvbnRlbnQgY29udGVudCA9IHBhcmVudC5nZXRDb250ZW50KCk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpc0NoaWxkKGNvbnRlbnQsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2hpbGQoQ01Db250ZW50IGNvbnRlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHRhcmdldCkgewotCQlzd2l0Y2ggKGNvbnRlbnQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JCQkJcmV0dXJuIGlzU2FtZURlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY29udGVudCwgdGFyZ2V0KTsKLQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQlDTU5vZGVMaXN0IGNoaWxkcmVuID0gKChDTUdyb3VwKSBjb250ZW50KS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCUNNTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JCQkJCQkJaWYgKGlzU2FtZURlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQsIHRhcmdldCkpCi0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWNvbnRpbnVlOyAvLyBHbyBuZXh0IGNoaWxkLgotCQkJCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCQkJCWlmIChpc0NoaWxkKChDTUNvbnRlbnQpIGNoaWxkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCWNvbnRpbnVlOyAvLyBHbyBuZXh0IGNoaWxkLgotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FtZURlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGFEZWMsIENNRWxlbWVudERlY2xhcmF0aW9uIG90aGVyRGVjKSB7Ci0JCXJldHVybiBhRGVjLmdldEVsZW1lbnROYW1lKCkgPT0gb3RoZXJEZWMuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2ExNDVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Nb2RlbFBhcnNlckFkYXB0ZXI7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuCi0JICogSXQgbWF5IGJlIGEgc2luZ2xldG9uIG9yIG5vdCAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUgSU5vZGVBZGFwdGVyICAuLi4KLQkgKiBidXQgaW4gZ2VuZXJhbCBpdCBpcyByZWNvbW1lbmRlZCBmb3IgYW4gYWRhcHRlciB0byBiZSBzdGF0ZWxlc3MsIAotCSAqIHNvIHRoZSBlZmZpY2llbmNpZXMgb2YgYSBzaW5nbGV0b24gY2FuIGJlIGdhaW5lZC4KLQkgKgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCBhZGRBZGFwdGVyIG9uIHRoZSBhZGFwdGVkCi0JICogb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCXJldHVybiBuZXcgSFRNTE1vZGVsUGFyc2VyQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBjb3B5IG1ldGhvZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L01ldGFEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlNzMyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudDsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEEgPSAiTUVUQURBVEEiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRTUEFOID0gInN0YXJ0c3BhbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EU1BBTiA9ICJlbmRzcGFuIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERVNJR05FUl9DT05UUk9MID0gIkRlc2lnbmVyQ29udHJvbCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOQU1JQ19EQVRBID0gIkR5bmFtaWNEYXRhIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JfVElNRV9WSVNVQUwgPSAiQXV0aG9yVGltZVZpc3VhbCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTiA9ICJBbm5vdGF0aW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiTUVUQURBVEE6IjsvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L01ldGFEYXRhQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L01ldGFEYXRhQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTA5NDY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9NZXRhRGF0YUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuVGFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFBZGFwdGVyIGltcGxlbWVudHMgVGFnQWRhcHRlciwgTWV0YURhdGEgewotCi0JcHJpdmF0ZSBYTUxFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHR5cGUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGVuZERhdGEgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIE1ldGFEYXRhQWRhcHRlcihTdHJpbmcgdHlwZSkgewotCQlzdXBlcigpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWlmICh0eXBlLmVxdWFscyhBTk5PVEFUSU9OKSkgewotCQkJCXRoaXMudHlwZSA9IEFOTk9UQVRJT047Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlLmVxdWFscyhBVVRIT1JfVElNRV9WSVNVQUwpKSB7Ci0JCQkJdGhpcy50eXBlID0gQVVUSE9SX1RJTUVfVklTVUFMOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBkYXRhID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUIHx8IHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCkgewotCQkJCWRhdGEgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWZvciAoOyBvZmZzZXQgPCBsZW5ndGg7IG9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSBkYXRhLmNoYXJBdChvZmZzZXQpOwotCQkJaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpIHsKLQkJCQlvZmZzZXQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlmb3IgKDsgb2Zmc2V0IDwgbGVuZ3RoOyBvZmZzZXQrKykgewotCQkJY2hhciBjID0gZGF0YS5jaGFyQXQob2Zmc2V0KTsKLQkJCWlmIChjICE9ICdccicgJiYgYyAhPSAnXG4nKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRhdGEuc3Vic3RyaW5nKG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlpZiAodGhpcy5lbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMuZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5kYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5kYXRhOwotCQlyZXR1cm4gZ2V0RGF0YShmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVsaW1pdGVyKFhNTE1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyBkZWxpbSA9IG51bGw7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJCWRlbGltID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJfQotCQlpZiAoZGVsaW0gPT0gbnVsbCkKLQkJCWRlbGltID0gIlxyXG4iOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlbGltOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kRGF0YSgpIHsKLQkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLmVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLmVuZERhdGEgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmVuZERhdGE7Ci0JCXJldHVybiBnZXREYXRhKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuZFRhZyhYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoIjwlLS0iKTsvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIjwhLS0iKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoTUVUQURBVEEpOwotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoVFlQRSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIj1cIiIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCh0aGlzLnR5cGUpOwotCQlidWZmZXIuYXBwZW5kKCJcIiAiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoTWV0YURhdGEuRU5EU1BBTik7Ci0JCVN0cmluZyBkYXRhID0gZ2V0RW5kRGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgZGVsaW0gPSBnZXREZWxpbWl0ZXIoZWxlbWVudC5nZXRNb2RlbCgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQl9Ci0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCItLSU+Iik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCItLT4iKTsvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUYWcoWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCI8JS0tIik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCI8IS0tIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKE1FVEFEQVRBKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlidWZmZXIuYXBwZW5kKFRZUEUpOwotCQlidWZmZXIuYXBwZW5kKCI9XCIiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQodGhpcy50eXBlKTsKLQkJYnVmZmVyLmFwcGVuZCgiXCIgIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKE1ldGFEYXRhLlNUQVJUU1BBTik7Ci0JCVN0cmluZyBkYXRhID0gZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgZGVsaW0gPSBnZXREZWxpbWl0ZXIoZWxlbWVudC5nZXRNb2RlbCgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQl9Ci0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCItLSU+Iik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCItLT4iKTsvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBUYWdBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gTWV0YURhdGFBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZygpIHsKLQkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5lbGVtZW50Lmhhc1N0YXJ0VGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLmVsZW1lbnQuaGFzRW5kVGFnKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRoaXMuZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKHRoaXMuZW5kRGF0YSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J1bnRpbWVDb250YWluZXIoKSB7Ci0JCXJldHVybiAodGhpcy50eXBlID09IEFOTk9UQVRJT04gfHwgdGhpcy50eXBlID09IEFVVEhPUl9USU1FX1ZJU1VBTCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCi0JCWlmICh0aGlzLmVsZW1lbnQgIT0gbnVsbCkKLQkJCXRoaXMuZWxlbWVudC5ub3RpZnlTdGFydFRhZ0NoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmREYXRhKFN0cmluZyBkYXRhKSB7Ci0JCXRoaXMuZW5kRGF0YSA9IGRhdGE7Ci0KLQkJaWYgKHRoaXMuZWxlbWVudCAhPSBudWxsKQotCQkJdGhpcy5lbGVtZW50Lm5vdGlmeUVuZFRhZ0NoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KFhNTEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCi0JCWlmICh0aGlzLmVsZW1lbnQgIT0gbnVsbCkgewotCQkJdGhpcy5lbGVtZW50LnNldENvbW1lbnRUYWcodHJ1ZSk7Ci0JCQlpZiAodGhpcy50eXBlICE9IE1ldGFEYXRhLkFOTk9UQVRJT04pIHsKLQkJCQl0aGlzLmVsZW1lbnQuc2V0SlNQVGFnKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNSdW50aW1lQ29udGFpbmVyKCkpCi0JCQlyZXR1cm47Ci0KLQkJWE1MTW9kZWwgbW9kZWwgPSB0aGlzLmVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG9mZnNldCA9IHRoaXMuZWxlbWVudC5nZXRTdGFydEVuZE9mZnNldCgpOwotCQlpbnQgZW5kID0gdGhpcy5lbGVtZW50LmdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBlbmQgLSBvZmZzZXQ7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChtb2RlbCwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9UYWdTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvVGFnU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk5ZTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9UYWdTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIFRhZ1NjYW5uZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnID0gbnVsbDsKLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBib29sZWFuIG9uZUxpbmUgPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCVRhZ1NjYW5uZXIoU3RyaW5nIHRhZywgaW50IG9mZnNldCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMudGFnID0gdGFnOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJaWYgKHRhZyAhPSBudWxsKQotCQkJdGhpcy5sZW5ndGggPSB0YWcubGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JVGFnU2Nhbm5lcihTdHJpbmcgdGFnLCBpbnQgb2Zmc2V0LCBib29sZWFuIG9uZUxpbmUpIHsKLQkJdGhpcyh0YWcsIG9mZnNldCk7Ci0KLQkJdGhpcy5vbmVMaW5lID0gb25lTGluZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0TmV4dE9mZnNldCgpIHsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoIWlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRW5kKGNoYXIgYykgewotCQlyZXR1cm4gKHRoaXMub25lTGluZSAmJiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09ICc9Jyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJyInIHx8IGMgPT0gJ1wnJyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNoYXIgbmV4dENoYXIoKSB7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFpc1NwYWNlKGMpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqLwotCVN0cmluZyBuZXh0TmFtZSgpIHsKLQkJaWYgKHRoaXMudGFnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKG5leHRDaGFyKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBuYW1lT2Zmc2V0ID0gdGhpcy5vZmZzZXQ7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpIHx8IGlzU3BhY2UoYykpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoaXNFcXVhbChjKSAmJiB0aGlzLm9mZnNldCA+IG5hbWVPZmZzZXQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHRoaXMub2Zmc2V0ID09IG5hbWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKG5hbWVPZmZzZXQsIHRoaXMub2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgbmV4dFZhbHVlKCkgewotCQlpZiAodGhpcy50YWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5sZW5ndGgpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljaGFyIHNlcGVyYXRvciA9IG5leHRDaGFyKCk7Ci0JCWlmICghaXNFcXVhbChzZXBlcmF0b3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRoaXMub2Zmc2V0Kys7IC8vIHNraXAgJz0nCi0JCWNoYXIgcXVvdGUgPSBuZXh0Q2hhcigpOwotCQlpZiAocXVvdGUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaXNRdW90ZShxdW90ZSkpCi0JCQl0aGlzLm9mZnNldCsrOwotCQllbHNlCi0JCQlxdW90ZSA9IDA7Ci0KLQkJaW50IHZhbHVlT2Zmc2V0ID0gdGhpcy5vZmZzZXQ7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKSB7Ci0JCQkJcXVvdGUgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHF1b3RlID09IDApIHsKLQkJCQlpZiAoaXNTcGFjZShjKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoYyA9PSBxdW90ZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHZhbHVlRW5kID0gdGhpcy5vZmZzZXQ7Ci0JCWlmIChxdW90ZSAhPSAwICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGgpCi0JCQl0aGlzLm9mZnNldCsrOwotCQlpZiAodmFsdWVFbmQgPT0gdmFsdWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKHZhbHVlT2Zmc2V0LCB2YWx1ZUVuZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9kb2N1bWVudC9Vbmtub3duVGFnQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L1Vua25vd25UYWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjBhYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L1Vua25vd25UYWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlRhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93blRhZ0FkYXB0ZXIgaW1wbGVtZW50cyBUYWdBZGFwdGVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHN0YXJ0VGFnID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlbmRUYWcgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFVua25vd25UYWdBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kVGFnKFhNTEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gbnVsbDsKLQkJaWYgKHRoaXMuZW5kVGFnICE9IG51bGwpIHsKLQkJCXRhZyA9IHRoaXMuZW5kVGFnOwotCQkJdGhpcy5lbmRUYWcgPSBudWxsOwotCQl9Ci0JCXJldHVybiB0YWc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZyhYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IG51bGw7Ci0JCWlmICh0aGlzLnN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXRhZyA9IHRoaXMuc3RhcnRUYWc7Ci0JCQl0aGlzLnN0YXJ0VGFnID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IFRhZ0FkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kVGFnKFN0cmluZyBlbmRUYWcpIHsKLQkJdGhpcy5lbmRUYWcgPSBlbmRUYWc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRUYWcoU3RyaW5nIHN0YXJ0VGFnKSB7Ci0JCXRoaXMuc3RhcnRUYWcgPSBzdGFydFRhZzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2RvY3VtZW50L1hNTFN0eWxlTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvWE1MU3R5bGVNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlYTY3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZG9jdW1lbnQvWE1MU3R5bGVNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBkYXZpZHcKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgWE1MU3R5bGVNb2RlbEltcGwgZXh0ZW5kcyBYTUxNb2RlbEltcGwgewotCXB1YmxpYyBYTUxTdHlsZU1vZGVsSW1wbCgpIHsKLQkJLy8gcmVtZW1iZXIsIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIHN1cGVyIGNvbnN0cnVjdG9yLCAKLQkJLy8gdmlhIGludGVybmFsQ3JlYXRlRG9jdW1lbnQKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbUVkaXQoKSB7Ci0JCXJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQlzdXBlci5yZWxlYXNlRnJvbUVkaXQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCXJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQlzdXBlci5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVsZWFzZVN0eWxlU2hlZXRzKCkgewotCQlpZiAoIWlzU2hhcmVkKCkpIHsKLQkJCURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jIGluc3RhbmNlb2YgRG9jdW1lbnRTdHlsZUltcGwpIHsKLQkJCQkoKERvY3VtZW50U3R5bGVJbXBsKSBkb2MpLnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRG9jdW1lbnQgbWV0aG9kCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudCBpbnRlcm5hbENyZWF0ZURvY3VtZW50KCkgewotCQlEb2N1bWVudFN0eWxlSW1wbCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudFN0eWxlSW1wbCgpOwotCQlkb2N1bWVudC5zZXRNb2RlbCh0aGlzKTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2VuY29kaW5nL0hUTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2VuY29kaW5nL0hUTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY4ODA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9lbmNvZGluZy9IVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBhcnNlcyBiZWdpbm5pbmcgcG9ydGlvbiBvZiBIVE1MIGZpbGUgdG8gZ2V0IHRoZSBlbmNvZGluZyB2YWx1ZQotICogaW4gYSBNRVRBIHRhZy4gRXhhbXBsZToKLSAqIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotICogCi0gKiBOb3RlOiBldmVuIHRob3VnaCwgdGVjaG5pY2FsbHksIGEgTUVUQSB0YWcgbXVzdCBjb21lIGluIGEgPEhFQUQ+dGFnLCB3ZQotICogZG9uJ3QgY2hlY2sgZm9yIHRoYXQsIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgd2hhdGV2ZXIsIG9yIHdoZXJlZXZlciwgdGhlCi0gKiB0aGUgZmlyc3QgPE1FVEE+dGFnIGlzLCBpdCBpcyB0aGUgb25lIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHVzZXIsIGFuZAotICogdGhleSBtYXkganVzdCBiZSB0cnlpbmcgdG8gcmVwYWlyIHRoZSBlcnJvci4gVGhlIEhUTUwgdmFsaWRhdG9yIHdpbGwgdGVsbAotICogdGhlbSBpZiBpdHMgaW4gdGhlIHdyb25nIGxvY2F0aW9uLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yIGV4dGVuZHMgSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQotCXB1YmxpYyBIVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZW5jb2RpbmcvSFRNTERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZW5jb2RpbmcvSFRNTERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMzM5NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2VuY29kaW5nL0hUTUxEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudC5IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3MuSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3MuU3R5bGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nR3Vlc3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlLlByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudExvYWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIgewotCi0JcHVibGljIEhUTUxEb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIHRhZyBuYW1lcyB1c2luZyBCbG9ja01hcmtlciBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIVE1MaXNoVGFnKFhNTFNvdXJjZVBhcnNlciBwYXJzZXIsIFN0cmluZyB0YWduYW1lKSB7Ci0JCS8vRE1XOiBOaXRpbiwgcGVyaGFwcyB3ZSBzaG91bGQgcHJvdmlkZSBzb21lIGNvbnZlbmllbmNlIG1ldGhvZHMKLQkJLy8gaW4gdGhlIHBhcnNlciBpdHNlbGY/IGUuZy4gYWRkQ2FzZUluc2Vuc2l0aXZlQmxvY2tlZFRhZyh0YWduYW1lKQotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIGZhbHNlKTsKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKGJtKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGVuY29kaW5nLiBGb3IgSFRNTCwgdGhlcmUgaXMgbm8gc3BlYy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiAgICAgICAgICAgIGJ5dGVbXQotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIGludAotCSAqIAotCSAqIERvIGF1dG9tYXRpYyBlbmNvZGluZyBkZXRlY3Rpb24gYnkgZ3Vlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVuY29kaW5nTmFtZUJ5R3Vlc3MoYnl0ZVtdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlmaW5hbCBTdHJpbmcgaWFuYUVuYyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKHN0cmluZywgbGVuZ3RoKTsKLQkJcmV0dXJuIGlhbmFFbmM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TG9hZGVyI2NyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpCi0JICovCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpKTsKLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qCi0JICogQHNlZSBNb2RlbExvYWRlciNnZXRQYXJzZXIoKQotCSAqLwotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlYTUxTb3VyY2VQYXJzZXIgcGFyc2VyID0gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCQkvLyBmb3IgdGhlICJzdGF0aWMgSFRNTCIgY2FzZSwgd2UgbmVlZCB0byBpbml0aWFsaXplCi0JCS8vIEJsb2NrdGFncyBoZXJlLgotCQlhZGRIVE1MaXNoVGFnKHBhcnNlciwgInNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEhUTUxpc2hUYWcocGFyc2VyLCAic3R5bGUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRob3NlIGZhY3RvcmllcyB3aGljaCBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIHN0cnVjdHVyZWRNb2RlbCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJLy8KLQkJZmFjdG9yeSA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0KLQkJZmFjdG9yeSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCi0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IEhUTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLwkJKiBUT0RPIC0gaG93IHRvIGJlc3QgaGFuZGxlIG1vZGVsIHJlcXVpcmVtZW50cwotCQkvLwkJKiBpZi93aGVuIGRvY3VtZW50IGFscmVhZHkgbG9hZGVkPwotCQkvLyBETVc6IGp1c3QgYWRkZWQgdGhpcyBwcmVsb2FkIG9uIDgvMTYvMjAwMgotCQkvLyBJIG5vdGljZWQgdGhlIFByb2FnYXRpbmdBZGFwdGVyRmFjdG9yeSB3YXMgYmVpbmcgYWRkZWQsCi0JCS8vIHRoYXQgdGhhdCB0aGUgUHJvYWdhdGluZ0FkYXB0ZXJBZGFwdGVyIHdhcyBub3QgYmVpbmcKLQkJLy8gcHJlbG9hZCBhZGFwdGVkIC0tIEknbSBhc3N1aW5nIGl0IEFMV0FZUyBoYXMgdG8gYmUuCi0JCVhNTE1vZGVsIGRvbU1vZGVsID0gKFhNTE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEhUTUxEb2N1bWVudExvYWRlcigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9lbmNvZGluZy9IVE1MTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9lbmNvZGluZy9IVE1MTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyY2M0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZW5jb2RpbmcvSFRNTE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuZG9jdW1lbnQuSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudC5YTUxTdHlsZU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3MuSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3MuU3R5bGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLk1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuRGVidWdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlLlByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCi0KLQlwdWJsaWMgSFRNTE1vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgdGFnIG5hbWVzIHVzaW5nIEJsb2NrTWFya2VyIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhUTUxpc2hUYWcoWE1MU291cmNlUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ25hbWUpIHsKLQkJLy9ETVc6IE5pdGluLCBwZXJoYXBzIHdlIHNob3VsZCBwcm92aWRlIHNvbWUgY29udmVuaWVuY2UgbWV0aG9kcwotCQkvLyBpbiB0aGUgcGFyc2VyIGl0c2VsZj8gZS5nLiBhZGRDYXNlSW5zZW5zaXRpdmVCbG9ja2VkVGFnKHRhZ25hbWUpCi0JCUJsb2NrTWFya2VyIGJtID0gbmV3IEJsb2NrTWFya2VyKHRhZ25hbWUsIG51bGwsIFhNTFJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCwgZmFsc2UpOwotCQlwYXJzZXIuYWRkQmxvY2tNYXJrZXIoYm0pOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCkgewotCQlYTUxTdHlsZU1vZGVsSW1wbCBtb2RlbCA9IG5ldyBYTUxTdHlsZU1vZGVsSW1wbCgpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhvc2UgZmFjdG9yaWVzIHdoaWNoIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlCi0JICogc3RydWN0dXJlZE1vZGVsIGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gU3R5bGVBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQkvLwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXN1cGVyLnByZUxvYWRBZGFwdChzdHJ1Y3R1cmVkTW9kZWwpOwotCQkvLyBETVc6IGp1c3QgYWRkZWQgdGhpcyBwcmVsb2FkIG9uIDgvMTYvMjAwMgotCQkvLyBJIG5vdGljZWQgdGhlIFByb2FnYXRpbmdBZGFwdGVyRmFjdG9yeSB3YXMgYmVpbmcgYWRkZWQsCi0JCS8vIHRoYXQgdGhhdCB0aGUgUHJvYWdhdGluZ0FkYXB0ZXJBZGFwdGVyIHdhcyBub3QgYmVpbmcKLQkJLy8gcHJlbG9hZCBhZGFwdGVkIC0tIEknbSBhc3N1aW5nIGl0IEFMV0FZUyBoYXMgdG8gYmUuCi0JCVhNTE1vZGVsIGRvbU1vZGVsID0gKFhNTE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKERlYnVnLmRlYnVnTm90aWZpY2F0aW9uQW5kRXZlbnRzKSB7Ci0JCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb21Nb2RlbC5nZXREb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IERlYnVnQWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0JfQotCi0JcHVibGljIE1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEhUTUxNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgSFRNTERvY3VtZW50TG9hZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvRW1iZWRkZWRDU1NGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvRW1iZWRkZWRDU1NGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkOTI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZm9ybWF0L0VtYmVkZGVkQ1NTRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuZm9ybWF0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmZvcm1hdC5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxUZXh0OwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlCi0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZENTU0Zvcm1hdHRlciBleHRlbmRzIEhUTUxGb3JtYXR0ZXIgewotCi0JLy9wcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeShDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MsIHRydWUpOwotCS8qKgotCSAqLwotCXByb3RlY3RlZCBFbWJlZGRlZENTU0Zvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKFhNTE5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxUZXh0IHRleHQgPSAoWE1MVGV4dCkgbm9kZTsKLQotCQlTdHJpbmcgc291cmNlID0gZ2V0Q1NTQ29udGVudChub2RlKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7IC8vIGZhbGxiYWNrCi0JCQlzb3VyY2UgPSB0ZXh0LmdldFNvdXJjZSgpOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IHRleHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IHRleHQuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0JCXJlcGxhY2VTb3VyY2UodGV4dC5nZXRNb2RlbCgpLCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQkJc2V0V2lkdGgoY29udHJhaW50cywgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDU1NDb250ZW50KFhNTE5vZGUgdGV4dCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRDU1NNb2RlbCh0ZXh0KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU05vZGUgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgYWRhcHRlcjsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IGZvcm1hdHRlci5mb3JtYXQoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSUNTU01vZGVsIGdldENTU01vZGVsKFhNTE5vZGUgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHlsZVNoZWV0QWRhcHRlciBzdHlsZUFkYXB0ZXIgPSAoSVN0eWxlU2hlZXRBZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gc3R5bGVBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvSFRNTEVsZW1lbnRGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvSFRNTEVsZW1lbnRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzYmEyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZm9ybWF0L0hUTUxFbGVtZW50Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmZvcm1hdC5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuanNwLm1vZGVsLnBhcnNlci50ZW1wLlhNTEpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZSBDU1MgZm9ybWF0dGluZwotCi1wdWJsaWMgY2xhc3MgSFRNTEVsZW1lbnRGb3JtYXR0ZXIgZXh0ZW5kcyBIVE1MRm9ybWF0dGVyIGltcGxlbWVudHMgWE1MUmVnaW9uQ29udGV4dCwgWE1MSlNQUmVnaW9uQ29udGV4dHMgewotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxFbGVtZW50Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjb21wcmVzc1RhaWxpbmdTcGFjZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSByZWdpb24uZ2V0VGV4dEVuZCgpOwotCQlpbnQgY291bnQgPSByZWdpb24uZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCWlmIChjb3VudCA9PSAxKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZmxhdE5vZGUuZ2V0RnVsbFRleHQocmVnaW9uKTsKLQkJCWludCBzdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5jaGFyQXQob2Zmc2V0IC0gc3RhcnQpID09ICcgJykgewotCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJcmVwbGFjZVNvdXJjZShmbGF0Tm9kZSwgb2Zmc2V0LCBjb3VudCwgIiAiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdEVuZFRhZyhYTUxFbGVtZW50IGVsZW1lbnQsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSB8fCBlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQlTdHJpbmcgZW5kVGFnID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChlbmRUYWcgIT0gbnVsbCAmJiBlbmRUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgZW5kVGFnKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHByZXZSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IFhNTF9UQUdfTkFNRSB8fCByZWdpb25UeXBlID09IEpTUF9ST09UX1RBR19OQU1FIHx8IHJlZ2lvblR5cGUgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IFhNTF9UQUdfQ0xPU0UpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxfVEFHX05BTUUgfHwgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gSlNQX1JPT1RfVEFHX05BTUUpKSB7Ci0JCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwcmV2UmVnaW9uID0gcmVnaW9uOwotCQl9Ci0JCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IFhNTF9UQUdfTkFNRSB8fCBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBKU1BfUk9PVF9UQUdfTkFNRSkpIHsKLQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJfQotCi0JCVN0cmluZyBuZXdFbmRUYWcgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQlpZiAobmV3RW5kVGFnICE9IG51bGwgJiYgbmV3RW5kVGFnLmxlbmd0aCgpID4gMCkgewotCQkJc2V0V2lkdGgoY29udHJhaW50cywgbmV3RW5kVGFnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoWE1MTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTEVsZW1lbnQgZWxlbWVudCA9IChYTUxFbGVtZW50KSBub2RlOwotCi0JCWZvcm1hdFN0YXJ0VGFnKGVsZW1lbnQsIGNvbnRyYWludHMpOwotCi0JCWZvcm1hdENoaWxkTm9kZXMoZWxlbWVudCwgY29udHJhaW50cyk7Ci0KLQkJZm9ybWF0RW5kVGFnKGVsZW1lbnQsIGNvbnRyYWludHMpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRTdGFydFRhZyhYTUxFbGVtZW50IGVsZW1lbnQsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gV2Ugc2hvdWxkIGZvcm1hdCBhdHRyaWJ1dGVzIGluIEpTUFRhZz8KLQkJLy9pZiAoZWxlbWVudC5pc0pTUFRhZygpIHx8IGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCVN0cmluZyBzdGFydFRhZyA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChzdGFydFRhZyAhPSBudWxsICYmIHN0YXJ0VGFnLmxlbmd0aCgpID4gMCkgewotCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIHN0YXJ0VGFnKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpcnN0IHByb2Nlc3Mgc3R5bGUgYXR0cmlidXRlCi0JCWlmIChlbGVtZW50LmlzR2xvYmFsVGFnKCkpIHsKLQkJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgic3R5bGUiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJCWZvcm1hdFN0eWxlQXR0cihhdHRyKTsKLQkJfQotCQlib29sZWFuIGluc2VydEJyZWFrID0gZmFsc2U7Ci0JCWluc2VydEJyZWFrID0gKChJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKS5nZXRTcGxpdE11bHRpQXR0cnMoKTsKLQotCQlpZiAoaW5zZXJ0QnJlYWspIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsIHx8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgPCAyKQotCQkJCWluc2VydEJyZWFrID0gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGJyZWFrU3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMoZWxlbWVudCk7Ci0JCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnQoKTsKLQkJaWYgKGluZGVudCAhPSBudWxsICYmIGluZGVudC5sZW5ndGgoKSA+IDApIHsKLQkJCWJyZWFrU3BhY2VzICs9IGluZGVudDsKLQkJfQotCQlJVGV4dFJlZ2lvbiBsYXN0QnJlYWtSZWdpb24gPSBudWxsOwotCi0JCUlUZXh0UmVnaW9uIHByZXZSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJVGV4dFJlZ2lvbiBicmVha1JlZ2lvbiA9IG51bGw7Ci0KLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IFhNTF9UQUdfTkFNRSB8fCByZWdpb25UeXBlID09IEpTUF9ST09UX1RBR19OQU1FIHx8IHJlZ2lvblR5cGUgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCQkJfQotCQkJCWJyZWFrUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpKSB7Ci0JCQkJCS8vIGF0dHJpYnV0ZSBuYW1lIHdpdGhvdXQgdmFsdWUKLQkJCQkJYnJlYWtSZWdpb24gPSBwcmV2UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJCQl9Ci0JCQkJYnJlYWtSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IFhNTF9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBYTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpKSB7Ci0JCQkJCS8vIGF0dHJpYnV0ZSBuYW1lIHdpdGhvdXQgdmFsdWUKLQkJCQkJYnJlYWtSZWdpb24gPSBwcmV2UmVnaW9uOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGJyZWFrUmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgZW5kID0gYnJlYWtSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJCWlmIChsYXN0QnJlYWtSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgb2Zmc2V0ID0gbGFzdEJyZWFrUmVnaW9uLmdldEVuZCgpOwotCQkJCQlpbnQgY291bnQgPSBlbmQgLSBvZmZzZXQ7Ci0JCQkJCWlmIChpbnNlcnRCcmVhayB8fCAhaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCBjb3VudCArIDEpKSB7Ci0JCQkJCQlyZXBsYWNlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uLCBicmVha1NwYWNlcyk7Ci0JCQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBicmVha1NwYWNlcyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljb21wcmVzc1RhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbik7Ci0JCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQkJfQotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb3VudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBlbmQpOwotCQkJCX0KLQkJCQlsYXN0QnJlYWtSZWdpb24gPSBicmVha1JlZ2lvbjsKLQkJCX0KLQotCQkJcHJldlJlZ2lvbiA9IHJlZ2lvbjsKLQkJfQotCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHByZXZSZWdpb24uZ2V0VHlwZSgpID09IFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykpIHsKLQkJCS8vIGF0dHJpYnV0ZSBuYW1lIHdpdGhvdXQgdmFsdWUKLQkJCWludCBlbmQgPSBwcmV2UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCWlmIChsYXN0QnJlYWtSZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBsYXN0QnJlYWtSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJaW50IGNvdW50ID0gZW5kIC0gb2Zmc2V0OwotCQkJCWlmIChpbnNlcnRCcmVhayB8fCAhaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCBjb3VudCArIDEpKSB7Ci0JCQkJCXJlcGxhY2VUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24sIGJyZWFrU3BhY2VzKTsKLQkJCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29tcHJlc3NUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQl9Ci0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgY291bnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgZW5kKTsKLQkJCX0KLQkJCWxhc3RCcmVha1JlZ2lvbiA9IHByZXZSZWdpb247Ci0JCX0KLQotCQlpZiAobGFzdEJyZWFrUmVnaW9uICE9IG51bGwpIHsKLQkJCWludCBvZmZzZXQgPSBsYXN0QnJlYWtSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJaW50IGNvdW50ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkgLSBvZmZzZXQ7Ci0JCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IFhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQljb21wcmVzc1RhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbik7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJYWRkV2lkdGgoY29udHJhaW50cywgY291bnQpOwotCQl9Ci0JCWVsc2UgewotCQkJYWRkV2lkdGgoY29udHJhaW50cywgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFN0eWxlQXR0cihBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0Q1NTVmFsdWUoYXR0cik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkVmFsdWUgPSAoKFhNTE5vZGUpIGF0dHIpLmdldFZhbHVlU291cmNlKCk7Ci0JCWlmIChvbGRWYWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpCi0JCQlyZXR1cm47Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSUNTU01vZGVsIGdldENTU01vZGVsKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyIHN0eWxlQWRhcHRlciA9IChJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCXJldHVybiBzdHlsZUFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDU1NWYWx1ZShBdHRyIGF0dHIpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0Q1NTTW9kZWwoYXR0cik7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDU1NOb2RlIGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IChDU1NTb3VyY2VGb3JtYXR0ZXIpIGFkYXB0ZXI7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBmb3JtYXR0ZXIuZm9ybWF0KGRvY3VtZW50KTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVGFpbGluZ1NwYWNlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCWludCBjb3VudCA9IHJlZ2lvbi5nZXRFbmQoKSAtIG9mZnNldDsKLQkJaWYgKGNvdW50IDw9IDApCi0JCQlyZXR1cm47Ci0JCXJlcGxhY2VTb3VyY2UoZmxhdE5vZGUsIG9mZnNldCwgY291bnQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlVGFpbGluZ1NwYWNlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24sIFN0cmluZyBzcGFjZXMpIHsKLQkJaW50IG9mZnNldCA9IHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCWludCBjb3VudCA9IHJlZ2lvbi5nZXRFbmQoKSAtIG9mZnNldDsKLQkJaWYgKGNvdW50ID09IHNwYWNlcy5sZW5ndGgoKSkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGZsYXROb2RlLmdldEZ1bGxUZXh0KHJlZ2lvbik7Ci0JCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmVuZHNXaXRoKHNwYWNlcykpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXJlcGxhY2VTb3VyY2UoZmxhdE5vZGUsIG9mZnNldCwgY291bnQsIHNwYWNlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvSFRNTEZvcm1hdENvbnRyYWludHNJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZm9ybWF0L0hUTUxGb3JtYXRDb250cmFpbnRzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmM2MWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvSFRNTEZvcm1hdENvbnRyYWludHNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKiBQbGVhc2UgdW4tZGVwcmVjYXRlIHRoaXMgaWYgUGFnZSBEZXNpZ25lciB0aGlua3MgdGhleSBhcmUgbmVlZGVkLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTEZvcm1hdENvbnRyYWludHNJbXBsIGV4dGVuZHMgU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgaW1wbGVtZW50cyBIVE1MRm9ybWF0Q29udHJhaW50cyB7Ci0JcHJvdGVjdGVkIGludCBmQXZhaWxhYmxlTGluZVdpZHRoOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAJSXQncyB2ZXJ5IGhhcmQgdG8ga2VlcCB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggYWNjdXJhdGUuCi0JICogCVNvbWV0aW1lcyBhIG5vZGUgd2FudHMgdG8gc3RhcnQgb24gYSBuZXcgbGluZSwgc29tZXRpbWVzIGl0IGRvZXNuJ3QuCi0JICogCUl0J3MgYmVzdCBmb3IgdGhlIG5vZGUgdG8gZmlndXJlIG91dCB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggb24gdGhlIGZseS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEF2YWlsYWJsZUxpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGZBdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAJSXQncyB2ZXJ5IGhhcmQgdG8ga2VlcCB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggYWNjdXJhdGUuCi0JICogCVNvbWV0aW1lcyBhIG5vZGUgd2FudHMgdG8gc3RhcnQgb24gYSBuZXcgbGluZSwgc29tZXRpbWVzIGl0IGRvZXNuJ3QuCi0JICogCUl0J3MgYmVzdCBmb3IgdGhlIG5vZGUgdG8gZmlndXJlIG91dCB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggb24gdGhlIGZseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVMaW5lV2lkdGgoaW50IGF2YWlsYWJsZUxpbmVXaWR0aCkgewotCQlmQXZhaWxhYmxlTGluZVdpZHRoID0gYXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZm9ybWF0L0hUTUxGb3JtYXRQcm9jZXNzb3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZm9ybWF0L0hUTUxGb3JtYXRQcm9jZXNzb3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNDlhNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2Zvcm1hdC9IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsIGV4dGVuZHMgRm9ybWF0UHJvY2Vzc29yWE1MIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKE5vZGUgbm9kZSkgewotCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBIVE1MRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUZvcm1hdHRlcihub2RlLCBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkZvcm1hdFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQkJCSgoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQkJCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLklOREVOVF9VU0lOR19UQUJTKSkKLQkJCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEluZGVudCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UgewotCQkJCQlpbnQgdGFiV2lkdGggPSBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQUJfV0lEVEgpOwotCQkJCQlTdHJpbmcgaW5kZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJXaWR0aDsgaSsrKSB7Ci0JCQkJCQlpbmRlbnQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEluZGVudChpbmRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvSFRNTEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2Zvcm1hdC9IVE1MRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzU1Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2Zvcm1hdC9IVE1MRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRm9ybWF0dGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTkFNRSA9ICJodG1sIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFlfTkFNRSA9ICJCT0RZIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXaWR0aChIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzLCBpbnQgd2lkdGgpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFzcGxpdExpbmVzKCkgfHwgZ2V0TGluZVdpZHRoKCkgPCAwKQotCQkJcmV0dXJuOwotCi0JCWludCBhdmFpbGFibGVXaWR0aCA9IGNvbnRyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgLSB3aWR0aDsKLQkJaWYgKGF2YWlsYWJsZVdpZHRoIDwgMCkKLQkJCWF2YWlsYWJsZVdpZHRoID0gMDsKLQkJY29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlV2lkdGgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkZvcm1hdENoaWxkKE5vZGUgbm9kZSkgewotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybiB0cnVlOwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKSB7Ci0JCQkJCWJvb2xlYW4gc2hvdWxkS2VlcFNwYWNlID0gKChCb29sZWFuKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKHNob3VsZEtlZXBTcGFjZSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydEJyZWFrQWZ0ZXIoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlpZiAoaGludCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGhpbnQuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EKSB8fCBoaW50LmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19BRlRFUl9TVEFSVCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydEJyZWFrQWZ0ZXIoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkvLyBkbyBub3QgaW5zZXJ0IGJyZWFrIGFmdGVyIHVuY2xvc2VkIHRhZwotCQkJCWlmICghKChYTUxFbGVtZW50KSBub2RlKS5pc0Nsb3NlZCgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIHBhcmVudDsKLQkJCS8vIGRvIG5vdCBpbnNlcnQgYnJlYWsgYmVmb3JlIG1pc3NpbmcgZW5kIHRhZwotCQkJaWYgKG5leHQgPT0gbnVsbCAmJiBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkvLyBpbnNlcnQgbGluZSBicmVhayB1bmRlciBub24tSFRNTCBlbGVtZW50cyBpbmNsdWRpbmcgSlNQIGVsZW1lbnRzCi0JCQlpZiAoZWxlbWVudC5nZXRQcmVmaXgoKSAhPSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCWlmIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkvLyBzcGVjaWFsIGZvciBkaXJlY3QgY2hpbGRyZW4gdW5kZXIgQk9EWQotCQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJPRFlfTkFNRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIG5vZGU7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGNhbkluc2VydEJyZWFrQWZ0ZXIoZGVjbCkpIHsKLQkJCQkvLyBzcGNpYWwgZm9yIEJSCi0JCQkJcmV0dXJuIGNhbkZvcm1hdENoaWxkKHBhcmVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5leHQpOwotCQkJaWYgKGNhbkluc2VydEJyZWFrQmVmb3JlKGRlY2wpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5JbnNlcnRCcmVha0JlZm9yZShDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBoaW50ID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCk7Ci0JCWlmIChoaW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBoaW50LmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtCZWZvcmUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBwcmV2ID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlpZiAocHJldiA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlYTUxFbGVtZW50IGVsZW1lbnQgPSAoWE1MRWxlbWVudCkgcGFyZW50OwotCQkJLy8gZG8gbm90IGluc2VydCBicmVhayBhZnRlciBtaXNzaW5nIHN0YXJ0IHRhZwotCQkJaWYgKHByZXYgPT0gbnVsbCAmJiBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGluc2VydCBsaW5lIGJyZWFrIHVuZGVyIG5vbi1IVE1MIGVsZW1lbnRzIGluY2x1ZGluZyBKU1AgZWxlbWVudHMKLQkJCWlmIChlbGVtZW50LmdldFByZWZpeCgpICE9IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0KLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCS8vIHNwZWNpYWwgZm9yIGRpcmVjdCBjaGlsZHJlbiB1bmRlciBCT0RZCi0JCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQk9EWV9OQU1FKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChjYW5JbnNlcnRCcmVha0JlZm9yZShkZWNsKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgcHJldik7Ci0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihkZWNsKSkgewotCQkJCS8vIHNwY2lhbCBmb3IgQlIKLQkJCQlyZXR1cm4gY2FuRm9ybWF0Q2hpbGQocGFyZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KE5vZGUgbm9kZSkgewotCQlmb3JtYXQobm9kZSwgZ2V0Rm9ybWF0Q29udHJhaW50cygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFhNTE5vZGUgJiYgY29udHJhaW50cyBpbnN0YW5jZW9mIEhUTUxGb3JtYXRDb250cmFpbnRzKQotCQkJZm9ybWF0KChYTUxOb2RlKSBub2RlLCAoSFRNTEZvcm1hdENvbnRyYWludHMpIGNvbnRyYWludHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChYTUxOb2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGRvIG5vdCBmb3JtYXQgcmVtb3ZlZCBub2RlCi0KLQkJc2V0V2lkdGgoY29udHJhaW50cywgbm9kZSk7Ci0KLQkJaWYgKGNhbkluc2VydEJyZWFrQmVmb3JlKG5vZGUpKQotCQkJaW5zZXJ0QnJlYWtCZWZvcmUobm9kZSwgY29udHJhaW50cyk7Ci0KLQkJZm9ybWF0Tm9kZShub2RlLCBjb250cmFpbnRzKTsKLQotCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihub2RlKSkKLQkJCWluc2VydEJyZWFrQWZ0ZXIobm9kZSwgY29udHJhaW50cyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGROb2RlcyhYTUxOb2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFub2RlLmhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybjsKLQotCQkvLyBjb25jYXQgYWRqYWNlbnQgdGV4dHMKLQkJbm9kZS5ub3JtYWxpemUoKTsKLQotCQkvLyBkaXNhYmxlIHNpYmxpbmcgaW5kZW50IGR1cmluZyBmb3JtYXR0aW5nIGFsbCB0aGUgY2hpbGRyZW4KLQkJYm9vbGVhbiBpbmRlbnQgPSBmYWxzZTsKLQkJaWYgKGNvbnRyYWludHMgIT0gbnVsbCkgewotCQkJaW5kZW50ID0gY29udHJhaW50cy5nZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpOwotCQkJY29udHJhaW50cy5zZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChmYWxzZSk7Ci0JCX0KLQotCQlib29sZWFuIGluc2VydEJyZWFrID0gdHJ1ZTsKLQkJWE1MTm9kZSBjaGlsZCA9IChYTUxOb2RlKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gbm9kZSkKLQkJCQlicmVhazsKLQkJCVhNTE5vZGUgbmV4dCA9IChYTUxOb2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCQlpZiAoaW5zZXJ0QnJlYWsgJiYgY2FuSW5zZXJ0QnJlYWtCZWZvcmUoY2hpbGQpKSB7Ci0JCQkJaW5zZXJ0QnJlYWtCZWZvcmUoY2hpbGQsIGNvbnRyYWludHMpOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBIVE1MRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUZvcm1hdHRlcihjaGlsZCwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCQlpZiAoZm9ybWF0dGVyIGluc3RhbmNlb2YgSFRNTEZvcm1hdHRlcikgewotCQkJCQlIVE1MRm9ybWF0dGVyIGh0bWxGb3JtYXR0ZXIgPSAoSFRNTEZvcm1hdHRlcikgZm9ybWF0dGVyOwotCQkJCQlodG1sRm9ybWF0dGVyLmZvcm1hdE5vZGUoY2hpbGQsIGNvbnRyYWludHMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZm9ybWF0dGVyLmZvcm1hdChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihjaGlsZCkpIHsKLQkJCQlpbnNlcnRCcmVha0FmdGVyKGNoaWxkLCBjb250cmFpbnRzKTsKLQkJCQlpbnNlcnRCcmVhayA9IGZhbHNlOyAvLyBub3QgdG8gaW5zZXJ0IHR3aWNlCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnNlcnRCcmVhayA9IHRydWU7Ci0JCQl9Ci0KLQkJCWNoaWxkID0gbmV4dDsKLQkJfQotCi0JCWlmIChjb250cmFpbnRzICE9IG51bGwpCi0JCQljb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGluZGVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShYTUxOb2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsgLy8gY29udGFpbmVyCi0JCQlmb3JtYXRDaGlsZE5vZGVzKG5vZGUsIGNvbnRyYWludHMpOwotCQl9Ci0JCWVsc2UgeyAvLyBsZWFmCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc291cmNlID0gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCcmVha1NwYWNlcyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVN0cmluZyBkZWxpbSA9ICgoWE1MTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCWlmIChkZWxpbSAhPSBudWxsICYmIGRlbGltLmxlbmd0aCgpID4gMCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCi0JCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnQoKTsKLQkJaWYgKGluZGVudCAhPSBudWxsICYmIGluZGVudC5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWJyZWFrOwotCQkJCS8vIGlnbm9yZSBvbWl0dGVkIHRhZwotCQkJCWlmICgoKFhNTE5vZGUpIHBhcmVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQotCQkJCVhNTEVsZW1lbnQgZWxlbWVudCA9IChYTUxFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0UHJlZml4KCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCQkJLy8gc3BlY2lhbCBmb3IgaHRtbDpodG1sCi0JCQkJCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiAhbG9jYWxOYW1lLmVxdWFscyhIVE1MX05BTUUpKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKGluZGVudCk7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCQlpZiAoZGVjbCAhPSBudWxsICYmIGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSkpIHsKLQkJCQkJYm9vbGVhbiBzaG91bGRJbmRlbnQgPSAoKEJvb2xlYW4pIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAoc2hvdWxkSW5kZW50KQotCQkJCQkJYnVmZmVyLmFwcGVuZChpbmRlbnQpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5kZW50KCkgewotCQlyZXR1cm4gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldExpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRCcmVha0FmdGVyKFhNTE5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQlTdHJpbmcgc3BhY2VzID0gbnVsbDsKLQkJaWYgKG5leHQgPT0gbnVsbCkgeyAvLyBsYXN0IHNwYWNlcwotCQkJLy8gdXNlIHBhcmVudCBpbmRlbnQgZm9yIHRoZSBlbmQgdGFnCi0JCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhwYXJlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJaWYgKGNvbnRyYWludHMgIT0gbnVsbCAmJiBjb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpIHsKLQkJCQlYTUxOb2RlIHRleHQgPSAoWE1MTm9kZSkgbmV4dDsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBIVE1MRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUZvcm1hdHRlcih0ZXh0LCBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQkJCQlpZiAoZm9ybWF0dGVyIGluc3RhbmNlb2YgSFRNTFRleHRGb3JtYXR0ZXIpIHsKLQkJCQkJSFRNTFRleHRGb3JtYXR0ZXIgdGV4dEZvcm1hdHRlciA9IChIVE1MVGV4dEZvcm1hdHRlcikgZm9ybWF0dGVyOwotCQkJCQl0ZXh0Rm9ybWF0dGVyLmZvcm1hdFRleHQodGV4dCwgY29udHJhaW50cywgSFRNTFRleHRGb3JtYXR0ZXIuRk9STUFUX0hFQUQpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQllbHNlIHsKLQkJCXNwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQl9Ci0JCWlmIChzcGFjZXMgPT0gbnVsbCB8fCBzcGFjZXMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlyZXBsYWNlU291cmNlKG5vZGUuZ2V0TW9kZWwoKSwgbm9kZS5nZXRFbmRPZmZzZXQoKSwgMCwgc3BhY2VzKTsKLQkJc2V0V2lkdGgoY29udHJhaW50cywgc3BhY2VzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRCcmVha0JlZm9yZShYTUxOb2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCi0JCVN0cmluZyBzcGFjZXMgPSBudWxsOwotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJaWYgKGNvbnRyYWludHMgIT0gbnVsbCAmJiBjb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpIHsKLQkJCQlYTUxOb2RlIHRleHQgPSAoWE1MTm9kZSkgcHJldjsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBIVE1MRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUZvcm1hdHRlcih0ZXh0LCBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQkJCQlpZiAoZm9ybWF0dGVyIGluc3RhbmNlb2YgSFRNTFRleHRGb3JtYXR0ZXIpIHsKLQkJCQkJSFRNTFRleHRGb3JtYXR0ZXIgdGV4dEZvcm1hdHRlciA9IChIVE1MVGV4dEZvcm1hdHRlcikgZm9ybWF0dGVyOwotCQkJCQl0ZXh0Rm9ybWF0dGVyLmZvcm1hdFRleHQodGV4dCwgY29udHJhaW50cywgSFRNTFRleHRGb3JtYXR0ZXIuRk9STUFUX1RBSUwpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQllbHNlIHsKLQkJCXNwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQl9Ci0JCWlmIChzcGFjZXMgPT0gbnVsbCB8fCBzcGFjZXMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlyZXBsYWNlU291cmNlKG5vZGUuZ2V0TW9kZWwoKSwgbm9kZS5nZXRTdGFydE9mZnNldCgpLCAwLCBzcGFjZXMpOwotCQlzZXRXaWR0aChjb250cmFpbnRzLCBzcGFjZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV2lkdGhBdmFpbGFibGUoSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cywgaW50IHdpZHRoKSB7Ci0JCWlmIChjb250cmFpbnRzID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKCFzcGxpdExpbmVzKCkgfHwgZ2V0TGluZVdpZHRoKCkgPCAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiAoY29udHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSA+PSB3aWR0aCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4ga2VlcEJsYW5rTGluZXMoSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAoY29udHJhaW50cyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiAoIWNvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VTb3VyY2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmbGF0Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KHN0YXJ0T2Zmc2V0ICsgb2Zmc2V0LCBsZW5ndGgpKQotCQkJcmV0dXJuOwotCQkvLyBXZSB1c2UgJ3N0cnVjdHVyZWREb2N1bWVudCcgYXMgdGhlIHJlcXVlc3RlciBvYmplY3QganVzdCBzbyB0aGlzIGFuZCB0aGUgb3RoZXIKLQkJLy8gZm9ybWF0LXJlbGF0ZWQgJ3JlcGFsY2VUZXh0JyAoaW4gcmVwbGFjZVNvdXJjZSkgY2FuIHVzZSB0aGUgc2FtZSByZXF1ZXN0ZXIuCi0JCS8vIE90aGVyd2lzZSwgaWYgcmVxdWVzdGVyIGlzIG5vdCBpZGVudGljYWwsIAotCQkvLyB0aGUgdW5kbyBncm91cCBnZXRzICJicm9rZW4iIGludG8gbXVsdGlwbGUgcGllY2VzIGJhc2VkCi0JCS8vIG9uIHRoZSByZXF1ZXN0ZXJzIGJlaW5nIGRpZmZlcmVudC4gVGVjaG5pY2FsbHksIGFueSB1bmlxdWUsIGNvbW1vbgotCQkvLyByZXF1ZXN0ZXIgb2JqZWN0IHdvdWxkIHdvcmsuCi0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0T2Zmc2V0ICsgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVNvdXJjZShYTUxNb2RlbCBtb2RlbCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHNvdXJjZSkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShvZmZzZXQsIGxlbmd0aCkpCi0JCQlyZXR1cm47Ci0JCS8vIFdlIHVzZSAnc3RydWN0dXJlZERvY3VtZW50JyBhcyB0aGUgcmVxdWVzdGVyIG9iamVjdCBqdXN0IHNvIHRoaXMgYW5kIHRoZSBvdGhlcgotCQkvLyBmb3JtYXQtcmVsYXRlZCAncmVwYWxjZVRleHQnIChpbiByZXBsYWNlU291cmNlKSBjYW4gdXNlIHRoZSBzYW1lIHJlcXVlc3Rlci4KLQkJLy8gT3RoZXJ3aXNlLCBpZiByZXF1ZXN0ZXIgaXMgbm90IGlkZW50aWNhbCwgCi0JCS8vIHRoZSB1bmRvIGdyb3VwIGdldHMgImJyb2tlbiIgaW50byBtdWx0aXBsZSBwaWVjZXMgYmFzZWQKLQkJLy8gb24gdGhlIHJlcXVlc3RlcnMgYmVpbmcgZGlmZmVyZW50LiBUZWNobmljYWxseSwgYW55IHVuaXF1ZSwgY29tbW9uCi0JCS8vIHJlcXVlc3RlciBvYmplY3Qgd291bGQgd29yay4gCi0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFdpZHRoKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFzcGxpdExpbmVzKCkpCi0JCQlyZXR1cm47Ci0JCWludCBsaW5lV2lkdGggPSBnZXRMaW5lV2lkdGgoKTsKLQkJaWYgKGxpbmVXaWR0aCA8IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9IHNvdXJjZS5sYXN0SW5kZXhPZignXG4nKTsKLQkJaW50IG9mZnNldDIgPSBzb3VyY2UubGFzdEluZGV4T2YoJ1xyJyk7Ci0JCWlmIChvZmZzZXQyID4gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gb2Zmc2V0MjsKLQkJaWYgKG9mZnNldCA+PSAwKQotCQkJb2Zmc2V0Kys7Ci0KLQkJaW50IGF2YWlsYWJsZVdpZHRoID0gMDsKLQkJaWYgKG9mZnNldCA+PSAwKSB7Ci0JCQlhdmFpbGFibGVXaWR0aCA9IGxpbmVXaWR0aCAtIChsZW5ndGggLSBvZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJYXZhaWxhYmxlV2lkdGggPSBjb250cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpIC0gbGVuZ3RoOwotCQl9Ci0JCWlmIChhdmFpbGFibGVXaWR0aCA8IDApCi0JCQlhdmFpbGFibGVXaWR0aCA9IDA7Ci0JCWNvbnRyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWR0aChIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzLCBOb2RlIG5vZGUpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoKFhNTE5vZGUpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaWYgKCFzcGxpdExpbmVzKCkpCi0JCQlyZXR1cm47Ci0JCWludCBsaW5lV2lkdGggPSBnZXRMaW5lV2lkdGgoKTsKLQkJaWYgKGxpbmVXaWR0aCA8IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9ICgoWE1MTm9kZSkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KG9mZnNldCk7Ci0JCWludCBsaW5lT2Zmc2V0ID0gMDsKLQkJdHJ5IHsKLQkJCWxpbmVPZmZzZXQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJfQotCQlpZiAobGluZU9mZnNldCA+IG9mZnNldCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpbnQgYXZhaWxhYmxlV2lkdGggPSBsaW5lV2lkdGggLSAob2Zmc2V0IC0gbGluZU9mZnNldCk7Ci0JCWlmIChhdmFpbGFibGVXaWR0aCA8IDApCi0JCQlhdmFpbGFibGVXaWR0aCA9IDA7Ci0KLQkJY29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlV2lkdGgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwbGl0TGluZXMoKSB7Ci0JCXJldHVybiB0cnVlOy8vZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRTcGxpdExpbmVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSFRNTEZvcm1hdENvbnRyYWludHMgZkZvcm1hdENvbnRyYWludHMgPSBudWxsOwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCi0JLy9wdWJsaWMgdm9pZCBmb3JtYXQoWE1MTm9kZSBub2RlLCBGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkvLwlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpKQotCS8vCQlmb3JtYXRDb250cmFpbnRzLnNldEN1cnJlbnRJbmRlbnQoZ2V0U2libGluZ0luZGVudChub2RlKSk7Ci0JLy8KLQkvLwlmb3JtYXROb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCS8vfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0UHJlZmVyZW5jZXMoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcykgewotCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBmb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZGb3JtYXRQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRMaW5lV2lkdGgocHJlZmVyZW5jZXMuZ2V0SW50KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJCQkoKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5JTkRFTlRfVVNJTkdfVEFCUykpCi0JCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIHsKLQkJCQkJaW50IHRhYldpZHRoID0gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFCX1dJRFRIKTsKLQkJCQkJU3RyaW5nIGluZGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFiV2lkdGg7IGkrKykgewotCQkJCQkJaW5kZW50ICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoaW5kZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdFByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZ2V0Rm9ybWF0Q29udHJhaW50cygpIHsKLQkJaWYgKGZGb3JtYXRDb250cmFpbnRzID09IG51bGwpIHsKLQkJCWZGb3JtYXRDb250cmFpbnRzID0gbmV3IEhUTUxGb3JtYXRDb250cmFpbnRzSW1wbCgpOwotCi0JCQlmRm9ybWF0Q29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKSk7Ci0JCQlmRm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvSFRNTEZvcm1hdHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvSFRNTEZvcm1hdHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlMTFkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZm9ybWF0L0hUTUxGb3JtYXR0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZSBDU1MgZm9ybWF0dGluZwotCi1jbGFzcyBIVE1MRm9ybWF0dGVyRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgSFRNTEZvcm1hdHRlckZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCBmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBIVE1MRm9ybWF0dGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgSFRNTEZvcm1hdHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBjcmVhdGVGb3JtYXR0ZXIoTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZvcm1hdFByZWZlcmVuY2VzKSB7Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IG51bGw7Ci0KLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCWZvcm1hdHRlciA9IG5ldyBIVE1MRWxlbWVudEZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJaWYgKGlzRW1iZWRkZWRDU1Mobm9kZSkpIHsKLQkJCQkJZm9ybWF0dGVyID0gbmV3IEVtYmVkZGVkQ1NTRm9ybWF0dGVyKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3JtYXR0ZXIgPSBuZXcgSFRNTFRleHRGb3JtYXR0ZXIoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgSFRNTEZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gaW5pdCBGb3JtYXRQcmVmZXJlbmNlcwotCQlmb3JtYXR0ZXIuc2V0Rm9ybWF0UHJlZmVyZW5jZXMoZm9ybWF0UHJlZmVyZW5jZXMpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1iZWRkZWRDU1MoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbmFtZSA9IHBhcmVudC5nZXROb2RlTmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJTVFlMRSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXByaXZhdGUgSFRNTEZvcm1hdHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldFNwbGl0TXVsdGlBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuSU5ERU5UX1VTSU5HX1RBQlMpKQotCQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZSB7Ci0JCQkJCWludCB0YWJXaWR0aCA9IFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBQl9XSURUSCk7Ci0JCQkJCVN0cmluZyBpbmRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYldpZHRoOyBpKyspIHsKLQkJCQkJCWluZGVudCArPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2Zvcm1hdC9IVE1MVGV4dEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2Zvcm1hdC9IVE1MVGV4dEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDA2NTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvSFRNTFRleHRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuZm9ybWF0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUxGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTFRleHRGb3JtYXR0ZXIgZXh0ZW5kcyBIVE1MRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IEZPUk1BVF9BTEwgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IEZPUk1BVF9IRUFEID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBGT1JNQVRfVEFJTCA9IDI7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTFRleHRGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkZvcm1hdFRleHQoWE1MVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRleHQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgdHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlYTUxFbGVtZW50IGVsZW1lbnQgPSAoWE1MRWxlbWVudCkgcGFyZW50OwotCQkJaWYgKCFlbGVtZW50LmlzR2xvYmFsVGFnKCkgJiYgIXRleHQuaXNXaGl0ZXNwYWNlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGNhbkZvcm1hdENoaWxkKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlbW92ZUhlYWRpbmdTcGFjZXMoWE1MTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChub2RlLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBwYXJlbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlyZXR1cm4gaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5SZW1vdmVUYWlsaW5nU3BhY2VzKFhNTE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBwYXJlbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlyZXR1cm4gaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoWE1MTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWZvcm1hdFRleHQobm9kZSwgY29udHJhaW50cywgRk9STUFUX0FMTCk7IC8vIGZ1bGwgZm9ybWF0Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0VGV4dChYTUxOb2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIGludCBtb2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlYTUxUZXh0IHRleHQgPSAoWE1MVGV4dCkgbm9kZTsKLQkJU3RyaW5nIHNvdXJjZSA9IHRleHQuZ2V0U291cmNlKCk7Ci0KLQkJaWYgKCFjYW5Gb3JtYXRUZXh0KHRleHQpKSB7Ci0JCQlzZXRXaWR0aChjb250cmFpbnRzLCBzb3VyY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IHRleHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IHRleHQuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0KLQkJLy8gZm9ybWF0IGFkamFjZW50IHRleHQgYXQgb25jZQotCQlpZiAobW9kZSA9PSBGT1JNQVRfSEVBRCkgewotCQkJTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlYTUxUZXh0IG5leHRUZXh0ID0gKFhNTFRleHQpIG5leHQ7Ci0JCQkJbGVuZ3RoICs9IChuZXh0VGV4dC5nZXRFbmRPZmZzZXQoKSAtIG5leHRUZXh0LmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVN0cmluZyBuZXh0U291cmNlID0gbmV4dFRleHQuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKG5leHRTb3VyY2UgIT0gbnVsbCAmJiBuZXh0U291cmNlLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoc291cmNlID09IG51bGwpCi0JCQkJCQlzb3VyY2UgPSBuZXh0U291cmNlOwotCQkJCQllbHNlCi0JCQkJCQlzb3VyY2UgKz0gbmV4dFNvdXJjZTsKLQkJCQl9Ci0JCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtb2RlID09IEZPUk1BVF9UQUlMKSB7Ci0JCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJd2hpbGUgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlYTUxUZXh0IHByZXZUZXh0ID0gKFhNTFRleHQpIHByZXY7Ci0JCQkJb2Zmc2V0ID0gcHJldlRleHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlsZW5ndGggKz0gKHByZXZUZXh0LmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0KTsKLQkJCQlTdHJpbmcgcHJldlNvdXJjZSA9IHByZXZUZXh0LmdldFNvdXJjZSgpOwotCQkJCWlmIChwcmV2U291cmNlICE9IG51bGwgJiYgcHJldlNvdXJjZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJCQkJc291cmNlID0gcHJldlNvdXJjZTsKLQkJCQkJZWxzZQotCQkJCQkJc291cmNlID0gcHJldlNvdXJjZSArIHNvdXJjZTsKLQkJCQl9Ci0JCQkJcHJldiA9IHByZXYuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlTcGFjZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgU3BhY2VDb252ZXJ0ZXIoc291cmNlLCBrZWVwQmxhbmtMaW5lcyhjb250cmFpbnRzKSk7Ci0KLQkJaW50IHdvcmRMZW5ndGggPSBjb252ZXJ0ZXIubmV4dFdvcmQoKTsKLQkJaWYgKHdvcmRMZW5ndGggPT0gMCkgeyAvLyBvbmx5IHNwYWNlcwotCQkJaWYgKCFjb252ZXJ0ZXIuaGFzU3BhY2VzKCkpCi0JCQkJcmV0dXJuOyAvLyBlbXB0eQotCQkJYm9vbGVhbiByZW1vdmVTcGFjZXMgPSBmYWxzZTsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIGNoZWNrIGlmIHRhZ3MgYXJlIG9taXR0ZWQKLQkJCQlYTUxOb2RlIGVsZW1lbnQgPSAoWE1MTm9kZSkgcGFyZW50OwotCQkJCWlmIChub2RlLmdldFByZXZpb3VzU2libGluZygpID09IG51bGwgJiYgZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHsKLQkJCQkJcmVtb3ZlU3BhY2VzID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwgJiYgZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCXJlbW92ZVNwYWNlcyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZVNwYWNlcykgewotCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKG51bGwpOwotCQkJfQotCQkJZWxzZSBpZiAoIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgMikgfHwgY2FuSW5zZXJ0QnJlYWtBZnRlcihub2RlKSB8fCBjYW5JbnNlcnRCcmVha0JlZm9yZShub2RlKSkgewotCQkJCVN0cmluZyBzcGFjZXMgPSBudWxsOwotCQkJCWlmIChub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkgeyAvLyBsYXN0IHNwYWNlcwotCQkJCQkvLyB1c2UgcGFyZW50IGluZGVudCBmb3IgdGhlIGVuZCB0YWcKLQkJCQkJc3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMocGFyZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQkJCX0KLQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhzcGFjZXMpOwotCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIHNwYWNlcyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjYW5SZW1vdmVIZWFkaW5nU3BhY2VzKG5vZGUpIHx8IGNhblJlbW92ZVRhaWxpbmdTcGFjZXMobm9kZSkpIHsKLQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnZlcnRlci5jb21wcmVzc1NwYWNlcygpOwotCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGJyZWFrU3BhY2VzID0gbnVsbDsKLQotCQkJLy8gZm9ybWF0IGhlYWRpbmcgc3BhY2VzCi0JCQlib29sZWFuIGhhc1NwYWNlcyA9IGNvbnZlcnRlci5oYXNTcGFjZXMoKTsKLQkJCWlmIChtb2RlID09IEZPUk1BVF9UQUlMKSB7Ci0JCQkJLy8ga2VlcCBzcGFjZXMgYXMgaXMKLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb252ZXJ0ZXIuZ2V0U3BhY2VDb3VudCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChoYXNTcGFjZXMgJiYgIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgd29yZExlbmd0aCArIDEpKSB8fCBjYW5JbnNlcnRCcmVha0JlZm9yZShub2RlKSkgewotCQkJCWJyZWFrU3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMoYnJlYWtTcGFjZXMpOwotCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIGJyZWFrU3BhY2VzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChoYXNTcGFjZXMpIHsKLQkJCQkJaWYgKGNhblJlbW92ZUhlYWRpbmdTcGFjZXMobm9kZSkpIHsKLQkJCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKG51bGwpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY29udmVydGVyLmNvbXByZXNzU3BhY2VzKCk7Ci0JCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIHdvcmRMZW5ndGgpOwotCi0JCQkvLyBmb3JtYXQgbWlkZGxlCi0JCQl3b3JkTGVuZ3RoID0gY29udmVydGVyLm5leHRXb3JkKCk7Ci0JCQl3aGlsZSAod29yZExlbmd0aCA+IDApIHsKLQkJCQlpZiAobW9kZSAhPSBGT1JNQVRfQUxMKSB7Ci0JCQkJCS8vIGtlZXAgc3BhY2VzIGFzIGlzCi0JCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvbnZlcnRlci5nZXRTcGFjZUNvdW50KCkpOwotCQkJCX0KLQkJCQllbHNlIGlmICghaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCB3b3JkTGVuZ3RoICsgMSkpIHsKLQkJCQkJaWYgKGJyZWFrU3BhY2VzID09IG51bGwpCi0JCQkJCQlicmVha1NwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhicmVha1NwYWNlcyk7Ci0JCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIGJyZWFrU3BhY2VzKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNvbnZlcnRlci5jb21wcmVzc1NwYWNlcygpOwotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQl9Ci0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgd29yZExlbmd0aCk7Ci0JCQkJd29yZExlbmd0aCA9IGNvbnZlcnRlci5uZXh0V29yZCgpOwotCQkJfQotCi0JCQkvLyBmb3JtYXQgdGFpbGluZyBzcGFjZXMKLQkJCWhhc1NwYWNlcyA9IGNvbnZlcnRlci5oYXNTcGFjZXMoKTsKLQkJCWlmIChtb2RlID09IEZPUk1BVF9IRUFEKSB7Ci0JCQkJLy8ga2VlcCBzcGFjZXMgYXMgaXMKLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb252ZXJ0ZXIuZ2V0U3BhY2VDb3VudCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChoYXNTcGFjZXMgJiYgIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgMikpIHx8IGNhbkluc2VydEJyZWFrQWZ0ZXIobm9kZSkpIHsKLQkJCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpIHsgLy8gbGFzdCB0ZXN0Ci0JCQkJCS8vIHVzZSBwYXJlbnQgaW5kZW50IGZvciB0aGUgZW5kIHRhZwotCQkJCQlicmVha1NwYWNlcyA9IGdldEJyZWFrU3BhY2VzKHBhcmVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoYnJlYWtTcGFjZXMgPT0gbnVsbCkKLQkJCQkJCWJyZWFrU3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCQkJfQotCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKGJyZWFrU3BhY2VzKTsKLQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBicmVha1NwYWNlcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoaGFzU3BhY2VzKSB7Ci0JCQkJCWlmIChjYW5SZW1vdmVUYWlsaW5nU3BhY2VzKG5vZGUpKSB7Ci0JCQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhudWxsKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWNvbnZlcnRlci5jb21wcmVzc1NwYWNlcygpOwotCQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udmVydGVyLmlzTW9kaWZpZWQoKSkgewotCQkJc291cmNlID0gY29udmVydGVyLmdldFNvdXJjZSgpOwotCQkJcmVwbGFjZVNvdXJjZSh0ZXh0LmdldE1vZGVsKCksIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvU3BhY2VDb252ZXJ0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9mb3JtYXQvU3BhY2VDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiMzAxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvZm9ybWF0L1NwYWNlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmZvcm1hdDsKLQotCi0KLWZpbmFsIGNsYXNzIFNwYWNlQ29udmVydGVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHNvdXJjZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBzdGFydE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZW5kT2Zmc2V0ID0gMDsKLQlwcml2YXRlIGludCBzcGFjZUNvdW50ID0gMDsKLQlwcml2YXRlIGludCB3b3JkQ291bnQgPSAwOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgbGFzdE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBib29sZWFuIGtlZXBCbGFua0xpbmVzID0gZmFsc2U7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3BhY2VDb252ZXJ0ZXIoU3RyaW5nIHNvdXJjZSkgewotCQlzdXBlcigpOwotCi0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhpcy5zb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMubGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFNwYWNlQ29udmVydGVyKFN0cmluZyBzb3VyY2UsIGJvb2xlYW4ga2VlcEJsYW5rTGluZXMpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXRoaXMuc291cmNlID0gbmV3IFN0cmluZygpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLmxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJfQotCQl0aGlzLmtlZXBCbGFua0xpbmVzID0ga2VlcEJsYW5rTGluZXM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY29tcHJlc3NTcGFjZXMoKSB7Ci0JCWlmICh0aGlzLnNwYWNlQ291bnQgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuc3BhY2VDb3VudCA9PSAxICYmIHRoaXMuc291cmNlLmNoYXJBdCh0aGlzLnN0YXJ0T2Zmc2V0KSA9PSAnICcpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuYnVmZmVyID09IG51bGwpCi0JCQl0aGlzLmJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHRoaXMuc3RhcnRPZmZzZXQgPiB0aGlzLmxhc3RPZmZzZXQpIHsKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZCh0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5sYXN0T2Zmc2V0LCB0aGlzLnN0YXJ0T2Zmc2V0KSk7Ci0JCX0KLQotCQl0aGlzLmJ1ZmZlci5hcHBlbmQoJyAnKTsKLQotCQl0aGlzLmxhc3RPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgdGhpcy5zcGFjZUNvdW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlpZiAodGhpcy5idWZmZXIgPT0gbnVsbCkKLQkJCXRoaXMuYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAodGhpcy5sZW5ndGggPiB0aGlzLmxhc3RPZmZzZXQpIHsKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZCh0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5sYXN0T2Zmc2V0LCB0aGlzLmxlbmd0aCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLmJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3BhY2VDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BhY2VDb3VudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTcGFjZXMoKSB7Ci0JCXJldHVybiAodGhpcy5zcGFjZUNvdW50ID4gMCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZCgpIHsKLQkJcmV0dXJuICh0aGlzLmJ1ZmZlciAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbnVtYmVyIG9mIHRoZSBvbGQgYmxhbmsgbGluZXMgdG8gbmV3IHNwYWNlIHN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXJnZUJsYW5rTGluZXMoU3RyaW5nIG5ld1NwYWNlcywgU3RyaW5nIG9sZFNwYWNlcykgewotCQlpZiAobmV3U3BhY2VzID09IG51bGwgfHwgbmV3U3BhY2VzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbmV3U3BhY2VzOwotCQlpZiAob2xkU3BhY2VzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3U3BhY2VzOwotCi0JCS8vIGNvdW50IG9sZCBuZXcgbGluZXMKLQkJaW50IG5ld0xpbmVDb3VudCA9IDA7Ci0JCWludCBvbGRMZW5ndGggPSBvbGRTcGFjZXMubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkTGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYyA9IG9sZFNwYWNlcy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA9PSAnXHInKSB7Ci0JCQkJbmV3TGluZUNvdW50Kys7Ci0JCQkJaWYgKGkgKyAxIDwgb2xkTGVuZ3RoKSB7Ci0JCQkJCWMgPSBvbGRTcGFjZXMuY2hhckF0KGkgKyAxKTsKLQkJCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoYyA9PSAnXG4nKQotCQkJCQluZXdMaW5lQ291bnQrKzsKLQkJCX0KLQkJfQotCQlpZiAobmV3TGluZUNvdW50IDwgMikKLQkJCXJldHVybiBuZXdTcGFjZXM7IC8vIG5vIGJsYW5rIGxpbmUKLQotCQkvLyBoZXJlIGFzc3VtaW5nIG5ld1NwYWNlcyBzdGFydHMgd2l0aCBhIG5ldyBsaW5lIGlmIGFueQotCQlTdHJpbmcgZGVsaW0gPSBudWxsOwotCQljaGFyIGQgPSBuZXdTcGFjZXMuY2hhckF0KDApOwotCQlpZiAoZCA9PSAnXHInKSB7Ci0JCQlpZiAobmV3U3BhY2VzLmxlbmd0aCgpID4gMSAmJiBuZXdTcGFjZXMuY2hhckF0KDEpID09ICdcbicpCi0JCQkJZGVsaW0gPSAiXHJcbiI7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWRlbGltID0gIlxyIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZCA9PSAnXG4nKQotCQkJCWRlbGltID0gIlxuIjsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcmV0dXJuIG5ld1NwYWNlczsgLy8gbm8gbmV3IGxpbmUKLQkJfQotCi0JCW5ld0xpbmVDb3VudC0tOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihuZXdTcGFjZXMubGVuZ3RoKCkgKyBuZXdMaW5lQ291bnQgKiAyKTsKLQkJd2hpbGUgKG5ld0xpbmVDb3VudCA+IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQkJbmV3TGluZUNvdW50LS07Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChuZXdTcGFjZXMpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBuZXh0V29yZCgpIHsKLQkJaWYgKHRoaXMuZW5kT2Zmc2V0ID09IHRoaXMubGVuZ3RoKSB7Ci0JCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCQl0aGlzLnNwYWNlQ291bnQgPSAwOwotCQkJdGhpcy53b3JkQ291bnQgPSAwOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCWludCBpID0gdGhpcy5zdGFydE9mZnNldDsKLQkJZm9yICg7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UodGhpcy5zb3VyY2UuY2hhckF0KGkpKSkKLQkJCQlicmVhazsKLQkJfQotCQl0aGlzLnNwYWNlQ291bnQgPSBpIC0gdGhpcy5zdGFydE9mZnNldDsKLQotCQlpbnQgd29yZE9mZnNldCA9IGk7Ci0JCWZvciAoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UodGhpcy5zb3VyY2UuY2hhckF0KGkpKSkKLQkJCQlicmVhazsKLQkJfQotCQl0aGlzLndvcmRDb3VudCA9IGkgLSB3b3JkT2Zmc2V0OwotCQl0aGlzLmVuZE9mZnNldCA9IGk7Ci0KLQkJcmV0dXJuIHRoaXMud29yZENvdW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VTcGFjZXMoU3RyaW5nIHNwYWNlcykgewotCQlpbnQgc3BhY2VMZW5ndGggPSAoc3BhY2VzICE9IG51bGwgPyBzcGFjZXMubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nIG9sZFNwYWNlcyA9IG51bGw7Ci0JCWlmIChzcGFjZUxlbmd0aCA9PSB0aGlzLnNwYWNlQ291bnQpIHsKLQkJCWlmIChzcGFjZUxlbmd0aCA9PSAwKQotCQkJCXJldHVybjsKLQkJCWlmICh0aGlzLnN0YXJ0T2Zmc2V0ID09IDApIHsKLQkJCQlpZiAodGhpcy5zb3VyY2Uuc3RhcnRzV2l0aChzcGFjZXMpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmVuZE9mZnNldCA9PSB0aGlzLmxlbmd0aCkgewotCQkJCWlmICh0aGlzLnNvdXJjZS5lbmRzV2l0aChzcGFjZXMpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgdGV4dE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQgKyB0aGlzLnNwYWNlQ291bnQ7Ci0JCQkJb2xkU3BhY2VzID0gdGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMuc3RhcnRPZmZzZXQsIHRleHRPZmZzZXQpOwotCQkJCWlmIChvbGRTcGFjZXMuZXF1YWxzKHNwYWNlcykpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAodGhpcy5rZWVwQmxhbmtMaW5lcyAmJiB0aGlzLnNwYWNlQ291bnQgPiAwKSB7Ci0JCQlpZiAob2xkU3BhY2VzID09IG51bGwpIHsKLQkJCQlpbnQgdGV4dE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQgKyB0aGlzLnNwYWNlQ291bnQ7Ci0JCQkJb2xkU3BhY2VzID0gdGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMuc3RhcnRPZmZzZXQsIHRleHRPZmZzZXQpOwotCQkJfQotCQkJaWYgKG9sZFNwYWNlcyAhPSBudWxsKSB7Ci0JCQkJc3BhY2VzID0gbWVyZ2VCbGFua0xpbmVzKHNwYWNlcywgb2xkU3BhY2VzKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0aGlzLmJ1ZmZlciA9PSBudWxsKQotCQkJdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0aGlzLnN0YXJ0T2Zmc2V0ID4gdGhpcy5sYXN0T2Zmc2V0KSB7Ci0JCQl0aGlzLmJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMubGFzdE9mZnNldCwgdGhpcy5zdGFydE9mZnNldCkpOwotCQl9Ci0KLQkJaWYgKHNwYWNlTGVuZ3RoID4gMCkKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZChzcGFjZXMpOwotCi0JCXRoaXMubGFzdE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQgKyB0aGlzLnNwYWNlQ291bnQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL0Fic3RyYWN0Q1NTTW9kZWxBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9BYnN0cmFjdENTU01vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ4MTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL0Fic3RyYWN0Q1NTTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuYWRhcHRlcnMuSUNTU01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q1NTTW9kZWxBZGFwdGVyIGltcGxlbWVudHMgSUNTU01vZGVsQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENTU19JRCA9IENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0KLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICovCi0JQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJLy8gY3JlYXRlIGVtYmVkZGVkIENTUyBtb2RlbCAobm90IGZvciBleHRlcm5hbCBDU1MpCi0JCWlmIChnZXRFbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCA9ICgoWE1MTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpOwotCQlJQ1NTTW9kZWwgbmV3TW9kZWwgPSAoSUNTU01vZGVsKSBiYXNlTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENTU19JRCk7Ci0JCSgoQ1NTTW9kZWxJbXBsKSBuZXdNb2RlbCkuc2V0T3duZXJET01Ob2RlKGdldEVsZW1lbnQoKSk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJQ1NTTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5U3R5bGVDaGFuZ2VkKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgdGFyZ2V0OwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9IG5vdGlmaWVyLmdldEFkYXB0ZXJzKCk7Ci0JCWlmIChhZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgU3R5bGVMaXN0ZW5lcikgewotCQkJCVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoU3R5bGVMaXN0ZW5lcikgYWRhcHRlcjsKLQkJCQlsaXN0ZW5lci5zdHlsZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayAKLQkgKiAxLiBJZiBhdHRyaWJ1dGVzIG9mIGVsZW1lbnQgaXMgdmFsaWQgKHR5cGUscmVsIC4uLikKLQkgKiAyLiBJZiBjb250ZW50IG1vZGVsIHN1cHBvcnRzIHRoaXMgZWxlbWVudCAvIGF0dHJpYnV0ZSAoZnV0dXJlID8pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChnZXRFbGVtZW50KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODIzNTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL0Fic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbGNzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVycy5JTW9kZWxQcm92aWRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmV2ZW50LklDU1NTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkltcG9ydGVkQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbE5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5Eb2N1bWVudFN0eWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLkRvY3VtZW50VHJhdmVyc2FsOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci0KLS8qKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlciBleHRlbmRzIEFic3RyYWN0Q1NTTW9kZWxBZGFwdGVyIGltcGxlbWVudHMgSUNTU1N0eWxlTGlzdGVuZXIsIElTdHlsZVNoZWV0QWRhcHRlciB7Ci0KLQkvLyB0aGlzIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGNsYXNzIGlzIGp1c3QgYSBWQUphdmEgdHJpY2suCi0JLy8gaXQgaW1wcm92ZXMgcGVyZm9ybWFuY2UgaW4gVkFKYXZhIGJ5IG1pbmltaXppbmcgY2xhc3MgbG9hZGluZy4KLQlwcml2YXRlIGZpbmFsIENsYXNzIFN0eWxlU2hlZXRBZGFwdGVyQ2xhc3MgPSBJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3M7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIHN0eWxlQ2hhbmdlZE5vZGVzOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJSUNTU01vZGVsIG5ld01vZGVsID0gc3VwZXIuY3JlYXRlTW9kZWwoKTsKLQkJaWYgKG5ld01vZGVsICE9IG51bGwpIHsKLQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBub3RpZnkgYWRhcHRlcgotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLm1vZGVsUHJvdmlkZWQobmV3TW9kZWwpOwotCQl9Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldCBnZXRTaGVldCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChTdHlsZVNoZWV0KSBtb2RlbC5nZXREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gU3R5bGVTaGVldEFkYXB0ZXJDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZWQoKSB7Ci0JCUlDU1NNb2RlbCBjdXJyZW50TW9kZWwgPSBnZXRNb2RlbCgpOwotCi0JCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQotCQlzZXRFbGVtZW50KG51bGwpOwotCQlzZXRNb2RlbChudWxsKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJYWRhcHRlci5tb2RlbFJlbGVhc2VkKGN1cnJlbnRNb2RlbCk7Ci0KLQkJaWYgKGN1cnJlbnRNb2RlbCAhPSBudWxsKQotCQkJY3VycmVudE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZWQoKSB7Ci0JCUlDU1NNb2RlbCBjdXJyZW50TW9kZWwgPSBnZXRNb2RlbCgpOwotCi0JCXNldE1vZGVsKG51bGwpOwotCi0JCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKGN1cnJlbnRNb2RlbCk7Ci0KLQkJaWYgKGN1cnJlbnRNb2RlbCAhPSBudWxsKQotCQkJY3VycmVudE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzcmNNb2RlbCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKiBAcGFyYW0gcmVtb3ZlZCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqIEBwYXJhbSBhZGRlZCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqIEBwYXJhbSBtZWRpYSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVDaGFuZ2VkKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIG1pZ2h0IHJlbGVhc2VkCi0JCURvY3VtZW50IGRvYyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJLy8gdG8gbm90aWZ5IEdFRiB0cmVlIAotCQlpZiAoZG9jIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9ICgoSU5vZGVOb3RpZmllcikgZG9jKS5nZXRBZGFwdGVycygpOwotCQkJaWYgKGFkYXB0ZXJzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSXRlcmF0b3IgaXQgPSBhZGFwdGVycy5pdGVyYXRvcigpOwotCQkJaWYgKGl0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcikgaXQubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTGlzdGVuZXIpIHsKLQkJCQkJKChJQ1NTU3R5bGVMaXN0ZW5lcikgYWRhcHRlcikuc3R5bGVDaGFuZ2VkKHNyY01vZGVsLCByZW1vdmVkLCBhZGRlZCwgbWVkaWEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLwotCi0JCWlmIChzdHlsZUNoYW5nZWROb2RlcyA9PSBudWxsKSB7Ci0JCQlzdHlsZUNoYW5nZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJaW50IHJlbW92ZWRTZWxOdW0gPSByZW1vdmVkICE9IG51bGwgPyByZW1vdmVkLmxlbmd0aCA6IDA7Ci0JCQlpbnQgYWRkZWRTZWxOdW0gPSBhZGRlZCAhPSBudWxsID8gYWRkZWQubGVuZ3RoIDogMDsKLQotCQkJTm9kZUl0ZXJhdG9yIGl0ZXIgPSAoKERvY3VtZW50VHJhdmVyc2FsKSBkb2MpLmNyZWF0ZU5vZGVJdGVyYXRvcihkb2MsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCBudWxsLCB0cnVlKTsKLQkJCU5vZGUgbm9kZTsKLQkJCXdoaWxlICgobm9kZSA9IGl0ZXIubmV4dE5vZGUoKSkgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudCBlbG0gPSAoRWxlbWVudCkgbm9kZTsKLQkJCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCQlpbnQgaTsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHJlbW92ZWRTZWxOdW0gJiYgIW1hdGNoOyBpKyspIHsKLQkJCQkJCW1hdGNoID0gcmVtb3ZlZFtpXS5tYXRjaChlbG0sIG51bGwpOwotCQkJCQl9Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCBhZGRlZFNlbE51bSAmJiAhbWF0Y2g7IGkrKykgewotCQkJCQkJbWF0Y2ggPSBhZGRlZFtpXS5tYXRjaChlbG0sIG51bGwpOwotCQkJCQl9Ci0JCQkJCWlmIChtYXRjaCkgewotCQkJCQkJaWYgKCFzdHlsZUNoYW5nZWROb2Rlcy5jb250YWlucyhlbG0pKQotCQkJCQkJCXN0eWxlQ2hhbmdlZE5vZGVzLmFkZChlbG0pOwotCQkJCQkJLy8gbm90aWZ5U3R5bGVDaGFuZ2VkKGVsbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJLy8gRG9jdW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgRG9jdW1lbnRUcmF2ZXJzYWwuLi4KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNyY01vZGVsIGNvbS5pYm0uc2VkLmNzcy5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlYTUxOb2RlIG5vZGUgPSAoWE1MTm9kZSkgZ2V0RWxlbWVudCgpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbCBtb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBtb2RlbC5nZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGJlZm9yZSB1cGRhdGluZywgYWxsIHN1Yi1tb2RlbHMgc2hvdWxkIGJlIGxvYWRlZCEKLQkJRG9jdW1lbnRTdHlsZSBkb2N1bWVudCA9IChEb2N1bWVudFN0eWxlKSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlTdHlsZVNoZWV0TGlzdCBzdHlsZXMgPSBkb2N1bWVudC5nZXRTdHlsZVNoZWV0cygpOwotCQlpZiAoc3R5bGVzICE9IG51bGwpIHsKLQkJCWludCBuID0gc3R5bGVzLmdldExlbmd0aCgpOwotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0IHNoZWV0ID0gc3R5bGVzLml0ZW0oaSk7Ci0JCQkJaWYgKHNoZWV0IGluc3RhbmNlb2YgSUNTU05vZGUpCi0JCQkJCXRyYXYuYXBwbHkoKElDU1NOb2RlKSBzaGVldCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBmbGFzaCBzdHlsZSBjaGFuZ2VkIGV2ZW50cwotCQlpZiAoc3R5bGVDaGFuZ2VkTm9kZXMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBzdHlsZUNoYW5nZWROb2Rlcy50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgZWxlbWVudHMgIT0gbnVsbCAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQkJbm90aWZ5U3R5bGVDaGFuZ2VkKChFbGVtZW50KSBlbGVtZW50c1tpXSk7Ci0JCQlzdHlsZUNoYW5nZWROb2Rlcy5jbGVhcigpOwotCQl9Ci0KLQkJLy8gdG8gbm90aWZ5IEdFRiB0cmVlIAotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlcnMoKTsKLQkJCWlmIChhZGFwdGVycyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUl0ZXJhdG9yIGl0ID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJCWlmIChpdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkJCSgoSUNTU1N0eWxlTGlzdGVuZXIpIGFkYXB0ZXIpLnN0eWxlVXBkYXRlKHNyY01vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlub3RpZmllci5wcm9wZXJ0eUNoYW5nZWQobm9kZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL0NTU1F1ZXJ5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvQ1NTUXVlcnlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZDg0ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvQ1NTUXVlcnlDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuQ1NTTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbi5DU1NQcm9wZXJ0eUNvbnRleHQ7Ci0KLS8qKgotICovCi1jbGFzcyBDU1NRdWVyeUNvbnRleHQgZXh0ZW5kcyBDU1NQcm9wZXJ0eUNvbnRleHQgewotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5Q29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlDb250ZXh0KElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJc3VwZXIoZGVjbCk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseUZ1bGwoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlFbnVtZXJhdGlvbiBrZXlzID0gZlByb3BlcnRpZXMua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCU9iamVjdCB2YWwgPSBmUHJvcGVydGllcy5nZXQoa2V5KTsKLQotCQkJaWYgKHZhbCBpbnN0YW5jZW9mIENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhKSB7Ci0JCQkJSUNTU1N0eWxlRGVjbEl0ZW0gZGVjbEl0ZW0gPSAoKENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhKSB2YWwpLmdldERlY2xJdGVtKCk7Ci0JCQkJaWYgKGRlY2xJdGVtLmdldExlbmd0aCgpIDw9IDApIHsKLQkJCQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbVRvUmVtb3ZlID0gZGVjbC5nZXREZWNsSXRlbU5vZGUoa2V5LnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoaXRlbVRvUmVtb3ZlICE9IG51bGwpIHsKLQkJCQkJCWRlY2wucmVtb3ZlRGVjbEl0ZW1Ob2RlKGl0ZW1Ub1JlbW92ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlY2wuc2V0RGVjbEl0ZW1Ob2RlKGRlY2xJdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSAodmFsIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSA/ICgoSUNTU1ZhbHVlKSB2YWwpLmdldENTU1ZhbHVlVGV4dCgpIDogdmFsLnRvU3RyaW5nKCk7Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW1Ub1JlbW92ZSA9IGRlY2wuZ2V0RGVjbEl0ZW1Ob2RlKGtleS50b1N0cmluZygpKTsKLQkJCQkJaWYgKGl0ZW1Ub1JlbW92ZSAhPSBudWxsKSB7Ci0JCQkJCQlkZWNsLnJlbW92ZURlY2xJdGVtTm9kZShpdGVtVG9SZW1vdmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWNsLnNldFByb3BlcnR5KGtleS50b1N0cmluZygpLCB2YWx1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrKFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiBpbXBvcnRhbnQsIGludCBzcGVjaWZpY2l0eSkgewotCQlPYmplY3QgY3VycmVudCA9IGZQcm9wZXJ0aWVzLmdldChwcm9wTmFtZSk7Ci0JCWlmIChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudCBpbnN0YW5jZW9mIENTU1F1ZXJ5VmFsdWVEYXRhKSB7Ci0JCQlDU1NRdWVyeVZhbHVlRGF0YSBjdXJyZW50VmFsdWUgPSAoQ1NTUXVlcnlWYWx1ZURhdGEpIGN1cnJlbnQ7Ci0JCQlpZiAoKCFpbXBvcnRhbnQgJiYgY3VycmVudFZhbHVlLmltcG9ydGFudCkgfHwgKGN1cnJlbnRWYWx1ZS5nZXRTcGVjaWZpY2l0eSgpID4gc3BlY2lmaWNpdHkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG92ZXJyaWRlV2l0aEV4cGFuZChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsLCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDU1NMaW5rQ29udmVydGVyIGNvbnYgPSBuZXcgQ1NTTGlua0NvbnZlcnRlcihkZWNsLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQotCQlpbnQgblByb3BlcnRpZXMgPSBkZWNsLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5Qcm9wZXJ0aWVzOyBpKyspIHsKLQkJCVN0cmluZyBwcm9wTmFtZSA9IGRlY2wuaXRlbShpKTsKLQkJCWlmIChwcm9wTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb3BOID0gcHJvcE5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKHByb3BOLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YocHJvcE4pOwotCQkJCQlTdHJpbmcgcHJpb3JpdHkgPSBkZWNsLmdldFByb3BlcnR5UHJpb3JpdHkocHJvcE5hbWUpOwotCQkJCQlib29sZWFuIGltcG9ydGFudCA9IHByaW9yaXR5ICE9IG51bGwgJiYgcHJpb3JpdHkubGVuZ3RoKCkgPiAwOwotCQkJCQlpZiAocHJvcCAhPSBudWxsICYmIHByb3AuaXNTaG9ydGhhbmQoKSkgewotCQkJCQkJLy8gZXhwYW5kIHNob3J0aGFuZCBwcm9wZXJ0eQotCQkJCQkJQ1NTUXVlcnlDb250ZXh0IGNvbnRleHQgPSBuZXcgQ1NTUXVlcnlDb250ZXh0KCk7Ci0JCQkJCQlleHBhbmRUb0xlYWYocHJvcCwgZGVjbC5nZXRQcm9wZXJ0eVZhbHVlKHByb3BOYW1lKSwgY29udGV4dCk7Ci0KLQkJCQkJCUVudW1lcmF0aW9uIHByb3BlcnRpZXMgPSBjb250ZXh0LnByb3BlcnRpZXMoKTsKLQkJCQkJCXdoaWxlIChwcm9wZXJ0aWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCQkJcHJvcE4gPSBwcm9wZXJ0aWVzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQkJCQlpZiAoY2hlY2socHJvcE4sIGltcG9ydGFudCwgc3BlY2lmaWNpdHkpKSB7Ci0JCQkJCQkJCWZQcm9wZXJ0aWVzLnB1dChwcm9wTiwgbmV3IENTU1F1ZXJ5VmFsdWVEYXRhKGNvbnYudG9BYnNvbHV0ZShjb250ZXh0LmdldChwcm9wTikpLCBpbXBvcnRhbnQsIHNwZWNpZmljaXR5KSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGNoZWNrKHByb3BOLCBpbXBvcnRhbnQsIHNwZWNpZmljaXR5KSkgewotCQkJCQkJCUlDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtID0gKElDU1NTdHlsZURlY2xJdGVtKSBkZWNsLmdldERlY2xJdGVtTm9kZShwcm9wTmFtZSkuY2xvbmVOb2RlKHRydWUpOwotCQkJCQkJCWludCBuVmFsdWVzID0gZGVjbEl0ZW0uZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuVmFsdWVzOyBqKyspIHsKLQkJCQkJCQkJY29udi50b0Fic29sdXRlKGRlY2xJdGVtLml0ZW0oaikpOwotCQkJCQkJCX0KLQkJCQkJCQlkZWNsSXRlbS5zZXRQcmlvcml0eShudWxsKTsKLQkJCQkJCQlmUHJvcGVydGllcy5wdXQocHJvcE4sIG5ldyBDU1NRdWVyeURlY2xhcmF0aW9uRGF0YShkZWNsSXRlbSwgaW1wb3J0YW50LCBzcGVjaWZpY2l0eSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL0NTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9DU1NRdWVyeURlY2xhcmF0aW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQyYjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL0NTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbGNzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEgZXh0ZW5kcyBDU1NRdWVyeVZhbHVlRGF0YSB7Ci0KLQotCUlDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtOwotCi0JcHVibGljIENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhKElDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtLCBib29sZWFuIGltcCwgaW50IHNwZWNpZmljaXR5KSB7Ci0JCXN1cGVyKG51bGwsIGltcCwgc3BlY2lmaWNpdHkpOwotCQl0aGlzLmRlY2xJdGVtID0gZGVjbEl0ZW07Ci0JfQotCi0JLyoqCi0JICovCi0JSUNTU1N0eWxlRGVjbEl0ZW0gZ2V0RGVjbEl0ZW0oKSB7Ci0JCXJldHVybiBkZWNsSXRlbTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiBkZWNsSXRlbSAhPSBudWxsKSB7Ci0JCQl2YWx1ZSA9IGRlY2xJdGVtLmdldENTU1ZhbHVlVGV4dCgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9DU1NRdWVyeVRyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvQ1NTUXVlcnlUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkZGNlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9DU1NRdWVyeVRyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5FbGVtZW50Q1NTSW5saW5lU3R5bGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ1NTUXVlcnlUcmF2ZXJzZXIgZXh0ZW5kcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFN0cmluZyBwc2V1ZG9OYW1lOwotCXByaXZhdGUgQ1NTUXVlcnlDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCUlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQl0cnkgewotCQkJSUNTU1N0eWxlRGVjbGFyYXRpb24gaW5saW5lU3R5bGUgPSAoSUNTU1N0eWxlRGVjbGFyYXRpb24pICgoRWxlbWVudENTU0lubGluZVN0eWxlKSBlbGVtZW50KS5nZXRTdHlsZSgpOwotCQkJaWYgKGlubGluZVN0eWxlICE9IG51bGwpIHsKLQkJCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQkJCWNvbnRleHQgPSBuZXcgQ1NTUXVlcnlDb250ZXh0KCk7Ci0JCQkJfQotCQkJCWNvbnRleHQub3ZlcnJpZGVXaXRoRXhwYW5kKGlubGluZVN0eWxlLCAxMDAwMCk7Ci0JCQkJLy8gc3R5bGUgYXR0cmlidXRlJ3Mgc3BlY2lmaWNpdHkgaXMgMTAwIChpbiBDU1MyIHNwZWMuKSBhbmQKLQkJCQkvLyBvdXIgaW1wbGVtZW50IHVzZSAxMDAgYXMgYmFzZSBudW1iZXIgKHNlZSBDU1NTZWxlY3Rvci5qYXZhKQotCQkJfQotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGVsZW1lbnQgaXMgbm90IEVsZW1lbnRDU1NJbmxpbmVTdHlsZSA/Pz8KLQkJfQotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCWRlY2wgPSBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVN0eWxlRGVjbGFyYXRpb24oKTsKLQkJY29udGV4dC5hcHBseUZ1bGwoZGVjbCk7Ci0JCXJldHVybiBkZWNsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBvdmVyd3JpdGVEZWNsYXJhdGlvbihJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkLCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJaWYgKGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCWNvbnRleHQgPSBuZXcgQ1NTUXVlcnlDb250ZXh0KCk7Ci0JCWNvbnRleHQub3ZlcnJpZGVXaXRoRXhwYW5kKGQsIHNwZWNpZmljaXR5KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcG9zdE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkvLyBzdHlsZSBydWxlCi0JCQlJQ1NTU3R5bGVSdWxlIHN0eWxlID0gKElDU1NTdHlsZVJ1bGUpIG5vZGU7Ci0JCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBzdHlsZS5nZXRTZWxlY3RvcnMoKTsKLQkJCWludCBuU2VsZWN0b3JzID0gbGlzdC5nZXRMZW5ndGgoKTsKLQkJCWludCBtYXhTcGVjaWZpY2l0eSA9IC0xOwotCQkJZm9yIChpbnQgaVNlbGVjdG9yID0gMDsgaVNlbGVjdG9yIDwgblNlbGVjdG9yczsgaVNlbGVjdG9yKyspIHsKLQkJCQkvLyBDaGVjayBlYWNoIFNlbGVjdG9yIExpc3RzCi0JCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gbGlzdC5nZXRTZWxlY3RvcihpU2VsZWN0b3IpOwotCQkJCWludCBzcGVjaWZpY2l0eSA9IHNlbGVjdG9yLmdldFNwZWNpZmljaXR5KCk7Ci0JCQkJaWYgKG1heFNwZWNpZmljaXR5IDwgc3BlY2lmaWNpdHkgJiYgc2VsZWN0b3IubWF0Y2goZWxlbWVudCwgcHNldWRvTmFtZSkpIHsKLQkJCQkJbWF4U3BlY2lmaWNpdHkgPSBzcGVjaWZpY2l0eTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWF4U3BlY2lmaWNpdHkgPj0gMCkgewotCQkJCS8vIGFwcGx5IHRoaXMgc3R5bGUgdG8gdGhlIGVsZW1lbnQKLQkJCQlvdmVyd3JpdGVEZWNsYXJhdGlvbigoSUNTU1N0eWxlRGVjbGFyYXRpb24pIHN0eWxlLmdldFN0eWxlKCksIG1heFNwZWNpZmljaXR5KTsKLQkJCX0KLQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQl9Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0Q29udGV4dCgpIHsKLQkJY29udGV4dCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucHNldWRvTmFtZSA9IHBzZXVkb05hbWU7Ci0JCXJlc2V0Q29udGV4dCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9DU1NRdWVyeVZhbHVlRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvQ1NTUXVlcnlWYWx1ZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmNTZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9DU1NRdWVyeVZhbHVlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbi5WYWx1ZURhdGE7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgQ1NTUXVlcnlWYWx1ZURhdGEgZXh0ZW5kcyBWYWx1ZURhdGEgewotCi0JcHJpdmF0ZSBpbnQgc3BlY2lmaWNpdHk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlWYWx1ZURhdGEoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5VmFsdWVEYXRhKFN0cmluZyB2YWwsIGJvb2xlYW4gaW1wKSB7Ci0JCXN1cGVyKHZhbCwgaW1wKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlWYWx1ZURhdGEoU3RyaW5nIHZhbCwgYm9vbGVhbiBpbXAsIGludCBzcGVjaWZpY2l0eSkgewotCQlzdXBlcih2YWwsIGltcCk7Ci0JCXRoaXMuc3BlY2lmaWNpdHkgPSBzcGVjaWZpY2l0eTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0U3BlY2lmaWNpdHkoKSB7Ci0JCXJldHVybiBzcGVjaWZpY2l0eTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvSFRNTERvY3VtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvSFRNTERvY3VtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmVjYzIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL0hUTUxEb2N1bWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbGNzczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkNTU0NsYXNzVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5jb250ZW50bW9kZWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIsIFN0eWxlU2hlZXRMaXN0IHsKLQotCXByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgVmVjdG9yIHN0eWxlQWRhcHRlcnMgPSBudWxsOwotCXByaXZhdGUgVmVjdG9yIG9sZFN0eWxlQWRhcHRlcnMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JSFRNTERvY3VtZW50QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU3R5bGVTaGVldChFbGVtZW50IG5vZGUpIHsKLQkJWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIG5vZGU7Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWJvb2xlYW4gaXNDb250YWluZXIgPSBmYWxzZTsKLQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBUKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ST09UKSB8fCAoIWVsZW1lbnQuaXNHbG9iYWxUYWcoKSAmJiBlbGVtZW50LmlzQ29udGFpbmVyKCkpKSB7Ci0JCQlpc0NvbnRhaW5lciA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgPT0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpIHsKLQkJCQkvLyBUaGlzIGNvbmRpdGlvbiBpcyB0b28gc2V2ZXJlLCBhY3R1YWxseSBkbyBub3Qgd29yayBmb3IgSlNGIHRlbXBsYXRlLgotCQkJCS8vIEJ1dCBhYm92ZSAoISBnbG9iYWxUYWcoKSAmJiBpc0NvbnRhaW5lcigpKSBjb3ZlciBKU0YgdGVtcGxhdGUgKyB0cGwgdGVtcGxhdGUKLQkJCQlpc0NvbnRhaW5lciA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXRhZ05hbWUgPSAoKEVsZW1lbnQpIHBhcmVudCkuZ2V0VGFnTmFtZSgpOwotCQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKSkgewotCQkJCQlpc0NvbnRhaW5lciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTCkpIHsKLQkJCQkvLyB0YWdsaWIgaHRtbCB0YWcKLQkJCQlpc0NvbnRhaW5lciA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gZWxlbWVudDsKLQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpIHsKLQkJCQkJdGhpcy5zdHlsZUFkYXB0ZXJzLmFkZEVsZW1lbnQoYWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpc0NvbnRhaW5lcikgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IGVsZW1lbnQ7Ci0JCQlpZiAobm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpID09IG51bGwpIHsKLQkJCQlub3RpZmllci5hZGRBZGFwdGVyKHRoaXMpOwotCQkJfQotCQkJZm9yIChOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQljb250aW51ZTsKLQkJCQlhZGRTdHlsZVNoZWV0KChFbGVtZW50KSBjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGNoaWxkUmVwbGFjZWQoKSB7Ci0JCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBiYWNrdXAgb2xkIGFkYXB0ZXJzIHRvIGJlIHJlbGVhc2VkIG9uIHVwZGF0aW5nIGluIGdldFN0eWxlU2hlZXRzKCkKLQkJdGhpcy5vbGRTdHlsZUFkYXB0ZXJzID0gdGhpcy5zdHlsZUFkYXB0ZXJzOwotCQkvLyBpbnZhbGlkYXRlIHRoZSBsaXN0Ci0JCXRoaXMuc3R5bGVBZGFwdGVycyA9IG51bGw7Ci0KLQkJbm90aWZ5U3R5bGVTaGVldHNDaGFuZ2VkKHRoaXMuZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRDbGFzc2VzKCkgewotCQlTdHlsZVNoZWV0TGlzdCBzaGVldExpc3QgPSBnZXRTdHlsZVNoZWV0cygpOwotCQlpbnQgblNoZWV0cyA9IHNoZWV0TGlzdC5nZXRMZW5ndGgoKTsKLQotCQlmaW5hbCBBcnJheUxpc3QgY2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlDU1NDbGFzc1RyYXZlcnNlciB0cmF2ZXJzZXIgPSBuZXcgQ1NTQ2xhc3NUcmF2ZXJzZXIoKTsKLQkJdHJhdmVyc2VyLnNldFRyYXZlcnNlSW1wb3J0ZWQodHJ1ZSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2hlZXRzOyBpKyspIHsKLQkJCW9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQgc2hlZXQgPSBzaGVldExpc3QuaXRlbShpKTsKLQkJCWlmIChzaGVldCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJdHJhdmVyc2VyLmFwcGx5KChJQ1NTTm9kZSkgc2hlZXQpOwotCQkJfQotCQl9Ci0JCWNsYXNzZXMuYWRkQWxsKHRyYXZlcnNlci5nZXRDbGFzc05hbWVzKCkpOwotCi0JCXJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7Ci0JCQlpbnQgaSA9IDA7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJCQlyZXR1cm4gaSA8IGNsYXNzZXMuc2l6ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQkJCXJldHVybiBjbGFzc2VzLmdldChpKyspOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRWYWxpZEFkYXB0ZXJzKCkgewotCQlWZWN0b3IgdmFsaWRBZGFwdGVycyA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpID0gdGhpcy5zdHlsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIgJiYgKChBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyKSBvYmopLmlzVmFsaWRBdHRyaWJ1dGUoKSkgewotCQkJCQl2YWxpZEFkYXB0ZXJzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsaWRBZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFZhbGlkQWRhcHRlcnMoKS5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCVN0eWxlU2hlZXRMaXN0IHNzbCA9IGdldFN0eWxlU2hlZXRzKCk7Ci0JCWludCBudW1TdHlsZXMgPSBzc2wuZ2V0TGVuZ3RoKCk7Ci0KLQkJQ1NTUXVlcnlUcmF2ZXJzZXIgcXVlcnkgPSBuZXcgQ1NTUXVlcnlUcmF2ZXJzZXIoKTsKLQkJcXVlcnkuc2V0VHJhdmVyc2VJbXBvcnRlZCh0cnVlKTsKLQkJcXVlcnkuc2V0VHJhdmVyc2VJbXBvcnRGaXJzdCh0cnVlKTsKLQkJcXVlcnkuc2V0RWxlbWVudChlbGVtZW50LCBwc2V1ZG9OYW1lKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVN0eWxlczsgaSsrKSB7Ci0JCQkvLyBsb29wIGZvciBzdHlsZXMgKDxzdHlsZT4gYW5kIDxsaW5rPikKLQkJCW9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQgc3MgPSBzc2wuaXRlbShpKTsKLQotCQkJdHJ5IHsKLQkJCQlxdWVyeS5hcHBseSgoSUNTU05vZGUpIHNzKTsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBJIGNhbiBoYW5kbGUgb25seSBDU1Mgc3R5bGUKLQkJCX0KLQkJfQotCi0JCXJldHVybiBxdWVyeS5nZXREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0TGlzdCBnZXRTdHlsZVNoZWV0cygpIHsKLQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQl0aGlzLnN0eWxlQWRhcHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSB0aGlzLmRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWFkZFN0eWxlU2hlZXQoKEVsZW1lbnQpIGNoaWxkKTsKLQkJCX0KLQotCQkJcmVtb3ZlT2xkU3R5bGVTaGVldHMoKTsKLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QgdmFsaWRBZGFwdGVycyA9IGdldFZhbGlkQWRhcHRlcnMoKTsKLQotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHZhbGlkQWRhcHRlcnMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCW9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQgc2hlZXQgPSAoKElTdHlsZVNoZWV0QWRhcHRlcikgdmFsaWRBZGFwdGVycy5nZXQoaW5kZXgpKS5nZXRTaGVldCgpOwotCQlpZiAoc2hlZXQgPT0gbnVsbCkgey8vIGZvciBMSU5LIGVsZW1lbnQgd2hvc2UgbGluayBpcyBicm9rZW4KLQkJCUlDU1NNb2RlbCBtb2RlbCA9ICgoQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlcikgdGhpcy5zdHlsZUFkYXB0ZXJzLmVsZW1lbnRBdChpbmRleCkpLmNyZWF0ZU1vZGVsKCk7Ci0JCQlzaGVldCA9ICgobW9kZWwgIT0gbnVsbCkgPyAoU3R5bGVTaGVldCkgbW9kZWwuZ2V0RG9jdW1lbnQoKSA6IG51bGwpOwotCQl9Ci0JCXJldHVybiBzaGVldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCWNhc2UgSU5vZGVOb3RpZmllci5BREQgOgotCQkJCW5vZGUgPSAoTm9kZSkgbmV3VmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFIDoKLQkJCQlub2RlID0gKE5vZGUpIG9sZFZhbHVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkNIQU5HRSA6Ci0JCQkJbm9kZSA9IChOb2RlKSBub3RpZmllcjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChub2RlID09IG51bGwgfHwgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuOwotCQlYTUxFbGVtZW50IGVsZW1lbnQgPSAoWE1MRWxlbWVudCkgbm9kZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKSkgewotCQkJCXJlZnJlc2hBZGFwdGVycygpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkspIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ST09UKSB8fCBlbGVtZW50LmlzQ29tbWVudFRhZygpIHx8ICghZWxlbWVudC5pc0dsb2JhbFRhZygpICYmIGVsZW1lbnQuaXNDb250YWluZXIoKSkpIHsKLQkJCQljaGlsZFJlcGxhY2VkKCk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UpKSB7Ci0JCQkJcmVmcmVzaEFkYXB0ZXJzKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCQlpZiAobG9jYWxOYW1lICE9IG51bGwgJiYgbG9jYWxOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwpKSB7Ci0JCQkJCS8vIHRhZ2xpYiBodG1sIHRhZwotCQkJCQljaGlsZFJlcGxhY2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVsb2FkIExJTksgLyBAaW1wb3J0IGlmIEJBU0UgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoQWRhcHRlcnMoKSB7Ci0JCUl0ZXJhdG9yIGlBZGFwdGVyID0gdGhpcy5zdHlsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpQWRhcHRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gaUFkYXB0ZXIubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBMaW5rRWxlbWVudEFkYXB0ZXIpIHsKLQkJCQkoKExpbmtFbGVtZW50QWRhcHRlcikgYWRhcHRlcikucmVmcmVzaFNoZWV0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgU3R5bGVFbGVtZW50QWRhcHRlcikgewotCQkJCUlDU1NNb2RlbCBtb2RlbCA9ICgoU3R5bGVFbGVtZW50QWRhcHRlcikgYWRhcHRlcikuZ2V0TW9kZWwoKTsKLQkJCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQkJCXRyYXYuYXBwbHkobW9kZWwpOwotCQkJCUl0ZXJhdG9yIGlSdWxlID0gdHJhdi5nZXRSdWxlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGlSdWxlLmhhc05leHQoKSkgewotCQkJCQlJQ1NTSW1wb3J0UnVsZSBydWxlID0gKElDU1NJbXBvcnRSdWxlKSBpUnVsZS5uZXh0KCk7Ci0JCQkJCXJ1bGUucmVmcmVzaFN0eWxlU2hlZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5U3R5bGVTaGVldHNDaGFuZ2VkKERvY3VtZW50IHRhcmdldCkgewotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHRhcmdldDsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNvbGxlY3Rpb24gYWRhcHRlcnMgPSBub3RpZmllci5nZXRBZGFwdGVycygpOwotCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSBhZGFwdGVycy5pdGVyYXRvcigpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFN0eWxlTGlzdGVuZXIpIHsKLQkJCQlTdHlsZUxpc3RlbmVyIGxpc3RlbmVyID0gKFN0eWxlTGlzdGVuZXIpIGFkYXB0ZXI7Ci0JCQkJbGlzdGVuZXIuc3R5bGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVsZWFzZU9sZFN0eWxlU2hlZXRzKCkgewotCQlpZiAodGhpcy5vbGRTdHlsZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gdGhpcy5vbGRTdHlsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlTdHlsZVNoZWV0QWRhcHRlciBhZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgaXQubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCS8vIGlmIHRoZSBzYW1lIGFkYXB0ZXIgaXMgaW4gdGhlIGN1cnJlbnQgbGlzdCwKLQkJCS8vIGRvIG5vdCByZWxlYXNlCi0JCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzICE9IG51bGwgJiYgdGhpcy5zdHlsZUFkYXB0ZXJzLmNvbnRhaW5zKGFkYXB0ZXIpKQotCQkJCWNvbnRpbnVlOwotCQkJYWRhcHRlci5yZWxlYXNlZCgpOwotCQl9Ci0JCXRoaXMub2xkU3R5bGVBZGFwdGVycyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZVN0eWxlU2hlZXRzKCkgewotCQlyZWxlYXNlT2xkU3R5bGVTaGVldHMoKTsKLQotCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gdGhpcy5zdHlsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlTdHlsZVNoZWV0QWRhcHRlciBhZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgaXQubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLnJlbGVhc2VkKCk7Ci0JCX0KLQkJdGhpcy5zdHlsZUFkYXB0ZXJzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlT2xkU3R5bGVTaGVldHMoKSB7Ci0JCWlmICh0aGlzLm9sZFN0eWxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSB0aGlzLm9sZFN0eWxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVN0eWxlU2hlZXRBZGFwdGVyIGFkYXB0ZXIgPSAoSVN0eWxlU2hlZXRBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gaWYgdGhlIHNhbWUgYWRhcHRlciBpcyBpbiB0aGUgY3VycmVudCBsaXN0LAotCQkJLy8gZG8gbm90IHJlbGVhc2UKLQkJCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgIT0gbnVsbCAmJiB0aGlzLnN0eWxlQWRhcHRlcnMuY29udGFpbnMoYWRhcHRlcikpCi0JCQkJY29udGludWU7Ci0JCQlhZGFwdGVyLnJlbW92ZWQoKTsKLQkJfQotCQl0aGlzLm9sZFN0eWxlQWRhcHRlcnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2E4NDI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sY3NzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuYWRhcHRlcnMuSVN0eWxlU2VsZWN0b3JBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyIGltcGxlbWVudHMgSVN0eWxlU2VsZWN0b3JBZGFwdGVyIHsKLQotCXN0YXRpYyBwcml2YXRlIEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlciBpbnN0YW5jZTsKLQlwcml2YXRlIE9iamVjdCB0b01hdGNoID0gSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQubW9kZWwuaHRtbC5jc3MuSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQubW9kZWwuSU5vZGVBZGFwdGVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSB0b01hdGNoOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQuY3NzLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKElDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgaTsKLQkJU3RyaW5nIGtleTsKLQotCQkvLyBQc2V1ZG9OYW1lCi0JCWkgPSBzZWxlY3Rvci5nZXROdW1PZlBzZXVkb05hbWVzKCk7Ci0JCWlmIChpID4gMCkgewotCQkJaWYgKHBzZXVkb05hbWUgPT0gbnVsbCB8fCBwc2V1ZG9OYW1lLmxlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJaWYgKHBzZXVkb05hbWUuZXF1YWxzSWdub3JlQ2FzZShzZWxlY3Rvci5nZXRQc2V1ZG9OYW1lKGkpKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaSA8IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgdGFnIG5hbWUKLQkJaWYgKCFzZWxlY3Rvci5pc1VuaXZlcnNhbCgpICYmICFlbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShzZWxlY3Rvci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGNoZWNrIGlkCi0JCWkgPSBzZWxlY3Rvci5nZXROdW1PZklEcygpOwotCQlpZiAoaSA+IDApIHsKLQkJCWlmIChpID4gMSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAoa2V5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCFzZWxlY3Rvci5nZXRJRCgwKS5lcXVhbHMoa2V5KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayBjbGFzcwotCQlpID0gc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0JCWlmIChpID4gMCkgewotCQkJa2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGtleSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGtleSk7Ci0JCQlmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJaWYgKHNlbGVjdG9yLmdldENsYXNzKGkpLmVxdWFscyh0b2tlbml6ZXIubmV4dFRva2VuKCkpKSB7Ci0JCQkJCQlvayA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIW9rKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBhdHRyaWJ1dGVzCi0JCWZvciAoaSA9IHNlbGVjdG9yLmdldE51bU9mQXR0cmlidXRlcygpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlbGVjdG9yLmdldEF0dHJpYnV0ZShpKSwgIj1+fCBcdFxyXG5cZiIpOy8vJE5PTi1OTFMtMSQKLQkJCWludCBjb3VudFRva2VucyA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQkJaWYgKGNvdW50VG9rZW5zID4gMCkgewotCQkJCVN0cmluZyBhdHRyVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJCWlmIChhdHRyVmFsdWUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChjb3VudFRva2VucyA+IDEpIHsKLQkJCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigiPSBcdFxyXG5cZiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVG9rZW5pemVyIGF0dHJWYWx1ZVRva2VuaXplciA9IG51bGw7Ci0JCQkJCWlmICh0b2tlbi5lcXVhbHMoIn4iKSkgey8vJE5PTi1OTFMtMSQKLQkJCQkJCWF0dHJWYWx1ZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh0b2tlbi5lcXVhbHMoInwiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQkJCWF0dHJWYWx1ZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlLCAiLSIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoYXR0clZhbHVlVG9rZW5pemVyICE9IG51bGwpIHsKLQkJCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCQkJCXdoaWxlIChhdHRyVmFsdWVUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCWlmICh0b2tlbi5lcXVhbHMoYXR0clZhbHVlVG9rZW5pemVyLm5leHRUb2tlbigpKSkgewotCQkJCQkJCQkJb2sgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFvaykKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKCFhdHRyVmFsdWUuZXF1YWxzKHRva2VuKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLm1vZGVsLklOb2RlQWRhcHRlcgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Mjk5MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBPYmplY3QgdG9NYXRjaCA9IElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzczsKLQotCS8qKgotCSAqIENTU01vZGVsUHJvdmlkZUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4KLQkgKiBJdCBtYXkgYmUgYSBzaW5nbGV0b24gb3Igbm90IC4uLiBkZXBlbmRpbmcgb24gdGhlIG5lZWRzIG9mIHRoZSBJTm9kZUFkYXB0ZXIgIC4uLgotCSAqIGJ1dCBpbiBnZW5lcmFsIGl0IGlzIHJlY29tbWVuZGVkIGZvciBhbiBhZGFwdGVyIHRvIGJlIHN0YXRlbGVzcywgCi0JICogc28gdGhlIGVmZmljaWVuY2llcyBvZiBhIHNpbmdsZXRvbiBjYW4gYmUgZ2FpbmVkLgotCSAqCi0JICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIGFkZEFkYXB0ZXIgb24gdGhlIGFkYXB0ZWQKLQkgKiBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyOwotCQlhZGFwdGVyID0gSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyLmdldEluc3RhbmNlKCk7Ci0JCW5vdGlmaWVyLmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBAcmV0dXJuIGNvbS5pYm0uaXd0LmNzcy5hZGFwdGVycy5IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBpc0ZhY3RvcnlGb3JUeXBlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gdG9NYXRjaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIGNvcHkgbWV0aG9kCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL0xpbmtFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvTGlua0VsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNWI1MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvTGlua0VsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3M7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklNb2RlbFByb3ZpZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVycy5JU3R5bGVTaGVldExpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDU1NfSUQgPSBDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTOwotCXByaXZhdGUgYm9vbGVhbiByZXBsYWNlTW9kZWwgPSB0cnVlOwotCS8vIHRoaXMgdmFyaWFibGUgdG8gaG9sZCB0aGUgY2xhc3MgaXMganVzdCBhIFZBSmF2YSB0cmljay4KLQkvLyBpdCBpbXByb3ZlcyBwZXJmb3JtYW5jZSBpbiBWQUphdmEgYnkgbWluaW1pemluZyBjbGFzcyBsb2FkaW5nLgotCXByaXZhdGUgZmluYWwgQ2xhc3MgTW9kZWxQcm92aWRlQWRhcHRlckNsYXNzID0gSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3M7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgTGlua0VsZW1lbnRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBhdHRyUmVwbGFjZWQoKSB7Ci0JCXRoaXMucmVwbGFjZU1vZGVsID0gdHJ1ZTsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlIVE1MRG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoSFRNTERvY3VtZW50QWRhcHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYWRhcHRlci5jaGlsZFJlcGxhY2VkKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQkvLyBjcmVhdGUgcGhhbnRvbShicm9rZW4gbGluaykgZXh0ZXJuYWwgQ1NTIG1vZGVsCi0JCWlmIChnZXRFbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCA9ICgoWE1MTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpOwotCQlJQ1NTTW9kZWwgbmV3TW9kZWwgPSAoSUNTU01vZGVsKSBiYXNlTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENTU19JRCk7Ci0KLQkJLy8gY2FsY3VsYXRlIGJhc2UgbG9jYXRpb24gYW5kIHNldAotCQkvLyBnZXQgcmVzb2x2ZXIgaW4gTW9kZWwKLQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBiYXNlTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQotCQkvLyByZXNvbHZlIHRvIGFic29sdXRlIHVybCA6IHRoaXMgbmVlZCBub3QgZXhhY3QgbG9jYXRpb24gb2YgY3NzIGZpbGUuIEl0IGlzIGltcG9ydGFudCB0aGF0IGFic3VybCBpcyBub3QgbnVsbC4gCi0JCVN0cmluZyByZWYgPSBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGKTsKLQkJU3RyaW5nIGFic3VybCA9IChyZXNvbHZlciAhPSBudWxsICYmIHJlZiAhPSBudWxsKSA/IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkocmVmLCB0cnVlKSA6IG51bGw7Ci0JCWlmICgoYWJzdXJsID09IG51bGwpIHx8IChhYnN1cmwubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCVVSTEhlbHBlciBoZWxwZXIgPSBuZXcgVVJMSGVscGVyKGJhc2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpKTsKLQkJCWFic3VybCA9IGhlbHBlci50b0Fic29sdXRlKHJlZiA9PSBudWxsID8gIiIgOiByZWYpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFic3VybCA9PSBudWxsKSB8fCAoYWJzdXJsLmxlbmd0aCgpID09IDApKSB7Ci0JCQlhYnN1cmwgPSByZWY7Ci0JCX0KLQkJaWYgKGFic3VybCA9PSBudWxsKSB7Ci0JCQlhYnN1cmwgPSAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJbmV3TW9kZWwuc2V0QmFzZUxvY2F0aW9uKGFic3VybCk7Ci0KLQkJLy8gc2V0IHN0eWxlIGxpc3RlbmVyCi0JCW5ld01vZGVsLmFkZFN0eWxlTGlzdGVuZXIodGhpcyk7Ci0KLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKHRoaXMucmVwbGFjZU1vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgb2xkTW9kZWwgPSBtb2RlbDsKLQotCQkJbW9kZWwgPSByZXRyaWV2ZU1vZGVsKCk7Ci0JCQlzZXRNb2RlbChtb2RlbCk7Ci0KLQkJCS8vIHJlbGVhc2Ugb2xkIG1vZGVsCi0JCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKG9sZE1vZGVsKTsKLQotCQkJCW9sZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCi0JCQl9Ci0JCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKGV2ZW50VHlwZSAhPSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkKLQkJCXJldHVybjsKLQkJQXR0ciBhdHRyID0gKEF0dHIpIGNoYW5nZWRGZWF0dXJlOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJyZWwiKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJCW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpIHx8IC8vJE5PTi1OTFMtMSQJCi0JCQkJCW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaHJlZiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJYXR0clJlcGxhY2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoU2hlZXQoKSB7Ci0JCWlmICghcmVwbGFjZU1vZGVsKSB7Ci0JCQlyZW1vdmVkKCk7Ci0JCQlyZXBsYWNlTW9kZWwgPSB0cnVlOwotCi0JCQlYTUxOb2RlIG5vZGUgPSAoWE1MTm9kZSkgZ2V0RWxlbWVudCgpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCW5vZGUubm90aWZ5KElOb2RlTm90aWZpZXIuQ0hBTkdFLCBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlTm9kZShvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiksIG51bGwsIG51bGwsIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlZCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQotCQkJCS8vIHNldCBlbGVtZW50IHRvIG51bGwgZmlyc3QsIHNvIHRoYXQgbm8gZG9jdW1lbnQgd2lkZSB1cGRhdGVzCi0JCQkJc2V0RWxlbWVudChudWxsKTsKLQkJCQlzZXRNb2RlbChudWxsKTsKLQotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCWFkYXB0ZXIubW9kZWxSZWxlYXNlZChtb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZWQoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChtb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdHRyaWJ1dGUoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyZWwiKTsvLyROT04tTkxTLTEkCi0JCWlmIChyZWwgPT0gbnVsbCB8fCAhcmVsLmVxdWFsc0lnbm9yZUNhc2UoInN0eWxlc2hlZXQiKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlICE9IG51bGwgJiYgIXR5cGUuZXF1YWxzSWdub3JlQ2FzZSgidGV4dC9jc3MiKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBocmVmID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsvLyROT04tTkxTLTEkCi0JCWlmIChocmVmID09IG51bGwgfHwgaHJlZi5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCByZXRyaWV2ZU1vZGVsKCkgewotCQlpZiAoIWlzVmFsaWRBdHRyaWJ1dGUoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBudWxsLGF0dHIgY2hlY2sgaXMgZG9uZSBpbiBpc1ZhbGlkQXR0cmlidXRlKCkKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlTdHJpbmcgaHJlZiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJocmVmIik7Ly8kTk9OLU5MUy0xJAotCi0JCVhNTE1vZGVsIGJhc2VNb2RlbCA9ICgoWE1MTm9kZSkgZWxlbWVudCkuZ2V0TW9kZWwoKTsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBpZCA9IGJhc2VNb2RlbC5nZXRJZCgpOwotCQlpZiAoIShpZCBpbnN0YW5jZW9mIFN0cmluZykpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy9TdHJpbmcgYmFzZSA9IChTdHJpbmcpaWQ7Ci0KLQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlckNsYXNzKTsKLQotCQlVUkxNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFVSTE1vZGVsUHJvdmlkZXIoKTsKLQkJdHJ5IHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBwcm92aWRlci5nZXRNb2RlbEZvclJlYWQoYmFzZU1vZGVsLCBocmVmKTsKLQkJCWlmIChuZXdNb2RlbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCEobmV3TW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpKSB7Ci0JCQkJbmV3TW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBhZGFwdGVyCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxQcm92aWRlZChuZXdNb2RlbCk7Ci0KLQkJCXJldHVybiAoSUNTU01vZGVsKSBuZXdNb2RlbDsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElDU1NNb2RlbCBtb2RlbCkgewotCQlJQ1NTTW9kZWwgb2xkTW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBvbGRNb2RlbCkKLQkJCXJldHVybjsKLQkJc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotCQlpZiAodGhpcy5yZXBsYWNlTW9kZWwpCi0JCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkKLQkJCW9sZE1vZGVsLnJlbW92ZVN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKQotCQkJbW9kZWwuYWRkU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvU3R5bGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvU3R5bGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQ4OGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL1N0eWxlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbGNzczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuYWRhcHRlcnMuSVN0eWxlU2hlZXRMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlQWRhcHRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENTU19DT05URU5UX1RZUEUgPSAidGV4dC9jc3MiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0eWxlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG5vdGlmaWVyOwotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJSFRNTERvY3VtZW50QWRhcHRlciBuZXdBZGFwdGVyID0gbmV3IEhUTUxEb2N1bWVudEFkYXB0ZXIoKTsKLQkJCW5ld0FkYXB0ZXIuc2V0RG9jdW1lbnQoKERvY3VtZW50KSBub2RlKTsKLQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCQlyZXR1cm4gbmV3QWRhcHRlcjsKLQkJfQotCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQlpZiAoIWlzVGFnQXZhaWxhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkvLwkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQkJLy8JCWlmICh0eXBlICE9IG51bGwgJiYgISB0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQ1NTX0NPTlRFTlRfVFlQRSkpIHsKLQkJCS8vCQkJcmV0dXJuIG51bGw7Ci0JCQkvLwkJfQotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQlTdHlsZUVsZW1lbnRBZGFwdGVyIG5ld0FkYXB0ZXIgPSBuZXcgU3R5bGVFbGVtZW50QWRhcHRlcigpOwotCQkJbmV3QWRhcHRlci5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJbm90aWZpZXIuYWRkQWRhcHRlcihuZXdBZGFwdGVyKTsKLQkJCXJldHVybiBuZXdBZGFwdGVyOwotCQl9Ci0JCWVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSykpIHsKLQkJCWlmICghaXNUYWdBdmFpbGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCksIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQlMaW5rRWxlbWVudEFkYXB0ZXIgbmV3QWRhcHRlciA9IG5ldyBMaW5rRWxlbWVudEFkYXB0ZXIoKTsKLQkJCW5ld0FkYXB0ZXIuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCQlyZXR1cm4gbmV3QWRhcHRlcjsKLQkJfQotCi0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQotCQlpZiAoIWlzQXR0cmlidXRlQXZhaWxhYmxlKGVsZW1lbnQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHlsZUF0dHJBZGFwdGVyIG5ld0FkYXB0ZXIgPSBuZXcgU3R5bGVBdHRyQWRhcHRlcigpOwotCQluZXdBZGFwdGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCXJldHVybiBuZXdBZGFwdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlQWRhcHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhZ0F2YWlsYWJsZShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50IGNtZG9jID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbWRvYy5nZXRFbGVtZW50cygpOwotCQkJaWYgKChDTUVsZW1lbnREZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShlbGVtZW50TmFtZSkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVBdmFpbGFibGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCUNNTmFtZWROb2RlTWFwIG1hcCA9IGRlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCWlmICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShhdHRyTmFtZSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBPYmplY3QncyBjbG9uZSgpIG1ldGhvZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9TdHlsZUF0dHJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9TdHlsZUF0dHJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NWRhNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvU3R5bGVBdHRyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlQXR0ckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU01vZGVsQWRhcHRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciwgSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVOb3RpZmljYXRpb24gPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEUgPSAic3R5bGUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCVN0eWxlQXR0ckFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCAmJiBpc01vZGVsTmVjZXNzYXJ5KCkpIHsKLQkJCW1vZGVsID0gY3JlYXRlTW9kZWwoKTsKLQkJCWlmIChtb2RlbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpOwotCQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIENTU1NvdXJjZVBhcnNlcikgewotCQkJCSgoQ1NTU291cmNlUGFyc2VyKXBhcnNlcikuc2V0UGFyc2VyTW9kZShDU1NTb3VyY2VQYXJzZXIuTU9ERV9ERUNMQVJBVElPTik7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCXNldE1vZGVsKG1vZGVsKTsgLy8gbmVlZCB0byBzZXQgYmVmb3JlIHZhbHVlQ2hhbmdlZCgpCi0JCQl2YWx1ZUNoYW5nZWQoKTsKLQkJfQotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiAhaXNNb2RlbE5lY2Vzc2FyeSgpKSB7Ci0JCQltb2RlbCA9IG51bGw7Ci0JCQl2YWx1ZUNoYW5nZWQoKTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ1NTU3R5bGVEZWNsYXJhdGlvbikgbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsU291cmNlKCkgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlzZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxTb3VyY2UoKSA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCXNldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmICh0aGlzLmlnbm9yZU5vdGlmaWNhdGlvbikKLQkJCXJldHVybjsKLQotCQlpZiAoZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuQ0hBTkdFKQotCQkJcmV0dXJuOwotCQlBdHRyIGF0dHIgPSAoQXR0cikgY2hhbmdlZEZlYXR1cmU7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBuYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1RZTEUpKSB7Ci0JCQl2YWx1ZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxTb3VyY2UoKSA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCXNldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxTb3VyY2UoKSA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCXNldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlKCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAoZmxhdE5vZGVzICE9IG51bGwpIHsKLQkJCWludCBjb3VudCA9IGZsYXROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZmxhdE5vZGVzLml0ZW0oaSk7Ci0JCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQkJdmFsdWUgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuaWdub3JlTm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoU1RZTEUpOwotCQl9Ci0JCWVsc2UgewotCQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFNUWUxFKTsKLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkoKFhNTE5vZGUpIGF0dHIpLnNldFZhbHVlU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShTVFlMRSk7Ci0JCQkJKChYTUxOb2RlKSBhdHRyKS5zZXRWYWx1ZVNvdXJjZSh2YWx1ZSk7Ci0JCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJfQotCQl9Ci0JCXRoaXMuaWdub3JlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0KLQkJbm90aWZ5U3R5bGVDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWx1ZUNoYW5nZWQoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc01vZGVsTmVjZXNzYXJ5KCkpIHsgLy8gcmVtb3ZlZAotCQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJCW5vdGlmeVN0eWxlQ2hhbmdlZChlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGRlZmVyCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUob3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCXZhbHVlID0gKChYTUxOb2RlKSBhdHRyKS5nZXRWYWx1ZVNvdXJjZSgpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0VGV4dCh0aGlzLCB2YWx1ZSk7Ci0KLQkJbm90aWZ5U3R5bGVDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc01vZGVsTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZU5vZGUob3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKSAhPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9TdHlsZUVsZW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9TdHlsZUVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzBlZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2h0bWxjc3MvU3R5bGVFbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5hZGFwdGVycy5JTW9kZWxQcm92aWRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuYWRhcHRlcnMuSVN0eWxlU2hlZXRMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVFbGVtZW50QWRhcHRlciBleHRlbmRzIEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIHJlcGxhY2VNb2RlbCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlnbm9yZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0eWxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUHJlcGFyYXRpb24gb2YgYXBwbHlpbmcgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZ2V0IG9sZCBjb250ZW50IGxlbmd0aAotCQlOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm47Ci0JCVhNTE5vZGUgY29udGVudCA9IChYTUxOb2RlKSBjaGlsZDsKLQkJaW50IG9sZExlbmd0aCA9IGNvbnRlbnQuZ2V0RW5kT2Zmc2V0KCkgLSBjb250ZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJLy8gZ2V0IG5ldyBjb250ZW50IGxlbmd0aAotCQlpbnQgbmV3TGVuZ3RoID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgY291bnQgPSBmbGF0Tm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gZmxhdE5vZGVzLml0ZW0oY291bnQgLSAxKTsKLQkJCQlpZiAobGFzdCAhPSBudWxsKQotCQkJCQluZXdMZW5ndGggPSBsYXN0LmdldEVuZCgpOwotCQkJfQotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWludCBlbmQgPSBmbGF0Tm9kZS5nZXRFbmQoKTsKLQkJaW50IGRpZmYgPSBvbGRMZW5ndGggLSBuZXdMZW5ndGg7Ci0JCWludCBsZW5ndGggPSBlbmQgLSBvZmZzZXQgKyBkaWZmOwotCQlTdHJpbmcgZGF0YSA9IGZsYXROb2RlLmdldFRleHQoKTsKLQotCQlyZXBsYWNlRGF0YShvZmZzZXQsIGxlbmd0aCwgZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQXBwbHkgY2hhbmdlcyBmcm9tIEhUTUwgbW9kZWwgdG8gQ1NTIHN1Yi1tb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBjb250ZW50Q2hhbmdlZCgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQlOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7Ci0JCQlkYXRhID0gY2hpbGQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCX0KLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJLy8gbWluaW1pemUgcmVwbGFjZSByYW5nZQotCQlpbnQgc3RhcnQgPSAwLCBlbmQgPSAwOwotCQlTdHJpbmcgb2xkRGF0YSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQoKTsKLQkJaWYgKG9sZERhdGEgPT0gbnVsbCkKLQkJCW9sZERhdGEgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJLy8gc2VhcmNoIGRpZmZlcmVuY3QgY2hhcmFjdGVyIHBvc2l0aW9uIGZyb20gZmlyc3QKLQkJZm9yICg7IHN0YXJ0IDwgb2xkRGF0YS5sZW5ndGgoKSAmJiBzdGFydCA8IGRhdGEubGVuZ3RoKCk7IHN0YXJ0KyspCi0JCQlpZiAob2xkRGF0YS5jaGFyQXQoc3RhcnQpICE9IGRhdGEuY2hhckF0KHN0YXJ0KSkKLQkJCQlicmVhazsKLQotCQlpZiAoc3RhcnQgPT0gb2xkRGF0YS5sZW5ndGgoKSAmJiBzdGFydCA9PSBkYXRhLmxlbmd0aCgpKQotCQkJcmV0dXJuOyAvLyBubyBjaGFuZ2UKLQkJZWxzZSBpZiAoc3RhcnQgPT0gb2xkRGF0YS5sZW5ndGgoKSkgewotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KGdldFJlcXVlc3RlckgyQygpLCBzdGFydCwgMCwgZGF0YS5zdWJzdHJpbmcoc3RhcnQpKTsgLy8gYXBwZW5kIHRleHQgdG8gbGFzdAotCQl9Ci0JCWVsc2UgaWYgKHN0YXJ0ID09IGRhdGEubGVuZ3RoKCkpIHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChnZXRSZXF1ZXN0ZXJIMkMoKSwgc3RhcnQsIG9sZERhdGEubGVuZ3RoKCkgLSBzdGFydCwgIiIpOyAvLyByZW1vdmUgdGV4dCBvZiBsYXN0IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBkaWZmZXJlbmN0IGNoYXJhY3RlciBwb3NpdGlvbiBmcm9tIGxhc3QKLQkJCWZvciAoOyBzdGFydCA8IG9sZERhdGEubGVuZ3RoKCkgLSBlbmQgJiYgc3RhcnQgPCBkYXRhLmxlbmd0aCgpIC0gZW5kOyBlbmQrKykgewotCQkJCWlmIChvbGREYXRhLmNoYXJBdChvbGREYXRhLmxlbmd0aCgpIC0gZW5kIC0gMSkgIT0gZGF0YS5jaGFyQXQoZGF0YS5sZW5ndGgoKSAtIGVuZCAtIDEpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChnZXRSZXF1ZXN0ZXJIMkMoKSwgc3RhcnQsIG9sZERhdGEubGVuZ3RoKCkgLSBlbmQgLSBzdGFydCwgZGF0YS5zdWJzdHJpbmcoc3RhcnQsIGRhdGEubGVuZ3RoKCkgLSBlbmQpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAodGhpcy5yZXBsYWNlTW9kZWwpIHsKLQkJCUlDU1NNb2RlbCBvbGRNb2RlbCA9IG1vZGVsOwotCQkJbW9kZWwgPSBjcmVhdGVNb2RlbCgpOwotCi0JCQlzZXRNb2RlbChtb2RlbCk7IC8vIG5lZWQgdG8gc2V0IGJlZm9yZSBjb250ZW50Q2hhbmdlZCgpCi0JCQljb250ZW50Q2hhbmdlZCgpOwotCi0JCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlci5tb2RlbFJlbW92ZWQob2xkTW9kZWwpOwotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5yZXBsYWNlTW9kZWwgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEF0dHJpYnV0ZSgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUubGVuZ3RoKCkgPiAwICYmIXR5cGUuZXF1YWxzSWdub3JlQ2FzZSgidGV4dC9jc3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJaWYgKCFpc1ZhbGlkQXR0cmlidXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSUNTU01vZGVsIG1vZGVsID0gc3VwZXIuY3JlYXRlTW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JLy8gIHB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JLy8gIAlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JLy8gIAlpZiAobW9kZWwgPT0gbnVsbCkgewotCS8vICAJCW1vZGVsID0gY3JlYXRlTW9kZWwoKTsKLQkvLyAgCQlpZiAobW9kZWwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JLy8gIAkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkvLyAgCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHJldHVybiBudWxsOwotCS8vICAJCXN0cnVjdHVyZWREb2N1bWVudC5hZGRNb2RlbENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkvLyAgCQlzZXRNb2RlbChtb2RlbCk7IC8vIG5lZWQgdG8gc2V0IGJlZm9yZSBjb250ZW50Q2hhbmdlZCgpCi0JLy8gIAkJY29udGVudENoYW5nZWQoKTsKLQkvLyAgCX0KLQkvLyAgCXJldHVybiBtb2RlbDsKLQkvLyAgfQotCS8qKgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFJlcXVlc3RlckgyQygpIHsKLQkJcmV0dXJuIChnZXRFbGVtZW50KCkgIT0gbnVsbCAmJiAoKFhNTE5vZGUpIGdldEVsZW1lbnQoKSkuZ2V0TW9kZWwoKSAhPSBudWxsKSA/IChPYmplY3QpICgoWE1MTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpIDogdGhpczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSZXF1ZXN0ZXJDMkgoKSB7Ci0JCXJldHVybiAoZ2V0TW9kZWwoKSAhPSBudWxsKSA/IChPYmplY3QpIGdldE1vZGVsKCkgOiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsU291cmNlKCkgPT0gZ2V0UmVxdWVzdGVySDJDKCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxTb3VyY2UoKSA9PSBnZXRSZXF1ZXN0ZXJIMkMoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBJTm9kZUFkYXB0ZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIDxTVFlMRT4gZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAodGhpcy5pZ25vcmVOb3RpZmljYXRpb24pCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEKSB7Ci0JCQljb250ZW50Q2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIGNoYW5nZWRGZWF0dXJlOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnJlcGxhY2VNb2RlbCA9IHRydWU7Ci0KLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlIVE1MRG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoSFRNTERvY3VtZW50QWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuY2hpbGRSZXBsYWNlZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFNvdXJjZSgpID09IGdldFJlcXVlc3RlckgyQygpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFNvdXJjZSgpID09IGdldFJlcXVlc3RlckgyQygpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQXBwbHkgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgZGF0YSkgewotCQlYTUxOb2RlIGVsZW1lbnQgPSAoWE1MTm9kZSkgZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbCBvd25lck1vZGVsID0gZWxlbWVudC5nZXRNb2RlbCgpOwotCQlpZiAob3duZXJNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG93bmVyTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGNvbnRlbnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5pZ25vcmVOb3RpZmljYXRpb24gPSB0cnVlOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZ2V0UmVxdWVzdGVyQzJIKCksIGNvbnRlbnRPZmZzZXQgKyBvZmZzZXQsIGxlbmd0aCwgZGF0YSk7Ci0JCXRoaXMuaWdub3JlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUHJlcGFyYXRpb24gb2YgYXBwbHlpbmcgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJaW50IGNvdW50ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApOwotCQkJCWlmIChmaXJzdCAhPSBudWxsKQotCQkJCQlvZmZzZXQgPSBmaXJzdC5nZXRTdGFydCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbShjb3VudCAtIDEpOwotCQkJCWlmIChsYXN0ICE9IG51bGwpCi0JCQkJCWxlbmd0aCA9IGxhc3QuZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlpbnQgY291bnQgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpOwotCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oaSk7Ci0JCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKGkgPT0gMCkKLQkJCQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJfQotCQkJCWRhdGEgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJlcGxhY2VEYXRhKG9mZnNldCwgbGVuZ3RoLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJSUNTU01vZGVsIG9sZE1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gb2xkTW9kZWwpCi0JCQlyZXR1cm47Ci0JCXN1cGVyLnNldE1vZGVsKG1vZGVsKTsKLQkJaWYgKG9sZE1vZGVsICE9IG51bGwpCi0JCQlvbGRNb2RlbC5yZW1vdmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCW1vZGVsLmFkZFN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL1N0eWxlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL1N0eWxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkNzgzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9TdHlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbGNzczsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0eWxlTGlzdGVuZXIgewotCi0JLyoqCi0JICovCi0Jdm9pZCBzdHlsZUNoYW5nZWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9VUkxIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL1VSTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjJkZDBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL1VSTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3M7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSB1c2UgY29tLmlibS5zc2UubW9kZWwuY3NzLnV0aWwuVVJMSGVscGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxIZWxwZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5VUkxIZWxwZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VVcmwKLQkgKi8KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsKSB7Ci0JCXN1cGVyKGJhc2VVcmwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlVXJsCi0JICogQHBhcmFtIGRvY1Jvb3QKLQkgKi8KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsLCBTdHJpbmcgZG9jUm9vdCkgewotCQlzdXBlcihiYXNlVXJsLCBkb2NSb290KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL1VSTE1vZGVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9odG1sY3NzL1VSTE1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5MDZkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaHRtbGNzcy9VUkxNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlBhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuUHJvamVjdFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8vIFRPRE8gd2hlbiB0aGlzIGNsYXNzIGlzIHJlbW92ZWQgZnJvbSAuY29yZSwgUGF0aEhlbHBlciBhbmQgVVJMSGVscGVyIGNsYXNzCi0vLyBhbHNvIGNhbiBiZSByZW1vdmVkLgotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFVSTE1vZGVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9NT0RFTF9GT1JfUkVBRCA9IDE7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9ORVdfTU9ERUxfRk9SX1JFQUQgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTU9ERUxfRk9SX0VESVQgPSAzOwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTkVXX01PREVMX0ZPUl9FRElUID0gNDsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9CVUZGRVJfU0laRSA9IDQwOTY7Ci0JLy8gSU1vZGVsTWFuYWdlcgotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFVSTE1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gb2J0YWluIG1vZGVsIG1hbmFnZXIKLQkJbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgSUQgZnJvbSBhIGZpbGVuYW1lLiBUaGlzIG11c3QgYmUgc2FtZSBhcwotCSAqIEZpbGVNb2RlbFByb3ZpZGVyLmNhbGN1bGF0ZUlkKElGaWxlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjYWxjdWxhdGVJZChJUGF0aCBmdWxsSVBhdGgpIHsKLQkJcmV0dXJuIGZ1bGxJUGF0aC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDb21tb25Nb2RlbEZvcihmaW5hbCBJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgZmluYWwgU3RyaW5nIHJlZiwgZmluYWwgaW50IHdoaWNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBmaXJzdCwgY3JlYXRlIGFic29sdXRlIHVybAotCQlTdHJpbmcgYWJzVVJMID0gcmVzb2x2ZVVSSShiYXNlTW9kZWwsIHJlZiwgdHJ1ZSk7Ci0JCWlmICgoYWJzVVJMID09IG51bGwpIHx8IChhYnNVUkwubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbmVlZCB0byByZW1vdmUgZmlsZTovLyBzY2hlbWUgaWYgbmVjZXNzYXJ5Ci0JCS8vIHNlZSBjb20uaWJtLnNlZC51dGlsLlByb2plY3RSZXNvbHZlci5nZXRMb2NhdGlvbkJ5VVJJKCkKLQkJdHJ5IHsKLQkJCWZpbmFsIGphdmEubmV0LlVSTCBhVVJMID0gbmV3IGphdmEubmV0LlVSTChhYnNVUkwpOwotCQkJLy8gQW4gYWN0dWFsIFVSTCB3YXMgZ2l2ZW4sIG9ubHkgZmlsZTovLy8gaXMgc3VwcG9ydGVkCi0JCQkvLyByZXNvbHZlIGl0IGJ5IGZpbmRpbmcgdGhlIGZpbGUgaXQgcG9pbnRzIHRvCi0JCQlpZiAoIWFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoInBsYXRmb3JtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikgJiYgKGFVUkwuZ2V0SG9zdCgpLmVxdWFscygibG9jYWxob3N0IikgfHwgYVVSTC5nZXRIb3N0KCkubGVuZ3RoKCkgPT0gMCkpIHsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQlhYnNVUkwgPSBhVVJMLmdldEZpbGUoKTsKLQkJCQkJZmluYWwgSVBhdGggaXBhdGggPSBuZXcgUGF0aChhYnNVUkwpOwotCQkJCQkvLyAgaWYgcGF0aCBoYXMgYSBkZXZpY2UsIGFuZCBpZiBpdCBiZWdpbnMgd2l0aAotCQkJCQkvLyBJUGF0aC5TRVBBUkFUT1IsIHJlbW92ZSBpdAotCQkJCQlmaW5hbCBTdHJpbmcgZGV2aWNlID0gaXBhdGguZ2V0RGV2aWNlKCk7Ci0JCQkJCWlmICgoZGV2aWNlICE9IG51bGwpICYmIChkZXZpY2UubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJaWYgKGRldmljZS5jaGFyQXQoMCkgPT0gSVBhdGguU0VQQVJBVE9SKSB7Ci0JCQkJCQkJZmluYWwgU3RyaW5nIG5ld0RldmljZSA9IGRldmljZS5zdWJzdHJpbmcoMSk7Ci0JCQkJCQkJYWJzVVJMID0gaXBhdGguc2V0RGV2aWNlKG5ld0RldmljZSkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gbWZ1RXhjKSB7Ci0JCX0KLQotCi0JCS8vIG5leHQsIGRlY2lkZSBwcm9qZWN0Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlmaW5hbCBJUGF0aCBmdWxsSVBhdGggPSBuZXcgUGF0aChhYnNVUkwpOwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IHdvcmtzcGFjZS5nZXRDb250YWluZXJGb3JMb2NhdGlvbihmdWxsSVBhdGgpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCS8vIGZ1bGxJUGF0aCBkb2Vzbid0IGV4aXN0IGluIHdvcmtzcGFjZQotCQkJcHJvamVjdCA9IGNvbnRhaW5lci5nZXRQcm9qZWN0KCk7Ci0JCX0KLQotCQkvLyBJZiBIVE1MIGRvY3VtZW50IGhhcyBhIGxpbmsgdG8gYW4gZXh0ZXJuIENTUyB3aGljaCBpcyBub3QgaW4KLQkJLy8gSVByb2plY3QKLQkJLy8gd29ya3NwYWNlLmdldENvbnRhaW5lckZvckxvYXRpb24oKSBtYXkgcmV0dXJuIG51bGwuIFdlIG5lZWQgdG8gdGFrZQotCQkvLyBjYXJlCi0JCS8vIG9mIHRoaXMgY2FzZQotCi0JCS8vIG5vdywgZ2V0IGFic1VSTCdzIElGaWxlCi0JCWlmICgocHJvamVjdCAhPSBudWxsKSAmJiAocHJvamVjdC5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YoZnVsbElQYXRoKSA9PSBmYWxzZSkpIHsKLQkJCS8vIGl0J3MgYXQgb3V0c2lkZSBvZiBQcm9qZWN0Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IGZ1bGxJUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHByb2plY3QuZ2V0TG9jYXRpb24oKS5zZWdtZW50Q291bnQoKSk7Ci0JCQlJRmlsZSBmaWxlID0gKGZpbGVQYXRoICE9IG51bGwgJiYgIWZpbGVQYXRoLmlzRW1wdHkoKSkgPyBwcm9qZWN0LmdldEZpbGUoZmlsZVBhdGgpIDogbnVsbDsKLQkJCWlmIChmaWxlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gb2J0YWluIG1vZGVsCi0JCQlpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9FRElUKSB7Ci0JCQkJbW9kZWwgPSBnZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX1JFQUQpIHsKLQkJCQltb2RlbCA9IGdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCX0KLQotCQkJLy8gc2V0dGluZyBzeW5jaHJvbml6YXRpb24gc3RhbXAgaXMgSU1vZGVsTWFuYWdlcidzIGNsaWVudCdzCi0JCQkvLyByZXNwb25zaWJpbGl0eQotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKSA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkKLQkJCQltb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKGZpbGUpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJCS8vIG9idGFpbiByZXNvbHZlcgotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAocHJvamVjdCAhPSBudWxsKSA/IChVUklSZXNvbHZlcikgcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKSA6IG51bGw7Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCS8vIFByb2plY3RSZXNvbHZlciBjYW4gdGFrZSBjYXJlIG9mIHRoZSBjYXNlIGlmIHByb2plY3QgaXMKLQkJCQkvLyBudWxsLgotCQkJCXJlc29sdmVyID0gbmV3IFByb2plY3RSZXNvbHZlcihwcm9qZWN0KTsKLQkJCX0KLQkJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIHRoZXJlIGlzIG5vIHByb2plY3QuIHdlIGNhbid0IGV4cGVjdCBJUHJvamVjdCBoZWxwIHRvIGNyZWF0ZQotCQkJLy8gaWQvaW5wdXRTdHJlYW0KLQkJCWphdmEuaW8uRmlsZSBmaWxlID0gZnVsbElQYXRoLnRvRmlsZSgpOwotCi0JCQkvLyBvYmF0aW4gaWQKLQkJCWlkID0gY2FsY3VsYXRlSWQoZnVsbElQYXRoKTsKLQotCQkJLy8gb2J0YWluIElucHV0U3RyZWFtCi0JCQl0cnkgewotCQkJCWluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotCQkJCS8vIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciB3ZSBkb24ndCBoYXZlIHJlYWQgcGVybWlzc2lvbgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBvYnRhaW4gbW9kZWwKLQkJCXRyeSB7Ci0JCQkJaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfRURJVCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChpZCwgaW5TdHJlYW0sIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9SRUFEKSB7Ci0JCQkJCW1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpblN0cmVhbSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlKSB7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBjbG9zZSBub3cgIQotCQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQotCQkvLyBzZXQgbG9jYXRpb25pZAotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSA9PSBudWxsKSB7Ci0JCQltb2RlbC5zZXRCYXNlTG9jYXRpb24oZnVsbElQYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbW1vbk1vZGVsRm9yKGJhc2VNb2RlbCwgcmVmLCBHRVRfTU9ERUxfRk9SX0VESVQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCQkvLyBjcmVhdGUgYSBmYWtlIElucHV0U3RyZWFtCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSwgRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25Nb2RlbEZvcihiYXNlTW9kZWwsIHJlZiwgR0VUX01PREVMX0ZPUl9SRUFEKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJLy8gY3JlYXRlIGEgZmFrZSBJbnB1dFN0cmVhbQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXROZXdNb2RlbEZvckVkaXQoaUZpbGUsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSByaXUpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VBbHJlYWR5RXhpc3RzIHJhZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE5ld01vZGVsRm9yRWRpdChpRmlsZSwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIHJpdSkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUFscmVhZHlFeGlzdHMgcmFlKSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjaGVjayB0aGUgbW9kZWwgaXMgSFRNTCBmYW1pbHkgb3Igbm90Ci0JICovCi0Jc3RhdGljIHByaXZhdGUgYm9vbGVhbiBpc0hUTUxGYW1pbHkoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBYTUxNb2RlbCkgewotCQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSAoKFhNTE1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYWRhcHRlci5oYXNGZWF0dXJlKEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuSFRNTCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqIDxjb2RlPnJlc29sdmVDcm9zc1Byb2plY3RMaW5rczwvY29kZT46IElmIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcwotCSAqIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcHJvcGVybHkgcmVzb2x2ZSB0aGUgVVJJIGlmIGl0IGlzCi0JICogYSB2YWxpZCBVUkkgcG9pbnRpbmcgdG8gYW5vdGhlciAoYXBwcm9wcmlhdGUpIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVSSShJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZiwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGZvciBIVE1MLCAnaHJlZicgYXR0cmlidXRlIHZhbHVlIG9mIEJBU0UgZWxlbWVudAotCQkvLyBzaG91bGQgYmUgdXNlZCwgaWYgZXhpc3RzIGFueQotCQlTdHJpbmcgYmFzZUhyZWYgPSBudWxsOwotCQkvLyBkbXdfVE9ETyBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIGhhbmRsZSBhIGNvbnRlbnQgbW9kZWwKLQkJLy8gb2YgSFRNTCBvciBYSFRNTAotCQlpZiAoaXNIVE1MRmFtaWx5KGJhc2VNb2RlbCkpIHsKLQkJCWZpbmFsIFhNTE1vZGVsIHhtbG1vZGVsID0gKFhNTE1vZGVsKSBiYXNlTW9kZWw7Ci0JCQlmaW5hbCBYTUxEb2N1bWVudCBkb2MgPSB4bWxtb2RlbC5nZXREb2N1bWVudCgpOwotCQkJLy8gbG9vayBmb3IgPEJBU0U+IHcvIGhyZWYKLQkJCWZpbmFsIE5vZGVMaXN0IG5sID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJCQVNFIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJCS8vIHBlciBlYWNoIDxCQVNFPgotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlmaW5hbCBOb2RlIGJhc2VOb2RlID0gbmwuaXRlbShpKTsKLQkJCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vIGdldCBhbGwgYXR0cnMKLQkJCQkJCWZpbmFsIE5hbWVkTm9kZU1hcCBhdHRyTm9kZXMgPSBiYXNlTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlpZiAoYXR0ck5vZGVzICE9IG51bGwpIHsKLQkJCQkJCQlmaW5hbCBOb2RlIGF0dHJOb2RlID0gYXR0ck5vZGVzLmdldE5hbWVkSXRlbSgiSFJFRiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoYXR0ck5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBmb3VuZCBocmVmPSIiCi0JCQkJCQkJCWZpbmFsIFN0cmluZyBhdHRyVmFsdWUgPSBhdHRyTm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQliYXNlSHJlZiA9IGF0dHJWYWx1ZS50cmltKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gd2hhdCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgPEJBU0U+IHRhZ3MgPz8KLQkJCQkJaWYgKGJhc2VIcmVmICE9IG51bGwpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0IHJlc29sdmVyIGluIE1vZGVsCi0JCWZpbmFsIFVSSVJlc29sdmVyIHJlc29sdmVyID0gYmFzZU1vZGVsLmdldFJlc29sdmVyKCk7Ci0KLQkJLy8gcmVzb2x2ZSB0byBhYnNvbHV0ZSB1cmwKLQkJZmluYWwgU3RyaW5nIGFic3VybCA9IChyZXNvbHZlciAhPSBudWxsKSA/ICgoYmFzZUhyZWYgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRMb2NhdGlvbkJ5VVJJKHJlZiwgYmFzZUhyZWYsIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgOiByZXNvbHZlci5nZXRMb2NhdGlvbkJ5VVJJKHJlZiwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSkgOiBudWxsOwotCQlpZiAoKHJlc29sdmVyICE9IG51bGwpICYmIChhYnN1cmwgPT0gbnVsbCkgJiYgKHJlZiAhPSBudWxsKSAmJiAocmVmLnRyaW0oKS5sZW5ndGgoKSA+IDApICYmIChyZWYudHJpbSgpLmNoYXJBdCgwKSA9PSAnLycpKSB7Ci0JCQkvLyB0byByZWFjaCBoZXJlIG1lYW5zIDoKLQkJCS8vICAgIHJlZiBpcyBhIERvY3Jvb3QgcmVsYXRpdmUKLQkJCS8vICAgIHJlc29sdmVyIGNhbid0IHJlc29sdmUgcmVmCi0JCQkvLyBzbyB0aGF0IGhyZWYgaXMgYSBicm9rZW4gYW5kIHNob3VsZCBub3QgY3JlYXRlIG1vZGVsCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoKGFic3VybCAhPSBudWxsKSAmJiAoYWJzdXJsLmxlbmd0aCgpID4gMCkpIHsKLQkJCXJldHVybiBhYnN1cmw7Ci0JCX0KLQotCQkvLyBtYXliZSByZWYgaXMgYXQgb3V0c2lkZSBvZiB0aGUgUHJvamVjdAotCQkvLyBvYnRhaW4gZG9jcm9vdDsKLQkJZmluYWwgSUNvbnRhaW5lciBjb250YWluZXIgPSAocmVzb2x2ZXIgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRSb290TG9jYXRpb24oKSA6IG51bGw7Ci0JCVN0cmluZyBkb2Nyb290ID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlkb2Nyb290ID0gY29udGFpbmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoZG9jcm9vdCA9PSBudWxsKSB7Ci0JCQlkb2Nyb290ID0gYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChkb2Nyb290ID09IG51bGwpIHsKLQkJCS8vIHNob3VsZCBub3QgYmUKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gb2J0YWluIGRvY3VtZW50IHVybAotCQlTdHJpbmcgbW9kZWxCYXNlTG9jYXRpb24gPSBiYXNlTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmICgobW9kZWxCYXNlTG9jYXRpb24gPT0gbnVsbCkgfHwgKG1vZGVsQmFzZUxvY2F0aW9uLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBmYWxsYmFjay4uLgotCQkJbW9kZWxCYXNlTG9jYXRpb24gPSBiYXNlTW9kZWwuZ2V0SWQoKTsKLQkJfQotCQlpZiAoKG1vZGVsQmFzZUxvY2F0aW9uID09IG51bGwpIHx8IChtb2RlbEJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gaSBjYW4ndCByZXNvbHZlIHVyaSAhCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHJlc29sdmUgdXJsCi0JCVVSTEhlbHBlciBoZWxwZXIgPSBuZXcgVVJMSGVscGVyKFBhdGhIZWxwZXIuZ2V0Q29udGFpbmluZ0ZvbGRlclBhdGgobW9kZWxCYXNlTG9jYXRpb24pLCBQYXRoSGVscGVyLmdldENvbnRhaW5pbmdGb2xkZXJQYXRoKFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChkb2Nyb290KSkpOwotCQlyZXR1cm4gaGVscGVyLnRvQWJzb2x1dGUocmVmKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkyOTJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnByZWZlcmVuY2VzLkNvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBIVE1MQ29yZVBsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRUZJWCA9ICIlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRE9VQkxFX1BSRUZJWCA9ICIlJSI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEhUTUxDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUTUxDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNpbml0aWFsaXplRGVmYXVsdFBsdWdpblByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBsdWdpblByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkvLyBzZXQgbW9kZWwgcHJlZmVyZW5jZSBkZWZhdWx0cwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSwgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSwgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX1JFUVVJUkVEX0FUVFJTLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSwgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMsIGZhbHNlKTsKLQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJU3RyaW5nIGRlZmF1bHRFbmMgPSBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5VVEZfODsKLQkJU3RyaW5nIHN5c3RlbUVuYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOwkgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3lzdGVtRW5jICE9IG51bGwpIHsKLQkJCWRlZmF1bHRFbmMgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0UHJlZmVycmVkRGVmYXVsdElhbmFOYW1lKHN5c3RlbUVuYywgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVVRGXzgpOwotCQl9Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQsIGRlZmF1bHRFbmMpOwotCQkKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQUJfV0lEVEgsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfVEFCX1dJRFRIKTsKLQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkZPUk1BVFRJTkdfU1VQUE9SVEVELCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRILCA3Mik7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMsIGZhbHNlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5JTkRFTlRfVVNJTkdfVEFCUywgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmYWxzZSk7Ci0KLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5QUkVGRVJSRURfTUFSS1VQX0NBU0VfU1VQUE9SVEVELCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFLCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJCi0JCXByZWZzLnNldERlZmF1bHQoSFRNTEZpbGVzUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfU1VGRklYLCBIVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMuSFRNTF9TVUZGSVgpOwotCQlwcmVmcy5zZXREZWZhdWx0KEhUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5HRU5FUkFURV9ET0NVTUVOVF9UWVBFLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChIVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMuR0VORVJBVEVfR0VORVJBVE9SLCB0cnVlKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBzID0gdmFsdWUudHJpbSgpOwotCQlpZiAoIXMuc3RhcnRzV2l0aChLRVlfUFJFRklYLCAwKSkKLQkJCXJldHVybiBzOwotCQlpZiAocy5zdGFydHNXaXRoKEtFWV9ET1VCTEVfUFJFRklYLCAwKSkKLQkJCXJldHVybiBzLnN1YnN0cmluZygxKTsKLQotCQlpbnQgaXggPSBzLmluZGV4T2YoJyAnKTsKLQkJU3RyaW5nIGtleSA9IGl4ID09IC0xID8gcyA6IHMuc3Vic3RyaW5nKDAsIGl4KTsKLQotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkuc3Vic3RyaW5nKDEpKSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2OTg5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Ob19lcnJvci5fVUlfPU5vIGVycm9yLgotVW5kZWZpbmVkX2F0dHJpYnV0ZV9uYW1lXyhfRVJST1JfPVVuZGVmaW5lZCBhdHRyaWJ1dGUgbmFtZSAoezB9KS4KLVVuZGVmaW5lZF9hdHRyaWJ1dGVfdmFsdWVfX0VSUk9SXz1VbmRlZmluZWQgYXR0cmlidXRlIHZhbHVlICh7MH0pLgotTXVsdGlwbGVfdmFsdWVzX3NwZWNpZmllZF9fRVJST1JfPU11bHRpcGxlIHZhbHVlcyBzcGVjaWZpZWQgZm9yIGFuIGF0dHJpYnV0ZSAoezB9KS4KLUF0dHJpYnV0ZV9uYW1lXyh7MH0pX3VzZXNfX0VSUk9SXz1BdHRyaWJ1dGUgbmFtZSAoezB9KSB1c2VzIHdyb25nIGNhc2UgY2hhcmFjdGVyLgotSW52YWxpZF9hdHRyaWJ1dGVfbmFtZV8oezBfRVJST1JfPUludmFsaWQgYXR0cmlidXRlIG5hbWUgKHswfSkuCi1JbnZhbGlkX2F0dHJpYnV0ZV8oezB9KS5fRVJST1JfPUludmFsaWQgYXR0cmlidXRlICh7MH0pLgotSW52YWxpZF9sb2NhdGlvbl9vZl90YWdfKHtfRVJST1JfPUludmFsaWQgbG9jYXRpb24gb2YgdGFnICh7MH0pLgotRHVwbGljYXRlX3RhZ18oezB9KS5fRVJST1JfPUR1cGxpY2F0ZSB0YWcgKHswfSkuCi1Ob19zdGFydF90YWdfKDx7MH0+KS5fRVJST1JfPU5vIHN0YXJ0IHRhZyAoPHswfT4pLgotTm9fZW5kX3RhZ18oPC97MH0+KS5fRVJST1JfPU5vIGVuZCB0YWcgKDwvezB9PikuCi1FbmRfdGFnXyg8L3swfT4pX25vdF9uZWVkZV9FUlJPUl89RW5kIHRhZyAoPC97MH0+KSBub3QgbmVlZGVkLgotVW5rbm93bl90YWdfKHswfSkuX0VSUk9SXz1Vbmtub3duIHRhZyAoezB9KS4KLVRhZ19uYW1lXyh7MH0pX3VzZXNfd3JvbmdfX0VSUk9SXz1UYWcgbmFtZSAoezB9KSB1c2VzIHdyb25nIGNhc2UgY2hhcmFjdGVyLgotSW52YWxpZF90YWdfbmFtZV8oezB9KS5fRVJST1JfPUludmFsaWQgdGFnIG5hbWUgKHswfSkuCi1JbnZhbGlkX0pTUF9kaXJlY3RpdmVfKHswfV9FUlJPUl89SW52YWxpZCBKU1AgZGlyZWN0aXZlICh7MH0pLgotSW52YWxpZF90ZXh0X3N0cmluZ18oezB9KS5fRVJST1JfPUludmFsaWQgdGV4dCBzdHJpbmcgKHswfSkuCi1JbnZhbGlkX2NoYXJhY3Rlcl91c2VkX2luX19FUlJPUl89SW52YWxpZCBjaGFyYWN0ZXIgdXNlZCBpbiB0ZXh0IHN0cmluZyAoezB9KS4KLVVua25vd25fZXJyb3IuX0VSUk9SXz1Vbmtub3duIGVycm9yLgotU3RhcnRfdGFnXyg8ezB9Pilfbm90X2Nsb3NfRVJST1JfPVN0YXJ0IHRhZyAoPHswfT4pIG5vdCBjbG9zZWQuCi1FbmRfdGFnXyg8L3swfT4pX25vdF9jbG9zZV9FUlJPUl89RW5kIHRhZyAoPC97MH0+KSBub3QgY2xvc2VkLgotVGFnXyh7MH0pX25vdF9jbG9zZWQuX0VSUk9SXz1UYWcgKHswfSkgbm90IGNsb3NlZC4KLUF0dHJpYnV0ZV92YWx1ZV8oezB9KV91c2VzX0VSUk9SXz1BdHRyaWJ1dGUgdmFsdWUgKHswfSkgdXNlcyB3cm9uZyBjYXNlIGNoYXJhY3Rlci4KLUNvbW1lbnRfbm90X2Nsb3NlZC5fRVJST1JfPUNvbW1lbnQgbm90IGNsb3NlZC4KLURPQ1RZUEVfZGVjbGFyYXRpb25fbm90X2NsX0VSUk9SXz1ET0NUWVBFIGRlY2xhcmF0aW9uIG5vdCBjbG9zZWQuCi1Qcm9jZXNzaW5nX2luc3RydWN0aW9uX25vdF9FUlJPUl89UHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub3QgY2xvc2VkLgotQ0RBVEFfc2VjdGlvbl9ub3RfY2xvc2VkLl9FUlJPUl89Q0RBVEEgc2VjdGlvbiBub3QgY2xvc2VkLgotIyBGcm9tIGhlcmUsIHRoZSBuZXcgbWVzc2FnZXMgYXJlIGFkZGVkIGZvciBWNQotX0VSUk9SX1RhZ18oezB9KV9zaG91bGRfYmVfYW5fZW1wdHktZWxlbWVudF90YWdfMT1UYWcgKHswfSkgc2hvdWxkIGJlIGFuIGVtcHR5LWVsZW1lbnQgdGFnLgotX0VSUk9SX0F0dHJpYnV0ZV92YWx1ZV8oezB9KV9ub3RfY2xvc2VkLl8xPUF0dHJpYnV0ZSB2YWx1ZSAoezB9KSBub3QgY2xvc2VkLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzZkODJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmIGRlc2lyZWQsCi0gKiB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcyBwbHVnaW4uIE90aGVyCi0gKiBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogQHBhcmFtIGxldmVsIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbiBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aCAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RDb250ZW50RGVzY3JpYmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RDb250ZW50RGVzY3JpYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YmE2MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0Q29udGVudERlc2NyaWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb250ZW50RGVzY3JpYmVyIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUfTsKLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uSW5wdXRTdHJlYW0sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uKQotCSAqLwotCXB1YmxpYyBpbnQgZGVzY3JpYmUoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQotCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0KLQkJLy8gYXNzdW1lIGlmIHdlJ3JlIGNhbGxlZCBhdCBhbGwgdGhhdCB3ZSBhcmUgdmFsaWQgKGZldyB0eXBlcyBjb3VsZCBiZQotCQkvLyBkaXNwcm92ZWQsIG1heWJlIFhNTCAtLSBvciwgbWF5YmUgaWYgZXhjZXB0aW9uIG9jY3VycyBhYm92ZT8pCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5SZWFkZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uKQotCSAqLwotCXB1YmxpYyBpbnQgZGVzY3JpYmUoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0KLQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCi0JCS8vIGFzc3VtZSBpZiB3ZSdyZSBjYWxsZWQgYXQgYWxsIHRoYXQgd2UgYXJlIHZhbGlkIChmZXcgdHlwZXMgY291bGQgYmUKLQkJLy8gZGlzcHJvdmVkLCBtYXliZSBYTUwgLS0gb3IsIG1heWJlIGlmIGV4Y2VwdGlvbiBvY2N1cnMgYWJvdmU/KQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZ2V0U3VwcG9ydGVkT3B0aW9ucygpCi0JICovCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCi0JCXJldHVybiBTVVBQT1JURURfT1BUSU9OUzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZTogaWYgd2UncmUgYXNrZWQgZm9yIG9uZSwgd2Ugc2V0IHRoZW0gYWxsLiBJIG5lZWQgdG8gYmUgc3VyZSBpZgotCQkvLyBjYWxsZWQKLQkJLy8gbXVsaXRpcGxlIHRpbWVzIChvbmUgZm9yIGVhY2gsIHNheSkgdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCi0JCS8vIHByb2Nlc3Npbmcgc2FtZQotCQkvLyBjb250ZW50IGFnYWluLgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gZGV0ZWN0b3IuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZgotCQkJLy8gaW52YWxpZAotCQkJLy8gaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkvLyAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LnRoZQotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGdldERldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGF2b2lkIGFkZGluZyBhbnl0aGluZyBpZiBub3QgYWJzb2x1dGx5IG5lZWRlZCwgc2luY2UgYWx3YXlzCi0JCS8vICJjYWNoZWQiIHBlciBzZXNzaW9uCi0JCS8vZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8sCi0JCS8vIGVuY29kaW5nTWVtZW50byk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCS8vIHNpbmNlIGVxdWFsLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCwgYnV0IGlmIG91ciBkZXRlY3RlZCB2ZXJzaW9uIGlzCi0JCS8vIGRpZmZlcmVudCB0aGFuCi0JCS8vIGphdmFDaGFyc2V0LCB0aGVuIHdlIHNob3VsZCBhZGQgaXQuIFRoaXMgd2lsbCBoYXBwZW4sIGZvciBleGFtcGxlLAotCQkvLyBpZiB0aGVyZSdzCi0JCS8vIGRpZmZlcmVuY2VzIGluIGNhc2UsIG9yIGRpZmZlcmVuY2VzIGR1ZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzCi0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8JCQlpZiAoIWRldGVjdGVkQ2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkvLwkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwKLQkJCS8vIGRldGVjdGVkQ2hhcnNldCk7Ci0JCQkvLwkJCX0KLQotCQkJLy8gT25jZSB3ZSBkZXRlY3RlZCBhIGNoYXJzZXQsIHdlIHNob3VsZCBzZXQgdGhlIHByb3BlcnR5IGV2ZW4KLQkJCS8vIHRob3VnaCBpdCdzIHRoZSBzYW1lIGFzIGphdmFDaGFyc2V0Ci0JCQkvLyBiZWNhdXNlIHRoZXJlIGFyZSBjbGllbnRzIHRoYXQgcmVseSBvbiB0aGlzIHByb3BlcnR5IHRvCi0JCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGNoYXJzZXQgaXMgYWN0dWFsbHkgZGV0ZWN0ZWQgaW4gZmlsZSBvciBub3QuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmVudChJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQkvLwkJZWxzZSBpZgotCQkvLyAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8pKQotCQkvLwkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NzcyMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmludGVybmFsLkJ5dGVSZWFkZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQotCXByb3RlY3RlZCBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0KLQlwcm90ZWN0ZWQgUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uYWRkVHJhY2UocmVhc29uKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0byByZXR1cm4gYSBkZWZhdWx0IGVuY29kaW5nIC0tIGFzIHNwZWNpZmllZCBieSBhbiBpbmR1c3RyeQotCSAqIGNvbnRlbnQgdHlwZSBzcGVjIC0tIHdoZW4gbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgZm9yIGV4YW1wbGUsIFhNTAotCSAqIHNwZWNpZmllcyBVVEYtOCwgSlNQIHNwZWNpZmllcyBJU08tODg1OS0xLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuCi0JICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoICJzcGVjIGRlZmF1bHQiLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy9jcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5hZGRUcmFjZShFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzAwYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JIVE1MIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50RGVzY3JpYmVyIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQotCi0JcHJvdGVjdGVkIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTdmM2EwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qKgotICogCi0gKiBUaGlzIGlzIHBvcnRlZCBmcm9tIFBhZ2VEZXNpZ25lcidzIGhwYmNvbS9LYW5qaS5jcHAncwotICogS2Fuamk6Omd1ZXNzX2thbmppX2NvZGUoKSwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nR3Vlc3NlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJID0gMDsgLy8gQVNDSUkKLQkvLyBJU08tMjAyMi1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSV9JTiA9IDg7IC8vIFRoaXMgaXMgYWZ0ZXIgSVNPMjAyMidzIGNoYW5nZQotCS8vIFNoaWZ0LUpJUwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVUNfSEFMRktBTkEgPSA2OyAvLyBUaGlzIGlzIEhhbGYgS2FuYSBpbiBFVUMtSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVVDX0pQID0gMzsgLy8gVGhpcyBpcyBFVUMtSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNPMjAyMl9KUCA9IDQ7IC8vIFRoaXMgaXMgSVNPLTIwMjItSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSklTX0hBTEZLQU5BID0gNzsgLy8gVEhpcyBpcyBIYWxmIEthbmEgaW4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VVQzEgPSAweDQwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVVDMiA9IChieXRlKSAweDgwOwotCS8vIEFTQ0lJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KSU4gPSAweDAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSk9VVCA9IDB4MDI7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FU0MgPSAweDA0OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSklTID0gMHgwODsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX1NGVDEgPSAweDEwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfU0ZUMiA9IDB4MjA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrdHlwZVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDAwICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMTAgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA4LCAweDA4LCAweDA4LCAvKiAhIiMkJSYnICovLyogIiAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qICgpKissLS4vICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogMDEyMzQ1NjcgKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiA4OTo7IDw9Pj8gKi8KLQkweDI5LCAweDI4LCAweDJiLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBAQUJDREVGRyAqLwotCTB4MmEsIDB4MjgsIDB4MmEsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIEhJSktMTU5PICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogUFFSU1RVVlcgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBYWVpbXF1eXyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIGFiY2RlZmcgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBoaWprbG1ubyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIHBxcnN0dXZ3ICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgwMCwgLyogeHl6e3x9fiAqLwotCTB4MjAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIC8qIDgwICovCi0JMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgLyogOTAgKi8KLQkweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDIwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQTAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQjAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQzAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogRDAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgLyogRTAgKi8KLQkoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgLyogRjAgKi8KLQkoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGMwLCAoYnl0ZSkgMHhjMCwgMHgwMCx9OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU084ODU5XzEgPSAxOyAvLyBJU08tMQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSElGVF9KSVMgPSAyOyAvLyBUaGlzIGlzIFNoaWZ0LUpJUwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSklTX0hBTEZLQU5BID0gNTsgLy8gVGhpcyBpcyBIYWxmIEthbmEgaW4KLQotCS8qKgotCSAqIEN1cnJlbnRseSwgb25seSBKYXBhbmVzZSBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IC0xOyAvLyBVbmtub3duCi0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29kZQotCSAqICAgICAgICAgICAgaW50Ci0JICogCi0JICogQ29udmVydCBwcml2YXRlIGludCB0byBJQU5BIEVuY29kaW5nIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0lBTkFFbmNvZGluZ05hbWUoaW50IGNvZGUpIHsKLQkJU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLQotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCWNhc2UgU0hJRlRfSklTIDoKLQkJCWNhc2UgU0pJU19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiU2hpZnRfSklTIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEVVQ19KUCA6Ci0JCQljYXNlIEVVQ19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiRVVDLUpQIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElTTzIwMjJfSlAgOgotCQkJY2FzZSBKSVNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIklTTy0yMDIyLUpQIjsvLyROT04tTkxTLTEkCi0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBlbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZ3Vlc3NlZCBKYXZhIEVuY29kaW5nIG5hbWUgdGFyZ2V0OiBieXRlcyB0byBiZSBpbnNwZWN0ZWQgbGVuZ3RoOgotCSAqIGxlbmd0aCBvZiB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0VuY29kaW5nKGJ5dGVbXSB0YXJnZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IGNvZGUgPSBVTktOT1dOOwotCi0JCS8vIEN1cnJlbnRseSwgb25seSBKYXBhbmVzZSBpcyBzdXBwb3J0ZWQuCi0JCVN0cmluZyBzeXN0ZW1fY3R5cGUgPSBqYXZhLnV0aWwuTG9jYWxlLmdldERlZmF1bHQoKS5nZXRMYW5ndWFnZSgpOwotCQlTdHJpbmcganBfY3R5cGUgPSBqYXZhLnV0aWwuTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCk7Ci0JCWlmIChzeXN0ZW1fY3R5cGUuY29tcGFyZVRvKGpwX2N0eXBlKSA9PSAwKSB7Ci0JCQkvLyBPaywgSSdtIHVuZGVyIGphX0pQLgotCQkJY29kZSA9IEFTQ0lJOwotCQkJaW50IHBvcyA9IDA7Ci0JCQl3aGlsZSAoKGNvZGUgPT0gQVNDSUkpICYmIChsZW5ndGggPiAwKSkgewotCQkJCWludCBjaDEgPSB0YXJnZXRbcG9zXTsKLQkJCQljaDEgPSBjaDEgJiAweDAwMDAwMEZGOwotCQkJCWludCBjaDIgPSAobGVuZ3RoID49IDIpID8gdGFyZ2V0W3BvcyArIDFdIDogMDsKLQkJCQljaDIgPSBjaDIgJiAweDAwMDAwMEZGOwotCQkJCWludCBjaDMgPSAobGVuZ3RoID49IDMpID8gdGFyZ2V0W3BvcyArIDJdIDogMDsKLQkJCQljaDMgPSBjaDMgJiAweDAwMDAwMEZGOwotCQkJCWNvZGUgPSBndWVzc0phcGFuZXNlS2FuamlDb2RlKGNoMSwgY2gyLCBjaDMsIDApOwotCQkJCXBvcysrOwotCQkJCWxlbmd0aC0tOwotCQkJfQotCQkJc3dpdGNoIChjb2RlKSB7Ci0JCQkJY2FzZSBJU08yMDIyX0pQIDoKLQkJCQljYXNlIEpJU19IQUxGS0FOQSA6Ci0JCQkJCWNvZGUgPSBJU08yMDIyX0pQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEVVQ19KUCA6Ci0JCQkJCWNvZGUgPSBFVUNfSlA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb2RlID0gU0hJRlRfSklTOwotCQkJfQotCQl9Ci0JCXJldHVybiAoY29udmVydFRvSUFOQUVuY29kaW5nTmFtZShjb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogR3Vlc3MgdGhlIGVuY29kaW5nLiBoYWxma2FuYV9mbGFnID0gMHgwMSAoIGRldGVjdCBTSklTIGhhbGYga2FuYSApCi0JICogaGFsZmthbmFfZmxhZyA9IDB4MDIgKCBkZXRlY3QgRVVDIGhhbGYga2FuYSApCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGd1ZXNzSmFwYW5lc2VLYW5qaUNvZGUoaW50IGNoMSwgaW50IGNoMiwgaW50IGNoMywgaW50IGhhbGZrYW5hX2ZsYWcpIHsKLQkJYm9vbGVhbiBzamlzX2hhbmtha3VfZmxhZyA9ICgoaGFsZmthbmFfZmxhZyAmIDB4MDEpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotCQlib29sZWFuIGV1Y19oYW5rYWt1X2ZsYWcgPSAoKGhhbGZrYW5hX2ZsYWcgJiAweDAyKSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQotCQlpZiAoY2gxID09IDApCi0JCQlyZXR1cm4gVU5LTk9XTjsKLQkJaWYgKHNqaXNfaGFua2FrdV9mbGFnICYmIGNoMSA+PSAweGExICYmIGNoMSA8PSAweGRmKQotCQkJcmV0dXJuIFNKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGV1Y19oYW5rYWt1X2ZsYWcgJiYgY2gxID09IDB4OGUgJiYgY2gyID49IDB4YTEgJiYgY2gyIDw9IDB4ZGYpCi0JCQlyZXR1cm4gRVVDX0hBTEZLQU5BOwotCQllbHNlIGlmICgoKGt0eXBlW2NoMV0gJiBLVF9TRlQxKSAhPSAwKSAmJiAoKGt0eXBlW2NoMl0gJiBLVF9TRlQyKSAhPSAwKSkKLQkJCXJldHVybiBTSElGVF9KSVM7Ci0JCWVsc2UgaWYgKCgoa3R5cGVbY2gxXSAmIEtUX0VVQzEpICE9IDApICYmICgoa3R5cGVbY2gyXSAmIEtUX0VVQzIpICE9IDApKQotCQkJcmV0dXJuIEVVQ19KUDsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgKChrdHlwZVtjaDJdICYgS1RfSklOKSAhPSAwKSkKLQkJCXJldHVybiBJU08yMDIyX0pQOwotCQllbHNlIGlmIChjaDEgPj0gMHhhMSAmJiBjaDEgPD0gMHhkZikKLQkJCXJldHVybiBTSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiBjaDIgPT0gMHgyOC8qICcoJyAqLyYmIGNoMyA9PSAweDQ5LyogJ0knICovKQotCQkJcmV0dXJuIEpJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgY2gyID09IDB4MjgvKiAnKCcgKi8mJiAoKGt0eXBlW2NoM10gJiBLVF9KT1VUKSAhPSAwKSkKLQkJCXJldHVybiBBU0NJSV9JTjsKLQotCQlyZXR1cm4gQVNDSUk7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nR3Vlc3NlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTc3Njg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxLzI3LzA0IDY6NDEgUE0gKi8KLQotLypubHNYWFgqLyAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMS8yNy8wNCA2OjQxIFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxIZWFkVG9rZW5pemVyIHsKLQotCS8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLQkvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9NRVRBX1RBRyA9IDQ7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERRX1NUUklORyA9IDg7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotCi0JLyoqCi0JICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLQkgKiBZWV9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0JICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotCSAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7MCwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgN307Ci0KLQkvKiogCi0JICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAiXDExXDBcMVw2XDFcN1wyXDBcMVwxMVwyMlwwXDFcMjJcMVwwXDFcNDBcMlwwIiArICJcMVw0NFwxXDBcMVw0M1w1XDBcMVwzNFwxXDBcMVw0MlwxM1wwXDFcNDVcMVwxMiIgKyAiXDFcMTBcMVwzMVwxXDEzXDFcMFwxXDIxXDFcMFwxXDI0XDFcMjZcMVwxN1wxXDAiICsgIlwxXDMwXDFcMzJcMVwyN1wyXDBcMVwxNlwxXDE1XDFcMjNcMVwyNVwxXDMzXDFcMzUiICsgIlwyXDBcMVwyMFwxXDM2XDFcMzdcMVwwXDFcMTRcMVw0MVw3XDBcMVwyMVwxXDAiICsgIlwxXDI0XDFcMjZcMVwxN1wxXDBcMVwzMFwxXDMyXDFcMjdcMlwwXDFcMTZcMVwxNSIgKyAiXDFcMjNcMVwyNVwxXDMzXDFcMzVcMlwwXDFcMjBcMVwzNlwxXDM3XDFcMFwxXDE0IiArICJcMVw0MVwxMDFcMFwxXDRcM1wwXDFcNVwxN1wwXDFcM1wxNlwwXDFcMVwyMFwwIiArICJcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLQkvKiogCi0JICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0KLQkvKiBlcnJvciBjb2RlcyAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLQkvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0geyJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIn07Ci0KLQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCXByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0JLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQlwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotCS8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotCS8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCXByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0JLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0JLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCSBmcm9tIGlucHV0ICovCi0JcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotCi0JLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXByaXZhdGUgaW50IHl5Y2hhcjsKLQotCi0JLyoqIAotCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0JLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotCS8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDEwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0JYm9vbGVhbiBmb3VuZENvbnRlbnRUeXBlVmFsdWUgPSBmYWxzZTsKLQotCi0KLQlwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIGluKSB7Ci0JCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkJeXlfcmVhZGVyID0gaW47Ci0KLQkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0KLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0JCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikgMCk7Ci0KLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJeXlfbWFya2VkUG9zID0gMDsKLQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9zdGFydFJlYWQgPSAwOwotCi0JCS8qKiAKLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCSAqIGZyb20gaW5wdXQgCi0JCSAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQotCi0JCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCi0KLQkJLyoqIAotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLQkJICogb2YgYSBsaW5lCi0JCSAqLwotCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0JCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLQkJaGFzTW9yZSA9IHRydWU7Ci0KLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudAotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsKLQkJfQotCi0KLQl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotCSAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKgotCSAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotCSAqLwotCXB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotCQl0aGlzLnl5X3JlYWRlciA9IGluOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLQkgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKgotCSAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0JICovCi0JcHVibGljIEhUTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCX0KLQotCS8qKiAKLQkgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotCSAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLQkJY2hhcltdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotCQlpbnQgaSA9IDA7IC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0JCWludCBqID0gMDsgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLQkJd2hpbGUgKGkgPCAxNzQpIHsKLQkJCWludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0JCQlkbwotCQkJCW1hcFtqKytdID0gdmFsdWU7Ci0JCQl3aGlsZSAoLS1jb3VudCA+IDApOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLQkgKgotCSAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotCSAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotCSAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLQkgKi8KLQlwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0JCS8qIHN0YW5kYXJkIGNhc2UgKi8KLQkJaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKQotCQkJcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0JCS8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8KLQkJaWYgKHl5X2F0RU9GKQotCQkJcmV0dXJuIFlZRU9GOwotCi0JCS8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0JCS8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0JCWlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9idWZmZXIsIDAsIHl5X2VuZFJlYWQgLSB5eV9zdGFydFJlYWQpOwotCi0JCQkvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotCQkJeXlfZW5kUmVhZCAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9jdXJyZW50UG9zIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X21hcmtlZFBvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9wdXNoYmFja1BvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9zdGFydFJlYWQgPSAwOwotCQl9Ci0KLQkJLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotCQlpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLQkJCWNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLQkJCXl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLQkJfQotCi0JCS8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotCQlpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgeXlfYnVmZmVyLmxlbmd0aCAtIHl5X2VuZFJlYWQpOwotCi0JCWlmIChudW1SZWFkID09IC0xKQotCQkJcmV0dXJuIFlZRU9GOwotCi0JCXl5X2VuZFJlYWQgKz0gbnVtUmVhZDsKLQotCQlyZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0JfQotCi0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl5eV9hdEVPRiA9IHRydWU7IC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0JCXl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7IC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0JCXl5X3JlYWRlci5jbG9zZSgpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotCSAqLwotCWZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLQkJcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0JfQotCi0JLyoqCi0JICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLQkgKgotCSAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotCQl5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCWZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zIC0geXlfc3RhcnRSZWFkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0JICovCi0JZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLQkJcmV0dXJuIHl5X21hcmtlZFBvcyAtIHl5X3N0YXJ0UmVhZDsKLQl9Ci0KLQotCS8qKgotCSAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotCSAqCi0JICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0JCX0KLQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLQkJfQotCi0JCVN5c3RlbS5leGl0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0JICoKLQkgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0JICoKLQkgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLQkgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0JCWlmIChudW1iZXIgPiB5eWxlbmd0aCgpKQotCQkJeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0JCXl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLQkgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLQkJaWYgKCF5eV9lb2ZfZG9uZSkgewotCQkJeXlfZW9mX2RvbmUgPSB0cnVlOwotCQkJaGFzTW9yZSA9IGZhbHNlOwotCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0JICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotCSAqCi0JICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0JICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotCSAqLwotCXB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaW50IHl5X2lucHV0OwotCQlpbnQgeXlfYWN0aW9uOwotCi0KLQkJd2hpbGUgKHRydWUpIHsKLQotCQkJeXljaGFyICs9IHl5bGVuZ3RoKCk7Ci0KLQkJCXl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcyAtIDFdID09ICdcbic7Ci0JCQlpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MgLSAxXSA9PSAnXHInKSB7Ci0JCQkJeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLQkJCQlpZiAoIXl5X2F0RU9GKQotCQkJCQl5eV9jdXJyZW50UG9zLS07Ci0JCQl9Ci0KLQkJCXl5X2FjdGlvbiA9IC0xOwotCi0JCQl5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0JCQlpZiAoeXlfYXRCT0wpCi0JCQkJeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlICsgMV07Ci0JCQllbHNlCi0JCQkJeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0JCQl5eV9mb3JBY3Rpb24gOiB7Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQotCQkJCQl5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotCQkJCQlpZiAoeXlfaW5wdXQgPT0gWVlFT0YpCi0JCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0KLQkJCQkJeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0JCQkJCWJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotCQkJCQlib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLQkJCQkJeXlfZm9yTmV4dCA6IHsKLQkJCQkJCXN3aXRjaCAoeXlfc3RhdGUpIHsKLQkJCQkJCQljYXNlIDAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDEwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDExOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDEzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjYgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDM1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCWNhc2UgMzQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDM2IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDM0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMiA6Ci0JCQkJCQkJCQljYXNlIDM1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzNyA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA0IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDIyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMjcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDI5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzMiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzOCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTIgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1OCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjMgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1OSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjQgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2NSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMzAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2NiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDY3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDY4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDY5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAzMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDcwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDcxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDcxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDcyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDczOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDcyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDgwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDgxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDMzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDgyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI3IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDgzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgODkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDkwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOTAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDkxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOTEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDkyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOTIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDkzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOTMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDkzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA5NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCXl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoeXlfaXNGaW5hbCkgewotCQkJCQkJeXlfYWN0aW9uID0geXlfc3RhdGU7Ci0JCQkJCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQkJCQkJaWYgKHl5X25vTG9va0FoZWFkKQotCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCi0KLQkJCXN3aXRjaCAoeXlfYWN0aW9uKSB7Ci0KLQkJCQljYXNlIDI2IDoKLQkJCQkJewotCQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCQl9Ci0JCQkJY2FzZSA5NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjAgOgotCQkJCWNhc2UgMjEgOgotCQkJCQl7Ci0JCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQkJeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7Ci0JCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCQl9Ci0JCQkJY2FzZSA5NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTcgOgotCQkJCQl7Ci0JCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCQlpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKQotCQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kOwotCQkJCQl9Ci0JCQkJY2FzZSA5OCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzEgOgotCQkJCQl7Ci0JCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7Ci0JCQkJCX0KLQkJCQljYXNlIDk5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MyA6Ci0JCQkJCXsKLQkJCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQkJCWlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpCi0JCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7Ci0JCQkJCX0KLQkJCQljYXNlIDEwMCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDUgOgotCQkJCQl7Ci0JCQkJCQl5eXB1c2hiYWNrKDIpOwotCQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJCX0KLQkJCQljYXNlIDEwMSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDYgOgotCQkJCQl7Ci0JCQkJCQl5eXB1c2hiYWNrKDIpOwotCQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJCX0KLQkJCQljYXNlIDEwMiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjEgOgotCQkJCQl7Ci0JCQkJCQlpZiAoeXljaGFyID09IDApIHsKLQkJCQkJCQl5eWJlZ2luKFNUX1hNTERlY2wpOwotCQkJCQkJCXJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCWNhc2UgMTAzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA4IDoKLQkJCQljYXNlIDkgOgotCQkJCWNhc2UgMTAgOgotCQkJCWNhc2UgMTEgOgotCQkJCWNhc2UgMTIgOgotCQkJCWNhc2UgMTMgOgotCQkJCWNhc2UgMTQgOgotCQkJCWNhc2UgMTUgOgotCQkJCWNhc2UgMTYgOgotCQkJCWNhc2UgMTggOgotCQkJCWNhc2UgMTkgOgotCQkJCWNhc2UgMjIgOgotCQkJCQl7Ci0JCQkJCQlpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHsKLQkJCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJY2FzZSAxMDQgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDYwIDoKLQkJCQkJewotCQkJCQkJeXliZWdpbihTVF9NRVRBX1RBRyk7Ci0JCQkJCQlyZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ1N0YXJ0OwotCQkJCQl9Ci0JCQkJY2FzZSAxMDUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQwIDoKLQkJCQkJewotCQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCQkJcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsKLQkJCQkJfQotCQkJCWNhc2UgMTA2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA5NCA6Ci0JCQkJCXsKLQkJCQkJCXB1c2hDdXJyZW50U3RhdGUoKTsKLQkJCQkJCXl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOwotCQkJCQkJZm91bmRDb250ZW50VHlwZVZhbHVlID0gdHJ1ZTsKLQkJCQkJCXJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGU7Ci0JCQkJCX0KLQkJCQljYXNlIDEwNyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjggOgotCQkJCQl7Ci0JCQkJCQlwdXNoQ3VycmVudFN0YXRlKCk7Ci0JCQkJCQl5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsKLQkJCQkJCXJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOwotCQkJCQl9Ci0JCQkJY2FzZSAxMDggOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMzIDoKLQkJCQkJewotCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7Ci0JCQkJCX0KLQkJCQljYXNlIDEwOSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzQgOgotCQkJCQl7Ci0JCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsKLQkJCQkJfQotCQkJCWNhc2UgMTEwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0NyA6Ci0JCQkJCXsKLQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007Ci0JCQkJCX0KLQkJCQljYXNlIDExMSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjggOgotCQkJCQl7Ci0JCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7Ci0JCQkJCX0KLQkJCQljYXNlIDExMiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjUgOgotCQkJCWNhc2UgMjcgOgotCQkJCWNhc2UgMjkgOgotCQkJCWNhc2UgMzIgOgotCQkJCQl7Ci0JCQkJCQlzdHJpbmcuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJfQotCQkJCWNhc2UgMTEzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNCA6Ci0JCQkJCXsKLQkJCQkJCXl5YmVnaW4oU1FfU1RSSU5HKTsKLQkJCQkJCXN0cmluZy5zZXRMZW5ndGgoMCk7Ci0JCQkJCX0KLQkJCQljYXNlIDExNCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjMgOgotCQkJCQl7Ci0JCQkJCQl5eWJlZ2luKERRX1NUUklORyk7Ci0JCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCQl9Ci0JCQkJY2FzZSAxMTUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMwIDoKLQkJCQkJewotCQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCQl9Ci0JCQkJY2FzZSAxMTYgOgotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0JCQkJCQl5eV9hdEVPRiA9IHRydWU7Ci0JCQkJCQl5eV9kb19lb2YoKTsKLQkJCQkJCXsKLQkJCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHNjYW5uZXIgb24gaW5wdXQgZmlsZXMuCi0JICoKLQkgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0JICogSXQgcHJpbnRzIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mCi0JICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotCSAqCi0JICogQHBhcmFtIGFyZ3YgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1bgotCSAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLQkJCUhUTUxIZWFkVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzY2FubmVyID0gbmV3IEhUTUxIZWFkVG9rZW5pemVyKG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiICsgYXJndltpXSArICJcIiIpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgSFRNTEhlYWRUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlkbyB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0JCQkJfQotCQkJCXdoaWxlICghc2Nhbm5lci55eV9hdEVPRik7Ci0KLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCQl9Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhiY2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMgewotCi0JU3RyaW5nIE1ldGFUYWdFbmQgPSAiTWV0YVRhZ0VuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTWV0YVRhZ1N0YXJ0ID0gIk1ldGFUYWdTdGFydCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTWV0YVRhZ0NvbnRlbnRUeXBlID0gIk1ldGFUYWdDb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDgzYWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJpdmF0ZSBIVE1MSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCi0JLyoqCi0JICogVGhlcmUgaXMgbm8gc3BlYyBkZWZpbmVkIGVuY29kaW5nIGZvciBIVE1MIChoaXN0b3JpY2FsbHkpLCBzbyBudWxsIGlzCi0JICogcmV0dXJuZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBIVE1MSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gd29yayBvbiAncmVzZXQnIGluIHRva2VuaXplciwgc28gbmV3IGluc3RhbmNlIGlzbid0Ci0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJLy9pZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCWZUb2tlbml6ZXIgPSBuZXcgSFRNTEhlYWRUb2tlbml6ZXIoKTsKLQkJLy8JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGVnYWxTdHJpbmcoU3RyaW5nIHZhbHVlVG9rZW5UeXBlKSB7Ci0JCWlmICh2YWx1ZVRva2VuVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlCi0JCQlyZXR1cm4gdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2hlY2tJbkNvbnRlbnQoKTsKLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJY2hlY2tIZXVyaXN0aWNzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSGV1cmlzdGljcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gbm9IZXVyaXN0aWMgPSBmYWxzZTsKLQkJU3RyaW5nIGhldXJpc3RpY0VuY29kaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbQ29kZWRJTy5NQVhfTUFSS19TSVpFXTsKLQkJCWludCBuUmVhZCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZSZWFkZXIucmVhZHkoKSkgewotCQkJCQlpbnQgb25lQnl0ZSA9IGZSZWFkZXIucmVhZCgpOwotCQkJCQluUmVhZCsrOwotCQkJCQlpZiAob25lQnl0ZSA8PSAweEZGKSB7Ci0JCQkJCQlieXRlc1tpXSA9IChieXRlKSBvbmVCeXRlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbm9IZXVyaXN0aWMgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbm9IZXVyaXN0aWMpIHsKLQkJCQloZXVyaXN0aWNFbmNvZGluZyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKGJ5dGVzLCBuUmVhZCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGFueSBJTyBleGNlcHRpb24sIHRoZW4gbm90IGEgaGV1cmlzdGljIGNhc2UKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJfQotCQlpZiAoaGV1cmlzdGljRW5jb2RpbmcgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGhldXJpc3RpY0VuY29kaW5nLCBFbmNvZGluZ01lbWVudG8uR1VFU1NFRF9FTkNPRElOR19GUk9NX1NUUkVBTSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0luQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUhUTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVWYWx1ZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZQotCQkJCS8vIG1lbWVudG8KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGUpIHsKLQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChpc0xlZ2FsU3RyaW5nKHZhbHVlVG9rZW5UeXBlKSkgewotCQkJCQkJY29udGVudFR5cGVWYWx1ZSA9IHZhbHVlVG9rZW4uZ2V0VGV4dCgpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JCWlmIChjb250ZW50VHlwZVZhbHVlICE9IG51bGwpIHsKLQkJCXBhcnNlQ29udGVudFR5cGVWYWx1ZShjb250ZW50VHlwZVZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUNvbnRlbnRUeXBlVmFsdWUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVN0cmluZyBjaGFyc2V0ID0gbnVsbDsKLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCI7XFxzKmNoYXJzZXRcXHMqPVxccyoiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBwYXJ0cyA9IHBhdHRlcm4uc3BsaXQoY29udGVudFR5cGUpOwotCQlpZiAocGFydHMubGVuZ3RoID4gMCkgewotCQkJLy8gaWYgb25seSBvbmUgaXRlbSwgaXQgY2FuIHN0aWxsIGJlIGNoYXJzZXQgaW5zdGVhZCBvZgotCQkJLy8gY29udGVudFR5cGUKLQkJCWlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewotCQkJCWlmIChwYXJ0c1swXS5sZW5ndGgoKSA+IDYpIHsKLQkJCQkJU3RyaW5nIGNoZWNrRm9yQ2hhcnNldCA9IHBhcnRzWzBdLnN1YnN0cmluZygwLCA3KTsKLQkJCQkJaWYgKGNoZWNrRm9yQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJjaGFyc2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaW50IGVxcG9zID0gcGFydHNbMF0uaW5kZXhPZignPScpOwotCQkJCQkJZXFwb3MgPSBlcXBvcyArIDE7Ci0JCQkJCQlpZiAoZXFwb3MgPCBwYXJ0c1swXS5sZW5ndGgoKSkgewotCQkJCQkJCWNoYXJzZXQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoZXFwb3MpOwotCQkJCQkJCWNoYXJzZXQgPSBjaGFyc2V0LnRyaW0oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vZkNvbnRlbnRUeXBlID0gcGFydHNbMF07Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKLQkJCWNoYXJzZXQgPSBwYXJ0c1sxXTsKLQkJfQotCQkKLQkJaWYgKGNoYXJzZXQgIT0gbnVsbCAmJiBjaGFyc2V0Lmxlbmd0aCgpID4gMCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGNoYXJzZXQsIEVuY29kaW5nTWVtZW50by5GT1VORF9FTkNPRElOR19JTl9DT05URU5UKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZkMDQwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwNjc0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBsaXN0Lmxlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWUyZTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFuIEVuY29kaW5nTWVtZW50byAoaXRzIHN1cGVyIGNsYXNzKSwKLSAqIHdoZW4gdGhlcmUgaXMgbm90IGluIGZhY3QgQU5ZIGVuY29kaW5nIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgd2hlbiBhCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY3JlYXRlZCBkaXJlY3RseSBmcm9tIGEgU3RyaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJc3VwZXIoKTsKLQkJU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQlzZXREZXRlY3RlZENoYXJzZXROYW1lKG51bGwpOwotCQlhZGRUcmFjZShERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxMDM5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuU3RydWN0dXJlZFR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlNjcmlwdExhbmd1YWdlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLQotLyoqCi0gKiBEb2N1bWVudCBwYXJ0aXRpb25lciBmb3IgSFRNTC4gQ2xpZW50LXNpZGUgc2NyaXB0cyBvZiB0eXBlIEphdmFTY3JpcHQgYXJlCi0gKiByZXBvcnRlZCBhcyBTVF9TQ1JJUFQsIGFsbCBvdGhlcnMgZm9yIDxzY3JpcHQgbGFuZ3VhZ2U9ImZvbyIgdHlwZT0iZm9vMiI+Ci0gKiBhcyBTQ1JJUFQubGFuZ3VhZ2U6Rk9PIGFuZCBTQ1JJUFQudHlwZTpGT08yLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MIGltcGxlbWVudHMgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RfREVGQVVMVF9IVE1MID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkRFRkFVTFRfSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVF9IVE1MX0RFQ0xBUkFUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVDTEFSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RfSFRNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVF9TQ1JJUFQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117U1RfREVGQVVMVF9IVE1MLCBTVF9IVE1MX0RFQ0xBUkFUSU9OLCBTVF9IVE1MX0NPTU1FTlQsIFNUX1NDUklQVCwgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUy5TVF9TVFlMRX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBU0NSSVBUID0gImphdmFzY3JpcHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVNDUklQVF9BUFBMSUNBVElPTiA9ICJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKU1BEb2N1bWVudFBhcnRpb25lci4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gU1RfU0NSSVBUKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc3R5cGUgPSBnZXRTY3JpcHRpbmdQYXJ0aXRpb25UeXBlKG5vZGUpOwotCQkJCXJldHVybiBzdXBlci5jcmVhdGVQYXJ0aXRpb24ob2Zmc2V0LCBsZW5ndGgsIHN0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5wYXJ0aXRpb24uU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNjcmVhdGVQYXJ0aXRpb24oaW50LAotCSAqICAgICAgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUGFydGl0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCVN0cmluZyBsb2NhbFR5cGUgPSB0eXBlOwotCQlpZiAodHlwZSA9PSBTVF9TQ1JJUFQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCWxvY2FsVHlwZSA9IGdldFNjcmlwdGluZ1BhcnRpdGlvblR5cGUobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCBsZW5ndGgsIGxvY2FsVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvcmVOb2RlKSB7Ci0JCVN0cmluZyBsYW5ndWFnZSA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9IFNUX1NDUklQVDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gY29yZU5vZGU7Ci0JCUlUZXh0UmVnaW9uIGF0dHJOYW1lUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBpc1ZhbGlkU2NyaXB0aW5nUmVnaW9uVHlwZShub2RlLmdldFR5cGUoKSkpIHsKLQkJCW5vZGUgPSBub2RlLmdldFByZXZpb3VzKCk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucy5zaXplKCkgPiA0ICYmIHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJSVRleHRSZWdpb24gcG90ZW50aWFsTGFuZ3VhZ2VSZWdpb24gPSByZWdpb25zLmdldCgxKTsKLQkJCVN0cmluZyBwb3RlbnRpYWxMYW5ndWFnZVN0cmluZyA9IG5vZGUuZ2V0VGV4dChwb3RlbnRpYWxMYW5ndWFnZVJlZ2lvbik7Ci0JCQlpZiAocG90ZW50aWFsTGFuZ3VhZ2VTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCQlpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJCQlhdHRyTmFtZVJlZ2lvbiA9IHJlZ2lvbjsKLQkJCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBub2RlLmdldFRleHQoYXR0ck5hbWVSZWdpb24pOwotCQkJCQkJaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSkpCi0JCQkJCQkJbGFuZ3VhZ2UgPSBTdHJpbmdVdGlscy5zdHJpcChub2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSkpIHsKLQkJCQkJCQl0eXBlID0gU3RyaW5nVXRpbHMuc3RyaXAobm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJYXR0ck5hbWVSZWdpb24gPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBsb29rdXBTY3JpcHRUeXBlKHR5cGUpOwotCQllbHNlIGlmIChsYW5ndWFnZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gbG9va3VwU2NyaXB0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkU2NyaXB0aW5nUmVnaW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfHwgdHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOIHx8IHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCB8fCB0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGxvb2t1cFNjcmlwdFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZUy5sZW5ndGg7IGkrKykKLQkJCWlmIChTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZU1tpXS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKQotCQkJCXJldHVybiBTVF9TQ1JJUFQ7Ci0JCXJldHVybiBTVF9TQ1JJUFQgKyAiLnR5cGUuIiArIHR5cGUudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbG9va3VwU2NyaXB0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUy5sZW5ndGg7IGkrKykKLQkJCWlmIChTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTW2ldLmVxdWFsc0lnbm9yZUNhc2UobGFuZ3VhZ2UpKQotCQkJCXJldHVybiBTVF9TQ1JJUFQ7Ci0JCXJldHVybiBTVF9TQ1JJUFQgKyAiLmxhbmd1YWdlLiIgKyBsYW5ndWFnZS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLm1vZGVsLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjZ2V0UGFydGl0aW9uVHlwZShjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKQotCQkJcmVzdWx0ID0gU1RfSFRNTF9DT01NRU5UOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKQotCQkJcmVzdWx0ID0gU1RfSFRNTF9ERUNMQVJBVElPTjsKLQkJZWxzZQotCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQucGFydGl0aW9uLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uLAotCSAqICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c05vZGUsIElUZXh0UmVnaW9uIHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlLCBJVGV4dFJlZ2lvbiBuZXh0RW5kVGFnTmFtZVJlZ2lvbikgewotCQlTdHJpbmcgbmFtZTEgPSBwcmV2aW91c05vZGUuZ2V0VGV4dChwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbik7Ci0JCVN0cmluZyBuYW1lMiA9IG5leHROb2RlLmdldFRleHQobmV4dEVuZFRhZ05hbWVSZWdpb24pOwotCQlpZiAobmFtZTEuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUKSAmJiBuYW1lMi5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpKQotCQkJLy8JCQlyZXR1cm4gU1RfU0NSSVBUOwotCQkJcmV0dXJuIGdldFNjcmlwdGluZ1BhcnRpdGlvblR5cGUoc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZpb3VzTm9kZS5nZXRTdGFydE9mZnNldChwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbikpKTsKLQkJZWxzZSBpZiAobmFtZTEuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkKLQkJCXJldHVybiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTLlNUX1NUWUxFOwotCQlyZXR1cm4gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4ocHJldmlvdXNOb2RlLCBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiwgbmV4dE5vZGUsIG5leHRFbmRUYWdOYW1lUmVnaW9uKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShGb3JlaWduUmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgdGFnbmFtZSA9IHJlZ2lvbi5nZXRTdXJyb3VuZGluZ1RhZygpOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gdGFnbmFtZSBzaG91bGQgbm90IGJlIG51bGwsCi0JCS8vIGJ1dCBzZWUgaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MTEKLQkJaWYgKHRhZ25hbWUgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0VW5rbm93bigpOwotCQl9Ci0JCWVsc2UgaWYgKHRhZ25hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUKSkKLQkJCXJlc3VsdCA9IFNUX1NDUklQVDsKLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpCi0JCQlyZXN1bHQgPSBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTLlNUX1NUWUxFOwotCQllbHNlCi0JCQlyZXN1bHQgPSBzdXBlci5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIFNUX0RFRkFVTFRfSFRNTDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gY29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxoYW5kbGVyL0VtYmVkZGVkSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVsaGFuZGxlci9FbWJlZGRlZEhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlYjIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxoYW5kbGVyL0VtYmVkZGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudC5IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3MuSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxjc3MuU3R5bGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuSlNQQ2FwYWJsZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRIVE1MIGltcGxlbWVudHMgRW1iZWRkZWRUeXBlSGFuZGxlciB7Ci0JcHVibGljIFN0cmluZyBDb250ZW50VHlwZUlEX0VtYmVkZGVkSFRNTCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVtYmVkZGVkSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdCBzdXBwb3J0ZWRNaW1lVHlwZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW1iZWRkZWRIVE1MLgotCSAqLwotCXB1YmxpYyBFbWJlZGRlZEhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCB0YWcgbmFtZXMgdXNpbmcgQmxvY2tNYXJrZXIgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSFRNTGlzaFRhZyhCbG9ja1RhZ1BhcnNlciBwYXJzZXIsIFN0cmluZyB0YWduYW1lKSB7Ci0JCUJsb2NrTWFya2VyIGJtID0gbmV3IEJsb2NrTWFya2VyKHRhZ25hbWUsIG51bGwsIFhNTFJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCwgZmFsc2UpOwotCQlwYXJzZXIuYWRkQmxvY2tNYXJrZXIoYm0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNnZXRGYW1pbHlJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGYW1pbHlJZCgpIHsKLQkJcmV0dXJuIE1vZGVsSGFuZGxlckZvckhUTUwuQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQ7Ci0JfQotCi0JLyoKLQkgKiBPbmx5ICJtb2RlbCBzaWRlIiBlbWJlZGRlZCBmYWN0b3JpZXMgY2FuIGJlIGFkZGVkIGhlcmUuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTCgpKTsKLQkJLy8JCWZhY3Rvcmllcy5hZGRBbGwoUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yaWVzKHRoaXMpKTsKLQkJcmV0dXJuIGZhY3RvcmllczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNpbml0aWFsaXplUGFyc2VyKFJlZ2lvblBhcnNlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKSB7Ci0JCWFkZEhUTUxpc2hUYWcocGFyc2VyLCAic2NyaXB0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSFRNTGlzaFRhZyhwYXJzZXIsICJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIExpc3QgZ2V0U3VwcG9ydGVkTWltZVR5cGVzKCkgewotCQlpZiAoc3VwcG9ydGVkTWltZVR5cGVzID09IG51bGwpIHsKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoInRleHQvaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJ0ZXh0L3hodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoImFwcGxpY2F0aW9uL3hodG1sK3htbCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJhcHBsaWNhdGlvbi94bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgidGV4dC92bmQud2FwLndtbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cHBvcnRlZE1pbWVUeXBlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KElGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChyZWdpc3RyeSk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KElGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChyZWdpc3RyeSk7Ci0JCS8vIG5vdGUgdGhpcyBCSUcgYXNzdW1wdGlvbiBhYm91dCBmYWN0b3J5IHNpbmdsZXRvbnMhCi0JCS8vIGZvciB0aGlzIHBhcnRpY3VsYXIgbGlzdCwgdGhleSBhcmUsIGJ1dCBtYXkgbm90IAotCQkvLyBiZSBpbiBmdXR1cmUuCi0KLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJcmVnaXN0cnkucmVtb3ZlRmFjdG9yeShmYWN0b3J5KTsKLQotCQlmYWN0b3J5ID0gSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0KLQkJZmFjdG9yeSA9IFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0KLQkJZmFjdG9yeSA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKSB7Ci0JCS8vIEknbSBhc3N1bWluZyBibG9jayBtYXJrZXJzIGFyZSB1bmlxdWUgYmFzZWQgb24gbmFtZSBvbmx5Ci0JCS8vIHdlIGFkZCB0aGVzZSBhcyBmdWxsIEJsb2NrTWFya2VycywgYnV0IHJlbW92ZSBiYXNlZCBvbiBuYW1lIGFsb25lLgotCQlwYXJzZXIucmVtb3ZlQmxvY2tNYXJrZXIoInNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlci5yZW1vdmVCbG9ja01hcmtlcigic2NyaXB0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZEhUTUwoKTsKLQl9Ci0KLQkvKioKLQkgKiB3aWxsIHNvbWVkYXkgYmUgY29udHJvbGxlZCB2aWEgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyN2FlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmVuY29kaW5nLkhUTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmVuY29kaW5nLkhUTUxEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmVuY29kaW5nLkhUTUxNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyRm9ySFRNTCBleHRlbmRzIEFic3RyYWN0TW9kZWxIYW5kbGVyIGltcGxlbWVudHMgSU1vZGVsSGFuZGxlciB7Ci0JLyoqIAotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIAotCSAqIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbiBhdCBydW4gdGltZSB3aXRoIAotCSAqIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIAotCSAqIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbiBhdCBydW4gdGltZSB3aXRoIAotCSAqIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRF9IVE1MID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyRm9ySFRNTCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySURfSFRNTCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSFRNTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IEhUTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSFRNTERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzOGRhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uQnVkZHlTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqLwotY2xhc3MgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotCi0JcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHNlbGYsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYnVkZHksIGJvb2xlYW4gaXNYSFRNTCkgewotCQlzdXBlcihzZWxmLCBidWRkeSwgaXNYSFRNTCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQXR0cmlidXRlRGVjbGFyYXRpb24jZ2V0QXR0ck5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKSB7Ci0JCXJldHVybiBnZXRTZWxmKCkuZ2V0QXR0ck5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRBdHRyVHlwZSgpCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCXJldHVybiBnZXRTZWxmKCkuZ2V0QXR0clR5cGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXREZWZhdWx0VmFsdWUoKQotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRFbnVtQXR0cigpCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXRFbnVtQXR0cigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldFVzYWdlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQlyZXR1cm4gZ2V0U2VsZigpLmdldFVzYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldFNlbGYoKSB7Ci0JCXJldHVybiAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgc2VsZjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9DTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzYzZhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9DTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5zc2kuU1NJQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICovCi1jbGFzcyBDTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0gZXh0ZW5kcyBDTU5vZGVCdWRkeVN5c3RlbSBpbXBsZW1lbnRzIENNRG9jdW1lbnQgewotCi0KLQlwcml2YXRlIHN0YXRpYyBDTURvY3VtZW50IGdldEhUTUxDTURvY3VtZW50KCkgewotCQlyZXR1cm4gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCX0KLQotCWNsYXNzIEVsZW1lbnRzIGV4dGVuZHMgQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbSB7Ci0JCXB1YmxpYyBFbGVtZW50cyhDTU5hbWVkTm9kZU1hcCBlbGVtZW50cywgYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCQlzdXBlcihpc1hIVE1MKTsKLQkJCW1ha2VCdWRkeVN5c3RlbShlbGVtZW50cyk7Ci0JCQlhZGRTU0lEZWNscygpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRLZXlOYW1lKENNTm9kZSBvcmlnaW5hbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXREZWNsKG9yaWdpbmFsKTsKLQkJCWlmIChlZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGVkZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZUJ1ZGR5U3lzdGVtKENNTm9kZSBvcmlnaW5hbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXREZWNsKG9yaWdpbmFsKTsKLQkJCXJldHVybiBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbShlZGVjbCwgaXNYSFRNTCgpKTsKLQkJfQotCi0JCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbChDTU5vZGUgY21ub2RlKSB7Ci0JCQlpZiAoY21ub2RlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbW5vZGU7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkU1NJRGVjbHMoKSB7Ci0JCQlDTURvY3VtZW50IHNzaSA9IFNTSUNNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoKTsKLQkJCWlmIChzc2kgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IHNzaS5nZXRFbGVtZW50cygpOwotCQkJSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlwdXQoZGVjbC5nZXRFbGVtZW50TmFtZSgpLCBkZWNsKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgRWxlbWVudHMgZWxlbWVudHMgPSBudWxsOwotCi0JcHVibGljIENNRG9jdW1lbnRGb3JCdWRkeVN5c3RlbShDTURvY3VtZW50IHNlbGYsIGJvb2xlYW4gaXNYSFRNTCkgewotCQlzdXBlcihzZWxmLCBnZXRIVE1MQ01Eb2N1bWVudCgpLCBpc1hIVE1MKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Eb2N1bWVudCNnZXRFbGVtZW50cygpCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkKLQkJCXJldHVybiBlbGVtZW50czsKLQkJQ01Eb2N1bWVudCBjbWRvYyA9IGdldFNlbGYoKTsKLQkJaWYgKGNtZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxlbWVudHMgPSBuZXcgRWxlbWVudHMoY21kb2MuZ2V0RWxlbWVudHMoKSwgaXNYSFRNTCk7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Eb2N1bWVudCNnZXRFbnRpdGllcygpCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlDTURvY3VtZW50IGNtZG9jID0gZ2V0U2VsZigpOwotCQlpZiAoY21kb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY21kb2MuZ2V0RW50aXRpZXMoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Eb2N1bWVudCNnZXROYW1lc3BhY2UoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCUNNRG9jdW1lbnQgY21kb2MgPSBnZXRTZWxmKCk7Ci0JCWlmIChjbWRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBjbWRvYy5nZXROYW1lc3BhY2UoKTsKLQl9Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgZ2V0U2VsZigpIHsKLQkJaWYgKHNlbGYuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuRE9DVU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTURvY3VtZW50KSBzZWxmOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9DTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9DTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMGI0ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICovCi1jbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0KLQotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgaHRtbGNtID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0SFRNTENNRWxlbURlY2woQ01FbGVtZW50RGVjbGFyYXRpb24gb3JpZ2luYWwpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gYnVkZHkgPSBudWxsOwotCQlpZiAoaHRtbGNtICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1zID0gaHRtbGNtLmdldEVsZW1lbnRzKCk7Ci0JCQlpZiAoZWxlbXMgIT0gbnVsbCkgewotCQkJCWJ1ZGR5ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtcy5nZXROYW1lZEl0ZW0ob3JpZ2luYWwuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZGR5OwotCX0KLQotCXByaXZhdGUgY2xhc3MgQXR0cnMgZXh0ZW5kcyBDTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtIHsKLQkJcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcCBidWRkeUF0dHJzID0gbnVsbDsKLQotCQlwdWJsaWMgQXR0cnMoQ01OYW1lZE5vZGVNYXAgYXR0cnMsIENNTmFtZWROb2RlTWFwIGJ1ZGR5QXR0cnMsIGJvb2xlYW4gaXNYSFRNTCkgewotCQkJc3VwZXIoaXNYSFRNTCk7Ci0JCQl0aGlzLmJ1ZGR5QXR0cnMgPSBidWRkeUF0dHJzOwotCQkJbWFrZUJ1ZGR5U3lzdGVtKGF0dHJzKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlY2wgPSBnZXREZWNsKG9yaWdpbmFsKTsKLQkJCWlmIChhZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGFkZWNsLmdldEF0dHJOYW1lKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZUJ1ZGR5U3lzdGVtKENNTm9kZSBvcmlnaW5hbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjbCA9IGdldERlY2wob3JpZ2luYWwpOwotCQkJaWYgKGFkZWNsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGJ1ZGR5ID0gbnVsbDsKLQkJCWlmIChidWRkeUF0dHJzICE9IG51bGwpIHsKLQkJCQlidWRkeSA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBidWRkeUF0dHJzLmdldE5hbWVkSXRlbShhZGVjbC5nZXRBdHRyTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtKGFkZWNsLCBidWRkeSwgaXNYSFRNTCgpKTsKLQkJfQotCi0JCXByaXZhdGUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsKENNTm9kZSBjbW5vZGUpIHsKLQkJCWlmIChjbW5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEF0dHJzIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0oQ01FbGVtZW50RGVjbGFyYXRpb24gc2VsZiwgYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKHNlbGYsIGdldEhUTUxDTUVsZW1EZWNsKHNlbGYpLCBpc1hIVE1MKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01FbGVtZW50RGVjbGFyYXRpb24jZ2V0QXR0cmlidXRlcygpCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm4gYXR0cmlidXRlczsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGh0bWxEZWNsID0gZ2V0QnVkZHkoKTsKLQkJQ01OYW1lZE5vZGVNYXAgaHRtbEF0dHJzID0gKGh0bWxEZWNsID09IG51bGwpID8gbnVsbCA6IGh0bWxEZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJYXR0cmlidXRlcyA9IG5ldyBBdHRycyhlZGVjbC5nZXRBdHRyaWJ1dGVzKCksIGh0bWxBdHRycywgaXNYSFRNTCk7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb250ZW50KCkKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWRlY2wuZ2V0Q29udGVudCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb250ZW50VHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkFOWTsKLQkJcmV0dXJuIGVkZWNsLmdldENvbnRlbnRUeXBlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRWxlbWVudERlY2xhcmF0aW9uI2dldEVsZW1lbnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCA9IGdldFNlbGYoKTsKLQkJaWYgKGVkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVkZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRWxlbWVudERlY2xhcmF0aW9uI2dldERhdGFUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlZGVjbC5nZXREYXRhVHlwZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRMb2NhbEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlZGVjbC5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQ29udGVudCNnZXRNYXhPY2N1cigpCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gZWRlY2wuZ2V0TWF4T2NjdXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Db250ZW50I2dldE1pbk9jY3VyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCA9IGdldFNlbGYoKTsKLQkJaWYgKGVkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiBlZGVjbC5nZXRNaW5PY2N1cigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjc3VwcG9ydHMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKGlzWEhUTUwgJiYgcHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChpc1hIVE1MICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKQotCQkJcmV0dXJuIEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfTk9ORTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRTZWxmKCkgewotCQlpZiAoc2VsZi5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHNlbGY7Ci0JfQotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRCdWRkeSgpIHsKLQkJaWYgKGJ1ZGR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGJ1ZGR5LmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTUVsZW1lbnREZWNsYXJhdGlvbikgYnVkZHk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2OWE5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9DTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbSBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCi0JcHJpdmF0ZSBib29sZWFuIGlzWEhUTUwgPSBmYWxzZTsKLQlwcml2YXRlIEhhc2h0YWJsZSBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBvZiBDTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtLgotCSAqIENBVVRJT046IEVhY2ggZGVyaXZlZCBjbGFzcyBtdXN0IGNhbGwgJ21ha2VCdWRkeVN5c3RlbScgbWV0aG9kIGluIGl0cwotCSAqIGNvbnN0cnVjdG9yIHRvIGJ1aWxkIHVwIGl0cyBjb250ZW50cy4KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbShib29sZWFuIGlzWEhUTUwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pc1hIVE1MID0gaXNYSFRNTDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01OYW1lZE5vZGVNYXAjZ2V0TGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIG1hcC5zaXplKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTmFtZWROb2RlTWFwI2dldE5hbWVkSXRlbShTdHJpbmcpCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGtleSA9IGNhbm9uaWNhbE5hbWUobmFtZSk7Ci0JCWlmICghbWFwLmNvbnRhaW5zS2V5KGtleSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTU5vZGUpIG1hcC5nZXQoa2V5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01OYW1lZE5vZGVNYXAjaXRlbShpbnQpCi0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgbm9kZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKC0taW5kZXggPCAwKQotCQkJCXJldHVybiAoQ01Ob2RlKSBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5hbWVkTm9kZU1hcCNpdGVyYXRvcigpCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyogcGFja2FnZSBzY29wZS4gKi8KLQl2b2lkIHB1dChTdHJpbmcgbmFtZSwgQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAobmFtZSA9PSBudWxsIHx8IGNtbm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltYXAucHV0KGNhbm9uaWNhbE5hbWUobmFtZSksIGNtbm9kZSk7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXRLZXlOYW1lKENNTm9kZSBvcmlnaW5hbCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZUJ1ZGR5U3lzdGVtKENNTm9kZSBvcmlnaW5hbCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hIVE1MKCkgewotCQlyZXR1cm4gaXNYSFRNTDsKLQl9Ci0KLQkvKioKLQkgKiBFYWNoIGRlcml2ZWQgY2xhc3MgbXVzdCBjYWxsIHRoaXMgbWV0aG9kIGluIGl0cyBjb25zdHJ1Y3RvcgotCSAqIHRvIGJ1aWxkIHVwIGl0cyBjb250ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlQnVkZHlTeXN0ZW0oQ01OYW1lZE5vZGVNYXAgb3JpZ2luYWwpIHsKLQkJSXRlcmF0b3IgaSA9IG9yaWdpbmFsLml0ZXJhdG9yKCk7Ci0JCWlmIChpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ01Ob2RlIG9yZyA9IChDTU5vZGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGtleSA9IGdldEtleU5hbWUob3JnKTsKLQkJCUNNTm9kZSBuZXdOb2RlID0gY3JlYXRlQnVkZHlTeXN0ZW0ob3JnKTsKLQkJCXB1dChrZXksIG5ld05vZGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY2Fub25pY2FsTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS50b1VwcGVyQ2FzZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9DTU5vZGVCdWRkeVN5c3RlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvQ01Ob2RlQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4YjdlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9DTU5vZGVCdWRkeVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MQ01Qcm9wZXJ0aWVzOwotCi0vKioKLSAqLwotY2xhc3MgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTU5vZGUgewotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JcHJvdGVjdGVkIENNTm9kZSBzZWxmID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Ob2RlIGJ1ZGR5ID0gbnVsbDsKLQotCXB1YmxpYyBDTU5vZGVCdWRkeVN5c3RlbShDTU5vZGUgc2VsZiwgQ01Ob2RlIGJ1ZGR5LCBib29sZWFuIGlzWEhUTUwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZWxmID0gc2VsZjsKLQkJdGhpcy5idWRkeSA9IGJ1ZGR5OwotCQl0aGlzLmlzWEhUTUwgPSBpc1hIVE1MOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjZ2V0Tm9kZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBzZWxmLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXROb2RlVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIHNlbGYuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Ob2RlI3N1cHBvcnRzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYnVkZHkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGJ1ZGR5LnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKCFpc1hIVE1MKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGlzWEhUTUwpOwotCQl9Ci0KLQkJaWYgKGJ1ZGR5ID09IG51bGwgfHwgKCFidWRkeS5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVkZHkuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjEzMzk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0RvY3VtZW50UXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20ucmFuZ2VzLlJhbmdlOwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFF1ZXJ5IHsKLQotCS8qKgotCSAqIGlzUmVuZGVyUm9vdCgpIHJldHVybnMgdHJ1ZSBpZiAtIG5vZGUgaXMgQk9EWSBlbGVtZW50IChib3RoIGV4cGxpY2l0Ci0JICogYW5kIGltcGxpY2l0KSAtIG5vZGUgaXMgcG9ydGFsaHRtbDpib2R5IGVsZW1lbnQgLSBub2RlIGlzIERvY3VtZW50IG5vZGUKLQkgKiBhbmQgdGhlIGRvY3VtZW50IGlzIHRyZWF0ZWQgYXMgZnJhZ21lbnQgKHdpdGggQk9EWSBjb250ZXh0KSBOb3RlIHRoYXQKLQkgKiBpbiBlZGl0aW5nIGEgZnJhZ21lbnQgZmlsZSwgRG9jdW1lbnQgbm9kZSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhCi0JICogc3Vic3RpdHV0ZSBvZiBCT0RZIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc1JlbmRlclJvb3QoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGlzSGVhZENvcnJlc3BvbmRlbnQoKSByZXR1cm5zIHRydWUgaWYgLSBub2RlIGlzIEhFQUQgZWxlbWVudCAoYm90aAotCSAqIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCkgLSBub2RlIGlzIHBvcnRhbGh0bWw6aGVhZCBlbGVtZW50IC0gbm9kZSBpcwotCSAqIERvY3VtZW50IG5vZGUgYW5kIHRoZSBkb2N1bWVudCBpcyB0cmVhdGVkIGFzIGZyYWdtZW50ICh3aXRoIEhFQUQKLQkgKiBjb250ZXh0KSBOb3RlIHRoYXQgaW4gZWRpdGluZyBhIGZyYWdtZW50IGZpbGUgKHdpdGggSEVBRCBjb250ZXh0KSwKLQkgKiBEb2N1bWVudCBub2RlIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3Vic3RpdHV0ZSBvZiBIRUFEIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc0hlYWRDb3JyZXNwb25kZW50KE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBJbXBsaWNpdCBCT0RZIGVsZW1lbnQgd2lsbCBiZSBnb25lIGluIFY2IFNFRCBtb2RlbC4gU28gcGFnZSBkZXNpZ25lcgotCSAqIHByb3ZpZGVzIGFuIEFQSSB0byBnZXQgYSByYW5nZSB3aG9zZSBjb250ZW50IG5vZGVzIGFyZSByZW5kZXJlZCBpbgotCSAqIGRlc2lnbiB2aWV3LiBnZXRSZW5kZXJSb290UmFuZ2UoKSByZXR1cm5zIC0gYSByYW5nZSBmcm9tIEJPRFkncyBmaXJzdAotCSAqIHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaGFzIEJPRFkgZWxlbWVudCkgLSBhIHJhbmdlIGZvcm0KLQkgKiBEb2N1bWVudCdzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZCi0JICogY29udGV4dCkgLSBudWxsIChpZiB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBIRUFEIGNvbnRleHQpIFtUaGUKLQkgKiBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UgVjZdIC0gYSByYW5nZSBmcm9tIGEgY3VzdG9tCi0JICogdGFnJ3MgZmlyc3QgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBoYXMgYSBjdXN0b20gdGFnIHdoaWNoCi0JICogZ2VuZXJhdGVzIEJPRFkgZWxlbWVudCBhdCBydW50aW1lKSAtIGEgcmFuZ2UgZnJvbSBEb2N1bWVudCdzCi0JICogYXBwcm9waXJhdGUgb2Zmc2V0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdAotCSAqIEJPRFkvSFRNTCkgLSBhIHJhbmdlIGZyb20gSFRNTCBlbGVtZW50J3MgYXBwcm9wcmlhdGUgb2Zmc2V0IHRvIGl0cyBsYXN0Ci0JICogKGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0IEJPRFkgYnV0IGhhdmUgZXhwbGljaXQgSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCVJhbmdlIGdldFJlbmRlclJvb3RSYW5nZShEb2N1bWVudCBkb2MpOwotCi0JLyoqCi0JICogSW1wbGljaXQgSEVBRCBlbGVtZW50IHdpbGwgYmUgZ29uZSBpbiBWNiBTRUQgbW9kZWwuIFNvIHBhZ2UgZGVzaWduZXIKLQkgKiBwcm92aWRlcyBhbiBBUEkgdG8gZ2V0IGEgcmFuZ2Ugd2hvc2UgY29udGVudCBub2RlcyBhcmUgdHJlYXRlZCBhcyBIRUFECi0JICogZWxlbWVudCdzIGNoaWxkLiBnZXRIZWFkQ29ycmVzcG9uZGVudFJhbmdlKCkgcmV0dXJucyAtIGEgcmFuZ2UgZnJvbQotCSAqIEhFQUQncyBmaXJzdCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGhhcyBIRUFEIGVsZW1lbnQpIC0gYSByYW5nZQotCSAqIGZvcm0gRG9jdW1lbnQncyBmaXJzdCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGgKLQkgKiBIRUFEIGNvbnRleHQpIC0gbnVsbCAoaWYgdGhlIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0KQotCSAqIFtUaGUgZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkIHNpbmNlIFY2XSAtIGEgcmFuZ2UgZnJvbSBhCi0JICogY3VzdG9tIHRhZydzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaGFzIGEgY3VzdG9tIHRhZyB3aGljaAotCSAqIGdlbmVyYXRlcyBIRUFEIGVsZW1lbnQgYXQgcnVudGltZSkgLSBhIHJhbmdlIGZyb20gRG9jdW1lbnQncyBmaXJzdCB0bwotCSAqIGFwcHJvcGlyYXRlIG9mZnNldCAoaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgZXhwbGljaXQgSEVBRC9IVE1MKSAtCi0JICogYSByYW5nZSBmcm9tIEhUTUwgZWxlbWVudCdzIGZpcnN0IHRvIGFwcHJvcHJpYXRlIG9mZnNldCAoaWYgdGhlCi0JICogZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdCBIRUFEIGJ1dCBoYXZlIGV4cGxpY2l0IEhUTUwpCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlSYW5nZSBnZXRIZWFkQ29ycmVzcG9uZGVudFJhbmdlKERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBnZXRSZW5kZXJSb290Tm9kZSgpIHdpdGggW2NyZWF0ZT1mYWxzZV0gcmV0dXJucyAtIEJPRFkgZWxlbWVudCBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBoYXMgQk9EWSBlbGVtZW50IC0gbnVsbCBpZiB0aGlzIGRvY3VtZW50Ci0JICogaXMgbm90IGZyYWdtZW50IGFuZCBkb2VzIG5vdCBoYXZlIEJPRFkgZWxlbWVudCAtIERvY3VtZW50IG5vZGUgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0IC0gbnVsbCBpZiB0aGlzIGRvY3VtZW50IGlzCi0JICogZnJhZ21lbnQgd2l0aCBIRUFEIGNvbnRleHQgW1RoZSBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UKLQkgKiBWNl0gLSBhIGN1c3RvbSB0YWcgd2hpY2ggZ2VuZXJhdGVzIEJPRFkgdGFnIGF0IHJ1bnRpbWUgLSBEb2N1bWVudCBub2RlCi0JICogb3IgSFRNTCBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlCi0JICogZXhwbGljaXQgQk9EWSBlbGVtZW50IGdldFJlbmRlclJvb3ROb2RlKCkgd2l0aCBbY3JlYXRlPXRydWVdIHJldHVybnMgLQotCSAqIEJPRFkgZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgaGFzIEJPRFkgZWxlbWVudCAobm8KLQkgKiBtb2RpZmljdGF0aW9uKSAtIG5ld2x5IGNyZWF0ZWQgQk9EWSBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90Ci0JICogZnJhZ21lbnQgYnV0IGRvZXMgbm90IGhhdmUgQk9EWSBlbGVtZW50IC0gRG9jdW1lbnQgbm9kZSBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQgKG5vIG1vZGlmaWN0YXRpb24pIFtUaGUKLQkgKiBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UgVjZdIC0gYSBjdXN0b20gdGFnIHdoaWNoCi0JICogZ2VuZXJhdGVzIEJPRFkgdGFnIGF0IHJ1bnRpbWUgKG5vIG1vZGlmaWN0YXRpb24pIC0gbmV3bHkgY3JlYXRlZCBCT0RZCi0JICogZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdAotCSAqIEJPRFkgZWxlbWVudCBnZXRSZW5kZXJSb290Tm9kZSgpIHRocm93cyBIVE1MQ29tbWFuZEV4Y2VwdGlvbiAoc2luY2UgVjYpCi0JICogaWYgLSB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggSEVBRCBjb250ZXh0IGFuZCAtICJjcmVhdGUiCi0JICogcGFyYW1ldGVyIGlzIHRydWUgTm90ZSB0aGF0IGluIGVkaXRpbmcgYSBmcmFnbWVudCBmaWxlLCBEb2N1bWVudCBub2RlCi0JICogc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWJzdGl0dXRlIG9mIEJPRFkgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRPckRvY3VtZW50Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlOb2RlIGdldFJlbmRlclJvb3ROb2RlKE5vZGUgY2hpbGRPckRvY3VtZW50LCBib29sZWFuIGNyZWF0ZSk7Ci0KLQkvKioKLQkgKiBnZXRIZWFkQ29ycmVzcG9uZGVudE5vZGUoKSB3aXRoIFtjcmVhdGU9ZmFsc2VdIHJldHVybnMgLSBIRUFEIGVsZW1lbnQKLQkgKiBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgaGFzIEhFQUQgZWxlbWVudCAtIG51bGwgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgZG9lcyBub3QgaGF2ZSBIRUFEIGVsZW1lbnQgLSBEb2N1bWVudCBub2RlCi0JICogaWYgdGhpcyBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCAtIG51bGwgaWYgdGhpcyBkb2N1bWVudAotCSAqIGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0IFtUaGUgZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkCi0JICogc2luY2UgVjZdIC0gYSBjdXN0b20gdGFnIHdoaWNoIGdlbmVyYXRlcyBIRUFEIHRhZyBhdCBydW50aW1lIC0gRG9jdW1lbnQKLQkgKiBub2RlIG9yIEhUTUwgZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZQotCSAqIGV4cGxpY2l0IEhFQUQgZWxlbWVudCBnZXRIZWFkQ29ycmVzcG9uZGVudE5vZGUoKSB3aXRoIFtjcmVhdGU9dHJ1ZV0KLQkgKiByZXR1cm5zIC0gSEVBRCBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBoYXMgSEVBRAotCSAqIGVsZW1lbnQgKG5vIG1vZGlmaWN0YXRpb24pIC0gbmV3bHkgY3JlYXRlZCBIRUFEIGVsZW1lbnQgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZSBIRUFEIGVsZW1lbnQgLSBEb2N1bWVudCBub2RlCi0JICogaWYgdGhpcyBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCAobm8gbW9kaWZpY3RhdGlvbikgW1RoZQotCSAqIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBzaW5jZSBWNl0gLSBhIGN1c3RvbSB0YWcgd2hpY2gKLQkgKiBnZW5lcmF0ZXMgSEVBRCB0YWcgYXQgcnVudGltZSAobm8gbW9kaWZpY3RhdGlvbikgLSBuZXdseSBjcmVhdGVkIEhFQUQKLQkgKiBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0Ci0JICogSEVBRCBlbGVtZW50IGdldEhlYWRDb3JyZXNwb25kZW50Tm9kZSgpIHRocm93cyBIVE1MQ29tbWFuZEV4Y2VwdGlvbgotCSAqIChzaW5jZSBWNikgaWYgLSB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0IGFuZCAtCi0JICogImNyZWF0ZSIgcGFyYW1ldGVyIGlzIHRydWUgTm90ZSB0aGF0IGluIGVkaXRpbmcgYSBmcmFnbWVudCBmaWxlLAotCSAqIERvY3VtZW50IG5vZGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWJzdGl0dXRlIG9mIEhFQUQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRPckRvY3VtZW50Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlOb2RlIGdldEhlYWRDb3JyZXNwb25kZW50Tm9kZShOb2RlIGNoaWxkT3JEb2N1bWVudCwgYm9vbGVhbiBjcmVhdGUpOwotCi0JLyoqCi0JICogZ2V0SHRtbENvcnJlc3BvbmRlbnROb2RlKCkgdGhyb3dzIEhUTUxDb21tYW5kRXhjZXB0aW9uIChzaW5jZSBWNikgaWYgLQotCSAqIHRoaXMgZG9jdW1lbnQgaXMgZnJhZ21lbnQgYW5kICJjcmVhdGUiIHBhcmFtZXRlciBpcyB0cnVlCi0JICogCi0JICogQHBhcmFtIGNoaWxkT3JEb2N1bWVudAotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiBAcmV0dXJuCi0JICovCi0JTm9kZSBnZXRIdG1sQ29ycmVzcG9uZGVudE5vZGUoTm9kZSBjaGlsZE9yRG9jdW1lbnQsIGJvb2xlYW4gY3JlYXRlKTsKLQotCS8qKgotCSAqIFRoaXMgaW5uZXIgY2xhc3MgaXMgaW50ZW5kZWQgZm9yIGluc2VydGlvbiB0YXJnZXQuIHBsZWFzZSB1c2UgdGhpcyBsaWtlCi0JICogdGhlIGZvbGxvd2luZyA6IERvY3VtZW50UXVlcnkuSW5zZXJ0aW9uVGFyZ2V0IGluczsKLQkgKiBpbnMuZ2V0UGFyZW50KCkuaW5zZXJ0QmVmb3JlKHlvdUluc2VydGlvbk5vZGUsIGlucy5nZXRSZWYoKSk7Ci0JICovCi0JcHVibGljIGNsYXNzIEluc2VydGlvblRhcmdldCB7Ci0JCXByaXZhdGUgZmluYWwgTm9kZSBwYXJlbnQ7Ci0JCXByaXZhdGUgZmluYWwgTm9kZSByZWY7Ci0KLQkJcHVibGljIEluc2VydGlvblRhcmdldChOb2RlIHBhcmVudCwgTm9kZSByZWYpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5yZWYgPSByZWY7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0UmVmKCkgewotCQkJcmV0dXJuIHJlZjsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldEhlYWRJbnNlcnRpb25UYXJnZXQoKSByZXR1cm5zIGFwcHJvcHJpYXRlIGluc2V0aW9uIHRhcmdldCBsb2NhdGlvbgotCSAqIGZvciBIRUFEIGNoaWxkIHRhZ3Mgc3VjaCBhcyA8c2NyaXB0PiwgPHN0eWxlPiwgPG1ldGE+ZXRjLiBCYXNpY2FsbHkKLQkgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgPEhFQUQ+dGFnJ3MgdGhlIGxhc3QgcG9zaXRpb24uIE5vdGUgdGhhdCB0aGlzCi0JICogd291bGQgbm90IGNyZWF0ZSBhY3R1YWwgPEhFQUQ+dGFnIHdoZW4gdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgaXQuCi0JICogPEhFQUQ+aXMgb21pdHRhYmxlIHRhZyBzbyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYXBwcm9wcmlhdGUgcG9zaXRpb24KLQkgKiB0byB3aGljaCBpbXBsaWNpdCA8SEVBRD5jYW4gYmUgaW5zZXJ0ZWQsIGlmIHRoZSBkb2N1bWVudCBoYXMgbm8KLQkgKiA8SEVBRD4uCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlJbnNlcnRpb25UYXJnZXQgZ2V0SGVhZEluc2VydGlvblRhcmdldChEb2N1bWVudCBkb2MpOwotCi0JLyoqCi0JICogZ2V0UGFnZUluc2VydGlvblRhcmdldCgpIHJldHVybnMgYXBwcm9wcmlhdGUgaW5zZXRpb24gdGFyZ2V0IGxvY2F0aW9uCi0JICogZm9yIHBhZ2UtbGV2ZWwgbWFya3Vwcywgc3VjaCBhcyBKU1AgZGlyZWN0aXZlcywgdXNlYmVhbiB0YWdzIG9yIDxodG1sPgotCSAqIHRhZy4gQmFzaWNhbGx5IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBqdXN0IGJlZm9yZSA8SFRNTD50YWcuIE5vdGUgdGhhdAotCSAqIHRoaXMgd291bGQgbm90IGNyZWF0ZSBhY3R1YWwgPEhUTUw+dGFnIHdoZW4gdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUKLQkgKiBpdC4gSW4gc3VjaCBjYXNlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUKLQkgKiBtZWFuaW5nZnVsIHRhZ3Mgc3VjaCBhcyBIVE1ML0pTUCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCUluc2VydGlvblRhcmdldCBnZXRQYWdlSW5zZXJ0aW9uVGFyZ2V0KERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBpc0ZyYWdtZW50KCkgcmV0dXJucyB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBmcmFnbWVudCBvciBjb21wbGV0ZQotCSAqIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzRnJhZ21lbnQoRG9jdW1lbnQgZG9jKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NDVmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCUNNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyYWQ3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyOwotCQlhZGFwdGVyID0gbmV3IEhUTUxFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCW5vdGlmaWVyLmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIGNvcHkgbWV0aG9kCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9ITVFVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9ITVFVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NTc0YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvSE1RVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSE1RVXRpbCB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBWZWN0b3IgbnVsbFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQotCS8qIEhNUVV0aWwgY2xhc3MgbXVzdCBub3QgaW5zdGFudGlhdGUuICovCi0JcHJpdmF0ZSBITVFVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIGdhdGhlciBhbGwgZWxlbWVudCBkZWNsYXJhdGlvbnMgaW4gaW5jbHVzaW9uIG9mIGVhY2ggcGFyZW50IG9mIHRoZSB0YXJnZXQuIAotCSAqIHRoZSBpbmNsdXNpb24gb2YgdGhlIHRhcmdldCBpcyBhbHNvIGdhdGhlcmVkLiAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRJbmNsdXNpb25zKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsVmVjdG9yOwotCQlDb2xsZWN0aW9uIGluY2x1c2lvbnMgPSBnYXRoZXJJbmNsdXNpb25zKGdldEFuY2VzdG9yRGVjbGFyYXRpb25zKHRhcmdldCkpOwotCi0JCUhhc2h0YWJsZSBhdmFpbGFibGVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlJdGVyYXRvciBpdGVyID0gaW5jbHVzaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNNQ29udGVudCBpbmNsdXNpb24gPSAoQ01Db250ZW50KSBpdGVyLm5leHQoKTsKLQkJCXN3aXRjaCAoaW5jbHVzaW9uLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIENNTm9kZS5HUk9VUCA6Ci0JCQkJCWV4dHJhY3REZWNsYXJhdGlvbnMoYXZhaWxhYmxlcywgKENNR3JvdXApIGluY2x1c2lvbik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOgotCQkJCQlhZGRJbmNsdXNpb24oYXZhaWxhYmxlcywgKENNRWxlbWVudERlY2xhcmF0aW9uKSBpbmNsdXNpb24pOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhdmFpbGFibGVzLnZhbHVlcygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0QW5jZXN0b3JEZWNsYXJhdGlvbnMoRWxlbWVudCB0YXJnZXQpIHsKLQkJVmVjdG9yIGFuY2VzdG9ycyA9IG5ldyBWZWN0b3IoKTsKLQotCQlEb2N1bWVudCBkb2MgPSB0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2MpOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gcXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJYW5jZXN0b3JzLmFkZChkZWNsKTsKLQotCQlFbGVtZW50IHBhcmVudCA9IGdldFBhcmVudCh0YXJnZXQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWRlY2wgPSBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkKLQkJCQlhbmNlc3RvcnMuYWRkKGRlY2wpOwotCQkJcGFyZW50ID0gZ2V0UGFyZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIGFuY2VzdG9yczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEluY2x1c2lvbihIYXNodGFibGUgYXZhaWxhYmxlcywgQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlTdHJpbmcgbmFtZSA9IGRlY2wuZ2V0RWxlbWVudE5hbWUoKTsKLQkJaWYgKGF2YWlsYWJsZXMuY29udGFpbnNLZXkobmFtZSkpCi0JCQlyZXR1cm47Ci0JCWF2YWlsYWJsZXMucHV0KG5hbWUsIGRlY2wpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2F0aGVySW5jbHVzaW9ucyhDb2xsZWN0aW9uIGFuY2VzdG9ycykgewotCQlWZWN0b3IgaW5jbHVzaW9ucyA9IG5ldyBWZWN0b3IoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGFuY2VzdG9ycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5JTkNMVVNJT04pKSB7Ci0JCQkJQ01Db250ZW50IGluY2x1c2lvbiA9IChDTUNvbnRlbnQpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JTkNMVVNJT04pOwotCQkJCWlmIChpbmNsdXNpb24gIT0gbnVsbCkKLQkJCQkJaW5jbHVzaW9ucy5hZGQoaW5jbHVzaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5jbHVzaW9uczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50IGdldFBhcmVudChOb2RlIHRhcmdldCkgewotCQlOb2RlIHBhcmVudCA9IHRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybiAoRWxlbWVudCkgcGFyZW50OwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGV4dHJhY3REZWNsYXJhdGlvbnMoSGFzaHRhYmxlIGF2YWlsYWJsZXMsIENNR3JvdXAgZ3JvdXApIHsKLQkJQ01Ob2RlTGlzdCBjb250ZW50ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnQuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJQ01Ob2RlIGNtbiA9IGNvbnRlbnQuaXRlbShpKTsKLQkJCWlmIChjbW4gPT0gbnVsbCB8fCBjbW4uZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLQkJCQljb250aW51ZTsKLQkJCWFkZEluY2x1c2lvbihhdmFpbGFibGVzLCAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNtbik7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0hUTUxFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzRkODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGltcGxlbWVudHMgRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciB7Ci0KLQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTYxYTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuSWRSZXNvbHZlcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbFF1ZXJ5Q01Qcm92aWRlciBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyCi0JICovCi0JcHVibGljIEhUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIElkUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlzdXBlcihuZXcgSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKSk7Ci0JfQotCi0JLy8gTUlXQTogV2UgY2Fubm90IGNhY2hlIGEgQ01FbGVtZW50RGVjbGFyYXRpb24gYW55IG1vcmUuICBCZWNhdXNlLCB3aGVuIHRoZSBET0NUWVBFCi0JLy8gd2FzIGNoYW5nZWQsIENNRG9jdW1lbnQgd291bGQgYmUgY2hhbmdlZC4gIFRoZW4sIGEgY2FjaGVkIENNRWxlbWVudERlY2xhcmF0aW9uCi0JLy8gd291bGQgYmUgaW52YWxpZC4gIElmIHNvbWUgcGVyZm9ybWFuY2UgcHJvYmxlbXMgb2NjdXJzLCB3ZSBjb25zaWRlciBhIHNtYXJ0ZXIKLQkvLyBjYWNoZSBtZWNoYW5pc20uCi0JLy8KLQkvLwlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JLy8JCS8vIGNoZWNrIGlmIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgY2FjaGVkCi0JLy8JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZWxlbWVudDsKLQkvLwkJRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkvLwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkvLwkJCXJldHVybiBhZGFwdGVyLmdldERlY2xhcmF0aW9uKCk7Ci0JLy8KLQkvLwkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IHN1cGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCS8vCi0JLy8JCS8vIGNhY2hlIEhUTUwgZWxlbWVudCBkZWNsYXJhdGlvbiBvbmx5Ci0JLy8JCWlmIChkZWNsICE9IG51bGwgJiYgZGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkvLwkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCS8vCQkJYWRhcHRlciA9IChFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KG5vdGlmaWVyKTsKLQkvLwkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JLy8JCQkJYWRhcHRlci5zZXREZWNsYXJhdGlvbihkZWNsKTsKLQkvLwkJfQotCS8vCi0JLy8JCXJldHVybiBkZWNsOwotCS8vCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWMxMWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLklkUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBwcm92aWRlciBmb3IgSFRNTCBhbmQgWEhUTUwgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyIGltcGxlbWVudHMgTW9kZWxRdWVyeUNNUHJvdmlkZXIgewotCi0KLQlwcml2YXRlIHN0YXRpYyBDTURvY3VtZW50IHN0YXRpY0hUTUwgPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSFRNTF9ET0NfVFlQRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBzdGF0aWNDSFRNTCA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5DSFRNTF9ET0NfVFlQRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IGRvY3R5cGVSZWdpc3RyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBidWRkeUNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHJpdmF0ZSBYSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIgeGh0bWxhc3NvYyA9IG51bGw7Ci0KLQlwdWJsaWMgSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgSWRSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXhodG1sYXNzb2MgPSBuZXcgWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLgotCSAqIG9yIG51bGwgaWYgbm8gQ01Eb2N1bWVudCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkgewotCQlYTUxEb2N1bWVudCBvd25lciA9IGdldE93bmVyWE1MRG9jdW1lbnQobm9kZSk7Ci0JCWlmIChvd25lciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHBpZCA9IGdldFB1YmxpY0lkKG93bmVyKTsKLQkJaWYgKHBpZCA9PSBudWxsKQotCQkJcmV0dXJuIHN0YXRpY0hUTUw7Ci0KLQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gZG9jdHlwZVJlZ2lzdHJ5LmdldEVudHJ5KHBpZCk7Ci0JCWlmIChlbnRyeSA9PSBudWxsKQotCQkJcmV0dXJuIHN0YXRpY0hUTUw7Ci0KLQkJcGlkID0gZW50cnkuZ2V0UHVibGljSWQoKTsKLQkJQ01Eb2N1bWVudCBkdGRjbSA9IHhodG1sYXNzb2MuZ2V0WEhUTUxDTURvY3VtZW50KHBpZCwgZW50cnkuZ2V0U3lzdGVtSWQoKSk7Ci0JCWlmIChkdGRjbSA9PSBudWxsKSB7Ci0JCQlpZiAocGlkICE9IG51bGwgJiYgcGlkLmVxdWFscyhIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuQ0hUTUxfUFVCTElDX0lEKSkgewotCQkJCXJldHVybiBzdGF0aWNDSFRNTDsKLQkJCX0KLQkJCXJldHVybiBzdGF0aWNIVE1MOwotCQl9Ci0KLQkJQ01Eb2N1bWVudCBidWRkeWNtID0gKENNRG9jdW1lbnQpIGJ1ZGR5Q2FjaGUuZ2V0KHBpZCk7Ci0JCWlmIChidWRkeWNtICE9IG51bGwpCi0JCQlyZXR1cm4gYnVkZHljbTsKLQotCQlidWRkeWNtID0gbmV3IENNRG9jdW1lbnRGb3JCdWRkeVN5c3RlbShkdGRjbSwgZW50cnkuaXNYTUxUeXBlKCkpOwotCQlidWRkeUNhY2hlLnB1dChwaWQsIGJ1ZGR5Y20pOwotCQlyZXR1cm4gYnVkZHljbTsKLQl9Ci0KLQkvLyBwcml2YXRlIG1ldGhvZHMKLQlwcml2YXRlIFhNTERvY3VtZW50IGdldE93bmVyWE1MRG9jdW1lbnQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnQgb3duZXIgPSAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyAoRG9jdW1lbnQpIG5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKG93bmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEob3duZXIgaW5zdGFuY2VvZiBYTUxEb2N1bWVudCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChYTUxEb2N1bWVudCkgb3duZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHVibGljSWQoWE1MRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGRvYy5nZXREb2N0eXBlKCk7Ci0JCXJldHVybiAoZG9jdHlwZSAhPSBudWxsKSA/IGRvY3R5cGUuZ2V0UHVibGljSWQoKSA6IGRvYy5nZXREb2N1bWVudFR5cGVJZCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTNiOWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLk1vZGVsUXVlcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxxdWVyeS5Nb3ZhYmxlTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuSWRSZXNvbHZlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEhUTUxNb2RlbFF1ZXJ5SW1wbCBleHRlbmRzIE1vZGVsUXVlcnlJbXBsIGltcGxlbWVudHMgTW92YWJsZU1vZGVsUXVlcnkgewotCi0JcHJvdGVjdGVkIENNRG9jdW1lbnRDYWNoZSBmQ2FjaGUgPSBudWxsOwotCi0JcHVibGljIEhUTUxNb2RlbFF1ZXJ5SW1wbChDTURvY3VtZW50Q2FjaGUgY2FjaGUsIElkUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlzdXBlcihuZXcgSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKSk7Ci0JCWZDYWNoZSA9IGNhY2hlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKSB7Ci0JCUxpc3Qgb3JpZ2luYWxDYW5kaWRhdGVzID0gc3VwZXIuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCQlpZiAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9DSElMRF9OT0RFUykgPT0gMCkKLQkJCXJldHVybiBvcmlnaW5hbENhbmRpZGF0ZXM7Ci0JCS8vIFdoZW4gdGhlIHRhcmdldCBkb2N1bWVudCBpcyBYSFRNTCwgaXQgaXMgd2FzdGUgdG8gZmluZCBpbmNsdXNpb25zLAotCQkvLyBzaW5jZSBpbmNsdXNpb24gaXMgYXZhaWxhYmxlIGluIEhUTUwgb25seS4KLQkJaWYgKCFlZC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiBvcmlnaW5hbENhbmRpZGF0ZXM7Ci0JCQotCQlCb29sZWFuIGlzWGh0bWwgPSBCb29sZWFuLkZBTFNFOwotCQlpc1hodG1sID0gKEJvb2xlYW4pIGVkLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpOwotCQlpZiAoaXNYaHRtbCAhPSBudWxsICYmIGlzWGh0bWwuYm9vbGVhblZhbHVlKCkpCi0JCQlyZXR1cm4gb3JpZ2luYWxDYW5kaWRhdGVzOwotCi0JCS8vIE9LLCB0aGUgdGFyZ2V0IGlzIHN1cmVseSBhIEhUTUwgZWxlbWVudCwgc28gaXQgbWF5IGhhdmUgaW5jbHVzaW9uLgotCQkvLyBUcnkgdG8gZmluZCBpdC4KLQkJVmVjdG9yIGNhbmRpZGF0ZXMgPSBuZXcgVmVjdG9yKG9yaWdpbmFsQ2FuZGlkYXRlcyk7Ci0KLQkJc3dpdGNoIChlZC5nZXRDb250ZW50VHlwZSgpKSB7Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSA6Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQgOgotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCA6Ci0JCQkJLy8gZG8gZW51bWVyYXRlIGluY2x1c2lvbnMuCi0JCQkJY2FuZGlkYXRlcy5hZGRBbGwoSE1RVXRpbC5nZXRJbmNsdXNpb25zKGVsZW1lbnQpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkgOgotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgOgotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSA6Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgbm90IGFkZCBhbnkgaW5jbHVzaW9ucy4KLQkJCQkvLyBzbywgbm90aGluZyB0byBkbyBoZXJlLgotCQkJCWJyZWFrOwotCQl9Ci0JCS8vIElmIHRoZSBjdXJyZW50IGVsZW1lbnQgZG9lcyBub3QgYXZhaWxhYmxlLCBpdCBpcyBpbXBvc3NpYmxlCi0JCS8vIHRvIGZpbHRlciBvdXQgZXhjbHVzaW9uLgotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGNhbmRpZGF0ZXM7Ci0KLQkJLy8gTm93LCB0aGUgdGltZSB0byBjaGVjayBleGNsdXNpb24uCi0JCVZlY3RvciBjb250ZW50ID0gbmV3IFZlY3RvcihjYW5kaWRhdGVzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5zaXplKCk7IGkrKykgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gY2FuZGlkYXRlID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjYW5kaWRhdGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChjYW5kaWRhdGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChpc0V4Y2x1ZGVkKGNhbmRpZGF0ZSwgZWxlbWVudCkpCi0JCQkJY29udGludWU7Ci0JCQljb250ZW50LmFkZChjYW5kaWRhdGUpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb3ZhYmxlTW9kZWxRdWVyeSNzZXRJZFJlc29sdmVyKElkUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRSZXNvbHZlcihJZFJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpIHsKLQkJbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgPSBuZXcgSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGZDYWNoZSwgbmV3SWRSZXNvbHZlcik7Ci0JfQotCi0JLy8gdXRpbGl0aWVzCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKENNRWxlbWVudERlY2xhcmF0aW9uIGNhbmRpZGF0ZSwgRWxlbWVudCB0YXJnZXQpIHsKLQkJQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZCA9IGdldFByb2hpYml0ZWRBbmNlc3RvcnMoY2FuZGlkYXRlKTsKLQkJaWYgKHByb2hpYml0ZWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudCBwYXJlbnQgPSB0YXJnZXQ7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQ01Ob2RlIHBkZWMgPSBwcm9oaWJpdGVkLmdldE5hbWVkSXRlbShwYXJlbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlpZiAocGRlYyAhPSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJcGFyZW50ID0gZ2V0RXhwbGljaXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjKSB7Ci0JCWlmICghZGVjLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuUFJPSElCSVRFRF9BTkNFU1RPUlMpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01OYW1lZE5vZGVNYXApIGRlYy5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKTsKLQl9Ci0KLQkvKiBnZXQgYW4gYW5jZXN0b3IgZWxlbWVudCBpZ25vcmluZyBpbXBsaWNpdCBvbmVzLiAqLwotCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgZ2V0RXhwbGljaXRQYXJlbnRFbGVtZW50KE5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIHAgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwICE9IG51bGwpIHsKLQkJCWlmIChwLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlpZiAocCBpbnN0YW5jZW9mIFhNTEVsZW1lbnQpIHsKLQkJCQkJaWYgKCgoWE1MRWxlbWVudCkgcCkuaXNJbXBsaWNpdFRhZygpKSB7Ci0JCQkJCQlwID0gcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gKEVsZW1lbnQpIHA7Ci0JCQl9Ci0JCQlwID0gcC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxZTg2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwgZXh0ZW5kcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MKCkgewotCQl0aGlzKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTC4KLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICovCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFkYXB0ZXJGYWN0b3J5I2FkYXB0KElOb2RlTm90aWZpZXIpCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGFkYXB0TmV3KG9iamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0KLQkJcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwodGhpcy5hZGFwdGVyS2V5LCB0aGlzLnNob3VsZFJlZ2lzdGVyQWRhcHRlcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0ZTkzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVscXVlcnkuWE1MQ2F0YWxvZ0lkUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLklkUmVzb2x2ZXI7Ci0KLS8qKgotICogQ3JlYXRlcyBhIE1vZGVsUXVlcnlBZGFwdGVyIGZvciBIVE1MIG1vZGVscwotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTW9kZWxTdGF0ZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5QWRhcHRlckltcGwgbW9kZWxRdWVyeUFkYXB0ZXJJbXBsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIHN0YXRlTm90aWZpZXIgPSBudWxsOwotCi0JLyoqCi0JICogTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKCkgewotCQl0aGlzKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQotCQlpZiAoRGVidWcuZGlzcGxheUluZm8pCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5jcmVhdGVBZGFwdGVyIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVySW1wbCA9PSBudWxsKSB7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgWE1MTm9kZSkgewotCQkJCVhNTE5vZGUgeG1sTm9kZSA9IChYTUxOb2RlKSB0YXJnZXQ7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHN0YXRlTm90aWZpZXIgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJU3RyaW5nIG1vZGVsc0Jhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCWlmIChtb2RlbHNCYXNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQlGaWxlIGZpbGUgPSBuZXcgUGF0aChtb2RlbHNCYXNlTG9jYXRpb24pLnRvRmlsZSgpOwotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJYmFzZUxvY2F0aW9uID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJhc2VMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQobW9kZWxzQmFzZUxvY2F0aW9uKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC4uLiBiYXNlTG9jYXRpb24gOiAiICsgYmFzZUxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSA9IG5ldyBDTURvY3VtZW50Q2FjaGUoKTsKLQkJCQlJZFJlc29sdmVyIGlkUmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKTsKLQkJCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBuZXcgSFRNTE1vZGVsUXVlcnlJbXBsKGNtRG9jdW1lbnRDYWNoZSwgaWRSZXNvbHZlcik7Ci0JCQkJbW9kZWxRdWVyeS5zZXRFZGl0TW9kZShNb2RlbFF1ZXJ5LkVESVRfTU9ERV9VTkNPTlNUUkFJTkVEKTsKLQkJCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwgPSBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKGNtRG9jdW1lbnRDYWNoZSwgbW9kZWxRdWVyeSwgaWRSZXNvbHZlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZXNvbHZlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUZpbGUgYmFzZUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwuc2V0SWRSZXNvbHZlcihuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsLAotCSAqICAgICAgSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJc3RhdGVOb3RpZmllciA9IG5ld01vZGVsOwotCQl1cGRhdGVSZXNvbHZlcihzdGF0ZU5vdGlmaWVyKTsKLQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAoc3RhdGVOb3RpZmllciAhPSBudWxsKQotCQkJc3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCXN0YXRlTm90aWZpZXIgPSBudWxsOwotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXJJbXBsICE9IG51bGwpCi0JCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwucmVsZWFzZSgpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCi0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCh0aGlzLmFkYXB0ZXJLZXksIHRoaXMuc2hvdWxkUmVnaXN0ZXJBZGFwdGVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL21vZGVscXVlcnkvWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9YSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzMzFjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvbW9kZWxxdWVyeS9YSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlhNTEFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLklkUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogQSBDbGFzcyB0byBwcm92aWRlIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gWEhUTUwgZG9jdW1lbnRzIGFuZCBEVERzIGZvcgotICogWEhUTUwuIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGluIEhUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlci4KLSAqLwotLyoKLSAqIFRoaXMgY2xhc3MgY2xvc2VseSByZXNlbWJsZSBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci4KLSAqLwotY2xhc3MgWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgSWRSZXNvbHZlciBpZFJlc29sdmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ2FjaGVkR3JhbW1lclVSSTsKLQlwcml2YXRlIFN0cmluZyBmQ2FjaGVkUHVibGljSUQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFN5c3RlbUlEOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX1FVSUNLX0NBQ0hFID0gdHJ1ZTsKLQotCXB1YmxpYyBYSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBJZFJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY2FjaGUpOwotCQl0aGlzLmlkUmVzb2x2ZXIgPSBpZFJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRYSFRNTENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJU3RyaW5nIGdyYW1tZXJVUkkgPSBudWxsOwotCQlpZiAoVVNFX1FVSUNLX0NBQ0hFKSB7IAotCQkJLy8gSW4gcGFyc2luZyBhIGRvY3VtZW50LCB3ZSBnZXQgbWFueSBpZGVudGlpY2FsIHJlcXVlc3RzIHRvIHRoaXMKLQkJCS8vIG1ldGhvZCwgc28gaW5zdGVhZCBvZiBsb29raW5nIHVwIChyZXNvbHZpbmcpIGdyYW1tZXJVUkkgZWFjaAotCQkJLy8gdGltZSwKLQkJCS8vIHdlJ2xsIGp1c3QgcmV0dXJuIHByZXZpb3VzbHkgY2FjaGVkIG9uZS4gUHJvYmFibHkgbm90IHdvcnRoCi0JCQkvLyBoYXZlIGEKLQkJCS8vIG1vcmUgY29tcGxleCBjYWNoZSB0aGFuIHRoYXQuCi0JCQlpZiAoZkNhY2hlZEdyYW1tZXJVUkkgIT0gbnVsbCAmJiBmQ2FjaGVkUHVibGljSUQuZXF1YWxzKHB1YmxpY0lkKSAmJiBmQ2FjaGVkU3lzdGVtSUQuZXF1YWxzKHN5c3RlbUlkKSkgewotCQkJCWdyYW1tZXJVUkkgPSBmQ2FjaGVkR3JhbW1lclVSSTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdyYW1tZXJVUkkgPSBpZFJlc29sdmVyLnJlc29sdmVJZChwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJCWZDYWNoZWRHcmFtbWVyVVJJID0gZ3JhbW1lclVSSTsKLQkJCQlmQ2FjaGVkUHVibGljSUQgPSBwdWJsaWNJZDsKLQkJCQlmQ2FjaGVkU3lzdGVtSUQgPSBzeXN0ZW1JZDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWdyYW1tZXJVUkkgPSBpZFJlc29sdmVyLnJlc29sdmVJZChwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQl9Ci0KLQkJaWYgKGdyYW1tZXJVUkkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgZ3JhbW1lclVSSSk7Ci0JCXJldHVybiBjbURvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCXJldHVybiBpZFJlc29sdmVyLnJlc29sdmVJZChwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvcHJlZmVyZW5jZXMvSFRNTENvbnRlbnRCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvcHJlZmVyZW5jZXMvSFRNTENvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZGFhOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ByZWZlcmVuY2VzL0hUTUxDb250ZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnByZWZlcmVuY2VzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnByZWZlcmVuY2VzLkNvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQ29udGVudEJ1aWxkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC51dGlsLkRPTUNvbnRlbnRCdWlsZGVySW1wbCB7Ci0KLQlwcml2YXRlIGludCBmVGFnQ2FzZTsKLQlwcml2YXRlIGludCBmQXR0ckNhc2U7Ci0KLQkvKioKLQkgKiBET01Db250ZW50QnVpbGRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBkb2N1bWVudCBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBIVE1MQ29udGVudEJ1aWxkZXIoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIoZG9jdW1lbnQpOwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlmVGFnQ2FzZSA9IHByZWZzLmdldEludChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKTsKLQkJZkF0dHJDYXNlID0gcHJlZnMuZ2V0SW50KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKTsKLQkJLy8JRWxlbWVudCBjYXNlU2V0dGluZ3MgPSBIVE1MUHJlZmVyZW5jZU1hbmFnZXIuZ2V0SFRNTEluc3RhbmNlKCkuZ2V0RWxlbWVudChQcmVmZXJlbmNlTmFtZXMuUFJFRkVSUkVEX0NBU0UpOwotCQkvLwlmVGFnQ2FzZSA9IGNhc2VTZXR0aW5ncy5nZXRBdHRyaWJ1dGUoUHJlZmVyZW5jZU5hbWVzLlRBR05BTUUpOwotCQkvLwlmQXR0ckNhc2UgPSBjYXNlU2V0dGluZ3MuZ2V0QXR0cmlidXRlKFByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVOQU1FKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVOYW1lKENNTm9kZSBjbW5vZGUsIE5vZGUgcGFyZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gc3VwZXIuY29tcHV0ZU5hbWUoY21ub2RlLCBwYXJlbnQpOwotCQkvLyBkb24ndCBjaGFuZ2UgdGhlIGNhc2UgdW5sZXNzIHdlJ3JlIGNlcnRhaW4gaXQgaXMgbWVhbmluZ2xlc3MKLQkJLy8JaWYgKGNtbm9kZSBpbnN0YW5jZW9mIEhUTUxDTU5vZGUgJiYgKChIVE1MQ01Ob2RlKSBjbW5vZGUpLnNob3VsZElnbm9yZUNhc2UoKSkgewotCQlpZiAoc2hvdWxkSWdub3JlQ2FzZShjbW5vZGUpKSB7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQlpZiAoZlRhZ0Nhc2UgPT0gQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJZWxzZSBpZiAoZlRhZ0Nhc2UgPT0gQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJLy8gZWxzZSBkbyBub3RoaW5nCi0JCQl9Ci0JCQllbHNlIGlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaWYgKGZBdHRyQ2FzZSA9PSBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQllbHNlIGlmIChmQXR0ckNhc2UgPT0gQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJLy8gZWxzZSBkbyBub3RoaW5nCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZShDTU5vZGUgY21ub2RlKSB7Ci0JCWlmICghY21ub2RlLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgY21ub2RlLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9BYnN0cmFjdEVycm9ySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0Fic3RyYWN0RXJyb3JJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNmVlODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0Fic3RyYWN0RXJyb3JJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXJyb3JJbmZvIGltcGxlbWVudHMgRXJyb3JJbmZvLCBFcnJvclN0YXRlIHsKLQotCi0JcHJpdmF0ZSBpbnQgc3RhdGUgPSBOT05FX0VSUk9SOwotCXByaXZhdGUgU2VnbWVudCBzZWcgPSBudWxsOwotCi0JcHVibGljIEFic3RyYWN0RXJyb3JJbmZvKGludCBzdGF0ZSwgU2VnbWVudCBzZWcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGF0ZSA9IHN0YXRlOwotCQl0aGlzLnNlZyA9IHNlZzsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldEhpbnQoKTsKLQotCWFic3RyYWN0IHB1YmxpYyBzaG9ydCBnZXRUYXJnZXRUeXBlKCk7Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIChzZWcgPT0gbnVsbCkgPyAwIDogc2VnLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gKHNlZyA9PSBudWxsKSA/IDAgOiBzZWcuZ2V0T2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RhdGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9DTVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9DTVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmMzUxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvQ01VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnZhbGlkYXRlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVscXVlcnkuSE1RVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1maW5hbCBjbGFzcyBDTVV0aWwgewotCi0JLyoqCi0JICogTmV2ZXIgaW5zdGFudGlhdGUhCi0JICovCi0JcHJpdmF0ZSBDTVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogWW91IGNhbm5vdCBhbHdheXMgcmV0cmlldmUgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiB2aWEgYW4gRWxlbWVudCBpbnN0YW5jZS4KLQkgKiBCZWNhdXNlLCBpdCBvY2Nhc2lvbmFsbHkgYSBKU1AgY3VzdG9tIHRhZy4gLS0gOS83LzIwMDEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCU1vZGVsUXVlcnkgcXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvYyk7Ci0JCXJldHVybiBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gISgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZChDTUNvbnRlbnQgY29udGVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gdGFyZ2V0KSB7Ci0JCXN3aXRjaCAoY29udGVudC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQlpZiAoaXNXaG9sZVRhZ09taXNzaWJsZSgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNvbnRlbnQpKQotCQkJCQlpZiAoaXNDaGlsZCgoKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50KS5nZXRDb250ZW50KCksIHRhcmdldCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gaXNTYW1lRGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50LCB0YXJnZXQpOwotCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSAoKENNR3JvdXApIGNvbnRlbnQpLmdldENoaWxkTm9kZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJQ01Ob2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQkJCQlpZiAoaXNXaG9sZVRhZ09taXNzaWJsZSgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkKSkKLQkJCQkJCQkJaWYgKGlzQ2hpbGQoKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQpLmdldENvbnRlbnQoKSwgdGFyZ2V0KSkKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQkJCQlpZiAoaXNDaGlsZCgoQ01Db250ZW50KSBjaGlsZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJfQotCQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5kVGFnT21pc3NpYmxlKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCEoZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgb21pdFR5cGUgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJcmV0dXJuICFvbWl0VHlwZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9OT05FKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaG9sZVRhZ09taXNzaWJsZShDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmICghKGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG9taXRUeXBlID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCXJldHVybiBvbWl0VHlwZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIKTsKLQl9Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hIVE1MKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWV0aG9kIHRvIGRpc3Rpbmd1aXNoIEhUTUwgYW5kIFhIVE1MIGZyb20gb3RoZXIgbWFyayB1cC4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBpcywKLQkgKiAoMSkgbm90IEpTUCwKLQkgKiAoMikgbm90IFNTSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIVE1MKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJcmV0dXJuICghaXNKU1AoZGVjbCkpICYmICghaXNTU0koZGVjbCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYW1lRGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gYURlYywgQ01FbGVtZW50RGVjbGFyYXRpb24gb3RoZXJEZWMpIHsKLQkJcmV0dXJuIGFEZWMuZ2V0RWxlbWVudE5hbWUoKSA9PSBvdGhlckRlYy5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NTSShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjKSB7Ci0JCWlmIChlZGVjID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZWRlYy5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGVkZWMuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsIHRoaXMgbWV0aG9kIG9ubHkgd2hlbiB0aGUgcGFyZW50IGNvbnRlbnQgdHlwZSBpcyBvbmUgb2YKLQkgKiB0aGUgZm9sbG93aW5nOiBBTlksIEVMRU1FTlQsIG9yIE1JWEVELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2hpbGQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzSFRNTChwYXJlbnQpICYmICghaXNIVE1MKGNoaWxkKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJQ01Db250ZW50IGNvbnRlbnQgPSBwYXJlbnQuZ2V0Q29udGVudCgpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNDaGlsZChjb250ZW50LCBjaGlsZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRm9yZWlnbihFbGVtZW50IHRhcmdldCkgewotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBYTUxFbGVtZW50KSkKLQkJCXJldHVybiB0cnVlOwotCQlYTUxFbGVtZW50IGVsZW1lbnQgPSAoWE1MRWxlbWVudCkgdGFyZ2V0OwotCQlyZXR1cm4gIWVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCSAqICgxKSB2YWx1ZSB0eXBlIGlzIEVOVU0sCi0JICogKDIpIG9ubHkgb25lIHZhbHVlIGlzIGRlZmluZWQgaW4gdGhlIGVudW1lcmF0aW9uLAotCSAqICgzKSB0aGUgdmFsdWUgaGFzIHNhbWUgbmFtZSB0byB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm9vbGVhbkF0dHIoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjKSB7Ci0JCUNNRGF0YVR5cGUgYXR0cnR5cGUgPSBhZGVjLmdldEF0dHJUeXBlKCk7Ci0JCWlmIChhdHRydHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXR0cnR5cGUuZ2V0RGF0YVR5cGVOYW1lKCkgIT0gQ01EYXRhVHlwZS5FTlVNKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSBhdHRydHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2YWx1ZXNbMF0uZXF1YWxzKGFkZWMuZ2V0QXR0ck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJbmNsdXNpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgRWxlbWVudCBwYXJlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IEhNUVV0aWwuZ2V0SW5jbHVzaW9ucyhwYXJlbnQpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gaW5jbHVzaW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbihkZWNsLCBpbmNsdXNpb24pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0NvbXBvc2l0ZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0NvbXBvc2l0ZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzVhNjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9Db21wb3NpdGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWFic3RyYWN0IGNsYXNzIENvbXBvc2l0ZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JcHJvdGVjdGVkIFZlY3RvciBjb21wb25lbnRzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogQ29tcG9zaXRlVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCi0JCUl0ZXJhdG9yIGkgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJVmFsaWRhdGlvbkFkYXB0ZXIgY29tcG9uZW50ID0gKFZhbGlkYXRpb25BZGFwdGVyKSBpLm5leHQoKTsKLQkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWNvbXBvbmVudC5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJSXRlcmF0b3IgaSA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0aW9uQ29tcG9uZW50IGNvbXBvbmVudCA9IChWYWxpZGF0aW9uQ29tcG9uZW50KSBpLm5leHQoKTsKLQkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWNvbXBvbmVudC52YWxpZGF0ZShub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgYWRkKFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yKSB7Ci0JCWNvbXBvbmVudHMuYWRkKHZhbGlkYXRvcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVnaXN0ZXJzIGFsbCBjb21wb25lbnRzIGluICd2YWxpZGF0b3JzJy4KLQkgKiBFYWNoIGRlcml2YXRpdmUgbXVzdCBjYWxsIHRoaXMgbWV0aGlkIGluIGl0cyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcihWYWxpZGF0aW9uQ29tcG9uZW50W10gdmFsaWRhdG9ycykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh2YWxpZGF0b3JzW2ldICE9IG51bGwpCi0JCQkJYWRkKHZhbGlkYXRvcnNbaV0pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWVkZmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1jbGFzcyBEb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvciB7Ci0KLQotCXByaXZhdGUgVmFsaWRhdGlvbkNvbXBvbmVudCB2YWxpZGF0b3IgPSBuZXcgSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yKCk7Ci0JcHJpdmF0ZSBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IgcHJvcGFnYXRlZSA9IG5ldyBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKTsKLQotCXB1YmxpYyBEb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlnZXRQcm9wYWdhdGVlKCkuc2V0UmVwb3J0ZXIodGhpcy5yZXBvcnRlcik7Ci0JCXN1cGVyLnZhbGlkYXRlKG5vZGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuY2xhc3MgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQkJdmFsaWRhdG9yLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQkJcHJvcGFnYXRlZS5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC52YWxpZGF0ZS5odG1sLkFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IjZ2V0UHJvcGFnYXRlZSgpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRpb25Db21wb25lbnQgZ2V0UHJvcGFnYXRlZSgpIHsKLQkJcmV0dXJuIHByb3BhZ2F0ZWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC52YWxpZGF0ZS5odG1sLkFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IjZ2V0VmFsaWRhdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdGlvbkFkYXB0ZXIgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMTBiMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0VsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnZhbGlkYXRlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkNvbXBvbmVudDsKLQotY2xhc3MgRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvciB7Ci0KLQotCXByaXZhdGUgVmFsaWRhdGlvbkNvbXBvbmVudCB2YWxpZGF0b3IgPSBuZXcgSFRNTFNpbXBsZVZhbGlkYXRvcigpOwotCi0JcHVibGljIEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuY2xhc3MgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQkJdmFsaWRhdG9yLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnZhbGlkYXRlLmh0bWwuQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvciNnZXRQcm9wYWdhdGVlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvbkNvbXBvbmVudCBnZXRQcm9wYWdhdGVlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnZhbGlkYXRlLmh0bWwuQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvciNnZXRWYWxpZGF0b3IoKQotCSAqLwotCXByb3RlY3RlZCBWYWxpZGF0aW9uQWRhcHRlciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9FcnJvckluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9FcnJvckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjZTJjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvRXJyb3JJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLQotCi1pbnRlcmZhY2UgRXJyb3JJbmZvIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGludCgpOwotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKTsKLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCk7Ci0KLQlwdWJsaWMgaW50IGdldFN0YXRlKCk7Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0VGFyZ2V0VHlwZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9FcnJvckluZm9JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvRXJyb3JJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTAyOTRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9FcnJvckluZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLWZpbmFsIGNsYXNzIEVycm9ySW5mb0ltcGwgZXh0ZW5kcyBBYnN0cmFjdEVycm9ySW5mbyB7Ci0KLQlwcml2YXRlIE5vZGUgdGFyZ2V0ID0gbnVsbDsKLQotCS8vCXByaXZhdGUgU2VnbWVudCBzZWcgPSBudWxsOwotCS8qKgotCSAqLwotCXB1YmxpYyBFcnJvckluZm9JbXBsKGludCBzdGF0ZSwgU2VnbWVudCBlcnJvclNlZywgTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIoc3RhdGUsIGVycm9yU2VnKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIaW50KCkgewotCQlzd2l0Y2ggKHRhcmdldC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotCQkJCXN3aXRjaCAoZ2V0U3RhdGUoKSkgewotCQkJCQljYXNlIFVOREVGSU5FRF9WQUxVRV9FUlJPUiA6Ci0JCQkJCWNhc2UgTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUiA6Ci0JCQkJCWNhc2UgVU5DTE9TRURfQVRUUl9WQUxVRSA6Ci0JCQkJCQkvL0QyMTA0MjIKLQkJCQkJCXJldHVybiAoKEF0dHIpIHRhcmdldCkuZ2V0VmFsdWUoKTsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQlyZXR1cm4gdGFyZ2V0LmdldE5vZGVOYW1lKCk7Ci0JCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJcmV0dXJuICgoVGV4dCkgdGFyZ2V0KS5nZXREYXRhKCk7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiB0YXJnZXQuZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXRUYXJnZXRUeXBlKCkgewotCQlyZXR1cm4gdGFyZ2V0LmdldE5vZGVUeXBlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9FcnJvclN0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvRXJyb3JTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzBlYjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9FcnJvclN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLQotCi1pbnRlcmZhY2UgRXJyb3JTdGF0ZSB7Ci0Jc3RhdGljIGZpbmFsIGludCBOT05FX0VSUk9SID0gMDsKLQkvLyBnZW5lcmljIGVycm9yCi0Jc3RhdGljIGZpbmFsIGludCBVTkRFRklORURfTkFNRV9FUlJPUiA9IDExOwotCXN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEX1ZBTFVFX0VSUk9SID0gMTI7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNNQVRDSEVEX1ZBTFVFX0VSUk9SID0gMTM7Ci0JLy8gZm9ybWF0IGVycm9yCi0Jc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRVJST1JfTEVWRUwgPSAxMDA7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX05BTUVfRVJST1IgPSAxMDE7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0NIQVJfRVJST1IgPSAxMDI7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNNQVRDSEVEX0VSUk9SID0gMTAzOwotCXN0YXRpYyBmaW5hbCBpbnQgTUlTTUFUQ0hFRF9FTkRfVEFHX0VSUk9SID0gMTA0OwotCXN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19TVEFSVF9UQUdfRVJST1IgPSAxMDU7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNTSU5HX0VORF9UQUdfRVJST1IgPSAxMDY7Ci0Jc3RhdGljIGZpbmFsIGludCBVTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SID0gMTA3OwotCXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9BVFRSX0VSUk9SID0gMTA4OwotCXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9ESVJFQ1RJVkVfRVJST1IgPSAxMDk7Ci0Jc3RhdGljIGZpbmFsIGludCBVTkNMT1NFRF9UQUdfRVJST1IgPSAxMTA7Ci0Jc3RhdGljIGZpbmFsIGludCBVTkNMT1NFRF9FTkRfVEFHX0VSUk9SID0gMTExOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRyA9IDExMjsKLQlzdGF0aWMgZmluYWwgaW50IFVOQ0xPU0VEX0FUVFJfVkFMVUUgPSAxMTM7IC8vRDIxMDQyMgotCS8vIGxheW91dCBlcnJvcgotCXN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX0VSUk9SX0xFVkVMID0gMTAwMDsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQ09OVEVOVF9FUlJPUiA9IDEwMDE7Ci0Jc3RhdGljIGZpbmFsIGludCBEVVBMSUNBVEVfRVJST1IgPSAxMDAyOwotCXN0YXRpYyBmaW5hbCBpbnQgQ09FWElTVEVOQ0VfRVJST1IgPSAxMDAzOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9GTVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9GTVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0ZjI0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvRk1VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi1maW5hbCBjbGFzcyBGTVV0aWwgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VHX05PTkUgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19XSE9MRV9UQUcgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19TVEFSVF9UQUcgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19FTkRfVEFHID0gMzsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgRk1VdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU2VnbWVudCBnZXRTZWdtZW50KFhNTE5vZGUgdGFyZ2V0LCBpbnQgc2VnVHlwZSkgewotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFNlZ21lbnQoMCwgMCk7Ci0JCVNlZ21lbnQgc2VnID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnID0gbnVsbDsKLQkJc3dpdGNoIChzZWdUeXBlKSB7Ci0JCQljYXNlIFNFR19XSE9MRV9UQUcgOgotCQkJCXN0YXJ0VGFnID0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCQkJZW5kVGFnID0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQoc3RhcnRUYWcsIGVuZFRhZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSB0YXJnZXQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJaW50IGVuZE9mZnNldCA9IHRhcmdldC5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNFR19TVEFSVF9UQUcgOgotCQkJCXN0YXJ0VGFnID0gdGFyZ2V0LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQoc3RhcnRUYWcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQodGFyZ2V0LmdldFN0YXJ0T2Zmc2V0KCksIDApOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU0VHX0VORF9UQUcgOgotCQkJCWVuZFRhZyA9IHRhcmdldC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kVGFnICE9IG51bGwpIHsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQoZW5kVGFnKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNlZyA9IG5ldyBTZWdtZW50KHRhcmdldC5nZXRFbmRPZmZzZXQoKSwgMCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTRUdfTk9ORSA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IFNlZ21lbnQoMCwgMCk7Ci0JCX0KLQkJcmV0dXJuIHNlZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaGFzSlNQUmVnaW9uKElUZXh0UmVnaW9uIGNvbnRhaW5lcikgewotCQlpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY29udGFpbmVyKS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCByZWdpb25UeXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0hUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9IVE1MQXR0cmlidXRlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1N2EzMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0hUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQXR0cmlidXRlVmFsaWRhdG9yIGV4dGVuZHMgUHJpbWVWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFR0lPTl9OQU1FID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVHSU9OX1ZBTFVFID0gMjsKLQkvLzw8RDIxMDQyMgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7Ci0KLQkvL0QyMTA0MjIKLQkvKioKLQkgKiBIVE1MQXR0cmlidXRlVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTZWdtZW50IGdldEVycm9yU2VnbWVudChYTUxOb2RlIGVycm9yTm9kZSwgaW50IHJlZ2lvblR5cGUpIHsKLQkJSVRleHRSZWdpb24gcmduID0gbnVsbDsKLQkJc3dpdGNoIChyZWdpb25UeXBlKSB7Ci0JCQljYXNlIFJFR0lPTl9OQU1FIDoKLQkJCQlyZ24gPSBlcnJvck5vZGUuZ2V0TmFtZVJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fVkFMVUUgOgotCQkJCXJnbiA9IGVycm9yTm9kZS5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gbm90aGluZyB0byBkby4KLQkJCQlicmVhazsKLQkJfQotCQlpZiAocmduICE9IG51bGwpIHsKLQkJCWlmIChlcnJvck5vZGUgaW5zdGFuY2VvZiBYTUxBdHRyKSB7Ci0JCQkJWE1MRWxlbWVudCBvd25lckVsZW1lbnQgPSAoWE1MRWxlbWVudCkgKChYTUxBdHRyKSBlcnJvck5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJCWlmIChvd25lckVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBvd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZ24pOwotCQkJCQlpbnQgcmVnaW9uTGVuZ3RoID0gcmduLmdldExlbmd0aCgpOwotCQkJCQlyZXR1cm4gbmV3IFNlZ21lbnQocmVnaW9uU3RhcnRPZmZzZXQsIHJlZ2lvbkxlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU2VnbWVudChlcnJvck5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgMCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTEF0dHJpYnV0ZVZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCUVsZW1lbnQgdGFyZ2V0ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChDTVV0aWwuaXNGb3JlaWduKHRhcmdldCkpCi0JCQlyZXR1cm47Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJaWYgKGVkZWMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ01OYW1lZE5vZGVNYXAgZGVjbGFyYXRpb25zID0gZWRlYy5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gdGFyZ2V0LmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpbnQgcmduVHlwZSA9IFJFR0lPTl9OQU1FOwotCQkJaW50IHN0YXRlID0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SOwotCQkJQXR0ciBhID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkvLyBEMjAzNjM3OyBJZiB0aGUgdGFyZ2V0IGF0dHIgaGFzIHByZWZpeCwgdGhlIHZhbGlkYXRvciBzaG91bGQgbm90Ci0JCQkvLyB3YXJuIGFib3V0IGl0LiAgVGhhdCBpcywganVzdCBpZ25vcmUuICBJdCBpcyBhYmxlIHRvIGNoZWNrIHdoZXRoZXIKLQkJCS8vIGFuIGF0dHIgaGFzIHByZWZpeCBvciBub3QgYnkgY2FsbGluZyBYTUxBdHRyI2lzR2xvYmFsQXR0cigpLgotCQkJLy8gV2hlbiBhIGF0dHIgaGFzIHByZWZpeCAobm90IGdsb2JhbCksIGl0IHJldHVybnMgZmFsc2UuCi0JCQlib29sZWFuIGlzWE1MQXR0ciA9IGEgaW5zdGFuY2VvZiBYTUxBdHRyOwotCQkJaWYgKGlzWE1MQXR0cikgewotCQkJCVhNTEF0dHIgeG1sYXR0ciA9IChYTUxBdHRyKSBhOwotCQkJCWlmICgheG1sYXR0ci5pc0dsb2JhbEF0dHIoKSkKLQkJCQkJY29udGludWU7IC8vIHNraXAgZnV0aGVyIHZhbGlkYXRpb24gYW5kIGJlZ2luIG5leHQgbG9vcC4KLQkJCX0KLQotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9ucy5nZXROYW1lZEl0ZW0oYS5nZXROYW1lKCkpOwotCQkJaWYgKGFkZWMgPT0gbnVsbCkgewotCQkJCS8vIE5vIGF0dHIgZGVjbGFyYXRpb24gd2FzIGZvdW5kLiAgVGhhdCBpcywgdGhlIGF0dHIgbmFtZSBpcyB1bmRlZmluZWQuCi0JCQkJLy8gYnV0IG5vdCByZWdhcmQgaXQgYXMgdW5kZWZpbmVkIG5hbWUgaWYgaXQgaW5jbHVkZXMgSlNQCi0JCQkJaWYgKCFGTVV0aWwuaGFzSlNQUmVnaW9uKCgoWE1MTm9kZSkgYSkuZ2V0TmFtZVJlZ2lvbigpKSkgewotCQkJCQlyZ25UeXBlID0gUkVHSU9OX05BTUU7Ci0JCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5VTkRFRklORURfTkFNRV9FUlJPUjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBUaGUgYXR0ciBkZWNsYXJhdGlvbiB3YXMgZm91bmQuCi0JCQkJLy8gQXQgMXN0LCB0aGUgbmFtZSBzaG91bGQgYmUgY2hlY2tlZC4KLQkJCQlpZiAoQ01VdGlsLmlzSFRNTChlZGVjKSAmJiAoIUNNVXRpbC5pc1hIVE1MKGVkZWMpKSkgewotCQkJCQkvLyBJZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgcHVyZSBIVE1MIChub3QgWEhUTUwpLCBzb21lIGF0dHJpYnV0ZXMKLQkJCQkJLy8gbWlnaHQgYmUgd3JpdHRlbiBpbiBib29sZWFuIGZvcm1hdC4gIEl0IHNob3VsZCBiZSBjaGVjayBzcGVjaWZpY2FsbHkuCi0JCQkJCWlmIChDTVV0aWwuaXNCb29sZWFuQXR0cihhZGVjKSAmJiAoKFhNTEF0dHIpIGEpLmhhc05hbWVPbmx5KCkpCi0JCQkJCQljb250aW51ZTsgLy8gT0ssIGtlZXAgZ29pbmcuICBObyBtb3JlIGNoZWNrIGlzIG5lZWRlZCBhZ2FpbnN0IHRoaXMgYXR0ci4KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIElmIHRoZSB0YXJnZXQgaXMgb3RoZXIgdGhhbiBwdXJlIEhUTUwgKEpTUCBvciBYSFRNTCksIHRoZSBuYW1lCi0JCQkJCS8vIG11c3QgYmUgY2hlY2tlZCBleGFjdGx5IChpZSBpbiBjYXNlIHNlbnNpdGl2ZSB3YXkpLgotCQkJCQlTdHJpbmcgYWN0dWFsID0gYS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBkZXNpcmVkID0gYWRlYy5nZXRBdHRyTmFtZSgpOwotCQkJCQlpZiAoIWFjdHVhbC5lcXVhbHMoZGVzaXJlZCkpIHsgLy8gY2FzZSBtaXNtYXRjaAotCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9OQU1FOwotCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLk1JU01BVENIRURfRVJST1I7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gVGhlbiwgdGhlIHZhbHVlIG11c3QgYmUgY2hlY2tlZC4KLQkJCQlpZiAoc3RhdGUgPT0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SKSB7IC8vIE5lZWQgbW9yZSBjaGVjay4KLQkJCQkJLy8gTm93LCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNoZWNrZWQsIGlmIHRoZSB0eXBlIGlzIEVOVU0uCi0JCQkJCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhZGVjLmdldEF0dHJUeXBlKCk7Ci0JCQkJCVN0cmluZyBhY3R1YWxWYWx1ZSA9IGEuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSA9PSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQpIHsKLQkJCQkJCS8vIENoZWNrIEZJWEVEIHZhbHVlLgotCQkJCQkJU3RyaW5nIHZhbGlkVmFsdWUgPSBhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCQkJCWlmICghYWN0dWFsVmFsdWUuZXF1YWxzKHZhbGlkVmFsdWUpKSB7Ci0JCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9WQUxVRTsKLQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuVU5ERUZJTkVEX1ZBTFVFX0VSUk9SOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJU3RyaW5nW10gY2FuZGlkYXRlcyA9IGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQkJCQkJCWlmIChjYW5kaWRhdGVzICE9IG51bGwgJiYgY2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJLy8gc2V2ZXJhbCBjYW5kaWRhdGVzIGFyZSBmb3VuZC4KLQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJCQkJCVN0cmluZyBjYW5kaWRhdGUgPSBjYW5kaWRhdGVzW2luZGV4XTsKLQkJCQkJCQkJLy8gQXQgMXN0LCBjb21wYXJlIGlnbm9yaW5nIGNhc2UuCi0JCQkJCQkJCWlmIChhY3R1YWxWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKGNhbmRpZGF0ZSkpIHsKLQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCWlmIChDTVV0aWwuaXNDYXNlU2Vuc2l0aXZlKGVkZWMpICYmICghYWN0dWFsVmFsdWUuZXF1YWxzKGNhbmRpZGF0ZSkpKSB7Ci0JCQkJCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9WQUxVRTsKLQkJCQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrOyAvLyBleGl0IHRoZSBsb29wLgotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCQkJLy8gTm8gY2FuZGlkYXRlIHdhcyBmb3VuZC4gIFRoYXQgaXMsIGFjdHVhbFZhbHVlIGlzIGludmFsaWQuCi0JCQkJCQkJCS8vIGJ1dCBub3QgcmVnYXJkIGl0IGFzIHVuZGVmaW5lZCB2YWx1ZSBpZiBpdCBpbmNsdWRlcyBKU1AuCi0JCQkJCQkJCWlmICghRk1VdGlsLmhhc0pTUFJlZ2lvbigoKFhNTE5vZGUpIGEpLmdldFZhbHVlUmVnaW9uKCkpKSB7Ci0JCQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLlVOREVGSU5FRF9WQUxVRV9FUlJPUjsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLzw8RDIxMDQyMgotCQkJCWlmIChzdGF0ZSA9PSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsgLy8gTmVlZCBtb3JlIGNoZWNrLgotCQkJCQlpZiAoaXNYTUxBdHRyKSB7Ci0JCQkJCQlTdHJpbmcgc291cmNlID0gKChYTUxBdHRyKSBhKS5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gc291cmNlLmNoYXJBdCgwKTsKLQkJCQkJCQljaGFyIGxhc3RDaGFyID0gc291cmNlLmNoYXJBdChzb3VyY2UubGVuZ3RoKCkgLSAxKTsKLQkJCQkJCQlpZiAoaXNRdW90ZShmaXJzdENoYXIpIHx8IGlzUXVvdGUobGFzdENoYXIpKSB7Ci0JCQkJCQkJCWlmIChsYXN0Q2hhciAhPSBmaXJzdENoYXIpIHsKLQkJCQkJCQkJCXJnblR5cGUgPSBSRUdJT05fVkFMVUU7Ci0JCQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuVU5DTE9TRURfQVRUUl9WQUxVRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvL0QyMTA0MjIKLQkJCX0KLQkJCWlmIChzdGF0ZSAhPSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsKLQkJCQlTZWdtZW50IHNlZyA9IGdldEVycm9yU2VnbWVudCgoWE1MTm9kZSkgYSwgcmduVHlwZSk7Ci0JCQkJaWYgKHNlZyAhPSBudWxsKQotCQkJCQlyZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShuZXcgRXJyb3JJbmZvSW1wbChzdGF0ZSwgc2VnLCBhKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy88PEQyMTQwMjIKLQlwcml2YXRlIGJvb2xlYW4gaXNRdW90ZShjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09IFNJTkdMRV9RVU9URSkgfHwgKGMgPT0gRE9VQkxFX1FVT1RFKTsKLQl9Ci0JLy9EMjEwNDIyCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0hUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9IVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZTI5OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0hUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxUZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgUHJpbWVWYWxpZGF0b3IgewotCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBEaXZpc2lvbiB7Ci0JCXByaXZhdGUgVmVjdG9yIGV4cGxpY2l0SHRtbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCXByaXZhdGUgVmVjdG9yIHJlc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJcHVibGljIERpdmlzaW9uKERvY3VtZW50IGRvY3VtZW50LCBOb2RlTGlzdCBjaGlsZHJlbikgewotCQkJU3RyaW5nIHJvb3RUYWdOYW1lID0gZ2V0Um9vdFRhZ05hbWUoZG9jdW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGlzSHRtbFRhZyhjaGlsZCwgcm9vdFRhZ05hbWUpKSB7Ci0JCQkJCWV4cGxpY2l0SHRtbHMuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3QuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNFeHBsaWNpdEh0bWxzKCkgewotCQkJcmV0dXJuIGV4cGxpY2l0SHRtbHMuc2l6ZSgpID4gMDsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldEV4cGxpY2l0SHRtbHMoKSB7Ci0JCQlyZXR1cm4gZXhwbGljaXRIdG1sczsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBnZXRSZXN0Tm9kZXMoKSB7Ci0JCQlyZXR1cm4gcmVzdC5pdGVyYXRvcigpOwotCQl9Ci0KLQkJLyogdXRpbGl0aWVzICovCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIdG1sVGFnKE5vZGUgbm9kZSwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoRWxlbWVudCkgbm9kZSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSk7Ci0JCX0KLQotCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Um9vdFRhZ05hbWUoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSAoKFhNTERvY3VtZW50KSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGFkYXB0ZXIuZ2V0RG9jdW1lbnRUeXBlKCk7Ci0JCQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZG9jVHlwZS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCS8vIGlzRnJhZ21lbnQgY2hlY2sgc2hvdWxkIGJlIG1vcmUgaW50ZWxsaWdlbnQuCi0JCWJvb2xlYW4gaXNGcmFnbWVudCA9IHRydWU7Ci0JCQotCQlEb2N1bWVudCB0YXJnZXQgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gdGFyZ2V0LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRGl2aXNpb24gZGl2aXNpb24gPSBuZXcgRGl2aXNpb24odGFyZ2V0LCBjaGlsZHJlbik7Ci0JCWlmIChkaXZpc2lvbi5oYXNFeHBsaWNpdEh0bWxzKCkpIHsKLQkJCWlzRnJhZ21lbnQgPSBmYWxzZTsKLQotCQkJTGlzdCBleHBsaWNpdHMgPSBkaXZpc2lvbi5nZXRFeHBsaWNpdEh0bWxzKCk7Ci0JCQlpZiAoZXhwbGljaXRzLnNpemUoKSA+IDEpIHsKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IGV4cGxpY2l0cy5zaXplKCk7IGkrKykgewotCQkJCQlFbGVtZW50IGh0bWwgPSAoRWxlbWVudCkgZXhwbGljaXRzLmdldChpKTsKLQkJCQkJLy8gcmVwb3J0IGVycm9yIChkdXBsaWNhdGUpCi0JCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudCgoWE1MTm9kZSkgaHRtbCwgRk1VdGlsLlNFR19TVEFSVF9UQUcpOwotCQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJCXJlcG9ydGVyLnJlcG9ydChNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKG5ldyBFcnJvckluZm9JbXBsKEVycm9yU3RhdGUuRFVQTElDQVRFX0VSUk9SLCBlcnJvclNlZywgaHRtbCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdmFsaWRhdGVDb250ZW50KGRpdmlzaW9uLmdldFJlc3ROb2RlcygpLCBpc0ZyYWdtZW50KTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kcyB2YWxpZGF0ZSBub2RlcyBvdGhlciB0aGFuIEhUTUwgZWxlbWVudHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29udGVudChJdGVyYXRvciBjaGlsZHJlbiwgYm9vbGVhbiBpc0ZyYWdtZW50KSB7Ci0JCWJvb2xlYW4gZm91bmREb2N0eXBlID0gZmFsc2U7Ci0JCXdoaWxlIChjaGlsZHJlbi5oYXNOZXh0KCkpIHsKLQkJCVhNTE5vZGUgY2hpbGQgPSAoWE1MTm9kZSkgY2hpbGRyZW4ubmV4dCgpOwotCi0JCQlpbnQgZXJyb3IgPSBFcnJvclN0YXRlLk5PTkVfRVJST1I7Ci0JCQlpbnQgc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCi0JCQlzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQkJaWYgKCEgaXNGcmFnbWVudCkgewotCQkJCQkJRWxlbWVudCBjaGlsZEVsZW0gPSAoRWxlbWVudCkgY2hpbGQ7Ci0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjZWQgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24oY2hpbGRFbGVtKTsKLQkJCQkJCS8vIFVuZGVmaW5lZCBlbGVtZW50IGlzIHZhbGlkLgotCQkJCQkJaWYgKGNlZCA9PSBudWxsKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJLy8gSlNQIChpbmNsdWRlcyBjdXN0b20gdGFncykgYW5kIFNTSSBhcmUgdmFsaWQuCi0JCQkJCQlpZiAoQ01VdGlsLmlzRm9yZWlnbihjaGlsZEVsZW0pIHx8IENNVXRpbC5pc1NTSShjZWQpKQotCQkJCQkJCWNvbnRpbnVlOyAvLyBEZWZlY3QgMTg2Nzc0Ci0KLQkJCQkJCS8vIHJlcG9ydCBlcnJvciAoaW52YWxpZCBjb250ZW50KQotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCS8vIG1hcmsgdGhlIHdob2xlIHN0YXJ0IHRhZyBhcyBlcnJvci4KLQkJCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1NUQVJUX1RBRzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQkJaWYgKCEgaXNGcmFnbWVudCkgewotCQkJCQkJLy8gVEVYVCBub2RlIGlzIHZhbGlkIHdoZW4gaXQgY29udGFpbnMgd2hpdGUgc3BhY2UgY2hhcmFjdGVycyBvbmx5LgotCQkJCQkJLy8gT3RoZXJ3aXNlLCBpdCBpcyBpbnZhbGlkIGNvbnRlbnQuCi0JCQkJCQlpZiAoKChYTUxUZXh0KSBjaGlsZCkuaXNXaGl0ZXNwYWNlKCkpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCQkvLyBET0NUWVBFIGlzIGFsc28gdmFsaWQgd2hlbiBpdCBhcHBlYXJzIG9uY2UgYW5kIG9ubHkgb25jZS4KLQkJCQkJaWYgKCFmb3VuZERvY3R5cGUpIHsKLQkJCQkJCWZvdW5kRG9jdHlwZSA9IHRydWU7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQllcnJvciA9IEVycm9yU3RhdGUuRFVQTElDQVRFX0VSUk9SOwotCQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCS8vIGFsd2F5cyB2YWxpZC4KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQkJY29udGludWU7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWlmICghIGlzRnJhZ21lbnQpIHsKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoZXJyb3IgIT0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SKSB7Ci0JCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGNoaWxkLCBzZWdUeXBlKTsKLQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobmV3IEVycm9ySW5mb0ltcGwoZXJyb3IsIGVycm9yU2VnLCBjaGlsZCkpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9IVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGMyNmI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9IVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBleGNsdXNpb24gd2hpY2ggaXMgZGVmaW5lZCBpbiBvbmx5IEhUTUwgRFREIChTR01MKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKENNVXRpbC5pc0ZvcmVpZ24odGFyZ2V0KSkKLQkJCXJldHVybjsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCWlmIChkZWMgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gY2Fubm90IHZhbGlkYXRlLgotCQlpZiAoIUNNVXRpbC5pc0hUTUwoZGVjKSkKLQkJCXJldHVybjsgLy8gbm8gbmVlZCB0byB2YWxpZGF0ZQotCQlpZiAoIWRlYy5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKSkKLQkJCXJldHVybjsgLy8gY2Fubm90IHZhbGlkYXRlLgotCQlDTU5hbWVkTm9kZU1hcCBwcm9oaWJpdGVkID0gKENNTmFtZWROb2RlTWFwKSBkZWMuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUyk7Ci0JCWlmIChwcm9oaWJpdGVkLmdldExlbmd0aCgpIDw9IDApCi0JCQlyZXR1cm47IC8vIG5vIHByb2hpYml0ZWQgYW5jZXN0b3JzLgotCi0JCUVsZW1lbnQgcGFyZW50ID0gU01VdGlsLmdldFBhcmVudEVsZW1lbnQodGFyZ2V0KTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlDTU5vZGUgcGRlYyA9IHByb2hpYml0ZWQuZ2V0TmFtZWRJdGVtKHBhcmVudC5nZXROb2RlTmFtZSgpKTsKLQkJCWlmIChwZGVjICE9IG51bGwpIHsgLy8gcHJvaGliaXRlZCBlbGVtZW50IGlzIGZvdW5kIGluIGFuY2VzdG9ycy4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoKFhNTE5vZGUpIG5vZGUsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobmV3IEVycm9ySW5mb0ltcGwoRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1IsIGVycm9yU2VnLCB0YXJnZXQpKSk7Ci0JCQkJYnJlYWs7IC8vIElmIG9uZSBwcm9oaWJpdGVkIGFuY2VzdG9yIGlzIGZvdW5kLCBpdCdzIGVub3VnaC4KLQkJCX0KLQkJCXBhcmVudCA9IFNNVXRpbC5nZXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0hUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0hUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdjMjI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9IVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBIVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCUVsZW1lbnQgdGFyZ2V0ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChDTVV0aWwuaXNGb3JlaWduKHRhcmdldCkpCi0JCQlyZXR1cm47Ci0KLQkJdmFsaWRhdGVDb250ZW50KHRhcmdldCwgdGFyZ2V0LmdldENoaWxkTm9kZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29udGVudChFbGVtZW50IHBhcmVudCwgTm9kZUxpc3QgY2hpbGRyZW4pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBwZXJmb3JtIGFjdHVhbCB2YWxpZGF0aW9uCi0JCQl2YWxpZGF0ZU5vZGUocGFyZW50LCBjaGlsZCk7Ci0JCX0KLQl9Ci0KLS8vCXByaXZhdGUgaW50IGNvdW50RXhwbGljaXRTaWJsaW5ncyhFbGVtZW50IHBhcmVudCwgU3RyaW5nIHRhZ05hbWUpIHsKLS8vCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0vLwkJaW50IGNvdW50ID0gMDsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLS8vCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0vLwkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotLy8JCQkJY29udGludWU7Ci0vLwkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoKChFbGVtZW50KSBjaGlsZCkuZ2V0VGFnTmFtZSgpKSkgewotLy8JCQkJY291bnQrKzsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gY291bnQ7Ci0vLwl9Ci0KLQkvKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgcHJhY3RpY2FsIGJ1dCBhY2N1cmF0ZS4KLQkgKiBUaGUgYWNjdXJhdGUgbWF4aW11bSBvY2N1cmVuY2Ugc2hvdWxkIGJlIHJldHJlaXZlIGZyb20gdGhlIGNvbnRlbnQgbW9kZWwuCi0JICogSG93ZXZlciwgaXQgaXMgdXNlZnVsIGVub3VnaCwgc2luY2UgYWxtb3N0IGltcGxpY2l0IGVsZW1lbnRzIGFyZSBIVE1MLAotCSAqIEhFQUQsIG9yIEJPRFkuCi0JICovCi0vLwlwcml2YXRlIGludCBnZXRNYXhPY2N1cihFbGVtZW50IHBhcmVudCwgU3RyaW5nIGNoaWxkVGFnKSB7Ci0vLwkJcmV0dXJuIDE7Ci0vLwl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVOb2RlKEVsZW1lbnQgdGFyZ2V0LCBOb2RlIGNoaWxkKSB7Ci0JCS8vIE5PVEU6IElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyAnVU5LTk9XTicsIHRoYXQgaXMsIGl0IGhhcyBubwotCQkvLyBlbGVtZW50IGRlY2xhcmF0aW9uLCB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBlbGVtZW50IHNob3VsZCBiZQotCQkvLyByZWdhcmRlZCBhcyAnQU5ZJy4gLS0gOS8xMC8yMDAxCi0JCWludCBjb250ZW50VHlwZSA9IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWTsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlYyA9IENNVXRpbC5nZXREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudFR5cGUgPSBlZGVjLmdldENvbnRlbnRUeXBlKCk7Ci0KLQkJaW50IGVycm9yID0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SOwotCQlpbnQgc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCi0JCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJRWxlbWVudCBjaGlsZEVsZW0gPSAoRWxlbWVudCkgY2hpbGQ7Ci0JCQkJLy8gRGVmZWN0IDIwMDMyMToKLQkJCQkvLyBUaGlzIHZhbGlkYXRvciBjYXJlcyBvbmx5IEhUTUwvWEhUTUwgZWxlbWVudHMuICBJZiBhIGNoaWxkIGlzCi0JCQkJLy8gYW4gZWxlbWVudCBvZiBmb3JlaWduIG1hcmt1cCBsYW5ndWFnZXMsIGp1c3QgaWdub3JlIGl0LgotCQkJCWlmIChDTVV0aWwuaXNGb3JlaWduKGNoaWxkRWxlbSkpCi0JCQkJCXJldHVybjsKLQotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNlZCA9IENNVXRpbC5nZXREZWNsYXJhdGlvbigoRWxlbWVudCkgY2hpbGQpOwotCQkJCS8vIERlZmVjdCAxODY3NzQ6IElmIGEgY2hpbGQgaXMgbm90IG9uZSBvZiBIVE1MIGVsZW1lbnRzLAotCQkJCS8vIGl0IHNob3VsZCBiZSByZWdhcmRlZCBhcyBhIHZhbGlkIGNoaWxkIHJlZ2FyZGxlc3MgdGhlCi0JCQkJLy8gdHlwZSBvZiB0aGUgcGFyZW50IGNvbnRlbnQgbW9kZWwuIC0tIDEwLzEyLzIwMDEKLQkJCQlpZiAoY2VkID09IG51bGwgfHwgQ01VdGlsLmlzU1NJKGNlZCkgfHwgKCFDTVV0aWwuaXNIVE1MKGNlZCkpKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZIDoKLQkJCQkJCS8vIEtlZXAgZ29pbmcuCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgOgotCQkJCQkJaWYgKGNlZCA9PSBudWxsKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCWlmIChDTVV0aWwuaXNWYWxpZENoaWxkKGVkZWMsIGNlZCkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJLy8gTm93LCBpdCBpcyB0aGUgdGltZSB0byBjaGVjayBpbmNsdXNpb24sIHVubGVzcyB0aGUgdGFyZ2V0Ci0JCQkJCQkvLyBkb2N1bWVudCBpcyBub3QgYSBYSFRNTC4KLQkJCQkJCWlmICghQ01VdGlsLmlzWEhUTUwoZWRlYykpIHsKLQkJCQkJCQkvLyBwdXJlIEhUTUwKLQkJCQkJCQlpZiAoQ01VdGlsLmlzVmFsaWRJbmNsdXNpb24oY2VkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBTVEFSVCB0YWcgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19TVEFSVF9UQUc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZIDoKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBIDoKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSA6Ci0JCQkJCQkvLyBEMTg0MzM5Ci0JCQkJCQkvLyBLZWVwIGdvaW5nLgotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQgOgotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZIDoKLQkJCQkJCWlmICgoKFhNTFRleHQpIGNoaWxkKS5pc1doaXRlc3BhY2UoKSkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBub2RlIGFzIGFuIGVycm9yIHNlZ21lbnQuCi0JCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQlpZiAoY29udGVudFR5cGUgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJCXJldHVybjsKLQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCS8vIE1hcmsgdGhlIHdob2xlIG5vZGUgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCS8vIE1hcmsgdGhlIHdob2xlIG5vZGUgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGVycm9yICE9IEVycm9yU3RhdGUuTk9ORV9FUlJPUikgewotCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KChYTUxOb2RlKSBjaGlsZCwgc2VnVHlwZSk7Ci0JCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQlyZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShuZXcgRXJyb3JJbmZvSW1wbChlcnJvciwgZXJyb3JTZWcsIGNoaWxkKSkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9IVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9IVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2MzBhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1jbGFzcyBIVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IgZXh0ZW5kcyBDb21wb3NpdGVWYWxpZGF0b3IgewotCi0JLyoqCi0JICogSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQotCQlWYWxpZGF0aW9uQ29tcG9uZW50W10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0aW9uQ29tcG9uZW50WzJdOwotCi0JCXZhbGlkYXRvcnNbMF0gPSBuZXcgSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzFdID0gbmV3IFN5bnRheFZhbGlkYXRvcigpOwotCi0JCXJlZ2lzdGVyKHZhbGlkYXRvcnMpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9IVE1MU2ltcGxlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvSFRNTFNpbXBsZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2I2ZmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9IVE1MU2ltcGxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1jbGFzcyBIVE1MU2ltcGxlVmFsaWRhdG9yIGV4dGVuZHMgQ29tcG9zaXRlVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEhUTUxTaW1wbGVWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTFNpbXBsZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQotCQlWYWxpZGF0aW9uQ29tcG9uZW50W10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0aW9uQ29tcG9uZW50WzVdOwotCi0JCXZhbGlkYXRvcnNbMF0gPSBuZXcgSFRNTEF0dHJpYnV0ZVZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzFdID0gbmV3IEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzJdID0gbmV3IFN5bnRheFZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzNdID0gbmV3IEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IoKTsKLQkJdmFsaWRhdG9yc1s0XSA9IG5ldyBOYW1lc3BhY2VWYWxpZGF0b3IoKTsKLQotCQlyZWdpc3Rlcih2YWxpZGF0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MU2ltcGxlVmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0hUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9IVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MTg1YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL0hUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcihWYWxpZGF0aW9uQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBhZGFwdGVyS2V5IGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycyBib29sZWFuCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLQkJCQlyZXR1cm4gbmV3IERvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKTsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXJldHVybiBuZXcgRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IE51bGxWYWxpZGF0b3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQlpbnN0YW5jZSA9IG5ldyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIE9iamVjdCdzIGNsb25lKCkgbWV0aG9kCi0JICogVGhpcyBpcyB1c2VkIGluIElNb2RlbE1hbmFnZXIncyBJU3RydWN0dXJlZE1vZGVsIGNvcHlpbmcuCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvTWVzc2FnZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9NZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjQ2MWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9NZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1jbGFzcyBNZXNzYWdlRmFjdG9yeSBpbXBsZW1lbnRzIEVycm9yU3RhdGUgewotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFcnJvclRhYmxlIHsKLQkJcHJpdmF0ZSBjbGFzcyBQYWNrZXQgewotCQkJcHVibGljIFBhY2tldChTdHJpbmcgbXNnLCBpbnQgc2V2ZXJpdHkpIHsKLQkJCQl0aGlzLm1zZyA9IG1zZzsKLQkJCQl0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJCQlyZXR1cm4gbXNnOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQkJCXJldHVybiBzZXZlcml0eTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBTdHJpbmcgbXNnID0gbnVsbDsKLQkJCXByaXZhdGUgaW50IHNldmVyaXR5ID0gLTE7Ci0JCX0KLQotCQlwdWJsaWMgRXJyb3JUYWJsZSgpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHB1dChpbnQgc3RhdGUsIFN0cmluZyBtc2csIGludCBzZXZlcml0eSkgewotCQkJUGFja2V0IHBhY2tldCA9IG5ldyBQYWNrZXQobXNnLCBzZXZlcml0eSk7Ci0JCQltYXAucHV0KG5ldyBJbnRlZ2VyKHN0YXRlKSwgcGFja2V0KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgc3RhdGUpIHsKLQkJCXJldHVybiBnZXRQYWNrZXQoc3RhdGUpLmdldE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoaW50IHN0YXRlKSB7Ci0JCQlyZXR1cm4gZ2V0UGFja2V0KHN0YXRlKS5nZXRTZXZlcml0eSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQYWNrZXQgZ2V0UGFja2V0KGludCBzdGF0ZSkgewotCQkJcmV0dXJuIChQYWNrZXQpIG1hcC5nZXQobmV3IEludGVnZXIoc3RhdGUpKTsKLQkJfQotCi0JCXByaXZhdGUgSGFzaHRhYmxlIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgTm9kZVR5cGUgewotCQlzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURSA9IDA7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDE7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlRfVFlQRSA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgVEVYVCA9IDM7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVCA9IDQ7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgQ0RBVEFfU0VDVElPTiA9IDU7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgUFJPQ0VTU0lOR19JTlNUUlVDVElPTiA9IDY7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFRkVSRU5DRSA9IDc7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBNQVhfVFlQRSA9IDg7Ci0JfQotCi0JLy8gZXJyb3IgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX05PX0VSUk9SID0gSFRNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVOb19lcnJvci5fVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiTm8gZXJyb3IuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5ERUZJTkVEX0FUVFJfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVVuZGVmaW5lZF9hdHRyaWJ1dGVfbmFtZV8oX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIlVuZGVmaW5lZCBhdHRyaWJ1dGUgbmFtZSAoezB9KS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkRFRklORURfVkFMVUVfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVVuZGVmaW5lZF9hdHRyaWJ1dGVfdmFsdWVfX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIlVuZGVmaW5lZCBhdHRyaWJ1dGUgdmFsdWUgKHswfSkuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfRFVQTElDQVRFX0FUVFJfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJU11bHRpcGxlX3ZhbHVlc19zcGVjaWZpZWRfX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIk11bHRpcGxlIHZhbHVlcyBzcGVjaWZpZWQgZm9yIGFuIGF0dHJpYnV0ZSAoezB9KS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNNQVRDSEVEX0FUVFJfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJUF0dHJpYnV0ZV9uYW1lXyh7MH0pX3VzZXNfX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkF0dHJpYnV0ZSBuYW1lICh7MH0pIHVzZXMgd3JvbmcgY2FzZSBjaGFyYWN0ZXIuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9BVFRSX0VSUk9SID0gSFRNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVJbnZhbGlkX2F0dHJpYnV0ZV9uYW1lXyh7MF9FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJCA9ICJJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lICh7MH0pLiIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0FUVFJfTk9fVkFMVUVfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJUludmFsaWRfYXR0cmlidXRlXyh7MH0pLl9FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJCA9ICJJbnZhbGlkIGF0dHJpYnV0ZSAoezB9KS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJUludmFsaWRfbG9jYXRpb25fb2ZfdGFnXyh7X0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkludmFsaWQgbG9jYXRpb24gb2YgdGFnICh7MH0pLiIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0RVUExJQ0FURV9UQUdfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJUR1cGxpY2F0ZV90YWdfKHswfSkuX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkR1cGxpY2F0ZSB0YWcgKHswfSkuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfTUlTU0lOR19TVEFSVF9UQUdfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJU5vX3N0YXJ0X3RhZ18oPHswfT4pLl9FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJCA9ICJObyBzdGFydCB0YWcgKDx7MH0+KS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNTSU5HX0VORF9UQUdfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJU5vX2VuZF90YWdfKDwvezB9PikuX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIk5vIGVuZCB0YWcgKDwvezB9PikuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiA9IEhUTUxDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlRW5kX3RhZ18oPC97MH0+KV9ub3RfbmVlZGVfRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiRW5kIHRhZyAoPC97MH0+KSBub3QgbmVlZGVkLiIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOREVGSU5FRF9UQUdfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVVua25vd25fdGFnXyh7MH0pLl9FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJCA9ICJVbmtub3duIHRhZyAoezB9KS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNNQVRDSEVEX1RBR19FUlJPUiA9IEhUTUxDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlVGFnX25hbWVfKHswfSlfdXNlc193cm9uZ19fRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiVGFnIG5hbWUgKHswfSkgdXNlcyB3cm9uZyBjYXNlIGNoYXJhY3Rlci4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX1RBR19FUlJPUiA9IEhUTUxDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlSW52YWxpZF90YWdfbmFtZV8oezB9KS5fRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiSW52YWxpZCB0YWcgbmFtZSAoezB9KS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX0RJUkVDVElWRV9FUlJPUiA9IEhUTUxDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlSW52YWxpZF9KU1BfZGlyZWN0aXZlXyh7MH1fRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiSW52YWxpZCBKU1AgZGlyZWN0aXZlICh7MH0pLiIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfVEVYVF9FUlJPUiA9IEhUTUxDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlSW52YWxpZF90ZXh0X3N0cmluZ18oezB9KS5fRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiSW52YWxpZCB0ZXh0IHN0cmluZyAoezB9KS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX0NIQVJfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJUludmFsaWRfY2hhcmFjdGVyX3VzZWRfaW5fX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkludmFsaWQgY2hhcmFjdGVyIHVzZWQgaW4gdGV4dCBzdHJpbmcgKHswfSkuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5LTk9XTl9FUlJPUiA9IEhUTUxDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlVW5rbm93bl9lcnJvci5fRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiVW5rbm93biBlcnJvci4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9TVEFSVF9UQUdfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVN0YXJ0X3RhZ18oPHswfT4pX25vdF9jbG9zX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIlN0YXJ0IHRhZyAoPHswfT4pIG5vdCBjbG9zZWQuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfRU5EX1RBR19FUlJPUiA9IEhUTUxDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlRW5kX3RhZ18oPC97MH0+KV9ub3RfY2xvc2VfRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiRW5kIHRhZyAoPC97MH0+KSBub3QgY2xvc2VkLiIKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfVEFHX0VSUk9SID0gSFRNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVUYWdfKHswfSlfbm90X2Nsb3NlZC5fRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiVGFnICh7MH0pIG5vdCBjbG9zZWQuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfTUlTTUFUQ0hFRF9BVFRSX1ZBTFVFX0VSUk9SID0gSFRNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVBdHRyaWJ1dGVfdmFsdWVfKHswfSlfdXNlc19FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJCA9ICJBdHRyaWJ1dGUgdmFsdWUgKHswfSkgdXNlcyB3cm9uZyBjYXNlIGNoYXJhY3Rlci4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9DT01NRU5UX0VSUk9SID0gSFRNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVDb21tZW50X25vdF9jbG9zZWQuX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkNvbW1lbnQgbm90IGNsb3NlZC4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9ET0NUWVBFX0VSUk9SID0gSFRNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVET0NUWVBFX2RlY2xhcmF0aW9uX25vdF9jbF9FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJCA9ICJET0NUWVBFIGRlY2xhcmF0aW9uIG5vdCBjbG9zZWQuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfUElfRVJST1IgPSBIVE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVByb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25fbm90X0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIlByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm90IGNsb3NlZC4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9DREFUQV9TRUNUSU9OX0VSUk9SID0gSFRNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVDREFUQV9zZWN0aW9uX25vdF9jbG9zZWQuX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkNEQVRBIHNlY3Rpb24gbm90IGNsb3NlZC4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHID0gSFRNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVfRVJST1JfVGFnXyh7MH0pX3Nob3VsZF9iZV9hbl9lbXB0eS1lbGVtZW50X3RhZ18xIik7IC8vJE5PTi1OTFMtMSQgPSAiVGFnICh7MH0pIHNob3VsZCBiZSBhbiBlbXB0eS1lbGVtZW50IHRhZy4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9BVFRSX1ZBTFVFX0VSUk9SID0gSFRNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVfRVJST1JfQXR0cmlidXRlX3ZhbHVlXyh7MH0pX25vdF9jbG9zZWQuXzEiKTsgLy8kTk9OLU5MUy0xJCA9IkF0dHJpYnV0ZSB2YWx1ZSAoezB9KSBub3QgY2xvc2VkLiIKLQlwcml2YXRlIHN0YXRpYyBFcnJvclRhYmxlW10gZXJyVGFibGVzID0gbmV3IEVycm9yVGFibGVbTm9kZVR5cGUuTUFYX1RZUEVdOwotCi0Jc3RhdGljIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBOb2RlVHlwZS5NQVhfVFlQRTsgaSsrKSB7Ci0JCQllcnJUYWJsZXNbaV0gPSBuZXcgRXJyb3JUYWJsZSgpOwotCQl9Ci0JCS8vIE5PVEU6IFRoZSBzZXZlcml0aWVzIGFyZSBqdXN0IHN0dWIuICBUaGV5IG11c3QgYmUgcmV2aWV3ZWQuCi0JCS8vIC0tIDgvMzAvMjAwMQotCi0JCS8vIGF0dHJpYnV0ZSBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBhdHRyVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQVRUUklCVVRFXTsvLyBzaG9ydCBoYW5kCi0JCWF0dHJUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJYXR0clRhYmxlLnB1dChVTkRFRklORURfTkFNRV9FUlJPUiwgTVNHX1VOREVGSU5FRF9BVFRSX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJYXR0clRhYmxlLnB1dChVTkRFRklORURfVkFMVUVfRVJST1IsIE1TR19VTkRFRklORURfVkFMVUVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlhdHRyVGFibGUucHV0KE1JU01BVENIRURfRVJST1IsIE1TR19NSVNNQVRDSEVEX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlhdHRyVGFibGUucHV0KElOVkFMSURfTkFNRV9FUlJPUiwgTVNHX0lOVkFMSURfQVRUUl9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWF0dHJUYWJsZS5wdXQoSU5WQUxJRF9BVFRSX0VSUk9SLCBNU0dfQVRUUl9OT19WQUxVRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWF0dHJUYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlhdHRyVGFibGUucHV0KE1JU01BVENIRURfVkFMVUVfRVJST1IsIE1TR19NSVNNQVRDSEVEX0FUVFJfVkFMVUVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJLy88PEQyMTA0MjIKLQkJYXR0clRhYmxlLnB1dChVTkNMT1NFRF9BVFRSX1ZBTFVFLCBNU0dfVU5DTE9TRURfQVRUUl9WQUxVRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCS8vRDIxMDQyMgotCQkvLyBlbGVtZW50IGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGVsZW1UYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsvLyBzaG9ydCBoYW5kCi0JCWVsZW1UYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJZWxlbVRhYmxlLnB1dChVTkRFRklORURfTkFNRV9FUlJPUiwgTVNHX1VOREVGSU5FRF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQllbGVtVGFibGUucHV0KElOVkFMSURfTkFNRV9FUlJPUiwgTVNHX0lOVkFMSURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCWVsZW1UYWJsZS5wdXQoTUlTTUFUQ0hFRF9FUlJPUiwgTVNHX01JU01BVENIRURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxlbVRhYmxlLnB1dChNSVNNQVRDSEVEX0VORF9UQUdfRVJST1IsIE1TR19NSVNNQVRDSEVEX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQllbGVtVGFibGUucHV0KE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBNU0dfTUlTU0lOR19TVEFSVF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJZWxlbVRhYmxlLnB1dChNSVNTSU5HX0VORF9UQUdfRVJST1IsIE1TR19NSVNTSU5HX0VORF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQllbGVtVGFibGUucHV0KFVOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IsIE1TR19VTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0RJUkVDVElWRV9FUlJPUiwgTVNHX0lOVkFMSURfRElSRUNUSVZFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCWVsZW1UYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxlbVRhYmxlLnB1dChEVVBMSUNBVEVfRVJST1IsIE1TR19EVVBMSUNBVEVfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxlbVRhYmxlLnB1dChDT0VYSVNURU5DRV9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWVsZW1UYWJsZS5wdXQoVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfU1RBUlRfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCWVsZW1UYWJsZS5wdXQoVU5DTE9TRURfRU5EX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0VORF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHLCBNU0dfSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0KLQkJLy8gZG9jdW1lbnQgdHlwZSBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBkb2NUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsvLyBzaG9ydCBoYW5kCi0JCWRvY1RhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQlkb2NUYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlkb2NUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZG9jVGFibGUucHV0KFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0RPQ1RZUEVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQotCQkvLyB0ZXh0IGVycm9yIG1hcAotCQlFcnJvclRhYmxlIHRleHRUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5URVhUXTsKLQkJdGV4dFRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQl0ZXh0VGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfVEVYVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCXRleHRUYWJsZS5wdXQoSU5WQUxJRF9DSEFSX0VSUk9SLCBNU0dfSU5WQUxJRF9DSEFSX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQotCQkvLyBjb21tZW50IGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGNvbW1UYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5DT01NRU5UXTsKLQkJY29tbVRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQljb21tVGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWNvbW1UYWJsZS5wdXQoVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfQ09NTUVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCi0JCS8vIGNkYXRhIHNlY3Rpb24gZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgY2RhdFRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkNEQVRBX1NFQ1RJT05dOwotCQljZGF0VGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0JCWNkYXRUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJY2RhdFRhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9DREFUQV9TRUNUSU9OX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0KLQkJLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBwaVRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05dOwotCQlwaVRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQlwaVRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlwaVRhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9QSV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCi0JCS8vIGVudGl0eSByZWZlcmVuY2UgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgZXJUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFXTsKLQkJZXJUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJZXJUYWJsZS5wdXQoVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZXJUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25NZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoRXJyb3JJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGVycm9yTXNnID0gZ2V0RXJyb3JNZXNzYWdlKGluZm8pOwotCQlpbnQgZXJyb3JTZXZlcml0eSA9IGdldEVycm9yU2V2ZXJpdHkoaW5mbyk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3JNc2csIGluZm8uZ2V0T2Zmc2V0KCksIGluZm8uZ2V0TGVuZ3RoKCksIGVycm9yU2V2ZXJpdHkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoRXJyb3JJbmZvIGluZm8pIHsKLQkJRXJyb3JUYWJsZSB0YWIgPSBnZXRFcnJvclRhYmxlKGluZm8uZ2V0VGFyZ2V0VHlwZSgpKTsKLQkJaWYgKHRhYiA9PSBudWxsKQotCQkJcmV0dXJuIE1TR19VTktOT1dOX0VSUk9SOwotCi0JCVN0cmluZyB0ZW1wbGF0ZSA9IHRhYi5nZXRNZXNzYWdlKGluZm8uZ2V0U3RhdGUoKSk7Ci0JCU9iamVjdFtdIGFyZ3VtZW50cyA9IHtpbmZvLmdldEhpbnQoKX07Ci0JCVN0cmluZyBzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXMgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCh0ZW1wbGF0ZSwgYXJndW1lbnRzKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlzID0gdGVtcGxhdGUgKyAiOiIgKyBhcmd1bWVudHMudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRFcnJvclNldmVyaXR5KEVycm9ySW5mbyBpbmZvKSB7Ci0JCUVycm9yVGFibGUgdGFiID0gZ2V0RXJyb3JUYWJsZShpbmZvLmdldFRhcmdldFR5cGUoKSk7Ci0JCWlmICh0YWIgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gdGFiLmdldFNldmVyaXR5KGluZm8uZ2V0U3RhdGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXJyb3JUYWJsZSBnZXRFcnJvclRhYmxlKHNob3J0IG5vZGV0eXBlKSB7Ci0JCUVycm9yVGFibGUgdGFiID0gbnVsbDsKLQkJc3dpdGNoIChub2RldHlwZSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQVRUUklCVVRFXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5URVhUXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5DT01NRU5UXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5DREFUQV9TRUNUSU9OXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFXTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0YWI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9OYW1lc3BhY2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9OYW1lc3BhY2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlNjA1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvTmFtZXNwYWNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciBpbXBsZW1lbnRzIEVycm9yU3RhdGUgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTE5TX1BSRUZJWCA9ICJ4bWxucyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOU19TRVBBUkFUT1IgPSAiOiI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIE5hbWVzcGFjZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gTmFtZXNwYWNlVmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKGlzWE1MRWxlbWVudCh0YXJnZXQpICYmIGhhc1Vua25vd25QcmVmaXgodGFyZ2V0KSkgewotCQkJWE1MRWxlbWVudCBlID0gKFhNTEVsZW1lbnQpIHRhcmdldDsKLQkJCWlmICghaXNWYWxpZFByZWZpeChlLmdldFByZWZpeCgpLCB0YXJnZXQpICYmICFlLmlzQ29tbWVudFRhZygpKSB7Ci0JCQkJLy8gcmVwb3J0IHVua25vd24gdGFnIGVycm9yLgotCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudChlLCBGTVV0aWwuU0VHX1NUQVJUX1RBRyk7Ci0JCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCXJlcG9ydGVyLnJlcG9ydChNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKG5ldyBFcnJvckluZm9JbXBsKFVOREVGSU5FRF9OQU1FX0VSUk9SLCBlcnJvclNlZywgZSkpKTsKLQkJCX0KLQkJfQotCQkvLyAoMikgY2hlY2sgcHJlZml4IG9mIGVhY2ggYXR0ciAKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gdGFyZ2V0LmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG4gPSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKCEobiBpbnN0YW5jZW9mIFhNTEF0dHIpKQotCQkJCWNvbnRpbnVlOwotCQkJWE1MQXR0ciBhID0gKFhNTEF0dHIpIG47Ci0JCQlTdHJpbmcgcHJlZml4ID0gYS5nZXRQcmVmaXgoKTsKLQkJCWlmICgocHJlZml4ICE9IG51bGwpICYmIGlzVW5rbm93bkF0dHIoYSwgdGFyZ2V0KSkgewotCQkJCS8vIFRoZSBhdHRyIGhhcyB1bmtub3duIHByZWZpeC4gIFNvLCBjaGVjayBpdC4KLQkJCQlpZiAoIWlzVmFsaWRQcmVmaXgocHJlZml4LCB0YXJnZXQpKSB7Ci0JCQkJCS8vIHJlcG9ydCB1bmtub3duIGF0dHIgZXJyb3IuCi0JCQkJCUlUZXh0UmVnaW9uIHIgPSBhLmdldE5hbWVSZWdpb24oKTsKLQkJCQkJaWYgKHIgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpbnQgYV9vZmZzZXQgPSBhLmdldE5hbWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQlpbnQgYV9sZW5ndGggPSBhLmdldE5hbWVSZWdpb24oKS5nZXRMZW5ndGgoKTsKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobmV3IEVycm9ySW5mb0ltcGwoVU5ERUZJTkVEX05BTUVfRVJST1IsIG5ldyBTZWdtZW50KGFfb2Zmc2V0LCBhX2xlbmd0aCksIGEpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBtZXRob2RzCQotCXByaXZhdGUgYm9vbGVhbiBpc1hNTEVsZW1lbnQoRWxlbWVudCB0YXJnZXQpIHsKLQkJcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFhNTEVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1Vua25vd25QcmVmaXgoRWxlbWVudCB0YXJnZXQpIHsKLQkJcmV0dXJuIGlzVW5rbm93bkVsZW1lbnQodGFyZ2V0KSAmJiBDTVV0aWwuaXNGb3JlaWduKHRhcmdldCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5rbm93bkVsZW1lbnQoRWxlbWVudCB0YXJnZXQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCXJldHVybiBkZWMgPT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmtub3duQXR0cihYTUxBdHRyIGF0dHIsIEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlYyA9IENNVXRpbC5nZXREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlpZiAoZGVjID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gdW5rbm93bi4KLQkJQ01OYW1lZE5vZGVNYXAgYWRlY2xzID0gZGVjLmdldEF0dHJpYnV0ZXMoKTsKLQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGFkZWNscy5nZXROYW1lZEl0ZW0oYXR0ci5nZXROYW1lKCkpOwotCQlyZXR1cm4gYWRlYyA9PSBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUHJlZml4KFN0cmluZyBwcmVmaXgsIEVsZW1lbnQgZSkgewotCQlpZiAocHJlZml4LmVxdWFscyhYTUxOU19QUkVGSVgpKQotCQkJcmV0dXJuIHRydWU7IC8vICJ4bWxuczpmb28iIGF0dHIgaXMgYWx3YXlzIHZhbGlkLgotCi0JCS8vICgxKSBjaGVjayB0aGUgZWxlbWVudCBoYXMgdGhlIG5hbWVzcGFjZSBkZWZpbml0aW9uIG9yIG5vdC4KLQkJaWYgKGlzVmFsaWRQcmVmaXhXaXRoaW5FbGVtZW50KHByZWZpeCwgZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyAoMikgY2hlY2sgYW5jZXN0b3JzIG9mIHRoZSBlbGVtZW50IGhhdmUgdGhlIG5hbWVzcGFjZSBkZWZpbml0aW9uIG9yIG5vdC4KLQkJRWxlbWVudCBwYXJlbnQgPSBTTVV0aWwuZ2V0UGFyZW50RWxlbWVudChlKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAoaXNWYWxpZFByZWZpeFdpdGhpbkVsZW1lbnQocHJlZml4LCBwYXJlbnQpKQotCQkJCXJldHVybiB0cnVlOwotCQkJcGFyZW50ID0gU01VdGlsLmdldFBhcmVudEVsZW1lbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQcmVmaXhXaXRoaW5FbGVtZW50KFN0cmluZyBwcmVmaXgsIEVsZW1lbnQgZSkgewotCQlTdHJpbmcgbnMgPSBYTUxOU19QUkVGSVggKyBOU19TRVBBUkFUT1IgKyBwcmVmaXg7Ci0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IGUuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAobiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG5zLmVxdWFscygoKEF0dHIpIG4pLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvTnVsbFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3ZhbGlkYXRlL051bGxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5Y2JjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvTnVsbFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkNvbXBvbmVudDsKLQotLyoqCi0gKiBOdWxsVmFsaWRhdG9yIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGEgcmVwbGFjZW1lbnQgb2YgbnVsbAotICogZm9yIFZhbGlkYXRpb25Db21wb25lbnQgdHlwZS4KLSAqLwotZmluYWwgY2xhc3MgTnVsbFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JcHVibGljIE51bGxWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJcmV0dXJuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvUHJpbWVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9QcmltZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc4YTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9QcmltZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1hYnN0cmFjdCBjbGFzcyBQcmltZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JLyoqCi0JICogUHJpbWVWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUHJpbWVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9TTVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9TTVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhZGNmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvU01VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWZpbmFsIGNsYXNzIFNNVXRpbCB7Ci0KLQlwcml2YXRlIFNNVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiBnZXQgYW4gYW5jZXN0b3IgZWxlbWVudCBpZ25vcmluZyBpbXBsaWNpdCBvbmVzLiAqLwotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50KE5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIHAgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwICE9IG51bGwpIHsKLQkJCWlmIChwLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlyZXR1cm4gKEVsZW1lbnQpIHA7Ci0JCQl9Ci0JCQlwID0gcC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9TZWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTVkYjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9TZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIFNlZ21lbnQgewotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JLyoqCi0JICovCi0JcHVibGljIFNlZ21lbnQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIFNlZ21lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vZmZzZXQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJdGhpcy5sZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogTk9URTogJ3N0YXJ0JyBhbmQgJ2VuZCcgbXVzdCBiZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgY29udGlndW91cyByZWdpb25zLgotCSAqIE90aGVyd2lzZSwgdGhpcyBjbGFzcyBjYW5ub3Qgd29yayBjb3JyZWN0bHkuCi0JICovCi0JcHVibGljIFNlZ21lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vZmZzZXQgPSBzdGFydC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kT2Zmc2V0ID0gKGVuZCA9PSBudWxsKSA/IHN0YXJ0LmdldEVuZE9mZnNldCgpIDogZW5kLmdldEVuZE9mZnNldCgpOwotCQl0aGlzLmxlbmd0aCA9IGVuZE9mZnNldCAtIHRoaXMub2Zmc2V0OwotCX0KLQotCS8vcHVibGljIFNlZ21lbnQoSVRleHRSZWdpb24gc3RhcnQsIElUZXh0UmVnaW9uIGVuZCkgewotCS8vCXN1cGVyKCk7Ci0JLy8JdGhpcy5vZmZzZXQgPSBzdGFydC5nZXRTdGFydE9mZnNldCgpOwotCS8vCWludCBlbmRPZmZzZXQgPSAoZW5kID09IG51bGwpID8gc3RhcnQuZ2V0RW5kT2Zmc2V0KCkgOiBlbmQuZ2V0RW5kT2Zmc2V0KCk7Ci0JLy8JdGhpcy5sZW5ndGggPSBlbmRPZmZzZXQgLSB0aGlzLm9mZnNldDsKLQkvL30KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9TeW50YXhWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS92YWxpZGF0ZS9TeW50YXhWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiMjE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdmFsaWRhdGUvU3ludGF4VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnZhbGlkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LkludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Tb3VyY2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotY2xhc3MgU3ludGF4VmFsaWRhdG9yIGV4dGVuZHMgUHJpbWVWYWxpZGF0b3IgaW1wbGVtZW50cyBFcnJvclN0YXRlIHsKLQotCi0Jc3RhdGljIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUmVnaW9uKElUZXh0UmVnaW9uIHJnbikgewotCQlTdHJpbmcgdHlwZSA9IHJnbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIG5vIHR5cGUgaXMgaW52YWxpZC4KLQkJaWYgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOIHx8IHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgdHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFnTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZykgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZy5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmduID0gKElUZXh0UmVnaW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZ24uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKQotCQkJCXJldHVybiB0YWcuZ2V0VGV4dChyZ24pOwotCQl9Ci0JCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHByaXZhdGUgYm9vbGVhbiBpc0VtcHR5Q29udGVudChDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCXJldHVybiAoZGVjbCAhPSBudWxsKSAmJiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKTsKLQl9Ci0KLQlwdWJsaWMgU3ludGF4VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBTeW50YXhWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCWNsYXNzIEVsZW1lbnRJbmZvIHsKLQkJcHVibGljIEVsZW1lbnRJbmZvKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBYTUxFbGVtZW50IHRhcmdldCA9IG51bGw7Ci0JCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbnVsbDsKLQkJcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWcgPSBudWxsOwotCQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWcgPSBudWxsOwotCQlwdWJsaWMgYm9vbGVhbiBoYXNTdGFydFRhZyA9IGZhbHNlOwotCQlwdWJsaWMgYm9vbGVhbiBoYXNFbmRUYWcgPSBmYWxzZTsKLQkJcHVibGljIGJvb2xlYW4gaXNYSFRNTCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUpIHsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGluZGV4ZWROb2RlOwotCQl2YWxpZGF0ZUNoaWxkcmVuKG5vZGUpOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm47Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBYTUxFbGVtZW50KSkKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW5mbyBpbmZvID0gbmV3IEVsZW1lbnRJbmZvKCk7Ci0JCWluZm8udGFyZ2V0ID0gKFhNTEVsZW1lbnQpIG5vZGU7Ci0KLQkJLy8gZ2F0aGVyIGluZm9ybWF0aW9uIHRvIHZhbGlkYXRlIGZyb20gdGFyZ2V0IGF0IG9uY2UuCi0JCWdldEluZm8oaW5mbyk7Ci0KLQkJaWYgKGluZm8udGFyZ2V0LmlzR2xvYmFsVGFnKCkpIHsKLQkJCXZhbGlkYXRlVGFncyhpbmZvKTsKLQkJCXZhbGlkYXRlTmFtZXMoaW5mbyk7Ci0JCQlpZiAoaW5mby5kZWNsICE9IG51bGwgJiYgaW5mby5pc1hIVE1MKSB7Ci0JCQkJdmFsaWRhdGVUYWdDYXNlKGluZm8pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEluZm8oRWxlbWVudEluZm8gaW5mbykgewotCQlpbmZvLmRlY2wgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24oaW5mby50YXJnZXQpOwotCQlpbmZvLnN0YXJ0VGFnID0gaW5mby50YXJnZXQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaW5mby5lbmRUYWcgPSBpbmZvLnRhcmdldC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQlpbmZvLmhhc1N0YXJ0VGFnID0gKGluZm8uc3RhcnRUYWcgIT0gbnVsbCk7Ci0JCWluZm8uaGFzRW5kVGFnID0gKGluZm8uZW5kVGFnICE9IG51bGwpOwotCi0JCURvY3VtZW50IGRvYyA9IGluZm8udGFyZ2V0LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKCEoZG9jIGluc3RhbmNlb2YgWE1MRG9jdW1lbnQpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdHlwZWlkID0gKChYTUxEb2N1bWVudCkgZG9jKS5nZXREb2N1bWVudFR5cGVJZCgpOwotCQlpZiAodHlwZWlkICE9IG51bGwpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVudHJ5KHR5cGVpZCk7Ci0JCQlpbmZvLmlzWEhUTUwgPSAoZW50cnkgIT0gbnVsbCAmJiBlbnRyeS5pc1hNTFR5cGUoKSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYWdFcnJvckluZm9JbXBsIGV4dGVuZHMgQWJzdHJhY3RFcnJvckluZm8gewotCQlwcml2YXRlIFN0cmluZyBoaW50ID0gbnVsbDsKLQotCQlwdWJsaWMgVGFnRXJyb3JJbmZvSW1wbChpbnQgc3RhdGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnLCBTdHJpbmcgaGludCkgewotCQkJc3VwZXIoc3RhdGUsIG5ldyBTZWdtZW50KHRhZykpOwotCQkJdGhpcy5oaW50ID0gaGludDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SGludCgpIHsKLQkJCXJldHVybiBoaW50OwotCQl9Ci0KLQkJcHVibGljIHNob3J0IGdldFRhcmdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gTm9kZS5FTEVNRU5UX05PREU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWdDb3JydXB0ZWQoRWxlbWVudEluZm8gaW5mbykgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGluZm8uZW5kVGFnLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSXRlcmF0b3IgaXRlciA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZ24gPSAoSVRleHRSZWdpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFpc1ZhbGlkUmVnaW9uKHJnbikpCi0JCQkJcmV0dXJuIHRydWU7IC8vIGZvdW5kIGludmFsaWQgcmVnaW9uIHR5cGUuCi0JCX0KLQkJcmV0dXJuIGZhbHNlOyAvLyBhbGwgcmVnaW9ucyBhcmUgdmFsaWQuCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RW5kVGFnRnVsbFRleHQoRWxlbWVudEluZm8gaW5mbykgewotCQlTdHJpbmcgaGludCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBpbmZvLmVuZFRhZy5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmduID0gKElUZXh0UmVnaW9uKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmduLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gfHwgdHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpCi0JCQkJY29udGludWU7Ci0JCQloaW50ICs9IGluZm8uZW5kVGFnLmdldEZ1bGxUZXh0KHJnbik7Ci0JCX0KLQkJcmV0dXJuIGhpbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydENvcnJ1cHRlZEVuZFRhZ0Vycm9yKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGhpbnQgPSBnZXRFbmRUYWdGdWxsVGV4dChpbmZvKTsKLQkJVGFnRXJyb3JJbmZvSW1wbCBlcnJvciA9IG5ldyBUYWdFcnJvckluZm9JbXBsKFVOREVGSU5FRF9OQU1FX0VSUk9SLCBpbmZvLmVuZFRhZywgaGludCk7Ci0JCXRoaXMucmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoZXJyb3IpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVUYWdzKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJaWYgKGluZm8uaGFzU3RhcnRUYWcpIHsKLQkJCWlmICghaW5mby50YXJnZXQuaXNTdGFydFRhZ0Nsb3NlZCgpKSB7Ci0JCQkJLy8gTWFyayB0aGUgd2hvbGUgU1RBUlQgdGFnIGFzIGFuIGVycm9yIHNlZ21lbnQuCi0JCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGluZm8uc3RhcnRUYWcpOwotCQkJCXJlcG9ydChVTkNMT1NFRF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoaW5mby5oYXNFbmRUYWcpIHsKLQkJCQlpZiAoaW5mby5kZWNsICE9IG51bGwpIHsKLQkJCQkJaWYgKENNVXRpbC5pc0hUTUwoaW5mby5kZWNsKSAmJiAhaW5mby50YXJnZXQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCQlpZiAoaW5mby50YXJnZXQuaXNDb250YWluZXIoKSkgewotCQkJCQkJCS8vIFNldCB0aGUgZXJyb3IgbWFyayB0byB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQuCi0JCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGluZm8udGFyZ2V0LmdldFN0YXJ0T2Zmc2V0KCksIDApOwotCQkJCQkJCXJlcG9ydChNSVNTSU5HX1NUQVJUX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIE1hcmsgdGhlIHdob2xlIEVORCB0YWcgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby5lbmRUYWcpOwotCQkJCQkJCXJlcG9ydChVTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGluZm8uaXNYSFRNTCkgewotCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGluZm8udGFyZ2V0LmdldFN0YXJ0T2Zmc2V0KCksIDApOwotCQkJCQkJcmVwb3J0KE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGluZm8uaGFzRW5kVGFnKSB7Ci0JCQlpZiAoIWluZm8udGFyZ2V0LmlzQ2xvc2VkKCkpIHsKLQkJCQkvLyBTZXQgdGhlIHdob2xlIEVORCB0YWcgYXMgZXJyb3Igc2VnbWVudC4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby5lbmRUYWcpOwotCQkJCXJlcG9ydChVTkNMT1NFRF9FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGluZm8uaXNYSFRNTCkgeyAvLyBYSFRNTAotCQkJCWlmICghaW5mby50YXJnZXQuaXNFbXB0eVRhZygpKSB7Ci0JCQkJCWlmIChpc0VtcHR5Q29udGVudChpbmZvLmRlY2wpKSB7Ci0JCQkJCQkvLyBFTVBUWSBlbGVtZW50IHNob3VsZCBiZSB3cml0dGVuIGluIDwuLi4vPiBmb3JtLgotCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGluZm8udGFyZ2V0LCBGTVV0aWwuU0VHX1NUQVJUX1RBRyk7Ci0JCQkJCQlyZXBvcnQoSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGVuZCB0YWcgaXMgcmVxdWlyZWQuCi0JCQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby50YXJnZXQuZ2V0RW5kT2Zmc2V0KCksIDApOwotCQkJCQkJcmVwb3J0KE1JU1NJTkdfRU5EX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgeyAvLyBIVE1MCi0JCQkJaWYgKGluZm8uaGFzU3RhcnRUYWcpIHsKLQkJCQkJaWYgKGluZm8uZGVjbCAhPSBudWxsICYmIENNVXRpbC5pc0hUTUwoaW5mby5kZWNsKSAmJiAhaW5mby50YXJnZXQuaXNFbXB0eVRhZygpICYmICFDTVV0aWwuaXNFbmRUYWdPbWlzc2libGUoaW5mby5kZWNsKSkgewotCQkJCQkJLy8gU2V0IHRoZSBlcnJvciBtYXJrIHRvIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuCi0JCQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby50YXJnZXQuZ2V0RW5kT2Zmc2V0KCksIDApOwotCQkJCQkJcmVwb3J0KE1JU1NJTkdfRU5EX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIHBlcmZvcm0gdmFsaWRhdGlvbiBhYm91dCB0YWcgbmFtZSBkZWZpbml0aW9uLiAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU5hbWVzKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJYm9vbGVhbiBjb3JydXB0ZWQgPSBpbmZvLmhhc0VuZFRhZyAmJiBpc0VuZFRhZ0NvcnJ1cHRlZChpbmZvKTsKLQkJaWYgKGluZm8uZGVjbCA9PSBudWxsKSB7Ci0JCQkvLyBJZiBubyBkZWNsYXJhdGlvbiBpcyByZXRyaWV2ZWQsIHRoZSB0YXJnZXQgaXMgcmVhbGx5Ci0JCQkvLyB1bmtub3duIGVsZW1lbnQuCi0JCQlpZiAoIWluZm8uaGFzU3RhcnRUYWcgJiYgY29ycnVwdGVkKSB7Ci0JCQkJcmVwb3J0Q29ycnVwdGVkRW5kVGFnRXJyb3IoaW5mbyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoaW5mby50YXJnZXQsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQlyZXBvcnQoVU5ERUZJTkVEX05BTUVfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBFdmVuIGlmIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmV0cmlldmVkLCBpZiB0aGUgZW5kCi0JCQkvLyB0YWcgaXMgY29ycnVwdGVkLCBpdCBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgdW5kZWZpbmVkCi0JCQkvLyBuYW1lLiAoRDIwMjQ5MykKLQkJCWlmIChjb3JydXB0ZWQpIHsKLQkJCQlyZXBvcnRDb3JydXB0ZWRFbmRUYWdFcnJvcihpbmZvKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIHBlcmZvcm0gdmFsaWRhdGlvbiB0YWcgY2FzZSBvbmx5IGZvciBYSFRNTCBkb2N1bWVudCAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVRhZ0Nhc2UoRWxlbWVudEluZm8gaW5mbykgewotCQlTdHJpbmcgZGVjbGFyZWQgPSBpbmZvLmRlY2wuZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnTmFtZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGVuZFRhZ05hbWUgPSAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChkZWNsYXJlZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIHN0YXJ0IHRhZwotCQlpZiAoaW5mby5oYXNTdGFydFRhZykgewotCQkJc3RhcnRUYWdOYW1lID0gZ2V0VGFnTmFtZShpbmZvLnN0YXJ0VGFnKTsKLQkJCWlmICghZGVjbGFyZWQuZXF1YWxzKHN0YXJ0VGFnTmFtZSkpIHsKLQkJCQlUYWdFcnJvckluZm9JbXBsIGVycm9yID0gbmV3IFRhZ0Vycm9ySW5mb0ltcGwoTUlTTUFUQ0hFRF9FUlJPUiwgaW5mby5zdGFydFRhZywgc3RhcnRUYWdOYW1lKTsKLQkJCQl0aGlzLnJlcG9ydGVyLnJlcG9ydChNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKGVycm9yKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZW5kIHRhZwotCQlpZiAoaW5mby5oYXNFbmRUYWcpIHsKLQkJCWVuZFRhZ05hbWUgPSBnZXRUYWdOYW1lKGluZm8uZW5kVGFnKTsKLQkJCWlmICghaW5mby5oYXNTdGFydFRhZyB8fCAoIWVuZFRhZ05hbWUuZXF1YWxzKHN0YXJ0VGFnTmFtZSkpKSB7Ci0JCQkJaWYgKCFkZWNsYXJlZC5lcXVhbHMoZW5kVGFnTmFtZSkpIHsKLQkJCQkJVGFnRXJyb3JJbmZvSW1wbCBlcnJvciA9IG5ldyBUYWdFcnJvckluZm9JbXBsKE1JU01BVENIRURfRVJST1IsIGluZm8uZW5kVGFnLCBlbmRUYWdOYW1lKTsKLQkJCQkJdGhpcy5yZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShlcnJvcikpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUNoaWxkcmVuKE5vZGUgdGFyZ2V0KSB7Ci0JCWlmICgodGFyZ2V0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpICYmIENNVXRpbC5pc0ZvcmVpZ24oKEVsZW1lbnQpIHRhcmdldCkpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gdGFyZ2V0LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQkJewotCQkJCQkJWE1MTm9kZSB0ZXh0ID0gKFhNTE5vZGUpIGNoaWxkOwotCQkJCQkJaW50IGNoYXJPZmZzZXQgPSB2YWxpZGF0ZVRleHRTb3VyY2UodGV4dCk7Ci0JCQkJCQlpZiAoY2hhck9mZnNldCA+PSAwKSB7Ci0JCQkJCQkJY2hhck9mZnNldCArPSB0ZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGNoYXJPZmZzZXQsIDEpOwotCQkJCQkJCWlmIChlcnJvclNlZyAhPSBudWxsKQotCQkJCQkJCQlyZXBvcnQoSU5WQUxJRF9DSEFSX0VSUk9SLCBlcnJvclNlZywgdGV4dCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCQl7Ci0JCQkJCQlYTUxOb2RlIHRhZyA9IChYTUxOb2RlKSBjaGlsZDsKLQkJCQkJCWlmICghdGFnLmlzQ2xvc2VkKCkpIHsKLQkJCQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQodGFnLCBGTVV0aWwuU0VHX1dIT0xFX1RBRyk7Ci0JCQkJCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCQkJCXJlcG9ydChVTkNMT1NFRF9UQUdfRVJST1IsIGVycm9yU2VnLCB0YWcpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCB2YWxpZGF0ZVRleHRTb3VyY2UoWE1MTm9kZSB0ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlTb3VyY2VWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNvdXJjZVZhbGlkYXRvcih0ZXh0KTsKLQkJCXZhbGlkYXRvci52YWxpZGF0ZVNvdXJjZSh0ZXh0LmdldFNvdXJjZSgpKTsKLQkJfQotCQljYXRjaCAoSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGV4LmdldE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwb3J0KGludCBzdGF0ZSwgU2VnbWVudCBlcnJvclNlZywgTm9kZSBub2RlKSB7Ci0JCUVycm9ySW5mbyBpbmZvID0gbmV3IEVycm9ySW5mb0ltcGwoc3RhdGUsIGVycm9yU2VnLCBub2RlKTsKLQkJcmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoaW5mbykpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjZjNjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotbW9kZWwuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmVfMS4wLjAuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGJjZmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kZWJ1Zy90cmFjZWZpbHRlcj0KLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvbS9hZGFwdGVyL25vdGlmaWNhdGlvbi90aW1lL2NyaXRlcmlhPTEwCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcmVzb3VyY2VjaGFuZ2VoYW5kbGluZz1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9saWZlY3ljbGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvc3RhdGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9idWlsZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGRlci9kZXRlY3Rpb249ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9idWlsZGVyL3RpbWU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wYXJ0aWNpcGFudHJlZ2lzdHJ5PWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGRlci9wYXJ0aWNpcGFudC90YXNrdGFnPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGRlci9tb2RlbHByb3ZpZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZmlsZWJ1ZmZlcnMvbW9kZWxtYW5hZ2VtZW50PWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZmlsZWJ1ZmZlcnMvbGlmZWN5Y2xlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM1YjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0OGIwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jV2VkIEphbiAxMiAxNTo1NTozOCBFU1QgMjAwNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTUwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYzU2YjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLmNzczsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotJSUKLQotJXsKLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDEwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCi0JcHVibGljIENTU0hlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLwotCSAgCXl5X3JlYWRlciA9IGluOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAJCXl5X3N0YXRlID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIAkJeXlfbWFya2VkUG9zID0gMDsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqIAotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAJCSAqIGZyb20gaW5wdXQgCi0gIAkJICovCi0gIAkJeXlfZW5kUmVhZCA9IDA7Ci0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWxpbmUgPSAwOwotCi0gIAkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXljaGFyID0gMDsKLQotICAJCS8qKgotICAJCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gIAkJICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAJCSAqLwotICAJCXl5Y29sdW1uID0gMDsgCi0KLSAgCQkvKiogCi0gIAkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgCi0gIAkJICogb2YgYSBsaW5lCi0gIAkJICovCi0gIAkJeXlfYXRCT0wgPSBmYWxzZTsKLQotICAJCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgCQl5eV9hdEVPRiA9IGZhbHNlOwotCi0gIAkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIAkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0gIAkJZlN0YXRlU3RhY2suY2xlYXIoKTsKLSAgCQkKLSAgCQloYXNNb3JlID0gdHJ1ZTsKLSAgCQkKLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudAotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsKLQkJfQotICAJCQotCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9Ci0JCi0KLSV9Ci0KLSVlb2Z7Ci0JaGFzTW9yZT1mYWxzZTsKLSVlb2Z9Ci0KLSVwdWJsaWMKLSVjbGFzcyBDU1NIZWFkVG9rZW5pemVyCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbgotJXR5cGUgU3RyaW5nCi0lY2hhcgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlIAotJWRlYnVnCi0lc3dpdGNoCi0KLQotVVRGMTZCRSA9IFx4RkVceEZGCi1VVEYxNkxFID0gXHhGRlx4RkUKLVVURjgzQnl0ZUJPTSA9IFx4RUZceEJCXHhCRgotCi0vL1NwYWNlQ2hhciA9IFtceDIwXHgwOV0KLQotCi0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdCi0KLUJlZ2luQXR0cmliZVZhbHVlID0ge1N9KiBcPSB7U30qCi0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG4KLQotCi0lc3RhdGUgU1RfWE1MRGVjbAotJXN0YXRlIENIQVJTRVRfUlVMRQotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlCi0lc3RhdGUgRFFfU1RSSU5HCi0lc3RhdGUgU1FfU1RSSU5HCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcKLQotJSUKLQotCi08WVlJTklUSUFMPiAgCi17Ci0Je1VURjE2QkV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9Ci0Je1VURjE2TEV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9Ci0Je1VURjgzQnl0ZUJPTX0gICAJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9Ci0KLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcwotCV4ge1N9KiAiPFw/eG1sIiB7U30rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319Ci0JCi0JXiB7U30qICJAY2hhcnNldCIgICAgIHtpZiAoeXljaGFyID09IDAgKSAge3l5YmVnaW4oQ0hBUlNFVF9SVUxFKTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFO319Ci0JCi0KLX0JCi0KLS8vIEkgZG9uJ3QgdGhpbmsgdGhlcmUncyByZWFsbHkgYW4gWE1MIGZvcm0gb2YgQ1NTIGZpbGVzIC4uLiBidXQgd2lsbCBsZWF2ZSBoZXJlIGZvciBjb25zaXN0ZW5jeQkKLTxTVF9YTUxEZWNsPiAKLXsKLQkvLyJ2ZXJzaW9uIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9Ci0JImVuY29kaW5nIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzt9Ci0JLy8gbm90ZSB0aGlzICJmb3JjZWQgZW5kIiBvbmNlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQKLQkiXD8+IiAgICB7eXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDt9Ci19CQotCi08Q0hBUlNFVF9SVUxFPiAKLXsKLQotCXtTfSogIHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpO30KLQkiOyIgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlJ1bGVFbmQ7fQotfQotCQotCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0JXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQlcJwkJCXsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nCi0Je1N9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQotCi19CQotCi0KLTxEUV9TVFJJTkc+Ci17Ci0KLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI8IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCQotCSI+IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcLz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI7IiAgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotCQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxTUV9TVFJJTkc+Ci17Ci0KLQlcJyAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIiU+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI8IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI+IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcLz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI7IiAgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxVbkRlbGltaXRlZFN0cmluZz4KLXsKLQotCi0Je1N9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiPCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkvLyB0aGVzZSBhcmUgYSBiaXQgc3BlY2lhbCwgc2luY2Ugd2Ugc3RhcnRlZCBhbiB1bmRlbGltaXQgc3RyaW5nLCBidXQgZm91bmQgYSBxdW90ZSAuLi4gcHJvYmFibHkgaW5kaWNhdGVzIGEgbWlzc2luZyBiZWdpbm5pbmcgcXVvdGUKLQlcJwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQotCVwiCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JCi0JIj4iCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlwvPiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIjsiICAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi19Ci0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcKLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpCi08WVlJTklUSUFMLCBTVF9YTUxEZWNsLCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSwgQ0hBUlNFVF9SVUxFPgotewotLy8gdGhpcyBpcyB0aGUgZmFsbGJhY2sgKG1hdGNoICJhbnl0aGluZyIpIHJ1bGUgIChmb3IgdGhpcyBzY2FubmVyLCBpbnB1dCBpcyBpZ25vcmVkLCBhbmQgcG9zaXRpb24gYWR2YW5jZWQsIGlmIG5vdCByZWNvZ25pemVkKQotLnxcbiAgICAgICAgICAgICAge2lmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9fQotfQotCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdAotPDxFT0Y+PiAgICAgICAgIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7fQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmYzM4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxLzI3LzA0IDY6NDIgUE0gKi8KLQotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5jc3M7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkhlYWRQYXJzZXJUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5JbnRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy54bWwuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMS8yNy8wNCA2OjQyIFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDU1NIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IENIQVJTRVRfUlVMRSA9IDQ7Ci0KLSAgLyoqCi0gICAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCA3Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcNlwxXDExXDJcMFwxXDEwXDIyXDBcMVw2XDFcMFwxXDM2XDJcMCIrCi0gICAgIlwxXDQxXDFcMFwxXDM3XDdcMFwxXDQwXDEzXDBcMVwzNVwxXDEyXDFcN1wxXDM0IisKLSAgICAiXDFcMTNcMVwxN1wxXDIyXDFcMFwxXDIwXDFcMzFcMVwyNVwxXDBcMVwzM1wxXDIxIisKLSAgICAiXDFcMzJcMlwwXDFcMTZcMVwxNVwxXDI3XDFcMzBcMlwwXDFcMjNcMVwyNFwxXDI2IisKLSAgICAiXDNcMFwxXDE0XDEwXDBcMVwyMlwxXDBcMVwyMFwxXDMxXDFcMjVcMVwwXDFcMzMiKwotICAgICJcMVwyMVwxXDMyXDJcMFwxXDE2XDFcMTVcMVwyN1wxXDMwXDJcMFwxXDIzXDFcMjQiKwotICAgICJcMVwyNlwzXDBcMVwxNFwxMDJcMFwxXDRcM1wwXDFcNVwxN1wwXDFcM1wxNlwwIisKLSAgICAiXDFcMVwyMFwwXDFcM1wxNlwwXDFcMVwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gMTAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0KLQlwdWJsaWMgQ1NTSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0gIAkJCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQkKLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIENTU0hlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE1OCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICAgIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgeXlfYXRCT0wgPSB5eV9tYXJrZWRQb3MgPD0gMCB8fCB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdcbic7Ci0gICAgICBpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xyJykgewotICAgICAgICB5eV9hdEJPTCA9IHl5X2FkdmFuY2UoKSAhPSAnXG4nOwotICAgICAgICBpZiAoIXl5X2F0RU9GKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICBpZiAoeXlfYXRCT0wpCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZSsxXTsKLSAgICAgIGVsc2UKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXljbWFwW3l5X2lucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4geXlfbm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHl5X2Zvck5leHQ6IHsgc3dpdGNoICh5eV9zdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X3N0YXRlID0gNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSA1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHl5X3N0YXRlID0gNTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gNTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gNjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDYyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX0lMTEVHQUxfU1RBVEUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggeXlfaXNGaW5hbCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCB5eV9ub0xvb2tBaGVhZCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNjU6IGJyZWFrOwotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDY2OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0gICAgICAgIGNhc2UgNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7ICBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlJ1bGVFbmQ7IH0KLSAgICAgICAgY2FzZSA2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNjk6IGJyZWFrOwotICAgICAgICBjYXNlIDQ0OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkgIHt5eWJlZ2luKENIQVJTRVRfUlVMRSk7IHJldHVybiBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLkNIQVJTRVRfUlVMRTt9IH0KLSAgICAgICAgY2FzZSA3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9IH0KLSAgICAgICAgY2FzZSA3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9IH0KLSAgICAgICAgY2FzZSA3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsgfQotICAgICAgICBjYXNlIDc0OiBicmVhazsKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsgfQotICAgICAgICBjYXNlIDc1OiBicmVhazsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyB9Ci0gICAgICAgIGNhc2UgNzY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsgfQotICAgICAgICBjYXNlIDc3OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOyB9Ci0gICAgICAgIGNhc2UgNzg6IGJyZWFrOwotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7IH0KLSAgICAgICAgY2FzZSA3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgICAgeyAgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSA4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSA4MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSA4MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSA4MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgODQ6IGJyZWFrOwotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSA4NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSA4NjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBDU1NIZWFkVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgc2Nhbm5lciA9IG5ldyBDU1NIZWFkVG9rZW5pemVyKCBuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgQ1NTSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZG8gewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplckdlbkphdmEuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWYwNmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplckdlbkphdmEuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotQGVjaG8gb2ZmDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7ZDpqZGtzXGoyc2RrMS40LjFfMDJcYmluDQotc2V0IFdPUktTUEFDRV9MT0NBVElPTj1EOlxidWlsZHNcV29ya3NwYWNlc1xQdXJlSGVhZFdvcmtzcGFjZQ0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXhcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPUNTU0hlYWRUb2tlbml6ZXINCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljXHNyY1wNCi1zZXQgUEFDS0FHRV9ESVI9Y29tXGlibVxlbmNvZGluZ1xyZXNvdXJjZVxjb250ZW50c3BlY2lmaWNcY3NzXA0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAtc2tlbCAlU0tFTEVUT05fRklMRSUgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotSUYgRVhJU1QgJUpBVkFfRklMRSUgY29weSAlSkFWQV9GSUxFJSAlV09SS1NQQUNFX0xPQ0FUSU9OJSVQUk9KRUNUX1NSQyUlUEFDS0FHRV9ESVIlJUpBVkFfRklMRSUNCi0NCi1yZW0gcGF1c2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleG91dC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNzQzY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleG91dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVJlYWRpbmcgIkNTU0hlYWRUb2tlbml6ZXIuamZsZXgiCi1Db25zdHJ1Y3RpbmcgTkZBIDogNDU4IHN0YXRlcyBpbiBORkEKLUNvbnZlcnRpbmcgTkZBIHRvIERGQSA6IAotLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotMTAyIHN0YXRlcyBiZWZvcmUgbWluaW1pemF0aW9uLCA2NCBzdGF0ZXMgaW4gbWluaW1pemVkIERGQQotV3JpdGluZyBjb2RlIHRvICJDU1NIZWFkVG9rZW5pemVyLmphdmEiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjEwOTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuaHRtbDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotJSUKLQotJXsKLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDEwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0JYm9vbGVhbiBmb3VuZENvbnRlbnRUeXBlVmFsdWUgPSBmYWxzZTsKLQotCi0KLQlwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLwotCSAgCXl5X3JlYWRlciA9IGluOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAJCXl5X3N0YXRlID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIAkJeXlfbWFya2VkUG9zID0gMDsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqIAotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAJCSAqIGZyb20gaW5wdXQgCi0gIAkJICovCi0gIAkJeXlfZW5kUmVhZCA9IDA7Ci0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWxpbmUgPSAwOwotCi0gIAkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXljaGFyID0gMDsKLQotICAJCS8qKgotICAJCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gIAkJICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAJCSAqLwotICAJCXl5Y29sdW1uID0gMDsgCi0KLSAgCQkvKiogCi0gIAkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgCi0gIAkJICogb2YgYSBsaW5lCi0gIAkJICovCi0gIAkJeXlfYXRCT0wgPSBmYWxzZTsKLQotICAJCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgCQl5eV9hdEVPRiA9IGZhbHNlOwotCi0gIAkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIAkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0gIAkJZlN0YXRlU3RhY2suY2xlYXIoKTsKLSAgCQkKLSAgCQloYXNNb3JlID0gdHJ1ZTsKLSAgCQkKLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudAotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsKLQkJfQotICAJCQotCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9Ci0JCi0KLSV9Ci0KLSVlb2Z7Ci0JaGFzTW9yZT1mYWxzZTsKLSVlb2Z9Ci0KLSVwdWJsaWMKLSVjbGFzcyBIVE1MSGVhZFRva2VuaXplcgotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4KLSV0eXBlIFN0cmluZwotJWNoYXIKLSV1bmljb2RlCi0laWdub3JlY2FzZSAKLSVkZWJ1ZwotJXN3aXRjaAotCi0KLVVURjE2QkUgPSBceEZFXHhGRgotVVRGMTZMRSA9IFx4RkZceEZFCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYKLQotU3BhY2VDaGFyID0gW1x4MjBceDA5XQotCi0KLQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsKLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0KLQotQmVnaW5BdHRyaWJlVmFsdWUgPSB7U30qIFw9IHtTfSoKLQotTGluZVRlcm1pbmF0b3IgPSBccnxcbgotCi0KLSVzdGF0ZSBTVF9YTUxEZWNsCi0lc3RhdGUgU1RfTUVUQV9UQUcKLSVzdGF0ZSBRdW90ZWRBdHRyaWJ1dGVWYWx1ZQotJXN0YXRlIERRX1NUUklORwotJXN0YXRlIFNRX1NUUklORwotJXN0YXRlIFVuRGVsaW1pdGVkU3RyaW5nCi0KLSUlCi0KLQotPFlZSU5JVElBTD4gIAotewotCXtVVEYxNkJFfSAgIAkJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fQotCXtVVEYxNkxFfSAgIAkJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fQotCXtVVEY4M0J5dGVCT019ICAgCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fQotCi0JLy8gZm9yY2UgdG8gYmUgc3RhcnRlZCBvbiBmaXJzdCBsaW5lLCBidXQgd2UgZG8gYWxsb3cgcHJlY2VlZGluZyBzcGFjZXMKLQleIHtTfSogIjxcP3htbCIge1N9KyB7aWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9fQotCQotCSI8TUVUQSAiICAgICAgIHt5eWJlZ2luKFNUX01FVEFfVEFHKTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdTdGFydDt9Ci0JCi0KLX0JCi0JCi08U1RfWE1MRGVjbD4gCi17Ci0JLy8idmVyc2lvbiIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQotCSJlbmNvZGluZyIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQotCS8vIG5vdGUgdGhpcyAiZm9yY2VkIGVuZCIgb25jZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kCi0JIlw/PiIgICAge3l5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQotfQkKLQotPFNUX01FVEFfVEFHPiAKLXsKLQotCSJodHRwLWVxdWl2IiB7U30qIFw9IHtTfSogXCI/ICJDb250ZW50LVR5cGUiIFwiPyB7U30rICJjb250ZW50IiB7QmVnaW5BdHRyaWJlVmFsdWV9ICB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgZm91bmRDb250ZW50VHlwZVZhbHVlPXRydWU7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGU7fQotCSI+IiAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7fQotCSJcLz4iICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyBpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKSBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kO30KLX0KLQkKLQotPFF1b3RlZEF0dHJpYnV0ZVZhbHVlPgotewotCVwiICAgICAgICAgICAgICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JXCcJCQl7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotCS8vIGluIHRoaXMgc3RhdGUsIGFueXRoaW5nIG90aGVyIHRoYW4gYSBzcGFjZSBjaGFyYWN0ZXIgY2FuIHN0YXJ0IGFuIHVuZGVsaW1pdGVkIHN0cmluZwotCXtTfSouICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApO30KLQotfQkKLQotCi08RFFfU1RSSU5HPgotewotCi0JXCIgICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyB9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXD8+IgkJCXsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiPCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkKLQkiPiIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXC8+IgkJCXsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLQotfQotCi08U1FfU1RSSU5HPgotewotCi0JXCcgICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlO30KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSIlPiIJCQl7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiPCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiPiIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXC8+IgkJCXsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLQotfQotCi08VW5EZWxpbWl0ZWRTdHJpbmc+Ci17Ci0KLQotCS8vIG5vdGUgdGhpcyBpbml0aWFsIHNwZWNpYWwgY2FzZSBmb3IgSFRUUCBjb250ZW50dHlwZSB2YWx1ZXMKLQkiOyJ7U30qCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0Je1N9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiPCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkvLyB0aGVzZSBhcmUgYSBiaXQgc3BlY2lhbCwgc2luY2Ugd2Ugc3RhcnRlZCBhbiB1bmRlbGltaXQgc3RyaW5nLCBidXQgZm91bmQgYSBxdW90ZSAuLi4gcHJvYmFibHkgaW5kaWNhdGVzIGEgbWlzc2luZyBiZWdpbm5pbmcgcXVvdGUKLQlcJwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQotCVwiCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JCi0JIj4iCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlwvPiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi19Ci0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcKLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpCi08WVlJTklUSUFMLCBTVF9YTUxEZWNsLCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSwgU1RfTUVUQV9UQUc+Ci17Ci0vLyB0aGlzIGlzIHRoZSBmYWxsYmFjayAobWF0Y2ggImFueXRoaW5nIikgcnVsZSAgKGZvciB0aGlzIHNjYW5uZXIsIGlucHV0IGlzIGlnbm9yZWQsIGFuZCBwb3NpdGlvbiBhZHZhbmNlZCwgaWYgbm90IHJlY29nbml6ZWQpCi0ufFxuICAgICAgICAgICAgICB7aWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319Ci19Ci0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3ODM2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxLzI3LzA0IDY6NDEgUE0gKi8KLQotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5odG1sOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5IZWFkUGFyc2VyVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSW50U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEvMjcvMDQgNjo0MSBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MSGVhZFRva2VuaXplciB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX01FVEFfVEFHID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDY7Ci0KLSAgLyoqCi0gICAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCA3Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcNlwxXDdcMlwwXDFcMTFcMjJcMFwxXDIyXDFcMFwxXDQwXDJcMCIrCi0gICAgIlwxXDQ0XDFcMFwxXDQzXDVcMFwxXDM0XDFcMFwxXDQyXDEzXDBcMVw0NVwxXDEyIisKLSAgICAiXDFcMTBcMVwzMVwxXDEzXDFcMFwxXDIxXDFcMFwxXDI0XDFcMjZcMVwxN1wxXDAiKwotICAgICJcMVwzMFwxXDMyXDFcMjdcMlwwXDFcMTZcMVwxNVwxXDIzXDFcMjVcMVwzM1wxXDM1IisKLSAgICAiXDJcMFwxXDIwXDFcMzZcMVwzN1wxXDBcMVwxNFwxXDQxXDdcMFwxXDIxXDFcMCIrCi0gICAgIlwxXDI0XDFcMjZcMVwxN1wxXDBcMVwzMFwxXDMyXDFcMjdcMlwwXDFcMTZcMVwxNSIrCi0gICAgIlwxXDIzXDFcMjVcMVwzM1wxXDM1XDJcMFwxXDIwXDFcMzZcMVwzN1wxXDBcMVwxNCIrCi0gICAgIlwxXDQxXDEwMVwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzXDE2XDBcMVwxXDIwXDAiKwotICAgICJcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSAxMDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCWJvb2xlYW4gZm91bmRDb250ZW50VHlwZVZhbHVlID0gZmFsc2U7Ci0KLQotCi0JcHVibGljIEhUTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKiAKLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgCQkgKiBmcm9tIGlucHV0IAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLSAgCQkKLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxNzQpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0KLSAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgCWhhc01vcmU9ZmFsc2U7Ci0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIHl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXG4nOwotICAgICAgaWYgKCF5eV9hdEJPTCAmJiB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdccicpIHsKLSAgICAgICAgeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLSAgICAgICAgaWYgKCF5eV9hdEVPRikgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgaWYgKHl5X2F0Qk9MKQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZV07Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5Y21hcFt5eV9pbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHl5X2lzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB5eV9mb3JOZXh0OiB7IHN3aXRjaCAoeXlfc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA1NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9zdGF0ZSA9IDU4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSA1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X3N0YXRlID0gNjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDYzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDY0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfc3RhdGUgPSA2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gNjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9zdGF0ZSA9IDY3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA2NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDY4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfc3RhdGUgPSA2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDY4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDcxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA3MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X3N0YXRlID0gNzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDc0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDczOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDc2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA3NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDc5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSA4MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gODE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9zdGF0ZSA9IDgyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSA4MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gODQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X3N0YXRlID0gODY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gODc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA4ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gODk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDkwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA5MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gOTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA5MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHl5X2lzRmluYWwgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggeXlfbm9Mb29rQWhlYWQgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDk2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0gICAgICAgIGNhc2UgOTc6IGJyZWFrOwotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7ICBpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKSBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kOyB9Ci0gICAgICAgIGNhc2UgOTg6IGJyZWFrOwotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDk5OiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyBpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKSBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kOyB9Ci0gICAgICAgIGNhc2UgMTAwOiBicmVhazsKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTAxOiBicmVhazsKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAxMDI6IGJyZWFrOwotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fSB9Ci0gICAgICAgIGNhc2UgMTAzOiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fSB9Ci0gICAgICAgIGNhc2UgMTA0OiBicmVhazsKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX01FVEFfVEFHKTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdTdGFydDsgfQotICAgICAgICBjYXNlIDEwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsgfQotICAgICAgICBjYXNlIDEwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgZm91bmRDb250ZW50VHlwZVZhbHVlPXRydWU7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGU7IH0KLSAgICAgICAgY2FzZSAxMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOyB9Ci0gICAgICAgIGNhc2UgMTA4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOyB9Ci0gICAgICAgIGNhc2UgMTA5OiBicmVhazsKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFOyB9Ci0gICAgICAgIGNhc2UgMTEwOiBicmVhazsKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007IH0KLSAgICAgICAgY2FzZSAxMTE6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgICB7ICBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDExMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgIHsgIHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7ICB9Ci0gICAgICAgIGNhc2UgMTEzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgICAgeyAgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDExNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSAxMTU6IGJyZWFrOwotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSAxMTY6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjsgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqIFJ1bnMgdGhlIHNjYW5uZXIgb24gaW5wdXQgZmlsZXMuCi0gICAqCi0gICAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4KLSAgICogSXQgcHJpbnRzIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mCi0gICAqIGZpbGUgaXMgcmVhY2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJlZC4KLSAgICoKLSAgICogQHBhcmFtIGFyZ3YgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1bgotICAgKiAgICAgICAgICAgICAgIHRoZSBzY2FubmVyIG9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotICAgICAgSFRNTEhlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IEhUTUxIZWFkVG9rZW5pemVyKCBuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgSFRNTEhlYWRUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci5wcmltR2V0TmV4dFRva2VuKCkpOwotICAgICAgICB9IHdoaWxlICghc2Nhbm5lci55eV9hdEVPRik7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjIzMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLUBlY2hvIG9mZg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBuZWVkIHRvIGJlIHNldC9zcGVjaWZpZWQgZm9yIGVhY2ggImRldmVsb3BtZW50IG1hY2hpbmUiDQotc2V0IFBBVEg9JVBBVEglO2Q6amRrc1xqMnNkazEuNC4xXzAyXGJpbg0KLXNldCBXT1JLU1BBQ0VfTE9DQVRJT049RDpcYnVpbGRzXFdvcmtzcGFjZXNcUHVyZUhlYWRXb3Jrc3BhY2UNCi1zZXQgSkZMRVhfTElCX0xPQ0FUSU9OPUQ6XERldlRpbWVTdXBwb3J0XEpGbGV4XGxpYg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBkaWZmZXIgZnJvbSBwcm9qZWN0IHRvIHByb2plY3QsIGJ1dCBzaG91bGQgYmUgb3RoZXJ3aXNlIGNvbnN0YW50DQotc2V0IE1BSU5fTkFNRT1IVE1MSGVhZFRva2VuaXplcg0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWNcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXGVuY29kaW5nXHJlc291cmNlXGNvbnRlbnRzcGVjaWZpY1xodG1sXA0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAtc2tlbCAlU0tFTEVUT05fRklMRSUgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotSUYgRVhJU1QgJUpBVkFfRklMRSUgY29weSAlSkFWQV9GSUxFJSAlV09SS1NQQUNFX0xPQ0FUSU9OJSVQUk9KRUNUX1NSQyUlUEFDS0FHRV9ESVIlJUpBVkFfRklMRSUNCi0NCi1yZW0gcGF1c2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ2OWU5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleG91dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVJlYWRpbmcgIkhUTUxIZWFkVG9rZW5pemVyLmpmbGV4IgotCi1XYXJuaW5nIDogTWFjcm8gIlNwYWNlQ2hhciIgaGFzIGJlZW4gZGVjbGFyZWQgYnV0IG5ldmVyIHVzZWQuCi1Db25zdHJ1Y3RpbmcgTkZBIDogNjYwIHN0YXRlcyBpbiBORkEKLUNvbnZlcnRpbmcgTkZBIHRvIERGQSA6IAotLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotMTM1IHN0YXRlcyBiZWZvcmUgbWluaW1pemF0aW9uLCA5NSBzdGF0ZXMgaW4gbWluaW1pemVkIERGQQotV3JpdGluZyBjb2RlIHRvICJIVE1MSGVhZFRva2VuaXplci5qYXZhIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci9KU1BIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci9KU1BIZWFkVG9rZW5pemVyLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY2Y2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIvSlNQSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5qc3AuY29udGVudHR5cGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5IZWFkUGFyc2VyVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JbnRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLQotJSUKLQotJXsKLQotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gMTAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0JcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLwotCSAgCXl5X3JlYWRlciA9IGluOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAJCXl5X3N0YXRlID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIAkJeXlfbWFya2VkUG9zID0gMDsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZwotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgCQloYXNNb3JlID0gdHJ1ZTsKLQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0KLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCi0KLSV9Ci0KLSVlb2Z7Ci0JaGFzTW9yZT1mYWxzZTsKLSVlb2Z9Ci0KLSVwdWJsaWMKLSVjbGFzcyBKU1BIZWFkVG9rZW5pemVyCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbgotJXR5cGUgU3RyaW5nCi0lY2hhcgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlCi0lZGVidWcKLSVzd2l0Y2gKLQotCi1VVEYxNkJFID0gXHhGRVx4RkYKLVVURjE2TEUgPSBceEZGXHhGRQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGCi0KLVNwYWNlQ2hhciA9IFtceDIwXHgwOV0KLQotCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKwotUyA9IFtceDIwXHgwOVx4MERceDBBXQotCi1CZWdpbkF0dHJpYmVWYWx1ZSA9IHtTfSogXD0ge1N9KgotCi1MaW5lVGVybWluYXRvciA9IFxyfFxuCi0KLQotJXN0YXRlIFNUX1hNTERlY2wKLSVzdGF0ZSBTVF9QQUdFX0RJUkVDVElWRQotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlCi0lc3RhdGUgRFFfU1RSSU5HCi0lc3RhdGUgU1FfU1RSSU5HCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcKLQotJSUKLQotCi08WVlJTklUSUFMPgotewotCXtVVEYxNkJFfSAgIAkJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fQotCXtVVEYxNkxFfSAgIAkJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fQotCXtVVEY4M0J5dGVCT019ICAgCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fQotCi0KLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcwotCV4ge1N9KiAiPFw/eG1sIiB7U30rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319Ci0KLQkiPCUiIHtTfSogIkAiIHtTfSogInBhZ2UiIHtTfSsgICB7eXliZWdpbihTVF9QQUdFX0RJUkVDVElWRSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVTdGFydDt9Ci0JIjxqc3A6ZGlyZWN0aXZlLnBhZ2UiIHtTfSsgICAgICAgICAgIHt5eWJlZ2luKFNUX1BBR0VfRElSRUNUSVZFKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZVN0YXJ0O30KLQotCi19Ci0KLTxTVF9YTUxEZWNsPgotewotLy8gICAgICBjb21tZW50ZWQgb3V0ICd2ZXJzaW9uJyBzaW5jZSB3ZSBkb24ndCByZWFsbHkgdXNlLCBidXQgY291bGQgYWRkIGJhY2sgaW4gaGVyZSBpZiBuZWVkZWQKLS8vCSJ2ZXJzaW9uIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9Ci0JImVuY29kaW5nIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzt9Ci0JLy8gbm90ZSB0aGUgImZvcmNlZCBlbmQiICh2aWEgJ2hhc01vcmU9ZmFsc2UnKSBvbmNlIHRoZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kCi0JLy8gVGhpcyBpcyBzaW5jZSBub24tYXNjaWkgY2hhcnMgbWF5IGZvbGxvdyBhbmQgbWF5IGNhdXNlIElPRXhjZXB0aW9ucyB3aGljaCB3b3VsZCBub3Qgb2NjdXIgb25jZSBzdHJlYW0gaXMKLQkvLyByZWFkIHdpdGggaW5jb3JyZWN0IGVuY29kaW5nIChzdWNoIGFzIGlmIHBsYXRmb3JtIGVuY29kaW5nIGlzIGluIGVmZmVjdCB1bnRpbCB0cnVlIGVuY29kaW5nIGRldGVjdGVkKS4KLQkiXD8+IiAgICB7eXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQotfQotCi08U1RfUEFHRV9ESVJFQ1RJVkU+Ci17Ci0vLyAgcmVtb3ZlZCAnbGFuZ3VhZ2UnIHNpbmNlIGl0IHJlYWxseSBjYW4gYmUgaGFuZGxlZCBzZXBlcmF0ZWx5IGZyb20gZW5jb2RpbmcsIGJ1dCBtYXkgYWRkIGl0IGJhY2sgbGF0ZXIgZm9yIHNpbXBsZSByZS11c2UuCi0JImxhbmd1YWdlIiAgICAge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUxhbmd1YWdlO30KLQkiY29udGVudFR5cGUiIHtCZWdpbkF0dHJpYmVWYWx1ZX0gIHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlQ29udGVudFR5cGU7fQotCSJwYWdlRW5jb2RpbmciIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VFbmNvZGluZzt9Ci0JLy8gbm90ZSB0aGUgImZvcmNlZCBlbmQiICh2aWEgJ2hhc01vcmU9ZmFsc2UnKSBvbmNlIHRoZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kCi0JLy8gVGhpcyBpcyBzaW5jZSBub24tYXNjaWkgY2hhcnMgbWF5IGZvbGxvdyBhbmQgbWF5IGNhdXNlIElPRXhjZXB0aW9ucyB3aGljaCB3b3VsZCBub3Qgb2NjdXIgb25jZSBzdHJlYW0gaXMKLQkvLyByZWFkIGluIGNvcnJlY3QgZW5jb2RpbmcuCi0KLQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDIwNSBkZW1vbnN0cmF0ZXMgaG93IHdlIG5lZWQgdG8ga2VlcCBwYXJzaW5nLAotCS8vIGV2ZW4gaWYgY29tZSB0byBlbmQgb2Ygb25lIHBhZ2UgZGlyZWN0aXZlLCBzbyBoYXNNb3JlPWZhbHNlIHdhcyByZW1vdmVkIGZyb20gdGhlc2UgcnVsZXMuCi0JIiU+IiAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVFbmQ7fQotCSJcLz4iICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlRW5kO30KLX0KLQotCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0JXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQlcJwkJCXsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nCi0Je1N9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQotCi19Ci0KLQotPERRX1NUUklORz4KLXsKLQotCVwiICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0JIiU+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCi0KLX0KLQotPFNRX1NUUklORz4KLXsKLQotCVwnICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTt9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiJT4iCQkJeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCSIlPiIJCQl7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQotCi19Ci0KLTxVbkRlbGltaXRlZFN0cmluZz4KLXsKLQotCi0Je1N9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQknPCcJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkvLyB0aGVzZSBhcmUgYSBiaXQgc3BlY2lhbCwgc2luY2Ugd2Ugc3RhcnRlZCBhbiB1bmRlbGltaXQgc3RyaW5nLCBidXQgZm91bmQgYSBxdW90ZSAuLi4gcHJvYmFibHkgaW5kaWNhdGVzIGEgbWlzc2luZyBiZWdpbm5pbmcgcXVvdGUKLQlcJwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQotCVwiCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0JIiU+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCi19Ci0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcKLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpCi08WVlJTklUSUFMLCBTVF9YTUxEZWNsLCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSwgU1RfUEFHRV9ESVJFQ1RJVkU+Ci17Ci0vLyB0aGlzIGlzIHRoZSBmYWxsYmFjayAobWF0Y2ggImFueXRoaW5nIikgcnVsZSAgKGZvciB0aGlzIHNjYW5uZXIsIGlucHV0IGlzIGlnbm9yZWQsIGFuZCBwb3NpdGlvbiBhZHZhbmNlZCwgaWYgbm90IHJlY29nbml6ZWQpCi0ufFxuICAgICAgICAgICAgICB7aWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319Ci19Ci0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIvSlNQSGVhZFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci9KU1BIZWFkVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDNiMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci9KU1BIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDkvNy8wNCA4OjEyIEFNICovCi0KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmpzcC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkhlYWRQYXJzZXJUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDkvNy8wNCA4OjEyIEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIvSlNQSGVhZFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QQUdFX0RJUkVDVElWRSA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLQotICAvKioKLSAgICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsIDcKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw2XDFcN1wyXDBcMVwxMVwyMlwwXDFcNlwxXDBcMVw0NVwyXDAiKwotICAgICJcMVwxN1wxXDBcMVw0Nlw2XDBcMVwzNlwxXDQ0XDEyXDBcMVwyN1wxXDBcMVwxMiIrCi0gICAgIlwxXDEwXDFcNDFcMVwxM1wxXDIwXDFcMjJcMVwwXDFcMzNcMVwzMFwxXDI0XDFcMCIrCi0gICAgIlwxXDIzXDFcMFwxXDMxXDFcMjVcMVwwXDFcMTZcMVwxNVwxXDM3XDFcNDBcMVwyMSIrCi0gICAgIlwxXDBcMVwzMlwxXDI2XDFcMzRcMVw0MlwxXDM1XDFcMFwxXDE0XDFcNDNcN1wwIisKLSAgICAiXDFcMjJcMVwwXDFcMzNcMVwzMFwxXDI0XDFcMFwxXDIzXDFcMFwxXDMxXDFcMjUiKwotICAgICJcMVwwXDFcMTZcMVwxNVwxXDM3XDFcNDBcMVwyMVwxXDBcMVwzMlwxXDI2XDFcMzQiKwotICAgICJcMVw0MlwxXDM1XDFcMFwxXDE0XDFcNDNcMTAxXDBcMVw0XDNcMFwxXDVcMTdcMCIrCi0gICAgIlwxXDNcMTZcMFwxXDFcMjBcMFwxXDNcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMiIrCi0gICAgIlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gMTAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0JcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLwotCSAgCXl5X3JlYWRlciA9IGluOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAJCXl5X3N0YXRlID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIAkJeXlfbWFya2VkUG9zID0gMDsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZwotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgCQloYXNNb3JlID0gdHJ1ZTsKLQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0KLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCi0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BIZWFkVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxODIpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0KLSAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgCWhhc01vcmU9ZmFsc2U7Ci0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIHl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXG4nOwotICAgICAgaWYgKCF5eV9hdEJPTCAmJiB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdccicpIHsKLSAgICAgICAgeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLSAgICAgICAgaWYgKCF5eV9hdEVPRikgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgaWYgKHl5X2F0Qk9MKQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZV07Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5Y21hcFt5eV9pbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHl5X2lzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB5eV9mb3JOZXh0OiB7IHN3aXRjaCAoeXlfc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSA1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDU3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfc3RhdGUgPSA1ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDU5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDYyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSA2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA2NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSA2NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDY5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9zdGF0ZSA9IDcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA3MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gNzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9zdGF0ZSA9IDc1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA3NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDc4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA3OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDgwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9zdGF0ZSA9IDgzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSA4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9zdGF0ZSA9IDg2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gODA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9zdGF0ZSA9IDg3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA4ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gODk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDkwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9zdGF0ZSA9IDkyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA5MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9zdGF0ZSA9IDk1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA5NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gMTAwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogeXlfc3RhdGUgPSAxMDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDEwMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSAxMDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSAxMDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxMDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSAxMDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSAxMDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSAxMDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSAxMDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gMTEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9zdGF0ZSA9IDExNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDY0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB5eV9pc0ZpbmFsICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoIHl5X25vTG9va0FoZWFkICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgICAgeyAgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDExNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTE3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0gICAgICAgIGNhc2UgMTE4OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTE5OiBicmVhazsKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZUVuZDsgfQotICAgICAgICBjYXNlIDEyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZUVuZDsgfQotICAgICAgICBjYXNlIDEyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDEyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTIzOiBicmVhazsKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O30gfQotICAgICAgICBjYXNlIDEyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30gfQotICAgICAgICBjYXNlIDEyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9QQUdFX0RJUkVDVElWRSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVTdGFydDsgfQotICAgICAgICBjYXNlIDEyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7IH0KLSAgICAgICAgY2FzZSAxMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSAxMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlQ29udGVudFR5cGU7IH0KLSAgICAgICAgY2FzZSAxMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDk5OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VMYW5ndWFnZTsgfQotICAgICAgICBjYXNlIDEzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTg6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSAxMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsgfQotICAgICAgICBjYXNlIDEzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTsgfQotICAgICAgICBjYXNlIDEzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsgfQotICAgICAgICBjYXNlIDEzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM1OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSAxMzY6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMTM3OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDEzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzOTogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBKU1BIZWFkVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgc2Nhbm5lciA9IG5ldyBKU1BIZWFkVG9rZW5pemVyKCBuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgSlNQSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZG8gewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyL0pTUEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIvSlNQSGVhZFRva2VuaXplckdlbkphdmEuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGFhMzQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIvSlNQSGVhZFRva2VuaXplckdlbkphdmEuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotQGVjaG8gb2ZmDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7ZDpqZGtzXGoyc2RrMS40LjFfMDJcYmluDQotc2V0IFdPUktTUEFDRV9MT0NBVElPTj1EOlxidWlsZHNcV29ya3NwYWNlc1xQdXJlSGVhZA0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXhcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPUpTUEhlYWRUb2tlbml6ZXINCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5qc3Bcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXHNzZVxtb2RlbFxqc3BcY29udGVudHR5cGVcDQotDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy5KRmxleC5NYWluICVKRkxFWF9SVUxFUyUgLXNrZWwgJVNLRUxFVE9OX0ZJTEUlIDE+amZsZXhvdXQudHh0IDI+IGpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXJlbSBwYXVzZQ0KLQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci9qZmxleG91dC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiMDhhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotUmVhZGluZyAiSlNQSGVhZFRva2VuaXplci5qZmxleCIKLQotV2FybmluZyA6IE1hY3JvICJTcGFjZUNoYXIiIGhhcyBiZWVuIGRlY2xhcmVkIGJ1dCBuZXZlciB1c2VkLgotQ29uc3RydWN0aW5nIE5GQSA6IDgyMCBzdGF0ZXMgaW4gTkZBCi1Db252ZXJ0aW5nIE5GQSB0byBERkEgOiAKLS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotMTU4IHN0YXRlcyBiZWZvcmUgbWluaW1pemF0aW9uLCAxMTUgc3RhdGVzIGluIG1pbmltaXplZCBERkEKLVdyaXRpbmcgY29kZSB0byAiSlNQSGVhZFRva2VuaXplci5qYXZhIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWRkMGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lcy5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWwuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotJSUKLQotJXRhYmxlCi0lcHVibGljCi0lZmluYWwKLSVjbGFzcyBYTUwxME5hbWVzCi0lZnVuY3Rpb24gaXNWYWxpZFhNTDEwTmFtZQotJXR5cGUgYm9vbGVhbgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlCi0lYnVmZmVyIDIwNDgKLSVhcGlwcml2YXRlCi0KLVMgPSAoXHgyMCB8IFx4MDkgfCBceDBEIHwgXHgwQSkKLQotQmFzZUNoYXIgPSBbXHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXQotCi1JZGVvZ3JhcGhpYyA9IFtcdTRFMDAtXHU5RkE1XHUzMDA3XHUzMDIxLVx1MzAyOV0KLQotQ29tYmluaW5nQ2hhciA9IFtcdTAzMDAtXHUwMzQ1XHUwMzYwLVx1MDM2MVx1MDQ4My1cdTA0ODZcdTA1OTEtXHUwNUExXHUwNUEzLVx1MDVCOVx1MDVCQi1cdTA1QkRcdTA1QkZcdTA1QzEtXHUwNUMyXHUwNUM0XHUwNjRCLVx1MDY1Mlx1MDY3MFx1MDZENi1cdTA2RENcdTA2REQtXHUwNkRGXHUwNkUwLVx1MDZFNFx1MDZFNy1cdTA2RThcdTA2RUEtXHUwNkVEXHUwOTAxLVx1MDkwM1x1MDkzQ1x1MDkzRS1cdTA5NENcdTA5NERcdTA5NTEtXHUwOTU0XHUwOTYyLVx1MDk2M1x1MDk4MS1cdTA5ODNcdTA5QkNcdTA5QkVcdTA5QkZcdTA5QzAtXHUwOUM0XHUwOUM3LVx1MDlDOFx1MDlDQi1cdTA5Q0RcdTA5RDdcdTA5RTItXHUwOUUzXHUwQTAyXHUwQTNDXHUwQTNFXHUwQTNGXHUwQTQwLVx1MEE0Mlx1MEE0Ny1cdTBBNDhcdTBBNEItXHUwQTREXHUwQTcwLVx1MEE3MVx1MEE4MS1cdTBBODNcdTBBQkNcdTBBQkUtXHUwQUM1XHUwQUM3LVx1MEFDOVx1MEFDQi1cdTBBQ0RcdTBCMDEtXHUwQjAzXHUwQjNDXHUwQjNFLVx1MEI0M1x1MEI0Ny1cdTBCNDhcdTBCNEItXHUwQjREXHUwQjU2LVx1MEI1N1x1MEI4Mi1cdTBCODNcdTBCQkUtXHUwQkMyXHUwQkM2LVx1MEJDOFx1MEJDQS1cdTBCQ0RcdTBCRDdcdTBDMDEtXHUwQzAzXHUwQzNFLVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1LVx1MEM1Nlx1MEM4Mi1cdTBDODNcdTBDQkUtXHUwQ0M0XHUwQ0M2LVx1MENDOFx1MENDQS1cdTBDQ0RcdTBDRDUtXHUwQ0Q2XHUwRDAyLVx1MEQwM1x1MEQzRS1cdTBENDNcdTBENDYtXHUwRDQ4XHUwRDRBLVx1MEQ0RFx1MEQ1N1x1MEUzMVx1MEUzNC1cdTBFM0FcdTBFNDctXHUwRTRFXHUwRUIxXHUwRUI0LVx1MEVCOVx1MEVCQi1cdTBFQkNcdTBFQzgtXHUwRUNEXHUwRjE4LVx1MEYxOVx1MEYzNVx1MEYzN1x1MEYzOVx1MEYzRVx1MEYzRlx1MEY3MS1cdTBGODRcdTBGODYtXHUwRjhCXHUwRjkwLVx1MEY5NVx1MEY5N1x1MEY5OS1cdTBGQURcdTBGQjEtXHUwRkI3XHUwRkI5XHUyMEQwLVx1MjBEQ1x1MjBFMVx1MzAyQS1cdTMwMkZcdTMwOTlcdTMwOUFdCi0KLURpZ2l0ID0gIFtcdTAwMzAtXHUwMDM5XHUwNjYwLVx1MDY2OVx1MDZGMC1cdTA2RjlcdTA5NjYtXHUwOTZGXHUwOUU2LVx1MDlFRlx1MEE2Ni1cdTBBNkZcdTBBRTYtXHUwQUVGXHUwQjY2LVx1MEI2Rlx1MEJFNy1cdTBCRUZcdTBDNjYtXHUwQzZGXHUwQ0U2LVx1MENFRlx1MEQ2Ni1cdTBENkZcdTBFNTAtXHUwRTU5XHUwRUQwLVx1MEVEOVx1MEYyMC1cdTBGMjldCi0KLUV4dGVuZGVyID0gW1x1MDBCN1x1MDJEMFx1MDJEMVx1MDM4N1x1MDY0MFx1MEU0Nlx1MEVDNlx1MzAwNVx1MzAzMS1cdTMwMzVcdTMwOUQtXHUzMDlFXHUzMEZDLVx1MzBGRV0KLQotTGV0dGVyID0gKHtCYXNlQ2hhcn0gfCB7SWRlb2dyYXBoaWN9KQotCi1OYW1lQ2hhciA9ICh7TGV0dGVyfSB8IHtEaWdpdH0gfCAuIHwgLSB8IF8gfCA6IHwge0NvbWJpbmluZ0NoYXJ9IHwge0V4dGVuZGVyfSkKLQotTmFtZSA9ICh7TGV0dGVyfSB8IF8gfCA6ICkgKHtOYW1lQ2hhcn0pKgotCi0KLQotJXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotCSAqLwotCXB1YmxpYyBYTUwxME5hbWVzKCkgewotCQl0aGlzLnp6UmVhZGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKFN0cmluZyBzdHJpbmdUb0NoZWNrKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXl5cmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHN0cmluZ1RvQ2hlY2spKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGlzVmFsaWRYTUwxME5hbWUoKTsKLQkJfQotCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSB3aXRoIHN0cmluZ3MsIGJ1dCBpZiBvY2N1cnMsIGp1c3QgbWVhbnMKLQkJCS8vICJub3QiCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotJX0KLQotCi0KLQotJSUKLQotPFlZSU5JVElBTD4KLXsKLQotCS8vIGRvbid0IG1hdGNoIGlmIGNvbnRhaW5zIHRyYWlsaW5nIG9yIGVtYmVkZGVkIHNwYWNlCi0Je05hbWV9IHtTfSsgICAgICAgICB7cmV0dXJuIGZhbHNlO30KLQl7TmFtZX0ge1N9KyB7TmFtZX0gIHtyZXR1cm4gZmFsc2U7fQotCi0Je05hbWV9ICAgICAgICAgICAgICB7cmV0dXJuIHRydWU7fQotCi0JLy8gbWF0Y2ggYW55dGhpbmcgc2hvdWxkIGNvbWUgbGFzdAotCS4gICAgICAgICAgICAgICAgICAge3JldHVybiBmYWxzZTt9Ci0KLX0KLQotCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdAotPDxFT0Y+PgotewotCXtyZXR1cm4gZmFsc2U7fQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YmRjZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40IG9uIDcvMTcvMDQgMzo0MyBBTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWwuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40Ci0gKiBvbiA3LzE3LzA0IDM6NDMgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+WE1MMTBOYW1lcy5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUwxME5hbWVzIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfQlVGRkVSU0laRSA9IDIwNDg7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDExXDBcMVwxXDFcMlwyXDBcMVwxXDIyXDBcMVwxXDE0XDBcMVwwXDJcMCIrCi0gICAgIlwxMlwwXDFcM1w2XDBcMzJcM1w0XDBcMVwzXDFcMFwzMlwzXDc0XDBcMVwwIisKLSAgICAiXDEwXDBcMjdcM1wxXDBcMzdcM1wxXDBcNzJcM1wyXDBcMTNcM1wyXDBcMTBcMyIrCi0gICAgIlwxXDBcNjVcM1wxXDBcMTA0XDNcMTFcMFw0NFwzXDNcMFwyXDNcNFwwXDM2XDMiKwotICAgICJcNzBcMFwxMzFcM1wyMlwwXDdcM1wxNlwwXDJcMFw1NlwwXDEwNlwwXDMyXDBcMlwwIisKLSAgICAiXDQ0XDBcMVwzXDFcMFwzXDNcMVwwXDFcM1wxXDBcMjRcM1wxXDBcNTRcMyIrCi0gICAgIlwxXDBcN1wzXDNcMFwxXDNcMVwwXDFcM1wxXDBcMVwzXDFcMFwxXDMiKwotICAgICJcMVwwXDIyXDNcMTVcMFwxNFwzXDFcMFwxMDJcM1wxXDBcMTRcM1wxXDBcNDRcMyIrCi0gICAgIlwxXDBcNFwwXDExXDBcNjVcM1wyXDBcMlwzXDJcMFwyXDNcM1wwXDM0XDMiKwotICAgICJcMlwwXDEwXDNcMlwwXDJcM1w2N1wwXDQ2XDNcMlwwXDFcM1w3XDBcNDZcMyIrCi0gICAgIlwxMlwwXDIxXDBcMVwwXDI3XDBcMVwwXDNcMFwxXDBcMVwwXDFcMFwyXDAiKwotICAgICJcMVwwXDFcMFwxM1wwXDMzXDNcNVwwXDNcM1w1NlwwXDMyXDNcNVwwXDFcMCIrCi0gICAgIlwxMlwzXDEwXDBcMTVcMFwxMlwwXDZcMFwxXDBcMTA3XDNcMlwwXDVcM1wxXDAiKwotICAgICJcMTdcM1wxXDBcNFwzXDFcMFwxXDNcMTdcMFwyXDNcMlwwXDFcMFw0XDAiKwotICAgICJcMlwwXDEyXDBcdTAyMDdcMFwzXDBcMVwwXDY1XDNcMlwwXDFcMFwxXDNcMjBcMCIrCi0gICAgIlwzXDBcNFwwXDNcMFwxMlwzXDJcMFwyXDBcMTJcMFwyMVwwXDNcMFwxXDAiKwotICAgICJcMTBcM1wyXDBcMlwzXDJcMFwyNlwzXDFcMFw3XDNcMVwwXDFcM1wzXDAiKwotICAgICJcNFwzXDJcMFwxXDBcMVwwXDdcMFwyXDBcMlwwXDJcMFwzXDBcMTFcMCIrCi0gICAgIlwxXDBcNFwwXDJcM1wxXDBcM1wzXDJcMFwyXDBcMTJcMFwyXDNcMjBcMCIrCi0gICAgIlwxXDBcMlwwXDZcM1w0XDBcMlwzXDJcMFwyNlwzXDFcMFw3XDNcMVwwIisKLSAgICAiXDJcM1wxXDBcMlwzXDFcMFwyXDNcMlwwXDFcMFwxXDBcNVwwXDRcMCIrCi0gICAgIlwyXDBcMlwwXDNcMFwxM1wwXDRcM1wxXDBcMVwzXDdcMFwxMlwwXDJcMCIrCi0gICAgIlwzXDNcMTRcMFwzXDBcMVwwXDdcM1wxXDBcMVwzXDFcMFwzXDNcMVwwIisKLSAgICAiXDI2XDNcMVwwXDdcM1wxXDBcMlwzXDFcMFw1XDNcMlwwXDFcMFwxXDMiKwotICAgICJcMTBcMFwxXDBcM1wwXDFcMFwzXDBcMjJcMFwxXDNcNVwwXDEyXDBcMjFcMCIrCi0gICAgIlwzXDBcMVwwXDEwXDNcMlwwXDJcM1wyXDBcMjZcM1wxXDBcN1wzXDFcMCIrCi0gICAgIlwyXDNcMlwwXDRcM1wyXDBcMVwwXDFcM1w2XDBcM1wwXDJcMFwyXDAiKwotICAgICJcM1wwXDEwXDBcMlwwXDRcMFwyXDNcMVwwXDNcM1w0XDBcMTJcMFwyMlwwIisKLSAgICAiXDJcMFwxXDBcNlwzXDNcMFwzXDNcMVwwXDRcM1wzXDBcMlwzXDFcMCIrCi0gICAgIlwxXDNcMVwwXDJcM1wzXDBcMlwzXDNcMFwzXDNcM1wwXDEwXDNcMVwwIisKLSAgICAiXDNcM1w0XDBcNVwwXDNcMFwzXDBcMVwwXDRcMFwxMVwwXDFcMFwxN1wwIisKLSAgICAiXDExXDBcMjFcMFwzXDBcMVwwXDEwXDNcMVwwXDNcM1wxXDBcMjdcM1wxXDAiKwotICAgICJcMTJcM1wxXDBcNVwzXDRcMFw3XDBcMVwwXDNcMFwxXDBcNFwwXDdcMCIrCi0gICAgIlwyXDBcMTFcMFwyXDNcNFwwXDEyXDBcMjJcMFwyXDBcMVwwXDEwXDNcMVwwIisKLSAgICAiXDNcM1wxXDBcMjdcM1wxXDBcMTJcM1wxXDBcNVwzXDRcMFw3XDBcMVwwIisKLSAgICAiXDNcMFwxXDBcNFwwXDdcMFwyXDBcN1wwXDFcM1wxXDBcMlwzXDRcMCIrCi0gICAgIlwxMlwwXDIyXDBcMlwwXDFcMFwxMFwzXDFcMFwzXDNcMVwwXDI3XDNcMVwwIisKLSAgICAiXDIwXDNcNFwwXDZcMFwyXDBcM1wwXDFcMFw0XDBcMTFcMFwxXDBcMTBcMCIrCi0gICAgIlwyXDNcNFwwXDEyXDBcMjIxXDBcNTZcM1wxXDBcMVwzXDFcMFwyXDNcN1wwIisKLSAgICAiXDVcMFw2XDNcMVwwXDEwXDBcMVwwXDEyXDBcNDdcMFwyXDNcMVwwXDFcMyIrCi0gICAgIlwyXDBcMlwzXDFcMFwxXDNcMlwwXDFcM1w2XDBcNFwzXDFcMFw3XDMiKwotICAgICJcMVwwXDNcM1wxXDBcMVwzXDFcMFwxXDNcMlwwXDJcM1wxXDBcMlwzIisKLSAgICAiXDFcMFwxXDNcMVwwXDJcM1w2XDBcMVwwXDJcMFwxXDNcMlwwXDVcMyIrCi0gICAgIlwxXDBcMVwwXDFcMFw2XDBcMlwwXDEyXDBcNzZcMFwyXDBcNlwwXDEyXDAiKwotICAgICJcMTNcMFwxXDBcMVwwXDFcMFwxXDBcMVwwXDRcMFwyXDBcMTBcM1wxXDAiKwotICAgICJcNDFcM1w3XDBcMjRcMFwxXDBcNlwwXDRcMFw2XDBcMVwwXDFcMFwxXDAiKwotICAgICJcMjVcMFwzXDBcN1wwXDFcMFwxXDBcMzQ2XDBcNDZcM1wxMlwwXDQ3XDNcMTFcMCIrCi0gICAgIlwxXDNcMVwwXDJcM1wxXDBcM1wzXDFcMFwxXDNcMVwwXDJcM1wxXDAiKwotICAgICJcNVwzXDUxXDBcMVwzXDFcMFwxXDNcMVwwXDFcM1wxM1wwXDFcM1wxXDAiKwotICAgICJcMVwzXDFcMFwxXDNcM1wwXDJcM1wzXDBcMVwzXDVcMFwzXDNcMVwwIisKLSAgICAiXDFcM1wxXDBcMVwzXDFcMFwxXDNcMVwwXDFcM1wzXDBcMlwzXDNcMCIrCi0gICAgIlwyXDNcMVwwXDFcM1w1MFwwXDFcM1wxMVwwXDFcM1wyXDBcMVwzXDJcMCIrCi0gICAgIlwyXDNcN1wwXDJcM1wxXDBcMVwzXDFcMFw3XDNcNTBcMFwxXDNcNFwwIisKLSAgICAiXDFcM1wxMFwwXDFcM1x1MGMwNlwwXDIzNFwzXDRcMFwxMzJcM1w2XDBcMjZcM1wyXDAiKwotICAgICJcNlwzXDJcMFw0NlwzXDJcMFw2XDNcMlwwXDEwXDNcMVwwXDFcM1wxXDAiKwotICAgICJcMVwzXDFcMFwxXDNcMVwwXDM3XDNcMlwwXDY1XDNcMVwwXDdcM1wxXDAiKwotICAgICJcMVwzXDNcMFwzXDNcMVwwXDdcM1wzXDBcNFwzXDJcMFw2XDNcNFwwIisKLSAgICAiXDE1XDNcNVwwXDNcM1wxXDBcN1wzXDMyM1wwXDE1XDBcNFwwXDFcMFwxMDRcMCIrCi0gICAgIlwxXDNcM1wwXDJcM1wyXDBcMVwzXDEyMVwwXDNcM1x1MGU4MlwwXDFcMFwxXDAiKwotICAgICJcMVwzXDMxXDBcMTFcM1w2XDBcMVwwXDVcMFwxM1wwXDEyNFwzXDRcMFwyXDAiKwotICAgICJcMlwwXDJcMFwyXDBcMTMyXDNcMVwwXDNcMFw2XDBcNTBcM1x1MWNkM1wwXHU1MWE2XDMiKwotICAgICJcdTBjNWFcMFx1MmJhNFwzXHUyODVjXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIFpaX0NNQVAgPSB6elVucGFja0NNYXAoWlpfQ01BUF9QQUNLRUQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBERkEgc3RhdGVzIHRvIGFjdGlvbiBzd2l0Y2ggbGFiZWxzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FDVElPTiA9IHp6VW5wYWNrQWN0aW9uKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9Ci0gICAgIlwxXDBcMVwxXDFcMlw0XDEiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs3XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfUk9XTUFQID0genpVbnBhY2tSb3dNYXAoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfUk9XTUFQX1BBQ0tFRF8wID0KLSAgICAiXDBcMFwwXDRcMFwxMFwwXDE0XDBcMjBcMFwyNFwwXDMwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tSb3dNYXAoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbN107Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tSb3dNYXAoWlpfUk9XTUFQX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja1Jvd01hcChTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgaGlnaCA9IHBhY2tlZC5jaGFyQXQoaSsrKSA8PCAxNjsKLSAgICAgIHJlc3VsdFtqKytdID0gaGlnaCB8IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9UUkFOUyBbXSA9IHsKLSAgICAxLCAxLCAtMSwgMiwgLTEsIC0xLCAtMSwgLTEsIDIsIDMsIAotICAgIDQsIDIsIDIsIDMsIDQsIDUsIC0xLCA0LCA0LCA2LCAKLSAgICA1LCA1LCA0LCA1LCA2LCA2LCAtMSwgNiwgCi0gIH07Ci0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKgotICAgKiBaWl9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQVRUUklCVVRFID0genpVbnBhY2tBdHRyaWJ1dGUoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQVRUUklCVVRFX1BBQ0tFRF8wID0KLSAgICAiXDFcMFwxXDExXDVcMSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQXR0cmlidXRlKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzddOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQXR0cmlidXRlKFpaX0FUVFJJQlVURV9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBdHRyaWJ1dGUoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB6elB1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBwcml2YXRlIGludCB5eWNvbHVtbjsKLQotICAvKiogCi0gICAqIHp6QXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEJPTCA9IHRydWU7Ci0KLSAgLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLQkgKi8KLQlwdWJsaWMgWE1MMTBOYW1lcygpIHsKLQkJdGhpcy56elJlYWRlciA9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZShTdHJpbmcgc3RyaW5nVG9DaGVjaykgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQl5eXJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihzdHJpbmdUb0NoZWNrKSk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBpc1ZhbGlkWE1MMTBOYW1lKCk7Ci0JCX0KLQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIGJlIGltcG9zc2libGUgd2l0aCBzdHJpbmdzLCBidXQgaWYgb2NjdXJzLCBqdXN0IG1lYW5zCi0JCQkvLyAibm90IgotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUwxME5hbWVzKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy56elJlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MMTBOYW1lcyhqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHp6VW5wYWNrQ01hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMjI2KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpSZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh6elN0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIHp6U3RhcnRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpFbmRSZWFkLXp6U3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHp6RW5kUmVhZC09IHp6U3RhcnRSZWFkOwotICAgICAgenpDdXJyZW50UG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ek1hcmtlZFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpQdXNoYmFja1Bvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotICAgICAgenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLmxlbmd0aC16ekVuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPCAwKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB6ekVuZFJlYWQrPSBudW1SZWFkOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0gICAgICB6elJlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0genpQdXNoYmFja1BvcyA9IDA7Ci0gICAgeXlsaW5lID0geXljaGFyID0geXljb2x1bW4gPSAwOwotICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6elNjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgdHJ5IHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW1paX1VOS05PV05fRVJST1JdOwotICAgIH0KLQotICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSAgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB6elNjYW5FcnJvcihaWl9QVVNIQkFDS18yQklHKTsKLQotICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHp6SW5wdXQ7Ci0gICAgaW50IHp6QWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgenpDdXJyZW50UG9zTDsKLSAgICBpbnQgenpNYXJrZWRQb3NMOwotICAgIGludCB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgIGNoYXIgW10genpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgY2hhciBbXSB6ekNNYXBMID0gWlpfQ01BUDsKLQotICAgIGludCBbXSB6elRyYW5zTCA9IFpaX1RSQU5TOwotICAgIGludCBbXSB6elJvd01hcEwgPSBaWl9ST1dNQVA7Ci0gICAgaW50IFtdIHp6QXR0ckwgPSBaWl9BVFRSSUJVVEU7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0KLSAgICAgIHp6QWN0aW9uID0gLTE7Ci0KLSAgICAgIHp6Q3VycmVudFBvc0wgPSB6ekN1cnJlbnRQb3MgPSB6elN0YXJ0UmVhZCA9IHp6TWFya2VkUG9zTDsKLSAgCi0gICAgICB6elN0YXRlID0genpMZXhpY2FsU3RhdGU7Ci0KLQotICAgICAgenpGb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikgewotICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3MgID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zICAgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHp6Q3VycmVudFBvc0wgID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMICAgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCAgICAgID0genpCdWZmZXI7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMICAgICA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCB6ek5leHQgPSB6elRyYW5zTFsgenpSb3dNYXBMW3p6U3RhdGVdICsgenpDTWFwTFt6eklucHV0XSBdOwotICAgICAgICAgIGlmICh6ek5leHQgPT0gLTEpIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIHp6U3RhdGUgPSB6ek5leHQ7Ci0KLSAgICAgICAgICBpbnQgenpBdHRyaWJ1dGVzID0genpBdHRyTFt6elN0YXRlXTsKLSAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiAxKSA9PSAxICkgewotICAgICAgICAgICAgenpBY3Rpb24gPSB6elN0YXRlOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDgpID09IDggKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgenpNYXJrZWRQb3MgPSB6ek1hcmtlZFBvc0w7Ci0KLSAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgIGNhc2UgMTogCi0gICAgICAgICAgeyByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQ6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgICB7IHtyZXR1cm4gZmFsc2U7fSB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzR2VuSmF2YS5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXNHZW5KYXZhLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3N2QxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXNHZW5KYXZhLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLUBlY2hvIG9uDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7RDpcSkRLc1xqMnNkazEuNC4yXzAzXGJpbg0KLXNldCBXT1JLU1BBQ0VfTE9DQVRJT049RDpcYnVpbGRzXFdvcmtzcGFjZXNcUkMyDQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleC0xLjRcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPVhNTDEwTmFtZXMNCi0NCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWxcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXHNzZVxtb2RlbFx4bWxcaW50ZXJuYWxccGFyc2VyXA0KLQ0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAtc2tlbCAlU0tFTEVUT05fRklMRSUgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotSUYgRVhJU1QgJUpBVkFfRklMRSUgY29weSAlSkFWQV9GSUxFJSAlV09SS1NQQUNFX0xPQ0FUSU9OJSVQUk9KRUNUX1NSQyUlUEFDS0FHRV9ESVIlJUpBVkFfRklMRSUNCi0NCi1wYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmFKRmxleDE0LmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmFKRmxleDE0LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmYmY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXNHZW5KYXZhSkZsZXgxNC5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1AZWNobyBvbg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBuZWVkIHRvIGJlIHNldC9zcGVjaWZpZWQgZm9yIGVhY2ggImRldmVsb3BtZW50IG1hY2hpbmUiDQotc2V0IFBBVEg9JVBBVEglO0Q6XEpES3NcajJzZGsxLjQuMl8wM1xiaW4NCi1zZXQgV09SS1NQQUNFX0xPQ0FUSU9OPUQ6XGJ1aWxkc1xXb3Jrc3BhY2VzXFJDMg0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXgtMS40XGxpYg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBkaWZmZXIgZnJvbSBwcm9qZWN0IHRvIHByb2plY3QsIGJ1dCBzaG91bGQgYmUgb3RoZXJ3aXNlIGNvbnN0YW50DQotc2V0IE1BSU5fTkFNRT1YTUwxME5hbWVzDQotDQotc2V0IFBST0pFQ1RfU1JDPVxvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sXHNyY1wNCi1zZXQgUEFDS0FHRV9ESVI9Y29tXGlibVxzc2VcbW9kZWxceG1sXGludGVybmFsXHBhcnNlclwNCi0NCi0NCi1yZW0gR2l2ZW4gdGhlIGFib3ZlICJmcmFtZXdvcmsiIGFuZCB0aGUgY29tbWFuZCB0aGVtc2VsdmVzLCB0aGVzZSB2YXJpYWJsZXMgc2hvdWxkIG5ldmVyIG5lZWQgdG8gYmUgbW9kaWZpZWQNCi1zZXQgSkFWQV9GSUxFPSVNQUlOX05BTUUlLmphdmENCi1zZXQgSkZMRVhfUlVMRVM9JU1BSU5fTkFNRSUuamZsZXgNCi1zZXQgU0tFTEVUT05fRklMRT0lTUFJTl9OQU1FJS5za2VsZXRvbg0KLQ0KLUlGIEVYSVNUICVKQVZBX0ZJTEUlIGRlbCAlSkFWQV9GSUxFJQ0KLXJlbSBqYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXEpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAtc2tlbCAlU0tFTEVUT05fRklMRSUgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXEpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXBhdXNlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleGVyci50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4ZXJyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4ZXJyLnR4dAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4b3V0LnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhvdXQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTk2MGI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhvdXQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1SZWFkaW5nICJYTUwxME5hbWVzLmpmbGV4IgotQ29uc3RydWN0aW5nIE5GQSA6IDM2IHN0YXRlcyBpbiBORkEKLUNvbnZlcnRpbmcgTkZBIHRvIERGQSA6IAotLi4uLi4uLi4uLi4KLTEzIHN0YXRlcyBiZWZvcmUgbWluaW1pemF0aW9uLCA3IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIlhNTDEwTmFtZXMuamF2YSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qRmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NDRmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuakZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy54bWw7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkhlYWRQYXJzZXJUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5JbnRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy54bWwuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotJSUKLQotJXsKLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDEwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCXB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKiAKLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgCQkgKiBmcm9tIGlucHV0IAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0gIAkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotICAJCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50IAotICAJCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLiAKLSAgCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotICAJCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0gIAkJfQotCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0JCi0KLSV9Ci0KLSVlb2Z7Ci0JaGFzTW9yZT1mYWxzZTsKLSVlb2Z9Ci0KLSVwdWJsaWMKLSVjbGFzcyBYTUxIZWFkVG9rZW5pemVyCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbgotJXR5cGUgU3RyaW5nCi0lY2hhcgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlIAotJWRlYnVnCi0lc3dpdGNoCi0KLVVURjE2QkUgPSBceEZFXHhGRgotVVRGMTZMRSA9IFx4RkZceEZFCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYKLQotU3BhY2VDaGFyID0gW1x4MjBceDA5XQotCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKwotUyA9IFtceDIwXHgwOVx4MERceDBBXQotCi1CZWdpbkF0dHJpYmVWYWx1ZSA9IHtTfSogXD0ge1N9KgotCi1MaW5lVGVybWluYXRvciA9IFxyfFxuCi0KLQotJXN0YXRlIFNUX1hNTERlY2wKLSVzdGF0ZSBRdW90ZWRBdHRyaWJ1dGVWYWx1ZQotJXN0YXRlIERRX1NUUklORwotJXN0YXRlIFNRX1NUUklORwotJXN0YXRlIFVuRGVsaW1pdGVkU3RyaW5nCi0KLSUlCi0KLQotPFlZSU5JVElBTD4gIAotewotCS8vIGZvcmNlIHRvIHN0YXJ0IGF0IGJlZ2lubmluZyBvZiBsaW5lICheKSBhbmQgYXQgYmVnaW5uaW5nIG9mIGZpbGUgKHl5Y2hhciA9PSAwKQotCV57VVRGMTZCRX0gICAJCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9fQotCV57VVRGMTZMRX0gICAJCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9fQotCV57VVRGODNCeXRlQk9NfSAgIAl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9fQotCQotCS8vIGZvcmNlIHRvIGJlIHN0YXJ0ZWQgb24gZmlyc3QgbGluZSwgYnV0IHdlIGRvIGFsbG93IHByZWNlZWRpbmcgc3BhY2VzCi0JXiB7U30qICI8XD94bWwiIHtTfSsge2lmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fX0KLQkKLX0JCi0JCi08U1RfWE1MRGVjbD4gCi17Ci0vLyAgICAgIGNvbW1lbnRlZCBvdXQgJ3ZlcnNpb24nIHNpbmNlIHdlIGRvbid0IHJlYWxseSB1c2UsIGJ1dCBjb3VsZCBhZGQgYmFjayBpbiBoZXJlIGlmIG5lZWRlZAotLy8JInZlcnNpb24iIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uO30KLQkiZW5jb2RpbmciIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nO30KLQkvLyBub3RlIHRoZSAiZm9yY2VkIGVuZCIgKHZpYSAnaGFzTW9yZT1mYWxzZScpIG9uY2UgdGhlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQKLQkvLyBUaGlzIGlzIHNpbmNlIG5vbi1hc2NpaSBjaGFycyBtYXkgZm9sbG93IGFuZCBtYXkgY2F1c2UgSU9FeGNlcHRpb25zIHdoaWNoIHdvdWxkIG5vdCBvY2N1ciBvbmNlIHN0cmVhbSBpcyAKLQkvLyByZWFkIHdpdGggaW5jb3JyZWN0IGVuY29kaW5nIChzdWNoIGFzIGlmIHBsYXRmb3JtIGVuY29kaW5nIGlzIGluIGVmZmVjdCB1bnRpbCB0cnVlIGVuY29kaW5nIGRldGVjdGVkKS4gCi0JIlw/PiIgICAge3l5YmVnaW4oWVlJTklUSUFMKTsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kO30KLX0JCi0KLQkKLQotPFF1b3RlZEF0dHJpYnV0ZVZhbHVlPgotewotCVwiICAgICAgICAgICAgICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JXCcJCQl7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotCS8vIGluIHRoaXMgc3RhdGUsIGFueXRoaW5nIG90aGVyIHRoYW4gYSBzcGFjZSBjaGFyYWN0ZXIgY2FuIHN0YXJ0IGFuIHVuZGVsaW1pdGVkIHN0cmluZwotCXtTfSouICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApO30KLQotfQkKLQotCi08RFFfU1RSSU5HPgotewotCi0JXCIgICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyB9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXD8+IgkJCXsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQknPCcJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLQotfQotCi08U1FfU1RSSU5HPgotewotCi0JXCcgICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlO30KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSIlPiIJCQl7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQknPCcJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLQotfQotCi08VW5EZWxpbWl0ZWRTdHJpbmc+Ci17Ci0KLQl7U30gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXD8+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSc8JwkKLQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkvLyB0aGVzZSBhcmUgYSBiaXQgc3BlY2lhbCwgc2luY2Ugd2Ugc3RhcnRlZCBhbiB1bmRlbGltaXQgc3RyaW5nLCBidXQgZm91bmQgYSBxdW90ZSAuLi4gcHJvYmFibHkgaW5kaWNhdGVzIGEgbWlzc2luZyBiZWdpbm5pbmcgcXVvdGUKLQlcJwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQotCQotCVwiCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JCi0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi19Ci0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcKLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpCi08WVlJTklUSUFMLCBTVF9YTUxEZWNsLCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4KLXsKLS8vIHRoaXMgaXMgdGhlIGZhbGxiYWNrIChtYXRjaCAiYW55dGhpbmciKSBydWxlICAoZm9yIHRoaXMgc2Nhbm5lciwgaW5wdXQgaXMgaWdub3JlZCwgYW5kIHBvc2l0aW9uIGFkdmFuY2VkLCBpZiBub3QgcmVjb2duaXplZCkKLS58XG4gICAgICAgICAgICAgIHtpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fX0KLX0KLQotLy8gdGhpcyBydWxlIGFsd2F5cyBpbiBlZmZlY3QKLTw8RU9GPj4gICAgICAgICB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GO30KLQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NjU5NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gNC82LzA0IDExOjEzIFBNICovCi0KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5IZWFkUGFyc2VyVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSW50U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gNC82LzA0IDExOjEzIFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNDsKLQotICAvKioKLSAgICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCA2Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcNlwxXDdcMlwwXDFcMTFcMjJcMFwxXDZcMVwwXDFcMjdcMlwwIisKLSAgICAiXDFcMzFcMVwwXDFcMzBcMjRcMFwxXDEyXDFcMTBcMVwyNlwxXDEzXDNcMFwxXDIxIisKLSAgICAiXDFcMjNcMVwxN1wxXDBcMVwyNVwxXDBcMVwyNFwyXDBcMVwxNlwxXDE1XDFcMjAiKwotICAgICJcMVwyMlwxMFwwXDFcMTRcMTJcMFwxXDIxXDFcMjNcMVwxN1wxXDBcMVwyNVwxXDAiKwotICAgICJcMVwyNFwyXDBcMVwxNlwxXDE1XDFcMjBcMVwyMlwxMFwwXDFcMTRcMTAyXDBcMVw0IisKLSAgICAiXDNcMFwxXDVcMTdcMFwxXDNcMTZcMFwxXDFcMjBcMFwxXDNcMTZcMFwxXDEiKwotICAgICJcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDEwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCXB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKiAKLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgCQkgKiBmcm9tIGlucHV0IAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0gIAkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotICAJCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50IAotICAJCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLiAKLSAgCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotICAJCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0gIAkJfQotCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0JCi0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMjgpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0KLSAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgCWhhc01vcmU9ZmFsc2U7Ci0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIHl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXG4nOwotICAgICAgaWYgKCF5eV9hdEJPTCAmJiB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdccicpIHsKLSAgICAgICAgeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLSAgICAgICAgaWYgKCF5eV9hdEVPRikgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgaWYgKHl5X2F0Qk9MKQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZV07Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5Y21hcFt5eV9pbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHl5X2lzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB5eV9mb3JOZXh0OiB7IHN3aXRjaCAoeXlfc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHl5X2lzRmluYWwgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggeXlfbm9Mb29rQWhlYWQgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgICB7ICBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNTU6IGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDU2OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0gICAgICAgIGNhc2UgNTc6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDU5OiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fSB9Ci0gICAgICAgIGNhc2UgNjE6IGJyZWFrOwotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO30gfQotICAgICAgICBjYXNlIDYyOiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9IH0KLSAgICAgICAgY2FzZSA2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9IH0KLSAgICAgICAgY2FzZSA2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9IH0KLSAgICAgICAgY2FzZSA2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7IH0KLSAgICAgICAgY2FzZSA2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSA2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgNjg6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7ICBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyAgfQotICAgICAgICBjYXNlIDY5OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgICAgeyAgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDcwOiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDcxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgNzI6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjsgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqIFJ1bnMgdGhlIHNjYW5uZXIgb24gaW5wdXQgZmlsZXMuCi0gICAqCi0gICAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4KLSAgICogSXQgcHJpbnRzIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mCi0gICAqIGZpbGUgaXMgcmVhY2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJlZC4KLSAgICoKLSAgICogQHBhcmFtIGFyZ3YgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1bgotICAgKiAgICAgICAgICAgICAgIHRoZSBzY2FubmVyIG9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotICAgICAgWE1MSGVhZFRva2VuaXplciBzY2FubmVyID0gbnVsbDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNjYW5uZXIgPSBuZXcgWE1MSGVhZFRva2VuaXplciggbmV3IGphdmEuaW8uRmlsZVJlYWRlcihhcmd2W2ldKSApOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUgXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIFhNTEhlYWRUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci5wcmltR2V0TmV4dFRva2VuKCkpOwotICAgICAgICB9IHdoaWxlICghc2Nhbm5lci55eV9hdEVPRik7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjMWM3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUBlY2hvIG9uDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7RDpcSkRLc1xqMnNkazEuNC4yXzAzXGJpbg0KLXNldCBXT1JLU1BBQ0VfTE9DQVRJT049RDpcYnVpbGRzXFdvcmtzcGFjZXNcV1NXQk04DQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleFxsaWINCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZGlmZmVyIGZyb20gcHJvamVjdCB0byBwcm9qZWN0LCBidXQgc2hvdWxkIGJlIG90aGVyd2lzZSBjb25zdGFudA0KLXNldCBNQUlOX05BTUU9WE1MSGVhZFRva2VuaXplcg0KLQ0KLXJlbSBzZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWxcc3JjXA0KLXJlbSBzZXQgUEFDS0FHRV9ESVI9Y29tXGlibVxzc2VcbW9kZWxceG1sXGVuY29kaW5nXA0KLQ0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWNcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXGVuY29kaW5nXHJlc291cmNlXGNvbnRlbnRzcGVjaWZpY1x4bWxcDQotDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXBhdXNlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTZjMzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1SZWFkaW5nICJYTUxIZWFkVG9rZW5pemVyLmpmbGV4IgotCi1XYXJuaW5nIDogTWFjcm8gIlNwYWNlQ2hhciIgaGFzIGJlZW4gZGVjbGFyZWQgYnV0IG5ldmVyIHVzZWQuCi1Db25zdHJ1Y3RpbmcgTkZBIDogMzU4IHN0YXRlcyBpbiBORkEKLUNvbnZlcnRpbmcgTkZBIHRvIERGQSA6IAotLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotNzkgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDU0IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIlhNTEhlYWRUb2tlbml6ZXIuamF2YSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvb2xkWE1MSGVhZFRva2VuaXplci5za2VsZXRvbiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvb2xkWE1MSGVhZFRva2VuaXplci5za2VsZXRvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwOTYwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL29sZFhNTEhlYWRUb2tlbml6ZXIuc2tlbGV0b24KKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotDQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8NCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7DQotDQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8NCi0tLS0gIGxleGljYWwgc3RhdGVzLCBjaGFybWFwDQotDQotICAvKiBlcnJvciBjb2RlcyAqLw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsNCi0NCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsNCi0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAkJLy8kTk9OLU5MUy0xJA0KLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQNCi0gIH07DQotDQotLS0tIGlzRmluYWwgbGlzdA0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOw0KLQ0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOw0KLQ0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7DQotDQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7DQotDQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOw0KLQ0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsNCi0NCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsNCi0NCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0gICAgICBmcm9tIGlucHV0ICovDQotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOw0KLQ0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOw0KLQ0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOw0KLQ0KLSAgDQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOw0KLQ0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotDQotDQotLS0tIHVzZXIgY2xhc3MgY29kZQ0KLQ0KLSAgLyoqDQotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXINCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4NCi0gICAqDQotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4NCi0gICAqLw0KLS0tLSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbg0KLQ0KLQ0KLSAgLyoqDQotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4NCi0gICAqDQotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUNCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLg0KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3Vycw0KLSAgICovDQotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLQ0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOw0KLQ0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIA0KLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsNCi0NCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovDQotDQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovDQotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7DQotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgDQotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOw0KLQ0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovDQotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9zdGFydFJlYWQgPSAwOw0KLSAgICB9DQotDQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8NCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgew0KLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLw0KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOw0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOw0KLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsNCi0gICAgfQ0KLQ0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8NCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsNCi0NCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOw0KLQ0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsNCi0NCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOw0KLSAgfQ0KLQ0KLSAgICANCi0gIC8qKg0KLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLw0KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8NCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgew0KLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUNCi0gICAqDQotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7DQotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7DQotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7DQotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbg0KLSAgICoNCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5DQotICAgKi8NCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgew0KLSAgICB0cnkgew0KLSAgICAgIC8vTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsNCi0JU3lzdGVtLm91dC5wcmludGxuKCJTY2FuRXJyb3I6ICIgKyBlcnJvckNvZGUgKyAiOiAiICsgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOw0KLSAgICB9DQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLSAgICAgIC8vTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7DQotCVN5c3RlbS5vdXQucHJpbnRsbigiU2NhbkVycm9yOiAiICsgZXJyb3JDb2RlICsgIjogIiArIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7DQotICAgfQ0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3INCi0gICAgLy8gU3lzdGVtLmV4aXQoMSk7DQotICB9IA0KLQ0KLQ0KLSAgLyoqDQotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4NCi0gICAqDQotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kDQotICAgKg0KLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uDQotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSENCi0gICAqLw0KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgew0KLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQ0KLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsNCi0NCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsNCi0gIH0NCi0NCi0NCi0tLS0geXlfZG9Fb2YNCi0gIC8qKg0KLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwNCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4NCi0gICAqDQotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLS0tLSB5eWxleCBkZWNsYXJhdGlvbg0KLSAgICBpbnQgeXlfaW5wdXQ7DQotICAgIGludCB5eV9hY3Rpb247DQotDQotLS0tIGxvY2FsIGRlY2xhcmF0aW9ucw0KLQ0KLSAgICB3aGlsZSAodHJ1ZSkgew0KLQ0KLS0tLSBzdGFydCBhZG1pbiAobGluZSwgY2hhciwgY29sIGNvdW50KQ0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOw0KLQ0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7DQotDQotLS0tIHN0YXJ0IGFkbWluIChsZXhzdGF0ZSBldGMpDQotDQotICAgICAgeXlfZm9yQWN0aW9uOiB7DQotICAgICAgICB3aGlsZSAodHJ1ZSkgew0KLSAgICANCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7DQotDQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247DQotDQotLS0tIGxpbmUsIGNvbCwgY2hhciBjb3VudCwgbmV4dCB0cmFuc2l0aW9uLCBpc0ZpbmFsIGFjdGlvbg0KLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyANCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyANCi0tLS0gbGluZSBjb3VudCB1cGRhdGUNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0tLS0gY2hhciBjb3VudCB1cGRhdGUNCi0NCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICANCi0NCi0tLS0gYWN0aW9ucw0KLSAgICAgICAgZGVmYXVsdDogDQotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgew0KLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsNCi0tLS0gZW9mdmFsdWUNCi0gICAgICAgICAgfSANCi0gICAgICAgICAgZWxzZSB7DQotLS0tIG5vIG1hdGNoDQotICAgICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0gICAgDQotDQotLS0tIG1haW4NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSlNNb2RlbC9idWlsZC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9KU01vZGVsL2J1aWxkLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5Y2Y2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9KU01vZGVsL2J1aWxkLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotRG8gbm90IGNoZWNrIGluIGNsYXNzZXMgZ2VuZXJhdGVkIGJ5IHNhYmxlY2MuICBUaGUgY2xhc3NlcyBhbHJlYWR5IGNoZWNrZWQgaW4gYXJlIGVuaGFuY2VkIGJ5IGhhbmQgaW4gc2V2ZXJhbCB3YXlzIGFuZCByZWJ1aWxkaW5nIGZyb20gdGhlIGdyYW1tYXIgd2lsbCBjYXVzZSB0aGUgdGhvc2UgaGFuZCBtYWRlIGNoYW5nZXMgdG8gYmUgbG9zdC4gICBJZiB5b3UgbmVlZCB0byByZWJ1aWxkIGZyb20gdGhlIGdyYW1tYXIsIHlvdSdsbCBuZWVkIHRvICptZXJnZSogdGhlIGdlbmVyYXRlZCBjbGFzc2VzIHdpdGggdGhlIGNsYXNzZXMgd2UgYWxyZWFkeSBoYXZlIGNoZWNrZWQgaW4uICBJIHN1Z2dlc3QgeW91IGJ1aWxkIGZpcnN0IHdpdGhvdXQgYW55IGdyYW1tYXIgY2hhbmdlcyBzbyB0aGF0IHlvdSBjYW4gc2VlIHdoYXQgd2FzIGdlbmVyYXRlZCBiZWZvcmUgd2UgbWFkZSBvdXIgY2hhbmdlcy4gIFRoaXMgd2lsbCBhbGxvdyB5b3UgdG8gZG8gYSB0aHJlZSB3YXkgbWVyZ2UuCi0KLUkndmUgaW5jbHVkZWQgdGhlIHNhYmxlY2MgYnVpbGQgdGhhdCBJIHVzZWQgaGVyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9KU01vZGVsL2VjbWFsZXhlcm9ubHkuc2FibGVncmFtbWFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSlNNb2RlbC9lY21hbGV4ZXJvbmx5LnNhYmxlZ3JhbW1hcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwYjY4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9KU01vZGVsL2VjbWFsZXhlcm9ubHkuc2FibGVncmFtbWFyCisrKyAvZGV2L251bGwKQEAgLTEsNjc2ICswLDAgQEAKLS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqDQotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgU2NyaXB0b25pdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKiBTZWUgdGhlIGZpbGUgIlNjcmlwdG9uaXRlLUxJQ0VOU0UiIGZvciBDb3B5cmlnaHQgaW5mb3JtYXRpb24gICAgKg0KLSAqIGFuZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgICAgICAqDQotICogbW9kaWZpY2F0aW9uIG9mIFNjcmlwdG9uaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8NCi0NCi0vKioNCi0gKiBUaHJvdWdob3V0IHRoaXMgZmlsZSByZWZlcmVuY2UgaXMgbWFkZSB0byBbRUNNQS0yNjJdLiBUaGlzIGlzIHRoZSBTdGFuZGFyZA0KLSAqIEVDTUEtMjYyLCBFQ01BU2NyaXB0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDNyZCBFZGl0aW9uIGRhdGVkIERlY2VtYmVyIDk5Lg0KLSAqIEEgUG9ydGFibGUgRG9jdW1lbnQgRm9ybWF0IChQREYpIHZlcnNpb24gaXMgaW5jbHVkZWQgaW4gdGhlIFNjcmlwdG9uaXRlDQotICogZGlzdHJpYnV0aW9uIChpbiBzY3JpcHRvbml0ZS9kb2NzLykuDQotICoNCi0gKiBbRUNNQS0yNjJdIHJlZmVycyB0byB0aGUgVU5JQ09ERSBjaGFyYWN0ZXIgY2hhcnQuIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcw0KLSAqIHRoZSBVTklDT0RFIDMuMCBDaGFyYWN0ZXIgQ2hhcnQsIGF2YWlsYWJsZSBmcm9tIHd3dy51bmljb2RlLm9yZyBhdA0KLSAqIDxmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljL1VOSURBVEEvVW5pY29kZURhdGEtTGF0ZXN0LnR4dD4uDQotICovDQotUGFja2FnZSBjb20uaWJtLnNlZC5qc3BhcnNlcjsNCi0NCi1IZWxwZXJzDQotICAgLyoqDQotICAgICogNi4gU291cmNlIFRleHQuIFtFQ01BLTI2Ml0gcC4gMTAuDQotICAgICovDQotICAgc291cmNlX2NoYXJhY3RlciA9IFsweDAwMDAuLjB4RkZGRl07DQotDQotICAgLyoqDQotICAgICogNy4yLiBXaGl0ZSBTcGFjZS4gW0VDTUEtMjYyXSBwcC4gMTEtMTIuDQotICAgICovDQotICAgdGFiID0gIDB4MDAwOTsNCi0gICB2dCA9ICAgMHgwMDBCOw0KLSAgIGZmID0gICAweDAwMEM7DQotICAgc3AgPSAgIDB4MDAyMDsNCi0gICBuYnNwID0gMHgwMEEwOw0KLSAgIHVzcCA9ICAweDE2ODAgIC8vIE9HSEFNIFNQQUNFIE1BUksNCi0gICAgICB8ICAgMHgyMDAwICAvLyBFTiBRVUFEDQotICAgICAgfCAgIDB4MjAwMSAgLy8gRU0gUVVBRA0KLSAgICAgIHwgICAweDIwMDIgIC8vIEVOIFNQQUNFDQotICAgICAgfCAgIDB4MjAwMyAgLy8gRU0gU1BBQ0UNCi0gICAgICB8ICAgMHgyMDA0ICAvLyBUSFJFRS1QRVItRU0gU1BBQ0UNCi0gICAgICB8ICAgMHgyMDA1ICAvLyBGT1VSLVBFUi1FTSBTUEFDRQ0KLSAgICAgIHwgICAweDIwMDYgIC8vIFNJWC1QRVItRU0gU1BBQ0UNCi0gICAgICB8ICAgMHgyMDA3ICAvLyBGSUdVUkUgU1BBQ0UNCi0gICAgICB8ICAgMHgyMDA4ICAvLyBQVU5DVFVBVElPTiBTUEFDRQ0KLSAgICAgIHwgICAweDIwMDkgIC8vIFRISU4gU1BBQ0UNCi0gICAgICB8ICAgMHgyMDBBICAvLyBIQUlSIFNQQUNFDQotICAgICAgfCAgIDB4MjAwQiAgLy8gWkVSTyBXSURUSCBTUEFDRQ0KLSAgICAgIHwgICAweDIwMkYgIC8vIE5BUlJPVyBOTy1CUkVBSyBTUEFDRQ0KLSAgICAgIHwgICAweDMwMDAgIC8vIElERU9HUkFQSElDIFNQQUNFDQotICAgICAgOw0KLQ0KLSAgIHNpbXBsZV93aGl0ZV9zcGFjZSA9IHRhYiB8IHZ0IHwgZmYgfCBzcCB8IG5ic3AgfCB1c3A7DQotDQotICAgLyoqDQotICAgICogIDcuMy4gTGluZSBUZXJtaW5hdG9ycy4gW0VDTUEtMjYyXSBwLiAxMi4NCi0gICAgKi8NCi0gICBsZiA9IDB4MDAwQTsgLy8gTGluZSBGZWVkDQotICAgY3IgPSAweDAwMEQ7IC8vIENhcnJpYWdlIFJldHVybg0KLSAgIGxzID0gMHgyMDI4OyAvLyBMaW5lIHNlcGFyYXRvcg0KLSAgIHBzID0gMHgyMDI5OyAvLyBQYXJhZ3JhcGggc2VwYXJhdG9yDQotICAgDQotICAgbGluZV90ZXJtaW5hdG9yID0gW2xmICsgW2NyICsgW2xzICsgcHNdXV07DQotDQotICAgbm9uX3Rlcm1pbmF0b3IgPSBbc291cmNlX2NoYXJhY3RlciAtIGxpbmVfdGVybWluYXRvcl07DQotDQotICAgLyoqDQotICAgICogNy4yLiBDb21tZW50cy4gW0VDTUEtMjYyXSBwcC4gMTItMTMuDQotICAgICovDQotLyoqDQotcmVkb25lIGJlbG93IGJ5IGpsYw0KLSAgIG11bHRpX2xpbmVfY29tbWVudCA9DQotICAgICAgICAnLyonICcqJyogKFtzb3VyY2VfY2hhcmFjdGVyIC0gWycvJyArICcqJ11dIFtzb3VyY2VfY2hhcmFjdGVyIC0gJyonXSogJyonKikqICcqJyAnLyc7DQotDQotICAgbXVsdGlfbGluZV9jb21tZW50X25vX2x0ID0NCi0gICAgICAgICcvKicgJyonKiAoW25vbl90ZXJtaW5hdG9yIC0gWycvJyArICcqJ11dIFtub25fdGVybWluYXRvciAtICcqJ10qICcqJyopKiAnKicgJy8nOw0KLSovICAgICAgICANCi0gICBtdWx0aV9saW5lX2NvbW1lbnQgPQ0KLSAgICAgICAgJy8qJyAnKicqIChbc291cmNlX2NoYXJhY3RlciAtIFsnLycgKyAnKiddXSBbc291cmNlX2NoYXJhY3RlciAtICcqJ10qICcqJyopKiAnKicgJy8nDQotICAgICAgIHwgJy8qKicgJy8nDQotICAgICAgIDsgDQotDQotICAgbXVsdGlfbGluZV9jb21tZW50X25vX2x0ID0NCi0gICAgICAgICcvKicgJyonKiAoW25vbl90ZXJtaW5hdG9yIC0gWycvJyArICcqJ11dIFtub25fdGVybWluYXRvciAtICcqJ10qICcqJyopKiAnKi8nDQotICAgICAgIHwgJy8qKicgJy8nDQotICAgICAgIDsgDQotDQotICAgbXVsdGlfbGluZV9jb21tZW50X3VudGVybWluYXRlZCA9DQotICAgICAgICAnLyonICcqJyogKFtzb3VyY2VfY2hhcmFjdGVyIC0gWycvJyArICcqJ11dIFtzb3VyY2VfY2hhcmFjdGVyIC0gJyonXSogJyonKikqIA0KLSAgICAgICAgOw0KLQ0KLSAgIHNpbmdsZV9saW5lX2NvbW1lbnQgPSAnLy8nIG5vbl90ZXJtaW5hdG9yKjsNCi0NCi0gICBjb21tZW50ID0NCi0gICAgICAgIG11bHRpX2xpbmVfY29tbWVudF9ub19sdA0KLSAgICAgIHwgbXVsdGlfbGluZV9jb21tZW50DQotICAgICAgfCBzaW5nbGVfbGluZV9jb21tZW50DQotICAgICAgOw0KLQ0KLSAgIC8qKg0KLSAgICAqIFVuaWNvZGVMZXR0ZXIuIFtFQ01BLTI2Ml0gcC4gMTUuDQotICAgICogYW55IGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZSBjYXRlZ29yaWVzICJVcHBlcmNhc2UgbGV0dGVyIChMdSkiLA0KLSAgICAqICJMb3dlcmNhc2UgbGV0dGVyIChMbCkiLCAiVGl0bGVjYXNlIGxldHRlciAoTHQpIiwgIk1vZGlmaWVyIGxldHRlcg0KLSAgICAqIChMbSkiLCAiT3RoZXIgbGV0dGVyIChMbykiLCBvciAiTGV0dGVyIG51bWJlciAoTmwpIi4NCi0gICAgKi8NCi0gICB1bmljb2RlX2xldHRlciA9DQotICAgICAgICBbMHgwMDQxLi4weDAwNUFdIHwgWzB4MDA2MS4uMHgwMDdBXSB8ICAweDAwQUEgICAgICAgICAgfCAgMHgwMEI1DQotICAgICAgfCAgMHgwMEJBICAgICAgICAgIHwgWzB4MDBDMC4uMHgwMEQ2XSB8IFsweDAwRDguLjB4MDBGNl0gfCBbMHgwMEY4Li4weDAyMUZdDQotICAgICAgfCBbMHgwMjIyLi4weDAyMzNdIHwgWzB4MDI1MC4uMHgwMkFEXSB8IFsweDAyQjAuLjB4MDJCOF0gfCBbMHgwMkJCLi4weDAyQzFdDQotICAgICAgfCBbMHgwMkQwLi4weDAyRDFdIHwgWzB4MDJFMC4uMHgwMkU0XSB8ICAweDAyRUUgICAgICAgICAgfCAgMHgwMzdBDQotICAgICAgfCAgMHgwMzg2ICAgICAgICAgIHwgWzB4MDM4OC4uMHgwMzhBXSB8ICAweDAzOEMgICAgICAgICAgfCBbMHgwMzhFLi4weDAzQTFdDQotICAgICAgfCBbMHgwM0EzLi4weDAzQ0VdIHwgWzB4MDNEMC4uMHgwM0Q3XSB8IFsweDAzREEuLjB4MDNGM10gfCBbMHgwNDAwLi4weDA0ODFdDQotICAgICAgfCBbMHgwNDhDLi4weDA0QzRdIHwgWzB4MDRDNy4uMHgwNEM4XSB8IFsweDA0Q0IuLjB4MDRDQ10gfCBbMHgwNEQwLi4weDA0RjVdDQotICAgICAgfCBbMHgwNEY4Li4weDA0RjldIHwgWzB4MDUzMS4uMHgwNTU2XSB8ICAweDA1NTkgICAgICAgICAgfCBbMHgwNTYxLi4weDA1ODddDQotICAgICAgfCBbMHgwNUQwLi4weDA1RUFdIHwgWzB4MDVGMC4uMHgwNUYyXSB8IFsweDA2MjEuLjB4MDYzQV0gfCBbMHgwNjQwLi4weDA2NEFdDQotICAgICAgfCBbMHgwNjcxLi4weDA2RDNdIHwgIDB4MDZENSAgICAgICAgICB8IFsweDA2RTUuLjB4MDZFNl0gfCBbMHgwNkZBLi4weDA2RkNdDQotICAgICAgfCAgMHgwNzEwICAgICAgICAgIHwgWzB4MDcxMi4uMHgwNzJDXSB8IFsweDA3ODAuLjB4MDdBNV0gfCBbMHgwOTA1Li4weDA5MzldDQotICAgICAgfCAgMHgwOTNEICAgICAgICAgIHwgIDB4MDk1MCAgICAgICAgICB8IFsweDA5NTguLjB4MDk2MV0gfCBbMHgwOTg1Li4weDA5OENdDQotICAgICAgfCBbMHgwOThGLi4weDA5OTBdIHwgWzB4MDk5My4uMHgwOUE4XSB8IFsweDA5QUEuLjB4MDlCMF0gfCAgMHgwOUIyDQotICAgICAgfCBbMHgwOUI2Li4weDA5QjldIHwgWzB4MDlEQy4uMHgwOUREXSB8IFsweDA5REYuLjB4MDlFMV0gfCBbMHgwOUYwLi4weDA5RjFdDQotICAgICAgfCBbMHgwQTA1Li4weDBBMEFdIHwgWzB4MEEwRi4uMHgwQTEwXSB8IFsweDBBMTMuLjB4MEEyOF0gfCBbMHgwQTJBLi4weDBBMzBdDQotICAgICAgfCBbMHgwQTMyLi4weDBBMzNdIHwgWzB4MEEzNS4uMHgwQTM2XSB8IFsweDBBMzguLjB4MEEzOV0gfCBbMHgwQTU5Li4weDBBNUNdDQotICAgICAgfCAgMHgwQTVFICAgICAgICAgIHwgWzB4MEE3Mi4uMHgwQTc0XSB8IFsweDBBODUuLjB4MEE4Ql0gfCAgMHgwQThEDQotICAgICAgfCBbMHgwQThGLi4weDBBOTFdIHwgWzB4MEE5My4uMHgwQUE4XSB8IFsweDBBQUEuLjB4MEFCMF0gfCBbMHgwQUIyLi4weDBBQjNdDQotICAgICAgfCBbMHgwQUI1Li4weDBBQjldIHwgIDB4MEFCRCAgICAgICAgICB8ICAweDBBRDAgICAgICAgICAgfCAgMHgwQUUwDQotICAgICAgfCBbMHgwQjA1Li4weDBCMENdIHwgWzB4MEIwRi4uMHgwQjEwXSB8IFsweDBCMTMuLjB4MEIyOF0gfCBbMHgwQjJBLi4weDBCMzBdDQotICAgICAgfCBbMHgwQjMyLi4weDBCMzNdIHwgWzB4MEIzNi4uMHgwQjM5XSB8ICAweDBCM0QgICAgICAgICAgfCBbMHgwQjVDLi4weDBCNURdDQotICAgICAgfCBbMHgwQjVGLi4weDBCNjFdIHwgWzB4MEI4NS4uMHgwQjhBXSB8IFsweDBCOEUuLjB4MEI5MF0gfCBbMHgwQjkyLi4weDBCOTVdDQotICAgICAgfCBbMHgwQjk5Li4weDBCOUFdIHwgIDB4MEI5QyAgICAgICAgICB8IFsweDBCOUUuLjB4MEI5Rl0gfCBbMHgwQkEzLi4weDBCQTRdDQotICAgICAgfCBbMHgwQkE4Li4weDBCQUFdIHwgWzB4MEJBRS4uMHgwQkI1XSB8IFsweDBCQjcuLjB4MEJCOV0gfCBbMHgwQzA1Li4weDBDMENdDQotICAgICAgfCBbMHgwQzBFLi4weDBDMTBdIHwgWzB4MEMxMi4uMHgwQzI4XSB8IFsweDBDMkEuLjB4MEMzM10gfCBbMHgwQzM1Li4weDBDMzldDQotICAgICAgfCBbMHgwQzYwLi4weDBDNjFdIHwgWzB4MEM4NS4uMHgwQzhDXSB8IFsweDBDOEUuLjB4MEM5MF0gfCBbMHgwQzkyLi4weDBDQThdDQotICAgICAgfCBbMHgwQ0FBLi4weDBDQjNdIHwgWzB4MENCNS4uMHgwQ0I5XSB8ICAweDBDREUgICAgICAgICAgfCBbMHgwQ0UwLi4weDBDRTFdDQotICAgICAgfCBbMHgwRDA1Li4weDBEMENdIHwgWzB4MEQwRS4uMHgwRDEwXSB8IFsweDBEMTIuLjB4MEQyOF0gfCBbMHgwRDJBLi4weDBEMzldDQotICAgICAgfCBbMHgwRDYwLi4weDBENjFdIHwgWzB4MEQ4NS4uMHgwRDk2XSB8IFsweDBEOUEuLjB4MERCMV0gfCBbMHgwREIzLi4weDBEQkJdDQotICAgICAgfCAgMHgwREJEICAgICAgICAgIHwgWzB4MERDMC4uMHgwREM2XSB8IFsweDBFMDEuLjB4MEUzMF0gfCBbMHgwRTMyLi4weDBFMzNdDQotICAgICAgfCBbMHgwRTQwLi4weDBFNDZdIHwgWzB4MEU4MS4uMHgwRTgyXSB8ICAweDBFODQgICAgICAgICAgfCBbMHgwRTg3Li4weDBFODhdDQotICAgICAgfCAgMHgwRThBICAgICAgICAgIHwgIDB4MEU4RCAgICAgICAgICB8IFsweDBFOTQuLjB4MEU5N10gfCBbMHgwRTk5Li4weDBFOUZdDQotICAgICAgfCBbMHgwRUExLi4weDBFQTNdIHwgIDB4MEVBNSAgICAgICAgICB8ICAweDBFQTcgICAgICAgICAgfCBbMHgwRUFBLi4weDBFQUJdDQotICAgICAgfCBbMHgwRUFELi4weDBFQjBdIHwgWzB4MEVCMi4uMHgwRUIzXSB8IFsweDBFQkQuLjB4MEVDNF0gfCAgMHgwRUM2DQotICAgICAgfCBbMHgwRURDLi4weDBFRERdIHwgIDB4MEYwMCAgICAgICAgICB8IFsweDBGNDAuLjB4MEY2QV0gfCBbMHgwRjg4Li4weDBGOEJdDQotICAgICAgfCBbMHgxMDAwLi4weDEwMjFdIHwgWzB4MTAyMy4uMHgxMDI3XSB8IFsweDEwMjkuLjB4MTAyQV0gfCBbMHgxMDUwLi4weDEwNTVdDQotICAgICAgfCBbMHgxMEEwLi4weDEwQzVdIHwgWzB4MTBEMC4uMHgxMEY2XSB8IFsweDExMDAuLjB4MTE1OV0gfCBbMHgxMTVGLi4weDExQTJdDQotICAgICAgfCBbMHgxMUE4Li4weDExRjldIHwgWzB4MTIwMC4uMHgxMjA2XSB8IFsweDEyMDguLjB4MTI0Nl0gfCAgMHgxMjQ4DQotICAgICAgfCBbMHgxMjRBLi4weDEyNERdIHwgWzB4MTI1MC4uMHgxMjU2XSB8ICAweDEyNTggICAgICAgICAgfCBbMHgxMjVBLi4weDEyNURdDQotICAgICAgfCBbMHgxMjYwLi4weDEyODZdIHwgIDB4MTI4OCAgICAgICAgICB8IFsweDEyOEEuLjB4MTI4RF0gfCBbMHgxMjkwLi4weDEyQUVdDQotICAgICAgfCAgMHgxMkIwICAgICAgICAgIHwgWzB4MTJCMi4uMHgxMkI1XSB8IFsweDEyQjguLjB4MTJCRV0gfCAgMHgxMkMwDQotICAgICAgfCBbMHgxMkMyLi4weDEyQzVdIHwgWzB4MTJDOC4uMHgxMkNFXSB8IFsweDEyRDAuLjB4MTJENl0gfCBbMHgxMkQ4Li4weDEyRUVdDQotICAgICAgfCBbMHgxMkYwLi4weDEzMEVdIHwgIDB4MTMxMCAgICAgICAgICB8IFsweDEzMTIuLjB4MTMxNV0gfCBbMHgxMzE4Li4weDEzMUVdDQotICAgICAgfCBbMHgxMzIwLi4weDEzNDZdIHwgWzB4MTM0OC4uMHgxMzVBXSB8IFsweDEzQTAuLjB4MTNCMF0gfCBbMHgxM0IxLi4weDEzRjRdDQotICAgICAgfCBbMHgxNDAxLi4weDE2NzZdIHwgWzB4MTY4MS4uMHgxNjlBXSB8IFsweDE2QTAuLjB4MTZFQV0gfCBbMHgxNzgwLi4weDE3QjNdDQotICAgICAgfCBbMHgxODIwLi4weDE4NzddIHwgWzB4MTg4MC4uMHgxOEE4XSB8IFsweDFFMDAuLjB4MUU5Ql0gfCBbMHgxRUEwLi4weDFFRTBdDQotICAgICAgfCBbMHgxRUUxLi4weDFFRjldIHwgWzB4MUYwMC4uMHgxRjE1XSB8IFsweDFGMTguLjB4MUYxRF0gfCBbMHgxRjIwLi4weDFGMzldDQotICAgICAgfCBbMHgxRjNBLi4weDFGNDVdIHwgWzB4MUY0OC4uMHgxRjREXSB8IFsweDFGNTAuLjB4MUY1N10gfCAgMHgxRjU5DQotICAgICAgfCAgMHgxRjVCICAgICAgICAgIHwgIDB4MUY1RCAgICAgICAgICB8IFsweDFGNUYuLjB4MUY3RF0gfCBbMHgxRjgwLi4weDFGQjRdDQotICAgICAgfCBbMHgxRkI2Li4weDFGQkNdIHwgIDB4MUZCRSAgICAgICAgICB8IFsweDFGQzIuLjB4MUZDNF0gfCBbMHgxRkM2Li4weDFGQ0NdDQotICAgICAgfCBbMHgxRkQwLi4weDFGRDNdIHwgWzB4MUZENi4uMHgxRkRCXSB8IFsweDFGRTAuLjB4MUZFQ10gfCBbMHgxRkYyLi4weDFGRjRdDQotICAgICAgfCBbMHgxRkY2Li4weDFGRkNdIHwgIDB4MjA3RiAgICAgICAgICB8ICAweDIxMDIgICAgICAgICAgfCAgMHgyMTA3DQotICAgICAgfCBbMHgyMTBBLi4weDIxMTNdIHwgIDB4MjExNSAgICAgICAgICB8IFsweDIxMTkuLjB4MjExRF0gfCAgMHgyMTI0DQotICAgICAgfCAgMHgyMTI2ICAgICAgICAgIHwgIDB4MjEyOCAgICAgICAgICB8IFsweDIxMkEuLjB4MjEyRF0gfCBbMHgyMTJGLi4weDIxMzFdDQotICAgICAgfCBbMHgyMTMzLi4weDIxMzldIHwgWzB4MjE2MC4uMHgyMTgzXSB8IFsweDMwMDUuLjB4MzAwN10gfCBbMHgzMDIxLi4weDMwMjldDQotICAgICAgfCBbMHgzMDMxLi4weDMwMzVdIHwgWzB4MzAzOC4uMHgzMDNBXSB8IFsweDMwNDEuLjB4MzA5NF0gfCBbMHgzMDlELi4weDMwOUVdDQotICAgICAgfCBbMHgzMEExLi4weDMwRkFdIHwgWzB4MzBGQy4uMHgzMEZFXSB8IFsweDMxMDUuLjB4MzEyQ10gfCBbMHgzMTMxLi4weDMxOEVdDQotICAgICAgfCBbMHgzMUEwLi4weDMxQjddIHwgIDB4MzQwMCAgICAgICAgICB8ICAweDREQjUgICAgICAgICAgfCAgMHg0RTAwDQotICAgICAgfCAgMHg5RkE1ICAgICAgICAgIHwgWzB4QTAwMC4uMHhBNDhDXSB8ICAweEFDMDAgICAgICAgICAgfCAgMHhEN0EzDQotICAgICAgfCBbMHhGOTAwLi4weEZBMkRdIHwgWzB4RkIwMC4uMHhGQjA2XSB8IFsweEZCMTMuLjB4RkIxN10gfCAgMHhGQjFEDQotICAgICAgfCBbMHhGQjFGLi4weEZCMjhdIHwgWzB4RkIyQS4uMHhGQjM2XSB8IFsweEZCMzguLjB4RkIzQ10gfCAgMHhGQjNFDQotICAgICAgfCBbMHhGQjQwLi4weEZCNDFdIHwgWzB4RkI0My4uMHhGQjQ0XSB8IFsweEZCNDYuLjB4RkJCMV0gfCBbMHhGQkQzLi4weEZEM0RdDQotICAgICAgfCBbMHhGRDUwLi4weEZEOEZdIHwgWzB4RkQ5Mi4uMHhGREM3XSB8IFsweEZERjAuLjB4RkRGQl0gfCBbMHhGRTcwLi4weEZFNzJdDQotICAgICAgfCAgMHhGRTc0ICAgICAgICAgIHwgWzB4RkU3Ni4uMHhGRUZDXSB8IFsweEZGMjEuLjB4RkYzQV0gfCBbMHhGRjQxLi4weEZGNUFdDQotICAgICAgfCBbMHhGRjY2Li4weEZGQkVdIHwgWzB4RkZDMi4uMHhGRkM3XSB8IFsweEZGQ0EuLjB4RkZDRl0gfCBbMHhGRkQyLi4weEZGRDddDQotICAgICAgfCBbMHhGRkRBLi4weEZGRENdDQotICAgICAgOw0KLQ0KLSAgIC8qKg0KLSAgICAqIFVuaWNvZGVDb21iaW5pbmdNYXJrLiBbRUNNQS0yNjJdIHAuIDE1Lg0KLSAgICAqIGFueSBjaGFyYWN0ZXIgaW4gdGhlIFVuaWNvZGUgY2F0ZWdvcmllcyAiTm9uLXNwYWNpbmcgbWFyayAoTW4pIiBvcg0KLSAgICAqICJDb21iaW5pbmcgc3BhY2luZyBtYXJrIChNYykiLg0KLSAgICAqLw0KLSAgIHVuaWNvZGVfY29tYmluaW5nX21hcmsgPQ0KLSAgICAgICAgWzB4MDMwMC4uMHgwMzRFXSB8IFsweDAzNjAuLjB4MDM2Ml0gfCBbMHgwNDgzLi4weDA0ODZdIHwgWzB4MDU5MS4uMHgwNUExXQ0KLSAgICAgIHwgWzB4MDVBMy4uMHgwNUI5XSB8IFsweDA1QkIuLjB4MDVCRF0gfCAgMHgwNUJGICAgICAgICAgIHwgWzB4MDVDMS4uMHgwNUMyXQ0KLSAgICAgIHwgIDB4MDVDNCAgICAgICAgICB8IFsweDA2NEIuLjB4MDY1NV0gfCAgMHgwNjcwICAgICAgICAgIHwgWzB4MDZENi4uMHgwNkRDXQ0KLSAgICAgIHwgWzB4MDZERi4uMHgwNkU0XSB8IFsweDA2RTcuLjB4MDZFOF0gfCBbMHgwNkVBLi4weDA2RURdIHwgIDB4MDcxMQ0KLSAgICAgIHwgWzB4MDczMC4uMHgwNzRBXSB8IFsweDA3QTYuLjB4MDdCMF0gfCBbMHgwOTAxLi4weDA5MDNdIHwgIDB4MDkzQw0KLSAgICAgIHwgWzB4MDkzRS4uMHgwOTREXSB8IFsweDA5NTEuLjB4MDk1NF0gfCBbMHgwOTYyLi4weDA5NjNdIHwgWzB4MDk4MS4uMHgwOTgzXQ0KLSAgICAgIHwgWzB4MDlCQy4uMHgwOUM0XSB8IFsweDA5QzcuLjB4MDlDOF0gfCBbMHgwOUNCLi4weDA5Q0RdIHwgIDB4MDlENw0KLSAgICAgIHwgWzB4MDlFMi4uMHgwOUUzXSB8ICAweDBBMDIgICAgICAgICAgfCAgMHgwQTNDICAgICAgICAgIHwgWzB4MEEzRS4uMHgwQTQyXQ0KLSAgICAgIHwgWzB4MEE0Ny4uMHgwQTQ4XSB8IFsweDBBNEIuLjB4MEE0RF0gfCBbMHgwQTcwLi4weDBBNzFdIHwgWzB4MEE4MS4uMHgwQTgzXQ0KLSAgICAgIHwgIDB4MEFCQyAgICAgICAgICB8IFsweDBBQkUuLjB4MEFDNV0gfCBbMHgwQUM3Li4weDBBQzldIHwgWzB4MEFDQi4uMHgwQUNEXQ0KLSAgICAgIHwgWzB4MEIwMS4uMHgwQjAzXSB8ICAweDBCM0MgICAgICAgICAgfCBbMHgwQjNFLi4weDBCNDNdIHwgWzB4MEI0Ny4uMHgwQjQ4XQ0KLSAgICAgIHwgWzB4MEI0Qi4uMHgwQjREXSB8IFsweDBCNTYuLjB4MEI1N10gfCBbMHgwQjgyLi4weDBCODNdIHwgWzB4MEJCRS4uMHgwQkMyXQ0KLSAgICAgIHwgWzB4MEJDNi4uMHgwQkM4XSB8IFsweDBCQ0EuLjB4MEJDRF0gfCAgMHgwQkQ3ICAgICAgICAgIHwgWzB4MEMwMS4uMHgwQzAzXQ0KLSAgICAgIHwgWzB4MEMzRS4uMHgwQzQ0XSB8IFsweDBDNDYuLjB4MEM0OF0gfCBbMHgwQzRBLi4weDBDNERdIHwgWzB4MEM1NS4uMHgwQzU2XQ0KLSAgICAgIHwgWzB4MEM4Mi4uMHgwQzgzXSB8IFsweDBDQkUuLjB4MENDNF0gfCBbMHgwQ0M2Li4weDBDQzhdIHwgWzB4MENDQS4uMHgwQ0NEXQ0KLSAgICAgIHwgWzB4MENENS4uMHgwQ0Q2XSB8IFsweDBEMDIuLjB4MEQwM10gfCBbMHgwRDNFLi4weDBENDNdIHwgWzB4MEQ0Ni4uMHgwRDQ4XQ0KLSAgICAgIHwgWzB4MEQ0QS4uMHgwRDREXSB8ICAweDBENTcgICAgICAgICAgfCBbMHgwRDgyLi4weDBEODNdIHwgIDB4MERDQQ0KLSAgICAgIHwgWzB4MERDRi4uMHgwREQ0XSB8ICAweDBERDYgICAgICAgICAgfCBbMHgwREQ4Li4weDBEREZdIHwgWzB4MERGMi4uMHgwREYzXQ0KLSAgICAgIHwgIDB4MEUzMSAgICAgICAgICB8IFsweDBFMzQuLjB4MEUzQV0gfCBbMHgwRTQ3Li4weDBFNEVdIHwgIDB4MEVCMQ0KLSAgICAgIHwgWzB4MEVCNC4uMHgwRUI5XSB8IFsweDBFQkIuLjB4MEVCQ10gfCBbMHgwRUM4Li4weDBFQ0RdIHwgWzB4MEYxOC4uMHgwRjE5XQ0KLSAgICAgIHwgIDB4MEYzNSAgICAgICAgICB8ICAweDBGMzcgICAgICAgICAgfCAgMHgwRjM5ICAgICAgICAgIHwgWzB4MEYzRS4uMHgwRjNGXQ0KLSAgICAgIHwgWzB4MEY3MS4uMHgwRjg0XSB8IFsweDBGODYuLjB4MEY4N10gfCBbMHgwRjkwLi4weDBGOTddIHwgWzB4MEY5OS4uMHgwRkJDXQ0KLSAgICAgIHwgIDB4MEZDNiAgICAgICAgICB8IFsweDEwMkMuLjB4MTAzMl0gfCBbMHgxMDM2Li4weDEwMzldIHwgWzB4MTA1Ni4uMHgxMDU5XQ0KLSAgICAgIHwgWzB4MTdCNC4uMHgxN0QzXSB8ICAweDE4QTkgICAgICAgICAgfCBbMHgyMEQwLi4weDIwRENdIHwgIDB4MjBFMQ0KLSAgICAgIHwgWzB4MzAyQS4uMHgzMDJGXSB8IFsweDMwOTkuLjB4MzA5QV0gfCAgMHhGQjFFICAgICAgICAgIHwgWzB4RkUyMC4uMHhGRTIzXQ0KLSAgICAgIDsNCi0NCi0gICAvKioNCi0gICAgKiBVbmljb2RlRGlnaXQuIFtFQ01BLTI2Ml0gcC4gMTUuDQotICAgICogYW55IGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZSBjYXRlZ29yeSAiRGVjaW1hbCBudW1iZXIgKE5kKSIuDQotICAgICovDQotICAgdW5pY29kZV9kaWdpdCA9DQotICAgICAgICBbMHgwMDMwLi4weDAwMzldIHwgWzB4MDY2MC4uMHgwNjY5XSB8IFsweDA2RjAuLjB4MDZGOV0gfCBbMHgwOTY2Li4weDA5NkZdDQotICAgICAgfCBbMHgwOUU2Li4weDA5RUZdIHwgWzB4MEE2Ni4uMHgwQTZGXSB8IFsweDBBRTYuLjB4MEFFRl0gfCBbMHgwQjY2Li4weDBCNkZdDQotICAgICAgfCBbMHgwQkU3Li4weDBCRUZdIHwgWzB4MEM2Ni4uMHgwQzZGXSB8IFsweDBDRTYuLjB4MENFRl0gfCBbMHgwRDY2Li4weDBENkZdDQotICAgICAgfCBbMHgwRTUwLi4weDBFNTldIHwgWzB4MEVEMC4uMHgwRUQ5XSB8IFsweDBGMjAuLjB4MEYyOV0gfCBbMHgxMDQwLi4weDEwNDldDQotICAgICAgfCBbMHgxMzY5Li4weDEzNzFdIHwgWzB4MTdFMC4uMHgxN0U5XSB8IFsweDE4MTAuLjB4MTgxOV0gfCBbMHhGRjEwLi4weEZGMTldDQotICAgICAgOw0KLQ0KLSAgIC8qKg0KLSAgICAqIFVuaWNvZGVDb25uZWN0b3JQdW5jdHVhdGlvbi4gW0VDTUEtMjYyXSBwLiAxNS4NCi0gICAgKiBhbnkgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlIGNhdGVnb3J5ICJDb25uZWN0b3IgcHVuY3R1YXRpb24gKFBjKSINCi0gICAgKi8NCi0gICB1bmljb2RlX2Nvbm5lY3Rvcl9wdW5jdHVhdGlvbiA9DQotICAgICAgICAgMHgwMDVGICAgICAgICAgIHwgWzB4MjAzRi4uMHgyMDQwXSB8ICAweDMwRkIgICAgICAgICAgfCBbMHhGRTMzLi4weEZFMzRdDQotICAgICAgfCBbMHhGRTRELi4weEZFNEZdIHwgIDB4RkYzRiAgICAgICAgICB8ICAweEZGNjUNCi0gICAgICA7DQotDQotICAgLyoqDQotICAgICogVW5pY29kZUVzY2FwZVNlcXVlbmNlLiBbRUNNQS0yNjJdIHAuIDE5Lg0KLSAgICAqLw0KLSAgIGhleF9kaWdpdCA9IFtbJzAnLi4nOSddICsgW1snYScuLidmJ10gKyBbJ0EnLi4nRiddXV07DQotDQotICAgdW5pY29kZV9lc2NhcGVfc2VxdWVuY2UgPSAndScgaGV4X2RpZ2l0IGhleF9kaWdpdCBoZXhfZGlnaXQgaGV4X2RpZ2l0Ow0KLQ0KLSAgIC8qKg0KLSAgICAqIDcuNi4gSWRlbnRpZmllci4gW0VDTUEtMjYyXSBwcC4gMTQtMTUuDQotICAgICovDQotICAgaWRlbnRpZmllcl9zdGFydCA9DQotICAgICAgICB1bmljb2RlX2xldHRlcg0KLSAgICAgIHwgJyQnDQotICAgICAgfCAnXycNCi0gICAgICB8ICdcJyB1bmljb2RlX2VzY2FwZV9zZXF1ZW5jZQ0KLSAgICAgIDsNCi0NCi0gICBpZGVudGlmaWVyX3BhcnQgPQ0KLSAgICAgICAgaWRlbnRpZmllcl9zdGFydA0KLSAgICAgIHwgdW5pY29kZV9jb21iaW5pbmdfbWFyaw0KLSAgICAgIHwgdW5pY29kZV9kaWdpdA0KLSAgICAgIHwgdW5pY29kZV9jb25uZWN0b3JfcHVuY3R1YXRpb24NCi0gICAgICB8ICdcJyB1bmljb2RlX2VzY2FwZV9zZXF1ZW5jZQ0KLSAgICAgIDsNCi0NCi0gICAvKioNCi0gICAgKiA3LjguMy4gTnVtZXJpYyBMaXRlcmFscy4gW0VDTUEtMjYyXSBwcC4gMTYtMTcuDQotICAgICovDQotICAgZGVjaW1hbF9kaWdpdCA9IFsnMCcuLic5J107DQotDQotICAgbm9uX3plcm9fZGlnaXQgPSBbJzEnLi4nOSddOw0KLQ0KLSAgIGV4cG9uZW50X3BhcnQgPSAoJ2UnIHwgJ0UnKSAoJysnIHwgJy0nKT8gWycwJy4uJzknXSs7DQotDQotICAgZGVjaW1hbF9pbnRlZ2VyX2xpdGVyYWwgPSAnMCcgfCBbJzEnLi4nOSddIFsnMCcuLic5J10qOw0KLSAgICANCi0gICAvKioNCi0gICAgKiBTdHJpbmcgTGl0ZXJhbHMuIFtFQ01BLTI2Ml0gcHAuIDE4LTE5Lg0KLSAgICAqLw0KLSAgIHNpbmdsZV9lc2NhcGVfY2hhcmFjdGVyID0NCi0gICAgICAgIFsnJycgKyBbJyInICsgWydcJyArIFsnYicgKyBbJ2YnICsgWyduJyArIFsncicgKyBbJ3QnICsgJ3YnXV1dXV1dXV07DQotDQotICAgZXNjYXBlX2NoYXJhY3RlciA9DQotICAgICAgICBbc2luZ2xlX2VzY2FwZV9jaGFyYWN0ZXIgKyBbZGVjaW1hbF9kaWdpdCArIFsneCcgKyAndSddXV07DQotDQotICAgbm9uX2VzY2FwZV9jaGFyYWN0ZXIgPQ0KLSAgICAgICAgW3NvdXJjZV9jaGFyYWN0ZXIgLSBbZXNjYXBlX2NoYXJhY3RlciArIGxpbmVfdGVybWluYXRvcl1dOw0KLQ0KLSAgIGNoYXJhY3Rlcl9lc2NhcGVfc2VxdWVuY2UgPQ0KLSAgICAgICAgc2luZ2xlX2VzY2FwZV9jaGFyYWN0ZXINCi0gICAgICB8IG5vbl9lc2NhcGVfY2hhcmFjdGVyDQotICAgICAgOw0KLQ0KLSAgIGVzY2FwZV9zZXF1ZW5jZSA9DQotICAgICAgICBjaGFyYWN0ZXJfZXNjYXBlX3NlcXVlbmNlDQotICAgICAgfCAnMCcgLy8gVE9ETzogW2xvb2thaGVhZCBub3QgYSBEZWNpbWFsRGlnaXRdDQotICAgICAgfCAneCcgaGV4X2RpZ2l0IGhleF9kaWdpdA0KLSAgICAgIHwgdW5pY29kZV9lc2NhcGVfc2VxdWVuY2UNCi0gICAgICA7DQotDQotICAgZG91YmxlX3N0cmluZ19jaGFyYWN0ZXIgPQ0KLSAgICAgICAgW3NvdXJjZV9jaGFyYWN0ZXIgLSBbJyInICsgWydcJyArIGxpbmVfdGVybWluYXRvcl1dXQ0KLSAgICAgIHwgJ1wnIGVzY2FwZV9zZXF1ZW5jZQ0KLSAgICAgIDsNCi0NCi0gICBzaW5nbGVfc3RyaW5nX2NoYXJhY3RlciA9DQotICAgICAgICBbc291cmNlX2NoYXJhY3RlciAtIFsnJycgKyBbJ1wnICsgbGluZV90ZXJtaW5hdG9yXV1dDQotICAgICAgfCAnXCcgZXNjYXBlX3NlcXVlbmNlDQotICAgICAgOw0KLQ0KLSAgIC8qKg0KLSAgICAqIDcuOC41LiBSZWd1bGFyIEV4cHJlc3Npb24gTGl0ZXJhbHMuIFtFQ01BLTI2Ml0gcHAuIDIwLTIxLg0KLSAgICAqLw0KLSAgIHJlZ3VsYXJfZXhwcmVzc2lvbl9jaGFyID0NCi0gICAgICAgIFtub25fdGVybWluYXRvciAtIFsnXCcgKyAnLyddXQ0KLSAgICAgIHwgJ1wnIG5vbl90ZXJtaW5hdG9yDQotICAgICAgOw0KLQ0KLSAgIHJlZ3VsYXJfZXhwcmVzc2lvbl9maXJzdF9jaGFyID0NCi0gICAgICAgIFtub25fdGVybWluYXRvciAtIFsnKicgKyBbJ1wnICsgJy8nXV1dDQotICAgICAgfCAnXCcgbm9uX3Rlcm1pbmF0b3INCi0gICAgICA7DQotDQotICAgcmVndWxhcl9leHByZXNzaW9uX2JvZHkgPQ0KLSAgICAgICAgcmVndWxhcl9leHByZXNzaW9uX2ZpcnN0X2NoYXIgcmVndWxhcl9leHByZXNzaW9uX2NoYXIqOw0KLQ0KLQ0KLS8vICAgd2hpdGVfc3BhY2Vfbm9fbHQgPSAoc2ltcGxlX3doaXRlX3NwYWNlIHwgc2luZ2xlX2xpbmVfY29tbWVudCB8IG11bHRpX2xpbmVfY29tbWVudF9ub19sdCkrOw0KLS8vICAgd2hpdGVfc3BhY2UgPSAgICAgICAoc2ltcGxlX3doaXRlX3NwYWNlIHwgY29tbWVudCB8IGxpbmVfdGVybWluYXRvcikrOw0KLSAgIHdoaXRlX3NwYWNlID0gICAgICAgKHNpbXBsZV93aGl0ZV9zcGFjZSB8IGxpbmVfdGVybWluYXRvcikrOw0KLQ0KLQ0KLS8vU3RhdGVzDQotLy8gICBub3JtYWwsDQotLy8gICBub2x0Ow0KLQ0KLQ0KLVRva2Vucw0KLS8vICAgICAgICAgIGJsYW5rX25vX2x0ID0gKHNpbXBsZV93aGl0ZV9zcGFjZSB8IHNpbmdsZV9saW5lX2NvbW1lbnQgfCBtdWx0aV9saW5lX2NvbW1lbnRfbm9fbHQpKzsNCi0vLyAgIGJsYW5rID0gICAgICAgKHNpbXBsZV93aGl0ZV9zcGFjZSB8IGNvbW1lbnQgfCBsaW5lX3Rlcm1pbmF0b3IpKzsNCi0NCi0gICBibGFuayA9ICAgICAgIChzaW1wbGVfd2hpdGVfc3BhY2UgfCBsaW5lX3Rlcm1pbmF0b3IpKzsNCi0gICBjb21tZW50dG9rID0gY29tbWVudDsNCi0gICANCi0vKiBpbmZpbml0ZWNvbW1lbnQgbXVzdCBhcHBlYXIgYWZ0ZXIgY29tbW1lbnR0b2sgdG8gaW5zdXJlIHRoYXQgYWN0dWFsIGNvbW1lbnRzIGFyZSByZWNvZ25pemVkDQotaW4gcHJlZmVyZW50aWFsbHkuDQotKi8NCi0gICB1bnRlcm1pbmF0ZWRfY29tbWVudCA9IG11bHRpX2xpbmVfY29tbWVudF91bnRlcm1pbmF0ZWQ7DQotDQotICAgLyoqDQotICAgICogNy41LjIuIEtleXdvcmRzLiBbRUNNQS0yNjJdIHAuMTItMTMuDQotICAgICoNCi0gICAgKiBUaGUgdG9rZW5zICJjb250aW51ZSIsICJicmVhayIsICJyZXR1cm4iIGFuZCAidGhyb3ciIHNob3VsZCB0cmlnZ2VyDQotICAgICogYSBzdGF0ZSBjaGFuZ2UuIEluIHRoaXMgbmV3IHN0YXRlLCBhIGxpbmUgdGVybWluYXRvciBzaG91bGRuJ3QgYmUNCi0gICAgKiBjb25zaWRlcmVkIGEgd2hpdGUgc3BhY2UuIEFsbCBvdGhlciB0b2tlbnMgYXJlIHBhcnNlZCBhcyB1c3VhbC4NCi0gICAgKg0KLSAgICAqIEEgY3VzdG9tIGxleGVyIHNob3VsZCBjaGFuZ2UgdGhlIHN0YXRlIGJhY2sgdG8gbm9ybWFsIGFzIHNvb24gYXMgYQ0KLSAgICAqIG5vbiB3aGl0ZSBzcGFjZSB0b2tlbiBpcyBtYXRjaGVkLg0KLSAgICAqLw0KLSAgIC8qKg0KLSAgICAqIDcuNS4zLiBGdXR1cmUgUmVzZXJ2ZWQgV29yZHMuIFtFQ01BLTI2Ml0gcC4gMTQuDQotICAgICovDQotLyoqICAgIA0KLSAgIGFic3RyYWN0ID0gICAgICdhYnN0cmFjdCc7DQotICAgZW51bSA9ICAgICAgICAgJ2VudW0nOw0KLSAgIGludCA9ICAgICAgICAgICdpbnQnOw0KLSAgIHNob3J0ID0gICAgICAgICdzaG9ydCc7DQotICAgYm9vbGVhbiA9ICAgICAgJ2Jvb2xlYW4nOw0KLSAgIGV4cG9ydCA9ICAgICAgICdleHBvcnQnOw0KLSAgIGludGVyZmFjZSA9ICAgICdpbnRlcmZhY2UnOw0KLSAgIHN0YXRpYyA9ICAgICAgICdzdGF0aWMnOw0KLSAgIGJ5dGUgPSAgICAgICAgICdieXRlJzsNCi0gICBleHRlbmRzID0gICAgICAnZXh0ZW5kcyc7DQotICAgbG9uZyA9ICAgICAgICAgJ2xvbmcnOw0KLSAgIHN1cGVyID0gICAgICAgICdzdXBlcic7DQotICAgY2hhciA9ICAgICAgICAgJ2NoYXInOw0KLSAgIGZpbmFsID0gICAgICAgICdmaW5hbCc7DQotICAgbmF0aXZlID0gICAgICAgJ25hdGl2ZSc7DQotICAgc3luY2hyb25pemVkID0gJ3N5bmNocm9uaXplZCc7DQotICAgY2xhenogPSAgICAgICAgJ2NsYXNzJzsNCi0gICBmbG9hdCA9ICAgICAgICAnZmxvYXQnOw0KLSAgIHBhY2thZ2UgPSAgICAgICdwYWNrYWdlJzsNCi0gICB0aHJvd3MgPSAgICAgICAndGhyb3dzJzsNCi0gICBjb25zdCA9ICAgICAgICAnY29uc3QnOw0KLSAgIGdvdG8gPSAgICAgICAgICdnb3RvJzsNCi0gICBwcml2YXRlID0gICAgICAncHJpdmF0ZSc7DQotICAgdHJhbnNpZW50ID0gICAgJ3RyYW5zaWVudCc7DQotICAgZGVidWdnZXIgPSAgICAgJ2RlYnVnZ2VyJzsNCi0gICBpbXBsZW1lbnRzID0gICAnaW1wbGVtZW50cyc7DQotICAgcHJvdGVjdGVkID0gICAgJ3Byb3RlY3RlZCc7DQotICAgdm9sYXRpbGUgPSAgICAgJ3ZvbGF0aWxlJzsNCi0gICBkb3VibGUgPSAgICAgICAnZG91YmxlJzsNCi0gICBpbXBvcnQgPSAgICAgICAnaW1wb3J0JzsNCi0gICBwdWJsaWMgPSAgICAgICAncHVibGljJzsNCi0qLw0KLSAgIA0KLSAgIC8qKg0KLSAgICAqIDcuOC4zLiBOdW1lcmljIExpdGVyYWxzLiBbRUNNQS0yNjJdIHBwLiAxNi0xNy4NCi0gICAgKi8NCi0gICBkZWNpbWFsX2xpdGVyYWwgPQ0KLSAgICAgICAgKCcwJyB8IFsnMScuLic5J10gWycwJy4uJzknXSopICcuJyBbJzAnLi4nOSddKiBleHBvbmVudF9wYXJ0Pw0KLSAgICAgIHwgJy4nIFsnMCcuLic5J10rIGV4cG9uZW50X3BhcnQ/DQotICAgICAgfCAoJzAnIHwgWycxJy4uJzknXSBbJzAnLi4nOSddKikgZXhwb25lbnRfcGFydD8NCi0gICAgICA7DQotDQotICAgaGV4X2ludGVnZXJfbGl0ZXJhbCA9ICgnMHgnIHwgJzBYJykgaGV4X2RpZ2l0KzsNCi0NCi0gICAvKioNCi0gICAgKiA3LjcuIFB1bmN0dWF0b3JzLiBbRUNNQS0yNjJdIHAuIDE1Lg0KLSAgICAqDQotICAgICogUHVuY3R1YXRvci4NCi0gICAgKi8NCi0NCi0gICBwdW5jdHVhdG9yMSA9ICAgIA0KLSAgICd7JyB8DQotICAgJ30nIHwNCi0gICAnKCcgfA0KLSAgICcpJyB8DQotICAgJ1snIHwNCi0gICAnXScgfA0KLSAgICcuJyB8DQotICAgJzsnIHwNCi0gICAnLCcgfA0KLSAgICc8JyB8DQotICAgJz4nIHwNCi0gICAnPD0nIHwNCi0gICAnPj0nIHwNCi0gICAnPT0nIHwNCi0gICAnIT0nIHwNCi0gICAnPT09JyB8DQotICAgJyE9PScgfA0KLSAgICcrJyB8DQotICAgJy0nIHwNCi0gICAnKicgfA0KLSAgICclJyB8DQotICAgJysrJyB8DQotICAgJy0tJyB8DQotICAgJzw8JyB8DQotICAgJz4+JyB8DQotICAgJz4+PicgfA0KLSAgICcmJyB8DQotICAgJ3wnIHwNCi0gICAnXicgfA0KLSAgICchJyB8DQotICAgJ34nIHwNCi0gICAnJiYnIHwNCi0gICAnfHwnIHwNCi0gICAnPycgfA0KLSAgICc6JyB8DQotICAgJz0nIHwNCi0gICAnKz0nIHwNCi0gICAnLT0nIHwNCi0gICAnKj0nIHwNCi0gICAnJT0nIHwNCi0gICAnPDw9JyB8DQotICAgJz4+PScgfA0KLSAgICc+Pj49JyB8DQotICAgJyY9JyB8DQotICAgJ3w9JyB8DQotICAgJ149JyB8DQotICAgJy89JyB8DQotICAgJy8nOw0KLQ0KLS8qIFRyaWNrIHRvIGhhbmRsZSB0aGUgc3BlY2lhbCBncmFtbWFyIGNhc2Ugd2hlcmUgaW5jciBhbmQgZGVjciBzaG91bGRuJ3QNCi1iZSBwcmVjZWVkZWQgYnkgYSBsaW5lIHRlcm1pbmF0b3IuICANCi0NCi1BcyBibGFua3MgYXJlIG5vcm1hbGx5IGlnbm9yZWQsIHdlIHdyaXRlIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgd2lsbCANCi1jb250YWluIHRoZSBwcmVjZWVkaW5nIGJsYW5rcyBhcyBwYXJ0IG9mIHRoZSB0b2tlbi4gIFJlbWVtYmVyIHRoYXQgDQotdGhlIGxleGVyIHJldHVybnMgdGhlIGxvbmdlc3QgbWF0Y2g7IGEgYmxhbmsgZm9sbG93ZWQgYnkgKysgb3IgLS0gaXMgDQotbG9uZ2VyIHRoYW4gYSBzdHJhaXQgYmxhbmsuDQotDQotaW5jcl9ub19sdCBpcyBsaXN0ZWQgZmlyc3Qgc28gdGhhdCBpdCBnZXRzIHByZWNlZGVuY2Ugb3ZlciBpbmNyLCB3aGVuIHRoZQ0KLXByZWNlZWRpbmcgd2hpdGVzcGFjZSBkb2VzIG5vdCBjb250YWluIGEgbGluZSB0ZXJtaW5hdG9yLg0KLQ0KLWEgY3VzdG9tIGxleGVyIHdpbGwgYnJlYWsgdGhlc2UgdG9rZW5zIGluIHR3bzogDQotYmxhbmsgYW5kIFtpbmNyL2RlY3JdWy9fbm9fbHRdDQotDQotKi8NCi0vKg0KLSAgIGluY3Jfbm9fbHQgPSB3aGl0ZV9zcGFjZV9ub19sdCAnKysnOw0KLSAgIGRlY3Jfbm9fbHQgPSB3aGl0ZV9zcGFjZV9ub19sdCAnLS0nOw0KLSAgIA0KLSAgIGluY3IgPSAgICAgICB3aGl0ZV9zcGFjZSAnKysnOw0KLSAgIGRlY3IgPSAgICAgICB3aGl0ZV9zcGFjZSAnLS0nOw0KLSovDQotDQotLyoNCi0gICBsc2hpZnQgPSAgICAgICAgICAgICAgICc8PCc7DQotICAgcnNpZ25lZHNoaWZ0ID0gICAgICAgICAnPj4nOw0KLSAgIHJ1bnNpZ25lZHNoaWZ0ID0gICAgICAgJz4+Pic7DQotICAgYml0X2FuZCA9ICAgICAgICAgICAgICAnJic7DQotICAgYml0X29yID0gICAgICAgICAgICAgICAnfCc7DQotICAgeG9yID0gICAgICAgICAgICAgICAgICAnXic7DQotICAgYmFuZyA9ICAgICAgICAgICAgICAgICAnISc7DQotICAgdGlsZGUgPSAgICAgICAgICAgICAgICAnfic7DQotICAgc2NfYW5kID0gICAgICAgICAgICAgICAnJiYnOw0KLSAgIHNjX29yID0gICAgICAgICAgICAgICAgJ3x8JzsNCi0gICBob29rID0gICAgICAgICAgICAgICAgICc/JzsNCi0gICBjb2xvbiA9ICAgICAgICAgICAgICAgICc6JzsNCi0gICBhc3NpZ24gPSAgICAgICAgICAgICAgICc9JzsNCi0gICBwbHVzYXNzaWduID0gICAgICAgICAgICcrPSc7DQotICAgbWludXNhc3NpZ24gPSAgICAgICAgICAnLT0nOw0KLSAgIHN0YXJhc3NpZ24gPSAgICAgICAgICAgJyo9JzsNCi0gICByZW1hc3NpZ24gPSAgICAgICAgICAgICclPSc7DQotICAgbHNoaWZ0YXNzaWduID0gICAgICAgICAnPDw9JzsNCi0gICByc2lnbmVkc2hpZnRhc3NpZ24gPSAgICc+Pj0nOw0KLSAgIHJ1bnNpZ25lZHNoaWZ0YXNzaWduID0gJz4+Pj0nOw0KLSAgIGFuZGFzc2lnbiA9ICAgICAgICAgICAgJyY9JzsNCi0gICBvcmFzc2lnbiA9ICAgICAgICAgICAgICd8PSc7DQotICAgeG9yYXNzaWduID0gICAgICAgICAgICAnXj0nOw0KLSAgIA0KLSAgIC8vDQotICAgLy8gRGl2UHVuY3R1YXRvci4NCi0gICAvLw0KLSAgIHNsYXNoYXNzaWduID0gJy89JzsNCi0gICBzbGFzaCA9ICAgICAgICcvJzsNCi0qLyANCi0gICAgDQotICAgLyoqDQotICAgICogNy44LjQuIFN0cmluZyBMaXRlcmFscy4gW0VDTUEtMjYyXSBwcC4gMTgtMTkuDQotICAgICovDQotICAgc3RyaW5nX2xpdGVyYWwgPQ0KLSAgICAgICAgJyInIGRvdWJsZV9zdHJpbmdfY2hhcmFjdGVyKiAnIicNCi0gICAgICB8ICcnJyBzaW5nbGVfc3RyaW5nX2NoYXJhY3RlciogJycnDQotICAgICAgOw0KLQ0KLSAgIHVudGVybWluYXRlZF9zdHJpbmdfbGl0ZXJhbCA9DQotICAgICAgICAnIicgZG91YmxlX3N0cmluZ19jaGFyYWN0ZXIqIA0KLSAgICAgIHwgJycnIHNpbmdsZV9zdHJpbmdfY2hhcmFjdGVyKg0KLSAgICAgIDsNCi0NCi0gICAvKioNCi0gICAgKiA3LjguNS4gUmVndWxhciBFeHByZXNzaW9uIExpdGVyYWxzLiBbRUNNQS0yNjJdIHBwLiAyMC0yMS4NCi0gICAgKi8NCi0gICByZWd1bGFyX2V4cHJlc3Npb25fbGl0ZXJhbCA9DQotICAgICAgICAnLycgcmVndWxhcl9leHByZXNzaW9uX2JvZHkgJy8nIGlkZW50aWZpZXJfcGFydCo7DQotDQotICAgLyoqDQotICAgICogNy42LiBJZGVudGlmaWVyLiBbRUNNQS0yNjJdIHBwLiAxNC0xNS4NCi0gICAgKi8NCi0gICBpZGVudGlmaWVyID0gaWRlbnRpZmllcl9zdGFydCBpZGVudGlmaWVyX3BhcnQqOw0KLSAgIA0KLSAgIGVycm9yX2NoYXIgPSBzb3VyY2VfY2hhcmFjdGVyOw0KLQ0KLQ0KLUlnbm9yZWQgVG9rZW5zDQotLy8gICBibGFua19ub19sdCwNCi0gICBibGFuazsNCi0NCi0NCi0vKg0KLSAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgLy8gZm9yIHRlc3RpbmcgdGhlIExleGVyIG9ubHkuDQotICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICBzY3JpcHQgPSBzY3JpcHRfdG9rZW4qOw0KLQ0KLSAgIHNjcmlwdF90b2tlbiA9DQotICAgICAgICB7cmVzfSByZXNlcnZlZF93b3JkDQotICAgICAgfCB7aWR9ICBpZGVudGlmaWVyDQotICAgICAgfCB7b3B9ICBwdW5jdHVhdG9yDQotICAgICAgfCB7bnVtfSBudW1lcmljX2xpdGVyYWwNCi0gICAgICB8IHtzdHJ9IHN0cmluZ19saXRlcmFsDQotICAgICAgOw0KLQ0KLSAgIHJlc2VydmVkX3dvcmQgPQ0KLSAgICAgICAge2tleXdvcmR9IGtleXdvcmQNCi0gICAgICB8IHtmdXR1cmV9ICBmdXR1cmVfcmVzZXJ2ZWRfd29yZA0KLSAgICAgIHwge251bGx9ICAgIG51bGwNCi0gICAgICB8IHtib29sZWFufSBib29sZWFuX2xpdGVyYWwNCi0gICAgICA7DQotDQotICAga2V5d29yZCA9DQotICAgICAgICB7YnJlYWt9ICAgICAgYnJlYWsNCi0gICAgICB8IHtlbHNlfSAgICAgICBlbHNlDQotICAgICAgfCB7bmV3fSAgICAgICAgbmV3DQotICAgICAgfCB7dmFyfSAgICAgICAgdmFyDQotICAgICAgfCB7Y2FzZX0gICAgICAgY2FzZQ0KLSAgICAgIHwge2ZpbmFsbHl9ICAgIGZpbmFsbHkNCi0gICAgICB8IHtyZXR1cm59ICAgICByZXR1cm4NCi0gICAgICB8IHt2b2lkfSAgICAgICB2b2lkDQotICAgICAgfCB7Y2F0Y2h9ICAgICAgY2F0Y2gNCi0gICAgICB8IHtmb3J9ICAgICAgICBmb3INCi0gICAgICB8IHtzd2l0Y2h9ICAgICBzd2l0Y2gNCi0gICAgICB8IHt3aGlsZX0gICAgICB3aGlsZQ0KLSAgICAgIHwge2NvbnRpbnVlfSAgIGNvbnRpbnVlDQotICAgICAgfCB7ZnVuY3Rpb259ICAgZnVuY3Rpb24NCi0gICAgICB8IHt0aGlzfSAgICAgICB0aGlzDQotICAgICAgfCB7d2l0aH0gICAgICAgd2l0aA0KLSAgICAgIHwge2RlZmF1bHR9ICAgIGRlZmF1bHQNCi0gICAgICB8IHtpZn0gICAgICAgICBpZg0KLSAgICAgIHwge3Rocm93fSAgICAgIHRocm93DQotICAgICAgfCB7ZGVsZXRlfSAgICAgZGVsZXRlDQotICAgICAgfCB7aW59ICAgICAgICAgaW4NCi0gICAgICB8IHt0cnl9ICAgICAgICB0cnkNCi0gICAgICB8IHtkb30gICAgICAgICBkbw0KLSAgICAgIHwge2luc3RhbmNlb2Z9IGluc3RhbmNlb2YNCi0gICAgICB8IHt0eXBlb2Z9ICAgICB0eXBlb2YNCi0gICAgICA7DQotICAgDQotICAgZnV0dXJlX3Jlc2VydmVkX3dvcmQgPQ0KLSAgICAgICAge2Fic3RyYWN0fSAgICAgYWJzdHJhY3QNCi0gICAgICB8IHtlbnVtfSAgICAgICAgIGVudW0NCi0gICAgICB8IHtpbnR9ICAgICAgICAgIGludA0KLSAgICAgIHwge3Nob3J0fSAgICAgICAgc2hvcnQNCi0gICAgICB8IHtib29sZWFufSAgICAgIGJvb2xlYW4NCi0gICAgICB8IHtleHBvcnR9ICAgICAgIGV4cG9ydA0KLSAgICAgIHwge2ludGVyZmFjZX0gICAgaW50ZXJmYWNlDQotICAgICAgfCB7c3RhdGljfSAgICAgICBzdGF0aWMNCi0gICAgICB8IHtieXRlfSAgICAgICAgIGJ5dGUNCi0gICAgICB8IHtleHRlbmRzfSAgICAgIGV4dGVuZHMNCi0gICAgICB8IHtsb25nfSAgICAgICAgIGxvbmcNCi0gICAgICB8IHtzdXBlcn0gICAgICAgIHN1cGVyDQotICAgICAgfCB7Y2hhcn0gICAgICAgICBjaGFyDQotICAgICAgfCB7ZmluYWx9ICAgICAgICBmaW5hbA0KLSAgICAgIHwge25hdGl2ZX0gICAgICAgbmF0aXZlDQotICAgICAgfCB7c3luY2hyb25pemVkfSBzeW5jaHJvbml6ZWQNCi0gICAgICB8IHtjbGFzc30gICAgICAgIGNsYXp6DQotICAgICAgfCB7ZmxvYXR9ICAgICAgICBmbG9hdA0KLSAgICAgIHwge3BhY2thZ2V9ICAgICAgcGFja2FnZQ0KLSAgICAgIHwge3Rocm93c30gICAgICAgdGhyb3dzDQotICAgICAgfCB7Y29uc3R9ICAgICAgICBjb25zdA0KLSAgICAgIHwge2dvdG99ICAgICAgICAgZ290bw0KLSAgICAgIHwge3ByaXZhdGV9ICAgICAgcHJpdmF0ZQ0KLSAgICAgIHwge3RyYW5zaWVudH0gICAgdHJhbnNpZW50DQotICAgICAgfCB7ZGVidWdnZXJ9ICAgICBkZWJ1Z2dlcg0KLSAgICAgIHwge2ltcGxlbWVudHN9ICAgaW1wbGVtZW50cw0KLSAgICAgIHwge3Byb3RlY3RlZH0gICAgcHJvdGVjdGVkDQotICAgICAgfCB7dm9sYXRpbGV9ICAgICB2b2xhdGlsZQ0KLSAgICAgIHwge2RvdWJsZX0gICAgICAgZG91YmxlDQotICAgICAgfCB7aW1wb3J0fSAgICAgICBpbXBvcnQNCi0gICAgICB8IHtwdWJsaWN9ICAgICAgIHB1YmxpYw0KLSAgICAgIDsNCi0NCi0gICBwdW5jdHVhdG9yID0NCi0gICAgICAgIHtsYnJhY2V9ICAgIGxicmFjZQ0KLSAgICAgIHwge3JicmFjZX0gICAgcmJyYWNlDQotICAgICAgfCB7bHBhcmVufSAgICBscGFyZW4NCi0gICAgICB8IHtycGFyZW59ICAgIHJwYXJlbg0KLSAgICAgIHwge2xicmFja2V0fSAgbGJyYWNrZXQNCi0gICAgICB8IHtyYnJhY2tldH0gIHJicmFja2V0DQotICAgICAgfCB7ZG90fSAgICAgICBkb3QNCi0gICAgICB8IHtzZW1pY29sb259IHNlbWljb2xvbg0KLSAgICAgIHwge2NvbW1hfSAgICAgY29tbWENCi0gICAgICB8IHtsdH0gICAgICAgIGx0DQotICAgICAgfCB7Z3R9ICAgICAgICBndA0KLSAgICAgIHwge2xlfSAgICAgICAgbGUNCi0gICAgICB8IHtnZX0gICAgICAgIGdlDQotICAgICAgfCB7ZXF9ICAgICAgICBlcQ0KLSAgICAgIHwge25lfSAgICAgICAgbmUNCi0gICAgICB8IHtlcXF9ICAgICAgIGVxcQ0KLSAgICAgIHwge25lcX0gICAgICAgbmVxDQotICAgICAgfCB7cGx1c30gICAgICBwbHVzDQotICAgICAgfCB7bWludXN9ICAgICBtaW51cw0KLSAgICAgIHwge3N0YXJ9ICAgICAgc3Rhcg0KLSAgICAgIHwge3JlbX0gICAgICAgcmVtDQotICAgICAgfA0KLSAgICAgICAge2luY3IxfSBpbmNyX25vX2x0DQotICAgICAgfCB7ZGVjcjF9IGRlY3Jfbm9fbHQNCi0gICAgICB8IHtpbmNyMn0gaW5jcg0KLSAgICAgIHwge2RlY3IyfSBkZWNyDQotICAgICAgfA0KLSAgICAgICAge2xzaGlmdH0gICAgbHNoaWZ0DQotICAgICAgfCB7cnNzaGlmdH0gICByc2lnbmVkc2hpZnQNCi0gICAgICB8IHtydXNoaWZ0fSAgIHJ1bnNpZ25lZHNoaWZ0DQotICAgICAgfCB7YmFuZH0gICAgICBiaXRfYW5kDQotICAgICAgfCB7Ym9yfSAgICAgICBiaXRfb3INCi0gICAgICB8IHt4b3J9ICAgICAgIHhvcg0KLSAgICAgIHwge2Jhbmd9ICAgICAgYmFuZw0KLSAgICAgIHwge2Jub30gICAgICAgdGlsZGUNCi0gICAgICB8IHtzYW5kfSAgICAgIHNjX2FuZA0KLSAgICAgIHwge3Nvcn0gICAgICAgc2Nfb3INCi0gICAgICB8IHtob29rfSAgICAgIGhvb2sNCi0gICAgICB8IHtjb2xvbn0gICAgIGNvbG9uDQotICAgICAgfCB7YXNzaWdufSAgICBhc3NpZ24NCi0gICAgICB8IHtwYXNzaWdufSAgIHBsdXNhc3NpZ24NCi0gICAgICB8IHttYXNzaWdufSAgIG1pbnVzYXNzaWduDQotICAgICAgfCB7YWFzaWdufSAgICBzdGFyYXNzaWduDQotICAgICAgfCB7cmFzc2lnbn0gICByZW1hc3NpZ24NCi0gICAgICB8IHtsc2Fzc2lnbn0gIGxzaGlmdGFzc2lnbg0KLSAgICAgIHwge3Jzc2Fzc2lnbn0gcnNpZ25lZHNoaWZ0YXNzaWduDQotICAgICAgfCB7cnVzYXNzaWdufSBydW5zaWduZWRzaGlmdGFzc2lnbg0KLSAgICAgIHwge2FuZGFzc2lnbn0gYW5kYXNzaWduDQotICAgICAgfCB7b3Jhc3NpZ259ICBvcmFzc2lnbg0KLSAgICAgIHwge3hvcmFzc2lnbn0geG9yYXNzaWduDQotICAgICAgfA0KLSAgICAgICAge3NsYXNoYXNzaWdufSBzbGFzaGFzc2lnbg0KLSAgICAgIHwge3NsYXNofSAgICAgICBzbGFzaA0KLSAgICAgIDsNCi0qLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0pTTW9kZWwvc2FibGVjYy0yLjE2LjIuemlwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSlNNb2RlbC9zYWJsZWNjLTIuMTYuMi56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYWEyNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSlNNb2RlbC9zYWJsZWNjLTIuMTYuMi56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9KU01vZGVsL3NhYmxlY2NncmFtbWFycy0xLjIuMS5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9KU01vZGVsL3NhYmxlY2NncmFtbWFycy0xLjIuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDhmYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSlNNb2RlbC9zYWJsZWNjZ3JhbW1hcnMtMS4yLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL0NTU1Rva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL0NTU1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzBjZTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMDQvMTAvMDEgMjI6NTMgKi8KLQotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY3NzLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3MuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuQ1NTVGV4dFJlZ2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNzcy5wYXJzZXIuQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNzcy5wYXJzZXIuQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqLwotcHVibGljIGNsYXNzIENTU1Rva2VuaXplciBpbXBsZW1lbnRzIENTU1JlZ2lvbkNvbnRleHRzIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSU1QT1JUX0RFTElNSVRFUiA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSA9IDE3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUiA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NIQVJTRVRfREVMSU1JVEVSID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREVDTEFSQVRJT05fVkFMVUUgPSAxODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEFHRV9QU0VVRE9fUEFHRSA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0lNUE9SVF9VUkkgPSAzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EID0gMTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ERUNMQVJBVElPTiA9IDE1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QQUdFX0RFTElNSVRFUiA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9NRURJQV9NRURJVU0gPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DSEFSU0VUX05BTUUgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9JTVBPUlRfTUVESVVNID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SID0gMTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9NRURJQV9ERUxJTUlURVIgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9NT0RJRklFUiA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDExXDFcMTdcMVwwXDFcNFwxXDIwXDIyXDBcMVw2XDFcMzFcMVwxMCIrCi0gICAgIlwxXDIyXDFcMTZcMVw3MlwxXDE2XDFcNVwxXDI2XDFcMTJcMVwzNVwxXDE0XDFcNTUiKwotICAgICJcMVwxM1wxXDE1XDFcMzRcMTJcMVwxXDYyXDFcNTBcMVwzMFwxXDY3XDFcMzJcMVwyMSIrCi0gICAgIlwxXDM2XDFcNDNcMVwyN1wxXDQwXDFcNTdcMVw0NlwxXDY0XDFcNjFcMVw0MVwxXDUxIisKLSAgICAiXDJcMlwxXDI1XDFcNTJcMVw2NVwxXDU0XDFcNTNcMVwyXDFcMjRcMVw0NFwxXDQ3IisKLSAgICAiXDFcMjNcNVwyXDFcNjZcMVwzXDFcNzFcMVwxNlwxXDJcMVwxNlwxXDQyXDFcNyIrCi0gICAgIlwxXDM3XDFcNTZcMVw0NVwxXDYzXDFcNjFcMVw0MVwxXDUxXDJcMlwxXDI1XDFcNTIiKwotICAgICJcMVw2NVwxXDU0XDFcNTNcMVwyXDFcMjRcMVw0NFwxXDQ3XDFcMjNcNVwyXDFcNjAiKwotICAgICJcMVw3MFwxXDMzXDFcNzBcMVwwXHVmZjgwXDIiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgNTksICAgMTE4LCAgIDE3NywgICAyMzYsICAgMjk1LCAgIDM1NCwgICA0MTMsICAgNDcyLCAgIDUzMSwgCi0gICAgICA1OTAsICAgNjQ5LCAgIDcwOCwgICA3NjcsICAgODI2LCAgIDg4NSwgICA5NDQsICAxMDAzLCAgMTA2MiwgIDExMjEsIAotICAgICAxMTgwLCAgMTIzOSwgIDEyOTgsICAxMzU3LCAgMTQxNiwgIDE0NzUsICAxNTM0LCAgMTEyMSwgIDE1OTMsICAxMTIxLCAKLSAgICAgMTY1MiwgIDE3MTEsICAxMTIxLCAgMTc3MCwgIDE4MjksICAxODg4LCAgMTEyMSwgIDE5NDcsICAyMDA2LCAgMjA2NSwgCi0gICAgIDIxMjQsICAyMTgzLCAgMjI0MiwgIDExMjEsICAyMzAxLCAgMjM2MCwgIDI0MTksICAxMTIxLCAgMTEyMSwgIDI0NzgsIAotICAgICAyNTM3LCAgMjU5NiwgIDExMjEsICAyNjU1LCAgMjcxNCwgIDExMjEsICAxMTIxLCAgMjc3MywgIDI4MzIsICAyODkxLCAKLSAgICAgMTEyMSwgIDI5NTAsICAxMTIxLCAgMzAwOSwgIDMwNjgsICAzMTI3LCAgMzE4NiwgIDMyNDUsICAzMzA0LCAgMzM2MywgCi0gICAgIDM0MjIsICAxMTIxLCAgMTEyMSwgIDM0ODEsICAzNTQwLCAgMzU5OSwgIDM2NTgsICAzNzE3LCAgMTEyMSwgIDM3NzYsIAotICAgICAzODM1LCAgMzg5NCwgIDM5NTMsICA0MDEyLCAgNDA3MSwgIDE1OTMsICAxMTIxLCAgNDEzMCwgIDEyMzksICA0MTg5LCAKLSAgICAgNDI0OCwgIDE0MTYsICA0MzA3LCAgMTQ3NSwgIDQzNjYsICA0NDI1LCAgNDQ4NCwgIDQ1NDMsICA0NjAyLCAgNDY2MSwgCi0gICAgIDQ3MjAsICA0Nzc5LCAgNDgzOCwgIDQ4OTcsICAxNzcwLCAgNDk1NiwgIDExMjEsICAxODI5LCAgNTAxNSwgIDUwNzQsIAotICAgICAxOTQ3LCAgNTEzMywgIDExMjEsICAyMDA2LCAgNTE5MiwgIDUyNTEsICAyMTgzLCAgNTMxMCwgIDUzNjksICAyMzYwLCAKLSAgICAgNTQyOCwgIDU0ODcsICAyNTM3LCAgNTU0NiwgIDU2MDUsICAxMTIxLCAgMjcxNCwgIDI4MzIsICA1NjY0LCAgNTcyMywgCi0gICAgIDMwNjgsICA1NzgyLCAgMzEyNywgIDU4NDEsICAxMTIxLCAgMzE4NiwgIDU5MDAsICA1OTU5LCAgMzM2MywgIDYwMTgsIAotICAgICA2MDc3LCAgNjEzNiwgIDYxOTUsICAzODk0LCAgMTEyMSwgIDM1OTksICAxMTIxLCAgNjI1NCwgIDM2NTgsICA2MzEzLCAKLSAgICAgMTEyMSwgIDM3MTcsICA2MzcyLCAgNjQzMSwgIDY0OTAsICA2NTQ5LCAgMzk1MywgIDY2MDgsICA2NjY3LCAgNjcyNiwgCi0gICAgIDQwNzEsICA2Nzg1LCAgMTEyMSwgIDQxMzAsICA2ODQ0LCAgMTEyMSwgIDY5MDMsICA2OTYyLCAgNzAyMSwgIDcwODAsIAotICAgICA3MTM5LCAgNzE5OCwgIDcyNTcsICA3MzE2LCAgNzM3NSwgIDc0MzQsICA3NDkzLCAgNzU1MiwgIDE3NzAsICA3NjExLCAKLSAgICAgNzY3MCwgIDE4MjksICA3NzI5LCAgNzc4OCwgIDE5NDcsICA3ODQ3LCAgNzkwNiwgIDIwMDYsICA3OTY1LCAgODAyNCwgCi0gICAgIDgwODMsICA4MTQyLCAgODIwMSwgIDgyNjAsICA4MzE5LCAgODM3OCwgIDMxMjcsICA4NDM3LCAgODQ5NiwgIDMxODYsIAotICAgICA4NTU1LCAgODYxNCwgIDg2NzMsICA4NzMyLCAgODc5MSwgIDM2NTgsICA4ODUwLCAgODkwOSwgIDM3MTcsICA4OTY4LCAKLSAgICAgOTAyNywgIDkwODYsICA5MTQ1LCAgOTIwNCwgIDkyNjMsICA5MzIyLCAgOTM4MSwgIDExMjEsICAxMTIxLCAgOTQ0MCwgCi0gICAgIDk0OTksICA5NTU4LCAgOTYxNywgIDk2NzYsICA5NzM1LCAgOTc5NCwgIDk4NTMsICA5OTEyLCAgOTk3MSwgMTAwMzAsIAotICAgIDEwMDg5LCAxMDE0OCwgMTAyMDcsIDEwMjY2LCAxMDMyNSwgMTAzODQsIDEwNDQzLCAxMDUwMiwgMTA1NjEsIDEwNjIwLCAKLSAgICAxMDY3OSwgMTA3MzgsIDEwNzk3LCAxMDg1NiwgMTA5MTUsIDEwOTc0LCAxMTAzMywgMTEwOTIsIDExMTUxLCAxMTIxMCwgCi0gICAgMTEyNjksIDExMzI4LCAxMTM4NywgMTE0NDYsIDExNTA1LCAgMTEyMSwgMTE1NjQsIDExNjIzLCAgMTEyMSwgMTE2ODIsIAotICAgIDExNzQxLCAxMTgwMCwgMTE4NTksIDExOTE4LCAxMTk3NywgMTIwMzYsIDEyMDk1LCAxMjE1NCwgMTIyMTMsICAxMTIxLCAKLSAgICAxMjI3MiwgMTIzMzEsIDEyMzkwLCAxMjQ0OSwgMTI1MDgsIDEyNTY3LCAxMjYyNiwgMTI2ODUsIDEyNzQ0LCAxMjgwMywgCi0gICAgMTI4NjIsIDEyOTIxLCAxMjk4MCwgMTMwMzksIDEzMDk4LCAxMzE1NywgMTMyMTYsIDExMDkyLCAxMzI3NSwgMTMzMzQsIAotICAgICAxMTIxLCAxMzM5MywgMTM0NTIsIDEzNTExLCAxMzU3MCwgMTM2MjksIDEzNjg4LCAgMTEyMSwgMTM3NDcsIDEzODA2LCAKLSAgICAxMzg2NSwgMTM5MjQsIDEzOTgzLCAxNDA0MiwgMTQxMDEsIDE0MTYwLCAxNDIxOSwgMTIwMzYsIDE0Mjc4LCAxNDMzNywgCi0gICAgMTQzOTYsIDE0NDU1LCAxNDUxNCwgMTQ1NzMsIDE0NjMyLCAxNDY5MSwgMTQ3NTAsIDE0ODA5LCAxNDg2OCwgMTQ5MjcsIAotICAgIDE0OTg2LCAxNTA0NSwgMTUxMDQsIDE1MTYzLCAxNTIyMiwgMTUyODEsIDE1MzQwLCAxMzE1NywgMTUzOTksIDE1NDU4LCAKLSAgICAxNTUxNywgMTU1NzYsIDE1NjM1LCAxNTY5NCwgMTU3NTMsICAxMTIxLCAxNTgxMiwgMTU4NzEsIDE1OTMwLCAxNTk4OSwgCi0gICAgMTYwNDgsIDE2MTA3LCAxNjE2NiwgMTYyMjUsIDE2Mjg0LCAxNjM0MywgMTY0MDIsIDE2NDYxLCAxNjUyMCwgMTY1NzksIAotICAgIDE2NjM4LCAxNjY5NywgMTY3NTYsIDE2ODE1LCAxNjg3NCwgMTY5MzMsIDE2OTkyLCAxNzA1MSwgMTcxMTAsIDE3MTY5LCAKLSAgICAxNzIyOCwgMTcyODcsIDE3MzQ2LCAxNzQwNSwgMTc0NjQsIDE3NTIzLCAxNzU4MiwgMTc2NDEsIDE3NzAwLCAxNzc1OSwgCi0gICAgMTc4MTgsIDE3ODc3LCAxNzkzNiwgMTc5OTUsIDE4MDU0LCAgMTEyMSwgMTgxMTMsIDE4MTcyLCAxODIzMSwgMTgyOTAsIAotICAgIDE4MzQ5LCAxODQwOCwgMTg0NjcsIDE4NTI2LCAxODU4NSwgMTIxNTQsIDE4NjQ0LCAxMjIxMywgMTg3MDMsIDE4NzYyLCAKLSAgICAxODgyMSwgMTg4ODAsIDE4OTM5LCAxODk5OCwgMTkwNTcsIDE5MTE2LCAxOTE3NSwgMTkyMzQsIDEzMjc1LCAxOTI5MywgCi0gICAgMTMzMzQsIDE5MzUyLCAxOTQxMSwgMTk0NzAsIDE5NTI5LCAxOTU4OCwgMTk2NDcsIDE5NzA2LCAxOTc2NSwgMTk4MjQsIAotICAgIDE5ODgzLCAxOTk0MiwgIDExMjEsIDIwMDAxLCAyMDA2MCwgMjAxMTksIDIwMTc4LCAgMTEyMSwgMjAyMzcsIDIwMjk2LCAKLSAgICAyMDM1NSwgIDExMjEsIDIwNDE0LCAyMDQ3MywgMjA1MzIsIDIwNTkxLCAyMDY1MCwgMjA3MDksIDIwNzY4LCAyMDgyNywgCi0gICAgMjA4ODYsIDIwOTQ1Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9IAotICAgICJcMlwyNFwxXDI1XDFcMjZcMVwyN1wxXDI0XDFcMjdcMVwyNVwxXDI0IisKLSAgICAiXDFcMjdcMVwyNFwxXDMwXDFcMjRcMVwzMVwxXDI0XDJcMjdcMVwyNCIrCi0gICAgIlwxXDMyXDNcMjVcMVwyNFwxXDI1XDFcMzNcMlwyNFwxXDM0XDFcMzUiKwotICAgICJcMVwzNlwxXDM3XDExXDI1XDFcMjRcNFwyNVwxXDI0XDJcMjVcMVwyNCIrCi0gICAgIlwxXDI1XDFcNDBcM1wyNVwxXDQxXDEwXDI0XDFcMjdcMVw0MlwxXDI3IisKLSAgICAiXDFcMjRcMVw0M1wxXDI3XDFcMjRcMVw0NFwzXDI0XDJcMjdcN1wyNCIrCi0gICAgIlwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1w0MFwyNFwxXDI3IisKLSAgICAiXDFcMjRcMVwyN1wyXDI0XDFcMjdcMVwyNFwxXDQ0XDNcMjRcMlwyNyIrCi0gICAgIlw3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDI0IisKLSAgICAiXDFcNDVcMjZcMjRcMVwyN1wxXDQ2XDFcMjdcMVwyNFwxXDQ3XDFcMjciKwotICAgICJcMVwyNFwxXDQ0XDNcMjRcMlwyN1wyXDI0XDFcNTBcNFwyNFwxXDMzIisKLSAgICAiXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVwyNFwxXDQ1XDI0XDI0IisKLSAgICAiXDFcNTFcMVw1MlwxXDI3XDFcMjRcMVwyN1wxXDUxXDFcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcNTNcM1wyNFwyXDI3XDJcMjRcM1w1MVwxXDI0XDFcNTEiKwotICAgICJcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcNTFcMVw0NSIrCi0gICAgIlw0XDUxXDFcMjRcMlw1MVwxXDI0XDFcNTFcMVwyNFwzXDUxXDExXDI0IisKLSAgICAiXDFcMjdcMVwyNFwxXDI3XDJcMjRcMVwyN1wxXDI0XDFcNDRcM1wyNCIrCi0gICAgIlwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciKwotICAgICJcMTFcMjRcMVw0NVw0XDI0XDFcNTRcMTdcMjRcMVw1NVwxXDU2XDFcMjciKwotICAgICJcMVwyNFwxXDI3XDFcNTVcMVwyNFwxXDI3XDFcMjRcMVw1N1wzXDI0IisKLSAgICAiXDJcMjdcMlwyNFwzXDU1XDFcMjRcMVw1NVwxXDMzXDJcMjRcMVwzNCIrCi0gICAgIlwxXDM1XDFcMjRcMVwzN1wxMVw1NVwxXDI0XDRcNTVcMVwyNFwyXDU1IisKLSAgICAiXDFcMjRcMVw1NVwxXDI0XDNcNTVcMTFcMjRcMVwyN1wxXDI0XDFcMjciKwotICAgICJcMlwyNFwxXDI3XDFcMjRcMVw0NFwzXDI0XDJcMjdcN1wyNFwxXDMzIisKLSAgICAiXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxNlwyNFwxXDYwXDJcMjQiKwotICAgICJcMVw2MVwxNFwyNFwxXDYyXDFcNjNcMVwyN1wxXDI0XDFcMjdcMVw2MiIrCi0gICAgIlwxXDI0XDFcMjdcMVwyNFwxXDY0XDNcMjRcMlwyN1wyXDI0XDNcNjIiKwotICAgICJcMVwyNFwxXDYyXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IisKLSAgICAiXDExXDYyXDFcMjRcNFw2MlwxXDI0XDJcNjJcMVw2NVwxXDYyXDFcNjYiKwotICAgICJcM1w2MlwxMVwyNFwxXDI3XDFcMjRcMVwyN1wyXDI0XDFcMjdcMVwyNCIrCi0gICAgIlwxXDQ0XDNcMjRcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzUiKwotICAgICJcMVwyNFwxXDM3XDIxXDI0XDFcNjVcMTZcMjRcMVw2N1wxXDI0XDFcNjciKwotICAgICJcMlwyNFwxXDY3XDFcMjRcMVw0NFwxXDcwXDFcMzFcMVwyNFwyXDY3IisKLSAgICAiXDFcMjRcMVwzMlw1XDI0XDFcMzNcMVwyNFwxXDcwXDFcMzRcMVwzNSIrCi0gICAgIlwxXDM2XDFcMzdcMTZcMjRcMVw3MVwyXDI0XDFcNjVcMVwyNFwxXDQwIisKLSAgICAiXDNcMjRcMVw0MVw2XDI0XDFcNzJcMVw3M1wxXDI3XDFcMjRcMVwyNyIrCi0gICAgIlwxXDcyXDFcMjRcMVwyN1wxXDI0XDFcNzRcM1wyNFwyXDI3XDJcMjQiKwotICAgICJcM1w3MlwxXDI0XDFcNzJcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0IisKLSAgICAiXDFcMzdcMTFcNzJcMVwyNFw0XDcyXDFcMjRcMlw3MlwxXDI0XDFcNzIiKwotICAgICJcMVwyNFwzXDcyXDExXDI0XDFcMjdcMVwyNFwxXDI3XDJcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcNDRcM1wyNFwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzQiKwotICAgICJcMVwzNVwxXDI0XDFcMzdcMzBcMjRcMVw3NVwxXDc2XDFcNzdcM1wyNCIrCi0gICAgIlwxXDEwMFwxXDEwMVwxXDI3XDFcMTAyXDFcMjdcMVwxMDBcMVwxMDNcMVwyNyIrCi0gICAgIlwxXDI0XDFcMTA0XDNcMjRcMlwyN1wyXDI0XDNcMTAwXDFcMjRcMVwxMDAiKwotICAgICJcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcMTAwXDFcMjQiKwotICAgICJcNFwxMDBcMVwyNFwyXDEwMFwxXDI0XDFcMTAwXDFcMjRcM1wxMDBcMTFcMjQiKwotICAgICJcMVwyN1wxXDI0XDFcMjdcMlwyNFwxXDI3XDFcMjRcMVw0NFwzXDI0IisKLSAgICAiXDJcMjdcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzNyIrCi0gICAgIlwzMlwyNFwxXDc3XDNcMjRcMVwxMDVcMVwxMDZcMVwyN1wxXDI0XDFcMjciKwotICAgICJcMVwxMDVcMVwyNFwxXDI3XDFcMjRcMVwxMDdcM1wyNFwyXDI3XDJcMjQiKwotICAgICJcM1wxMDVcMVwyNFwxXDEwNVwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjQiKwotICAgICJcMVwzN1wxMVwxMDVcMVwxMTBcNFwxMDVcMVwyNFwyXDEwNVwxXDI0XDFcMTA1IisKLSAgICAiXDFcMjRcM1wxMDVcMTFcMjRcMVwyN1wxXDI0XDFcMjdcMlwyNFwxXDI3IisKLSAgICAiXDFcMjRcMVw0NFwzXDI0XDJcMjdcN1wyNFwxXDMzXDJcMjRcMVwzNCIrCi0gICAgIlwxXDM1XDFcMjRcMVwzN1wxMVwyNFwxXDExMFwxMVwyNFwxXDExMVwxMVwyNCIrCi0gICAgIlwxXDExMlwxXDExM1wxXDExNFwxXDI3XDFcMTE1XDFcMjdcMVwxMTNcMVwxMTYiKwotICAgICJcMVwyN1wxXDExN1wxXDEyMFwxXDEyMVwxXDEyMlwxXDI0XDJcMjdcMVwyNCIrCi0gICAgIlwxXDEyM1wxXDEyNFwyXDExM1wxXDI0XDFcMTEzXDFcMzNcMVwxMjVcMVwyNCIrCi0gICAgIlwxXDM0XDFcMTI2XDFcMjRcMVwzN1wxMVwxMTNcMVwxMTBcNFwxMTNcMVwxMjciKwotICAgICJcMlwxMTNcMVwyNFwxXDExM1wxXDI0XDNcMTEzXDZcMjRcMVwxMTJcMVwxMTMiKwotICAgICJcMVwxMTRcMVwxMzBcMVwxMTVcMVwxMzBcMVwxMTNcMVwxMTZcMVwxMzBcMVwxMTciKwotICAgICJcMVwxMjBcMVwxMjFcMVwxMjJcMVwyNFwyXDEzMFwxXDI0XDFcMTIzXDFcMTI0IisKLSAgICAiXDJcMTEzXDFcMjRcMVwxMTNcMVwzM1wxXDEyNVwxXDI0XDFcMzRcMVwxMjYiKwotICAgICJcMVwyNFwxXDM3XDExXDExM1wxXDExMFw0XDExM1wxXDEyN1wyXDExM1wxXDI0IisKLSAgICAiXDFcMTEzXDFcMjRcM1wxMTNcNVwyNFw3NFwwXDJcMjVcMVwxMzFcM1wwIisKLSAgICAiXDFcMjVcM1wwXDFcMjVcN1wwXDNcMjVcMVwwXDFcMjVcN1wwIisKLSAgICAiXDExXDI1XDFcMFw0XDI1XDFcMFwyXDI1XDFcMFwxXDI1XDFcMCIrCi0gICAgIlwzXDI1XDZcMFwxXDEzMlwyXDI1XDFcMFwyXDI1XDFcMTMyXDFcMjUiKwotICAgICJcMVwwXDVcMjVcMlwwXDE2XDI1XDFcMTMyXDJcMjVcMVwxMzJcMlwyNSIrCi0gICAgIlwxXDEzMlwxMFwyNVwxXDEzMlw0XDI1XDFcMTMyXDdcMjVcNFwwXDFcMjciKwotICAgICJcMVwwXDFcMjdcMlwwXDFcMjdcNVwwXDJcMjdcNTNcMFwyXDI1IisKLSAgICAiXDFcMTMxXDNcMFwxXDI1XDNcMFwxXDEzM1w3XDBcM1wyNVwxXDAiKwotICAgICJcMVwyNVw3XDBcMTFcMjVcMVwwXDRcMjVcMVwwXDJcMjVcMVwwIisKLSAgICAiXDFcMjVcMVwwXDNcMjVcNlwwXDJcMTM0XDFcMTM1XDNcMFwxXDEzNCIrCi0gICAgIlwzXDBcMVwxMzRcN1wwXDNcMTM0XDFcMFwxXDEzNFw3XDBcMTFcMTM0IisKLSAgICAiXDFcMFw0XDEzNFwxXDBcMlwxMzRcMVwwXDFcMTM0XDFcMFwzXDEzNCIrCi0gICAgIlw2XDBcMlwxMzZcMVwxMzdcM1wwXDFcMTM2XDNcMFwxXDEzNlw3XDAiKwotICAgICJcM1wxMzZcMVwwXDFcMTM2XDdcMFwxMVwxMzZcMVwwXDRcMTM2XDFcMCIrCi0gICAgIlwyXDEzNlwxXDBcMVwxMzZcMVwwXDNcMTM2XDM2XDBcMVwxNDBcNzZcMCIrCi0gICAgIlwxXDE0MVw3NFwwXDJcMTQyXDEwXDBcMVwxNDNcMVwxNDRcMVwxNDVcN1wwIisKLSAgICAiXDJcMTQ2XDEwXDBcMVwxNDdcMVwxNTBcM1wwXDFcMTQ3XDNcMFwxXDE0NyIrCi0gICAgIlw3XDBcM1wxNDdcMVwwXDFcMTQ3XDdcMFwxMVwxNDdcMVwwXDRcMTQ3IisKLSAgICAiXDFcMFwyXDE0N1wxXDBcMVwxNDdcMVwwXDNcMTQ3XDZcMFwyXDE1MSIrCi0gICAgIlwxXDE1MlwxXDBcMVwxNTNcMTFcMTUxXDJcMFw1MlwxNTFcMVwwXDJcMTU0IisKLSAgICAiXDFcMTU1XDFcMFwzXDE1NFwxXDE1M1w2XDE1NFwyXDBcNTJcMTU0XDEzXDAiKwotICAgICJcMVwxNTZcNjBcMFwyXDE1N1wxXDE2MFwxXDBcMVwxNjFcMTFcMTU3XDJcMCIrCi0gICAgIlw1MlwxNTdcMVwwXDJcMTYyXDFcMTYzXDFcMFwzXDE2MlwxXDE2MVw2XDE2MiIrCi0gICAgIlwyXDBcNTJcMTYyXDI0XDBcMVwxNjRcNDdcMFwyXDUxXDFcMTY1XDNcMCIrCi0gICAgIlwxXDUxXDNcMFwxXDUxXDdcMFwzXDUxXDFcMFwxXDUxXDdcMCIrCi0gICAgIlwxMVw1MVwxXDBcNFw1MVwxXDBcMlw1MVwxXDBcMVw1MVwxXDAiKwotICAgICJcM1w1MVw2XDBcMVwxNjZcMlw1MVwxXDBcMlw1MVwxXDE2NlwxXDUxIisKLSAgICAiXDFcMFw1XDUxXDJcMFwxNlw1MVwxXDE2NlwyXDUxXDFcMTY2XDJcNTEiKwotICAgICJcMVwxNjZcMTBcNTFcMVwxNjZcNFw1MVwxXDE2Nlw3XDUxXDFcMFwyXDUxIisKLSAgICAiXDFcMTY1XDNcMFwxXDUxXDNcMFwxXDE2N1w3XDBcM1w1MVwxXDAiKwotICAgICJcMVw1MVw3XDBcMTFcNTFcMVwwXDRcNTFcMVwwXDJcNTFcMVwwIisKLSAgICAiXDFcNTFcMVwwXDNcNTFcNlwwXDJcNTVcMVwxNzBcM1wwXDFcNTUiKwotICAgICJcM1wwXDFcNTVcN1wwXDNcNTVcMVwwXDFcNTVcN1wwXDExXDU1IisKLSAgICAiXDFcMFw0XDU1XDFcMFwyXDU1XDFcMFwxXDU1XDFcMFwzXDU1IisKLSAgICAiXDZcMFwxXDE3MVwyXDU1XDFcMFwyXDU1XDFcMTcxXDFcNTVcMVwwIisKLSAgICAiXDVcNTVcMlwwXDE2XDU1XDFcMTcxXDJcNTVcMVwxNzFcMlw1NVwxXDE3MSIrCi0gICAgIlwxMFw1NVwxXDE3MVw0XDU1XDFcMTcxXDdcNTVcMVwwXDJcNTVcMVwxNzAiKwotICAgICJcM1wwXDFcNTVcM1wwXDFcMTcyXDdcMFwzXDU1XDFcMFwxXDU1IisKLSAgICAiXDdcMFwxMVw1NVwxXDBcNFw1NVwxXDBcMlw1NVwxXDBcMVw1NSIrCi0gICAgIlwxXDBcM1w1NVw2XDBcMlw2MlwxXDE3M1wzXDBcMVw2MlwzXDAiKwotICAgICJcMVw2Mlw3XDBcM1w2MlwxXDBcMVw2Mlw3XDBcMTFcNjJcMVwwIisKLSAgICAiXDRcNjJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwXDNcNjJcNlwwIisKLSAgICAiXDFcMTc0XDJcNjJcMVwwXDJcNjJcMVwxNzRcMVw2MlwxXDBcNVw2MiIrCi0gICAgIlwyXDBcMTZcNjJcMVwxNzRcMlw2MlwxXDE3NFwyXDYyXDFcMTc0XDEwXDYyIisKLSAgICAiXDFcMTc0XDRcNjJcMVwxNzRcN1w2MlwxXDBcMlw2MlwxXDE3M1wzXDAiKwotICAgICJcMVw2MlwzXDBcMVwxNzVcN1wwXDNcNjJcMVwwXDFcNjJcN1wwIisKLSAgICAiXDExXDYyXDFcMFw0XDYyXDFcMFwyXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDdcMFwxXDYyXDFcMTczXDNcMFwxXDYyXDNcMFwxXDYyIisKLSAgICAiXDdcMFwzXDYyXDFcMFwxXDYyXDdcMFwxMVw2MlwxXDBcNFw2MiIrCi0gICAgIlwxXDBcMlw2MlwxXDBcMVw2MlwxXDBcM1w2Mlw1XDBcNFwxNzYiKwotICAgICJcMVwxNzdcMVwxNzZcMVwxNzdcMlwxNzZcMVwxNzdcMlwxNzZcMVwwXDJcMTc2IisKLSAgICAiXDJcMTc3XDExXDE3NlwxXDBcMjVcMTc2XDFcMFwxMlwxNzZcMVwwXDJcNzIiKwotICAgICJcMVwyMDBcM1wwXDFcNzJcM1wwXDFcNzJcN1wwXDNcNzJcMVwwIisKLSAgICAiXDFcNzJcN1wwXDExXDcyXDFcMFw0XDcyXDFcMFwyXDcyXDFcMCIrCi0gICAgIlwxXDcyXDFcMFwzXDcyXDZcMFwxXDIwMVwyXDcyXDFcMFwyXDcyIisKLSAgICAiXDFcMjAxXDFcNzJcMVwwXDVcNzJcMlwwXDE2XDcyXDFcMjAxXDJcNzIiKwotICAgICJcMVwyMDFcMlw3MlwxXDIwMVwxMFw3MlwxXDIwMVw0XDcyXDFcMjAxXDdcNzIiKwotICAgICJcMVwwXDJcNzJcMVwyMDBcM1wwXDFcNzJcM1wwXDFcMjAyXDdcMCIrCi0gICAgIlwzXDcyXDFcMFwxXDcyXDdcMFwxMVw3MlwxXDBcNFw3MlwxXDAiKwotICAgICJcMlw3MlwxXDBcMVw3MlwxXDBcM1w3Mlw3NFwwXDFcNzVcNFwwIisKLSAgICAiXDJcMTAwXDFcMjAzXDNcMFwxXDEwMFwzXDBcMVwxMDBcN1wwXDNcMTAwIisKLSAgICAiXDFcMFwxXDEwMFw3XDBcMTFcMTAwXDFcMFw0XDEwMFwxXDBcMlwxMDAiKwotICAgICJcMVwwXDFcMTAwXDFcMFwzXDEwMFw2XDBcMVwyMDRcMlwxMDBcMVwwIisKLSAgICAiXDJcMTAwXDFcMjA0XDFcMTAwXDFcMFw1XDEwMFwyXDBcMTZcMTAwXDFcMjA0IisKLSAgICAiXDJcMTAwXDFcMjA0XDJcMTAwXDFcMjA0XDEwXDEwMFwxXDIwNFw0XDEwMFwxXDIwNCIrCi0gICAgIlw3XDEwMFwxXDBcMlwyMDVcMVwyMDZcMVwwXDFcMjA3XDExXDIwNVwyXDAiKwotICAgICJcNTJcMjA1XDFcMFwyXDIxMFwxXDIxMVwxXDBcM1wyMTBcMVwyMDdcNlwyMTAiKwotICAgICJcMlwwXDUyXDIxMFwxXDBcMlwxMDBcMVwyMDNcM1wwXDFcMTAwXDNcMCIrCi0gICAgIlwxXDIxMlw3XDBcM1wxMDBcMVwwXDFcMTAwXDdcMFwxMVwxMDBcMVwwIisKLSAgICAiXDRcMTAwXDFcMFwyXDEwMFwxXDBcMVwxMDBcMVwwXDNcMTAwXDZcMCIrCi0gICAgIlwyXDEwNVwxXDIxM1wzXDBcMVwxMDVcM1wwXDFcMTA1XDdcMFwzXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcN1wwXDExXDEwNVwxXDBcNFwxMDVcMVwwXDJcMTA1IisKLSAgICAiXDFcMFwxXDEwNVwxXDBcM1wxMDVcNlwwXDFcMjE0XDJcMTA1XDFcMCIrCi0gICAgIlwyXDEwNVwxXDIxNFwxXDEwNVwxXDBcNVwxMDVcMlwwXDE2XDEwNVwxXDIxNCIrCi0gICAgIlwyXDEwNVwxXDIxNFwyXDEwNVwxXDIxNFwxMFwxMDVcMVwyMTRcNFwxMDVcMVwyMTQiKwotICAgICJcN1wxMDVcMVwwXDJcMTA1XDFcMjEzXDNcMFwxXDEwNVwzXDBcMVwyMTUiKwotICAgICJcN1wwXDNcMTA1XDFcMFwxXDEwNVw3XDBcMTFcMTA1XDFcMFw0XDEwNSIrCi0gICAgIlwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMFwzXDEwNVw2XDBcMVwxMTIiKwotICAgICJcMVwyMTZcMVwyMTdcM1wwXDFcMjE2XDNcMFwxXDIxNlwxXDBcMVwyMjAiKwotICAgICJcNVwwXDNcMjE2XDFcMFwxXDIxNlw3XDBcMTFcMjE2XDFcMFw0XDIxNiIrCi0gICAgIlwxXDBcMlwyMTZcMVwwXDFcMjE2XDFcMFwzXDIxNlw0XDBcMVwyMjEiKwotICAgICJcMVwwXDJcMTEzXDFcMjIyXDNcMFwxXDExM1wzXDBcMVwxMTNcN1wwIisKLSAgICAiXDNcMTEzXDFcMjIzXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMCIrCi0gICAgIlwyXDExM1wxXDBcMVwxMTNcMVwwXDNcMTEzXDZcMFwxXDIyNFwyXDExMyIrCi0gICAgIlwxXDBcMlwxMTNcMVwyMjRcMVwxMTNcMVwwXDVcMTEzXDJcMFwxNlwxMTMiKwotICAgICJcMVwyMjRcMlwxMTNcMVwyMjRcMlwxMTNcMVwyMjRcMTBcMTEzXDFcMjI0XDRcMTEzIisKLSAgICAiXDFcMjI0XDdcMTEzXDFcMFwyXDIyNVwxXDIyNlwxXDBcMVwyMjdcMTFcMjI1IisKLSAgICAiXDJcMFw1MlwyMjVcMVwwXDJcMjMwXDFcMjMxXDFcMFwzXDIzMFwxXDIyNyIrCi0gICAgIlw2XDIzMFwyXDBcNTJcMjMwXDFcMFwxXDIzMlwxXDExM1wxXDIyMlwzXDAiKwotICAgICJcMVwxMTNcM1wwXDFcMjMzXDFcMFwxXDIyMFw1XDBcM1wxMTNcMVwyMjMiKwotICAgICJcMVwxMTNcN1wwXDExXDExM1wxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcM1wxMTNcNlwwXDFcMTEyXDEzXDBcMVwyMjBcNTZcMCIrCi0gICAgIlwxXDIzNFw3MlwwXDJcMjM1XDFcMjM2XDNcMFwxXDIzNVwzXDBcMVwyMzUiKwotICAgICJcN1wwXDNcMjM1XDFcMFwxXDIzNVw3XDBcMTFcMjM1XDFcMFw0XDIzNSIrCi0gICAgIlwxXDBcMlwyMzVcMVwwXDFcMjM1XDFcMFwzXDIzNVw2XDBcMlwxMTMiKwotICAgICJcMVwyMjJcM1wwXDFcMTEzXDNcMFwxXDExM1wxXDIzN1w2XDBcMVwxMTMiKwotICAgICJcMVwyNDBcMVwxMTNcMVwyMjNcMVwxMTNcN1wwXDExXDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTNcMTFcMFwxXDI0MSIrCi0gICAgIlwxXDBcMVwyNDFcMlwwXDFcMjQxXDVcMFwyXDI0MVwzMFwwXDFcMjQyIisKLSAgICAiXDIxXDBcNFwyNDNcMVwyNDRcMVwyNDNcMVwyNDRcMlwyNDNcMVwyNDRcNVwyNDMiKwotICAgICJcMlwyNDRcMTJcMjQzXDFcMFwxNFwyNDNcMVwwXDIyXDI0M1wxXDBcMVwyNDUiKwotICAgICJcMVwyNVwxXDEzMVwxXDI1XDFcMFwxXDI1XDFcMjQ1XDFcMFwxXDI1IisKLSAgICAiXDFcMFwxXDI1XDNcMFwyXDI1XDJcMFwzXDI1XDFcMFwxXDI1IisKLSAgICAiXDdcMFwxXDI0NVwyXDI1XDFcMjQ1XDJcMjVcMVwyNDVcMlwyNVwxXDAiKwotICAgICJcNFwyNVwxXDBcMVwyNDVcMVwyNVwxXDBcMVwyNVwxXDBcMVwyNDUiKwotICAgICJcMlwyNVw2XDBcMlwyNVwxXDEzMVwzXDBcMVwyNVwzXDBcMVwyNSIrCi0gICAgIlw3XDBcM1wyNVwxXDBcMVwyNVwyXDBcMVwyNDZcNFwwXDExXDI1IisKLSAgICAiXDFcMFw0XDI1XDFcMFwyXDI1XDFcMFwxXDI1XDFcMFwzXDI1IisKLSAgICAiXDZcMFwxXDI0N1wyXDEzNFwxXDBcMlwxMzRcMVwyNDdcMVwxMzRcMVwwIisKLSAgICAiXDVcMTM0XDJcMFwxNlwxMzRcMVwyNDdcMlwxMzRcMVwyNDdcMlwxMzRcMVwyNDciKwotICAgICJcMTBcMTM0XDFcMjQ3XDRcMTM0XDFcMjQ3XDdcMTM0XDFcMFwxXDI1MFwyXDEzNiIrCi0gICAgIlwxXDBcMlwxMzZcMVwyNTBcMVwxMzZcMVwwXDVcMTM2XDJcMFwxNlwxMzYiKwotICAgICJcMVwyNTBcMlwxMzZcMVwyNTBcMlwxMzZcMVwyNTBcMTBcMTM2XDFcMjUwXDRcMTM2IisKLSAgICAiXDFcMjUwXDdcMTM2XDEzXDBcMVwyNTFcNTdcMFwzNVwxNDFcMVwyNTJcMzVcMTQxIisKLSAgICAiXDQxXDBcMVwyNTNcMTAzXDBcMVwyNTRcNjVcMFwyXDI1NVw2NlwwXDJcMjU2IisKLSAgICAiXDEwM1wwXDFcMjU3XDE3XDBcMlwxNDdcMVwxNTBcM1wwXDFcMTQ3XDNcMCIrCi0gICAgIlwxXDE0N1w3XDBcM1wxNDdcMVwyNjBcMVwxNDdcN1wwXDExXDE0N1wxXDAiKwotICAgICJcNFwxNDdcMVwwXDJcMTQ3XDFcMFwxXDE0N1wxXDBcM1wxNDdcNlwwIisKLSAgICAiXDFcMjYxXDJcMTQ3XDFcMFwyXDE0N1wxXDI2MVwxXDE0N1wxXDBcNVwxNDciKwotICAgICJcMlwwXDE2XDE0N1wxXDI2MVwyXDE0N1wxXDI2MVwyXDE0N1wxXDI2MVwxMFwxNDciKwotICAgICJcMVwyNjFcNFwxNDdcMVwyNjFcN1wxNDdcMVwwXDFcMjYyXDFcMTUxXDFcMTUyIisKLSAgICAiXDFcMTUxXDFcMjYzXDFcMTUxXDFcMjYyXDEwXDE1MVwxXDI2NFwxNlwxNTFcMVwyNjIiKwotICAgICJcMlwxNTFcMVwyNjJcMlwxNTFcMVwyNjJcMTBcMTUxXDFcMjYyXDRcMTUxXDFcMjYyIisKLSAgICAiXDdcMTUxXDFcMFwxXDI2NVwxXDE1NFwxXDE1NVwzXDE1NFwxXDI2NVwxXDI2NiIrCi0gICAgIlw3XDE1NFwxXDI2N1wxNlwxNTRcMVwyNjVcMlwxNTRcMVwyNjVcMlwxNTRcMVwyNjUiKwotICAgICJcMTBcMTU0XDFcMjY1XDRcMTU0XDFcMjY1XDdcMTU0XDMyXDBcMVwyNDZcNDFcMCIrCi0gICAgIlwxXDI3MFwxXDE1N1wxXDE2MFwxXDE1N1wxXDI3MVwxXDE1N1wxXDI3MFwxMFwxNTciKwotICAgICJcMVwyNzJcMTZcMTU3XDFcMjcwXDJcMTU3XDFcMjcwXDJcMTU3XDFcMjcwXDEwXDE1NyIrCi0gICAgIlwxXDI3MFw0XDE1N1wxXDI3MFw3XDE1N1wxXDBcMVwyNzNcMVwxNjJcMVwxNjMiKwotICAgICJcM1wxNjJcMVwyNzNcMVwyNzRcN1wxNjJcMVwyNzVcMTZcMTYyXDFcMjczXDJcMTYyIisKLSAgICAiXDFcMjczXDJcMTYyXDFcMjczXDEwXDE2MlwxXDI3M1w0XDE2MlwxXDI3M1w3XDE2MiIrCi0gICAgIlwyNVwwXDFcMjc2XDQ2XDBcMVwyNzdcMVw1MVwxXDE2NVwxXDUxXDFcMCIrCi0gICAgIlwxXDUxXDFcMjc3XDFcMFwxXDUxXDFcMFwxXDUxXDNcMFwyXDUxIisKLSAgICAiXDJcMFwzXDUxXDFcMFwxXDUxXDdcMFwxXDI3N1wyXDUxXDFcMjc3IisKLSAgICAiXDJcNTFcMVwyNzdcMlw1MVwxXDBcNFw1MVwxXDBcMVwyNzdcMVw1MSIrCi0gICAgIlwxXDBcMVw1MVwxXDBcMVwyNzdcMlw1MVw2XDBcMlw1MVwxXDE2NSIrCi0gICAgIlwzXDBcMVw1MVwzXDBcMVw1MVw3XDBcM1w1MVwxXDBcMVw1MSIrCi0gICAgIlwyXDBcMVwyNDZcNFwwXDExXDUxXDFcMFw0XDUxXDFcMFwyXDUxIisKLSAgICAiXDFcMFwxXDUxXDFcMFwzXDUxXDZcMFwxXDMwMFwxXDU1XDFcMTcwIisKLSAgICAiXDFcNTVcMVwwXDFcNTVcMVwzMDBcMVwwXDFcNTVcMVwwXDFcNTUiKwotICAgICJcM1wwXDJcNTVcMlwwXDNcNTVcMVwwXDFcNTVcN1wwXDFcMzAwIisKLSAgICAiXDJcNTVcMVwzMDBcMlw1NVwxXDMwMFwyXDU1XDFcMFw0XDU1XDFcMCIrCi0gICAgIlwxXDMwMFwxXDU1XDFcMFwxXDU1XDFcMFwxXDMwMFwyXDU1XDZcMCIrCi0gICAgIlwyXDU1XDFcMTcwXDNcMFwxXDU1XDNcMFwxXDU1XDdcMFwzXDU1IisKLSAgICAiXDFcMFwxXDU1XDJcMFwxXDI0Nlw0XDBcMTFcNTVcMVwwXDRcNTUiKwotICAgICJcMVwwXDJcNTVcMVwwXDFcNTVcMVwwXDNcNTVcNlwwXDFcMzAxIisKLSAgICAiXDFcNjJcMVwxNzNcMVw2MlwxXDBcMVw2MlwxXDMwMVwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMVw2MlwzXDBcMlw2MlwyXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlw3XDBcMVwzMDFcMlw2MlwxXDMwMVwyXDYyXDFcMzAxXDJcNjJcMVwwIisKLSAgICAiXDRcNjJcMVwwXDFcMzAxXDFcNjJcMVwwXDFcNjJcMVwwXDFcMzAxIisKLSAgICAiXDJcNjJcNlwwXDJcNjJcMVwxNzNcM1wwXDFcNjJcM1wwXDFcNjIiKwotICAgICJcN1wwXDNcNjJcMVwwXDFcNjJcMlwwXDFcMjQ2XDRcMFwxMVw2MiIrCi0gICAgIlwxXDBcNFw2MlwxXDBcMlw2MlwxXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlw2XDBcMVwzMDJcMVw3MlwxXDIwMFwxXDcyXDFcMFwxXDcyXDFcMzAyIisKLSAgICAiXDFcMFwxXDcyXDFcMFwxXDcyXDNcMFwyXDcyXDJcMFwzXDcyIisKLSAgICAiXDFcMFwxXDcyXDdcMFwxXDMwMlwyXDcyXDFcMzAyXDJcNzJcMVwzMDIiKwotICAgICJcMlw3MlwxXDBcNFw3MlwxXDBcMVwzMDJcMVw3MlwxXDBcMVw3MiIrCi0gICAgIlwxXDBcMVwzMDJcMlw3Mlw2XDBcMlw3MlwxXDIwMFwzXDBcMVw3MiIrCi0gICAgIlwzXDBcMVw3Mlw3XDBcM1w3MlwxXDBcMVw3MlwyXDBcMVwyNDYiKwotICAgICJcNFwwXDExXDcyXDFcMFw0XDcyXDFcMFwyXDcyXDFcMFwxXDcyIisKLSAgICAiXDFcMFwzXDcyXDZcMFwxXDMwM1wxXDEwMFwxXDIwM1wxXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMVwzMDNcMVwwXDFcMTAwXDFcMFwxXDEwMFwzXDBcMlwxMDAiKwotICAgICJcMlwwXDNcMTAwXDFcMFwxXDEwMFw3XDBcMVwzMDNcMlwxMDBcMVwzMDMiKwotICAgICJcMlwxMDBcMVwzMDNcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXDMwM1wxXDEwMCIrCi0gICAgIlwxXDBcMVwxMDBcMVwwXDFcMzAzXDJcMTAwXDZcMFwxXDMwNFwxXDIwNSIrCi0gICAgIlwxXDIwNlwxXDIwNVwxXDMwNVwxXDIwNVwxXDMwNFwxMFwyMDVcMVwzMDZcMTZcMjA1IisKLSAgICAiXDFcMzA0XDJcMjA1XDFcMzA0XDJcMjA1XDFcMzA0XDEwXDIwNVwxXDMwNFw0XDIwNSIrCi0gICAgIlwxXDMwNFw3XDIwNVwxXDBcMVwzMDdcMVwyMTBcMVwyMTFcM1wyMTBcMVwzMDciKwotICAgICJcMVwzMTBcN1wyMTBcMVwzMTFcMTZcMjEwXDFcMzA3XDJcMjEwXDFcMzA3XDJcMjEwIisKLSAgICAiXDFcMzA3XDEwXDIxMFwxXDMwN1w0XDIxMFwxXDMwN1w3XDIxMFwxXDBcMlwxMDAiKwotICAgICJcMVwyMDNcM1wwXDFcMTAwXDNcMFwxXDEwMFw3XDBcM1wxMDBcMVwwIisKLSAgICAiXDFcMTAwXDJcMFwxXDI0Nlw0XDBcMTFcMTAwXDFcMFw0XDEwMFwxXDAiKwotICAgICJcMlwxMDBcMVwwXDFcMTAwXDFcMFwzXDEwMFw2XDBcMVwzMTJcMVwxMDUiKwotICAgICJcMVwyMTNcMVwxMDVcMVwwXDFcMTA1XDFcMzEyXDFcMFwxXDEwNVwxXDAiKwotICAgICJcMVwxMDVcM1wwXDJcMTA1XDJcMFwzXDEwNVwxXDBcMVwxMDVcN1wwIisKLSAgICAiXDFcMzEyXDJcMTA1XDFcMzEyXDJcMTA1XDFcMzEyXDJcMTA1XDFcMFw0XDEwNSIrCi0gICAgIlwxXDBcMVwzMTJcMVwxMDVcMVwwXDFcMTA1XDFcMFwxXDMxMlwyXDEwNSIrCi0gICAgIlw2XDBcMlwxMDVcMVwyMTNcM1wwXDFcMTA1XDNcMFwxXDEwNVw3XDAiKwotICAgICJcM1wxMDVcMVwwXDFcMTA1XDJcMFwxXDI0Nlw0XDBcMTFcMTA1XDFcMCIrCi0gICAgIlw0XDEwNVwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMFwzXDEwNVw2XDAiKwotICAgICJcMlwyMTZcMVwyMTdcM1wwXDFcMjE2XDNcMFwxXDIxNlw3XDBcM1wyMTYiKwotICAgICJcMVwwXDFcMjE2XDdcMFwxMVwyMTZcMVwwXDRcMjE2XDFcMFwyXDIxNiIrCi0gICAgIlwxXDBcMVwyMTZcMVwwXDNcMjE2XDZcMFwxXDMxM1wyXDIxNlwxXDAiKwotICAgICJcMlwyMTZcMVwzMTNcMVwyMTZcMVwwXDVcMjE2XDJcMFwxNlwyMTZcMVwzMTMiKwotICAgICJcMlwyMTZcMVwzMTNcMlwyMTZcMVwzMTNcMTBcMjE2XDFcMzEzXDRcMjE2XDFcMzEzIisKLSAgICAiXDdcMjE2XDFcMFwxXDMxNFwxXDExM1wxXDIyMlwxXDExM1wxXDBcMVwxMTMiKwotICAgICJcMVwzMTRcMVwwXDFcMTEzXDFcMFwxXDExM1wzXDBcMlwxMTNcMlwwIisKLSAgICAiXDNcMTEzXDFcMjIzXDFcMTEzXDdcMFwxXDMxNFwyXDExM1wxXDMxNFwyXDExMyIrCi0gICAgIlwxXDMxNFwyXDExM1wxXDBcNFwxMTNcMVwwXDFcMzE0XDFcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcMVwzMTRcMlwxMTNcNlwwXDFcMzE1XDFcMjI1XDFcMjI2IisKLSAgICAiXDFcMjI1XDFcMzE2XDFcMjI1XDFcMzE1XDEwXDIyNVwxXDMxN1wxNlwyMjVcMVwzMTUiKwotICAgICJcMlwyMjVcMVwzMTVcMlwyMjVcMVwzMTVcMTBcMjI1XDFcMzE1XDRcMjI1XDFcMzE1IisKLSAgICAiXDdcMjI1XDFcMFwxXDMyMFwxXDIzMFwxXDIzMVwzXDIzMFwxXDMyMFwxXDMyMSIrCi0gICAgIlw3XDIzMFwxXDMyMlwxNlwyMzBcMVwzMjBcMlwyMzBcMVwzMjBcMlwyMzBcMVwzMjAiKwotICAgICJcMTBcMjMwXDFcMzIwXDRcMjMwXDFcMzIwXDdcMjMwXDFcMFwxXDIzMlwxXDExMyIrCi0gICAgIlwxXDIyMlwzXDBcMVwxMTNcM1wwXDFcMTEzXDFcMFwxXDIyMFw1XDAiKwotICAgICJcM1wxMTNcMVwyMjNcMVwxMTNcN1wwXDExXDExM1wxXDBcNFwxMTNcMVwwIisKLSAgICAiXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTNcNFwwXDFcMjIxXDFcMCIrCi0gICAgIlwyXDExM1wxXDIyMlwzXDBcMVwxMTNcM1wwXDFcMTEzXDdcMFwzXDExMyIrCi0gICAgIlwxXDIyM1wxXDExM1wyXDBcMVwyNDZcNFwwXDExXDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTNcNlwwXDFcMjM0IisKLSAgICAiXDFcMjE2XDFcMjE3XDNcMFwxXDIxNlwzXDBcMVwyMTZcN1wwXDNcMjE2IisKLSAgICAiXDFcMFwxXDIxNlw3XDBcMTFcMjE2XDFcMFw0XDIxNlwxXDBcMlwyMTYiKwotICAgICJcMVwwXDFcMjE2XDFcMFwzXDIxNlw0XDBcMVwyMjFcMVwwXDFcMzIzIisKLSAgICAiXDJcMjM1XDFcMFwyXDIzNVwxXDMyM1wxXDIzNVwxXDBcNVwyMzVcMlwwIisKLSAgICAiXDE2XDIzNVwxXDMyM1wyXDIzNVwxXDMyM1wyXDIzNVwxXDMyM1wxMFwyMzVcMVwzMjMiKwotICAgICJcNFwyMzVcMVwzMjNcN1wyMzVcMVwwXDFcMzI0XDVcMFwxXDMyNFwxMVwwIisKLSAgICAiXDFcMzI0XDVcMFwxXDMyNFw3XDBcMlwzMjRcMVwwXDJcMzI0XDFcMCIrCi0gICAgIlwyXDMyNFw3XDBcMlwzMjRcM1wwXDJcMzI0XDdcMFwyXDExM1wxXDIyMiIrCi0gICAgIlwzXDBcMVwxMTNcM1wwXDFcMTEzXDdcMFwyXDExM1wxXDMyNVwxXDIyMyIrCi0gICAgIlwxXDExM1w3XDBcMTFcMTEzXDFcMFw0XDExM1wxXDBcMlwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDFcMFwzXDExM1w1N1wwXDFcMzI2XDIxXDBcMVwzMjdcMVwyNSIrCi0gICAgIlwxXDEzMVwxXDI1XDFcMFwxXDI1XDFcMzI3XDFcMFwxXDI1XDFcMCIrCi0gICAgIlwxXDI1XDNcMFwyXDI1XDJcMFwzXDI1XDFcMFwxXDI1XDdcMCIrCi0gICAgIlwxXDMyN1wyXDI1XDFcMzI3XDJcMjVcMVwzMjdcMlwyNVwxXDBcNFwyNSIrCi0gICAgIlwxXDBcMVwzMjdcMVwyNVwxXDBcMVwyNVwxXDBcMVwzMjdcMlwyNSIrCi0gICAgIlw2XDBcMVwzMzBcMVwxMzRcMVwxMzVcMVwxMzRcMVwwXDFcMTM0XDFcMzMwIisKLSAgICAiXDFcMFwxXDEzNFwxXDBcMVwxMzRcM1wwXDJcMTM0XDJcMFwzXDEzNCIrCi0gICAgIlwxXDBcMVwxMzRcN1wwXDFcMzMwXDJcMTM0XDFcMzMwXDJcMTM0XDFcMzMwIisKLSAgICAiXDJcMTM0XDFcMFw0XDEzNFwxXDBcMVwzMzBcMVwxMzRcMVwwXDFcMTM0IisKLSAgICAiXDFcMFwxXDMzMFwyXDEzNFw2XDBcMVwzMzFcMVwxMzZcMVwxMzdcMVwxMzYiKwotICAgICJcMVwwXDFcMTM2XDFcMzMxXDFcMFwxXDEzNlwxXDBcMVwxMzZcM1wwIisKLSAgICAiXDJcMTM2XDJcMFwzXDEzNlwxXDBcMVwxMzZcN1wwXDFcMzMxXDJcMTM2IisKLSAgICAiXDFcMzMxXDJcMTM2XDFcMzMxXDJcMTM2XDFcMFw0XDEzNlwxXDBcMVwzMzEiKwotICAgICJcMVwxMzZcMVwwXDFcMTM2XDFcMFwxXDMzMVwyXDEzNlwyMFwwXDFcMzMyIisKLSAgICAiXDU3XDBcMzRcMTQxXDFcMzMzXDFcMjUyXDM1XDE0MVw0MlwwXDJcMzM0XDEwMlwwIisKLSAgICAiXDFcMzM1XDc1XDBcMlwzMzZcNzRcMFwxXDMzN1w3NlwwXDFcMzQwXDdcMCIrCi0gICAgIlwxXDM0MVwxXDM0MlwxXDI2MFwxXDBcMVwyNjBcMVwzNDFcMVwwXDFcMjYwIisKLSAgICAiXDFcMFwxXDM0MVwzXDBcMlwyNjBcMlwwXDNcMzQxXDFcMFwxXDM0MSIrCi0gICAgIlw3XDBcMTFcMzQxXDFcMFw0XDM0MVwxXDBcMlwzNDFcMVwwXDFcMzQxIisKLSAgICAiXDFcMFwzXDM0MVw2XDBcMVwzNDNcMVwxNDdcMVwxNTBcMVwxNDdcMVwwIisKLSAgICAiXDFcMTQ3XDFcMzQzXDFcMFwxXDE0N1wxXDBcMVwxNDdcM1wwXDJcMTQ3IisKLSAgICAiXDJcMFwzXDE0N1wxXDI2MFwxXDE0N1w3XDBcMVwzNDNcMlwxNDdcMVwzNDMiKwotICAgICJcMlwxNDdcMVwzNDNcMlwxNDdcMVwwXDRcMTQ3XDFcMFwxXDM0M1wxXDE0NyIrCi0gICAgIlwxXDBcMVwxNDdcMVwwXDFcMzQzXDJcMTQ3XDZcMFwxXDM0NFwxXDE1MSIrCi0gICAgIlwxXDE1MlwxXDE1MVwxXDE1M1wxXDE1MVwxXDM0NFwyN1wxNTFcMVwzNDRcMlwxNTEiKwotICAgICJcMVwzNDRcMlwxNTFcMVwzNDRcMTBcMTUxXDFcMzQ0XDRcMTUxXDFcMzQ0XDdcMTUxIisKLSAgICAiXDFcMFwyXDE1MVwxXDE1MlwxXDBcMVwxNTNcMTJcMTUxXDFcMFw1MlwxNTEiKwotICAgICJcMVwwXDFcMzQ1XDFcMTU0XDFcMTU1XDNcMTU0XDFcMzQ1XDFcMTUzXDI2XDE1NCIrCi0gICAgIlwxXDM0NVwyXDE1NFwxXDM0NVwyXDE1NFwxXDM0NVwxMFwxNTRcMVwzNDVcNFwxNTQiKwotICAgICJcMVwzNDVcN1wxNTRcMVwwXDJcMTU0XDFcMTU1XDFcMFwzXDE1NFwxXDE1MyIrCi0gICAgIlw3XDE1NFwxXDBcNTJcMTU0XDFcMFwxXDM0NlwxXDE1N1wxXDE2MFwxXDE1NyIrCi0gICAgIlwxXDE2MVwxXDE1N1wxXDM0NlwyN1wxNTdcMVwzNDZcMlwxNTdcMVwzNDZcMlwxNTciKwotICAgICJcMVwzNDZcMTBcMTU3XDFcMzQ2XDRcMTU3XDFcMzQ2XDdcMTU3XDFcMFwyXDE1NyIrCi0gICAgIlwxXDE2MFwxXDBcMVwxNjFcMTJcMTU3XDFcMFw1MlwxNTdcMVwwXDFcMzQ3IisKLSAgICAiXDFcMTYyXDFcMTYzXDNcMTYyXDFcMzQ3XDFcMTYxXDI2XDE2MlwxXDM0N1wyXDE2MiIrCi0gICAgIlwxXDM0N1wyXDE2MlwxXDM0N1wxMFwxNjJcMVwzNDdcNFwxNjJcMVwzNDdcN1wxNjIiKwotICAgICJcMVwwXDJcMTYyXDFcMTYzXDFcMFwzXDE2MlwxXDE2MVw3XDE2MlwxXDAiKwotICAgICJcNTJcMTYyXDI2XDBcMVwzNTBcNDVcMFwxXDM1MVwxXDUxXDFcMTY1XDFcNTEiKwotICAgICJcMVwwXDFcNTFcMVwzNTFcMVwwXDFcNTFcMVwwXDFcNTFcM1wwIisKLSAgICAiXDJcNTFcMlwwXDNcNTFcMVwwXDFcNTFcN1wwXDFcMzUxXDJcNTEiKwotICAgICJcMVwzNTFcMlw1MVwxXDM1MVwyXDUxXDFcMFw0XDUxXDFcMFwxXDM1MSIrCi0gICAgIlwxXDUxXDFcMFwxXDUxXDFcMFwxXDM1MVwyXDUxXDZcMFwxXDM1MiIrCi0gICAgIlwxXDU1XDFcMTcwXDFcNTVcMVwwXDFcNTVcMVwzNTJcMVwwXDFcNTUiKwotICAgICJcMVwwXDFcNTVcM1wwXDJcNTVcMlwwXDNcNTVcMVwwXDFcNTUiKwotICAgICJcN1wwXDFcMzUyXDJcNTVcMVwzNTJcMlw1NVwxXDM1MlwyXDU1XDFcMCIrCi0gICAgIlw0XDU1XDFcMFwxXDM1MlwxXDU1XDFcMFwxXDU1XDFcMFwxXDM1MiIrCi0gICAgIlwyXDU1XDZcMFwxXDM1M1wxXDYyXDFcMTczXDFcNjJcMVwwXDFcNjIiKwotICAgICJcMVwzNTNcMVwwXDFcNjJcMVwwXDFcNjJcM1wwXDJcNjJcMlwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcN1wwXDFcMzUzXDJcNjJcMVwzNTNcMlw2MiIrCi0gICAgIlwxXDM1M1wyXDYyXDFcMFw0XDYyXDFcMFwxXDM1M1wxXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFwxXDM1M1wyXDYyXDZcMFwxXDM1NFwxXDcyXDFcMjAwIisKLSAgICAiXDFcNzJcMVwwXDFcNzJcMVwzNTRcMVwwXDFcNzJcMVwwXDFcNzIiKwotICAgICJcM1wwXDJcNzJcMlwwXDNcNzJcMVwwXDFcNzJcN1wwXDFcMzU0IisKLSAgICAiXDJcNzJcMVwzNTRcMlw3MlwxXDM1NFwyXDcyXDFcMFw0XDcyXDFcMCIrCi0gICAgIlwxXDM1NFwxXDcyXDFcMFwxXDcyXDFcMFwxXDM1NFwyXDcyXDZcMCIrCi0gICAgIlwxXDM1NVwxXDEwMFwxXDIwM1wxXDEwMFwxXDBcMVwxMDBcMVwzNTVcMVwwIisKLSAgICAiXDFcMTAwXDFcMFwxXDEwMFwzXDBcMlwxMDBcMlwwXDNcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFw3XDBcMVwzNTVcMlwxMDBcMVwzNTVcMlwxMDBcMVwzNTVcMlwxMDAiKwotICAgICJcMVwwXDRcMTAwXDFcMFwxXDM1NVwxXDEwMFwxXDBcMVwxMDBcMVwwIisKLSAgICAiXDFcMzU1XDJcMTAwXDZcMFwxXDM1NlwxXDIwNVwxXDIwNlwxXDIwNVwxXDIwNyIrCi0gICAgIlwxXDIwNVwxXDM1NlwyN1wyMDVcMVwzNTZcMlwyMDVcMVwzNTZcMlwyMDVcMVwzNTYiKwotICAgICJcMTBcMjA1XDFcMzU2XDRcMjA1XDFcMzU2XDdcMjA1XDFcMFwyXDIwNVwxXDIwNiIrCi0gICAgIlwxXDBcMVwyMDdcMTJcMjA1XDFcMFw1MlwyMDVcMVwwXDFcMzU3XDFcMjEwIisKLSAgICAiXDFcMjExXDNcMjEwXDFcMzU3XDFcMjA3XDI2XDIxMFwxXDM1N1wyXDIxMFwxXDM1NyIrCi0gICAgIlwyXDIxMFwxXDM1N1wxMFwyMTBcMVwzNTdcNFwyMTBcMVwzNTdcN1wyMTBcMVwwIisKLSAgICAiXDJcMjEwXDFcMjExXDFcMFwzXDIxMFwxXDIwN1w3XDIxMFwxXDBcNTJcMjEwIisKLSAgICAiXDFcMFwxXDM2MFwxXDEwNVwxXDIxM1wxXDEwNVwxXDBcMVwxMDVcMVwzNjAiKwotICAgICJcMVwwXDFcMTA1XDFcMFwxXDEwNVwzXDBcMlwxMDVcMlwwXDNcMTA1IisKLSAgICAiXDFcMFwxXDEwNVw3XDBcMVwzNjBcMlwxMDVcMVwzNjBcMlwxMDVcMVwzNjAiKwotICAgICJcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXDM2MFwxXDEwNVwxXDBcMVwxMDUiKwotICAgICJcMVwwXDFcMzYwXDJcMTA1XDZcMFwxXDM2MVwxXDIxNlwxXDIxN1wxXDIxNiIrCi0gICAgIlwxXDBcMVwyMTZcMVwzNjFcMVwwXDFcMjE2XDFcMFwxXDIxNlwzXDAiKwotICAgICJcMlwyMTZcMlwwXDNcMjE2XDFcMFwxXDIxNlw3XDBcMVwzNjFcMlwyMTYiKwotICAgICJcMVwzNjFcMlwyMTZcMVwzNjFcMlwyMTZcMVwwXDRcMjE2XDFcMFwxXDM2MSIrCi0gICAgIlwxXDIxNlwxXDBcMVwyMTZcMVwwXDFcMzYxXDJcMjE2XDZcMFwxXDM2MiIrCi0gICAgIlwxXDExM1wxXDIyMlwxXDExM1wxXDBcMVwxMTNcMVwzNjJcMVwwXDFcMTEzIisKLSAgICAiXDFcMFwxXDExM1wzXDBcMlwxMTNcMlwwXDNcMTEzXDFcMjIzXDFcMTEzIisKLSAgICAiXDdcMFwxXDM2MlwyXDExM1wxXDM2MlwyXDExM1wxXDM2MlwyXDExM1wxXDAiKwotICAgICJcNFwxMTNcMVwwXDFcMzYyXDFcMTEzXDFcMFwxXDExM1wxXDBcMVwzNjIiKwotICAgICJcMlwxMTNcNlwwXDFcMzYzXDFcMjI1XDFcMjI2XDFcMjI1XDFcMjI3XDFcMjI1IisKLSAgICAiXDFcMzYzXDI3XDIyNVwxXDM2M1wyXDIyNVwxXDM2M1wyXDIyNVwxXDM2M1wxMFwyMjUiKwotICAgICJcMVwzNjNcNFwyMjVcMVwzNjNcN1wyMjVcMVwwXDJcMjI1XDFcMjI2XDFcMCIrCi0gICAgIlwxXDIyN1wxMlwyMjVcMVwwXDUyXDIyNVwxXDBcMVwzNjRcMVwyMzBcMVwyMzEiKwotICAgICJcM1wyMzBcMVwzNjRcMVwyMjdcMjZcMjMwXDFcMzY0XDJcMjMwXDFcMzY0XDJcMjMwIisKLSAgICAiXDFcMzY0XDEwXDIzMFwxXDM2NFw0XDIzMFwxXDM2NFw3XDIzMFwxXDBcMlwyMzAiKwotICAgICJcMVwyMzFcMVwwXDNcMjMwXDFcMjI3XDdcMjMwXDFcMFw1MlwyMzBcMVwwIisKLSAgICAiXDFcMzY1XDFcMjM1XDFcMjM2XDFcMjM1XDFcMFwxXDIzNVwxXDM2NVwxXDAiKwotICAgICJcMVwyMzVcMVwwXDFcMjM1XDNcMFwyXDIzNVwyXDBcM1wyMzVcMVwwIisKLSAgICAiXDFcMjM1XDdcMFwxXDM2NVwyXDIzNVwxXDM2NVwyXDIzNVwxXDM2NVwyXDIzNSIrCi0gICAgIlwxXDBcNFwyMzVcMVwwXDFcMzY1XDFcMjM1XDFcMFwxXDIzNVwxXDAiKwotICAgICJcMVwzNjVcMlwyMzVcNlwwXDFcMzY2XDVcMFwxXDM2NlwzXDBcMVwzNjciKwotICAgICJcNVwwXDFcMzY2XDVcMFwxXDM2Nlw3XDBcMlwzNjZcMVwwXDJcMzY2IisKLSAgICAiXDFcMFwyXDM2Nlw3XDBcMlwzNjZcM1wwXDJcMzY2XDdcMFwyXDExMyIrCi0gICAgIlwxXDIyMlwzXDBcMVwxMTNcM1wwXDFcMTEzXDdcMFwzXDExM1wxXDM3MCIrCi0gICAgIlwxXDExM1w3XDBcMTFcMTEzXDFcMFw0XDExM1wxXDBcMlwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDFcMFwzXDExM1w2MFwwXDFcMzcxXDIwXDBcMVwzNzJcMVwyNSIrCi0gICAgIlwxXDEzMVwxXDI1XDFcMFwxXDI1XDFcMzcyXDFcMFwxXDI1XDFcMCIrCi0gICAgIlwxXDI1XDNcMFwyXDI1XDJcMFwzXDI1XDFcMFwxXDI1XDdcMCIrCi0gICAgIlwxXDM3MlwyXDI1XDFcMzcyXDJcMjVcMVwzNzJcMlwyNVwxXDBcNFwyNSIrCi0gICAgIlwxXDBcMVwzNzJcMVwyNVwxXDBcMVwyNVwxXDBcMVwzNzJcMlwyNSIrCi0gICAgIlw2XDBcMVwzNzNcMVwxMzRcMVwxMzVcMVwxMzRcMVwwXDFcMTM0XDFcMzczIisKLSAgICAiXDFcMFwxXDEzNFwxXDBcMVwxMzRcM1wwXDJcMTM0XDJcMFwzXDEzNCIrCi0gICAgIlwxXDBcMVwxMzRcN1wwXDFcMzczXDJcMTM0XDFcMzczXDJcMTM0XDFcMzczIisKLSAgICAiXDJcMTM0XDFcMFw0XDEzNFwxXDBcMVwzNzNcMVwxMzRcMVwwXDFcMTM0IisKLSAgICAiXDFcMFwxXDM3M1wyXDEzNFw2XDBcMVwzNzRcMVwxMzZcMVwxMzdcMVwxMzYiKwotICAgICJcMVwwXDFcMTM2XDFcMzc0XDFcMFwxXDEzNlwxXDBcMVwxMzZcM1wwIisKLSAgICAiXDJcMTM2XDJcMFwzXDEzNlwxXDBcMVwxMzZcN1wwXDFcMzc0XDJcMTM2IisKLSAgICAiXDFcMzc0XDJcMTM2XDFcMzc0XDJcMTM2XDFcMFw0XDEzNlwxXDBcMVwzNzQiKwotICAgICJcMVwxMzZcMVwwXDFcMTM2XDFcMFwxXDM3NFwyXDEzNlwzMVwwXDFcMzc1IisKLSAgICAiXDEyMlwwXDFcMzc2XDY3XDBcMVwzNzdcNjZcMFwyXHUwMTAwXDczXDBcMVx1MDEwMSIrCi0gICAgIlwyNFwwXDJcMzQxXDFcMzQyXDFcdTAxMDJcMVwwXDFcdTAxMDJcMVwzNDFcMVwwIisKLSAgICAiXDFcdTAxMDJcMVx1MDEwM1wxXDM0MVwzXDBcMlx1MDEwMlwyXDBcM1wzNDFcMVwwIisKLSAgICAiXDFcMzQxXDdcMFwxMVwzNDFcMVwwXDRcMzQxXDFcMFwyXDM0MVwxXDAiKwotICAgICJcMVwzNDFcMVwwXDNcMzQxXDZcMFwxXHUwMTA0XDJcMzQxXDFcMFwyXDM0MSIrCi0gICAgIlwxXHUwMTA0XDFcMzQxXDFcMFw1XDM0MVwyXDBcMTZcMzQxXDFcdTAxMDRcMlwzNDEiKwotICAgICJcMVx1MDEwNFwyXDM0MVwxXHUwMTA0XDEwXDM0MVwxXHUwMTA0XDRcMzQxXDFcdTAxMDRcN1wzNDEiKwotICAgICJcMVwwXDFcdTAxMDVcMVwxNDdcMVwxNTBcMVwxNDdcMVwwXDFcMTQ3XDFcdTAxMDUiKwotICAgICJcMVwwXDFcMTQ3XDFcMFwxXDE0N1wzXDBcMlwxNDdcMlwwXDNcMTQ3IisKLSAgICAiXDFcMjYwXDFcMTQ3XDdcMFwxXHUwMTA1XDJcMTQ3XDFcdTAxMDVcMlwxNDdcMVx1MDEwNSIrCi0gICAgIlwyXDE0N1wxXDBcNFwxNDdcMVwwXDFcdTAxMDVcMVwxNDdcMVwwXDFcMTQ3IisKLSAgICAiXDFcMFwxXHUwMTA1XDJcMTQ3XDZcMFwxXHUwMTA2XDFcMTUxXDFcMTUyXDFcMTUxIisKLSAgICAiXDFcMTUzXDFcMTUxXDFcdTAxMDZcMjdcMTUxXDFcdTAxMDZcMlwxNTFcMVx1MDEwNlwyXDE1MSIrCi0gICAgIlwxXHUwMTA2XDEwXDE1MVwxXHUwMTA2XDRcMTUxXDFcdTAxMDZcN1wxNTFcMVwwXDFcdTAxMDciKwotICAgICJcMVwxNTRcMVwxNTVcM1wxNTRcMVx1MDEwN1wxXDE1M1wyNlwxNTRcMVx1MDEwN1wyXDE1NCIrCi0gICAgIlwxXHUwMTA3XDJcMTU0XDFcdTAxMDdcMTBcMTU0XDFcdTAxMDdcNFwxNTRcMVx1MDEwN1w3XDE1NCIrCi0gICAgIlwxXDBcMVx1MDEwOFwxXDE1N1wxXDE2MFwxXDE1N1wxXDE2MVwxXDE1N1wxXHUwMTA4IisKLSAgICAiXDI3XDE1N1wxXHUwMTA4XDJcMTU3XDFcdTAxMDhcMlwxNTdcMVx1MDEwOFwxMFwxNTdcMVx1MDEwOCIrCi0gICAgIlw0XDE1N1wxXHUwMTA4XDdcMTU3XDFcMFwxXHUwMTA5XDFcMTYyXDFcMTYzXDNcMTYyIisKLSAgICAiXDFcdTAxMDlcMVwxNjFcMjZcMTYyXDFcdTAxMDlcMlwxNjJcMVx1MDEwOVwyXDE2MlwxXHUwMTA5IisKLSAgICAiXDEwXDE2MlwxXHUwMTA5XDRcMTYyXDFcdTAxMDlcN1wxNjJcMVwwXDJcdTAxMGFcMVx1MDEwYiIrCi0gICAgIlwxXDM1MFwxXHUwMTBjXDFcMzUwXDFcdTAxMGFcMVx1MDEwZFwxXDM1MFwxXHUwMTBlXDRcdTAxMGEiKwotICAgICJcMlwzNTBcNVx1MDEwYVwxXDBcNDRcdTAxMGFcMVwwXDFcdTAxMGZcMVw1MVwxXDE2NSIrCi0gICAgIlwxXDUxXDFcMFwxXDUxXDFcdTAxMGZcMVwwXDFcNTFcMVwwXDFcNTEiKwotICAgICJcM1wwXDJcNTFcMlwwXDNcNTFcMVwwXDFcNTFcN1wwXDFcdTAxMGYiKwotICAgICJcMlw1MVwxXHUwMTBmXDJcNTFcMVx1MDEwZlwyXDUxXDFcMFw0XDUxXDFcMCIrCi0gICAgIlwxXHUwMTBmXDFcNTFcMVwwXDFcNTFcMVwwXDFcdTAxMGZcMlw1MVw2XDAiKwotICAgICJcMVx1MDExMFwxXDU1XDFcMTcwXDFcNTVcMVwwXDFcNTVcMVx1MDExMFwxXDAiKwotICAgICJcMVw1NVwxXDBcMVw1NVwzXDBcMlw1NVwyXDBcM1w1NVwxXDAiKwotICAgICJcMVw1NVw3XDBcMVx1MDExMFwyXDU1XDFcdTAxMTBcMlw1NVwxXHUwMTEwXDJcNTUiKwotICAgICJcMVwwXDRcNTVcMVwwXDFcdTAxMTBcMVw1NVwxXDBcMVw1NVwxXDAiKwotICAgICJcMVx1MDExMFwyXDU1XDZcMFwxXHUwMTExXDFcNjJcMVwxNzNcMVw2MlwxXDAiKwotICAgICJcMVw2MlwxXHUwMTExXDFcMFwxXDYyXDFcMFwxXDYyXDNcMFwyXDYyIisKLSAgICAiXDJcMFwzXDYyXDFcMFwxXDYyXDdcMFwxXHUwMTExXDJcNjJcMVx1MDExMSIrCi0gICAgIlwyXDYyXDFcdTAxMTFcMlw2MlwxXDBcNFw2MlwxXDBcMVx1MDExMVwxXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwxXHUwMTExXDJcNjJcNlwwXDFcdTAxMTJcMVw3MiIrCi0gICAgIlwxXDIwMFwxXDcyXDFcMFwxXDcyXDFcdTAxMTJcMVwwXDFcNzJcMVwwIisKLSAgICAiXDFcNzJcM1wwXDJcNzJcMlwwXDNcNzJcMVwwXDFcNzJcN1wwIisKLSAgICAiXDFcdTAxMTJcMlw3MlwxXHUwMTEyXDJcNzJcMVx1MDExMlwyXDcyXDFcMFw0XDcyIisKLSAgICAiXDFcMFwxXHUwMTEyXDFcNzJcMVwwXDFcNzJcMVwwXDFcdTAxMTJcMlw3MiIrCi0gICAgIlw2XDBcMVx1MDExM1wxXDEwMFwxXDIwM1wxXDEwMFwxXDBcMVwxMDBcMVx1MDExMyIrCi0gICAgIlwxXDBcMVwxMDBcMVwwXDFcMTAwXDNcMFwyXDEwMFwyXDBcM1wxMDAiKwotICAgICJcMVwwXDFcMTAwXDdcMFwxXHUwMTEzXDJcMTAwXDFcdTAxMTNcMlwxMDBcMVx1MDExMyIrCi0gICAgIlwyXDEwMFwxXDBcNFwxMDBcMVwwXDFcdTAxMTNcMVwxMDBcMVwwXDFcMTAwIisKLSAgICAiXDFcMFwxXHUwMTEzXDJcMTAwXDZcMFwxXHUwMTE0XDFcMjA1XDFcMjA2XDFcMjA1IisKLSAgICAiXDFcMjA3XDFcMjA1XDFcdTAxMTRcMjdcMjA1XDFcdTAxMTRcMlwyMDVcMVx1MDExNFwyXDIwNSIrCi0gICAgIlwxXHUwMTE0XDEwXDIwNVwxXHUwMTE0XDRcMjA1XDFcdTAxMTRcN1wyMDVcMVwwXDFcdTAxMTUiKwotICAgICJcMVwyMTBcMVwyMTFcM1wyMTBcMVx1MDExNVwxXDIwN1wyNlwyMTBcMVx1MDExNVwyXDIxMCIrCi0gICAgIlwxXHUwMTE1XDJcMjEwXDFcdTAxMTVcMTBcMjEwXDFcdTAxMTVcNFwyMTBcMVx1MDExNVw3XDIxMCIrCi0gICAgIlwxXDBcMVx1MDExNlwxXDEwNVwxXDIxM1wxXDEwNVwxXDBcMVwxMDVcMVx1MDExNiIrCi0gICAgIlwxXDBcMVwxMDVcMVwwXDFcMTA1XDNcMFwyXDEwNVwyXDBcM1wxMDUiKwotICAgICJcMVwwXDFcMTA1XDdcMFwxXHUwMTE2XDJcMTA1XDFcdTAxMTZcMlwxMDVcMVx1MDExNiIrCi0gICAgIlwyXDEwNVwxXDBcNFwxMDVcMVwwXDFcdTAxMTZcMVwxMDVcMVwwXDFcMTA1IisKLSAgICAiXDFcMFwxXHUwMTE2XDJcMTA1XDZcMFwxXHUwMTE3XDFcMjE2XDFcMjE3XDFcMjE2IisKLSAgICAiXDFcMFwxXDIxNlwxXHUwMTE3XDFcMFwxXDIxNlwxXDBcMVwyMTZcM1wwIisKLSAgICAiXDJcMjE2XDJcMFwzXDIxNlwxXDBcMVwyMTZcN1wwXDFcdTAxMTdcMlwyMTYiKwotICAgICJcMVx1MDExN1wyXDIxNlwxXHUwMTE3XDJcMjE2XDFcMFw0XDIxNlwxXDBcMVx1MDExNyIrCi0gICAgIlwxXDIxNlwxXDBcMVwyMTZcMVwwXDFcdTAxMTdcMlwyMTZcNlwwXDFcdTAxMTgiKwotICAgICJcMVwxMTNcMVwyMjJcMVwxMTNcMVwwXDFcMTEzXDFcdTAxMThcMVwwXDFcMTEzIisKLSAgICAiXDFcMFwxXDExM1wzXDBcMlwxMTNcMlwwXDNcMTEzXDFcMjIzXDFcMTEzIisKLSAgICAiXDdcMFwxXHUwMTE4XDJcMTEzXDFcdTAxMThcMlwxMTNcMVx1MDExOFwyXDExM1wxXDAiKwotICAgICJcNFwxMTNcMVwwXDFcdTAxMThcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXHUwMTE4IisKLSAgICAiXDJcMTEzXDZcMFwxXHUwMTE5XDFcMjI1XDFcMjI2XDFcMjI1XDFcMjI3XDFcMjI1IisKLSAgICAiXDFcdTAxMTlcMjdcMjI1XDFcdTAxMTlcMlwyMjVcMVx1MDExOVwyXDIyNVwxXHUwMTE5XDEwXDIyNSIrCi0gICAgIlwxXHUwMTE5XDRcMjI1XDFcdTAxMTlcN1wyMjVcMVwwXDFcdTAxMWFcMVwyMzBcMVwyMzEiKwotICAgICJcM1wyMzBcMVx1MDExYVwxXDIyN1wyNlwyMzBcMVx1MDExYVwyXDIzMFwxXHUwMTFhXDJcMjMwIisKLSAgICAiXDFcdTAxMWFcMTBcMjMwXDFcdTAxMWFcNFwyMzBcMVx1MDExYVw3XDIzMFwxXDBcMVx1MDExYiIrCi0gICAgIlwxXDIzNVwxXDIzNlwxXDIzNVwxXDBcMVwyMzVcMVx1MDExYlwxXDBcMVwyMzUiKwotICAgICJcMVwwXDFcMjM1XDNcMFwyXDIzNVwyXDBcM1wyMzVcMVwwXDFcMjM1IisKLSAgICAiXDdcMFwxXHUwMTFiXDJcMjM1XDFcdTAxMWJcMlwyMzVcMVx1MDExYlwyXDIzNVwxXDAiKwotICAgICJcNFwyMzVcMVwwXDFcdTAxMWJcMVwyMzVcMVwwXDFcMjM1XDFcMFwxXHUwMTFiIisKLSAgICAiXDJcMjM1XDZcMFwxXHUwMTFjXDVcMFwxXHUwMTFjXDNcMFwxXDM2N1w1XDAiKwotICAgICJcMVx1MDExY1w1XDBcMVx1MDExY1w3XDBcMlx1MDExY1wxXDBcMlx1MDExY1wxXDAiKwotICAgICJcMlx1MDExY1w3XDBcMlx1MDExY1wzXDBcMlx1MDExY1w3XDBcMVx1MDExZFw1XDAiKwotICAgICJcMVx1MDExZFwxMVwwXDFcdTAxMWRcNVwwXDFcdTAxMWRcN1wwXDJcdTAxMWRcMVwwIisKLSAgICAiXDJcdTAxMWRcMVwwXDJcdTAxMWRcN1wwXDJcdTAxMWRcM1wwXDJcdTAxMWRcN1wwIisKLSAgICAiXDJcdTAxMWVcMVx1MDExZlwxXHUwMTIwXDFcdTAxMjFcMVx1MDEyMFwxXHUwMTFlXDFcdTAxMjJcMVx1MDEyMCIrCi0gICAgIlwxXHUwMTIzXDRcdTAxMWVcMlx1MDEyMFw1XHUwMTFlXDFcMFw0NFx1MDExZVw1NFwwXDFcdTAxMjQiKwotICAgICJcMTdcMFwxXHUwMTI1XDFcMjVcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXHUwMTI1IisKLSAgICAiXDFcMFwxXDI1XDFcMFwxXDI1XDNcMFwyXDI1XDJcMFwzXDI1IisKLSAgICAiXDFcMFwxXDI1XDdcMFwxXHUwMTI1XDJcMjVcMVx1MDEyNVwyXDI1XDFcdTAxMjUiKwotICAgICJcMlwyNVwxXDBcNFwyNVwxXDBcMVx1MDEyNVwxXDI1XDFcMFwxXDI1IisKLSAgICAiXDFcMFwxXHUwMTI1XDJcMjVcNlwwXDFcdTAxMjZcMVwxMzRcMVwxMzVcMVwxMzQiKwotICAgICJcMVwwXDFcMTM0XDFcdTAxMjZcMVwwXDFcMTM0XDFcMFwxXDEzNFwzXDAiKwotICAgICJcMlwxMzRcMlwwXDNcMTM0XDFcMFwxXDEzNFw3XDBcMVx1MDEyNlwyXDEzNCIrCi0gICAgIlwxXHUwMTI2XDJcMTM0XDFcdTAxMjZcMlwxMzRcMVwwXDRcMTM0XDFcMFwxXHUwMTI2IisKLSAgICAiXDFcMTM0XDFcMFwxXDEzNFwxXDBcMVx1MDEyNlwyXDEzNFw2XDBcMVx1MDEyNyIrCi0gICAgIlwxXDEzNlwxXDEzN1wxXDEzNlwxXDBcMVwxMzZcMVx1MDEyN1wxXDBcMVwxMzYiKwotICAgICJcMVwwXDFcMTM2XDNcMFwyXDEzNlwyXDBcM1wxMzZcMVwwXDFcMTM2IisKLSAgICAiXDdcMFwxXHUwMTI3XDJcMTM2XDFcdTAxMjdcMlwxMzZcMVx1MDEyN1wyXDEzNlwxXDAiKwotICAgICJcNFwxMzZcMVwwXDFcdTAxMjdcMVwxMzZcMVwwXDFcMTM2XDFcMFwxXHUwMTI3IisKLSAgICAiXDJcMTM2XDUxXDBcMVx1MDEyOFw1MlwwXDFcdTAxMjlcMTEwXDBcMlx1MDEyYVw0MlwwIisKLSAgICAiXDFcdTAxMmJcNjNcMFwxXHUwMTAyXDFcMFwxXHUwMTAyXDJcMFwxXHUwMTAyXDFcdTAxMDMiKwotICAgICJcNFwwXDJcdTAxMDJcNTNcMFwxXHUwMTJjXDFcMzQxXDFcMzQyXDFcMzQxXDFcMCIrCi0gICAgIlwxXDM0MVwxXHUwMTJjXDFcMFwxXDM0MVwxXHUwMTAzXDFcMzQxXDNcMFwyXDM0MSIrCi0gICAgIlwyXDBcM1wzNDFcMVwwXDFcMzQxXDdcMFwxXHUwMTJjXDJcMzQxXDFcdTAxMmMiKwotICAgICJcMlwzNDFcMVx1MDEyY1wyXDM0MVwxXDBcNFwzNDFcMVwwXDFcdTAxMmNcMVwzNDEiKwotICAgICJcMVwwXDFcMzQxXDFcMFwxXHUwMTJjXDJcMzQxXDZcMFwxXHUwMTJkXDFcMTQ3IisKLSAgICAiXDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTJkXDFcMFwxXDE0N1wxXDAiKwotICAgICJcMVwxNDdcM1wwXDJcMTQ3XDJcMFwzXDE0N1wxXDI2MFwxXDE0N1w3XDAiKwotICAgICJcMVx1MDEyZFwyXDE0N1wxXHUwMTJkXDJcMTQ3XDFcdTAxMmRcMlwxNDdcMVwwXDRcMTQ3IisKLSAgICAiXDFcMFwxXHUwMTJkXDFcMTQ3XDFcMFwxXDE0N1wxXDBcMVx1MDEyZFwyXDE0NyIrCi0gICAgIlw2XDBcMVx1MDEyZVwxXDE1MVwxXDE1MlwxXDE1MVwxXDE1M1wxXDE1MVwxXHUwMTJlIisKLSAgICAiXDI3XDE1MVwxXHUwMTJlXDJcMTUxXDFcdTAxMmVcMlwxNTFcMVx1MDEyZVwxMFwxNTFcMVx1MDEyZSIrCi0gICAgIlw0XDE1MVwxXHUwMTJlXDdcMTUxXDFcMFwxXHUwMTJmXDFcMTU0XDFcMTU1XDNcMTU0IisKLSAgICAiXDFcdTAxMmZcMVwxNTNcMjZcMTU0XDFcdTAxMmZcMlwxNTRcMVx1MDEyZlwyXDE1NFwxXHUwMTJmIisKLSAgICAiXDEwXDE1NFwxXHUwMTJmXDRcMTU0XDFcdTAxMmZcN1wxNTRcMVwwXDFcdTAxMzBcMVwxNTciKwotICAgICJcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDEzMFwyN1wxNTdcMVx1MDEzMFwyXDE1NyIrCi0gICAgIlwxXHUwMTMwXDJcMTU3XDFcdTAxMzBcMTBcMTU3XDFcdTAxMzBcNFwxNTdcMVx1MDEzMFw3XDE1NyIrCi0gICAgIlwxXDBcMVx1MDEzMVwxXDE2MlwxXDE2M1wzXDE2MlwxXHUwMTMxXDFcMTYxXDI2XDE2MiIrCi0gICAgIlwxXHUwMTMxXDJcMTYyXDFcdTAxMzFcMlwxNjJcMVx1MDEzMVwxMFwxNjJcMVx1MDEzMVw0XDE2MiIrCi0gICAgIlwxXHUwMTMxXDdcMTYyXDFcMFwyXHUwMTBhXDFcdTAxMGJcMVx1MDEzMlwxXDBcMlx1MDEwYSIrCi0gICAgIlwxXDBcMVx1MDEzMlwxXHUwMTBlXDRcdTAxMGFcMlx1MDEzMlw1XHUwMTBhXDFcMFw0NFx1MDEwYSIrCi0gICAgIlwxXDBcMVx1MDEzM1wxXHUwMTBhXDFcdTAxMGJcMVx1MDEzMlwyXHUwMTBhXDFcdTAxMzNcMVx1MDEwYSIrCi0gICAgIlwxXHUwMTMyXDFcdTAxMzRcNFx1MDEwYVwyXHUwMTMyXDE2XHUwMTBhXDFcdTAxMzNcMlx1MDEwYVwxXHUwMTMzIisKLSAgICAiXDJcdTAxMGFcMVx1MDEzM1wxMFx1MDEwYVwxXHUwMTMzXDRcdTAxMGFcMVx1MDEzM1w3XHUwMTBhXDFcMCIrCi0gICAgIlwyXHUwMTBjXDFcdTAxMzVcMVwwXDFcdTAxMzJcMTFcdTAxMGNcMlwwXDUyXHUwMTBjXDFcMCIrCi0gICAgIlwyXHUwMTBkXDFcdTAxMzZcMVwwXDNcdTAxMGRcMVx1MDEzMlw2XHUwMTBkXDJcMFw1Mlx1MDEwZCIrCi0gICAgIlwxXDBcMVx1MDEzN1wxXDUxXDFcMTY1XDFcNTFcMVwwXDFcNTFcMVx1MDEzNyIrCi0gICAgIlwxXDBcMVw1MVwxXDBcMVw1MVwzXDBcMlw1MVwyXDBcM1w1MSIrCi0gICAgIlwxXDBcMVw1MVw3XDBcMVx1MDEzN1wyXDUxXDFcdTAxMzdcMlw1MVwxXHUwMTM3IisKLSAgICAiXDJcNTFcMVwwXDRcNTFcMVwwXDFcdTAxMzdcMVw1MVwxXDBcMVw1MSIrCi0gICAgIlwxXDBcMVx1MDEzN1wyXDUxXDZcMFwxXHUwMTM4XDFcNTVcMVwxNzBcMVw1NSIrCi0gICAgIlwxXDBcMVw1NVwxXHUwMTM4XDFcMFwxXDU1XDFcMFwxXDU1XDNcMCIrCi0gICAgIlwyXDU1XDJcMFwzXDU1XDFcMFwxXDU1XDdcMFwxXHUwMTM4XDJcNTUiKwotICAgICJcMVx1MDEzOFwyXDU1XDFcdTAxMzhcMlw1NVwxXDBcNFw1NVwxXDBcMVx1MDEzOCIrCi0gICAgIlwxXDU1XDFcMFwxXDU1XDFcMFwxXHUwMTM4XDJcNTVcNlwwXDFcdTAxMzkiKwotICAgICJcMVw2MlwxXDE3M1wxXDYyXDFcMFwxXDYyXDFcdTAxMzlcMVwwXDFcNjIiKwotICAgICJcMVwwXDFcNjJcM1wwXDJcNjJcMlwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcN1wwXDFcdTAxMzlcMlw2MlwxXHUwMTM5XDJcNjJcMVx1MDEzOVwyXDYyXDFcMCIrCi0gICAgIlw0XDYyXDFcMFwxXHUwMTM5XDFcNjJcMVwwXDFcNjJcMVwwXDFcdTAxMzkiKwotICAgICJcMlw2Mlw2XDBcMVx1MDEzYVwxXDcyXDFcMjAwXDFcNzJcMVwwXDFcNzIiKwotICAgICJcMVx1MDEzYVwxXDBcMVw3MlwxXDBcMVw3MlwzXDBcMlw3MlwyXDAiKwotICAgICJcM1w3MlwxXDBcMVw3Mlw3XDBcMVx1MDEzYVwyXDcyXDFcdTAxM2FcMlw3MiIrCi0gICAgIlwxXHUwMTNhXDJcNzJcMVwwXDRcNzJcMVwwXDFcdTAxM2FcMVw3MlwxXDAiKwotICAgICJcMVw3MlwxXDBcMVx1MDEzYVwyXDcyXDZcMFwxXHUwMTNiXDFcMTAwXDFcMjAzIisKLSAgICAiXDFcMTAwXDFcMFwxXDEwMFwxXHUwMTNiXDFcMFwxXDEwMFwxXDBcMVwxMDAiKwotICAgICJcM1wwXDJcMTAwXDJcMFwzXDEwMFwxXDBcMVwxMDBcN1wwXDFcdTAxM2IiKwotICAgICJcMlwxMDBcMVx1MDEzYlwyXDEwMFwxXHUwMTNiXDJcMTAwXDFcMFw0XDEwMFwxXDAiKwotICAgICJcMVx1MDEzYlwxXDEwMFwxXDBcMVwxMDBcMVwwXDFcdTAxM2JcMlwxMDBcNlwwIisKLSAgICAiXDFcdTAxM2NcMVwyMDVcMVwyMDZcMVwyMDVcMVwyMDdcMVwyMDVcMVx1MDEzY1wyN1wyMDUiKwotICAgICJcMVx1MDEzY1wyXDIwNVwxXHUwMTNjXDJcMjA1XDFcdTAxM2NcMTBcMjA1XDFcdTAxM2NcNFwyMDUiKwotICAgICJcMVx1MDEzY1w3XDIwNVwxXDBcMVx1MDEzZFwxXDIxMFwxXDIxMVwzXDIxMFwxXHUwMTNkIisKLSAgICAiXDFcMjA3XDI2XDIxMFwxXHUwMTNkXDJcMjEwXDFcdTAxM2RcMlwyMTBcMVx1MDEzZFwxMFwyMTAiKwotICAgICJcMVx1MDEzZFw0XDIxMFwxXHUwMTNkXDdcMjEwXDFcMFwxXHUwMTNlXDFcMTA1XDFcMjEzIisKLSAgICAiXDFcMTA1XDFcMFwxXDEwNVwxXHUwMTNlXDFcMFwxXDEwNVwxXDBcMVwxMDUiKwotICAgICJcM1wwXDJcMTA1XDJcMFwzXDEwNVwxXDBcMVwxMDVcN1wwXDFcdTAxM2UiKwotICAgICJcMlwxMDVcMVx1MDEzZVwyXDEwNVwxXHUwMTNlXDJcMTA1XDFcMFw0XDEwNVwxXDAiKwotICAgICJcMVx1MDEzZVwxXDEwNVwxXDBcMVwxMDVcMVwwXDFcdTAxM2VcMlwxMDVcNlwwIisKLSAgICAiXDFcdTAxM2ZcMVwyMTZcMVwyMTdcMVwyMTZcMVwwXDFcMjE2XDFcdTAxM2ZcMVwwIisKLSAgICAiXDFcMjE2XDFcMFwxXDIxNlwzXDBcMlwyMTZcMlwwXDNcMjE2XDFcMCIrCi0gICAgIlwxXDIxNlw3XDBcMVx1MDEzZlwyXDIxNlwxXHUwMTNmXDJcMjE2XDFcdTAxM2ZcMlwyMTYiKwotICAgICJcMVwwXDRcMjE2XDFcMFwxXHUwMTNmXDFcMjE2XDFcMFwxXDIxNlwxXDAiKwotICAgICJcMVx1MDEzZlwyXDIxNlw2XDBcMVx1MDE0MFwxXDExM1wxXDIyMlwxXDExM1wxXDAiKwotICAgICJcMVwxMTNcMVx1MDE0MFwxXDBcMVwxMTNcMVwwXDFcMTEzXDNcMFwyXDExMyIrCi0gICAgIlwyXDBcM1wxMTNcMVwyMjNcMVwxMTNcN1wwXDFcdTAxNDBcMlwxMTNcMVx1MDE0MCIrCi0gICAgIlwyXDExM1wxXHUwMTQwXDJcMTEzXDFcMFw0XDExM1wxXDBcMVx1MDE0MFwxXDExMyIrCi0gICAgIlwxXDBcMVwxMTNcMVwwXDFcdTAxNDBcMlwxMTNcNlwwXDFcdTAxNDFcMVwyMjUiKwotICAgICJcMVwyMjZcMVwyMjVcMVwyMjdcMVwyMjVcMVx1MDE0MVwyN1wyMjVcMVx1MDE0MVwyXDIyNSIrCi0gICAgIlwxXHUwMTQxXDJcMjI1XDFcdTAxNDFcMTBcMjI1XDFcdTAxNDFcNFwyMjVcMVx1MDE0MVw3XDIyNSIrCi0gICAgIlwxXDBcMVx1MDE0MlwxXDIzMFwxXDIzMVwzXDIzMFwxXHUwMTQyXDFcMjI3XDI2XDIzMCIrCi0gICAgIlwxXHUwMTQyXDJcMjMwXDFcdTAxNDJcMlwyMzBcMVx1MDE0MlwxMFwyMzBcMVx1MDE0Mlw0XDIzMCIrCi0gICAgIlwxXHUwMTQyXDdcMjMwXDFcMFwxXHUwMTQzXDFcMjM1XDFcMjM2XDFcMjM1XDFcMCIrCi0gICAgIlwxXDIzNVwxXHUwMTQzXDFcMFwxXDIzNVwxXDBcMVwyMzVcM1wwXDJcMjM1IisKLSAgICAiXDJcMFwzXDIzNVwxXDBcMVwyMzVcN1wwXDFcdTAxNDNcMlwyMzVcMVx1MDE0MyIrCi0gICAgIlwyXDIzNVwxXHUwMTQzXDJcMjM1XDFcMFw0XDIzNVwxXDBcMVx1MDE0M1wxXDIzNSIrCi0gICAgIlwxXDBcMVwyMzVcMVwwXDFcdTAxNDNcMlwyMzVcNlwwXDFcdTAxNDRcNVwwIisKLSAgICAiXDFcdTAxNDRcM1wwXDFcMzY3XDVcMFwxXHUwMTQ0XDVcMFwxXHUwMTQ0XDdcMCIrCi0gICAgIlwyXHUwMTQ0XDFcMFwyXHUwMTQ0XDFcMFwyXHUwMTQ0XDdcMFwyXHUwMTQ0XDNcMCIrCi0gICAgIlwyXHUwMTQ0XDdcMFwxXHUwMTQ1XDVcMFwxXHUwMTQ1XDExXDBcMVx1MDE0NVw1XDAiKwotICAgICJcMVx1MDE0NVw3XDBcMlx1MDE0NVwxXDBcMlx1MDE0NVwxXDBcMlx1MDE0NVw3XDAiKwotICAgICJcMlx1MDE0NVwzXDBcMlx1MDE0NVw3XDBcMlx1MDExZVwxXHUwMTFmXDFcdTAxNDZcMVwwIisKLSAgICAiXDJcdTAxMWVcMVwwXDFcdTAxNDZcMVx1MDEyM1w0XHUwMTFlXDJcdTAxNDZcNVx1MDExZVwxXDAiKwotICAgICJcNDRcdTAxMWVcMVwwXDFcdTAxNDdcMVx1MDExZVwxXHUwMTFmXDFcdTAxNDZcMlx1MDExZVwxXHUwMTQ3IisKLSAgICAiXDFcdTAxMWVcMVx1MDE0NlwxXHUwMTQ4XDRcdTAxMWVcMlx1MDE0NlwxNlx1MDExZVwxXHUwMTQ3XDJcdTAxMWUiKwotICAgICJcMVx1MDE0N1wyXHUwMTFlXDFcdTAxNDdcMTBcdTAxMWVcMVx1MDE0N1w0XHUwMTFlXDFcdTAxNDdcN1x1MDExZSIrCi0gICAgIlwxXDBcMlx1MDEyMVwxXHUwMTQ5XDFcMFwxXHUwMTQ2XDExXHUwMTIxXDJcMFw1Mlx1MDEyMSIrCi0gICAgIlwxXDBcMlx1MDEyMlwxXHUwMTRhXDFcMFwzXHUwMTIyXDFcdTAxNDZcNlx1MDEyMlwyXDAiKwotICAgICJcNTJcdTAxMjJcMjRcMFwxXHUwMTRiXDQ3XDBcMVx1MDE0Y1wxXDI1XDFcMTMxXDFcMjUiKwotICAgICJcMVwwXDFcMjVcMVx1MDE0Y1wxXDBcMVwyNVwxXDBcMVwyNVwzXDAiKwotICAgICJcMlwyNVwyXDBcM1wyNVwxXDBcMVwyNVw3XDBcMVx1MDE0Y1wyXDI1IisKLSAgICAiXDFcdTAxNGNcMlwyNVwxXHUwMTRjXDJcMjVcMVwwXDRcMjVcMVwwXDFcdTAxNGMiKwotICAgICJcMVwyNVwxXDBcMVwyNVwxXDBcMVx1MDE0Y1wyXDI1XDZcMFwxXHUwMTRkIisKLSAgICAiXDFcMTM0XDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXHUwMTRkXDFcMFwxXDEzNCIrCi0gICAgIlwxXDBcMVwxMzRcM1wwXDJcMTM0XDJcMFwzXDEzNFwxXDBcMVwxMzQiKwotICAgICJcN1wwXDFcdTAxNGRcMlwxMzRcMVx1MDE0ZFwyXDEzNFwxXHUwMTRkXDJcMTM0XDFcMCIrCi0gICAgIlw0XDEzNFwxXDBcMVx1MDE0ZFwxXDEzNFwxXDBcMVwxMzRcMVwwXDFcdTAxNGQiKwotICAgICJcMlwxMzRcNlwwXDFcdTAxNGVcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2IisKLSAgICAiXDFcdTAxNGVcMVwwXDFcMTM2XDFcMFwxXDEzNlwzXDBcMlwxMzZcMlwwIisKLSAgICAiXDNcMTM2XDFcMFwxXDEzNlw3XDBcMVx1MDE0ZVwyXDEzNlwxXHUwMTRlXDJcMTM2IisKLSAgICAiXDFcdTAxNGVcMlwxMzZcMVwwXDRcMTM2XDFcMFwxXHUwMTRlXDFcMTM2XDFcMCIrCi0gICAgIlwxXDEzNlwxXDBcMVx1MDE0ZVwyXDEzNlw1MlwwXDJcdTAxNGZcNzNcMFwxXHUwMTUwIisKLSAgICAiXDEwNlwwXDJcdTAxNTFcN1wwXDFcdTAxNTJcMVwzNDFcMVwzNDJcMVwzNDFcMVwwIisKLSAgICAiXDFcMzQxXDFcdTAxNTJcMVwwXDFcMzQxXDFcdTAxMDNcMVwzNDFcM1wwXDJcMzQxIisKLSAgICAiXDJcMFwzXDM0MVwxXDBcMVwzNDFcN1wwXDFcdTAxNTJcMlwzNDFcMVx1MDE1MiIrCi0gICAgIlwyXDM0MVwxXHUwMTUyXDJcMzQxXDFcMFw0XDM0MVwxXDBcMVx1MDE1MlwxXDM0MSIrCi0gICAgIlwxXDBcMVwzNDFcMVwwXDFcdTAxNTJcMlwzNDFcNlwwXDFcdTAxNTNcMVwxNDciKwotICAgICJcMVwxNTBcMVwxNDdcMVwwXDFcMTQ3XDFcdTAxNTNcMVwwXDFcMTQ3XDFcMCIrCi0gICAgIlwxXDE0N1wzXDBcMlwxNDdcMlwwXDNcMTQ3XDFcMjYwXDFcMTQ3XDdcMCIrCi0gICAgIlwxXHUwMTUzXDJcMTQ3XDFcdTAxNTNcMlwxNDdcMVx1MDE1M1wyXDE0N1wxXDBcNFwxNDciKwotICAgICJcMVwwXDFcdTAxNTNcMVwxNDdcMVwwXDFcMTQ3XDFcMFwxXHUwMTUzXDJcMTQ3IisKLSAgICAiXDZcMFwxXHUwMTU0XDFcMTUxXDFcMTUyXDFcMTUxXDFcMTUzXDFcMTUxXDFcdTAxNTQiKwotICAgICJcMjdcMTUxXDFcdTAxNTRcMlwxNTFcMVx1MDE1NFwyXDE1MVwxXHUwMTU0XDEwXDE1MVwxXHUwMTU0IisKLSAgICAiXDRcMTUxXDFcdTAxNTRcN1wxNTFcMVwwXDFcdTAxNTVcMVwxNTRcMVwxNTVcM1wxNTQiKwotICAgICJcMVx1MDE1NVwxXDE1M1wyNlwxNTRcMVx1MDE1NVwyXDE1NFwxXHUwMTU1XDJcMTU0XDFcdTAxNTUiKwotICAgICJcMTBcMTU0XDFcdTAxNTVcNFwxNTRcMVx1MDE1NVw3XDE1NFwxXDBcMVx1MDE1NlwxXDE1NyIrCi0gICAgIlwxXDE2MFwxXDE1N1wxXDE2MVwxXDE1N1wxXHUwMTU2XDI3XDE1N1wxXHUwMTU2XDJcMTU3IisKLSAgICAiXDFcdTAxNTZcMlwxNTdcMVx1MDE1NlwxMFwxNTdcMVx1MDE1Nlw0XDE1N1wxXHUwMTU2XDdcMTU3IisKLSAgICAiXDFcMFwxXHUwMTU3XDFcMTYyXDFcMTYzXDNcMTYyXDFcdTAxNTdcMVwxNjFcMjZcMTYyIisKLSAgICAiXDFcdTAxNTdcMlwxNjJcMVx1MDE1N1wyXDE2MlwxXHUwMTU3XDEwXDE2MlwxXHUwMTU3XDRcMTYyIisKLSAgICAiXDFcdTAxNTdcN1wxNjJcNFwwXDFcdTAxMzJcMVwwXDFcdTAxMzJcMlwwXDFcdTAxMzIiKwotICAgICJcMVx1MDEwZVw0XDBcMlx1MDEzMlw1M1wwXDFcdTAxNThcMVx1MDEwYVwxXHUwMTBiXDFcdTAxMGEiKwotICAgICJcMVwwXDFcdTAxMGFcMVx1MDE1OFwxXDBcMVx1MDEwYVwxXHUwMTBlXDEzXHUwMTBhXDFcMCIrCi0gICAgIlwxMFx1MDEwYVwxXHUwMTU4XDJcdTAxMGFcMVx1MDE1OFwyXHUwMTBhXDFcdTAxNThcMTBcdTAxMGFcMVx1MDE1OCIrCi0gICAgIlw0XHUwMTBhXDFcdTAxNThcN1x1MDEwYVwxXDBcMVx1MDE1OVwxXHUwMTBjXDFcdTAxMzVcMVx1MDEwYyIrCi0gICAgIlwxXHUwMTVhXDFcdTAxMGNcMVx1MDE1OVwxMFx1MDEwY1wxXHUwMTViXDE2XHUwMTBjXDFcdTAxNTlcMlx1MDEwYyIrCi0gICAgIlwxXHUwMTU5XDJcdTAxMGNcMVx1MDE1OVwxMFx1MDEwY1wxXHUwMTU5XDRcdTAxMGNcMVx1MDE1OVw3XHUwMTBjIisKLSAgICAiXDFcMFwxXHUwMTVjXDFcdTAxMGRcMVx1MDEzNlwzXHUwMTBkXDFcdTAxNWNcMVx1MDE1ZFw3XHUwMTBkIisKLSAgICAiXDFcdTAxNWVcMTZcdTAxMGRcMVx1MDE1Y1wyXHUwMTBkXDFcdTAxNWNcMlx1MDEwZFwxXHUwMTVjXDEwXHUwMTBkIisKLSAgICAiXDFcdTAxNWNcNFx1MDEwZFwxXHUwMTVjXDdcdTAxMGRcMVwwXDFcdTAxNWZcMVw1MVwxXDE2NSIrCi0gICAgIlwxXDUxXDFcMFwxXDUxXDFcdTAxNWZcMVwwXDFcNTFcMVwwXDFcNTEiKwotICAgICJcM1wwXDJcNTFcMlwwXDNcNTFcMVwwXDFcNTFcN1wwXDFcdTAxNWYiKwotICAgICJcMlw1MVwxXHUwMTVmXDJcNTFcMVx1MDE1ZlwyXDUxXDFcMFw0XDUxXDFcMCIrCi0gICAgIlwxXHUwMTVmXDFcNTFcMVwwXDFcNTFcMVwwXDFcdTAxNWZcMlw1MVw2XDAiKwotICAgICJcMVx1MDE2MFwxXDU1XDFcMTcwXDFcNTVcMVwwXDFcNTVcMVx1MDE2MFwxXDAiKwotICAgICJcMVw1NVwxXDBcMVw1NVwzXDBcMlw1NVwyXDBcM1w1NVwxXDAiKwotICAgICJcMVw1NVw3XDBcMVx1MDE2MFwyXDU1XDFcdTAxNjBcMlw1NVwxXHUwMTYwXDJcNTUiKwotICAgICJcMVwwXDRcNTVcMVwwXDFcdTAxNjBcMVw1NVwxXDBcMVw1NVwxXDAiKwotICAgICJcMVx1MDE2MFwyXDU1XDZcMFwxXHUwMTYxXDFcNjJcMVwxNzNcMVw2MlwxXDAiKwotICAgICJcMVw2MlwxXHUwMTYxXDFcMFwxXDYyXDFcMFwxXDYyXDNcMFwyXDYyIisKLSAgICAiXDJcMFwzXDYyXDFcMFwxXDYyXDdcMFwxXHUwMTYxXDJcNjJcMVx1MDE2MSIrCi0gICAgIlwyXDYyXDFcdTAxNjFcMlw2MlwxXDBcNFw2MlwxXDBcMVx1MDE2MVwxXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwxXHUwMTYxXDJcNjJcNlwwXDFcdTAxNjJcMVw3MiIrCi0gICAgIlwxXDIwMFwxXDcyXDFcMFwxXDcyXDFcdTAxNjJcMVwwXDFcNzJcMVwwIisKLSAgICAiXDFcNzJcM1wwXDJcNzJcMlwwXDNcNzJcMVwwXDFcNzJcN1wwIisKLSAgICAiXDFcdTAxNjJcMlw3MlwxXHUwMTYyXDJcNzJcMVx1MDE2MlwyXDcyXDFcMFw0XDcyIisKLSAgICAiXDFcMFwxXHUwMTYyXDFcNzJcMVwwXDFcNzJcMVwwXDFcdTAxNjJcMlw3MiIrCi0gICAgIlw2XDBcMVx1MDE2M1wxXDEwMFwxXDIwM1wxXDEwMFwxXDBcMVwxMDBcMVx1MDE2MyIrCi0gICAgIlwxXDBcMVwxMDBcMVwwXDFcMTAwXDNcMFwyXDEwMFwyXDBcM1wxMDAiKwotICAgICJcMVwwXDFcMTAwXDdcMFwxXHUwMTYzXDJcMTAwXDFcdTAxNjNcMlwxMDBcMVx1MDE2MyIrCi0gICAgIlwyXDEwMFwxXDBcNFwxMDBcMVwwXDFcdTAxNjNcMVwxMDBcMVwwXDFcMTAwIisKLSAgICAiXDFcMFwxXHUwMTYzXDJcMTAwXDZcMFwxXHUwMTY0XDFcMjA1XDFcMjA2XDFcMjA1IisKLSAgICAiXDFcMjA3XDFcMjA1XDFcdTAxNjRcMjdcMjA1XDFcdTAxNjRcMlwyMDVcMVx1MDE2NFwyXDIwNSIrCi0gICAgIlwxXHUwMTY0XDEwXDIwNVwxXHUwMTY0XDRcMjA1XDFcdTAxNjRcN1wyMDVcMVwwXDFcdTAxNjUiKwotICAgICJcMVwyMTBcMVwyMTFcM1wyMTBcMVx1MDE2NVwxXDIwN1wyNlwyMTBcMVx1MDE2NVwyXDIxMCIrCi0gICAgIlwxXHUwMTY1XDJcMjEwXDFcdTAxNjVcMTBcMjEwXDFcdTAxNjVcNFwyMTBcMVx1MDE2NVw3XDIxMCIrCi0gICAgIlwxXDBcMVx1MDE2NlwxXDEwNVwxXDIxM1wxXDEwNVwxXDBcMVwxMDVcMVx1MDE2NiIrCi0gICAgIlwxXDBcMVwxMDVcMVwwXDFcMTA1XDNcMFwyXDEwNVwyXDBcM1wxMDUiKwotICAgICJcMVwwXDFcMTA1XDdcMFwxXHUwMTY2XDJcMTA1XDFcdTAxNjZcMlwxMDVcMVx1MDE2NiIrCi0gICAgIlwyXDEwNVwxXDBcNFwxMDVcMVwwXDFcdTAxNjZcMVwxMDVcMVwwXDFcMTA1IisKLSAgICAiXDFcMFwxXHUwMTY2XDJcMTA1XDZcMFwxXHUwMTY3XDFcMjE2XDFcMjE3XDFcMjE2IisKLSAgICAiXDFcMFwxXDIxNlwxXHUwMTY3XDFcMFwxXDIxNlwxXDBcMVwyMTZcM1wwIisKLSAgICAiXDJcMjE2XDJcMFwzXDIxNlwxXDBcMVwyMTZcN1wwXDFcdTAxNjdcMlwyMTYiKwotICAgICJcMVx1MDE2N1wyXDIxNlwxXHUwMTY3XDJcMjE2XDFcMFw0XDIxNlwxXDBcMVx1MDE2NyIrCi0gICAgIlwxXDIxNlwxXDBcMVwyMTZcMVwwXDFcdTAxNjdcMlwyMTZcNlwwXDFcdTAxNjgiKwotICAgICJcMVwxMTNcMVwyMjJcMVwxMTNcMVwwXDFcMTEzXDFcdTAxNjhcMVwwXDFcMTEzIisKLSAgICAiXDFcMFwxXDExM1wzXDBcMlwxMTNcMlwwXDNcMTEzXDFcMjIzXDFcMTEzIisKLSAgICAiXDdcMFwxXHUwMTY4XDJcMTEzXDFcdTAxNjhcMlwxMTNcMVx1MDE2OFwyXDExM1wxXDAiKwotICAgICJcNFwxMTNcMVwwXDFcdTAxNjhcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXHUwMTY4IisKLSAgICAiXDJcMTEzXDZcMFwxXHUwMTY5XDFcMjI1XDFcMjI2XDFcMjI1XDFcMjI3XDFcMjI1IisKLSAgICAiXDFcdTAxNjlcMjdcMjI1XDFcdTAxNjlcMlwyMjVcMVx1MDE2OVwyXDIyNVwxXHUwMTY5XDEwXDIyNSIrCi0gICAgIlwxXHUwMTY5XDRcMjI1XDFcdTAxNjlcN1wyMjVcMVwwXDFcdTAxNmFcMVwyMzBcMVwyMzEiKwotICAgICJcM1wyMzBcMVx1MDE2YVwxXDIyN1wyNlwyMzBcMVx1MDE2YVwyXDIzMFwxXHUwMTZhXDJcMjMwIisKLSAgICAiXDFcdTAxNmFcMTBcMjMwXDFcdTAxNmFcNFwyMzBcMVx1MDE2YVw3XDIzMFwxXDBcMVx1MDE2YiIrCi0gICAgIlwxXDIzNVwxXDIzNlwxXDIzNVwxXDBcMVwyMzVcMVx1MDE2YlwxXDBcMVwyMzUiKwotICAgICJcMVwwXDFcMjM1XDNcMFwyXDIzNVwyXDBcM1wyMzVcMVwwXDFcMjM1IisKLSAgICAiXDdcMFwxXHUwMTZiXDJcMjM1XDFcdTAxNmJcMlwyMzVcMVx1MDE2YlwyXDIzNVwxXDAiKwotICAgICJcNFwyMzVcMVwwXDFcdTAxNmJcMVwyMzVcMVwwXDFcMjM1XDFcMFwxXHUwMTZiIisKLSAgICAiXDJcMjM1XDZcMFwxXHUwMTZjXDVcMFwxXHUwMTZjXDNcMFwxXDM2N1w1XDAiKwotICAgICJcMVx1MDE2Y1w1XDBcMVx1MDE2Y1w3XDBcMlx1MDE2Y1wxXDBcMlx1MDE2Y1wxXDAiKwotICAgICJcMlx1MDE2Y1w3XDBcMlx1MDE2Y1wzXDBcMlx1MDE2Y1w3XDBcMVx1MDE2ZFw1XDAiKwotICAgICJcMVx1MDE2ZFwxMVwwXDFcdTAxNmRcNVwwXDFcdTAxNmRcN1wwXDJcdTAxNmRcMVwwIisKLSAgICAiXDJcdTAxNmRcMVwwXDJcdTAxNmRcN1wwXDJcdTAxNmRcM1wwXDJcdTAxNmRcMTJcMCIrCi0gICAgIlwxXHUwMTQ2XDFcMFwxXHUwMTQ2XDJcMFwxXHUwMTQ2XDFcdTAxMjNcNFwwXDJcdTAxNDYiKwotICAgICJcNTNcMFwxXHUwMTZlXDFcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMFwxXHUwMTFlXDFcdTAxNmUiKwotICAgICJcMVwwXDFcdTAxMWVcMVx1MDEyM1wxM1x1MDExZVwxXDBcMTBcdTAxMWVcMVx1MDE2ZVwyXHUwMTFlIisKLSAgICAiXDFcdTAxNmVcMlx1MDExZVwxXHUwMTZlXDEwXHUwMTFlXDFcdTAxNmVcNFx1MDExZVwxXHUwMTZlXDdcdTAxMWUiKwotICAgICJcMVwwXDFcdTAxNmZcMVx1MDEyMVwxXHUwMTQ5XDFcdTAxMjFcMVx1MDE3MFwxXHUwMTIxXDFcdTAxNmYiKwotICAgICJcMTBcdTAxMjFcMVx1MDE3MVwxNlx1MDEyMVwxXHUwMTZmXDJcdTAxMjFcMVx1MDE2ZlwyXHUwMTIxXDFcdTAxNmYiKwotICAgICJcMTBcdTAxMjFcMVx1MDE2Zlw0XHUwMTIxXDFcdTAxNmZcN1x1MDEyMVwxXDBcMVx1MDE3MlwxXHUwMTIyIisKLSAgICAiXDFcdTAxNGFcM1x1MDEyMlwxXHUwMTcyXDFcdTAxNzNcN1x1MDEyMlwxXHUwMTc0XDE2XHUwMTIyXDFcdTAxNzIiKwotICAgICJcMlx1MDEyMlwxXHUwMTcyXDJcdTAxMjJcMVx1MDE3MlwxMFx1MDEyMlwxXHUwMTcyXDRcdTAxMjJcMVx1MDE3MiIrCi0gICAgIlw3XHUwMTIyXDQ3XDBcMVx1MDE3NVwyNFwwXDJcMjVcMVwxMzFcMVwyNVwxXDAiKwotICAgICJcMlwyNVwxXDBcMVwyNVwxXDBcMVwyNVwzXDBcMlwyNVwyXDAiKwotICAgICJcM1wyNVwxXDBcMVwyNVw3XDBcMTFcMjVcMVwwXDRcMjVcMVwwIisKLSAgICAiXDJcMjVcMVwwXDFcMjVcMVwwXDNcMjVcNlwwXDFcdTAxNzZcMVwxMzQiKwotICAgICJcMVwxMzVcMVwxMzRcMVwwXDFcMTM0XDFcdTAxNzZcMVwwXDFcMTM0XDFcMCIrCi0gICAgIlwxXDEzNFwzXDBcMlwxMzRcMlwwXDNcMTM0XDFcMFwxXDEzNFw3XDAiKwotICAgICJcMVx1MDE3NlwyXDEzNFwxXHUwMTc2XDJcMTM0XDFcdTAxNzZcMlwxMzRcMVwwXDRcMTM0IisKLSAgICAiXDFcMFwxXHUwMTc2XDFcMTM0XDFcMFwxXDEzNFwxXDBcMVx1MDE3NlwyXDEzNCIrCi0gICAgIlw2XDBcMVx1MDE3N1wxXDEzNlwxXDEzN1wxXDEzNlwxXDBcMVwxMzZcMVx1MDE3NyIrCi0gICAgIlwxXDBcMVwxMzZcMVwwXDFcMTM2XDNcMFwyXDEzNlwyXDBcM1wxMzYiKwotICAgICJcMVwwXDFcMTM2XDdcMFwxXHUwMTc3XDJcMTM2XDFcdTAxNzdcMlwxMzZcMVx1MDE3NyIrCi0gICAgIlwyXDEzNlwxXDBcNFwxMzZcMVwwXDFcdTAxNzdcMVwxMzZcMVwwXDFcMTM2IisKLSAgICAiXDFcMFwxXHUwMTc3XDJcMTM2XDU0XDBcMVx1MDE3OFw2NVwwXDJcdTAxNzlcMzBcMCIrCi0gICAgIlwxXHUwMTdhXDFcMzQxXDFcMzQyXDFcMzQxXDFcMFwxXDM0MVwxXHUwMTdhXDFcMCIrCi0gICAgIlwxXDM0MVwxXHUwMTAzXDFcMzQxXDNcMFwyXDM0MVwyXDBcM1wzNDFcMVwwIisKLSAgICAiXDFcMzQxXDdcMFwxXHUwMTdhXDJcMzQxXDFcdTAxN2FcMlwzNDFcMVx1MDE3YVwyXDM0MSIrCi0gICAgIlwxXDBcNFwzNDFcMVwwXDFcdTAxN2FcMVwzNDFcMVwwXDFcMzQxXDFcMCIrCi0gICAgIlwxXHUwMTdhXDJcMzQxXDZcMFwxXHUwMTdiXDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMCIrCi0gICAgIlwxXDE0N1wxXHUwMTdiXDFcMFwxXDE0N1wxXDBcMVwxNDdcM1wwXDJcMTQ3IisKLSAgICAiXDJcMFwzXDE0N1wxXDI2MFwxXDE0N1w3XDBcMVx1MDE3YlwyXDE0N1wxXHUwMTdiIisKLSAgICAiXDJcMTQ3XDFcdTAxN2JcMlwxNDdcMVwwXDRcMTQ3XDFcMFwxXHUwMTdiXDFcMTQ3IisKLSAgICAiXDFcMFwxXDE0N1wxXDBcMVx1MDE3YlwyXDE0N1w2XDBcMVx1MDE3Y1wxXDE1MSIrCi0gICAgIlwxXDE1MlwxXDE1MVwxXDE1M1wxXDE1MVwxXHUwMTdjXDI3XDE1MVwxXHUwMTdjXDJcMTUxIisKLSAgICAiXDFcdTAxN2NcMlwxNTFcMVx1MDE3Y1wxMFwxNTFcMVx1MDE3Y1w0XDE1MVwxXHUwMTdjXDdcMTUxIisKLSAgICAiXDFcMFwxXHUwMTdkXDFcMTU0XDFcMTU1XDNcMTU0XDFcdTAxN2RcMVwxNTNcMjZcMTU0IisKLSAgICAiXDFcdTAxN2RcMlwxNTRcMVx1MDE3ZFwyXDE1NFwxXHUwMTdkXDEwXDE1NFwxXHUwMTdkXDRcMTU0IisKLSAgICAiXDFcdTAxN2RcN1wxNTRcMVwwXDFcdTAxN2VcMVwxNTdcMVwxNjBcMVwxNTdcMVwxNjEiKwotICAgICJcMVwxNTdcMVx1MDE3ZVwyN1wxNTdcMVx1MDE3ZVwyXDE1N1wxXHUwMTdlXDJcMTU3XDFcdTAxN2UiKwotICAgICJcMTBcMTU3XDFcdTAxN2VcNFwxNTdcMVx1MDE3ZVw3XDE1N1wxXDBcMVx1MDE3ZlwxXDE2MiIrCi0gICAgIlwxXDE2M1wzXDE2MlwxXHUwMTdmXDFcMTYxXDI2XDE2MlwxXHUwMTdmXDJcMTYyXDFcdTAxN2YiKwotICAgICJcMlwxNjJcMVx1MDE3ZlwxMFwxNjJcMVx1MDE3Zlw0XDE2MlwxXHUwMTdmXDdcMTYyXDFcMCIrCi0gICAgIlwxXHUwMTgwXDFcdTAxMGFcMVx1MDEwYlwxXHUwMTBhXDFcMFwxXHUwMTBhXDFcdTAxODBcMVwwIisKLSAgICAiXDFcdTAxMGFcMVx1MDEwZVwxM1x1MDEwYVwxXDBcMTBcdTAxMGFcMVx1MDE4MFwyXHUwMTBhXDFcdTAxODAiKwotICAgICJcMlx1MDEwYVwxXHUwMTgwXDEwXHUwMTBhXDFcdTAxODBcNFx1MDEwYVwxXHUwMTgwXDdcdTAxMGFcMVwwIisKLSAgICAiXDFcdTAxODFcMVx1MDEwY1wxXHUwMTM1XDFcdTAxMGNcMVx1MDEzMlwxXHUwMTBjXDFcdTAxODFcMjdcdTAxMGMiKwotICAgICJcMVx1MDE4MVwyXHUwMTBjXDFcdTAxODFcMlx1MDEwY1wxXHUwMTgxXDEwXHUwMTBjXDFcdTAxODFcNFx1MDEwYyIrCi0gICAgIlwxXHUwMTgxXDdcdTAxMGNcMVwwXDJcdTAxMGNcMVx1MDEzNVwyXHUwMTMyXDFcdTAxNWFcMlx1MDEwYyIrCi0gICAgIlwxXHUwMTVhXDFcdTAxODJcNFx1MDEwY1wyXHUwMTMyXDUyXHUwMTBjXDFcMFwyXHUwMTBjXDFcdTAxMzUiKwotICAgICJcMVwwXDFcdTAxMzJcMTJcdTAxMGNcMVwwXDUyXHUwMTBjXDFcMFwxXHUwMTgzXDFcdTAxMGQiKwotICAgICJcMVx1MDEzNlwzXHUwMTBkXDFcdTAxODNcMVx1MDEzMlwyNlx1MDEwZFwxXHUwMTgzXDJcdTAxMGRcMVx1MDE4MyIrCi0gICAgIlwyXHUwMTBkXDFcdTAxODNcMTBcdTAxMGRcMVx1MDE4M1w0XHUwMTBkXDFcdTAxODNcN1x1MDEwZFwxXDAiKwotICAgICJcMlx1MDEwZFwxXHUwMTM2XDFcdTAxMzJcMVx1MDEwZFwxXHUwMTVkXDFcdTAxMGRcMVx1MDEzMlwxXHUwMTVkIisKLSAgICAiXDFcdTAxODRcNFx1MDEwZFwyXHUwMTMyXDUyXHUwMTBkXDFcMFwyXHUwMTBkXDFcdTAxMzZcMVwwIisKLSAgICAiXDNcdTAxMGRcMVx1MDEzMlw3XHUwMTBkXDFcMFw1Mlx1MDEwZFwxXDBcMlw1MVwxXDE2NSIrCi0gICAgIlwxXDUxXDFcMFwyXDUxXDFcMFwxXDUxXDFcMFwxXDUxXDNcMCIrCi0gICAgIlwyXDUxXDJcMFwzXDUxXDFcMFwxXDUxXDdcMFwxMVw1MVwxXDAiKwotICAgICJcNFw1MVwxXDBcMlw1MVwxXDBcMVw1MVwxXDBcM1w1MVw2XDAiKwotICAgICJcMlw1NVwxXDE3MFwxXDU1XDFcMFwyXDU1XDFcMFwxXDU1XDFcMCIrCi0gICAgIlwxXDU1XDNcMFwyXDU1XDJcMFwzXDU1XDFcMFwxXDU1XDdcMCIrCi0gICAgIlwxMVw1NVwxXDBcNFw1NVwxXDBcMlw1NVwxXDBcMVw1NVwxXDAiKwotICAgICJcM1w1NVw2XDBcMlw2MlwxXDE3M1wxXDYyXDFcMFwyXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFwxXDYyXDNcMFwyXDYyXDJcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDdcMFwxMVw2MlwxXDBcNFw2MlwxXDBcMlw2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcM1w2Mlw2XDBcMlw3MlwxXDIwMFwxXDcyXDFcMCIrCi0gICAgIlwyXDcyXDFcMFwxXDcyXDFcMFwxXDcyXDNcMFwyXDcyXDJcMCIrCi0gICAgIlwzXDcyXDFcMFwxXDcyXDdcMFwxMVw3MlwxXDBcNFw3MlwxXDAiKwotICAgICJcMlw3MlwxXDBcMVw3MlwxXDBcM1w3Mlw2XDBcMlwxMDBcMVwyMDMiKwotICAgICJcMVwxMDBcMVwwXDJcMTAwXDFcMFwxXDEwMFwxXDBcMVwxMDBcM1wwIisKLSAgICAiXDJcMTAwXDJcMFwzXDEwMFwxXDBcMVwxMDBcN1wwXDExXDEwMFwxXDAiKwotICAgICJcNFwxMDBcMVwwXDJcMTAwXDFcMFwxXDEwMFwxXDBcM1wxMDBcNlwwIisKLSAgICAiXDFcdTAxODVcMVwyMDVcMVwyMDZcMVwyMDVcMVwyMDdcMVwyMDVcMVx1MDE4NVwyN1wyMDUiKwotICAgICJcMVx1MDE4NVwyXDIwNVwxXHUwMTg1XDJcMjA1XDFcdTAxODVcMTBcMjA1XDFcdTAxODVcNFwyMDUiKwotICAgICJcMVx1MDE4NVw3XDIwNVwxXDBcMVx1MDE4NlwxXDIxMFwxXDIxMVwzXDIxMFwxXHUwMTg2IisKLSAgICAiXDFcMjA3XDI2XDIxMFwxXHUwMTg2XDJcMjEwXDFcdTAxODZcMlwyMTBcMVx1MDE4NlwxMFwyMTAiKwotICAgICJcMVx1MDE4Nlw0XDIxMFwxXHUwMTg2XDdcMjEwXDFcMFwyXDEwNVwxXDIxM1wxXDEwNSIrCi0gICAgIlwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMFwxXDEwNVwzXDBcMlwxMDUiKwotICAgICJcMlwwXDNcMTA1XDFcMFwxXDEwNVw3XDBcMTFcMTA1XDFcMFw0XDEwNSIrCi0gICAgIlwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMFwzXDEwNVw2XDBcMVx1MDE4NyIrCi0gICAgIlwxXDIxNlwxXDIxN1wxXDIxNlwxXDBcMVwyMTZcMVx1MDE4N1wxXDBcMVwyMTYiKwotICAgICJcMVwwXDFcMjE2XDNcMFwyXDIxNlwyXDBcM1wyMTZcMVwwXDFcMjE2IisKLSAgICAiXDdcMFwxXHUwMTg3XDJcMjE2XDFcdTAxODdcMlwyMTZcMVx1MDE4N1wyXDIxNlwxXDAiKwotICAgICJcNFwyMTZcMVwwXDFcdTAxODdcMVwyMTZcMVwwXDFcMjE2XDFcMFwxXHUwMTg3IisKLSAgICAiXDJcMjE2XDZcMFwyXDExM1wxXDIyMlwxXDExM1wxXDBcMlwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDFcMFwxXDExM1wzXDBcMlwxMTNcMlwwXDNcMTEzXDFcMjIzIisKLSAgICAiXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMFwyXDExM1wxXDAiKwotICAgICJcMVwxMTNcMVwwXDNcMTEzXDZcMFwxXHUwMTg4XDFcMjI1XDFcMjI2XDFcMjI1IisKLSAgICAiXDFcMjI3XDFcMjI1XDFcdTAxODhcMjdcMjI1XDFcdTAxODhcMlwyMjVcMVx1MDE4OFwyXDIyNSIrCi0gICAgIlwxXHUwMTg4XDEwXDIyNVwxXHUwMTg4XDRcMjI1XDFcdTAxODhcN1wyMjVcMVwwXDFcdTAxODkiKwotICAgICJcMVwyMzBcMVwyMzFcM1wyMzBcMVx1MDE4OVwxXDIyN1wyNlwyMzBcMVx1MDE4OVwyXDIzMCIrCi0gICAgIlwxXHUwMTg5XDJcMjMwXDFcdTAxODlcMTBcMjMwXDFcdTAxODlcNFwyMzBcMVx1MDE4OVw3XDIzMCIrCi0gICAgIlwxXDBcMVx1MDE4YVwxXDIzNVwxXDIzNlwxXDIzNVwxXDBcMVwyMzVcMVx1MDE4YSIrCi0gICAgIlwxXDBcMVwyMzVcMVwwXDFcMjM1XDNcMFwyXDIzNVwyXDBcM1wyMzUiKwotICAgICJcMVwwXDFcMjM1XDdcMFwxXHUwMThhXDJcMjM1XDFcdTAxOGFcMlwyMzVcMVx1MDE4YSIrCi0gICAgIlwyXDIzNVwxXDBcNFwyMzVcMVwwXDFcdTAxOGFcMVwyMzVcMVwwXDFcMjM1IisKLSAgICAiXDFcMFwxXHUwMThhXDJcMjM1XDZcMFwxXHUwMThiXDVcMFwxXHUwMThiXDNcMCIrCi0gICAgIlwxXDM2N1w1XDBcMVx1MDE4Ylw1XDBcMVx1MDE4Ylw3XDBcMlx1MDE4YlwxXDAiKwotICAgICJcMlx1MDE4YlwxXDBcMlx1MDE4Ylw3XDBcMlx1MDE4YlwzXDBcMlx1MDE4Ylw3XDAiKwotICAgICJcMVx1MDE4Y1w1XDBcMVx1MDE4Y1wxMVwwXDFcdTAxOGNcNVwwXDFcdTAxOGNcN1wwIisKLSAgICAiXDJcdTAxOGNcMVwwXDJcdTAxOGNcMVwwXDJcdTAxOGNcN1wwXDJcdTAxOGNcM1wwIisKLSAgICAiXDJcdTAxOGNcN1wwXDFcdTAxOGRcMVx1MDExZVwxXHUwMTFmXDFcdTAxMWVcMVwwXDFcdTAxMWUiKwotICAgICJcMVx1MDE4ZFwxXDBcMVx1MDExZVwxXHUwMTIzXDEzXHUwMTFlXDFcMFwxMFx1MDExZVwxXHUwMThkIisKLSAgICAiXDJcdTAxMWVcMVx1MDE4ZFwyXHUwMTFlXDFcdTAxOGRcMTBcdTAxMWVcMVx1MDE4ZFw0XHUwMTFlXDFcdTAxOGQiKwotICAgICJcN1x1MDExZVwxXDBcMVx1MDE4ZVwxXHUwMTIxXDFcdTAxNDlcMVx1MDEyMVwxXHUwMTQ2XDFcdTAxMjEiKwotICAgICJcMVx1MDE4ZVwyN1x1MDEyMVwxXHUwMThlXDJcdTAxMjFcMVx1MDE4ZVwyXHUwMTIxXDFcdTAxOGVcMTBcdTAxMjEiKwotICAgICJcMVx1MDE4ZVw0XHUwMTIxXDFcdTAxOGVcN1x1MDEyMVwxXDBcMlx1MDEyMVwxXHUwMTQ5XDJcdTAxNDYiKwotICAgICJcMVx1MDE3MFwyXHUwMTIxXDFcdTAxNzBcMVx1MDE4Zlw0XHUwMTIxXDJcdTAxNDZcNTJcdTAxMjFcMVwwIisKLSAgICAiXDJcdTAxMjFcMVx1MDE0OVwxXDBcMVx1MDE0NlwxMlx1MDEyMVwxXDBcNTJcdTAxMjFcMVwwIisKLSAgICAiXDFcdTAxOTBcMVx1MDEyMlwxXHUwMTRhXDNcdTAxMjJcMVx1MDE5MFwxXHUwMTQ2XDI2XHUwMTIyXDFcdTAxOTAiKwotICAgICJcMlx1MDEyMlwxXHUwMTkwXDJcdTAxMjJcMVx1MDE5MFwxMFx1MDEyMlwxXHUwMTkwXDRcdTAxMjJcMVx1MDE5MCIrCi0gICAgIlw3XHUwMTIyXDFcMFwyXHUwMTIyXDFcdTAxNGFcMVx1MDE0NlwxXHUwMTIyXDFcdTAxNzNcMVx1MDEyMiIrCi0gICAgIlwxXHUwMTQ2XDFcdTAxNzNcMVx1MDE5MVw0XHUwMTIyXDJcdTAxNDZcNTJcdTAxMjJcMVwwXDJcdTAxMjIiKwotICAgICJcMVx1MDE0YVwxXDBcM1x1MDEyMlwxXHUwMTQ2XDdcdTAxMjJcMVwwXDUyXHUwMTIyXDQyXDAiKwotICAgICJcMlx1MDE5MlwzMFwwXDJcMTM0XDFcMTM1XDFcMTM0XDFcMFwyXDEzNFwxXDAiKwotICAgICJcMVwxMzRcMVwwXDFcMTM0XDNcMFwyXDEzNFwyXDBcM1wxMzRcMVwwIisKLSAgICAiXDFcMTM0XDdcMFwxMVwxMzRcMVwwXDRcMTM0XDFcMFwyXDEzNFwxXDAiKwotICAgICJcMVwxMzRcMVwwXDNcMTM0XDZcMFwyXDEzNlwxXDEzN1wxXDEzNlwxXDAiKwotICAgICJcMlwxMzZcMVwwXDFcMTM2XDFcMFwxXDEzNlwzXDBcMlwxMzZcMlwwIisKLSAgICAiXDNcMTM2XDFcMFwxXDEzNlw3XDBcMTFcMTM2XDFcMFw0XDEzNlwxXDAiKwotICAgICJcMlwxMzZcMVwwXDFcMTM2XDFcMFwzXDEzNlw0NFwwXDJcdTAxOTNcMzNcMCIrCi0gICAgIlwxXHUwMTk0XDFcMzQxXDFcMzQyXDFcMzQxXDFcMFwxXDM0MVwxXHUwMTk0XDFcMCIrCi0gICAgIlwxXDM0MVwxXHUwMTAzXDFcMzQxXDNcMFwyXDM0MVwyXDBcM1wzNDFcMVwwIisKLSAgICAiXDFcMzQxXDdcMFwxXHUwMTk0XDJcMzQxXDFcdTAxOTRcMlwzNDFcMVx1MDE5NFwyXDM0MSIrCi0gICAgIlwxXDBcNFwzNDFcMVwwXDFcdTAxOTRcMVwzNDFcMVwwXDFcMzQxXDFcMCIrCi0gICAgIlwxXHUwMTk0XDJcMzQxXDZcMFwyXDE0N1wxXDE1MFwxXDE0N1wxXDBcMlwxNDciKwotICAgICJcMVwwXDFcMTQ3XDFcMFwxXDE0N1wzXDBcMlwxNDdcMlwwXDNcMTQ3IisKLSAgICAiXDFcMjYwXDFcMTQ3XDdcMFwxMVwxNDdcMVwwXDRcMTQ3XDFcMFwyXDE0NyIrCi0gICAgIlwxXDBcMVwxNDdcMVwwXDNcMTQ3XDZcMFwyXDE1MVwxXDE1MlwxXDE1MSIrCi0gICAgIlwxXDE1M1w2NVwxNTFcMVwwXDJcMTU0XDFcMTU1XDRcMTU0XDFcMTUzXDYyXDE1NCIrCi0gICAgIlwxXDBcMlwxNTdcMVwxNjBcMVwxNTdcMVwxNjFcNjVcMTU3XDFcMFwyXDE2MiIrCi0gICAgIlwxXDE2M1w0XDE2MlwxXDE2MVw2MlwxNjJcMVwwXDFcdTAxOTVcMVx1MDEwYVwxXHUwMTBiIisKLSAgICAiXDFcdTAxMGFcMVwwXDFcdTAxMGFcMVx1MDE5NVwxXDBcMVx1MDEwYVwxXHUwMTBlXDEzXHUwMTBhIisKLSAgICAiXDFcMFwxMFx1MDEwYVwxXHUwMTk1XDJcdTAxMGFcMVx1MDE5NVwyXHUwMTBhXDFcdTAxOTVcMTBcdTAxMGEiKwotICAgICJcMVx1MDE5NVw0XHUwMTBhXDFcdTAxOTVcN1x1MDEwYVwxXDBcMVx1MDE5NlwxXHUwMTBjXDFcdTAxMzUiKwotICAgICJcMVx1MDEwY1wxXHUwMTMyXDFcdTAxMGNcMVx1MDE5NlwyN1x1MDEwY1wxXHUwMTk2XDJcdTAxMGNcMVx1MDE5NiIrCi0gICAgIlwyXHUwMTBjXDFcdTAxOTZcMTBcdTAxMGNcMVx1MDE5Nlw0XHUwMTBjXDFcdTAxOTZcN1x1MDEwY1wxXDAiKwotICAgICJcMVx1MDE5N1wxXHUwMTBkXDFcdTAxMzZcM1x1MDEwZFwxXHUwMTk3XDFcdTAxMzJcMjZcdTAxMGRcMVx1MDE5NyIrCi0gICAgIlwyXHUwMTBkXDFcdTAxOTdcMlx1MDEwZFwxXHUwMTk3XDEwXHUwMTBkXDFcdTAxOTdcNFx1MDEwZFwxXHUwMTk3IisKLSAgICAiXDdcdTAxMGRcMVwwXDJcMjA1XDFcMjA2XDFcMjA1XDFcMjA3XDY1XDIwNVwxXDAiKwotICAgICJcMlwyMTBcMVwyMTFcNFwyMTBcMVwyMDdcNjJcMjEwXDFcMFwyXDIxNlwxXDIxNyIrCi0gICAgIlwxXDIxNlwxXDBcMlwyMTZcMVwwXDFcMjE2XDFcMFwxXDIxNlwzXDAiKwotICAgICJcMlwyMTZcMlwwXDNcMjE2XDFcMFwxXDIxNlw3XDBcMTFcMjE2XDFcMCIrCi0gICAgIlw0XDIxNlwxXDBcMlwyMTZcMVwwXDFcMjE2XDFcMFwzXDIxNlw2XDAiKwotICAgICJcMlwyMjVcMVwyMjZcMVwyMjVcMVwyMjdcNjVcMjI1XDFcMFwyXDIzMFwxXDIzMSIrCi0gICAgIlw0XDIzMFwxXDIyN1w2MlwyMzBcMVwwXDJcMjM1XDFcMjM2XDFcMjM1XDFcMCIrCi0gICAgIlwyXDIzNVwxXDBcMVwyMzVcMVwwXDFcMjM1XDNcMFwyXDIzNVwyXDAiKwotICAgICJcM1wyMzVcMVwwXDFcMjM1XDdcMFwxMVwyMzVcMVwwXDRcMjM1XDFcMCIrCi0gICAgIlwyXDIzNVwxXDBcMVwyMzVcMVwwXDNcMjM1XDIwXDBcMVwzNjdcNjBcMCIrCi0gICAgIlwxXHUwMTk4XDVcMFwxXHUwMTk4XDExXDBcMVx1MDE5OFw1XDBcMVx1MDE5OFw3XDAiKwotICAgICJcMlx1MDE5OFwxXDBcMlx1MDE5OFwxXDBcMlx1MDE5OFw3XDBcMlx1MDE5OFwzXDAiKwotICAgICJcMlx1MDE5OFw3XDBcMVx1MDE5OVwxXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDBcMVx1MDExZSIrCi0gICAgIlwxXHUwMTk5XDFcMFwxXHUwMTFlXDFcdTAxMjNcMTNcdTAxMWVcMVwwXDEwXHUwMTFlXDFcdTAxOTkiKwotICAgICJcMlx1MDExZVwxXHUwMTk5XDJcdTAxMWVcMVx1MDE5OVwxMFx1MDExZVwxXHUwMTk5XDRcdTAxMWVcMVx1MDE5OSIrCi0gICAgIlw3XHUwMTFlXDFcMFwxXHUwMTlhXDFcdTAxMjFcMVx1MDE0OVwxXHUwMTIxXDFcdTAxNDZcMVx1MDEyMSIrCi0gICAgIlwxXHUwMTlhXDI3XHUwMTIxXDFcdTAxOWFcMlx1MDEyMVwxXHUwMTlhXDJcdTAxMjFcMVx1MDE5YVwxMFx1MDEyMSIrCi0gICAgIlwxXHUwMTlhXDRcdTAxMjFcMVx1MDE5YVw3XHUwMTIxXDFcMFwxXHUwMTliXDFcdTAxMjJcMVx1MDE0YSIrCi0gICAgIlwzXHUwMTIyXDFcdTAxOWJcMVx1MDE0NlwyNlx1MDEyMlwxXHUwMTliXDJcdTAxMjJcMVx1MDE5YlwyXHUwMTIyIisKLSAgICAiXDFcdTAxOWJcMTBcdTAxMjJcMVx1MDE5Ylw0XHUwMTIyXDFcdTAxOWJcN1x1MDEyMlw2NVwwXDFcdTAxOWMiKwotICAgICJcNTJcMFwyXHUwMTlkXDI1XDBcMVx1MDE5ZVwxXDM0MVwxXDM0MlwxXDM0MVwxXDAiKwotICAgICJcMVwzNDFcMVx1MDE5ZVwxXDBcMVwzNDFcMVx1MDEwM1wxXDM0MVwzXDBcMlwzNDEiKwotICAgICJcMlwwXDNcMzQxXDFcMFwxXDM0MVw3XDBcMVx1MDE5ZVwyXDM0MVwxXHUwMTllIisKLSAgICAiXDJcMzQxXDFcdTAxOWVcMlwzNDFcMVwwXDRcMzQxXDFcMFwxXHUwMTllXDFcMzQxIisKLSAgICAiXDFcMFwxXDM0MVwxXDBcMVx1MDE5ZVwyXDM0MVw2XDBcMVx1MDE5ZlwxXHUwMTBhIisKLSAgICAiXDFcdTAxMGJcMVx1MDEwYVwxXDBcMVx1MDEwYVwxXHUwMTlmXDFcMFwxXHUwMTBhXDFcdTAxMGUiKwotICAgICJcMTNcdTAxMGFcMVwwXDEwXHUwMTBhXDFcdTAxOWZcMlx1MDEwYVwxXHUwMTlmXDJcdTAxMGFcMVx1MDE5ZiIrCi0gICAgIlwxMFx1MDEwYVwxXHUwMTlmXDRcdTAxMGFcMVx1MDE5Zlw3XHUwMTBhXDFcMFwxXHUwMWEwXDFcdTAxMGMiKwotICAgICJcMVx1MDEzNVwxXHUwMTBjXDFcdTAxMzJcMVx1MDEwY1wxXHUwMWEwXDI3XHUwMTBjXDFcdTAxYTBcMlx1MDEwYyIrCi0gICAgIlwxXHUwMWEwXDJcdTAxMGNcMVx1MDFhMFwxMFx1MDEwY1wxXHUwMWEwXDRcdTAxMGNcMVx1MDFhMFw3XHUwMTBjIisKLSAgICAiXDFcMFwxXHUwMWExXDFcdTAxMGRcMVx1MDEzNlwzXHUwMTBkXDFcdTAxYTFcMVx1MDEzMlwyNlx1MDEwZCIrCi0gICAgIlwxXHUwMWExXDJcdTAxMGRcMVx1MDFhMVwyXHUwMTBkXDFcdTAxYTFcMTBcdTAxMGRcMVx1MDFhMVw0XHUwMTBkIisKLSAgICAiXDFcdTAxYTFcN1x1MDEwZFwxXDBcMVx1MDFhMlw1XDBcMVx1MDFhMlwxMVwwXDFcdTAxYTIiKwotICAgICJcNVwwXDFcdTAxYTJcN1wwXDJcdTAxYTJcMVwwXDJcdTAxYTJcMVwwXDJcdTAxYTIiKwotICAgICJcN1wwXDJcdTAxYTJcM1wwXDJcdTAxYTJcN1wwXDFcdTAxYTNcMVx1MDExZVwxXHUwMTFmIisKLSAgICAiXDFcdTAxMWVcMVwwXDFcdTAxMWVcMVx1MDFhM1wxXDBcMVx1MDExZVwxXHUwMTIzXDEzXHUwMTFlIisKLSAgICAiXDFcMFwxMFx1MDExZVwxXHUwMWEzXDJcdTAxMWVcMVx1MDFhM1wyXHUwMTFlXDFcdTAxYTNcMTBcdTAxMWUiKwotICAgICJcMVx1MDFhM1w0XHUwMTFlXDFcdTAxYTNcN1x1MDExZVwxXDBcMVx1MDFhNFwxXHUwMTIxXDFcdTAxNDkiKwotICAgICJcMVx1MDEyMVwxXHUwMTQ2XDFcdTAxMjFcMVx1MDFhNFwyN1x1MDEyMVwxXHUwMWE0XDJcdTAxMjFcMVx1MDFhNCIrCi0gICAgIlwyXHUwMTIxXDFcdTAxYTRcMTBcdTAxMjFcMVx1MDFhNFw0XHUwMTIxXDFcdTAxYTRcN1x1MDEyMVwxXDAiKwotICAgICJcMVx1MDFhNVwxXHUwMTIyXDFcdTAxNGFcM1x1MDEyMlwxXHUwMWE1XDFcdTAxNDZcMjZcdTAxMjJcMVx1MDFhNSIrCi0gICAgIlwyXHUwMTIyXDFcdTAxYTVcMlx1MDEyMlwxXHUwMWE1XDEwXHUwMTIyXDFcdTAxYTVcNFx1MDEyMlwxXHUwMWE1IisKLSAgICAiXDdcdTAxMjJcNDdcMFwxXHUwMWE2XDI0XDBcMlwzNDFcMVwzNDJcMVwzNDFcMVwwIisKLSAgICAiXDJcMzQxXDFcMFwxXDM0MVwxXHUwMTAzXDFcMzQxXDNcMFwyXDM0MVwyXDAiKwotICAgICJcM1wzNDFcMVwwXDFcMzQxXDdcMFwxMVwzNDFcMVwwXDRcMzQxXDFcMCIrCi0gICAgIlwyXDM0MVwxXDBcMVwzNDFcMVwwXDNcMzQxXDZcMFwxXHUwMWE3XDFcdTAxMGEiKwotICAgICJcMVx1MDEwYlwxXHUwMTBhXDFcMFwxXHUwMTBhXDFcdTAxYTdcMVwwXDFcdTAxMGFcMVx1MDEwZSIrCi0gICAgIlwxM1x1MDEwYVwxXDBcMTBcdTAxMGFcMVx1MDFhN1wyXHUwMTBhXDFcdTAxYTdcMlx1MDEwYVwxXHUwMWE3IisKLSAgICAiXDEwXHUwMTBhXDFcdTAxYTdcNFx1MDEwYVwxXHUwMWE3XDdcdTAxMGFcMVwwXDFcdTAxYThcMVx1MDEwYyIrCi0gICAgIlwxXHUwMTM1XDFcdTAxMGNcMVx1MDEzMlwxXHUwMTBjXDFcdTAxYThcMjdcdTAxMGNcMVx1MDFhOFwyXHUwMTBjIisKLSAgICAiXDFcdTAxYThcMlx1MDEwY1wxXHUwMWE4XDEwXHUwMTBjXDFcdTAxYThcNFx1MDEwY1wxXHUwMWE4XDdcdTAxMGMiKwotICAgICJcMVwwXDFcdTAxYTlcMVx1MDEwZFwxXHUwMTM2XDNcdTAxMGRcMVx1MDFhOVwxXHUwMTMyXDI2XHUwMTBkIisKLSAgICAiXDFcdTAxYTlcMlx1MDEwZFwxXHUwMWE5XDJcdTAxMGRcMVx1MDFhOVwxMFx1MDEwZFwxXHUwMWE5XDRcdTAxMGQiKwotICAgICJcMVx1MDFhOVw3XHUwMTBkXDFcMFwxXHUwMWFhXDFcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMCIrCi0gICAgIlwxXHUwMTFlXDFcdTAxYWFcMVwwXDFcdTAxMWVcMVx1MDEyM1wxM1x1MDExZVwxXDBcMTBcdTAxMWUiKwotICAgICJcMVx1MDFhYVwyXHUwMTFlXDFcdTAxYWFcMlx1MDExZVwxXHUwMWFhXDEwXHUwMTFlXDFcdTAxYWFcNFx1MDExZSIrCi0gICAgIlwxXHUwMWFhXDdcdTAxMWVcMVwwXDFcdTAxYWJcMVx1MDEyMVwxXHUwMTQ5XDFcdTAxMjFcMVx1MDE0NiIrCi0gICAgIlwxXHUwMTIxXDFcdTAxYWJcMjdcdTAxMjFcMVx1MDFhYlwyXHUwMTIxXDFcdTAxYWJcMlx1MDEyMVwxXHUwMWFiIisKLSAgICAiXDEwXHUwMTIxXDFcdTAxYWJcNFx1MDEyMVwxXHUwMWFiXDdcdTAxMjFcMVwwXDFcdTAxYWNcMVx1MDEyMiIrCi0gICAgIlwxXHUwMTRhXDNcdTAxMjJcMVx1MDFhY1wxXHUwMTQ2XDI2XHUwMTIyXDFcdTAxYWNcMlx1MDEyMlwxXHUwMWFjIisKLSAgICAiXDJcdTAxMjJcMVx1MDFhY1wxMFx1MDEyMlwxXHUwMWFjXDRcdTAxMjJcMVx1MDFhY1w3XHUwMTIyXDFcMCIrCi0gICAgIlwyXHUwMTBhXDFcdTAxMGJcMVx1MDEwYVwxXDBcMlx1MDEwYVwxXDBcMVx1MDEwYVwxXHUwMTBlIisKLSAgICAiXDEzXHUwMTBhXDFcMFw0NFx1MDEwYVwxXDBcMVx1MDFhZFwxXHUwMTBjXDFcdTAxMzVcMVx1MDEwYyIrCi0gICAgIlwxXHUwMTMyXDFcdTAxMGNcMVx1MDFhZFwyN1x1MDEwY1wxXHUwMWFkXDJcdTAxMGNcMVx1MDFhZFwyXHUwMTBjIisKLSAgICAiXDFcdTAxYWRcMTBcdTAxMGNcMVx1MDFhZFw0XHUwMTBjXDFcdTAxYWRcN1x1MDEwY1wxXDBcMVx1MDFhZSIrCi0gICAgIlwxXHUwMTBkXDFcdTAxMzZcM1x1MDEwZFwxXHUwMWFlXDFcdTAxMzJcMjZcdTAxMGRcMVx1MDFhZVwyXHUwMTBkIisKLSAgICAiXDFcdTAxYWVcMlx1MDEwZFwxXHUwMWFlXDEwXHUwMTBkXDFcdTAxYWVcNFx1MDEwZFwxXHUwMWFlXDdcdTAxMGQiKwotICAgICJcMVwwXDJcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMFwyXHUwMTFlXDFcMFwxXHUwMTFlIisKLSAgICAiXDFcdTAxMjNcMTNcdTAxMWVcMVwwXDQ0XHUwMTFlXDFcMFwxXHUwMWFmXDFcdTAxMjFcMVx1MDE0OSIrCi0gICAgIlwxXHUwMTIxXDFcdTAxNDZcMVx1MDEyMVwxXHUwMWFmXDI3XHUwMTIxXDFcdTAxYWZcMlx1MDEyMVwxXHUwMWFmIisKLSAgICAiXDJcdTAxMjFcMVx1MDFhZlwxMFx1MDEyMVwxXHUwMWFmXDRcdTAxMjFcMVx1MDFhZlw3XHUwMTIxXDFcMCIrCi0gICAgIlwxXHUwMWIwXDFcdTAxMjJcMVx1MDE0YVwzXHUwMTIyXDFcdTAxYjBcMVx1MDE0NlwyNlx1MDEyMlwxXHUwMWIwIisKLSAgICAiXDJcdTAxMjJcMVx1MDFiMFwyXHUwMTIyXDFcdTAxYjBcMTBcdTAxMjJcMVx1MDFiMFw0XHUwMTIyXDFcdTAxYjAiKwotICAgICJcN1x1MDEyMlwxXDBcMlx1MDEwY1wxXHUwMTM1XDFcdTAxMGNcMVx1MDEzMlw2NVx1MDEwY1wxXDAiKwotICAgICJcMlx1MDEwZFwxXHUwMTM2XDRcdTAxMGRcMVx1MDEzMlw2Mlx1MDEwZFwxXDBcMlx1MDEyMVwxXHUwMTQ5IisKLSAgICAiXDFcdTAxMjFcMVx1MDE0Nlw2NVx1MDEyMVwxXDBcMlx1MDEyMlwxXHUwMTRhXDRcdTAxMjJcMVx1MDE0NiIrCi0gICAgIlw2Mlx1MDEyMiI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjayh5eV9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICA5LCAgMSwgIDEsIAotICAgICA5LCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMywgIDksICA5LCAgMSwgIDEsICAxLCAgOSwgIDEsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMywgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDksICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsIDEzLCAgNywgIDAsIAotICAgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICA5LCAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAKLSAgICAgOSwgIDAsICA5LCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgCi0gICAgIDAsICAwLCAxMywgIDcsICAxLCAgOSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAxLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgCi0gICAgIDEsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDksICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAKLSAgICAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgOSwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICA5LCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsIAotICAgICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICA5LCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgOSwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgCi0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsIAotICAgICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQ7Ci0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aDsKLS8vCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZCdWZmZXJlZFRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfTk9STUFMID0gMTYzODQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7Ci0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOwotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgewotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBzaXplKSB7Ci0JCWZJbml0aWFsQnVmZmVyU2l6ZSA9IHNpemU7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dDsKLQkJU3RyaW5nIG5leHRUb2tlblR5cGU7Ci0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOwotLy8JCVN0cmluZ0J1ZmZlciB0ZXh0OwotCQlpbnQgc3RhcnQ7Ci0JCWludCB0ZXh0TGVuZ3RoOwotCQlpbnQgbGVuZ3RoOwotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCAhPSBudWxsKSB7Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLS8vCQkJdGV4dCA9IGZCdWZmZXJlZFRleHQ7Ci0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQotCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotLy8JCQl0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJLy8gdW5kZWYgLT4gY29uY2F0ZW5hdGUgdW5kZWYncwotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgPT0gVU5ERUZJTkVEKSB7Ci0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJfQotCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl9IGVsc2UgewotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOwotCQkJCXNwYWNlRm9sbG93cyA9IGZhbHNlOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoY29udGV4dCkpIHsgLy8gZGVjbGFyYXRpb24gdmFsdWUgY2FuIGNvbnRhaW4gVkFMVUVfUwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfREVDTEFSQVRJT05fVkFMVUVfUyk7Ci0JCQkJfSBlbHNlIGlmIChjYW5Db250YWluU3BhY2UoY29udGV4dCkpIHsKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX1MpOwotCQkJCX0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQKLQkJCQkJaWYgKHNwYWNlRm9sbG93cykgewotCQkJCQkJLy8gbmV4dCBpcyBzcGFjZSAtPiBhcHBlbmQKLS8vCQkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCQkJbGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBuZXh0IGlzIE5PVCBzcGFjZSAtPiBwdXNoIHRoaXMgZm9yIG5leHQgdGltZSwgcmV0dXJuIGl0c2VsZgotCQkJCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7Ci0vLwkJCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQkJCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCWNvbnRleHQgPSBDU1NfVU5LTk9XTjsKLQkJCX0KLQkJCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotICAJfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQkvKiBmb3Igc3RhbmRhbG9uZSB1c2UgKi8KLSAgCXB1YmxpYyBmaW5hbCBMaXN0IHBhcnNlVGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gIAkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgCQlDU1NUZXh0VG9rZW4gdG9rZW47Ci0JCWZvciAoU3RyaW5nIGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCk7IGtpbmQgIT0gbnVsbDsga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKSkgewotCQkJdG9rZW4gPSBuZXcgQ1NTVGV4dFRva2VuKCk7Ci0JCQl0b2tlbi5raW5kID0ga2luZDsgIAkJCQkKLQkJCXRva2VuLnN0YXJ0ID0geXljaGFyOwotCQkJdG9rZW4ubGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCXRva2VuLmltYWdlID0geXl0ZXh0KCk7Ci0JCQl0b2tlbnMuYWRkKHRva2VuKTsKLQkJfQotCi0gIAkJcmV0dXJuIHRva2VuczsKLSAgCX0KLSAgCQotICAJLyogdXNlciBtZXRob2QgKi8KLSAgCXByaXZhdGUgYm9vbGVhbiBjYW5Db250YWluU3BhY2UoU3RyaW5nIHR5cGUpIHsKLSAgCQlpZiAodHlwZSA9PSBDU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLSAgCQkJcmV0dXJuIGZhbHNlOwotICAJCX0gZWxzZSB7Ci0gIAkJCXJldHVybiB0cnVlOwotICAJCX0KLSAgCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB5eWNoYXI7Ci0JfQotCQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXl5X3JlYWRlciA9IGluOwotCi0JCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXl5X3N0YXRlID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gZkluaXRpYWxTdGF0ZTsgLy9ZWUlOSVRJQUw7Ci0KLQkJLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBmSW5pdGlhbEJ1ZmZlclNpemUpIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW2ZJbml0aWFsQnVmZmVyU2l6ZV07Ci0JCX0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfc3RhcnRSZWFkID0gMDsKLQotCQkvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCQlmcm9tIGlucHV0ICovCi0JCXl5X2VuZFJlYWQgPSAwOwotCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0KLQkJLyoqCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLQkJICogbWF0Y2hlZCB0ZXh0Ci0JCSAqLwotCQl5eWNvbHVtbiA9IDA7IAotCi0JCS8qKiAKLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0JCSAqLwotCQl5eV9hdEJPTCA9IGZhbHNlOwotCQkKLQkJLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQotCQkvKiB1c2VyIHZhcmlhYmxlcyAqLwotCQkvLwkJZlVuZGVmaW5lZC5kZWxldGUoMCwgZlVuZGVmaW5lZC5sZW5ndGgoKSk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgQ1NTVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIENTU1Rva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB5eV91bnBhY2soU3RyaW5nIHBhY2tlZCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbMjEwMDRdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEzOTA2KSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTcwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0gICAgeXlfcHVzaGJhY2tQb3MgPSAtMTsKLSAgICBib29sZWFuIHl5X3dhc19wdXNoYmFjazsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIGJvb2xlYW4geXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgZm9yICh5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zIDwgeXlfbWFya2VkUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfY3VycmVudFBvcysrKSB7Ci0gICAgICAgIHN3aXRjaCAoeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdKSB7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB5eV9jb3VudGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgIGlmICh5eV9jb3VudGVkKQotICAgICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfY291bnRlZCkgewotICAgICAgICBpZiAoIHl5X2FkdmFuY2UoKSA9PSAnXG4nICkgeXlsaW5lLS07Ci0gICAgICAgIGlmICggIXl5X2F0RU9GICkgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0gICAgICB5eV93YXNfcHVzaGJhY2sgPSBmYWxzZTsKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDIpID4gMCApCi0gICAgICAgICAgICB5eV9wdXNoYmFja1BvcyA9IHl5X2N1cnJlbnRQb3M7Ci0KLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPiAwICkgewotICAgICAgICAgICAgeXlfd2FzX3B1c2hiYWNrID0gKHl5X2F0dHJpYnV0ZXMgJiA0KSA+IDA7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA+IDAgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X3dhc19wdXNoYmFjaykKLSAgICAgICAgeXlfbWFya2VkUG9zID0geXlfcHVzaGJhY2tQb3M7Ci0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgNDIxOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQ7ICB9Ci0gICAgICAgIGNhc2UgNDMzOiBicmVhazsKLSAgICAgICAgY2FzZSA0MTI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfRk9OVF9GQUNFX0RFTElNSVRFUik7IHJldHVybiBDU1NfRk9OVF9GQUNFOyAgfQotICAgICAgICBjYXNlIDQzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc1OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7IHJldHVybiBDU1NfQ0hBUlNFVDsgIH0KLSAgICAgICAgY2FzZSA0MzU6IGJyZWFrOwotICAgICAgICBjYXNlIDMzNTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7ICB9Ci0gICAgICAgIGNhc2UgNDM2OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQTsgIH0KLSAgICAgICAgY2FzZSA0Mzc6IGJyZWFrOwotICAgICAgICBjYXNlIDI5MDogCi0gICAgICAgIGNhc2UgMzI3OiAKLSAgICAgICAgY2FzZSAzOTg6IAotICAgICAgICBjYXNlIDQwMDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJOyAgfQotICAgICAgICBjYXNlIDQzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY5OiAKLSAgICAgICAgY2FzZSAzMDc6IAotICAgICAgICBjYXNlIDM4NTogCi0gICAgICAgIGNhc2UgMzg3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgIH0KLSAgICAgICAgY2FzZSA0Mzk6IGJyZWFrOwotICAgICAgICBjYXNlIDI1NTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9QQUdFX1BTRVVET19QQUdFKTsgcmV0dXJuIENTU19QQUdFOyAgfQotICAgICAgICBjYXNlIDQ0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE4OiAKLSAgICAgICAgICB7ICByZXR1cm4gQ1NTX0NPTU1FTlQ7ICB9Ci0gICAgICAgIGNhc2UgNDQxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTc6IAotICAgICAgICAgIHsgIHJldHVybiBDU1NfQ0RPOyAgfQotICAgICAgICBjYXNlIDQ0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgY2FzZSAyNDU6IAotICAgICAgICBjYXNlIDI4MzogCi0gICAgICAgIGNhc2UgMjg0OiAKLSAgICAgICAgY2FzZSAzMjM6IAotICAgICAgICBjYXNlIDMyNDogCi0gICAgICAgIGNhc2UgMzYzOiAKLSAgICAgICAgY2FzZSAzNjQ6IAotICAgICAgICBjYXNlIDM5NDogCi0gICAgICAgIGNhc2UgMzk1OiAKLSAgICAgICAgY2FzZSA0MDc6IAotICAgICAgICBjYXNlIDQxNzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRTsgIH0KLSAgICAgICAgY2FzZSA0NDM6IGJyZWFrOwotICAgICAgICBjYXNlIDE2NTogCi0gICAgICAgICAgeyAgcmV0dXJuIENTU19DREM7ICB9Ci0gICAgICAgIGNhc2UgNDQ0OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjI6IAotICAgICAgICAgIHsgIHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUzsgIH0KLSAgICAgICAgY2FzZSA0NDU6IGJyZWFrOwotICAgICAgICBjYXNlIDE1NjogCi0gICAgICAgIGNhc2UgMjEwOiAKLSAgICAgICAgY2FzZSAyNDQ6IAotICAgICAgICBjYXNlIDI4MjogCi0gICAgICAgIGNhc2UgMzIyOiAKLSAgICAgICAgY2FzZSAzNjI6IAotICAgICAgICBjYXNlIDM5MzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSDsgIH0KLSAgICAgICAgY2FzZSA0NDY6IGJyZWFrOwotICAgICAgICBjYXNlIDE1MDogCi0gICAgICAgIGNhc2UgMjA1OiAKLSAgICAgICAgY2FzZSAyMDg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORzsgIH0KLSAgICAgICAgY2FzZSA0NDc6IGJyZWFrOwotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgY2FzZSAxMjk6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMjM1OiAKLSAgICAgICAgY2FzZSAyNzM6IAotICAgICAgICBjYXNlIDMxMzogCi0gICAgICAgIGNhc2UgMzUzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUU7ICB9Ci0gICAgICAgIGNhc2UgNDQ4OiBicmVhazsKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ0OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICBjYXNlIDEyNTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgIH0KLSAgICAgICAgY2FzZSA0NTA6IGJyZWFrOwotICAgICAgICBjYXNlIDUyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7ICB9Ci0gICAgICAgIGNhc2UgNDUxOiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICBjYXNlIDEyMzogCi0gICAgICAgIGNhc2UgMTI0OiAKLSAgICAgICAgY2FzZSAxOTI6IAotICAgICAgICBjYXNlIDIzNDogCi0gICAgICAgIGNhc2UgMjcyOiAKLSAgICAgICAgY2FzZSAzMTI6IAotICAgICAgICBjYXNlIDM1MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9QQUdFX0RFTElNSVRFUik7IHJldHVybiBDU1NfUEFHRV9TRUxFQ1RPUjsgIH0KLSAgICAgICAgY2FzZSA0NTI6IGJyZWFrOwotICAgICAgICBjYXNlIDQ4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfTEJSQUNFOyAgfQotICAgICAgICBjYXNlIDQ1MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDU0OiBicmVhazsKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICBjYXNlIDEyMDogCi0gICAgICAgIGNhc2UgMTIxOiAKLSAgICAgICAgY2FzZSAxOTE6IAotICAgICAgICBjYXNlIDIzMzogCi0gICAgICAgIGNhc2UgMjcxOiAKLSAgICAgICAgY2FzZSAzMTE6IAotICAgICAgICBjYXNlIDM1MTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9NRURJQV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX01FRElVTTsgIH0KLSAgICAgICAgY2FzZSA0NTU6IGJyZWFrOwotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsgIH0KLSAgICAgICAgY2FzZSA0NTY6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgODk6IAotICAgICAgICBjYXNlIDkwOiAKLSAgICAgICAgY2FzZSAxNjQ6IAotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgIGNhc2UgMjQ5OiAKLSAgICAgICAgY2FzZSAyOTI6IAotICAgICAgICBjYXNlIDMzMTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FOyAgfQotICAgICAgICBjYXNlIDQ1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDU0OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgMTI2OiAKLSAgICAgICAgY2FzZSAxNjM6IAotICAgICAgICAgIHsgIHJldHVybiBDU1NfUzsgIH0KLSAgICAgICAgY2FzZSA0NTg6IGJyZWFrOwotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOyAgfQotICAgICAgICBjYXNlIDQ1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTDsgIH0KLSAgICAgICAgY2FzZSA0NjA6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQ7ICB9Ci0gICAgICAgIGNhc2UgNDYxOiBicmVhazsKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgIH0KLSAgICAgICAgY2FzZSA0NjI6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgIGNhc2UgMjMyOiAKLSAgICAgICAgY2FzZSAyNzA6IAotICAgICAgICBjYXNlIDMxMDogCi0gICAgICAgIGNhc2UgMzUwOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0lNUE9SVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX01FRElVTTsgIH0KLSAgICAgICAgY2FzZSA0NjM6IGJyZWFrOwotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ7ICB9Ci0gICAgICAgIGNhc2UgNDY1OiBicmVhazsKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMTM0OiAKLSAgICAgICAgY2FzZSAxMzc6IAotICAgICAgICBjYXNlIDE5NDogCi0gICAgICAgIGNhc2UgMTk2OiAKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICBjYXNlIDIzNjogCi0gICAgICAgIGNhc2UgMjc0OiAKLSAgICAgICAgY2FzZSAzMTQ6IAotICAgICAgICBjYXNlIDM1NDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU7ICB9Ci0gICAgICAgIGNhc2UgNDY2OiBicmVhazsKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgIGNhc2UgNzA6IAotICAgICAgICBjYXNlIDEzOTogCi0gICAgICAgIGNhc2UgMTQwOiAKLSAgICAgICAgY2FzZSAyMDE6IAotICAgICAgICBjYXNlIDIzOTogCi0gICAgICAgIGNhc2UgMjc3OiAKLSAgICAgICAgY2FzZSAzMTc6IAotICAgICAgICBjYXNlIDM1NzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZOyAgfQotICAgICAgICBjYXNlIDQ2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsgIH0KLSAgICAgICAgY2FzZSA0Njg6IGJyZWFrOwotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDE1NTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOyAgfQotICAgICAgICBjYXNlIDQ3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgIGNhc2UgMTQ3OiAKLSAgICAgICAgY2FzZSAxNTM6IAotICAgICAgICBjYXNlIDE1NDogCi0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgY2FzZSAyMDM6IAotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgIGNhc2UgMjQxOiAKLSAgICAgICAgY2FzZSAyNzk6IAotICAgICAgICBjYXNlIDMxOTogCi0gICAgICAgIGNhc2UgMzU5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsgIH0KLSAgICAgICAgY2FzZSA0NzE6IGJyZWFrOwotICAgICAgICBjYXNlIDc4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsgIH0KLSAgICAgICAgY2FzZSA0NzI6IGJyZWFrOwotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDczOiBicmVhazsKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgMTY2OiAKLSAgICAgICAgY2FzZSAyMTU6IAotICAgICAgICBjYXNlIDI1MDogCi0gICAgICAgIGNhc2UgMjkzOiAKLSAgICAgICAgY2FzZSAzMzI6IAotICAgICAgICBjYXNlIDM3MzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7ICB9Ci0gICAgICAgIGNhc2UgNDc0OiBicmVhazsKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgY2FzZSAyMTY6IAotICAgICAgICBjYXNlIDI1MTogCi0gICAgICAgIGNhc2UgMjk0OiAKLSAgICAgICAgY2FzZSAzMzM6IAotICAgICAgICBjYXNlIDM3NDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfSUQ7ICB9Ci0gICAgICAgIGNhc2UgNDc1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICBjYXNlIDE3NjogCi0gICAgICAgIGNhc2UgMjI2OiAKLSAgICAgICAgY2FzZSAyNTg6IAotICAgICAgICBjYXNlIDI2MDogCi0gICAgICAgIGNhc2UgMzAwOiAKLSAgICAgICAgY2FzZSAzMzg6IAotICAgICAgICBjYXNlIDM3ODogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOyAgfQotICAgICAgICBjYXNlIDQ3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICBjYXNlIDE4MTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOyAgfQotICAgICAgICBjYXNlIDQ3NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgY2FzZSAxODQ6IAotICAgICAgICBjYXNlIDE4NzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19TVFJJTkc7ICB9Ci0gICAgICAgIGNhc2UgNDc4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDE6IAotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgIGNhc2UgMjQwOiAKLSAgICAgICAgY2FzZSAyNzg6IAotICAgICAgICBjYXNlIDMxODogCi0gICAgICAgIGNhc2UgMzU4OiAKLSAgICAgICAgY2FzZSAzOTA6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTjsgIH0KLSAgICAgICAgY2FzZSA0Nzk6IGJyZWFrOwotICAgICAgICBjYXNlIDE0NDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRTsgIH0KLSAgICAgICAgY2FzZSA0ODA6IGJyZWFrOwotICAgICAgICBjYXNlIDE0NjogCi0gICAgICAgIGNhc2UgMjQ3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsgIH0KLSAgICAgICAgY2FzZSA0ODE6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgY2FzZSA1MDogCi0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgY2FzZSA3NjogCi0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICBjYXNlIDgwOiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgODI6IAotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgICB7IAotCXJldHVybiBVTkRFRklORUQ7Ci0gfQotICAgICAgICBjYXNlIDQ4MjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIENTU1Rva2VuaXplciBzY2FubmVyID0gbnVsbDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNjYW5uZXIgPSBuZXcgQ1NTVG9rZW5pemVyKCBuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgQ1NTVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmpmbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmNhYzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qbmxzWFhYKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3MuaW50ZXJuYWwucGFyc2VyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3MuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuQ1NTVGV4dFJlZ2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3MucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY3NzLnBhcnNlci5DU1NUZXh0VG9rZW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOw0KLQ0KLSUlDQotDQotJXB1YmxpYw0KLSVjbGFzcyBDU1NUb2tlbml6ZXINCi0laW1wbGVtZW50cyBDU1NSZWdpb25Db250ZXh0cw0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0lbGluZQ0KLSV1bmljb2RlDQotJWNhc2VsZXNzDQotJWRlYnVnDQotJXBhY2sNCi0NCi0lew0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7DQotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydDsNCi0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7DQotLy8JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkJ1ZmZlcmVkVGV4dCA9IG51bGw7DQotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOw0KLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9OT1JNQUwgPSAxNjM4NDsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7DQotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsNCi0NCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgew0KLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgew0KLQkJZkluaXRpYWxCdWZmZXJTaXplID0gc2l6ZTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQ7DQotCQlTdHJpbmcgbmV4dFRva2VuVHlwZTsNCi0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOw0KLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsNCi0JCWludCBzdGFydDsNCi0JCWludCB0ZXh0TGVuZ3RoOw0KLQkJaW50IGxlbmd0aDsNCi0JCWlmIChmQnVmZmVyZWRDb250ZXh0ICE9IG51bGwpIHsNCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0Ow0KLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsNCi0NCi0JCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0vLwkJCXRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQlzdGFydCA9IHl5Y2hhcjsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCX0NCi0NCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsNCi0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsNCi0JCQkJLy8gdW5kZWYgLT4gY29uY2F0ZW5hdGUgdW5kZWYncw0KLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSA9PSBVTkRFRklORUQpIHsNCi0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCX0NCi0JCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7DQotLy8JCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsNCi0JCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsNCi0JCQkJc3BhY2VGb2xsb3dzID0gZmFsc2U7DQotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoY29udGV4dCkpIHsgLy8gZGVjbGFyYXRpb24gdmFsdWUgY2FuIGNvbnRhaW4gVkFMVUVfUw0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19ERUNMQVJBVElPTl9WQUxVRV9TKTsNCi0JCQkJfSBlbHNlIGlmIChjYW5Db250YWluU3BhY2UoY29udGV4dCkpIHsNCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfUyk7DQotCQkJCX0NCi0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkDQotCQkJCQlpZiAoc3BhY2VGb2xsb3dzKSB7DQotCQkJCQkJLy8gbmV4dCBpcyBzcGFjZSAtPiBhcHBlbmQNCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsNCi0JCQkJCQlsZW5ndGggKz0geXlsZW5ndGgoKTsNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYNCi0JCQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0vLwkJCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsNCi0JCQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgew0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgew0KLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047DQotCQkJfQ0KLQkJCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7DQotCQl9IGVsc2Ugew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLSAgCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovDQotICAJcHVibGljIGZpbmFsIExpc3QgcGFyc2VUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gIAkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotICAJCUNTU1RleHRUb2tlbiB0b2tlbjsNCi0JCWZvciAoU3RyaW5nIGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCk7IGtpbmQgIT0gbnVsbDsga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKSkgew0KLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOw0KLQkJCXRva2VuLmtpbmQgPSBraW5kOyAgCQkJCQ0KLQkJCXRva2VuLnN0YXJ0ID0geXljaGFyOw0KLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJdG9rZW4uaW1hZ2UgPSB5eXRleHQoKTsNCi0JCQl0b2tlbnMuYWRkKHRva2VuKTsNCi0JCX0NCi0NCi0gIAkJcmV0dXJuIHRva2VuczsNCi0gIAl9DQotICAJDQotICAJLyogdXNlciBtZXRob2QgKi8NCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7DQotICAJCWlmICh0eXBlID09IENTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgew0KLSAgCQkJcmV0dXJuIGZhbHNlOw0KLSAgCQl9IGVsc2Ugew0KLSAgCQkJcmV0dXJuIHRydWU7DQotICAJCX0NCi0gIAl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgew0KLQkJcmV0dXJuIHl5Y2hhcjsNCi0JfQ0KLQkNCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7DQotCQlyZXR1cm4geXlfYXRFT0Y7DQotCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgew0KLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0JCXl5X3JlYWRlciA9IGluOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0JCXl5X3N0YXRlID0gMDsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotCQl5eV9sZXhpY2FsX3N0YXRlID0gZkluaXRpYWxTdGF0ZTsgLy9ZWUlOSVRJQUw7DQotDQotCQkvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLQkJCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7DQotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbZkluaXRpYWxCdWZmZXJTaXplXTsNCi0JCX0NCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOw0KLQ0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCQl5eV9tYXJrZWRQb3MgPSAwOw0KLQ0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotCQl5eV9wdXNoYmFja1BvcyA9IDA7DQotDQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotCQl5eV9jdXJyZW50UG9zID0gMDsNCi0NCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JCXl5X3N0YXJ0UmVhZCA9IDA7DQotDQotCQkvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotCQkJZnJvbSBpbnB1dCAqLw0KLQkJeXlfZW5kUmVhZCA9IDA7DQotDQotCQkvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCQl5eWxpbmUgPSAwOw0KLQ0KLQkJLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQkJeXljaGFyID0gMDsNCi0NCi0JCS8qKg0KLQkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIA0KLQkJICogbWF0Y2hlZCB0ZXh0DQotCQkgKi8NCi0JCXl5Y29sdW1uID0gMDsgDQotDQotCQkvKiogDQotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUNCi0JCSAqLw0KLQkJeXlfYXRCT0wgPSBmYWxzZTsNCi0JCQ0KLQkJLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JCXl5X2F0RU9GID0gZmFsc2U7DQotDQotCQkvKiB1c2VyIHZhcmlhYmxlcyAqLw0KLQkJLy8JCWZVbmRlZmluZWQuZGVsZXRlKDAsIGZVbmRlZmluZWQubGVuZ3RoKCkpOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBDU1NUb2tlbml6ZXIoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotJX0NCi0NCi0lc3RhdGUgU1RfQ0hBUlNFVF9OQU1FDQotJXN0YXRlIFNUX0NIQVJTRVRfREVMSU1JVEVSDQotJXN0YXRlIFNUX0lNUE9SVF9VUkkNCi0lc3RhdGUgU1RfSU1QT1JUX01FRElVTQ0KLSVzdGF0ZSBTVF9JTVBPUlRfREVMSU1JVEVSDQotJXN0YXRlIFNUX01FRElBX01FRElVTQ0KLSVzdGF0ZSBTVF9NRURJQV9ERUxJTUlURVINCi0lc3RhdGUgU1RfUEFHRV9QU0VVRE9fUEFHRQ0KLSVzdGF0ZSBTVF9QQUdFX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSDQotJXN0YXRlIFNUX1NFTEVDVE9SDQotJXN0YXRlIFNUX1NFTEVDVE9SX01PRElGSUVSDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORA0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1INCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFDQotDQotaCA9IFswLTlhLWZdDQotbm9uYXNjaWkgPSBbXHUwMDgwLVx1ZmZmZl0NCi11bmljb2RlID0gXFx7aH17MSw2fVsgXHRcclxuXGZdPw0KLWVzY2FwZSA9IHt1bmljb2RlfXxcXFsgLX5cdTAwODAtXHVmZmZmXQ0KLW5tc3RhcnQgPSBbX2EtekEtWi1dfHtub25hc2NpaX18e2VzY2FwZX0NCi1ubWNoYXIgPSBbX2EtekEtWjAtOS1dfHtub25hc2NpaX18e2VzY2FwZX0NCi1zdHJpbmcxID0gXCIoW1x0ICEjJCUmKC1+XXxcXHtubH18XCd8e25vbmFzY2lpfXx7ZXNjYXBlfSkqXCINCi1zdHJpbmcyID0gXCcoW1x0ICEjJCUmKC1+XXxcXHtubH18XCJ8e25vbmFzY2lpfXx7ZXNjYXBlfSkqXCcNCi0NCi1pZGVudCA9IHtubXN0YXJ0fXtubWNoYXJ9Kg0KLW5hbWUgPSB7bm1jaGFyfSsNCi1udW0gPSBbKy1dPyhbMC05XSt8WzAtOV0qIi4iWzAtOV0rKQ0KLXN0cmluZyA9IHtzdHJpbmcxfXx7c3RyaW5nMn0NCi11cmwgPSAoWyAhIyQlJiotfl18e25vbmFzY2lpfXx7ZXNjYXBlfSkqDQotcyA9IFsgXHRcclxuXGZdDQotdyA9IHtzfSoNCi1ubCA9IFxufFxyXG58XHJ8XGYNCi1yYW5nZSA9IFw/ezEsNn18e2h9KFw/ezAsNX18e2h9KFw/ezAsNH18e2h9KFw/ezAsM318e2h9KFw/ezAsMn18e2h9KFw/P3x7aH0pKSkpKQ0KLQ0KLWhhc2ggPSAiIyJ7bmFtZX0NCi11cmkgPSAoInVybCgie3d9e3N0cmluZ317d30iKSJ8InVybCgie3d9e3VybH17d30iKSIpDQotZnVuY3Rpb24gPSB7aWRlbnR9IigiDQotdW5pY29kZV9yYW5nZSA9ICJVIlwrWzAtOWEtZkEtRj9dezEsNn0oIi0iWzAtOWEtZkEtRj9dezEsNn0pPw0KLQ0KLSUlDQotDQotLyoNCi0gKiAqKiogZ2xvYmFsICoqKg0KLSAqLw0KLQ0KLXtzfSsgeyByZXR1cm4gQ1NTX1M7IH0NCi0iPCEtLSIgeyByZXR1cm4gQ1NTX0NETzsgfQ0KLSItLT4iIHsgcmV0dXJuIENTU19DREM7IH0NCi0ifSIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOyB9DQotXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvIHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotDQotLy88WVlJTklUSUFMPiB7DQotLy8JIkBpbXBvcnQiIHsJeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7IH0NCi0vL30NCi0NCi0vKg0KLSAqICoqKiBjaGFyc2V0IHJ1bGUgKioqDQotICogQ0hBUlNFVF9TWU0gUyogU1RSSU5HIFMqICc7Jw0KLSAqLw0KLQ0KLSJAY2hhcnNldCIgeyB5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7IHJldHVybiBDU1NfQ0hBUlNFVDsgfQ0KLQ0KLTxTVF9DSEFSU0VUX05BTUU+IHsNCi0Je3N0cmluZ30geyB5eWJlZ2luKFNUX0NIQVJTRVRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19TVFJJTkc7IH0NCi19DQotDQotPFNUX0NIQVJTRVRfREVMSU1JVEVSPiB7DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotLyoNCi0gKiAqKiogaW1wb3J0IHJ1bGUgKioqDQotICogSU1QT1JUX1NZTSBTKiBbU1RSSU5HfFVSSV0gUyogWyBtZWRpdW0gWyBDT01NQSBTKiBtZWRpdW1dKiBdPyAnOycgUyoNCi0gKi8NCi0NCi0iQGltcG9ydCIgeyB5eWJlZ2luKFNUX0lNUE9SVF9VUkkpOyByZXR1cm4gQ1NTX0lNUE9SVDsgfQ0KLQ0KLTxTVF9JTVBPUlRfVVJJPiB7DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19TVFJJTkc7IH0NCi0JLy8JInVybCgie3d9e3N0cmluZ317d30iKSIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQkvLwkidXJsKCJ7d317dXJsfXt3fSIpIiB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCXt1cml9IHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLX0NCi0NCi08U1RfSU1QT1JUX01FRElVTT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9JTVBPUlRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07IH0NCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLX0NCi0NCi08U1RfSU1QT1JUX0RFTElNSVRFUj4gew0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotCSIsIiB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIG1lZGlhIHJ1bGUgKioqDQotICogTUVESUFfU1lNIFMqIG1lZGl1bSBbIENPTU1BIFMqIG1lZGl1bSBdKiBMQlJBQ0UgUyogcnVsZXNldCogJ30nIFMqDQotICovDQotDQotIkBtZWRpYSIgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUE7IH0NCi0NCi0vKiANCi0gKiBtZWRpdW0NCi0gKiBJREVOVCBTKg0KLSAqLw0KLTxTVF9NRURJQV9NRURJVU0+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07IH0NCi19DQotDQotPFNUX01FRElBX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotCSIsIiB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7IH0NCi19DQotDQotLyoNCi0gKiAqKiogcGFnZSBydWxlICoqDQotICogUEFHRV9TWU0gUyogcHNldWRvX3BhZ2U/IFMqIExCUkFDRSBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiBdKiAnfScgUyoNCi0gKi8NCi0NCi0iQHBhZ2UiIHsgeXliZWdpbihTVF9QQUdFX1BTRVVET19QQUdFKTsgcmV0dXJuIENTU19QQUdFOyB9DQotIA0KLS8qDQotICogcHNldWRvX3BhZ2UNCi0gKiAnOicgSURFTlQNCi0gKi8NCi0NCi08U1RfUEFHRV9QU0VVRE9fUEFHRT4gew0KLQkiOiI/e2lkZW50fSB7IHl5YmVnaW4oU1RfUEFHRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1BBR0VfU0VMRUNUT1I7IH0NCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLTxTVF9QQUdFX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBmb250LWZhY2UNCi0gKiBGT05UX0ZBQ0VfU1lNIFMqICd7JyBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiAnKiAnfScgUyoNCi0gKi8NCi0NCi0iQGZvbnQtZmFjZSIgeyB5eWJlZ2luKFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX0ZPTlRfRkFDRTsgfQ0KLQ0KLTxTVF9GT05UX0ZBQ0VfREVMSU1JVEVSPiB7DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi0vKg0KLSAqIHNlbGVjdG9yDQotICogc2ltcGxlX3NlbGVjdG9yIFsgY29tYmluYXRvciBzaW1wbGVfc2VsZWN0b3IgXSoNCi0gKi8NCi0NCi0vKg0KLSAqIHNpbXBsZV9zZWxlY3Rvcg0KLSAqIGVsZW1lbnRfbmFtZSBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyBdKiB8IFsgSEFTSCB8IGNsYXNzIHwgYXR0cmliIHwgcHNldWRvIF0rDQotICovDQotDQotPFlZSU5JVElBTCwgU1RfU0VMRUNUT1JfTU9ESUZJRVIsIFNUX1NFTEVDVE9SPiB7DQotCSIqIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTDsgfQ0KLQl7aGFzaH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9JRDsgfQ0KLS8vCSI6IntpZGVudH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87IH0NCi0JIjoie2lkZW50fSgiKCJ7c30qe2lkZW50fXtzfSoiKSIpPyB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsgfQ0KLQkiLiJ7bmFtZX0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DTEFTUzsgfQ0KLQkiWyIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQ7IH0NCi19DQotDQotPFlZSU5JVElBTCwgU1RfU0VMRUNUT1I+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfTU9ESUZJRVI+IHsNCi0JIiwiIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SOyB9DQotCS8vIHVzaW5nIExPT0tBSEVBRA0KLQl7c30rL1teKz5ce10geyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SOyB9DQotCSIrInwiPiIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SOyB9DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi0vKg0KLSAqIGF0dHJpYg0KLSAqICdbJyBTKiBJREVOVCBTKiBbIFsgJz0nIHwgSU5DTFVERVMgfCBEQVNITUFUQ0ggXSBTKiBbIElERU5UIHwgU1RSSU5HIF0gUyogXT8gJ10nDQotICovDQotDQotPFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUU7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUj4gew0KLQkiPSJ8In49InwifD0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUjsgfQ0KLQkiXSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU+IHsNCi0Je2lkZW50fXx7c3RyaW5nfSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EPiB7DQotCSJdIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ7IH0NCi19DQotDQotLyoNCi0gKiBkZWNsYXJhdGlvbg0KLSAqIHByb3BlcnR5ICc6JyBTKiBleHByIHByaW8/IHwgLy8gZW1wdHkgLy8NCi0gKi8NCi0NCi08U1RfREVDTEFSQVRJT04+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsgfQ0KLX0NCi0NCi08U1RfREVDTEFSQVRJT05fU0VQQVJBVE9SPiB7DQotCSI6IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9TRVBBUkFUT1I7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIiEie3N9KiJpbXBvcnRhbnQiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOyB9DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsgfQ0KLQkiKSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsgfQ0KLQl7bnVtfXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047IH0NCi0Je251bX0iJSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOyB9DQotCXtudW19IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOyB9DQotCXtmdW5jdGlvbn0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsgfQ0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORzsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSTsgfQ0KLQkiIyJ7bmFtZX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIOyB9DQotCXt1bmljb2RlX3JhbmdlfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7IH0NCi0JWywvXSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOyB9DQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9WQUxVRT4gew0KLQl7c30rL1teO31dIHsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TOyB9DQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTiwgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SLCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUsIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCSI7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsgfQ0KLQkvLwkifSIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOyB9DQotfQ0KLQ0KLQ0KLS8vPFlZSU5JVElBTCwgU1RfSU1QT1JUX1VSSSwgU1RfSU1QT1JUX01FRElVTSwgU1RfSU1QT1JUX0RFTElNSVRFUj4gew0KLS8vCVwvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLyB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLS8vCXtzfSsgeyByZXR1cm4gQ1NTX1M7IH0NCi0vLwkuIHsgcmV0dXJuIFVOREVGSU5FRDsgfQ0KLS8vfQ0KLQ0KLS8vPFlZSU5JVElBTCwgU1RfSU1QT1JUX1VSSSwgU1RfSU1QT1JUX01FRElVTSwgU1RfSU1QT1JUX0RFTElNSVRFUj4gew0KLS8vCVteIFx0XHJcblxmXSsgeyByZXR1cm4gQ1NTX1VOS05PV047IH0NCi0vL30NCi0NCi0uIHsNCi0JcmV0dXJuIFVOREVGSU5FRDsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGZjZTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9mbGV4LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotQGVjaG8gb2ZmDQotc2V0IFBBVEg9JVBBVEglO2M6XGpkazEuNFxiaW4NCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwIEpGbGV4XGxpYlxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiBKU1BUb2tlbml6ZXIgLXNrZWwgc2tlbGV0b24uc2VkDQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCBKRmxleFxsaWJcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gWE1MVG9rZW5pemVyIC1za2VsIHNrZWxldG9uLnNlZA0KLXJtIC1mIEpTUFRva2VuaXplci5qYXZhfiBKU1BUb2tlbml6ZXJ+IFhNTFRva2VuaXplci5qYXZhfiBYTUxUb2tlbml6ZXJ+DQotY29weSBYTUxUb2tlbml6ZXIuamF2YSAuLlwuLlwuLlwuLlxzZWRtb2RlbFxjb21caWJtXHNlZFxwYXJzZXJcaW50ZXJuYWwNCi1jb3B5IEpTUFRva2VuaXplci5qYXZhIC4uXC4uXC4uXC4uXHNlZG1vZGVsXGNvbVxpYm1cc2VkXHBhcnNlclxpbnRlcm5hbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9mbGV4LnNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ODcyZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIS9iaW4vc2gNCi0NCi1KQVZBRElSPUM6L0FwcC9JQk0vSmF2YTE0MS9iaW4NCi1KQVZBT1BUPS1YbXg0NzAwMDAwMDANCi1DTEFTU1BBVEg9Li4vLi4vSFRNTFRva2VuaXplci9kZXZlbC9KRmxleC9saWIvc2VkLWpmbGV4Lmphclw7Lg0KLURFU1RESVI9Li4vLi4vLi4vLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNzcy9zcmMvY29tL2libS9zc2UvbW9kZWwvY3NzL2ludGVybmFsL3BhcnNlcg0KLQ0KLSNleHBvcnQgUEFUSD0kUEFUSDovb3B0L0lCTUphdmEyLTEzMS9iaW4vOi9vcHQvSUJNSmF2YTItMTMvYmluLzovb3B0L2pkazEuNA0KLSNqYXZhIC1YbXg0NzAwMDAwMDAgLWNwIEpGbGV4L2xpYi9zZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiBDU1NUb2tlbml6ZXIgLXNrZWwgc2tlbGV0b24uc3NlDQotDQotJEpBVkFESVIvamF2YSAkSkFWQU9QVCAtY3AgJENMQVNTUEFUSCBKRmxleC5NYWluIENTU1Rva2VuaXplci5qZmxleA0KLQ0KLXJtIC1mIENTU1Rva2VuaXplci5qYXZhfiBDU1NUb2tlbml6ZXIuamZsZXh+DQotY3AgLXYgQ1NTVG9rZW5pemVyLmphdmEgJERFU1RESVINCi0jJEpBVkFESVIvamF2YWMgJERFU1RESVIvKi5qYXZhDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9SRUFETUUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiYmM3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWRldmVsICAgICAtIHRoZSBhY3RpdmUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgKHNhbnMgSkRLKQ0KLSAgICAgICAgICAgIC0gbGF0ZXN0IHZlcnNpb24gb2YgSFRNTFRva2VuaXplciBzcGVjaWZpY2F0aW9uIGFuZCBnZW5lcmF0ZWQgY29kZQ0KLSAgICAgICAgICAgIC0gc2xpZ2h0bHkgdXBkYXRlZCBKQVIgZmlsZSB0byBhdm9pZCBhbnkgcG9zc2libGUgYXMtc2hpcHBlZA0KLSAgICAgICAgICAgICAgY29tcGlsYXRpb24gZXJyb3JzDQotICAgICAgICAgICAgLSBtb2RpZmllZCBza2VsZXRvbiB0byBwcmV2ZW50IFZNIGV4aXRzIG9uIHVubWF0Y2hlZCBpbnB1dA0KLSAgICAgICAgICAgIC0gImZsZXgiIHNjcmlwdHMgdG8gcnVuIEpGbGV4IHdpdGggbW9kaWZpZWQgc2tlbGV0b24gYW5kIHVwZGF0ZWQgSkFSDQotICAgICAgICAgICAgLSBhY3RpdmUgUkNTIGFyY2hpdmUNCi1yZXNvdXJjZXMgLSBiYWNrdXAvcHJpc3RpbmUgcmVzb3VyY2VzDQotICAgICAgICAgICAgLSBVbm1vZGlmaWVkIEpGbGV4IDEuMi4yIGRvd25sb2FkDQotICAgICAgICAgICAgLSBTZXBhcmF0ZSBtb2RpZmljYXRpb25zIHRvIHRoZSBKRmxleCBza2VsZXRvbg0KLSAgICAgICAgICAgIC0gVzNDIFhNTCByZWNvbW1lbmRhdGlvbiB1c2VkIGZvciBzZXZlcmFsIG9mIHRoZSBIVE1MVG9rZW5pemVyIHJ1bGVzDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KRmxleC9DT1BZUklHSFQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pGbGV4L0NPUFlSSUdIVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkMWRlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pGbGV4L0NPUFlSSUdIVAorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi1KRmxleCAtIENvcHlpbmcsIFdhcnJhbnR5ICYgTGljZW5zZQ0KLQ0KLSAgDQotDQotSkZsZXggaXMgZnJlZSBzb2Z0d2FyZSwgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIA0KLQ0KLVRoZXJlIGlzIGFic29sdXRlbHkgTk8gV0FSUkFOVFkgZm9yIEpGbGV4LCBpdHMgY29kZSBhbmQgaXRzIGRvY3VtZW50YXRpb24uIA0KLSAgDQotVGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IEpGbGV4IGluaGVyaXRzIHRoZSBjb3B5cmlnaHQgb2YgdGhlIHNwZWNpZmljYXRpb24gaXQNCi13YXMgcHJvZHVjZWQgZnJvbS4gSWYgaXQgd2FzIHlvdXIgc3BlY2lmaWNhdGlvbiwgeW91IG1heSB1c2UgdGhlIGdlbmVyYXRlZCANCi1jb2RlIHdpdGhvdXQgcmVzdHJpY3Rpb24uDQotDQotICANCi0NCi1URVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04NCi0NCi0NCi0NCi0wLg0KLSBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zDQotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQNCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csDQotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iDQotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoNCi10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LA0KLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyDQotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbg0KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLg0KLQ0KLQ0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90DQotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZg0KLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0NCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQ0KLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuDQotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuDQotDQotDQotDQotMS4NCi0gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzDQotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91DQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQ0KLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUNCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7DQotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQ0KLWFsb25nIHdpdGggdGhlIFByb2dyYW0uDQotDQotDQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kDQoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4NCi0NCi0NCi0yLg0KLSBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uDQotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZA0KLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQ0KLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6DQotDQotDQotDQotICAgICBhKQ0KLSAgICAgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLg0KLQ0KLQ0KLSAgICAgYikNCi0gICAgIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbg0KLSAgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55DQotICAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZA0KLSAgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLg0KLQ0KLQ0KLSAgICAgYykNCi0gICAgIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkNCi0gICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gNCi0gICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4NCi0gICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQ0KLSAgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlDQotICAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyDQotICAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcw0KLSAgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQNCi0gICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24NCi0gICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQ0KLQ0KLQ0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYNCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLA0KLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbg0KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UNCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UNCi1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQNCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YNCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQ0KLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4NCi0NCi0NCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QNCi15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8NCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3INCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLg0KLQ0KLQ0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0NCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YNCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcg0KLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuDQotDQotDQotDQotMy4NCi0gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsDQotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mDQotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOg0KLQ0KLQ0KLQ0KLSAgICAgYSkNCi0gICAgIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUNCi0gICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucw0KLSAgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsDQotDQotDQotICAgICBiKQ0KLSAgICAgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUNCi0gICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyDQotICAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlDQotICAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlDQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQ0KLSAgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLA0KLQ0KLQ0KLSAgICAgYykNCi0gICAgIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyDQotICAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcw0KLSAgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UNCi0gICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gNCi0gICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQ0KLQ0KLQ0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3INCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQ0KLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55DQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvDQotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQ0KLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQ0KLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5DQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUNCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudA0KLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4NCi0NCi0NCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nDQotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudA0KLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcw0KLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdA0KLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuDQotDQotDQotNC4NCi0gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtDQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdA0KLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcw0KLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4NCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcg0KLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoDQotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLg0KLQ0KLQ0KLQ0KLTUuDQotIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdA0KLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yDQotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlDQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQ0KLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQ0KLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kDQotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZw0KLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0Lg0KLQ0KLQ0KLQ0KLTYuDQotIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUNCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQ0KLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8NCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcg0KLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4NCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bw0KLXRoaXMgTGljZW5zZS4NCi0NCi0NCi0NCi03Lg0KLSBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50DQotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwNCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yDQotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdA0KLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90DQotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcw0KLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UNCi1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50DQotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQ0KLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbg0KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8NCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLg0KLQ0KLQ0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcg0KLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8NCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcg0KLWNpcmN1bXN0YW5jZXMuDQotDQotDQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQ0KLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55DQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQ0KLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcw0KLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQ0KLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQNCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdA0KLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcNCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QNCi1pbXBvc2UgdGhhdCBjaG9pY2UuDQotDQotDQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvDQotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuDQotDQotDQotDQotOC4NCi0gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4NCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUNCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlDQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nDQotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZw0KLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcw0KLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLg0KLQ0KLQ0KLQ0KLTkuDQotIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zDQotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsDQotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvDQotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuDQotDQotDQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQ0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55DQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZg0KLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUNCi1Gb3VuZGF0aW9uLg0KLQ0KLQ0KLQ0KLQ0KLTEwLg0KLSBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUNCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yDQotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlDQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzDQotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMNCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kDQotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuDQotDQotDQotDQotTk8gV0FSUkFOVFkNCi0NCi0NCi0NCi0xMS4NCi0gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkNCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4NCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTDQotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQNCi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMNCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFDQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsDQotUkVQQUlSIE9SIENPUlJFQ1RJT04uDQotDQotDQotDQotMTIuDQotIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORw0KLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1INCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLA0KLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORw0KLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQNCi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkNCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUg0KLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQ0KLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4NCi0NCi0NCi0NCi0NCi1FTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pGbGV4L1JFQURNRS5zZWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pGbGV4L1JFQURNRS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNThiYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KRmxleC9SRUFETUUuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgY29udGVudHMgb2YgamZsZXgtMi4yLnppcA0KLQ0KLU1JTlVTIHRoZSBKRmxleC9saWIvSkZsZXguamFyIGZpbGUgYW5kIEpGbGV4L2JpbiwgSkZsZXgvZG9jLCBhbmQgDQotICAgICAgSkZsZXgvZXhhbXBsZXMgZGlyZWN0b3JpZXMNCi1QTFVTOiBzb3VyY2VzIHJlYnVpbHQgdW5kZXIgYSB2MS4zIEpESyBpbnRvIEpGbGV4L2xpYi9zZWQtamZsZXguamFyDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMjU0NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OTkgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMS8yNy8wNSA0OjQ5IFBNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuSW50U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0czsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiAxLzI3LzA1IDQ6NDkgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovZWNsaXBzZS53dHAvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUb2tlbml6ZXIgaW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgWE1MSlNQUmVnaW9uQ29udGV4dHMgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX0RRVU9URVMgPSA1MjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9TUVVPVEVTID0gNTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfU1FVT1RFU19FTkQgPSA1MzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlRfRU5EID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUgPSAyMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX1NRVU9URVNfRU5EID0gNDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9EUVVPVEVTID0gNDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTCA9IDQzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDM2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfU1FVT1RFUyA9IDQ0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCA9IDQxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9FUVVBTFMgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkwgPSA1MDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1NRVU9URURfVkJMID0gNTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCA9IDQwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX05BTUUgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VRVUFMUyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FID0gMTk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT05URU5UID0gMTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSA9IDMxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDMyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UgPSAyNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMgPSAyMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9EUVVPVEVTX0VORCA9IDU0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRFFVT1RFRF9FTCA9IDQ4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9FTkQgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9XUyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX1RFWFQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSA9IDE4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UID0gMzM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OID0gMzQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9EUVVPVEVTX0VORCA9IDQ3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfU1FVT1RFRF9FTCA9IDQ5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09NTUVOVF9FTkQgPSAzOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0VRVUFMUyA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAzNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDID0gMzA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9EUVVPVEVEX1ZCTCA9IDU1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9BQk9SVF9FTUJFRERFRCA9IDQyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09NTUVOVCA9IDM4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9DT05URU5UID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4gPSAzNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEkgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT04gPSAyNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9OQU1FID0gMTc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9UQUdfTkFNRSA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjZcMlwwXDFcMTdcMjJcMFwxXDE3XDFcMjVcMVwxMlwxXDYzIisKLSAgICAiXDFcMTVcMVwyMlwxXDEzXDFcMTRcMVwyNFwxXDI0XDFcMjRcMVwyNFwxXDI0XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDIwXDFcMTFcMVw3MFwxXDFcMVw1MFwxXDJcMVw0XDFcMjEiKwotICAgICJcMVwzN1wxXDcxXDFcMzVcMVwzNlwxXDU0XDFcNjZcMVw2MFwxXDYwXDFcNjFcMVw2MCIrCi0gICAgIlwxXDYwXDFcMzJcMVwzMVwxXDYyXDFcNTFcMVw1M1wxXDYwXDFcNjVcMVw2NFwxXDQwIisKLSAgICAiXDFcNjdcMlw2MFwxXDI3XDFcNTJcMVw2MFwxXDM0XDFcMTAyXDFcMjNcMVwwXDFcMTAiKwotICAgICJcMVwwXDFcNTZcMVwxMDFcMVw3MlwxXDU3XDFcNDJcMVw2NlwxXDczXDFcNjBcMVw0NSIrCi0gICAgIlwxXDc2XDFcNjBcMVwzM1wxXDMxXDFcNDdcMVw0NlwxXDc3XDFcNjBcMVw0M1wxXDQ0IisKLSAgICAiXDFcNTVcMVwxMDBcMVw0MVwxXDYwXDFcMzBcMVw1MlwxXDYwXDFcMTZcMVwwXDFcMTAzIisKLSAgICAiXDcxXDBcMVw3NVwxMFwwXDI3XDc0XDFcMFwzN1w3NFwxXDBcNzJcNzRcMlwwXDEzXDc0IisKLSAgICAiXDJcMFwxMFw3NFwxXDBcNjVcNzRcMVwwXDEwNFw3NFwxMVwwXDQ0XDc0XDNcMFwyXDc0IisKLSAgICAiXDRcMFwzNlw3NFw3MFwwXDEzMVw3NFwyMlwwXDdcNzRcMTZcMFwyXDc1XDU2XDBcMTA2XDc1IisKLSAgICAiXDMyXDBcMlw3NVw0NFwwXDFcNzRcMVw3NVwzXDc0XDFcMFwxXDc0XDFcMFwyNFw3NCIrCi0gICAgIlwxXDBcNTRcNzRcMVwwXDdcNzRcM1wwXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzQiKwotICAgICJcMVwwXDFcNzRcMVwwXDIyXDc0XDE1XDBcMTRcNzRcMVwwXDEwMlw3NFwxXDBcMTRcNzQiKwotICAgICJcMVwwXDQ0XDc0XDFcMFw0XDc1XDExXDBcNjVcNzRcMlwwXDJcNzRcMlwwXDJcNzQiKwotICAgICJcM1wwXDM0XDc0XDJcMFwxMFw3NFwyXDBcMlw3NFw2N1wwXDQ2XDc0XDJcMFwxXDc0IisKLSAgICAiXDdcMFw0Nlw3NFwxMlwwXDIxXDc1XDFcMFwyN1w3NVwxXDBcM1w3NVwxXDBcMVw3NSIrCi0gICAgIlwxXDBcMlw3NVwxXDBcMVw3NVwxM1wwXDMzXDc0XDVcMFwzXDc0XDU2XDBcMzJcNzQiKwotICAgICJcNVwwXDFcNzVcMTJcNzRcMTBcNzVcMTVcMFwxMlw3NVw2XDBcMVw3NVwxMDdcNzRcMlwwIisKLSAgICAiXDVcNzRcMVwwXDE3XDc0XDFcMFw0XDc0XDFcMFwxXDc0XDE3XDc1XDJcNzRcMlw3NSIrCi0gICAgIlwxXDBcNFw3NVwyXDBcMTJcNzVcdTAyMDdcMFwzXDc1XDFcMFw2NVw3NFwyXDBcMVw3NSIrCi0gICAgIlwxXDc0XDIwXDc1XDNcMFw0XDc1XDNcMFwxMlw3NFwyXDc1XDJcMFwxMlw3NVwyMVwwIisKLSAgICAiXDNcNzVcMVwwXDEwXDc0XDJcMFwyXDc0XDJcMFwyNlw3NFwxXDBcN1w3NFwxXDAiKwotICAgICJcMVw3NFwzXDBcNFw3NFwyXDBcMVw3NVwxXDBcN1w3NVwyXDBcMlw3NVwyXDAiKwotICAgICJcM1w3NVwxMVwwXDFcNzVcNFwwXDJcNzRcMVwwXDNcNzRcMlw3NVwyXDBcMTJcNzUiKwotICAgICJcMlw3NFwyMFwwXDFcNzVcMlwwXDZcNzRcNFwwXDJcNzRcMlwwXDI2XDc0XDFcMCIrCi0gICAgIlw3XDc0XDFcMFwyXDc0XDFcMFwyXDc0XDFcMFwyXDc0XDJcMFwxXDc1XDFcMCIrCi0gICAgIlw1XDc1XDRcMFwyXDc1XDJcMFwzXDc1XDEzXDBcNFw3NFwxXDBcMVw3NFw3XDAiKwotICAgICJcMTJcNzVcMlw3NVwzXDc0XDE0XDBcM1w3NVwxXDBcN1w3NFwxXDBcMVw3NFwxXDAiKwotICAgICJcM1w3NFwxXDBcMjZcNzRcMVwwXDdcNzRcMVwwXDJcNzRcMVwwXDVcNzRcMlwwIisKLSAgICAiXDFcNzVcMVw3NFwxMFw3NVwxXDBcM1w3NVwxXDBcM1w3NVwyMlwwXDFcNzRcNVwwIisKLSAgICAiXDEyXDc1XDIxXDBcM1w3NVwxXDBcMTBcNzRcMlwwXDJcNzRcMlwwXDI2XDc0XDFcMCIrCi0gICAgIlw3XDc0XDFcMFwyXDc0XDJcMFw0XDc0XDJcMFwxXDc1XDFcNzRcNlw3NVwzXDAiKwotICAgICJcMlw3NVwyXDBcM1w3NVwxMFwwXDJcNzVcNFwwXDJcNzRcMVwwXDNcNzRcNFwwIisKLSAgICAiXDEyXDc1XDIyXDBcMlw3NVwxXDBcNlw3NFwzXDBcM1w3NFwxXDBcNFw3NFwzXDAiKwotICAgICJcMlw3NFwxXDBcMVw3NFwxXDBcMlw3NFwzXDBcMlw3NFwzXDBcM1w3NFwzXDAiKwotICAgICJcMTBcNzRcMVwwXDNcNzRcNFwwXDVcNzVcM1wwXDNcNzVcMVwwXDRcNzVcMTFcMCIrCi0gICAgIlwxXDc1XDE3XDBcMTFcNzVcMjFcMFwzXDc1XDFcMFwxMFw3NFwxXDBcM1w3NFwxXDAiKwotICAgICJcMjdcNzRcMVwwXDEyXDc0XDFcMFw1XDc0XDRcMFw3XDc1XDFcMFwzXDc1XDFcMCIrCi0gICAgIlw0XDc1XDdcMFwyXDc1XDExXDBcMlw3NFw0XDBcMTJcNzVcMjJcMFwyXDc1XDFcMCIrCi0gICAgIlwxMFw3NFwxXDBcM1w3NFwxXDBcMjdcNzRcMVwwXDEyXDc0XDFcMFw1XDc0XDRcMCIrCi0gICAgIlw3XDc1XDFcMFwzXDc1XDFcMFw0XDc1XDdcMFwyXDc1XDdcMFwxXDc0XDFcMCIrCi0gICAgIlwyXDc0XDRcMFwxMlw3NVwyMlwwXDJcNzVcMVwwXDEwXDc0XDFcMFwzXDc0XDFcMCIrCi0gICAgIlwyN1w3NFwxXDBcMjBcNzRcNFwwXDZcNzVcMlwwXDNcNzVcMVwwXDRcNzVcMTFcMCIrCi0gICAgIlwxXDc1XDEwXDBcMlw3NFw0XDBcMTJcNzVcMjIxXDBcNTZcNzRcMVwwXDFcNzRcMVw3NSIrCi0gICAgIlwyXDc0XDdcNzVcNVwwXDZcNzRcMVw3NVwxMFw3NVwxXDBcMTJcNzVcNDdcMFwyXDc0IisKLSAgICAiXDFcMFwxXDc0XDJcMFwyXDc0XDFcMFwxXDc0XDJcMFwxXDc0XDZcMFw0XDc0IisKLSAgICAiXDFcMFw3XDc0XDFcMFwzXDc0XDFcMFwxXDc0XDFcMFwxXDc0XDJcMFwyXDc0IisKLSAgICAiXDFcMFwyXDc0XDFcMFwxXDc0XDFcNzVcMlw3NFw2XDc1XDFcMFwyXDc1XDFcNzQiKwotICAgICJcMlwwXDVcNzRcMVwwXDFcNzVcMVwwXDZcNzVcMlwwXDEyXDc1XDc2XDBcMlw3NSIrCi0gICAgIlw2XDBcMTJcNzVcMTNcMFwxXDc1XDFcMFwxXDc1XDFcMFwxXDc1XDRcMFwyXDc1IisKLSAgICAiXDEwXDc0XDFcMFw0MVw3NFw3XDBcMjRcNzVcMVwwXDZcNzVcNFwwXDZcNzVcMVwwIisKLSAgICAiXDFcNzVcMVwwXDI1XDc1XDNcMFw3XDc1XDFcMFwxXDc1XDM0NlwwXDQ2XDc0XDEyXDAiKwotICAgICJcNDdcNzRcMTFcMFwxXDc0XDFcMFwyXDc0XDFcMFwzXDc0XDFcMFwxXDc0XDFcMCIrCi0gICAgIlwyXDc0XDFcMFw1XDc0XDUxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwxM1wwIisKLSAgICAiXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcM1wwXDJcNzRcM1wwXDFcNzRcNVwwIisKLSAgICAiXDNcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcM1wwIisKLSAgICAiXDJcNzRcM1wwXDJcNzRcMVwwXDFcNzRcNTBcMFwxXDc0XDExXDBcMVw3NFwyXDAiKwotICAgICJcMVw3NFwyXDBcMlw3NFw3XDBcMlw3NFwxXDBcMVw3NFwxXDBcN1w3NFw1MFwwIisKLSAgICAiXDFcNzRcNFwwXDFcNzRcMTBcMFwxXDc0XHUwYzA2XDBcMjM0XDc0XDRcMFwxMzJcNzRcNlwwIisKLSAgICAiXDI2XDc0XDJcMFw2XDc0XDJcMFw0Nlw3NFwyXDBcNlw3NFwyXDBcMTBcNzRcMVwwIisKLSAgICAiXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMVwwXDM3XDc0XDJcMFw2NVw3NFwxXDAiKwotICAgICJcN1w3NFwxXDBcMVw3NFwzXDBcM1w3NFwxXDBcN1w3NFwzXDBcNFw3NFwyXDAiKwotICAgICJcNlw3NFw0XDBcMTVcNzRcNVwwXDNcNzRcMVwwXDdcNzRcMzIzXDBcMTVcNzVcNFwwIisKLSAgICAiXDFcNzVcMTA0XDBcMVw3NFwzXDBcMlw3NFwyXDBcMVw3NFwxMjFcMFwzXDc0XHUwZTgyXDAiKwotICAgICJcMVw3NVwxXDBcMVw3NFwzMVwwXDExXDc0XDZcNzVcMVwwXDVcNzVcMTNcMFwxMjRcNzQiKwotICAgICJcNFwwXDJcNzVcMlwwXDJcNzVcMlwwXDEzMlw3NFwxXDBcM1w3NVw2XDBcNTBcNzQiKwotICAgICJcdTFjZDNcMFx1NTFhNlw3NFx1MGM1YVwwXHUyYmE0XDc0XDEzNFwwXHUwODAwXDBcdTFmZmVcMFwyXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgNjgsICAgMTM2LCAgIDIwNCwgICAyNzIsICAgMzQwLCAgIDQwOCwgICA0NzYsICAgNTQ0LCAgIDYxMiwgCi0gICAgICA2ODAsICAgNzQ4LCAgIDgxNiwgICA4ODQsICAgOTUyLCAgMTAyMCwgIDEwODgsICAxMTU2LCAgMTIyNCwgIDEyOTIsIAotICAgICAxMzYwLCAgMTQyOCwgIDE0OTYsICAxNTY0LCAgMTYzMiwgIDE3MDAsICAxNzY4LCAgMTgzNiwgIDE5MDQsICAxOTcyLCAKLSAgICAgMjA0MCwgIDIxMDgsICAyMTc2LCAgMjI0NCwgIDIzMTIsICAyMzgwLCAgMjQ0OCwgIDI1MTYsICAyNTg0LCAgMjY1MiwgCi0gICAgIDI3MjAsICAyNzg4LCAgMjg1NiwgIDI5MjQsICAyOTkyLCAgMzA2MCwgIDMxMjgsICAzMTk2LCAgMzI2NCwgIDMzMzIsIAotICAgICAzNDAwLCAgMzQ2OCwgIDM1MzYsICAzNjA0LCAgMzY3MiwgIDM3NDAsICAzODA4LCAgMzg3NiwgIDM5NDQsICA0MDEyLCAKLSAgICAgNDA4MCwgIDQxNDgsICA0MjE2LCAgNDI4NCwgIDQzNTIsICA0Mjg0LCAgNDM1MiwgIDQ0MjAsICA0Mjg0LCAgNDI4NCwgCi0gICAgIDQzNTIsICA0NDg4LCAgNDU1NiwgIDQ2MjQsICA0NjkyLCAgNDc2MCwgIDQ4MjgsICA0ODk2LCAgNDI4NCwgIDQzNTIsIAotICAgICA0OTY0LCAgNTAzMiwgIDUxMDAsICA0Mjg0LCAgNTE2OCwgIDUxNjgsICA1MjM2LCAgNTMwNCwgIDUzNzIsICA0OTY0LCAKLSAgICAgNDI4NCwgIDU0NDAsICA1NTA4LCAgNDI4NCwgIDU1NzYsICA1NjQ0LCAgNTcxMiwgIDU3ODAsICA0Mjg0LCAgNDM1MiwgCi0gICAgIDU4NDgsICA1OTE2LCAgNTk4NCwgIDYwNTIsICA2MTIwLCAgNjE4OCwgIDQyODQsICA2MjU2LCAgNjI1NiwgIDYzMjQsIAotICAgICA2MzkyLCAgNjQ2MCwgIDY1MjgsICA2NTk2LCAgNDI4NCwgIDY2NjQsICA2NzMyLCAgNjgwMCwgIDY4NjgsICA2OTM2LCAKLSAgICAgNzAwNCwgIDQyODQsICA3MDcyLCAgNzE0MCwgIDcyMDgsICA3Mjc2LCAgNzM0NCwgIDc0MTIsICA3NDgwLCAgNzU0OCwgCi0gICAgIDQyODQsICA3NjE2LCAgNzY4NCwgIDc3NTIsICA3ODIwLCAgNzg4OCwgIDc5NTYsICA4MDI0LCAgODA5MiwgIDgwOTIsIAotICAgICA4MTYwLCAgODIyOCwgIDgyOTYsICA4MzY0LCAgODM2NCwgIDg0MzIsICA4NTAwLCAgODU2OCwgIDg2MzYsICA4NjM2LCAKLSAgICAgODcwNCwgIDg3NzIsICA4ODQwLCAgODkwOCwgIDQyODQsICA4OTc2LCAgODk3NiwgIDkwNDQsICA5MTEyLCAgOTE4MCwgCi0gICAgIDkyNDgsICA0Mjg0LCAgNDI4NCwgIDQzNTIsICA5MzE2LCAgNDI4NCwgIDQzNTIsICA5Mzg0LCAgOTQ1MiwgIDk1MjAsIAotICAgICA5NTg4LCAgNDI4NCwgIDk2NTYsICA5NzI0LCAgOTc5MiwgIDk4NjAsICA0Mjg0LCAgOTkyOCwgIDk5OTYsIDEwMDY0LCAKLSAgICAxMDEzMiwgIDQyODQsICA0Mjg0LCAxMDIwMCwgIDQyODQsIDEwMjY4LCAxMDMzNiwgMTAyNjgsIDEwNDA0LCAxMDQ3MiwgCi0gICAgMTA0MDQsICA0Mjg0LCAgNDI4NCwgMTA1NDAsIDEwNjA4LCAxMDY3NiwgIDQyODQsIDEwNzQ0LCAxMDgxMiwgMTA4ODAsIAotICAgIDEwOTQ4LCAxMTAxNiwgIDQyODQsICA0Mjg0LCAxMTA4NCwgIDQyODQsIDExMTUyLCAxMTIyMCwgMTExNTIsIDExMjg4LCAKLSAgICAxMTM1NiwgMTEyODgsICA0Mjg0LCAgNDI4NCwgMTE0MjQsIDExNDkyLCAxMTU2MCwgIDQyODQsIDExNjI4LCAxMTY5NiwgCi0gICAgMTE3NjQsICA0Mjg0LCAgNDI4NCwgMTE4MzIsIDExOTAwLCAxMTk2OCwgMTIwMzYsIDEyMTA0LCAgNDI4NCwgMTIxNzIsIAotICAgIDEyMjQwLCAxMjMwOCwgMTIzNzYsIDEyNDQ0LCAxMjUxMiwgMTI1ODAsIDEyNjQ4LCAxMjcxNiwgIDQyODQsIDEyNzg0LCAKLSAgICAxMjg1MiwgIDQyODQsICA0Mjg0LCAgNTE2OCwgIDUzMDQsICA0Mjg0LCAxMjkyMCwgIDUzNzIsIDEyOTg4LCAgNTQ0MCwgCi0gICAgIDU1NzYsICA1NjQ0LCAxMzA1NiwgIDU3MTIsICA0Mjg0LCAxMzEyNCwgMTMxOTIsICA1NzgwLCAxMzI2MCwgIDQyODQsIAotICAgIDExOTAwLCAgNDI4NCwgIDYyNTYsICA2MzI0LCAgNDI4NCwgMTMzMjgsICA2MzkyLCAxMzM5NiwgIDQyODQsIDEzNDY0LCAKLSAgICAxMzUzMiwgIDcwNzIsIDEzNjAwLCAgNzI3NiwgIDQyODQsIDEzNjY4LCAgNzM0NCwgMTM3MzYsIDEzODA0LCAxMzg3MiwgCi0gICAgMTM5NDAsIDE0MDA4LCAxNDA3NiwgIDc4MjAsICA0Mjg0LCAxNDE0NCwgMTQyMTIsICA4MDkyLCAgODE2MCwgIDQyODQsIAotICAgIDE0MjgwLCAxNDM0OCwgMTQ0MTYsIDE0NDg0LCAxNDU1MiwgIDgyOTYsICA4MDkyLCAgODM2NCwgIDg0MzIsICA0Mjg0LCAKLSAgICAgODUwMCwgIDg1NjgsICA4MzY0LCAgODYzNiwgIDg3MDQsICA0Mjg0LCAxNDYyMCwgMTQ2ODgsIDE0NzU2LCAxNDgyNCwgCi0gICAgMTQ4OTIsIDE0OTYwLCAxNTAyOCwgIDg5NzYsICA5MDQ0LCAgNDI4NCwgMTUwOTYsIDE1MTY0LCAxNTIzMiwgMTUzMDAsIAotICAgIDE1MzY4LCAxNTQzNiwgMTU1MDQsIDE1NTcyLCAxNTY0MCwgMTU3MDgsICA0Mjg0LCAgNDI4NCwgIDQyODQsIDE1Nzc2LCAKLSAgICAgNDI4NCwgIDQyODQsIDE1ODQ0LCAxNTkxMiwgMTU5ODAsIDE2MDQ4LCAxMDI2OCwgIDQyODQsIDE2MTE2LCAxNjE4NCwgCi0gICAgMTA0MDQsICA0Mjg0LCAxNjI1MiwgMTYzMjAsIDE2Mzg4LCAxNjQ1NiwgMTY1MjQsIDE2NTkyLCAxNjY2MCwgMTY3MjgsIAotICAgIDE2Nzk2LCAxMDk0OCwgMTExNTIsICA0Mjg0LCAxNjg2NCwgMTY5MzIsIDExMjg4LCAgNDI4NCwgMTcwMDAsIDE3MDY4LCAKLSAgICAxNzEzNiwgMTcyMDQsIDE3MjcyLCAxNzM0MCwgMTc0MDgsIDE3NDc2LCAxNzU0NCwgIDQyODQsICA0Mjg0LCAgNDI4NCwgCi0gICAgMTc2MTIsIDE3NjgwLCAxNzc0OCwgMTc4MTYsIDE3ODg0LCAgNDI4NCwgMTc5NTIsIDE4MDIwLCAgNDI4NCwgIDQyODQsIAotICAgICA0Mjg0LCAgNDI4NCwgIDQyODQsICA0NjkyLCAxODA4OCwgMTgxNTYsIDE4MjI0LCAxODI5MiwgMTgzNjAsIDE4NDI4LCAKLSAgICAxODM2MCwgMTg0OTYsIDE4NTY0LCAxODQ5NiwgMTg2MzIsIDE4NzAwLCAxODc2OCwgMTg4MzYsIDE4OTA0LCAxODk3MiwgCi0gICAgMTkwNDAsIDE5MDQwLCAxOTEwOCwgMTkxNzYsIDE5MTc2LCAgODg0MCwgIDg4NDAsIDE5MjQ0LCAxOTMxMiwgMTkzODAsIAotICAgIDE5MzgwLCAgOTE4MCwgIDkxODAsIDE5NDQ4LCAxOTUxNiwgMTk1ODQsIDE1OTgwLCAxMDA2NCwgMTAwNjQsIDE5NjUyLCAKLSAgICAxMDI2OCwgMTAyNjgsIDE5NzIwLCAxMDQwNCwgMTA0MDQsIDE5Nzg4LCAxMDU0MCwgMTA1NDAsIDE2NTI0LCAxOTg1NiwgCi0gICAgMTA3NDQsIDEwNzQ0LCAxNjcyOCwgMTk5MjQsIDEwOTQ4LCAxMDk0OCwgMTExNTIsIDExMTUyLCAxOTk5MiwgMTEyODgsIAotICAgIDExMjg4LCAyMDA2MCwgMTE0MjQsIDExNDI0LCAxNzI3MiwgMjAxMjgsIDExNjI4LCAxMTYyOCwgMTc0NzYsIDIwMTk2LCAKLSAgICAgNDI4NCwgIDQyODQsIDIwMjY0LCAyMDMzMiwgIDQyODQsIDIwNDAwLCAyMDQ2OCwgMjA1MzYsICA3MDcyLCAgNDI4NCwgCi0gICAgIDQyODQsIDIwNjA0LCAyMDY3MiwgMjA3NDAsIDIwODA4LCAyMDg3NiwgMTQ0ODQsIDE0ODI0LCAyMDk0NCwgMTUzMDAsIAotICAgIDIxMDEyLCAgNDI4NCwgIDQyODQsIDIxMDgwLCAyMTE0OCwgMjEyMTYsICA0Mjg0LCAyMTI4NCwgMjEzNTIsIDIxNDIwLCAKLSAgICAyMTQ4OCwgIDQyODQsIDIxNTU2LCAyMTYyNCwgMjE2OTIsIDIxNzYwLCAyMTgyOCwgMjE4OTYsIDIxOTY0LCAyMjAzMiwgCi0gICAgMjIxMDAsIDIyMTY4LCAyMjIzNiwgMjIzMDQsIDIyMzcyLCAyMjQ0MCwgMjI1MDgsIDIyNTc2LCAyMjY0NCwgMjI3MTIsIAotICAgIDIyNzgwLCAyMjg0OCwgMjI5MTYsICA0NjkyLCAyMjk4NCwgMjMwNTIsIDIzMTIwLCAyMzE4OCwgMjMyNTYsICA0Mjg0LCAKLSAgICAgNDI4NCwgMjMzMjQsIDIzMzkyLCAyMzQ2MCwgMjM1MjgsIDE2NTI0LCAxNjcyOCwgMjM1OTYsIDIzNjY0LCAxNzI3MiwgCi0gICAgMTc0NzYsIDIzNzMyLCAyMzgwMCwgMjM4NjgsICA0Mjg0LCAgNDI4NCwgIDQyODQsIDIzOTM2LCAyNDAwNCwgMjQwNzIsIAotICAgIDI0MTQwLCAyNDIwOCwgMjQyNzYsIDI0MzQ0LCAgNjgwMCwgMjQ0MTIsIDI0NDgwLCAyNDU0OCwgMjQ2MTYsIDI0Njg0LCAKLSAgICAyNDc1MiwgMjQ4MjAsICA0Mjg0LCAyNDg4OCwgIDg4NDAsICA5MTgwLCAxMDI2OCwgMTA0MDQsIDExMTUyLCAxMTI4OCwgCi0gICAgMjQ5NTYsIDI1MDI0LCAyNTA5MiwgMjUxNjAsIDI1MjI4LCAyNTI5NiwgMjUzNjQsIDI1NDMyLCAyNTUwMCwgMjU1NjgsIAotICAgIDI1NjM2LCAyNTcwNCwgMjU3NzIsIDI1ODQwLCAyNTkwOCwgMjU5NzYsIDI2MDQ0LCAyNjExMiwgMjYxODAsIDI2MjQ4LCAKLSAgICAyNjMxNiwgMjYzODQsIDI2NDUyLCAyNjUyMCwgMjY1ODgsIDI2NjU2LCAyNjcyNCwgMjY3OTIsIDI2ODYwLCAyNjkyOCwgCi0gICAgMjY5OTYsIDI3MDY0LCAyNzEzMiwgMjcyMDAsIDI3MjY4LCAyNzMzNiwgMjc0MDQsIDI3NDcyLCAyNzU0MCwgMjc2MDgsIAotICAgICA0Mjg0LCAyNzY3NiwgMjc3NDQsIDI3ODEyLCAyNzg4MCwgIDY4MDAsIDI3OTQ4LCAyODAxNiwgMjgwODQsIDI4MTUyLCAKLSAgICAyODIyMCwgMjgyODgsIDI4MzU2LCAyODQyNCwgMjg0OTIsIDI4NTYwLCAyODYyOCwgMjg2OTYsIDI4NzY0LCAyODgzMgotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNzJcMVw3M1wxMVw3MlwxXDc0XDFcNzJcMVw3NVw0XDcyXDFcNzYiKwotICAgICJcNDBcNzJcMVw3N1wyMFw3MlwxXDEwMFwxXDEwMVwxMDJcMTAwXDFcMTAyXDFcMTAzIisKLSAgICAiXDIxXDEwMlwxXDEwNFwyXDEwMlwxXDEwNVw1NVwxMDJcMVwxMDZcMVwxMDdcMTAyXDEwNiIrCi0gICAgIlwxXDEwMlwxXDEwM1w1XDEwMlwxXDExMFwxNlwxMDJcMVwxMDVcNTZcMTAyXDFcMTAzIisKLSAgICAiXDJcMTAyXDFcMTExXDFcMTEyXDJcMTAyXDJcMTEzXDVcMTAyXDFcMTEyXDZcMTAyIisKLSAgICAiXDFcMTEyXDJcMTE0XDNcMTEzXDFcMTAyXDEwXDExM1wxXDExNVwyXDExM1wxXDEwMiIrCi0gICAgIlwxMFwxMTNcMVwxMTVcMVwxMTNcMVwxMDJcNFwxMTNcMVwxMDJcNFwxMTNcMVwxMDIiKwotICAgICJcNFwxMTNcM1wxMDJcMVwxMDNcMlwxMDJcMVwxMTFcMVwxMTZcMTFcMTAyXDFcMTE2IisKLSAgICAiXDZcMTAyXDFcMTE2XDU1XDEwMlwxXDExN1wxXDEyMFwyXDExN1wxXDEyMVwyMVwxMTciKwotICAgICJcMVwxMDVcNTVcMTE3XDFcMTAyXDFcMTAzXDJcMTAyXDFcMTIyXDFcMTEyXDJcMTAyIisKLSAgICAiXDJcMTIzXDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyXDVcMTIzXDFcMTAyXDEzXDEyMyIrCi0gICAgIlwxXDEwMlwxMlwxMjNcMVwxMDJcNFwxMjNcMVwxMDJcNFwxMjNcMVwxMDJcNFwxMjMiKwotICAgICJcM1wxMDJcMVwxMDNcMlwxMDJcMVwxMjJcMVwxMTJcMlwxMDJcMlwxMjNcNVwxMDIiKwotICAgICJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMjNcMVwxMDJcMTNcMTIzXDFcMTI0XDEyXDEyMyIrCi0gICAgIlwxXDEwMlw0XDEyM1wxXDEwMlw0XDEyM1wxXDEwMlw0XDEyM1wyXDEwMlwxXDEyNSIrCi0gICAgIlwxXDEwM1wxXDEwMlwxXDEyNlwxXDEyN1wxXDExMlw0XDEyNVwxXDEzMFwxXDEyNSIrCi0gICAgIlwxXDEzMVwyXDEyNVwxXDExMlw2XDEyNVwxXDExMlw1NVwxMjVcMVwxMDJcMVwxMDMiKwotICAgICJcMlwxMDJcMVwxMzJcMjFcMTAyXDFcMTA1XDU2XDEwMlwxXDEwM1wxXDEzM1wxXDEzNCIrCi0gICAgIlwxXDEwMlwxXDExMlwyXDEwMlwyXDEzNVw1XDEwMlwxXDExMlw2XDEwMlwxXDExMiIrCi0gICAgIlw1XDEzNVwxXDEwMlwxM1wxMzVcMVwxMDJcMTJcMTM1XDFcMTAyXDRcMTM1XDFcMTAyIisKLSAgICAiXDRcMTM1XDFcMTAyXDRcMTM1XDNcMTAyXDFcMTAzXDFcMTMzXDFcMTM0XDFcMTAyIisKLSAgICAiXDFcMTEyXDJcMTAyXDJcMTM1XDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyXDVcMTM1IisKLSAgICAiXDFcMTAyXDEzXDEzNVwxXDEzNlwxMlwxMzVcMVwxMDJcNFwxMzVcMVwxMDJcNFwxMzUiKwotICAgICJcMVwxMDJcNFwxMzVcMlwxMDJcMVwxMzdcMVwxMDNcMVwxMzNcMVwxNDBcMVwxMzciKwotICAgICJcMVwxMTJcNFwxMzdcMVwxNDFcMVwxMzdcMVwxNDJcMlwxMzdcMVwxMTJcNlwxMzciKwotICAgICJcMVwxMTJcNTVcMTM3XDFcMTAyXDFcMTAzXDNcMTAyXDFcMTEyXDExXDEwMlwxXDExMiIrCi0gICAgIlw2XDEwMlwxXDExMlw1NVwxMDJcMVwxNDNcMVwxNDRcMjBcMTQzXDFcMTQ1XDNcMTQzIisKLSAgICAiXDFcMTA1XDU1XDE0M1wxXDEwMlwxXDE0NlwzXDEwMlwxXDExMlwyXDEwMlwyXDE0NyIrCi0gICAgIlw1XDEwMlwxXDExMlwyXDEwMlwxXDE1MFwzXDEwMlwxXDExMlw1XDE0N1wxXDEwMiIrCi0gICAgIlwxM1wxNDdcMVwxMDJcMTJcMTQ3XDFcMTAyXDRcMTQ3XDFcMTAyXDRcMTQ3XDFcMTAyIisKLSAgICAiXDRcMTQ3XDNcMTAyXDFcMTQ2XDNcMTAyXDFcMTUxXDExXDEwMlwxXDE1MVwyXDEwMiIrCi0gICAgIlwxXDE1MFwzXDEwMlwxXDE1MVw1NlwxMDJcMVwxNDZcM1wxMDJcMVwxMTJcMlwxMDIiKwotICAgICJcMlwxNTJcNVwxMDJcMVwxMTJcMlwxMDJcMVwxNTBcM1wxMDJcMVwxMTJcNVwxNTIiKwotICAgICJcMVwxMDJcMTNcMTUyXDFcMTAyXDEyXDE1MlwxXDEwMlw0XDE1MlwxXDEwMlw0XDE1MiIrCi0gICAgIlwxXDEwMlw0XDE1MlwzXDEwMlwxXDE0NlwzXDEwMlwxXDExMlwyXDEwMlwyXDE1MiIrCi0gICAgIlw1XDEwMlwxXDExMlwyXDEwMlwxXDE1MFwzXDEwMlwxXDExMlw1XDE1MlwxXDEwMiIrCi0gICAgIlwxM1wxNTJcMVwxNTNcMTJcMTUyXDFcMTAyXDRcMTUyXDFcMTAyXDRcMTUyXDFcMTAyIisKLSAgICAiXDRcMTUyXDJcMTAyXDFcMTU0XDFcMTQ2XDFcMTAyXDFcMTU1XDFcMTU0XDFcMTEyIisKLSAgICAiXDRcMTU0XDFcMTU2XDFcMTU0XDFcMTU3XDJcMTU0XDFcMTEyXDJcMTU0XDFcMTYwIisKLSAgICAiXDNcMTU0XDFcMTEyXDU1XDE1NFwxXDE2MVwxXDE2MlwxXDE2M1wxXDE2NFw0XDE2MSIrCi0gICAgIlwyXDE2NVwxNVwxNjFcNVwxNjZcMVwxNjFcMTNcMTY2XDFcMTYxXDEyXDE2NlwxXDE2MSIrCi0gICAgIlw0XDE2NlwxXDE2MVw0XDE2NlwxXDE2MVwxXDE2N1wzXDE2NlwyXDE2MVwxXDEwMiIrCi0gICAgIlwxXDE3MFwxXDE2M1wxXDE2NFwxXDEwMlwxXDExMlwyXDEwMlwyXDE3MVw1XDEwMiIrCi0gICAgIlwxXDExMlw2XDEwMlwxXDExMlw1XDE3MVwxXDEwMlwxM1wxNzFcMVwxMDJcMTJcMTcxIisKLSAgICAiXDFcMTAyXDRcMTcxXDFcMTAyXDRcMTcxXDFcMTAyXDRcMTcxXDNcMTAyXDFcMTcwIisKLSAgICAiXDFcMTYzXDFcMTY0XDFcMTAyXDFcMTEyXDJcMTAyXDJcMTcxXDVcMTAyXDFcMTEyIisKLSAgICAiXDZcMTAyXDFcMTEyXDVcMTcxXDFcMTAyXDEzXDE3MVwxXDE3MlwxMlwxNzFcMVwxMDIiKwotICAgICJcNFwxNzFcMVwxMDJcNFwxNzFcMVwxMDJcNFwxNzFcMlwxMDJcMVwxNzNcMVwxNzQiKwotICAgICJcMVwxNjNcMVwxNzVcMVwxNzNcMVwxMTJcNFwxNzNcMVwxNzZcMVwxNzNcMVwxNzciKwotICAgICJcMVwyMDBcMVwxNzNcMVwxMTJcNlwxNzNcMVwxMTJcMzRcMTczXDFcMjAxXDIwXDE3MyIrCi0gICAgIlwxXDEwMlwxXDIwMlwxXDIwM1wyXDEwMlwxXDExMlwxMVwxMDJcMVwxMTJcNlwxMDIiKwotICAgICJcMVwxMTJcN1wxMDJcMVwyMDRcMVwyMDVcMlwxMDJcMVwyMDZcMTFcMTAyXDFcMjA2IisKLSAgICAiXDFcMTAyXDFcMjA1XDFcMjA0XDI1XDEwMlwxXDEwM1wxXDIwM1wyXDEwMlwxXDExMiIrCi0gICAgIlwxMVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMDJcMVwyMDdcNTBcMTAyXDFcMTAzIisKLSAgICAiXDFcMjAzXDJcMTAyXDFcMTEyXDJcMTAyXDJcMjEwXDVcMTAyXDFcMTEyXDZcMTAyIisKLSAgICAiXDFcMTEyXDVcMjEwXDFcMjA3XDEzXDIxMFwxXDEwMlwxMlwyMTBcMVwxMDJcNFwyMTAiKwotICAgICJcMVwxMDJcNFwyMTBcMVwxMDJcNFwyMTBcM1wxMDJcMVwxMDNcMVwyMDNcMlwxMDIiKwotICAgICJcMVwxMTJcMTFcMTAyXDFcMTEyXDZcMTAyXDFcMTEyXDVcMTAyXDFcMjA3XDdcMTAyIisKLSAgICAiXDFcMjExXDZcMTAyXDFcMjEyXDEwXDEwMlwxXDIxMVwxMlwxMDJcMVwyMTJcNFwxMDIiKwotICAgICJcMVwyMTNcMVwxMDNcMVwyMDNcMVwyMTRcMVwyMTNcMVwxMTJcNFwyMTNcMVwyMTUiKwotICAgICJcMVwyMTNcMVwyMTZcMlwyMTNcMVwxMTJcNlwyMTNcMVwxMTJcNVwyMTNcMVwyMTciKwotICAgICJcNDdcMjEzXDFcMjIwXDFcMTAzXDFcMjAzXDFcMjIxXDFcMjIwXDFcMTEyXDRcMjIwIisKLSAgICAiXDFcMjIyXDFcMjIwXDFcMjIzXDJcMjIwXDFcMTEyXDZcMjIwXDFcMTEyXDVcMjIwIisKLSAgICAiXDFcMjI0XDQ3XDIyMFwxXDIyNVwxXDEwM1wxXDIwM1wxXDIyNlwxXDIyNVwxXDExMiIrCi0gICAgIlw0XDIyNVwxXDIyN1wxXDIyNVwxXDIzMFwyXDIyNVwxXDExMlw2XDIyNVwxXDExMiIrCi0gICAgIlw1NVwyMjVcMVwyMzFcMVwyMzJcMVwyMzNcMTAxXDIzMVwxXDIzNFwxXDEwM1wxXDIwMyIrCi0gICAgIlwxXDIzNVwxXDIzNFwxXDExMlw0XDIzNFwxXDIzNlwxXDIzNFwxXDIzN1wyXDIzNCIrCi0gICAgIlwxXDExMlw2XDIzNFwxXDExMlw1NVwyMzRcMVwyNDBcMVwyNDFcMVwyNDJcMTAxXDI0MCIrCi0gICAgIlwxXDI0M1wxXDI0NFwxMDJcMjQzXDFcMTAyXDFcMjQ1XDI0XDEwMlwxXDEwNVw1NVwxMDIiKwotICAgICJcMVwyNDZcMVwyNDdcMTAyXDI0NlwxXDEwMlwxXDEwM1w1XDEwMlwxXDI1MFwxNlwxMDIiKwotICAgICJcMVwxMDVcNTVcMTAyXDFcMjUxXDFcMjUyXDNcMjUxXDFcMjUzXDZcMjUxXDFcMjU0IisKLSAgICAiXDFcMjU1XDFcMjUxXDFcMjUzXDZcMjUxXDFcMjUzXDM0XDI1MVwxXDI1NlwyMFwyNTEiKwotICAgICJcMVwyNTdcMVwyNTJcM1wyNTdcMVwyNjBcNFwyNTdcMVwyNjFcMlwyNTdcMVwyNjIiKwotICAgICJcMVwyNTdcMVwyNjBcNlwyNTdcMVwyNjBcMzRcMjU3XDFcMjYzXDIwXDI1N1wxXDEwMiIrCi0gICAgIlwxXDEwM1wyNFwxMDJcMVwxMDVcNTVcMTAyXDFcMjY0XDFcMjY1XDEwXDI2NFwxXDI2NiIrCi0gICAgIlwxXDI2NFwxXDI2N1wxXDI3MFw2NVwyNjRcMVwyNzFcMVwyNzJcMVwyNzNcMTJcMjcyIisKLSAgICAiXDFcMTAyXDExXDI3MlwxXDI3NFw1NVwyNzJcMVwyNzVcMVwyNzZcMTBcMjc1XDFcMTAyIisKLSAgICAiXDEzXDI3NVwxXDI3N1w1NVwyNzVcMVwxMDJcMVwxMDNcMTJcMTAyXDFcMzAwXDExXDEwMiIrCi0gICAgIlwxXDEwNVw1NlwxMDJcMVwxMDNcMTBcMTAyXDFcMzAxXDEzXDEwMlwxXDEwNVw1NVwxMDIiKwotICAgICJcMVwzMDJcMVwzMDNcMTBcMzAyXDFcMjYxXDY3XDMwMlwxXDMwNFwxXDMwNVwxXDMwNiIrCi0gICAgIlwxXDMwN1wxMlwzMDZcMVwyNTRcNjVcMzA2XDFcMzEwXDFcMzA1XDFcMzExXDFcMzEyIisKLSAgICAiXDEwXDMxMVwxXDMxM1wxXDMxMVwxXDMxNFw0NlwzMTFcMVwzMTVcMTdcMzExXDFcMzE2IisKLSAgICAiXDFcMzE3XDFcMzIwXDEyXDMxN1wxXDEwMlwxMVwzMTdcMVwzMjFcNTVcMzE3XDFcMzIyIisKLSAgICAiXDFcMzIzXDEwXDMyMlwxXDEwMlwxM1wzMjJcMVwzMjRcNTVcMzIyXDFcMTAyXDFcMTAzIisKLSAgICAiXDEyXDEwMlwxXDMyNVwxMVwxMDJcMVwxMDVcNTZcMTAyXDFcMTAzXDEwXDEwMlwxXDMyNiIrCi0gICAgIlwxM1wxMDJcMVwxMDVcNTVcMTAyXDFcMzI3XDFcMzMwXDEwXDMyN1wxXDI2MVw2N1wzMjciKwotICAgICJcMVwzMzFcMVwzMzJcMVwzMzNcMVwzMzRcMTJcMzMzXDFcMjU0XDY1XDMzM1wxXDMzNSIrCi0gICAgIlwxXDMzMlwxXDcyXDFcMFwxMVw3MlwxXDBcMVw3MlwxXDBcNFw3MiIrCi0gICAgIlwxXDBcNDBcNzJcMVwwXDIwXDcyXDNcMFwxXDMzNlwxXDMzN1wxNVwwIisKLSAgICAiXDFcMzQwXDJcMFwxXDM0MVw2M1wwXDFcMzQyXDJcMFwyXDM0M1w1XDAiKwotICAgICJcMVwzNDJcNlwwXDFcMzQyXDVcMzQzXDFcMFwxM1wzNDNcMVwwXDEyXDM0MyIrCi0gICAgIlwxXDM0NFw0XDM0M1wxXDBcNFwzNDNcMVwwXDRcMzQzXDJcMFwxXDM0NSIrCi0gICAgIlwxXDBcMTFcMzQ1XDFcMFwxXDM0NVwxXDM0NlwxXDM0N1wzXDM0NVwxXDAiKwotICAgICJcNjFcMzQ1XDVcMFwxXDM0MlwyXDBcMlwzNTBcNVwwXDFcMzQyXDZcMCIrCi0gICAgIlwxXDM0Mlw1XDM1MFwxXDBcMTNcMzUwXDFcMFwxMlwzNTBcMVwwXDRcMzUwIisKLSAgICAiXDFcMFw0XDM1MFwxXDBcNFwzNTBcMlwwXDFcMzQ1XDFcMFwxMVwzNDUiKwotICAgICJcMVwwXDJcMzQ1XDFcMzUxXDNcMzQ1XDFcMFw0MFwzNDVcMVwzNTJcMjBcMzQ1IisKLSAgICAiXDEyNlwwXDFcMzUzXDJcMFwxXDM1NFwxMDFcMFwxXDM1NVw2N1wwXDFcMzU2IisKLSAgICAiXDc2XDBcMVwzNTdcMTA2XDBcMVwxMTJcMTFcMFwxXDExMlw2XDBcMVwxMTIiKwotICAgICJcNjNcMFw0XDExM1w2XDBcMVwxMTNcNlwwXDVcMTEzXDFcMFwxM1wxMTMiKwotICAgICJcMVwwXDEyXDExM1wxXDBcNFwxMTNcMVwwXDExXDExM1wxMFwwXDRcMTEzIisKLSAgICAiXDZcMFwxXDExM1w2XDBcMlwxMTNcMVwzNjBcMlwxMTNcMVwwXDEzXDExMyIrCi0gICAgIlwxXDBcMTJcMTEzXDFcMFw0XDExM1wxXDBcMTFcMTEzXDEwXDBcNFwxMTMiKwotICAgICJcNlwwXDFcMTEzXDZcMFwyXDExM1wxXDM2MVwyXDExM1wxXDBcMTNcMTEzIisKLSAgICAiXDFcMFwxMlwxMTNcMVwwXDRcMTEzXDFcMFwxMVwxMTNcN1wwXDFcMTE2IisKLSAgICAiXDExXDBcMVwxMTZcNlwwXDFcMTE2XDU3XDBcMVwzNjJcMTAzXDBcMVwzNjMiKwotICAgICJcMTA3XDBcNFwxMjNcNlwwXDFcMTIzXDZcMFw1XDEyM1wxXDBcMTNcMTIzIisKLSAgICAiXDFcMFwxMlwxMjNcMVwwXDRcMTIzXDFcMFwxMVwxMjNcMlwwXDFcMTI1IisKLSAgICAiXDJcMFwxXDM2NFwxXDEyNVwxXDBcNFwxMjVcMVwwXDFcMTI1XDFcMCIrCi0gICAgIlwyXDEyNVwxXDBcNlwxMjVcMVwwXDU2XDEyNVwxXDBcMVwzNjNcMVwzNjQiKwotICAgICJcMVwxMjVcMVwwXDRcMTI1XDFcMFwxXDEyNVwxXDBcMlwxMjVcMVwwIisKLSAgICAiXDZcMTI1XDFcMFw1NVwxMjVcMVwzNjVcMVwwXDEwXDM2NVwxXDM2NlwyXDM2NSIrCi0gICAgIlwxXDM2N1w0NVwzNjVcMVwzNjdcMjBcMzY1XDFcMzcwXDFcMFwxMlwzNzBcMVwzNjYiKwotICAgICJcMVwzNzFcNDVcMzcwXDFcMzcxXDIwXDM3MFwyXDBcMVwxMzNcMVwzNzJcMTA2XDAiKwotICAgICJcNFwxMzVcNlwwXDFcMTM1XDZcMFw1XDEzNVwxXDBcMTNcMTM1XDFcMCIrCi0gICAgIlwxMlwxMzVcMVwwXDRcMTM1XDFcMFwxMVwxMzVcMlwwXDFcMTM3XDJcMCIrCi0gICAgIlwxXDM3M1wxXDEzN1wxXDBcNFwxMzdcMVwwXDFcMTM3XDFcMFwyXDEzNyIrCi0gICAgIlwxXDBcNlwxMzdcMVwwXDU2XDEzN1wxXDBcMVwxMzNcMVwzNzRcMVwxMzciKwotICAgICJcMVwwXDRcMTM3XDFcMFwxXDEzN1wxXDBcMlwxMzdcMVwwXDZcMTM3IisKLSAgICAiXDFcMFw1NVwxMzdcMVwxNDFcMVwwXDFcMzc1XDFcMzc2XDFcMTQxXDFcMzc1IisKLSAgICAiXDRcMTQxXDFcMzc3XDFcMTQxXDFcMzc1XDFcdTAxMDBcMVwxNDFcMVwzNzVcNlwxNDEiKwotICAgICJcMVwzNzVcMzRcMTQxXDFcdTAxMDBcMjBcMTQxXDFcMTQyXDFcMFwxXHUwMTAxXDFcdTAxMDIiKwotICAgICJcMVwxNDJcMVx1MDEwMVw0XDE0MlwxXHUwMTAxXDFcMTQyXDFcMzc3XDFcdTAxMDNcMVwxNDIiKwotICAgICJcMVx1MDEwMVw2XDE0MlwxXHUwMTAxXDM0XDE0MlwxXHUwMTAzXDIwXDE0MlwyXDBcMVx1MDEwNCIrCi0gICAgIlwxMjNcMFwxXDM1M1wyXDBcMVx1MDEwNVw2NFwwXDRcMTQ3XDZcMFwxXDE0NyIrCi0gICAgIlw2XDBcNVwxNDdcMVwwXDEzXDE0N1wxXDBcMTJcMTQ3XDFcMFw0XDE0NyIrCi0gICAgIlwxXDBcMTFcMTQ3XDRcMFwxXHUwMTA2XDEwNlwwXDFcMTUxXDExXDBcMVwxNTEiKwotICAgICJcNlwwXDFcMTUxXDYzXDBcNFwxNTJcNlwwXDFcMTUyXDZcMFw1XDE1MiIrCi0gICAgIlwxXDBcMTNcMTUyXDFcMFwxMlwxNTJcMVwwXDRcMTUyXDFcMFwxMVwxNTIiKwotICAgICJcMlwwXDFcMTU0XDJcMFwxXHUwMTA3XDFcMTU0XDFcMFw0XDE1NFwxXDAiKwotICAgICJcMVwxNTRcMVwwXDJcMTU0XDFcMFw2XDE1NFwxXDBcNTVcMTU0XDFcdTAxMDgiKwotICAgICJcMVwwXDEwXHUwMTA4XDFcdTAxMDlcMlx1MDEwOFwxXHUwMTBhXDQ1XHUwMTA4XDFcdTAxMGFcMjBcdTAxMDgiKwotICAgICJcMVx1MDEwYlwxXDBcMTJcdTAxMGJcMVx1MDEwOVwxXHUwMTBjXDQ1XHUwMTBiXDFcdTAxMGNcMjBcdTAxMGIiKwotICAgICJcMVwxNTRcMVwwXDFcdTAxMDZcMVx1MDEwN1wxXDE1NFwxXDBcNFwxNTRcMVwwIisKLSAgICAiXDFcMTU0XDFcMFwyXDE1NFwxXDBcNlwxNTRcMVwwXDU1XDE1NFwxXDE2MSIrCi0gICAgIlwzXDBcMjNcMTYxXDVcMFwxXDE2MVwxM1wwXDFcMTYxXDEyXDBcMVwxNjEiKwotICAgICJcNFwwXDFcMTYxXDRcMFwxXDE2MVw0XDBcMlwxNjFcM1wwXDFcMzM2IisKLSAgICAiXDE2XDBcMVwzNTNcMlwwXDFcMzQxXDYwXDBcMVx1MDEwZFwxMDFcMFwxXDE2MSIrCi0gICAgIlwzXDBcMlwxNjFcNFwxNjVcNlwxNjFcMVwxNjVcNlwxNjFcNVwxNjZcMVwxNjEiKwotICAgICJcMTNcMTY2XDFcMTYxXDEyXDE2NlwxXDE2MVw0XDE2NlwxXDE2MVw0XDE2NlwxXDE2NSIrCi0gICAgIlw0XDE2NlwyXDE2MVw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjYiKwotICAgICJcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFw3XDE2NiIrCi0gICAgIlwxXHUwMTBlXDNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjYiKwotICAgICJcNVwwXDFcMzM2XDRcMFwyXHUwMTBmXDEwXDBcMVwzNTNcMlwwXDFcMzQxIisKLSAgICAiXDFcMFw1XHUwMTBmXDFcMFwxM1x1MDEwZlwxXDBcMTJcdTAxMGZcMVwwXDRcdTAxMGYiKwotICAgICJcMVwwXDRcdTAxMGZcMVwwXDRcdTAxMGZcMTBcMFw0XDE3MVw2XDBcMVwxNzEiKwotICAgICJcNlwwXDVcMTcxXDFcMFwxM1wxNzFcMVwwXDEyXDE3MVwxXDBcNFwxNzEiKwotICAgICJcMVwwXDExXDE3MVwyXDBcMVwxNzNcMlwwXDFcdTAxMTBcMVwxNzNcMVwwIisKLSAgICAiXDRcMTczXDFcMFwxXDE3M1wxXDBcMlwxNzNcMVwwXDZcMTczXDFcMCIrCi0gICAgIlw1NVwxNzNcM1wwXDFcMzM2XDRcMFwyXHUwMTExXDEwXDBcMVwzNTNcMlwwIisKLSAgICAiXDFcMzQxXDFcMFw1XHUwMTExXDFcMFwxM1x1MDExMVwxXDBcMTJcdTAxMTFcMVwwIisKLSAgICAiXDRcdTAxMTFcMVwwXDRcdTAxMTFcMVwwXDRcdTAxMTFcMlwwXDFcMTczXDFcMCIrCi0gICAgIlwxXHUwMTBkXDFcdTAxMTBcMVwxNzNcMVwwXDRcMTczXDFcMFwxXDE3M1wxXDAiKwotICAgICJcMlwxNzNcMVwwXDZcMTczXDFcMFw1NVwxNzNcMVx1MDExMlwxXDBcMTBcdTAxMTIiKwotICAgICJcMVx1MDExM1wyXHUwMTEyXDFcdTAxMTRcNDVcdTAxMTJcMVx1MDExNFwyMFx1MDExMlwxXHUwMTE1XDFcMCIrCi0gICAgIlwxMlx1MDExNVwxXHUwMTEzXDFcdTAxMTZcNDVcdTAxMTVcMVx1MDExNlwyMFx1MDExNVwxXDE3M1wyXDAiKwotICAgICJcMVx1MDExMFwxXDE3M1wxXDBcNFwxNzNcMVwwXDFcMTczXDFcMFwxXDE3MyIrCi0gICAgIlwxXHUwMTE3XDFcMFw2XDE3M1wxXDBcNTZcMTczXDJcMFwxXHUwMTEwXDFcMTczIisKLSAgICAiXDFcMFw0XDE3M1wxXDBcMVwxNzNcMVwwXDFcMTczXDFcdTAxMThcMVwwIisKLSAgICAiXDZcMTczXDFcMFw1NVwxNzNcM1wwXDFcMzM2XDE2XDBcMVwzNTNcMlwwIisKLSAgICAiXDFcdTAxMDVcMTI0XDBcMVx1MDExOVwyXDBcMVx1MDExOVw3MlwwXDFcdTAxMWFcMTRcMCIrCi0gICAgIlwxXHUwMTFhXDYwXDBcMlx1MDExYlw1MFwwXDIzXHUwMTFjXDFcdTAxMWRcNjBcdTAxMWNcNlwwIisKLSAgICAiXDRcMjEwXDZcMFwxXDIxMFw2XDBcNVwyMTBcMVwwXDEzXDIxMFwxXDAiKwotICAgICJcMTJcMjEwXDFcMFw0XDIxMFwxXDBcMTFcMjEwXDU0XDBcMVx1MDExZVwxMjBcMCIrCi0gICAgIlwxXHUwMTFmXDEwXDBcMVx1MDExZlwzXDBcMVwyMTNcMlwwXDFcdTAxMjBcMVwyMTMiKwotICAgICJcMVwwXDRcMjEzXDFcMFwxXDIxM1wxXDBcMlwyMTNcMVwwXDZcMjEzIisKLSAgICAiXDFcMFw1NVwyMTNcMVx1MDEyMVwxXDBcMTBcdTAxMjFcMVx1MDEyMlwyXHUwMTIxXDFcdTAxMjMiKwotICAgICJcNDVcdTAxMjFcMVx1MDEyM1wyMFx1MDEyMVwxXHUwMTI0XDFcMFwxXHUwMTI0XDJcdTAxMjVcMVx1MDEyNCIrCi0gICAgIlw0XHUwMTI1XDJcdTAxMjRcMVx1MDEyNlwxXHUwMTI3XDFcdTAxMjRcNFx1MDEyNVwxXHUwMTI0XDEwXHUwMTI1IisKLSAgICAiXDFcdTAxMjRcMjZcdTAxMjVcMVx1MDEyN1wxMFx1MDEyNVwyXHUwMTI0XDRcdTAxMjVcMlx1MDEyNFwxXDIxNyIrCi0gICAgIlwyXHUwMTFjXDFcdTAxMjhcMVwyMTdcMVx1MDExY1w0XDIxN1wxXHUwMTFjXDFcMjE3XDFcdTAxMWMiKwotICAgICJcMlwyMTdcMVx1MDExY1wzXDIxN1wxXHUwMTI5XDJcMjE3XDFcdTAxMWNcNTVcMjE3XDFcMjIwIisKLSAgICAiXDJcMFwxXHUwMTJhXDFcMjIwXDFcMFw0XDIyMFwxXDBcMVwyMjBcMVwwIisKLSAgICAiXDJcMjIwXDFcMFw2XDIyMFwxXDBcNTVcMjIwXDEyXHUwMTJiXDFcdTAxMmNcNzFcdTAxMmIiKwotICAgICJcMTRcdTAxMmRcMVx1MDEyY1w2N1x1MDEyZFwxXDIyNFwyXHUwMTFjXDFcdTAxMmVcMVwyMjRcMVx1MDExYyIrCi0gICAgIlw0XDIyNFwxXHUwMTFjXDFcMjI0XDFcdTAxMWNcMlwyMjRcMVx1MDExY1wzXDIyNFwxXHUwMTJmIisKLSAgICAiXDJcMjI0XDFcdTAxMWNcNTVcMjI0XDFcMjI1XDJcMFwxXHUwMTMwXDFcMjI1XDFcMCIrCi0gICAgIlw0XDIyNVwxXDBcMVwyMjVcMVwwXDJcMjI1XDFcMFw2XDIyNVwxXDAiKwotICAgICJcNTVcMjI1XDFcdTAxMzFcMVwwXDEwXHUwMTMxXDFcdTAxMzJcMlx1MDEzMVwxXHUwMTMzXDQ1XHUwMTMxIisKLSAgICAiXDFcdTAxMzNcMjBcdTAxMzFcMVx1MDEzNFwxXDBcMVx1MDEzNFwyXHUwMTM1XDFcdTAxMzRcNFx1MDEzNSIrCi0gICAgIlwyXHUwMTM0XDFcdTAxMzZcMVx1MDEzN1wxXHUwMTM0XDRcdTAxMzVcMVx1MDEzNFwxMFx1MDEzNVwxXHUwMTM0IisKLSAgICAiXDI2XHUwMTM1XDFcdTAxMzdcMTBcdTAxMzVcMlx1MDEzNFw0XHUwMTM1XDJcdTAxMzRcMlwyMzFcMVwwIisKLSAgICAiXDEwM1wyMzFcMVwwXDE3XDIzMVwxXHUwMTM4XDJcMjMxXDFcdTAxMzlcNTZcMjMxXDFcMjM0IisKLSAgICAiXDJcMFwxXHUwMTNhXDFcMjM0XDFcMFw0XDIzNFwxXDBcMVwyMzRcMVwwIisKLSAgICAiXDJcMjM0XDFcMFw2XDIzNFwxXDBcNTVcMjM0XDFcdTAxM2JcMVwwXDEwXHUwMTNiIisKLSAgICAiXDFcdTAxM2NcMlx1MDEzYlwxXHUwMTNkXDQ1XHUwMTNiXDFcdTAxM2RcMjBcdTAxM2JcMVx1MDEzZVwxXDAiKwotICAgICJcMVx1MDEzZVwyXHUwMTNmXDFcdTAxM2VcNFx1MDEzZlwyXHUwMTNlXDFcdTAxNDBcMVx1MDE0MVwxXHUwMTNlIisKLSAgICAiXDRcdTAxM2ZcMVx1MDEzZVwxMFx1MDEzZlwxXHUwMTNlXDI2XHUwMTNmXDFcdTAxNDFcMTBcdTAxM2ZcMlx1MDEzZSIrCi0gICAgIlw0XHUwMTNmXDJcdTAxM2VcMlwyNDBcMVwwXDEwM1wyNDBcMVwwXDE3XDI0MFwxXHUwMTQyIisKLSAgICAiXDJcMjQwXDFcdTAxNDNcNTZcMjQwXDIyXDBcMVx1MDE0NFwyXDBcMVwzNTRcNjVcMCIrCi0gICAgIlwxXHUwMTQ1XDc0XDBcMVwyNTFcMVwwXDEyXDI1MVwxXDBcMVx1MDE0Nlw0NVwyNTEiKwotICAgICJcMVx1MDE0NlwyMFwyNTFcM1wwXDFcdTAxNDdcMTZcMFwxXDM1M1wyXDBcMVwzNTQiKwotICAgICJcNTZcMFwxXDI1MVwxXDBcM1wyNTFcMVwyNTNcNlwyNTFcMVwwXDFcdTAxNDYiKwotICAgICJcMVwyNTFcMVwyNTNcNlwyNTFcMVwyNTNcMzRcMjUxXDFcdTAxNDZcMzZcMjUxXDFcdTAxNDgiKwotICAgICJcMTAzXDI1MVwxXHUwMTQ5XDY1XDI1MVwxXDI1N1wxXDBcMTBcMjU3XDFcMFwyXDI1NyIrCi0gICAgIlwxXHUwMTRhXDQ1XDI1N1wxXHUwMTRhXDIxXDI1N1wxXDBcM1wyNTdcMVwyNjBcNFwyNTciKwotICAgICJcMVwwXDJcMjU3XDFcdTAxNGFcMVwyNTdcMVwyNjBcNlwyNTdcMVwyNjBcMzRcMjU3IisKLSAgICAiXDFcdTAxNGFcMzZcMjU3XDFcdTAxNGJcMTAzXDI1N1wxXHUwMTRjXDY1XDI1N1wxMlwyNjRcMVwwIisKLSAgICAiXDFcMjY0XDFcMFwxXHUwMTRkXDY1XDI2NFwxXDBcMTJcMjY0XDFcMFwxXDI2NCIrCi0gICAgIlwxXDBcMVx1MDE0ZFw0XDI2NFwxXHUwMTRlXDYwXDI2NFwxXDBcMTJcMjY0XDFcMCIrCi0gICAgIlwxXDI2NFwxXDBcMVwyNjRcMVx1MDE0Zlw2NFwyNjRcMVx1MDE1MFwxNFx1MDE1MVwxXHUwMTUyIisKLSAgICAiXDEwM1x1MDE1MVwxXHUwMTUyXDVcdTAxNTFcMVx1MDE1M1wyXHUwMTUxXDFcdTAxNTRcNTZcdTAxNTFcMTJcdTAxNTUiKwotICAgICJcMVx1MDE1NlwxMDNcdTAxNTVcMVx1MDE1Nlw3XHUwMTU1XDFcdTAxNTdcMlx1MDE1NVwxXHUwMTU4XDU2XHUwMTU1IisKLSAgICAiXDEyXDMwMlwxXDBcNjdcMzAyXDFcdTAxNTlcMVwwXDEyXDMwMlwxXDBcN1wzMDIiKwotICAgICJcMVx1MDE1YVw1N1wzMDJcMVx1MDE1OVwxXDBcMTJcMzAyXDFcdTAxNWJcNzFcMzAyXDE0XDMwNiIrCi0gICAgIlwxXDBcNjVcMzA2XDFcdTAxNWNcMVwwXDE0XDMwNlwxXDBcNVwzMDZcMVx1MDE1ZCIrCi0gICAgIlw1N1wzMDZcMVx1MDE1Y1wxXDBcMTRcMzA2XDFcdTAxNWVcNjdcMzA2XDEyXDMxMVwxXDAiKwotICAgICJcMVwzMTFcMVwwXDY2XDMxMVwxXDBcMTJcMzExXDFcMFwxXDMxMVwxXDAiKwotICAgICJcNVwzMTFcMVx1MDE1Zlw2MFwzMTFcMVwwXDEyXDMxMVwxXDBcMVwzMTFcMVwwIisKLSAgICAiXDFcMzExXDFcdTAxNjBcNjRcMzExXDFcMFwxNFx1MDE2MVwxXHUwMTYyXDEwM1x1MDE2MVwxXHUwMTYyIisKLSAgICAiXDVcdTAxNjFcMVx1MDE2M1wyXHUwMTYxXDFcdTAxNjRcNTZcdTAxNjFcMTJcdTAxNjVcMVx1MDE2NlwxMDNcdTAxNjUiKwotICAgICJcMVx1MDE2Nlw3XHUwMTY1XDFcdTAxNjdcMlx1MDE2NVwxXHUwMTY4XDU2XHUwMTY1XDEyXDMyN1wxXDAiKwotICAgICJcNjdcMzI3XDFcdTAxNjlcMVwwXDEyXDMyN1wxXDBcN1wzMjdcMVx1MDE2YVw1N1wzMjciKwotICAgICJcMVx1MDE2OVwxXDBcMTJcMzI3XDFcdTAxNmJcNzFcMzI3XDE0XDMzM1wxXDBcNjVcMzMzIisKLSAgICAiXDFcdTAxNmNcMVwwXDE0XDMzM1wxXDBcNVwzMzNcMVx1MDE2ZFw1N1wzMzNcMVx1MDE2YyIrCi0gICAgIlwxXDBcMTRcMzMzXDFcdTAxNmVcNjdcMzMzXDdcMFwxXHUwMTZmXDExXDBcMVx1MDE3MCIrCi0gICAgIlwzXDBcMVx1MDE3MVwyMlwwXDFcdTAxNzJcNDJcMFwxXHUwMTczXDI0XDBcMVx1MDE3NCIrCi0gICAgIlw1NFwwXDFcMzQyXDJcMFwyXHUwMTc1XDVcMFwxXDM0Mlw2XDBcMVwzNDIiKwotICAgICJcNVx1MDE3NVwxXDBcMTNcdTAxNzVcMVwwXDEyXHUwMTc1XDFcMFw0XHUwMTc1XDFcMCIrCi0gICAgIlw0XHUwMTc1XDFcMFw0XHUwMTc1XDJcMFwxXHUwMTc2XDFcMFwzXHUwMTc2XDFcdTAxNzciKwotICAgICJcNFwzNDNcMVx1MDE3NlwxXDBcM1x1MDE3NlwxXHUwMTc3XDFcMzQzXDFcdTAxNzZcMVwwIisKLSAgICAiXDNcdTAxNzZcMVx1MDE3N1w1XDM0M1wxXHUwMTc2XDEzXDM0M1wxXHUwMTc2XDEyXDM0M1wxXHUwMTc2IisKLSAgICAiXDRcMzQzXDFcdTAxNzhcMTFcMzQzXDJcdTAxNzZcMjBcMFwxXHUwMTc5XDdcMFwxXHUwMTdhIisKLSAgICAiXDcwXDBcMVwzNDZcNjZcMFwxMDNcMzQ3XDFcdTAxN2JcMVx1MDE3NlwxXDBcM1x1MDE3NiIrCi0gICAgIlwxXHUwMTc3XDRcMzUwXDFcdTAxNzZcMVwwXDNcdTAxNzZcMVx1MDE3N1wxXDM1MFwxXHUwMTc2IisKLSAgICAiXDFcMFwzXHUwMTc2XDFcdTAxNzdcNVwzNTBcMVx1MDE3NlwxM1wzNTBcMVx1MDE3NlwxMlwzNTAiKwotICAgICJcMVx1MDE3Nlw0XDM1MFwxXHUwMTdjXDExXDM1MFwyXHUwMTc2XDEwM1wzNTFcMVx1MDE3ZFw2M1wwIisKLSAgICAiXDFcMzUyXDQ1XDBcMVx1MDE3MVwyMlwwXDFcdTAxNzJcNjdcMFwxXHUwMTc0XDUxXDAiKwotICAgICJcMVx1MDE3ZVwxMDNcMFwxXHUwMTdmXDEwN1wwXDRcMTEzXDZcMFwxXDExM1w2XDAiKwotICAgICJcM1wxMTNcMlx1MDE4MFwxXDBcMTNcMTEzXDFcMFwxMlwxMTNcMVwwXDRcMTEzIisKLSAgICAiXDFcMFwxMVwxMTNcMTBcMFw0XDExM1w2XDBcMVwxMTNcNlwwXDVcMTEzIisKLSAgICAiXDFcMFwxM1wxMTNcMVwwXDJcMTEzXDFcdTAxODFcN1wxMTNcMVwwXDRcMTEzIisKLSAgICAiXDFcMFw2XDExM1wxXHUwMTgxXDJcMTEzXDJcMFwxMlwzNjVcMVwzNjZcM1wzNjUiKwotICAgICJcMVwwXDY1XDM2NVwxNFwzNzBcMVwzNjZcMVwzNzBcMVwwXDY1XDM3MFwxXDM3NSIrCi0gICAgIlwxXDBcMTBcMzc1XDFcMzc3XDJcMzc1XDFcdTAxODJcNDVcMzc1XDFcdTAxODJcMjBcMzc1IisKLSAgICAiXDFcMTQxXDJcMzc1XDFcMzc2XDFcMTQxXDFcMzc1XDRcMTQxXDFcMzc3XDFcMTQxIisKLSAgICAiXDFcMzc1XDFcMTQxXDFcMTM3XDFcMzc1XDZcMTQxXDFcMzc1XDU1XDE0MVwxXHUwMTAxIisKLSAgICAiXDFcMFwxMlx1MDEwMVwxXDM3N1wxXHUwMTgzXDQ1XHUwMTAxXDFcdTAxODNcMjBcdTAxMDFcMVwxNDIiKwotICAgICJcMlx1MDEwMVwxXHUwMTAyXDFcMTQyXDFcdTAxMDFcNFwxNDJcMVx1MDEwMVwxXDE0MlwxXDM3NyIrCi0gICAgIlwxXDE0MlwxXDEzN1wxXHUwMTAxXDZcMTQyXDFcdTAxMDFcNTVcMTQyXDEyXHUwMTA4XDFcdTAxMDkiKwotICAgICJcM1x1MDEwOFwxXDBcNjVcdTAxMDhcMTRcdTAxMGJcMVx1MDEwOVwxXHUwMTBiXDFcMFw2NVx1MDEwYiIrCi0gICAgIlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFw2XDE2NlwxXHUwMTg0XDJcMTY2IisKLSAgICAiXDEwXDBcNFx1MDEwZlw2XDBcMVx1MDEwZlw2XDBcNVx1MDEwZlwxXDBcMTNcdTAxMGYiKwotICAgICJcMVwwXDEyXHUwMTBmXDFcMFw0XHUwMTBmXDFcMFwxMVx1MDEwZlwxMFwwXDRcdTAxMTEiKwotICAgICJcNlwwXDFcdTAxMTFcNlwwXDVcdTAxMTFcMVwwXDEzXHUwMTExXDFcMFwxMlx1MDExMSIrCi0gICAgIlwxXDBcNFx1MDExMVwxXDBcMTFcdTAxMTFcMlwwXDEyXHUwMTEyXDFcdTAxMTNcM1x1MDExMiIrCi0gICAgIlwxXDBcNjVcdTAxMTJcMTRcdTAxMTVcMVx1MDExM1wxXHUwMTE1XDFcMFw2NVx1MDExNVwxXHUwMTg1IisKLSAgICAiXDJcdTAxODZcMVx1MDE4N1wxXHUwMTg1XDFcdTAxODZcNFx1MDE4NVwxXHUwMTg2XDFcdTAxODVcMVx1MDE4NiIrCi0gICAgIlwyXHUwMTg1XDFcdTAxODZcNlx1MDE4NVwxXHUwMTg2XDU0XHUwMTg1XDFcMTczXDFcdTAxODhcMlx1MDE4OSIrCi0gICAgIlwxXHUwMThhXDFcdTAxODhcMVx1MDE4OVw0XHUwMTg4XDFcdTAxODlcMVx1MDE4OFwxXHUwMTg5XDJcdTAxODgiKwotICAgICJcMVx1MDE4OVw2XHUwMTg4XDFcdTAxODlcNTRcdTAxODhcMVwxNzNcMzVcMFwxXHUwMThiXDM0XDAiKwotICAgICJcMVx1MDE4Ylw1MVwwXDFcdTAxOGNcMTRcMFwxXHUwMThjXDcwXDBcMVx1MDE4ZFwxMVwwIisKLSAgICAiXDFcdTAxOGRcNzNcMFwxXHUwMThlXDE3XDBcMVx1MDE4ZVwxMTBcMFwxXHUwMThmXDdcMCIrCi0gICAgIlwxXHUwMThmXDJcMFwxMlx1MDEyMVwxXHUwMTIyXDNcdTAxMjFcMVwwXDY1XHUwMTIxXDFcdTAxMjQiKwotICAgICJcMVwwXDEyXHUwMTI0XDFcdTAxMjJcMVx1MDE5MFw0NVx1MDEyNFwxXHUwMTkwXDIxXHUwMTI0XDFcMCIrCi0gICAgIlwxMlx1MDEyNFwxXHUwMTkxXDFcdTAxOTBcNDVcdTAxMjRcMVx1MDE5MFwyMFx1MDEyNFwxNFwwXDFcdTAxOTIiKwotICAgICJcNjdcMFwxNFx1MDEyNFwxXHUwMTkxXDFcdTAxMjRcMVwwXDY1XHUwMTI0XDEyXHUwMTMxXDFcdTAxMzIiKwotICAgICJcM1x1MDEzMVwxXDBcNjVcdTAxMzFcMVx1MDEzNFwxXDBcMTJcdTAxMzRcMVx1MDEzMlwxXHUwMTkzIisKLSAgICAiXDQ1XHUwMTM0XDFcdTAxOTNcMjFcdTAxMzRcMVwwXDEyXHUwMTM0XDFcdTAxOTRcMVx1MDE5M1w0NVx1MDEzNCIrCi0gICAgIlwxXHUwMTkzXDIwXHUwMTM0XDE0XDBcMVx1MDE5NVw2N1wwXDE0XHUwMTM0XDFcdTAxOTRcMVx1MDEzNCIrCi0gICAgIlwxXDBcNjVcdTAxMzRcMlwyMzFcMVwwXDIyXDIzMVwxXHUwMTk2XDIyXDIzMVwxXHUwMTk3IisKLSAgICAiXDM1XDIzMVwxXDBcMzFcMjMxXDFcdTAxOThcNDdcMjMxXDEyXHUwMTNiXDFcdTAxM2NcM1x1MDEzYiIrCi0gICAgIlwxXDBcNjVcdTAxM2JcMVx1MDEzZVwxXDBcMTJcdTAxM2VcMVx1MDEzY1wxXHUwMTk5XDQ1XHUwMTNlIisKLSAgICAiXDFcdTAxOTlcMjFcdTAxM2VcMVwwXDEyXHUwMTNlXDFcdTAxOWFcMVx1MDE5OVw0NVx1MDEzZVwxXHUwMTk5IisKLSAgICAiXDIwXHUwMTNlXDE0XDBcMVx1MDE5Ylw2N1wwXDE0XHUwMTNlXDFcdTAxOWFcMVx1MDEzZVwxXDAiKwotICAgICJcNjVcdTAxM2VcMlwyNDBcMVwwXDIyXDI0MFwxXHUwMTljXDIyXDI0MFwxXHUwMTlkXDM1XDI0MCIrCi0gICAgIlwxXDBcMzFcMjQwXDFcdTAxOWVcNDdcMjQwXDdcMFwxXHUwMTlmXDExXDBcMVx1MDE3MCIrCi0gICAgIlwzXDBcMVx1MDE3MVwyMlwwXDFcdTAxNzJcNTVcMFwxXHUwMWEwXDYxXDBcMTZcMjUxIisKLSAgICAiXDFcMFw2NVwyNTFcMTZcMjU3XDFcMFw2NVwyNTdcMTJcMjY0XDFcMFwxXDI2NCIrCi0gICAgIlwxXDBcMVwyNjRcMVx1MDFhMVw2NFwyNjRcMVx1MDE1MFwxMlwyNjRcMVwwXDFcMjY0IisKLSAgICAiXDFcMFwxXHUwMTRkXDdcMjY0XDFcdTAxYTJcMjJcMjY0XDFcdTAxYTNcMzJcMjY0XDFcMCIrCi0gICAgIlwxMlx1MDFhMVwxXDBcMVx1MDFhMVwxXDBcNjZcdTAxYTFcMVwwXDEyXHUwMTUwXDFcMCIrCi0gICAgIlwxXHUwMTUwXDFcMFwxXHUwMWE0XDY1XHUwMTUwXDFcMFwxNFx1MDE1MVwxXHUwMTUyXDEwXHUwMTUxIisKLSAgICAiXDFcdTAxYTVcMjJcdTAxNTFcMVx1MDFhNlw0N1x1MDE1MVwxXHUwMTUyXDE3XHUwMTUxXDFcdTAxYTdcNDdcdTAxNTEiKwotICAgICJcMTJcdTAxNTVcMVx1MDE1NlwxMlx1MDE1NVwxXHUwMWE4XDIyXHUwMTU1XDFcdTAxYTlcNDVcdTAxNTVcMVx1MDE1NiIrCi0gICAgIlwyMVx1MDE1NVwxXHUwMWFhXDQ3XHUwMTU1XDEyXDMwMlwxXDBcMTAzXDMwMlwxXDBcMTJcMzAyIisKLSAgICAiXDFcdTAxYWJcMjJcMzAyXDFcdTAxYWNcMzFcMzAyXDFcdTAxNTlcMVwwXDEwMlx1MDFhZFwxXHUwMWFlIisKLSAgICAiXDFcdTAxYWRcMTRcMzA2XDFcMFwxMDNcMzA2XDFcMFwxMFwzMDZcMVx1MDFhZlwyMlwzMDYiKwotICAgICJcMVx1MDFiMFwzMVwzMDZcMVx1MDE1Y1wxXDBcMTAyXHUwMWIxXDFcdTAxYjJcMVx1MDFiMVwxMlwzMTEiKwotICAgICJcMVwwXDFcMzExXDFcMFwxMFwzMTFcMVx1MDFiM1wyMlwzMTFcMVx1MDFiNFwzMlwzMTEiKwotICAgICJcMVwwXDE0XHUwMTYxXDFcdTAxNjJcMTBcdTAxNjFcMVx1MDFiNVwyMlx1MDE2MVwxXHUwMWI2XDQ3XHUwMTYxIisKLSAgICAiXDFcdTAxNjJcMTdcdTAxNjFcMVx1MDFiN1w0N1x1MDE2MVwxMlx1MDE2NVwxXHUwMTY2XDEyXHUwMTY1XDFcdTAxYjgiKwotICAgICJcMjJcdTAxNjVcMVx1MDFiOVw0NVx1MDE2NVwxXHUwMTY2XDIxXHUwMTY1XDFcdTAxYmFcNDdcdTAxNjVcMTJcMzI3IisKLSAgICAiXDFcMFwxMDNcMzI3XDFcMFwxMlwzMjdcMVx1MDFiYlwyMlwzMjdcMVx1MDFiY1wzMVwzMjciKwotICAgICJcMVx1MDE2OVwxXDBcMTAyXHUwMWJkXDFcdTAxYmVcMVx1MDFiZFwxNFwzMzNcMVwwXDEwM1wzMzMiKwotICAgICJcMVwwXDEwXDMzM1wxXHUwMWJmXDIyXDMzM1wxXHUwMWMwXDMxXDMzM1wxXHUwMTZjXDFcMCIrCi0gICAgIlwxMDJcdTAxYzFcMVx1MDFjMlwxXHUwMWMxXDdcMFwxXHUwMWMzXDEwM1wwXDFcdTAxYzRcMTMxXDAiKwotICAgICJcMVx1MDFjNVw0NlwwXDFcdTAxNzVcMVwwXDExXHUwMTc1XDFcMFw2XHUwMTc1XDFcMCIrCi0gICAgIlw2MVx1MDE3NVwxXHUwMTc2XDFcMFwxMVx1MDE3NlwxXDBcNlx1MDE3NlwxXDBcNDVcdTAxNzYiKwotICAgICJcMVwwXDE0XHUwMTc2XDFcMFwzXHUwMTc2XDFcdTAxNzdcNVx1MDE3NlwxXDBcM1x1MDE3NiIrCi0gICAgIlwxXHUwMTc3XDJcdTAxNzZcMVwwXDNcdTAxNzZcMVx1MDE3N1w0MVx1MDE3NlwxXHUwMWM2XDEzXHUwMTc2IisKLSAgICAiXDIwXDBcMVx1MDE3OVw0N1wwXDFcdTAxYzdcMzNcMFwxXHUwMWM4XDE0XDBcM1x1MDFjOCIrCi0gICAgIlwyXDBcMVx1MDFjOFwxMVwwXDFcdTAxYzhcMVwwXDJcdTAxYzhcNlwwXDFcdTAxYzgiKwotICAgICJcMlwwXDJcdTAxYzhcNlwwXDFcdTAxYzhcMTBcMFw0XDExM1w2XDBcMVwxMTMiKwotICAgICJcNlwwXDVcMTEzXDFcMFwxMVwxMTNcMVx1MDFjOVwxXDExM1wxXDBcMVx1MDFjOSIrCi0gICAgIlwxMVwxMTNcMVwwXDRcMTEzXDFcMFwxMVwxMTNcMlwwXDEyXDM3NVwxXDM3NyIrCi0gICAgIlwzXDM3NVwxXDBcNjVcMzc1XDE0XHUwMTAxXDFcMzc3XDFcdTAxMDFcMVwwXDY1XHUwMTAxIisKLSAgICAiXDZcMFwzXDE2NlwxXHUwMWNhXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXHUwMTg1XDJcdTAxODZcMVx1MDE4N1wxXHUwMTg1XDFcdTAxODZcNFx1MDE4NVwxXHUwMTg2XDFcdTAxODUiKwotICAgICJcMVx1MDE4NlwyXHUwMTg1XDFcdTAxODZcNlx1MDE4NVwxXHUwMTg2XDU0XHUwMTg1XDFcdTAxY2JcMTAzXHUwMTg2IisKLSAgICAiXDFcdTAxY2NcMVx1MDE4OFwyXHUwMTg5XDFcdTAxOGFcMVx1MDE4OFwxXHUwMTg5XDRcdTAxODhcMVx1MDE4OSIrCi0gICAgIlwxXHUwMTg4XDFcdTAxODlcMlx1MDE4OFwxXHUwMTg5XDZcdTAxODhcMVx1MDE4OVw1NFx1MDE4OFwxXHUwMWNiIisKLSAgICAiXDEwM1x1MDE4OVwxXHUwMWNkXDQwXDBcMVx1MDFjZVwxNFwwXDFcdTAxY2VcNjBcMFwyXHUwMWNmIisKLSAgICAiXDEwMVwwXDFcdTAxZDBcMTEyXDBcMVx1MDFkMVwxNFwwXDFcdTAxZDFcNjBcMFwyXHUwMWQyIisKLSAgICAiXDUwXDBcMTRcdTAxMjRcMVx1MDEyMlwxXHUwMTI0XDFcMFw2NVx1MDEyNFwzXDBcMlx1MDFkMyIrCi0gICAgIlwxXDBcNFx1MDFkM1wyXDBcMVx1MDEyNlwxXHUwMWQzXDFcMFw0XHUwMWQzXDFcMCIrCi0gICAgIlwxMFx1MDFkM1wxXDBcMzdcdTAxZDNcMlwwXDRcdTAxZDNcMlwwXDE0XHUwMTM0XDFcdTAxMzIiKwotICAgICJcMVx1MDEzNFwxXDBcNjVcdTAxMzRcM1wwXDJcdTAxZDRcMVwwXDRcdTAxZDRcMlwwIisKLSAgICAiXDFcdTAxMzZcMVx1MDFkNFwxXDBcNFx1MDFkNFwxXDBcMTBcdTAxZDRcMVwwXDM3XHUwMWQ0IisKLSAgICAiXDJcMFw0XHUwMWQ0XDJcMFwyXDIzMVwxXDBcMzJcMjMxXDFcdTAxZDVcNDZcMjMxIisKLSAgICAiXDE0XHUwMTNlXDFcdTAxM2NcMVx1MDEzZVwxXDBcNjVcdTAxM2VcM1wwXDJcdTAxZDZcMVwwIisKLSAgICAiXDRcdTAxZDZcMlwwXDFcdTAxNDBcMVx1MDFkNlwxXDBcNFx1MDFkNlwxXDBcMTBcdTAxZDYiKwotICAgICJcMVwwXDM3XHUwMWQ2XDJcMFw0XHUwMWQ2XDJcMFwyXDI0MFwxXDBcMzJcMjQwIisKLSAgICAiXDFcdTAxZDdcNDZcMjQwXDdcMFwxXHUwMWQ4XDc2XDBcMVx1MDFkOVwxMDFcMFwxMlx1MDE1MCIrCi0gICAgIlwxXDBcMVx1MDE1MFwxXDBcMVx1MDE1MFwxXDBcNjVcdTAxNTBcMTRcdTAxNTFcMVx1MDE1MiIrCi0gICAgIlwyMFx1MDE1MVwxXHUwMWRhXDQ2XHUwMTUxXDEyXHUwMTU1XDFcdTAxNTZcMjJcdTAxNTVcMVx1MDFkYlw0Nlx1MDE1NSIrCi0gICAgIlwxMlx1MDFkY1wxXHUwMWRkXDcwXHUwMWRjXDFcMFwxNFx1MDFkZVwxXHUwMWRkXDY2XHUwMWRlXDFcMCIrCi0gICAgIlwxNFx1MDE2MVwxXHUwMTYyXDIwXHUwMTYxXDFcdTAxZGZcNDZcdTAxNjFcMTJcdTAxNjVcMVx1MDE2NlwyMlx1MDE2NSIrCi0gICAgIlwxXHUwMWUwXDQ2XHUwMTY1XDEyXHUwMWUxXDFcdTAxZTJcNzBcdTAxZTFcMVwwXDE0XHUwMWUzXDFcdTAxZTIiKwotICAgICJcNjZcdTAxZTNcMzdcMFwxXHUwMWU0XDEzNVwwXDFcdTAxYzZcMzNcMFwxXHUwMWM4XDE0XDAiKwotICAgICJcM1x1MDFjOFwyXDBcMVx1MDFjOFwxMVwwXDFcdTAxYzhcMVwwXDJcdTAxYzhcNlwwIisKLSAgICAiXDFcdTAxYzhcMVwwXDFcdTAxYzdcMlx1MDFjOFw2XDBcMVx1MDFjOFwxMFwwXDRcMTEzIisKLSAgICAiXDZcMFwxXDExM1w2XDBcNVwxMTNcMVwwXDZcMTEzXDFcdTAxZTVcNFwxMTMiKwotICAgICJcMVwwXDEyXDExM1wxXDBcMVwxMTNcMVx1MDFlNVwyXDExM1wxXDBcMTFcMTEzIisKLSAgICAiXDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcNlwxNjYiKwotICAgICJcMVx1MDFlNlw0XDE2NlwxXDBcNlwxNjZcMVx1MDFlN1wzXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2Nlw1NFwwXDFcdTAxZThcNzZcMFwxXHUwMWU5XDEzXDBcMVx1MDFlOSIrCi0gICAgIlw2NFwwXDFcdTAxZWFcMTFcMFwxXHUwMWVhXDcxXDBcMVx1MDFlYlwxMVwwXDFcdTAxZWIiKwotICAgICJcNzRcMFwxXHUwMWVjXDEzXDBcMVx1MDFlY1wyMlwwXDJcMjMxXDFcMFwzM1wyMzEiKwotICAgICJcMVx1MDFlZFw0NVwyMzFcMlwyNDBcMVwwXDMzXDI0MFwxXHUwMWVlXDQ1XDI0MFwxNFx1MDE1MSIrCi0gICAgIlwxXHUwMTUyXDIxXHUwMTUxXDFcdTAxZWZcNDVcdTAxNTFcMTJcdTAxNTVcMVx1MDE1NlwyM1x1MDE1NVwxXHUwMWYwIisKLSAgICAiXDQ1XHUwMTU1XDEyXHUwMWRjXDFcdTAxYWRcNjdcdTAxZGNcMVx1MDFmMVwxXHUwMWFkXDE0XHUwMWRlXDFcdTAxYjEiKwotICAgICJcNjVcdTAxZGVcMVx1MDFmMlwxXHUwMWIxXDE0XHUwMTYxXDFcdTAxNjJcMjFcdTAxNjFcMVx1MDFmM1w0NVx1MDE2MSIrCi0gICAgIlwxMlx1MDE2NVwxXHUwMTY2XDIzXHUwMTY1XDFcdTAxZjRcNDVcdTAxNjVcMTJcdTAxZTFcMVx1MDFiZFw2N1x1MDFlMSIrCi0gICAgIlwxXHUwMWY1XDFcdTAxYmRcMTRcdTAxZTNcMVx1MDFjMVw2NVx1MDFlM1wxXHUwMWY2XDFcdTAxYzFcMzdcMCIrCi0gICAgIlwxXHUwMWY3XDUyXDBcNFwxMTNcNlwwXDFcMTEzXDZcMFw1XDExM1wxXDAiKwotICAgICJcM1wxMTNcMVx1MDFmOFw3XDExM1wxXDBcNFwxMTNcMVx1MDFmOFw1XDExM1wxXDAiKwotICAgICJcNFwxMTNcMVwwXDExXDExM1wxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDExXDE2NlwxXHUwMWY5XDFcMTY2XDFcMFwxMlwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxMFwxNjZcMVx1MDFmYVwyXDE2NlwxXDBcMTJcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDU1XDBcMVx1MDFmYlwyM1wwXDFcdTAxZmJcNTBcMCIrCi0gICAgIlwxXHUwMWZjXDE3XDBcMVx1MDFmY1w2NlwwXDFcdTAxZmRcMTJcMFwxXHUwMWZkXDUyXDAiKwotICAgICJcMVx1MDFmZVwxMDdcMFwxXHUwMWZmXDM0XDBcMVx1MDFmZlwxMVwwXDJcMjMxXDFcMCIrCi0gICAgIlwzNFwyMzFcMVx1MDIwMFw0NFwyMzFcMlwyNDBcMVwwXDM0XDI0MFwxXHUwMjAxXDQ0XDI0MCIrCi0gICAgIlwxNFx1MDE1MVwxXHUwMTUyXDIyXHUwMTUxXDFcdTAyMDJcNDRcdTAxNTFcMTJcdTAxNTVcMVx1MDE1NlwyNFx1MDE1NSIrCi0gICAgIlwxXHUwMjAzXDQ0XHUwMTU1XDEyXHUwMWRjXDFcdTAyMDRcNjdcdTAxZGNcMVx1MDFmMVwxXHUwMWFkXDE0XHUwMWRlIisKLSAgICAiXDFcdTAyMDVcNjVcdTAxZGVcMVx1MDFmMlwxXHUwMWIxXDE0XHUwMTYxXDFcdTAxNjJcMjJcdTAxNjFcMVx1MDIwNiIrCi0gICAgIlw0NFx1MDE2MVwxMlx1MDE2NVwxXHUwMTY2XDI0XHUwMTY1XDFcdTAyMDdcNDRcdTAxNjVcMTJcdTAxZTFcMVx1MDIwOCIrCi0gICAgIlw2N1x1MDFlMVwxXHUwMWY1XDFcdTAxYmRcMTRcdTAxZTNcMVx1MDIwOVw2NVx1MDFlM1wxXHUwMWY2XDFcdTAxYzEiKwotICAgICJcNDBcMFwxXHUwMjBhXDUxXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDFcdTAyMGJcMVwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDZcMTY2XDFcdTAyMGNcNFwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2Nlw0NFwwXDFcdTAyMGRcMTFcMFwxXHUwMjBkXDY3XDBcMVx1MDIwZSIrCi0gICAgIlwxNFwwXDFcdTAyMGVcNjZcMFwxXHUwMjBmXDE0XDBcMVx1MDIwZlwyNlwwXDJcMjMxIisKLSAgICAiXDFcMFwzNVwyMzFcMVx1MDIxMFw0M1wyMzFcMlwyNDBcMVwwXDM1XDI0MFwxXHUwMjExIisKLSAgICAiXDQzXDI0MFwxNFx1MDE1MVwxXHUwMTUyXDIzXHUwMTUxXDFcdTAyMTJcNDNcdTAxNTFcMTJcdTAxNTVcMVx1MDE1NiIrCi0gICAgIlwyNVx1MDE1NVwxXHUwMjEzXDQzXHUwMTU1XDE0XHUwMTYxXDFcdTAxNjJcMjNcdTAxNjFcMVx1MDIxNFw0M1x1MDE2MSIrCi0gICAgIlwxMlx1MDE2NVwxXHUwMTY2XDI1XHUwMTY1XDFcdTAyMTVcNDNcdTAxNjVcMzdcMFwxXHUwMjE2XDUyXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXHUwMjE3XDVcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcNVwxNjZcMVx1MDIxOCIrCi0gICAgIlw1XDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwyXDIzMVwxXDBcMzRcMjMxXDFcdTAyMTlcNDRcMjMxXDJcMjQwXDFcMFwzNFwyNDAiKwotICAgICJcMVx1MDIxYVw0NFwyNDBcMTRcdTAxNTFcMVx1MDE1MlwyMlx1MDE1MVwxXHUwMjFiXDQ0XHUwMTUxXDEyXHUwMTU1IisKLSAgICAiXDFcdTAxNTZcMjRcdTAxNTVcMVx1MDIxY1w0NFx1MDE1NVwxNFx1MDE2MVwxXHUwMTYyXDIyXHUwMTYxXDFcdTAyMWQiKwotICAgICJcNDRcdTAxNjFcMTJcdTAxNjVcMVx1MDE2NlwyNFx1MDE2NVwxXHUwMjFlXDQ0XHUwMTY1XDM0XDBcMVx1MDIxZiIrCi0gICAgIlw1NVwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMVwxNjZcMVx1MDIyMFw3XDE2NiIrCi0gICAgIlwyXDBcMlwyMzFcMVwwXDMxXDIzMVwxXHUwMjIxXDQ3XDIzMVwyXDI0MFwxXDAiKwotICAgICJcMzFcMjQwXDFcdTAyMjJcNDdcMjQwXDE0XHUwMTUxXDFcdTAxNTJcMTdcdTAxNTFcMVx1MDIyM1w0N1x1MDE1MSIrCi0gICAgIlwxMlx1MDE1NVwxXHUwMTU2XDIxXHUwMTU1XDFcdTAyMjRcNDdcdTAxNTVcMTRcdTAxNjFcMVx1MDE2MlwxN1x1MDE2MSIrCi0gICAgIlwxXHUwMjI1XDQ3XHUwMTYxXDEyXHUwMTY1XDFcdTAxNjZcMjFcdTAxNjVcMVx1MDIyNlw0N1x1MDE2NVw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXHUwMjI3XDVcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTBcMTY2XDFcdTAyMjgiKwotICAgICJcMlwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDRcMTY2XDFcdTAyMjkiKwotICAgICJcNlwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDVcMTY2XDFcdTAyMmEiKwotICAgICJcNVwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcNlx1MDIyYlw0XHUwMjJjXDZcdTAyMmJcMVx1MDIyY1w1XHUwMjJiXDFcMFw1XHUwMjJjXDFcdTAyMmIiKwotICAgICJcMTNcdTAyMmNcMVx1MDIyYlwxMlx1MDIyY1wxXHUwMjJiXDRcdTAyMmNcMVx1MDIyYlwxMVx1MDIyY1wyXHUwMjJiIisKLSAgICAiXDQxXDBcMVx1MDIyZFwzXDBcMVx1MDIyZVw3XDBcMVx1MDIyZlwxXHUwMjMwXDIwXDAiKwotICAgICJcMVx1MDIzMVwxMlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcdTAyMzJcM1wxNjZcMVx1MDIzM1wyXDE2NlwxXDBcNFwxNjZcMVx1MDIzNCIrCi0gICAgIlwxXHUwMjM1XDRcMTY2XDFcMFw0XDE2NlwxXDBcNlwxNjZcMVx1MDIzNlwyXDE2NiIrCi0gICAgIlw2MFwwXDFcdTAyMzdcNzRcMFwxXHUwMjM4XDExMlwwXDFcdTAyMzlcMTAyXDBcMVx1MDIzYSIrCi0gICAgIlwxMDRcMFwxXHUwMjNiXDMzXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFw1XDE2NlwxXHUwMjNjXDRcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcdTAyM2RcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDIzZVw0XDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDIzZlw1XDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDI0MFw0XDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDExXDE2Nlw0NVwwXDFcdTAyNDFcMTMyXDBcMVx1MDI0MlwxMDRcMFwxXHUwMjQzXDY1XDAiKwotICAgICJcMVx1MDI0NFwxMjFcMFwxXHUwMjQ1XDE2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw1XDE2NlwxXDBcNlwxNjZcMVx1MDI0Nlw0XDE2NlwxXDBcMTJcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwxXDE2NlwxXHUwMjQ3XDdcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwyXDE2NlwxXHUwMjQ4XDZcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw1XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjQ5XDVcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwyXDE2NlwxXHUwMjRhXDZcMTY2XDQ3XDBcMVx1MDI0Ylw3MVwwXDFcdTAyNGNcMTAzXDAiKwotICAgICJcMVx1MDI0ZFwxMTNcMFwxXHUwMjRlXDEwMlwwXDFcdTAyNGZcNDdcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDVcMTY2XDFcMFwxMFwxNjZcMVx1MDI1MFwyXDE2NlwxXDAiKwotICAgICJcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XDE2NlwxXHUwMjUxXDFcMFwxM1wxNjZcMVwwXDEyXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNFwxNjZcMVx1MDI1MlwxXDBcMTNcMTY2XDFcMFwxMlwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFw2XDE2NlwxXHUwMjUzXDRcMTY2XDFcMFwxMlwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFw1XDE2NlwxXHUwMjU0XDVcMTY2XDFcMFwxMlwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcNjBcMFwxXHUwMjU1XDEyNVwwXDFcdTAyNTZcNTBcMCIrCi0gICAgIlwxXHUwMjU3XDEwM1wwXDFcdTAyNThcNDRcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDVcMTY2XDFcdTAyNTlcNFwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDdcMTY2XDFcdTAyNWFcMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxMFwxNjZcMVx1MDI1YlwyXDE2NlwxXDBcMTJcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw1XDE2NlwxXDBcMTBcMTY2XDFcdTAyNWNcMlwxNjZcMVwwXDEyXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwxMDNcMFwxXHUwMjVkXDYxXDBcMVx1MDI0NVwxMjVcMCIrCi0gICAgIlwxXHUwMjRmXDEwM1wwXDFcdTAyNWVcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDEwXDE2NlwxXHUwMjVmXDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFw2XDE2NlwxXHUwMjRhXDNcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMFwxNjYiKwotICAgICJcMVx1MDI1NFwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTBcMTY2XDFcdTAyNjAiKwotICAgICJcMzVcMFwxXHUwMjQ1XDE1MFwwXDFcdTAyNjFcMTFcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDRcMTY2XDFcdTAyNGFcMVwwXDEzXDE2NlwxXDBcMTJcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlw3XDE2NlwxXHUwMjYyXDFcMTY2XDU3XDBcMVx1MDI0NVwzNFwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI0YSIrCi0gICAgIlw1XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgLy8gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICA5LCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICAzLCAgMywgIDMsICAzLCAgMywgIDMsICA5LCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICAzLCAgMywgCi0gICAgIDMsICAzLCAgMywgIDMsICA5LCAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsIAotICAgICAxLCAgMCwgIDEsICAwLCAgOSwgIDEsICAyLCAgMSwgIDIsICAxLCAgMSwgIDAsICAwLCAgMCwgIDksICAxLCAKLSAgICAgMSwgIDksICA5LCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDksICAwLCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAxLCAgMSwgIDAsIAotICAgICAxLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICA5LCAgMCwgIDAsICAxLCAgMCwgCi0gICAgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsIAotICAgICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICA5LCAgOSwgIDksICAwLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMiwgMTMsICAzLCAgMiwgIDIsIDEzLCAgMywgIDIsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDIsIDEzLCAgMywgIDIsICAyLCAxMywgIDMsICAyLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDksIAotICAgICA5LCAgOSwgIDAsICAwLCAgMSwgIDEsICAxLCAgOSwgIDAsICAwLCAxMywgIDksIDEzLCAgOSwgIDksICAxLCAKLSAgICAgMSwgIDAsICAwLCAgMSwgIDMsICAyLCAgMiwgIDMsICAyLCAgMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsIAotICAgICAxLCAgMSwgIDEsICAwLCAgMywgIDMsICAyLCAgMywgIDMsICAyLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMSwgIDMsICAzLCAgMiwgIDMsICAzLCAgMiwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDAsICAwLCAgOSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgIDEsICA1LCAxMywgMTMsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgOSwgIDksICAyLCAgMiwgIDAsICA5LCAgMCwgIDIsICAyLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAyLCAgMiwgCi0gICAgIDAsICAwLCAgMiwgIDIsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICA5LCAgOSwgIDEsIAotICAgICAxLCAgMiwgIDIsICAxLCAgMSwgIDIsICAyLCAgMSwgIDEsICAwLCAgMSwgIDEsICA5LCAgOSwgIDksICAxLCAKLSAgICAgMSwgIDIsICAyLCAgMiwgIDIsICAwLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMywgIDMsICAzLCAgMywgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsIAotICAgICAwLCAgMQotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIC8vIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgLy8gcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOwotIAotCS8vIHJlcXVpcmVkIGhvbGRlcnMgZm9yIHdoaXRlLXNwYWNlIGNvbXBhY3RpbmcKLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOwotCXByaXZhdGUgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgYW4gZW1iZWRkZWQgcmVnaW9uIHNob3VsZCBiZSBldmFsdWF0ZWQKLQlwcml2YXRlIFN0cmluZyBmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgc3RhdGUgdG8gZW50ZXIgb25jZSBhbiBlbWJlZGRlZCByZWdpb24gaGFzCi0JLy8gICBiZWVuIGNvbXBsZXRlZAotCXByaXZhdGUgaW50IGZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQkvLyB0aGUgY29udGFpbmVyIHVzZWQgdG8gY3JlYXRlIGVtYmVkZGVkIHJlZ2lvbnMKLQlwcml2YXRlIENvbnRleHRSZWdpb25Db250YWluZXIgZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfQ09OVEVYVCA9ICJQUk9YWV9DT05URVhUIjsKLQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IHN0YXJ0ID0gMDsKLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7Ci0JCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZAotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgaW5zaWRlIG9mIGFuIGVtYmVkZGVkIHJlZ2lvbgotCXByaXZhdGUgU3RyaW5nIGludGVybmFsVGFnTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxDb250ZXh0ID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgwKTsKLQlwcml2YXRlIExpc3QgZk5lc3RhYmxlUHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQotCS8vIHdoZXJlIHRoZSBsYXN0IGludGVybmFsIGNvbnRhaW5lciBibG9jayB3YXMgZm91bmQKLQlwcml2YXRlIGludCBmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZkZvcmJpZEpTUCA9IGZhbHNlOwotCQotCXByaXZhdGUgaW50IGZFTGxldmVsID0gMDsKLQotCXByaXZhdGUgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmNzdmVyID0gIiRJZDogSlNQVG9rZW5pemVyLmphdmEsdiAxLjIgMjAwNS8wMS8yNyAyMTo1MzoxMiBuaXRpbmQgRXhwICQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCQlyZXR1cm47Ci0JCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcikgewotCQlmTmVzdGFibGVQcmVmaXhlcy5hZGQobWFya2VyKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCkgewotCQlyZXR1cm4gZk5lc3RhYmxlUHJlZml4ZXM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGFibGUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJLy9JdGVyYXRvciBibG9ja3MgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOwotCQkvL3doaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJLy8JVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJLy8JU3RyaW5nIG1hcmtlck5hbWUgPSBtYXJrZXIuZ2V0VGFnTmFtZSgpOwotCQkvLwlpZih0YWdOYW1lLmxlbmd0aCgpID4gbWFya2VyTmFtZS5sZW5ndGgoKSArIDEgJiYgdGFnTmFtZS5zdGFydHNXaXRoKG1hcmtlck5hbWUpICYmIHRhZ05hbWUuY2hhckF0KG1hcmtlck5hbWUubGVuZ3RoKCkpID09ICc6JykgewotCQkvLwkJcmV0dXJuIG1hcmtlci5pc0dsb2JhbCgpIHx8IGdldE9mZnNldCgpID49IG1hcmtlci5nZXRNYXJrZXIoKS5nZXRTdGFydCgpOwotCQkvLwl9Ci0JCS8vfQotCQkvL3JldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyBuYW1lKSB7Ci0JCWlmIChmTmVzdGFibGVQcmVmaXhlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBuZXN0YWJsZXMgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKG5lc3RhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoKChUYWdNYXJrZXIpIG5lc3RhYmxlcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCQluZXN0YWJsZXMucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWZCbG9ja01hcmtlcnMucmVtb3ZlKG1hcmtlcik7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JCWlmIChmQmxvY2tNYXJrZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCgoQmxvY2tNYXJrZXIpIGJsb2Nrcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHModGFnbmFtZSkpCi0JCQkJCWJsb2Nrcy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFRhZ05hbWUpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG51bGwsIGVuZFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzKSB7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBlbmRUeXBlcywgbnVsbCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFR5cGUpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG5ldyBTdHJpbmdbXXtlbmRUeXBlfSwgbnVsbCk7Ci0JfQotCS8qKgotCSAqICB1c2VyIG1ldGhvZCAKLQkgKiAKLQkgKiBBc3NlbWJsZXMgYW4gZW1iZWRkZWQgY29udGFpbmVyIGJlZ2lubmluZyB3aXRoIHRoZSBnaXZlbiBzdGFydFR5cGUgYXMKLQkgKiB0aGUgZmlyc3QgQ29udGV4dFJlZ2lvbiB3aXRoaW4gaXQgYW5kIG9mIHRoZSB0eXBlIGZFbWJlZGRlZEhpbnQuICBUaGUKLQkgKiBlbmRUeXBlc1tdIGFycmF5IGNvbnRhaW5zIHRoZSBjb250ZXh0IHR5cGVzIHRoYXQgd2lsbCBjYXVzZSBhIHN1Y2Nlc3NmdWwKLQkgKiBleGl0LiAgVXNlIG9mIHRoZSBlbmRUYWdOYW1lIHBhcmFtZXRlciBhbHRlcnMgdGhpcyBiZWhhdmlvciB0byBmb3JjZSBhbgotCSAqIGV4aXQgb24gYW4gWE1MX1RBR19DTE9TRSBhZnRlciBzZWVpbmcgYW4gWE1MX1RBR19OQU1FIHdob3NlIHNpZ25pZmljYW50Ci0JICogdGV4dCBtYXRjaGVzIHRoZSBlbmRUYWdOYW1lIFN0cmluZy4gIEFsbCBjb250ZW50cyBpbiBiZXR3ZWVuIGFyZQotCSAqIGluc2lnbmlmaWNhbnQsIGFuZCB5ZXMsIHRoaXMgbWVhbnMgY29tbWVudHMgYXJlIGFsbG93ZWQgaW5zaWRlLgotCSAqKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmdbXSBlbmRUeXBlcywgU3RyaW5nIGVuZFRhZ05hbWUpIHsKLQkJLy8gdGhlIGNvbnRleHQgb2YgdGhlIHJlZ2lvbiBiZWluZyBhZGRlZCB0byB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCWludGVybmFsQ29udGV4dCA9IHN0YXJ0VHlwZTsKLQkJLy8ga2VlcCB0cmFjayBvZiB3aGVyZSB0aGlzIGNvbnRhaW5lciBiZWdhbjsgdG8gcHJvdmlkZSByZWxhdGl2ZSBpbmRlY2VzIGZvciB0aGUgcmVnaW9ucwotCQlpbnQgY29udGFpbmVyU3RhcnQgPSB5eWNoYXI7Ci0JCWJvb2xlYW4gbm90RmluaXNoZWQgPSB0cnVlOwotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHdlIHNlZW0gdG8gYmUgc28gdGhhdCB0aGUgZW5kVGFnTmFtZSBjYW4gYmUgY2hlY2tlZAotCQlib29sZWFuIGlzSW5FbmRUYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpc0luRmlyc3RUYWcgPSB0cnVlOwotCQkvLyBjcmVhdGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciBhbmQgc2V0dXAgaXRzICJ0eXBlIgotCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsKLQkJCWZFbWJlZGRlZENvbnRhaW5lciA9IG5ldyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShmRW1iZWRkZWRIaW50KTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydChjb250YWluZXJTdGFydCk7Ci0JCQkvLyBUT0RPOiBwYXJlbnQgcmVnaW9uIG5lZWRzIHRvIGJlIHNldCAuLi4uIGJ1dCBub3Qgc3VyZSB3aGVyZSB0byBnZXQgaXQgZnJvbSAKLQkJCS8vCQlmRW1iZWRkZWRDb250YWluZXIuc2V0UGFyZW50KHBhcmVudFJlZ2lvbik7Ci0JCX0KLQkJY29udGFpbmVyU3RhcnQgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0U3RhcnQoKTsKLQkJd2hpbGUgKG5vdEZpbmlzaGVkKSB7Ci0JCQkvLyBhZGQgdGhlIHJlZ2lvbiB0byB0aGUgY29udGFpbmVyCi0JCQlpZiAoaW50ZXJuYWxDb250ZXh0ICE9IG51bGwgJiYgaW50ZXJuYWxDb250ZXh0ICE9IFBST1hZX0NPTlRFWFQpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCS8vIGxvbmdzY2FuIGRldGVybWluZXMgd2hldGhlciB0byBhdHRlbXB0IGEgYmxvY2tUYWdTY2FuIHdpdGhpbiB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCQkJYm9vbGVhbiBsb25nc2NhbiA9IGZhbHNlOwotCQkJCS8vIHNhdmUgdGhlIHRva2VuaXplciBzdGF0ZSBpbiBjYXNlIG9mIGEgYmxvY2sgdGFnIHNjYW4KLQkJCQlpbnQgcHJldmlvdXNTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQlTdHJpbmcgcHJldmlvdXNDdXJyZW50VGFnTmFtZSA9IGZDdXJyZW50VGFnTmFtZTsKLQkJCQlpbnQgcHJldmlvdXNQb3N0U3RhdGUgPSBmRW1iZWRkZWRQb3N0U3RhdGU7Ci0JCQkJU3RyaW5nIHByZXZpb3VzRW1iZWRkZWRIaW50ID0gZkVtYmVkZGVkSGludDsKLQkJCQkvLyBkZXRlcm1pbmUgaWYgYSBibG9jayB0YWcgc2NhbiBpcyBuZWNlc3NhcnkKLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCQkJaWYoIWlzTmVzdGFibGUoaW50ZXJuYWxUYWdOYW1lKSkgewotCQkJCQkJaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQkJCQkJCS8vIHNuYWdnZWQgYSB0YWcgbmFtZSB3ZSBzaG91bGRuJ3QgaGF2ZQotCQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQUJPUlRfRU1CRURERUQ7Ci0JCQkJCQlub3RGaW5pc2hlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX09QRU4gfHwgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gZG8gdXBrZWVwIGZvciBlbmRUYWdOYW1lIHVzYWdlOyBtdXN0IGJlIGhlcmUgc2luY2UgdGhlIG5leHQgdG9rZW4gY291bGQgYmUgdGhlIGNsb3NlCi0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCWlzSW5FbmRUYWcgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJaXNJbkZpcnN0VGFnID0gaXNJbkVuZFRhZyA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJIAlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJCQkJaWYgKGVtYmVkZGVkUmVnaW9ucy5zaXplKCkgPiAyICYmIChlbWJlZGRlZFJlZ2lvbnMuZ2V0KGVtYmVkZGVkUmVnaW9ucy5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBYTUxfVEFHX0NMT1NFICYmIChlbWJlZGRlZFJlZ2lvbnMuZ2V0KGVtYmVkZGVkUmVnaW9ucy5zaXplKCkgLSAzKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfT1BFTiAmJiBpbnRlcm5hbFRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQkJaWYgKGNvbnRhaW5zVGFnTmFtZShpbnRlcm5hbFRhZ05hbWUpKSB7Ci0JCQkJCQkJbG9uZ3NjYW4gPSB0cnVlOwotCQkJCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsb25nc2NhbikKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gaW50ZXJuYWxUYWdOYW1lOwotCQkJCS8vIHJlYWQgdGhlIG5leHQgcmVnaW9uIGFuZCBjb250ZXh0Ci0JCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCWlmIChsb25nc2NhbikgewotCQkJCQkvLyBSZXR1cm5pbmcgZnJvbSBhIGJsb2NrIHRhZyBzY2FuIHJlcXVpcmVzIHJlc3RvcmluZyBzb21lIHN0YXRlIHZhcmlhYmxlcwotCQkJCQkvLyBhcyB3ZWxsIGFzIGhhbmRsaW5nIHRoZSBibG9jayByZWdpb24gYW5kIHNldHRpbmcgdXAgZm9yIG5vcm1hbCBzY2FubmluZwotCQkJCQkvLyBpbnNpZGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lcgotCQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQkJCWxvbmdzY2FuID0gZmFsc2U7Ci0JCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IHByZXZpb3VzUG9zdFN0YXRlOwotCQkJCQlmRW1iZWRkZWRIaW50ID0gcHJldmlvdXNFbWJlZGRlZEhpbnQ7Ci0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHByZXZpb3VzQ3VycmVudFRhZ05hbWU7Ci0JCQkJCXl5YmVnaW4ocHJldmlvdXNTdGF0ZSk7Ci0JCQkJCWludGVybmFsQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJpbUdldE5leHRUb2tlbigpIGNhbGxzIG1heSB0aHJvdyBhbiBJT0V4Y2VwdGlvbgotCQkJCS8vIGNhdGNoIGFuZCBkbyBub3RoaW5nIHNpbmNlIHRoZSBpc0VPRiBjaGVjayBiZWxvdwotCQkJCS8vIHdpbGwgcHJvcGVybHkgZXhpdCBpZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGYpIHsKLQkJCQkvLyBzb21lIG90aGVyIGV4Y2VwdGlvbiBoYXBwZW5lZDsgbmV2ZXIgc2hvdWxkCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmKTsKLQkJCX0KLQkJCWJvb2xlYW4gaXNFbmRpbmdUeXBlID0geXlzdGF0ZSgpID09IFNUX0FCT1JUX0VNQkVEREVEOwotCQkJaWYoIWlzRW5kaW5nVHlwZSkgewotCQkJCS8vIGNoZWNrIGZvciBlbmRpbmcgY29udGV4dAotCQkJCWlmIChlbmRUYWdOYW1lID09IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaXNFbmRpbmdUeXBlID0gaXNFbmRpbmdUeXBlIHx8IChpbnRlcm5hbENvbnRleHQgPT0gZW5kVHlwZXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpc0VuZGluZ1R5cGUgPSAoKGlzSW5FbmRUYWcgJiYgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfQ0xPU0UpIHx8IChpc0luRmlyc3RUYWcgJiYgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTVBUWV9UQUdfQ0xPU0UpKSAmJiBpbnRlcm5hbFRhZ05hbWUgIT0gbnVsbCAmJiBpbnRlcm5hbFRhZ05hbWUuZXF1YWxzKGVuZFRhZ05hbWUpOwotCQkJCX0KLQkJCX0KLQkJCUlUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZExpc3QgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQkJbm90RmluaXNoZWQgPSBub3RGaW5pc2hlZCAmJiAoKCFpc0VuZGluZ1R5cGUpICYmICFpc0VPRigpICYmIChlbmRUYWdOYW1lICE9IG51bGwgfHwgaW50ZXJuYWxDb250ZXh0ICE9IFVOREVGSU5FRCkgJiYgIShpbnRlcm5hbENvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCAmJiAoZW1iZWRkZWRMaXN0LmdldChlbWJlZGRlZExpc3Quc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gVU5ERUZJTkVEKSk7Ci0JCX0KLQkJLy8gZmluaXNoIGFkZGluZyB0aGUgbGFzdCBjb250ZXh0Ci0JCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgewotCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsKLQkJfQotCQl5eWJlZ2luKGZFbWJlZGRlZFBvc3RTdGF0ZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JCXJldHVybiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmc7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gbmV3VmFsdWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckFsbG93c0pTUChmQ3VycmVudFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuYWxsb3dzSlNQKCk7Ci0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dCgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gbWFya2VyLmdldENvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7Ci0JCXJldHVybiBmQmxvY2tNYXJrZXJzOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoKSB7Ci0JCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7Ci0JCWJlZ2luQmxvY2tNYXJrZXJTY2FuKG5ld1RhZ05hbWUsIEJMT0NLX1RFWFQpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICogU3BlY2lhbCB0b2tlbml6ZXIgc2V0dXAuICBBbGxvd3MgdG9rZW5pemF0aW9uIHRvIGJlIGluaXRpYXRlZCBhdCB0aGUKLQkgKiBzdGFydCBvZiBhIHRleHQgYmxvY2sgd2l0aGluIGEgIm5ld1RhZ05hbWUiIHRhZy4KLQkgKgotCSAqIEV4YW1wbGU6IAotCSAqCVRva2VuaXplciB0b2tlciA9IG5ldyBUb2tlbml6ZXIoKTsKLQkgKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotCSAqCXRva2VyLnJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcigiYWZpdWhxd2tlamh0YXNpaGdhbGt3aHRxPC9zY3JpcHRlcj48L3Njcj48L3NjcmlwdD5hc2dkYXNnYSIpKTsKLQkgKgl0b2tlci5iZWdpbkJsb2NrTWFya2VyU2Nhbigic2NyaXB0IiwgQkxPQ0tfVEVYVCk7Ci0JICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLQkgKgotCSAqIFJldHVybnM6Ci0JICoJQkxPQ0tfVEVYVDogMC00MAotCSAqCVhNTF9FTkRfVEFHX09QRU46IDQxLTQyCi0JICoJWE1MX1RBR19OQU1FOiA0My00OAotCSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0JICoJWE1MX0NPTlRFTlQ6IDUwLTU3Ci0JICoKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGJsb2NrY29udGV4dCkgewotCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLQl9Ci0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gYWxsb3dKU1AgLSBjaGVjayBmb3IgYW5kIGFsbG93IGZvciBKU1AgbWFya3VwIDwlJT4KLSAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGNvbnRleHQgb2YgdGhlIHNjYW5uZWQgcmVnaW9uIGlmIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBhYm9ydFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSBzZWFyY2hTdHJpbmcgd2FzIGZvdW5kIGltbWVkaWF0ZWx5Ci0gKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBjb250ZXh0IGZvdW5kOiB0aGUgZGVzaXJlZCBjb250ZXh0IG9uIGEgbm9uLXplcm8gbGVuZ3RoIG1hdGNoLCB0aGUgYWJvcnRDb250ZXh0IG9uIGltbWVkaWF0ZSBzdWNjZXNzCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBib29sZWFuIGFsbG93SlNQLCBib29sZWFuIGFsbG93Q0RBVEEsIFN0cmluZyBzZWFyY2hDb250ZXh0LCBpbnQgZXhpdFN0YXRlLCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlib29sZWFuIHN0aWxsU2VhcmNoaW5nID0gdHJ1ZTsKLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQotCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCWludCBzZWFyY2hTdHJpbmdMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoKCk7Ci0JaW50IG4gPSAwOwotCWNoYXIgbGFzdENoZWNrQ2hhcjsKLQlpbnQgaTsKLQlib29sZWFuIHNhbWUgPSBmYWxzZTsKLQkvLyBDaGVjayBmb3IgSlNQIHN0YXJ0cyAoIjwlIikgaWYgdGhlIHRhZyBpcyBnbG9iYWwgbGlrZSBTQ1JJUFQgb3IgU1RZTEUKLQlib29sZWFuIGNoZWNrSlNQcyA9IGFsbG93SlNQICYmICFmRm9yYmlkSlNQOwotCWJvb2xlYW4gY2hlY2tlZEZvckpTUHNPbmNlID0gIWNoZWNrSlNQczsKLQlib29sZWFuIGNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSBmYWxzZTsKLQkKLQl3aGlsZSAoc3RpbGxTZWFyY2hpbmcpIHsKLQkJbiA9IDA7Ci0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuCi0JCW4gPSB5eV9hZHZhbmNlKCk7Ci0JCXdoaWxlKG4gIT0gWVlFT0YgJiYgeXlfY3VycmVudFBvcyA8IHNlYXJjaFN0cmluZ0xlbmd0aCkKLQkJCW4gPSB5eV9hZHZhbmNlKCk7Ci0vLwkJYyA9IChjaGFyKSBuOwotCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5LgotCQlpZiAobiA9PSBZWUVPRiAmJiBjaGVja2VkRm9ySlNQc09uY2UpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKioKLQkJCSAqIExvb2sgZm9yIHN0YXJ0aW5nIEpTUHMgIjwlIgotCQkJICovCi0JCQljaGVja2VkRm9ySlNQc09uY2UgPSB0cnVlOwotCQkJLy8gMSkgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCA6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIEpTUHMKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0LgotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQKLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4KLQkJCWlmKGNoZWNrSlNQcyAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgCi0JCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCArIDFdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBqc3BzdGFydGVyLmxlbmd0aCA6IFRoZXJlJ3Mgbm90IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IGNoZWNrIGZvciBhIEpTUCAyIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndAotCQkJLy8gc3BpbGwgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2hpbGUgY2hlY2tpbmcuCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmCi0JCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gMV0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSA9PSAnJScpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSAxOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMykgeXlfY3VycmVudFBvcy4uKHl5X2N1cnJlbnRQb3MranNwU3RhcnRsZW5ndGgtMSkgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLgotCQkJZWxzZSBpZihjaGVja0pTUHMgJiYgIWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X3N0YXJ0UmVhZCA+IDAgJiYKLQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsKLQkJCQljaGVja2VkSlNQc0F0U3RhcnRPbmNlID0gdHJ1ZTsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X3N0YXJ0UmVhZDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQotCi0JCQkvKioKLQkJCSAqIExvb2sgZm9yIHN0YXJ0aW5nIENEQVRBICI8IVtDREFUQVsiCi0JCQkgKi8KLQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIENEQVRBCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgQ0RBVEEgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0LgotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDxbIUNEQVRBW11dPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLgotLyoJCQlpZihjaGVja0NEQVRBICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyArIHNlYXJjaFN0cmluZ0xlbmd0aCA8IHl5X2J1ZmZlci5sZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiAKLQkJCQljaGFyc01hdGNoKGNkYXRhU3RhcnRlciwgeXlfYnVmZmVyLCAwLCB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoKSkgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJLy8gZ28gdG8gYSBzdGF0ZSB3aGVyZSBDREFUQSBjYW4gYmUgZm91bmQKLQkJCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFR5cGUoc2VhcmNoQ29udGV4dCk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydCh5eWNoYXIpOwotCQkJCX0KLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKHNlYXJjaENvbnRleHQsIHl5Y2hhciwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQlTdHJpbmcgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQlpZihjb250ZXh0LmVxdWFscyhYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfT1BFTikpIHsKLQkJCQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfT1BFTiwgWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX0NMT1NFKTsKLQkJCQl9Ci0JCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0qLy8qCi0JCQkvLyAyKSB5eV9jdXJyZW50UG9zIC0gY2RhdGFTdGFydGVyLmxlbmd0aDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgQ0RBVEEgcmlnaHQgaGVyZSBzcG90cyBiYWNrIGluIHdoYXQgd2UgY291bGQgcmVhZAotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb247IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24gKmhhdmluZyogY2xvc2VUYWdTdHJpbmdMZW5ndGggYW1vdW50IG9mIGlucHV0IHRvIHdvcmsgYXMgZGVzaWduZWQuICBNdXN0IGJlIHN1cmUgd2UgZG9uJ3QKLQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLgotCQkJZWxzZSBpZihjaGVja0NEQVRBICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9jdXJyZW50UG9zID4gMCAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYKLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAzKSB5eV9jdXJyZW50UG9zIDogQ2hlY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvbmUgdGltZQotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgaW1tZWRpYXRlbHkgaW4gdGhlIGJsb2NrIGFyZWE7IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24geXlfY3VycmVudFBvcyBlcXVhbGluZyBleGFjdGx5IHRoZSBwcmV2aW91cyBlbmQgKzEgdG8gd29yayBhcyBkZXNpZ25lZC4KLQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiAhY2hlY2tlZEZvckNEQVRBT25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJgotCQkJCQl5eV9zdGFydFJlYWQgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCArIDFdID09ICclJykgewotCQkJCWNoZWNrZWRGb3JDREFUQU9uY2UgPSB0cnVlOwotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotKi8KLQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyCi0JCQkvLyBhbmQgc2VlIGlmIGl0IG1hdGNoZXMKLQkJCWlmIChuID09IFlZRU9GKSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNhbWUgPSB0cnVlOwotCQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMKLQkJCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmKHNhbWUgJiYgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCQllbHNlIGlmKHNhbWUgJiYgIWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCQlzYW1lID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0pID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzZWFyY2hTdHJpbmcuY2hhckF0KGkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBzYWZldHkgY2hlY2sgZmFpbGVkOyBubyBtYXRjaCBpcyBwb3NzaWJsZSByaWdodCBub3cKLQkJCQllbHNlIHsKLQkJCQkJc2FtZSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgY2xvc2UgdGFncyB0byBlbnN1cmUgdGhhdCB0YXJnZXRTdHJpbmc9Ijwvc2NyaXB0IiBkb2Vzbid0IG1hdGNoCi0JCQkJLy8gIjwvc2NyaXB0UyIKLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOwotCQkJCS8vIFN1Y2NlZWQgb24gIjwvc2NyaXB0PiIgYW5kICI8L3NjcmlwdCAiCi0JCQkJaWYobGFzdENoZWNrQ2hhciA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsYXN0Q2hlY2tDaGFyKSkKLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCWlmIChuICE9IFlZRU9GIHx8IHNhbWUpIHsKLQkJLy8gV2UndmUgc3RvcHBlZCBzaG9ydCBvZiB0aGUgZW5kIG9yIGRlZmluaXRlbHkgZm91bmQgYSBtYXRjaAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJLy8gSWYgdGhlIHNlYXJjaFN0cmluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCQlpZiAoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJeXliZWdpbihpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsKLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8vIFdlIHJhbiB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBpbnB1dAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQl5eV9jdXJyZW50UG9zKys7Ci0JfQotCXl5YmVnaW4oZXhpdFN0YXRlKTsKLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCXJldHVybiBzZWFyY2hDb250ZXh0OwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOwotCXJldHVybiBkb1NjYW4oIjwvIiArIGZDdXJyZW50VGFnTmFtZSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSksIFlZSU5JVElBTCwgWVlJTklUSUFMKTsKLX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0JICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUKLQkgKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuCi0JICoKLQkgKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5Ci0JICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4KLQkgKgotCSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkCi0JICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuCi0JICovCi0JcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykKLQkJaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJCWlmIChmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gY29udGFpbmVyID0gZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXI7Ci0JCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJCQlyZXR1cm4gY29udGFpbmVyOwotCQkJfQotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQlpZiAoY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7Ci0JCQkJcmV0dXJuIGZFbWJlZGRlZENvbnRhaW5lcjsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCQllbHNlCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCQl9Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJaWYgKHl5X2F0RU9GKSB7Ci0JCQkJZlRva2VuQ291bnQrKzsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChmX2NvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCkgewotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmRW1iZWRkZWRDb250YWluZXI7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJZWxzZQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsKLQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsKLQkJfQotCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQkvLyBFT0YKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGlzY292ZXJlZCAiICsgZlRva2VuQ291bnQgKyAiIHRva2Vucy4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZUb2tlbkNvdW50Kys7Ci0JCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BUb2tlbml6ZXIoKXsKLQkJc3VwZXIoKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgSlNQVG9rZW5pemVyKGNoYXJbXSBjaGFyQXJyYXkpewotCQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgbmV3T2Zmc2V0KTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgewotCQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQkJcmVzZXQoaW4sIDApOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAqCi0JICoKLQkgKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLQkgKiB0aGF0IHJlc2V0dGluZyBhIHByZS1leGlzdGluZyB0b2tlbml6ZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLgotCSAqCi0JICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLQkgKiA8ZW0+Z2VuZXJhdGVkPC9lbT4gb3V0cHV0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBiZWZvcmUgdGhpcyBtZXRob2Qgd2FzCi0JICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJZk9mZnNldCA9IG5ld09mZnNldDsKLQkKLQkJLyogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQkKLQkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0JCi0JCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQkKLQkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0JCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXl5X21hcmtlZFBvcyA9IDA7Ci0JCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQkKLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCQotCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfc3RhcnRSZWFkID0gMDsKLQkKLQkJLyoqIAotCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkJICogZnJvbSBpbnB1dCAKLQkJICovCi0JCXl5X2VuZFJlYWQgPSAwOwotCQotCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQkKLQkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0JCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQkKLQkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0JCi0JCi0JCS8qIHVzZXIgdmFyczogKi8KLQkJZlRva2VuQ291bnQgPSAwOwotCSAKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQkJZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCQlmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCQotCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOwotCQotCQljb250ZXh0ID0gbnVsbDsKLQkJc3RhcnQgPSAwOwotCQl0ZXh0TGVuZ3RoID0gMDsKLQkJbGVuZ3RoID0gMDsKLQkKLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJCi0JCWZFTGxldmVsID0gMDsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqIEBzZWUgY29tLmlibS5zZWQucGFyc2VyLkJsb2NrVG9rZW5pemVyI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCUpTUFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBKU1BUb2tlbml6ZXIoKTsKLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCAKLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7Ci0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJfQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZk5lc3RhYmxlUHJlZml4ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKSBmTmVzdGFibGVQcmVmaXhlcy5nZXQoaSk7Ci0JCQlpZihtYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGROZXN0YWJsZVByZWZpeChtYXJrZXIpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkJLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkJLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQkJcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuSlNQQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTY2FuIGZvciAnLS0lPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JCS8vICAgSlNQX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfSlNQX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkJLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JCXJldHVybiBkb1NjYW4oIi0tJT4iLCBmYWxzZSwgZmFsc2UsIHRydWUsIEpTUF9DT01NRU5UX1RFWFQsIFNUX0pTUF9DT01NRU5UX0VORCwgU1RfSlNQX0NPTU1FTlRfRU5EKTsKLQl9Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFsyODkwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgNzE4MCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEzNzYpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIC0gZnJvbSB0aGUgU0VEIEpGbGV4IHNrZWxldG9uCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yCi0gICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7Ci0JCWZvcihpbnQgaiA9IDA7IGogPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaisrKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpZkJsb2NrTWFya2Vycy5nZXQoaik7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsKLQkJCQlib29sZWFuIG1hdGNoZXNTb0ZhciA9IHRydWU7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IHRhZ25hbWVMZW5ndGggJiYgbWF0Y2hlc1NvRmFyOyBpKyspIHsKLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSAhPSBtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkpCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobWF0Y2hlc1NvRmFyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKgotCSAqIFJldHVybiBBTEwgb2YgdGhlIHJlZ2lvbnMgc2Nhbm5hYmxlIHdpdGhpbiB0aGUgcmVtYWluaW5nIHRleHQKLQkgKiBOb3RlOiBmb3IgdmVyaWZpY2F0aW9uIHVzZQotCSAqLwotCXB1YmxpYyBmaW5hbCBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQl0b2tlbnMuYWRkKHJlZ2lvbik7Ci0JCQkJfQotCQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSsiOiBpbnB1dCBjb3VsZCBub3QgYmUgdG9rZW5pemVkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0T2Zmc2V0KCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCAKLQkJCS8vIHdheSBvZiBnZXR0aW5nIHRva2VucywgbWFueSBlcnJvcnMgYXJlIHNpbXBseSBoaWRkZW4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBub3QgaGFuZGxlZCByZXRyaWV2aW5nIHJlZ2lvbnM6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocyArICIgKCIgKyB5eWNoYXIgKyAiLSIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdVdGlscy5lc2NhcGUoeXl0ZXh0KCkpICsgIlwnIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICAtIHNrZWxldG9uLnNlZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotLyogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQgKi8KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgewotCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOwotCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIC8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iCi0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLSAgICB5eV9wdXNoYmFja1BvcyA9IC0xOwotICAgIGJvb2xlYW4geXlfd2FzX3B1c2hiYWNrOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgYm9vbGVhbiB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICBmb3IgKHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQ7IHl5X2N1cnJlbnRQb3MgPCB5eV9tYXJrZWRQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9jdXJyZW50UG9zKyspIHsKLSAgICAgICAgc3dpdGNoICh5eV9idWZmZXJbeXlfY3VycmVudFBvc10pIHsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHl5X2NvdW50ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHl5X2NvdW50ZWQpCi0gICAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV9jb3VudGVkKSB7Ci0gICAgICAgIGlmICggeXlfYWR2YW5jZSgpID09ICdcbicgKSB5eWxpbmUtLTsKLSAgICAgICAgaWYgKCAheXlfYXRFT0YgKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLSAgICAgIHl5X3dhc19wdXNoYmFjayA9IGZhbHNlOwotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDIpID4gMCApCi0gICAgICAgICAgICB5eV9wdXNoYmFja1BvcyA9IHl5X2N1cnJlbnRQb3M7Ci0KLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPiAwICkgewotICAgICAgICAgICAgeXlfd2FzX3B1c2hiYWNrID0gKHl5X2F0dHJpYnV0ZXMgJiA0KSA+IDA7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA+IDAgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X3dhc19wdXNoYmFjaykKLSAgICAgICAgeXlfbWFya2VkUG9zID0geXlfcHVzaGJhY2tQb3M7Ci0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgNTc4OiAKLSAgICAgICAgY2FzZSA1ODM6IAotICAgICAgICBjYXNlIDU5MDogCi0gICAgICAgIGNhc2UgNTk1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJqc3AgZGlyZWN0aXZlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjExOiBicmVhazsKLSAgICAgICAgY2FzZSA1NDI6IAotICAgICAgICBjYXNlIDU0NDogCi0gICAgICAgIGNhc2UgNTQ1OiAKLSAgICAgICAgY2FzZSA1NDY6IAotICAgICAgICBjYXNlIDU0NzogCi0gICAgICAgIGNhc2UgNTQ4OiAKLSAgICAgICAgY2FzZSA1NDk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ0RBVEEgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7Ci0JcmV0dXJuIFhNTF9DREFUQV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2MTI6IGJyZWFrOwotICAgICAgICBjYXNlIDUzNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgianNwOnJvb3QgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gSlNQX1JPT1RfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDYxMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTI2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjE0OiBicmVhazsKLSAgICAgICAgY2FzZSA1MjU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2MTU6IGJyZWFrOwotICAgICAgICBjYXNlIDUyNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDYxNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTEwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7Ci0gfQotICAgICAgICBjYXNlIDYxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07Ci0gfQotICAgICAgICBjYXNlIDYxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTAzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjE5OiBicmVhazsKLSAgICAgICAgY2FzZSA0ODE6IAotICAgICAgICBjYXNlIDUxOTogCi0gICAgICAgIGNhc2UgNTIwOiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2MjA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3NjogCi0gICAgICAgIGNhc2UgNTE1OiAKLSAgICAgICAgY2FzZSA1MTY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjIxOiBicmVhazsKLSAgICAgICAgY2FzZSA0NzI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBKU1BfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjIyOiBicmVhazsKLSAgICAgICAgY2FzZSA0NzE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7Ci0JaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKQotCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjIzOiBicmVhazsKLSAgICAgICAgY2FzZSA0NjA6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0yKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiVkJMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2MjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ1OTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJFTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjI1OiBicmVhazsKLSAgICAgICAgY2FzZSA0NTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2MjY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ1MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09NTUVOVF9URVhUOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9DT01NRU5UOwotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOwotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2Mjc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ1MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5KU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQlyZXR1cm4gSlNQX0NPTU1FTlRfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNjI4OiBicmVhazsKLSAgICAgICAgY2FzZSAzODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDYyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDYzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzgxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjMxOiBicmVhazsKLSAgICAgICAgY2FzZSAzODA6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7Ci0JZkVMbGV2ZWwrKzsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBKU1BfVkJMX0NMT1NFKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2MzI6IGJyZWFrOwotICAgICAgICBjYXNlIDM3OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgNjMzOiBicmVhazsKLSAgICAgICAgY2FzZSAzNzg6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAyKTsKLQlmRUxsZXZlbCsrOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgSlNQX0VMX0NMT1NFKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2MzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2MzU6IGJyZWFrOwotICAgICAgICBjYXNlIDM2OTogCi0gICAgICAgIGNhc2UgNDA2OiAKLSAgICAgICAgY2FzZSA0MTI6IAotICAgICAgICBjYXNlIDQxODogCi0gICAgICAgIGNhc2UgNDIxOiAKLSAgICAgICAgY2FzZSA0MjQ6IAotICAgICAgICBjYXNlIDQyNzogCi0gICAgICAgIGNhc2UgNDMxOiAKLSAgICAgICAgY2FzZSA0MzU6IAotICAgICAgICBjYXNlIDQzNzogCi0gICAgICAgIGNhc2UgNDQwOiAKLSAgICAgICAgY2FzZSA0NDM6IAotICAgICAgICBjYXNlIDQ0NzogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZXhwcmVzc2lvbiBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhbiBleHByZXNzaW9uIG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiBKU1BfRVhQUkVTU0lPTl9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VYUFJFU1NJT05fT1BFTiwgSlNQX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjM2OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjg6IAotICAgICAgICBjYXNlIDQwNTogCi0gICAgICAgIGNhc2UgNDExOiAKLSAgICAgICAgY2FzZSA0MTc6IAotICAgICAgICBjYXNlIDQyMDogCi0gICAgICAgIGNhc2UgNDIzOiAKLSAgICAgICAgY2FzZSA0MjY6IAotICAgICAgICBjYXNlIDQzMDogCi0gICAgICAgIGNhc2UgNDM0OiAKLSAgICAgICAgY2FzZSA0MzY6IAotICAgICAgICBjYXNlIDQzOTogCi0gICAgICAgIGNhc2UgNDQyOiAKLSAgICAgICAgY2FzZSA0NDY6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGRlY2xhcmF0aW9uIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiBKU1BfREVDTEFSQVRJT05fT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfREVDTEFSQVRJT05fT1BFTiwgSlNQX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjM3OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjc6IAotICAgICAgICAgIHsgCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZGlyZWN0aXZlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7Ci0JCXJldHVybiBKU1BfRElSRUNUSVZFX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGRpcmVjdGl2ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUUpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ESVJFQ1RJVkVfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9ESVJFQ1RJVkVfQ0xPU0UsIEpTUF9DTE9TRX0pOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2Mzg6IGJyZWFrOwotICAgICAgICBjYXNlIDM1NzogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfRFFVT1RFU19FTkQpOwotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2Mzk6IGJyZWFrOwotICAgICAgICBjYXNlIDM1MzogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfU1FVT1RFU19FTkQpOwotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NDA6IGJyZWFrOwotICAgICAgICBjYXNlIDM1MTogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbCsrOwotCWlmKGZFTGxldmVsID09IDEpIHsKLQkJcmV0dXJuIEpTUF9WQkxfT1BFTjsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX0RRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NDI6IGJyZWFrOwotICAgICAgICBjYXNlIDMzNzogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQzOiBicmVhazsKLSAgICAgICAgY2FzZSAzMzU6IAotICAgICAgICAgIHsgCi0JLy9TeXN0ZW0ub3V0LnByaW50bG4oSlNQX0VMX0NPTlRFTlQrICI6WyIgKyB5eXRleHQoKSArICJdIik7Ci0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDMzNDogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbCsrOwotCWlmKGZFTGxldmVsID09IDEpIHsKLQkJcmV0dXJuIEpTUF9FTF9PUEVOOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjQ1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzE6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9WQkwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY0NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzMwOiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX0RRVU9URURfRUwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI4OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfVkJMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgVkJMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NDg6IGJyZWFrOwotICAgICAgICBjYXNlIDMyNzogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9TUVVPVEVEX0VMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NDk6IGJyZWFrOwotICAgICAgICBjYXNlIDMyNjogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWludCBpbmNvbWluZ1N0YXRlID0geXlzdGF0ZSgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBlbmQgdGFnIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9FTkRfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY1MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg0OiAKLSAgICAgICAgY2FzZSAyOTY6IAotICAgICAgICBjYXNlIDMwMjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOwotIH0KLSAgICAgICAgY2FzZSA2NTE6IGJyZWFrOwotICAgICAgICBjYXNlIDI3MjogCi0gICAgICAgICAgeyAKLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsKLQkvLyBwdXNoYmFjayB0byBqdXN0IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNrZXQKLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsKLQlpZighaXNOZXN0YWJsZSh0YWdOYW1lKSkgewotCQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JCXJldHVybiBYTUxfVEFHX09QRU47Ci0JfQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQkvLyBlbWJlZGRlZCBjb250YWluZXIgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIHRoZSBuYW1lIChhZ2FpbikgbmV4dAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjUyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzA6IAotICAgICAgICAgIHsgCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7Ci0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0Ci0JeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMSk7Ci0JaWYoIWlzTmVzdGFibGUodGFnTmFtZSkpIHsKLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCQlyZXR1cm4gWE1MX1RBR19PUEVOOwotCX0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0Ci0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjUzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggZG91YmxlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjU1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIHRhZyBlbWJlZGRlZCBuYW1lIHN0YXJ0IC0gc3RhcnQgdGFnIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjU2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICBjYXNlIDEyNzogCi0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgY2FzZSAyNzQ6IAotICAgICAgICBjYXNlIDI3ODogCi0gICAgICAgIGNhc2UgMjc5OiAKLSAgICAgICAgY2FzZSAzODg6IAotICAgICAgICBjYXNlIDM5MTogCi0gICAgICAgIGNhc2UgNDU4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA2NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDY1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjU5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgY2FzZSAyNjk6IAotICAgICAgICBjYXNlIDM4NzogCi0gICAgICAgIGNhc2UgNDU3OiAKLSAgICAgICAgY2FzZSA0ODU6IAotICAgICAgICBjYXNlIDQ4NjogCi0gICAgICAgIGNhc2UgNTA0OiAKLSAgICAgICAgY2FzZSA1MDU6IAotICAgICAgICBjYXNlIDUyMjogCi0gICAgICAgIGNhc2UgNTIzOiAKLSAgICAgICAgY2FzZSA1MzU6IAotICAgICAgICBjYXNlIDU0MzogCi0gICAgICAgIGNhc2UgNTUwOiAKLSAgICAgICAgY2FzZSA1NTE6IAotICAgICAgICBjYXNlIDU1MjogCi0gICAgICAgIGNhc2UgNTUzOiAKLSAgICAgICAgY2FzZSA1NTU6IAotICAgICAgICBjYXNlIDU2MTogCi0gICAgICAgIGNhc2UgNTYyOiAKLSAgICAgICAgY2FzZSA1NjM6IAotICAgICAgICBjYXNlIDU2NDogCi0gICAgICAgIGNhc2UgNTY1OiAKLSAgICAgICAgY2FzZSA1NzE6IAotICAgICAgICBjYXNlIDU3MjogCi0gICAgICAgIGNhc2UgNTczOiAKLSAgICAgICAgY2FzZSA1NzQ6IAotICAgICAgICBjYXNlIDU3NTogCi0gICAgICAgIGNhc2UgNTgxOiAKLSAgICAgICAgY2FzZSA1ODI6IAotICAgICAgICBjYXNlIDU4NDogCi0gICAgICAgIGNhc2UgNTg1OiAKLSAgICAgICAgY2FzZSA1OTE6IAotICAgICAgICBjYXNlIDU5MjogCi0gICAgICAgIGNhc2UgNTkzOiAKLSAgICAgICAgY2FzZSA1OTQ6IAotICAgICAgICBjYXNlIDYwMDogCi0gICAgICAgIGNhc2UgNjAxOiAKLSAgICAgICAgY2FzZSA2MDI6IAotICAgICAgICBjYXNlIDYwMzogCi0gICAgICAgIGNhc2UgNjA2OiAKLSAgICAgICAgY2FzZSA2MDc6IAotICAgICAgICBjYXNlIDYwOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NjA6IGJyZWFrOwotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0JCWZFbWJlZGRlZEhpbnQgPSBnZXRCbG9ja01hcmtlckNvbnRleHQoKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQkxPQ0tfVEFHX1NDQU47Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjYxOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgIGNhc2UgMjY0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA2NjM6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZGlyZWN0aXZlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSk7Ci0JcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjY1OiBicmVhazsKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgOTk6IAotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGNvZGUgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZG9TY2FuKCIlPiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIEpTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQpOwotIH0KLSAgICAgICAgY2FzZSA2NjY6IGJyZWFrOwotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDI1NDogCi0gICAgICAgIGNhc2UgMjU1OiAKLSAgICAgICAgY2FzZSAyNTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNjY4OiBicmVhazsKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjY5OiBicmVhazsKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NzA6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgMjQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA2NzI6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgY2FzZSAyMDA6IAotICAgICAgICBjYXNlIDIwMTogCi0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICBjYXNlIDIxNTogCi0gICAgICAgIGNhc2UgMjE4OiAKLSAgICAgICAgY2FzZSAyMTk6IAotICAgICAgICBjYXNlIDM2MjogCi0gICAgICAgIGNhc2UgMzY1OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICBjYXNlIDE3OTogCi0gICAgICAgIGNhc2UgMTgwOiAKLSAgICAgICAgY2FzZSAxODM6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMTk0OiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgIGNhc2UgMzMyOiAKLSAgICAgICAgY2FzZSAzNDY6IAotICAgICAgICBjYXNlIDM0OTogCi0gICAgICAgIGNhc2UgNDE2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjc0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDMyMjogCi0gICAgICAgIGNhc2UgNDEzOiAKLSAgICAgICAgY2FzZSA0NzA6IAotICAgICAgICBjYXNlIDQ5MzogCi0gICAgICAgIGNhc2UgNTEyOiAKLSAgICAgICAgY2FzZSA1Mjg6IAotICAgICAgICBjYXNlIDUzNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NzU6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAxNTI6IAotICAgICAgICBjYXNlIDE1MzogCi0gICAgICAgIGNhc2UgMzEyOiAKLSAgICAgICAgY2FzZSA0MDc6IAotICAgICAgICBjYXNlIDQ2ODogCi0gICAgICAgIGNhc2UgNDkyOiAKLSAgICAgICAgY2FzZSA1MTE6IAotICAgICAgICBjYXNlIDUyNzogCi0gICAgICAgIGNhc2UgNTM2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NzY6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JaWYoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKT09U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEfHxmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKS0xKTsKLQkJcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCX0KLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjc3OiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTA0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNjc4OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgIGNhc2UgMTc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA2Nzk6IGJyZWFrOwotICAgICAgICBjYXNlIDA6IAotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICBjYXNlIDIyNjogCi0gICAgICAgIGNhc2UgMjI4OiAKLSAgICAgICAgY2FzZSAyMjk6IAotICAgICAgICBjYXNlIDIzMTogCi0gICAgICAgIGNhc2UgMjMzOiAKLSAgICAgICAgY2FzZSAzNzI6IAotICAgICAgICBjYXNlIDM3MzogCi0gICAgICAgIGNhc2UgMzc0OiAKLSAgICAgICAgY2FzZSA0NTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODA6IGJyZWFrOwotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSAxMDE6IAotICAgICAgICBjYXNlIDExMzogCi0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgY2FzZSAxMjk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNjgxOiBicmVhazsKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgODg6IAotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICBjYXNlIDEwMzogCi0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgIGNhc2UgMTE1OiAKLSAgICAgICAgY2FzZSAxMjQ6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMTMyOiAKLSAgICAgICAgY2FzZSAxMzM6IAotICAgICAgICBjYXNlIDEzNDogCi0gICAgICAgIGNhc2UgMTM2OiAKLSAgICAgICAgY2FzZSAxMzc6IAotICAgICAgICBjYXNlIDEzOTogCi0gICAgICAgIGNhc2UgMTQwOiAKLSAgICAgICAgY2FzZSAxNDE6IAotICAgICAgICBjYXNlIDE0NDogCi0gICAgICAgIGNhc2UgMTQ1OiAKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICBjYXNlIDE0OTogCi0gICAgICAgIGNhc2UgMTUwOiAKLSAgICAgICAgY2FzZSAxNTE6IAotICAgICAgICBjYXNlIDE1NjogCi0gICAgICAgIGNhc2UgMTU3OiAKLSAgICAgICAgY2FzZSAxNTg6IAotICAgICAgICBjYXNlIDE2NDogCi0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE3MzogCi0gICAgICAgIGNhc2UgMTc3OiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgIGNhc2UgMTg2OiAKLSAgICAgICAgY2FzZSAxODg6IAotICAgICAgICBjYXNlIDE4OTogCi0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICBjYXNlIDIwNjogCi0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgY2FzZSAyMDk6IAotICAgICAgICBjYXNlIDIxMDogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgY2FzZSAyMjA6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgNjgyOiBicmVhazsKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JU3RyaW5nIHJldHVybmVkQ29udGV4dCA9IGRvU2NhbigiXV0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQsICBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQKLQlpZihyZXR1cm5lZENvbnRleHQgPT0gWE1MX0NEQVRBX1RFWFQpCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsKLQlyZXR1cm4gcmV0dXJuZWRDb250ZXh0OwotIH0KLSAgICAgICAgY2FzZSA2ODM6IGJyZWFrOwotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgY2FzZSAyMTE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDY4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSA2ODU6IGJyZWFrOwotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICBjYXNlIDIzOTogCi0gICAgICAgIGNhc2UgMjQwOiAKLSAgICAgICAgY2FzZSAzODQ6IAotICAgICAgICBjYXNlIDQ1NjogCi0gICAgICAgIGNhc2UgNDg0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2ODY6IGJyZWFrOwotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOwotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDY4NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzg6IAotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgICAgeyAKLQkJLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZAotCXJldHVybiBkb1NjYW4oIj8+IiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOwotIH0KLSAgICAgICAgY2FzZSA2ODg6IGJyZWFrOwotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY4OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI2OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCk7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBzaW5nbGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJAotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjkwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM4OiAKLSAgICAgICAgY2FzZSAxNDI6IAotICAgICAgICBjYXNlIDI4OTogCi0gICAgICAgIGNhc2UgMjkzOiAKLSAgICAgICAgY2FzZSA0MDA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLSB9Ci0gICAgICAgIGNhc2UgNjkzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICBjYXNlIDE0NzogCi0gICAgICAgIGNhc2UgMjk5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0gfQotICAgICAgICBjYXNlIDY5NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ4OiAKLSAgICAgICAgY2FzZSAzMDU6IAotICAgICAgICBjYXNlIDMwOTogCi0gICAgICAgIGNhc2UgNDAzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjk1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjk2OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTU6IAotICAgICAgICBjYXNlIDMxNTogCi0gICAgICAgIGNhc2UgMzE5OiAKLSAgICAgICAgY2FzZSA0MDk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjk4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjU6IAotICAgICAgICBjYXNlIDE2NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5KU1AgY29tbWVudCB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgNjk5OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjg6IAotICAgICAgICBjYXNlIDE3NDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY5OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluc2lkZSBvZiBKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkKLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzAxOiBicmVhazsKLSAgICAgICAgY2FzZSAxNzE6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzAyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzAzOiBicmVhazsKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFUyk7Ci0JcmV0dXJuIEpTUF9FTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVMpOwotCXJldHVybiBKU1BfRUxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MDU6IGJyZWFrOwotICAgICAgICBjYXNlIDE4NDogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbC0tOwotCWlmKGZFTGxldmVsID09IDApIHsKLQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQlyZXR1cm4gSlNQX0VMX0NMT1NFOwotCX0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlyZXR1cm4gSlNQX0VMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzA3OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCXJldHVybiBKU1BfRUxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MDg6IGJyZWFrOwotICAgICAgICBjYXNlIDE5NjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX0VMX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MDk6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfRFFVT1RFUyk7Ci0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MTA6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMzogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfU1FVT1RFUyk7Ci0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MTE6IGJyZWFrOwotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbC0tOwotCWlmKGZFTGxldmVsID09IDApIHsKLQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQlyZXR1cm4gSlNQX1ZCTF9DTE9TRTsKLQl9Ci0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzEyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlyZXR1cm4gSlNQX1ZCTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcxMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNzogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzE1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3MTY6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5wcm9jZXNzaW5nIGluc3RydWN0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfUEkpOwotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47Ci0gfQotICAgICAgICBjYXNlIDcxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIzOiAKLSAgICAgICAgY2FzZSAyMzQ6IAotICAgICAgICBjYXNlIDMxMTogCi0gICAgICAgIGNhc2UgMzIxOiAKLSAgICAgICAgY2FzZSAzMjM6IAotICAgICAgICBjYXNlIDMzMzogCi0gICAgICAgIGNhc2UgMzM4OiAKLSAgICAgICAgY2FzZSAzNDI6IAotICAgICAgICBjYXNlIDM0NTogCi0gICAgICAgIGNhc2UgMzQ4OiAKLSAgICAgICAgY2FzZSAzNTA6IAotICAgICAgICBjYXNlIDM1NDogCi0gICAgICAgIGNhc2UgMzU4OiAKLSAgICAgICAgY2FzZSAzNjE6IAotICAgICAgICBjYXNlIDM2NDogCi0gICAgICAgICAgeyAKLQkvKiBKU1Agc2NyaXB0bGV0IGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDEpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSByZWd1bGFyIHNjcmlwdGxldCBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiBKU1BfU0NSSVBUTEVUX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9TQ1JJUFRMRVRfT1BFTiwgSlNQX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNzE4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjQ6IAotICAgICAgICAgIHsgCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3MTk6IGJyZWFrOwotICAgICAgICBjYXNlIDIzODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MjA6IGJyZWFrOwotICAgICAgICBjYXNlIDI0MTogCi0gICAgICAgICAgeyAKLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQotCQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MjI6IGJyZWFrOwotICAgICAgICBjYXNlIDI1OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBKU1BfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjYxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIEpTUF9ESVJFQ1RJVkVfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYyOiAKLSAgICAgICAgY2FzZSAxNjM6IAotICAgICAgICAgIHsgCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCSB9Ci0gICAgICAgIGNhc2UgNzI1OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmpmbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODc4MzM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmpmbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjU1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLypubHNYWFgqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuQmxvY2tNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuVGFnTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5EZWJ1ZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbkNvbnRhaW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5JbnRTdGFjazsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0czsNCi0NCi0lJQ0KLQ0KLSV7DQotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsNCi0gDQotCS8vIHJlcXVpcmVkIGhvbGRlcnMgZm9yIHdoaXRlLXNwYWNlIGNvbXBhY3RpbmcNCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0ID0gMTsNCi0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsNCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsNCi0NCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IGFuIGVtYmVkZGVkIHJlZ2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkDQotCXByaXZhdGUgU3RyaW5nIGZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgc3RhdGUgdG8gZW50ZXIgb25jZSBhbiBlbWJlZGRlZCByZWdpb24gaGFzDQotCS8vICAgYmVlbiBjb21wbGV0ZWQNCi0JcHJpdmF0ZSBpbnQgZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQkvLyB0aGUgY29udGFpbmVyIHVzZWQgdG8gY3JlYXRlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9DT05URVhUID0gIlBST1hZX0NPTlRFWFQiOw0KLQ0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOw0KLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsNCi0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsNCi0NCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzDQotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOw0KLQkNCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZA0KLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQ0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgaW5zaWRlIG9mIGFuIGVtYmVkZGVkIHJlZ2lvbg0KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbFRhZ05hbWUgPSBudWxsOw0KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbENvbnRleHQgPSBudWxsOw0KLQ0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMNCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KDApOw0KLQlwcml2YXRlIExpc3QgZk5lc3RhYmxlUHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOw0KLQkNCi0JLy8gd2hlcmUgdGhlIGxhc3QgaW50ZXJuYWwgY29udGFpbmVyIGJsb2NrIHdhcyBmb3VuZA0KLQlwcml2YXRlIGludCBmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOw0KLQ0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnDQotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZkZvcmJpZEpTUCA9IGZhbHNlOw0KLQkNCi0JcHJpdmF0ZSBpbnQgZkVMbGV2ZWwgPSAwOw0KLQ0KLQlwcml2YXRlIEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSgpOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmNzdmVyID0gIiRJZDogSlNQVG9rZW5pemVyLmpmbGV4LHYgMS40LjIuMSAyMDA0LzEwLzIwIDE1OjIxOjMzIGtpdGxvIEV4cCAkIjsvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQkJaWYoY29udGFpbnNUYWdOYW1lKG1hcmtlci5nZXRUYWdOYW1lKCkpKQ0KLQkJCXJldHVybjsNCi0JCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKSB7DQotCQlmTmVzdGFibGVQcmVmaXhlcy5hZGQobWFya2VyKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCkgew0KLQkJcmV0dXJuIGZOZXN0YWJsZVByZWZpeGVzOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGFibGUoU3RyaW5nIHRhZ05hbWUpIHsNCi0JCS8vSXRlcmF0b3IgYmxvY2tzID0gZk5lc3RhYmxlUHJlZml4ZXMuaXRlcmF0b3IoKTsNCi0JCS8vd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJLy8JVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpYmxvY2tzLm5leHQoKTsNCi0JCS8vCVN0cmluZyBtYXJrZXJOYW1lID0gbWFya2VyLmdldFRhZ05hbWUoKTsNCi0JCS8vCWlmKHRhZ05hbWUubGVuZ3RoKCkgPiBtYXJrZXJOYW1lLmxlbmd0aCgpICsgMSAmJiB0YWdOYW1lLnN0YXJ0c1dpdGgobWFya2VyTmFtZSkgJiYgdGFnTmFtZS5jaGFyQXQobWFya2VyTmFtZS5sZW5ndGgoKSkgPT0gJzonKSB7DQotCQkvLwkJcmV0dXJuIG1hcmtlci5pc0dsb2JhbCgpIHx8IGdldE9mZnNldCgpID49IG1hcmtlci5nZXRNYXJrZXIoKS5nZXRTdGFydCgpOw0KLQkJLy8JfQ0KLQkJLy99DQotCQkvL3JldHVybiBmYWxzZTsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyBuYW1lKSB7DQotCQlpZiAoZk5lc3RhYmxlUHJlZml4ZXMgIT0gbnVsbCkgew0KLQkJCUl0ZXJhdG9yIG5lc3RhYmxlcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7DQotCQkJd2hpbGUgKG5lc3RhYmxlcy5oYXNOZXh0KCkpIHsNCi0JCQkJaWYgKCgoVGFnTWFya2VyKSBuZXN0YWJsZXMubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkNCi0JCQkJCW5lc3RhYmxlcy5yZW1vdmUoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kIA0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7DQotCQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7DQotCQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7DQotCQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7DQotCQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQ0KLQkJCQkJYmxvY2tzLnJlbW92ZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUYWdOYW1lKSB7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbnVsbCwgZW5kVGFnTmFtZSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMpIHsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBlbmRUeXBlcywgbnVsbCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFR5cGUpIHsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBuZXcgU3RyaW5nW117ZW5kVHlwZX0sIG51bGwpOw0KLQl9DQotCS8qKg0KLQkgKiAgdXNlciBtZXRob2QgDQotCSAqIA0KLQkgKiBBc3NlbWJsZXMgYW4gZW1iZWRkZWQgY29udGFpbmVyIGJlZ2lubmluZyB3aXRoIHRoZSBnaXZlbiBzdGFydFR5cGUgYXMNCi0JICogdGhlIGZpcnN0IENvbnRleHRSZWdpb24gd2l0aGluIGl0IGFuZCBvZiB0aGUgdHlwZSBmRW1iZWRkZWRIaW50LiAgVGhlDQotCSAqIGVuZFR5cGVzW10gYXJyYXkgY29udGFpbnMgdGhlIGNvbnRleHQgdHlwZXMgdGhhdCB3aWxsIGNhdXNlIGEgc3VjY2Vzc2Z1bA0KLQkgKiBleGl0LiAgVXNlIG9mIHRoZSBlbmRUYWdOYW1lIHBhcmFtZXRlciBhbHRlcnMgdGhpcyBiZWhhdmlvciB0byBmb3JjZSBhbg0KLQkgKiBleGl0IG9uIGFuIFhNTF9UQUdfQ0xPU0UgYWZ0ZXIgc2VlaW5nIGFuIFhNTF9UQUdfTkFNRSB3aG9zZSBzaWduaWZpY2FudA0KLQkgKiB0ZXh0IG1hdGNoZXMgdGhlIGVuZFRhZ05hbWUgU3RyaW5nLiAgQWxsIGNvbnRlbnRzIGluIGJldHdlZW4gYXJlDQotCSAqIGluc2lnbmlmaWNhbnQsIGFuZCB5ZXMsIHRoaXMgbWVhbnMgY29tbWVudHMgYXJlIGFsbG93ZWQgaW5zaWRlLg0KLQkgKiovDQotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzLCBTdHJpbmcgZW5kVGFnTmFtZSkgew0KLQkJLy8gdGhlIGNvbnRleHQgb2YgdGhlIHJlZ2lvbiBiZWluZyBhZGRlZCB0byB0aGUgZW1iZWRkZWQgY29udGFpbmVyDQotCQlpbnRlcm5hbENvbnRleHQgPSBzdGFydFR5cGU7DQotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHRoaXMgY29udGFpbmVyIGJlZ2FuOyB0byBwcm92aWRlIHJlbGF0aXZlIGluZGVjZXMgZm9yIHRoZSByZWdpb25zDQotCQlpbnQgY29udGFpbmVyU3RhcnQgPSB5eWNoYXI7DQotCQlib29sZWFuIG5vdEZpbmlzaGVkID0gdHJ1ZTsNCi0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgd2Ugc2VlbSB0byBiZSBzbyB0aGF0IHRoZSBlbmRUYWdOYW1lIGNhbiBiZSBjaGVja2VkDQotCQlib29sZWFuIGlzSW5FbmRUYWcgPSBmYWxzZTsNCi0JCWJvb2xlYW4gaXNJbkZpcnN0VGFnID0gdHJ1ZTsNCi0JCS8vIGNyZWF0ZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyIGFuZCBzZXR1cCBpdHMgInR5cGUiDQotCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOw0KLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKGZFbWJlZGRlZEhpbnQpOw0KLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydChjb250YWluZXJTdGFydCk7DQotCQkJLy8gVE9ETzogcGFyZW50IHJlZ2lvbiBuZWVkcyB0byBiZSBzZXQgLi4uLiBidXQgbm90IHN1cmUgd2hlcmUgdG8gZ2V0IGl0IGZyb20gDQotCQkJLy8JCWZFbWJlZGRlZENvbnRhaW5lci5zZXRQYXJlbnQocGFyZW50UmVnaW9uKTsNCi0JCX0NCi0JCWNvbnRhaW5lclN0YXJ0ID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFN0YXJ0KCk7DQotCQl3aGlsZSAobm90RmluaXNoZWQpIHsNCi0JCQkvLyBhZGQgdGhlIHJlZ2lvbiB0byB0aGUgY29udGFpbmVyDQotCQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7DQotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsNCi0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsNCi0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cw0KLQkJCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOw0KLQkJCX0NCi0JCQl0cnkgew0KLQkJCQkvLyBsb25nc2NhbiBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gYXR0ZW1wdCBhIGJsb2NrVGFnU2NhbiB3aXRoaW4gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcg0KLQkJCQlib29sZWFuIGxvbmdzY2FuID0gZmFsc2U7DQotCQkJCS8vIHNhdmUgdGhlIHRva2VuaXplciBzdGF0ZSBpbiBjYXNlIG9mIGEgYmxvY2sgdGFnIHNjYW4NCi0JCQkJaW50IHByZXZpb3VzU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCVN0cmluZyBwcmV2aW91c0N1cnJlbnRUYWdOYW1lID0gZkN1cnJlbnRUYWdOYW1lOw0KLQkJCQlpbnQgcHJldmlvdXNQb3N0U3RhdGUgPSBmRW1iZWRkZWRQb3N0U3RhdGU7DQotCQkJCVN0cmluZyBwcmV2aW91c0VtYmVkZGVkSGludCA9IGZFbWJlZGRlZEhpbnQ7DQotCQkJCS8vIGRldGVybWluZSBpZiBhIGJsb2NrIHRhZyBzY2FuIGlzIG5lY2Vzc2FyeQ0KLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgew0KLQkJCQkJaW50ZXJuYWxUYWdOYW1lID0geXl0ZXh0KCk7DQotCQkJCQlpZighaXNOZXN0YWJsZShpbnRlcm5hbFRhZ05hbWUpKSB7DQotCQkJCQkJaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsNCi0JCQkJCQkvLyBzbmFnZ2VkIGEgdGFnIG5hbWUgd2Ugc2hvdWxkbid0IGhhdmUNCi0JCQkJCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9BQk9SVF9FTUJFRERFRDsNCi0JCQkJCQlub3RGaW5pc2hlZCA9IGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX09QRU4gfHwgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7DQotCQkJCX0NCi0JCQkJLy8gZG8gdXBrZWVwIGZvciBlbmRUYWdOYW1lIHVzYWdlOyBtdXN0IGJlIGhlcmUgc2luY2UgdGhlIG5leHQgdG9rZW4gY291bGQgYmUgdGhlIGNsb3NlDQotCQkJCWlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJCQkJaXNJbkVuZFRhZyA9IHRydWU7DQotCQkJCX0gZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfQ0xPU0UpIHsNCi0JCQkJCWlzSW5GaXJzdFRhZyA9IGlzSW5FbmRUYWcgPSBmYWxzZTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJIAlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsNCi0JCQkJCWlmIChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpID4gMiAmJiAoZW1iZWRkZWRSZWdpb25zLmdldChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19DTE9TRSAmJiAoZW1iZWRkZWRSZWdpb25zLmdldChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpIC0gMykpLmdldFR5cGUoKSA9PSBYTUxfVEFHX09QRU4gJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwpIHsNCi0JCQkJCQlpZiAoY29udGFpbnNUYWdOYW1lKGludGVybmFsVGFnTmFtZSkpIHsNCi0JCQkJCQkJbG9uZ3NjYW4gPSB0cnVlOw0KLQkJCQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJaWYgKGxvbmdzY2FuKQ0KLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gaW50ZXJuYWxUYWdOYW1lOw0KLQkJCQkvLyByZWFkIHRoZSBuZXh0IHJlZ2lvbiBhbmQgY29udGV4dA0KLQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCWlmIChsb25nc2Nhbikgew0KLQkJCQkJLy8gUmV0dXJuaW5nIGZyb20gYSBibG9jayB0YWcgc2NhbiByZXF1aXJlcyByZXN0b3Jpbmcgc29tZSBzdGF0ZSB2YXJpYWJsZXMNCi0JCQkJCS8vIGFzIHdlbGwgYXMgaGFuZGxpbmcgdGhlIGJsb2NrIHJlZ2lvbiBhbmQgc2V0dGluZyB1cCBmb3Igbm9ybWFsIHNjYW5uaW5nDQotCQkJCQkvLyBpbnNpZGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lcg0KLQkJCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cw0KLQkJCQkJLy8gbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7DQotCQkJCQlsb25nc2NhbiA9IGZhbHNlOw0KLQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gcHJldmlvdXNQb3N0U3RhdGU7DQotCQkJCQlmRW1iZWRkZWRIaW50ID0gcHJldmlvdXNFbWJlZGRlZEhpbnQ7DQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBwcmV2aW91c0N1cnJlbnRUYWdOYW1lOw0KLQkJCQkJeXliZWdpbihwcmV2aW91c1N0YXRlKTsNCi0JCQkJCWludGVybmFsQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJfQ0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJLy8gcHJpbUdldE5leHRUb2tlbigpIGNhbGxzIG1heSB0aHJvdyBhbiBJT0V4Y2VwdGlvbg0KLQkJCQkvLyBjYXRjaCBhbmQgZG8gbm90aGluZyBzaW5jZSB0aGUgaXNFT0YgY2hlY2sgYmVsb3cNCi0JCQkJLy8gd2lsbCBwcm9wZXJseSBleGl0IGlmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGYpIHsNCi0JCQkJLy8gc29tZSBvdGhlciBleGNlcHRpb24gaGFwcGVuZWQ7IG5ldmVyIHNob3VsZA0KLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGYpOw0KLQkJCX0NCi0JCQlib29sZWFuIGlzRW5kaW5nVHlwZSA9IHl5c3RhdGUoKSA9PSBTVF9BQk9SVF9FTUJFRERFRDsNCi0JCQlpZighaXNFbmRpbmdUeXBlKSB7DQotCQkJCS8vIGNoZWNrIGZvciBlbmRpbmcgY29udGV4dA0KLQkJCQlpZiAoZW5kVGFnTmFtZSA9PSBudWxsKSB7DQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZFR5cGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQkJaXNFbmRpbmdUeXBlID0gaXNFbmRpbmdUeXBlIHx8IChpbnRlcm5hbENvbnRleHQgPT0gZW5kVHlwZXNbaV0pOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaXNFbmRpbmdUeXBlID0gKChpc0luRW5kVGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB8fCAoaXNJbkZpcnN0VGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfRU1QVFlfVEFHX0NMT1NFKSkgJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwgJiYgaW50ZXJuYWxUYWdOYW1lLmVxdWFscyhlbmRUYWdOYW1lKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRMaXN0ID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsNCi0JCQlub3RGaW5pc2hlZCA9IG5vdEZpbmlzaGVkICYmICgoIWlzRW5kaW5nVHlwZSkgJiYgIWlzRU9GKCkgJiYgKGVuZFRhZ05hbWUgIT0gbnVsbCB8fCBpbnRlcm5hbENvbnRleHQgIT0gVU5ERUZJTkVEKSAmJiAhKGludGVybmFsQ29udGV4dCA9PSBQUk9YWV9DT05URVhUICYmIChlbWJlZGRlZExpc3QuZ2V0KGVtYmVkZGVkTGlzdC5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBVTkRFRklORUQpKTsNCi0JCX0NCi0JCS8vIGZpbmlzaCBhZGRpbmcgdGhlIGxhc3QgY29udGV4dA0KLQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7DQotCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOw0KLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOw0KLQkJfQ0KLQkJeXliZWdpbihmRW1iZWRkZWRQb3N0U3RhdGUpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKCkgew0KLQkJcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgew0KLQkJZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gbmV3VmFsdWU7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSB7DQotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUChTdHJpbmcgbmFtZSkgew0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsNCi0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOw0KLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQ0KLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOw0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7DQotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgew0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsNCi0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsNCi0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkNCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCQl9DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dCgpIHsNCi0JCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgew0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCQlyZXR1cm4gbWFya2VyLmdldENvbnRleHQoKTsNCi0JCX0NCi0JCXJldHVybiBCTE9DS19URVhUOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsNCi0JCXJldHVybiBmQmxvY2tNYXJrZXJzOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgew0KLQkJcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7DQotCX0NCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoKSB7DQotCQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOw0KLQl9DQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7DQotCQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlyZXR1cm4gY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsNCi0JCWJlZ2luQmxvY2tNYXJrZXJTY2FuKG5ld1RhZ05hbWUsIEJMT0NLX1RFWFQpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKg0KLQkgKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQ0KLQkgKiBzdGFydCBvZiBhIHRleHQgYmxvY2sgd2l0aGluIGEgIm5ld1RhZ05hbWUiIHRhZy4NCi0JICoNCi0JICogRXhhbXBsZTogDQotCSAqCVRva2VuaXplciB0b2tlciA9IG5ldyBUb2tlbml6ZXIoKTsNCi0JICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsNCi0JICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOw0KLQkgKgl0b2tlci5iZWdpbkJsb2NrTWFya2VyU2Nhbigic2NyaXB0IiwgQkxPQ0tfVEVYVCk7DQotCSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgDQotCSAqDQotCSAqIFJldHVybnM6DQotCSAqCUJMT0NLX1RFWFQ6IDAtNDANCi0JICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDINCi0JICoJWE1MX1RBR19OQU1FOiA0My00OA0KLQkgKglYTUxfVEFHX0NMT1NFOiA0OS00OQ0KLQkgKglYTUxfQ09OVEVOVDogNTAtNTcNCi0JICoNCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7DQotCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7DQotCX0NCi0NCi0vKioNCi0gKiBNZXRob2QgZG9TY2FuLg0KLSAqIA0KLSAqIFJldHVybnMgYSBjb250ZXh0IHJlZ2lvbiBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdXB0byB0aGUgZW5kIG9mIGlucHV0IG9yDQotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcNCi0gKiANCi0gKiBAcGFyYW0gc2VhcmNoU3RyaW5nIC0gdGFyZ2V0IHN0cmluZyB0byBzZWFyY2ggZm9yIGV4LjogIi0tPiIsICI8L3RhZ25hbWUiDQotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicNCi0gKiBAcGFyYW0gYWxsb3dKU1AgLSBjaGVjayBmb3IgYW5kIGFsbG93IGZvciBKU1AgbWFya3VwIDwlJT4NCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgNCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aA0KLSAqIEBwYXJhbSBhYm9ydFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSBzZWFyY2hTdHJpbmcgd2FzIGZvdW5kIGltbWVkaWF0ZWx5DQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2Vzcw0KLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgYm9vbGVhbiBhbGxvd0pTUCwgYm9vbGVhbiBhbGxvd0NEQVRBLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOw0KLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQ0KLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsNCi0JaW50IG4gPSAwOw0KLQljaGFyIGxhc3RDaGVja0NoYXI7DQotCWludCBpOw0KLQlib29sZWFuIHNhbWUgPSBmYWxzZTsNCi0JLy8gQ2hlY2sgZm9yIEpTUCBzdGFydHMgKCI8JSIpIGlmIHRoZSB0YWcgaXMgZ2xvYmFsIGxpa2UgU0NSSVBUIG9yIFNUWUxFDQotCWJvb2xlYW4gY2hlY2tKU1BzID0gYWxsb3dKU1AgJiYgIWZGb3JiaWRKU1A7DQotCWJvb2xlYW4gY2hlY2tlZEZvckpTUHNPbmNlID0gIWNoZWNrSlNQczsNCi0JYm9vbGVhbiBjaGVja2VkSlNQc0F0U3RhcnRPbmNlID0gZmFsc2U7DQotCQ0KLQl3aGlsZSAoc3RpbGxTZWFyY2hpbmcpIHsNCi0JCW4gPSAwOw0KLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4NCi0JCW4gPSB5eV9hZHZhbmNlKCk7DQotCQl3aGlsZShuICE9IFlZRU9GICYmIHl5X2N1cnJlbnRQb3MgPCBzZWFyY2hTdHJpbmdMZW5ndGgpDQotCQkJbiA9IHl5X2FkdmFuY2UoKTsNCi0vLwkJYyA9IChjaGFyKSBuOw0KLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4NCi0JCWlmIChuID09IFlZRU9GICYmIGNoZWNrZWRGb3JKU1BzT25jZSkgew0KLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQkvKioNCi0JCQkgKiBMb29rIGZvciBzdGFydGluZyBKU1BzICI8JSINCi0JCQkgKi8NCi0JCQljaGVja2VkRm9ySlNQc09uY2UgPSB0cnVlOw0KLQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggOiBUaGVyZSdzIGF0IGxlYXN0IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IG9uY2UgdGhhdCdzIHJlYWQsIGNoZWNrIGZvciBKU1BzDQotCQkJLy8gLS0tDQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0Lg0KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kDQotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLg0KLQkJCWlmKGNoZWNrSlNQcyAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgDQotCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggKyAxXSA9PSAnJScpIHsNCi0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQl9DQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCX0NCi0JCQkvLyAyKSB5eV9jdXJyZW50UG9zIC0ganNwc3RhcnRlci5sZW5ndGggOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBKU1AgMiBzcG90cyBiYWNrIGluIHdoYXQgd2UgY291bGQgcmVhZA0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24gKmhhdmluZyogY2xvc2VUYWdTdHJpbmdMZW5ndGggYW1vdW50IG9mIGlucHV0IHRvIHdvcmsgYXMgZGVzaWduZWQuICBNdXN0IGJlIHN1cmUgd2UgZG9uJ3QNCi0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4NCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmDQotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7DQotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7DQotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOw0KLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7DQotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7DQotCQkJCX0NCi0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJfQ0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MuLih5eV9jdXJyZW50UG9zK2pzcFN0YXJ0bGVuZ3RoLTEpIDogQ2hlY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvbmUgdGltZQ0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24geXlfY3VycmVudFBvcyBlcXVhbGluZyBleGFjdGx5IHRoZSBwcmV2aW91cyBlbmQgKzEgdG8gd29yayBhcyBkZXNpZ25lZC4NCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiAhY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJg0KLQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsNCi0JCQkJY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IHRydWU7DQotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQl9DQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCX0NCi0NCi0NCi0JCQkvKioNCi0JCQkgKiBMb29rIGZvciBzdGFydGluZyBDREFUQSAiPCFbQ0RBVEFbIg0KLQkJCSAqLw0KLQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIENEQVRBDQotCQkJLy8gLS0tDQotCQkJLy8gTG9vayBmb3IgYSBDREFUQSBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuDQotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDxbIUNEQVRBW11dPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZA0KLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4NCi0vKgkJCWlmKGNoZWNrQ0RBVEEgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zICsgc2VhcmNoU3RyaW5nTGVuZ3RoIDwgeXlfYnVmZmVyLmxlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIA0KLQkJCQljaGFyc01hdGNoKGNkYXRhU3RhcnRlciwgeXlfYnVmZmVyLCAwLCB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoKSkgew0KLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7DQotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCS8vIGdvIHRvIGEgc3RhdGUgd2hlcmUgQ0RBVEEgY2FuIGJlIGZvdW5kDQotCQkJCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgew0KLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKHNlYXJjaENvbnRleHQpOw0KLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KHl5Y2hhcik7DQotCQkJCX0NCi0JCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihzZWFyY2hDb250ZXh0LCB5eWNoYXIsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOw0KLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsNCi0JCQkJeXliZWdpbihZWUlOSVRJQUwpOw0KLQkJCQlTdHJpbmcgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJaWYoY29udGV4dC5lcXVhbHMoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4pKSB7DQotCQkJCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOLCBYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfQ0xPU0UpOw0KLQkJCQl9DQotCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi0JCQl9DQotKi8vKg0KLQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBjZGF0YVN0YXJ0ZXIubGVuZ3RoOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBDREFUQSByaWdodCBoZXJlIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkDQotCQkJLy8gLS0tDQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24NCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndA0KLQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLg0KLQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmDQotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7DQotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7DQotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOw0KLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7DQotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7DQotCQkJCX0NCi0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJfQ0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lDQotCQkJLy8gLS0tDQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24NCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLg0KLQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiAhY2hlY2tlZEZvckNEQVRBT25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJg0KLQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsNCi0JCQkJY2hlY2tlZEZvckNEQVRBT25jZSA9IHRydWU7DQotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQl9DQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCX0NCi0qLw0KLQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyDQotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzDQotCQkJaWYgKG4gPT0gWVlFT0YpIHsNCi0JCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXNhbWUgPSB0cnVlOw0KLQkJCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzDQotCQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoOyBpKyspIHsNCi0JCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykNCi0JCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsNCi0JCQkJCQllbHNlIGlmKHNhbWUgJiYgIWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykNCi0JCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93DQotCQkJCWVsc2Ugew0KLQkJCQkJc2FtZSA9IGZhbHNlOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7DQotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaA0KLQkJCQkvLyAiPC9zY3JpcHRTIg0KLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOw0KLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIg0KLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQ0KLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7DQotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoDQotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQ0KLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOw0KLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7DQotCQl9DQotCX0NCi0JZWxzZSB7DQotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQNCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7DQotCQl5eV9jdXJyZW50UG9zKys7DQotCX0NCi0JeXliZWdpbihleGl0U3RhdGUpOw0KLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5DQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpDQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QgDQotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUNCi0gKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrVGFnU2NhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCk7DQotCXJldHVybiBkb1NjYW4oIjwvIiArIGZDdXJyZW50VGFnTmFtZSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSksIFlZSU5JVElBTCwgWVlJTklUSUFMKTsNCi19DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKg0KLQkgKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkNCi0JICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUNCi0JICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0Lg0KLQkgKg0KLQkgKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5DQotCSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuDQotCSAqDQotCSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkDQotCSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLg0KLQkgKi8NCi0JcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOw0KLQkJLy8gbG9hZCB0aGUgc3RhcnRpbmcgbm9uLXdoaXRlc3BhY2UgdG9rZW4gKGFzc3VtZSB0aGF0IGl0IGlzIHNvKQ0KLQkJaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsNCi0JCQlpZiAoZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgIT0gbnVsbCkgew0KLQkJCQlJVGV4dFJlZ2lvbiBjb250YWluZXIgPSBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lcjsNCi0JCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOw0KLQkJCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCQkJCXJldHVybiBjb250YWluZXI7DQotCQkJfQ0KLQkJCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0Ow0KLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsNCi0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCQl9IGVsc2Ugew0KLQkJCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJaWYgKGNvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCkgew0KLQkJCQlyZXR1cm4gZkVtYmVkZGVkQ29udGFpbmVyOw0KLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsNCi0JCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkNCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJCQllbHNlDQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsNCi0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JCQl9DQotCQkJc3RhcnQgPSB5eWNoYXI7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJaWYgKHl5X2F0RU9GKSB7DQotCQkJCWZUb2tlbkNvdW50Kys7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCX0NCi0JCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuDQotCQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQlpZiAoZl9jb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsNCi0JCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IGZFbWJlZGRlZENvbnRhaW5lcjsNCi0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsNCi0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX1JPT1RfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgew0KLQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpDQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJCWVsc2UNCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsNCi0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgew0KLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7DQotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQl9DQotCQlmQnVmZmVyZWRDb250ZXh0ID0gZl9jb250ZXh0Ow0KLQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7DQotCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7DQotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgew0KLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JCQlsZW5ndGggKz0gZkJ1ZmZlcmVkTGVuZ3RoOw0KLQkJfQ0KLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgew0KLQkJCS8vIEVPRg0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRpc2NvdmVyZWQgIiArIGZUb2tlbkNvdW50ICsgIiB0b2tlbnMuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJZlRva2VuQ291bnQrKzsNCi0JCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBKU1BUb2tlbml6ZXIoKXsNCi0JCXN1cGVyKCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIEpTUFRva2VuaXplcihjaGFyW10gY2hhckFycmF5KXsNCi0JCQl0aGlzKG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgew0KLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7DQotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIG5ld09mZnNldCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgew0KLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCAwKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsNCi0JCXJlc2V0KGluLCAwKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgKg0KLQkgKg0KLQkgKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMNCi0JICogdGhhdCByZXNldHRpbmcgYSBwcmUtZXhpc3RpbmcgdG9rZW5pemVyIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4NCi0JICoNCi0JICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUNCi0JICogPGVtPmdlbmVyYXRlZDwvZW0+IG91dHB1dCBvZiB0aGlzIHNwZWNpZmljYXRpb24gYmVmb3JlIHRoaXMgbWV0aG9kIHdhcw0KLQkgKiBhZGRlZC4gIFRob3NlIGNvZGUgYmxvY2tzIHdlcmUgdW5kZXIgdGhlIGFib3ZlIGNvcHlyaWdodC4NCi0JICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlmT2Zmc2V0ID0gbmV3T2Zmc2V0Ow0KLQkNCi0JCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0JCXl5X3JlYWRlciA9IGluOw0KLQkNCi0JCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0JCXl5X3N0YXRlID0gMDsNCi0JDQotCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQkNCi0JCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0JCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7DQotCQ0KLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0JCXl5X21hcmtlZFBvcyA9IDA7DQotCQ0KLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0JDQotCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0JCXl5X2N1cnJlbnRQb3MgPSAwOw0KLQkNCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLQkJeXlfc3RhcnRSZWFkID0gMDsNCi0JDQotCQkvKiogDQotCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0JCSAqIGZyb20gaW5wdXQgDQotCQkgKi8NCi0JCXl5X2VuZFJlYWQgPSAwOw0KLQkNCi0JCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQkJeXlsaW5lID0gMDsNCi0JDQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5Y2hhciA9IDA7DQotCQ0KLQkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLQkJeXlfYXRFT0YgPSBmYWxzZTsNCi0JDQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8NCi0JCXl5X2VvZl9kb25lID0gZmFsc2U7DQotCQ0KLQkNCi0JCS8qIHVzZXIgdmFyczogKi8NCi0JCWZUb2tlbkNvdW50ID0gMDsNCi0JIA0KLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCQlmQnVmZmVyZWRTdGFydCA9IDE7DQotCQlmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQkJZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0JDQotCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOw0KLQkNCi0JCWNvbnRleHQgPSBudWxsOw0KLQkJc3RhcnQgPSAwOw0KLQkJdGV4dExlbmd0aCA9IDA7DQotCQlsZW5ndGggPSAwOw0KLQkNCi0JCWZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7DQotCQkNCi0JCWZFTGxldmVsID0gMDsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICogQHNlZSBjb20uaWJtLnNlZC5wYXJzZXIuQmxvY2tUb2tlbml6ZXIjbmV3SW5zdGFuY2UoKQ0KLQkgKi8NCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgew0KLQkJSlNQVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IEpTUFRva2VuaXplcigpOw0KLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCANCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQ0KLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsNCi0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7DQotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkNCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOw0KLQkJfQ0KLQkJZm9yKGludCBpID0gMDsgaSA8IGZOZXN0YWJsZVByZWZpeGVzLnNpemUoKTsgaSsrKSB7DQotCQkJVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpIGZOZXN0YWJsZVByZWZpeGVzLmdldChpKTsNCi0JCQlpZihtYXJrZXIuaXNHbG9iYWwoKSkNCi0JCQkJbmV3SW5zdGFuY2UuYWRkTmVzdGFibGVQcmVmaXgobWFya2VyKTsNCi0JCX0NCi0JCXJldHVybiBuZXdJbnN0YW5jZTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzDQotCQkvLyAgIFhNTF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaA0KLQkJLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dA0KLQkJLy8gIGNvbnRleHQgYXMgdXN1YWwuDQotCQlyZXR1cm4gZG9TY2FuKCItLT4iLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgWE1MX0NPTU1FTlRfVEVYVCwgU1RfWE1MX0NPTU1FTlRfRU5ELCBTVF9YTUxfQ09NTUVOVF9FTkQpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5KU1BDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQkvLyBTY2FuIGZvciAnLS0lPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzDQotCQkvLyAgIEpTUF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaA0KLQkJLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9KU1BfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dA0KLQkJLy8gIGNvbnRleHQgYXMgdXN1YWwuDQotCQlyZXR1cm4gZG9TY2FuKCItLSU+IiwgZmFsc2UsIGZhbHNlLCB0cnVlLCBKU1BfQ09NTUVOVF9URVhULCBTVF9KU1BfQ09NTUVOVF9FTkQsIFNUX0pTUF9DT01NRU5UX0VORCk7DQotCX0NCi0lfQ0KLQ0KLSVlb2Z7DQotLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2INCi0lZW9mfQ0KLQ0KLSVwdWJsaWMNCi0lY2xhc3MgSlNQVG9rZW5pemVyDQotJWltcGxlbWVudHMgQmxvY2tUb2tlbml6ZXIsIFhNTEpTUFJlZ2lvbkNvbnRleHRzDQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSVsaW5lDQotJXVuaWNvZGUNCi0lcGFjaw0KLQ0KLSVzdGF0ZSBTVF9DREFUQV9URVhUDQotJXN0YXRlIFNUX0NEQVRBX0VORA0KLSVzdGF0ZSBTVF9YTUxfQ09NTUVOVA0KLSVzdGF0ZSBTVF9YTUxfQ09NTUVOVF9FTkQNCi0lc3RhdGUgU1RfUEkNCi0lc3RhdGUgU1RfUElfV1MNCi0lc3RhdGUgU1RfUElfQ09OVEVOVA0KLSVzdGF0ZSBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfWE1MX1BJX0VRVUFMUw0KLSVzdGF0ZSBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX1hNTF9QSV9UQUdfQ0xPU0UNCi0lc3RhdGUgU1RfREhUTUxfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfREhUTUxfRVFVQUxTDQotJXN0YXRlIFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9ESFRNTF9UQUdfQ0xPU0UNCi0NCi0vLyBzY3JpcHRsZXQgc3RhdGUocykNCi0lc3RhdGUgU1RfSlNQX0NPTlRFTlQNCi0lc3RhdGUgU1RfSlNQX0RJUkVDVElWRV9OQU1FDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMNCi0lc3RhdGUgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUNCi0NCi0vLyBub3JtYWwgdGFnIHN0YXRlcw0KLSVzdGF0ZSBTVF9YTUxfVEFHX05BTUUNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1hNTF9FUVVBTFMNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9WQUxVRQ0KLQ0KLS8vIGRlY2xhcmF0aW9uIChEVEQpIHN0YXRlcw0KLSVzdGF0ZSBTVF9YTUxfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFDQotDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQw0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0NCi0NCi0lc3RhdGUgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVA0KLQ0KLSVzdGF0ZSBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UDQotDQotDQotJXN0YXRlIFNUX0JMT0NLX1RBR19TQ0FODQotJXN0YXRlIFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FODQotDQotJXN0YXRlIFNUX0pTUF9DT01NRU5UDQotJXN0YXRlIFNUX0pTUF9DT01NRU5UX0VORA0KLQ0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEDQotDQotJXN0YXRlIFNUX0FCT1JUX0VNQkVEREVEDQotDQotJXN0YXRlIFNUX0pTUF9FTA0KLSVzdGF0ZSBTVF9KU1BfRUxfU1FVT1RFUw0KLSVzdGF0ZSBTVF9KU1BfRUxfRFFVT1RFUw0KLSVzdGF0ZSBTVF9KU1BfRUxfU1FVT1RFU19FTkQNCi0lc3RhdGUgU1RfSlNQX0VMX0RRVU9URVNfRU5EDQotDQotJXN0YXRlIFNUX0pTUF9EUVVPVEVEX0VMDQotJXN0YXRlIFNUX0pTUF9TUVVPVEVEX0VMDQotDQotJXN0YXRlIFNUX0pTUF9WQkwNCi0lc3RhdGUgU1RfSlNQX1ZCTF9TUVVPVEVTDQotJXN0YXRlIFNUX0pTUF9WQkxfRFFVT1RFUw0KLSVzdGF0ZSBTVF9KU1BfVkJMX1NRVU9URVNfRU5EDQotJXN0YXRlIFNUX0pTUF9WQkxfRFFVT1RFU19FTkQNCi0NCi0lc3RhdGUgU1RfSlNQX0RRVU9URURfVkJMDQotJXN0YXRlIFNUX0pTUF9TUVVPVEVEX1ZCTA0KLQ0KLS8vIExldHRlciA9IChbQS1aYS16XSkNCi0vLyBEaWdpdCA9IChbMC05XSkNCi0NCi0vKioNCi0gKiBzbWFsbGVyIHRva2Vucw0KLSAqLw0KLWdlbmVyaWNUYWdPcGVuICAgICAgID0gPA0KLWdlbmVyaWNUYWdDbG9zZSAgICAgID0gPg0KLWdlbmVyaWNFbmRUYWdPcGVuICAgID0gPFwvDQotZ2VuZXJpY0VtcHR5VGFnQ2xvc2UgPSBcLz4NCi0NCi1QSXN0YXJ0ID0gPFw/DQotUEllbmQgICA9IFw/Pg0KLQ0KLQ0KLS8vIFsxXSBkb2N1bWVudCA6Oj0gcHJvbG9nIGVsZW1lbnQgTWlzYyoNCi1kb2N1bWVudCA9ICh7cHJvbG9nfSB7ZWxlbWVudH0ge01pc2N9KikNCi0NCi0vLyBbMl0gQ2hhciA6Oj0gI3g5IHwgI3hBIHwgI3hEIHwgWyN4MjAtI3hEN0ZGXSB8IFsjeEUwMDAtI3hGRkZEXSB8IFsjeDEwMDAwLSN4MTBGRkZGXQ0KLSAvL0NoYXIgPSAoLikNCi1DaGFyID0gW1x4MDlceDBBXHgwRFx4MjAtXHVEN0ZGXHVFMDAwLVx1RkZGRF0gDQotDQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsNCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdKw0KLQ0KLS8vIFs0XSBOYW1lQ2hhciA6Oj0gTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnLScgfCAnXycgfCAnOicgfCBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXINCi1OYW1lQ2hhciA9ICh7TGV0dGVyfSB8IHtEaWdpdH0gfCBcLiB8IFwtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQ0KLQ0KLS8vIFs1XSBOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKSBOYW1lQ2hhcioNCi0vL05hbWUgPSAoe05hbWVDaGFyfXtOYW1lQ2hhcn0qKQ0KLU5hbWUgPSAoe0xldHRlcn0gfCBfIHwgOil7TmFtZUNoYXJ9Kg0KLQ0KLS8vIFs2XSBOYW1lcyA6Oj0ge05hbWV9ICh7U30ge05hbWV9KSoNCi1OYW1lcyA9ICh7TmFtZX0gKHtTfSB7TmFtZX0pKikNCi0NCi0vLyBbN10gTm10b2tlbiA6Oj0gKE5hbWVDaGFyKSsNCi1ObXRva2VuID0gKHtOYW1lQ2hhcn0rKQ0KLQ0KLS8vIFs4XSBObXRva2VucyA6Oj0gTm10b2tlbiAoUyBObXRva2VuKSoNCi1ObXRva2VucyA9ICh7Tm10b2tlbn0gKHtTfSB7Tm10b2tlbn0pKikNCi0NCi0vLyBbOV0gRW50aXR5VmFsdWUgOjo9ICciJyAoW14lJiJdIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAnIicgfCAgIiciIChbXiUmJ10gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICInIg0KLUVudGl0eVZhbHVlID0gKFwiIChbXiUmXCJdIHwge1BFUmVmZXJlbmNlfSB8IHtSZWZlcmVuY2V9KSogXCIgfCAgXCcgKFteJSZcJ10gfCB7UEVSZWZlcmVuY2V9IHwge1JlZmVyZW5jZX0pKiBcJykNCi0NCi0vLyBceDI0ID0gJyQnLCBceDdiID0gJ3snLCBceDIzID0gJyMnDQotLy8gWzEwXSBBdHRWYWx1ZSA6Oj0gJyInIChbXjwmIl0gfCBSZWZlcmVuY2UpKiAnIicgfCAgIiciIChbXjwmJ10gfCBSZWZlcmVuY2UpKiAiJyINCi1BdHRWYWx1ZSA9ICggXCIoW148Ilx4MjRceDIzXSB8IFtceDI0XHgyM11bXlx4N2IiXSB8IHtSZWZlcmVuY2V9KSpbXHgyNFx4MjNdKlwiIHwgXCcoW148J1x4MjRceDIzXSB8IFtceDI0XHgyM11bXlx4N2InXSB8IHtSZWZlcmVuY2V9KSpbXHgyNFx4MjNdKlwnICB8IChbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKikNCi0NCi0vLyBbMTFdIFN5c3RlbUxpdGVyYWwgOjo9ICgnIicgW14iXSogJyInKSB8ICgiJyIgW14nXSogIiciKSANCi1TeXN0ZW1MaXRlcmFsID0gKChcIiBbXlwiXSogXCIpIHwgKFwnIFteXCddKiBcJykpIA0KLQ0KLS8vIFsxMl0gUHViaWRMaXRlcmFsIDo6PSAnIicgUHViaWRDaGFyKiAnIicgfCAiJyIgKFB1YmlkQ2hhciAtICInIikqICInIg0KLVB1YmlkTGl0ZXJhbCA9IChcIiB7UHViaWRDaGFyfSogXCIgfCBcJyAoe1B1YmlkQ2hhcn1cJykqICInIikNCi0NCi0vLyBbMTNdIFB1YmlkQ2hhciA6Oj0gI3gyMCB8ICN4RCB8ICN4QSB8IFthLXpBLVowLTldIHwgWy0nKCkrLC4vOj0/OyEqI0AkXyVdDQotUHViaWRDaGFyID0gKFtcMDQwXDAxNVwwMTJdIHwgW2EtekEtWjAtOV0gfCBbXC1cJygpXCssLlwvOj0/OyFcKiNAXCRfJV0pDQotDQotLy8gWzE0XSBDaGFyRGF0YSA6Oj0gW148Jl0qIC0gKFtePCZdKiAnXV0+JyBbXjwmXSopDQotLy8gaW1wbGVtZW50IGxvb2thaGVhZCBiZWhhdmlvciBkdXJpbmcgYWN0aW9uIGRlZmluaXRpb24NCi1DaGFyRGF0YSA9IChbXjwmKFxdXF0+KV0qKQ0KLQ0KLS8vIFsxNV0gQ29tbWVudCA6Oj0gJzwhLS0nICgoQ2hhciAtICctJykgfCAoJy0nIChDaGFyIC0gJy0nKSkpKiAnLS0+Jw0KLUNvbW1lbnRTdGFydCA9ICg8IVwtXC0pDQotQ29tbWVudEVuZCAgID0gKFwtXC0+KQ0KLUNvbW1lbnQgPSAoe0NvbW1lbnRTdGFydH0uKntDb21tZW50RW5kfSkNCi0NCi0vLyBbMTZdIFBJIDo6PSAnPD8nIFBJVGFyZ2V0IChTIChDaGFyKiAtIChDaGFyKiAnPz4nIENoYXIqKSkpPyAnPz4nDQotUEkgPSAoPFw/e1BJVGFyZ2V0fSB7Q2hhcn0qIFw/PikNCi0NCi0vLyBbMTddIFBJVGFyZ2V0IDo6PSBOYW1lIC0gKCgnWCcgfCAneCcpICgnTScgfCAnbScpICgnTCcgfCAnbCcpKQ0KLVBJVGFyZ2V0ID0gKHtOYW1lfSgoWHx4KShNfG0pKEx8bCkpKQ0KLQ0KLS8vIFsxOF0gQ0RTZWN0IDo6PSBDRFN0YXJ0IENEYXRhIENERW5kDQotQ0RTZWN0ID0gKHtDRFN0YXJ0fXtDRGF0YX17Q0RFbmR9KQ0KLQ0KLS8vIFsxOV0gQ0RTdGFydCA6Oj0gJzwhW0NEQVRBWycNCi1DRFN0YXJ0ID0gPCFcW0NEQVRBXFsNCi0NCi0vLyBbMjBdIENEYXRhIDo6PSAoQ2hhciogLSAoQ2hhciogJ11dPicgQ2hhciopKSANCi0vLyBpbXBsZW1lbnQgbG9va2FoZWFkIGJlaGF2aW9yIGR1cmluZyBhY3Rpb24gZGVmaW5pdGlvbg0KLUNEYXRhID0gKFteKFxdXF0+KV0qKQ0KLQ0KLS8vIFsyMV0gQ0RFbmQgOjo9ICddXT4nDQotQ0RFbmQgPSAoXF1cXT4pDQotDQotLy8gWzIyXSBwcm9sb2cgOjo9IFhNTERlY2w/IE1pc2MqIChkb2N0eXBlZGVjbCBNaXNjKik/DQotcHJvbG9nID0gKHtYTUxEZWNsfT8ge01pc2N9KiAoe2RvY3R5cGVkZWNsfSB7TWlzY30qKT8pDQotDQotLy8gWzIzXSBYTUxEZWNsIDo6PSAnPD94bWwnIFZlcnNpb25JbmZvIEVuY29kaW5nRGVjbD8gU0REZWNsPyBTPyAnPz4nDQotWE1MRGVjbCA9ICg8XD94bWwge1ZlcnNpb25JbmZvfSB7RW5jb2RpbmdEZWNsfT8ge1NERGVjbH0/IHtTfT8gXD8+KQ0KLQ0KLS8vIFsyNF0gVmVyc2lvbkluZm8gOjo9IFMgJ3ZlcnNpb24nIEVxICgnIFZlcnNpb25OdW0gJyB8ICIgVmVyc2lvbk51bSAiKQ0KLVZlcnNpb25JbmZvID0gKHtTfXZlcnNpb257RXF9KFwne1ZlcnNpb25OdW19XCcgfCBcIntWZXJzaW9uTnVtfVwiKSkNCi0NCi0vLyBbMjVdIEVxIDo6PSBTPyAnPScgUz8NCi1FcSA9IChcPSkNCi0NCi0vLyBbMjZdIFZlcnNpb25OdW0gOjo9IChbYS16QS1aMC05Xy46XSB8ICctJykrDQotVmVyc2lvbk51bSA9ICgoW2EtekEtWjAtOV8uOl18XC0pKykNCi0NCi0vLyBbMjddIE1pc2MgOjo9IENvbW1lbnQgfCBQSSB8ICBTDQotTWlzYyA9ICh7Q29tbWVudH0gfCB7UEl9IHwge1N9KQ0KLQ0KLS8vIFsyOF0gZG9jdHlwZWRlY2wgOjo9ICc8IURPQ1RZUEUnIFMgTmFtZSAoUyBFeHRlcm5hbElEKT8gIFM/ICgnWycgKG1hcmt1cGRlY2wgfCBQRVJlZmVyZW5jZSB8IFMpKiAnXScgUz8pPyAnPicNCi1kb2N0eXBlZGVjbCA9ICg8XCFET0NUWVBFe1N9e05hbWV9ICh7U317RXh0ZXJuYWxJRH0pPyB7U30/IChcWyAoe21hcmt1cGRlY2x9fHtQRVJlZmVyZW5jZX18e1N9KSogXF17U30/KT8+KQ0KLQ0KLS8vIFsyOV0gbWFya3VwZGVjbCA6Oj0gZWxlbWVudGRlY2wgfCBBdHRsaXN0RGVjbCB8IEVudGl0eURlY2wgfCBOb3RhdGlvbkRlY2wgfCBQSSB8IENvbW1lbnQNCi1tYXJrdXBkZWNsID0gKHtlbGVtZW50ZGVjbH0gfCB7QXR0bGlzdERlY2x9IHwge0VudGl0eURlY2x9IHwge05vdGF0aW9uRGVjbH0gfCB7UEl9IHwge0NvbW1lbnR9KQ0KLQ0KLS8vIFszMF0gZXh0U3Vic2V0IDo6PSBUZXh0RGVjbD8gZXh0U3Vic2V0RGVjbA0KLWV4dFN1YnNldCA9ICh7VGV4dERlY2x9PyB7ZXh0U3Vic2V0RGVjbH0pDQotDQotLy8gWzMxXSBleHRTdWJzZXREZWNsIDo6PSAoIG1hcmt1cGRlY2wgfCBjb25kaXRpb25hbFNlY3QgfCBQRVJlZmVyZW5jZSB8IFMgKSoNCi1leHRTdWJzZXREZWNsID0gKCgge21hcmt1cGRlY2x9IHwge2NvbmRpdGlvbmFsU2VjdH0gfCB7UEVSZWZlcmVuY2V9IHwge1N9ICkqKQ0KLQ0KLS8vIFszMl0gIFNERGVjbCAgOjo9IFMgJ3N0YW5kYWxvbmUnIEVxICgoIiciICgneWVzJyB8ICdubycpICInIikgfCAoJyInICgneWVzJyB8ICdubycpICciJykpDQotU0REZWNsICA9ICh7U31zdGFuZGFsb25le0VxfXtTfSooKFwnKHllc3xubylcJyl8KFwiKHllc3xubylcIikpKQ0KLQ0KLS8vIFszM10gIExhbmd1YWdlSUQgIDo6PSBMYW5nY29kZSAoJy0nIFN1YmNvZGUpKg0KLUxhbmd1YWdlSUQgID0gKHtMYW5nY29kZX0oXC17U3ViY29kZX0pKikNCi0NCi0vLyBbMzRdICBMYW5nY29kZSA6Oj0gSVNPNjM5Q29kZSB8ICBJYW5hQ29kZSB8ICBVc2VyQ29kZQ0KLUxhbmdjb2RlID0gKHtJU082MzlDb2RlfSB8ICB7SWFuYUNvZGV9IHwgIHtVc2VyQ29kZX0pDQotDQotLy8gWzM1XSAgSVNPNjM5Q29kZSA6Oj0gKFthLXpdIHwgW0EtWl0pIChbYS16XSB8IFtBLVpdKQ0KLUlTTzYzOUNvZGUgPSAoKFthLXpdfFtBLVpdKShbYS16XXxbQS1aXSkpDQotDQotLy8gWzM2XSAgSWFuYUNvZGUgOjo9ICgnaScgfCAnSScpICctJyAoW2Etel0gfCBbQS1aXSkrDQotSWFuYUNvZGUgPSAoKGl8SSlcLShbYS16XXxbQS1aXSkrKQ0KLQ0KLS8vIFszN10gIFVzZXJDb2RlIDo6PSAoJ3gnIHwgJ1gnKSAnLScgKFthLXpdIHwgW0EtWl0pKw0KLVVzZXJDb2RlID0gKCh4fFgpXC0oW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzhdICBTdWJjb2RlIDo6PSAoW2Etel0gfCBbQS1aXSkrDQotU3ViY29kZSA9ICgoW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzldICBlbGVtZW50ICA6Oj0gRW1wdHlFbGVtVGFnIHwgU1RhZyBjb250ZW50IEVUYWcNCi1lbGVtZW50ICA9ICh7RW1wdHlFbGVtVGFnfSB8IHtTVGFnfSB7Y29udGVudH0ge0VUYWd9KQ0KLQ0KLS8vIFs0MF0gIFNUYWcgIDo6PSAnPCcgTmFtZSAoUyBBdHRyaWJ1dGUpKiBTPyAnPicNCi1TVGFnID0gKDx7TmFtZX0oe1N9e0F0dHJpYnV0ZX0pKntTfT8+KQ0KLQ0KLS8vIFs0MV0gIEF0dHJpYnV0ZSA6Oj0gTmFtZSBFcSBBdHRWYWx1ZQ0KLUF0dHJpYnV0ZSA9ICh7TmFtZX17U30qe0VxfXtTfSp7QXR0VmFsdWV9KQ0KLQ0KLS8vIFs0Ml0gIEVUYWcgIDo6PSAnTmFtZSBTPyAnPicNCi1FVGFnID0gKDxcL3tOYW1lfXtTfT8+KQ0KLQ0KLS8vIFs0M10gIGNvbnRlbnQgIDo6PSAoZWxlbWVudCB8IENoYXJEYXRhIHwgUmVmZXJlbmNlIHwgQ0RTZWN0IHwgUEkgfCBDb21tZW50KSoNCi1jb250ZW50ID0gKCh7ZWxlbWVudH0gfCB7Q2hhckRhdGF9IHwge1JlZmVyZW5jZX0gfCB7Q0RTZWN0fSB8IHtQSX0gfCB7Q29tbWVudH0pKikNCi0NCi0vLyBbNDRdICBFbXB0eUVsZW1UYWcgIDo6PSAnPCcgTmFtZSAoUyBBdHRyaWJ1dGUpKiBTPyAnLz4nDQotRW1wdHlFbGVtVGFnID0gKDx7TmFtZX0oe1N9e0F0dHJpYnV0ZX0pKntTfT9cLz4pDQotDQotLy8gWzQ1XSBlbGVtZW50ZGVjbCA6Oj0gJzwhRUxFTUVOVCcgUyBOYW1lIFMgY29udGVudHNwZWMgUz8gJz4nDQotZWxlbWVudGRlY2wgPSAoPFwhRUxFTUVOVHtTfXtOYW1lfXtTfXtjb250ZW50c3BlY317U30/PikNCi0NCi0vLyBbNDZdIGNvbnRlbnRzcGVjIDo6PSAnRU1QVFknIHwgJ0FOWScgfCBNaXhlZCB8IGNoaWxkcmVuDQotY29udGVudHNwZWMgPSAoRU1QVFl8QU5ZfHtNaXhlZH18e2NoaWxkcmVufSkNCi0NCi0vLyBbNDddIGNoaWxkcmVuIDo6PSAoY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8NCi1jaGlsZHJlbiA9ICgoe2Nob2ljZX18e3NlcX0pKFw/fFwqfFwrKT8pDQotDQotLy8gQ0FVU0VTIExPT1AgVEhST1VHSCBERUZTIE9GIENIT0lDRSBBTkQgU0VRDQotLy8gWzQ4XSBjcCA6Oj0gKE5hbWUgfCBjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPw0KLWNwID0gKCh7TmFtZX0gfCB7Y2hvaWNlfSB8IHtzZXF9KSAoXD98XCp8XCspPykNCi0NCi0vLyBbNDldIGNob2ljZSA6Oj0gJygnIFM/IGNwICggUz8gJ3wnIFM/IGNwICkqIFM/ICcpJw0KLS8vIGNob2ljZSA9IFwoe1N9P3tjcH0oe1N9P1x8e1N9P3tjcH0pKntTfT9cKQ0KLWNob2ljZSA9IFwoe1N9P3tOYW1lfSh7U30/XHx7U30/e05hbWV9KSp7U30/XCkNCi0NCi0vLyBbNTBdIHNlcSA6Oj0gJygnIFM/IGNwICggUz8gJywnIFM/IGNwICkqIFM/ICcpJw0KLS8vIHNlcSA9IChcKHtTfT97Y3B9KHtTfT9cLHtTfT97Y3B9KSp7U30/XCkpDQotc2VxID0gKFwoe1N9P3tOYW1lfSh7U30/XCx7U30/e05hbWV9KSp7U30/XCkpDQotDQotLy8gWzUxXSBNaXhlZCA6Oj0gJygnIFM/ICcjUENEQVRBJyAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAgJykqJyB8ICcoJyBTPyAnI1BDREFUQScgUz8gJyknDQotTWl4ZWQgPSAoe1N9P1wjUENEQVRBKHtTfT9cfHtTfT97TmFtZX0pKntTfT8pKlx8KHtTfT9cI1BDREFUQXtTfT8pDQotDQotLy8gWzUyXSBBdHRsaXN0RGVjbCA6Oj0gJzwhQVRUTElTVCcgUyBOYW1lIEF0dERlZiogUz8gJz4nDQotQXR0bGlzdERlY2wgPSAoPFwhQVRUTElTVHtTfXtOYW1lfXtBdHREZWZ9KntTfT8+KQ0KLQ0KLS8vIFs1M10gQXR0RGVmIDo6PSBTIE5hbWUgUyBBdHRUeXBlIFMgRGVmYXVsdERlY2wNCi1BdHREZWYgPSAoe1N9e05hbWV9e1N9e0F0dFR5cGV9e1N9e0RlZmF1bHREZWNsfSkNCi0NCi0vLyBbNTRdIEF0dFR5cGUgOjo9IFN0cmluZ1R5cGUgfCBUb2tlbml6ZWRUeXBlIHwgRW51bWVyYXRlZFR5cGUgDQotQXR0VHlwZSA9ICh7U3RyaW5nVHlwZX0gfCB7VG9rZW5pemVkVHlwZX0gfCB7RW51bWVyYXRlZFR5cGV9KQ0KLQ0KLS8vIFs1NV0gU3RyaW5nVHlwZSA6Oj0gJ0NEQVRBJw0KLVN0cmluZ1R5cGUgPSAoQ0RBVEEpDQotDQotLy8gWzU2XSBUb2tlbml6ZWRUeXBlIDo6PSAnSUQnIHwgJ0lEUkVGJyB8ICdJRFJFRlMnIHwgJ0VOVElUWScgfCAnRU5USVRJRVMnIHwgJ05NVE9LRU4nIHwgJ05NVE9LRU5TJw0KLVRva2VuaXplZFR5cGUgPSAoSUR8SURSRUZ8SURSRUZTfEVOVElUWXxFTlRJVElFU3xOTVRPS0VOfE5NVE9LRU5TKQ0KLQ0KLS8vIFs1N10gRW51bWVyYXRlZFR5cGUgOjo9IE5vdGF0aW9uVHlwZSB8IEVudW1lcmF0aW9uIA0KLUVudW1lcmF0ZWRUeXBlID0gKHtOb3RhdGlvblR5cGV9IHwge0VudW1lcmF0aW9ufSkNCi0NCi0vLyBbNThdIE5vdGF0aW9uVHlwZSA6Oj0gJ05PVEFUSU9OJyBTICcoJyBTPyBOYW1lIChTPyAnfCcgUz8gTmFtZSkqIFM/ICcpJyANCi1Ob3RhdGlvblR5cGUgPSAoTk9UQVRJT057U31cKHtTfT97TmFtZX0oe1N9P1x8e1N9P3tOYW1lfSkqe1N9P1wpKQ0KLQ0KLS8vIFs1OV0gRW51bWVyYXRpb24gOjo9ICcoJyBTPyBObXRva2VuIChTPyAnfCcgUz8gIE5tdG9rZW4pKiBTPyAnKScNCi1FbnVtZXJhdGlvbiA9IChcKHtTfT97Tm10b2tlbn0oe1N9P1x8e1N9P3tObXRva2VufSkqe1N9P1wpKQ0KLQ0KLS8vIFs2MF0gRGVmYXVsdERlY2wgOjo9ICcjUkVRVUlSRUQnIHwgJyNJTVBMSUVEJyB8ICgoJyNGSVhFRCcgUyk/IEF0dFZhbHVlKQ0KLURlZmF1bHREZWNsID0gKFwjUkVRVUlSRUR8XCNJTVBMSUVEfCgoXCNGSVhFRHtTfSk/e0F0dFZhbHVlfSkpDQotDQotLy8gWzYxXSBjb25kaXRpb25hbFNlY3QgOjo9IGluY2x1ZGVTZWN0IHwgaWdub3JlU2VjdCANCi1jb25kaXRpb25hbFNlY3QgPSAoe2luY2x1ZGVTZWN0fSB8IHtpZ25vcmVTZWN0fSkNCi0NCi0vLyBbNjJdIGluY2x1ZGVTZWN0IDo6PSAnPCFbJyBTPyAnSU5DTFVERScgUz8gJ1snIGV4dFN1YnNldERlY2wgJ11dPicgDQotaW5jbHVkZVNlY3QgPSAoPFwhXFt7U30/SU5DTFVERXtTfT9cW3tleHRTdWJzZXREZWNsfVxdXF0+KQ0KLQ0KLS8vIFs2M10gaWdub3JlU2VjdCA6Oj0gJzwhWycgUz8gJ0lHTk9SRScgUz8gJ1snIGlnbm9yZVNlY3RDb250ZW50cyogJ11dPicNCi1pZ25vcmVTZWN0ID0gKDxcIVxbe1N9P0lHTk9SRXtTfT9cW3tpZ25vcmVTZWN0Q29udGVudHN9KlxdXF0+KQ0KLQ0KLS8vIFs2NF0gaWdub3JlU2VjdENvbnRlbnRzIDo6PSBJZ25vcmUgKCc8IVsnIGlnbm9yZVNlY3RDb250ZW50cyAnXV0+JyBJZ25vcmUpKg0KLWlnbm9yZVNlY3RDb250ZW50cyA9ICh7SWdub3JlfSg8XCFcW3tpZ25vcmVTZWN0Q29udGVudHN9XF1cXT57SWdub3JlfSkqKQ0KLQ0KLS8vIFs2NV0gSWdub3JlIDo6PSBDaGFyKiAtIChDaGFyKiAoJzwhWycgfCAnXV0+JykgQ2hhciopDQotSWdub3JlID0gIChbXihcPFwhXFt8XF1cXVw+KV0qKQ0KLQ0KLS8vIFs2Nl0gQ2hhclJlZiA6Oj0gJyYjJyBbMC05XSsgJzsnIHwgJyYjeCcgWzAtOWEtZkEtRl0rICc7Jw0KLUNoYXJSZWYgPSAoJiNbMC05XSs7fCYjeFswLTlhLWZBLUZdKzspDQotDQotLy8gWzY3XSBSZWZlcmVuY2UgOjo9IEVudGl0eVJlZiB8IENoYXJSZWYNCi1SZWZlcmVuY2UgPSAoe0VudGl0eVJlZn0gfCB7Q2hhclJlZn0pDQotDQotLy8gWzY4XSBFbnRpdHlSZWYgPSAnJicgTmFtZSAnOycNCi1FbnRpdHlSZWYgPSAoJntOYW1lfTspDQotDQotLy8gWzY5XSBQRVJlZmVyZW5jZSA6Oj0gJyUnIE5hbWUgJzsnDQotUEVSZWZlcmVuY2UgPSAoJXtOYW1lfTspDQotDQotLy8gWzcwXSBFbnRpdHlEZWNsIDo6PSBHRURlY2wgfCBQRURlY2wNCi1FbnRpdHlEZWNsID0gKHtHRURlY2x9IHwge1BFRGVjbH0pDQotDQotLy8gWzcxXSBHRURlY2wgOjo9ICc8IUVOVElUWScgUyBOYW1lIFMgRW50aXR5RGVmIFM/ICc+Jw0KLUdFRGVjbCA9ICg8XCFFTlRJVFl7U317TmFtZX17U317RW50aXR5RGVmfXtTfT8+KQ0KLQ0KLS8vIFs3Ml0gUEVEZWNsIDo6PSAnPCFFTlRJVFknIFMgJyUnIFMgTmFtZSBTIFBFRGVmIFM/ICc+Jw0KLVBFRGVjbCA9ICg8XCFFTlRJVFl7U31cJXtTfXtOYW1lfXtTfXtQRURlZn17U30/PikNCi0NCi0vLyBbNzNdIEVudGl0eURlZiA6Oj0gRW50aXR5VmFsdWUgfCAoRXh0ZXJuYWxJRCBORGF0YURlY2w/KQ0KLUVudGl0eURlZiA9ICh7RW50aXR5VmFsdWV9IHwgKHtFeHRlcm5hbElEfXtORGF0YURlY2x9PykpDQotDQotLy8gWzc0XSBQRURlZiA6Oj0gRW50aXR5VmFsdWUgfCBFeHRlcm5hbElEDQotUEVEZWYgPSAoe0VudGl0eVZhbHVlfSB8IHtFeHRlcm5hbElEfSkNCi0NCi0vLyBbNzVdIEV4dGVybmFsSUQgOjo9ICdTWVNURU0nIFMgU3lzdGVtTGl0ZXJhbCB8ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsIFMgU3lzdGVtTGl0ZXJhbCANCi1FeHRlcm5hbElEID0gKFNZU1RFTXtTfXtTeXN0ZW1MaXRlcmFsfXxQVUJMSUN7U317UHViaWRMaXRlcmFsfXtTfXtTeXN0ZW1MaXRlcmFsfSApDQotDQotLy8gWzc2XSBORGF0YURlY2wgOjo9IFMgJ05EQVRBJyBTIE5hbWUNCi1ORGF0YURlY2wgPSAoe1N9TkRBVEF7U317TmFtZX0pDQotDQotLy8gWzc3XSBUZXh0RGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbz8gRW5jb2RpbmdEZWNsIFM/ICc/PicNCi1UZXh0RGVjbCA9ICg8XD94bWx7VmVyc2lvbkluZm99P3tFbmNvZGluZ0RlY2x9e1N9P1w/PikNCi0NCi0vLyBbNzhdIGV4dFBhcnNlZEVudCA6Oj0gVGV4dERlY2w/IGNvbnRlbnQNCi1leHRQYXJzZWRFbnQgPSAoe1RleHREZWNsfT97Y29udGVudH0pDQotDQotLy8gWzc5XSBleHRQRSA6Oj0gVGV4dERlY2w/IGV4dFN1YnNldERlY2wNCi1leHRQRSA9ICh7VGV4dERlY2x9P3tleHRTdWJzZXREZWNsfSkNCi0NCi0vLyBbODBdIEVuY29kaW5nRGVjbCA6Oj0gUyAnZW5jb2RpbmcnIEVxICgnIicgRW5jTmFtZSAnIicgfCAgIiciIEVuY05hbWUgIiciICkgDQotRW5jb2RpbmdEZWNsID0gKHtTfWVuY29kaW5ne1N9KntFcX17U30qKFwie0VuY05hbWV9XCJ8XCd7RW5jTmFtZX1cJykpDQotDQotLy8gWzgxXSBFbmNOYW1lIDo6PSBbQS1aYS16XSAoW0EtWmEtejAtOS5fXSB8ICctJykqDQotRW5jTmFtZSA9IChbQS1aYS16XShbQS1aYS16MC05Ll9dfFwtKSopDQotDQotLy8gWzgyXSBOb3RhdGlvbkRlY2wgOjo9ICc8IU5PVEFUSU9OJyBTIE5hbWUgUyAoRXh0ZXJuYWxJRCB8ICBQdWJsaWNJRCkgUz8gJz4nDQotTm90YXRpb25EZWNsID0gKDxcIU5PVEFUSU9Oe1N9e05hbWV9e1N9KHtFeHRlcm5hbElEfXx7UHVibGljSUR9KXtTfT8+KQ0KLQ0KLS8vIFs4M10gUHVibGljSUQgOjo9ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsDQotUHVibGljSUQgPSAoUFVCTElDe1N9e1B1YmlkTGl0ZXJhbH0pDQotDQotLy8gWzg0XSAgTGV0dGVyIDo6PSBCYXNlQ2hhciB8IElkZW9ncmFwaGljDQotTGV0dGVyID0gKHtCYXNlQ2hhcn0gfCB7SWRlb2dyYXBoaWN9KQ0KLQ0KLS8vIFs4NV0gIEJhc2VDaGFyIDo6PSBbI3gwMDQxLSN4MDA1QV0gfCBbI3gwMDYxLSN4MDA3QV0gfCBbI3gwMEMwLSN4MDBENl0NCi0vLyB8IFsjeDAwRDgtI3gwMEY2XSB8IFsjeDAwRjgtI3gwMEZGXSB8IFsjeDAxMDAtI3gwMTMxXQ0KLS8vIHwgWyN4MDEzNC0jeDAxM0VdIHwgWyN4MDE0MS0jeDAxNDhdIHwgWyN4MDE0QS0jeDAxN0VdDQotLy8gfCBbI3gwMTgwLSN4MDFDM10gfCBbI3gwMUNELSN4MDFGMF0gfCBbI3gwMUY0LSN4MDFGNV0NCi0vLyB8IFsjeDAxRkEtI3gwMjE3XSB8IFsjeDAyNTAtI3gwMkE4XSB8IFsjeDAyQkItI3gwMkMxXSB8ICN4MDM4Ng0KLS8vIHwgWyN4MDM4OC0jeDAzOEFdIHwgI3gwMzhDIHwgWyN4MDM4RS0jeDAzQTFdIHwgWyN4MDNBMy0jeDAzQ0VdDQotLy8gfCBbI3gwM0QwLSN4MDNENl0gfCAjeDAzREEgfCAjeDAzREMgfCAjeDAzREUgfCAjeDAzRTANCi0vLyB8IFsjeDAzRTItI3gwM0YzXSB8IFsjeDA0MDEtI3gwNDBDXSB8IFsjeDA0MEUtI3gwNDRGXQ0KLS8vIHwgWyN4MDQ1MS0jeDA0NUNdIHwgWyN4MDQ1RS0jeDA0ODFdIHwgWyN4MDQ5MC0jeDA0QzRdDQotLy8gfCBbI3gwNEM3LSN4MDRDOF0gfCBbI3gwNENCLSN4MDRDQ10gfCBbI3gwNEQwLSN4MDRFQl0NCi0vLyB8IFsjeDA0RUUtI3gwNEY1XSB8IFsjeDA0RjgtI3gwNEY5XSB8IFsjeDA1MzEtI3gwNTU2XSB8ICN4MDU1OQ0KLS8vIHwgWyN4MDU2MS0jeDA1ODZdIHwgWyN4MDVEMC0jeDA1RUFdIHwgWyN4MDVGMC0jeDA1RjJdDQotLy8gfCBbI3gwNjIxLSN4MDYzQV0gfCBbI3gwNjQxLSN4MDY0QV0gfCBbI3gwNjcxLSN4MDZCN10NCi0vLyB8IFsjeDA2QkEtI3gwNkJFXSB8IFsjeDA2QzAtI3gwNkNFXSB8IFsjeDA2RDAtI3gwNkQzXSB8ICN4MDZENQ0KLS8vIHwgWyN4MDZFNS0jeDA2RTZdIHwgWyN4MDkwNS0jeDA5MzldIHwgI3gwOTNEIHwgWyN4MDk1OC0jeDA5NjFdDQotLy8gfCBbI3gwOTg1LSN4MDk4Q10gfCBbI3gwOThGLSN4MDk5MF0gfCBbI3gwOTkzLSN4MDlBOF0NCi0vLyB8IFsjeDA5QUEtI3gwOUIwXSB8ICN4MDlCMiB8IFsjeDA5QjYtI3gwOUI5XSB8IFsjeDA5REMtI3gwOUREXQ0KLS8vIHwgWyN4MDlERi0jeDA5RTFdIHwgWyN4MDlGMC0jeDA5RjFdIHwgWyN4MEEwNS0jeDBBMEFdDQotLy8gfCBbI3gwQTBGLSN4MEExMF0gfCBbI3gwQTEzLSN4MEEyOF0gfCBbI3gwQTJBLSN4MEEzMF0NCi0vLyB8IFsjeDBBMzItI3gwQTMzXSB8IFsjeDBBMzUtI3gwQTM2XSB8IFsjeDBBMzgtI3gwQTM5XQ0KLS8vIHwgWyN4MEE1OS0jeDBBNUNdIHwgI3gwQTVFIHwgWyN4MEE3Mi0jeDBBNzRdIHwgWyN4MEE4NS0jeDBBOEJdDQotLy8gfCAjeDBBOEQgfCBbI3gwQThGLSN4MEE5MV0gfCBbI3gwQTkzLSN4MEFBOF0gfCBbI3gwQUFBLSN4MEFCMF0NCi0vLyB8IFsjeDBBQjItI3gwQUIzXSB8IFsjeDBBQjUtI3gwQUI5XSB8ICN4MEFCRCB8ICN4MEFFMA0KLS8vIHwgWyN4MEIwNS0jeDBCMENdIHwgWyN4MEIwRi0jeDBCMTBdIHwgWyN4MEIxMy0jeDBCMjhdDQotLy8gfCBbI3gwQjJBLSN4MEIzMF0gfCBbI3gwQjMyLSN4MEIzM10gfCBbI3gwQjM2LSN4MEIzOV0gfCAjeDBCM0QNCi0vLyB8IFsjeDBCNUMtI3gwQjVEXSB8IFsjeDBCNUYtI3gwQjYxXSB8IFsjeDBCODUtI3gwQjhBXQ0KLS8vIHwgWyN4MEI4RS0jeDBCOTBdIHwgWyN4MEI5Mi0jeDBCOTVdIHwgWyN4MEI5OS0jeDBCOUFdIHwgI3gwQjlDDQotLy8gfCBbI3gwQjlFLSN4MEI5Rl0gfCBbI3gwQkEzLSN4MEJBNF0gfCBbI3gwQkE4LSN4MEJBQV0NCi0vLyB8IFsjeDBCQUUtI3gwQkI1XSB8IFsjeDBCQjctI3gwQkI5XSB8IFsjeDBDMDUtI3gwQzBDXQ0KLS8vIHwgWyN4MEMwRS0jeDBDMTBdIHwgWyN4MEMxMi0jeDBDMjhdIHwgWyN4MEMyQS0jeDBDMzNdDQotLy8gfCBbI3gwQzM1LSN4MEMzOV0gfCBbI3gwQzYwLSN4MEM2MV0gfCBbI3gwQzg1LSN4MEM4Q10NCi0vLyB8IFsjeDBDOEUtI3gwQzkwXSB8IFsjeDBDOTItI3gwQ0E4XSB8IFsjeDBDQUEtI3gwQ0IzXQ0KLS8vIHwgWyN4MENCNS0jeDBDQjldIHwgI3gwQ0RFIHwgWyN4MENFMC0jeDBDRTFdIHwgWyN4MEQwNS0jeDBEMENdDQotLy8gfCBbI3gwRDBFLSN4MEQxMF0gfCBbI3gwRDEyLSN4MEQyOF0gfCBbI3gwRDJBLSN4MEQzOV0NCi0vLyB8IFsjeDBENjAtI3gwRDYxXSB8IFsjeDBFMDEtI3gwRTJFXSB8ICN4MEUzMCB8IFsjeDBFMzItI3gwRTMzXQ0KLS8vIHwgWyN4MEU0MC0jeDBFNDVdIHwgWyN4MEU4MS0jeDBFODJdIHwgI3gwRTg0IHwgWyN4MEU4Ny0jeDBFODhdDQotLy8gfCAjeDBFOEEgfCAjeDBFOEQgfCBbI3gwRTk0LSN4MEU5N10gfCBbI3gwRTk5LSN4MEU5Rl0NCi0vLyB8IFsjeDBFQTEtI3gwRUEzXSB8ICN4MEVBNSB8ICN4MEVBNyB8IFsjeDBFQUEtI3gwRUFCXQ0KLS8vIHwgWyN4MEVBRC0jeDBFQUVdIHwgI3gwRUIwIHwgWyN4MEVCMi0jeDBFQjNdIHwgI3gwRUJEDQotLy8gfCBbI3gwRUMwLSN4MEVDNF0gfCBbI3gwRjQwLSN4MEY0N10gfCBbI3gwRjQ5LSN4MEY2OV0NCi0vLyB8IFsjeDEwQTAtI3gxMEM1XSB8IFsjeDEwRDAtI3gxMEY2XSB8ICN4MTEwMCB8IFsjeDExMDItI3gxMTAzXQ0KLS8vIHwgWyN4MTEwNS0jeDExMDddIHwgI3gxMTA5IHwgWyN4MTEwQi0jeDExMENdIHwgWyN4MTEwRS0jeDExMTJdDQotLy8gfCAjeDExM0MgfCAjeDExM0UgfCAjeDExNDAgfCAjeDExNEMgfCAjeDExNEUgfCAjeDExNTANCi0vLyB8IFsjeDExNTQtI3gxMTU1XSB8ICN4MTE1OSB8IFsjeDExNUYtI3gxMTYxXSB8ICN4MTE2MyB8ICN4MTE2NQ0KLS8vIHwgI3gxMTY3IHwgI3gxMTY5IHwgWyN4MTE2RC0jeDExNkVdIHwgWyN4MTE3Mi0jeDExNzNdIHwgI3gxMTc1DQotLy8gfCAjeDExOUUgfCAjeDExQTggfCAjeDExQUIgfCBbI3gxMUFFLSN4MTFBRl0gfCBbI3gxMUI3LSN4MTFCOF0NCi0vLyB8ICN4MTFCQSB8IFsjeDExQkMtI3gxMUMyXSB8ICN4MTFFQiB8ICN4MTFGMCB8ICN4MTFGOQ0KLS8vIHwgWyN4MUUwMC0jeDFFOUJdIHwgWyN4MUVBMC0jeDFFRjldIHwgWyN4MUYwMC0jeDFGMTVdDQotLy8gfCBbI3gxRjE4LSN4MUYxRF0gfCBbI3gxRjIwLSN4MUY0NV0gfCBbI3gxRjQ4LSN4MUY0RF0NCi0vLyB8IFsjeDFGNTAtI3gxRjU3XSB8ICN4MUY1OSB8ICN4MUY1QiB8ICN4MUY1RCB8IFsjeDFGNUYtI3gxRjdEXQ0KLS8vIHwgWyN4MUY4MC0jeDFGQjRdIHwgWyN4MUZCNi0jeDFGQkNdIHwgI3gxRkJFIHwgWyN4MUZDMi0jeDFGQzRdDQotLy8gfCBbI3gxRkM2LSN4MUZDQ10gfCBbI3gxRkQwLSN4MUZEM10gfCBbI3gxRkQ2LSN4MUZEQl0NCi0vLyB8IFsjeDFGRTAtI3gxRkVDXSB8IFsjeDFGRjItI3gxRkY0XSB8IFsjeDFGRjYtI3gxRkZDXSB8ICN4MjEyNg0KLS8vIHwgWyN4MjEyQS0jeDIxMkJdIHwgI3gyMTJFIHwgWyN4MjE4MC0jeDIxODJdIHwgWyN4MzA0MS0jeDMwOTRdDQotLy8gfCBbI3gzMEExLSN4MzBGQV0gfCBbI3gzMTA1LSN4MzEyQ10gfCBbI3hBQzAwLSN4RDdBM10NCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdDQotDQotLy8gWzg2XSAgSWRlb2dyYXBoaWMgOjo9IFsjeDRFMDAtI3g5RkE1XSB8ICN4MzAwNyB8IFsjeDMwMjEtI3gzMDI5XQ0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQ0KLQ0KLS8vIFs4N10gICAgICBDb21iaW5pbmdDaGFyICAgIDo6PSAgICBbI3gwMzAwLSN4MDM0NV0gICAgfCBbI3gwMzYwLSN4MDM2MV0NCi0vLyB8IFsjeDA0ODMtI3gwNDg2XSAgICAgICAgICB8IFsjeDA1OTEtI3gwNUExXSAgICAgICAgIHwgWyN4MDVBMy0jeDA1QjldDQotLy8gfCBbI3gwNUJCLSN4MDVCRF0gICAgICAgfCAjeDA1QkYgICAgICAgfCBbI3gwNUMxLSN4MDVDMl0JIHwgI3gwNUM0DQotLy8gfCBbI3gwNjRCLSN4MDY1Ml0gICAgfCAjeDA2NzAgICAgfCBbI3gwNkQ2LSN4MDZEQ10gICB8IFsjeDA2REQtI3gwNkRGXQ0KLS8vIHwgWyN4MDZFMC0jeDA2RTRdICAgICAgICAgIHwgWyN4MDZFNy0jeDA2RThdICAgICAgICAgfCBbI3gwNkVBLSN4MDZFRF0NCi0vLyB8IFsjeDA5MDEtI3gwOTAzXSAgICAgICB8ICN4MDkzQyAgICAgICB8IFsjeDA5M0UtI3gwOTRDXSAgICAgIHwgI3gwOTREDQotLy8gfCBbI3gwOTUxLSN4MDk1NF0gICAgfCBbI3gwOTYyLSN4MDk2M10gICAgfCBbI3gwOTgxLSN4MDk4M10gICB8ICN4MDlCQw0KLS8vIHwgI3gwOUJFICAgICAgIHwgI3gwOUJGICAgICAgIHwgWyN4MDlDMC0jeDA5QzRdICAgICAgfCBbI3gwOUM3LSN4MDlDOF0NCi0vLyB8IFsjeDA5Q0ItI3gwOUNEXSAgIHwgI3gwOUQ3ICAgfCBbI3gwOUUyLSN4MDlFM10gICB8ICN4MEEwMiAgIHwgI3gwQTNDDQotLy8gfCAjeDBBM0UgICAgICAgfCAjeDBBM0YgICAgICAgfCBbI3gwQTQwLSN4MEE0Ml0gICAgICB8IFsjeDBBNDctI3gwQTQ4XQ0KLS8vIHwgWyN4MEE0Qi0jeDBBNERdICAgIHwgWyN4MEE3MC0jeDBBNzFdICAgIHwgWyN4MEE4MS0jeDBBODNdICAgfCAjeDBBQkMNCi0vLyB8IFsjeDBBQkUtI3gwQUM1XSAgICAgICAgICB8IFsjeDBBQzctI3gwQUM5XSAgICAgICAgIHwgWyN4MEFDQi0jeDBBQ0RdDQotLy8gfCBbI3gwQjAxLSN4MEIwM10gICAgfCAjeDBCM0MgICAgfCBbI3gwQjNFLSN4MEI0M10gICB8IFsjeDBCNDctI3gwQjQ4XQ0KLS8vIHwgWyN4MEI0Qi0jeDBCNERdICAgICAgICAgIHwgWyN4MEI1Ni0jeDBCNTddICAgICAgICAgfCBbI3gwQjgyLSN4MEI4M10NCi0vLyB8IFsjeDBCQkUtI3gwQkMyXSAgICB8IFsjeDBCQzYtI3gwQkM4XSAgICB8IFsjeDBCQ0EtI3gwQkNEXSAgIHwgI3gwQkQ3DQotLy8gfCBbI3gwQzAxLSN4MEMwM10gICAgICAgICAgfCBbI3gwQzNFLSN4MEM0NF0gICAgICAgICB8IFsjeDBDNDYtI3gwQzQ4XQ0KLS8vIHwgWyN4MEM0QS0jeDBDNERdICAgICAgICAgIHwgWyN4MEM1NS0jeDBDNTZdICAgICAgICAgfCBbI3gwQzgyLSN4MEM4M10NCi0vLyB8IFsjeDBDQkUtI3gwQ0M0XSAgICAgICAgICB8IFsjeDBDQzYtI3gwQ0M4XSAgICAgICAgIHwgWyN4MENDQS0jeDBDQ0RdDQotLy8gfCBbI3gwQ0Q1LSN4MENENl0gICAgICAgICAgfCBbI3gwRDAyLSN4MEQwM10gICAgICAgICB8IFsjeDBEM0UtI3gwRDQzXQ0KLS8vIHwgWyN4MEQ0Ni0jeDBENDhdICAgICAgIHwgWyN4MEQ0QS0jeDBENERdICAgICAgIHwgI3gwRDU3ICAgICAgfCAjeDBFMzENCi0vLyB8IFsjeDBFMzQtI3gwRTNBXSAgICB8IFsjeDBFNDctI3gwRTRFXSAgICB8ICN4MEVCMSAgIHwgWyN4MEVCNC0jeDBFQjldDQotLy8gfCBbI3gwRUJCLSN4MEVCQ10gICAgfCBbI3gwRUM4LSN4MEVDRF0gICAgfCBbI3gwRjE4LSN4MEYxOV0gICB8ICN4MEYzNQ0KLS8vIHwgI3gwRjM3ICAgICAgfCAjeDBGMzkgICAgIHwgI3gwRjNFICAgICB8ICN4MEYzRiAgICAgfCBbI3gwRjcxLSN4MEY4NF0NCi0vLyB8IFsjeDBGODYtI3gwRjhCXSAgICB8IFsjeDBGOTAtI3gwRjk1XSAgICB8ICN4MEY5NyAgIHwgWyN4MEY5OS0jeDBGQURdDQotLy8gfCBbI3gwRkIxLSN4MEZCN10gICAgICAgfCAjeDBGQjkgICAgICAgfCBbI3gyMEQwLSN4MjBEQ10gICAgICB8ICN4MjBFMQ0KLS8vIHwgWyN4MzAyQS0jeDMwMkZdIHwgI3gzMDk5IHwgI3gzMDlBDQotQ29tYmluaW5nQ2hhciA9ICAgIFtcdTAzMDAtXHUwMzQ1XHUwMzYwLVx1MDM2MVx1MDQ4My1cdTA0ODZcdTA1OTEtXHUwNUExXHUwNUEzLVx1MDVCOVx1MDVCQi1cdTA1QkRcdTA1QkZcdTA1QzEtXHUwNUMyXHUwNUM0XHUwNjRCLVx1MDY1Mlx1MDY3MFx1MDZENi1cdTA2RENcdTA2REQtXHUwNkRGXHUwNkUwLVx1MDZFNFx1MDZFNy1cdTA2RThcdTA2RUEtXHUwNkVEXHUwOTAxLVx1MDkwM1x1MDkzQ1x1MDkzRS1cdTA5NENcdTA5NERcdTA5NTEtXHUwOTU0XHUwOTYyLVx1MDk2M1x1MDk4MS1cdTA5ODNcdTA5QkNcdTA5QkVcdTA5QkZcdTA5QzAtXHUwOUM0XHUwOUM3LVx1MDlDOFx1MDlDQi1cdTA5Q0RcdTA5RDdcdTA5RTItXHUwOUUzXHUwQTAyXHUwQTNDXHUwQTNFXHUwQTNGXHUwQTQwLVx1MEE0Mlx1MEE0Ny1cdTBBNDhcdTBBNEItXHUwQTREXHUwQTcwLVx1MEE3MVx1MEE4MS1cdTBBODNcdTBBQkNcdTBBQkUtXHUwQUM1XHUwQUM3LVx1MEFDOVx1MEFDQi1cdTBBQ0RcdTBCMDEtXHUwQjAzXHUwQjNDXHUwQjNFLVx1MEI0M1x1MEI0Ny1cdTBCNDhcdTBCNEItXHUwQjREXHUwQjU2LVx1MEI1N1x1MEI4Mi1cdTBCODNcdTBCQkUtXHUwQkMyXHUwQkM2LVx1MEJDOFx1MEJDQS1cdTBCQ0RcdTBCRDdcdTBDMDEtXHUwQzAzXHUwQzNFLVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1LVx1MEM1Nlx1MEM4Mi1cdTBDODNcdTBDQkUtXHUwQ0M0XHUwQ0M2LVx1MENDOFx1MENDQS1cdTBDQ0RcdTBDRDUtXHUwQ0Q2XHUwRDAyLVx1MEQwM1x1MEQzRS1cdTBENDNcdTBENDYtXHUwRDQ4XHUwRDRBLVx1MEQ0RFx1MEQ1N1x1MEUzMVx1MEUzNC1cdTBFM0FcdTBFNDctXHUwRTRFXHUwRUIxXHUwRUI0LVx1MEVCOVx1MEVCQi1cdTBFQkNcdTBFQzgtXHUwRUNEXHUwRjE4LVx1MEYxOVx1MEYzNVx1MEYzN1x1MEYzOVx1MEYzRVx1MEYzRlx1MEY3MS1cdTBGODRcdTBGODYtXHUwRjhCXHUwRjkwLVx1MEY5NVx1MEY5N1x1MEY5OS1cdTBGQURcdTBGQjEtXHUwRkI3XHUwRkI5XHUyMEQwLVx1MjBEQ1x1MjBFMVx1MzAyQS1cdTMwMkZcdTMwOTlcdTMwOUFdDQotDQotLy8gWzg4XSAgIERpZ2l0ICA6Oj0gIFsjeDAwMzAtI3gwMDM5XSB8IFsjeDA2NjAtI3gwNjY5XSB8IFsjeDA2RjAtI3gwNkY5XQ0KLS8vIHwgWyN4MDk2Ni0jeDA5NkZdICAgICAgICAgIHwgWyN4MDlFNi0jeDA5RUZdICAgICAgICAgfCBbI3gwQTY2LSN4MEE2Rl0NCi0vLyB8IFsjeDBBRTYtI3gwQUVGXSAgICAgICAgICB8IFsjeDBCNjYtI3gwQjZGXSAgICAgICAgIHwgWyN4MEJFNy0jeDBCRUZdDQotLy8gfCBbI3gwQzY2LSN4MEM2Rl0gICAgICAgICAgfCBbI3gwQ0U2LSN4MENFRl0gICAgICAgICB8IFsjeDBENjYtI3gwRDZGXQ0KLS8vIHwgWyN4MEU1MC0jeDBFNTldIHwgWyN4MEVEMC0jeDBFRDldIHwgWyN4MEYyMC0jeDBGMjldDQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0NCi0NCi0vLyBbODldICBFeHRlbmRlciA6Oj0gI3gwMEI3IHwgI3gwMkQwIHwgI3gwMkQxIHwgI3gwMzg3IHwgI3gwNjQwIHwgI3gwRTQ2DQotLy8gfCAjeDBFQzYgICAgICAgfCAjeDMwMDUgICAgICAgfCBbI3gzMDMxLSN4MzAzNV0gICAgICB8IFsjeDMwOUQtI3gzMDlFXQ0KLS8vIHwgWyN4MzBGQy0jeDMwRkVdDQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQ0KLQ0KLQ0KLQ0KLS8qKg0KLSAqIEpTUCBhbmQgc2NyaXB0aW5nIG1hcmtlciBhbGxvd2FuY2VzDQotICovDQotDQotanNwQ29tbWVudFN0YXJ0ID0gPCUtLQ0KLWpzcENvbW1lbnRFbmQgICA9IC0tJT4NCi0NCi1qc3BTY3JpcHRsZXRTdGFydCAgICAgICAgPSA8JQ0KLWpzcEV4cHJlc3Npb25TdGFydCAgICAgICA9IHtqc3BTY3JpcHRsZXRTdGFydH09DQotanNwRGVjbGFyYXRpb25TdGFydCAgICAgID0ge2pzcFNjcmlwdGxldFN0YXJ0fVwhDQotanNwU2NyaXB0bGV0RW5kICAgICAgICAgID0gJT4NCi1qc3BEaXJlY3RpdmVTdGFydCAgICAgICAgPSB7anNwU2NyaXB0bGV0U3RhcnR9QA0KLQ0KLSUlDQotDQotLyogd2hpdGUgc3BhY2Ugd2l0aGluIGEgdGFnICovDQotPFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfUEksIFNUX1hNTF9QSV9FUVVBTFMsIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UsIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCwgU1RfSlNQX0RJUkVDVElWRV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUywgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUsU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVELFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCxTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSxTVF9ESFRNTF9FUVVBTFMsU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFLFNUX0RIVE1MX1RBR19DTE9TRT4ge1N9KiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkDQotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLQ0KLS8vIEJFR0lOIFJFR1VMQVIgWE1MDQotLyogaGFuZGxlIG9wZW5pbmcgYSBuZXcgdGFnIGFsbW9zdCBhbnl3aGVyZSAqLw0KLQ0KLQ0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfREVDTEFSQVRJT04sIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5zdGFydCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsNCi19DQotLyogVkVSWSBzcGVjaWFsIGNhc2VzIGZvciB0YWdzIGFzIHZhbHVlcyAqLw0KLS8qIHF1b3RlZCBKU1AgKi8NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEPiBbIl0gew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEPiBbJ10gew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4gWyJdIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpOw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggZG91YmxlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSk7DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IFsnXSB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7DQotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBjb21wbGV4IHNpbmdsZSBxdW90ZWQiKTsvLyROT04tTkxTLTEkDQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpOw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEPiAoW148Ilx4MjRceDIzXXxbXHgyNFx4MjNdW15ceDdiXSkrIHsNCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEPiAoW148J1x4MjRceDIzXXxbXHgyNFx4MjNdW15ceDdiXSkrIHsNCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVELFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4ge2dlbmVyaWNUYWdPcGVufSB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCX0NCi0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBpbnNpZGUgb2YgSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOw0KLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpDQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IHtnZW5lcmljRW5kVGFnT3Blbn0gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCWludCBpbmNvbWluZ1N0YXRlID0geXlzdGF0ZSgpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gZW5kIHRhZyIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9FTkRfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsNCi0JaWYoeXlzdGF0ZSgpICE9IFNUX0FCT1JUX0VNQkVEREVEKQ0KLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLQ0KLS8qIHVucXVvdGVkICovDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIHRhZyBlbWJlZGRlZCBuYW1lIHN0YXJ0IC0gc3RhcnQgdGFnIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLQ0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9YTUxfREVDTEFSQVRJT04+IHtnZW5lcmljRW5kVGFnT3Blbn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsNCi19DQotLyogc3BlY2lhbGx5IHRyZWF0ZWQgSlNQIHRhZyBuYW1lcyAqLw0KLTxTVF9YTUxfVEFHX05BTUU+IGpzcDpyb290IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJqc3A6cm9vdCB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gSlNQX1JPT1RfVEFHX05BTUU7DQotfQ0KLTxTVF9YTUxfVEFHX05BTUU+IGpzcDpkaXJlY3RpdmUuKHBhZ2V8aW5jbHVkZXx0YWd8dGFnbGlifGF0dHJpYnV0ZXx2YXJpYWJsZSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImpzcCBkaXJlY3RpdmUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsNCi19DQotLyogdGhlIHRhZydzIG5hbWUgd2FzIGZvdW5kLCBzdGFydCBzY2FubmluZyBmb3IgYXR0cmlidXRlcyAqLw0KLTxTVF9YTUxfVEFHX05BTUU+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgidGFnIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotDQotLyogYW5vdGhlciBhdHRyaWJ1dGUgbmFtZSB3YXMgZm91bmQsIHJlc3VtZSBsb29raW5nIGZvciB0aGUgZXF1YWxzIHNpZ24gKi8NCi08U1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotLyogYW4gZXF1YWwgc2lnbiB3YXMgZm91bmQsIHdoYXQncyBuZXh0IGlzIHRoZSB2YWx1ZSAqLw0KLTxTVF9YTUxfRVFVQUxTPiB7RXF9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7DQotfQ0KLS8qIHRoZSB2YWx1ZSB3YXMgZm91bmQsIGxvb2sgZm9yIHRoZSBuZXh0IG5hbWUgKi8NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge0F0dFZhbHVlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIHRoZSB0YWcncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWlmKGlzQmxvY2tNYXJrZXIoKSkgew0KLQkJZkVtYmVkZGVkSGludCA9IGdldEJsb2NrTWFya2VyQ29udGV4dCgpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQkxPQ0tfVEFHX1NDQU47DQotICAgICAgICAJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCX0NCi0JZWxzZQ0KLSAgICAgICAgCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0NMT1NFOw0KLX0NCi0vKiB0aGUgdGFnJ3MgY2xvc2Ugd2FzIGZvdW5kLCBidXQgdGhlIHRhZyBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBlbmQgdGFnICovDQotPFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY0VtcHR5VGFnQ2xvc2V9IHsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotICAgICAgICByZXR1cm4gWE1MX0VNUFRZX1RBR19DTE9TRTsNCi19DQotDQotPFNUX1hNTF9UQUdfTkFNRT4gW148Lz5cdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNcdTRFMDAtXHU5RkE1XHUzMDA3XHUzMDIxLVx1MzAyOV0qIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJpbmFwcHJvcHJpYXRlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlpZighZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUR8fGZTdGF0ZVN0YWNrLnBlZWsoKT09U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKSkgew0KLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7DQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCktMSk7DQotCQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCX0NCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9DT05URU5UOw0KLX0NCi0NCi0vLyBFTkQgUkVHVUxBUiBYTUwNCi0NCi0vLyBCRUdJTiBORVNURUQgWE1MIFRBR1MNCi08U1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfRVFVQUxTPiA8e05hbWV9IHsNCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7DQotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldA0KLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsNCi0JaWYoIWlzTmVzdGFibGUodGFnTmFtZSkpIHsNCi0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JCXJldHVybiBYTUxfVEFHX09QRU47DQotCX0NCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0DQotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFhNTF9UQUdfT1BFTiwgdGFnTmFtZSk7IC8vID8NCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCXl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4gPHtOYW1lfSB7DQotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOw0KLQkvLyBwdXNoYmFjayB0byBqdXN0IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNrZXQNCi0JeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMSk7DQotCWlmKCFpc05lc3RhYmxlKHRhZ05hbWUpKSB7DQotCQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotCQlyZXR1cm4gWE1MX1RBR19PUEVOOw0KLQl9DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0DQotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFhNTF9UQUdfT1BFTiwgdGFnTmFtZSk7IC8vID8NCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLS8vIEVORCBORVNURUQgWE1MDQotDQotLy8gWE1MICYgSlNQIENvbW1lbnRzDQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfSlNQX0RJUkVDVElWRV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSwgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFPiB7Q29tbWVudFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTU1FTlRfVEVYVDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0NPTU1FTlQ7DQotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOw0KLQlyZXR1cm4gWE1MX0NPTU1FTlRfT1BFTjsNCi19DQotPFNUX1hNTF9DT01NRU5UPiAufFxyfFxuIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsNCi19DQotDQotPFNUX1hNTF9DT01NRU5UX0VORD4ge0NvbW1lbnRFbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7DQotfQ0KLQ0KLTxTVF9KU1BfQ09OVEVOVD4ge2pzcFNjcmlwdGxldEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gSlNQX0NMT1NFOw0KLX0NCi08U1RfSlNQX0NPTlRFTlQ+IC4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBjb2RlIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBkb1NjYW4oIiU+IiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCk7DQotfQ0KLXtqc3BTY3JpcHRsZXRTdGFydH0gew0KLQkvKiBKU1Agc2NyaXB0bGV0IGJlZ3VuIChhbnl3aGVyZSkNCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUNCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMNCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQNCi0JICovDQotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MNCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7DQotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyENCi0JCXl5cHVzaGJhY2soMSk7DQotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsNCi0JCXl5cHVzaGJhY2soMik7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsNCi0JfQ0KLQkvLyBmaW5pc2hlZCBzYW5pdHkgY2hlY2tzDQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsNCi0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJcbkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsNCi0JCXJldHVybiBKU1BfU0NSSVBUTEVUX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCQl9DQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1NDUklQVExFVF9PUEVOLCBKU1BfQ0xPU0UpOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7DQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7DQotCQl9DQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQote2pzcEV4cHJlc3Npb25TdGFydH0gew0KLQkvKiBKU1AgZXhwcmVzc2lvbiBiZWd1biAoYW55d2hlcmUpDQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlDQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzDQotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkDQotCSAqLw0KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgew0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hDQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIEpTUF9DT05URU5UOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotCX0NCi0JLy8gZW5kIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGFuIGV4cHJlc3Npb24gb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsNCi0JCXJldHVybiBKU1BfRVhQUkVTU0lPTl9PUEVOOw0KLQl9DQotCWVsc2Ugew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JCX0NCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRVhQUkVTU0lPTl9PUEVOLCBKU1BfQ0xPU0UpOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7DQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7DQotCQl9DQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQote2pzcERlY2xhcmF0aW9uU3RhcnR9IHsNCi0JLyogSlNQIGRlY2xhcmF0aW9uIGJlZ3VuIChhbnl3aGVyZSkNCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUNCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMNCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQNCi0JICovDQotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MNCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7DQotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyENCi0JCXl5cHVzaGJhY2soMik7DQotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsNCi0JfQ0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7DQotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSBkZWNsYXJhdGlvbiBvdXQgaW4gY29udGVudA0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiXG5KU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsNCi0JCXJldHVybiBKU1BfREVDTEFSQVRJT05fT1BFTjsNCi0JfQ0KLQllbHNlIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgew0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOw0KLQkJfQ0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ERUNMQVJBVElPTl9PUEVOLCBKU1BfQ0xPU0UpOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7DQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7DQotCQl9DQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQotPFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOPiB7anNwQ29tbWVudFN0YXJ0fSAgew0KLQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7DQotCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikNCi0JCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFlZSU5JVElBTCxTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTj4ge2pzcERpcmVjdGl2ZVN0YXJ0fSAgew0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJcbkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7DQotCQlyZXR1cm4gSlNQX0RJUkVDVElWRV9PUEVOOw0KLQl9DQotCWVsc2Ugew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1AgZGlyZWN0aXZlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUUpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRElSRUNUSVZFX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRElSRUNUSVZFX0NMT1NFLCBKU1BfQ0xPU0V9KTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfTkFNRT4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgZGlyZWN0aXZlIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UpOw0KLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0U+IHtTfT8gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLTxTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRT4ge2pzcFNjcmlwdGxldEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9DTE9TRTsNCi19DQotDQotPFlZSU5JVElBTD4ge2pzcENvbW1lbnRTdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQlyZXR1cm4gSlNQX0NPTU1FTlRfT1BFTjsNCi19DQotDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gXHgyNFx4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMDQotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JfQ0KLQllbHNlIHsNCi0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7DQotCX0NCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ+IFx4MjNceDdiIHsNCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7DQotCXl5YmVnaW4oU1RfSlNQX0RRVU9URURfVkJMKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsNCi0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwNCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQl9DQotCWVsc2Ugew0KLQkJeXliZWdpbihlbnRlclN0YXRlKTsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4gXHgyNFx4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9FTCk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMDQotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JfQ0KLQllbHNlIHsNCi0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7DQotCX0NCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IFx4MjNceDdiIHsNCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7DQotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfVkJMKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEV9KTsNCi0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwNCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQl9DQotCWVsc2Ugew0KLQkJeXliZWdpbihlbnRlclN0YXRlKTsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotLy8gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSwgcmV0dXJuIGFzIGVuZGluZyByZWdpb24NCi08U1RfSlNQX0RRVU9URURfRUwsU1RfSlNQX0RRVU9URURfVkJMPiBbIl0gew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOw0KLX0NCi0vLyB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlLCByZXR1cm4gYXMgZW5kaW5nIHJlZ2lvbg0KLTxTVF9KU1BfU1FVT1RFRF9FTCxTVF9KU1BfU1FVT1RFRF9WQkw+IFsnXSB7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7DQotfQ0KLQ0KLQ0KLS8vIHBhaXJlZCBlc2NhcGVkIGRvdWJsZSBxdW90ZXMNCi08U1RfSlNQX0RRVU9URURfRUw+IFxcXCIgKFteXFxdfFxcW14ifV0rKSogXFxcIiB7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBFTA0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gKFteXFx9Il18XFxbXiJdKSsgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gXFxcIiB7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9TUVVPVEVEX0VMPiBcXFwnIChbXlxcXXxcXFteJ31dKykqIFxcXCcgew0KLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOw0KLX0NCi0vLyBldmVyeXRoaW5nIGVsc2UgRUwNCi08U1RfSlNQX1NRVU9URURfRUw+IChbXlxcfSddfFxcW14nXSkrIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX1NRVU9URURfRUw+IFxcXCcgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9FTCxTVF9KU1BfU1FVT1RFRF9FTD4gfSB7DQotCXJldHVybiBKU1BfRUxfQ0xPU0U7DQotfQ0KLQ0KLQ0KLS8vIHBhaXJlZCBlc2NhcGVkIHF1b3Rlcw0KLTxTVF9KU1BfRFFVT1RFRF9WQkw+IFxcXCIgKFteXFxdfFxcW14ifV0rKSogXFxcIiB7DQotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOw0KLX0NCi0vLyBldmVyeXRoaW5nIGVsc2UgVkJMDQotPFNUX0pTUF9EUVVPVEVEX1ZCTD4gKFteXFx9Il18XFxbXiJdKSsgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX0RRVU9URURfVkJMPiBcXFwiIHsNCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsNCi19DQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9TUVVPVEVEX1ZCTD4gXFxcJyAoW15cXF18XFxbXid9XSspKiBcXFwnIHsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBWQkwNCi08U1RfSlNQX1NRVU9URURfVkJMPiAoW15cXH0nXXxcXFteJ10pKyB7DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfU1FVT1RFRF9WQkw+IFxcXCcgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0NCi08U1RfSlNQX0RRVU9URURfVkJMLFNUX0pTUF9TUVVPVEVEX1ZCTD4gfSB7DQotCXJldHVybiBKU1BfVkJMX0NMT1NFOw0KLX0NCi0NCi0NCi0vLyBYTUwgY29udGVudCBhcmVhIEVMDQotPFlZSU5JVElBTD4gXHgyNFx4N2JbXlx4N2RdKi9ceDdkIHsNCi0JeXliZWdpbihTVF9KU1BfRUwpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOw0KLQlmRUxsZXZlbCsrOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgSlNQX0VMX0NMT1NFKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOw0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfSlNQX0VMPiBceDI0XHg3YiB7DQotCWZFTGxldmVsKys7DQotCWlmKGZFTGxldmVsID09IDEpIHsNCi0JCXJldHVybiBKU1BfRUxfT1BFTjsNCi0JfQ0KLX0NCi0vLyBYTUwgY29udGVudCBhcmVhIFZCTA0KLTxZWUlOSVRJQUw+IFx4MjNceDdiW15ceDdkXSovXHg3ZCB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7DQotCWlmKHl5bGVuZ3RoKCkgPiAyKQ0KLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7DQotCWZFTGxldmVsKys7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgSlNQX1ZCTF9DTE9TRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX0pTUF9WQkw+IFx4MjNceDdiIHsNCi0JZkVMbGV2ZWwrKzsNCi0JaWYoZkVMbGV2ZWwgPT0gMSkgew0KLQkJcmV0dXJuIEpTUF9WQkxfT1BFTjsNCi0JfQ0KLX0NCi0vLyByZXR1cm4gYW55dGhpbmcgbm90IHN0YXJ0aW5nIHF1b3RlcyBvciBlbmRpbmcgdGhlIFZCTCBhcyBjb250ZW50DQotPFNUX0pTUF9WQkw+IFteXHg3ZFx4MjJceDI3XSogew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0vLyByZXR1cm4gYW55dGhpbmcgbm90IHN0YXJ0aW5nIHF1b3RlcyBvciBlbmRpbmcgdGhlIEVMIGFzIGNvbnRlbnQNCi08U1RfSlNQX0VMPiBbXlx4N2RceDIyXHgyN10qIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi0NCi0NCi0vLyBxdW90ZXMNCi08U1RfSlNQX0VMPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFUyk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMX0RRVU9URVM+IFteXHgyMl0rL1x4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTX0VORCk7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRUxfRFFVT1RFU19FTkQ+IFx4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFUyk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX0VMX1NRVU9URVM+IFteXHgyN10rL1x4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTX0VORCk7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRUxfU1FVT1RFU19FTkQ+IFx4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi0vLyBxdW90ZXMNCi08U1RfSlNQX1ZCTD4gXHgyMiB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9EUVVPVEVTPiBbXlx4MjJdKy9ceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMX0RRVU9URVNfRU5EPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTD4gXHgyNyB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9TUVVPVEVTPiBbXlx4MjddKy9ceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMX1NRVU9URVNfRU5EPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi0NCi0vLyB1bnF1b3RlZCBjb250ZW50DQotPFNUX0pTUF9FTD4gKFtefVx4MjdceDIyXHgyNF18XHgyNFteXHg3Ylx4MjdceDIyXSkrIHsNCi0JLy9TeXN0ZW0ub3V0LnByaW50bG4oSlNQX0VMX0NPTlRFTlQrICI6WyIgKyB5eXRleHQoKSArICJdIik7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9FTD4gfSB7DQotCWZFTGxldmVsLS07DQotCWlmKGZFTGxldmVsID09IDApIHsNCi0JCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCXJldHVybiBKU1BfRUxfQ0xPU0U7DQotCX0NCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX1ZCTD4gfSB7DQotCWZFTGxldmVsLS07DQotCWlmKGZFTGxldmVsID09IDApIHsNCi0JCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCXJldHVybiBKU1BfVkJMX0NMT1NFOw0KLQl9DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLS8vIEVMIHVucXVvdGVkIGluIHRhZyAoc2VjdGlvbiAyLjEgZGVjbGFyZXMgaXQgYXMgdmFsaWQgaW4gdGVtcGxhdGUgdGV4dCAoWE1MX0NPTlRFTlQpIG9yIGF0dHJpYnV0ZSB2YWx1ZXMNCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4gXHgyNFx4N2JbXlx4N2RdKy9ceDdkIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiRUwgaW4gYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9KU1BfRUwpOw0KLQlmRUxsZXZlbCsrOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFfSk7DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotLy8gVkJMIHVucXVvdGVkIGluIHRhZyBvciBhdHRyaWJ1dGUgdmFsdWVzDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IFx4MjNceDdiW15ceDdkXSsvXHg3ZCB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoeXlsZW5ndGgoKSA+IDIpDQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlZCTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX0pTUF9WQkwpOw0KLQlmRUxsZXZlbCsrOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0V9KTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi08U1RfSlNQX0NPTU1FTlQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgdGV4dCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLX0NCi08U1RfSlNQX0NPTU1FTlRfRU5EPiB7anNwQ29tbWVudEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JcmV0dXJuIEpTUF9DT01NRU5UX0NMT1NFOw0KLX0NCi0NCi0vLyBYTUwgbWlzYw0KLQ0KLXtDRFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47DQotfQ0KLTxTVF9DREFUQV9URVhUPiAufFxyfFxuIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCVN0cmluZyByZXR1cm5lZENvbnRleHQgPSBkb1NjYW4oIl1dPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5ELCAgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkDQotCWlmKHJldHVybmVkQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkNCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsNCi0JcmV0dXJuIHJldHVybmVkQ29udGV4dDsNCi19DQotPFNUX0NEQVRBX0VORD4ge0NERW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsNCi19DQotDQotPFlZSU5JVElBTD4ge1BFUmVmZXJlbmNlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7DQotfQ0KLTxZWUlOSVRJQUw+IHtDaGFyUmVmfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOw0KLX0NCi08WVlJTklUSUFMPiB7RW50aXR5UmVmfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRU5USVRZX1JFRkVSRU5DRTsNCi19DQotDQotPFlZSU5JVElBTD4ge1BJc3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfUEkpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOw0KLX0NCi0vLyB0aGUgbmV4dCB0aHJlZSBhcmUgb3JkZXIgZGVwZW5kZW50DQotPFNUX1BJPiAoKFh8eCkoTXxtKShMfGwpKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4gKFtpSV1bbU1dW3BQXVtvT11bclJdW3RUXSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotPFNUX1BJPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7DQotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QSV9XUz4ge1N9KyB7DQotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOw0KLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi08U1RfUEksIFNUX1BJX1dTPiBcPz4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotPFNUX1BJX0NPTlRFTlQ+IC4gew0KLQkJLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZA0KLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsNCi19DQotPFNUX1BJX0NPTlRFTlQsU1RfWE1MX1BJX1RBR19DTE9TRT4gXD8+IHsNCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUNCi0JCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0NCi08U1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfWE1MX1BJX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIHRoZSBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9YTUxfUElfRVFVQUxTLCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtQSWVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLS8vIERIVE1MDQotPFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9FUVVBTFM+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfREhUTUxfRVFVQUxTPiB7RXF9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRT4ge0F0dFZhbHVlfSB8IChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIFRoZSBESFRNTCBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9ESFRNTF9FUVVBTFMsIFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IFsvXSo+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBkZWNsYXJhdGlvbnMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSEgew0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRWVdW0xsXVtFZV1bTW1dW0VlXVtObl1bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRGRdW09vXVtDY11bVHRdW1l5XVtQcF1bRWVdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbQWFdW1R0XVtUdF1bTGxdW0lpXVtTc11bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOw0KLX0NCi0NCi0vLyBiZWdpbiBET0NUWVBFIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0U+IFxbW15cXV0qXF0gew0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOw0KLX0NCi0NCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1BwXVtVdV1bQmJdW0xsXVtJaV1bQ2NdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOw0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1NzXVtZeV1bU3NdW1R0XVtFZV1bTW1dIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOw0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUM+IHtBdHRWYWx1ZX18e1B1YmlkTGl0ZXJhbH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0+IHtBdHRWYWx1ZX18e1N5c3RlbUxpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOw0KLX0NCi0vLyBlbmQgRE9DVFlQRSBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEVMRU1FTlQgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgRUxFTUVOVCBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEFUVExJU1QgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRTsNCi19DQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQ+IFtePl0qIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOw0KLX0NCi0NCi08U1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dGxpc3QgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgQVRUTElTVCBoYW5kbGluZw0KLQ0KLTxTVF9YTUxfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCwgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04sIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UsIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7DQotfQ0KLS8vIGVuZCBERUNMQVJBVElPTiBoYW5kbGluZw0KLQ0KLTxZWUlOSVRJQUw+IChbXjwmJVx4MjRceDIzXSp8XHgyMyt8XHgyNCt8WyYlXXtTfSt7TmFtZX1bXiYlPF0qfFtceDI0XHgyM11bXlx4N2I8JiVdfFsmJV17TmFtZX0oW147JiU8XSp8e1N9KzsqKSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQ09OVEVOVDsNCi19DQotDQotDQotPFNUX0JMT0NLX1RBR19TQ0FOPiAufFxyfFxuIHsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotDQotLiB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiISEhdW5leHBlY3RlZCEhITogXCIiICsgeXl0ZXh0KCkgKyAiXCI6IiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBVTkRFRklORUQ7DQotfQ0KLQ0KLVwwNDAgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlNQQUNFIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTEgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIjB4OSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDE1IA0KLXsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDQVJSSUFHRSBSRVRVUk4iKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxMiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTQzZDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODgyICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEvMjcvMDUgNDo0OCBQTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLlhNTFBhcnNlclJlZ2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEvMjcvMDUgNDo0OCBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBYTUxSZWdpb25Db250ZXh0IHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfVEFHX05BTUUgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDE5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDE3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9URVhUID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfRU5EID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDMwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OID0gMjA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjJcMlwwXDFcMTRcMjJcMFwxXDE0XDFcMjFcMVwxMVwxXDUxIisKLSAgICAiXDFcMTZcMVwxN1wxXDEyXDFcMTNcMVwxNlwxXDE2XDFcMTZcMVwxNlwxXDE2XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDE1XDFcMTBcMVw1NFwxXDFcMVw0M1wxXDJcMVw0XDFcMTYiKwotICAgICJcMVwzMlwxXDU1XDFcMzBcMVwzMVwxXDM1XDFcNTJcMVwzNFwxXDM0XDFcNDBcMVwzNCIrCi0gICAgIlwxXDM0XDFcMjZcMVwyNVwxXDQyXDFcNDFcMVw0NVwxXDM0XDFcMzZcMVwzN1wxXDMzIisKLSAgICAiXDFcNTNcMlwzNFwxXDIzXDFcNDRcMVwzNFwxXDI3XDFcMFwxXDIwXDFcMFwxXDEwIisKLSAgICAiXDFcMFwxXDQ3XDFcNTVcMVw1NlwxXDUwXDFcMzVcMVw1MlwxXDM0XDFcMzRcMVw0MCIrCi0gICAgIlwyXDM0XDFcMjZcMVwyNVwxXDQyXDFcNDFcMVw0NVwxXDM0XDFcMzZcMVwzN1wxXDQ2IisKLSAgICAiXDFcNTNcMVwzNFwxXDM0XDFcMjRcMVw0NFwxXDM0XDFcMFwxXDBcNzJcMFwxXDYwIisKLSAgICAiXDEwXDBcMjdcNTdcMVwwXDM3XDU3XDFcMFw3Mlw1N1wyXDBcMTNcNTdcMlwwXDEwXDU3IisKLSAgICAiXDFcMFw2NVw1N1wxXDBcMTA0XDU3XDExXDBcNDRcNTdcM1wwXDJcNTdcNFwwXDM2XDU3IisKLSAgICAiXDcwXDBcMTMxXDU3XDIyXDBcN1w1N1wxNlwwXDJcNjBcNTZcMFwxMDZcNjBcMzJcMFwyXDYwIisKLSAgICAiXDQ0XDBcMVw1N1wxXDYwXDNcNTdcMVwwXDFcNTdcMVwwXDI0XDU3XDFcMFw1NFw1NyIrCi0gICAgIlwxXDBcN1w1N1wzXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1NyIrCi0gICAgIlwxXDBcMjJcNTdcMTVcMFwxNFw1N1wxXDBcMTAyXDU3XDFcMFwxNFw1N1wxXDBcNDRcNTciKwotICAgICJcMVwwXDRcNjBcMTFcMFw2NVw1N1wyXDBcMlw1N1wyXDBcMlw1N1wzXDBcMzRcNTciKwotICAgICJcMlwwXDEwXDU3XDJcMFwyXDU3XDY3XDBcNDZcNTdcMlwwXDFcNTdcN1wwXDQ2XDU3IisKLSAgICAiXDEyXDBcMjFcNjBcMVwwXDI3XDYwXDFcMFwzXDYwXDFcMFwxXDYwXDFcMFwyXDYwIisKLSAgICAiXDFcMFwxXDYwXDEzXDBcMzNcNTdcNVwwXDNcNTdcNTZcMFwzMlw1N1w1XDBcMVw2MCIrCi0gICAgIlwxMlw1N1wxMFw2MFwxNVwwXDEyXDYwXDZcMFwxXDYwXDEwN1w1N1wyXDBcNVw1N1wxXDAiKwotICAgICJcMTdcNTdcMVwwXDRcNTdcMVwwXDFcNTdcMTdcNjBcMlw1N1wyXDYwXDFcMFw0XDYwIisKLSAgICAiXDJcMFwxMlw2MFx1MDIwN1wwXDNcNjBcMVwwXDY1XDU3XDJcMFwxXDYwXDFcNTdcMjBcNjAiKwotICAgICJcM1wwXDRcNjBcM1wwXDEyXDU3XDJcNjBcMlwwXDEyXDYwXDIxXDBcM1w2MFwxXDAiKwotICAgICJcMTBcNTdcMlwwXDJcNTdcMlwwXDI2XDU3XDFcMFw3XDU3XDFcMFwxXDU3XDNcMCIrCi0gICAgIlw0XDU3XDJcMFwxXDYwXDFcMFw3XDYwXDJcMFwyXDYwXDJcMFwzXDYwXDExXDAiKwotICAgICJcMVw2MFw0XDBcMlw1N1wxXDBcM1w1N1wyXDYwXDJcMFwxMlw2MFwyXDU3XDIwXDAiKwotICAgICJcMVw2MFwyXDBcNlw1N1w0XDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDJcNTdcMVwwXDJcNTdcMlwwXDFcNjBcMVwwXDVcNjBcNFwwIisKLSAgICAiXDJcNjBcMlwwXDNcNjBcMTNcMFw0XDU3XDFcMFwxXDU3XDdcMFwxMlw2MFwyXDYwIisKLSAgICAiXDNcNTdcMTRcMFwzXDYwXDFcMFw3XDU3XDFcMFwxXDU3XDFcMFwzXDU3XDFcMCIrCi0gICAgIlwyNlw1N1wxXDBcN1w1N1wxXDBcMlw1N1wxXDBcNVw1N1wyXDBcMVw2MFwxXDU3IisKLSAgICAiXDEwXDYwXDFcMFwzXDYwXDFcMFwzXDYwXDIyXDBcMVw1N1w1XDBcMTJcNjBcMjFcMCIrCi0gICAgIlwzXDYwXDFcMFwxMFw1N1wyXDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDJcNTdcMlwwXDRcNTdcMlwwXDFcNjBcMVw1N1w2XDYwXDNcMFwyXDYwXDJcMCIrCi0gICAgIlwzXDYwXDEwXDBcMlw2MFw0XDBcMlw1N1wxXDBcM1w1N1w0XDBcMTJcNjBcMjJcMCIrCi0gICAgIlwyXDYwXDFcMFw2XDU3XDNcMFwzXDU3XDFcMFw0XDU3XDNcMFwyXDU3XDFcMCIrCi0gICAgIlwxXDU3XDFcMFwyXDU3XDNcMFwyXDU3XDNcMFwzXDU3XDNcMFwxMFw1N1wxXDAiKwotICAgICJcM1w1N1w0XDBcNVw2MFwzXDBcM1w2MFwxXDBcNFw2MFwxMVwwXDFcNjBcMTdcMCIrCi0gICAgIlwxMVw2MFwyMVwwXDNcNjBcMVwwXDEwXDU3XDFcMFwzXDU3XDFcMFwyN1w1N1wxXDAiKwotICAgICJcMTJcNTdcMVwwXDVcNTdcNFwwXDdcNjBcMVwwXDNcNjBcMVwwXDRcNjBcN1wwIisKLSAgICAiXDJcNjBcMTFcMFwyXDU3XDRcMFwxMlw2MFwyMlwwXDJcNjBcMVwwXDEwXDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFwyN1w1N1wxXDBcMTJcNTdcMVwwXDVcNTdcNFwwXDdcNjBcMVwwIisKLSAgICAiXDNcNjBcMVwwXDRcNjBcN1wwXDJcNjBcN1wwXDFcNTdcMVwwXDJcNTdcNFwwIisKLSAgICAiXDEyXDYwXDIyXDBcMlw2MFwxXDBcMTBcNTdcMVwwXDNcNTdcMVwwXDI3XDU3XDFcMCIrCi0gICAgIlwyMFw1N1w0XDBcNlw2MFwyXDBcM1w2MFwxXDBcNFw2MFwxMVwwXDFcNjBcMTBcMCIrCi0gICAgIlwyXDU3XDRcMFwxMlw2MFwyMjFcMFw1Nlw1N1wxXDBcMVw1N1wxXDYwXDJcNTdcN1w2MCIrCi0gICAgIlw1XDBcNlw1N1wxXDYwXDEwXDYwXDFcMFwxMlw2MFw0N1wwXDJcNTdcMVwwXDFcNTciKwotICAgICJcMlwwXDJcNTdcMVwwXDFcNTdcMlwwXDFcNTdcNlwwXDRcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDFcNTdcMVwwXDFcNTdcMlwwXDJcNTdcMVwwXDJcNTciKwotICAgICJcMVwwXDFcNTdcMVw2MFwyXDU3XDZcNjBcMVwwXDJcNjBcMVw1N1wyXDBcNVw1NyIrCi0gICAgIlwxXDBcMVw2MFwxXDBcNlw2MFwyXDBcMTJcNjBcNzZcMFwyXDYwXDZcMFwxMlw2MCIrCi0gICAgIlwxM1wwXDFcNjBcMVwwXDFcNjBcMVwwXDFcNjBcNFwwXDJcNjBcMTBcNTdcMVwwIisKLSAgICAiXDQxXDU3XDdcMFwyNFw2MFwxXDBcNlw2MFw0XDBcNlw2MFwxXDBcMVw2MFwxXDAiKwotICAgICJcMjVcNjBcM1wwXDdcNjBcMVwwXDFcNjBcMzQ2XDBcNDZcNTdcMTJcMFw0N1w1N1wxMVwwIisKLSAgICAiXDFcNTdcMVwwXDJcNTdcMVwwXDNcNTdcMVwwXDFcNTdcMVwwXDJcNTdcMVwwIisKLSAgICAiXDVcNTdcNTFcMFwxXDU3XDFcMFwxXDU3XDFcMFwxXDU3XDEzXDBcMVw1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wzXDBcMlw1N1wzXDBcMVw1N1w1XDBcM1w1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wzXDBcMlw1N1wzXDAiKwotICAgICJcMlw1N1wxXDBcMVw1N1w1MFwwXDFcNTdcMTFcMFwxXDU3XDJcMFwxXDU3XDJcMCIrCi0gICAgIlwyXDU3XDdcMFwyXDU3XDFcMFwxXDU3XDFcMFw3XDU3XDUwXDBcMVw1N1w0XDAiKwotICAgICJcMVw1N1wxMFwwXDFcNTdcdTBjMDZcMFwyMzRcNTdcNFwwXDEzMlw1N1w2XDBcMjZcNTdcMlwwIisKLSAgICAiXDZcNTdcMlwwXDQ2XDU3XDJcMFw2XDU3XDJcMFwxMFw1N1wxXDBcMVw1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wxXDBcMzdcNTdcMlwwXDY1XDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwxXDU3XDNcMFwzXDU3XDFcMFw3XDU3XDNcMFw0XDU3XDJcMFw2XDU3XDRcMCIrCi0gICAgIlwxNVw1N1w1XDBcM1w1N1wxXDBcN1w1N1wzMjNcMFwxNVw2MFw0XDBcMVw2MFwxMDRcMCIrCi0gICAgIlwxXDU3XDNcMFwyXDU3XDJcMFwxXDU3XDEyMVwwXDNcNTdcdTBlODJcMFwxXDYwXDFcMCIrCi0gICAgIlwxXDU3XDMxXDBcMTFcNTdcNlw2MFwxXDBcNVw2MFwxM1wwXDEyNFw1N1w0XDBcMlw2MCIrCi0gICAgIlwyXDBcMlw2MFwyXDBcMTMyXDU3XDFcMFwzXDYwXDZcMFw1MFw1N1x1MWNkM1wwXHU1MWE2XDU3IisKLSAgICAiXHUwYzVhXDBcdTJiYTRcNTdcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA0OSwgICAgOTgsICAgMTQ3LCAgIDE5NiwgICAyNDUsICAgMjk0LCAgIDM0MywgICAzOTIsICAgNDQxLCAKLSAgICAgIDQ5MCwgICA1MzksICAgNTg4LCAgIDYzNywgICA2ODYsICAgNzM1LCAgIDc4NCwgICA4MzMsICAgODgyLCAgIDkzMSwgCi0gICAgICA5ODAsICAxMDI5LCAgMTA3OCwgIDExMjcsICAxMTc2LCAgMTIyNSwgIDEyNzQsICAxMzIzLCAgMTM3MiwgIDE0MjEsIAotICAgICAxNDcwLCAgMTUxOSwgIDE1NjgsICAxNjE3LCAgMTY2NiwgIDE3MTUsICAxNzY0LCAgMTcxNSwgIDE3NjQsICAxODEzLCAKLSAgICAgMTcxNSwgIDE3MTUsICAxNzY0LCAgMTg2MiwgIDE5MTEsICAxOTYwLCAgMjAwOSwgIDIwNTgsICAyMTA3LCAgMjE1NiwgCi0gICAgIDE3MTUsICAxNzY0LCAgMjIwNSwgIDIyNTQsICAyMzAzLCAgMTcxNSwgIDIzNTIsICAyMzUyLCAgMjQwMSwgIDI0NTAsIAotICAgICAyNDk5LCAgMjIwNSwgIDE3MTUsICAyNTQ4LCAgMjU5NywgIDE3MTUsICAyNjQ2LCAgMjY5NSwgIDI3NDQsICAyNzkzLCAKLSAgICAgMjg0MiwgIDI4OTEsICAxNzE1LCAgMjk0MCwgIDI5ODksICAzMDM4LCAgMzA4NywgIDE3MTUsICAzMTM2LCAgMzE4NSwgCi0gICAgIDMyMzQsICAzMjgzLCAgMzMzMiwgIDE3MTUsICAzMzgxLCAgMzQzMCwgIDM0NzksICAzNTI4LCAgMzU3NywgIDM2MjYsIAotICAgICAzNjc1LCAgMzcyNCwgIDM3MjQsICAzNzczLCAgMzgyMiwgIDM4NzEsICAzOTIwLCAgMzkyMCwgIDM5NjksICA0MDE4LCAKLSAgICAgNDA2NywgIDQxMTYsICA0MTE2LCAgNDE2NSwgIDQyMTQsICA0MjYzLCAgNDMxMiwgIDE3MTUsICA0MzYxLCAgNDM2MSwgCi0gICAgIDQ0MTAsICA0NDU5LCAgNDUwOCwgIDQ1NTcsICAxNzE1LCAgMTcxNSwgIDE3NjQsICAxNzE1LCAgMTcxNSwgIDQ2MDYsIAotICAgICA0NjU1LCAgNDcwNCwgIDQ3NTMsICA0ODAyLCAgNDg1MSwgIDQ5MDAsICA0OTQ5LCAgMTcxNSwgIDQ5OTgsICA1MDQ3LCAKLSAgICAgMTcxNSwgIDE3MTUsICAyMzUyLCAgNTA5NiwgIDI0NTAsICAxNzE1LCAgNTE0NSwgIDI0OTksICAyNTQ4LCAgMjY0NiwgCi0gICAgIDI2OTUsICA1MTk0LCAgMjc0NCwgIDE3MTUsICA1MjQzLCAgMjc5MywgIDE3MTUsICAzMTM2LCAgNTI5MiwgIDMyMzQsIAotICAgICAxNzE1LCAgNTM0MSwgIDMyODMsICA0NjA2LCAgNTM5MCwgIDU0MzksICA1NDg4LCAgMzUyOCwgIDE3MTUsICA1NTM3LCAKLSAgICAgNTU4NiwgIDM3MjQsICA1NjM1LCAgMzc3MywgIDE3MTUsICA1Njg0LCAgNTczMywgIDU3ODIsICA1NzgyLCAgNTgzMSwgCi0gICAgIDU4ODAsICAzODcxLCAgMzcyNCwgIDM5MjAsICA1OTI5LCAgMzk2OSwgIDE3MTUsICA1OTc4LCAgNDAxOCwgIDQwNjcsIAotICAgICAzOTIwLCAgNDExNiwgIDYwMjcsICA0MTY1LCAgMTcxNSwgIDYwNzYsICA2MTI1LCAgNjE3NCwgIDYxNzQsICA2MjIzLCAKLSAgICAgNjI3MiwgIDYzMjEsICA0MzYxLCAgNjM3MCwgIDQ0MTAsICAxNzE1LCAgNjQxOSwgIDY0NjgsICA2NTE3LCAgNjUxNywgCi0gICAgIDY1NjYsICA2NjE1LCAgNjY2NCwgIDY3MTMsICA2NzYyLCAgNjgxMSwgIDY4NjAsICAxNzE1LCAgNjkwOSwgIDY5NTgsIAotICAgICAxNzE1LCAgMTcxNSwgIDE3MTUsICAyMDA5LCAgNzAwNywgIDcwNTYsICA3MTA1LCAgNzE1NCwgIDcyMDMsICA3MjUyLCAKLSAgICAgNTY4NCwgIDczMDEsICA3MzAxLCAgNjA3NiwgIDczNTAsICA3MzUwLCAgNzM5OSwgIDY0MTksICA3NDQ4LCAgNzQ0OCwgCi0gICAgIDc0OTcsICAxNzE1LCAgNzU0NiwgIDc1OTUsICAxNzE1LCAgNzY0NCwgIDc2OTMsICA3NzQyLCAgNzc5MSwgIDc4NDAsIAotICAgICA3ODg5LCAgNzkzOCwgIDU4MzEsICA2MjIzLCAgNzk4NywgIDY1NjYsICA4MDM2LCAgODA4NSwgIDgxMzQsICA4MTgzLCAKLSAgICAgODIzMiwgIDgyODEsICA4MzMwLCAgODM3OSwgIDg0MjgsICA4NDc3LCAgODUyNiwgIDg1NzUsICA4NjI0LCAgODY3MywgCi0gICAgIDg3MjIsICAxNzE1LCAgMTcxNSwgIDg3NzEsICA4ODIwLCAgODg2OSwgIDg5MTgsICAxNzE1LCAgMTcxNSwgIDE3MTUsIAotICAgICA4OTY3LCAgOTAxNiwgIDkwNjUsICA5MTE0LCAgOTE2MywgIDE3MTUsICA0MjYzLCAgNDUwOAotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNDBcMVw0MVwxMFw0MFwxXDQyXDRcNDBcMVw0M1w0MVw0MFwxXDQ0IisKLSAgICAiXDFcNDVcNTdcNDRcMVw0NlwxXDQ3XDE2XDQ2XDFcNTBcMVw0NlwxXDUxIisKLSAgICAiXDM2XDQ2XDFcNTJcMVw1M1w1N1w1MlwxXDQ2XDFcNDdcNVw0NlwxXDU0IisKLSAgICAiXDEyXDQ2XDFcNTFcMzdcNDZcMVw0N1wyXDQ2XDFcNTVcMVw1NlwyXDQ2IisKLSAgICAiXDFcNTdcM1w0NlwxXDU2XDVcNDZcMVw1NlwyXDYwXDJcNTdcMVw0NiIrCi0gICAgIlwxMFw1N1wxXDYxXDJcNTdcMVw0Nlw1XDU3XDFcNDZcMlw1N1wxXDQ2IisKLSAgICAiXDNcNTdcMlw0NlwxXDQ3XDJcNDZcMVw1NVwxXDYyXDZcNDZcMVw2MiIrCi0gICAgIlw1XDQ2XDFcNjJcMzZcNDZcMVw2M1wxXDY0XDJcNjNcMVw2NVwxNVw2MyIrCi0gICAgIlwxXDUxXDM2XDYzXDFcNDZcMVw0N1wyXDQ2XDFcNjZcMVw1NlwyXDQ2IisKLSAgICAiXDFcNjdcM1w0NlwxXDU2XDVcNDZcMVw1Nlw0XDY3XDFcNDZcMTNcNjciKwotICAgICJcMVw0Nlw1XDY3XDFcNDZcMlw2N1wxXDQ2XDNcNjdcMlw0NlwxXDQ3IisKLSAgICAiXDJcNDZcMVw2NlwxXDU2XDJcNDZcMVw2N1wzXDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDRcNjdcMVw0NlwxM1w2N1wxXDcwXDVcNjdcMVw0NlwyXDY3IisKLSAgICAiXDFcNDZcM1w2N1wxXDQ2XDFcNzFcMVw0N1wxXDQ2XDFcNzJcMVw3MyIrCi0gICAgIlwxXDU2XDNcNzFcMVw3NFwxXDcxXDFcNzVcMVw1Nlw1XDcxXDFcNTYiKwotICAgICJcMzZcNzFcMVw0NlwxXDQ3XDJcNDZcMVw3NlwxNVw0NlwxXDUxXDM3XDQ2IisKLSAgICAiXDFcNDdcMVw3N1wxXDEwMFwxXDQ2XDFcNTZcMlw0NlwxXDEwMVwzXDQ2IisKLSAgICAiXDFcNTZcNVw0NlwxXDU2XDRcMTAxXDFcNDZcMTNcMTAxXDFcNDZcNVwxMDEiKwotICAgICJcMVw0NlwyXDEwMVwxXDQ2XDNcMTAxXDJcNDZcMVw0N1wxXDc3XDFcMTAwIisKLSAgICAiXDFcNDZcMVw1NlwyXDQ2XDFcMTAxXDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNFwxMDFcMVw0NlwxM1wxMDFcMVwxMDJcNVwxMDFcMVw0NlwyXDEwMVwxXDQ2IisKLSAgICAiXDNcMTAxXDFcNDZcMVwxMDNcMVw0N1wxXDc3XDFcMTA0XDFcMTAzXDFcNTYiKwotICAgICJcM1wxMDNcMVwxMDVcMVwxMDNcMVwxMDZcMVw1Nlw1XDEwM1wxXDU2XDM2XDEwMyIrCi0gICAgIlwxXDQ2XDFcNDdcM1w0NlwxXDU2XDZcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcMzZcNDZcMVwxMDdcMVwxMTBcMVwxMTFcMVwxMTJcNFwxMDdcMVwxMTNcMTJcMTA3IisKLSAgICAiXDRcMTE0XDFcMTA3XDEzXDExNFwxXDEwN1w1XDExNFwxXDEwN1wyXDExNFwxXDEwNyIrCi0gICAgIlwzXDExNFwxXDEwN1wxXDQ2XDFcMTEwXDFcMTExXDFcMTEyXDFcNDZcMVw1NiIrCi0gICAgIlwyXDQ2XDFcMTE1XDNcNDZcMVw1Nlw1XDQ2XDFcNTZcNFwxMTVcMVw0NiIrCi0gICAgIlwxM1wxMTVcMVw0Nlw1XDExNVwxXDQ2XDJcMTE1XDFcNDZcM1wxMTVcMlw0NiIrCi0gICAgIlwxXDExMFwxXDExMVwxXDExMlwxXDQ2XDFcNTZcMlw0NlwxXDExNVwzXDQ2IisKLSAgICAiXDFcNTZcNVw0NlwxXDU2XDRcMTE1XDFcNDZcMTNcMTE1XDFcMTE2XDVcMTE1IisKLSAgICAiXDFcNDZcMlwxMTVcMVw0NlwzXDExNVwxXDQ2XDFcMTE3XDFcMTEwXDFcMTExIisKLSAgICAiXDFcMTIwXDFcMTE3XDFcNTZcM1wxMTdcMVwxMjFcMVwxMTdcMVwxMjJcMVw1NiIrCi0gICAgIlw1XDExN1wxXDU2XDM2XDExN1wxXDQ2XDFcMTIzXDFcMTI0XDJcNDZcMVw1NiIrCi0gICAgIlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDZcNDZcMVwxMjVcMVwxMjZcMlw0NiIrCi0gICAgIlwxXDEyN1wxMVw0NlwxXDEyNlwxXDEyNVwxMVw0NlwxXDQ3XDFcMTI0XDJcNDYiKwotICAgICJcMVw1Nlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDRcNDZcMVwxMzBcMzJcNDYiKwotICAgICJcMVw0N1wxXDEyNFwyXDQ2XDFcNTZcMlw0NlwxXDEzMVwzXDQ2XDFcNTYiKwotICAgICJcNVw0NlwxXDU2XDRcMTMxXDFcMTMwXDEzXDEzMVwxXDQ2XDVcMTMxXDFcNDYiKwotICAgICJcMlwxMzFcMVw0NlwzXDEzMVwyXDQ2XDFcNDdcMVwxMjRcMlw0NlwxXDU2IisKLSAgICAiXDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNFw0NlwxXDEzMFw3XDQ2XDFcMTMyIisKLSAgICAiXDVcNDZcMVwxMzNcMTNcNDZcMVwxMzRcMVw0N1wxXDEyNFwxXDEzNVwxXDEzNCIrCi0gICAgIlwxXDU2XDNcMTM0XDFcMTM2XDFcMTM0XDFcMTM3XDFcNTZcNVwxMzRcMVw1NiIrCi0gICAgIlw0XDEzNFwxXDE0MFwzMVwxMzRcMVwxNDFcMVw0N1wxXDEyNFwxXDE0MlwxXDE0MSIrCi0gICAgIlwxXDU2XDNcMTQxXDFcMTQzXDFcMTQxXDFcMTQ0XDFcNTZcNVwxNDFcMVw1NiIrCi0gICAgIlw0XDE0MVwxXDE0NVwzMVwxNDFcMVwxNDZcMVw0N1wxXDEyNFwxXDE0N1wxXDE0NiIrCi0gICAgIlwxXDU2XDNcMTQ2XDFcMTUwXDFcMTQ2XDFcMTUxXDFcNTZcNVwxNDZcMVw1NiIrCi0gICAgIlwzNlwxNDZcMVwxNTJcMVwxNTNcMVwxNTRcNTZcMTUyXDFcMTU1XDFcNDdcMVwxMjQiKwotICAgICJcMVwxNTZcMVwxNTVcMVw1NlwzXDE1NVwxXDE1N1wxXDE1NVwxXDE2MFwxXDU2IisKLSAgICAiXDVcMTU1XDFcNTZcMzZcMTU1XDFcMTYxXDFcMTYyXDFcMTYzXDU2XDE2MVwxXDE2NCIrCi0gICAgIlwxXDE2NVw1N1wxNjRcMVw0MFwxXDBcMTBcNDBcMVwwXDRcNDBcMVwwIisKLSAgICAiXDQxXDQwXDNcMFwxXDE2NlwxXDE2N1wxNFwwXDFcMTcwXDQ0XDBcMVwxNzEiKwotICAgICJcMlwwXDFcMTcyXDNcMFwxXDE3MVw1XDBcMVwxNzFcNFwxNzJcMVwwIisKLSAgICAiXDEzXDE3MlwxXDBcNVwxNzJcMVwxNzNcMlwxNzJcMVwwXDNcMTcyXDZcMCIrCi0gICAgIlwxXDE3MVwyXDBcMVwxNzRcM1wwXDFcMTcxXDVcMFwxXDE3MVw0XDE3NCIrCi0gICAgIlwxXDBcMTNcMTc0XDFcMFw1XDE3NFwxXDBcMlwxNzRcMVwwXDNcMTc0IisKLSAgICAiXDEwM1wwXDFcMTc1XDU3XDBcMVwxNzZcNDdcMFwxXDE3N1w1M1wwXDFcMjAwIisKLSAgICAiXDYzXDBcMVw1Nlw2XDBcMVw1Nlw1XDBcMVw1Nlw0NFwwXDNcNTciKwotICAgICJcNFwwXDFcNTdcNVwwXDRcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDFcMjAxXDFcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDFcMjAyXDFcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDVcMFwxXDYyXDZcMFwxXDYyIisKLSAgICAiXDVcMFwxXDYyXDQwXDBcMVwyMDNcNjBcMFwxXDIwNFw2NFwwXDNcNjciKwotICAgICJcNFwwXDFcNjdcNVwwXDRcNjdcMVwwXDEzXDY3XDFcMFw1XDY3IisKLSAgICAiXDFcMFwyXDY3XDFcMFw0XDY3XDFcNzFcMlwwXDFcMjA1XDFcNzEiKwotICAgICJcMVwwXDNcNzFcMVwwXDFcNzFcMlwwXDVcNzFcMVwwXDM3XDcxIisKLSAgICAiXDFcMFwxXDIwNFwxXDIwNVwxXDcxXDFcMFwzXDcxXDFcMFwxXDcxIisKLSAgICAiXDJcMFw1XDcxXDFcMFwzNlw3MVwxXDc0XDFcMFwxXDIwNlwxXDIwNyIrCi0gICAgIlwxXDc0XDFcMjA2XDNcNzRcMVwyMTBcMVw3NFwyXDIwNlw1XDc0XDFcMjA2IisKLSAgICAiXDM2XDc0XDFcNzVcMVwwXDFcMjExXDFcMjEyXDFcNzVcMVwyMTFcM1w3NSIrCi0gICAgIlwxXDIxMVwxXDc1XDFcMjEwXDFcMjExXDVcNzVcMVwyMTFcMzZcNzVcMlwwIisKLSAgICAiXDFcNzdcMVwyMTNcNjNcMFwzXDEwMVw0XDBcMVwxMDFcNVwwXDRcMTAxIisKLSAgICAiXDFcMFwxM1wxMDFcMVwwXDVcMTAxXDFcMFwyXDEwMVwxXDBcNFwxMDEiKwotICAgICJcMVwxMDNcMlwwXDFcMjE0XDFcMTAzXDFcMFwzXDEwM1wxXDBcMVwxMDMiKwotICAgICJcMlwwXDVcMTAzXDFcMFwzN1wxMDNcMVwwXDFcNzdcMVwyMTVcMVwxMDMiKwotICAgICJcMVwwXDNcMTAzXDFcMFwxXDEwM1wyXDBcNVwxMDNcMVwwXDM2XDEwMyIrCi0gICAgIlwxXDEwNVwxXDBcMVwyMTZcMVwyMTdcMVwxMDVcMVwyMTZcM1wxMDVcMVwyMjAiKwotICAgICJcMVwxMDVcMlwyMTZcNVwxMDVcMVwyMTZcMzZcMTA1XDFcMTA2XDFcMFwxXDIyMSIrCi0gICAgIlwxXDIyMlwxXDEwNlwxXDIyMVwzXDEwNlwxXDIyMVwxXDEwNlwxXDIyMFwxXDIyMSIrCi0gICAgIlw1XDEwNlwxXDIyMVwzNlwxMDZcMVwxMDdcM1wwXDE3XDEwN1w0XDBcMVwxMDciKwotICAgICJcMTNcMFwxXDEwN1w1XDBcMVwxMDdcMlwwXDFcMTA3XDNcMFwxXDEwNyIrCi0gICAgIlwzXDBcMVwxNjZcMTVcMFwxXDE3MFw0MVwwXDFcMjIzXDU2XDBcMVwxMDciKwotICAgICJcM1wwXDJcMTA3XDNcMTEzXDRcMTA3XDFcMTEzXDVcMTA3XDRcMTE0XDFcMTA3IisKLSAgICAiXDEzXDExNFwxXDEwN1w1XDExNFwxXDEwN1wyXDExNFwxXDEwN1wzXDExNFwxXDExMyIrCi0gICAgIlw2XDBcM1wxMTRcNFwwXDFcMTE0XDVcMFw0XDExNFwxXDBcMTNcMTE0IisKLSAgICAiXDFcMFw1XDExNFwxXDBcMlwxMTRcMVwwXDRcMTE0XDZcMFwzXDExNSIrCi0gICAgIlw0XDBcMVwxMTVcNVwwXDRcMTE1XDFcMFwxM1wxMTVcMVwwXDVcMTE1IisKLSAgICAiXDFcMFwyXDExNVwxXDBcNFwxMTVcMVwxMTdcMlwwXDFcMjI0XDFcMTE3IisKLSAgICAiXDFcMFwzXDExN1wxXDBcMVwxMTdcMlwwXDVcMTE3XDFcMFwzN1wxMTciKwotICAgICJcMVwwXDFcMjIzXDFcMjI0XDFcMTE3XDFcMFwzXDExN1wxXDBcMVwxMTciKwotICAgICJcMlwwXDVcMTE3XDFcMFwzNlwxMTdcMVwxMjFcMVwwXDFcMjI1XDFcMjI2IisKLSAgICAiXDFcMTIxXDFcMjI1XDNcMTIxXDFcMjI3XDFcMTIxXDJcMjI1XDVcMTIxXDFcMjI1IisKLSAgICAiXDM2XDEyMVwxXDEyMlwxXDBcMVwyMzBcMVwyMzFcMVwxMjJcMVwyMzBcM1wxMjIiKwotICAgICJcMVwyMzBcMVwxMjJcMVwyMjdcMVwyMzBcNVwxMjJcMVwyMzBcMzZcMTIyXDNcMCIrCi0gICAgIlwxXDE2NlwxNVwwXDFcMjMyXDEwMFwwXDFcMjMzXDUyXDBcMVwyMzRcMTJcMCIrCi0gICAgIlwxXDIzNFw0MFwwXDFcMjM1XDMyXDBcMjBcMjM2XDFcMjM3XDQwXDIzNlw2XDAiKwotICAgICJcM1wxMzFcNFwwXDFcMTMxXDVcMFw0XDEzMVwxXDBcMTNcMTMxXDFcMCIrCi0gICAgIlw1XDEzMVwxXDBcMlwxMzFcMVwwXDRcMTMxXDQ0XDBcMVwyNDBcNjdcMCIrCi0gICAgIlwxXDI0MVw1XDBcMVwxMzRcMlwwXDFcMjQyXDFcMTM0XDFcMFwzXDEzNCIrCi0gICAgIlwxXDBcMVwxMzRcMlwwXDVcMTM0XDFcMFwzNlwxMzRcMVwxMzZcMVwwIisKLSAgICAiXDFcMjQzXDFcMjQ0XDFcMTM2XDFcMjQzXDNcMTM2XDFcMjQ1XDFcMTM2XDJcMjQzIisKLSAgICAiXDVcMTM2XDFcMjQzXDM2XDEzNlwxXDI0NlwxXDBcMVwyNDdcMVwyNTBcMVwyNTEiKwotICAgICJcMVwyNDdcM1wyNTFcMVwyNDdcMVwyNDZcMVwyNTJcMVwyNTNcM1wyNTFcMVwyNDYiKwotICAgICJcMVwyNTFcMVwyNTNcNFwyNTFcMVwyNDZcMjdcMjUxXDJcMjQ2XDFcMTQwXDJcMjM2IisKLSAgICAiXDFcMjU0XDFcMTQwXDFcMjM2XDNcMTQwXDFcMjM2XDFcMTQwXDJcMjM2XDNcMTQwIisKLSAgICAiXDFcMjU1XDFcMTQwXDFcMjM2XDM2XDE0MFwxXDE0MVwyXDBcMVwyNTZcMVwxNDEiKwotICAgICJcMVwwXDNcMTQxXDFcMFwxXDE0MVwyXDBcNVwxNDFcMVwwXDM2XDE0MSIrCi0gICAgIlwxXDE0M1wyXDI1N1wxXDI2MFwxXDE0M1wxXDI1N1wzXDE0M1wxXDI2MVwxXDE0MyIrCi0gICAgIlwyXDI1N1w1XDE0M1wxXDI1N1wzNlwxNDNcMVwxNDRcMlwyNjJcMVwyNjNcMVwxNDQiKwotICAgICJcMVwyNjJcM1wxNDRcMVwyNjJcMVwxNDRcMVwyNjFcMVwyNjJcNVwxNDRcMVwyNjIiKwotICAgICJcMzZcMTQ0XDFcMTQ1XDJcMjM2XDFcMjY0XDFcMTQ1XDFcMjM2XDNcMTQ1XDFcMjM2IisKLSAgICAiXDFcMTQ1XDJcMjM2XDNcMTQ1XDFcMjY1XDFcMTQ1XDFcMjM2XDM2XDE0NVwxXDE0NiIrCi0gICAgIlwyXDBcMVwyNjZcMVwxNDZcMVwwXDNcMTQ2XDFcMFwxXDE0NlwyXDAiKwotICAgICJcNVwxNDZcMVwwXDM2XDE0NlwxXDE1MFwxXDBcMVwyNjdcMVwyNzBcMVwxNTAiKwotICAgICJcMVwyNjdcM1wxNTBcMVwyNzFcMVwxNTBcMlwyNjdcNVwxNTBcMVwyNjdcMzZcMTUwIisKLSAgICAiXDFcMjcyXDFcMFwxXDI3M1wxXDI3NFwxXDI3NVwxXDI3M1wzXDI3NVwxXDI3MyIrCi0gICAgIlwxXDI3MlwxXDI3NlwxXDI3N1wzXDI3NVwxXDI3MlwxXDI3NVwxXDI3N1w0XDI3NSIrCi0gICAgIlwxXDI3MlwyN1wyNzVcMlwyNzJcMlwxNTJcMVwwXDYwXDE1MlwxXDBcMTZcMTUyIisKLSAgICAiXDFcMzAwXDM3XDE1MlwxXDE1NVwyXDBcMVwzMDFcMVwxNTVcMVwwXDNcMTU1IisKLSAgICAiXDFcMFwxXDE1NVwyXDBcNVwxNTVcMVwwXDM2XDE1NVwxXDE1N1wxXDAiKwotICAgICJcMVwzMDJcMVwzMDNcMVwxNTdcMVwzMDJcM1wxNTdcMVwzMDRcMVwxNTdcMlwzMDIiKwotICAgICJcNVwxNTdcMVwzMDJcMzZcMTU3XDFcMzA1XDFcMFwxXDMwNlwxXDMwN1wxXDMxMCIrCi0gICAgIlwxXDMwNlwzXDMxMFwxXDMwNlwxXDMwNVwxXDMxMVwxXDMxMlwzXDMxMFwxXDMwNSIrCi0gICAgIlwxXDMxMFwxXDMxMlw0XDMxMFwxXDMwNVwyN1wzMTBcMlwzMDVcMlwxNjFcMVwwIisKLSAgICAiXDYwXDE2MVwxXDBcMTZcMTYxXDFcMzEzXDM3XDE2MVw3XDBcMVwzMTRcMTdcMCIrCi0gICAgIlwxXDMxNVwzNlwwXDFcMTcxXDJcMFwxXDQwXDNcMFwxXDE3MVw1XDAiKwotICAgICJcMVwxNzFcNFw0MFwxXDBcMTNcNDBcMVwwXDVcNDBcMVwwXDJcNDAiKwotICAgICJcMVwwXDNcNDBcMVwwXDFcMzE2XDFcMFwzXDMxNlwxXDMxN1wzXDE3MiIrCi0gICAgIlwxXDMxNlwxXDBcMVwzMTZcMVwzMTdcMVwxNzJcMVwzMTZcMVwwXDJcMzE2IisKLSAgICAiXDFcMzE3XDRcMTcyXDFcMzE2XDEzXDE3MlwxXDMxNlw1XDE3MlwxXDMxNlwyXDE3MiIrCi0gICAgIlwxXDMyMFw0XDE3MlwxNVwwXDFcMzIxXDZcMFwxXDMyMlwzNFwwXDFcMzE2IisKLSAgICAiXDFcMFwzXDMxNlwxXDMxN1wzXDE3NFwxXDMxNlwxXDBcMVwzMTZcMVwzMTciKwotICAgICJcMVwxNzRcMVwzMTZcMVwwXDJcMzE2XDFcMzE3XDRcMTc0XDFcMzE2XDEzXDE3NCIrCi0gICAgIlwxXDMxNlw1XDE3NFwxXDMxNlwyXDE3NFwxXDMyM1w0XDE3NFwyN1wwXDFcMzE1IisKLSAgICAiXDMzXDBcMVwzMjRcNjBcMFwxXDMyNVw2NFwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDNcNTdcMVwzMjZcMVwwXDEzXDU3XDFcMFw1XDU3XDFcMCIrCi0gICAgIlwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw0XDU3XDFcMFwxM1w1N1wxXDBcMVw1N1wxXDMyN1wzXDU3XDFcMCIrCi0gICAgIlwyXDU3XDFcMFw0XDU3XDFcMjA2XDFcMFw3XDIwNlwxXDIxMFw0N1wyMDYiKwotICAgICJcMVwyMTFcMVwwXDExXDIxMVwxXDIxMFw0NVwyMTFcMVwyMTZcMVwwXDdcMjE2IisKLSAgICAiXDFcMjIwXDQ3XDIxNlwxXDIyMVwxXDBcMTFcMjIxXDFcMjIwXDQ1XDIyMVwxXDIyNSIrCi0gICAgIlwxXDBcN1wyMjVcMVwyMjdcNDdcMjI1XDFcMjMwXDFcMFwxMVwyMzBcMVwyMjciKwotICAgICJcNDVcMjMwXDMwXDBcMVwzMzBcMjVcMFwxXDMzMFwzNVwwXDFcMzMxXDEyXDAiKwotICAgICJcMVwzMzFcNDdcMFwxXDMzMlw2MlwwXDFcMzMzXDc2XDBcMVwzMzRcM1wwIisKLSAgICAiXDFcMjQzXDFcMFw3XDI0M1wxXDI0NVw0N1wyNDNcMVwyNDZcMVwwXDFcMjQ3IisKLSAgICAiXDFcMzM1XDFcMjQ2XDFcMjQ3XDNcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjQ1XDFcMjQ3IisKLSAgICAiXDVcMjQ2XDFcMjQ3XDM2XDI0NlwxXDI0N1wxXDBcMTFcMjQ3XDFcMjQ1XDQ1XDI0NyIrCi0gICAgIlwxXDI0NlwxXDBcMVwyNDdcMVwzMzVcMVwyNDZcMVwyNDdcM1wyNDZcMVwyNDciKwotICAgICJcMVwyNDZcMVwzMzZcMVwyNDdcNVwyNDZcMVwyNDdcMzZcMjQ2XDEzXDBcMVwzMzciKwotICAgICJcNDVcMFwxXDI0N1wxXDBcMTFcMjQ3XDFcMzM2XDQ1XDI0N1wxMVwyNTdcMVwyNjEiKwotICAgICJcNDdcMjU3XDEzXDI2MlwxXDI2MVw0NVwyNjJcMVwyNjdcMVwwXDdcMjY3XDFcMjcxIisKLSAgICAiXDQ3XDI2N1wxXDI3MlwxXDBcMVwyNzNcMVwzNDBcMVwyNzJcMVwyNzNcM1wyNzIiKwotICAgICJcMVwyNzNcMVwyNzJcMVwyNzFcMVwyNzNcNVwyNzJcMVwyNzNcMzZcMjcyXDFcMjczIisKLSAgICAiXDFcMFwxMVwyNzNcMVwyNzFcNDVcMjczXDFcMjcyXDFcMFwxXDI3M1wxXDM0MCIrCi0gICAgIlwxXDI3MlwxXDI3M1wzXDI3MlwxXDI3M1wxXDI3MlwxXDM0MVwxXDI3M1w1XDI3MiIrCi0gICAgIlwxXDI3M1wzNlwyNzJcMTNcMFwxXDM0Mlw0NVwwXDFcMjczXDFcMFwxMVwyNzMiKwotICAgICJcMVwzNDFcNDVcMjczXDJcMTUyXDFcMFwyNFwxNTJcMVwzNDNcMzFcMTUyXDFcMzAyIisKLSAgICAiXDFcMFw3XDMwMlwxXDMwNFw0N1wzMDJcMVwzMDVcMVwwXDFcMzA2XDFcMzQ0IisKLSAgICAiXDFcMzA1XDFcMzA2XDNcMzA1XDFcMzA2XDFcMzA1XDFcMzA0XDFcMzA2XDVcMzA1IisKLSAgICAiXDFcMzA2XDM2XDMwNVwxXDMwNlwxXDBcMTFcMzA2XDFcMzA0XDQ1XDMwNlwxXDMwNSIrCi0gICAgIlwxXDBcMVwzMDZcMVwzNDRcMVwzMDVcMVwzMDZcM1wzMDVcMVwzMDZcMVwzMDUiKwotICAgICJcMVwzNDVcMVwzMDZcNVwzMDVcMVwzMDZcMzZcMzA1XDEzXDBcMVwzNDZcNDVcMCIrCi0gICAgIlwxXDMwNlwxXDBcMTFcMzA2XDFcMzQ1XDQ1XDMwNlwyXDE2MVwxXDBcMjRcMTYxIisKLSAgICAiXDFcMzQ3XDMxXDE2MVw3XDBcMVwzNTBcMTAxXDBcMVwzNTFcMzBcMFwxXDMxNiIrCi0gICAgIlwxXDBcMTBcMzE2XDFcMFw0XDMxNlwxXDBcMzRcMzE2XDFcMFw1XDMxNiIrCi0gICAgIlwxXDBcM1wzMTZcMVwzMTdcNFwzMTZcMVwwXDFcMzE2XDFcMzE3XDJcMzE2IisKLSAgICAiXDFcMFwyXDMxNlwxXDMxN1wzMVwzMTZcMVwzNTJcNFwzMTZcMTVcMFwxXDMyMSIrCi0gICAgIlwzNlwwXDFcMzUzXDIxXDBcMVwzNTRcMTJcMFwzXDM1NFwyXDBcMVwzNTQiKwotICAgICJcMTFcMFwyXDM1NFwxXDBcMVwzNTRcMlwwXDJcMzU0XDEwXDBcM1w1NyIrCi0gICAgIlw0XDBcMVw1N1w1XDBcNFw1N1wxXDBcMTFcNTdcMVwzNTVcMVw1NyIrCi0gICAgIlwxXDBcNVw1N1wxXDBcMlw1N1wxXDBcNFw1N1wzM1wwXDFcMzU2IisKLSAgICAiXDEyXDBcMVwzNTZcNDBcMFwxXDM1N1w1N1wwXDFcMzYwXDY2XDBcMVwzNjEiKwotICAgICJcMTJcMFwxXDM2MVw0MFwwXDFcMzYyXDM1XDBcMlwzNjNcMVwwXDNcMzYzIisKLSAgICAiXDJcMFwxXDI1Mlw0XDM2M1wxXDBcNlwzNjNcMVwwXDI3XDM2M1w1XDAiKwotICAgICJcMlwzNjRcMVwwXDNcMzY0XDJcMFwxXDI3Nlw0XDM2NFwxXDBcNlwzNjQiKwotICAgICJcMVwwXDI3XDM2NFwyXDBcMlwxNTJcMVwwXDI1XDE1MlwxXDM2NVwzMFwxNTIiKwotICAgICJcM1wwXDJcMzY2XDFcMFwzXDM2NlwyXDBcMVwzMTFcNFwzNjZcMVwwIisKLSAgICAiXDZcMzY2XDFcMFwyN1wzNjZcMlwwXDJcMTYxXDFcMFwyNVwxNjFcMVwzNjciKwotICAgICJcMzBcMTYxXDMxXDBcMVwzNzBcMTAzXDBcMVwzNTJcMjFcMFwxXDM1NFwxMlwwIisKLSAgICAiXDNcMzU0XDJcMFwxXDM1NFwxMVwwXDJcMzU0XDFcMFwxXDM1NFwxXDAiKwotICAgICJcMVwzNTNcMlwzNTRcMTBcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3IisKLSAgICAiXDFcMFw2XDU3XDFcMzcxXDRcNTdcMVwwXDVcNTdcMVwwXDJcNTciKwotICAgICJcMVwwXDRcNTdcNDRcMFwxXDM3Mlw1NFwwXDFcMzczXDU1XDBcMVwzNzQiKwotICAgICJcNjBcMFwxXDM3NVw2M1wwXDFcMzc2XDIwXDBcMlwxNTJcMVwwXDI2XDE1MiIrCi0gICAgIlwxXDM3N1wyN1wxNTJcMlwxNjFcMVwwXDI2XDE2MVwxXHUwMTAwXDI3XDE2MVwzMlwwIisKLSAgICAiXDFcdTAxMDFcMzRcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcdTAxMDJcN1w1N1wxXDBcMlw1N1wxXHUwMTAyXDJcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDRcNTdcNDVcMFwxXHUwMTAzXDUyXDBcMVx1MDEwNFw2M1wwIisKLSAgICAiXDFcdTAxMDVcNDNcMFwxXHUwMTA2XDYzXDBcMVx1MDEwN1wyNVwwXDFcdTAxMDdcMlwwIisKLSAgICAiXDJcMTUyXDFcMFwyN1wxNTJcMVx1MDEwOFwyNlwxNTJcMlwxNjFcMVwwXDI3XDE2MSIrCi0gICAgIlwxXHUwMTA5XDI2XDE2MVwzM1wwXDFcdTAxMGFcMzJcMFwxXHUwMTBiXDNcNTdcM1wwIisKLSAgICAiXDFcdTAxMGJcMVw1N1w0XDBcMVx1MDEwYlw0XDU3XDFcMFwxM1w1N1wxXDAiKwotICAgICJcNVw1N1wxXDBcMlw1N1wxXDBcNFw1N1wzNVwwXDFcdTAxMGNcNTZcMCIrCi0gICAgIlwxXHUwMTBkXDEyXDBcMVx1MDEwZFw0NVwwXDFcdTAxMGVcMTJcMFwxXHUwMTBlXDEyXDAiKwotICAgICJcMlwxNTJcMVwwXDMwXDE1MlwxXHUwMTBmXDI1XDE1MlwyXDE2MVwxXDBcMzBcMTYxIisKLSAgICAiXDFcdTAxMTBcMjVcMTYxXDMyXDBcMVx1MDExMVwzM1wwXDFcdTAxMGJcNlwwXDFcdTAxMGIiKwotICAgICJcNVwwXDFcdTAxMGJcMzZcMFwyXDE1MlwxXDBcMjdcMTUyXDFcdTAxMTJcMjZcMTUyIisKLSAgICAiXDJcMTYxXDFcMFwyN1wxNjFcMVx1MDExM1wyNlwxNjFcMjdcMFwxXHUwMTE0XDMxXDAiKwotICAgICJcMlwxNTJcMVwwXDI0XDE1MlwxXHUwMTE1XDMxXDE1MlwyXDE2MVwxXDBcMjRcMTYxIisKLSAgICAiXDFcdTAxMTZcMzFcMTYxIjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICA5LCAgMSwgIDksICA5LCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAKLSAgICAgMSwgIDEsICA5LCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsIAotICAgICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDksIAotICAgICAwLCAgMCwgIDksICA5LCAgOSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAKLSAgICAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICA5LCAgMSwgIDEsICAwLCAgMSwgIDksICA5LCAgOSwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgOSwgIDEsICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCXJldHVybjsKLQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCX0KLQl9Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JfQotCXJldHVybiBCTE9DS19URVhUOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci19Ci1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0gKgotICogRXhhbXBsZTogCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0gKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLSAqCi0gKiBSZXR1cm5zOgotICoJQkxPQ0tfVEVYVDogMC00MAotICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0gKglYTUxfQ09OVEVOVDogNTAtNTcKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLX0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYW1lID0gdHJ1ZTsKLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQkKLQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMgKHl5X2N1cnJlbnRQb3MgaXMgdGhlICpsYXN0KiBjaGFyYWN0ZXIgd2UgY2FuIGNoZWNrIGFnYWluc3QpCi0JCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBBIGdlbmVyaWMgbG9va2FoZWFkLWxpa2Ugb3BlcmF0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tTY2FuKFN0cmluZyB0YXJnZXQsIFN0cmluZyB0YXJnZXRDb250ZXh0LCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZXR1cm4gZG9TY2FuKHRhcmdldCwgZmFsc2UsIHRhcmdldENvbnRleHQsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0gKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotICoKLSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotICovCi1wdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJc3RhcnQgPSB5eWNoYXI7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQlpZiAoeXlfYXRFT0YpIHsKLQkJCWZUb2tlbkNvdW50Kys7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQlpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCWVsc2UKLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JfQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JfQotCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JfQotCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJLy8gRU9GCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlmVG9rZW5Db3VudCsrOwotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsKLQlzdXBlcigpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQlyZXNldChpbiwgMCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kICoKLSAqCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0gKgotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JfQotCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0KLQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JeXlfcmVhZGVyID0gaW47Ci0KLQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JeXlfc3RhdGUgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JeXlfc3RhcnRSZWFkID0gMDsKLQotCS8qKiAKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkgKiBmcm9tIGlucHV0IAotCSAqLwotCXl5X2VuZFJlYWQgPSAwOwotCi0JLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JeXlsaW5lID0gMDsKLQotCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXl5Y2hhciA9IDA7Ci0KLQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JeXlfYXRFT0YgPSBmYWxzZTsKLQotCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotCS8qIHVzZXIgdmFyczogKi8KLQlmVG9rZW5Db3VudCA9IDA7Ci0gCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCWZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0KLQljb250ZXh0ID0gbnVsbDsKLQlzdGFydCA9IDA7Ci0JdGV4dExlbmd0aCA9IDA7Ci0JbGVuZ3RoID0gMDsKLX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnBhcnNlci5CbG9ja1Rva2VuaXplciNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgewotCQlYTUxUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgWE1MVG9rZW5pemVyKCk7Ci0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOwotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLS8qIHVzZXIgbWV0aG9kICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7Ci19Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFs5MjEyXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAzMjIwKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTM3MikgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3IKLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShjaGFyW10gbWFya2VyVGFnTmFtZSwgaW50IG9mZnNldCwgaW50IHRhZ25hbWVMZW5ndGgpIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBqKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgPT0gdGFnbmFtZUxlbmd0aCkgewotCQkJCWJvb2xlYW4gbWF0Y2hlc1NvRmFyID0gdHJ1ZTsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgewotCQkJCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpICE9IG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXRjaGVzU29GYXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqCi0JICogUmV0dXJuIEFMTCBvZiB0aGUgcmVnaW9ucyBzY2FubmFibGUgd2l0aGluIHRoZSByZW1haW5pbmcgdGV4dAotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlCi0JICovCi0JcHVibGljIGZpbmFsIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCXdoaWxlKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbmNlIHRoaXMgaXMgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBOT1QgdGhlIHJlY29tbWVuZGVkIAotCQkJLy8gd2F5IG9mIGdldHRpbmcgdG9rZW5zLCBtYW55IGVycm9ycyBhcmUgc2ltcGx5IGhpZGRlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcChTdHJpbmcgcykgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJKHl5bGVuZ3RoKCkgKyB5eWNoYXIpICsgIik6XCciICsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1V0aWxzLmVzY2FwZSh5eXRleHQoKSkgKyAiXCciKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgIC0gc2tlbGV0b24uc2VkICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLwotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKFN0cmluZyBtYXJrZXJUYWdOYW1lKSB7Ci0JSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2IKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgYm9vbGVhbiB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICBmb3IgKHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQ7IHl5X2N1cnJlbnRQb3MgPCB5eV9tYXJrZWRQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9jdXJyZW50UG9zKyspIHsKLSAgICAgICAgc3dpdGNoICh5eV9idWZmZXJbeXlfY3VycmVudFBvc10pIHsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHl5X2NvdW50ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHl5X2NvdW50ZWQpCi0gICAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV9jb3VudGVkKSB7Ci0gICAgICAgIGlmICggeXlfYWR2YW5jZSgpID09ICdcbicgKSB5eWxpbmUtLTsKLSAgICAgICAgaWYgKCAheXlfYXRFT0YgKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAxKSA+IDAgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA+IDAgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDI3NTogCi0gICAgICAgIGNhc2UgMjc2OiAKLSAgICAgICAgY2FzZSAyNzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ0RBVEEgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7Ci0JcmV0dXJuIFhNTF9DREFUQV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAyNzk6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjgxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyODI6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQzsKLSB9Ci0gICAgICAgIGNhc2UgMjgzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07Ci0gfQotICAgICAgICBjYXNlIDI4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU3OiAKLSAgICAgICAgY2FzZSAyNjY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMjg1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAyODY6IGJyZWFrOwotICAgICAgICBjYXNlIDIzMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOwotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAyODc6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDI4ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyODk6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfQ0RBVEFfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAyOTE6IGJyZWFrOwotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAyOTI6IGJyZWFrOwotICAgICAgICBjYXNlIDE1ODogCi0gICAgICAgIGNhc2UgMTcyOiAKLSAgICAgICAgY2FzZSAxODA6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsKLSB9Ci0gICAgICAgIGNhc2UgMjkzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gWE1MX0VNUFRZX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjk0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyOTU6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMDogCi0gICAgICAgICAgeyAKLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyOTc6IGJyZWFrOwotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9QSSk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk5OiBicmVhazsKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAwOiBicmVhazsKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgIGNhc2UgMTM1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMDE6IGJyZWFrOwotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAzOiBicmVhazsKLSAgICAgICAgY2FzZSA1MDogCi0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICBjYXNlIDUyOiAKLSAgICAgICAgICB7IAotCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQKLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7Ci0gfQotICAgICAgICBjYXNlIDMwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7Ci0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA1OiBicmVhazsKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgIGNhc2UgNDc6IAotICAgICAgICBjYXNlIDQ4OiAKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICBjYXNlIDEyOTogCi0gICAgICAgIGNhc2UgMjE0OiAKLSAgICAgICAgY2FzZSAyMzY6IAotICAgICAgICBjYXNlIDI0ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMDY6IGJyZWFrOwotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgMzA3OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA4OiBicmVhazsKLSAgICAgICAgY2FzZSAwOiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMTIxOiAKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgIGNhc2UgMjA2OiAKLSAgICAgICAgY2FzZSAyMzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMDk6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzEwOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgNzA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMxMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgY2FzZSAxOTE6IAotICAgICAgICBjYXNlIDIyNjogCi0gICAgICAgIGNhc2UgMjQ0OiAKLSAgICAgICAgY2FzZSAyNTQ6IAotICAgICAgICBjYXNlIDI2MzogCi0gICAgICAgIGNhc2UgMjcwOiAKLSAgICAgICAgY2FzZSAyNzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMxMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICBjYXNlIDIzMDogCi0gICAgICAgIGNhc2UgMjQ2OiAKLSAgICAgICAgY2FzZSAyNTU6IAotICAgICAgICBjYXNlIDI2NDogCi0gICAgICAgIGNhc2UgMjcxOiAKLSAgICAgICAgY2FzZSAyNzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzEzOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMxNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgY2FzZSA4NDogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgODk6IAotICAgICAgICBjYXNlIDkwOiAKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgIGNhc2UgMTA5OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJU3lzdGVtLm91dC5wcmludGxuKCIhISF1bmV4cGVjdGVkISEhOiBcIiIgKyB5eXRleHQoKSArICJcIjoiICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBVTkRFRklORUQ7Ci0gfQotICAgICAgICBjYXNlIDMxNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBibG9ja0NvbnRleHQgPSBkb0Jsb2NrU2NhbigiXV0+IiwgWE1MX0NEQVRBX1RFWFQsIFNUX0NEQVRBX0VORCk7Ly8kTk9OLU5MUy0xJAotCWlmKGJsb2NrQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkKLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOwotCXJldHVybiBibG9ja0NvbnRleHQ7Ci0gfQotICAgICAgICBjYXNlIDMxNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjY6IAotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgY2FzZSA2OTogCi0gICAgICAgIGNhc2UgMTQzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE5OiBicmVhazsKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmKGlzQmxvY2tNYXJrZXIoKSkgewotICAgICAgICAJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JfQotCWVsc2UKLSAgICAgICAgCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzg6IAotICAgICAgICBjYXNlIDgwOiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgMTUwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzI0OiBicmVhazsKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzI1OiBicmVhazsKLSAgICAgICAgY2FzZSA4ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQpOwotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMjY6IGJyZWFrOwotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSAxNjQ6IAotICAgICAgICBjYXNlIDE2NTogCi0gICAgICAgIGNhc2UgMTY4OiAKLSAgICAgICAgY2FzZSAxNjk6IAotICAgICAgICBjYXNlIDIyMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBwdWJsaWMgcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotIH0KLSAgICAgICAgY2FzZSAzMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDk2OiAKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgOTk6IAotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgIGNhc2UgMTc2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0gfQotICAgICAgICBjYXNlIDMyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAxOiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgY2FzZSAxODU6IAotICAgICAgICBjYXNlIDE4ODogCi0gICAgICAgIGNhc2UgMTg5OiAKLSAgICAgICAgY2FzZSAyMjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDEwODogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgY2FzZSAxMTE6IAotICAgICAgICBjYXNlIDE5NTogCi0gICAgICAgIGNhc2UgMTk2OiAKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICBjYXNlIDIwMDogCi0gICAgICAgIGNhc2UgMjI4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzMzOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTU6IAotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgICAgeyAKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JIH0KLSAgICAgICAgY2FzZSAzMzQ6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmpmbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YmNhODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKm5sc1hYWCovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5CbG9ja01hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5CbG9ja1Rva2VuaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5TdHJpbmdVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLlhNTFBhcnNlclJlZ2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsNCi0NCi0lJQ0KLQ0KLSV7DQotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsNCi0gDQotCS8vIHJlcXVpcmVkIGhvbGRlcnMgZm9yIHdoaXRlLXNwYWNlIGNvbXBhY3RpbmcNCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0ID0gMTsNCi0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsNCi0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsNCi0NCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQ0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOw0KLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsNCi0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsNCi0NCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzDQotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOw0KLQkNCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZA0KLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQ0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMNCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotCS8vIHJlcXVpcmVkIHRvIG5vdCBzZWVrIHRleHQgYmxvY2tzIG9uIGFuIGVuZCB0YWcNCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsNCi0NCi0JcHJpdmF0ZSBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gbmV3IFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkoKTsNCi0vKioNCi0gKiB1c2VyIG1ldGhvZCANCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsNCi0JaWYoY29udGFpbnNUYWdOYW1lKG1hcmtlci5nZXRUYWdOYW1lKCkpKQ0KLQkJcmV0dXJuOw0KLQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZCANCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsNCi0JZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QgDQotICovDQotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsNCi0JaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgew0KLQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKGJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0JCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkNCi0JCQkJYmxvY2tzLnJlbW92ZSgpOw0KLQkJfQ0KLQl9DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7DQotCXJldHVybiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmc7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGJvb2xlYW4gbmV3VmFsdWUpIHsNCi0JZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gbmV3VmFsdWU7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7DQotICAgICAgICByZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgew0KLQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsNCi0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOw0KLQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsNCi0JCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQ0KLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOw0KLQl9DQotCXJldHVybiB0cnVlOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCkgew0KLQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsNCi0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgew0KLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXJldHVybiBtYXJrZXIuZ2V0Q29udGV4dCgpOw0KLQl9DQotCXJldHVybiBCTE9DS19URVhUOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsNCi0JcmV0dXJuIGZCbG9ja01hcmtlcnM7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7DQotCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOw0KLX0NCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcigpIHsNCi0JcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsNCi19DQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsNCi0JaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpDQotCQlyZXR1cm4gZmFsc2U7DQotCXJldHVybiBjb250YWluc1RhZ05hbWUodGFnTmFtZSk7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kDQotICovDQotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsNCi0JYmVnaW5CbG9ja01hcmtlclNjYW4obmV3VGFnTmFtZSwgQkxPQ0tfVEVYVCk7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kDQotICoNCi0gKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQ0KLSAqIHN0YXJ0IG9mIGEgdGV4dCBibG9jayB3aXRoaW4gYSAibmV3VGFnTmFtZSIgdGFnLg0KLSAqDQotICogRXhhbXBsZTogDQotICoJVG9rZW5pemVyIHRva2VyID0gbmV3IFRva2VuaXplcigpOw0KLSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7DQotICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOw0KLSAqCXRva2VyLmJlZ2luQmxvY2tNYXJrZXJTY2FuKCJzY3JpcHQiLCBCTE9DS19URVhUKTsNCi0gKgl0b2tlci5nZXRSZWdpb25zKCk7IA0KLSAqDQotICogUmV0dXJuczoNCi0gKglCTE9DS19URVhUOiAwLTQwDQotICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDINCi0gKglYTUxfVEFHX05BTUU6IDQzLTQ4DQotICoJWE1MX1RBR19DTE9TRTogNDktNDkNCi0gKglYTUxfQ09OVEVOVDogNTAtNTcNCi0gKg0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7DQotCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOw0KLX0NCi0vKioNCi0gKiBNZXRob2QgZG9TY2FuLg0KLSAqIA0KLSAqIFJldHVybnMgYSBjb250ZXh0IHJlZ2lvbiBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdXB0byB0aGUgZW5kIG9mIGlucHV0IG9yDQotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcNCi0gKiANCi0gKiBAcGFyYW0gc2VhcmNoU3RyaW5nIC0gdGFyZ2V0IHN0cmluZyB0byBzZWFyY2ggZm9yIGV4LjogIi0tPiIsICI8L3RhZ25hbWUiDQotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicNCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgNCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aA0KLSAqIEBwYXJhbSBhYm9ydFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSBzZWFyY2hTdHJpbmcgd2FzIGZvdW5kIGltbWVkaWF0ZWx5DQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2Vzcw0KLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlib29sZWFuIHN0aWxsU2VhcmNoaW5nID0gdHJ1ZTsNCi0JLy8gRGlzYWJsZSBmdXJ0aGVyIGJsb2NrIChwcm9iYWJseSkNCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCWludCBzZWFyY2hTdHJpbmdMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoKCk7DQotCWludCBuID0gMDsNCi0JY2hhciBsYXN0Q2hlY2tDaGFyOw0KLQlpbnQgaTsNCi0JYm9vbGVhbiBzYW1lID0gZmFsc2U7DQotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgew0KLQkJbiA9IDA7DQotCQkvLyBFbnN1cmUgdGhhdCBlbm91Z2ggZGF0YSBmcm9tIHRoZSBpbnB1dCBleGlzdHMgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzZWFyY2ggU3RyaW5nLg0KLQkJbiA9IHl5X2FkdmFuY2UoKTsNCi0JCXdoaWxlKG4gIT0gWVlFT0YgJiYgeXlfY3VycmVudFBvcyA8IHNlYXJjaFN0cmluZ0xlbmd0aCkNCi0JCQluID0geXlfYWR2YW5jZSgpOw0KLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4NCi0JCWlmIChuID09IFlZRU9GKSB7DQotCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCXNhbWUgPSB0cnVlOw0KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kDQotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLg0KLQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyDQotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzDQotCQkJDQotCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3NlcyAoeXlfY3VycmVudFBvcyBpcyB0aGUgKmxhc3QqIGNoYXJhY3RlciB3ZSBjYW4gY2hlY2sgYWdhaW5zdCkNCi0JCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0JCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoOyBpKyspIHsNCi0JCQkJCWlmKHNhbWUgJiYgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQ0KLQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7DQotCQkJCQllbHNlIGlmKHNhbWUgJiYgIWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykNCi0JCQkJCQlzYW1lID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0pID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzZWFyY2hTdHJpbmcuY2hhckF0KGkpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkvLyBzYWZldHkgY2hlY2sgZmFpbGVkOyBubyBtYXRjaCBpcyBwb3NzaWJsZSByaWdodCBub3cNCi0JCQllbHNlIHsNCi0JCQkJc2FtZSA9IGZhbHNlOw0KLQkJCX0NCi0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gNCi0JCQkJLy8gIjwvc2NyaXB0UyINCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsNCi0JCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICINCi0JCQkJaWYobGFzdENoZWNrQ2hhciA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsYXN0Q2hlY2tDaGFyKSkNCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgew0KLQkJLy8gV2UndmUgc3RvcHBlZCBzaG9ydCBvZiB0aGUgZW5kIG9yIGRlZmluaXRlbHkgZm91bmQgYSBtYXRjaA0KLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsNCi0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJLy8gSWYgdGhlIHNlYXJjaFN0cmluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQ0KLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkNCi0JCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7DQotCQkJeXliZWdpbihpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsNCi0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJfQ0KLQl9DQotCWVsc2Ugew0KLQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0DQotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOw0KLQkJeXlfY3VycmVudFBvcysrOw0KLQl9DQotCXl5YmVnaW4oZXhpdFN0YXRlKTsNCi0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQ0KLQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQ0KLQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKQ0KLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsNCi0JcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kDQotICoNCi0gKiBBIGdlbmVyaWMgbG9va2FoZWFkLWxpa2Ugb3BlcmF0aW9uDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1NjYW4oU3RyaW5nIHRhcmdldCwgU3RyaW5nIHRhcmdldENvbnRleHQsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlyZXR1cm4gZG9TY2FuKHRhcmdldCwgZmFsc2UsIHRhcmdldENvbnRleHQsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZCANCi0gKiBkb2VzIGEgbG9va2FoZWFkIGZvciB0aGUgY3VycmVudCB0YWcgbmFtZQ0KLSAqLw0KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCk7DQotCXJldHVybiBkb1NjYW4oIjwvIiArIGZDdXJyZW50VGFnTmFtZSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSksIFlZSU5JVElBTCwgWVlJTklUSUFMKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKg0KLSAqIENvbnZlcnRzIHRoZSByYXcgY29udGV4dCBTdHJpbmcgcmV0dXJuZWQgYnkgdGhlIHByaW1HZXROZXh0VG9rZW4oKQ0KLSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlDQotICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0Lg0KLSAqDQotICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQ0KLSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuDQotICoNCi0gKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZA0KLSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLg0KLSAqLw0KLXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pDQotCWlmIChmU2hvdWxkTG9hZEJ1ZmZlcmVkKSB7DQotCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0JCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7DQotCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOw0KLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQl9DQotCWVsc2Ugew0KLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCWlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgew0KLQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpDQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJCWVsc2UNCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsNCi0JCX0NCi0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7DQotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsNCi0JCX0NCi0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOw0KLQkJfQ0KLQkJc3RhcnQgPSB5eWNoYXI7DQotCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCWlmICh5eV9hdEVPRikgew0KLQkJCWZUb2tlbkNvdW50Kys7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCX0NCi0JLy8gc3RvcmUgdGhlIG5leHQgdG9rZW4NCi0JZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQlpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgew0KLQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkNCi0JCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsNCi0JCWVsc2UNCi0JCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQl9DQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7DQotCX0NCi0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOw0KLQl9DQotCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7DQotCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsNCi0JaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsNCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7DQotCX0NCi0JaWYgKGNvbnRleHQgPT0gbnVsbCkgew0KLQkJLy8gRU9GDQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRpc2NvdmVyZWQgIiArIGZUb2tlbkNvdW50ICsgIiB0b2tlbnMuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQlmVG9rZW5Db3VudCsrOw0KLQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgWE1MVG9rZW5pemVyKCl7DQotCXN1cGVyKCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIFhNTFRva2VuaXplcihjaGFyW10gY2hhckFycmF5KXsNCi0JCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7DQotCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgew0KLQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIG5ld09mZnNldCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgew0KLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsNCi0JcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7DQotCXJlc2V0KGluLCAwKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QgKg0KLSAqDQotICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzDQotICogdGhhdCByZXNldHRpbmcgYSBwcmUtZXhpc3RpbmcgdG9rZW5pemVyIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4NCi0gKg0KLSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlDQotICogPGVtPmdlbmVyYXRlZDwvZW0+IG91dHB1dCBvZiB0aGlzIHNwZWNpZmljYXRpb24gYmVmb3JlIHRoaXMgbWV0aG9kIHdhcw0KLSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0Lg0KLSAqLw0KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCWZPZmZzZXQgPSBuZXdPZmZzZXQ7DQotDQotCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0JeXlfcmVhZGVyID0gaW47DQotDQotCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0JeXlfc3RhdGUgPSAwOw0KLQ0KLQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7DQotDQotCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0JdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOw0KLQ0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLQl5eV9tYXJrZWRQb3MgPSAwOw0KLQ0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLQl5eV9wdXNoYmFja1BvcyA9IDA7DQotDQotCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLQl5eV9jdXJyZW50UG9zID0gMDsNCi0NCi0JLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotCXl5X3N0YXJ0UmVhZCA9IDA7DQotDQotCS8qKiANCi0JICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotCSAqIGZyb20gaW5wdXQgDQotCSAqLw0KLQl5eV9lbmRSZWFkID0gMDsNCi0NCi0JLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCXl5bGluZSA9IDA7DQotDQotCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQl5eWNoYXIgPSAwOw0KLQ0KLQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotCXl5X2F0RU9GID0gZmFsc2U7DQotDQotCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLw0KLQl5eV9lb2ZfZG9uZSA9IGZhbHNlOw0KLQ0KLQ0KLQkvKiB1c2VyIHZhcnM6ICovDQotCWZUb2tlbkNvdW50ID0gMDsNCi0gDQotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCWZCdWZmZXJlZFN0YXJ0ID0gMTsNCi0JZkJ1ZmZlcmVkTGVuZ3RoID0gMDsNCi0JZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0NCi0JY29udGV4dCA9IG51bGw7DQotCXN0YXJ0ID0gMDsNCi0JdGV4dExlbmd0aCA9IDA7DQotCWxlbmd0aCA9IDA7DQotfQ0KLQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICogQHNlZSBjb20uaWJtLnNlZC5wYXJzZXIuQmxvY2tUb2tlbml6ZXIjbmV3SW5zdGFuY2UoKQ0KLQkgKi8NCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgew0KLQkJWE1MVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IFhNTFRva2VuaXplcigpOw0KLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCANCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQ0KLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsNCi0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7DQotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkNCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOw0KLQkJfQ0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOw0KLQl9DQotLyogdXNlciBtZXRob2QgKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMNCi0JLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gNCi0JLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dA0KLQkvLyAgY29udGV4dCBhcyB1c3VhbC4NCi0JcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsNCi19DQotJX0NCi0NCi0lZW9mew0KLS8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iDQotJWVvZn0NCi0NCi0lcHVibGljDQotJWNsYXNzIFhNTFRva2VuaXplcg0KLSVpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBYTUxSZWdpb25Db250ZXh0DQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSVsaW5lDQotJXVuaWNvZGUNCi0lcGFjaw0KLQ0KLSVzdGF0ZSBTVF9DREFUQV9URVhUDQotJXN0YXRlIFNUX0NEQVRBX0VORA0KLSVzdGF0ZSBTVF9YTUxfQ09NTUVOVA0KLSVzdGF0ZSBTVF9YTUxfQ09NTUVOVF9FTkQNCi0lc3RhdGUgU1RfUEkNCi0lc3RhdGUgU1RfUElfV1MNCi0lc3RhdGUgU1RfUElfQ09OVEVOVA0KLSVzdGF0ZSBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfWE1MX1BJX0VRVUFMUw0KLSVzdGF0ZSBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX1hNTF9QSV9UQUdfQ0xPU0UNCi0lc3RhdGUgU1RfREhUTUxfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfREhUTUxfRVFVQUxTDQotJXN0YXRlIFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9ESFRNTF9UQUdfQ0xPU0UNCi0NCi0vLyBub3JtYWwgdGFnIHN0YXRlcw0KLSVzdGF0ZSBTVF9YTUxfVEFHX05BTUUNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1hNTF9FUVVBTFMNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9WQUxVRQ0KLQ0KLS8vIGRlY2xhcmF0aW9uIChEVEQpIHN0YXRlcw0KLSVzdGF0ZSBTVF9YTUxfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFDQotDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQw0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0NCi0NCi0lc3RhdGUgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVA0KLQ0KLSVzdGF0ZSBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UDQotDQotJXN0YXRlIFNUX0JMT0NLX1RBR19TQ0FODQotDQotLy8gTGV0dGVyID0gKFtBLVphLXpdKQ0KLS8vIERpZ2l0ID0gKFswLTldKQ0KLQ0KLS8qKg0KLSAqIHNtYWxsZXIgdG9rZW5zDQotICovDQotZ2VuZXJpY1RhZ09wZW4gICAgICAgPSA8DQotZ2VuZXJpY1RhZ0Nsb3NlICAgICAgPSA+DQotZ2VuZXJpY0VuZFRhZ09wZW4gICAgPSA8XC8NCi1nZW5lcmljRW1wdHlUYWdDbG9zZSA9IFwvPg0KLQ0KLVBJc3RhcnQgPSA8XD8NCi1QSWVuZCAgID0gXD8+DQotDQotDQotLy8gWzFdIGRvY3VtZW50IDo6PSBwcm9sb2cgZWxlbWVudCBNaXNjKg0KLWRvY3VtZW50ID0gKHtwcm9sb2d9IHtlbGVtZW50fSB7TWlzY30qKQ0KLQ0KLS8vIFsyXSBDaGFyIDo6PSAjeDkgfCAjeEEgfCAjeEQgfCBbI3gyMC0jeEQ3RkZdIHwgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdDQotIC8vQ2hhciA9ICguKQ0KLUNoYXIgPSBbXHgwOVx4MEFceDBEXHgyMC1cdUQ3RkZcdUUwMDAtXHVGRkZEXSANCi0NCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKw0KLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0rDQotDQotLy8gWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyB8IENvbWJpbmluZ0NoYXIgfCBFeHRlbmRlcg0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IFwuIHwgXC0gfCBfIHwgOiB8IHtDb21iaW5pbmdDaGFyfSB8IHtFeHRlbmRlcn0pDQotDQotLy8gWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIE5hbWVDaGFyKg0KLS8vTmFtZSA9ICh7TmFtZUNoYXJ9e05hbWVDaGFyfSopDQotTmFtZSA9ICh7TGV0dGVyfSB8IF8gfCA6KXtOYW1lQ2hhcn0qDQotDQotLy8gWzZdIE5hbWVzIDo6PSB7TmFtZX0gKHtTfSB7TmFtZX0pKg0KLU5hbWVzID0gKHtOYW1lfSAoe1N9IHtOYW1lfSkqKQ0KLQ0KLS8vIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKw0KLU5tdG9rZW4gPSAoe05hbWVDaGFyfSspDQotDQotLy8gWzhdIE5tdG9rZW5zIDo6PSBObXRva2VuIChTIE5tdG9rZW4pKg0KLU5tdG9rZW5zID0gKHtObXRva2VufSAoe1N9IHtObXRva2VufSkqKQ0KLQ0KLS8vIFs5XSBFbnRpdHlWYWx1ZSA6Oj0gJyInIChbXiUmIl0gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICciJyB8ICAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciDQotRW50aXR5VmFsdWUgPSAoXCIgKFteJSZcIl0gfCB7UEVSZWZlcmVuY2V9IHwge1JlZmVyZW5jZX0pKiBcIiB8ICBcJyAoW14lJlwnXSB8IHtQRVJlZmVyZW5jZX0gfCB7UmVmZXJlbmNlfSkqIFwnKQ0KLQ0KLS8vIFsxMF0gQXR0VmFsdWUgOjo9ICciJyAoW148JiJdIHwgUmVmZXJlbmNlKSogJyInIHwgICInIiAoW148JiddIHwgUmVmZXJlbmNlKSogIiciDQotQXR0VmFsdWUgPSAoIFwiIChbXjxcIl0gfCB7UmVmZXJlbmNlfSkqIFwiIHwgXCcgKFtePFwnXSB8IHtSZWZlcmVuY2V9KSogXCcgIHwgKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkNCi0NCi0vLyBbMTFdIFN5c3RlbUxpdGVyYWwgOjo9ICgnIicgW14iXSogJyInKSB8ICgiJyIgW14nXSogIiciKSANCi1TeXN0ZW1MaXRlcmFsID0gKChcIiBbXlwiXSogXCIpIHwgKFwnIFteXCddKiBcJykpIA0KLQ0KLS8vIFsxMl0gUHViaWRMaXRlcmFsIDo6PSAnIicgUHViaWRDaGFyKiAnIicgfCAiJyIgKFB1YmlkQ2hhciAtICInIikqICInIg0KLVB1YmlkTGl0ZXJhbCA9IChcIiB7UHViaWRDaGFyfSogXCIgfCBcJyAoe1B1YmlkQ2hhcn1cJykqICInIikNCi0NCi0vLyBbMTNdIFB1YmlkQ2hhciA6Oj0gI3gyMCB8ICN4RCB8ICN4QSB8IFthLXpBLVowLTldIHwgWy0nKCkrLC4vOj0/OyEqI0AkXyVdDQotUHViaWRDaGFyID0gKFtcMDQwXDAxNVwwMTJdIHwgW2EtekEtWjAtOV0gfCBbXC1cJygpXCssLlwvOj0/OyFcKiNAXCRfJV0pDQotDQotLy8gWzE0XSBDaGFyRGF0YSA6Oj0gW148Jl0qIC0gKFtePCZdKiAnXV0+JyBbXjwmXSopDQotLy8gaW1wbGVtZW50IGxvb2thaGVhZCBiZWhhdmlvciBkdXJpbmcgYWN0aW9uIGRlZmluaXRpb24NCi1DaGFyRGF0YSA9IChbXjwmKFxdXF0+KV0qKQ0KLQ0KLS8vIFsxNV0gQ29tbWVudCA6Oj0gJzwhLS0nICgoQ2hhciAtICctJykgfCAoJy0nIChDaGFyIC0gJy0nKSkpKiAnLS0+Jw0KLUNvbW1lbnRTdGFydCA9ICg8IVwtXC0pDQotQ29tbWVudEVuZCAgID0gKFwtXC0+KQ0KLUNvbW1lbnQgPSAoe0NvbW1lbnRTdGFydH0uKntDb21tZW50RW5kfSkNCi0NCi0vLyBbMTZdIFBJIDo6PSAnPD8nIFBJVGFyZ2V0IChTIChDaGFyKiAtIChDaGFyKiAnPz4nIENoYXIqKSkpPyAnPz4nDQotUEkgPSAoPFw/e1BJVGFyZ2V0fSB7Q2hhcn0qIFw/PikNCi0NCi0vLyBbMTddIFBJVGFyZ2V0IDo6PSBOYW1lIC0gKCgnWCcgfCAneCcpICgnTScgfCAnbScpICgnTCcgfCAnbCcpKQ0KLVBJVGFyZ2V0ID0gKHtOYW1lfSgoWHx4KShNfG0pKEx8bCkpKQ0KLQ0KLS8vIFsxOF0gQ0RTZWN0IDo6PSBDRFN0YXJ0IENEYXRhIENERW5kDQotQ0RTZWN0ID0gKHtDRFN0YXJ0fXtDRGF0YX17Q0RFbmR9KQ0KLQ0KLS8vIFsxOV0gQ0RTdGFydCA6Oj0gJzwhW0NEQVRBWycNCi1DRFN0YXJ0ID0gPCFcW0NEQVRBXFsNCi0NCi0vLyBbMjBdIENEYXRhIDo6PSAoQ2hhciogLSAoQ2hhciogJ11dPicgQ2hhciopKSANCi0vLyBpbXBsZW1lbnQgbG9va2FoZWFkIGJlaGF2aW9yIGR1cmluZyBhY3Rpb24gZGVmaW5pdGlvbg0KLUNEYXRhID0gKFteKFxdXF0+KV0qKQ0KLQ0KLS8vIFsyMV0gQ0RFbmQgOjo9ICddXT4nDQotQ0RFbmQgPSAoXF1cXT4pDQotDQotLy8gWzIyXSBwcm9sb2cgOjo9IFhNTERlY2w/IE1pc2MqIChkb2N0eXBlZGVjbCBNaXNjKik/DQotcHJvbG9nID0gKHtYTUxEZWNsfT8ge01pc2N9KiAoe2RvY3R5cGVkZWNsfSB7TWlzY30qKT8pDQotDQotLy8gWzIzXSBYTUxEZWNsIDo6PSAnPD94bWwnIFZlcnNpb25JbmZvIEVuY29kaW5nRGVjbD8gU0REZWNsPyBTPyAnPz4nDQotWE1MRGVjbCA9ICg8XD94bWwge1ZlcnNpb25JbmZvfSB7RW5jb2RpbmdEZWNsfT8ge1NERGVjbH0/IHtTfT8gXD8+KQ0KLQ0KLS8vIFsyNF0gVmVyc2lvbkluZm8gOjo9IFMgJ3ZlcnNpb24nIEVxICgnIFZlcnNpb25OdW0gJyB8ICIgVmVyc2lvbk51bSAiKQ0KLVZlcnNpb25JbmZvID0gKHtTfXZlcnNpb257RXF9KFwne1ZlcnNpb25OdW19XCcgfCBcIntWZXJzaW9uTnVtfVwiKSkNCi0NCi0vLyBbMjVdIEVxIDo6PSBTPyAnPScgUz8NCi1FcSA9IChcPSkNCi0NCi0vLyBbMjZdIFZlcnNpb25OdW0gOjo9IChbYS16QS1aMC05Xy46XSB8ICctJykrDQotVmVyc2lvbk51bSA9ICgoW2EtekEtWjAtOV8uOl18XC0pKykNCi0NCi0vLyBbMjddIE1pc2MgOjo9IENvbW1lbnQgfCBQSSB8ICBTDQotTWlzYyA9ICh7Q29tbWVudH0gfCB7UEl9IHwge1N9KQ0KLQ0KLS8vIFsyOF0gZG9jdHlwZWRlY2wgOjo9ICc8IURPQ1RZUEUnIFMgTmFtZSAoUyBFeHRlcm5hbElEKT8gIFM/ICgnWycgKG1hcmt1cGRlY2wgfCBQRVJlZmVyZW5jZSB8IFMpKiAnXScgUz8pPyAnPicNCi1kb2N0eXBlZGVjbCA9ICg8XCFET0NUWVBFe1N9e05hbWV9ICh7U317RXh0ZXJuYWxJRH0pPyB7U30/IChcWyAoe21hcmt1cGRlY2x9fHtQRVJlZmVyZW5jZX18e1N9KSogXF17U30/KT8+KQ0KLQ0KLS8vIFsyOV0gbWFya3VwZGVjbCA6Oj0gZWxlbWVudGRlY2wgfCBBdHRsaXN0RGVjbCB8IEVudGl0eURlY2wgfCBOb3RhdGlvbkRlY2wgfCBQSSB8IENvbW1lbnQNCi1tYXJrdXBkZWNsID0gKHtlbGVtZW50ZGVjbH0gfCB7QXR0bGlzdERlY2x9IHwge0VudGl0eURlY2x9IHwge05vdGF0aW9uRGVjbH0gfCB7UEl9IHwge0NvbW1lbnR9KQ0KLQ0KLS8vIFszMF0gZXh0U3Vic2V0IDo6PSBUZXh0RGVjbD8gZXh0U3Vic2V0RGVjbA0KLWV4dFN1YnNldCA9ICh7VGV4dERlY2x9PyB7ZXh0U3Vic2V0RGVjbH0pDQotDQotLy8gWzMxXSBleHRTdWJzZXREZWNsIDo6PSAoIG1hcmt1cGRlY2wgfCBjb25kaXRpb25hbFNlY3QgfCBQRVJlZmVyZW5jZSB8IFMgKSoNCi1leHRTdWJzZXREZWNsID0gKCgge21hcmt1cGRlY2x9IHwge2NvbmRpdGlvbmFsU2VjdH0gfCB7UEVSZWZlcmVuY2V9IHwge1N9ICkqKQ0KLQ0KLS8vIFszMl0gIFNERGVjbCAgOjo9IFMgJ3N0YW5kYWxvbmUnIEVxICgoIiciICgneWVzJyB8ICdubycpICInIikgfCAoJyInICgneWVzJyB8ICdubycpICciJykpDQotU0REZWNsICA9ICh7U31zdGFuZGFsb25le0VxfXtTfSooKFwnKHllc3xubylcJyl8KFwiKHllc3xubylcIikpKQ0KLQ0KLS8vIFszM10gIExhbmd1YWdlSUQgIDo6PSBMYW5nY29kZSAoJy0nIFN1YmNvZGUpKg0KLUxhbmd1YWdlSUQgID0gKHtMYW5nY29kZX0oXC17U3ViY29kZX0pKikNCi0NCi0vLyBbMzRdICBMYW5nY29kZSA6Oj0gSVNPNjM5Q29kZSB8ICBJYW5hQ29kZSB8ICBVc2VyQ29kZQ0KLUxhbmdjb2RlID0gKHtJU082MzlDb2RlfSB8ICB7SWFuYUNvZGV9IHwgIHtVc2VyQ29kZX0pDQotDQotLy8gWzM1XSAgSVNPNjM5Q29kZSA6Oj0gKFthLXpdIHwgW0EtWl0pIChbYS16XSB8IFtBLVpdKQ0KLUlTTzYzOUNvZGUgPSAoKFthLXpdfFtBLVpdKShbYS16XXxbQS1aXSkpDQotDQotLy8gWzM2XSAgSWFuYUNvZGUgOjo9ICgnaScgfCAnSScpICctJyAoW2Etel0gfCBbQS1aXSkrDQotSWFuYUNvZGUgPSAoKGl8SSlcLShbYS16XXxbQS1aXSkrKQ0KLQ0KLS8vIFszN10gIFVzZXJDb2RlIDo6PSAoJ3gnIHwgJ1gnKSAnLScgKFthLXpdIHwgW0EtWl0pKw0KLVVzZXJDb2RlID0gKCh4fFgpXC0oW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzhdICBTdWJjb2RlIDo6PSAoW2Etel0gfCBbQS1aXSkrDQotU3ViY29kZSA9ICgoW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzldICBlbGVtZW50ICA6Oj0gRW1wdHlFbGVtVGFnIHwgU1RhZyBjb250ZW50IEVUYWcNCi1lbGVtZW50ICA9ICh7RW1wdHlFbGVtVGFnfSB8IHtTVGFnfSB7Y29udGVudH0ge0VUYWd9KQ0KLQ0KLS8vIFs0MF0gIFNUYWcgIDo6PSAnPCcgTmFtZSAoUyBBdHRyaWJ1dGUpKiBTPyAnPicNCi1TVGFnID0gKDx7TmFtZX0oe1N9e0F0dHJpYnV0ZX0pKntTfT8+KQ0KLQ0KLS8vIFs0MV0gIEF0dHJpYnV0ZSA6Oj0gTmFtZSBFcSBBdHRWYWx1ZQ0KLUF0dHJpYnV0ZSA9ICh7TmFtZX17U30qe0VxfXtTfSp7QXR0VmFsdWV9KQ0KLQ0KLS8vIFs0Ml0gIEVUYWcgIDo6PSAnTmFtZSBTPyAnPicNCi1FVGFnID0gKDxcL3tOYW1lfXtTfT8+KQ0KLQ0KLS8vIFs0M10gIGNvbnRlbnQgIDo6PSAoZWxlbWVudCB8IENoYXJEYXRhIHwgUmVmZXJlbmNlIHwgQ0RTZWN0IHwgUEkgfCBDb21tZW50KSoNCi1jb250ZW50ID0gKCh7ZWxlbWVudH0gfCB7Q2hhckRhdGF9IHwge1JlZmVyZW5jZX0gfCB7Q0RTZWN0fSB8IHtQSX0gfCB7Q29tbWVudH0pKikNCi0NCi0vLyBbNDRdICBFbXB0eUVsZW1UYWcgIDo6PSAnPCcgTmFtZSAoUyBBdHRyaWJ1dGUpKiBTPyAnLz4nDQotRW1wdHlFbGVtVGFnID0gKDx7TmFtZX0oe1N9e0F0dHJpYnV0ZX0pKntTfT9cLz4pDQotDQotLy8gWzQ1XSBlbGVtZW50ZGVjbCA6Oj0gJzwhRUxFTUVOVCcgUyBOYW1lIFMgY29udGVudHNwZWMgUz8gJz4nDQotZWxlbWVudGRlY2wgPSAoPFwhRUxFTUVOVHtTfXtOYW1lfXtTfXtjb250ZW50c3BlY317U30/PikNCi0NCi0vLyBbNDZdIGNvbnRlbnRzcGVjIDo6PSAnRU1QVFknIHwgJ0FOWScgfCBNaXhlZCB8IGNoaWxkcmVuDQotY29udGVudHNwZWMgPSAoRU1QVFl8QU5ZfHtNaXhlZH18e2NoaWxkcmVufSkNCi0NCi0vLyBbNDddIGNoaWxkcmVuIDo6PSAoY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8NCi1jaGlsZHJlbiA9ICgoe2Nob2ljZX18e3NlcX0pKFw/fFwqfFwrKT8pDQotDQotLy8gQ0FVU0VTIExPT1AgVEhST1VHSCBERUZTIE9GIENIT0lDRSBBTkQgU0VRDQotLy8gWzQ4XSBjcCA6Oj0gKE5hbWUgfCBjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPw0KLWNwID0gKCh7TmFtZX0gfCB7Y2hvaWNlfSB8IHtzZXF9KSAoXD98XCp8XCspPykNCi0NCi0vLyBbNDldIGNob2ljZSA6Oj0gJygnIFM/IGNwICggUz8gJ3wnIFM/IGNwICkqIFM/ICcpJw0KLS8vIGNob2ljZSA9IFwoe1N9P3tjcH0oe1N9P1x8e1N9P3tjcH0pKntTfT9cKQ0KLWNob2ljZSA9IFwoe1N9P3tOYW1lfSh7U30/XHx7U30/e05hbWV9KSp7U30/XCkNCi0NCi0vLyBbNTBdIHNlcSA6Oj0gJygnIFM/IGNwICggUz8gJywnIFM/IGNwICkqIFM/ICcpJw0KLS8vIHNlcSA9IChcKHtTfT97Y3B9KHtTfT9cLHtTfT97Y3B9KSp7U30/XCkpDQotc2VxID0gKFwoe1N9P3tOYW1lfSh7U30/XCx7U30/e05hbWV9KSp7U30/XCkpDQotDQotLy8gWzUxXSBNaXhlZCA6Oj0gJygnIFM/ICcjUENEQVRBJyAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAgJykqJyB8ICcoJyBTPyAnI1BDREFUQScgUz8gJyknDQotTWl4ZWQgPSAoe1N9P1wjUENEQVRBKHtTfT9cfHtTfT97TmFtZX0pKntTfT8pKlx8KHtTfT9cI1BDREFUQXtTfT8pDQotDQotLy8gWzUyXSBBdHRsaXN0RGVjbCA6Oj0gJzwhQVRUTElTVCcgUyBOYW1lIEF0dERlZiogUz8gJz4nDQotQXR0bGlzdERlY2wgPSAoPFwhQVRUTElTVHtTfXtOYW1lfXtBdHREZWZ9KntTfT8+KQ0KLQ0KLS8vIFs1M10gQXR0RGVmIDo6PSBTIE5hbWUgUyBBdHRUeXBlIFMgRGVmYXVsdERlY2wNCi1BdHREZWYgPSAoe1N9e05hbWV9e1N9e0F0dFR5cGV9e1N9e0RlZmF1bHREZWNsfSkNCi0NCi0vLyBbNTRdIEF0dFR5cGUgOjo9IFN0cmluZ1R5cGUgfCBUb2tlbml6ZWRUeXBlIHwgRW51bWVyYXRlZFR5cGUgDQotQXR0VHlwZSA9ICh7U3RyaW5nVHlwZX0gfCB7VG9rZW5pemVkVHlwZX0gfCB7RW51bWVyYXRlZFR5cGV9KQ0KLQ0KLS8vIFs1NV0gU3RyaW5nVHlwZSA6Oj0gJ0NEQVRBJw0KLVN0cmluZ1R5cGUgPSAoQ0RBVEEpDQotDQotLy8gWzU2XSBUb2tlbml6ZWRUeXBlIDo6PSAnSUQnIHwgJ0lEUkVGJyB8ICdJRFJFRlMnIHwgJ0VOVElUWScgfCAnRU5USVRJRVMnIHwgJ05NVE9LRU4nIHwgJ05NVE9LRU5TJw0KLVRva2VuaXplZFR5cGUgPSAoSUR8SURSRUZ8SURSRUZTfEVOVElUWXxFTlRJVElFU3xOTVRPS0VOfE5NVE9LRU5TKQ0KLQ0KLS8vIFs1N10gRW51bWVyYXRlZFR5cGUgOjo9IE5vdGF0aW9uVHlwZSB8IEVudW1lcmF0aW9uIA0KLUVudW1lcmF0ZWRUeXBlID0gKHtOb3RhdGlvblR5cGV9IHwge0VudW1lcmF0aW9ufSkNCi0NCi0vLyBbNThdIE5vdGF0aW9uVHlwZSA6Oj0gJ05PVEFUSU9OJyBTICcoJyBTPyBOYW1lIChTPyAnfCcgUz8gTmFtZSkqIFM/ICcpJyANCi1Ob3RhdGlvblR5cGUgPSAoTk9UQVRJT057U31cKHtTfT97TmFtZX0oe1N9P1x8e1N9P3tOYW1lfSkqe1N9P1wpKQ0KLQ0KLS8vIFs1OV0gRW51bWVyYXRpb24gOjo9ICcoJyBTPyBObXRva2VuIChTPyAnfCcgUz8gIE5tdG9rZW4pKiBTPyAnKScNCi1FbnVtZXJhdGlvbiA9IChcKHtTfT97Tm10b2tlbn0oe1N9P1x8e1N9P3tObXRva2VufSkqe1N9P1wpKQ0KLQ0KLS8vIFs2MF0gRGVmYXVsdERlY2wgOjo9ICcjUkVRVUlSRUQnIHwgJyNJTVBMSUVEJyB8ICgoJyNGSVhFRCcgUyk/IEF0dFZhbHVlKQ0KLURlZmF1bHREZWNsID0gKFwjUkVRVUlSRUR8XCNJTVBMSUVEfCgoXCNGSVhFRHtTfSk/e0F0dFZhbHVlfSkpDQotDQotLy8gWzYxXSBjb25kaXRpb25hbFNlY3QgOjo9IGluY2x1ZGVTZWN0IHwgaWdub3JlU2VjdCANCi1jb25kaXRpb25hbFNlY3QgPSAoe2luY2x1ZGVTZWN0fSB8IHtpZ25vcmVTZWN0fSkNCi0NCi0vLyBbNjJdIGluY2x1ZGVTZWN0IDo6PSAnPCFbJyBTPyAnSU5DTFVERScgUz8gJ1snIGV4dFN1YnNldERlY2wgJ11dPicgDQotaW5jbHVkZVNlY3QgPSAoPFwhXFt7U30/SU5DTFVERXtTfT9cW3tleHRTdWJzZXREZWNsfVxdXF0+KQ0KLQ0KLS8vIFs2M10gaWdub3JlU2VjdCA6Oj0gJzwhWycgUz8gJ0lHTk9SRScgUz8gJ1snIGlnbm9yZVNlY3RDb250ZW50cyogJ11dPicNCi1pZ25vcmVTZWN0ID0gKDxcIVxbe1N9P0lHTk9SRXtTfT9cW3tpZ25vcmVTZWN0Q29udGVudHN9KlxdXF0+KQ0KLQ0KLS8vIFs2NF0gaWdub3JlU2VjdENvbnRlbnRzIDo6PSBJZ25vcmUgKCc8IVsnIGlnbm9yZVNlY3RDb250ZW50cyAnXV0+JyBJZ25vcmUpKg0KLWlnbm9yZVNlY3RDb250ZW50cyA9ICh7SWdub3JlfSg8XCFcW3tpZ25vcmVTZWN0Q29udGVudHN9XF1cXT57SWdub3JlfSkqKQ0KLQ0KLS8vIFs2NV0gSWdub3JlIDo6PSBDaGFyKiAtIChDaGFyKiAoJzwhWycgfCAnXV0+JykgQ2hhciopDQotSWdub3JlID0gIChbXihcPFwhXFt8XF1cXVw+KV0qKQ0KLQ0KLS8vIFs2Nl0gQ2hhclJlZiA6Oj0gJyYjJyBbMC05XSsgJzsnIHwgJyYjeCcgWzAtOWEtZkEtRl0rICc7Jw0KLUNoYXJSZWYgPSAoJiNbMC05XSs7fCYjeFswLTlhLWZBLUZdKzspDQotDQotLy8gWzY3XSBSZWZlcmVuY2UgOjo9IEVudGl0eVJlZiB8IENoYXJSZWYNCi1SZWZlcmVuY2UgPSAoe0VudGl0eVJlZn0gfCB7Q2hhclJlZn0pDQotDQotLy8gWzY4XSBFbnRpdHlSZWYgPSAnJicgTmFtZSAnOycNCi1FbnRpdHlSZWYgPSAoJntOYW1lfTspDQotDQotLy8gWzY5XSBQRVJlZmVyZW5jZSA6Oj0gJyUnIE5hbWUgJzsnDQotUEVSZWZlcmVuY2UgPSAoJXtOYW1lfTspDQotDQotLy8gWzcwXSBFbnRpdHlEZWNsIDo6PSBHRURlY2wgfCBQRURlY2wNCi1FbnRpdHlEZWNsID0gKHtHRURlY2x9IHwge1BFRGVjbH0pDQotDQotLy8gWzcxXSBHRURlY2wgOjo9ICc8IUVOVElUWScgUyBOYW1lIFMgRW50aXR5RGVmIFM/ICc+Jw0KLUdFRGVjbCA9ICg8XCFFTlRJVFl7U317TmFtZX17U317RW50aXR5RGVmfXtTfT8+KQ0KLQ0KLS8vIFs3Ml0gUEVEZWNsIDo6PSAnPCFFTlRJVFknIFMgJyUnIFMgTmFtZSBTIFBFRGVmIFM/ICc+Jw0KLVBFRGVjbCA9ICg8XCFFTlRJVFl7U31cJXtTfXtOYW1lfXtTfXtQRURlZn17U30/PikNCi0NCi0vLyBbNzNdIEVudGl0eURlZiA6Oj0gRW50aXR5VmFsdWUgfCAoRXh0ZXJuYWxJRCBORGF0YURlY2w/KQ0KLUVudGl0eURlZiA9ICh7RW50aXR5VmFsdWV9IHwgKHtFeHRlcm5hbElEfXtORGF0YURlY2x9PykpDQotDQotLy8gWzc0XSBQRURlZiA6Oj0gRW50aXR5VmFsdWUgfCBFeHRlcm5hbElEDQotUEVEZWYgPSAoe0VudGl0eVZhbHVlfSB8IHtFeHRlcm5hbElEfSkNCi0NCi0vLyBbNzVdIEV4dGVybmFsSUQgOjo9ICdTWVNURU0nIFMgU3lzdGVtTGl0ZXJhbCB8ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsIFMgU3lzdGVtTGl0ZXJhbCANCi1FeHRlcm5hbElEID0gKFNZU1RFTXtTfXtTeXN0ZW1MaXRlcmFsfXxQVUJMSUN7U317UHViaWRMaXRlcmFsfXtTfXtTeXN0ZW1MaXRlcmFsfSApDQotDQotLy8gWzc2XSBORGF0YURlY2wgOjo9IFMgJ05EQVRBJyBTIE5hbWUNCi1ORGF0YURlY2wgPSAoe1N9TkRBVEF7U317TmFtZX0pDQotDQotLy8gWzc3XSBUZXh0RGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbz8gRW5jb2RpbmdEZWNsIFM/ICc/PicNCi1UZXh0RGVjbCA9ICg8XD94bWx7VmVyc2lvbkluZm99P3tFbmNvZGluZ0RlY2x9e1N9P1w/PikNCi0NCi0vLyBbNzhdIGV4dFBhcnNlZEVudCA6Oj0gVGV4dERlY2w/IGNvbnRlbnQNCi1leHRQYXJzZWRFbnQgPSAoe1RleHREZWNsfT97Y29udGVudH0pDQotDQotLy8gWzc5XSBleHRQRSA6Oj0gVGV4dERlY2w/IGV4dFN1YnNldERlY2wNCi1leHRQRSA9ICh7VGV4dERlY2x9P3tleHRTdWJzZXREZWNsfSkNCi0NCi0vLyBbODBdIEVuY29kaW5nRGVjbCA6Oj0gUyAnZW5jb2RpbmcnIEVxICgnIicgRW5jTmFtZSAnIicgfCAgIiciIEVuY05hbWUgIiciICkgDQotRW5jb2RpbmdEZWNsID0gKHtTfWVuY29kaW5ne1N9KntFcX17U30qKFwie0VuY05hbWV9XCJ8XCd7RW5jTmFtZX1cJykpDQotDQotLy8gWzgxXSBFbmNOYW1lIDo6PSBbQS1aYS16XSAoW0EtWmEtejAtOS5fXSB8ICctJykqDQotRW5jTmFtZSA9IChbQS1aYS16XShbQS1aYS16MC05Ll9dfFwtKSopDQotDQotLy8gWzgyXSBOb3RhdGlvbkRlY2wgOjo9ICc8IU5PVEFUSU9OJyBTIE5hbWUgUyAoRXh0ZXJuYWxJRCB8ICBQdWJsaWNJRCkgUz8gJz4nDQotTm90YXRpb25EZWNsID0gKDxcIU5PVEFUSU9Oe1N9e05hbWV9e1N9KHtFeHRlcm5hbElEfXx7UHVibGljSUR9KXtTfT8+KQ0KLQ0KLS8vIFs4M10gUHVibGljSUQgOjo9ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsDQotUHVibGljSUQgPSAoUFVCTElDe1N9e1B1YmlkTGl0ZXJhbH0pDQotDQotLy8gWzg0XSAgTGV0dGVyIDo6PSBCYXNlQ2hhciB8IElkZW9ncmFwaGljDQotTGV0dGVyID0gKHtCYXNlQ2hhcn0gfCB7SWRlb2dyYXBoaWN9KQ0KLQ0KLS8vIFs4NV0gIEJhc2VDaGFyIDo6PSBbI3gwMDQxLSN4MDA1QV0gfCBbI3gwMDYxLSN4MDA3QV0gfCBbI3gwMEMwLSN4MDBENl0NCi0vLyB8IFsjeDAwRDgtI3gwMEY2XSB8IFsjeDAwRjgtI3gwMEZGXSB8IFsjeDAxMDAtI3gwMTMxXQ0KLS8vIHwgWyN4MDEzNC0jeDAxM0VdIHwgWyN4MDE0MS0jeDAxNDhdIHwgWyN4MDE0QS0jeDAxN0VdDQotLy8gfCBbI3gwMTgwLSN4MDFDM10gfCBbI3gwMUNELSN4MDFGMF0gfCBbI3gwMUY0LSN4MDFGNV0NCi0vLyB8IFsjeDAxRkEtI3gwMjE3XSB8IFsjeDAyNTAtI3gwMkE4XSB8IFsjeDAyQkItI3gwMkMxXSB8ICN4MDM4Ng0KLS8vIHwgWyN4MDM4OC0jeDAzOEFdIHwgI3gwMzhDIHwgWyN4MDM4RS0jeDAzQTFdIHwgWyN4MDNBMy0jeDAzQ0VdDQotLy8gfCBbI3gwM0QwLSN4MDNENl0gfCAjeDAzREEgfCAjeDAzREMgfCAjeDAzREUgfCAjeDAzRTANCi0vLyB8IFsjeDAzRTItI3gwM0YzXSB8IFsjeDA0MDEtI3gwNDBDXSB8IFsjeDA0MEUtI3gwNDRGXQ0KLS8vIHwgWyN4MDQ1MS0jeDA0NUNdIHwgWyN4MDQ1RS0jeDA0ODFdIHwgWyN4MDQ5MC0jeDA0QzRdDQotLy8gfCBbI3gwNEM3LSN4MDRDOF0gfCBbI3gwNENCLSN4MDRDQ10gfCBbI3gwNEQwLSN4MDRFQl0NCi0vLyB8IFsjeDA0RUUtI3gwNEY1XSB8IFsjeDA0RjgtI3gwNEY5XSB8IFsjeDA1MzEtI3gwNTU2XSB8ICN4MDU1OQ0KLS8vIHwgWyN4MDU2MS0jeDA1ODZdIHwgWyN4MDVEMC0jeDA1RUFdIHwgWyN4MDVGMC0jeDA1RjJdDQotLy8gfCBbI3gwNjIxLSN4MDYzQV0gfCBbI3gwNjQxLSN4MDY0QV0gfCBbI3gwNjcxLSN4MDZCN10NCi0vLyB8IFsjeDA2QkEtI3gwNkJFXSB8IFsjeDA2QzAtI3gwNkNFXSB8IFsjeDA2RDAtI3gwNkQzXSB8ICN4MDZENQ0KLS8vIHwgWyN4MDZFNS0jeDA2RTZdIHwgWyN4MDkwNS0jeDA5MzldIHwgI3gwOTNEIHwgWyN4MDk1OC0jeDA5NjFdDQotLy8gfCBbI3gwOTg1LSN4MDk4Q10gfCBbI3gwOThGLSN4MDk5MF0gfCBbI3gwOTkzLSN4MDlBOF0NCi0vLyB8IFsjeDA5QUEtI3gwOUIwXSB8ICN4MDlCMiB8IFsjeDA5QjYtI3gwOUI5XSB8IFsjeDA5REMtI3gwOUREXQ0KLS8vIHwgWyN4MDlERi0jeDA5RTFdIHwgWyN4MDlGMC0jeDA5RjFdIHwgWyN4MEEwNS0jeDBBMEFdDQotLy8gfCBbI3gwQTBGLSN4MEExMF0gfCBbI3gwQTEzLSN4MEEyOF0gfCBbI3gwQTJBLSN4MEEzMF0NCi0vLyB8IFsjeDBBMzItI3gwQTMzXSB8IFsjeDBBMzUtI3gwQTM2XSB8IFsjeDBBMzgtI3gwQTM5XQ0KLS8vIHwgWyN4MEE1OS0jeDBBNUNdIHwgI3gwQTVFIHwgWyN4MEE3Mi0jeDBBNzRdIHwgWyN4MEE4NS0jeDBBOEJdDQotLy8gfCAjeDBBOEQgfCBbI3gwQThGLSN4MEE5MV0gfCBbI3gwQTkzLSN4MEFBOF0gfCBbI3gwQUFBLSN4MEFCMF0NCi0vLyB8IFsjeDBBQjItI3gwQUIzXSB8IFsjeDBBQjUtI3gwQUI5XSB8ICN4MEFCRCB8ICN4MEFFMA0KLS8vIHwgWyN4MEIwNS0jeDBCMENdIHwgWyN4MEIwRi0jeDBCMTBdIHwgWyN4MEIxMy0jeDBCMjhdDQotLy8gfCBbI3gwQjJBLSN4MEIzMF0gfCBbI3gwQjMyLSN4MEIzM10gfCBbI3gwQjM2LSN4MEIzOV0gfCAjeDBCM0QNCi0vLyB8IFsjeDBCNUMtI3gwQjVEXSB8IFsjeDBCNUYtI3gwQjYxXSB8IFsjeDBCODUtI3gwQjhBXQ0KLS8vIHwgWyN4MEI4RS0jeDBCOTBdIHwgWyN4MEI5Mi0jeDBCOTVdIHwgWyN4MEI5OS0jeDBCOUFdIHwgI3gwQjlDDQotLy8gfCBbI3gwQjlFLSN4MEI5Rl0gfCBbI3gwQkEzLSN4MEJBNF0gfCBbI3gwQkE4LSN4MEJBQV0NCi0vLyB8IFsjeDBCQUUtI3gwQkI1XSB8IFsjeDBCQjctI3gwQkI5XSB8IFsjeDBDMDUtI3gwQzBDXQ0KLS8vIHwgWyN4MEMwRS0jeDBDMTBdIHwgWyN4MEMxMi0jeDBDMjhdIHwgWyN4MEMyQS0jeDBDMzNdDQotLy8gfCBbI3gwQzM1LSN4MEMzOV0gfCBbI3gwQzYwLSN4MEM2MV0gfCBbI3gwQzg1LSN4MEM4Q10NCi0vLyB8IFsjeDBDOEUtI3gwQzkwXSB8IFsjeDBDOTItI3gwQ0E4XSB8IFsjeDBDQUEtI3gwQ0IzXQ0KLS8vIHwgWyN4MENCNS0jeDBDQjldIHwgI3gwQ0RFIHwgWyN4MENFMC0jeDBDRTFdIHwgWyN4MEQwNS0jeDBEMENdDQotLy8gfCBbI3gwRDBFLSN4MEQxMF0gfCBbI3gwRDEyLSN4MEQyOF0gfCBbI3gwRDJBLSN4MEQzOV0NCi0vLyB8IFsjeDBENjAtI3gwRDYxXSB8IFsjeDBFMDEtI3gwRTJFXSB8ICN4MEUzMCB8IFsjeDBFMzItI3gwRTMzXQ0KLS8vIHwgWyN4MEU0MC0jeDBFNDVdIHwgWyN4MEU4MS0jeDBFODJdIHwgI3gwRTg0IHwgWyN4MEU4Ny0jeDBFODhdDQotLy8gfCAjeDBFOEEgfCAjeDBFOEQgfCBbI3gwRTk0LSN4MEU5N10gfCBbI3gwRTk5LSN4MEU5Rl0NCi0vLyB8IFsjeDBFQTEtI3gwRUEzXSB8ICN4MEVBNSB8ICN4MEVBNyB8IFsjeDBFQUEtI3gwRUFCXQ0KLS8vIHwgWyN4MEVBRC0jeDBFQUVdIHwgI3gwRUIwIHwgWyN4MEVCMi0jeDBFQjNdIHwgI3gwRUJEDQotLy8gfCBbI3gwRUMwLSN4MEVDNF0gfCBbI3gwRjQwLSN4MEY0N10gfCBbI3gwRjQ5LSN4MEY2OV0NCi0vLyB8IFsjeDEwQTAtI3gxMEM1XSB8IFsjeDEwRDAtI3gxMEY2XSB8ICN4MTEwMCB8IFsjeDExMDItI3gxMTAzXQ0KLS8vIHwgWyN4MTEwNS0jeDExMDddIHwgI3gxMTA5IHwgWyN4MTEwQi0jeDExMENdIHwgWyN4MTEwRS0jeDExMTJdDQotLy8gfCAjeDExM0MgfCAjeDExM0UgfCAjeDExNDAgfCAjeDExNEMgfCAjeDExNEUgfCAjeDExNTANCi0vLyB8IFsjeDExNTQtI3gxMTU1XSB8ICN4MTE1OSB8IFsjeDExNUYtI3gxMTYxXSB8ICN4MTE2MyB8ICN4MTE2NQ0KLS8vIHwgI3gxMTY3IHwgI3gxMTY5IHwgWyN4MTE2RC0jeDExNkVdIHwgWyN4MTE3Mi0jeDExNzNdIHwgI3gxMTc1DQotLy8gfCAjeDExOUUgfCAjeDExQTggfCAjeDExQUIgfCBbI3gxMUFFLSN4MTFBRl0gfCBbI3gxMUI3LSN4MTFCOF0NCi0vLyB8ICN4MTFCQSB8IFsjeDExQkMtI3gxMUMyXSB8ICN4MTFFQiB8ICN4MTFGMCB8ICN4MTFGOQ0KLS8vIHwgWyN4MUUwMC0jeDFFOUJdIHwgWyN4MUVBMC0jeDFFRjldIHwgWyN4MUYwMC0jeDFGMTVdDQotLy8gfCBbI3gxRjE4LSN4MUYxRF0gfCBbI3gxRjIwLSN4MUY0NV0gfCBbI3gxRjQ4LSN4MUY0RF0NCi0vLyB8IFsjeDFGNTAtI3gxRjU3XSB8ICN4MUY1OSB8ICN4MUY1QiB8ICN4MUY1RCB8IFsjeDFGNUYtI3gxRjdEXQ0KLS8vIHwgWyN4MUY4MC0jeDFGQjRdIHwgWyN4MUZCNi0jeDFGQkNdIHwgI3gxRkJFIHwgWyN4MUZDMi0jeDFGQzRdDQotLy8gfCBbI3gxRkM2LSN4MUZDQ10gfCBbI3gxRkQwLSN4MUZEM10gfCBbI3gxRkQ2LSN4MUZEQl0NCi0vLyB8IFsjeDFGRTAtI3gxRkVDXSB8IFsjeDFGRjItI3gxRkY0XSB8IFsjeDFGRjYtI3gxRkZDXSB8ICN4MjEyNg0KLS8vIHwgWyN4MjEyQS0jeDIxMkJdIHwgI3gyMTJFIHwgWyN4MjE4MC0jeDIxODJdIHwgWyN4MzA0MS0jeDMwOTRdDQotLy8gfCBbI3gzMEExLSN4MzBGQV0gfCBbI3gzMTA1LSN4MzEyQ10gfCBbI3hBQzAwLSN4RDdBM10NCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdDQotDQotLy8gWzg2XSAgSWRlb2dyYXBoaWMgOjo9IFsjeDRFMDAtI3g5RkE1XSB8ICN4MzAwNyB8IFsjeDMwMjEtI3gzMDI5XQ0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQ0KLQ0KLS8vIFs4N10gICAgICBDb21iaW5pbmdDaGFyICAgIDo6PSAgICBbI3gwMzAwLSN4MDM0NV0gICAgfCBbI3gwMzYwLSN4MDM2MV0NCi0vLyB8IFsjeDA0ODMtI3gwNDg2XSAgICAgICAgICB8IFsjeDA1OTEtI3gwNUExXSAgICAgICAgIHwgWyN4MDVBMy0jeDA1QjldDQotLy8gfCBbI3gwNUJCLSN4MDVCRF0gICAgICAgfCAjeDA1QkYgICAgICAgfCBbI3gwNUMxLSN4MDVDMl0JIHwgI3gwNUM0DQotLy8gfCBbI3gwNjRCLSN4MDY1Ml0gICAgfCAjeDA2NzAgICAgfCBbI3gwNkQ2LSN4MDZEQ10gICB8IFsjeDA2REQtI3gwNkRGXQ0KLS8vIHwgWyN4MDZFMC0jeDA2RTRdICAgICAgICAgIHwgWyN4MDZFNy0jeDA2RThdICAgICAgICAgfCBbI3gwNkVBLSN4MDZFRF0NCi0vLyB8IFsjeDA5MDEtI3gwOTAzXSAgICAgICB8ICN4MDkzQyAgICAgICB8IFsjeDA5M0UtI3gwOTRDXSAgICAgIHwgI3gwOTREDQotLy8gfCBbI3gwOTUxLSN4MDk1NF0gICAgfCBbI3gwOTYyLSN4MDk2M10gICAgfCBbI3gwOTgxLSN4MDk4M10gICB8ICN4MDlCQw0KLS8vIHwgI3gwOUJFICAgICAgIHwgI3gwOUJGICAgICAgIHwgWyN4MDlDMC0jeDA5QzRdICAgICAgfCBbI3gwOUM3LSN4MDlDOF0NCi0vLyB8IFsjeDA5Q0ItI3gwOUNEXSAgIHwgI3gwOUQ3ICAgfCBbI3gwOUUyLSN4MDlFM10gICB8ICN4MEEwMiAgIHwgI3gwQTNDDQotLy8gfCAjeDBBM0UgICAgICAgfCAjeDBBM0YgICAgICAgfCBbI3gwQTQwLSN4MEE0Ml0gICAgICB8IFsjeDBBNDctI3gwQTQ4XQ0KLS8vIHwgWyN4MEE0Qi0jeDBBNERdICAgIHwgWyN4MEE3MC0jeDBBNzFdICAgIHwgWyN4MEE4MS0jeDBBODNdICAgfCAjeDBBQkMNCi0vLyB8IFsjeDBBQkUtI3gwQUM1XSAgICAgICAgICB8IFsjeDBBQzctI3gwQUM5XSAgICAgICAgIHwgWyN4MEFDQi0jeDBBQ0RdDQotLy8gfCBbI3gwQjAxLSN4MEIwM10gICAgfCAjeDBCM0MgICAgfCBbI3gwQjNFLSN4MEI0M10gICB8IFsjeDBCNDctI3gwQjQ4XQ0KLS8vIHwgWyN4MEI0Qi0jeDBCNERdICAgICAgICAgIHwgWyN4MEI1Ni0jeDBCNTddICAgICAgICAgfCBbI3gwQjgyLSN4MEI4M10NCi0vLyB8IFsjeDBCQkUtI3gwQkMyXSAgICB8IFsjeDBCQzYtI3gwQkM4XSAgICB8IFsjeDBCQ0EtI3gwQkNEXSAgIHwgI3gwQkQ3DQotLy8gfCBbI3gwQzAxLSN4MEMwM10gICAgICAgICAgfCBbI3gwQzNFLSN4MEM0NF0gICAgICAgICB8IFsjeDBDNDYtI3gwQzQ4XQ0KLS8vIHwgWyN4MEM0QS0jeDBDNERdICAgICAgICAgIHwgWyN4MEM1NS0jeDBDNTZdICAgICAgICAgfCBbI3gwQzgyLSN4MEM4M10NCi0vLyB8IFsjeDBDQkUtI3gwQ0M0XSAgICAgICAgICB8IFsjeDBDQzYtI3gwQ0M4XSAgICAgICAgIHwgWyN4MENDQS0jeDBDQ0RdDQotLy8gfCBbI3gwQ0Q1LSN4MENENl0gICAgICAgICAgfCBbI3gwRDAyLSN4MEQwM10gICAgICAgICB8IFsjeDBEM0UtI3gwRDQzXQ0KLS8vIHwgWyN4MEQ0Ni0jeDBENDhdICAgICAgIHwgWyN4MEQ0QS0jeDBENERdICAgICAgIHwgI3gwRDU3ICAgICAgfCAjeDBFMzENCi0vLyB8IFsjeDBFMzQtI3gwRTNBXSAgICB8IFsjeDBFNDctI3gwRTRFXSAgICB8ICN4MEVCMSAgIHwgWyN4MEVCNC0jeDBFQjldDQotLy8gfCBbI3gwRUJCLSN4MEVCQ10gICAgfCBbI3gwRUM4LSN4MEVDRF0gICAgfCBbI3gwRjE4LSN4MEYxOV0gICB8ICN4MEYzNQ0KLS8vIHwgI3gwRjM3ICAgICAgfCAjeDBGMzkgICAgIHwgI3gwRjNFICAgICB8ICN4MEYzRiAgICAgfCBbI3gwRjcxLSN4MEY4NF0NCi0vLyB8IFsjeDBGODYtI3gwRjhCXSAgICB8IFsjeDBGOTAtI3gwRjk1XSAgICB8ICN4MEY5NyAgIHwgWyN4MEY5OS0jeDBGQURdDQotLy8gfCBbI3gwRkIxLSN4MEZCN10gICAgICAgfCAjeDBGQjkgICAgICAgfCBbI3gyMEQwLSN4MjBEQ10gICAgICB8ICN4MjBFMQ0KLS8vIHwgWyN4MzAyQS0jeDMwMkZdIHwgI3gzMDk5IHwgI3gzMDlBDQotQ29tYmluaW5nQ2hhciA9ICAgIFtcdTAzMDAtXHUwMzQ1XHUwMzYwLVx1MDM2MVx1MDQ4My1cdTA0ODZcdTA1OTEtXHUwNUExXHUwNUEzLVx1MDVCOVx1MDVCQi1cdTA1QkRcdTA1QkZcdTA1QzEtXHUwNUMyXHUwNUM0XHUwNjRCLVx1MDY1Mlx1MDY3MFx1MDZENi1cdTA2RENcdTA2REQtXHUwNkRGXHUwNkUwLVx1MDZFNFx1MDZFNy1cdTA2RThcdTA2RUEtXHUwNkVEXHUwOTAxLVx1MDkwM1x1MDkzQ1x1MDkzRS1cdTA5NENcdTA5NERcdTA5NTEtXHUwOTU0XHUwOTYyLVx1MDk2M1x1MDk4MS1cdTA5ODNcdTA5QkNcdTA5QkVcdTA5QkZcdTA5QzAtXHUwOUM0XHUwOUM3LVx1MDlDOFx1MDlDQi1cdTA5Q0RcdTA5RDdcdTA5RTItXHUwOUUzXHUwQTAyXHUwQTNDXHUwQTNFXHUwQTNGXHUwQTQwLVx1MEE0Mlx1MEE0Ny1cdTBBNDhcdTBBNEItXHUwQTREXHUwQTcwLVx1MEE3MVx1MEE4MS1cdTBBODNcdTBBQkNcdTBBQkUtXHUwQUM1XHUwQUM3LVx1MEFDOVx1MEFDQi1cdTBBQ0RcdTBCMDEtXHUwQjAzXHUwQjNDXHUwQjNFLVx1MEI0M1x1MEI0Ny1cdTBCNDhcdTBCNEItXHUwQjREXHUwQjU2LVx1MEI1N1x1MEI4Mi1cdTBCODNcdTBCQkUtXHUwQkMyXHUwQkM2LVx1MEJDOFx1MEJDQS1cdTBCQ0RcdTBCRDdcdTBDMDEtXHUwQzAzXHUwQzNFLVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1LVx1MEM1Nlx1MEM4Mi1cdTBDODNcdTBDQkUtXHUwQ0M0XHUwQ0M2LVx1MENDOFx1MENDQS1cdTBDQ0RcdTBDRDUtXHUwQ0Q2XHUwRDAyLVx1MEQwM1x1MEQzRS1cdTBENDNcdTBENDYtXHUwRDQ4XHUwRDRBLVx1MEQ0RFx1MEQ1N1x1MEUzMVx1MEUzNC1cdTBFM0FcdTBFNDctXHUwRTRFXHUwRUIxXHUwRUI0LVx1MEVCOVx1MEVCQi1cdTBFQkNcdTBFQzgtXHUwRUNEXHUwRjE4LVx1MEYxOVx1MEYzNVx1MEYzN1x1MEYzOVx1MEYzRVx1MEYzRlx1MEY3MS1cdTBGODRcdTBGODYtXHUwRjhCXHUwRjkwLVx1MEY5NVx1MEY5N1x1MEY5OS1cdTBGQURcdTBGQjEtXHUwRkI3XHUwRkI5XHUyMEQwLVx1MjBEQ1x1MjBFMVx1MzAyQS1cdTMwMkZcdTMwOTlcdTMwOUFdDQotDQotLy8gWzg4XSAgIERpZ2l0ICA6Oj0gIFsjeDAwMzAtI3gwMDM5XSB8IFsjeDA2NjAtI3gwNjY5XSB8IFsjeDA2RjAtI3gwNkY5XQ0KLS8vIHwgWyN4MDk2Ni0jeDA5NkZdICAgICAgICAgIHwgWyN4MDlFNi0jeDA5RUZdICAgICAgICAgfCBbI3gwQTY2LSN4MEE2Rl0NCi0vLyB8IFsjeDBBRTYtI3gwQUVGXSAgICAgICAgICB8IFsjeDBCNjYtI3gwQjZGXSAgICAgICAgIHwgWyN4MEJFNy0jeDBCRUZdDQotLy8gfCBbI3gwQzY2LSN4MEM2Rl0gICAgICAgICAgfCBbI3gwQ0U2LSN4MENFRl0gICAgICAgICB8IFsjeDBENjYtI3gwRDZGXQ0KLS8vIHwgWyN4MEU1MC0jeDBFNTldIHwgWyN4MEVEMC0jeDBFRDldIHwgWyN4MEYyMC0jeDBGMjldDQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0NCi0NCi0vLyBbODldICBFeHRlbmRlciA6Oj0gI3gwMEI3IHwgI3gwMkQwIHwgI3gwMkQxIHwgI3gwMzg3IHwgI3gwNjQwIHwgI3gwRTQ2DQotLy8gfCAjeDBFQzYgICAgICAgfCAjeDMwMDUgICAgICAgfCBbI3gzMDMxLSN4MzAzNV0gICAgICB8IFsjeDMwOUQtI3gzMDlFXQ0KLS8vIHwgWyN4MzBGQy0jeDMwRkVdDQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQ0KLQ0KLSUlDQotDQotDQotLyogd2hpdGUgc3BhY2Ugd2l0aGluIGEgdGFnICovDQotPFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfUEksIFNUX1hNTF9QSV9FUVVBTFMsIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UsIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCxTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSxTVF9ESFRNTF9FUVVBTFMsU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFLFNUX0RIVE1MX1RBR19DTE9TRT4ge1N9KiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkDQotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLQ0KLS8vIEJFR0lOIFJFR1VMQVIgWE1MDQotLyogaGFuZGxlIG9wZW5pbmcgYSBuZXcgdGFnIGFsbW9zdCBhbnl3aGVyZSAqLw0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfREVDTEFSQVRJT04sIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOw0KLX0NCi0NCi0vKiB1bnF1b3RlZCAqLw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9YTUxfREVDTEFSQVRJT04+IHtnZW5lcmljRW5kVGFnT3Blbn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9FTkRfVEFHX09QRU47DQotfQ0KLS8qIHRoZSB0YWcncyBuYW1lIHdhcyBmb3VuZCwgc3RhcnQgc2Nhbm5pbmcgZm9yIGF0dHJpYnV0ZXMgKi8NCi08U1RfWE1MX1RBR19OQU1FPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotLyogYW5vdGhlciBhdHRyaWJ1dGUgbmFtZSB3YXMgZm91bmQsIHJlc3VtZSBsb29raW5nIGZvciB0aGUgZXF1YWxzIHNpZ24gKi8NCi08U1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotLyogYW4gZXF1YWwgc2lnbiB3YXMgZm91bmQsIHdoYXQncyBuZXh0IGlzIHRoZSB2YWx1ZSAqLw0KLTxTVF9YTUxfRVFVQUxTPiB7RXF9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLS8qIGFsbG93IGZvciB1bmJhbGFuY2VkIHF1b3RlcywgbW9zdGx5IGEgZHVwbGljYXRlIG9mIHRoZSBBdHRWYWx1ZSBydWxlICovDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLQ0KLQ0KLS8qIHRoZSB0YWcncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmKGlzQmxvY2tNYXJrZXIoKSkgew0KLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQl9DQotCWVsc2UNCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsNCi19DQotLyogdGhlIHRhZydzIGNsb3NlIHdhcyBmb3VuZCwgYnV0IHRoZSB0YWcgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgZW5kIHRhZyAqLw0KLTxTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNFbXB0eVRhZ0Nsb3NlfSB7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7DQotfQ0KLQ0KLTxTVF9YTUxfVEFHX05BTUU+IFtePC8+XHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXHU0RTAwLVx1OUZBNVx1MzAwN1x1MzAyMS1cdTMwMjldKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9DT05URU5UOw0KLX0NCi0NCi0vLyBFTkQgUkVHVUxBUiBYTUwNCi0NCi0NCi0vLyBYTUwgQ29tbWVudHMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OPiB7Q29tbWVudFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsNCi0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47DQotfQ0KLTxTVF9YTUxfQ09NTUVOVD4gLnxccnxcbiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotfQ0KLQ0KLTxTVF9YTUxfQ09NTUVOVF9FTkQ+IHtDb21tZW50RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiY29tbWVudCBlbmQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOw0KLX0NCi0NCi0vLyBYTUwgbWlzYw0KLQ0KLXtDRFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47DQotfQ0KLTxTVF9DREFUQV9URVhUPiAufFxyfFxuIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJA0KLQlTdHJpbmcgYmxvY2tDb250ZXh0ID0gZG9CbG9ja1NjYW4oIl1dPiIsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQNCi0JaWYoYmxvY2tDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQ0KLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOw0KLQlyZXR1cm4gYmxvY2tDb250ZXh0Ow0KLX0NCi08U1RfQ0RBVEFfRU5EPiB7Q0RFbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UEVSZWZlcmVuY2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsNCi19DQotPFlZSU5JVElBTD4ge0NoYXJSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7DQotfQ0KLTxZWUlOSVRJQUw+IHtFbnRpdHlSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UElzdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9QSSk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47DQotfQ0KLS8vIHRoZSBuZXh0IHRocmVlIGFyZSBvcmRlciBkZXBlbmRlbnQNCi08U1RfUEk+ICgoWHx4KShNfG0pKEx8bCkpIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUEk+IChbaUldW21NXVtwUF1bb09dW3JSXVt0VF17U30qKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotPFNUX1BJX1dTPiB7U30rIHsNCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7DQotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLTxTVF9QSSwgU1RfUElfV1M+IFw/PiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi08U1RfUElfQ09OVEVOVD4gLiB7DQotCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQNCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOw0KLX0NCi08U1RfUElfQ09OVEVOVCxTVF9YTUxfUElfVEFHX0NMT1NFPiBcPz4gew0KLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQ0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX1hNTF9QSV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotLyogdGhlIFBJJ3MgY2xvc2Ugd2FzIGZvdW5kICovDQotPFNUX1hNTF9QSV9FUVVBTFMsIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRT4ge1BJZW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotLy8gREhUTUwNCi08U1RfREhUTUxfQVRUUklCVVRFX05BTUUsIFNUX0RIVE1MX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotfQ0KLTxTVF9ESFRNTF9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIFRoZSBESFRNTCBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9ESFRNTF9FUVVBTFMsIFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IFsvXSo+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBkZWNsYXJhdGlvbnMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSEgew0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRWVdW0xsXVtFZV1bTW1dW0VlXVtObl1bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRGRdW09vXVtDY11bVHRdW1l5XVtQcF1bRWVdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbQWFdW1R0XVtUdF1bTGxdW0lpXVtTc11bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOw0KLX0NCi0NCi0vLyBiZWdpbiBET0NUWVBFIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0U+IFxbW15cXV0qXF0gew0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOw0KLX0NCi0NCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1BwXVtVdV1bQmJdW0xsXVtJaV1bQ2NdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1NzXVtZeV1bU3NdW1R0XVtFZV1bTW1dIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUM+IHtBdHRWYWx1ZX18e1B1YmlkTGl0ZXJhbH18KFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsNCi19DQotPFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTT4ge0F0dFZhbHVlfXx7U3lzdGVtTGl0ZXJhbH18KFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsNCi19DQotLy8gZW5kIERPQ1RZUEUgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBFTEVNRU5UIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfXwoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgRUxFTUVOVCBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEFUVExJU1QgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9fChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOw0KLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOw0KLX0NCi08U1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVD4gW14+XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7DQotfQ0KLS8vIGVuZCBBVFRMSVNUIGhhbmRsaW5nDQotDQotPFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiwgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIERFQ0xBUkFUSU9OIGhhbmRsaW5nDQotDQotPFlZSU5JVElBTD4gW148JiVdKnxbJiVde1N9K3tOYW1lfVteJiU8XSp8WyYlXXtOYW1lfShbXjsmJTxdKnx7U30rOyopIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0NPTlRFTlQ7DQotfQ0KLQ0KLQ0KLTxTVF9CTE9DS19UQUdfU0NBTj4gLnxccnxcbiB7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQ0KLS4gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCi0NCi1cMDQwIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJTUEFDRSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDExIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCIweDkiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxNSANCi17DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiQ0FSUklBR0UgUkVUVVJOIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTIgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllODExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguY21kCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1AZWNobyBvZmYNCi1jbWQgL2MgZmxleHguY21kDQotY21kIC9jIGZsZXhqLmNtZA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiNmUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMhL2Jpbi9zaA0KLWV4cG9ydCBQQVRIPSRQQVRIOi9vcHQvSUJNSmF2YTItMTMxL2Jpbi86L29wdC9JQk1KYXZhMi0xMy9iaW4vOi9vcHQvamRrMS40DQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCBKRmxleC9saWIvc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gSlNQVG9rZW5pemVyLmpmbGV4IC1za2VsIHNrZWxldG9uLnNzZQ0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgSkZsZXgvbGliL3NlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluIFhNTFRva2VuaXplci5qZmxleCAtc2tlbCBza2VsZXRvbi5zc2UNCi1ybSAtZiBKU1BUb2tlbml6ZXIuamF2YX4gSlNQVG9rZW5pemVyfiBYTUxUb2tlbml6ZXIuamF2YX4gWE1MVG9rZW5pemVyfg0KLWNwIC12IFhNTFRva2VuaXplci5qYXZhIC4uLy4uLy4uLy4uL3NlZG1vZGVsL2NvbS9pYm0vc2VkL3BhcnNlci9pbnRlcm5hbA0KLWNwIC12IEpTUFRva2VuaXplci5qYXZhIC4uLy4uLy4uLy4uL3NlZG1vZGVsL2NvbS9pYm0vc2VkL3BhcnNlci9pbnRlcm5hbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleGouY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4ai5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNmJhNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4ai5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUBlY2hvIG9mZg0KLVBBVEg9JVBBVEglO2M6XGpkazEuNC4yXzA1XGJpbg0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgZDpcSkZsZXhcMS4yLjJcbGliXEpGbGV4LmphcjsuIEpGbGV4Lk1haW4gSlNQVG9rZW5pemVyLmpmbGV4IC1za2VsIHNrZWxldG9uLnNzZSAmJiBybSAtZiBKU1BUb2tlbml6ZXIuamF2YX4gSlNQVG9rZW5pemVyfiAmJiBjb3B5IEpTUFRva2VuaXplci5qYXZhIC4uXC4uXC4uXC4uXC4uXG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZVxzcmNcb3JnXGVjbGlwc2VcanN0XGpzcFxjb3JlXGludGVybmFsXHBhcnNlclxcaW50ZXJuYWxcSlNQVG9rZW5pemVyLmphdmENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXh4LmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleHguY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQyY2QzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleHguY21kCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1AZWNobyBvZmYNCi1QQVRIPSVQQVRIJTtjOlxqZGsxLjQuMl8wNVxiaW4NCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwIGQ6XEpGbGV4XDEuMi4yXGxpYlxKRmxleC5qYXI7LiBKRmxleC5NYWluIFhNTFRva2VuaXplci5qZmxleCAtc2tlbCBza2VsZXRvbi5zc2UgJiYgcm0gLWYgWE1MVG9rZW5pemVyLmphdmF+IFhNTFRva2VuaXplcn4gJiYgY29weSBYTUxUb2tlbml6ZXIuamF2YSAuLlwuLlwuLlwuLlwuLlxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmVcc3JjXG9yZ1xlY2xpcHNlXHdzdFx4bWxcY29yZVxpbnRlcm5hbFxwYXJzZXJcWE1MVG9rZW5pemVyLmphdmENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmI3NjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLQ0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovDQotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOw0KLQ0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovDQotLS0tICBsZXhpY2FsIHN0YXRlcywgY2hhcm1hcA0KLQ0KLSAgLyogZXJyb3IgY29kZXMgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsNCi0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7DQotDQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovDQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7DQotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkDQotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkDQotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkDQotICB9Ow0KLQ0KLS0tLSBpc0ZpbmFsIGxpc3QNCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICBwcml2YXRlIGludCB5eV9zdGF0ZTsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7DQotDQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7DQotDQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAgICAgZnJvbSBpbnB1dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsNCi0NCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5bGluZTsNCi0NCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsNCi0NCi0gIC8qKg0KLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIA0KLSAgICogbWF0Y2hlZCB0ZXh0DQotICAgKi8NCi0gIC8vIHByaXZhdGUgaW50IHl5Y29sdW1uOyANCi0NCi0gIC8qKiANCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQ0KLSAgICovDQotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7DQotDQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOw0KLQ0KLS0tLSB1c2VyIGNsYXNzIGNvZGUNCi0NCi0gIC8qKg0KLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyDQotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuDQotICAgKg0KLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uDQotICAgKi8NCi0tLS0gY29uc3RydWN0b3IgZGVjbGFyYXRpb24NCi0NCi0NCi0gIC8qKg0KLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlDQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCi0NCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLw0KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0NCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyANCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7DQotDQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLw0KLQ0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLw0KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgew0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsNCi0NCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLw0KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfc3RhcnRSZWFkID0gMDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8NCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsNCi0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7DQotICAgIH0NCi0NCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovDQotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7DQotDQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsNCi0NCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7DQotDQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0gIH0NCi0NCi0gICAgDQotICAvKioNCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8NCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovDQotICAgIHl5X3JlYWRlci5jbG9zZSgpOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsNCi0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7DQotICB9DQotDQotICAvKioNCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKg0KLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQ0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgew0KLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgew0KLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgew0KLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24NCi0gICAqDQotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQ0KLSAgICovDQotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsNCi0gICAgdHJ5IHsNCi0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOw0KLSAgICB9DQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLSAgICB9DQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcg0KLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsNCi0gIH0gDQotDQotDQotICAvKioNCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICoNCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QNCi0gICAqDQotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4NCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQ0KLSAgICovDQotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgew0KLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQ0KLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsNCi0NCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsNCi0gIH0NCi0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkDQotCSAqLw0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7DQotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgew0KLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsNCi0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsNCi0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOw0KLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgew0KLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7DQotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkNCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7DQotCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkNCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJaWYobWF0Y2hlc1NvRmFyKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZA0KLQkgKg0KLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0DQotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgew0KLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsNCi0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgew0KLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsNCi0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsNCi0JCQkJfQ0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsNCi0JCQl9DQotCQl9DQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsNCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJA0KLQkJCXRocm93IGU7DQotCQl9DQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCANCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuDQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gdG9rZW5zOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJA0KLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7DQotCQlyZXR1cm4geXlfYXRFT0Y7DQotCX0NCi0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLw0KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgew0KLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOw0KLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7DQotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpDQotCQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS0tLSB5eV9kb0VvZg0KLSAgLyoqDQotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLA0KLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbg0KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3Vycw0KLSAgICovDQotLS0tIHl5bGV4IGRlY2xhcmF0aW9uDQotICAgIGludCB5eV9pbnB1dDsNCi0gICAgaW50IHl5X2FjdGlvbjsNCi0NCi0tLS0gbG9jYWwgZGVjbGFyYXRpb25zDQotDQotICAgIHdoaWxlICh0cnVlKSB7DQotDQotLS0tIHN0YXJ0IGFkbWluIChsaW5lLCBjaGFyLCBjb2wgY291bnQpDQotICAgICAgeXlfYWN0aW9uID0gLTE7DQotDQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsNCi0NCi0tLS0gc3RhcnQgYWRtaW4gKGxleHN0YXRlIGV0YykNCi0NCi0gICAgICB5eV9mb3JBY3Rpb246IHsNCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgIA0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsNCi0NCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsNCi0NCi0tLS0gbGluZSwgY29sLCBjaGFyIGNvdW50LCBuZXh0IHRyYW5zaXRpb24sIGlzRmluYWwgYWN0aW9uDQotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IA0KLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IA0KLS0tLSBsaW5lIGNvdW50IHVwZGF0ZQ0KLSAgICAgICAgICB9DQotDQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLS0tLSBjaGFyIGNvdW50IHVwZGF0ZQ0KLQ0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIA0KLQ0KLS0tLSBhY3Rpb25zDQotICAgICAgICBkZWZhdWx0OiANCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7DQotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOw0KLS0tLSBlb2Z2YWx1ZQ0KLSAgICAgICAgICB9IA0KLSAgICAgICAgICBlbHNlIHsNCi0tLS0gbm8gbWF0Y2gNCi0gICAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfSAgICANCi0NCi0tLS0gbWFpbg0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZS5yZWFkbWUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZS5yZWFkbWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODk3MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9za2VsZXRvbi5zc2UucmVhZG1lCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1UaGUgc2tlbGV0b24uc2VkIGZpbGUgY29udGFpbnMgdGhlIG1vZGlmaWVkIEpGbGV4IDEuMi4yIHNrZWxldG9uIGZpbGUgd2l0aA0KLWNoYW5nZXMgZm9yIHVzZSB3aXRoIHRoZSB0b2tlbml6ZXJzIHdpdGhpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbCBhbmQNCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuanNwIHBsdWdpbnMuDQotDQotVGhlIHNrZWxldG9uIGZpbGUncyBtZXRob2QgZGVmaW5pdGlvbnMgYXJlIGNvcGllZCBpbnRvIHRoZSBnZW5lcmF0ZWQgb3V0cHV0DQotZGlyZWN0bHkuDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2ZjNGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IkNTU1Rva2VuaXplciI+Ci0JPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmtzcGFjZS5kaXIiIHZhbHVlPSIuLi8uLiIvPgotCQk8cHJvcGVydHkgbmFtZT0iamZsZXguamFyIiB2YWx1ZT0iU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KRmxleC9saWIvc2VkLWpmbGV4LmphciIvPgotCQk8cHJvcGVydHkgbmFtZT0iamZsZXgubWF4bWVtb3J5IiB2YWx1ZT0iNDcwMDAwMDAwIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJqZmxleC5vcHQiIHZhbHVlPSItc2tlbCBTZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IkNTU1Rva2VuaXplciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZmlsZSIgdmFsdWU9IkNTU1Rva2VuaXplci5qZmxleCIvPgkJCQotCQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY3NzL3NyYy9jb20vaWJtL3NzZS9tb2RlbC9jc3MvaW50ZXJuYWwvcGFyc2VyIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGQtdG9rZW5pemVyIj4KLQkJCTxwYXJhbSBuYW1lPSJqZmxleC5vcHQiIHZhbHVlPSIiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJYTUxUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IlNlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iWE1MVG9rZW5pemVyIi8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWwvc3JjL2NvbS9pYm0vc3NlL21vZGVsL3htbC9pbnRlcm5hbC9wYXJzZXIiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC10b2tlbml6ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iSlNQVG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJTZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZmlsZSIgdmFsdWU9IkpTUFRva2VuaXplci5qZmxleCIvPgkJCQotCQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuanNwL3NyYy9jb20vaWJtL3NzZS9tb2RlbC9qc3AvcGFyc2VyL2ludGVybmFsIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGQtdG9rZW5pemVyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLXRva2VuaXplciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0icnVuLWpmbGV4Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY29weSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJ1bi1qZmxleCIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0iSkZsZXguTWFpbiIgbWF4bWVtb3J5PSIke2pmbGV4Lm1heG1lbW9yeX0iIGZvcms9InllcyIgPgotCQkJPGFyZyBsaW5lPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9ICR7amZsZXgub3B0fSIvPgotCQkJPGNsYXNzcGF0aD4KLQkJCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amZsZXguamFyfSIvPgotCQkJPC9jbGFzc3BhdGg+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNvcHkiIGRlcGVuZHM9ImluaXQiPgotCQk8Y29weSB0b2Rpcj0iJHt3b3Jrc3BhY2UuZGlyfS8ke2Rlc3QuZGlyfSIgb3ZlcndyaXRlPSJ0cnVlIiB2ZXJib3NlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXZhIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvY29weT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGRlbGV0ZSB2ZXJib3NlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgZGVmYXVsdGV4Y2x1ZGVzPSJubyI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKn4iLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0JCi0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9SRUFETUUudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViM2NjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGUgY29yZSBtb2RlbCBvZiB0aGUgc3NlIGZyYW1ld29yay4gSXQgcHJvdmlkZXMgdGhlIGJhc2UgZG9jdW1lbnQgY2xhc3NlcywKLWJ1aWxkZXJzIGFuZCBwYXJzZXJzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTdiMWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5tb2RlbC5qYXIgPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIG1vZGVsLmphcixcCi0gICAgICAgICAgICAgICAub3B0aW9ucwotc3JjLmluY2x1ZGVzID0gRGV2VGltZVN1cHBvcnQvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgbW9kZWwuamFyLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2MvYm9vay5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2MvYm9vay5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNzhjZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2Jvb2suY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLVAuQ29kZSB7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQl0ZXh0LWFsaWduOiBsZWZ0Ow0KLQl0ZXh0LWluZGVudDogMC4wMHB0Ow0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAxNXB0Ow0KLQlmb250LXNpemU6IDEwLjAwMDAwMHB0Ow0KLQlmb250LXdlaWdodDogbWVkaXVtOw0KLQlmb250LXN0eWxlOiBSZWd1bGFyOw0KLQljb2xvcjogIzQ0NDRDQzsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IjsNCi19DQotSDYuQ2FwdGlvbkZpZ0NvbHVtbiB7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQl0ZXh0LWFsaWduOiBsZWZ0Ow0KLQl0ZXh0LWluZGVudDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXRvcDogMy4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMTEuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7DQotCWZvbnQtc2l6ZTogOS4wMDAwMDBwdDsNCi0JZm9udC13ZWlnaHQ6IG1lZGl1bTsNCi0JZm9udC1zdHlsZTogSXRhbGljOw0KLQljb2xvcjogIzAwMDAwMDsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseTogIkFyaWFsIjsNCi19DQotUC5Ob3RlIHsNCi0JZGlzcGxheTogYmxvY2s7DQotCXRleHQtYWxpZ246IGxlZnQ7DQotCXRleHQtaW5kZW50OiAwcHQ7DQotCW1hcmdpbi10b3A6IDE5LjUwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAxOS41MDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMzBwdDsNCi0JZm9udC1zaXplOiAxMS4wMDAwMDBwdDsNCi0JZm9udC13ZWlnaHQ6IG1lZGl1bTsNCi0JZm9udC1zdHlsZTogSXRhbGljOw0KLQljb2xvcjogIzAwMDAwMDsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseTogIkFyaWFsIjsNCi19DQotRU0uVUlMYWJlbCB7DQotCWZvbnQtd2VpZ2h0OiBCb2xkOw0KLQlmb250LXN0eWxlOiBSZWd1bGFyOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotfQ0KLUVNLkNvZGVOYW1lIHsNCi0JZm9udC13ZWlnaHQ6IEJvbGQ7DQotCWZvbnQtc3R5bGU6IFJlZ3VsYXI7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsNCi19DQotDQotDQotDQotDQotLyogZm9sbG93aW5nIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSByZW1vdmVkIGZvciBEQkNTICovDQotDQotYm9keSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgdGFibGUsIHRkLCBjYXB0aW9uLCB0aCwgdWwsIG9sLCBkbCwgbGksIGRkLCBkdCB7Zm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiAjMDAwMDAwfQ0KLXByZQkJCQl7IGZvbnQtZmFtaWx5OiBDb3VyaWVyLCBtb25vc3BhY2V9DQotDQotLyogZW5kIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgKi8NCi0NCi0vKiBmb2xsb3dpbmcgZm9udCBzaXplIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgT0sgZm9yIERCQ1MgKi8NCi1ib2R5LCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBwLCB0YWJsZSwgdGQsIGNhcHRpb24sIHRoLCB1bCwgb2wsIGRsLCBsaSwgZGQsIGR0IHtmb250LXNpemU6IDEwcHQ7IH0NCi1wcmUJCQkJeyBmb250LXNpemU6IDEwcHR9DQotDQotLyogZW5kIGZvbnQgc2l6ZSBkZWNsYXJhdGlvbnMgKi8NCi0NCi1ib2R5CSAgICAgeyBiYWNrZ3JvdW5kOiAjRkZGRkZGfQ0KLWgxICAgICAgICAgICB7IGZvbnQtc2l6ZTogMThwdDsgbWFyZ2luLXRvcDogNTsgbWFyZ2luLWJvdHRvbTogMSB9CQ0KLWgyICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTRwdDsgbWFyZ2luLXRvcDogMjU7IG1hcmdpbi1ib3R0b206IDMgfQ0KLWgzICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTFwdDsgbWFyZ2luLXRvcDogMjA7IG1hcmdpbi1ib3R0b206IDMgfQ0KLWg0ICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTBwdDsgbWFyZ2luLXRvcDogMjA7IG1hcmdpbi1ib3R0b206IDM7IGZvbnQtc3R5bGU6IGl0YWxpYyB9DQotcCAgICAgICAgICAgIHsgbWFyZ2luLXRvcDogMTBweDsgbWFyZ2luLWJvdHRvbTogMTBweCB9DQotcHJlCSAgICAgeyBtYXJnaW4tbGVmdDogNjsgZm9udC1zaXplOiA5cHQgfQ0KLWE6bGluawkgICAgIHsgY29sb3I6ICMwMDAwRkYgfQ0KLWE6aG92ZXIJICAgICB7IGNvbG9yOiAjMDAwMDgwIH0NCi1hOnZpc2l0ZWQgICAgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSB9DQotdWwJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDEwIH0NCi1saQkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9IA0KLWxpIHAJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfSANCi1vbAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMTAgfQ0KLWRsCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9DQotZHQJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDA7IGZvbnQtd2VpZ2h0OiBib2xkIH0NCi1kZAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9DQotc3Ryb25nCSAgICAgeyBmb250LXdlaWdodDogYm9sZH0NCi1lbQkgICAgIHsgZm9udC1zdHlsZTogaXRhbGljfQ0KLXZhcgkgICAgIHsgZm9udC1zdHlsZTogaXRhbGljfQ0KLWRpdi5yZXZpc2lvbiB7IGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsgYm9yZGVyLWxlZnQtd2lkdGg6IHRoaW47IA0KLQkJCQkgICBib3JkZXItbGVmdC1jb2xvcjogIzdCNjhFRTsgcGFkZGluZy1sZWZ0OjUgfQ0KLXRoCSAgICAgeyBmb250LXdlaWdodDogYm9sZCB9DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2NvbV9pYm1fc3NlX21vZGVsX2J1aWxkZXJwYXJ0aWNpcGFudC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2NvbV9pYm1fc3NlX21vZGVsX2J1aWxkZXJwYXJ0aWNpcGFudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWFkNTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvYy9jb21faWJtX3NzZV9tb2RlbF9idWlsZGVycGFydGljaXBhbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwhLS0gZGVmYXVsdCBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uIHN0eWxlc2hlZXRzIC0tPgotPHN0eWxlPkBpbXBvcnQgdXJsKCJib29rLmNzcyIpOzwvc3R5bGU+Ci08IS0tIGRlZmF1bHQgc2NoZW1hIGRvY3VtZW50YXRpb24gc3R5bGVzaGVldHMgLS0+Ci08c3R5bGU+QGltcG9ydCB1cmwoInNjaGVtYS5jc3MiKTs8L3N0eWxlPgotPC9IRUFEPgotPEhUTUw+Ci08Qk9EWT4KLTxIMT48Q0VOVEVSPlN0cnVjdHVyZWQgQnVpbGRlciBQYXJ0aWNpcGFudDwvQ0VOVEVSPjwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9Q2FwdGlvbkZpZ0NvbHVtbiBpZD1oZWFkZXI+SWRlbnRpZmllcjogPC9oNj5vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuYnVpbGRlcnBhcnRpY2lwYW50PHA+PC9wPgotPGg2IGNsYXNzPUNhcHRpb25GaWdDb2x1bW4gaWQ9aGVhZGVyPlNpbmNlOiA8L2g2PjMuMAotPHA+PC9wPgotCi08cD4KLTxoNiBjbGFzcz1DYXB0aW9uRmlnQ29sdW1uIGlkPWhlYWRlcj5EZXNjcmlwdGlvbjogPC9oNj5BbGxvd3MgZm9yIHRoZSBjb250cmlidXRpb24gb2YgcGFydGljaXBhbnRzIHRvIHRoZSBTdHJ1Y3R1cmVkIGJ1aWxkaW5nIHByb2Nlc3MuPC9wPgotPHA+PGg2IGNsYXNzPUNhcHRpb25GaWdDb2x1bW4gaWQ9aGVhZGVyPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+PC9wPgotPHAgY2xhc3M9Y29kZSBpZD1kdGQ+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPWNvZGUgaWQ9ZHRkPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz1jb2RlIGlkPWR0ZEF0dGxpc3Q+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz1jb2RlIGlkPWR0ZEF0dGxpc3Q+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDxwIGNsYXNzPWNvZGUgaWQ9ZHRkQXR0bGlzdD5uYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPUNvbmZpZ01hcmt1cCBpZD1hdHRsaXN0RGVzYz4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9Y29kZSBpZD1kdGQ+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucGFydGljaXBhbnQiPnBhcnRpY2lwYW50PC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz1jb2RlIGlkPWR0ZD4mbHQ7IUFUVExJU1QgcGFydGljaXBhbnQ8L3A+Ci08cCBjbGFzcz1jb2RlIGlkPWR0ZEF0dGxpc3Q+Y2xhc3MmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz1jb2RlIGlkPWR0ZEF0dGxpc3Q+Y29udGVudFR5cGUmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9Q29uZmlnTWFya3VwIGlkPWVsZW1lbnREZXNjPgotQSBwYXJ0aWNpcGFudCB0byBiZSBjYWxsZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLiAgUGFydGljaXBhbnRzIGFyZSBub3RpZmllZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBTdHJ1Y3R1cmVkIEJ1aWxkZXIgcnVucyBvbiBhIHByb2plY3QsIGdpdmVuIHRoZSByZXNvdXJjZSBkZWx0YXMgZHVyaW5nIGluY3JlbWVudGFsIGJ1aWxkcyBhbmQgdG9sZCB3aGljaCByZXNvdXJjZXMgdG8gYnVpbGQgZHVyaW5nIGEgZnVsbCByZWJ1aWxkLjwvcD4KLTxicj4KLTx1bCBjbGFzcz1Db25maWdNYXJrdXAgaWQ9YXR0bGlzdERlc2M+Ci08bGk+PGI+Y2xhc3M8L2I+IC0gQ2xhc3NuYW1lIG9mIHRoZSBwYXJ0aWNpcGFudC4gIE11c3QgaW1wbGVtZW50IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyUGFydGljaXBhbnQuPC9saT4KLTxsaT48Yj5jb250ZW50VHlwZTwvYj4gLSBBIENvbnRlbnQgVHlwZSBJZGVudGlmaWVyIElELiAgVGhlIHBhcnRpY2lwYW50IHdpbGwgb25seSBiZSBjYWxsZWQgZm9yIHJlc291cmNlcyBhbmQgZGVsdGFzIHdpdGggdGhpcyBjb250ZW50IHR5cGUuICBNb3JlIHRoYW4gb25lIG1heSBiZSBzcGVjaWZpZWQgcGVyIGVsZW1lbnQsIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIGFuZCB0aGUgY29udGVudCB0eXBlcy48L2xpPgotPC91bD4KLTxicj48aDYgY2xhc3M9Q2FwdGlvbkZpZ0NvbHVtbiBpZD1oZWFkZXI+RXhhbXBsZXM6IDwvaDY+PHByZT4KLTxwIGNsYXNzPWNvZGUgaWQ9dGFnPiZsdDtleHRlbnNpb24gcG9pbnQ9PHAgY2xhc3M9Y29kZSBpZD1jc3RyaW5nPiZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVycGFydGljaXBhbnQmcXVvdDs8L3A+PHAgY2xhc3M9Y29kZSBpZD10YWc+IGlkPTxwIGNsYXNzPWNvZGUgaWQ9Y3N0cmluZz4mcXVvdDtjb20uZXhhbXBsZS5kb2N0eXBlRmluZGVyJnF1b3Q7PC9wPjxwIGNsYXNzPWNvZGUgaWQ9dGFnPiBuYW1lPTxwIGNsYXNzPWNvZGUgaWQ9Y3N0cmluZz4mcXVvdDtYTUwgRE9DVFlQRSByZWZlcmVuY2UgdHJhY2tlciZxdW90OzwvcD48cCBjbGFzcz1jb2RlIGlkPXRhZz4gJmd0OzwvcD4KLSA8cCBjbGFzcz1jb2RlIGlkPXRhZz4mbHQ7cGFydGljaXBhbnQgY29udGVudFR5cGU9PHAgY2xhc3M9Y29kZSBpZD1jc3RyaW5nPiZxdW90O2NvbnRlbnR0eXBlLnhtbCZxdW90OzwvcD48cCBjbGFzcz1jb2RlIGlkPXRhZz4gY2xhc3M9PHAgY2xhc3M9Y29kZSBpZD1jc3RyaW5nPiZxdW90O2NvbS5leGFtcGxlLmJ1aWxkZXIuRG9jdHlwZVBhcnRpY2lwYW50JnF1b3Q7PC9wPjxwIGNsYXNzPWNvZGUgaWQ9dGFnPi8mZ3Q7PC9wPgotPHAgY2xhc3M9Y29kZSBpZD10YWc+Jmx0Oy9leHRlbnNpb24mZ3Q7PC9wPgotPC9wcmU+Ci08cD48L3A+Ci0KLTxicj4KLTxwIGNsYXNzPW5vdGUgaWQ9Y29weXJpZ2h0PgotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL3NjaGVtYS5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2Mvc2NoZW1hLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmYmYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2Mvc2NoZW1hLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLUg2LkNhcHRpb25GaWdDb2x1bW4jaGVhZGVyIHsNCi0JZm9udC1zaXplOjE2cHg7IA0KLQlkaXNwbGF5OmlubGluZQ0KLX0NCi0NCi1QLk5vdGUjY29weXJpZ2h0IHsNCi0JZm9udC1zaXplOiBzbWFsbGVyOyANCi0JZm9udC1zdHlsZTogbm9ybWFsOw0KLQljb2xvcjogIzMzNjY5OTsgDQotCWRpc3BsYXk6aW5saW5lOw0KLQltYXJnaW4tdG9wOiAzLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAxMS4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsNCi19DQotDQotUC5Db2RlI2R0ZCB7DQotCWNvbG9yOiAjODAwMDAwOyANCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMTAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSNkdGRBdHRsaXN0IHsNCi0JY29sb3I6ICM4MDAwMDA7IA0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAyMC4wMDAwMDBwdDsNCi19DQotDQotUC5Db2RlI3RhZyB7DQotCWNvbG9yOiAjMDAwMDgwOyANCi0JZGlzcGxheTppbmxpbmU7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSNjc3RyaW5nIHsNCi0JY29sb3I6ICMwMDgwMDA7IA0KLQlkaXNwbGF5OmlubGluZTsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsJDQotfQ0KLQ0KLS5Db25maWdNYXJrdXAjZWxlbWVudERlc2Mgew0KLQljb2xvcjogYmxhY2s7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDEwLjAwMDAwMHB0Ow0KLX0NCi0NCi0uQ29uZmlnTWFya3VwI2F0dGxpc3REZXNjIHsNCi0JY29sb3I6IGJsYWNrOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAzMi4wMDAwMDBwdDsNCi19DQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhNTRjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgVGV4dCBNb2RlbAotbmxGZWF0dXJlTmFtZT1TdHJ1Y3R1cmVkIFRleHQgTW9kZWwgTkwgU3VwcG9ydAotIyBleHRlbnNpb24gbmFtZXMKLUFkYXB0X09uX0NyZWF0ZV9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPUFkYXB0IE9uIENyZWF0ZSBGYWN0b3J5IEV4dGVuc2lvbgotRG9jdW1lbnRfVHlwZXNfRXh0ZW5zaW9uLm5hbWU9RG9jdW1lbnQgVHlwZXMgRXh0ZW5zaW9uCi1KU1BfRW1iZWRkZWRfQ29udGVudF9UeXBlX0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWU9SlNQIEVtYmVkZGVkIENvbnRlbnQgVHlwZSBIYW5kbGVyIEV4dGVuc2lvbgotQ29udGVudF9UeXBlX0ZhY3RvcnlfQ29udHJpYnV0aW9uX0V4dGVuc2lvbi5uYW1lPUNvbnRlbnQgVHlwZSBGYWN0b3J5IENvbnRyaWJ1dGlvbiBFeHRlbnNpb24KLUNTU19Qcm9maWxlX0V4dGVuc2lvbi5uYW1lPUNTUyBQcm9maWxlIEV4dGVuc2lvbgotQ29tbWVudF9FbGVtZW50X0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWU9Q29tbWVudCBFbGVtZW50IEhhbmRsZXIgRXh0ZW5zaW9uCi1Nb2RlbF9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lPU1vZGVsIEhhbmRsZXIgRXh0ZW5zaW9uCi1TRE1CLm5hbWU9U3RydWN0dXJlZCBEb2N1bWVudCBhbmQgTW9kZWwgQnVpbGRlcgotRm9ybWF0X1Byb2Nlc3NvcnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9Rm9ybWF0IFByb2Nlc3NvcnMgRXh0ZW5zaW9uIFBvaW50Ci1TdHJ1Y3R1cmVkX0J1aWxkZXJfRGVsZWdhdGVfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9U3RydWN0dXJlZCBCdWlsZGVyIERlbGVnYXRlIEV4dGVuc2lvbiBQb2ludAotU3RydWN0dXJlZF9Tb3VyY2VzX1Rhc2tfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBTb3VyY2VzIFRhc2sKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBrZXlzIG1heWJlIHVudXNlZC4gQ29tbWVudGVkIG91dCBvbiAxMi83LzIwMDQuIFVuY29tbWVudCBpZiBuZWVkZWQuCi0jSlNQX0VtYmVkZGVkX0NvbnRlbnRfVHlwZV9IYW5kbGVyX0V4dGVuc2lvbl9Qb2ludC5uYW1lPUpTUCBFbWJlZGRlZCBDb250ZW50IFR5cGUgSGFuZGxlciBFeHRlbnNpb24gUG9pbnQKLSNTdHJ1Y3R1cmVkX0J1aWxkZXJfUGFydGljaXBhbnRfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBCdWlsZGVyIFBhcnRpY2lwYW50IEV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODgyMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9Im1vZGVsLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgCi0JCTwhLS0gbmVlZCB0byByZS1leHBvcnQgb3JnLmVjbGlwc2UudGV4dCBzaW5jZSBvdXIgQVBJIGRlcGVuZHMgb24gaXQsIAotCQkJc3VjaCBhcyBJU3RydWN0dXJlZERvY3VtZW50IGV4dGVuZHMgSURvY3VtZW50IAotCQktLT4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS50ZXh0IiBleHBvcnQ9InRydWUiLz4KLQotCQk8IS0tIG5lZWQgdG8gcmUtZXhwb3J0IGVtZi5jb21tb24gc2luY2Ugb3VyIEFQSSBkZXBlbmRzIG9uIGl0LCAKLQkJCXN1Y2ggYXMgU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcidzIGdldENvbW1tYW5kIG1ldGhvZCByZXR1cm5zIGFuIAotCQkJZW1mLmNvbW1vbi5Db21tYW5kCi0JCS0tPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iIGV4cG9ydD0idHJ1ZSIvPgotICAgICAgCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBkZXByZWNhdGVkIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYWRhcHRPbkNyZWF0ZUZhY3RvcnkiIG5hbWU9IiVBZGFwdF9Pbl9DcmVhdGVfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZG9jdW1lbnRUeXBlcyIgbmFtZT0iJURvY3VtZW50X1R5cGVzX0V4dGVuc2lvbi5uYW1lIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlbWJlZGRlZFR5cGVIYW5kbGVyIiBuYW1lPSIlSlNQX0VtYmVkZGVkX0NvbnRlbnRfVHlwZV9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24iIG5hbWU9IiVDb250ZW50X1R5cGVfRmFjdG9yeV9Db250cmlidXRpb25fRXh0ZW5zaW9uLm5hbWUiLz4KLTwhLS0gSSBjb21tZW50ZWQgb3V0IC4uLiBjbGllbnRzIHNob3VsZCBqdXN0IHVzZSB0aGUgbm9ybWFsIHBsYXRmb3JtIHdheSBvZiByZWdpc3RlcmluZyB0aGVzZSAKLQkJYWRhcHRlckZhY3Rvcmllcy4gQXQgd29yc3QsIHRoZXknZCBuZWVkIGEgc21hbGwgcGx1Z2luIHdpdGggJ3N0YXJ0dXAnIHNwZWNpZmllZCAuLi4gYnV0IHRoYXQncyAKLQkJYmV0dGVyIHRoYW4gdXMgZ2V0dGluZyBoaXQgd2l0aCB0aGUgcGVyZm9ybWFuY2UgaW1wYWN0IChvZiBsb2FkaW5nIHBsdWdpbnMgYW5kIHByZS1yZXFzLCBldGMuKS4gCi0JCTxleHRlbnNpb24tcG9pbnQgaWQ9InVyaVJlc29sdmVyQWRhcHRlckZhY3RvcnkiIG5hbWU9IlJlc291cmNlIEFkYXB0ZXIgRmFjdG9yeSBmb3IgQ3JlYXRpbmcgVVJJUmVzb2x2ZXJzIi8+Ci0JLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjc3Nwcm9maWxlIiBuYW1lPSIlQ1NTX1Byb2ZpbGVfRXh0ZW5zaW9uLm5hbWUiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbW1lbnRFbGVtZW50SGFuZGxlciIgbmFtZT0iJUNvbW1lbnRfRWxlbWVudF9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lIi8+Ci08IS0tIHRoaXMgcGx1Zy1pbiBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludCAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1vZGVsSGFuZGxlciIgbmFtZT0iJU1vZGVsX0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWUiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImZvcm1hdFByb2Nlc3NvcnMiIG5hbWU9IiVGb3JtYXRfUHJvY2Vzc29yc19FeHRlbnNpb25fUG9pbnQubmFtZSIgc2NoZW1hPSJzY2hlbWEvZm9ybWF0UHJvY2Vzc29ycy5leHNkIi8+Ci0KLTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImJ1aWxkZXJkZWxlZ2F0ZSIgbmFtZT0iJVN0cnVjdHVyZWRfQnVpbGRlcl9EZWxlZ2F0ZV9FeHRlbnNpb25fUG9pbnQubmFtZSIvPgotCi08IS0tIGRlZmluZSBvdXIgdGFzayBtYXJrZXIgdHlwZSAtLT4KLQk8ZXh0ZW5zaW9uIGlkPSJ0YXNrIiBuYW1lPSIlU3RydWN0dXJlZF9Tb3VyY2VzX1Rhc2tfRXh0ZW5zaW9uLm5hbWUiIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRhc2ttYXJrZXIiLz4gCi0gICAgCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9idWlsZGVycGFydGljaXBhbnQuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9idWlsZGVycGFydGljaXBhbnQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA2MzVkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvYnVpbGRlcnBhcnRpY2lwYW50LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImJ1aWxkZXJwYXJ0aWNpcGFudCIgbmFtZT0iU3RydWN0dXJlZCBCdWlsZGVyIFBhcnRpY2lwYW50Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIEFsbG93cyBmb3IgdGhlIGNvbnRyaWJ1dGlvbiBvZiBwYXJ0aWNpcGFudHMgdG8gdGhlIFN0cnVjdHVyZWQgYnVpbGRpbmcgcHJvY2Vzcy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhcnRpY2lwYW50Ii8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icGFydGljaXBhbnQiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIEEgcGFydGljaXBhbnQgdG8gYmUgY2FsbGVkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4gIFBhcnRpY2lwYW50cyBhcmUgbm90aWZpZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgU3RydWN0dXJlZCBCdWlsZGVyIHJ1bnMgb24gYSBwcm9qZWN0LCBnaXZlbiB0aGUgcmVzb3VyY2UgZGVsdGFzIGR1cmluZyBpbmNyZW1lbnRhbCBidWlsZHMgYW5kIHRvbGQgd2hpY2ggcmVzb3VyY2VzIHRvIGJ1aWxkIGR1cmluZyBhIGZ1bGwgcmVidWlsZC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIENsYXNzbmFtZSBvZiB0aGUgcGFydGljaXBhbnQuICBNdXN0IGltcGxlbWVudCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuYnVpbGRlci5JQnVpbGRlclBhcnRpY2lwYW50Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIENvbnRlbnQgVHlwZSBJZGVudGlmaWVyIElELiAgVGhlIHBhcnRpY2lwYW50IHdpbGwgb25seSBiZSBjYWxsZWQgZm9yIHJlc291cmNlcyBhbmQgZGVsdGFzIHdpdGggdGhpcyBjb250ZW50IHR5cGUuICBNb3JlIHRoYW4gb25lIG1heSBiZSBzcGVjaWZpZWQgcGVyIGVsZW1lbnQsIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIGFuZCB0aGUgY29udGVudCB0eXBlcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMy4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtwcmUmZ3Q7DQotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuYnVpbGRlcnBhcnRpY2lwYW50JnF1b3Q7IGlkPSZxdW90O2NvbS5leGFtcGxlLmRvY3R5cGVGaW5kZXImcXVvdDsgbmFtZT0mcXVvdDtYTUwgRE9DVFlQRSByZWZlcmVuY2UgdHJhY2tlciZxdW90OyAmZ3Q7DQotICZsdDtwYXJ0aWNpcGFudCBjb250ZW50VHlwZT0mcXVvdDtjb250ZW50dHlwZS54bWwmcXVvdDsgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuYnVpbGRlci5Eb2N0eXBlUGFydGljaXBhbnQmcXVvdDsvJmd0Ow0KLSZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Zvcm1hdFByb2Nlc3NvcnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9mb3JtYXRQcm9jZXNzb3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTY0MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Zvcm1hdFByb2Nlc3NvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iZm9ybWF0UHJvY2Vzc29ycyIgbmFtZT0iJUZvcm1hdF9Qcm9jZXNzb3JzX0V4dGVuc2lvbi5uYW1lIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGZvciBkZWZpbmluZyB0aGUgZm9ybWF0IHByb2Nlc3Nzb3IgZm9yIGEgY29udGVudCB0eXBlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvY2Vzc29yIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icHJvY2Vzc29yIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXRQcm9jZXNzb3JzJnF1b3Q7Jmd0Ow0KLSAgICAmbHQ7cHJvY2Vzc29yDQotICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUwmcXVvdDsNCi0gICAgICAgIGNvbnRlbnRUeXBlSWQ9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCZxdW90OyZndDsNCi0gICAgJmx0Oy9wcm9jZXNzb3ImZ3Q7DQotJmx0Oy9leHRlbnNpb24mZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0Fic3RyYWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhM2QzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0Fic3RyYWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIEFkYXB0ZXJGYWN0b3J5IHRoYXQgdXNlcyBpdHNlbGYgYXMgdGhlIGtleS4KLSAqIFN1YmNsYXNzIHRvIG92ZXJyaWRlIGJlaGF2aW9yLgotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBPYmplY3QgYWRhcHRlcktleTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSZWdpc3RlckFkYXB0ZXIgPSB0cnVlOwotCi0JcHVibGljIEFic3RyYWN0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCS8vIGRlZmF1bHQgY29uc3RydWN0b3Igc2V0cyB0aGUgYWRhcHRlcktleSB0byB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCS8vIGl0c2VsZiAoaS5lLiAidGhpcyIpCi0JCWFkYXB0ZXJLZXkgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5KE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJdGhpcy5hZGFwdGVyS2V5ID0gYWRhcHRlcktleTsKLQkJdGhpcy5zaG91bGRSZWdpc3RlckFkYXB0ZXIgPSByZWdpc3RlckFkYXB0ZXJzOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJLy8gdGFyZ2V0IHdhcyBudWxsIHdoZW4gYWxsIHRleHQgZGVsZXRlZD8KLQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gdGFyZ2V0LmdldEV4aXN0aW5nQWRhcHRlcihhZGFwdGVyS2V5KTsKLQkJcmV0dXJuIGFkYXB0ZXIgIT0gbnVsbCA/IGFkYXB0ZXIgOiBhZGFwdE5ldyh0YXJnZXQpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHROZXcoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKHRhcmdldCk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJaWYgKHNob3VsZFJlZ2lzdGVyQWRhcHRlcikKLQkJCXRhcmdldC5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBub3JtYWxseSBpbXBsZW1lbnQgdGhlaXIgb3duICdjb3B5JyBtZXRob2QuIEJ5Ci0JICogZGVmYXVsdCwgd2UnbGwgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlLCBmb3IgY29udmVuaWVuY2Ugb2YgdGhvc2UgdXNpbmcKLQkgKiBzaW5nbGV0b24gZmFjdG9yaWVzLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpOwotCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoYWRhcHRlcktleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc2V0QWRhcHRlcktleShPYmplY3Qga2V5KSB7Ci0JCWlmIChhZGFwdGVyS2V5ICE9IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0Vycm9yKCJJTm9kZUFkYXB0ZXIgS2V5IGNhbm5vdCBiZSBzZXQgbW9yZSB0aGFuIG9uY2UuIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRhcHRlcktleSA9IGtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWdpc3RlckFkYXB0ZXJzKGJvb2xlYW4gZmxhZykgewotCQlzaG91bGRSZWdpc3RlckFkYXB0ZXIgPSBmbGFnOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvQWJzdHJhY3RNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9BYnN0cmFjdE1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxY2ZlZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9BYnN0cmFjdE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuQmxvY2tUYWdQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuQXNzZXJ0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyBhIGZpbGUgYW5kIGNyZWF0ZXMgYW4gU3RydWN0dXJlZCBNb2RlbC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWxMb2FkZXIgaW1wbGVtZW50cyBNb2RlbExvYWRlciwgSU1vZGVsTG9hZGVyRXh0ZW5zaW9uIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBlbmNvZGluZ05hbWVTZWFyY2hMaW1pdCA9IDEwMDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBsb25nIGNvbXB1dGVNZW0oKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQlTeXN0ZW0uZ2MoKTsKLQkJCVN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKLQkJfQotCQlyZXR1cm4gUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSURvY3VtZW50TG9hZGVyIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdExvYWRlciBjb25zdHJ1Y3RvciBhbHNvIGluaXRpYWxpemVzIGVuY29kaW5nIGNvbnZlcnRlci9tYXBwZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgTGlzdCBmYWN0b3J5TGlzdCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1vZGVsKTsKLQkJSUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5LCAiSVN0cnVjdHVyZWRNb2RlbCAiICsgbW9kZWwuZ2V0SWQoKSArICIgaGFzIGEgbnVsbCBJRmFjdG9yeVJlZ2lzdHJ5Iik7Ci0JCWlmIChmYWN0b3J5TGlzdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGZhY3RvcnlMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcGVyZm9ybSBhbGwgdGhlIG1vZGVsIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGJlZm9yZQotCSAqIGl0IGNvbnRhaW5zIGNvbnRlbnQsIG5hbWVseSwgaXQgc2hvdWxkIGNhbGwgbmV3TW9kZWwsIHRoZQotCSAqIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpLCB0aGVuIGFkZCB0aG9zZSBhZGFwdGVyIGZhY3RvcmllcyB3aGljaAotCSAqIG11c3QgYmUgc2V0IGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkKLQkgKiAibG9hZCIgbWV0aG9kLiAodGhpcyBpcyB0ZW50YXRpdmUgQVBJKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ld01vZGVsKCk7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCW1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCWFkZEZhY3Rvcmllcyhtb2RlbCwgZ2V0QWRhcHRlckZhY3RvcmllcygpKTsKLQkJCS8vCi0JCQlpbml0RW1iZWRkZWRUeXBlKG1vZGVsKTsKLQkJCS8vIEZvciB0eXBlcyB3aXRoIHByb3BhZ2F0aW5nIGFkYXB0ZXJzLCBpdHMgaW1wb3J0YW50Ci0JCQkvLyB0aGF0IHRoZSBwcm9wYWdhdGluZyBhZGFwdGVyIGJlIGluIHBsYWNlIGJlZm9yZSB0aGUgY29udGVudHMKLQkJCS8vIGFyZSBzZXQuCi0JCQlwcmVMb2FkQWRhcHQobW9kZWwpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgU3RyaW5nIGJhc2VMb2NhdGlvbikgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ld01vZGVsKCk7Ci0JCW1vZGVsLnNldEJhc2VMb2NhdGlvbihiYXNlTG9jYXRpb24pOwotCQkKLQkJYWRkRmFjdG9yaWVzKG1vZGVsLCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkpOwotCQkvLyBGb3IgdHlwZXMgd2l0aCBwcm9wYWdhdGluZyBhZGFwdGVycywgaXQncyBpbXBvcnRhbnQKLQkJLy8gdGhhdCB0aGUgcHJvcGFnYXRpbmcgYWRhcHRlciBiZSBpbiBwbGFjZSBiZWZvcmUgdGhlIGNvbnRlbnRzCi0JCS8vIGFyZSBzZXQuCi0JCXByZUxvYWRBZGFwdChtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vCi0JCWluaXRFbWJlZGRlZFR5cGUobW9kZWwpOwotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBjbG9uaW5nIG1vZGVscy4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbmV3TW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBvbGRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQubmV3SW5zdGFuY2UoKTsKLQkJbmV3TW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vIE5PVEU6IHdlIERPIE5PVCBzaW1wbHkgYWRkIHRoZSBzdGFuZGFyZCBvbmVzIHRvIHRoZSBuZXcgbW9kZWwKLQkJLy8gYWRkRmFjdG9yaWVzKG5ld01vZGVsLCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkpOwotCQkvLyBOb3csIHdlIHRha2UgdGhlIG9wcG9ydHVuaXR5IHRvIGFkZCBGYWN0b3JpZXMgZnJvbSB0aGUgb2xkTW9kZWwncwotCQkvLyByZWdpc3RyeSB0byB0aGUgbmV3IG1vZGVsJ3MgcmVnaXN0cnkgLi4gaWYgdGhleSBkbyBub3QgYWxyZWFkeQotCQkvLyBleGlzdCB0aGVyZS4KLQkJZHVwbGljYXRlRmFjdG9yeVJlZ2lzdHJ5KG5ld01vZGVsLCBvbGRNb2RlbCk7Ci0JCWlmIChuZXdNb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSB7Ci0JCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBuZXdNb2RlbCkuc2V0Q29udGVudFR5cGVJZGVudGlmaWVyKG9sZE1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJfQotCQkvL2FkZEZhY3RvcmllcyhuZXdNb2RlbCwgb2xkTW9kZWwpOwotCQlpbml0RW1iZWRkZWRUeXBlKG9sZE1vZGVsLCBuZXdNb2RlbCk7Ci0JCS8vIEZvciB0eXBlcyB3aXRoIHByb3BhZ2F0aW5nIGFkYXB0ZXJzLCBpdHMgaW1wb3J0YW50Ci0JCS8vIHRoYXQgdGhlIHByb3BhZ2F0aW5nIGFkYXB0ZXIgYmUgaW4gcGxhY2UgYmVmb3JlIHRoZSBjb250ZW50cwotCQkvLyBhcmUgc2V0LgotCQlwcmVMb2FkQWRhcHQobmV3TW9kZWwpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGR1cGxpY2F0ZUZhY3RvcnlSZWdpc3RyeShJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsKSB7Ci0JCUxpc3Qgb2xkQWRhcHRlckZhY3RvcmllcyA9IG9sZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcmllcygpOwotCQlMaXN0IG5ld0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIG9sZExpc3RJdGVyYXRvciA9IG9sZEFkYXB0ZXJGYWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG9sZExpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IG9sZEFkYXB0ZXJGYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBvbGRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJLy8gbm93ICJjbG9uZSIgdGhlIGFkYXB0ZXJmYWN0b3J5Ci0JCQluZXdBZGFwdGVyRmFjdG9yaWVzLmFkZChvbGRBZGFwdGVyRmFjdG9yeS5jb3B5KCkpOwotCQl9Ci0JCS8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlICJjbG9uZWQiIGxpc3QsIGFkZCB0byBuZXcgbW9kZWwKLQkJYWRkRmFjdG9yaWVzKG5ld01vZGVsLCBuZXdBZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aG9zZSBmYWN0b3JpZXMgd2hpY2ggbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUKLQkgKiBzdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQkvLyBhYnN0cmFjdCBtZXRob2QgcmV0dXJucyBub25lCi0JCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQotCS8qKgotCSAqIE1ldGhvZCBpbml0RW1iZWRkZWRUeXBlLiBOb3RoaW5nIHRvIGRvIGhlcmUgaW4gc3VwZXIgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUuIE5vdGhpbmcgdG8gZG8gaGVyZSBpbiBzdXBlciBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTW9kZWwKLQkgKiBAcGFyYW0gbmV3TW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQllbHNlCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlKTsKLQotCQkvLyBUT0RPOiBuZWVkIHRvIHN0cmFpZ2h0ZW4gb3V0IElFbmNvZGVkRG9jdW1lbnQgbWVzcwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXRyYW5zZm9ybUluc3RhbmNlKG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCAoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJZWxzZQotCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0KHN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0KLQkJLy8gb3JpZ2luYWwgaGFjawotCQkvL21vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8oKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuZmlyZU5ld0RvY3VtZW50KHRoaXMpOwotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJLy90ZWNobmljcSBvZiBmdXR1cmUKLQkJLy9tb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkvLyBub3RlIHdlIGRvbid0IG9wZW4gdGhlIHN0cmVhbSwgc28gd2UgZG9uJ3QgY2xvc2UgaXQKLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBhc3N1bWUncyBtb2RlbCBoYXMgYmVlbiBpbml0aWFsaXplZCBhbHJlYWR5IHdpdGggYmFzZSBsb2NhdGlvbgotCQkJc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCksIGlucHV0U3RyZWFtLCBlbmNvZGluZ1J1bGUpOwotCQkJLy8gVE9ETzogbW9kZWwncyBub3QgZGVzaWduZWQgZm9yIHRoaXMhCi0JCQkvLyB3ZSB3YW50IHRvIG1vdmUgdG8gdGhpcyAic2V0IiBtZXRob2QsIGJ1dCB0aGUgJ2ZpcmUnIHdhcyBuZWVkZWQKLQkJCS8vIGFzCi0JCQkvLyBhIHdvcmsgYXJvdW5kIGZvciBzdHJ1Y3V0cmVkTW9kZWwgbm90IGhhbmRsaW5nICdzZXQnIHJpZ2h0LCBidXQKLQkJCS8vIHRoYXQgJ2ZpcmVOZXdEb2N1bWVudCcgbWV0aG9kIHdhcyBjYXVzaW5nIHVuYmFsYW5jZQotCQkJLy8gImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIKLQkJCS8vIGV2ZW50cy4KLQkJCS8vCQkJbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCS8vCQkJKChJU3RydWN0dXJlZERvY3VtZW50KQotCQkJLy8gc3RydWN0dXJlZERvY3VtZW50KS5maXJlTmV3RG9jdW1lbnQodGhpcyk7Ci0JCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXQoc3RydWN0dXJlZERvY3VtZW50LmdldCgpKTsKLQotCQl9Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCi0JfQotCi0JLyoqCi0JICogZGVwcmVjYXRlZCAtLSB1c2UgRW5jb2RpbmdSdWxlIGZvcm0KLQkgKi8KLQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIGVuY29kaW5nTmFtZSwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZSB3ZSBkb24ndCBvcGVuIHRoZSBzdHJlYW0sIHNvIHdlIGRvbid0IGNsb3NlIGl0Ci0JCS8vIFRFTVAgd29yayBhcm91bmQgdG8gbWFpbnRhaW4gcHJldmlvdXMgZnVuY3Rpb24sCi0JCS8vIHVudGlsIGV2ZXJ5b25lIGNhbiBjaGFuZ2UgdG8gRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQKLQkJaWYgKGVuY29kaW5nTmFtZSAhPSBudWxsICYmIGVuY29kaW5nTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJLy8gcmVkaXJlY3QgdG8gbmV3IG1ldGhvZAotCQkJbG9hZChpbnB1dFN0cmVhbSwgbW9kZWwsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJfSBlbHNlIHsKLQkJCWxvYWQoaW5wdXRTdHJlYW0sIG1vZGVsLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyBqdW5rLCBTdHJpbmcgZHVtbXkpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotCQlsb25nIG1lbW9yeVVzZWQgPSAwOwotCQlpZiAoREVCVUcpIHsKLQkJCW1lbW9yeVVzZWQgPSBjb21wdXRlTWVtKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1lYXN1cmluZyBoZWFwIG1lbW9yeSBmb3IgIiArIGZpbGVuYW1lKTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJoZWFwIG1lbW9yeSB1c2VkIGJlZm9yZSBsb2FkOiAiICsKLQkJCS8vIG1lbW9yeVVzZWQpOwotCQl9Ci0KLQkJLy8gZHVyaW5nIGFuIGluaXRpYWwgbG9hZCwgd2UgZXhwZWN0IHRoZSBvbGRkb2N1bWVudCB0byBiZSBlbXB0eQotCQkvLyBkdXJpbmcgcmUtbG9hZCwgaG93ZXZlciwgaXQgd291bGQgYmUgZnVsbC4KLQkJSUVuY29kZWREb2N1bWVudCBuZXdzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCQlJRW5jb2RlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCS8vIGdldCBuZXcgZG9jdW1lbnQKLQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCW5ld3N0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCX0gZWxzZSB7Ci0JCQluZXdzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlbmFtZSwgaW5wdXRTdHJlYW0pOwotCQl9Ci0JCWlmIChERUJVRykgewotCQkJbG9uZyBtZW1vcnlBdEVuZCA9IGNvbXB1dGVNZW0oKTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJoZWFwIG1lbW9yeSB1c2VkIGFmdGVyIGxvYWRpbmcgbmV3Ci0JCQkvLyBkb2N1bWVudDogIiArIG1lbW9yeUF0RW5kKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIGhlYXAgbWVtb3J5IGltcGxpZWQgdXNlZCBieSBkb2N1bWVudDogIiArIChtZW1vcnlBdEVuZCAtIG1lbW9yeVVzZWQpKTsKLQkJfQotCi0KLQkJLy8gVE9ETzogbmVlZCB0byBzdHJhaWdodGVuIG91dCBJRW5jb2RlZERvY3VtZW50IG1lc3MKLQkJaWYgKG5ld3N0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCXRyYW5zZm9ybUluc3RhbmNlKChJU3RydWN0dXJlZERvY3VtZW50KSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQsIChJU3RydWN0dXJlZERvY3VtZW50KSBuZXdzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9IGVsc2UgewotCQkJLy8gd2UgZG9uJ3QgcmVhbGx5IGV4cGVjdCB0aGlzIGNhc2UsIGp1c3QgaW5jbHVkZWQgZm9yIHNhZmV0eQotCQkJb2xkU3RydWN0dXJlZERvY3VtZW50LnNldChuZXdzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KCkpOwotCQl9Ci0JCS8vIG9yaWdpbmFsIGhhY2sKLQkJLy9tb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vKChJU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLmZpcmVOZXdEb2N1bWVudCh0aGlzKTsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCS8vdGVjaG5pY3Egb2YgZnV0dXJlCi0JCS8vbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvL2RvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQlpZiAoREVCVUcpIHsKLQkJCWxvbmcgbWVtb3J5QXRFbmQgPSBjb21wdXRlTWVtKCk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiaGVhcCBtZW1vcnkgdXNlZCBhZnRlciBzZXR0aW5nIHRvIG1vZGVsOiAiCi0JCQkvLyArIG1lbW9yeUF0RW5kKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIGhlYXAgbWVtb3J5IGltcGxpZWQgdXNlZCBieSBkb2N1bWVudCBhbmQgbW9kZWw6ICIgKyAobWVtb3J5QXRFbmQgLSBtZW1vcnlVc2VkKSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlcXVpcmVkIGJ5IGludGVyZmFjZSwgYmVpbmcgZGVjbGFyZWQgaGVyZSBhYnN0cmFjdGx5IGp1c3QgYXMgYW5vdGhlcgotCSAqIHJlbWluZGVyLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCk7Ci0KLQkvKioKLQkgKiBUaGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVyZSBpbiBhYnN0cmFjdCBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIGFkYXB0ZXJzLgotCSAqIFN1YmNsYXNzZXMgY2FuIGFuZCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHByb3ZpZGUgcHJvcGVyCi0JICogaW50aWFsaXphdGlvbiAoRm9yIGV4YW1wbGUsIHRvIGdldCBET00gZG9jdW1lbnQgYW5kICdnZXRBZGFwdGVyJyBvbiBpdCwKLQkgKiBzbyB0aGF0IHRoZSBmaXJzdCBub2RlL25vdGlmaWVyIGhhcyB0aGUgYWRhcHRlciBvbiBpdC4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQotCX0KLQotCS8qKgotCSAqIE5vcm1hbGx5LCBoZXJlIGluIHRoZSBhYnN0YWN0IGNsYXNzLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8sIGJ1dCB3ZSB3aWxsCi0JICogcmVzZXQgdGV4dCwgc2luY2UgdGhpcyBNSUdIVCBlbmQgdXAgYmVpbmcgY2FsbGVkIHRvIHJlY292ZXIgZnJvbSBlcnJvcgotCSAqIGNvbmRpdGlvbnMgKGUuZy4gSVN0cnVjdHVyZWREb2N1bWVudCBleGNlcHRpb25zKSBBbmQsIGNhbiBiZSBjYWxsZWQgYnkKLQkgKiBzdWJjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCS8vIE5vdGU6IHRoZSAibWluaW11bWl6YXRpb24iIHJvdXRpbmVzCi0JCS8vIG9mICdyZXBsYWNlVGV4dCcgYWxsb3cgbWFueSBvbGQgbm9kZXMgdG8gcGFzcyB0aHJvdWdoLCB3aGVuCi0JCS8vIHJlYWxseSBpdHMgYXNzdW1lZCB0aGV5IGFyZSBjcmVhdGVkIGFuZXcuCi0JCS8vIHNvIHdlIG5lZWQgdG8gdXNlICdzZXRUZXh0JyAoSSB0aGluayAic2V0VGV4dCcgZW5kcyB1cAotCQkvLyB0aHJvd2luZyBhICduZXdNb2RlbCcgZXZlbnQgdGhvdWdoLCB0aGF0IG1heSBoYXZlIHNvbWUKLQkJLy8gaW1wbGljYXRpb25zLgotCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXRUZXh0KHRoaXMsIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhLCBhbmQgcmVwb3B1bGF0ZXMgdGhlIG1vZGVscwotCSAqIC4uLiBieSBhIGNhbGwgdG8gc2V0VGV4dCBvbiB0aGUgc3RydWN0dXJlZERvY3VtZW50LiBUaGlzIG1ldGhvZCBpcwotCSAqIG5lZWRlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGNsaWVudHMgYXJlIHNoYXJpbmcgYSBtb2RlbCBhbmQgdGhlbiBjaGFuZ2VzCi0JICogY2FuY2VsZWQuIFNheSBmb3IgZXhhbXBsZSwgb25lIGVkaXRvciBhbmQgc2V2ZXJhbCAiZGlzcGxheXMiIGFyZQotCSAqIHNoYXJpbmcgYSBtb2RlbCwgaWYgdGhlIGVkaXRvciBpcyBjbG9zZWQgd2l0aG91dCBzYXZpbmcgY2hhbmdlcywgdGhlbgotCSAqIHRoZSBkaXNwbGF5cyBzdGlsbCBuZWVkIGEgbW9kZWwsIGJ1dCB0aGV5IHNob3VsZCByZXZlcnQgdG8gdGhlIG9yaWdpbmFsCi0JICogdW5zYXZlZCB2ZXJzaW9uLgotCSAqLwotCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQl0cnkgewotCQkJLy8gdGVtcCBzb2x1dGlvbiAuLi4gd2Ugc2hvdWxkIGJlIGFibGUgdG8gZG8gYmV0dGVyIChtb3JlCi0JCQkvLyBlZmZpY2llbnQpIGluIGZ1dHVyZS4KLQkJCS8vIEFkYXB0ZXJzIHdpbGwgKHByb2JhYmx5KSBuZWVkIHRvIGJlIHNlbnNpdGl2ZSB0byB0aGUgZmFjdCB0aGF0Ci0JCQkvLyB0aGUgZG9jdW1lbnQgaW5zdGFuY2UgY2hhbmdlZAotCQkJLy8gKGJ5IGJlaW5nIGxpZmUgY3ljbGUgbGlzdGVuZXJzKQotCQkJbG9hZChpbnB1dFN0cmVhbSwgc3RydWN0dXJlZE1vZGVsLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0KLQkJCS8vCQkJLy8gTm90ZTogd2UgYXBwYXJlbnRseSByZWFkIHRoZSBkYXRhIChhbmQgZW5jb2RpbmcpIGNvcnJlY3RseQotCQkJLy8JCQkvLyBiZWZvcmUsIHdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgd2UgZm9sbG93ZWQgdGhlIHNhbWUgcnVsZQotCQkJLy8gYXMKLQkJCS8vCQkJLy8gYmVmb3JlLgotCQkJLy8JCQlFbmNvZGluZ01lbWVudG8gcHJldmlvdXNNZW1lbnRvID0KLQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJCS8vCQkJRW5jb2RpbmdSdWxlIHByZXZpb3VzUnVsZSA9IHByZXZpb3VzTWVtZW50by5nZXRFbmNvZGluZ1J1bGUoKTsKLQkJCS8vCQkJLy9JRmlsZSBmaWxlID0gUmVzb3VyY2VVdGlsLmdldEZpbGVGb3Ioc3RydWN0dXJlZE1vZGVsKTsKLQkJCS8vCQkJLy8gTm90ZTogdGhlcmUncyBvcHBvcnR1bml0eSBoZXJlIGZvciBzb21lIG9kZCBiZWhhdmlvciwgaWYgdGhlCi0JCQkvLwkJCS8vIHNldHRpbmdzIGhhdmUgY2hhbmdlZCBmcm9tIHRoZSBmaXJzdCBsb2FkIHRvIHRoZSByZWxvYWQuCi0JCQkvLyBCdXQsCi0JCQkvLwkJCS8vIGhvcGVmdWxseSwKLQkJCS8vCQkJLy8gd2lsbCByZXN1bHQgaW4gdGhlIGludGVuZGVkIGJlaGF2aW9yLgotCQkJLy8JCQlSZWFkZXIgYWxsVGV4dFJlYWRlciA9Ci0JCQkvLyBnZXREb2N1bWVudExvYWRlcigpLnJlYWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgcHJldmlvdXNSdWxlKTsKLQkJCS8vCi0JCQkvLwkJCS8vIFRPRE86IGF2b2lkIHVzZSBvZiBTdHJpbmcgaW5zdGFuY2UKLQkJCS8vCQkJZ2V0RG9jdW1lbnRMb2FkZXIoKS5yZWxvYWQoc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLAotCQkJLy8gYWxsVGV4dFJlYWRlcik7Ci0JCQkvLwkJCS8vIGFuZCBub3cgInJlc2V0IiBlbmNvZGluZyBtZW1lbnRvIHRvIGtlZXAgaXQgY3VycmVudCB3aXRoIHRoZQotCQkJLy8JCQkvLyBvbmUKLQkJCS8vCQkJLy8gdGhhdCB3YXMganVzdCBkZXRlcm1pbmVkLgotCQkJLy8JCQlzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0RW5jb2RpbmdNZW1lbnRvKGdldERvY3VtZW50TG9hZGVyKCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCkpOwotCQkJLy8JCQlzdHJ1Y3R1cmVkTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQkvLwkJCVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01nciA9Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCS8vCQkJaWYgKHVuZG9NZ3IgIT0gbnVsbCkgewotCQkJLy8JCQkJdW5kb01nci5yZXNldCgpOwotCQkJLy8JCQl9Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gY291bGRuJ3QgaGFwcGVuLiBUaGUgcHJvZ3JhbSBoYXMgYXBwYXJlbnRseQotCQkJLy8gcmVhZCB0aGUgbW9kZWwgb25jZSwgYW5kIHRoZXJlJ2QgYmUgbm8gcmVhc29uIHRoZSBlbmNvZGluZwotCQkJLy8gY291bGQgbm90IGJlIHVzZWQgYWdhaW4uCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJXYXJuaW5nOiAgWE1MTG9hZGVyOjpyZWxvYWQuICBUaGlzIGV4Y2VwdGlvbiByZWFsbHkgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkISEgQnV0IHdpbGwgYXR0ZW1wIHRvIGNvbnRpbnVlIGFmdGVyIGR1bXBpbmcgc3RhY2sgdHJhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEVycm9yKCJQcm9ncmFtIEVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gY291bGRuJ3QgaGFwcGVuLiBUaGUgcHJvZ3JhbSBoYXMgYXBwYXJlbnRseQotCQkJLy8gcmVhZCB0aGUgbW9kZWwgb25jZSwgYW5kIHRoZXJlJ2QgYmUgbm8gKGNvbW1vbikgcmVhc29uIGl0Ci0JCQkvLyBjb3VsZG4ndCBiZSBsb2FkZWQgYWdhaW4uCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJXYXJuaW5nOiAgWE1MTG9hZGVyOjpyZWxvYWQuICBUaGlzIGV4Y2VwdGlvbiByZWFsbHkgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkISEgQnV0IHdpbGwgYXR0ZW1wIHRvIGNvbnRpbnVlIGFmdGVyIGR1bXBpbmcgc3RhY2sgdHJhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEVycm9yKCJQcm9ncmFtIEVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIHRoaXMgd29yayBpcyBkb25lIGJldHRlciBlbHNld2hlcmUsIGJ1dCBkb25lIGhlcmUgZm9yIHRoaXMgdmVyc2lvbiB0bwotCSAqIHJlZHVjZSBjaGFuZ2VzLiBlc3BlY2lhbGx5IHNpbmNlIHRoZSBuZWVkIGZvciBpdCBzaG91bGQgZ28gYXdheSBvbmNlIHdlCi0JICogbm8gbG9uZ2VyIG5lZWQgdG8gcmUtdXNlIG9sZCBkb2N1bWVudCBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNmb3JtSW5zdGFuY2UoSVN0cnVjdHVyZWREb2N1bWVudCBvbGRJbnN0YW5jZSwgSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSkgewotCQkvKioKLQkJICogaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MjAKLQkJICogCi0JCSAqIEpTUCB0YWdsaWIgc3VwcG9ydCBicm9rZW4sIGNvcnJlY3QgYnkgZHVwbGljYXRpbmcgZXh0ZW5kZWQgc2V0dXAKLQkJICogaW5mb3JtYXRpb24gKEJsb2NrVGFnUGFyc2VyIGV4dGVuc2lvbiwKLQkJICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGV4dGVuc2lvbnMpCi0JCSAqLwotCQlSZWdpb25QYXJzZXIgb2xkUGFyc2VyID0gb2xkSW5zdGFuY2UuZ2V0UGFyc2VyKCk7Ci0JCVJlZ2lvblBhcnNlciBuZXdQYXJzZXIgPSBuZXdJbnN0YW5jZS5nZXRQYXJzZXIoKS5uZXdJbnN0YW5jZSgpOwotCQkvLyBSZWdpc3RlciBhbGwgb2YgdGhlIG9sZCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyBvbiB0aGUgbmV3Ci0JCS8vIHBhcnNlcgotCQlpZiAob2xkUGFyc2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uICYmIG5ld1BhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbikgewotCQkJTGlzdCBvbGRIYW5kbGVycyA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uKSBvbGRQYXJzZXIpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKSBvbGRIYW5kbGVycy5nZXQoaSkpOwotCQkJCWlmIChoYW5kbGVyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbikgewotCQkJCQkvKioKLQkJCQkJICogU2tpcCB0aGUgdHJhbnNmZXJyaW5nIGhlcmUsIHRoZSBoYW5kbGVyIHdpbGwgZG8gdGhpcwotCQkJCQkgKiBhZnRlciBldmVyeXRoaW5nIGVsc2UgYnV0IHRoZSBzb3VyY2UgaXMgdHJhbnNmZXJyZWQuCi0JCQkJCSAqLwotCQkJCX0gZWxzZSB7Ci0JCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBvbGRQYXJzZXIpLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoaGFuZGxlcik7Ci0JCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBuZXdQYXJzZXIpLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoaGFuZGxlcik7Ci0JCQkJCWhhbmRsZXIucmVzZXROb2RlcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBBZGQgYW55IGdsb2JhbCBCbG9ja01hcmtlcnMgdG8gdGhlIG5ldyBwYXJzZXIKLQkJaWYgKG9sZFBhcnNlciBpbnN0YW5jZW9mIEJsb2NrVGFnUGFyc2VyICYmIG5ld1BhcnNlciBpbnN0YW5jZW9mIEJsb2NrVGFnUGFyc2VyKSB7Ci0JCQlMaXN0IG9sZEJsb2NrTWFya2VycyA9ICgoQmxvY2tUYWdQYXJzZXIpIG9sZFBhcnNlcikuZ2V0QmxvY2tNYXJrZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKChCbG9ja01hcmtlcikgb2xkQmxvY2tNYXJrZXJzLmdldChpKSk7Ci0JCQkJaWYgKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpIHsKLQkJCQkJKChCbG9ja1RhZ1BhcnNlcikgbmV3UGFyc2VyKS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgb2xkSW5zdGFuY2UpLnNldFBhcnNlcihuZXdQYXJzZXIpOwotCi0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIG9sZEluc3RhbmNlKS5zZXRSZVBhcnNlcihuZXdJbnN0YW5jZS5nZXRSZVBhcnNlcigpLm5ld0luc3RhbmNlKCkpOwotCQkKLQkJaWYgKG5ld0luc3RhbmNlLmdldERvY3VtZW50UGFydGl0aW9uZXIoKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIHsKLQkJCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBudWxsOwotCQkJaWYgKG9sZEluc3RhbmNlIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMyAmJiBuZXdJbnN0YW5jZSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCQlwYXJ0aXRpb25lciA9ICgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgKChJRG9jdW1lbnRFeHRlbnNpb24zKSBuZXdJbnN0YW5jZSkuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJU3RydWN0dXJlZERvY3VtZW50LkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcpKTsKLQkJCQlpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkgewotCQkJCQlwYXJ0aXRpb25lciA9IChTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSBwYXJ0aXRpb25lci5uZXdJbnN0YW5jZSgpOwotCQkJCX0KLQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbjMpIG9sZEluc3RhbmNlKS5zZXREb2N1bWVudFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnQuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgcGFydGl0aW9uZXIpOwotCQkJfQotCQkJaWYgKHBhcnRpdGlvbmVyID09IG51bGwpIHsKLQkJCQlwYXJ0aXRpb25lciA9IChTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSAoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIG5ld0luc3RhbmNlLmdldERvY3VtZW50UGFydGl0aW9uZXIoKSkubmV3SW5zdGFuY2UoKTsKLQkJCQlvbGRJbnN0YW5jZS5zZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmVyKTsKLQkJCX0KLQkJCWlmIChwYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQkJcGFydGl0aW9uZXIuY29ubmVjdChvbGRJbnN0YW5jZSk7Ci0JCQl9Ci0JCX0KLQotCQlvbGRJbnN0YW5jZS5zZXRMaW5lRGVsaW1pdGVyKG5ld0luc3RhbmNlLmdldExpbmVEZWxpbWl0ZXIoKSk7Ci0JCWlmIChuZXdJbnN0YW5jZS5nZXRFbmNvZGluZ01lbWVudG8oKSAhPSBudWxsKSB7Ci0JCQlvbGRJbnN0YW5jZS5zZXRFbmNvZGluZ01lbWVudG8oKEVuY29kaW5nTWVtZW50bykgbmV3SW5zdGFuY2UuZ2V0RW5jb2RpbmdNZW1lbnRvKCkuY2xvbmUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MjAKLQkJICogCi0JCSAqIEpTUCB0YWdsaWIgc3VwcG9ydCBicm9rZW4sIGNvcnJlY3QgYnkgZHVwbGljYXRpbmcgZXh0ZW5kZWQgc2V0dXAKLQkJICogaW5mb3JtYXRpb24gKEJsb2NrVGFnUGFyc2VyIGV4dGVuc2lvbiwKLQkJICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGV4dGVuc2lvbnMpCi0JCSAqLwotCQlpZiAob2xkUGFyc2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uICYmIG5ld1BhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbikgewotCQkJTGlzdCBvbGRIYW5kbGVycyA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uKSBvbGRQYXJzZXIpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKSBvbGRIYW5kbGVycy5nZXQoaSkpOwotCQkJCWlmIChoYW5kbGVyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbikgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uIGhhbmRsZXJFeHRlbnNpb24gPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbikgaGFuZGxlcjsKLQkJCQkJaGFuZGxlckV4dGVuc2lvbi5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQob2xkSW5zdGFuY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgaG9sZFN0cmluZyA9IG5ld0luc3RhbmNlLmdldCgpOwotCQluZXdJbnN0YW5jZSA9IG51bGw7Ci0JCW9sZEluc3RhbmNlLnNldChob2xkU3RyaW5nKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvQWJzdHJhY3ROb3RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9BYnN0cmFjdE5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTY5MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9BYnN0cmFjdE5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLQotLyoqCi0gKiBBYnN0cmFjdE5vdGlmaWVyIGlzIHNpbWlsYXIgdG8gKGFuZCBiYXNlZCBvbikgdGhlIEVNRiBOb3RpZmllckltcGwgY2xhc3MuCi0gKiBUaGlzIGNsYXNzIGlzIHNpbXBsZXIgKHRoYXQgaXMsIG5vdCBhcyBtYW55IGZ1bmN0aW9ucykuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vdGlmaWVyIGltcGxlbWVudHMgSU5vZGVOb3RpZmllciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z0FkYXB0ZXJOb3RpZmljYXRpb25UaW1lID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IGdyb3d0aENvbnN0YW50ID0gMzsKLQlwcml2YXRlIGludCBhZGFwdGVyQ291bnQgPSAwOwotCi0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXJbXSBmQWRhcHRlcnM7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdE5vdGlmaWVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0Tm90aWZpZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYWRkQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlcikgewotCi0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVuc3VyZUNhcGFjaXR5KGFkYXB0ZXJDb3VudCArIDEpOwotCQlmQWRhcHRlcnNbYWRhcHRlckNvdW50KytdID0gYWRhcHRlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IG5lZWRlZCkgewotCQlpZiAoZkFkYXB0ZXJzID09IG51bGwpIHsKLQkJCS8vIGZpcnN0IHRpbWUKLQkJCWZBZGFwdGVycyA9IG5ldyBJTm9kZUFkYXB0ZXJbbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBvbGRMZW5ndGggPSBmQWRhcHRlcnMubGVuZ3RoOwotCQlpZiAob2xkTGVuZ3RoIDwgbmVlZGVkKSB7Ci0JCQlJTm9kZUFkYXB0ZXJbXSBvbGRBZGFwdGVycyA9IGZBZGFwdGVyczsKLQkJCUlOb2RlQWRhcHRlcltdIG5ld0FkYXB0ZXJzID0gbmV3IElOb2RlQWRhcHRlcltuZWVkZWQgKyBncm93dGhDb25zdGFudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEFkYXB0ZXJzLCAwLCBuZXdBZGFwdGVycywgMCwgYWRhcHRlckNvdW50KTsKLQkJCWZBZGFwdGVycyA9IG5ld0FkYXB0ZXJzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWRhcHRlckNvdW50LiBFcXVpdmlsZW50IHRvLCBidXQgZmFzdGVyIHRoYW4sCi0JICogZ2V0QWRhcHRlcnMoKS5zaXplKCk7Ci0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFkYXB0ZXJDb3VudCgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGJlaGF2aW9yIGZvciBnZXR0aW5nIGFuIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBnZXRBZGFwdGVyRm9yKE9iamVjdCB0eXBlKSB7Ci0JCS8vIGZpcnN0LCB3ZSdsbCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIG9uZQotCQlJTm9kZUFkYXB0ZXIgcmVzdWx0ID0gZ2V0RXhpc3RpbmdBZGFwdGVyKHR5cGUpOwotCQkvLyBpZiB3ZSBkaWRuJ3QgZmluZCBvbmUgaW4gb3VyIGxpc3QgYWxyZWFkeSwKLQkJLy8gbGV0J3MgY3JlYXRlIGl0Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJSUZhY3RvcnlSZWdpc3RyeSByZWcgPSBnZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSByZWcuZ2V0RmFjdG9yeUZvcih0eXBlKTsKLQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGZhY3RvcnkuYWRhcHQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJLy8gV2Ugd29uJ3QgcHJldmVudCBudWxsIGZyb20gYmVpbmcgcmV0dXJuZWQsIGJ1dCBpdCB3b3VsZCBiZQotCQkJLy8gdW51c3VhbC4KLQkJCS8vIEl0IG1pZ2h0IGJlIGJlY2F1c2UgRmFjdG9yeSBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHksIG9yCi0JCQkvLyBub3QgaW5zdGFsbGVkLCBzbyB3ZSdsbCBhbGxvdyB3YXJuaW5nIG1lc3NhZ2UuCi0JCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWcuZGlzcGxheVdhcm5pbmdzKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogbm8gYWRhcHRlciB3YXMgZm91bmQgb3IgY3JlYXRlZCBmb3IgIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjbG9uZSBvZiBsaXN0LCBzaW5jZSBjbGllbnRzIHNob3VsZCBub3QgbWFuaXB1bGF0ZQotCSAqIG91ciBsaXN0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCB1c2UgYWRkL3JlbW92ZUFkYXB0ZXIuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRhcHRlcnMoKSB7Ci0JCWlmIChmQWRhcHRlcnMgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXJDb3VudCA9PSAwKSB7Ci0JCQkJZkFkYXB0ZXJzID0gbnVsbDsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2UgbmVlZCB0byBtYWtlIGEgbmV3IGFycmF5LCB0byBiZSBzdXJlCi0JCQkJLy8gaXQgZG9lc24ndCBjb250YWluIG51bGxzIGF0IGVuZCwgd2hpY2ggbWF5IGJlCi0JCQkJLy8gcHJlc2VudCB0aGVyZSBmb3IgImdyb3d0aCIuCi0JCQkJSU5vZGVBZGFwdGVyW10gdGVtcEFkYXB0ZXJzID0gbmV3IElOb2RlQWRhcHRlclthZGFwdGVyQ291bnRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZkFkYXB0ZXJzLCAwLCB0ZW1wQWRhcHRlcnMsIDAsIGFkYXB0ZXJDb3VudCk7Ci0JCQkJLy8gRU1GIHVzZXMgdGhlIHVubW9kaWZpYWJsZUNvbGxlY3Rpb24uIEl0cyBhIGJpdCBvZiBhCi0JCQkJLy8gcGVyZm9ybWFuY2UKLQkJCQkvLyBkcmFpbiwgYnV0IG1heSB3YW50IHRvIGxlYXZlIGluIHNpbmNlCi0JCQkJLy8gaXQgd291bGQgImZhaWwgZmFzdCIgaWYgc29tZW9uZSB3YXMgdHJ5aW5nIHRvIG1vZGlmeSB0aGUKLQkJCQkvLyBsaXN0LgotCQkJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKEFycmF5cy5hc0xpc3QodGVtcEFkYXB0ZXJzKSk7Ci0JCQkJLy9yZXR1cm4gQXJyYXlzLmFzTGlzdChuZXdBZGFwdGVycyk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEoKSB7Ci0JCS8vIHRvICJyZS1nZXQiIHRoZSBwcm9wZXJ0eSBlYWNoIHRpbWUgaXMgYSBsaXR0bGUgYXdrd2FyZCwgYnV0IHdlCi0JCS8vIGRvIGl0IHRoYXQgd2F5IHRvIGF2b2lkIGFkZGluZyBpbnN0YW5jZSB2YXJpYWJsZSBqdXN0IGZvcgotCQkvLyBkZWJ1Z2dpbmcuCi0JCS8vIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBkZWJ1Z0FkYXB0ZXJOb3RpZmNhdGlvblRpbWUKLQkJLy8gaXMgdHJ1ZS4KLQkJZmluYWwgU3RyaW5nIGNyaXRlcmlhU3RyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZS9jcml0ZXJpYSIpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgY3JpdGVyaWEgPSAtMTsKLQkJaWYgKGNyaXRlcmlhU3RyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY3JpdGVyaWEgPSBMb25nLnBhcnNlTG9uZyhjcml0ZXJpYVN0cik7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCS8vIGNhdGNoIHRvIGJlIHN1cmUgd2UgZG9uJ3QgYnVyYiBpbiBub3RpZmljYXRpb24gbG9vcCwKLQkJCQkvLyBidXQgaWdub3JlLCBzaW5jZSBqdXN0IGEgZGVidWcgYWlkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyaXRlcmlhOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgZ2V0RXhpc3RpbmdBZGFwdGVyKE9iamVjdCB0eXBlKSB7Ci0JCUlOb2RlQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJDb3VudDsgaSsrKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYSA9IGZBZGFwdGVyc1tpXTsKLQkJCWlmIChhLmlzQWRhcHRlckZvclR5cGUodHlwZSkpIHsKLQkJCQlyZXN1bHQgPSBhOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSBpbiBvdXIgbGlzdCwKLQkJLy8gcmV0dXJuIHRoZSBudWxsIHJlc3VsdAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyBJRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JcHVibGljIHZvaWQgbm90aWZ5KGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQotCQlpZiAoZkFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCWludCBsb2NhbEFkYXB0ZXJDb3VudCA9IDA7Ci0JCQlJTm9kZUFkYXB0ZXJbXSBsb2NhbEFkYXB0ZXJzID0gbnVsbDsKLQotCQkJLy8gbG9jayBvYmplY3Qgd2hpbGUgbWFraW5nIGxvY2FsIGFzc2lnbm1lbnRzCi0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlsb2NhbEFkYXB0ZXJDb3VudCA9IGFkYXB0ZXJDb3VudDsKLQkJCQlsb2NhbEFkYXB0ZXJzID0gbmV3IElOb2RlQWRhcHRlcltsb2NhbEFkYXB0ZXJDb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmQWRhcHRlcnMsIDAsIGxvY2FsQWRhcHRlcnMsIDAsIGxvY2FsQWRhcHRlckNvdW50KTsKLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEFkYXB0ZXJDb3VudDsgaSsrKSB7Ci0JCQkJSU5vZGVBZGFwdGVyIGEgPSBsb2NhbEFkYXB0ZXJzW2ldOwotCi0JCQkJaWYgKGRlYnVnQWRhcHRlck5vdGlmaWNhdGlvblRpbWUpIHsKLQkJCQkJbG9uZyBnZXRBZGFwdGVyVGltZUNyaXRlcmlhID0gZ2V0QWRhcHRlclRpbWVDcml0ZXJpYSgpOwotCQkJCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkvLyAqKiBrZWVwIHRoaXMgbGluZSBpZGVudGljYWwgd2l0aCBub24tZGVidWcgdmVyc2lvbiEhCi0JCQkJCWEubm90aWZ5Q2hhbmdlZCh0aGlzLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCQkJCWxvbmcgbm90aWZ5RHVyYXRpb24gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsKLQkJCQkJaWYgKGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEgPj0gMCAmJiBub3RpZnlEdXJhdGlvbiA+IGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRhcHRlciBub3RpZnlEdXJhdGlvbjogIiArIG5vdGlmeUR1cmF0aW9uICsgIiAgY2xhc3M6ICIgKyBhLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvLyAqKiBrZWVwIHRoaXMgbGluZSBpZGVudGljYWwgd2l0aCBkZWJ1ZyB2ZXJzaW9uISEKLQkJCQkJCWEubm90aWZ5Q2hhbmdlZCh0aGlzLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBJdHMgaW1wb3J0YW50IHRvICJrZWVwIGdvaW5nIiwgc2luY2Ugbm90aWZpY2F0aW9ucwotCQkJCQkJLy8gb2NjdXIgYmV0d2VlbiBhbgotCQkJCQkJLy8gYWJvdXRUb0NoYW5nZSBldmVudCBhbmQgYSBjaGFuZ2VkIGV2ZW50IC0tIHRoZQotCQkJCQkJLy8gY2hhbmdlZCBldmVudCB0eXBpY2FsbHkgYmVpbmcgcmVxdWlyZQotCQkJCQkJLy8gdG8gcmVzdG9yZSBzdGF0ZSwgZXRjLiBTbywgd2UganVzdCBsb2cgbWVzc2FnZSwgZG8KLQkJCQkJCS8vIG5vdCByZS10aHJvdyBpdCwgYnV0Ci0JCQkJCQkvLyB0eXBpY2FsbHkgdGhlIGV4Y2VwdGlvbiBkb2VzIGluZGljYXRlIGEgc2VyaW91cwotCQkJCQkJLy8gcHJvZ3JhbSBlcnJvci4KLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkEgc3RydWN0dXJlZCBtb2RlbCBjbGllbnQsICIgKyBhICsgIiB0aHJldyBmb2xsb3dpbmcgZXhjZXB0aW9uIGR1cmluZyBhZGFwdGVyIG5vdGlmaWNhdGlvbiAoIiArIElOb2RlTm90aWZpZXIuRVZFTlRfVFlQRV9TVFJJTkdTW2V2ZW50VHlwZV0gKyAiICkiLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFkYXB0ZXIoSU5vZGVBZGFwdGVyIGEpIHsKLQkJaWYgKGZBZGFwdGVycyA9PSBudWxsIHx8IGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5ld0luZGV4ID0gMDsKLQkJSU5vZGVBZGFwdGVyW10gbmV3QWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW2ZBZGFwdGVycy5sZW5ndGhdOwotCQlpbnQgb2xkQWRhcHRlckNvdW50ID0gYWRhcHRlckNvdW50OwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IG9sZEluZGV4ID0gMDsgb2xkSW5kZXggPCBvbGRBZGFwdGVyQ291bnQ7IG9sZEluZGV4KyspIHsKLQkJCUlOb2RlQWRhcHRlciBjYW5kaWRhdGUgPSBmQWRhcHRlcnNbb2xkSW5kZXhdOwotCQkJaWYgKGEgPT0gY2FuZGlkYXRlKSB7Ci0JCQkJYWRhcHRlckNvdW50LS07Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfSBlbHNlCi0JCQkJbmV3QWRhcHRlcnNbbmV3SW5kZXgrK10gPSBmQWRhcHRlcnNbb2xkSW5kZXhdOwotCQl9Ci0JCWlmIChmb3VuZCkKLQkJCWZBZGFwdGVycyA9IG5ld0FkYXB0ZXJzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTNiNDY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuVXRpbGl0aWVzOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JY2xhc3MgRGlydHlTdGF0ZVdhdGNoZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJLy8gSSBkb24ndCB0aGluayBpdHMgc2FmZSB0byBhc3N1bWUgYSBuZXcgbW9kZWwKLQkJCS8vIGlzIGFsd2F5cyAiZnJlc2giLCBzbyB3ZSdsbCBsZWF2ZSBkaXJ0eSBzdGF0ZQotCQkJLy8gdW5jaGFuZ2VkOwotCQkJLy8gYnV0IHdlJ2xsIHRlbGwgZXZlcnlvbmUgYWJvdXQgaXQuCi0JCQlzZXREaXJ0eVN0YXRlKGZEaXJ0eVN0YXRlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJLy8gZG9uJ3QgY2hhbmdlIGRpcnR5IHN0YXRlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCXNldERpcnR5U3RhdGUodHJ1ZSk7Ci0JCQkvLyBubyBuZWVkIHRvIGxpc3RlbiBhbnkgbW9yZQotCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCXNldERpcnR5U3RhdGUodHJ1ZSk7Ci0JCQkvLyBubyBuZWVkIHRvIGxpc3RlbiBhbnkgbW9yZQotCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlzZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJLy8gbm8gbmVlZCB0byBsaXN0ZW4gYW55IG1vcmUKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBEb2N1bWVudFRvTW9kZWxOb3RpZmllciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciwgSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyI21vZGVsQWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLkFib3V0VG9CZUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKEFib3V0VG9CZUNoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBJZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBhcmUgYWJvdXQgdG8KLQkJCS8vIGNoYW5nZSBiYXNlZCBvbiBvdXIgdW5kZXJseWluZyBkb2N1bWVudCBjaGFuZ2luZy4KLQkJCS8vIElmIHdlIGRpZCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgd2UsIG9yIGNsaWVudCwgc2hvdWxkIGhhdmUKLQkJCS8vIGFscmVhZHkgY2FsbGVkIGFib3V0VG9DaGFuZ2VNb2RlbC4KLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFNvdXJjZSgpICE9IHRoaXMpIHsKLQkJCQlhYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCX0KLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNuZXdNb2RlbChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBpZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBoYXZlIGNoYW5nZWQKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFNvdXJjZSgpICE9IHRoaXMpIHsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjbm9DaGFuZ2Uob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5Ob0NoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxTb3VyY2UoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25vZGVzUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIGlmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGhhdmUgY2hhbmdlZAotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsU291cmNlKCkgIT0gdGhpcykgewotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIGlmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGhhdmUgY2hhbmdlZAotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsU291cmNlKCkgIT0gdGhpcykgewotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25zUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxTb3VyY2UoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfU1RBVEVfVFJBQ0VfQ0FURUdPUlkgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9zdGF0ZSI7Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfU1RBVEUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihERUJVR19TVEFURV9UUkFDRV9DQVRFR09SWSkpOwotCi0JcHJpdmF0ZSBJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeTsKLQlwcml2YXRlIFN0cmluZyBmQmFzZUxvY2F0aW9uOwotCWJvb2xlYW4gZkRpcnR5U3RhdGU7Ci0JRGlydHlTdGF0ZVdhdGNoZXIgZkRpcnR5U3RhdGVXYXRjaGVyOwotCURvY3VtZW50VG9Nb2RlbE5vdGlmaWVyIGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcjsKLQlwcml2YXRlIFN0cmluZyBmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZklkOwotCi0JcHJpdmF0ZSBMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyIGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyOwotCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgZkxpc3RlbmVyTG9jayA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgSUxvY2sgZkxvY2tPYmplY3Q7Ci0JLy8JcHJpdmF0ZSBTdHJpbmcgZkxpbmVEZWxpbWl0ZXI7Ci0JLy8JcHJpdmF0ZSBPYmplY3QgZlR5cGU7Ci0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGZNb2RlbEhhbmRsZXI7Ci0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGZNb2RlbE1hbmFnZXI7Ci0JcHJpdmF0ZSBpbnQgZk1vZGVsU3RhdGVDaGFuZ2luZzsKLQlwcml2YXRlIE9iamVjdFtdIGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCXByaXZhdGUgYm9vbGVhbiBmTmV3U3RhdGUgPSBmYWxzZTsKLQlwcml2YXRlIFVSSVJlc29sdmVyIGZSZXNvbHZlcjsKLQlJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JLyoqCi0JICogVGhlIHRpbWUgc3RhbXAgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UncyBtb2RpZmljYXRpb24gZGF0ZSwgYXQgdGhlCi0JICogdGltZSB0aGlzIG1vZGVsIHdhcyBjcmVhdGVkLCBvciB0aGUgbGFzdCB0aW1lIGl0IHdhcyBzYXZlZC4gTm90ZTogZm9yCi0JICogdGhpcyB2ZXJzaW9uLCB0aGlzIHZhcmlhYmxlIGlzIG5vdCBzZXQgYXV0b21hdGljYWxseSwgYmUgbmVlZHMgdG8gYmUKLQkgKiBtYW5hZ2VkIGJ5IGNsaWVudC4gVGhlIEZpbGVNb2RlbFByb3ZpZGVyIGRvZXMgdGhpcyBmb3IgbW9zdCBjYXNlcywgYnV0Ci0JICogaWYgY2xpZW50IGRvIG5vdCB1c2UgRmlsZU1vZGVsUHJvdmlkZXIsIHRoZXkgbXVzdCBzZXQgdGhpcyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBsb25nIGZTeW5jaHJvbml6YXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCXByaXZhdGUgYm9vbGVhbiByZWluaXRpYWxpemF0aW9uTmVlZGVkOwotCXByaXZhdGUgT2JqZWN0IHJlaW5pdGlhbGl6ZVN0YXRlRGF0YTsKLQotCS8qKgotCSAqIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKCkgewotCi0JCXN1cGVyKCk7Ci0JCWZEaXJ0eVN0YXRlV2F0Y2hlciA9IG5ldyBEaXJ0eVN0YXRlV2F0Y2hlcigpOwotCQlmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIgPSBuZXcgRG9jdW1lbnRUb01vZGVsTm90aWZpZXIoKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBfY29tbW9uUmVsZWFzZSgpIHsKLQotCQlpZiAoZmFjdG9yeVJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCWZhY3RvcnlSZWdpc3RyeS5yZWxlYXNlKCk7Ci0JCX0KLQkJLy8gaWYgZG9jdW1lbnQgYXMgbm90IGJlZW4gY2hhbmdlZCwgd2UnbGwgc3RpbGwgYmUgbGlzdGVuaW5nIGZvcgotCQkvLyBmaXJzdCBjaGFuZ2UuIFRoaXMgaXMgbm90IGEgY3JpdGljYWwgY2xlYW4gdXAsIHNpbmNlIHByZXN1bWFubHkKLQkJLy8gd2hvbGUgbW9kZWwgYW5kIGRvY3VtZW50IGFyZSAiZ29pbmcgYXdheSIsIGJ1dCBjYW4gbWFrZQotCQkvLyBvdGhlciBtZW1vcnkgbGVha3MgaGFyZGVyIHRvIGZpbmQgaWYgd2Ugc3RheSBhdHRhY2hlZC4KLQkJLy8gKE5vdGU6IG15IGZpcnN0IHRob3VnaHQgd2FzIHRvIHNldCBmU3RydWN0dXJlZERvY3VtZW50IHRvIG51bGwKLQkJLy8gYWxzbywKLQkJLy8gYnV0IHRoZXJlJ3Mgb3RoZXJzIGluIHNodXRkb3duIHByb2Nlc3MgdGhhdCBzdGlsbCBuZWVkIHRvCi0JCS8vIGdldCBpdCwgaW4gb3JkZXIgdG8gZGlzY29ubmVjdCBmcm9tIGl0LikKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRGlydHlTdGF0ZVdhdGNoZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMganVzdCBmb3IgZ2V0dGluZyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgbWFuYWdlciBvZiB0aGUKLQkgKiByaWdodCBJbXBsIHR5cGUsIHRvIGJlIHVzZWQgImludGVybmFsbHkiIGZvciBtYWtpbmcgcHJvdGVjdGVkIGNhbGxzCi0JICogZGlyZWN0bHkgdG8gdGhlIGltcGwgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBNb2RlbE1hbmFnZXJJbXBsIF9nZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCS8vIFRPRE9fZnV0dXJlOiByZWRlc2lnbiBzbyB3ZSBkb24ndCBuZWVkIHRoaXMgJ0ltcGwnIHZlcnNpb24KLQkJaWYgKGZNb2RlbE1hbmFnZXIgPT0gbnVsbCkgewotCQkJZk1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCX0KLQotCQlyZXR1cm4gKE1vZGVsTWFuYWdlckltcGwpIGZNb2RlbE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGNsaWVudHMgdG8gZGVjbGFyZSB0aGF0IHRoZXkgYXJlIGFib3V0IHRvIG1ha2UgYQotCSAqICJsYXJnZSIgY2hhbmdlIHRvIHRoZSBtb2RlbC4gVGhpcyBjaGFuZ2UgbWlnaHQgYmUgaW4gdGVybXMgb2YgY29udGVudAotCSAqIG9yIGl0IG1pZ2h0IGJlIGluIHRlcm1zIG9mIHRoZSBtb2RlbCBpZCBvciBiYXNlIGxvY2F0aW9uLiBOb3RlIHRoYXQgaW4KLQkgKiB0aGUgY2FzZSBvZiBlbWJlZGRlZCBjYWxscywgbm90aWZpY2F0aW9uIHRvIGxpc3RuZXJzIGlzIHNlbnQgb25seSBvbmNlLgotCSAqIE5vdGUgdGhhdCB0aGUgY2xpZW50IHdobyBpcyBtYWtpbmcgdGhlc2UgY2hhbmdlcyBoYXMgdGhlIHJlc3BvbnNpYmlsaXR5Ci0JICogdG8gcmVzdG9yZSB0aGUgbW9kZWxzIHN0YXRlIG9uY2UgZmluaXNoZWQgd2l0aCB0aGUgY2hhbmdlcy4gU2VlCi0JICogZ2V0TWVtZW50byBhbmQgcmVzdG9yZVN0YXRlLiBUaGUgbWV0aG9kIGlzTW9kZWxTdGF0ZUNoYW5naW5nIGNhbiBiZQotCSAqIHVzZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbCBpcyBhbHJlYWR5IGluIGEgY2hhbmdlCi0JICogc2VxdWVuY2UuCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0NoYW5nZU1vZGVsKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJaW50ZXJuYWxBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhYm91dFRvUmVpbml0aWFsaXplTW9kZWwoKSB7Ci0KLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWZpcmVNb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpIHsKLQkJCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciA9IG5ldyBMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyKCk7Ci0JCQl9Ci0JCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCXN5bmNocm9uaXplZCAoZkxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmTW9kZWxTdGF0ZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvcgotCQkJCQkvLyBmaXJzdAotCQkJCQkvLyB0aW1lIHRocm91Z2gKLQkJCQkJb2xkU2l6ZSA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQl9Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZk1vZGVsU3RhdGVMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQkJfQotCQkJCS8vIGFkZCBsaXN0ZW5lciB0byBsYXN0IHBvc2l0aW9uCi0JCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJCS8vCi0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZNb2RlbFN0YXRlTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBiZWdpbkxvY2soKSB7Ci0JCWZMb2NrT2JqZWN0ID0gZ2V0TG9ja09iamVjdCgpOwotCQlpZiAoZkxvY2tPYmplY3QgIT0gbnVsbCkKLQkJCWZMb2NrT2JqZWN0LmFjcXVpcmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0KLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCkgewotCi0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0KLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgbnVsbCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5iZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgY29udHJvbGxlZCB3YXkgb2Ygbm90aWZ5aW5nIGFsbCBNb2RlbEV2ZW50Ci0JICogbGlzdG5lcnMgdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIKLQkgKiB0byBhYm91dFRvQ2hhbmdlTW9kZWwsIGFuZCAqbXVzdCogYmUgY2FsbGVkIGFmdGVyIGFib3V0VG9DaGFuZ2VNb2RlbAotCSAqIC4uLiBvciBzb21lIGxpc3RlbmVycyBjb3VsZCBiZSBsZWZ0IHdhaXRpbmcgaW5kZWZpbml0ZWx5IGZvciB0aGUKLQkgKiBjaGFuZ2VkIGV2ZW50LiBTbywgaXRzIHN1Z2dlc3RlZCB0aGF0IGNoYW5nZWRNb2RlbCBhbHdheXMgYmUgaW4gYQotCSAqIGZpbmFsbHkgY2xhdXNlLiBMaWtld2lzZSwgYSBjbGllbnQgc2hvdWxkIG5ldmVyIGNhbGwgY2hhbmdlZE1vZGVsCi0JICogd2l0aG91dCBjYWxsaW5nIGFib3V0VG9DaGFuZ2VNb2RlbCBmaXJzdC4gSW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQKLQkgKiBjYWxscywgdGhlIG5vdGlmaWNhdGlvbiBpcyBqdXN0IHNlbnQgb25jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFuZ2VkTW9kZWwoKSB7Ci0KLQotCQkvLyBub3RpY2UgdGhpcyBpcyBqdXN0IGEgcHVibGljIGF2ZW51ZSB0byBvdXIgcHJvdGVjdGVkIG1ldGhvZAotCQlpbnRlcm5hbE1vZGVsQ2hhbmdlZCgpOwotCQkvLyBhbHNvIG5vdGUhCi0JCS8vIGlmIHdlJ3ZlIGJlZW4gImNoYW5nZWQiIGJ5IGEgY2xpZW50LCB3ZSBtaWdodCBzdGlsbCBuZWVkCi0JCS8vIHRvIGJlIHJlLWluaXRpYWxpemVkLCBzbyB3ZSdsbCBjaGVjayBhbmQgaGFuZGxlIHRoYXQgaGVyZS4KLQkJLy8gTm90ZSBvbmx5IGRvZXMgdGhpcyBwcm92aWRlIGEgc29sdXRpb24gdG8gc29tZSAibWlzc2VkIgotCQkvLyByZS1pbml0cywgaW4gcHJvdmlkZXMgYSBidWlsdCBpbiB3YXkgZm9yIGNsaWVudHMgdG8KLQkJLy8gImZvcmNlIiB0aGUgbW9kZWwgdG8gaGFuZGxlIGl0c2VsZiwgYnkgYnJhY2tldGluZyBhbnkKLQkJLy8gY2hhbmdlcyB3aXRoIGFib3V0VG9DaGFuZ2UgYW5kIGNoYW5nZWQsIHRoZSBtb2RlbCBpdHNlbGYKLQkJLy8gd2lsbCBjaGVjay4gQnV0IG9ubHkgY2FsbCByZS1pbml0IGlmIGFsbCBvdGhlciBwZW5kaW5nCi0JCS8vIG1vZGVsQ2hhbmdlZCBzdGF0ZXMgaGF2ZSBiZWVuIGhhbmRsZWQuCi0JCWlmIChmTW9kZWxTdGF0ZUNoYW5naW5nID09IDAgJiYgaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCkpIHsKLQkJCXJlaW5pdCgpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBCYXNlZCBvbiBzaW1pbGFyIG1ldGhvZCBpbiBGaWxlRG9jdW1lbnRQcm92aWRlci4gSXQgd2lsbCBwcm92aWRlIHdoYXQKLQkgKiB0aGUgbW9kaWZpY2F0aW9uU3RhbXAgd291bGQgYmUgaWYgcmVzZXRTeW5jaHJvbnphdGlvblN0YW1wKHJlc291cmNlKQotCSAqIHdlcmUgdXNlZCwgYWx0aG91Z2ggZm9yIHRoaXMgJ2NvbXB1dGUnIEFQSSwgbm8gY2hhbmdlcyB0byB0aGUgaW5zdGFuY2UKLQkgKiBhcmUgbWFkZS4KLQkgKi8KLQlwdWJsaWMgbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoSVJlc291cmNlIHJlc291cmNlKSB7Ci0KLQotCQlsb25nIG1vZGlmaWNhdGlvblN0YW1wID0gcmVzb3VyY2UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCQkvLyBOb3RlOiBjaGVja2luZyBleGlzdGVuY2Ugb2YgZmlsZSBpcyBhIGxpdHRsZSBkaWZmZXJlbnQgdGhhbgotCQkvLyBpbXBsIGluCi0JCS8vIHRoZSBGaWxlRG9jdW1lbnRQcm92aWRlci4gU2VlIGRlZmVjdCBudW1iZXIgMjIzNzkwLgotCQlGaWxlIGZpbGUgPSBwYXRoLnRvRmlsZSgpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCQltb2RpZmljYXRpb25TdGFtcCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgY29weSBvZiB0aGUgbW9kZWwsIGJ1dCBhIG5ldyBJRCBtdXN0IGJlIHByb3ZpZGVkLiBUaGUKLQkgKiBwcmluY2lwbGUgb2YgdGhpcyBjb3B5IGlzIG5vdCB0byBjb3B5IGZpZWxkcywgZXRjLiwgYXMgaXMgdHlwaWNhbGx5Ci0JICogZG9uZSBpbiBhIGNsb25lIG1ldGhvZCwgYnV0IHRvIHJldHVybiBhIG1vZGVsIHdpdGggdGhlIHNhbWUgY29udGVudCBpbgotCSAqIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQuIE5vdGU6IEl0IGlzIHRoZSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5IHRvCi0JICogc2V0QmFzZUxvY2F0aW9uLCBsaXN0bmVycywgZXRjLiwgYXMgYXBwcm9wcmlhdGUuIFR5cGUgYW5kIEVuY29kaW5nIGFyZQotCSAqIHRoZSBvbmx5IGZpZWxkcyBzZXQgYnkgdGhpcyBtZXRob2QuIElmIHRoZSBuZXdJZCBwcm92aWRlZCBhbHJlYWR5IGV4aXN0Ci0JICogaW4gdGhlIG1vZGVsIG1hbmFnZXIsIGEgUmVzb3VyY2VJblVzZSBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNvcHkoU3RyaW5nIG5ld0lkKSB0aHJvd3MgUmVzb3VyY2VJblVzZSB7Ci0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbnVsbDsKLQkJLy8gdGhpcyBmaXJzdCBvbmUgc2hvdWxkIGZhaWwsIGlmIG5vdCwgaXRzIHRyZWF0ZWQgYXMgYW4gZXJyb3IKLQkJLy8gSWYgdGhlIGNhbGxlciB3YW50cyB0byB1c2UgYW4gZXhpc3Rpbmcgb25lLCB0aGV5IGNhbiBjYWxsCi0JCS8vIGdldEV4aXN0aW5nCi0JCS8vIGFmdGVyIHRoaXMgZmFpbHVyZQotCQluZXdNb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KG5ld0lkKTsKLQkJaWYgKG5ld01vZGVsICE9IG51bGwpIHsKLQkJCS8vIGJlIHN1cmUgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHdlIGdvdCAiYnkgYWNjaWRlbnQiIChhbmQKLQkJCS8vIG5vCi0JCQkvLyBsb25nZXIgbmVlZCkKLQkJCW5ld01vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJfQotCQluZXdNb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmNvcHlNb2RlbEZvckVkaXQoZ2V0SWQoKSwgbmV3SWQpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0KLQkvKioKLQkgKiBEaXNhYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNhYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVVbmRvTWFuYWdlbWVudCgpIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5lbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIGVuZExvY2sgaXMgcHJvdGVjdGVkIG9ubHkgZm9yIGEgdmVyeSBzcGVjaWFsIHB1cnBvc2UuIFNvIHN1YmNsYXNzZXMgY2FuCi0JICogY2FsbCBpdCB0byBlbmQgdGhlIGxvY2sgYWZ0ZXIgdXBkYXRlcyBoYXZlIGJlZW4gbWFkZSwgYnV0IGJlZm9yZQotCSAqIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5kTG9jaygpIHsKLQkJaWYgKGZMb2NrT2JqZWN0ICE9IG51bGwpIHsKLQkJCWZMb2NrT2JqZWN0LnJlbGVhc2UoKTsKLQkJfQotCQkvLyBmTG9jayBiZWluZyBudWxsIGlzIHVzZWQgYXMgYW4gaW5kaWNhdG9yIHRoYXQKLQkJLy8gd2UgYXJlIG5vdCBsb2NrZWQgKGFuZCB1c2VkIGluIGxvZ2ljIHRvIGRlY2lkZQotCQkvLyBhY3F1aXJlL3JlbGVhc2UuCi0JCWZMb2NrT2JqZWN0ID0gbnVsbDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuZW5kUmVjb3JkaW5nKHJlcXVlc3Rlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgc3RhdGUgbGlzdGVuZXJzIHRoYXQgdGhlIHRoZSBtb2RlbCBpcwotCSAqIGFib3V0IHRvIHVuZGVyIGdvIGEgY2hhbmdlLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50cwotCSAqIG9yIG1pZ2h0IGJlIGluIHRlcm1zIG9mIHRoZSBtb2RlbCdzIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVNb2RlbEFib3V0VG9CZUNoYW5nZWQoKSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUgbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkKLQkJLy8gZnJvbSBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbEFib3V0VG9CZUNoYW5nZWQodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoKSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKERFQlVHX1NUQVRFKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQiKTsKLQkJCX0KLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCS8vIE5PVEU6IHRyaWNrIGZvciB0cmFuc2l0aW9uLiBXZSBhY3R1YWwgdXNlIHRoZSBzYW1lCi0JCQkJLy8gbGlzdGVuZXJzCi0JCQkJLy8gYXMgbW9kZWxTdGF0ZSwgYnV0IG9ubHkgc2VuZCB0aGlzIHRvIHRob3NlIHRoYXQgaGF2ZQotCQkJCS8vIGltcGxlbWVudGVkIE1vZGVsU3RhdGVFeHRlbmRlZC4KLQkJCQlJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyID0gKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV07Ci0JCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSU1vZGVsU3RhdGVMaXN0ZW5lckV4dGVuZGVkKSB7Ci0JCQkJCUlNb2RlbFN0YXRlTGlzdGVuZXJFeHRlbmRlZCBleHRlbmRlZExpc3RuZXIgPSAoSU1vZGVsU3RhdGVMaXN0ZW5lckV4dGVuZGVkKSBsaXN0ZW5lcjsKLQkJCQkJZXh0ZW5kZWRMaXN0bmVyLm1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZU1vZGVsQ2hhbmdlZCgpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzCi0JCS8vIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkCi0JCS8vIGFuZCByZW1vdmUgbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIKLQkJLy8gYXJyYXkgZnJvbSBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJKChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbENoYW5nZWQodGhpcyk7Ci0JCQkJfQotCQkJCS8vIGl0cyBzbyBjcml0aWNpYWwgdGhhdCB0aGUgYmVnaW4vZW5kIGFycml2ZSBpbgotCQkJCS8vIHBhaXJzLAotCQkJCS8vIGlmIHRoZXJlIGhhcHBlbmRzIHRvIGJlIGFuIGVycm9yIGluIG9uZSBvZiB0aGUKLQkJCQkvLyBtb2RlbENoYW5nZWQsCi0JCQkJLy8gdGhleSB3ZSB3YW50IHRvIGJlIHN1cmUgcmVzdCBjb21wbGV0ZSBvay4KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgc3RhdGUgbGlzdGVuZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZQotCSAqIGRpcnR5IHN0YXRlIG9mIHRoZSBtb2RlbC4gVGhlIGRpcnR5IHN0YXRlIGlzIGVudGlyZWx5IGFib3V0IGNoYW5nZXMgaW4KLQkgKiB0aGUgY29udGVudCBvZiB0aGUgbW9kZWwgKG5vdCwgZm9yIGV4YW1wbGUsIGFib3V0IGNoYW5nZXMgdG8gaWQsIG9yCi0JICogYmFzZSBsb2NhdGlvbiAtLSBzZWUgbW9kZWxNb3ZlZCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBlbGVtZW50LCBib29sZWFuIGlzRGlydHkpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAoREVCVUdfU1RBVEUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQiKTsKLQkJCX0KLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChlbGVtZW50LCBpc0RpcnR5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbFJlaW5pdGlhbGl6ZWQoKSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKERFQlVHX1NUQVRFKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbFJlaW5pdGlhbGl6ZWQiKTsKLQkJCX0KLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCS8vIE5PVEU6IHRyaWNrIGZvciB0cmFuc2l0aW9uLiBXZSBhY3R1YWwgdXNlIHRoZSBzYW1lCi0JCQkJLy8gbGlzdGVuZXJzCi0JCQkJLy8gYXMgbW9kZWxTdGF0ZSwgYnV0IG9ubHkgc2VuZCB0aGlzIHRvIHRob3NlIHRoYXQgaGF2ZQotCQkJCS8vIGltcGxlbWVudGVkIE1vZGVsU3RhdGVFeHRlbmRlZC4KLQkJCQlJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyID0gKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV07Ci0JCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSU1vZGVsU3RhdGVMaXN0ZW5lckV4dGVuZGVkKSB7Ci0JCQkJCUlNb2RlbFN0YXRlTGlzdGVuZXJFeHRlbmRlZCBleHRlbmRlZExpc3RuZXIgPSAoSU1vZGVsU3RhdGVMaXN0ZW5lckV4dGVuZGVkKSBsaXN0ZW5lcjsKLQkJCQkJZXh0ZW5kZWRMaXN0bmVyLm1vZGVsUmVpbml0aWFsaXplZCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIG1vZGVsIHN0YXRlIGxpc3RlbmVycyBhYm91dCB0aGUgZGVsZXRpb24gb2YgYQotCSAqIG1vZGVsJ3MgdW5kZXJseWluZyByZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBlbGVtZW50KSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKERFQlVHX1NUQVRFKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbFJlc291cmNlRGVsZXRlZCIpOwotCQkJfQotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbFJlc291cmNlRGVsZXRlZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgc3RhdGUgbGlzdGVuZXJzIHRoYXQgdGhlIHJlc291cmNlCi0JICogdW5kZXJseWluZyBhIG1vZGVsIGhhcyBiZWVuIG1vdmVkLiBUaGlzIGlzIHR5cGljYWxseSByZWZsZWN0ZWQgaW4gYQotCSAqIGNoYW5nZSB0byB0aGUgaWQsIGJhc2VMb2NhdGlvbiwgb3IgYm90aC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb3JpZ2luYWxFbGVtZW50LCBJU3RydWN0dXJlZE1vZGVsIG1vdmVkRWxlbWVudCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChERUJVR19TVEFURSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxSZXNvdXJjZU1vdmVkIik7Ci0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm1vZGVsUmVzb3VyY2VNb3ZlZChvcmlnaW5hbEVsZW1lbnQsIG1vdmVkRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCi0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCkgewotCi0JCXJldHVybiBmQmFzZUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwjZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpIHsKLQkJaWYgKGZFeHBsaWNpdENvbnRlbnRUeXBlSWRlbnRpZmllciAhPSBudWxsKQotCQkJcmV0dXJuIGZFeHBsaWNpdENvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQkJcmV0dXJuIGZNb2RlbEhhbmRsZXIuZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIElGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlpZiAoZmFjdG9yeVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWZhY3RvcnlSZWdpc3RyeSA9IG5ldyBGYWN0b3J5UmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFRoZSBpZCBpcyB0aGUgaWQgdGhhdCB0aGUgbW9kZWwgbWFuYWdlciB1c2VzIHRvIGlkZW50aWZ5IHRoaXMgbW9kZWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCi0KLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSUxvY2sgZ2V0TG9ja09iamVjdCgpIHsKLQotCQkvLyB3ZSBhbHdheXMgImdldCBhZnJlc2giIHRoZSBsb2NrIG9iamVjdCBmcm9tIG91ciBkb2N1bWVudCwKLQkJLy8ganVzdCBpbiBjYXNlIHRoZSBpbnN0YW5jZSBvZiB0aGUgZG9jdW1lbnQgY2hhbmdlcy4KLQkJSUxvY2sgcmVzdWx0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElMb2NrYWJsZSkgewotCQkJLy8gcmVtZW1iZXIsIG1vcmUgdGhhbiBvbmUgY2xpZW50IGNhbiBnZXQgdGhlCi0JCQkvLyBsb2NrIG9iamVjdCwgaXRzIGR1cmluZyB0aGUgYXF1aXJlIHRoYXQgdGhlCi0JCQkvLyBsb2NrIG9uIHRoZSB0aHJlYWQgaXMgb2J0YWluZWQuCi0JCQlyZXN1bHQgPSAoKElMb2NrYWJsZSkgZG9jKS5nZXRMb2NrT2JqZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBtZW1lbXRvIHRoYXQgY2FuIGxhdGVyIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGUKLQkgKiBzdGF0ZSBhdCB0aGlzIHBvaW50LiBBIG1vZGVsJ3Mgc3RhdGUsIGluIHRoaXMgc2Vuc2UsIGRvZXMgbm90IHJlbGF0ZSB0bwotCSAqIGl0cyBjb250ZW50LCBvciBJZHMsIGV0Yy4sIGp1c3QgaXRzIGRpcnR5IHN0YXRlLCBhbmQgaXRzCi0JICogc3luY2hyb25pemF0aW9uIHN0YXRlIHdpdGggaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UuIFRoZSAncmVzb3VyY2UnCi0JICogYXJndW1lbnQgbXVzdCBiZSB0aGUgcmVzb3VyY2UgdGhhdCB1bmRlcmxpZXMgdGhlIGluc3RhbmNlIG9mIHRoZSBtb2RlbAotCSAqIHRoaXMgbWV0aG9kIGlzIHNlbnQgdG8uIE5vdGU6IHRoaXMgcGFyYW1ldGVyIHdpbGwgbm90IGJlIHJlcXVpcmVkIGluCi0JICogZnV0dXJlIHZlcnNpb25zIG9mICdzdHJ1Y3V0dXJlZCBtb2RlbCcuCi0JICovCi0JcHVibGljIElTdGF0ZU1lbWVudG8gZ2V0TWVtZW50byhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQotCQlNb2RlbFN0YXRlTWVtZW50byBtZW1lbnRvID0gbmV3IE1vZGVsU3RhdGVNZW1lbnRvKCk7Ci0JCW1lbWVudG8uc2V0VW5kZXJseWluZ1Jlc291cmNlKHJlc291cmNlKTsKLQkJbWVtZW50by5zZXREaXJ0eVN0YXRlKGlzRGlydHkoKSk7Ci0JCWxvbmcgbW9kRGF0ZSA9IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChyZXNvdXJjZSk7Ci0JCW1lbWVudG8uc2V0RGF0ZXNJblN5bmMoZlN5bmNocm9uaXphdGlvblN0YW1wID09IG1vZERhdGUpOwotCQlyZXR1cm4gbWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZW50VHlwZURlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIENvbnRlbnRUeXBlRGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgSU1vZGVsSGFuZGxlciBnZXRNb2RlbEhhbmRsZXIoKSB7Ci0KLQkJcmV0dXJuIGZNb2RlbEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5tb2RlbC5JTW9kZWxNYW5hZ2VyCi0JICovCi0JcHVibGljIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCi0JCXJldHVybiBfZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQkvLyBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24gbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JcHVibGljIGludCBnZXRSZWZlcmVuY2VDb3VudCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5nZXRSZWZlcmVuY2VDb3VudChnZXRJZCgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KCkgewotCi0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KGdldElkKCkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQkvLyBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24gbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JcHVibGljIGludCBnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoKSB7Ci0KLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5nZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWluaXRpYWxpemVTdGF0ZURhdGEoKSB7Ci0KLQkJcmV0dXJuIHJlaW5pdGlhbGl6ZVN0YXRlRGF0YTsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQudXRpbC5VUklSZXNvbHZlcgotCSAqLwotCXB1YmxpYyBVUklSZXNvbHZlciBnZXRSZXNvbHZlcigpIHsKLQotCQlyZXR1cm4gZlJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS83LzIwMDEgMjozMDoyNgotCSAqIFBNKQotCSAqIAotCSAqIEByZXR1cm4gbG9uZwotCSAqLwotCXB1YmxpYyBsb25nIGdldFN5bmNocm9uaXphdGlvblN0YW1wKCkgewotCi0JCXJldHVybiBmU3luY2hyb25pemF0aW9uU3RhbXA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGdldFVuZG9NYW5hZ2VyKCkgewotCi0JCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCXN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgPSBudWxsOwotCQl9IGVsc2UgewotCQkJc3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRVbmRvTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRJZChTdHJpbmcgaWQpIHsKLQkJZklkID0gaWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxBYm91dFRvQmVDaGFuZ2VkKCkgewotCi0JCS8vIG5vdGljZSB3ZSBvbmx5IGZpcmUgdGhpcyBldmVudCBpZiB3ZSBhcmUgbm90Ci0JCS8vIGFscmVhZHkgaW4gYSBtb2RlbCBzdGF0ZSBjaGFuZ2luZyBzZXF1ZW5jZQotCQlpZiAoZk1vZGVsU3RhdGVDaGFuZ2luZyA9PSAwKSB7Ci0KLQkJCWlmIChERUJVR19TVEFURSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxBYm91dFRvQmVDaGFuZ2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJZmlyZU1vZGVsQWJvdXRUb0JlQ2hhbmdlZCgpOwotCQkJLy8gYmVnaW4gbG9jayBhZnRlciBsaXN0ZW5lcnMgbm90aWZpZWQsIG90aGVyd2lzZQotCQkJLy8gZGVhZGxvY2sgY291bGQgb2NjdXIgaWYgdGhleSBjYWxsIHVzIGJhY2suCi0JCQliZWdpbkxvY2soKTsKLQotCQl9Ci0JCS8vIHdlIGFsd2F5cyBpbmNyZW1lbnQgY291bnRlciwgZm9yIGV2ZXJ5IHJlcXVlc3QgKHNvICptdXN0KiByZWNlaXZlCi0JCS8vIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mICdjaGFuZ2VkTW9kZWwnIHJlcXVlc3RzKQotCQlmTW9kZWxTdGF0ZUNoYW5naW5nKys7Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCBhbiBpbXBlbmRpbmcgY2hhbmdlCi0JICogaXMgbm93IGNvbXBsZXRlLiBUaGlzIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGJ5ICdtb2RlbENoYW5nZWQnCi0JICogc2luY2UgaXQga2VlcHMgdHJhY2sgb2YgY291bnRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsTW9kZWxDaGFuZ2VkKCkgewotCi0JCS8vIGFsd2F5cyBkZWNyZW1lbnQKLQkJZk1vZGVsU3RhdGVDaGFuZ2luZy0tOwotCi0KLQkJLy8gQ2hlY2sgaW50ZWdyaXR5Ci0JCS8vIHRvIGJlIGxlc3MgdGhhbiB6ZXJvIGlzIGEgcHJvZ3JhbW1pbmcgZXJyb3IsCi0JCS8vIGJ1dCB3ZSdsbCByZXNldCB0byB6ZXJvCi0JCS8vIGFuZCB0cnkgdG8gY29udGludWUKLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPCAwKSB7Ci0JCQlmTW9kZWxTdGF0ZUNoYW5naW5nID0gMDsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiUHJvZ3JhbSBFcnJvcjogbW9kZWxTdGF0ZUNoYW5naW5nIHdhcyBsZXNzIHRoYW4gemVybyIpOwotCQl9Ci0KLQotCQkvLyBXZSBvbmx5IGZpcmUgdGhpcyBldmVudCBpZiBhbGwgcGVuZGluZyByZXF1ZXN0cyBhcmUgZG9uZS4KLQkJLy8gVGhhdCBpcywgaWYgd2UndmUgcmVjZWl2ZWQgdGhlIHNhbWUgbnVtYmVyIG9mIG1vZGVsQ2hhbmdlZCBhcwotCQkvLyB3ZSBoYXZlIGFib3V0VG9DaGFuZ2VNb2RlbC4KLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPT0gMCkgewotCQkJaWYgKERFQlVHX1NUQVRFKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbENoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWVuZExvY2soKTsKLQkJCS8vIG5vdGlmaWZ5IGxpc3RlbmVycyBvdXRsaW5lIGxvY2tlZCBzdGF0ZSAob3IgZGVhZGxvY2sKLQkJCS8vIGNhbiBvY2N1ciBpZiBvbmUgb2YgdGhlbSBjYWxscyB1cyBiYWNrLgotCQkJZmlyZU1vZGVsQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQotCQlyZXR1cm4gZkRpcnR5U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaGFzIHZlcnkgc3BlY2lhbCBwdXJwb3NlLCBpdHMgdXNlZCBpbiBzdWJjbGFzcwotCSAqICdjaGFuZ2VkTW9kZWwnIHRvIGtub3cgd2hlbiB0byBkbyAiZW5kaW5nIiBzb3J0cyBvZiB0aGluZ3MsIHJpZ2h0Ci0JICogYmVmb3JlIGEgY2FsbCB0byBzdXBlci5DaGFuZ2VkTW9kZWwgd291bGQgaW4gZGVlZCBwdXQgdGhlIG1vZGVsIGluCi0JICogJ2VuZCcgc3RhdGUuIFB1dCBhbm90aGVyIHdheSwgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ViY2xhc3NlcydzCi0JICogY2hhbmdlZE1vZGVsLCB0aGUgaXNNb2RlbFN0YXRlQ2hhbmdpbmcgaXMgdHJ1ZSwgYnV0IGF0IGVuZCwgaXQgd2lsbCBiZQotCSAqIGZhbHNlLiBTbywgdGhpcyBtZXRob2QgYWxsb3dzIGEgc21hbGwgInBlZWsgYWhlYWQiLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTW9kZWxDaGFuZ2VTdGF0ZU9uVmVyZ2VPZkVuZGluZygpIHsKLQotCi0JCXJldHVybiBmTW9kZWxTdGF0ZUNoYW5naW5nID09IDE7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKSB7Ci0KLQotCQlyZXR1cm4gZk1vZGVsU3RhdGVDaGFuZ2luZyA+IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7Ci0KLQkJcmV0dXJuIGZOZXdTdGF0ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSB7Ci0KLQkJcmV0dXJuIHJlaW5pdGlhbGl6YXRpb25OZWVkZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCkgewotCi0KLQkJaWYgKCFpc1NoYXJlZEZvckVkaXQoKSkKLQkJCXJldHVybiBpc0RpcnR5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWQoZ2V0SWQoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yRWRpdCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWRGb3JFZGl0KGdldElkKCkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvclJlYWQoKSB7Ci0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldE1vZGVsTWFuYWdlcigpLmlzU2hhcmVkRm9yUmVhZChnZXRJZCgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZCgpIHsKLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWZpcmVNb2RlbFJlaW5pdGlhbGl6ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdJbnN0YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG51bGw7Ci0JCS8vIHdlIGRlbGVnYXRlIHRvIHRoZSBtb2RlbCBtYW5hZ2VyLCBzbyBsb2FkZXIsIGV0Yy4sIGNhbiBiZQotCQkvLyB1c2VkLgotCQluZXdNb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZU5ld0luc3RhbmNlKHRoaXMpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0KCkgewotCi0KLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlpZiAoZk1vZGVsU3RhdGVDaGFuZ2luZyA9PSAwKSB7Ci0JCQl0cnkgewotCQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCWFib3V0VG9SZWluaXRpYWxpemVNb2RlbCgpOwotCQkJCXJlc3VsdCA9IF9nZXRNb2RlbE1hbmFnZXIoKS5yZWluaXRpYWxpemUodGhpcyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXNldFJlaW5pdGlhbGl6ZU5lZWRlZChmYWxzZSk7Ci0JCQkJc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKG51bGwpOwotCQkJCW1vZGVsUmVpbml0aWFsaXplZCgpOwotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJpbmRlZWQhISEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tRWRpdCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oIldhcm5pbmc6IEFic3RyYWN0U3RydWN0dXJlZE1vZGVsOjpjbG9zZTogIG1vZGVsIG1hbmFnZXIgd2FzIG51bGwgZHVyaW5nIGEgY2xvc2Ugb2YgYSBtb2RlbCAod2hpY2ggc2hvdWxkIGJlIGltcG9zc2libGUpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCS8vIGJlIHN1cmUgdG8gY2hlY2sgdGhlIHNoYXJlZCBzdGF0ZSBiZWZvcmUgcmVsZWFzaW5nLiAoU2luY2UKLQkJCS8vIGlzU2hhcmVkIGFzc3VtZXMgYSBjb3VudAotCQkJLy8gb2YgMSBtZWFucyBub3Qgc2hhcmVkIC4uLiBhbmQgd2Ugd2FudCBvdXIgJzEnIHRvIGJlIHRoYXQKLQkJCS8vIG9uZS4pCi0JCQlib29sZWFuIGlzU2hhcmVkID0gaXNTaGFyZWQoKTsKLQotCQkJaWYgKCFpc1NoYXJlZCkgewotCQkJCXNpZ25hbFByZUxpZmVDeWNsZUV2ZW50UmVsZWFzZSh0aGlzKTsKLQkJCX0KLQotCQkJX2dldE1vZGVsTWFuYWdlcigpLnJlbGVhc2VGcm9tRWRpdChnZXRJZCgpKTsKLQkJCS8vIGlmIG5vIG9uZSBlbHNlIGlzIHVzaW5nIHVzLCBmcmVlIHVwCi0JCQkvLyBhbiByZXNvdXJjZXMKLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlfY29tbW9uUmVsZWFzZSgpOwotCQkJCXNpZ25hbFBvc3RMaWZlQ3ljbGVMaXN0ZW5lclJlbGVhc2UodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oIldhcm5pbmc6IEFic3RyYWN0U3RydWN0dXJlZE1vZGVsOjpjbG9zZTogIG1vZGVsIG1hbmFnZXIgd2FzIG51bGwgZHVyaW5nIGEgY2xvc2Ugb2YgYSBtb2RlbCAod2hpY2ggc2hvdWxkIGJlIGltcG9zc2libGUpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCS8vIGJlIHN1cmUgdG8gY2hlY2sgdGhlIHNoYXJlZCBzdGF0ZSBiZWZvcmUKLQkJCS8vIHJlbGVhc2luZy4gKFNpbmNlIGlzU2hhcmVkIGFzc3VtZXMgYSBjb3VudAotCQkJLy8gb2YgMSBtZWFucyBub3Qgc2hhcmVkIC4uLiBhbmQgd2Ugd2FudAotCQkJLy8gb3VyICcxJyB0byBiZSB0aGF0IG9uZS4pCi0JCQlib29sZWFuIGlzU2hhcmVkID0gaXNTaGFyZWQoKTsKLQotCQkJaWYgKCFpc1NoYXJlZCkgewotCQkJCXNpZ25hbFByZUxpZmVDeWNsZUV2ZW50UmVsZWFzZSh0aGlzKTsKLQkJCX0KLQotCQkJX2dldE1vZGVsTWFuYWdlcigpLnJlbGVhc2VGcm9tUmVhZChnZXRJZCgpKTsKLQkJCS8vIGlmIG5vIG9uZSBlbHNlIGlzIHVzaW5nIHVzLCBmcmVlIHVwCi0JCQkvLyBhbiByZXNvdXJjZXMKLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQkvLyBmYWN0b3J5UmVnaXN0cnkucmVsZWFzZSgpOwotCQkJCV9jb21tb25SZWxlYXNlKCk7Ci0JCQkJc2lnbmFsUG9zdExpZmVDeWNsZUxpc3RlbmVyUmVsZWFzZSh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXBsZW5pc2hlcyB0aGUgbW9kZWwgd2l0aCB0aGUgcmVzb3VyY2Ugd2l0aG91dCBzYXZpbmcKLQkgKiBhbnkgcG9zc2libGUgY2hhbmdlcy4gSXQgaXMgdXNlZCB3aGVuIG9uZSBlZGl0b3IgbWF5IGJlIGNsb3NpbmcsIGFuZAotCSAqIHNwZWNpZmlhbGx5IHNheXMgbm90IHRvIHNhdmUgdGhlIG1vZGVsLCBidXQgYW5vdGhlciAiZGlzcGxheSIgb2YgdGhlCi0JICogbW9kZWwgc3RpbGwgbmVlZHMgdG8gaGFuZyBvbiB0byBzb21lIG1vZGVsLCBzbyBuZWVkcyBhIGZyZXNoIGNvcHkuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCXJlc3VsdCA9IF9nZXRNb2RlbE1hbmFnZXIoKS5yZWxvYWRNb2RlbChnZXRJZCgpLCBpbnB1dFN0cmVhbSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gaXRzIGEgdmVyeSBzZXJpb3VzIGVycm9yIHRvIGdldCBhbiB1bnN1cHBvcnRlZCBlbmNvZGluZwotCQkJLy8gZXhjZXB0aW9uLAotCQkJLy8gc2luY2Ugd2UndmUgcHJlc3VtYWJsZSBsb2FkZWQgaXQgb25jZSBhbHJlYWR5LCBzbyB3b24ndAotCQkJLy8gYm90aGVyCi0JCQkvLyB3aXRoIGEgY2hlY2tlZCBleGNlcHRpb24uCi0JCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQljaGFuZ2VkTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQkvLyBpZiBtYW5hZ2VyIGlzIG51bGwsIHRoZW4gbm9uZSBoYXZlIGJlZW4gYWRkZWQsIHNvCi0JCS8vIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LgotCQlpZiAoZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3luY2hyb25pemVkIChmTGlzdGVuZXJMb2NrKSB7Ci0JCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQlzeW5jaHJvbml6ZWQgKGZMaXN0ZW5lckxvY2spIHsKLQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZk1vZGVsU3RhdGVMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkvLyByZW1vdmluZwotCQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkvLyBvbGQKLQkJCQkvLyBvbmUKLQkJCQlmTW9kZWxTdGF0ZUxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQSBtZXRob2QgdGhhdCBtb2RpZmlmaWVzIHRoZSBtb2RlbCdzIHN5bmNob25pemF0aW9uIHN0YW1wIHRvIG1hdGNoIHRoZQotCSAqIHJlc291cmNlLiBUdXJucyBvdXQgdGhlcmUncyBzZXZlcmFsIHdheXMgb2YgZG9pbmcgaXQsIHNvIHRoaXMgZW5zdXJlcyBhCi0JICogY29tbW9uIGFsZ29yaXRobS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFN5bmNocm9uaXphdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSkgewotCi0KLQkJc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgdG8gaW5pdGlhdGUgbm90aWZpY2F0aW9uIHRvIGFsbCBpbnRlcmVzdGVkCi0JICogcGFydGllcyB0aGF0IGEgbW9kZWwncyB1bmRlcmx5aW5nIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VEZWxldGVkKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsUmVzb3VyY2VEZWxldGVkKHRoaXMpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWxsb3dzIGEgbW9kZWwgY2xpZW50IHRvIGluaXRpYXRlIG5vdGlmaWNhdGlvbiB0byBhbGwKLQkgKiBpbnRlcmVzdGVkIHBhcnRpZXMgdGhhdCBhIG1vZGVsJ3MgdW5kZXJseWluZyByZXNvdXJjZSBsb2NhdGlvbiBoYXMKLQkgKiBjaGFuZ2VkLiBOb3RlOiB3ZSBhc3N1bWUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoYW5nZWQgYmFzZUxvY2F0aW9uLCBJZCwKLQkgKiBldGMuLCBzaW5jZSBpdHMgcmVhbGx5IHVwIHRvIHRoZSBjbGllbnQgdG8gZGV0ZXJtaW5lIHdoYXQncyAibmV3IiBhYm91dAotCSAqIGEgbW92ZWQgbW9kZWwuIENhdXRpb246ICd0aGlzJyBhbmQgJ25ld01vZGVsJyBtYXkgYmUgdGhlIHNhbWUgb2JqZWN0LgotCSAqIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGN1cnJlbnQgd29ya2luZyB3aXRoIEZpbGVNb2RlbFByb3ZpZGVyLCBidXQgaGF2ZQotCSAqIGxlZnQgdGhlIGR1YWwgYXJndW1lbnQgZm9yIGZ1dHVyZSBwb3NzaWJsaXRpZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0KLQotCQkvLyBub3RpY2UgdGhpcyBpcyBqdXN0IGEgcHVibGljIGF2ZW51ZSB0byBvdXIgcHJvdGVjdGVkIG1ldGhvZAotCQlmaXJlTW9kZWxSZXNvdXJjZU1vdmVkKHRoaXMsIG5ld01vZGVsKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJU3RhdGVNZW1lbnRvIG1lbWVudG8pIHsKLQotCi0JCU1vZGVsU3RhdGVNZW1lbnRvIG1NZW1lbnRvID0gKE1vZGVsU3RhdGVNZW1lbnRvKSBtZW1lbnRvOwotCQkvLyBiZSBzdXJlIHRvIHVzZSBzZXR0ZXIsIHNvIHNpZGUgZWZmZWN0cyB0YWtlIHBsYWNlLgotCQlzZXREaXJ0eVN0YXRlKG1NZW1lbnRvLmlzRGlydHlTdGF0ZSgpKTsKLQkJaWYgKG1NZW1lbnRvLmlzRGF0ZXNJblN5bmMoKSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gbU1lbWVudG8uZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQlzZXRTeW5jaHJvbml6YXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAocmVzb3VyY2UpKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQ7Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cmluZ0lkID0gZ2V0SWQoKTsKLQkJCV9nZXRNb2RlbE1hbmFnZXIoKS5zYXZlTW9kZWwoc3RyaW5nSWQsIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQkJfQotCi0JCWZpbmFsbHkgewotCQkJLy8gd2UgcHV0IGVuZCBub3RpZmljYXRpbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNhdmUoRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChzdHJpbmdJZCwgZW5jb2RpbmdSdWxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW4gaW4gZmluYWxseSBibG9jaywgc28gZXZlbiBpZgotCQkJLy8gZXJyb3Igb2NjdXJzIGR1cmluZyBzYXZlLCBsaXN0ZW5lcnMgYXJlIHN0aWxsIG5vdGlmaWVkLAotCQkJLy8gc2luY2UgdGhlaXIgY29kZSBjb3VsZCBkZXBlbmQgb24gcmVjZWl2aW5nLCB0byBjbGVhbiB1cAotCQkJLy8gc29tZSBzdGF0ZSwgb3IgY29vcmRpbmF0ZSBvdGhlciByZXNvdXJjZXMuCi0JCQl0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJCW1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzYXZlKElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJpbmdJZCA9IGdldElkKCk7Ci0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkuc2F2ZU1vZGVsKGlGaWxlLCBzdHJpbmdJZCwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCQl9Ci0KLQkJZmluYWxseSB7Ci0JCQkvLyB3ZSBwdXQgZW5kIG5vdGlmaWNhdGluIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2F2ZShJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChpRmlsZSwgc3RyaW5nSWQsIGVuY29kaW5nUnVsZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyB3ZSBwdXQgZW5kIG5vdGlmaWNhdGluIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJpbmdJZCA9IGdldElkKCk7Ci0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkuc2F2ZU1vZGVsKHN0cmluZ0lkLCBvdXRwdXRTdHJlYW0sIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQkJfQotCi0JCWZpbmFsbHkgewotCQkJLy8gd2UgcHV0IGVuZCBub3RpZmljYXRpbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHR5cGljYWxseSB1c2VkIHRvIGRlbm90ZSB0aGUgbW9kZWwncyB1bmRlcmx5aW5nCi0JICogcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZUxvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcgbmV3QmFzZUxvY2F0aW9uKSB7Ci0KLQkJZkJhc2VMb2NhdGlvbiA9IG5ld0Jhc2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZUlkZW50aWZpZXIoU3RyaW5nIGNvbnRlbnRUeXBlSWRlbnRpZmllcikgewotCQlmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXIgPSBjb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcnR5U3RhdGUoYm9vbGVhbiBkaXJ0eVN0YXRlKSB7Ci0KLQkJLy8gbm8gbmVlZCB0byBwcm9jZXNzIChzZXQgb3IgZmlyZSBldmVudCksIGlmIHNhbWUgdmFsdWUKLQkJaWYgKGZEaXJ0eVN0YXRlICE9IGRpcnR5U3RhdGUpIHsKLQkJCS8vIHByZWNoYW5nZSBub3RpZmljYWl0b24KLQkJCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ESVJUWV9TVEFURSB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQotCi0JCQkvLyB0aGUgYWN0dWFsIGNoYW5nZQotCQkJZkRpcnR5U3RhdGUgPSBkaXJ0eVN0YXRlOwotCi0JCQkvLyBvbGQgbm90aWZpY2F0aW9uCi0JCQkvLyBUT0RPOiBDMyByZW1vdmUgb2xkIG5vdGlmaWNhdGlvbgotCQkJaWYgKGZEaXJ0eVN0YXRlID09IGZhbHNlKSB7Ci0JCQkJLy8gaWYgd2UgYXJlIGJlaW5nIHNldCB0byBub3QgZGlydHkgKHN1Y2ggYXMganVzdCBiZWVuIHNhdmVkKQotCQkJCS8vIHRoZW4gd2UgbmVlZCB0byBzdGFydCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMKLQkJCQkvLyBhZ2FpbiB0byBrbm93IHdoZW4gdG8gc2V0IHN0YXRlIHRvIHRydWU7Ci0JCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCX0KLQkJCWZpcmVNb2RlbERpcnR5U3RhdGVDaGFuZ2VkKHRoaXMsIGRpcnR5U3RhdGUpOwotCi0KLQkJCS8vIHBvc3QgY2hhbmdlIG5vdGlmaWNhdGlvbgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfRElSVFlfU1RBVEUgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gd2lsbCBsaWtlbHkgYmUgZGVwcmVjYXRlZCBzb29uLCBpbiBmYXZvciBvZiBkaXJlY3QgJ2FkZHMnCi0JICogICAgICAgICAgICAgLi4uIGJ1dCB0YWtlcyBzb21lIHJlZGVzaWduLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZhY3RvcnlSZWdpc3RyeShJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSkgewotCQl0aGlzLmZhY3RvcnlSZWdpc3RyeSA9IGZhY3RvcnlSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaWQgaXMgdGhlIGlkIHRoYXQgdGhlIG1vZGVsIG1hbmFnZXIgdXNlcyB0byBpZGVudGlmeSB0aGlzIG1vZGVsLiBJZgotCSAqIGl0IGlzIGJlaW5nIHNldCBoZXJlLCBpdCBtZWFucyB0aGUgbW9kZWwgbWFuZ2VyIGlzIGFscmVhZHkgbWFuYWdpbmcgdGhlCi0JICogbW9kZWwgd2l0aCBhbm90aGVyIGlkLCBzbyB3ZSBoYXZlIHRvIGtlZXAgaXQgaW4gc3luYy4gVGhpcyBtZXRob2QgY2FsbHMKLQkgKiBub3RpZmllcyBsaXN0bmVycywgaWYgdGhleSBoYXZlbid0IGJlZW4gbm90aWZpZWQgYWxyZWFkeSwgdGhhdCBhICJtb2RlbAotCSAqIHN0YXRlIGNoYW5nZSIgaXMgYWJvdXQgdG8gb2NjdXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB0aHJvd3MgUmVzb3VyY2VJblVzZSB7Ci0KLQotCQkvLyBJdCBtYWtlcyBubyBzZW5zZSwgSSBkb24ndCB0aGluaywgdG8gaGF2ZSBhbiBpZCBvZiBudWxsLCBzbwotCQkvLyB3ZSdsbCB0aHJvdyBhbiBpbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbiBpZiBzb21lb25lIHRyeXMuIE5vdGU6Ci0JCS8vIHRoZSBJTW9kZWxNYW5hZ2VyIGNvdWxkIG5vdCBtYW5hZ2UgYSBtb2RlbCB3aXRoIGFuIGlkIG9mIG51bGwsCi0JCS8vIHNpbmNlIGl0IHVzZXMgaGFzaHRhYmxlcywgYW5kIHlvdSBjYW4ndCBoYXZlIGEgbnVsbCBpZCBmb3IgYQotCQkvLyBoYXNodGFibGUuCi0JCWlmIChuZXdJZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTU0VDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlQV9tb2RlbCdzX2lkX2Nhbl9ub3RfYmVfbnVfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJBIG1vZGVsJ3MgaWQgY2FuIG5vdCBiZSBudWxsIgotCQkvLyBUbyBnYXVyZCBhZ2FpbnQgdGhyb3dpbmcgYSBzcHVyaW91cyBSZXNvdXJjZUluVXNlIGV4Y2VwdGlvbiwKLQkJLy8gd2hpY2ggY2FuIG9jY3VyIHdoZW4gdHdvIHBpZWNlcyBvZiBjb2RlIGJvdGggd2FudCB0byBjaGFuZ2UgdGhlIGlkLAotCQkvLyBzbyB0aGUgc2Vjb25kIHJlcXVlc3QgaXMgc3B1cmlvdXMsIHdlJ2xsIGlnbm9yZSBhbnkgcmVxdWVzdHMgdGhhdAotCQkvLyBhdHRlbXB0IHRvIGNoYW5nZSB0aGUgaWQgdG8gd2hhdCBpdCBhbHJlYWR5IGlzIC4uLiBub3RlLCB3ZSB1c2UKLQkJLy8gJ2VxdWFscycsIG5vdCBpZGVudGl0eSAoJz09Jykgc28gdGhhdCB0aGluZ3MgbGlrZQotCQkvLyBzdHJpbmdzIGNhbiBiZSB1c2VkLiBUaGlzIGlzIHRoZSBzYW1lIGNyaXRlcmlhIHRoYXQgaWRzIGFyZQotCQkvLyBmb3VuZCBpbiBtb2RlbCBtYW5hZ2VyIC0tIHdlbGwsIGFjdHVhbGx5LCBJIGp1c3QgY2hlY2tlZCwgYW5kIGZvcgotCQkvLyB0aGUgaGFzaHRhYmxlIGltcGwsIHRoZSBjcml0ZXJpYSB1c2VzIC5lcXVhbHMgQU5EIHRoZSBjb25kaXRpb24KLQkJLy8gdGhhdCB0aGUgaGFzaCB2YWx1ZXMgYmUgaWRlbnRpY2FsIChJJ20gYXNzdW1pbmcgdGhpcyBpcyBhbHdheXMKLQkJLy8gdHJ1ZSwgaWYgZXF1YWxzIGlzIHRydWUsIGZvciBub3csIEknbSBub3Qgc3VyZQotCQkvLyB3ZSBjYW4gYXNzdW1lIHRoYXQgaGFzaHRhYmxlIHdpbGwgYWx3YXlzIGJlIHVzZWQsIGJ1dCBpbgotCQkvLyBnZW5lcmFsLCBzaG91bGQgbWF0Y2guKQotCQkvLwotCQlpZiAobmV3SWQuZXF1YWxzKGZJZCkpCi0JCQlyZXR1cm47Ci0JCS8vIHdlIG11c3QgZ2F1cmQgYWdhaW5zdCByZWFzc2lnbmluZyBhbiBpZCB0byBvbmUgdGhhdCB3ZSBhbHJlYWR5Ci0JCS8vIGFyZSBtYW5hZ2luZy4KLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChuZXdJZCk7Ci0JCQlpZiAobmV3TW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGJlIHN1cmUgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHdlIGdvdCB1bmV4ZXBlY3RhbnRseQotCQkJCS8vIChhbmQgbm8gbG9uZ2VyIG5lZWQpCi0JCQkJbmV3TW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJLy8gbm9ybWFsIGNvZGUgcGF0aAotCQkJYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQlTdHJpbmcgb2xkSWQgPSBmSWQ7Ci0JCQlmSWQgPSBuZXdJZDsKLQkJCWlmIChnZXRNb2RlbE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJLy8gaWYgbWFuYWdlZCBhbmQgdGhlIGlkIGhhcyBjaGFuZ2VkLCBub3RpZnkgdG8KLQkJCQkvLyBJTW9kZWxNYW5hZ2VyCi0JCQkJLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byBkbyB0aGF0Ci0JCQkJaWYgKG9sZElkICE9IG51bGwgJiYgbmV3SWQgIT0gbnVsbCAmJiAhbmV3SWQuZXF1YWxzKG9sZElkKSkgewotCQkJCQlnZXRNb2RlbE1hbmFnZXIoKS5tb3ZlTW9kZWwob2xkSWQsIG5ld0lkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBtYWtlIHN1cmUgdGhpcyBmaW5hbGx5IGlzIG9ubHkgZXhlY3V0ZWQgaWYgJ2Fib3V0IHRvIENoYW5nZQotCQkJLy8gbW9kZWwnIGhhcwotCQkJLy8gYmVuIGV4ZWN1dGVkLgotCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZW50VHlwZURlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZURlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgY29udGVudFR5cGVEZXNjcmlwdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbEhhbmRsZXIoSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIpIHsKLQotCQkvLyBubyBuZWVkIHRvIGZpcmUgZXZlbnRzIGlmIG1vZGVsSGFuZGxlciBoYXMgYmVlbiBudWxsCi0JCS8vIGZvciB0aGlzIG1vZGVsIC0tCi0JCS8vIHRoaXMgaXMgYW4gYXR0ZW1wdCBhdCBpbml0aWFsaXphdGlvbiBvcHRpbWl6YXRpb24gYW5kIG1heSBuZWVkCi0JCS8vIHRvIGNoYW5nZSBpbiBmdXR1cmUuCi0JCWJvb2xlYW4gdHJ1ZUNoYW5nZSA9IGZhbHNlOwotCQlpZiAoZk1vZGVsSGFuZGxlciAhPSBudWxsKQotCQkJdHJ1ZUNoYW5nZSA9IHRydWU7Ci0JCWlmICh0cnVlQ2hhbmdlKSB7Ci0JCQlpbnRlcm5hbEFib3V0VG9CZUNoYW5nZWQoKTsKLQkJfQotCQlmTW9kZWxIYW5kbGVyID0gbW9kZWxIYW5kbGVyOwotCQlpZiAodHJ1ZUNoYW5nZSkgewotCQkJaW50ZXJuYWxNb2RlbENoYW5nZWQoKTsKLQkJfQotCX0KLQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TW9kZWxNYW5hZ2VyCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5tb2RlbC5JTW9kZWxNYW5hZ2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxNYW5hZ2VyKElNb2RlbE1hbmFnZXIgbmV3TW9kZWxNYW5hZ2VyKSB7Ci0KLQkJZk1vZGVsTWFuYWdlciA9IG5ld01vZGVsTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3U3RhdGUoYm9vbGVhbiBuZXdTdGF0ZSkgewotCi0JCWZOZXdTdGF0ZSA9IG5ld1N0YXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSAiZmxhZyIgdGhhdCByZWluaXRpYWxpemF0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWluaXRpYWxpemVOZWVkZWQoYm9vbGVhbiBuZWVkZWQpIHsKLQotCQlyZWluaXRpYWxpemF0aW9uTmVlZGVkID0gbmVlZGVkOwotCX0KLQotCS8qKgotCSAqIEhvbGRzIGFueSBkYXRhIHRoYXQgdGhlIHJlaW5pdCBwcm9jZWR1cmUgbWlnaHQgZmluZCB1c2VmdWwgaW4KLQkgKiByZWluaXRpYWxpemluZyB0aGUgbW9kZWwuIFRoaXMgaXMgaGFuZHksIHNpbmNlIHRoZSByZWluaXRpYWxpemF0aW9uIG1heQotCSAqIG5vdCB0YWtlIHBsYWNlIGF0IG9uY2UsIGFuZCBzb21lICJvbGQiIGRhdGEgbWF5IGJlIG5lZWRlZCB0byBwcm9wZXJseQotCSAqIHVuZG8gcHJldmlvdXMgc2V0dGluZ3MuIE5vdGU6IHRoZSBwYXJhbWV0ZXIgd2FzIGludGVudGlhbGx5IG1hZGUgdG8gYmUKLQkgKiBvZiB0eXBlICdPYmplY3QnIHNvIGRpZmZlcmVudCBtb2RlbHMgY2FuIHVzZSBpbiBkaWZmZXJlbnQgd2F5cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWluaXRpYWxpemVTdGF0ZURhdGEoT2JqZWN0IG9iamVjdCkgewotCi0JCXJlaW5pdGlhbGl6ZVN0YXRlRGF0YSA9IG9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3UmVzb2x2ZXIKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnV0aWwuVVJJUmVzb2x2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdSZXNvbHZlcikgewotCi0JCWZSZXNvbHZlciA9IG5ld1Jlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0KLQkJYm9vbGVhbiBsaWZlQ3ljbGVOb3RpZmljYXRpb24gPSBmYWxzZTsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRGlydHlTdGF0ZVdhdGNoZXIpOwotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIpOwotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIpOwotCQkJLy8gcHJlY2hhbmdlIG5vdGlmaWNhaXRvbgotCQkJbGlmZUN5Y2xlTm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBEb2N1bWVudENoYW5nZWQoTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQsIHRoaXMsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCi0JCS8vIGhvbGQgZm9yIGxpZmUgY3ljbGUgbm90aWZpY2F0aW9uCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcHJldmlvdXNEb2N1bWVudCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCS8vIHRoZSBhY3R1YWwgY2hhbmdlCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotCQkvLyBhdCB0aGUgc3VwZXIgY2xhc3MgbGV2ZWwsIHdlJ2xsIGxpc3RlbiBmb3Igc3RydWN0dXJlZERvY3VtZW50Ci0JCS8vIGNoYW5nZXMKLQkJLy8gc28gd2UgY2FuIHNldCBvdXIgZGlydHkgc3RhdGUgZmxhZwotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcik7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcik7Ci0JCX0KLQotCQlpZiAobGlmZUN5Y2xlTm90aWZpY2F0aW9uKSB7Ci0JCQkvLyBwb3N0IGNoYW5nZSBub3RpZmljYXRpb24KLQkJCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBEb2N1bWVudENoYW5nZWQoTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5ULCB0aGlzLCBwcmV2aW91c0RvY3VtZW50LCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNy8yMDAxIDI6MzA6MjYKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U3luY2hyb25pemF0aW9uU3RhbXAKLQkgKiAgICAgICAgICAgIGxvbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTeW5jaHJvbml6YXRpb25TdGFtcChsb25nIG5ld1N5bmNocm9uaXphdGlvblN0YW1wKSB7Ci0KLQkJZlN5bmNocm9uaXphdGlvblN0YW1wID0gbmV3U3luY2hyb25pemF0aW9uU3RhbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIpIHsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRvY3VtZW50IHdhcyBudWxsIHdoZW4gdW5kbyBtYW5hZ2VyIHNldCBvbiBtb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc3RydWN0dXJlZERvY3VtZW50LnNldFVuZG9NYW5hZ2VyKHVuZG9NYW5hZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiB0byBiZSBjYWxsZWQgb25seSBiZSAiZnJpZW5kbHkiIGNsYXNzZXMsIHN1Y2ggYXMgTW9kZWxNYW5nZXIsIGFuZAotCSAqIHN1YmNsYXNzZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2lnbmFsTGlmZWN5Y2xlRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCi0JCWlmIChmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5zaWduYWxMaWZlY3ljbGVFdmVudChldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNpZ25hbFBvc3RMaWZlQ3ljbGVMaXN0ZW5lclJlbGVhc2UoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1JFTEVBU0VEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkvLyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGlzIGRlc2lnbiB0aGF0IGEgY2FzdCBpcyBuZWVkZWQgaGVyZSE/Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudChzdHJ1Y3R1cmVkTW9kZWwsIHR5cGUpOwotCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2lnbmFsUHJlTGlmZUN5Y2xlRXZlbnRSZWxlYXNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRUxFQVNFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQkvLyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGlzIGRlc2lnbiB0aGF0IGEgY2FzdCBpcyBuZWVkZWQgaGVyZSE/Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudChzdHJ1Y3R1cmVkTW9kZWwsIHR5cGUpOwotCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMGY1ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuIEl0Ci0JICogbWF5IGJlIGEgc2luZ2xldG9uIG9yIG5vdCAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUKLQkgKiBJTm9kZUFkYXB0ZXIgLi4uIGJ1dCBpbiBnZW5lcmFsIGl0IGlzIHJlY29tbWVuZGVkIGZvciBhbiBhZGFwdGVyIHRvIGJlCi0JICogc3RhdGVsZXNzLCBzbyB0aGUgZWZmaWNpZW5jaWVzIG9mIGEgc2luZ2xldG9uIGNhbiBiZSBnYWluZWQuCi0JICogCi0JICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIGFkZEFkYXB0ZXIgb24gdGhlIGFkYXB0ZWQKLQkgKiBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlci4KLQkgKi8KLQlJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBvYmplY3QpOwotCi0JLyoqCi0JICogcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LiBVbmxpa2UgY2xvbmUsIHRoaXMgbWV0aG9kCi0JICogbWF5IHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSwgc3VjaCBhcyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUKLQkgKiBBZGFwdGVyRmFjdG9yeSBpcyBpbnRlbmRlZCB0byBiZSBhIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY29weSgpOwotCi0JYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvRG9jdW1lbnRDaGFuZ2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0RvY3VtZW50Q2hhbmdlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTYxZGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvRG9jdW1lbnRDaGFuZ2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudENoYW5nZWQgZXh0ZW5kcyBNb2RlbExpZmVjeWNsZUV2ZW50IHsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZk5ld0RvY3VtZW50OwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZPbGREb2N1bWVudDsKLQotCXByb3RlY3RlZCBEb2N1bWVudENoYW5nZWQoKSB7Ci0KLQkJc3VwZXIoTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ET0NVTUVOVF9DSEFOR0VEKTsKLQotCX0KLQotCXByb3RlY3RlZCBEb2N1bWVudENoYW5nZWQoaW50IGFkZGl0aW9uYWxUeXBlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0KLQkJc3VwZXIobW9kZWwsIE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCB8IGFkZGl0aW9uYWxUeXBlKTsKLQotCX0KLQotCXB1YmxpYyBEb2N1bWVudENoYW5nZWQoaW50IGFkZGl0aW9uYWxUeXBlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50IG9sZERvY3VtZW50LCBJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0KLQkJdGhpcyhhZGRpdGlvbmFsVHlwZSwgbW9kZWwpOwotCQlmT2xkRG9jdW1lbnQgPSBvbGREb2N1bWVudDsKLQkJZk5ld0RvY3VtZW50ID0gbmV3RG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0TmV3RG9jdW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGZOZXdEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRPbGREb2N1bWVudCgpIHsKLQotCQlyZXR1cm4gZk9sZERvY3VtZW50OwotCX0KLQotCXZvaWQgc2V0TmV3RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdEb2N1bWVudCkgewotCi0JCWZOZXdEb2N1bWVudCA9IG5ld0RvY3VtZW50OwotCX0KLQotCXZvaWQgc2V0T2xkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBvbGREb2N1bWVudCkgewotCi0JCWZPbGREb2N1bWVudCA9IG9sZERvY3VtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0ZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2U3NDVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvRmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNpbXBseSBtYWludGFpbnMgdGhlIGxpc3Qgb2YgZmFjdG9yaWVzIGFuZCByZXR1cm5zIHNpbmdsZXRvbgotICogaW5zdGFuY2VzIG9mIHRoZW0uIFNvbWUgImJ1aWx0IGluIiB0eXBlcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvcm0KLSAqIEZhY3RvcnlDb25maWcsIGlmIG5vdCBmb3VuZCByZWdpc3RlcmQsIGJ1dCBub3JtYWxseSBjbGllbnRzIGNhbi9zaG91bGQKLSAqIHJlZ2lzdGVyIHRoZWlyIG93biBmYWN0b3JpZXMuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWN0b3J5UmVnaXN0cnkgaW1wbGVtZW50cyBJRmFjdG9yeVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgTGlzdCBmYWN0b3JpZXM7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCXByb3RlY3RlZCBMaXN0IF9nZXRGYWN0b3JpZXMoKSB7Ci0KLQkJaWYgKGZhY3RvcmllcyA9PSBudWxsKSB7Ci0JCQkvLyBtYXkgbmVlZCB0byB1c2UgamF2YS51dGlsLkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QoKSBpZgotCQkJLy8gc3luY3Jvbml6YXRpb24gYmVjb21lcwotCQkJLy8gbmVjZXNzYXJ5IChhbmQgaWYgc28sIHJlbWVtYmVyIHRvIHN5bmNocm9uaXplIG9uIGZhY3RvcmllcykKLQkJCWZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yaWVzOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCV9nZXRGYWN0b3JpZXMoKS5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJGYWN0b3JpZXMoKSB7Ci0JCWZhY3Rvcmllcy5jbGVhcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmFjdG9yeVJlZ2lzdHJ5I2NvbnRhaW5zKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgdHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdyZSBub3QgdXNpbmcgY2xvbmVkIGxpc3QsIHNvIHN0cmljdGx5IHNwZWFraW5nCi0JCS8vIGlzIG5vdCB0aHJlYWQgc2FmZS4KLQkJTGlzdCBpbnRlcm5hbExpc3QgPSBfZ2V0RmFjdG9yaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJuYWxMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBpbnRlcm5hbExpc3QuZ2V0KGkpOwotCQkJaWYgKGZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBsaXN0IG9mIGZhY3RvcmllcyBpbiB0aGUgcmVnaXN0cnkuIE5vdGU6Ci0JICogdGhpcyBjYW4gbm90IGJlIHVzZWQgdG8gYWRkL3JlbW92ZSBmYWN0b3JpZXMuIEl0cyBwcmltYXJpbHkgcHJvdmlkZWQKLQkgKiBmb3IgdGhvc2UgZmV3IGNhc2VzIHdoZXJlIGEgbGlzdCBvZiBmYWN0b3JpZXMgbXVzdCBiZSBjb3BpZWQgZnJvbSBvbmUKLQkgKiBtb2RlbCBhbmQgYWRkZWQgdG8gYW5vdGhlci4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoKSB7Ci0JCS8vIG5vdGU6IGZvciBvYmplY3QgaW50ZWdyaXR5LCB3ZSBkb24ndCBsZXQgYW55b25lIGdldAotCQkvLyBvdXIgbWFpbiBsaXN0IChzbyB0aGV5IGhhdmUgdG8gYWRkIHRocm91Z2ggYWRkRmFjdG9yeSksCi0JCS8vIGJ1dCB3ZSB3aWxsIHJldHVybiBhIHNoYWxsb3cgImNsb25lZCIgbGlzdC4KLQkJTGlzdCBmYWN0b3J5TGlzdCA9IG5ldyBBcnJheUxpc3QoX2dldEZhY3RvcmllcygpKTsKLQkJcmV0dXJuIGZhY3RvcnlMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgbm90IGEgcHVyZSByZXNpc3RyeS4gRmFjdG9yaWVzIHJldHJpZXZlZCBiYXNlZCBvbgotCSAqIHRoZWlyIHJlc3BvbnNlIHRvICJpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIi4gTm90ZSB0aGF0IGlmIHRoZXJlIGlzIG1vcmUKLQkgKiB0aGFuIG9uZSBmYWN0b3J5IHRoYXQgY2FuIGFuc3dlciAndHJ1ZScgdGhhdCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZAotCSAqIGZhY3RvcnkgaXMgdXNlZC4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvcihPYmplY3QgdHlwZSkgewotCi0JCUFkYXB0ZXJGYWN0b3J5IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChmYWN0b3JpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGlzdFNpemUgPSBmYWN0b3JpZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gbGlzdFNpemUgLSAxOyBpID49IDA7IGktLSkgewotCQkJLy8gSXQgaXMgdGhlIGFkYXB0ZXIgZmFjdG9yaWVzIHJlc3BvbnNpYmlsaXR5IHRvIGFuc3dlcgotCQkJLy8gaXNGYWN0b3J5Rm9yVHlwZSBzbyBpdCBnZXRzIGNob29zZW4uCi0JCQkvLyBOb3RpY2Ugd2UgYXJlIGdvaW5nIHRocm91Z2ggdGhlIGxpc3QgYmFja3dhcmRzIHRvIGdldCB0aGUKLQkJCS8vIGZhY3RvcnkgYWRkZWQgbGFzdC4KLQkJCUFkYXB0ZXJGYWN0b3J5IGEgPSAoQWRhcHRlckZhY3RvcnkpIGZhY3Rvcmllcy5nZXQoaSk7Ci0JCQlpZiAoYS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJcmVzdWx0ID0gYTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG1vZGlmaWVkIHRvIHdvcmsgb24gY29weSBvZiBsaXN0LCBmb3IgVjVQVEYxCi0JCS8vIHNlbmQgcmVsZWFzZSB0byBsb2NhbCBjb3B5IG9mIGxpc3QKLQkJLy8gb2YgZmFjdG9yaWVzLCBzaW5jZSBzb21lIGZhY3RvcmllcywgZHVyaW5nCi0JCS8vIHRoZWlyIHJlbGVhc2UgZnVuY3Rpb24sIG1heSByZW1vdmUKLQkJLy8gdGhlbXNlbHZlcyBmcm9tIHRoZSByZWdpc3RyeS4KLQkJTGlzdCBsb2NhbExpc3QgPSBnZXRGYWN0b3JpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGEgPSAoQWRhcHRlckZhY3RvcnkpIGxvY2FsTGlzdC5nZXQoaSk7Ci0JCQkvLyBUbyBoZWxwIGJ1bGxldCBwcm9vZiBjb2RlLCB3ZSdsbCBjYXRjaCBhbmQgbG9nCi0JCQkvLyBhbnkgbWVzc2FnZXMgdGhyb3duIGJ5IGZhY3RvcmllcyBkdXJpbmcgcmVsZWFzZSwKLQkJCS8vIGJ1dCB3ZSdsbCBhdHRlbXB0IHRvIGtlZXAgZ29pbmcuCi0JCQkvLyBJbiBuZWFybHkgYWxsIGNhc2VzLCB0aG91Z2gsIHN1Y2ggZXJyb3JzIGFyZQotCQkJLy8gc2V2ZXJlIGZvciBwcm9kdWN0L2NsaWVudCwgYW5kIG5lZWQgdG8gYmUgZml4ZWQuCi0JCQl0cnkgewotCQkJCWEucmVsZWFzZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJQcm9ncmFtIHByb2JsZW0gcmVsZWFzaW5nIGZhY3RvcnkiICsgYSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBmYWN0b3J5IGlmIGl0IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RmFjdG9yeUZvcih0eXBlKS4gSWYKLQkgKiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLCBhbGwgYXJlIHJlbW92ZWQuIElmIHRoZXJlIGlzIG5vbmUsIHRoZSBjYWxsCi0JICogc2ltcGx5IHJldHVybnMgKHRoYXQgaXMsIGl0IGlzIG5vdCBjb25zaWRlcmVkIGFuIGVycm9yKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGYWN0b3JpZXNGb3IoamF2YS5sYW5nLk9iamVjdCB0eXBlKSB7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJaW50IGxpc3RTaXplID0gZmFjdG9yaWVzLnNpemUoKTsKLQkJCS8vIHdlJ2xsIGdvIGJhY2t3YXJkcyB0aHJvdWdoIGxpc3QsIHNpbmNlIHdlJ3JlIHJlbW92aW5nLCBzbwotCQkJLy8gJ3NpemUnIGNoYW5nZSB3b24ndCBtYXR0ZXIuCi0JCQkvLyBOb3RlOiBJJ20gYXNzdW1pbmcgb3RoZXIgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gZG8gbm90IGNoYW5nZQotCQkJLy8gcG9zaXRpb24KLQkJCS8vIHNpbXBseSBiZWNhdXNlIGFub3RoZXIgd2FzIHJlbW92ZWQuCi0JCQlmb3IgKGludCBpID0gbGlzdFNpemUgLSAxOyBpID49IDA7IGktLSkgewotCQkJCS8vIEl0IGlzIHRoZSBhZGFwdGVyIGZhY3RvcmllcyByZXNwb25zaWJpbGl0eSB0byBhbnN3ZXIKLQkJCQkvLyBpc0ZhY3RvcnlGb3JUeXBlIHNvIGl0IGdldHMgY2hvb3Nlbi4KLQkJCQlBZGFwdGVyRmFjdG9yeSBhID0gKEFkYXB0ZXJGYWN0b3J5KSBmYWN0b3JpZXMuZ2V0KGkpOwotCQkJCWlmIChhLmlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCQkJZmFjdG9yaWVzLnJlbW92ZShhKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJX2dldEZhY3RvcmllcygpLnJlbW92ZShmYWN0b3J5KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9JRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmNDA1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYWN0b3J5UmVnaXN0cnkgewotCi0Jdm9pZCBhZGRGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpOwotCi0Jdm9pZCBjbGVhckZhY3RvcmllcygpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIGFscmVhZHkgY29udGFpbnMgYSBmYWN0b3J5IGZvciB0aGUgZ2l2ZW4gdHlwZS4gVGhpcyBpcwotCSAqIHB1cmVseSBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgdGhvc2UgZmV3IGNhc2VzIHRoYXQgd2FudCB0byBhdm9pZAotCSAqIGFkZGluZyBhIGZhY3RvcnkgaWYgaXQgaXMgYWxyZWFkeSBpbiB0aGUgcmVnaXN0cnkuCi0JICovCi0JYm9vbGVhbiBjb250YWlucyhPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjbG9uZWQgbGlzdCBvZiB0aGUgZmFjdG9yaWVzIGluIHRoZSByZWdpc3RyeS4KLQkgKi8KLQlMaXN0IGdldEZhY3RvcmllcygpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgYSBub3QgYSBwdXJlIHJlc2lzdHJ5LiBGYWN0b3JpZXMgcmV0cmlldmVkIGJhc2VkIG9uCi0JICogdGhlaXIgcmVzcG9uc2UgdG8gImlzRmFjdG9yeUZvclR5cGUodHlwZSkiLiBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgbW9yZQotCSAqIHRoYW4gb25lIGZhY3RvcnkgdGhhdCBjYW4gYW5zd2VyICd0cnVlJyB0aGF0IHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkCi0JICogZmFjdG9yeSBpcyB1c2VkLgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5IGdldEZhY3RvcnlGb3IoT2JqZWN0IHR5cGUpOwotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgcmVsZWFzZSgpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGZhY3RvcnkgaWYgaXQgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRGYWN0b3J5Rm9yKHR5cGUpLiBJZgotCSAqIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIGFsbCBhcmUgcmVtb3ZlZC4gSWYgdGhlcmUgaXMgbm9uZSwgdGhlIGNhbGwKLQkgKiBzaW1wbHkgcmV0dXJucyAodGhhdCBpcywgaXQgaXMgbm90IGNvbnNpZGVyZWQgYW4gZXJyb3IpLgotCSAqLwotCXZvaWQgcmVtb3ZlRmFjdG9yaWVzRm9yKE9iamVjdCB0eXBlKTsKLQotCXZvaWQgcmVtb3ZlRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlMjBiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lNb2RlbExpZmVjeWNsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsKLQotLyoqCi0gKiBUaGlzIGlzIGFuIGVhcmx5IHZlcnNpb24gb2YgYSBjbGFzcyB0aGF0IG1heSBjaGFuZ2Ugb3ZlciB0aGUgbmV4dCBmZXcKLSAqIG1pbGVzdG9uZXMuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciB7Ci0KLQl2b2lkIHByb2Nlc3NQb3N0TW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKLQotCXZvaWQgcHJvY2Vzc1ByZU1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lNb2RlbExvYWRlckV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9JTW9kZWxMb2FkZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2ZTJiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lNb2RlbExvYWRlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIEBhdXRob3IgbnNkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsTG9hZGVyRXh0ZW5zaW9uIHsKLQkvKioKLQkgKiBDcmVhdGUgYSBTdHJ1Y3R1cmVkIE1vZGVsIHdpdGggdGhlIGdpdmVuIFN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZSBhcwotCSAqIGl0cyBkb2N1bWVudCAoaW5zdGVhZCBvZiBhIG5ldyBkb2N1bWVudCBpbnN0YW5jZSBhcyB3ZWxsKQotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTW9kZWwoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGJhc2VMb2NhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM4M2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlVSSVJlc29sdmVyOwotCi0KLS8qKgotICogUmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBhIHNldCBvZiBBUElzIGZvciBjcmVhdGluZyBhIG5ldyBtb2RlbCBtYW5hZ2VyLAotICogZm9yIG1hbmFnaW5nIChhZGQgb3IgcmVtb3ZlKSBtb2RlbCBsb2FkZXJzIGFuZCBtb2RlbCBkdW1wZXJzLCBhbmQgZm9yCi0gKiBtYW5hZ2luZyAoZ2V0LCByZWxlYXNlLCBzYXZlLCBhbmQgc2F2ZSBhcykgbW9kZWxzLgotICogCi0gKiBDbGllbnRzIHNob3VsZCBub3QgaW1wbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbE1hbmFnZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRFVQTElDQVRFRF9NT0RFTCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlci5EVVBMSUNBVEVEX01PREVMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOTUFOQUdFRF9NT0RFTCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlci5VTk1BTkFHRURfTU9ERUwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogImxhcmdlIiBjaGFuZ2UgdG8gdGhlIG1vZGVsLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50Ci0JICogb3IgaXQgbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICogCi0JICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCBub3RpZmljYXRpb24gdG8gbGlzdG5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kIGlzTW9kZWxTdGF0ZUNoYW5naW5nIGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRldGVybWluIGlmCi0JICogdGhlIG1vZGVsIGlzIGFscmVhZHkgaW4gYSBjaGFuZ2Ugc2VxdWVuY2UuCi0JICovCi0Jdm9pZCBhYm91dFRvQ2hhbmdlTW9kZWxzKCk7Ci0KLQl2b2lkIGFkZE1vZGVsTWFuYWdlckxpc3RlbmVyKElNb2RlbE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgaWQgcHJvdmlkZXMgYSBjb21tb24gd2F5IHRvIGRldGVybWluZSB0aGUgaWQgZnJvbSB0aGUgaW5wdXQKLQkgKiAuLi4gbmVlZGVkIHRvIGdldCBhbmQgc2F2ZSB0aGUgbW9kZWwuIEl0IGlzIGEgc2ltcGxlIGNsYXNzIHV0aWxpdHksIGJ1dAotCSAqIGlzIGFuIGluc3RhbmNlIG1ldGhvZCBzbyBjYW4gYmUgYWNjZXNzZWQgdmlhIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElGaWxlIGZpbGUpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RuZXJzIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyCi0JICogdG8gYWJvdXRUb0NoYW5nZU1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWJvdXRUb0NoYW5nZU1vZGVsIC4uLgotCSAqIG9yIHNvbWUgbGlzdGVuZXJzIGNvdWxkIGJlIGxlZnQgd2FpdGluZyBpbmRlZmluaXRlbHkgZm9yIHRoZSBjaGFuZ2VkCi0JICogZXZlbnQuIFNvLCBpdHMgc3VnZ2VzdGVkIHRoYXQgY2hhbmdlZE1vZGVsIGFsd2F5cyBiZSBpbiBhIGZpbmFsbHkKLQkgKiBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LgotCSAqIAotCSAqIEluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqICAKLQkgKi8KLQl2b2lkIGNoYW5nZWRNb2RlbHMoKTsKLQotCUlTdHJ1Y3R1cmVkTW9kZWwgY29weU1vZGVsRm9yRWRpdChTdHJpbmcgb2xkSWQsIFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2U7Ci0KLQkvKioKLQkgKiBjcmVhdGVOZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhlIG5ldyBpbnN0YW5jZSBoYXMgbm8KLQkgKiBjb250ZW50LiBOb3RlOiB0aGlzIHByb2R1Y2VzIGFuIHVubWFuYWdlZCBtb2RlbCwgZm9yIHRlbXBvcmFyeSB1c2UuIElmCi0JICogYSB0cnVlIHNoYXJlZCBtb2RlbCBpcyBkZXNpcmVkLCB1c2UgImNvcHkiLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU5ld0luc3RhbmNlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gTm90ZTogaXRzIGFzc3VtZSB0aGF0IElGaWxlIGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGFzCi0JICogYSByZXNvdXJjZSB5ZXQuIElmIGl0IGRvZXMsIFJlc291cmNlQWxyZWFkeUV4aXN0cyBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIHRoZSByZXNvdXJjZSBkb2VzIGFscmVhZHkgZXhpc3QsIHRoZW4gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yIGlzCi0JICogdGhlIHJpZ2h0IEFQSSB0byB1c2UuCi0JICogIAotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gTm90ZTogY2xpZW50cyBzaG91bGQgdmVyaWZ5IElGaWxlIGV4aXN0cyBiZWZvcmUgdXNpbmcKLQkgKiB0aGlzIG1ldGhvZC4gSWYgdGhpcyBJRmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbgotCSAqIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCBpcyB0aGUgY29ycmVjdCBBUEkgdG8gdXNlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYQotCSAqIHByb3BlciBwYXJzZXIgYXNzaWduZWQuIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBhbiBlbXB0eQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBuZWVkZWQuIE90aGVyd2lzZSwgdXNlIElGaWxlIGZvcm0uCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLS0gSSBtYXJrZWQgYXMgZGVwcmVjYXRlZCB0byBkaXNjb3VhZ2UgdXNlIG9mIHRoaXMgbWV0aG9kLgotCSAqICAgICAgICAgICAgIEl0IGRvZXMgbm90IHJlYWxseSB3b3JrIGZvciBKU1AgZnJhZ21lbnRzLCBzaW5jZSBKU1AKLQkgKiAgICAgICAgICAgICBGcmFnbWVudHMgbmVlZCBhbiBJRmlsZSB0byBjb3JyZWN0bHkgbG9vayB1cCB0aGUgY29udGVudAotCSAqICAgICAgICAgICAgIHNldHRpbmdzLiBVc2UgSUZpbGUgZm9ybSBpbnN0ZWFkLiBOb3RlOiBzb21lIGNvbmZ1c3Rpb24KLQkgKiAgICAgICAgICAgICB3aXRoIGl0IGFuZCB0aGUgZm9ybSBmb3IgSFRQUCBlbmNvZGluZywgc28gb25jZSBhIG51bGwgYXJnCi0JICogICAgICAgICAgICAgaXMgYWxsb3dlZCBpbiB0aGF0IEFQSSAuLi4gd2UgY2FuIHJlbW92ZSB0aGlzIG9uZS4gKGFmdGVyCi0JICogICAgICAgICAgICAgdmVyaWZ5aW5nIGFnYWluIHdpdGggVG9tL0xpbmtzYnVpbGQpCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmcgaWFuYUVuY29kaW5nTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgY29udGVudCwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLiBJdCBkZXBlbmRzIG9uIHRoZSBsb2FkZXJzIG5ld01vZGVsIG1ldGhvZCB0byByZXR1cm4KLQkgKiBhbiBhcHByb3ByaWF0ZSBTdHJ1Y3V0dXJlZE1vZGVsIGFwcHJvcHJpYXRlbHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLiBJdCBkZXBlbmRzIG9uIHRoZSBsb2FkZXJzIG5ld01vZGVsIG1ldGhvZCB0byByZXR1cm4KLQkgKiBhbiBhcHByb3ByaWF0ZSBTdHJ1Y3V0dXJlZE1vZGVsIGFwcHJvcHJpYXRlbHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpOwotCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFVSSVJlc29sdmVyIHJlc29sdmVyKTsKLQotCS8qKgotCSAqIE5vdGU6IHVzZXJzIG9mIHRoaXMgJ21vZGVsJyBtdXN0IHN0aWxsIHJlbGVhc2UgaXQgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIGRvY3VtZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoSURvY3VtZW50IGRvY3VtZW50KTsKLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjcmVhdGUgYSBtb2RlbC4gVGhpcyBtZXRob2QgZG9lcyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAoaWYgaXQKLQkgKiBleGlzdHMpLiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY2FjaGUgb2YgbW9kZWxzLAotCSAqIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIE5vdGU6IHVzZXJzIG9mIHRoaXMgJ21vZGVsJyBtdXN0IHN0aWxsIHJlbGVhc2UgaXQgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIGRvY3VtZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoSURvY3VtZW50IGRvY3VtZW50KTsKLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjcmVhdGUgYSBtb2RlbC4gVGhpcyBtZXRob2QgZG9lcyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAoaWYgaXQKLQkgKiBleGlzdHMpLiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY2FjaGUgb2YgbW9kZWxzLAotCSAqIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoT2JqZWN0IGlkKTsKLQotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFeGlzdGluZ01vZGVsSWRzKCk7Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgLSBlbmNvZGluZyBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgdGV4dEZpbGVCdWZmZXJEb2N1bWVudCk7Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIC0gYSBVUkkgcmVzb2x2ZXIgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aGVuCi0JICogICAgICAgICAgICAgbmVlZGVkCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KFN0cmluZyBpZCwgSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgLSBlbmNvZGluZyBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgLSBlbmNvZGluZyBhbmQgbGluZSBkZWxpbWl0ZXJzIGFyZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJU3RydWN0dXJlZERvY3VtZW50IHRleHRGaWxlQnVmZmVyRG9jdW1lbnQpOwotCi0JLyoKLQkgKiBAZGVwcmVjYXRlZCAtIGEgVVJJIHJlc29sdmVyIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2hlbgotCSAqICAgICAgICAgICAgIG5lZWRlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY3JlYXRlIGEgbmV3IG1vZGVsIGlmIGl0IGFscmVhZHkgZXhpc3RzIC4uLiBpZgotCSAqIGZvcmNlIGlzIGZhbHNlLiBUaGUgaWRlYSBpcyB0aGF0IGEgY2xpZW50IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uY2UKLQkgKiB3aXRoIGZvcmNlIHNldCB0byBmYWxzZS4gSWYgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gcHJvbXB0IGNsaWVudAotCSAqIGlmIHRoZXkgd2FudCB0byBvdmVyd3JpdGUuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY3JlYXRlIGEgbmV3IG1vZGVsIGlmIGl0IGFscmVhZHkgZXhpc3RzIC4uLiBpZgotCSAqIGZvcmNlIGlzIGZhbHNlLiBUaGUgaWRlYSBpcyB0aGF0IGEgY2xpZW50IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uY2UKLQkgKiB3aXRoIGZvcmNlIHNldCB0byBmYWxzZS4gSWYgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gcHJvbXB0IGNsaWVudAotCSAqIGlmIHRoZXkgd2FudCB0byBvdmVyd3JpdGUuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdChPYmplY3QgaWQpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yRWRpdChPYmplY3QgaWQpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZEZvclJlYWQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbCBtYW5hZ2VyIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0ZUNoYW5naW5nKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIHRoZSBpZCBvZiB0aGUgbW9kZWwuIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0Jdm9pZCBtb3ZlTW9kZWwoT2JqZWN0IG9sZElkLCBPYmplY3QgbmV3SWQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IHR5cGUgb2YgYSBtb2RlbCBjaGFuZ2VzLiBJdHMKLQkgKiBhc3N1bWVkIHRoZSBjb250ZW50VHlwZSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQsIGFuZCB0aGlzIG1ldGhvZCB1c2VzCi0JICogdGhlIHRleHQgb2YgdGhlIG9sZCBvbmUsIHRvIHJlcG9wdWxhdGUgdGhlIHRleHQgb2YgdGhlIG5ldyBvbmUuIEluCi0JICogdGhlb3J5LCB0aGUgYWN0dWFsIGluc3RhbmNlIGNvdWxkIGNoYW5nZSwgKGUuZy4gdXNpbmcgJ3NhdmVBcycgdG8gZ28KLQkgKiBmcm9tIHhtbCB0byBkdGQpLCBidXQgaW4gcHJhY3RpY2UsIHRoZSBpbnRlbnQgb2YgdGhpcyBBUEkgaXMgdG8gcmV0dXJuCi0JICogdGhlIHNhbWUgaW5zdGFuY2UsIGp1c3QgdXNpbmcgZGlmZmVyZW50IGhhbmRsZXJzLCBhZGFwdGVyIGZhY3RvcmllcywKLQkgKiBldGMuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBnZXRNb2RlbCBtZXRob2QsIGV4Y2VwdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB1c2UKLQkgKiB0aGUgY2FjaGVkIHZlcnNpb24sIGJ1dCBmb3JjZXMgdGhlIGNhY2hlZCB2ZXJzaW9uIHRvIGJlIHJlcGxhY2VkIHdpdGggYQotCSAqIGZyZXNoLCB1bmNoYW5nZWQgdmVyc2lvbi4gTm90ZTogdGhpcyBtZXRob2QgZG9lcyBub3QgY2hhbmdlIGFueQotCSAqIHJlZmVyZW5jZSBjb3VudHMuIEFsc28sIGlmIHRoZXJlIGlzIG5vdCBhbHJlYWR5IGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlCi0JICogbW9kZWwsIHRoZW4gdGhpcyBjYWxsIGlzIGVzc2VudGlhbGx5IGlnbm9yZWQgKHRoYXQgaXMsIGl0IGRvZXMgbm90IHB1dAotCSAqIGEgbW9kZWwgaW4gdGhlIGNhY2hlKSBhbmQgcmV0dXJucyBudWxsLgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWxvYWRNb2RlbChPYmplY3QgaWQsIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotCXZvaWQgcmVtb3ZlTW9kZWxNYW5hZ2VyTGlzdGVuZXIoSU1vZGVsTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCXZvaWQgc2F2ZVN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgSUZpbGUgaUZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9JTW9kZWxNYW5hZ2VyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU1vZGVsTWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiN2EzZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9JTW9kZWxNYW5hZ2VyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHRob3NlIHdhbnRpbmcgdG8gbGlzdGVuIHRvIGV2ZW50cyBmaXJlZCBieSB0aGUgbW9kZWwgbWFuYWdlci4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxNYW5hZ2VyTGlzdGVuZXIgewotCi0JLyoqCi0JICogT25lIG9yIG1vcmUgbW9kZWxzIGFyZSBhYm91dCB0byBiZSBjaGFuZ2VkLiBUaGlzIHR5cGljYWxseSBpcyBpbml0aWF0ZWQKLQkgKiBieSBvbmUgY2xpZW50IG9mIHRoZSBtb2RlbCAoc3VjaCBhcyBMaW5rc0J1aWxkZXIpLCB0byBzaWduYWwgdGhhdAotCSAqIHNldmVyYWwgbW9kZWxzIGFyZSBhYm91dCB0byBiZSBjaGFuZ2VkLiBUaGVzZSBtb2RlbHMgbWlnaHQgYmUKLQkgKiBpbnRlcnJlbGF0ZWQsIHNvIGEgbGlzdGVuZXIgKHN1Y2ggYXMgRnJhbWVNYW5nZXIpIHdpbGwga25vdyB0byBhCi0JICogIm1hc3NpdmUiIGNoYW5nZSBpcyBhYm91dCB0byB0YWtlIHBsYWNlLgotCSAqLwotCXZvaWQgbW9kZWxzQWJvdXRUb0JlQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogU2lnbmFscyB0aGF0IHRoZSBjaGFuZ2VzIGZvcmV0b2xkIGJ5IG1vZGVsc0Fib3V0VG9CZUNoYW5nZWQgaGF2ZSBiZWVuCi0JICogbWFkZS4gQSB0eXBpY2FsIHVzZSBtaWdodCBiZSB0byByZWZyZXNoLCBvciB0byByZXN1bWUgcHJvY2Vzc2luZyB0aGF0Ci0JICogd2FzIHN1c3BlbmRlZCBhcyBhIHJlc3VsdCBvZiBtb2RlbHNBYm91dFRvQmVDaGFuZ2VkLgotCSAqLwotCXZvaWQgbW9kZWxzQ2hhbmdlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9JTW9kZWxNYW5hZ2VyUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lNb2RlbE1hbmFnZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmMmMwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lNb2RlbE1hbmFnZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyIGluc3RlYWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxNYW5hZ2VyUGx1Z2luIHsKLQkvLyAgcHJpdmF0ZSBzdGF0aWMgTW9kZWxNYW5hZ2VyUGx1Z2luIGluc3RhbmNlOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWxNYW5hZ2VyKCkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpOwotCi0JcHVibGljIFByZWZlcmVuY2VzIGdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lNb2RlbFN0YXRlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU1vZGVsU3RhdGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjU5NzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU1vZGVsU3RhdGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLQotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgdGhvc2Ugd2FudGluZyB0byBsaXN0ZW4gdG8gYSBtb2RlbCdzIHN0YXRlIGNoYW5naW5nLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JLyoqCi0JICogQSBtb2RlbCBpcyBhYm91dCB0byBiZSBjaGFuZ2VkLiBUaGlzIHR5cGljYWxseSBpcyBpbml0aWF0ZWQgYnkgb25lCi0JICogY2xpZW50IG9mIHRoZSBtb2RlbCwgdG8gc2lnbmFsIGEgbGFyZ2UgY2hhbmdlIGFuZC9vciBhIGNoYW5nZSB0byB0aGUKLQkgKiBtb2RlbCdzIElEIG9yIGJhc2UgTG9jYXRpb24uIEEgdHlwaWNhbCB1c2UgbWlnaHQgYmUgaWYgYSBjbGllbnQgbWlnaHQKLQkgKiB3YW50IHRvIHN1c3BlbmQgcHJvY2Vzc2luZyB1bnRpbCBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZS4KLQkgKi8KLQl2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIFNpZ25hbHMgdGhhdCB0aGUgY2hhbmdlcyBmb3JldG9sZCBieSBtb2RlbEFib3V0VG9CZUNoYW5nZWQgaGF2ZSBiZWVuCi0JICogbWFkZS4gQSB0eXBpY2FsIHVzZSBtaWdodCBiZSB0byByZWZyZXNoLCBvciB0byByZXN1bWUgcHJvY2Vzc2luZyB0aGF0Ci0JICogd2FzIHN1c3BlbmRlZCBhcyBhIHJlc3VsdCBvZiBtb2RlbEFib3V0VG9CZUNoYW5nZWQuCi0JICovCi0Jdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCk7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IGEgbW9kZWwncyBkaXJ0eSBzdGF0ZSBoYXMgY2hhbmdlZCwgYW5kIHBhc3NlcyB0aGF0IHN0YXRlCi0JICogaW4gaXNEaXJ0eS4gQSBtb2RlbCBiZWNvbWVzIGRpcnR5IHdoZW4gYW55IGNoYW5nZSBpcyBtYWRlLCBhbmQgYmVjb21lcwotCSAqIG5vdC1kaXJ0eSB3aGVuIHRoZSBtb2RlbCBpcyBzYXZlZC4KLQkgKi8KLQl2b2lkIG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgYm9vbGVhbiBpc0RpcnR5KTsKLQotCS8qKgotCSAqIEEgbW9kZWxEZWxldGVkIG1lYW5zIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQuIFRoZQotCSAqIG1vZGVsIGl0c2VsZiBpcyBub3QgcmVtb3ZlZCBmcm9tIG1vZGVsIG1hbmFnZW1lbnQgdW50aWwgYWxsIGhhdmUKLQkgKiByZWxlYXNlZCBpdC4gTm90ZTogYmFzZUxvY2F0aW9uIGlzIG5vdCAobmVjZXNzYXJpbHkpIGNoYW5nZWQgaW4gdGhpcwotCSAqIGV2ZW50LCBidXQgbWF5IG5vdCBiZSBhY2N1cmF0ZS4KLQkgKi8KLQl2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogQSBtb2RlbCBoYXMgYmVlbiByZW5hbWVkIG9yIGNvcGllZCAoYXMgaW4gc2F2ZUFzLi4pLiBJbiB0aGUgcmVuYW1lZAotCSAqIGNhc2UsIHRoZSB0d28gcGFyYW1lbnRlcnMgYXJlIHRoZSBzYW1lIGluc3RhbmNlLCBhbmQgb25seSBjb250YWluIHRoZQotCSAqIG5ldyBpbmZvIGZvciBpZCBhbmQgYmFzZSBsb2NhdGlvbi4KLQkgKi8KLQl2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU1vZGVsU3RhdGVMaXN0ZW5lckV4dGVuZGVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lNb2RlbFN0YXRlTGlzdGVuZXJFeHRlbmRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDVlMDI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU1vZGVsU3RhdGVMaXN0ZW5lckV4dGVuZGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyB0d28gbmV3IG1vZGVsIGxldmVsIGV2ZW50cy4gSW4gb3JkZXIgdG8gYXZvaWQKLSAqIHVubmVjZXNzYXJ5IGxhc3QgbWludXRlIGNoYW5nZXMgZnJvbSBjbGllbnRzLCB0aGlzIGludGVyZmFjZSB3YXMgY3JlYXRlZCBhcwotICogYSAic3RvcCBnYXAiIG1lYXN1cmUuIEV2ZW50dWFsbHksIGl0IHdpbGwgYmVjb21lIHBhcnQgb2YgdGhlIG5vcm1hbAotICogTW9kZWxTdGF0ZUxpc3RlbmVyIGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxTdGF0ZUxpc3RlbmVyRXh0ZW5kZWQgZXh0ZW5kcyBJTW9kZWxTdGF0ZUxpc3RlbmVyIHsKLQotCi0Jdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0Jdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lOb2RlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9JTm9kZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0ZjQ2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lOb2RlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCWJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lOb2RlTm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU5vZGVOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTAwNzk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSU5vZGVOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVOb3RpZmllciB7Ci0Jc3RhdGljIGZpbmFsIGludCBBREQgPSAyOwotCi0JLy8gUG9zc2libGUgdmFsdWVzIGZvciBldmVudFR5cGUKLQlzdGF0aWMgZmluYWwgaW50IENIQU5HRSA9IDE7IC8vIHVwZGF0ZSAtIG5vbiBzdHJ1Y3R1cmFsCi0JLy8gcmVtb3ZlZAotCS8vIHdoZW4gbGFyZ2UgY2hhbmdlcyBhcmUgbWFkZSB0byBhIHN1Yi10cmVlCi0Jc3RhdGljIGZpbmFsIGludCBDT05URU5UX0NIQU5HRUQgPSA1OyAvLyBzZW50IHRvIHRoZSBwYXJlbnQgbm90aWZpZXIKLQkvLyB0aGVzZSBzdHJpbmdzIGFyZSBmb3IgcHJpbnRpbmcsIHN1Y2ggYXMgZHVyaW5nIGRlYnVnaW5nCi0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVWRU5UX1RZUEVfU1RSSU5HUyA9IG5ldyBTdHJpbmdbXXsidW5kZWZpbmVkIiwgIkNIQU5HRSIsICJBREQiLCAiUkVNT1ZFIiwgIlNUUlVDVVRSRURfQ0hBTkdFRCIsICJDT05URU5UX0NIQU5HRUQifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQlzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBTVFJVQ1RVUkVfQ0hBTkdFRCA9IDQ7IC8vIHNlbnQgaW4gYWRkaXRpb24gdG8gYWRkcyBhbmQKLQotCS8vIHdoZW4gdGhlIGNoaWxkIHZhbHVlIGNoYW5nZWQKLQotCS8qKgotCSAqIEFkZCBhbiBhZGFwdGVyIG9mIHRoaXMgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmVtZi5ub3RpZnkuSU5vZGVBZGFwdGVyCi0JICovCi0Jdm9pZCBhZGRBZGFwdGVyKElOb2RlQWRhcHRlciBvKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBleGlzaXRpbmcgYWRhcHRlciBvZiB0eXBlICJ0eXBlIiBvciBpZiBub25lIGZvdW5kIGNyZWF0ZSBhCi0JICogbmV3IGFkYXB0ZXIgdXNpbmcgYSByZWdpc3RlcmVkIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCUlOb2RlQWRhcHRlciBnZXRBZGFwdGVyRm9yKE9iamVjdCB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHJlYWQtb25seSBDb2xsZWN0aW9uIG9mIHRoZSBBZGFwdGVycyB0byB0aGlzIG5vdGlmaWVyLgotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuZW1mLm5vdGlmeS5JTm9kZUFkYXB0ZXIKLQkgKi8KLQlDb2xsZWN0aW9uIGdldEFkYXB0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZXhpc2l0aW5nIGFkYXB0ZXIgb2YgdHlwZSAidHlwZSIgb3IgbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JSU5vZGVBZGFwdGVyIGdldEV4aXN0aW5nQWRhcHRlcihPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIG5vdGlmeShpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhbiBhZGFwdGVyIG9mIHRoaXMgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmVtZi5ub3RpZnkuSU5vZGVBZGFwdGVyCi0JICovCi0Jdm9pZCByZW1vdmVBZGFwdGVyKElOb2RlQWRhcHRlciBvKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSVN0YXRlTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9JU3RhdGVNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNTM3M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9JU3RhdGVNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsKLQotCi0KLS8qKgotICogTWFya2VyLW9ubHkgaW50ZXJmYWNlLCBhdCB0aGlzIHBvaW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGF0ZU1lbWVudG8gewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0lTdHJ1Y3R1cmVkTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSVN0cnVjdHVyZWRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVhMTY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvSVN0cnVjdHVyZWRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VUklSZXNvbHZlcjsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZE1vZGVsIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBjbGllbnRzIHRvIGRlY2xhcmUgdGhhdCB0aGV5IGFyZSBhYm91dCB0byBtYWtlIGEKLQkgKiAibGFyZ2UiIGNoYW5nZSB0byB0aGUgbW9kZWwuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mIGNvbnRlbnQKLQkgKiBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0ZW5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCB3aG8gaXMgbWFraW5nIHRoZXNlIGNoYW5nZXMgaGFzIHRoZSByZXNwb25zaWJpbGl0eQotCSAqIHRvIHJlc3RvcmUgdGhlIG1vZGVsJ3Mgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFuZ2VzLiBTZWUKLQkgKiBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuCi0JICogCi0JICogVGhlIG1ldGhvZCBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQgcGFpciB0byBjaGFuZ2VkTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZAotCSAqIGJlZm9yZSBjaGFuZ2VkTW9kZWwuIEEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3Qgbm9yIGNhbGwgYWJvdXRUb0NoYW5nZU1vZGVsIHdpdGhvdXQKLQkgKiBjYWxsaW5nIGNoYW5nZWRNb2RlbCBsYXRlciBmcm9tIHRoZSBzYW1lIFRocmVhZC4KLQkgKi8KLQl2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0Jdm9pZCBhZGRNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCXZvaWQgYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RuZXJzIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyCi0JICogdG8gYWJvdXRUb0NoYW5nZU1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWJvdXRUb0NoYW5nZU1vZGVsIC4uLgotCSAqIG9yIHNvbWUgbGlzdGVuZXJzIGNvdWxkIGJlIGxlZnQgd2FpdGluZyBpbmRlZmluaXRlbHkgZm9yIHRoZSBjaGFuZ2VkCi0JICogZXZlbnQuIFNvLCBpdHMgc3VnZ2VzdGVkIHRoYXQgY2hhbmdlZE1vZGVsIGFsd2F5cyBiZSBpbiBhIGZpbmFsbHkKLQkgKiBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LgotCSAqIAotCSAqIEluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqICAKLQkgKi8KLQl2b2lkIGNoYW5nZWRNb2RlbCgpOwotCi0JbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5tb2RlbC5JU3RydWN0dXJlZE1vZGVsCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjb3B5KFN0cmluZyBpZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UsIFJlc291cmNlQWxyZWFkeUV4aXN0czsKLQotCS8qKgotCSAqIERpc2FibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0KLQkvKioKLQkgKiBFbmFibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQotCS8qKgotCSAqIEVuZCByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBFbmQgcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY2xpZW50LWRlZmluZWQgdmFsdWUgZm9yIHdoYXQgdGhhdCBjbGllbnQgKGFuZC9vciBsb2FkZXIpCi0JICogY29uc2lkZXJzIHRoZSAiYmFzZSIgb2YgdGhlIHN0cnVjdHVyZWQgbW9kZWwuIEZyZXF1ZW50bHkgdGhlIGxvY2F0aW9uCi0JICogaXMgZWl0aGVyIGEgd29ya3NwYWNlIHJvb3QtcmVsYXRpdmUgcGF0aCBvZiBhIHdvcmtzcGFjZSByZXNvdXJjZSBvciBhbgotCSAqIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotCSAqLwotCVN0cmluZyBnZXRCYXNlTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgY29udGVudCB0eXBlIGlkZW50aWZpZXIgKFN0cmluZykgZm9yIHRoaXMgbW9kZWwuCi0JICovCi0JU3RyaW5nIGdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgbW9kZWwncyBJRmFjdG9yeVJlZ2lzdHJ5LiBBIG1vZGVsIGlzIG5vdCB2YWxpZCB3aXRob3V0IG9uZS4KLQkgKi8KLQlJRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JLyoqCi0JICogVGhlIGlkIGlzIHRoZSBpZCB0aGF0IHRoZSBtb2RlbCBtYW5hZ2VyIHVzZXMgdG8gaWRlbnRpZnkgdGhpcyBtb2RlbAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogIAotCSAqLwotCUluZGV4ZWRSZWdpb24gZ2V0SW5kZXhlZFJlZ2lvbihpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBtZW1lbXRvIHRoYXQgY2FuIGxhdGVyIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGUKLQkgKiBzdGF0ZSBhdCB0aGlzIHBvaW50LiBBIG1vZGVsJ3Mgc3RhdGUsIGluIHRoaXMgc2Vuc2UsIGRvZXMgbm90IHJlbGF0ZSB0bwotCSAqIGl0cyBjb250ZW50LCBvciBJZHMsIGV0Yy4sIGp1c3QgaXRzIGRpcnR5IHN0YXRlLCBhbmQgaXRzCi0JICogc3luY2hyb25pemF0aW9uIHN0YXRlIHdpdGggaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0JICogCi0JICogVGhlICdyZXNvdXJjZScgYXJndW1lbnQgbXVzdCBiZSB0aGUgcmVzb3VyY2UgdGhhdCB1bmRlcmxpZXMgdGhlCi0JICogaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIHRoaXMgbWV0aG9kIGlzIHNlbnQgdG8uIE5vdGU6IHRoaXMgcGFyYW1ldGVyIHdpbGwKLQkgKiBub3QgYmUgcmVxdWlyZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mICdzdHJ1Y3V0dXJlZCBtb2RlbCcuCi0JICovCi0JSVN0YXRlTWVtZW50byBnZXRNZW1lbnRvKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLQkvKioKLQkgKiBDb250ZW50VHlwZURlc2NyaXB0aW9uIHByb3ZpZGVzIGFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB3aGF0IHRoZQotCSAqIGNvbnRlbnQgb2YgdGhlIGZpbGUgaXMsIGUuZy4gSFRNTCwgWE1MLCBldGMuIENvbXBhcmUgd2l0aAotCSAqIGdldEV4dGVybmFsRmlsZVR5cGVEZXNjcmlwdGlvbi4gVGhvdWdoIHRoZXkgYm90aCByZXR1cm4gb2JqZWN0cyBvZiB0eXBlCi0JICogQ29udGVudFR5cGVEZXNjcmlwdGlvbiwgdGhlIGV4dGVybmFsIGZpbGUgdHlwZSBpcyBpbnRlbmRlZCB0byBkZW5vdGUKLQkgKiBKU1AsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgY29udGVudCBvZiB0aGF0IEpTUCBmaWxlIGlzLiBFdmVuIGZvciBhIEpTUAotCSAqIGZpbGUsIHRoZSBDb250ZW50VHlwZURlc2NyaXB0aW9uIHdpbGwgYmUgc2V0IGFjY29yZGluZyB0byB0aGF0IGZpbGUncwotCSAqICJpbnRlcm5hbCIgY29udGVudHMuCi0JICogCi0JICogQHJldHVybiBDb250ZW50VHlwZURlc2NyaXB0aW9uCi0JICovCi0JSU1vZGVsSGFuZGxlciBnZXRNb2RlbEhhbmRsZXIoKTsKLQotCUlNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoKTsKLQotCU9iamVjdCBnZXRSZWluaXRpYWxpemVTdGF0ZURhdGEoKTsKLQotCS8qKgotCSAqIEdldCBVUkkgcmVzb2x1dGlvbiBoZWxwZXIKLQkgKi8KLQlVUklSZXNvbHZlciBnZXRSZXNvbHZlcigpOwotCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHVuZGVybHlpbmcgcmVzb3VyY2UsIHdoZW4gdGhpcyBtb2RlbCB3YXMgb3Blbiwgb3IKLQkgKiBsYXN0IHNhdmVkLiAoTm90ZTogZm9yIHRoaXMgdmVyc2lvbiwgdGhlIGNsaWVudCBtdXN0IG1hbmFnZSB0aGUKLQkgKiBhY2N1cmFjeSBvZiB0aGlzIGRhdGEpCi0JICovCi0JbG9uZyBnZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpOwotCi0JLyoqCi0JICogR2V0IHVuZG8gbWFuYWdlci4KLQkgKi8KLQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcigpOwotCi0JLyoqCi0JICogIAotCSAqLwotCWJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlib29sZWFuIGlzTmV3KCk7Ci0KLQlib29sZWFuIGlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIGlmIHRoZSBtb2RlbCBpcyBkaXJ0eSBhbmQgaWYgdGhlIG1vZGVsIGlzCi0JICogc2hhcmVkIGZvciB3cml0ZSBhY2Nlc3MuIFRoZSBsYXN0IHdyaXRlciBhcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gYmUKLQkgKiBzdXJlIHRoZSB1c2VyIGlzIHByb21wdGVkIHRvIHNhdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgaXNTaGFyZWRGb3JSZWFkIG9yIGlzU2hhcmVkRm9yRWRpdAotCSAqIGlzIHRydWUuCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yRWRpdCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yUmVhZCgpOwotCi0JLyoqCi0JICogbmV3SW5zdGFuY2UgaXMgc2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IHRoYXQgdGhlIG5ld0luc3RhbmNlIGNvbnRhaW5zCi0JICogbm8gY29udGVudC4gSXRzIHB1cnBvc2UgaXMgc28gY2xpZW50cyBjYW4gZ2V0IGEgdGVtcG9yYXJ5LCB1bm1hbmFnZWQsCi0JICogbW9kZWwgb2YgdGhlIHNhbWUgInR5cGUiIGFzIHRoZSBvcmlnaW5hbC4gTm90ZTogdGhlIGNsaWVudCBtYXkgc3RpbGwKLQkgKiBuZWVkIHRvIGRvIHNvbWUgaW50aWFsaXphdGlvbiBvZiB0aGUgbW9kZWwgcmV0dXJuZWQgYnkgbmV3SW5zdGFuY2UsCi0JICogZGVwZW5kaW5nIG9uIGRlc2lyZWQgdXNlLiBGb3IgZXhhbXBsZSwgdGhlIG9ubHkgZmFjdG9yaWVzIGluIHRoZQotCSAqIG5ld0luc3RhbmNlIGFyZSB0aG9zZSB0aGF0IHdvdWxkIGJlIG5vcm1hbGx5IGJlIGNyZWF0ZWQgZm9yIGEgbW9kZWwgb2YKLQkgKiB0aGUgZ2l2ZW4gY29udGVudFR5cGUuIE90aGVycyBhcmUgbm90IGNvcGllZCBhdXRvbWF0aWNhbGx5LCBhbmQgaWYKLQkgKiBkZXNpcmVkLCBzaG91bGQgYmUgYWRkZWQgYnkgY2xpZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3SW5zdGFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHJlaW5pdCBwcm9jZWR1cmUuIEZvciB0aGlzIG1vZGVsLiBOb3RlIGZvciBmdXR1cmU6IHRoZXJlIG1heQotCSAqIGJlIGEgZGF5IHdoZXJlIHRoZSBtb2RlbCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGlzIGEgZGlmZmVyZW50Ci0JICogaW5zdGFuY2UgdGhhbiB0aGUgaW5zdGFuY2UgaXQgd2FzIGNhbGxlZCBvbi4gVGhpcyB3aWxsIG9jY3VyIHdoZW4gdGhlcmUKLQkgKiBpcyBmdWxsIHN1cHBvcnQgZm9yICJzYXZlIGFzIiB0eXBlIGZ1bmN0aW9ucywgd2hlcmUgdGhlIG1vZGVsIGNvdWxkCi0JICogdGhlb3JldGljYWxseSBjaGFuZ2UgY29tcGxldGVseS4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIHJlaW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBtb2RlbCB0byBmcmVlIHVwIGFueSByZXNvdXJjZXMgaXQgbWlnaHQgYmUKLQkgKiB1c2luZy4gSW4gcGFydGljdWxhciwgaXRzZWxmLCBhcyBzdG9yZWQgaW4gdGhlIElNb2RlbE1hbmFnZXIuCi0JICogIAotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21FZGl0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqICAKLQkgKi8KLQl2b2lkIHJlbGVhc2VGcm9tUmVhZCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXBsZW5pc2hlcyB0aGUgbW9kZWwgd2l0aCB0aGUgcmVzb3VyY2Ugd2l0aG91dCBzYXZpbmcKLQkgKiBhbnkgcG9zc2libGUgY2hhbmdlcy4gSXQgaXMgdXNlZCB3aGVuIG9uZSBlZGl0b3IgbWF5IGJlIGNsb3NpbmcsIGFuZAotCSAqIHNwZWNpZmlhbGx5IHNheXMgbm90IHRvIHNhdmUgdGhlIG1vZGVsLCBidXQgYW5vdGhlciAiZGlzcGxheSIgb2YgdGhlCi0JICogbW9kZWwgc3RpbGwgbmVlZHMgdG8gaGFuZyBvbiB0byBzb21lIG1vZGVsLCBzbyBuZWVkcyBhIGZyZXNoIGNvcHkuCi0JICogCi0JICogT25seSB2YWxpZCBmb3IgdXNlIHdpdGggbWFuYWdlZCBtb2RlbHMuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXZvaWQgcmVtb3ZlTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEEgbWV0aG9kIHRoYXQgbW9kaWZpZmllcyB0aGUgbW9kZWwncyBzeW5jaG9uaXphdGlvbiBzdGFtcCB0byBtYXRjaCB0aGUKLQkgKiByZXNvdXJjZS4gVHVybnMgb3V0IHRoZXJlJ3Mgc2V2ZXJhbCB3YXlzIG9mIGRvaW5nIGl0LCBzbyB0aGlzIGVuc3VyZXMgYQotCSAqIGNvbW1vbiBhbGdvcml0aG0uCi0JICovCi0Jdm9pZCByZXNldFN5bmNocm9uaXphdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLQl2b2lkIHJlc291cmNlRGVsZXRlZCgpOwotCi0Jdm9pZCByZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpOwotCi0Jdm9pZCByZXN0b3JlU3RhdGUoSVN0YXRlTWVtZW50byBtZW1lbnRvKTsKLQotCXZvaWQgc2F2ZSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgc2F2ZShFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQl2b2lkIHNhdmUoSUZpbGUgaUZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgc2F2ZShJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgc2V0QmFzZUxvY2F0aW9uKFN0cmluZyBuZXdCYXNlTG9jYXRpb24pOwotCi0JcHVibGljIHZvaWQgc2V0RGlydHlTdGF0ZShib29sZWFuIGRpcnR5U3RhdGUpOwotCi0Jdm9pZCBzZXRGYWN0b3J5UmVnaXN0cnkoSUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSk7Ci0KLQkvKioKLQkgKiBUaGUgaWQgaXMgdGhlIGlkIHRoYXQgdGhlIG1vZGVsIG1hbmFnZXIgdXNlcyB0byBpZGVudGlmeSB0aGlzIG1vZGVsCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgaWQpIHRocm93cyBSZXNvdXJjZUluVXNlOwotCi0Jdm9pZCBzZXRNb2RlbEhhbmRsZXIoSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIpOwotCi0Jdm9pZCBzZXRNb2RlbE1hbmFnZXIoSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIpOwotCi0JcHVibGljIHZvaWQgc2V0TmV3U3RhdGUoYm9vbGVhbiBuZXdTdGF0ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIGEgImZsYWciIHRoYXQgcmVpbml0aWFsaXphdGlvbiBpcyBuZWVkZWQuCi0JICovCi0Jdm9pZCBzZXRSZWluaXRpYWxpemVOZWVkZWQoYm9vbGVhbiBiKTsKLQotCS8qKgotCSAqIEhvbGRzIGFueSBkYXRhIHRoYXQgdGhlIHJlaW5pdCBwcm9jZWR1cmUgbWlnaHQgZmluZCB1c2VmdWwgaW4KLQkgKiByZWluaXRpYWxpemluZyB0aGUgbW9kZWwuIFRoaXMgaXMgaGFuZHksIHNpbmNlIHRoZSByZWluaXRpYWxpemF0aW9uIG1heQotCSAqIG5vdCB0YWtlIHBsYWNlIGF0IG9uY2UsIGFuZCBzb21lICJvbGQiIGRhdGEgbWF5IGJlIG5lZWRlZCB0byBwcm9wZXJseQotCSAqIHVuZG8gcHJldmlvdXMgc2V0dGluZ3MuIE5vdGU6IHRoZSBwYXJhbWV0ZXIgd2FzIGludGVudGlhbGx5IG1hZGUgdG8gYmUKLQkgKiBvZiB0eXBlICdPYmplY3QnIHNvIGRpZmZlcmVudCBtb2RlbHMgY2FuIHVzZSBpbiBkaWZmZXJlbnQgd2F5cy4KLQkgKi8KLQl2b2lkIHNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIFNldCB0aGUgVVJJIHJlc29sdXRpb24gaGVscGVyCi0JICovCi0Jdm9pZCBzZXRSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlcik7Ci0KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkvKioKLQkgKiBTZXQgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9JbmRleGVkUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0luZGV4ZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4NWEwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0luZGV4ZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi0KLQotLyoqCi0gKiBUaGVzZSBhcmUgQVBJcyBmb3VuZCB0byBiZSBuZWVkZWQgaW4gb3VyIHRyZWUgb3V0bGluZSB2aWV3ZXIsIHRoYXQgZ28KLSAqIGJleW9uZCB0aGUgc3RhbmRhcmQgRE9NIE5vZGUgSW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4ZWRSZWdpb24gewotCi0JYm9vbGVhbiBjb250YWlucyhpbnQgdGVzdFBvc2l0aW9uKTsKLQotCWludCBnZXRFbmRPZmZzZXQoKTsKLQotCWludCBnZXRTdGFydE9mZnNldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9MaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0xpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3NjkwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL0xpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlV0aWxpdGllczsKLQotCi0vKioKLSAqIEZvciAiaW50ZXJuYWwgdXNlIiBvbmx5IGJ5IEFic3RyYWN0U3RydWN0dXJlZE1vZGVsCi0gKi8KLQotY2xhc3MgTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RSQUNFX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbGlmZWN5Y2xlIjsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKERFRkFVTFRfVFJBQ0VfQ0FURUdPUlkpKTsKLQotCi0JcHJpdmF0ZSBPYmplY3RbXSBmTGlzdGVuZXJzOwotCi0JTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IGNvcHkgb2YgdGhlIGdpdmVuIGxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIExpZmUgQ3ljbGUKLQkgKiBMaXN0ZW5lcnMuCi0JICogCi0JICogTXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGxpc3RlbmVyIGFyZSBhbGxvd2VkLiBUaGlzIGlzIHJlcXVpcmVkIHRvCi0JICogc3VwcG9ydCB0aHJlYWRlZCBsaXN0ZW5lciBtYW5hZ2VtZW50IHByb3Blcmx5IGFuZCBmb3IgbW9kZWwtZHJpdmVuIG1vdmUKLQkgKiB0byB3b3JrLiBGb3IgZXhhbXBsZSwgdHdvIGFkZHMgYW5kIGEgc2luZ2xlIHJlbW92ZSBzaG91bGQgcmVzdWx0IGluIHRoZQotCSAqIGxpc3RlbmVyIHN0aWxsIGxpc3RlbmluZyBmb3IgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgYWRkTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIGxpc3RlbmluZyBtb3JlIHRoYW4gb25jZSIpOwotCQl9Ci0JCWludCBvbGRTaXplID0gMDsKLQkJaWYgKGZMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yIGZpcnN0Ci0JCQkvLyB0aW1lIHRocm91Z2gKLQkJCW9sZFNpemUgPSBmTGlzdGVuZXJzLmxlbmd0aDsKLQkJfQotCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCX0KLQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkvLwotCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCWZMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHNpbmdsZSBjb3B5IG9mIHRoZSBnaXZlbiBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IG9mIExpZmUgQ3ljbGUKLQkgKiBMaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0Jdm9pZCByZW1vdmVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJCWludCBvbGRTaXplID0gZkxpc3RlbmVycy5sZW5ndGg7Ci0JCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlib29sZWFuIHJlbW92ZWRPbmNlID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCWlmIChmTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyICYmICFyZW1vdmVkT25jZSkgewotCQkJCQkvLyBpZ25vcmUgb24gdGhlIGZpcnN0IG1hdGNoCi0JCQkJCXJlbW92ZWRPbmNlID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXQncyBub3QgdGhlIG9uZSB3ZSBhcmUgcmVtb3ZpbmcKLQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZkxpc3RlbmVyc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZSBvbGQKLQkJCS8vIG9uZQotCQkJZkxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJfQotCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIklNb2RlbExpZmVjeWNsZUxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgcmVtb3ZlZCBvbmNlIGJ1dCBzdGlsbCBsaXN0ZW5pbmciKTsKLQkJfQotCX0KLQotCXZvaWQgc2lnbmFsTGlmZWN5Y2xlRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCQlpZiAoREVCVUcpIHsKLQkJCUxvZ2dlci50cmFjZShERUZBVUxUX1RSQUNFX0NBVEVHT1JZLCAiTW9kZWxMaWZlY3ljbGVFdmVudCBmaXJlZCBmb3IgIiArIGV2ZW50LmdldE1vZGVsKCkuZ2V0SWQoKSArICI6ICIgKyBldmVudC50b1N0cmluZygpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW9kZWxMaWZlY3ljbGVFdmVudCBmaXJlZCBmb3IgIiArIGV2ZW50LmdldE1vZGVsKCkuZ2V0SWQoKSArICI6ICIgKyBldmVudC50b1N0cmluZygpKTsKLQkJfQotCQkvLyBXZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZSBsaXN0ZW5lciBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUKLQkJLy8gbGlzdGVuZXIgYXJyYXkgZnJvbSBhbm90aGVyIHRocmVhZAotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZkxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCUlNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyID0gKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldOwotCQkJCS8vIG9ubHkgb25lIHR5cGUgb2YgbGlzdGVuZXIgZm9yIG5vdyAuLi4gdGhpcyBjb3VsZCBiZWNvbWUKLQkJCQkvLyBtb3JlIGNvbXBsZXgKLQkJCQlpZiAoKGV2ZW50LmdldEludGVybmFsVHlwZSgpICYgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQpID09IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UKSB7Ci0JCQkJCWxpc3RlbmVyLnByb2Nlc3NQcmVNb2RlbEV2ZW50KGV2ZW50KTsKLQkJCQl9Ci0JCQkJaWYgKChldmVudC5nZXRJbnRlcm5hbFR5cGUoKSAmIE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVCkgPT0gTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UKSB7Ci0JCQkJCWxpc3RlbmVyLnByb2Nlc3NQb3N0TW9kZWxFdmVudChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9Nb2RlbER1bXBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9Nb2RlbER1bXBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Y5Y2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvTW9kZWxEdW1wZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci0KLQotLyoqCi0gKiBDbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFyZSByZXNwb25zaWJsZSBmb3Igc2F2aW5nIHRoZSBtb2RlbAotICogdG8gdGhlIGZpbGUgc3lzdGVtIChvciB3aGVyZXZlciB0aGUgZHVtcHRlciB3YW50cykuCi0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxEdW1wZXIgewotCi0Jdm9pZCBkdW1wKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUsIElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL01vZGVsTGlmZWN5Y2xlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvTW9kZWxMaWZlY3ljbGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmUyZTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvTW9kZWxMaWZlY3ljbGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gZWFybHkgdmVyc2lvbiBvZiBhIGNsYXNzIHRoYXQgbWF5IGNoYW5nZSBvdmVyIHRoZSBuZXh0IGZldwotICogbWlsZXN0b25lcy4KLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbExpZmVjeWNsZUV2ZW50IHsKLQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BU0sgPSAweDAwRkY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfRElSVFlfU1RBVEUgPSAweDAwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCA9IDB4MDAwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9SRUxFQVNFRCA9IDB4MDAwMDI7Ci0JLy8gdGhpcyBsaXN0IGlzIGZvciAicHVibGljIiBjb25zdW1wdGlvbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1NBVkVEID0gMHgwMDAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBPU1RfRVZFTlQgPSAweDAyMDA7Ci0KLQkvLyBUT0RPOiBmaW5pc2ggc3VwcG9ydCBmb3IgdGhlc2UKLQkvLyBmb2xsb3dpbmcgbm90IGltcGxlbWVudGVkIHlldAotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVJTklUSUFMSVpFRCA9IDB4MDAwNTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1JFTE9BREVEID0gMHgwMDA2OwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURBUFRFUlNfTk9USUZJRUQgPSAweDAwMDc7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9SRVNPVVJDRV9NT1ZFRCA9IDB4MDAwODsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1JFU09VUkNFX0RFTEVURUQgPSAweDAwMDk7Ci0KLQkvLyBUaGlzIGxpc3QgKHVwcGVyIHR3byBieXRlcykgaXMgZm9yIG9ubHkgaW50ZXJuYWwgbWVjaGFuaXNtcyBhbmQKLQkvLyBzdWJjbGFzc2VzCi0JLy8gRm9yIHNpbXBsaWNpdHkgdGhleSBhcmUgIm1hc2tlZCBvdXQiIHdoZW4gY2xpZW50IGNhbGxzIGdldFR5cGUoKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSRV9FVkVOVCA9IDB4MDEwMDsKLQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZNb2RlbDsKLQlwcml2YXRlIGludCBmVHlwZTsKLQotCXB1YmxpYyBNb2RlbExpZmVjeWNsZUV2ZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNb2RlbExpZmVjeWNsZUV2ZW50KGludCB0eXBlKSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBNb2RlbExpZmVjeWNsZUV2ZW50KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgdHlwZSkgewotCQl0aGlzKHR5cGUpOwotCQlmTW9kZWwgPSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVidWdTdHJpbmcoaW50IHR5cGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSAmIE1BU0spIHsKLQkJCWNhc2UgTU9ERUxfU0FWRUQgOgotCQkJCXJlc3VsdCA9ICJNT0RFTF9TQVZFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERUxfUkVMRUFTRUQgOgotCQkJCXJlc3VsdCA9ICJNT0RFTF9SRUxFQVNFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCA6Ci0JCQkJcmVzdWx0ID0gIk1PREVMX0RPQ1VNRU5UX0NIQU5HRUQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVMX0RJUlRZX1NUQVRFIDoKLQkJCQlyZXN1bHQgPSAiTU9ERUxfRElSVFlfU1RBVEUiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQkvKgotCQkJICogY2FzZSBNT0RFTF9SRUlOSVRJQUxJWkVEIDogcmVzdWx0ID0gIk1PREVMX1JFSU5JVElBTElaRUQiOwotCQkJICogYnJlYWs7IGNhc2UgTU9ERUxfUkVMT0FERUQgOiByZXN1bHQgPSAiTU9ERUxfUkVMT0FERUQiOyBicmVhazsKLQkJCSAqIGNhc2UgQURBUFRFUlNfTk9USUZJRUQgOiByZXN1bHQgPSAiQURBUFRFUlNfTk9USUZJRUQiOyBicmVhazsKLQkJCSAqIGNhc2UgTU9ERUxfUkVTT1VSQ0VfTU9WRUQgOiByZXN1bHQgPSAiTU9ERUxfUkVTT1VSQ0VfTU9WRUQiOwotCQkJICogYnJlYWs7IGNhc2UgTU9ERUxfUkVTT1VSQ0VfREVMRVRFRCA6IHJlc3VsdCA9Ci0JCQkgKiAiTU9ERUxfUkVTT1VSQ0VfREVMRVRFRCI7IGJyZWFrOwotCQkJICovCi0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNb2RlbExpZmVjeWNsZUV2ZW50IGRpZCBub3QgaGF2ZSB2YWxpZCB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0SW50ZXJuYWxUeXBlKCkgewotCi0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbCgpIHsKLQotCQlyZXR1cm4gZk1vZGVsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQotCQkvLyBmb3Igbm93LCB3ZSdsbCBtYXNrIHR5cGUgdG8gInB1YmxpYyIgb25lcyB0aGlzIGVhc3kKLQkJLy8gd2F5IC4uLiBidXQgSSBrbm93IHRoZXJlIG11c3QgYmUgYSBiZXR0ZXIgd2F5Ci0JCXJldHVybiBmVHlwZSAmIE1BU0s7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9ICJNb2RlbExpZmVjeWNsZUV2ZW50OiAiICsgZGVidWdTdHJpbmcoZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL01vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL01vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGM1MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9Nb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLQotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBNb2RlbCBmcm9tIGEgcmVzb3VyY2UsIG9yIGFzIGEgbmV3LCBlbXB0eQotICogaW5zdGFuY2UuCi0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxMb2FkZXIgewotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBwZXJmb3JtIGFsbCB0aGUgbW9kZWwgaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQgYmVmb3JlCi0JICogaXQgY29udGFpbnMgY29udGVudCwgbmFtZWx5LCBpdCBzaG91bGQgY2FsbCBuZXdNb2RlbCwgdGhlCi0JICogY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCksIHRoZW4gc2V0QWRhcHRlckZhY3Rvcmllcy4gKHRoaXMgaXMKLQkgKiB0ZW50YXRpdmUpCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbCgpOwotCi0JLyoqCi0JICogTWV0aG9kIGNyZWF0ZU1vZGVsLiBDcmVhdGVzIGEgbmV3IG1vZGVsIGJhc2VkIG9uIG9sZCBvbmUuCi0JICogCi0JICogQHBhcmFtIG9sZE1vZGVsCi0JICogQHJldHVybiBJU3RydWN0dXJlZE1vZGVsCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRob3NlIGZhY3RvcmllcyB3aGljaCBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIHN0cnVjdHVyZWRNb2RlbCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLgotCSAqLwotCUxpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCi0Jdm9pZCBsb2FkKElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCBsb2FkKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyBlbmNvZGluZ05hbWUsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXR1cm4gYW4gbmV3LCBlbXB0eSBTdHJ1Y3R1cmVkIE1vZGVsCi0JICogYXBwcm9wcmlhdGUgZm9yIGl0c2VsZi4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCk7Ci0KLQlJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBnZXQgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhLCBhbmQgcmVwb3B1bGF0ZSB0aGUKLQkgKiBtb2RlbHMgLi4uIG5vcm1hbGx5IGJ5IGEgY2FsbCB0byBzZXRUZXh0IG9uIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZvcgotCSAqIFN0cnVjdHVyZWRNb2RlbHMuIFRoaXMgbWV0aG9kIGlzIG5lZWRlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGNsaWVudHMgYXJlCi0JICogc2hhcmluZyBhIG1vZGVsIGFuZCB0aGVuIGNoYW5nZXMgY2FuY2VsZWQuIFNheSBmb3IgZXhhbXBsZSwgb25lIGVkaXRvcgotCSAqIGFuZCBzZXZlcmFsICJkaXNwbGF5cyIgYXJlIHNoYXJpbmcgYSBtb2RlbCwgaWYgdGhlIGVkaXRvciBpcyBjbG9zZWQKLQkgKiB3aXRob3V0IHNhdmluZyBjaGFuZ2VzLCB0aGVuIHRoZSBkaXNwbGF5cyBzdGlsbCBuZWVkIGEgbW9kZWwsIGJ1dCB0aGV5Ci0JICogc2hvdWxkIHJldmVydCB0byB0aGUgb3JpZ2luYWwgdW5zYXZlZCB2ZXJzaW9uLgotCSAqLwotCXZvaWQgcmVsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9Nb2RlbE1hbmFnZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL01vZGVsTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwMGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL01vZGVsTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db2RlZFN0cmVhbUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkNvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuZXhjZXB0aW9ucy5NYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5GaWxlQnVmZmVyTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLk51bGxNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlByb2plY3RSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VdGlsaXRpZXM7Ci0KLS8qKgotICogTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nLCByZXRyaXZpbmcsIGFuZCBjYWNoaW5nCi0gKiBTdHJ1Y3R1cmVkTW9kZWxzIEl0IHJldHJpZXZlcyB0aGUgY2FjaGVkIG9iamVjdHMgYnkgYW4gaWQgd2hpY2ggaXMKLSAqIHR5cGljYWxseSBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlc291cmNlcyBVUkkuIE5vdGU6IEl0cyBpbXBvcnRhbnQgdGhhdAotICogYWxsIGNsaWVudHMgdGhhdCBzaGFyZSBhIHJlc291cmNlIGRvIHNvIHVzaW5nIDxiPmlkZW50aWNhbCA8L2I+Ci0gKiBpZGVudGlmaWVycywgb3IgZWxzZSBkaWZmZXJlbnQgaW5zdGFuY2VzIHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0cmlldmVkLAotICogZXZlbiBpZiB0aGV5IGFsbCB0ZWNobmljYWxseSBwb2ludCB0byB0aGUgc2FtZSByZXNvdXJjZSBvbiB0aGUgZmlsZSBzeXN0ZW0uCi0gKiBUaGlzIGNsYXNzIGFsc28gcHJvdmlkZXMgYSBjb252ZW5pZW50IHBsYWNlIHRvIHJlZ2lzdGVyIE1vZGVsIExvYWRlcnMgYW5kCi0gKiBEdW1wZXJzIGJhc2VkIG9uICd0eXBlJy4KLSAqLwotY2xhc3MgTW9kZWxNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIElNb2RlbE1hbmFnZXIgewotCi0Jc3RhdGljIGNsYXNzIEVudW1lcmF0ZWRNb2RlbElkcyBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQotCQlFbnVtZXJhdGlvbiBmU2hhcmVkT2JqZWN0S2V5czsKLQotCQlwcm90ZWN0ZWQgRW51bWVyYXRlZE1vZGVsSWRzKERpY3Rpb25hcnkgc2hhcmVkT2JqZWN0cykgewotCi0JCQlpZiAoc2hhcmVkT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQkJLy8gaWYgbm8gc2hhcmVkIG9iamVjdHMgeWV0LCByZXR1cm4gZW1wdHkgZW51bWVyYXRpb24KLQkJCQlmU2hhcmVkT2JqZWN0S2V5cyA9IG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU2hhcmVkT2JqZWN0S2V5cyA9IHNoYXJlZE9iamVjdHMua2V5cygpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCi0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGZTaGFyZWRPYmplY3RLZXlzICE9IG51bGwpCi0JCQkJcmVzdWx0ID0gZlNoYXJlZE9iamVjdEtleXMuaGFzTW9yZUVsZW1lbnRzKCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQotCQkJaWYgKGZTaGFyZWRPYmplY3RLZXlzID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCXJldHVybiBmU2hhcmVkT2JqZWN0S2V5cy5uZXh0RWxlbWVudCgpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFJlYWRFZGl0VHlwZSB7Ci0JCVJlYWRFZGl0VHlwZShTdHJpbmcgdHlwZSkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBEYXRhIGNsYXNzIHRvIHRyYWNrIG91ciBzaGFyZWQgb2JqZWN0cwotCSAqLwotCXN0YXRpYyBjbGFzcyBTaGFyZWRPYmplY3QgewotCQlpbnQgcmVmZXJlbmNlQ291bnRGb3JFZGl0OwotCQlpbnQgcmVmZXJlbmNlQ291bnRGb3JSZWFkOwotCQlJU3RydWN0dXJlZE1vZGVsIHRoZVNoYXJlZE1vZGVsOwotCi0JCVNoYXJlZE9iamVjdChJU3RydWN0dXJlZE1vZGVsIHNoYXJlZE1vZGVsKSB7Ci0JCQl0aGVTaGFyZWRNb2RlbCA9IHNoYXJlZE1vZGVsOwotCQkJcmVmZXJlbmNlQ291bnRGb3JSZWFkID0gMDsKLQkJCXJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9IDA7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1PREVMTUFOQUdFUl9UUkFDRV9DQVRFR09SWSA9ICJJTW9kZWxNYW5hZ2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3VyIHNpbmdsZXRvbiBpbnN0YW5jZQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1vZGVsTWFuYWdlckltcGwgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFJFQURfQlVGRkVSX1NJWkUgPSA0MDk2OwotCi0Jc3luY2hyb25pemVkIHN0YXRpYyBJTW9kZWxNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCi0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBNb2RlbE1hbmFnZXJJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgZmluYWwgUmVhZEVkaXRUeXBlIEVESVQgPSBuZXcgUmVhZEVkaXRUeXBlKCJlZGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBPdXIgY2FjaGUgb2YgbWFuYWdlZCBvYmplY3RzCi0JICovCi0JcHJpdmF0ZSBEaWN0aW9uYXJ5IGZNYW5hZ2VkT2JqZWN0czsKLQotCXByaXZhdGUgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotCXByaXZhdGUgT2JqZWN0W10gZk1vZGVsTWFuYWdlckxpc3RlbmVyczsKLQlwcml2YXRlIGludCBtb2RlbE1hbmFnZXJTdGF0ZUNoYW5naW5nOwotCXByaXZhdGUgZmluYWwgUmVhZEVkaXRUeXBlIFJFQUQgPSBuZXcgUmVhZEVkaXRUeXBlKCJyZWFkIik7IC8vJE5PTi1OTFMtMSQKLQotCU1vZGVsTWFuYWdlckltcGwoKSB7Ci0KLQkJc3VwZXIoKTsKLQkJZk1hbmFnZWRPYmplY3RzID0gbmV3IEhhc2h0YWJsZSgpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uQ3JlYXRlTW9kZWwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLCBVUklSZXNvbHZlciByZXNvbHZlciwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaWQsIGhhbmRsZXIsIHJlc29sdmVyKTsKLQkJCQlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCQkJbG9hZGVyLmxvYWQoVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCBtb2RlbCwgZW5jb2RpbmdSdWxlKTsKLQkJCX0KLQkJCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSd2ZSBhbHJlYWR5IGZvdW5kCi0JCQkJaGFuZGxlUHJvZ3JhbUVycm9yKGUpOwotCQkJfQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBhZGQgdG8gb3VyIGNhY2hlCi0JCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChtb2RlbCk7Ci0JCQkJX2luaXRDb3VudChzaGFyZWRPYmplY3QsIHJ3VHlwZSk7Ci0JCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIGlmIHNoYXJlZCBvYmplY3QgaXMgaW5pdGlhbGx5IGluIG91ciBjYWNoZSwgdGhlbiBzaW1wbHkKLQkJCS8vIGluY3JlbWVudCBpdHMgcmVmIGNvdW50LAotCQkJLy8gYW5kIHJldHVybiB0aGUgb2JqZWN0LgotCQkJX2luY3JDb3VudChzaGFyZWRPYmplY3QsIHJ3VHlwZSk7Ci0JCX0KLQkJLy8gd2UgZXhwZWN0IHRvIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nCi0JCUFzc2VydC5pc05vdE51bGwoc2hhcmVkT2JqZWN0LCAiUHJvZ3JhbSBFcnJvcjogbm8gbW9kZWwgcmVjb3JkZWQgZm9yIGlkICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbm90ZTogY2xpZW50cyBtdXN0IGNhbGwgcmVsZWFzZSBmb3IgZWFjaCB0aW1lIHRoZXkgY2FsbCBnZXQuCi0JCXJldHVybiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25DcmVhdGVNb2RlbChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGlkLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIsIFVSSVJlc29sdmVyIHJlc29sdmVyLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBpZCBtYXkgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChzaGFyZWRPYmplY3QgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IF9jb21tb25DcmVhdGVNb2RlbChpZCwgaGFuZGxlciwgcmVzb2x2ZXIpOwotCQkJCU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAibW9kZWwgd2FzIHJlcXVlc3RlZCBmb3IgaWQgIiArIGlkICsgIiB3aXRob3V0IGEgY29udGVudCBJbnB1dFN0cmVhbSIpOwotCQkJCX0KLQkJCQlsb2FkZXIubG9hZChpZCwgVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCBtb2RlbCwgZW5jb2RpbmcsIGxpbmVEZWxpbWl0ZXIpOwotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3ZlIGFscmVhZHkgZm91bmQKLQkJCQloYW5kbGVQcm9ncmFtRXJyb3IoZSk7Ci0JCQl9Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGFkZCB0byBvdXIgY2FjaGUKLQkJCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KG1vZGVsKTsKLQkJCQlfaW5pdENvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJCQlmTWFuYWdlZE9iamVjdHMucHV0KGlkLCBzaGFyZWRPYmplY3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gaWYgc2hhcmVkIG9iamVjdCBpcyBpbml0aWFsbHkgaW4gb3VyIGNhY2hlLCB0aGVuIHNpbXBseQotCQkJLy8gaW5jcmVtZW50IGl0cyByZWYgY291bnQsCi0JCQkvLyBhbmQgcmV0dXJuIHRoZSBvYmplY3QuCi0JCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJfQotCQkvLyB3ZSBleHBlY3QgdG8gYWx3YXlzIHJldHVybiBzb21ldGhpbmcKLQkJQXNzZXJ0LmlzTm90TnVsbChzaGFyZWRPYmplY3QsICJQcm9ncmFtIEVycm9yOiBubyBtb2RlbCByZWNvcmRlZCBmb3IgaWQgIiArIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBub3RlOiBjbGllbnRzIG11c3QgY2FsbCByZWxlYXNlIGZvciBlYWNoIHRpbWUgdGhleSBjYWxsIGdldC4KLQkJcmV0dXJuIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkNyZWF0ZU1vZGVsKFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCi0JCUFzc2VydC5pc05vdE51bGwoaGFuZGxlciwgIm1vZGVsIGhhbmRsZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IGxvYWRlci5jcmVhdGVNb2RlbCgpOwotCQkvLyBpbiB0aGUgcGFzdCwgaWQgd2FzIG51bGwgZm9yICJ1bm1hbmFnZWQiIGNhc2UsIHNvIHdlIHdvbid0Ci0JCS8vIHRyeSBhbmQgc2V0IGl0Ci0JCWlmIChpZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0SWQoaWQpOwotCQl9Ci0JCXJlc3VsdC5zZXRNb2RlbEhhbmRsZXIoaGFuZGxlcik7Ci0JCXJlc3VsdC5zZXRSZXNvbHZlcihyZXNvbHZlcik7Ci0JCS8vIHNvbWUgb2J2aW91cyByZWR1bmFuY3kgaGVyZSB0aGF0IG1heWJlIGNvdWxkIGJlIGltcHJvdmVkCi0JCS8vIGluIGZ1dHVyZSwgYnV0IGlzIG5lY2Vzc2FyeSBmb3Igbm93Ci0JCXJlc3VsdC5zZXRCYXNlTG9jYXRpb24oaWQpOwotCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJcmVzb2x2ZXIuc2V0RmlsZUJhc2VMb2NhdGlvbihpZCk7Ci0JCX0KLQkJYWRkRmFjdG9yaWVzKHJlc3VsdCwgaGFuZGxlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25HZXRNb2RlbChJRmlsZSBpRmlsZSwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0KLQkJaWYgKGlGaWxlICE9IG51bGwgJiYgaUZpbGUuZXhpc3RzKCkpIHsKLQkJCVN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBjYWxjdWxhdGVVUklSZXNvbHZlcihpRmlsZSk7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlGaWxlLmdldENvbnRlbnRzKHRydWUpKTsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaW5wdXRTdHJlYW0sIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgcndUeXBlLCBlbmNvZGluZ1J1bGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25HZXRNb2RlbChJRmlsZSBpRmlsZSwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBjYWxjdWxhdGVVUklSZXNvbHZlcihpRmlsZSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgcndUeXBlLCBlbmNvZGluZywgbGluZURlbGltaXRlcik7Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uR2V0TW9kZWwoSUZpbGUgZmlsZSwgU3RyaW5nIGlkLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIsIFVSSVJlc29sdmVyIHJlc29sdmVyLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IGlkIG1heSBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0KLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCQltb2RlbCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbChmaWxlKTsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkvLyBhZGQgdG8gb3VyIGNhY2hlCi0JCQkJCXNoYXJlZE9iamVjdCA9IG5ldyBTaGFyZWRPYmplY3QobW9kZWwpOwotCQkJCQlfaW5pdENvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiBzaGFyZWQgb2JqZWN0IGlzIGluaXRpYWxseSBpbiBvdXIgY2FjaGUsIHRoZW4gc2ltcGx5Ci0JCQkJLy8gaW5jcmVtZW50IGl0cyByZWYgY291bnQsCi0JCQkJLy8gYW5kIHJldHVybiB0aGUgb2JqZWN0LgotCQkJCV9pbmNyQ291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJfQotCi0JCQkvLyB3ZSBleHBlY3QgdG8gYWx3YXlzIHJldHVybiBzb21ldGhpbmcKLQkJCUFzc2VydC5pc05vdE51bGwoc2hhcmVkT2JqZWN0LCAiUHJvZ3JhbSBFcnJvcjogbm8gbW9kZWwgcmVjb3JkZWQgZm9yIGlkICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gbm90ZTogY2xpZW50cyBtdXN0IGNhbGwgcmVsZWFzZSBmb3IgZWFjaCB0aW1lIHRoZXkgY2FsbCBnZXQuCi0JCQltb2RlbCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJfQotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIFNoYXJlZE9iamVjdCBfY29tbW9uTmV3TW9kZWwoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gbGV0J3MgY2hlY2sgdG8gc2VlIGlmIHJlc291cmNlIGFscmVhZHkgZXhpc3RzLCBlaXRoZXIgaW4gb3VyIGNhY2hlLAotCQkvLyBvciBvbiB0aGUgc3lzdGVtCi0JCVN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlJU3RydWN0dXJlZE1vZGVsIGFTaGFyZWRNb2RlbCA9IG51bGw7Ci0JCS8vIGlmIHNoYXJlZCBvYmplY3QgaXMgbnVsbCwgdGhlbiB3ZSBkbyBub3QgaGF2ZSBpdCBhbHJlYWR5LCB3aGljaCBpcwotCQkvLyBhcyBub3JtYWxseSBleHBlY3RlZC4KLQkJaWYgKHNoYXJlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQkvLyBpZiBub3QgaW4gY2FjaGUsIHNlZSBpZiB3ZSBjYW4gcmV0cmlldmUgaXQKLQkJCWFTaGFyZWRNb2RlbCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbChpRmlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpZiBzaGFyZWRPYmplY3QgaXMgbm90IG51bGwsIHRoZW4KLQkJCS8vIHNvbWVvbmUgaGFzIGFza2VkIHVzIHRvIGNyZWF0ZSBhIG5ldyBtb2RlbCBmb3IgYSBnaXZlbiBpZCwgYnV0Ci0JCQkvLyBpdCBpbiBmYWN0Ci0JCQkvLyBpcyBhbHJlYWR5IGluIG91ciBjYWNoZSB3aXRoIHRoYXQgaWQuIEluIHRoaXMgY2FzZSB3ZSB3aWxsCi0JCQkvLyB0aHJvdwotCQkJLy8gYW4gImluIHVzZSIgZXhjZXB0aW9uLAotCQkJLy8gKHVubGVzcyBmb3JjZSBpcyBzZXQgdG8gdHJ1ZSkuIEJlY2F1c2UsIHRvIGRvIG90aGVyd2lzZSB3ZSB3aWxsCi0JCQkvLyBiYXNpY2FsbHkgYmUKLQkJCS8vIG92ZXIgd3JpdGluZyBhIG1vZGVsIHRoYXQgYW5vdGhlciBjbGllbnQgaXMgYWxyZWFkeSB1c2luZy4gTm90Ci0JCQkvLyBuaWNlLgotCQkJaWYgKCFmb3JjZSkgewotCQkJCXRocm93IG5ldyBSZXNvdXJjZUluVXNlKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgZ2V0IGhlcmUsIGFuZCByZXN1bHQgKGFuZCBzaGFyZWQgb2JqZWN0KSBhcmUgc3RpbGwgbnVsbCwKLQkJLy8gdGhlbiBhbGwgaXMgb2ssIGFuZCB3ZSBjYW4gY3JlYXRlIGl0LAotCQlpZiAoYVNoYXJlZE1vZGVsID09IG51bGwpIHsKLQkJCWFTaGFyZWRNb2RlbCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbChpRmlsZSk7Ci0JCQkvLyByZW1iZW1iZXIsIGRvbid0IHNldCAndHJ1ZScgaW4gbW9kZWwgaW5pdCwgc2luY2UgdGhhdCdzIGFsd2F5cwotCQkJLy8gdXNlZCwKLQkJCS8vIGV2ZW4gd2hlbiBub3QgbmV3LiAnbmV3JyBpcyBpbnRlbmRlZCB0byBtZWFuICJ0aGVyZSBpcyBub3QgeWV0Ci0JCQkvLyBhCi0JCQkvLyBmaWxlIiBmb3IgdGhlIG1vZGVsLgotCQkJYVNoYXJlZE1vZGVsLnNldE5ld1N0YXRlKHRydWUpOwotCQkJc2hhcmVkT2JqZWN0ID0gYWRkVG9DYWNoZShpZCwgYVNoYXJlZE1vZGVsKTsKLQkJCS8vIHdoZW4gcmVzb3VyY2UgaXMgcHJvdmlkZWQsIHdlIGNhbiBzZXQKLQkJCS8vIHN5bmNocm9uaXphdGlvbiBzdGFtcCAuLi4gb3RoZXJ3aXNlIGNsaWVudCBzaG91bGQKLQkJCS8vIE5vdGU6IG9uZSBjbGllbnQgd2hpY2ggZG9lcyB0aGlzIGlzIEZpbGVNb2RlbFByb3ZpZGVyLgotCQkJYVNoYXJlZE1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoaUZpbGUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gaWYgcmVzdWx0IGlzIG5vdCBudWxsLCB0aGVuIHdlIGhhdmUgdG8gY2hlY2sKLQkJCS8vIGlmICdmb3JjZScgd2FzIGZhbHNlIGJlZm9yZSBkZWNpZGluZyB0bwotCQkJLy8gdGhyb3cgYW4gYWxyZWFkeSBleGlzdHMgZXhjZXB0aW9uLgotCQkJaWYgKGZvcmNlKSB7Ci0JCQkJc2hhcmVkT2JqZWN0ID0gYWRkVG9DYWNoZShpZCwgYVNoYXJlZE1vZGVsKTsKLQkJCQkvLyB3aGVuIHJlc291cmNlIGlzIHByb3ZpZGVkLCB3ZSBjYW4gc2V0Ci0JCQkJLy8gc3luY2hyb25pemF0aW9uIHN0YW1wIC4uLiBvdGhlcndpc2UgY2xpZW50IHNob3VsZAotCQkJCS8vIE5vdGU6IG9uZSBjbGllbnQgd2hpY2ggZG9lcyB0aGlzIGlzIEZpbGVNb2RlbFByb3ZpZGVyLgotCQkJCWFTaGFyZWRNb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKGlGaWxlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRocm93IG5ldyBSZXNvdXJjZUFscmVhZHlFeGlzdHMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hhcmVkT2JqZWN0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIF9nZXRNb2RlbEZvcihJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBSZWFkRWRpdFR5cGUgYWNjZXNzVHlwZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJU3RyaW5nIGlkID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNhbGN1bGF0ZUlkKGRvY3VtZW50KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgInVua25vd24gSVN0cnVjdHVyZWREb2N1bWVudCAiICsgZG9jdW1lbnQpOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgYWNjZXNzVHlwZSk7Ci0JCQltb2RlbCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJfQotCQllbHNlIHsKLQkJCW1vZGVsID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKGRvY3VtZW50KTsKLQkJCXNoYXJlZE9iamVjdCA9IG5ldyBTaGFyZWRPYmplY3QobW9kZWwpOwotCQkJX2luaXRDb3VudChzaGFyZWRPYmplY3QsIGFjY2Vzc1R5cGUpOwotCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pbmNyQ291bnQoU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCwgUmVhZEVkaXRUeXBlIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gUkVBRCkgewotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCsrOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRURJVCkgewotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCsrOwotCQl9Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2luaXRDb3VudChTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0LCBSZWFkRWRpdFR5cGUgdHlwZSkgewotCQlpZiAodHlwZSA9PSBSRUFEKSB7Ci0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkID0gMTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IEVESVQpIHsKLQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgPSAxOwotCQl9Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogIm1hc3NpdmUiIGNoYW5nZSBvbmUgb3IgbW9yZSBtb2RlbHMuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mCi0JICogY29udGVudCBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4gTm90ZQotCSAqIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0bmVycyBpcyBzZW50Ci0JICogb25seSBvbmNlLiBUaGUgbWV0aG9kIGlzTW9kZWxTdGF0ZUNoYW5naW5nIGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvCi0JICogZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbCBpcyBhbHJlYWR5IGluIGEgY2hhbmdlIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhYm91dFRvQ2hhbmdlTW9kZWxzKCkgewotCQkvLyBub3RpY2UgdGhpcyBpcyBqdXN0IGEgcHVibGljIGF2ZW51ZSB0byBvdXIgcHJvdGVjdGVkIG1ldGhvZAotCQlmaXJlTW9kZWxzQWJvdXRUb0JlQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChtb2RlbCwgIm1vZGVsIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCUFzc2VydC5pc05vdE51bGwoaGFuZGxlciwgIm1vZGVsIGhhbmRsZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJSUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5LCAiRmFjdG9yeSBSZWdpc3RyeSBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZhY3RvcnlMaXN0ID0gaGFuZGxlci5nZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCWFkZEZhY3Rvcmllcyhtb2RlbCwgZmFjdG9yeUxpc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBMaXN0IGZhY3RvcnlMaXN0KSB7Ci0JCUFzc2VydC5pc05vdE51bGwobW9kZWwsICJtb2RlbCBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlJRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnksICJGYWN0b3J5IFJlZ2lzdHJ5IGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIE5vdGU6IHdlIGFkZCBhbGwgb2YgdGhlbSBmcm9tIGhhbmRsZXIsIGV2ZW4gaWYKLQkJLy8gYWxyZWFkeSBleGlzdHMuIE1heSBuZWVkIHRvIHJlY29uc2lkZXIgdGhpcy4KLQkJaWYgKGZhY3RvcnlMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFjdG9yeUxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNb2RlbE1hbmFnZXJMaXN0ZW5lcihJTW9kZWxNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFVdGlsaXRpZXMuY29udGFpbnMoZk1vZGVsTWFuYWdlckxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQlpbnQgb2xkU2l6ZSA9IDA7Ci0JCQlpZiAoZk1vZGVsTWFuYWdlckxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yIGZpcnN0Ci0JCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJb2xkU2l6ZSA9IGZNb2RlbE1hbmFnZXJMaXN0ZW5lcnMubGVuZ3RoOwotCQkJfQotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQlpZiAoZk1vZGVsTWFuYWdlckxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmTW9kZWxNYW5hZ2VyTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJfQotCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCS8vCi0JCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCQlmTW9kZWxNYW5hZ2VyTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJLy8KLQkJfQotCX0KLQotCXByaXZhdGUgU2hhcmVkT2JqZWN0IGFkZFRvQ2FjaGUoU3RyaW5nIGlkLCBJU3RydWN0dXJlZE1vZGVsIGFTaGFyZWRNb2RlbCkgewotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0OwotCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KGFTaGFyZWRNb2RlbCk7Ci0JCWZNYW5hZ2VkT2JqZWN0cy5wdXQoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCXJldHVybiBzaGFyZWRPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIGlkIHByb3ZpZGVzIGEgY29tbW9uIHdheSB0byBkZXRlcm1pbmUgdGhlIGlkIGZyb20gdGhlIGlucHV0Ci0JICogLi4uIG5lZWRlZCB0byBnZXQgYW5kIHNhdmUgdGhlIG1vZGVsLiBJdCBpcyBhIHNpbXBsZSBjbGFzcyB1dGlsaXR5LCBidXQKLQkgKiBpcyBhbiBpbnN0YW5jZSBtZXRob2Qgc28gY2FuIGJlIGFjY2Vzc2VkIHZpYSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVJZChJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2FsY3VsYXRlSWQoZmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlSWQgcHJvdmlkZXMgYSBjb21tb24gd2F5IHRvIGRldGVybWluZSB0aGUgaWQgZnJvbSB0aGUgcHJvdmlkZWQKLQkgKiBmaWxlbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUlkKFN0cmluZyBmaWxlbmFtZSkgewotCQkvLyBwcm92aWRpbmcgY29tbW9uIG1ldGhvZCBmb3IgY29uc2lzdGVuY3kuCi0JCS8vIE1heSBldmVudHVhbGx5IG5lZWQgdG8gImNsZWFuIHVwIgotCQkvLyBhbnkgaW5pdGlhbCAiZmlsZTovLyIgcHJvdG9jb2xzLCBldGMuLCBidXQgY3VycmVudGx5IGRvbid0Ci0JCS8vIGtub3cgb2YgYW55b25lIGRvaW5nIHRoYXQuCi0JCVN0cmluZyBpZCA9IGZpbGVuYW1lOwotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2RlbEhhbmRsZXIgY2FsY3VsYXRlVHlwZShJRmlsZSBpRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBJTW9kZWxNYW5hZ2VyIG1tID0gKChNb2RlbE1hbmFnZXJQbHVnaW4pCi0JCS8vIFBsYXRmb3JtLmdldFBsdWdpbihNb2RlbE1hbmFnZXJQbHVnaW4uSUQpKS5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJTW9kZWxIYW5kbGVyUmVnaXN0cnkgY3IgPSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpOwotCQlJTW9kZWxIYW5kbGVyIGNkID0gY3IuZ2V0SGFuZGxlckZvcihpRmlsZSk7Ci0JCXJldHVybiBjZDsKLQl9Ci0KLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgY2FsY3VsYXRlVHlwZShTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNb2RlbEhhbmRsZXJSZWdpc3RyeSBjciA9IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCk7Ci0JCUlNb2RlbEhhbmRsZXIgY2QgPSBjci5nZXRIYW5kbGVyRm9yKGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCXJldHVybiBjZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFVSSVJlc29sdmVyIGNhbGN1bGF0ZVVSSVJlc29sdmVyKElGaWxlIGZpbGUpIHsKLQkJLy8gTm90ZTogc2VlIGNvbW1lbnQgaW4gcGx1Z2luLnhtbCBmb3IgcG90ZW50aWFsbHkKLQkJLy8gYnJlYWtpbmcgY2hhbmdlIGluIGJlaGF2aW9yLgotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXIpIHByb2plY3QuZ2V0QWRhcHRlcihVUklSZXNvbHZlci5jbGFzcyk7Ci0JCWlmIChyZXNvbHZlciA9PSBudWxsKQotCQkJcmVzb2x2ZXIgPSBuZXcgUHJvamVjdFJlc29sdmVyKHByb2plY3QpOwotCQlyZXNvbHZlci5zZXRGaWxlQmFzZUxvY2F0aW9uKGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBhIGNsaWVudCBjb250cm9sbGVkIHdheSBvZiBub3RpZnlpbmcgYWxsCi0JICogSU1vZGVsTWFuYWdlckV2ZW50IGxpc3RuZXJzIHRoYXQgc2V2ZXJhbCBtb2RlbHMgaGF2ZSBjaGFuZ2VkLiBUaGlzCi0JICogbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyIHRvIGFib3V0VG9DaGFuZ2VNb2RlbHMsIGFuZCBtdXN0IGJlIGNhbGxlZAotCSAqIGFmdGVyIGFib3V0VG9DaGFuZ2VNb2RlbCAuLi4gb3Igc29tZSBsaXN0ZW5lcnMgY291bGQgYmUgbGVmdCB3YWl0aW5nCi0JICogaW5kZWZpbml0ZWx5IGZvciB0aGUgY2hhbmdlZCBldmVudC4gU28sIGl0cyBzdWdnZXN0ZWQgdGhhdAotCSAqIGNoYW5nZWRNb2RlbHMgYWx3YXlzIGJlIGluIGEgZmluYWxseSBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQKLQkgKiBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0IGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LiBJbgotCSAqIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjaGFuZ2VkTW9kZWxzKCkgewotCQkvLyBub3RpY2UgdGhpcyBpcyBqdXN0IGEgcHVibGljIGF2ZW51ZSB0byBvdXIgcHJvdGVjdGVkIG1ldGhvZAotCQlmaXJlTW9kZWxzQ2hhbmdlZCgpOwotCX0KLQotCS8qCi0JICogTm90ZTogVGhpcyBtZXRob2QgYXBwZWFycyBpbiBib3RoIE1vZGVsTWFuYWdlckltcGwgYW5kIEpTRWRpdG9yICh3aXRoCi0JICoganVzdCBhIG1pbm9yIGRpZmZlcmVuY2UpLiBUaGV5IHNob3VsZCBiZSBrZXB0IHRoZSBzYW1lLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gaGFuZGxlZCBieSBwbGF0Zm9ybQotCSAqLwotCXByaXZhdGUgdm9pZCBjb252ZXJ0TGluZURlbGltaXRlcnMoSURvY3VtZW50IGRvY3VtZW50LCBJRmlsZSBpRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RlOiBjYWxjdWxhdGVUeXBlKGlGaWxlKSByZXR1cm5zIGEgZGVmYXVsdCB4bWwgbW9kZWwgaGFuZGxlciBpZgotCQkvLyBjb250ZW50IHR5cGUgaXMgbnVsbC4KLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKS5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCQlTdHJpbmcgZW5kT2ZMaW5lQ29kZSA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSWQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUpOwotCQkvLyBlbmRPZkxpbmVDb2RlID09IG51bGwgbWVhbnMgdGhlIGNvbnRlbnQgdHlwZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMKLQkJLy8gZnVuY3Rpb24gKGUuZy4gRFREKQotCQkvLyBlbmRPZkxpbmVDb2RlID09ICIiIG1lYW5zIG5vIHRyYW5zbGF0aW9uCi0JCWlmIChlbmRPZkxpbmVDb2RlICE9IG51bGwgJiYgZW5kT2ZMaW5lQ29kZS5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyVG9Vc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlbmRPZkxpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUikpCi0JCQkJbGluZURlbGltaXRlclRvVXNlID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSOwotCQkJZWxzZSBpZiAoZW5kT2ZMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpKQotCQkJCWxpbmVEZWxpbWl0ZXJUb1VzZSA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19MRjsKLQkJCWVsc2UgaWYgKGVuZE9mTGluZUNvZGUuZXF1YWxzKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSTEYpKQotCQkJCWxpbmVEZWxpbWl0ZXJUb1VzZSA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19DUkxGOwotCi0JCQlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCWludCBsaW5lQ291bnQgPSBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHsKLQkJCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQkJaW50IGxpbmVTdGFydE9mZnNldCA9IGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJCQlpbnQgbGluZUxlbmd0aCA9IGxpbmVJbmZvLmdldExlbmd0aCgpOwotCQkJCQlpbnQgbGluZUVuZE9mZnNldCA9IGxpbmVTdGFydE9mZnNldCArIGxpbmVMZW5ndGg7Ci0KLQkJCQkJaWYgKGkgPCBsaW5lQ291bnQgLSAxKSB7Ci0JCQkJCQlTdHJpbmcgY3VycmVudExpbmVEZWxpbWl0ZXIgPSBkb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKGkpOwotCQkJCQkJaWYgKGN1cnJlbnRMaW5lRGVsaW1pdGVyICE9IG51bGwgJiYgY3VycmVudExpbmVEZWxpbWl0ZXIuY29tcGFyZVRvKGxpbmVEZWxpbWl0ZXJUb1VzZSkgIT0gMCkKLQkJCQkJCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBSZXBsYWNlRWRpdChsaW5lRW5kT2Zmc2V0LCBjdXJyZW50TGluZURlbGltaXRlci5sZW5ndGgoKSwgbGluZURlbGltaXRlclRvVXNlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAobXVsdGlUZXh0RWRpdC5nZXRDaGlsZHJlblNpemUoKSA+IDApCi0JCQkJCW11bHRpVGV4dEVkaXQuYXBwbHkoZG9jdW1lbnQpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhpcyB1c2VkIHRvIGJlIGluIGxvYWRlciwgYnV0IGhhcyBiZWVuIG1vdmVkIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBjb3B5KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCA9IG1vZGVsOwotCQlJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlciA9IG9sZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQlNb2RlbExvYWRlciBsb2FkZXIgPSBtb2RlbEhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJLy8gbmV3TW9kZWwgPSBsb2FkZXIubmV3TW9kZWwoKTsKLQkJbmV3TW9kZWwgPSBsb2FkZXIuY3JlYXRlTW9kZWwob2xkTW9kZWwpOwotCQkvLyBuZXdJZCwgb2xkTW9kZWwuZ2V0UmVzb2x2ZXIoKSwgb2xkTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkpOwotCQluZXdNb2RlbC5zZXRNb2RlbEhhbmRsZXIobW9kZWxIYW5kbGVyKTsKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPQotCQkvLyBvbGRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgPQotCQkvLyBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQubmV3SW5zdGFuY2UoKTsKLQkJLy8gbmV3TW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCW5ld01vZGVsLnNldFJlc29sdmVyKG9sZE1vZGVsLmdldFJlc29sdmVyKCkpOwotCQluZXdNb2RlbC5zZXRNb2RlbE1hbmFnZXIob2xkTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkpOwotCQkvLyBkdXBsaWNhdGVGYWN0b3J5UmVnaXN0cnkobmV3TW9kZWwsIG9sZE1vZGVsKTsKLQkJbmV3TW9kZWwuc2V0SWQobmV3SWQpOwotCQkvLyBzZXQgdGV4dCBvZiBuZXcgb25lIGFmdGVyIGFsbCBpbml0aWFsaXphdGlvbiBpcyBkb25lCi0JCVN0cmluZyBjb250ZW50cyA9IG9sZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFRleHQoKTsKLQkJbmV3TW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0VGV4dCh0aGlzLCBjb250ZW50cyk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgY29weU1vZGVsRm9yRWRpdChTdHJpbmcgb2xkSWQsIFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbnVsbDsKLQkJLy8gZ2V0IHRoZSBleGlzdGluZyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpZAotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbChvbGRJZCk7Ci0JCS8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGlnbm9yZSByZXF1ZXN0ICh0aG91Z2ggdGhpcyB3b3VsZCBub3JtYWxseQotCQkvLyBiZSBhIHByb2dyYW1taW5nIGVycm9yLgotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBub3cgYmUgc3VyZSBuZXdNb2RlbCBkb2VzIG5vdCBleGlzdAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChuZXdJZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJfQotCQkvLyBnZXQgbG9hZGVyIGJhc2VkIG9uIGV4aXN0aW5nIHR5cGUgKG5vdGUgdGhlIHR5cGUgYXNzdW1wdGlvbikKLQkJLy8gT2JqZWN0IHR5cGUgPSAoKElTdHJ1Y3R1cmVkTW9kZWwpIG1vZGVsKS5nZXRUeXBlKCk7Ci0JCS8vIElNb2RlbEhhbmRsZXIgdHlwZSA9IG1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQkvLyBNb2RlbExvYWRlciBsb2FkZXIgPSAoTW9kZWxMb2FkZXIpIGdldE1vZGVsTG9hZGVycygpLmdldCh0eXBlKTsKLQkJLy8gTW9kZWxMb2FkZXIgbG9hZGVyID0gKE1vZGVsTG9hZGVyKSBnZXRNb2RlbExvYWRlcnMoKS5nZXQodHlwZSk7Ci0JCS8vIGFzayB0aGUgbG9hZGVyIHRvIGNvcHkKLQkJbmV3TW9kZWwgPSBjb3B5KG1vZGVsLCBuZXdJZCk7Ci0JCWlmIChuZXdNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBhZGQgdG8gb3VyIGNhY2hlCi0JCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KG5ld01vZGVsKTsKLQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgPSAxOwotCQkJZk1hbmFnZWRPYmplY3RzLnB1dChuZXdJZCwgc2hhcmVkT2JqZWN0KTsKLQkJCXRyYWNlKCJjb3BpZWQgbW9kZWwiLCBuZXdJZCwgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogU2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IHRoZSBuZXcgaW5zdGFuY2UgaGFzIG5vIGNvbnRlbnQuIE5vdGU6IHRoaXMKLQkgKiBwcm9kdWNlcyBhbiB1bm1hbmFnZWQgbW9kZWwsIGZvciB0ZW1wb3JhcnkgdXNlLiBJZiBhIHRydWUgc2hhcmVkIG1vZGVsCi0JICogaXMgZGVzaXJlZCwgdXNlICJjb3B5Ii4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTmV3SW5zdGFuY2UoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gb2xkTW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCk7Ci0JCU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IGxvYWRlci5jcmVhdGVNb2RlbChvbGRNb2RlbCk7Ci0JCW5ld01vZGVsLnNldE1vZGVsSGFuZGxlcihoYW5kbGVyKTsKLQkJaWYgKG5ld01vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIG5ld01vZGVsKS5zZXRDb250ZW50VHlwZUlkZW50aWZpZXIob2xkTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQl9Ci0JCVVSSVJlc29sdmVyIG9sZFJlc29sdmVyID0gb2xkTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQkJbmV3TW9kZWwuc2V0UmVzb2x2ZXIob2xkUmVzb2x2ZXIpOwotCQl0cnkgewotCQkJbmV3TW9kZWwuc2V0SWQoRFVQTElDQVRFRF9NT0RFTCk7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2UgdGhpcyBpcyBhbiB1bm1hbmFnZWQgbW9kZWwKLQkJfQotCQkvLyBiYXNlIGxvY2F0aW9uIHNob3VsZCBiZSBudWxsLCBidXQgd2UnbGwgc2V0IHRvCi0JCS8vIG51bGwgdG8gYmUgc3VyZS4KLQkJbmV3TW9kZWwuc2V0QmFzZUxvY2F0aW9uKG51bGwpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEgcHJvcGVyCi0JICogcGFyc2VyIGFzc2lnbmVkLiBOb3RlOiBpdHMgYXNzdW1lIHRoYXQgSUZpbGUgZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgYXMKLQkgKiBhIHJlc291cmNlIHlldC4gSWYgaXQgZG9lcywgUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgdGhlIHJlc291cmNlIGRvZXMgYWxyZWFkeSBleGlzdCwgdGhlbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IgaXMKLQkgKiB0aGUgcmlnaHQgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIFJlc291cmNlSW5Vc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpRmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IFJlc291cmNlQWxyZWFkeUV4aXN0cyhpRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQkJLy8gV2lsbCByZWNvbnNpZGVyIGluIGZ1dHVyZSB2ZXJzaW9uCi0JCS8vIFN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJLy8gaWYgKGlzUmVzb3VyY2VJblVzZShpZCkpIHsKLQkJLy8gdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoaUZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQkvLyB9Ci0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBudWxsOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJbG9hZGVyID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpOwotCQkvLyBmb3IgdGhpcyBBUEksICJjcmVhdGVOZXciIHdlIGFzc3VtZSB0aGUgSUZpbGUgZG9lcyBub3QgZXhpc3QgeWV0Ci0JCS8vIGFzIGNoZWNrZWQgYWJvdmUsIHNvIGp1c3QgY3JlYXRlIGVtcHR5IGRvY3VtZW50LgotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEgcHJvcGVyCi0JICogcGFyc2VyIGFzc2lnbmVkLiBOb3RlOiBjbGllbnRzIHNob3VsZCB2ZXJpZnkgSUZpbGUgZXhpc3RzIGJlZm9yZSB1c2luZwotCSAqIHRoaXMgbWV0aG9kLiBJZiB0aGlzIElGaWxlIGRvZXMgbm90IGV4aXN0LCB0aGVuCi0JICogY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50IGlzIHRoZSBjb3JyZWN0IEFQSSB0byB1c2UuCi0JICogCi0JICogQHRocm93cyBSZXNvdXJjZUluVXNlCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFpRmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihpRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQkJLy8gV2lsbCByZWNvbnNpZGVyIGluIGZ1dHVyZSB2ZXJzaW9uCi0JCS8vIFN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJLy8gaWYgKGlzUmVzb3VyY2VJblVzZShpZCkpIHsKLQkJLy8gdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoaUZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQkvLyB9Ci0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBudWxsOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJbG9hZGVyID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGlGaWxlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYQotCSAqIHByb3BlciBwYXJzZXIgYXNzaWduZWQuIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBhbiBlbXB0eQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBuZWVkZWQuIE90aGVyd2lzZSwgdXNlIElGaWxlIGZvcm0uCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSBUT0RPOiB0byBiZSByZW1vdmVkIGJ5IEM0IGRvIHdlIHJlYWxseSBuZWVkIHRoaXM/IEkKLQkgKiAgICAgICAgICAgICByZWNvbW1lbmQgdG8gLSB1c2UgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKGZpbGVuYW1lLAotCSAqICAgICAgICAgICAgIG51bGwsIG51bGwpIC0gdGhlIGZpbGVuYW1lIGRvZXMgbm90IG5lZWQgdG8gcmVwcmVzZW50IGEKLQkgKiAgICAgICAgICAgICByZWFsIC0gZmlsZSwgYnV0IGNhbiB0YWtlIGZvciBmb3JtIG9mIGR1bW15LmpzcCwgdGVzdC54bWwsCi0JICogICAgICAgICAgICAgZXRjLiAtIFRoYXQgd2F5IHdlIGRvbid0IGhhcmQgY29kZSB0aGUgaGFuZGxlciwgYnV0IHNwZWNpZnkKLQkgKiAgICAgICAgICAgICB3ZSAtIHdhbnQgdGhlIGhhbmRsZXIgdGhhdCAiZ29lcyB3aXRoIiBhIGNlcnRhaW4gdHlwZSBvZiAtCi0JICogICAgICAgICAgICAgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBudWxsOwotCQlNb2RlbEhhbmRsZXJSZWdpc3RyeSBjciA9IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNyLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKGNvbnRlbnRUeXBlSWQpOwotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJQcm9ncmFtIGVycm9yOiBubyBtb2RlbCBoYW5kbGVyIGZvdW5kIGZvciAiICsgY29udGVudFR5cGVJZCk7Ci0JCWxvYWRlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhCi0JICogcHJvcGVyIHBhcnNlciBhc3NpZ25lZC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtLSAtIFRPRE86IHRvIGJlIHJlbW92ZWQgYnkgQzQgSSBtYXJrZWQgYXMgZGVwcmVjYXRlZCB0bwotCSAqICAgICAgICAgICAgIGRpc2NvdWFnZSB1c2Ugb2YgdGhpcyBtZXRob2QuIEl0IGRvZXMgbm90IHJlYWxseSB3b3JrIGZvcgotCSAqICAgICAgICAgICAgIEpTUCBmcmFnbWVudHMsIHNpbmNlIEpTUCBGcmFnbWVudHMgbmVlZCBhbiBJRmlsZSB0bwotCSAqICAgICAgICAgICAgIGNvcnJlY3RseSBsb29rIHVwIHRoZSBjb250ZW50IHNldHRpbmdzLiBVc2UgSUZpbGUgZm9ybQotCSAqICAgICAgICAgICAgIGluc3RlYWQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaXN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKTsKLQkJaWYgKGlzdHJlYW0gIT0gbnVsbCkgewotCQkJaXN0cmVhbS5yZXNldCgpOwotCQl9Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoZmlsZW5hbWUsIGlzdHJlYW0pOwotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlbmFtZSwgaXN0cmVhbSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWFsIGNhc2UgbWV0aG9kLiBUaGlzIG1ldGhvZCB3YXMgY3JlYXRlZCBmb3IgdGhlIHNwZWNpYWwgY2FzZSB3aGVyZQotCSAqIHRoZXJlIGlzIGFuIGVuY29kaW5nIGZvciBpbnB1dCBzdHJlYW0gdGhhdCBzaG91bGQgb3ZlcnJpZGUgYWxsIHRoZQotCSAqIG5vcm1hbCBydWxlcyBmb3IgZW5jb2RpbmcuIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBhbiBlbmNvZGluZwotCSAqIChjaGFyc2V0KSBzcGVjaWZpZWQgaW4gSFRUUCByZXNwb25zZSBoZWFkZXIsIHRoZW4gdGhhdCBlbmNvZGluZyBpcyB1c2VkCi0JICogdG8gdHJhbnNsYXRlIHRoZSBpbnB1dCBzdHJlYW0gdG8gYSBzdHJpbmcsIGJ1dCB0aGVuIHRoZSBub3JtYWwgZW5jb2RpbmcKLQkgKiBydWxlcyBhcmUgaWdub3JlZCwgc28gdGhhdCB0aGUgc3RyaW5nIGlzIG5vdCB0cmFuc2xhdGVkIHR3aWNlIChmb3IKLQkgKiBleGFtcGxlLCBpZiBpdHMgYW4gSFRNTCAiZmlsZSIsIHRoZW4gZXZlbiBpZiBpdCBjb250YWlucyBhIGNoYXJzZXQgaW4KLQkgKiBtZXRhIHRhZywgaXRzIGlnbm9yZWQgc2luY2UgaXRzIGFzc3VtZWQgaXRzIGFsbCBjb3JyZWN0bHkgZGVjb2RlZCBieQotCSAqIHRoZSBIVFRQIGNoYXJzZXQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlciwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGVudCA9IHJlYWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgZW5jb2RpbmcpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihmaWxlbmFtZSwgY29udGVudCwgcmVzb2x2ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgd2hlbiB0aGUgcmVzb3VyY2UgZG9lcyBub3QKLQkgKiByZWFsbHkgZXhpc3QgKGUuZy4gd2hlbiBjb250ZW50IGlzIGJlaW5nIGNyZWF0ZWQsIGJ1dCBoYXNuJ3QgYmVlbgotCSAqIHdyaXR0ZW4gdG8gZGlzayB5ZXQpLiBOb3RlIHRoYXQgc2luY2UgdGhlIGNvbnRlbnQgaXMgYmVpbmcgcHJvdmlkZWQgYXMKLQkgKiBhIFN0cmluZywgaXQgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGRlY29kZWQgY29ycmVjdGx5IHNvIG5vCi0JICogdHJhbnNmb3JtYXRpb24gaXMgZG9uZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvbnRlbnQsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUT0RPOiBhdm9pZCBhbGwgdGhlc2UgU3RyaW5nIGluc3RhbmNlcwotCQlTdHJpbmdCdWZmZXIgY29udGVudEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGVudCk7Ci0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBudWxsOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGZpbGVuYW1lLCBudWxsKTsKLQkJbG9hZGVyID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCVN0cmluZ0J1ZmZlciBjb252ZXJ0ZWRDb250ZW50ID0gbG9hZGVyLmhhbmRsZUxpbmVEZWxpbWl0ZXIoY29udGVudEJ1ZmZlciwgcmVzdWx0KTsKLQkJcmVzdWx0LnNldEVuY29kaW5nTWVtZW50byhuZXcgTnVsbE1lbWVudG8oKSk7Ci0JCXJlc3VsdC5zZXRUZXh0KHRoaXMsIGNvbnZlcnRlZENvbnRlbnQudG9TdHJpbmcoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlGaWxlCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkRW1wdHlNb2RlbEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQlTdHJpbmcgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCVVSSVJlc29sdmVyIHJlc29sdmVyID0gY2FsY3VsYXRlVVJJUmVzb2x2ZXIoaUZpbGUpOwotCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaWQsIGhhbmRsZXIsIHJlc29sdmVyKTsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSdyZSBub3Qgc2hhcmluZwotCQkJLy8gKGV2ZW4gaWYgaXQgcmVhbGx5IGlzIGluIHVzZSAuLi4gd2UgZG9uJ3QgY2FyZSkKLQkJCS8vIHRoaXMgbWF5IG5lZWQgdG8gYmUgcmUtZXhhbWluZWQuCi0JCQlMb2dnZXIudHJhY2UoSU1PREVMTUFOQUdFUl9UUkFDRV9DQVRFR09SWSwgIk1vZGVsTWFuZ2VySW1wbDo6Y3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yLiBNb2RlbCB1bmV4cGVjdGVkbHkgaW4gdXNlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QuIEl0IGRlcGVuZHMgb24gdGhlIGxvYWRlcnMgbmV3TW9kZWwgbWV0aG9kIHRvIHJldHVybgotCSAqIGFuIGFwcHJvcHJpYXRlIFN0cnVjdXR1cmVkTW9kZWwgYXBwcm9wcmlhdGVseSBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGNyZWF0ZVVuTWFuYWdlZEVtcHR5TW9kZWxGb3IoaUZpbGUpOwotCi0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSByZXN1bHQuZ2V0TW9kZWxIYW5kbGVyKCkuZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQkJSUVuY29kZWREb2N1bWVudCBkb2N1bWVudCA9IGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoaUZpbGUpOwotCi0JCXJlc3VsdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXRUZXh0KHRoaXMsIGRvY3VtZW50LmdldCgpKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLiBJdCBkZXBlbmRzIG9uIHRoZSBsb2FkZXJzIG5ld01vZGVsIG1ldGhvZCB0byByZXR1cm4KLQkgKiBhbiBhcHByb3ByaWF0ZSBTdHJ1Y3V0dXJlZE1vZGVsIGFwcHJvcHJpYXRlbHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlyZXR1cm4gY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSWQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLiBJdCBkZXBlbmRzIG9uIHRoZSBsb2FkZXJzIG5ld01vZGVsIG1ldGhvZCB0byByZXR1cm4KLQkgKiBhbiBhcHByb3ByaWF0ZSBTdHJ1Y3V0dXJlZE1vZGVsIGFwcHJvcHJpYXRlbHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihTdHJpbmcgY29udGVudFR5cGVJZCwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlNb2RlbEhhbmRsZXJSZWdpc3RyeSBjciA9IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNyLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKGNvbnRlbnRUeXBlSWQpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gX2NvbW1vbkNyZWF0ZU1vZGVsKFVOTUFOQUdFRF9NT0RFTCwgaGFuZGxlciwgcmVzb2x2ZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2UncmUgbm90IHNoYXJpbmcKLQkJCS8vIChldmVuIGlmIGl0IHJlYWxseSBpcyBpbiB1c2UgLi4uIHdlIGRvbid0IGNhcmUpCi0JCQkvLyB0aGlzIG1heSBuZWVkIHRvIGJlIHJlLWV4YW1pbmVkLgotCQkJTG9nZ2VyLnRyYWNlKElNT0RFTE1BTkFHRVJfVFJBQ0VfQ0FURUdPUlksICJNb2RlbE1hbmdlckltcGw6OmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvci4gTW9kZWwgdW5leHBlY3RlZGx5IGluIHVzZS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQl2b2lkIGR1bXAoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSwgSUZpbGUgaUZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvZGVkU3RyZWFtQ3JlYXRvciBjb2RlZFN0cmVhbUNyZWF0b3IgPSBuZXcgQ29kZWRTdHJlYW1DcmVhdG9yKCk7Ci0JCVJlYWRlciByZWFkZXIgPSBuZXcgRG9jdW1lbnRSZWFkZXIoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldChpRmlsZSwgcmVhZGVyKTsKLQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldFByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKHN0cnVjdHVyZWREb2N1bWVudC5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBjb2RlZEJ5dGVTdHJlYW0gPSBjb2RlZFN0cmVhbUNyZWF0b3IuZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCQlJbnB1dFN0cmVhbSBjb2RlZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb2RlZEJ5dGVTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCWlGaWxlLnNldENvbnRlbnRzKGNvZGVkU3RyZWFtLCB0cnVlLCB0cnVlLCBudWxsKTsKLQotCQkvLyBnZXREb2N1bWVudER1bXBlcigpLmR1bXAob3V0cHV0U3RyZWFtLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsCi0JCS8vIGVuY29kaW5nUnVsZSwgdXNlM0J5dGVCT00sIGZpbGUpOwotCQltb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJbW9kZWwuc2V0TmV3U3RhdGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgc3RhdGUgbGlzdGVuZXJzIHRoYXQgdGhlIHRoZSBtb2RlbCBpcwotCSAqIGFib3V0IHRvIHVuZGVyIGdvIGEgImxhcmdlIiBjaGFuZ2UuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGludGVybXMgb2YKLQkgKiBjb250ZW50cywgaW4gbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZGVsc0Fib3V0VG9CZUNoYW5nZWQoKSB7Ci0JCS8vIG5vdGljZSB3ZSBvbmx5IGZpcmUgdGhpcyBldmVudCBpZiB3ZSBhcmUgbm90IGFscmVhZHkgaW4gYSBtb2RlbAotCQkvLyBzdGF0ZSBjaGFuZ2luZyBzZXF1ZW5jZQotCQlpZiAobW9kZWxNYW5hZ2VyU3RhdGVDaGFuZ2luZyA9PSAwKSB7Ci0JCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCQkvLyByZW1vdmUgbGlzdG5lcgotCQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5Ci0JCQkvLyBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCQlpZiAoZk1vZGVsTWFuYWdlckxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbE1hbmFnZXJMaXN0ZW5lcnM7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCSgoSU1vZGVsTWFuYWdlckxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbHNBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHdlIGFsd2F5cyBpbmNyZW1lbnQgY291bnRlciwgZm9yIGV2ZXJ5IHJlcXVlc3QgKHNvIG11c3QgcmVjZWl2ZQotCQkvLyBjb3JyZXNwb25kaW5nIG51bWJlciBvZiAnY2hhbmdlZE1vZGVsJyByZXF1ZXN0cykKLQkJbW9kZWxNYW5hZ2VyU3RhdGVDaGFuZ2luZysrOwotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgc3RhdGUgbGlzdGVuZXJzIHRoYXQgYW4gaW1wZW5kaW5nIGNoYW5nZQotCSAqIGlzIG5vdyBjb21wbGV0ZS4gVGhpcyBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCBieSAnbW9kZWxDaGFuZ2VkJwotCSAqIHNpbmNlIGl0IGtlZXBzIHRyYWNrIG9mIGNvdW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxzQ2hhbmdlZCgpIHsKLQkJLy8gYWx3YXlzIGRlY3JlbWVudAotCQltb2RlbE1hbmFnZXJTdGF0ZUNoYW5naW5nLS07Ci0JCS8vIHRvIGJlIGxlc3MgdGhhbiB6ZXJvIGlzIGEgcHJvZ3JhbW1pbmcgZXJyb3IsIGJ1dCB3ZSdsbCByZXNldCB0bwotCQkvLyB6ZXJvCi0JCS8vIHdpdGggbm8gZXJyb3IgbWVzc2FnZXMuCi0JCWlmIChtb2RlbE1hbmFnZXJTdGF0ZUNoYW5naW5nIDwgMCkKLQkJCW1vZGVsTWFuYWdlclN0YXRlQ2hhbmdpbmcgPSAwOwotCQkvLyBXZSBvbmx5IGZpcmUgdGhpcyBldmVudCBpZiBhbGwgcGVuZGluZyByZXF1ZXN0cyBhcmUgZG9uZS4KLQkJLy8gVGhhdCBpcywgaWYgd2UndmUgcmVjZWl2ZWQgdGhlIHNhbWUgbnVtYmVyIG9mIGZpcmVNb2RlbENoYW5nZWQgYXMKLQkJLy8gd2UKLQkJLy8gaGF2ZSBmaXJlTW9kZWxBYm91dFRvQmVDaGFuZ2VkLgotCQlpZiAobW9kZWxNYW5hZ2VyU3RhdGVDaGFuZ2luZyA9PSAwKSB7Ci0JCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCQkvLyByZW1vdmUgbGlzdG5lcgotCQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5Ci0JCQkvLyBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCQlpZiAoZk1vZGVsTWFuYWdlckxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbE1hbmFnZXJMaXN0ZW5lcnM7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCSgoSU1vZGVsTWFuYWdlckxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbHNDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGVkTW9kZWxJZHMgZ2V0RW51bWVyYXRlZE1vZGVsSWRzKCkgewotCQkvLyByZXR1cm4gbmV3IGluc3RhbmNlIGVhY2ggdGltZSBzbyB3aWxsICJhY3QgbGlrZSIgcHJvcGVyIGVudW1lcmF0aW9uCi0JCS8vIHRvIGNsaWVudAotCQkvLyAoaWYgd2UgY2FjaGVkLCBtYXkgbm90IGJlIGF0IGJlZ2lubmluZykuCi0JCXJldHVybiBuZXcgRW51bWVyYXRlZE1vZGVsSWRzKGZNYW5hZ2VkT2JqZWN0cyk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWwoT2JqZWN0IGlkKSB7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCS8vIGlmIG5vdCwgdGhlbiB3ZSdsbCBzaW1wbHkgcmV0dXJuIG51bGwKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB1c2VycyBvZiB0aGlzICdtb2RlbCcgbXVzdCBzdGlsbCByZWxlYXNlIGl0IHdoZW4gZmluaXNoZWQuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZXJlJ3Mgbm90IGEgbW9kZWwgY29ycmVzcG9uZGluZyB0byBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJRW51bWVyYXRpb24gaWRzID0gZ2V0RW51bWVyYXRlZE1vZGVsSWRzKCk7Ci0JCXdoaWxlIChpZHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCU9iamVjdCBwb3RlbnRpYWxJZCA9IGlkcy5uZXh0RWxlbWVudCgpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCB0ZW1wUmVzdWx0ID0gZ2V0RXhpc3RpbmdNb2RlbChwb3RlbnRpYWxJZCk7Ci0JCQlpZiAoZG9jdW1lbnQgPT0gdGVtcFJlc3VsdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkgewotCQkJCXJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KHBvdGVudGlhbElkKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjcmVhdGUgYSBtb2RlbC4gVGhpcyBtZXRob2QgZG9lcyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAoaWYgaXQKLQkgKiBleGlzdHMpLiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY2FjaGUgb2YgbW9kZWxzLAotCSAqIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3QgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoaWQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjcmVhdGUgYSBtb2RlbC4gVGhpcyBtZXRob2QgZG9lcyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAoaWYgaXQKLQkgKiBleGlzdHMpLiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY2FjaGUgb2YgbW9kZWxzLAotCSAqIG51bGwgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIElGaWxlIGZvcm0gLSB0aGlzIG9uZSB3aWxsIGJlY29tZSBwcm90ZWN0ZWQgb3IgcHJpdmF0ZQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChPYmplY3QgaWQpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkvLyBpZiBub3QsIHRoZW4gd2UnbGwgc2ltcGx5IHJldHVybiBudWxsCi0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJLy8gaWYgc2hhcmVkIG9iamVjdCBpcyBpbiBvdXIgY2FjaGUsIHRoZW4gc2ltcGx5IGluY3JlbWVudCBpdHMgcmVmCi0JCQkvLyBjb3VudCwKLQkJCS8vIGFuZCByZXR1cm4gdGhlIG9iamVjdC4KLQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQrKzsKLQkJCXJlc3VsdCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJCXRyYWNlKCJnb3QgZXhpc3RpbmcgbW9kZWwgZm9yIEVkaXQ6ICIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhY2UoIiAgIGluY3JlbWVudGVkIHJlZmVyZW5jZUNvdW50Rm9yRWRpdCAiLCBpZCwgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE5vdGU6IHVzZXJzIG9mIHRoaXMgJ21vZGVsJyBtdXN0IHN0aWxsIHJlbGVhc2UgaXQgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlFbnVtZXJhdGlvbiBpZHMgPSBnZXRFbnVtZXJhdGVkTW9kZWxJZHMoKTsKLQkJd2hpbGUgKGlkcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IHBvdGVudGlhbElkID0gaWRzLm5leHRFbGVtZW50KCk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHRlbXBSZXN1bHQgPSBnZXRFeGlzdGluZ01vZGVsKHBvdGVudGlhbElkKTsKLQkJCWlmIChkb2N1bWVudCA9PSB0ZW1wUmVzdWx0LmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQocG90ZW50aWFsSWQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3QgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoaWQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjcmVhdGUgYSBtb2RlbC4gVGhpcyBtZXRob2QgZG9lcyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAoaWYgaXQKLQkgKiBleGlzdHMpLiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY2FjaGUgb2YgbW9kZWxzLAotCSAqIG51bGwgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIElGaWxlIGZvcm0gLSB0aGlzIG9uZSB3aWxsIGJlY29tZSBwcm90ZWN0ZWQgb3IgcHJpdmF0ZQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChPYmplY3QgaWQpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkvLyBpZiBub3QsIHRoZW4gd2UnbGwgc2ltcGx5IHJldHVybiBudWxsCi0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJLy8gaWYgc2hhcmVkIG9iamVjdCBpcyBpbiBvdXIgY2FjaGUsIHRoZW4gc2ltcGx5IGluY3JlbWVudCBpdHMgcmVmCi0JCQkvLyBjb3VudCwKLQkJCS8vIGFuZCByZXR1cm4gdGhlIG9iamVjdC4KLQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQrKzsKLQkJCXJlc3VsdCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIERNVzogVG9tLCB0aGlzIGlzICJzcGVjaWFsIiBmb3IgbGlua3MgYnVpbGRlciBBc3N1bWluZyBpdHMKLQkgKiAgICAgICAgICAgICBzdGlsbCBuZWVkZWQsIHdvdWxkbid0IGl0IGJlIGJldHRlciB0byBjaGFuZ2UgdG8KLQkgKiAgICAgICAgICAgICBnZXRFeGlzdGluZ01vZGVscygpPyAtLSB3aWxsIGJlIHJlbW92ZWQuIEl0cyBub3QgdGhyZWFkCi0JICogICAgICAgICAgICAgc2FmZSBmb3Igb25lIHRocmVhZCB0byBnZXQgdGhlIEVudW1lcmF0aW9uLCB3aGVuIHVuZGVybHlpbmcKLQkgKiAgICAgICAgICAgICBkYXRhIGNvdWxkIGJlIGNoYW5nZWQgaW4gYW5vdGhlciB0aHJlYWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBFbnVtZXJhdGlvbiBnZXRFeGlzdGluZ01vZGVsSWRzKCkgewotCi0JCUVudW1lcmF0aW9uIHJlc3VsdCA9IGdldEVudW1lcmF0ZWRNb2RlbElkcygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIFRPRE86IHJlcGxhY2UgKG9yIHN1cHBsZW1lbnQpIHRoaXMgaXMgYSAibW9kZWwgaW5mbyIgYXNzb2NpYXRpb24gdG8gdGhlCi0JLy8gSUZpbGUgdGhhdCBjcmVhdGVkIHRoZSBtb2RlbAotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlRm9yKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHBhdGggPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCU9iamVjdCBpZCA9IG1vZGVsLmdldElkKCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXBhdGggPSBpZC50b1N0cmluZygpOwotCQl9Ci0JCS8vIFRPT0RPIG5lZWRzIHJld29yayBmb3IgbGlua2VkIHJlc291cmNlcwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZmlsZSA9IHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKHBhdGgpKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBwcmltYXJ5IGZvcm1zIHRvIGdldCBhIG1hbmFnZWQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIEVESVQsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQubW9kZWwuSU1vZGVsTWFuYWdlciNnZXRNb2RlbEZvckVkaXQoSUZpbGUsCi0JICogICAgICBFbmNvZGluZ1J1bGUpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIEVESVQsIGVuY29kaW5nUnVsZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgRURJVCwgZW5jb2RpbmcsIGxpbmVEZWxpbWl0ZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gX2dldE1vZGVsRm9yKGRvY3VtZW50LCBFRElUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCB1c2UgSUZpbGUgb3IgU3RyaW5nIGZvcm0KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KE9iamVjdCBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JFZGl0KHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBJRmlsZSBvciBTdHJpbmcgZm9ybQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoT2JqZWN0IGlkLCBPYmplY3QgbW9kZWxUeXBlLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlciwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JFZGl0KHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KFN0cmluZyBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogaWQgbWF5IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlucHV0U3RyZWFtIGlzdHJlYW0gPSBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaWQsIGlzdHJlYW0pOwotCQlBc3NlcnQuaXNOb3ROdWxsKGhhbmRsZXIsICJtb2RlbCBoYW5kbGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlzdHJlYW0sIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgRURJVCwgbnVsbCwgbnVsbCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBwcmltYXJ5IGZvcm1zIHRvIGdldCBhIG1hbmFnZWQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgUkVBRCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gX2NvbW1vbkdldE1vZGVsKGlGaWxlLCBSRUFELCBlbmNvZGluZ1J1bGUpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIFN0cmluZyBlbmNvZGluZ05hbWUsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgUkVBRCwgZW5jb2RpbmdOYW1lLCBsaW5lRGVsaW1pdGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIF9nZXRNb2RlbEZvcihkb2N1bWVudCwgUkVBRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyCi0JICogQGRlcHJlY2F0ZWQgdXNlIElGaWxlIG9yIFN0cmluZyBmb3JtCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChPYmplY3QgaWQsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHJpbmdJZCA9IGlkLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBnZXRNb2RlbEZvclJlYWQoc3RyaW5nSWQsIFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKSwgcmVzb2x2ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlcgotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBmb3JtCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChPYmplY3QgaWQsIE9iamVjdCBtb2RlbFR5cGUsIFN0cmluZyBlbmNvZGluZ05hbWUsIFN0cmluZyBsaW5lRGVsaW1pdGVyLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JSZWFkKHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKFN0cmluZyBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpc3RyZWFtID0gVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlkLCBpc3RyZWFtKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaXN0cmVhbSwgaWQsIGhhbmRsZXIsIHJlc29sdmVyLCBSRUFELCBudWxsLCBudWxsKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIG9ubHkgdGVtcG9yYXJpbHkgdmlzaWJsZQotCSAqLwotCXB1YmxpYyBNb2RlbEhhbmRsZXJSZWdpc3RyeSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpIHsKLQkJaWYgKGZNb2RlbEhhbmRsZXJSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmTW9kZWxIYW5kbGVyUmVnaXN0cnkgPSBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBmTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyI2dldE5ld01vZGVsRm9yRWRpdChJRmlsZSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IF9jb21tb25OZXdNb2RlbChpRmlsZSwgZm9yY2UpOwotCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID0gMTsKLQkJcmV0dXJuIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIjZ2V0TmV3TW9kZWxGb3JSZWFkKElGaWxlLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBfY29tbW9uTmV3TW9kZWwoaUZpbGUsIGZvcmNlKTsKLQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9IDE7Ci0JCXJldHVybiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UmVmZXJlbmNlQ291bnQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpCi0JCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgKyBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0OwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb3VudCA9IDA7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKQotCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0OwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb3VudCA9IDA7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKQotCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbnZlcnRMaW5lRGVsaW1pdGVycyhJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUsIEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCkgPiAxKSB7Ci0JCQlTdHJpbmcgb3JpZ2luYWxUZXh0ID0gc3RydWN0dXJlZERvY3VtZW50LmdldCgpOwotCQkJY29udmVydExpbmVEZWxpbWl0ZXJzKHN0cnVjdHVyZWREb2N1bWVudCwgaUZpbGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2dyYW1FcnJvcihUaHJvd2FibGUgdCkgewotCi0JCUxvZ2dlci5sb2dFeGNlcHRpb24oIkltcG9zc2libGUgUHJvZ3JhbSBFcnJvciIsIHQpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYWRhcHRlcnMgZm9yIHJlc291cmNlcyB1c2luZyBhbiBleHRlbnNpb24gcG9pbnQuIFJlcXVpcmVkIHRvCi0JICogZW5zdXJlIHRoYXQgY2FsY3VsYXRlVVJJUmVzb2x2ZXIgaGFzIHRoZSBuZWNlc3NhcnkgZmFjdG9yaWVzIHJlZ2lzdGVyZWQKLQkgKiBiZWZvcmUgYW55IG1vZGVscyBhcmUgbG9hZGVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gd3JvbmcgcGxhY2UgdG8gZG8gdGhpcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRSZXNvdXJjZUFkYXB0ZXJzKCkgewotCi0JCS8vIE5vdGU6IHNlZSBjb21tZW50IGluIHBsdWdpbi54bWwgZm9yIHBvdGVudGlhbGx5Ci0JCS8vIGJyZWFraW5nIGNoYW5nZSBpbiBiZWhhdmlvci4KLQotCQkvLyBuZXcgVVJJUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKCkubG9hZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzUmVzb3VyY2VJblVzZShTdHJpbmcgaWQpIHsKLQkvLwotCS8vIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JLy8gSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JLy8gRW51bWVyYXRpb24gaWRzID0gZ2V0RW51bWVyYXRlZE1vZGVsSWRzKCk7Ci0JLy8gd2hpbGUgKGlkcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCS8vIE9iamVjdCBpblVzZUlEID0gaWRzLm5leHRFbGVtZW50KCk7Ci0JLy8gaWYgKGlkLmVxdWFscyhpblVzZUlEKSkgewotCS8vIHJlc3VsdCA9IHRydWU7Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gcmVzdWx0OwotCS8vIH0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2hhcmVkKE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb3VudCA9IDA7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKQotCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkICsgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJcmVzdWx0ID0gY291bnQgPiAxOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NoYXJlZEZvckVkaXQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpCi0JCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQ7Ci0JCXJlc3VsdCA9IGNvdW50ID4gMTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNTaGFyZWRGb3JSZWFkKE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb3VudCA9IDA7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKQotCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkOwotCQlyZXN1bHQgPSBjb3VudCA+IDE7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIG1hbmFnZXIgaXMgd2l0aGluIGEKLQkgKiAiYWJvdXRUb0NoYW5nZSIgYW5kICJjaGFuZ2VkIiBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNTdGF0ZUNoYW5naW5nKCkgewotCi0JCXJldHVybiBtb2RlbE1hbmFnZXJTdGF0ZUNoYW5naW5nID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIHRoZSBpZCBvZiB0aGUgbW9kZWwuIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtb3ZlTW9kZWwoT2JqZWN0IG9sZElkLCBPYmplY3QgbmV3SWQpIHsKLQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuQXNzZXJ0LmlzTm90TnVsbChvbGRJZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChvbGRJZCk7Ci0JCS8vIGlmIG5vdCBmb3VuZCBpbiBjYWNoZSwgaWdub3JlIHJlcXVlc3QuCi0JCS8vIHRoaXMgd291bGQgbm9ybWFsbHkgYmUgYSBwcm9ncmFtIGVycm9yCi0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJZk1hbmFnZWRPYmplY3RzLnJlbW92ZShvbGRJZCk7Ci0JCQlmTWFuYWdlZE9iamVjdHMucHV0KG5ld0lkLCBzaGFyZWRPYmplY3QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgaWFuYUVuY29kaW5nTmFtZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgYWxsVGV4dCA9IG51bGw7Ci0JCWlmICgoaWFuYUVuY29kaW5nTmFtZSAhPSBudWxsKSAmJiAoaWFuYUVuY29kaW5nTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJU3RyaW5nIGVuYyA9IENvZGVkSU8uZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChpYW5hRW5jb2RpbmdOYW1lKTsKLQkJCWlmIChlbmMgPT0gbnVsbCkgewotCQkJCS8vIGlmIG5vIGNvbnZlcnNpb24gd2FzIHBvc3NpYmxlLCBsZXQncyBhc3N1bWUgdGhhdAotCQkJCS8vIHRoZSBlbmNvZGluZyBpcyBhbHJlYWR5IGEgamF2YSBlbmNvZGluZyBuYW1lLCBzbyB3ZSdsbAotCQkJCS8vIHByb2NlZWQgd2l0aCB0aGF0IGFzc3VtcHRpb24uIFRoaXMgaXMgdGhlIGNhc2UsIGZvcgotCQkJCS8vIGV4YW1wbGUsCi0JCQkJLy8gZm9yIHRoZSByZWxvYWQoKSBwcm9jZWR1cmUuCi0JCQkJLy8gSWYgaW4gZmFjdCBpdCBpcyBub3QgYSB2YWxpZCBqYXZhIGVuY29kaW5nLCB0aGVuCi0JCQkJLy8gdGhlICJhbGxUZXh0PSIgbGluZSB3aWxsIGNhdXNlIGFuCi0JCQkJLy8gVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCQkJCWVuYyA9IGlhbmFFbmNvZGluZ05hbWU7Ci0JCQl9Ci0JCQlhbGxUZXh0ID0gcmVhZElucHV0U3RyZWFtKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgZW5jKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3ZSBub3JtYWxseSBhc3N1bWUgZW5jb2RpbmcgaXMgcHJvdmlkZWQgZm9yIHRoaXMgbWV0aG9kLCBidXQgaWYKLQkJCS8vIG5vdCwKLQkJCS8vIHdlJ2xsIHVzZSBwbGF0Zm9ybSBkZWZhdWx0Ci0JCQlhbGxUZXh0ID0gcmVhZElucHV0U3RyZWFtKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSkpOwotCQl9Ci0JCXJldHVybiBhbGxUZXh0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlYWRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbVJlYWRlciBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpbnQgbnVtUmVhZCA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXIgdEJ1ZmZbXSA9IG5ldyBjaGFyW1JFQURfQlVGRkVSX1NJWkVdOwotCQl3aGlsZSAoKG51bVJlYWQgPSBpbnB1dFN0cmVhbS5yZWFkKHRCdWZmLCAwLCB0QnVmZi5sZW5ndGgpKSAhPSAtMSkgewotCQkJYnVmZmVyLmFwcGVuZCh0QnVmZiwgMCwgbnVtUmVhZCk7Ci0JCX0KLQkJLy8gcmVtZW1iZXIgLS0gd2UgZGlkbid0IG9wZW4gc3RyZWFtIC4uLiBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIjcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0KLQkJLy8gZ2V0SGFuZGxlciAoYXNzdW1lIGl0cyB0aGUgIm5ldyBvbmUiKQotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJLy8gZ2V0TG9hZGVyIGZvciB0aGF0IG5ldyBvbmUKLQkJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQkvLyBhc2sgaXQgdG8gcmVpbml0aWFsaXplCi0JCW1vZGVsID0gbG9hZGVyLnJlaW5pdGlhbGl6ZShtb2RlbCk7Ci0JCS8vIHRoZSBsb2FkZXIgc2hvdWxkIGNoZWNrIHRvIHNlZSBpZiB0aGUgb25lIGl0IHJlY2VpdmVkCi0JCS8vIGlzIHRoZSBzYW1lIHR5cGUgaXQgd291bGQgbm9ybWFsbHkgY3JlYXRlLgotCQkvLyBpZiBub3QsIGl0IG11c3QgInN0YXJ0IGZyb20gc2NyYXRjaCIgYW5kIGNyZWF0ZSBhIHdob2xlCi0JCS8vIG5ldyBvbmUuCi0JCS8vIGlmIGl0IGlzIG9mIHRoZSBzYW1lIHR5cGUsIGl0IHNob3VsZCBqdXN0ICdyZXBsYWNlIHRleHQnCi0JCS8vIHJlcGxhY2luZyBhbGwgdGhlIGV4aXN0aW5nIHRleHQgd2l0aCB0aGUgbmV3IHRleHQuCi0JCS8vIHRoZSBpbXBvcnRhbnQgb25lIGlzIHRoZSBKU1AgbG9hZGVyIC4uLiBpdCBzaG91bGQgZ28gdGhyb3VnaAotCQkvLyBpdHMgZW1iZWRkZWQgY29udGVudCBjaGVja2luZyBhbmQgaW5pdGlhbGl6YXRpb24KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIHByb3RlY3RlZCBmb3IgdXNlIGluIHNhbWUgcGFja2FnZSwgbm90IHN1YmNsYXNzZXMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZUZyb21FZGl0KE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBudWxsOwotCi0JCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHNoYXJlZE9iamVjdCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdC0tOwotCQkJaWYgKChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkID09IDApICYmIChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID09IDApKSB7Ci0JCQkJZk1hbmFnZWRPYmplY3RzLnJlbW92ZShpZCk7Ci0JCQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VNb2RlbChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJvdGVjdGVkIGZvciB1c2UgaW4gc2FtZSBwYWNrYWdlLCBub3Qgc3ViY2xhc3NlcwotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlRnJvbVJlYWQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IG51bGw7Ci0KLQkJc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCUFzc2VydC5pc05vdE51bGwoc2hhcmVkT2JqZWN0KTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkLS07Ci0JCQlpZiAoKHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgPT0gMCkgJiYgKHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgPT0gMCkpIHsKLQkJCQlmTWFuYWdlZE9iamVjdHMucmVtb3ZlKGlkKTsKLQkJCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZU1vZGVsKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHVzZQotCSAqIHRoZSBjYWNoZWQgdmVyc2lvbiwgYnV0IGZvcmNlcyB0aGUgY2FjaGVkIHZlcnNpb24gdG8gYmUgcmVwbGFjZWQgd2l0aCBhCi0JICogZnJlc2gsIHVuY2hhbmdlZCB2ZXJzaW9uLiBOb3RlOiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjaGFuZ2UgYW55Ci0JICogcmVmZXJlbmNlIGNvdW50cy4gQWxzbywgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUKLQkgKiBtb2RlbCwgdGhlbiB0aGlzIGNhbGwgaXMgZXNzZW50aWFsbHkgaWdub3JlZCAodGhhdCBpcywgaXQgZG9lcyBub3QgcHV0Ci0JICogYSBtb2RlbCBpbiB0aGUgY2FjaGUpIGFuZCByZXR1cm5zIG51bGwuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB3aWxsIGJlY29tZSBwcm90ZWN0ZWQsIHVzZSByZWxvYWQgZGlyZWN0bHkgb24gbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgcmVsb2FkTW9kZWwoT2JqZWN0IGlkLCBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQotCQkvLyBnZXQgdGhlIGV4aXN0aW5nIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbChpZCk7Ci0JCS8vIGZvciB0aGUgbW9kZWwgdG8gYmUgbnVsbCBpcyBwcm9iYWJseSBhbiBlcnJvciAodGhhdCBpcywKLQkJLy8gcmVsb2FkIHNob3VsZCBub3QgaGF2ZSBiZWVuIGNhbGxlZCwgYnV0IHdlJ2xsIGd1YXJkIGFnYWluc3QKLQkJLy8gYSBudWxsIHBvaW50ZXIgZXhhbXBsZSBhbmQgcmV0dXJuIG51bGwgaWYgd2UgYXJlIG5vIGxvbmdlciBtYW5hZ2luZwotCQkvLyB0aGF0IG1vZGVsLgotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCS8vIGdldCBsb2FkZXIgYmFzZWQgb24gZXhpc3RpbmcgdHlwZQotCQkJLy8gZG13VE9ETyBldmFsdWF0ZSB3aGVuIHJlbG9hZCBzaG91bGQgb2NjdXIKLQkJCS8vIHdpdGggcG90ZW50aWFsbHkgbmV3IHR5cGUgKGUuZy4gaHRtbCAnc2F2ZSBhcycganNwKS4KLQkJCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IHN0cnVjdHVyZWRNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJCU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJCS8vIGFzayB0aGUgbG9hZGVyIHRvIHJlLWxvYWQKLQkJCWxvYWRlci5yZWxvYWQoVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCBzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJdHJhY2UoInJlLWxvYWRpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNb2RlbE1hbmFnZXJMaXN0ZW5lcihJTW9kZWxNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlpZiAoKGZNb2RlbE1hbmFnZXJMaXN0ZW5lcnMgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmTW9kZWxNYW5hZ2VyTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IGZNb2RlbE1hbmFnZXJMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCWlmIChmTW9kZWxNYW5hZ2VyTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUgcmVtb3ZpbmcKLQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZNb2RlbE1hbmFnZXJMaXN0ZW5lcnNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUgb2xkCi0JCQkJLy8gb25lCi0JCQkJZk1vZGVsTWFuYWdlckxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVNb2RlbChJRmlsZSBpRmlsZSwgU3RyaW5nIGlkLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgPT0gbnVsbCB8fCBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKFNTRUNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVQcm9ncmFtX0Vycm9yX19Nb2RlbE1hbmFnZV9FWENfIikpOyAvLyROT04tTkxTLTEkID0gIlByb2dyYW0gRXJyb3I6IE1vZGVsTWFuYWdlckltcGw6OnNhdmVNb2RlbC4gTW9kZWwgc2hvdWxkIGJlIGluIHRoZSBjYWNoZSIKLQkJfQotCQllbHNlIHsKLQkJCWJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsKLQkJCS8vIGlmIHRoaXMgbW9kZWwgd2FzIGJhc2VkIG9uIGEgRmlsZSBCdWZmZXIgYW5kIHdlJ3JlIHdyaXRpbmcgYmFjawotCQkJLy8gdG8gdGhlIHNhbWUgbG9jYXRpb24sIHVzZSB0aGUgYnVmZmVyIHRvIGRvIHRoZSB3cml0aW5nCi0JCQlpZiAoRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzRXhpc3RpbmdCdWZmZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSkgewotCQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJSVBhdGggZmlsZUxvY2F0aW9uID0gRmlsZUJ1ZmZlcnMubm9ybWFsaXplTG9jYXRpb24oaUZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJaWYgKGZpbGVMb2NhdGlvbi5lcXVhbHMoYnVmZmVyLmdldExvY2F0aW9uKCkpKSB7Ci0JCQkJCWJ1ZmZlci5jb21taXQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdHJ1ZSk7Ci0JCQkJCXNhdmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXNhdmVkKSB7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJc2F2ZVN0cnVjdHVyZWREb2N1bWVudChkb2N1bWVudCwgaUZpbGUsIGVuY29kaW5nUnVsZSk7Ci0JCQkJdHJhY2UoInNhdmluZyBtb2RlbCIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLnNldERpcnR5U3RhdGUoZmFsc2UpOwotCQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLnNldE5ld1N0YXRlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmluZyB0aGUgbW9kZWwgcmVhbGx5IGp1c3QgbWVhbnMgdG8gc2F2ZSBpdCdzIHN0cnVjdHVyZWQgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIG91dHB1dFN0cmVhbQotCSAqIEBwYXJhbSBlbmNvZGluZ1J1bGUKLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGVsKFN0cmluZyBpZCwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihTU0VDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ncmFtIEVycm9yOiBNb2RlbE1hbmFnZXJJbXBsOjpzYXZlTW9kZWwuIE1vZGVsIHNob3VsZCBiZSBpbiB0aGUgY2FjaGUiCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpZiB0aGlzIG1vZGVsIHdhcyBiYXNlZCBvbiBhIEZpbGUgQnVmZmVyIGFuZCB3ZSdyZSB3cml0aW5nIGJhY2sKLQkJCS8vIHRvIHRoZSBzYW1lIGxvY2F0aW9uLCB1c2UgdGhlIGJ1ZmZlciB0byBkbyB0aGUgd3JpdGluZwotCQkJaWYgKEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0V4aXN0aW5nQnVmZmVyKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkpIHsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCWJ1ZmZlci5jb21taXQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJRmlsZSBpRmlsZSA9IGdldEZpbGVGb3Ioc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlzYXZlU3RydWN0dXJlZERvY3VtZW50KGRvY3VtZW50LCBpRmlsZSk7Ci0JCQkJdHJhY2UoInNhdmluZyBtb2RlbCIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLnNldE5ld1N0YXRlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHRoaXMgbWV0aG9kIGlzIGxlc3MgZWZmaWNpZW50IHRoYW4gSUZpbGUgZm9ybSwgc2luY2UgaXQKLQkgKiAgICAgICAgICAgICByZXF1aXJlcyBhbiBleHRyYSAiY29weSIgb2YgYnl0ZSBhcnJheSwgYW5kIHNob3VsZCBiZSBhdm9pZAotCSAqICAgICAgICAgICAgIGluIGZhdm9yIG9mIHRoZSBJRmlsZSBmb3JtLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNb2RlbChTdHJpbmcgaWQsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihTU0VDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ncmFtIEVycm9yOiBNb2RlbE1hbmFnZXJJbXBsOjpzYXZlTW9kZWwuIE1vZGVsIHNob3VsZCBiZSBpbiB0aGUgY2FjaGUiCi0JCX0KLQkJZWxzZSB7Ci0JCQlDb2RlZFN0cmVhbUNyZWF0b3IgY29kZWRTdHJlYW1DcmVhdG9yID0gbmV3IENvZGVkU3RyZWFtQ3JlYXRvcigpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0SWQoKSwgbmV3IERvY3VtZW50UmVhZGVyKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldFByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gY29kZWRTdHJlYW1DcmVhdG9yLmdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGVuY29kaW5nUnVsZSk7Ci0JCQlieXRlW10gb3V0cHV0Qnl0ZXMgPSBieXRlQXJyYXlPdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQkJCW91dHB1dFN0cmVhbS53cml0ZShvdXRwdXRCeXRlcyk7Ci0JCQl0cmFjZSgic2F2aW5nIG1vZGVsIiwgaWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLnNldERpcnR5U3RhdGUoZmFsc2UpOwotCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0TmV3U3RhdGUoZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlzYXZlU3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCwgaUZpbGUsIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlU3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0V4aXN0aW5nQnVmZmVyKHN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlpZiAoaUZpbGUuZ2V0TG9jYXRpb24oKS5lcXVhbHMoYnVmZmVyLmdldExvY2F0aW9uKCkpKSB7Ci0JCQkJYnVmZmVyLmNvbW1pdChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0cnVlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIElNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQkJLy8gSURvY3VtZW50RHVtcGVyIGR1bXBlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnREdW1wZXIoKTsKLQkJCUNvZGVkU3RyZWFtQ3JlYXRvciBjb2RlZFN0cmVhbUNyZWF0b3IgPSBuZXcgQ29kZWRTdHJlYW1DcmVhdG9yKCk7Ci0JCQlSZWFkZXIgcmVhZGVyID0gbmV3IERvY3VtZW50UmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQljb2RlZFN0cmVhbUNyZWF0b3Iuc2V0KGlGaWxlLCByZWFkZXIpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldFByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKHN0cnVjdHVyZWREb2N1bWVudC5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gY29kZWRTdHJlYW1DcmVhdG9yLmdldEN1cnJlbnRFbmNvZGluZ01lbWVudG8oKTsKLQotCQkJLy8gYmUgc3VyZSBkb2N1bWVudCdzIGlzIHVwZGF0ZWQsIGluIGNhc2UgZXhjZXB0aW9uIGlzIHRocm93biBpbgotCQkJLy8gZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0KLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdNZW1lbnRvKTsKLQotCQkJLy8gQ29udmVydCBsaW5lIGRlbGltaXRlcnMgYWZ0ZXIgZW5jb2RpbmcgbWVtZW50byBpcyBmaWd1cmVkIG91dCwKLQkJCS8vIGJ1dAotCQkJLy8gYmVmb3JlIHdyaXRpbmcgdG8gb3V0cHV0IHN0cmVhbS4KLQkJCWhhbmRsZUNvbnZlcnRMaW5lRGVsaW1pdGVycyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIGlGaWxlLCBlbmNvZGluZ1J1bGUsIGVuY29kaW5nTWVtZW50byk7Ci0KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBjb2RlZEJ5dGVTdHJlYW0gPSBjb2RlZFN0cmVhbUNyZWF0b3IuZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oZW5jb2RpbmdSdWxlKTsKLQkJCUlucHV0U3RyZWFtIGNvZGVkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvZGVkQnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCWlmIChpRmlsZS5leGlzdHMoKSkKLQkJCQlpRmlsZS5zZXRDb250ZW50cyhjb2RlZFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQllbHNlCi0JCQkJaUZpbGUuY3JlYXRlKGNvZGVkU3RyZWFtLCBmYWxzZSwgbnVsbCk7Ci0JCQljb2RlZEJ5dGVTdHJlYW0uY2xvc2UoKTsKLQkJCWNvZGVkU3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gdHJhY2UgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyYWNlKFN0cmluZyBtc2csIE9iamVjdCBpZCkgewotCQlpZiAoTG9nZ2VyLmlzVHJhY2luZyhJTU9ERUxNQU5BR0VSX1RSQUNFX0NBVEVHT1JZKSkgewotCQkJTG9nZ2VyLnRyYWNlKElNT0RFTE1BTkFHRVJfVFJBQ0VfQ0FURUdPUlksIG1zZyArICIgIiArIFV0aWxpdGllcy5tYWtlU2hvcnRJZChpZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbW1vbiB0cmFjZSBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhY2UoU3RyaW5nIG1zZywgT2JqZWN0IGlkLCBpbnQgdmFsdWUpIHsKLQkJaWYgKExvZ2dlci5pc1RyYWNpbmcoSU1PREVMTUFOQUdFUl9UUkFDRV9DQVRFR09SWSkpIHsKLQkJCUxvZ2dlci50cmFjZShJTU9ERUxNQU5BR0VSX1RSQUNFX0NBVEVHT1JZLCBtc2cgKyBVdGlsaXRpZXMubWFrZVNob3J0SWQoaWQpICsgIiAoIiArIHZhbHVlICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvTW9kZWxQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvTW9kZWxQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkMWZhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL01vZGVsUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIGludGVybmFsIFNTRUNvcmVQbHVnaW4gY2xhc3Mgb3IgU3RydWN0dXJlZE1vZGVsTWFuYWdlciBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFBsdWdpbiBleHRlbmRzIFNTRUNvcmVQbHVnaW4gewotCi0JcHVibGljIE1vZGVsUGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gU1NFQ29yZVBsdWdpbi5JRDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvTW9kZWxTdGF0ZU1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvTW9kZWxTdGF0ZU1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4YmUwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL01vZGVsU3RhdGVNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIFVzZWQgbXkgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwgdG8ga2VlcCB0cmFjayBvZiB3aGF0IHN0YXRlIGl0IHNob3VsZCBiZQotICogaW4sIHdoZW4gcmVzdG9yZVN0YXRlKG1lbWVudG8pIGlzIGNhbGxlZC4gU2VlIGFsc28gZ2V0TWVtZW50by4KLSAqLwotY2xhc3MgTW9kZWxTdGF0ZU1lbWVudG8gaW1wbGVtZW50cyBJU3RhdGVNZW1lbnRvIHsKLQkvKioKLQkgKiBkYXRlc0luU3luY2ggcmVjb3JkcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVzb3VyY2UgbW9kaWZpY2F0aW9uIGRhdGUsIGFuZAotCSAqIHN5bmNocm9uaXphdGlvbiBkYXRlIGFyZSB0aGUgc2FtZSB3aGVuIGdldE1lbWVudG8gaXMgY2FsbGVkLiBJZiBzbywKLQkgKiB0aGV5IHNob3VsZCBiZSBmb3JjZWQgdG8gYmUgdGhlIHNhbWUgaW4gcmVzdG9yZVN0YXRlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRhdGVzSW5TeW5jOwotCS8qKgotCSAqIGRpcnR5IFN0YXRlIHdoZW4gJ2dldE1lbWVudG8nIGNhbGxlZC4gcmVzdG9yZVN0YXRlIHNob3VsZCBzZXQgaXQgYmFjawotCSAqIHRvIHRoaXMgdmFsdWUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRpcnR5U3RhdGU7Ci0KLQkvKioKLQkgKiB0aGUgcmVzb3VyY2UgdXNlZCBpbiAnZ2V0TWVtZW50bycuIEV2ZW50dWFsbHkgKFYyKSB3aWxsIGJlIHBhcnQgb2YgdGhlCi0JICogTW9kZWwgaXRzZWxmCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlOwotCi0JLyoqCi0JICogTW9kZWxTdGF0ZU1lbWVudG8gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlNb2RlbFN0YXRlTWVtZW50bygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAxOjE1OjA2Ci0JICogUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UKLQkgKi8KLQlvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgewotCQlyZXR1cm4gdW5kZXJseWluZ1Jlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNy8yMDAxIDI6MTg6MDMKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzRGF0ZXNJblN5bmMoKSB7Ci0JCXJldHVybiBkYXRlc0luU3luYzsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAxOjE1OjA2Ci0JICogUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0RpcnR5U3RhdGUoKSB7Ci0JCXJldHVybiBkaXJ0eVN0YXRlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNy8yMDAxIDI6MTg6MDMKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RGF0ZXNJblN5bmMKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQl2b2lkIHNldERhdGVzSW5TeW5jKGJvb2xlYW4gbmV3RGF0ZXNJblN5bmMpIHsKLQkJZGF0ZXNJblN5bmMgPSBuZXdEYXRlc0luU3luYzsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAxOjE1OjA2Ci0JICogUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0RpcnR5U3RhdGUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQl2b2lkIHNldERpcnR5U3RhdGUoYm9vbGVhbiBuZXdEaXJ0eVN0YXRlKSB7Ci0JCWRpcnR5U3RhdGUgPSBuZXdEaXJ0eVN0YXRlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNy8yMDAxIDE6MTU6MDYKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VW5kZXJseWluZ1Jlc291cmNlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UKLQkgKi8KLQl2b2lkIHNldFVuZGVybHlpbmdSZXNvdXJjZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgbmV3VW5kZXJseWluZ1Jlc291cmNlKSB7Ci0JCXVuZGVybHlpbmdSZXNvdXJjZSA9IG5ld1VuZGVybHlpbmdSZXNvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL051bGxNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvTnVsbE1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmUwNTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvTnVsbE1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlVSSVJlc29sdmVyOwotCi0KLS8qKgotICogU2ltcGxlICJudWxsIiBpbXBsZW1lbnRhdGlvbiwgZW50aXJlbHkgdG8gbW9yZSBlYXNpbHkgaGFuZGxlIGNhc2Ugd2hlcmUKLSAqIG1vZGVsIG1hbmFnZXIgY2FuJ3QgYmUgcmV0cmlldmVkIGR1ZSB0byB3b3Jrc3BhY2Ugc2h1dHRpbmcgZG93bi4gSXRzIGludGVudAotICogaXMgdG8gaGVscCBtaW5pbWl6ZSBudWxsIGNoZWNrcyAoZXNwZWNpYWxseSBuZXcgbnVsbCBjaGVja3MgOikKLSAqLwotcHVibGljIGNsYXNzIE51bGxNb2RlbE1hbmFnZXIgZXh0ZW5kcyBNb2RlbE1hbmFnZXJJbXBsIGltcGxlbWVudHMgSU1vZGVsTWFuYWdlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2Fib3V0VG9DaGFuZ2VNb2RlbHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbHMoKSB7Ci0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjYWRkTW9kZWxNYW5hZ2VyTGlzdGVuZXIob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RlbE1hbmFnZXJMaXN0ZW5lcihJTW9kZWxNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNjYWxjdWxhdGVCYXNlTG9jYXRpb24ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVCYXNlTG9jYXRpb24oSUZpbGUgZmlsZSkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjY2FsY3VsYXRlSWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVJZChJRmlsZSBmaWxlKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNjaGFuZ2VkTW9kZWxzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFuZ2VkTW9kZWxzKCkgewotCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2NvcHlNb2RlbEZvckVkaXQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY29weU1vZGVsRm9yRWRpdChTdHJpbmcgb2xkSWQsIFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjY3JlYXRlTmV3SW5zdGFuY2Uob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTmV3SW5zdGFuY2UoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2NyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudEZvcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2NyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2NyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSwgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuVVJJUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmlvLklucHV0U3RyZWFtLCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VUklSZXNvbHZlciwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmcgaWFuYUVuY29kaW5nTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2NyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuVVJJUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvbnRlbnQsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2NyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VUklSZXNvbHZlcikKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2dldEV4aXN0aW5nTW9kZWxGb3JFZGl0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KE9iamVjdCBpZCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChPYmplY3QgaWQpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2dldEV4aXN0aW5nTW9kZWxJZHMoKQotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFeGlzdGluZ01vZGVsSWRzKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjZ2V0TW9kZWxGb3JFZGl0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2dldE1vZGVsRm9yRWRpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdSdWxlKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2dldE1vZGVsRm9yRWRpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjZ2V0TW9kZWxGb3JFZGl0KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmlvLklucHV0U3RyZWFtLCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VUklSZXNvbHZlcikKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpblN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNnZXRNb2RlbEZvclJlYWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjZ2V0TW9kZWxGb3JSZWFkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ1J1bGUpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjZ2V0TW9kZWxGb3JSZWFkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNnZXRNb2RlbEZvclJlYWQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlVSSVJlc29sdmVyKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2dldE5ld01vZGVsRm9yRWRpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNnZXROZXdNb2RlbEZvclJlYWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjZ2V0UmVmZXJlbmNlQ291bnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZmVyZW5jZUNvdW50KE9iamVjdCBpZCkgewotCi0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoT2JqZWN0IGlkKSB7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yUmVhZChPYmplY3QgaWQpIHsKLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2lzU2hhcmVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoT2JqZWN0IGlkKSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjaXNTaGFyZWRGb3JFZGl0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JFZGl0KE9iamVjdCBpZCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI2lzU2hhcmVkRm9yUmVhZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yUmVhZChPYmplY3QgaWQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNpc1N0YXRlQ2hhbmdpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGVDaGFuZ2luZygpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNtb3ZlTW9kZWwoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgbW92ZU1vZGVsKE9iamVjdCBvbGRJZCwgT2JqZWN0IG5ld0lkKSB7Ci0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIjcmVpbml0aWFsaXplKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNyZWxvYWRNb2RlbChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWxvYWRNb2RlbChPYmplY3QgaWQsIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlciNyZW1vdmVNb2RlbE1hbmFnZXJMaXN0ZW5lcihvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGVsTWFuYWdlckxpc3RlbmVyKElNb2RlbE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyI3NhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvUHJvcGFnYXRpbmdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL1Byb3BhZ2F0aW5nQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNlNzVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvUHJvcGFnYXRpbmdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BhZ2F0aW5nQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQl2b2lkIGFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpOwotCi0JTGlzdCBnZXRBZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGFkZGluZyBhIGZhY3RvcnksCi0JICogdHlwaWNhbGx5IG9uIHRoZSBkb2N1bWVudCAodG9wIGxldmVsKSBub2RlLCBzbyBhbGwgbm9kZXMgY2FuIGJlCi0JICogYWRhcHRlZCwgaWYgbmVlZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhvc2Ugb2NjYXNpb25zIHdoZW4gYSBmYWN0b3J5Ci0JICogaXMgYWRkZWRlZCBhZnRlciBzb21lIG5vZGVzIG1heSBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIGF0IHRoZSB0aW1lCi0JICogdGhlIGZhY3RvcnkgaXMgYWRkZWQuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplRm9yRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBJTm9kZU5vdGlmaWVyIG5vZGUpOwotCi0JLy8gZG13OiBzaG91bGQgaGF2ZSBnZXRGYWN0b3J5Rm9yPwotCXZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1M2ExMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeSB7Ci0KLQl2b2lkIGFkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpOwotCi0Jdm9pZCBzZXRDb250cmlidXRlZEZhY3RvcmllcyhBcnJheUxpc3QgbGlzdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvU3RydWN0dXJlZE1vZGVsTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTVhNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1vZGVsTWFuYWdlciB7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBjYWxsIGdldE1vZGVsTWFuYWdlciBkaXJlY3RseQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZE1vZGVsTWFuYWdlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCWJvb2xlYW4gaXNSZWFkeSA9IGZhbHNlOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCXdoaWxlICghaXNSZWFkeSkgewotCQkJQnVuZGxlIGxvY2FsQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFNTRUNvcmVQbHVnaW4uSUQpOwotCQkJaW50IHN0YXRlID0gbG9jYWxCdW5kbGUuZ2V0U3RhdGUoKTsKLQkJCWlmIChzdGF0ZSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJLy8gZ2V0SW5zdGFuY2UgaXMgYSBzeW5jaHJvbml6ZWQgc3RhdGljIG1ldGhvZC4KLQkJCQltb2RlbE1hbmFnZXIgPSBNb2RlbE1hbmFnZXJJbXBsLmdldEluc3RhbmNlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBCdW5kbGUuU1RBUlRJTkcpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlLCBqdXN0IGxvb3AgYWdhaW4KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBCdW5kbGUuU1RPUFBJTkcgfHwgc3RhdGUgPT0gQnVuZGxlLlVOSU5TVEFMTEVEKSB7Ci0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJbW9kZWxNYW5hZ2VyID0gbmV3IE51bGxNb2RlbE1hbmFnZXIoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vdCBzdXJlIGFib3V0IG90aGVyIHN0YXRlcywgJ3Jlc29sdmVkJywgJ2luc3RhbGxlZCcKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvYnVpbGRlci9JQnVpbGRlckRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2J1aWxkZXIvSUJ1aWxkZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjM3OWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvYnVpbGRlci9JQnVpbGRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIERlbGVnYXRlcyBmb3IgdGhlIFN0cnVjdHVyZWQgQnVpbGRlci4gRGVsZWdhdGVzIG1heSBiZSBjb250cmlidXRlZCB1c2luZwotICogdGhlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyZGVsZWdhdGUgZXh0ZW5zaW9uIHBvaW50LiBGb3IgcmVzb3VyY2VzIGFuZAotICogcmVzb3VyY2UgZGVsdGFzIHdpdGggbWF0Y2hpbmcgY29udGVudCB0eXBlcywgdGhlIGJ1aWxkZXIgd2lsbCBmaXJzdCBjYWxsCi0gKiB0aGUgc3RhcnR1cCgpIG1ldGhvZCwgYnVpbGQoKSwgYW5kIHNodXRkb3duIGluIHNlcXVlbmNlLiBQYXJ0aWNpcGFudAotICogaW5zdGFuY2VzIHdpbGwgYmUgcmV1c2VkIGFjcm9zcyBwcm9qZWN0cyBidXQgYXJlIG5vdCBzaGFyZWQgcGVyIGNvbnRlbnQKLSAqIHR5cGUuIFBhcnRpY2lwYW50cyBzaG91bGQgbm90IGhvbGQgb24gdG8gcmVmZXJlbmNlcyB0byBtb2RlbHMgb3IgcmVzb3VyY2VzCi0gKiBhZnRlciBzaHV0ZG93bigpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCdWlsZGVyRGVsZWdhdGUgewotCUlTdGF0dXMgYnVpbGQoSUZpbGUgZmlsZSwgaW50IGtpbmQsIE1hcCBhcmdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHBhcnRpY2lwYW50IHRoYXQgYnVpbGRpbmcgaXMgZG9uZSBmb3Igbm93LiBSZXNvdXJjZXMgaGVsZAotCSAqIGZyb20gc3RhcnR1cCBzaG91bGQgbm93IGJlIHJlbGVhc2VkLgotCSAqLwotCXZvaWQgc2h1dGRvd24oSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgcGFydGljaXBhbnQgdGhhdCBhIHNlcXVlbmNlIG9mIGJ1aWxkcyBpcyBhYm91dCB0byBiZQotCSAqIGNhbGxlZC4gSWRlYWxseSB0aGUgdGltZSB0byBsb2FkIHByZWZlcmVuY2VzIGFuZCBwZXJmb3JtIGFueSBleHBlbnNpdmUKLQkgKiBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCAtCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGF0J3MgYWJvdXQgdG8gYmUgYnVpbHQKLQkgKiBAcGFyYW0ga2luZCAtCi0JICogICAgICAgICAgICB0aGUga2luZCBvZiBidWlsZCBiZWluZyBkb25lOyBwb3NzaWJsZSB2YWx1ZXMgYXJlCi0JICogICAgICAgICAgICBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkFVVE9fQlVJTEQsCi0JICogICAgICAgICAgICBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIG9yCi0JICogICAgICAgICAgICBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxECi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZSBvZiBidWlsZGVyLXNwZWNpZmljIGFyZ3VtZW50cyBzZW50IHRvIHRoZQotCSAqICAgICAgICAgICAgU3RydWN0dXJlZCBEb2N1bWVudCBCdWlsZGVyLCBrZXllZCBieSBhcmd1bWVudCBuYW1lIChrZXkKLQkgKiAgICAgICAgICAgIHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4sIHZhbHVlIHR5cGU6Ci0JICogICAgICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+KTs8Y29kZT5udWxsPC9jb2RlPiBpcyBlcXVpdmFsZW50Ci0JICogICAgICAgICAgICB0byBhbiBlbXB0eSBtYXAKLQkgKi8KLQl2b2lkIHN0YXJ0dXAoSVByb2plY3QgcHJvamVjdCwgaW50IGtpbmQsIE1hcCBhcmdzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvYnVpbGRlci9JQnVpbGRlck1vZGVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvYnVpbGRlci9JQnVpbGRlck1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjM2Y5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2J1aWxkZXIvSUJ1aWxkZXJNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIE1vZGVsIHByb3ZpZGVyIGZvciBJQnVpbGRlclBhcnRpY2lwYW50cyAtIHByb3ZpZGVzIFN0cnVjdHVyZWQgRG9jdW1lbnRzIGFuZAotICogTW9kZWxzIHRvIHBhcnRpY2lwYW50cy4gQ2xpZW50cyBzaG91bGQgbm90IGltcGxlbWVudC4gTW9kZWxzIGZvciBhbnkKLSAqIHJlc291cmNlIG1heSBiZSByZXF1ZXN0ZWQsIG5vdCBqdXN0IGZvciB0aGUgY3VycmVudCBkZWx0YS4gVGhlIHNhbWUKLSAqIGRvY3VtZW50IGFuZCBtb2RlbCBpbnN0YW5jZXMgYXJlIE5PVCBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkIHdpdGggZWFjaAotICogY2FsbC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElCdWlsZGVyTW9kZWxQcm92aWRlciB7Ci0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIGFuIElTdHJ1Y3R1cmVkRG9jdW1lbnQgd2l0aCB0aGUgZmlsZSdzIGNvbnRlbnRzIGlmIHRoZSBmaWxlJ3MKLQkgKiAgICAgICAgIENvbnRlbnQgVHlwZSBpcyBzdXBwb3J0ZWQsIG51bGwgaWYgbm90Ci0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXREb2N1bWVudChJRmlsZSBmaWxlKTsKLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBhbiBJU3RydWN0dXJlZE1vZGVsIHdpdGggdGhlIGZpbGUncyBjb250ZW50cyBpZiB0aGUgZmlsZSdzCi0JICogICAgICAgICBDb250ZW50IFR5cGUgaXMgc3VwcG9ydGVkLCBudWxsIGlmIG5vdAotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoSUZpbGUgZmlsZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2J1aWxkZXIvSUJ1aWxkZXJQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9idWlsZGVyL0lCdWlsZGVyUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjNDMxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2J1aWxkZXIvSUJ1aWxkZXJQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIFBhcnRpY2lwYW50cyBpbiB0aGUgU3RydWN0dXJlZCBidWlsZGluZyBwcm9jZXNzLiBQYXJ0aWNpcGFudHMgbWF5IGJlCi0gKiBjb250cmlidXRlZCB1c2luZyB0aGUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmJ1aWxkZXJwYXJ0aWNpcGFudCBleHRlbnNpb24gcG9pbnQuCi0gKiBGb3IgcmVzb3VyY2VzIGFuZCByZXNvdXJjZSBkZWx0YXMgd2l0aCBtYXRjaGluZyBjb250ZW50IHR5cGVzLCB0aGUgYnVpbGRlcgotICogd2lsbCBmaXJzdCBjYWxsIHRoZSBidWlsZCgpIG1ldGhvZCBhbmQgdGhlbiB0aGUgY2xlYW51cCgpIG1ldGhvZCBpbgotICogc2VxdWVuY2UuIFBhcnRpY2lwYW50IGluc3RhbmNlcyB3aWxsIGJlIHJldXNlZCBhY3Jvc3MgcHJvamVjdHMgYnV0IGFyZSBub3QKLSAqIHNoYXJlZCBwZXIgY29udGVudCB0eXBlLiBQYXJ0aWNpcGFudHMgc2hvdWxkIG5vdCBob2xkIG9uIHRvIHJlZmVyZW5jZXMgdG8KLSAqIG1vZGVscyBvciByZXNvdXJjZXMgYWZ0ZXIgY2xlYW51cCgpLgotICogCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCdWlsZGVyUGFydGljaXBhbnQgewotCi0KLQkvKioKLQkgKiBQZXJmb3JtIGEgYnVpbGQgZm9yIHRoZSBnaXZlbiByZXNvdXJjZXMgd2l0aGluIHRoaXMgcHJvamVjdC4gTWF5IGJlCi0JICogY2FsbGVkIG11bHRpcGxlIHRpbWVzIGJldHdlZW4gc3RhcnR1cCBhbmQgc2h1dGRvd24uCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyAtCi0JICogICAgICAgICAgICBhbiBJUmVzb3VyY2UgbGlzdCBvZiByZXNvdXJjZXMgaW4gdGhpcyBwcm9qZWN0IHdpdGggdGhlCi0JICogICAgICAgICAgICBjb3JyZWN0IGNvbnRlbnQgdHlwZQotCSAqIEBwYXJhbSBwcm9qZWN0IC0KLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IG9uIHdoaWNoIHRoaXMgcGFydGljaXBhbnQgaXMgb3BlcmF0aW5nCi0JICogQHBhcmFtIHByb3ZpZGVyIC0KLQkgKiAgICAgICAgICAgIGEgbW9kZWwgcHJvdmlkZXIgZm9yIHRoaXMgcHJvamVjdAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gYnVpbGQoSVJlc291cmNlW10gcmVzb3VyY2VzLCBJUHJvamVjdCBwcm9qZWN0LCBJQnVpbGRlck1vZGVsUHJvdmlkZXIgcHJvdmlkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBQZXJmb3JtIGFuIGluY3JlbWVudGFsIGJ1aWxkLiBNYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGJldHdlZW4KLQkgKiBzdGFydHVwIGFuZCBzaHV0ZG93bi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgLQotCSAqICAgICAgICAgICAgdGhlIElSZXNvdXJjZURlbHRhIHRvIGV4YW1pbmUgZm9yIGJ1aWxkaW5nCi0JICogQHBhcmFtIHByb2plY3QgLQotCSAqICAgICAgICAgICAgdGhlIHByb2plY3Qgb24gd2hpY2ggdGhpcyBwYXJ0aWNpcGFudCBpcyBvcGVyYXRpbmcKLQkgKiBAcGFyYW0gcHJvdmlkZXIgLQotCSAqICAgICAgICAgICAgYSBtb2RlbCBwcm92aWRlciBmb3IgdGhpcyBkZWx0YSdzIHJlc291cmNlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBidWlsZChJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVByb2plY3QgcHJvamVjdCwgSUJ1aWxkZXJNb2RlbFByb3ZpZGVyIHByb3ZpZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogRG8gYW55IHBvc3QtYnVpbGQgY2xlYW51cCBmcm9tIGEgZnVsbCBidWlsZCBmb3IgYSBwcm9qZWN0LiBDYWxsZWQgb25jZQotCSAqIGZvciBldmVyeSBtYXRjaGluZyBidWlsZCgpIGNhbGwuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyAtCi0JICogICAgICAgICAgICB0aGUgSVJlc291cmNlIGxpc3Qgb2YgcmVzb3VyY2VzIGluIHRoaXMgcHJvamVjdCB3aXRoIHRoZQotCSAqICAgICAgICAgICAgY29ycmVjdCBjb250ZW50IHR5cGUKLQkgKiBAcGFyYW0gcHJvamVjdCAtCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdCBvbiB3aGljaCB0aGlzIHBhcnRpY2lwYW50IGlzIG9wZXJhdGluZwotCSAqIEBwYXJhbSBwcm92aWRlciAtCi0JICogICAgICAgICAgICBhIG1vZGVsIHByb3ZpZGVyIGZvciB0aGlzIGRlbHRhJ3MgcmVzb3VyY2UKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGNsZWFudXAoSVJlc291cmNlW10gcmVzb3VyY2VzLCBJUHJvamVjdCBwcm9qZWN0LCBJQnVpbGRlck1vZGVsUHJvdmlkZXIgcHJvdmlkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBEbyBhbnkgcG9zdC1idWlsZCBjbGVhbnVwIGZyb20gYnVpbGRpbmcgYSByZXNvdXJjZSBkZWx0YS4gQ2FsbGVkIG9uY2UKLQkgKiBmb3IgZXZlcnkgbWF0Y2hpbmcgYnVpbGQoKSBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YSAtCi0JICogICAgICAgICAgICB0aGUgSVJlc291cmNlRGVsdGEgdG8gZXhhbWluZSBmb3IgYnVpbGRpbmcKLQkgKiBAcGFyYW0gcHJvamVjdCAtCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdCBvbiB3aGljaCB0aGlzIHBhcnRpY2lwYW50IGlzIG9wZXJhdGluZwotCSAqIEBwYXJhbSBwcm92aWRlciAtCi0JICogICAgICAgICAgICBhIG1vZGVsIHByb3ZpZGVyIGZvciB0aGlzIGRlbHRhJ3MgcmVzb3VyY2UKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGNsZWFudXAoSVJlc291cmNlRGVsdGEgZGVsdGEsIElQcm9qZWN0IHByb2plY3QsIElCdWlsZGVyTW9kZWxQcm92aWRlciBwcm92aWRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBwYXJ0aWNpcGFudCB0aGF0IGJ1aWxkaW5nIGlzIGRvbmUgZm9yIG5vdy4gUmVzb3VyY2VzIGhlbGQKLQkgKiBmcm9tIHN0YXJ0dXAgc2hvdWxkIG5vdyBiZSByZWxlYXNlZC4KLQkgKi8KLQl2b2lkIHNodXRkb3duKElQcm9qZWN0IHByb2plY3QpOwotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHBhcnRpY2lwYW50IHRoYXQgYSBzZXF1ZW5jZSBvZiBidWlsZHMgaXMgYWJvdXQgdG8gYmUKLQkgKiBjYWxsZWQuIElkZWFsbHkgdGhlIHRpbWUgdG8gbG9hZCBwcmVmZXJlbmNlcyBhbmQgcGVyZm9ybSBhbnkgZXhwZW5zaXZlCi0JICogY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgLQotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgdGhhdCdzIGFib3V0IHRvIGJlIGJ1aWx0Ci0JICogQHBhcmFtIGtpbmQgLQotCSAqICAgICAgICAgICAgdGhlIGtpbmQgb2YgYnVpbGQgYmVpbmcgZG9uZTsgcG9zc2libGUgdmFsdWVzIGFyZQotCSAqICAgICAgICAgICAgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5BVVRPX0JVSUxELAotCSAqICAgICAgICAgICAgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBvcgotCSAqICAgICAgICAgICAgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRAotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICB0aGUgdGFibGUgb2YgYnVpbGRlci1zcGVjaWZpYyBhcmd1bWVudHMgc2VudCB0byB0aGUKLQkgKiAgICAgICAgICAgIFN0cnVjdHVyZWQgRG9jdW1lbnQgQnVpbGRlciwga2V5ZWQgYnkgYXJndW1lbnQgbmFtZSAoa2V5Ci0JICogICAgICAgICAgICB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+LCB2YWx1ZSB0eXBlOgotCSAqICAgICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPik7PGNvZGU+bnVsbDwvY29kZT4gaXMgZXF1aXZhbGVudAotCSAqICAgICAgICAgICAgdG8gYW4gZW1wdHkgbWFwCi0JICovCi0Jdm9pZCBzdGFydHVwKElQcm9qZWN0IHByb2plY3QsIGludCBraW5kLCBNYXAgYXJncyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvQWJzdHJhY3RDbGVhbnVwUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvQWJzdHJhY3RDbGVhbnVwUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OTBiMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jbGVhbnVwL0Fic3RyYWN0Q2xlYW51cFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNsZWFudXA7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5Tb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgcmVuYW1lZCB0byBBYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yCi0gKiAKLSAqIFRPRE8gd2lsbCBkZWxldGUgaW4gQzUKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0Q2xlYW51cFByb2Nlc3NvciBpbXBsZW1lbnRzIENsZWFudXBQcm9jZXNzb3IgewotCXB1YmxpYyBTdHJpbmcgY2xlYW51cENvbnRlbnQoU3RyaW5nIGlucHV0KSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArIGdldENvbnRlbnRUeXBlKCk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCAwLCBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0gZmluYWxseSB7Ci0JCQllbnN1cmVDbG9zZWQobnVsbCwgaW5wdXRTdHJlYW0pOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNsZWFudXBDb250ZW50KFN0cmluZyBpbnB1dCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArIGdldENvbnRlbnRUeXBlKCk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJLy8gcmV0dXJuIG91dHB1dAotCQkJcmV0dXJuIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9IGZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cEZpbGUoSUZpbGUgZmlsZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCS8vT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCAwLCBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyBzYXZlIG91dHB1dCB0byBmaWxlCi0JCQkvL291dHB1dFN0cmVhbSA9IG5ldwotCQkJLy8gRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZShmaWxlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9IGZpbmFsbHkgewotCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cEZpbGUoSUZpbGUgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy9PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyBzYXZlIG91dHB1dCB0byBmaWxlCi0JCQkvL291dHB1dFN0cmVhbSA9IG5ldwotCQkJLy8gRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZShmaWxlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9IGZpbmFsbHkgewotCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJLy9PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGVOYW1lLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIDAsIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQkvL1RPRE8gSSBkb24ndCB0aGluayB3ZSBzaG91bGQgYmUgdHVybmluZyBhbnkgb2YgdGhlc2UgaW50byBydW50aW1lCi0JCS8vIGV4Y2VwdGlvbnMKLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgaW5wdXRTdHJlYW0pOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCS8vT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJLy8gc2F2ZSBvdXRwdXQgdG8gZmlsZQotCQkJLy9vdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9Ci0JCS8vVE9ETyBJIGRvbid0IHRoaW5rIHdlIHNob3VsZCBiZSB0dXJuaW5nIGFueSBvZiB0aGVzZSBpbnRvIHJ1bnRpbWUKLQkJLy8gZXhjZXB0aW9ucwotCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL2Vuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKTsKLQotCWFic3RyYWN0IHB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKLQotCXByb3RlY3RlZCB2b2lkIGVuc3VyZUNsb3NlZChPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0cnkgewotCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOyAvLyBob3BlbGVzcwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsgLy8gaG9wZWxlc3MKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb250ZW50IHR5cGUgc3RyaW5nIGlzIGNhc2UgaW5zZW5zaXRpdmUuIEl0IG1heSBiZSAiWE1MIiBmb3IgWE1MLAotCSAqICJDU1MiIGZvciBDU1MsIGFuZCAiSFRNTCIsICJKU1AiLCAiSkhUTUwiLCAiU0hUTUwiLCAiU0hUTSIsICJIVE1MLVNTIiwKLQkgKiAiWEhUTUwiLCAiSFRNIiBmb3IgSFRNTC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG5lZWRlZCBmb3IgY3JlYXRpbmcgYSB0ZW1wb3JhcnkgbW9kZWwgd2hlbiB0aGUKLQkgKiBjbGVhbnVwQ29udGVudChTdHJpbmcgaW5wdXQpIGZvcm0gb2YgQ2xlYW51cFByb2Nlc3NvciBpcyBjYWxsZWQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jbGVhbnVwL0Fic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzMGY5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNsZWFudXA7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgaW1wbGVtZW50cyBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMgPSB0cnVlOyAvLyBzcGVjaWFsIGZsYWcgZm9yIEpVbml0Ci0KLQkvLyB0ZXN0cyB0byBza2lwIHJlZnJlc2gKLQkvLyBvZiBjbGVhbnVwIHByZWZlcmVuY2VzCi0JLy8gd2hlbiBpdCdzIHNldCB0byBmYWxzZQotCi0JcHVibGljIFN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArIGdldENvbnRlbnRUeXBlKCk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCAwLCBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9IGZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCWlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCJVVEY4IikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaWQgPSBpbnB1dFN0cmVhbS50b1N0cmluZygpICsgZ2V0Q29udGVudFR5cGUoKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9IGZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvL091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmIG1vZGVsCi0JCQkvLyBjaGFuZ2VkLgotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL2Vuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChzdGFydCA+PSAwICYmIGxlbmd0aCA+PSAwICYmIHN0YXJ0ICsgbGVuZ3RoIDw9IGRvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQkvL091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmCi0JCQkJLy8gbW9kZWwgY2hhbmdlZC4KLQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJCS8vIGNsZWFudXAKLQkJCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvL2Vuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCS8vT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCAwLCBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyBzYXZlIG91dHB1dCB0byBmaWxlCi0JCQkvL291dHB1dFN0cmVhbSA9IG5ldwotCQkJLy8gRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZShmaWxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBGaWxlKElGaWxlIGZpbGUsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvL091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vb3V0cHV0U3RyZWFtID0gbmV3Ci0JCQkvLyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKGZpbGUpOwotCQl9IGZpbmFsbHkgewotCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCS8vT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCAwLCBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyBzYXZlIG91dHB1dCB0byBmaWxlCi0JCQkvL291dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL2Vuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJLy9PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGVOYW1lLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyBzYXZlIG91dHB1dCB0byBmaWxlCi0JCQkvL291dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL2Vuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCWlmICgoc3RhcnQgPj0gMCkgJiYgKGxlbmd0aCA8PSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJVmVjdG9yIGFjdGl2ZU5vZGVzID0gZ2V0QWN0aXZlTm9kZXMoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQkJCQlpZiAoYWN0aXZlTm9kZXMuc2l6ZSgpID4gMCkgewotCQkJCQlOb2RlIGZpcnN0Tm9kZSA9IChOb2RlKSBhY3RpdmVOb2Rlcy5maXJzdEVsZW1lbnQoKTsKLQkJCQkJTm9kZSBsYXN0Tm9kZSA9IChOb2RlKSBhY3RpdmVOb2Rlcy5sYXN0RWxlbWVudCgpOwotCQkJCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCQkJTm9kZSBlYWNoTm9kZSA9IGZpcnN0Tm9kZTsKLQkJCQkJTm9kZSBuZXh0Tm9kZSA9IG51bGw7Ci0JCQkJCXdoaWxlICghZG9uZSkgewotCQkJCQkJLy8gdXBkYXRlICJkb25lIgotCQkJCQkJZG9uZSA9IChlYWNoTm9kZSA9PSBsYXN0Tm9kZSk7Ci0KLQkJCQkJCS8vIGdldCBuZXh0IHNpYmxpbmcgYmVmb3JlIGNsZWFudXAgYmVjYXVzZSBlYWNoTm9kZQotCQkJCQkJLy8gbWF5Ci0JCQkJCQkvLyBiZSBkZWxldGVkLAotCQkJCQkJLy8gZm9yIGV4YW1wbGUgd2hlbiBpdCdzIGFuIGVtcHR5IHRleHQgbm9kZQotCQkJCQkJbmV4dE5vZGUgPSBlYWNoTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkvLyBjbGVhbnVwIHNlbGVjdGVkIG5vZGUocykKLQkJCQkJCWNsZWFudXBOb2RlKGVhY2hOb2RlKTsKLQotCQkJCQkJLy8gdXBkYXRlIGVhY2ggbm9kZQotCQkJCQkJaWYgKG5leHROb2RlICE9IG51bGwgJiYgbmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpCi0JCQkJCQkJLy8gbmV4dE5vZGUgaXMgZGVsZXRlZCBkdXJpbmcgY2xlYW51cAotCQkJCQkJCWVhY2hOb2RlID0gZWFjaE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQllYWNoTm9kZSA9IG5leHROb2RlOwotCi0JCQkJCQkvLyBUaGlzIHNob3VsZCBub3QgYmUgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlCi0JCQkJCQkvLyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHdpdGggZWFjaE5vZGUuCi0JCQkJCQkvLyBXZSBkb24ndCB3YW50IGFuIGluZmluaXRlIGxvb3AgaGVyZS4KLQkJCQkJCWlmIChlYWNoTm9kZSA9PSBudWxsKQotCQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQl9Ci0KLQkJCQkJLy8gZm9ybWF0IHNvdXJjZQotCQkJCQlpZiAoZ2V0Rm9ybWF0U291cmNlUHJlZmVyZW5jZShzdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCQkvLyBmb3JtYXQgdGhlIGRvY3VtZW50Ci0JCQkJCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBnZXRGb3JtYXRQcm9jZXNzb3IoKTsKLQkJCQkJCWZvcm1hdFByb2Nlc3Nvci5mb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJCQl9Ci0KLQkJCQkJLy8gY29udmVydCBFT0wgY29kZXMKLQkJCQkJaWYgKGdldENvbnZlcnRFT0xDb2Rlc1ByZWZlcmVuY2Uoc3RydWN0dXJlZE1vZGVsKSkgewotCQkJCQkJSURvY3VtZW50IGRvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQkJU3RyaW5nIGVuZE9mTGluZUNvZGUgPSBnZXRFT0xDb2RlUHJlZmVyZW5jZShzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJCQkJU3RyaW5nIGVuZE9mTGluZUNvZGVTdHJpbmcgPSBudWxsOwotCQkJCQkJaWYgKGVuZE9mTGluZUNvZGUuY29tcGFyZVRvKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKSA9PSAwKQotCQkJCQkJCWVuZE9mTGluZUNvZGVTdHJpbmcgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfTEY7Ci0JCQkJCQllbHNlIGlmIChlbmRPZkxpbmVDb2RlLmNvbXBhcmVUbyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUikgPT0gMCkKLQkJCQkJCQllbmRPZkxpbmVDb2RlU3RyaW5nID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSOwotCQkJCQkJZWxzZSBpZiAoZW5kT2ZMaW5lQ29kZS5jb21wYXJlVG8oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1JMRikgPT0gMCkKLQkJCQkJCQllbmRPZkxpbmVDb2RlU3RyaW5nID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSTEY7Ci0JCQkJCQlpZiAoZW5kT2ZMaW5lQ29kZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCQkJY29udmVydExpbmVEZWxpbWl0ZXJzKGRvY3VtZW50LCBlbmRPZkxpbmVDb2RlU3RyaW5nKTsKLQkJCQkJCQkvLyBETVc6IDgvMjQvMjAwMiBzZXR0aW5nIGxpbmUgZGVsaW1pdGVyIGluCi0JCQkJCQkJLy8gZG9jdW1lbnQgYWxsb3dzCi0JCQkJCQkJLy8gc3Vic2VxdWVudCBlZGl0aW5nIHRvIGluc2VydCB0aGUgc2FtZSBsaW5lCi0JCQkJCQkJLy8gZGVsaW1pdGVyLgotCQkJCQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkuc2V0TGluZURlbGltaXRlcihlbmRPZkxpbmVDb2RlU3RyaW5nKTsKLQkJCQkJCQl9Ci0JCQkJCQkJc3RydWN0dXJlZE1vZGVsLnNldERpcnR5U3RhdGUodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjbGVhbnVwTm9kZSA9IG5vZGU7Ci0KLQkJCS8vIGNsZWFudXAgdGhlIG93bmVyIG5vZGUgaWYgaXQncyBhbiBhdHRyaWJ1dGUgbm9kZQotCQkJaWYgKGNsZWFudXBOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQljbGVhbnVwTm9kZSA9ICgoQXR0cikgY2xlYW51cE5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCi0JCQkvLyByZWZyZXNoIGNsZWFudXAgcHJlZmVyZW5jZXMgYmVmb3JlIGdldHRpbmcgY2xlYW51cCBoYW5kbGVyCi0JCQlpZiAocmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcykKLQkJCQlyZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCS8vIGdldCBjbGVhbnVwIGhhbmRsZXIKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBnZXRDbGVhbnVwSGFuZGxlcihjbGVhbnVwTm9kZSk7Ci0JCQlpZiAoY2xlYW51cEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCS8vIGNsZWFudXAgZWFjaCBub2RlCi0JCQkJY2xlYW51cEhhbmRsZXIuY2xlYW51cChjbGVhbnVwTm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb252ZXJ0TGluZURlbGltaXRlcnMoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgbmV3RGVsaW1pdGVyKSB7Ci0JCWZpbmFsIGludCBsaW5lQ291bnQgPSBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCU1hcCBwYXJ0aXRpb25lcnMgPSBUZXh0VXRpbGl0aWVzLnJlbW92ZURvY3VtZW50UGFydGl0aW9uZXJzKGRvY3VtZW50KTsJCQotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewotCQkJCWZpbmFsIFN0cmluZyBkZWxpbWl0ZXIgPSBkb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKGkpOwotCQkJCWlmIChkZWxpbWl0ZXIgIT0gbnVsbCAmJiBkZWxpbWl0ZXIubGVuZ3RoKCkgPiAwICYmICFkZWxpbWl0ZXIuZXF1YWxzKG5ld0RlbGltaXRlcikpIHsKLQkJCQkJSVJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2UocmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpLCBkZWxpbWl0ZXIubGVuZ3RoKCksIG5ld0RlbGltaXRlcik7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJVGV4dFV0aWxpdGllcy5hZGREb2N1bWVudFBhcnRpdGlvbmVycyhkb2N1bWVudCwgcGFydGl0aW9uZXJzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuc3VyZUNsb3NlZChPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0cnkgewotCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOyAvLyBob3BlbGVzcwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsgLy8gaG9wZWxlc3MKLQkJfQotCX0KLQotCXByb3RlY3RlZCBWZWN0b3IgZ2V0QWN0aXZlTm9kZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydE5vZGVPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJVmVjdG9yIGFjdGl2ZU5vZGVzID0gbmV3IFZlY3RvcigpOwotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJTm9kZSBzdGFydE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0KTsKLQkJCU5vZGUgZW5kTm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGgpOwotCi0JCQkvLyBtYWtlIHN1cmUgaXQncyBhbiBub24tZW1wdHkgZG9jdW1lbnQKLQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCkgewotCQkJCXdoaWxlIChpc1NpYmxpbmdPZihzdGFydE5vZGUsIGVuZE5vZGUpID09IGZhbHNlKSB7Ci0JCQkJCWlmIChlbmROb2RlICE9IG51bGwpCi0JCQkJCQllbmROb2RlID0gZW5kTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChlbmROb2RlID09IG51bGwpIHsKLQkJCQkJCXN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQllbmROb2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl3aGlsZSAoc3RhcnROb2RlICE9IGVuZE5vZGUpIHsKLQkJCQkJYWN0aXZlTm9kZXMuYWRkRWxlbWVudChzdGFydE5vZGUpOwotCQkJCQlzdGFydE5vZGUgPSBzdGFydE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQkJaWYgKHN0YXJ0Tm9kZSAhPSBudWxsKQotCQkJCQlhY3RpdmVOb2Rlcy5hZGRFbGVtZW50KHN0YXJ0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZlTm9kZXM7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgZ2V0Q2xlYW51cEhhbmRsZXIoTm9kZSBub2RlKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGdldENvbnZlcnRFT0xDb2Rlc1ByZWZlcmVuY2UoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlib29sZWFuIGNvbnZlcnRFT0xDb2RlcyA9IHRydWU7Ci0JCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBnZXRDbGVhbnVwSGFuZGxlcigoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oMCkpOwotCQlpZiAoY2xlYW51cEhhbmRsZXIgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgY2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cEhhbmRsZXIuZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCk7Ci0JCQljb252ZXJ0RU9MQ29kZXMgPSBjbGVhbnVwUHJlZmVyZW5jZXMuZ2V0Q29udmVydEVPTENvZGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRFT0xDb2RlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVPTENvZGVQcmVmZXJlbmNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJU3RyaW5nIGVvbENvZGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKDApKTsKLQkJaWYgKGNsZWFudXBIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBIYW5kbGVyLmdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCQkJZW9sQ29kZSA9IGNsZWFudXBQcmVmZXJlbmNlcy5nZXRFT0xDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGVvbENvZGU7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcigpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Rm9ybWF0U291cmNlUHJlZmVyZW5jZShJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCWJvb2xlYW4gZm9ybWF0U291cmNlID0gdHJ1ZTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGdldENsZWFudXBIYW5kbGVyKChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbigwKSk7Ci0JCWlmIChjbGVhbnVwSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMgPSBjbGVhbnVwSGFuZGxlci5nZXRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQkJCWZvcm1hdFNvdXJjZSA9IGNsZWFudXBQcmVmZXJlbmNlcy5nZXRGb3JtYXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gZm9ybWF0U291cmNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2libGluZ09mKE5vZGUgbm9kZSwgTm9kZSBlbmROb2RlKSB7Ci0JCWlmIChlbmROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJTm9kZSBzaWJsaW5nTm9kZSA9IG5vZGU7Ci0JCQl3aGlsZSAoc2libGluZ05vZGUgIT0gbnVsbCkgewotCQkJCWlmIChzaWJsaW5nTm9kZSA9PSBlbmROb2RlKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCXNpYmxpbmdOb2RlID0gc2libGluZ05vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvQ2xlYW51cFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGIwZDY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCByZW5hbWVkIHRvIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcgotICogCi0gKiBUT0RPIHdpbGwgZGVsZXRlIGluIEM1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xlYW51cFByb2Nlc3NvciB7Ci0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIGlucHV0IHN0cmluZyBhcyBpbnB1dCwKLQkgKiBjcmVhdGVzIGFuIElucHV0U3RyZWFtIGZyb20gdGhlIGlucHV0IHN0cmluZywgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsCi0JICogb2YgdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQsIGNsZWFudXBzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZXR1cm5zCi0JICogdGhlIGNsZWFuZWQgdXAgaW5wdXQgc3RyaW5nLgotCSAqLwotCVN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgY29udGVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gaW5wdXQgc3RyaW5nIGFzIGlucHV0LAotCSAqIGNyZWF0ZXMgYW4gSW5wdXRTdHJlYW0gZnJvbSB0aGUgaW5wdXQgc3RyaW5nLCBjcmVhdGUgYSB0ZW1wb3JhcnkgbW9kZWwKLQkgKiBvZiB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCwgY2xlYW51cHMgdGhlIG1vZGVsIHdpdGhpbiBzdGFydCBhbmQKLQkgKiBsZW5ndGgsIHRoZW4gcmV0dXJucyB0aGUgY2xlYW5lZCB1cCBpbnB1dCBzdHJpbmcuCi0JICovCi0JU3RyaW5nIGNsZWFudXBDb250ZW50KFN0cmluZyBjb250ZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIElGaWxlIGFzIGlucHV0LCBjcmVhdGVzIGEKLQkgKiB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElGaWxlJ3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIHdob2xlIG1vZGVsLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4gVGhlIElGaWxlCi0JICogaXMgdXBkYXRlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgaXMgcmVsZWFzZWQgaW4gdGhlCi0JICogbW9kZWwgbWFuYWdlci4KLQkgKi8KLQl2b2lkIGNsZWFudXBGaWxlKElGaWxlIGZpbGUpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIElGaWxlIGFzIGlucHV0LCBjcmVhdGVzIGEKLQkgKiB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElGaWxlJ3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIG1vZGVsIHdpdGhpbiBzdGFydCBhbmQgbGVuZ3RoLCB0aGVuIHJlbGVhc2VzCi0JICogdGhlIG1vZGVsLiBUaGUgSUZpbGUgaXMgdXBkYXRlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgaXMKLQkgKiByZWxlYXNlZCBpbiB0aGUgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQl2b2lkIGNsZWFudXBGaWxlKElGaWxlIGZpbGUsIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBmaWxlIG5hbWUgYXMgaW5wdXQsY3JlYXRlcyBhbgotCSAqIElucHV0U3RyZWFtIGZyb20gdGhlIGZpbGUsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUKLQkgKiBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmaWxlIG5hbWUncyBmaWxlIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIHdob2xlCi0JICogbW9kZWwsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLiBUaGUgZmlsZSBpcyB1cGRhdGVkIHdoZW4gdGhlIGxhc3QKLQkgKiByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzIHJlbGVhc2VkIGluIHRoZSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY2xlYW51cEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBmaWxlIG5hbWUgYXMgaW5wdXQsY3JlYXRlcyBhbgotCSAqIElucHV0U3RyZWFtIGZyb20gdGhlIGZpbGUsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUKLQkgKiBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmaWxlIG5hbWUncyBmaWxlIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIG1vZGVsCi0JICogd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLiBUaGUgZmlsZSBpcyB1cGRhdGVkCi0JICogd2hlbiB0aGUgbGFzdCByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzIHJlbGVhc2VkIGluIHRoZSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY2xlYW51cEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhIG1vZGVsIGFzIGlucHV0LCBhbmQgY2xlYW51cHMKLQkgKiB0aGUgd2hvbGUgbW9kZWwuCi0JICovCi0Jdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGEgbW9kZWwgYXMgaW5wdXQsIGFuZCBjbGVhbnVwcwotCSAqIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aC4KLQkgKi8KLQl2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjgwZWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIHsKLQlOb2RlIGNsZWFudXAoTm9kZSBub2RlKTsKLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCi0Jdm9pZCBzZXRDbGVhbnVwUHJlZmVyZW5jZXMoSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgY2xlYW51cFByZWZlcmVuY2VzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODE0OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIHsKLQotCWludCBnZXRBdHRyTmFtZUNhc2UoKTsKLQotCWJvb2xlYW4gZ2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKCk7Ci0KLQlib29sZWFuIGdldENvbnZlcnRFT0xDb2RlcygpOwotCi0JU3RyaW5nIGdldEVPTENvZGUoKTsKLQotCWJvb2xlYW4gZ2V0Rm9ybWF0U291cmNlKCk7Ci0KLQlib29sZWFuIGdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0KLQlib29sZWFuIGdldEluc2VydFJlcXVpcmVkQXR0cnMoKTsKLQotCWJvb2xlYW4gZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0KLQlpbnQgZ2V0VGFnTmFtZUNhc2UoKTsKLQotCXZvaWQgc2V0QXR0ck5hbWVDYXNlKGludCBhdHRyTmFtZUNhc2UpOwotCi0Jdm9pZCBzZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MpOwotCi0Jdm9pZCBzZXRDb252ZXJ0RU9MQ29kZXMoYm9vbGVhbiBjb252ZXJ0RU9MQ29kZXMpOwotCi0Jdm9pZCBzZXRFT0xDb2RlKFN0cmluZyBFT0xDb2RlKTsKLQotCXZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKTsKLQotCXZvaWQgc2V0SW5zZXJ0TWlzc2luZ1RhZ3MoYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyk7Ci0KLQl2b2lkIHNldEluc2VydFJlcXVpcmVkQXR0cnMoYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzKTsKLQotCXZvaWQgc2V0UHJlZmVyZW5jZXMoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpOwotCi0Jdm9pZCBzZXRRdW90ZUF0dHJWYWx1ZXMoYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMpOwotCi0Jdm9pZCBzZXRUYWdOYW1lQ2FzZShpbnQgdGFnTmFtZUNhc2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2E1Yzk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBpbnB1dCBzdHJpbmcgYXMgaW5wdXQsCi0JICogY3JlYXRlcyBhbiBJbnB1dFN0cmVhbSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbAotCSAqIG9mIHRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkLCBjbGVhbnVwcyB0aGUgd2hvbGUgbW9kZWwsIHRoZW4gcmV0dXJucwotCSAqIHRoZSBjbGVhbmVkIHVwIGlucHV0IHN0cmluZy4KLQkgKi8KLQlTdHJpbmcgY2xlYW51cENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBpbnB1dCBzdHJpbmcgYXMgaW5wdXQsCi0JICogY3JlYXRlcyBhbiBJbnB1dFN0cmVhbSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbAotCSAqIG9mIHRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkLCBjbGVhbnVwcyB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZAotCSAqIGxlbmd0aCwgdGhlbiByZXR1cm5zIHRoZSBjbGVhbmVkIHVwIGlucHV0IHN0cmluZy4KLQkgKi8KLQlTdHJpbmcgY2xlYW51cENvbnRlbnQoU3RyaW5nIGNvbnRlbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIElEb2N1bWVudCBhcyBpbnB1dCwgY3JlYXRlcwotCSAqIGEgdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRG9jdW1lbnQncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgd2hvbGUgbW9kZWwsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLgotCSAqLwotCXZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIElEb2N1bWVudCBhcyBpbnB1dCwgY3JlYXRlcwotCSAqIGEgdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRG9jdW1lbnQncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMKLQkgKiB0aGUgbW9kZWwuCi0JICovCi0Jdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBJRmlsZSBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRmlsZSdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuIFRoZSBJRmlsZQotCSAqIGlzIHVwZGF0ZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzIHJlbGVhc2VkIGluIHRoZQotCSAqIG1vZGVsIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwRmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gSUZpbGUgYXMgaW5wdXQsIGNyZWF0ZXMgYQotCSAqIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUgY2FsY3VsYXRlZCB1c2luZyB0aGUgSUZpbGUncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMKLQkgKiB0aGUgbW9kZWwuIFRoZSBJRmlsZSBpcyB1cGRhdGVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIG9mIHRoZSBtb2RlbCBpcwotCSAqIHJlbGVhc2VkIGluIHRoZSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY2xlYW51cEZpbGUoSUZpbGUgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBmaWxlIG5hbWUgYXMgaW5wdXQsY3JlYXRlcyBhbgotCSAqIElucHV0U3RyZWFtIGZyb20gdGhlIGZpbGUsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUKLQkgKiBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmaWxlIG5hbWUncyBmaWxlIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIHdob2xlCi0JICogbW9kZWwsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLiBUaGUgZmlsZSBpcyB1cGRhdGVkIHdoZW4gdGhlIGxhc3QKLQkgKiByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzIHJlbGVhc2VkIGluIHRoZSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY2xlYW51cEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGEgZmlsZSBuYW1lIGFzIGlucHV0LGNyZWF0ZXMgYW4KLQkgKiBJbnB1dFN0cmVhbSBmcm9tIHRoZSBmaWxlLCBjcmVhdGUgYSB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlCi0JICogY2FsY3VsYXRlZCB1c2luZyB0aGUgZmlsZSBuYW1lJ3MgZmlsZSBleHRlbnNpb24sIGNsZWFudXBzIHRoZSBtb2RlbAotCSAqIHdpdGhpbiBzdGFydCBhbmQgbGVuZ3RoLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4gVGhlIGZpbGUgaXMgdXBkYXRlZAotCSAqIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIG9mIHRoZSBtb2RlbCBpcyByZWxlYXNlZCBpbiB0aGUgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQl2b2lkIGNsZWFudXBGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGEgbW9kZWwgYXMgaW5wdXQsIGFuZCBjbGVhbnVwcwotCSAqIHRoZSB3aG9sZSBtb2RlbC4KLQkgKi8KLQl2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBtb2RlbCBhcyBpbnB1dCwgYW5kIGNsZWFudXBzCi0JICogdGhlIG1vZGVsIHdpdGhpbiBzdGFydCBhbmQgbGVuZ3RoLgotCSAqLwotCXZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGEgbm9kZSBhcyBpbnB1dCwgYW5kIGZvcm1hdHMKLQkgKiB0aGUgbm9kZSBhbmQgYWxsIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNsZWFudXBOb2RlKE5vZGUgbm9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jbGVhbnVwL1N0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzNmI2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgaW1wbGVtZW50cyBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyB7Ci0JcHJpdmF0ZSBpbnQgZkF0dHJOYW1lQ2FzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkNvbXByZXNzRW1wdHlFbGVtZW50VGFnczsKLQlwcml2YXRlIGJvb2xlYW4gZkNvbnZlcnRFT0xDb2RlczsKLQlwcml2YXRlIFN0cmluZyBmRU9MQ29kZTsKLQlwcml2YXRlIGJvb2xlYW4gZkZvcm1hdFNvdXJjZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluc2VydE1pc3NpbmdUYWdzOwotCXByaXZhdGUgYm9vbGVhbiBmSW5zZXJ0UmVxdWlyZWRBdHRyczsKLQkvL3ByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQlwcml2YXRlIFByZWZlcmVuY2VzIGZQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZRdW90ZUF0dHJWYWx1ZXM7Ci0KLQlwcml2YXRlIGludCBmVGFnTmFtZUNhc2U7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQotCQlyZXR1cm4gZkF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoKSB7Ci0KLQkJcmV0dXJuIGZDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3M7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29udmVydEVPTENvZGVzKCkgewotCi0JCXJldHVybiBmQ29udmVydEVPTENvZGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RU9MQ29kZSgpIHsKLQotCQlyZXR1cm4gZkVPTENvZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0U291cmNlKCkgewotCi0JCXJldHVybiBmRm9ybWF0U291cmNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEluc2VydE1pc3NpbmdUYWdzKCkgewotCi0JCXJldHVybiBmSW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycygpIHsKLQotCQlyZXR1cm4gZkluc2VydFJlcXVpcmVkQXR0cnM7Ci0JfQotCi0JcHVibGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCi0JCWlmIChmUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZlByZWZlcmVuY2VzID0gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gZlByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFF1b3RlQXR0clZhbHVlcygpIHsKLQotCQlyZXR1cm4gZlF1b3RlQXR0clZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhZ05hbWVDYXNlKCkgewotCi0JCXJldHVybiBmVGFnTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0ck5hbWVDYXNlKGludCBhdHRyTmFtZUNhc2UpIHsKLQotCQlmQXR0ck5hbWVDYXNlID0gYXR0ck5hbWVDYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhib29sZWFuIGNvbXByZXNzRW1wdHlFbGVtZW50VGFncykgewotCi0JCWZDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgPSBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydEVPTENvZGVzKGJvb2xlYW4gY29udmVydEVPTENvZGVzKSB7Ci0KLQkJZkNvbnZlcnRFT0xDb2RlcyA9IGNvbnZlcnRFT0xDb2RlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFT0xDb2RlKFN0cmluZyBFT0xDb2RlKSB7Ci0KLQkJZkVPTENvZGUgPSBFT0xDb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSkgewotCi0JCWZGb3JtYXRTb3VyY2UgPSBmb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0TWlzc2luZ1RhZ3MoYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncykgewotCi0JCWZJbnNlcnRNaXNzaW5nVGFncyA9IGluc2VydE1pc3NpbmdUYWdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc2VydFJlcXVpcmVkQXR0cnMoYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzKSB7Ci0KLQkJZkluc2VydFJlcXVpcmVkQXR0cnMgPSBpbnNlcnRSZXF1aXJlZEF0dHJzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VzKFByZWZlcmVuY2VzIHByZWZzKSB7Ci0KLQkJZlByZWZlcmVuY2VzID0gcHJlZnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVvdGVBdHRyVmFsdWVzKGJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzKSB7Ci0KLQkJZlF1b3RlQXR0clZhbHVlcyA9IHF1b3RlQXR0clZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWdOYW1lQ2FzZShpbnQgdGFnTmFtZUNhc2UpIHsKLQotCQlmVGFnTmFtZUNhc2UgPSB0YWdOYW1lQ2FzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU1YjdkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY2xlYW51cDsKLQotcHVibGljIGludGVyZmFjZSBTdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyIHsKLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKFN0cmluZyBjb250ZW50VHlwZSk7Ci0KLQl2b2lkIHNldENsZWFudXBQcm9jZXNzb3IoSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IsIFN0cmluZyBjb250ZW50VHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWE3ZjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY2xlYW51cDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXJJbXBsIGltcGxlbWVudHMgU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlciB7Ci0JcHJvdGVjdGVkIE1hcCBmQ2xlYW51cFByb2Nlc3NvcnM7Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnBhcnRpdGlvbkNsZWFudXAuU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlciNnZXRDbGVhbnVwUHJvY2Vzc29yKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnRUeXBlKTsKLQotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3JzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcikgZkNsZWFudXBQcm9jZXNzb3JzLmdldChjb250ZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5wYXJ0aXRpb25DbGVhbnVwLlN0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIjc2V0Q2xlYW51cFByb2Nlc3Nvcihjb20uaWJtLnNlZC5wYXJ0aXRpb25DbGVhbnVwLkNsZWFudXBQcm9jZXNzb3IsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcm9jZXNzb3IoSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnRUeXBlKTsKLQotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3JzID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWlmIChmQ2xlYW51cFByb2Nlc3NvcnMgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29ycy5yZW1vdmUoY29udGVudFR5cGUpOwotCQllbHNlCi0JCQlmQ2xlYW51cFByb2Nlc3NvcnMucHV0KGNvbnRlbnRUeXBlLCBjbGVhbnVwUHJvY2Vzc29yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NvbnRlbnRtb2RlbC9DTURvY1R5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY29udGVudG1vZGVsL0NNRG9jVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2JkM2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY29udGVudG1vZGVsL0NNRG9jVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29udGVudG1vZGVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2NUeXBlIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSFRNTF9ET0NfVFlQRSA9ICJDSFRNTCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUxfRE9DX1RZUEUgPSAiSFRNTCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTUDExX0RPQ19UWVBFID0gIkpTUDExIjsvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY29udGVudG1vZGVsL0NNRG9jdW1lbnRUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50VHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjg2MmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY29udGVudG1vZGVsL0NNRG9jdW1lbnRUcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLS8qKgotICogUG9zaXRpb24gZGVwZW5kZW50IENNRG9jdW1lbnQgdHJhY2tlci4gQSB0cmFja2VyIG1hdGNoZXMgYQotICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB3aXRoIGEgQ01Eb2N1bWVudCB0aGF0IGl0IGVuYWJsZXMgYWxsb3dpbmcgZm9yCi0gKiBwb3NpdGlvbi1kZXBlbmRlbnQgY29udGVudCBtb2RlbHMKLSAqLwotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50VHJhY2tlciB7Ci0KLQlDTURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzY2MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBDTU5vZGVXcmFwcGVyIGV4dGVuZHMgQ01Ob2RlIHsKLQlDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI5NjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb250ZW50TW9kZWxBZGFwdGVyIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRNb2RlbEFkYXB0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIGdldENNRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTURvY3VtZW50Ci0JICogQHBhcmFtIG5vdGlmZXIKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLm1vZGVsLklOb2RlTm90aWZpZXIKLQkgKiAKLQkgKiBSZXR1cm5zIENNRG9jdW1lbnQgYXNzb2NpYXRlZCB0byB0aGUgYWRhcHRpbmcgbm9kZS4gRm9yIGV4YW1wbCA6IEhUTUwKLQkgKiBDTURvY3VtZW50IGlzIGFzc29jaWF0ZWQgdG8gSFRNTCBEb2N1bWVudCBub2RlLCBEVEQgQ01Eb2N1bWVudCBpcwotCSAqIGFzc29jaWF0ZWQgdG8gRG9jdW1lbnRUeXBlIG5vZGUsIERURC9TY2hlbWEgQ01Eb2N1bWVudCBpcyBhc3NvY2lhdGVkIHRvCi0JICogRWxlbWVudCBub2RlIChzb21ldGltZSB3aXRoIG5hbWVzcGFjZSksIGFuZCB0YWdsaWIgQ01Eb2N1bWVudCBpcwotCSAqIGFzc29jaWF0ZWQgdG8gdGFnbGliIGRpcmVjdGl2ZSBFbGVtZW50IG5vZGUuCi0JICogCi0JICogSU5vZGVOb3RpZmllciBpcyBwYXNzZWQgZm9yIHN0YXRlbGVzcyAoc2luZ2xldG9uKSBJTm9kZUFkYXB0ZXIKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlDTURvY3VtZW50IGdldENNRG9jdW1lbnQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXIgbm90aWZpZXIpOwotCi0JLyoqCi0JICogZ2V0RGVjbGFyYXRpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gbm90aWZlcgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQubW9kZWwuSU5vZGVOb3RpZmllcgotCSAqIAotCSAqIFJldHVybnMgRWxlbWVudERlZmluaXRpb24gb3IgQXR0cmlidXRlRGVmaW5pdGlvbiBmb3IgdGhlIGFkYXB0aW5nIG5vZGUuCi0JICogCi0JICogSU5vZGVOb3RpZmllciBpcyBwYXNzZWQgZm9yIHN0YXRlbGVzcyAoc2luZ2xldG9uKSBJTm9kZUFkYXB0ZXIKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlDTU5vZGUgZ2V0RGVjbGFyYXRpb24ob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXIgbm90aWZpZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jb250ZW50bW9kZWwvTnVsbENvbnRlbnRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jb250ZW50bW9kZWwvTnVsbENvbnRlbnRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTcyYmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvY29udGVudG1vZGVsL051bGxDb250ZW50TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaW50aWFsaXplIHNwZWNpZmljIHZhcmlhYmxlcyB0aGF0IG5lZWQgYSBjb250ZW50Ci0gKiBtb2RlbCwgdW50aWwgdGhlIHRydWUgY29udGVudCBtb2RlbCBpcyBhdmFpbGFibGUuIFRoaXMgcHJldmVudHMgaGF2aW5nIHRvCi0gKiBkbyBsb3RzIG9mIG51bGwgY2hlY2tzLgotICovCi1wdWJsaWMgY2xhc3MgTnVsbENvbnRlbnRNb2RlbCBpbXBsZW1lbnRzIENNRG9jdW1lbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTnVsbENNTmFtZWROb2RlTWFwIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxJdGVyYXRvcigpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOdWxsSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCXB1YmxpYyBOdWxsSXRlcmF0b3IoKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCByZW1vdmUgcmVnaW9ucyB2aWEgaXRlcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXB1YmxpYyBOdWxsQ29udGVudE1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ01OYW1lZE5vZGVNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBuZXcgTnVsbENNTmFtZWROb2RlTWFwKCk7Ci0JfQotCi0JcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlMDJjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29udGVudHR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZpZW5jZSB0byBwcm92aWRlIGNvbXBpbGUtdGltZQotICogc2FmZXR5IHdoZW4gcmVmZXJpbmcgdG8gYSBjb250ZW50VHlwZSBJRC4gVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZAotICogZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JDU1MgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBub3QgZGVjbGFyZWQgYXMgZmluYWwsCi0JICogc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0NTUyA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2RvY3VtZW50L0Fic3RyYWN0RG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvQWJzdHJhY3REb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzk5N2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvQWJzdHJhY3REb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuTWFsZm9ybWVkSW5wdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Vbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db2RlZFJlYWRlckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5leGNlcHRpb25zLk1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTnVsbFN0cnVjdHVyZWREb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYSBmaWxlIGFuZCBjcmVhdGVzIGFuIFN0cnVjdHVyZWQgTW9kZWwuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIGltcGxlbWVudHMgSURvY3VtZW50TG9hZGVyIHsKLQotCXByaXZhdGUgQ29kZWRSZWFkZXJDcmVhdG9yIGZDb2RlZFJlYWRlckNyZWF0b3I7Ci0JcHJvdGVjdGVkIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCS8vcHJpdmF0ZSBib29sZWFuIGZQcm9wZXJ0aWVzT2J0YWluZWQ7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0JcHJvdGVjdGVkIFJlYWRlciBmRnVsbFByZXBhcmVkUmVhZGVyOwotCi0JLyoqCi0JICogQWJzdHJhY3RMb2FkZXIgY29uc3RydWN0b3IgYWxzbyBpbml0aWFsaXplcyBlbmNvZGluZyBjb252ZXJ0ZXIvbWFwcGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0J1ZmZlciBjb252ZXJ0TGluZURlbGltaXRlcnMoU3RyaW5nQnVmZmVyIGFsbFRleHRCdWZmZXIsIFN0cmluZyBsaW5lRGVsaW1pdGVyVG9Vc2UpIHsKLQkJLy8gVE9ETzogYXZvaWQgdXNlIG9mIFN0cmluZyBpbnN0YW5jZQotCQlTdHJpbmcgYWxsVGV4dCA9IGFsbFRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQkJSURvY3VtZW50IHRlbXBEb2MgPSBuZXcgRG9jdW1lbnQoYWxsVGV4dCk7Ci0JCWlmIChsaW5lRGVsaW1pdGVyVG9Vc2UgPT0gbnVsbCkKLQkJCWxpbmVEZWxpbWl0ZXJUb1VzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgbmV3VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxpbmVDb3VudCA9IHRlbXBEb2MuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBsaW5lSW5mbyA9IHRlbXBEb2MuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCWludCBsaW5lU3RhcnRPZmZzZXQgPSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgbGluZUxlbmd0aCA9IGxpbmVJbmZvLmdldExlbmd0aCgpOwotCQkJCWludCBsaW5lRW5kT2Zmc2V0ID0gbGluZVN0YXJ0T2Zmc2V0ICsgbGluZUxlbmd0aDsKLQkJCQluZXdUZXh0LmFwcGVuZChhbGxUZXh0LnN1YnN0cmluZyhsaW5lU3RhcnRPZmZzZXQsIGxpbmVFbmRPZmZzZXQpKTsKLQkJCQlpZiAoKGkgPCBsaW5lQ291bnQgLSAxKSAmJiAodGVtcERvYy5nZXRMaW5lRGVsaW1pdGVyKGkpICE9IG51bGwpKQotCQkJCQluZXdUZXh0LmFwcGVuZChsaW5lRGVsaW1pdGVyVG9Vc2UpOwotCQkJfSBjYXRjaCAob3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkvLyBzaG91bGQgZml4IHVwIHRvIGVpdGhlciB0aHJvdyBub3RoaW5nLCBvciB0aGUgcmlnaHQgdGhpbmcsCi0JCQkJLy8gYnV0Ci0JCQkJLy8gaW4gdGhlIGNvdXJzZSBvZiByZWZhY3RvcmluZywgdGhpcyB3YXMgZWFzaWVzdCAicXVpY2sgZml4Ii4KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdUZXh0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIElFbmNvZGVkRG9jdW1lbnQsIHRoYXQgaGFzCi0JICogYmVlbiBpbml0aWFsaXplZCB3aXRoIGFwcHJvcHJpYXRlIHBhcnNlci4gRm9yIG1hbnkgbG9hZGVycywgdGhlCi0JICogKGRlZmF1bHQpIHBhcnNlciB1c2VkIGlzIGtub3duIGZvciBhbnkgaW5wdXQuIEZvciBvdGhlcnMsIHRoZSBjb3JyZWN0Ci0JICogcGFyc2VyIChhbmQgaXRzIGluaXRpYWxpemF0aW9uKSBpcyBub3JtYWxseSBkZXBlbmRlbnQgb24gdGhlIGNvbnRlbnQgb2YKLQkgKiB0aGUgZmlsZS4gVGhpcyBuby1hcmd1bWVudCBtZXRob2Qgc2hvdWxkIGFzc3VtZSAiZW1wdHkgaW5wdXQiIGFuZCB3b3VsZAotCSAqIHRoZXJlZm9yZSByZXR1cm4gdGhlIGRlZmF1bHQgcGFyc2VyIGZvciB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKi8KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbmV3RW5jb2RlZERvY3VtZW50KCk7Ci0JCS8vIE1ha2Ugc3VyZSBldmVyeSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGFuIEVuY29kaW5nIE1lbWVudG8sCi0JCS8vIHdoaWNoIGlzIHRoZSBkZWZhdWx0IG9uZSBmb3IgImVtcHR5IiBzdHJ1Y3R1cmVkRG9jdW1lbnRzCi0JCVN0cmluZyBjaGFyc2V0ID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLnVzZURlZmF1bHROYW1lUnVsZXMoZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkpOwotCQlTdHJpbmcgc3BlY0RlZmF1bHRDaGFyc2V0ID0gZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGNoYXJzZXQsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCwgc3BlY0RlZmF1bHRDaGFyc2V0KSk7Ci0KLQkJSURvY3VtZW50UGFydGl0aW9uZXIgZGVmYXVsdFBhcnRpdGlvbmVyID0gZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uMykgc3RydWN0dXJlZERvY3VtZW50KS5zZXREb2N1bWVudFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnQuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgZGVmYXVsdFBhcnRpdGlvbmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXREb2N1bWVudFBhcnRpdGlvbmVyKGRlZmF1bHRQYXJ0aXRpb25lcik7Ci0JCX0KLQkJZGVmYXVsdFBhcnRpdGlvbmVyLmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCi0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhYnN0cmFjdCB2ZXJzaW9uIHNob3VsZCBoYW5kbGUgbW9zdCBjYXNlcywgYnV0IHdvbid0IGlmCi0JICogY29udGVudFR5cGUgaXMgc2Vuc2l0aXZlIHRvIGVuY29kaW5nLCBhbmQvb3IgZW1iZWRkZWQgdHlwZXMKLQkgKi8KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXRyeSB7Ci0KLQkJCUNvZGVkUmVhZGVyQ3JlYXRvciBjcmVhdG9yID0gZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCk7Ci0JCQljcmVhdG9yLnNldChpRmlsZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gY3JlYXRvci5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oZkVuY29kaW5nTWVtZW50byk7Ci0JCQlmRnVsbFByZXBhcmVkUmVhZGVyID0gZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCkuZ2V0Q29kZWRSZWFkZXIoKTsKLQotCQkJc2V0RG9jdW1lbnRDb250ZW50c0Zyb21SZWFkZXIoc3RydWN0dXJlZERvY3VtZW50LCBmRnVsbFByZXBhcmVkUmVhZGVyKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChmRnVsbFByZXBhcmVkUmVhZGVyICE9IG51bGwpIHsKLQkJCQlmRnVsbFByZXBhcmVkUmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoUmVhZGVyIHJlYWRlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJU3RyaW5nQnVmZmVyIGFsbFRleHQgPSByZWFkSW5wdXRTdHJlYW0oZkZ1bGxQcmVwYXJlZFJlYWRlcik7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXQoYWxsVGV4dC50b1N0cmluZygpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlbmFtZSwgaW5wdXRTdHJlYW0sIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQl9Ci0KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwgJiYgaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBoYXZlIGJvdGggbnVsbCBmaWxlbmFtZSBhbmQgaW5wdXRzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvZGVkUmVhZGVyQ3JlYXRvciBjb2RlZFJlYWRlckNyZWF0b3IgPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKTsKLQkJdHJ5IHsKLQkJCWNvZGVkUmVhZGVyQ3JlYXRvci5zZXQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJCWNvZGVkUmVhZGVyQ3JlYXRvci5zZXRFbmNvZGluZ1J1bGUoZW5jb2RpbmdSdWxlKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRnVsbFByZXBhcmVkUmVhZGVyID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldENvZGVkUmVhZGVyKCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGZFbmNvZGluZ01lbWVudG8pOwotCQkJc2V0RG9jdW1lbnRDb250ZW50c0Zyb21SZWFkZXIoc3RydWN0dXJlZERvY3VtZW50LCBmRnVsbFByZXBhcmVkUmVhZGVyKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlIGluIHRoaXMgY29udGV4dAotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgIT0gbnVsbCkgewotCQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q2hhclBvc3Rpb25PZkZhaWx1cmUoQnVmZmVyZWRSZWFkZXIgaW5wdXRTdHJlYW0pIHsKLQkJaW50IGNoYXJQb3NpdGlvbiA9IDE7Ci0JCWludCBjaGFyUmVhZCA9IC0xOwotCQlib29sZWFuIGVycm9yRm91bmQgPSBmYWxzZTsKLQkJZG8gewotCQkJdHJ5IHsKLQkJCQljaGFyUmVhZCA9IGlucHV0U3RyZWFtLnJlYWQoKTsKLQkJCQljaGFyUG9zaXRpb24rKzsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB0aGlzIGlzIGV4cGVjdGVkLCBzaW5jZSB3ZSdyZSBleHBlY3RpbmcgZmFpbHVyZSwKLQkJCQkvLyBzbyBubyBuZWVkIHRvIGRvIGFueXRoaW5nLgotCQkJCWVycm9yRm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IHdoaWxlICghKGNoYXJSZWFkID09IC0xIHx8IGVycm9yRm91bmQpKTsKLQotCQlpZiAoZXJyb3JGb3VuZCkKLQkJCS8vIGRtdywgYmxpbmRseSBtb2RpZmllZCB0byArMSB0byBnZXQgdW5pdCB0ZXN0cyB0byB3b3JrLCBtb3ZpbmcKLQkJCS8vIGZyb20gSmF2YSAxLjMsIHRvIDEuNAotCQkJLy8gbm90IHN1cmUgaG93L3doeSB0aGlzIGJlaGF2aW9yIHdvdWxkIGhhdmUgY2hhbmdlZC4gKEl0cyBhcyBpZgotCQkJLy8gJ3JlYWQnIGlzIHJlcG9ydGluZyBlcnJvcgotCQkJLy8gb25lIGNoYXJhY3RlciBlYXJseSkuCi0JCQlyZXR1cm4gY2hhclBvc2l0aW9uICsgMTsKLQkJZWxzZQotCQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29kZWRSZWFkZXJDcmVhdG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2RlZFJlYWRlckNyZWF0b3IgZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCkgewotCQlpZiAoZkNvZGVkUmVhZGVyQ3JlYXRvciA9PSBudWxsKSB7Ci0JCQlmQ29kZWRSZWFkZXJDcmVhdG9yID0gbmV3IENvZGVkUmVhZGVyQ3JlYXRvcigpOwotCQl9Ci0JCXJldHVybiBmQ29kZWRSZWFkZXJDcmVhdG9yOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAcmV0dXJuIElEb2N1bWVudFBhcnRpdGlvbmVyCi0JICovCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQkvLyBiZSBkZWZhdWx0LCB3ZSdsbCBwcm92aWRlIFhNTCAodGhvdWdoIGNvdWxkIGJlIE5PT1A/Ci0JCS8vIDcvMjAwMyAuLi4uIGNoYW5nZWQgZHVyaW5nIHJlLW9yZyAuLi4gdG8gYmUgTnVsbCBpbnN0ZWFkIG9mIFhNTCwKLQkJLy8gc28gdGhlcmUgd291bGQgYmUgbm8gbWlub3IgZGVwZW5kYW5jaWVzIGZyb20gaGlnaGVyIHBsdWdpbnMuCi0JCXJldHVybiBuZXcgTnVsbFN0cnVjdHVyZWREb2N1bWVudFBhcnRpdGlvbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5jb2RpbmdNZW1lbnRvLgotCSAqIAotCSAqIEByZXR1cm4gRW5jb2RpbmdNZW1lbnRvCi0JICovCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IGVuY29kaW5nTWVtZW50byB3YXMgYWNjZXNzZWQgYmVmb3JlIGl0IHdhcyBzZXQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZnVsbFByZXBhcmVkUmVhZGVyLgotCSAqLwotCXByb3RlY3RlZCBSZWFkZXIgZ2V0RnVsbFByZXBhcmVkUmVhZGVyKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgPT0gbnVsbCkgewotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldENvZGVkUmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZGdWxsUHJlcGFyZWRSZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogSWYgc3ViY2xhc3MgZG9lc24ndCBpbXBsZW1lbnQsIHJldHVybiBudWxsCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBIHV0aWxpdHkgbWV0aG9kLCBidXQgZGVwZW5kcyBvbiBzdWJjbGFzc2VzIHRvIGltcGxpbWVudCB0aGUgcHJlZmVycmVkCi0JICogZW5kIG9mIGxpbmUgZm9yIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUuIE5vdGU6IHN1YmNsYXNzZXMgc2hvdWxkIG5vdAotCSAqIHJlLWltcGxlbWVudCB0aGlzIG1ldGhvZCAodGhlcmUncyBubyByZWFzb24gdG8sIGV2ZW4gdGhvdWdoIGl0cyBwYXJ0IG9mCi0JICogaW50ZXJmYWNlKS4gVGhpcyBtZXRob2Qgbm90IG9ubHkgY29udmVydHMgZW5kLW9mLWxpbmUgY2hhcmFjdGVycywgaWYKLQkgKiBuZWVkZWQsIGJ1dCBzZXRzIHRoZSBjb3JyZWN0IGVuZC1vZi1saW5lIGRlbGltaXRlciBpbgotCSAqIHN0cnVjdHVyZWREb2N1bWVudC4gTWlub3Igbm90ZTogY2FuJ3QgdXNlIHRoaXMgZXhhY3QgbWV0aG9kIGluIGR1bXBlcnMsCi0JICogc2luY2UgdGhlIGRlY2lzaW9uIHRvIGNoYW5nZSBvciBub3QgaXMgYSBsaXR0bGUgZGlmZmVyZW50LCBhbmQgc2luY2UKLQkgKiB0aGVyZSB3ZSBoYXZlIHRvIGNoYW5nZSB0ZXh0IG9mIHN0cnVjdHVyZWREb2N1bWVudCBpZiBmb3VuZCB0byBuZWVkCi0JICogY29udmVyc2lvbi4gKFdoZXJlIGFzIGZvciBsb2FkaW5nLCB3ZSBhc3N1bWUgd2UgaGF2ZW4ndCB5ZXQgc2V0IHRleHQgaW4KLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGJ1dCB3aWxsIGJlIGRvbmUgYnkgb3RoZXIgbWV0aG9kIGp1c3QgYSB0aW55IGJpeQotCSAqIGxhdGVyKS4gTmVlZHMgdG8gYmUgcHVibGljIHRvIGhhbmRsZSBpbnRlcmZhY2UuIEl0IGlzIGluIHRoZSBpbnRlcmZhY2UKLQkgKiBqdXN0IHNvIE1vZGVsTWFuYWdlckltcGwgY2FuIHVzZSBpdCBpbiBhIHNwZWNpYWwgY2lyY3Vtc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgaGFuZGxlTGluZURlbGltaXRlcihTdHJpbmdCdWZmZXIgb3JpZ2luYWxTdHJpbmcsIElFbmNvZGVkRG9jdW1lbnQgdGhlRmxhdE1vZGVsKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gaGFuZGxlIGxpbmUgZGVsaW1pdGVycyBzbyBNYXJrZXIgUG9zaXRpb25zIGFyZQotCQkvLyB1cGRhdGVkCi0JCVN0cmluZ0J1ZmZlciBjb252ZXJ0ZWRUZXh0ID0gbnVsbDsKLQkJLy8gYmFzZWQgb24gdGV4dCwgbWFrZSBhIGd1ZXNzIG9uIHdoYXQncyBiZWluZyB1c2VkIGFzCi0JCS8vIGxpbmUgZGVsaW1pdGVyCi0JCVN0cmluZyBwcm9iYWJsZUxpbmVEZWxpbWl0ZXIgPSBUZXh0VXRpbGl0aWVzLmRldGVybWluZUxpbmVEZWxpbWl0ZXIob3JpZ2luYWxTdHJpbmcsIHRoZUZsYXRNb2RlbC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCksIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHByZWZlcnJlZExpbmVEZWxpbWl0ZXIgPSBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKCk7Ci0JCWlmIChwcmVmZXJyZWRMaW5lRGVsaW1pdGVyID09IG51bGwpIHsKLQkJCS8vIHdoZW4gcHJlZmVycmVkTGluZURlbGltaXRlciBpcyBudWxsLCBpdCBtZWFucyAibGVhdmUgYWxvbmUiCi0JCQkvLyBzbyBubyBjb252ZXJzaW9uIG5lZWRlZC4KLQkJCS8vIHNldCBoZXJlLCBvbmx5IGlmIG51bGwgKHNob3VsZCBhbHJlYWR5IGJlIHNldCwgYnV0IGlmIG5vdCwKLQkJCS8vIHdlJ2xsIHNldCBzbyBhbnkgc3Vic2VxdWVudCBlZGl0aW5nIGluc2VydHMgd2hhdCB3ZSdyZQotCQkJLy8gYXNzdW1pbmcpCi0JCQlpZiAoIXRoZUZsYXRNb2RlbC5nZXRMaW5lRGVsaW1pdGVyKCkuZXF1YWxzKHByb2JhYmxlTGluZURlbGltaXRlcikpIHsKLQkJCQl0aGVGbGF0TW9kZWwuc2V0TGluZURlbGltaXRlcihwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpOwotCQkJfQotCQkJY29udmVydGVkVGV4dCA9IG9yaWdpbmFsU3RyaW5nOwotCQl9IGVsc2UgewotCQkJaWYgKCFwcmVmZXJyZWRMaW5lRGVsaW1pdGVyLmVxdWFscyhwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJLy8gdGVjaG5pY2FsbHksIHdvdWxkbid0IGhhdmUgdG8gY29udmVydCBsaW5lIGRlbGltaXRlcnMKLQkJCQkvLyBoZXJlIGF0IGJlZ2lubmluZywgYnV0IHdoZW4gd2Ugc2F2ZSwgaWYgdGhlIHByZWZlcnJlZAotCQkJCS8vIGxpbmUgZGVsaW10ZXIgaXMgImxlYXZlIGFsb25lIiB0aGVuIHdlIGRvIGxlYXZlIGFsb25lLAotCQkJCS8vIHNvIGJlc3QgdG8gYmUgcmlnaHQgZnJvbSBiZWdpbm5pbmcuCi0JCQkJY29udmVydGVkVGV4dCA9IGNvbnZlcnRMaW5lRGVsaW1pdGVycyhvcmlnaW5hbFN0cmluZywgcHJlZmVycmVkTGluZURlbGltaXRlcik7Ci0JCQkJdGhlRmxhdE1vZGVsLnNldExpbmVEZWxpbWl0ZXIocHJlZmVycmVkTGluZURlbGltaXRlcik7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRoZXkgYXJlIGFscmVhZHkgdGhlIHNhbWUsIG5vIGNvbnZlcnNpb24gbmVlZGVkCi0JCQkJdGhlRmxhdE1vZGVsLnNldExpbmVEZWxpbWl0ZXIocHJlZmVycmVkTGluZURlbGltaXRlcik7Ci0JCQkJY29udmVydGVkVGV4dCA9IG9yaWdpbmFsU3RyaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb252ZXJ0ZWRUZXh0OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpOwotCi0JLyoqCi0JICogVmVyeSBtZWNoYW5pY2FsIG1ldGhvZCwganVzdCB0byByZWFkIHRoZSBjaGFyYWN0ZXJzLCBvbmNlIHRoZSByZWFkZXIgaXMKLQkgKiBjb3JyZWN0bHkgY3JlYXRlZC4gQ2FuIHRocm93IE1hbEZvcm1lZElucHV0RXhjZXB0aW9uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIHJlYWRJbnB1dFN0cmVhbShSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWludCBmQmxvY2tzUmVhZCA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBudW1SZWFkID0gMDsKLQkJdHJ5IHsKLQkJCWNoYXIgdEJ1ZmZbXSA9IG5ldyBjaGFyW0NvZGVkSU8uTUFYX0JVRl9TSVpFXTsKLQkJCXdoaWxlIChudW1SZWFkICE9IC0xKSB7Ci0JCQkJbnVtUmVhZCA9IHJlYWRlci5yZWFkKHRCdWZmLCAwLCB0QnVmZi5sZW5ndGgpOwotCQkJCWlmIChudW1SZWFkID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHRCdWZmLCAwLCBudW1SZWFkKTsKLQkJCQkJZkJsb2Nrc1JlYWQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoZkVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKSwgZkJsb2Nrc1JlYWQgKiBDb2RlZElPLk1BWF9CVUZfU0laRSArIG51bVJlYWQgKyBlLmdldElucHV0TGVuZ3RoKCkpOwotCQl9IGNhdGNoIChVbm1hcHBhYmxlQ2hhcmFjdGVyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoZkVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKSwgZkJsb2Nrc1JlYWQgKiBDb2RlZElPLk1BWF9CVUZfU0laRSArIG51bVJlYWQgKyBlLmdldElucHV0TGVuZ3RoKCkpOwotCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxvYWQoSUVuY29kZWREb2N1bWVudCBlbmNvZGVkRG9jdW1lbnQsIFJlYWRlciBpbnB1dFN0cmVhbVJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0U3RyZWFtUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0cmVhbSByZWFkZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpbnQgUkVBRF9CVUZGRVJfU0laRSA9IDgxOTI7Ci0JCWludCBNQVhfQlVGRkVSRURfU0laRV9GT1JfUkVTRVRfTUFSSyA9IDIwMDAwMDsKLQkJLy8gdGVtcCAuLi4uIGV2ZW50dWFsbHkgd2UnbGxsIG9ubHkgcmVhZCBhcyBuZWVkZWQKLQkJQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaW5wdXRTdHJlYW1SZWFkZXIsIE1BWF9CVUZGRVJFRF9TSVpFX0ZPUl9SRVNFVF9NQVJLKTsKLQkJYnVmZmVyZWRSZWFkZXIubWFyayhNQVhfQlVGRkVSRURfU0laRV9GT1JfUkVTRVRfTUFSSyk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRyeSB7Ci0JCQlpbnQgbnVtUmVhZCA9IDA7Ci0JCQljaGFyIHRCdWZmW10gPSBuZXcgY2hhcltSRUFEX0JVRkZFUl9TSVpFXTsKLQkJCXdoaWxlICgobnVtUmVhZCA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWQodEJ1ZmYsIDAsIHRCdWZmLmxlbmd0aCkpICE9IC0xKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh0QnVmZiwgMCwgbnVtUmVhZCk7Ci0JCQl9Ci0JCQkvLyByZW1lbWJlciAtLSB3ZSBkaWRuJ3Qgb3BlbiBzdHJlYW0gLi4uIHNvIHdlIGRvbid0IGNsb3NlIGl0Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZElucHV0RXhjZXB0aW9uIGUpIHsKLS8vCQkJaW50IHBvcyA9IGUuZ2V0SW5wdXRMZW5ndGgoKTsKLQkJCUVuY29kaW5nTWVtZW50byBsb2NhbEVuY29kaW5nTWVtZW50byA9IGdldEVuY29kaW5nTWVtZW50bygpOwotCQkJYm9vbGVhbiBjb3VsZFJlc2V0ID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmNvZGluZ05hbWVJbkVycm9yID0gbG9jYWxFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0JCQlpZiAoZW5jb2RpbmdOYW1lSW5FcnJvciA9PSBudWxsKSB7Ci0JCQkJZW5jb2RpbmdOYW1lSW5FcnJvciA9IGxvY2FsRW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJYnVmZmVyZWRSZWFkZXIucmVzZXQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHJlc2V0RXhjZXB0aW9uKSB7Ci0JCQkJLy8gdGhlIG9ubHkgZXJycm8gdGhhdCBjYW4gb2NjdXIgZHVyaW5nIHJlc2V0IGlzIGFuCi0JCQkJLy8gSU9FeGNlcHRpb24KLQkJCQkvLyBkdWUgdG8gYWxyZWFkeSBiZWluZyBwYXN0IHRoZSByZXN0IG1hcmsuIEluIHRoYXQgY2FzZSwgd2UKLQkJCQkvLyB0aHJvdyBtb3JlIGdlbmVyaWMgbWVzc2FnZQotCQkJCWNvdWxkUmVzZXQgPSBmYWxzZTsKLQkJCX0KLQkJCS8vIC0xIGNhbiBiZSB1c2VkIGJ5IFVJIGxheWVyIGFzIGEgY29kZSB0aGF0ICJwb3NpdGlvbiBjb3VsZCBub3QKLQkJCS8vIGJlCi0JCQkvLyBkZXRlcm1pbmVkIgotCQkJaW50IGNoYXJQb3N0aW9uID0gLTE7Ci0JCQlpZiAoY291bGRSZXNldCkgewotCi0JCQkJY2hhclBvc3Rpb24gPSBnZXRDaGFyUG9zdGlvbk9mRmFpbHVyZShidWZmZXJlZFJlYWRlcik7Ci0JCQkJLy9nZXRDaGFyUG9zdGlvbk9mRmFpbHVyZShuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5TdHJlYW0sCi0JCQkJLy8gamF2YUVuY29kaW5nTmFtZUluRXJyb3IpKTsKLQkJCX0KLQkJCS8vIGFsbCBvZiB0aGF0IGp1c3QgdG8gdGhyb3cgbW9yZSBhY2N1cmF0ZSBlcnJvcgotCQkJLy8gbm90ZTogd2UgZG8gdGhlIGNvbnZlcnNpb24gdG8gaWFuYU5hbWUsIGluc3RlYWQgb2YgdXNpbmcgdGhlCi0JCQkvLyBsb2NhbAotCQkJLy8gdmFyaWFibGUsCi0JCQkvLyBiZWNhdXNlIHRoaXMgaXMgdWx0aW1hdGVseSBvbmx5IGZvciB0aGUgdXNlciBlcnJvciBtZXNzYWdlCi0JCQkvLyAodGhhdAotCQkJLy8gaXMsCi0JCQkvLyB0aGUgZXJyb3Igb2NjdXJyZWQKLQkJCS8vIGluIGNvbnRleHQgb2YgamF2YUVuY29kaW5nTmFtZSBubyBtYXR0ZXIgd2hhdCBpYW5hRW5jb2RpbmdOYW1lCi0JCQkvLyBpcwotCQkJdGhyb3cgbmV3IE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbChlbmNvZGluZ05hbWVJbkVycm9yLCBDb2RlZElPLmdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZW5jb2RpbmdOYW1lSW5FcnJvciksIGNoYXJQb3N0aW9uLCAhY291bGRSZXNldCwgTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUkspOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzdHJpbmdidWZmZXIgPSBidWZmZXI7Ci0JCWVuY29kZWREb2N1bWVudC5zZXQoc3RyaW5nYnVmZmVyLnRvU3RyaW5nKCkpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50c0Zyb21SZWFkZXIoSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nQnVmZmVyIGFsbFRleHQgPSByZWFkSW5wdXRTdHJlYW0ocmVhZGVyKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnNldChhbGxUZXh0LnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwNzFiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2RvY3VtZW50L0RvY3VtZW50UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLS8qKgotICogQSBqYXZhLmlvLlJlYWRlciB0aGF0IGNhbiBvcGVyYXRlIG9mZiBvZiBhbiBJRG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIGludCBtYXJrID0gMDsKLQlwcml2YXRlIGludCBwb3NpdGlvbiA9IDA7Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50UmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzKGRvY3VtZW50LCAwKTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5pdGlhbFBvc2l0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlwb3NpdGlvbiA9IGluaXRpYWxQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI21hcmsoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQltYXJrID0gcG9zaXRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljaGFyW10gcmVhZENoYXJzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChwb3NpdGlvbiA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJLy8gdGhlIElEb2N1bWVudCBpcyBsaWtlbHkgdXNpbmcgYSBHYXBUZXh0U3RvcmUsIHNvIHdlIGNhbid0Ci0JCQkvLyByZXRyaWV2ZSBhIGNoYXJbXSBkaXJlY3RseQotCQkJaWYgKHBvc2l0aW9uICsgbGVuID4gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJCXJlYWRDaGFycyA9IGZEb2N1bWVudC5nZXQocG9zaXRpb24sIGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIHBvc2l0aW9uKS50b0NoYXJBcnJheSgpOwotCQkJZWxzZQotCQkJCXJlYWRDaGFycyA9IGZEb2N1bWVudC5nZXQocG9zaXRpb24sIGxlbikudG9DaGFyQXJyYXkoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocmVhZENoYXJzLCAwLCBjYnVmLCBvZmYsIHJlYWRDaGFycy5sZW5ndGgpOwotCQkJLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgcG9zaXRpb24gKyAiOiIgKyByZWFkQ2hhcnMubGVuZ3RoICsgIiAiCi0JCQkvLyArIFN0cmluZ1V0aWxzLmVzY2FwZShuZXcgU3RyaW5nKHJlYWRDaGFycykpKTsKLQkJCXBvc2l0aW9uICs9IHJlYWRDaGFycy5sZW5ndGg7Ci0JCQlyZXR1cm4gcmVhZENoYXJzLmxlbmd0aDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgZnJvbSBJRG9jdW1lbnQ6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwb3NpdGlvbiA9IG1hcms7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5pdGlhbFBvc2l0aW9uKSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlwb3NpdGlvbiA9IGluaXRpYWxQb3NpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChpbnQgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwb3NpdGlvbiA9IHBvczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJbG9uZyBza2lwcGVkID0gbjsKLQkJaWYgKHBvc2l0aW9uICsgbiA+IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJc2tpcHBlZCA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIHBvc2l0aW9uOwotCQkJcG9zaXRpb24gPSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCX0gZWxzZSB7Ci0JCQlwb3NpdGlvbiArPSBuOwotCQl9Ci0JCXJldHVybiBza2lwcGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvSURvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2RvY3VtZW50L0lEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2QxY2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvSURvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLQotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCXZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2RvY3VtZW50L0lEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9kb2N1bWVudC9JRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3M2EwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2RvY3VtZW50L0lEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudExvYWRlciB7Ci0KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgaXMgbGlrZSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIGV4Y2VwdCBpdCBzaG91bGQgcG9wdWxhdGUKLQkgKiB0aGUgc3RydWN0dXJlZERvY3VtZW50IHdpdGggdGhlIGNvbnRlbnRzIG9mIElGaWxlLiBBbHNvLCB0aG9zZQotCSAqIFN0cnVjdHVyZWREb2N1bWVudHMgd2hpY2ggYXJlIHNlbnNpdGl2ZSB0byB0aGUgaW5wdXQgKHRoYXQgaXMsIHRoZQotCSAqIHBhcnNlciBvciBwYXJzZXIgaW5pdGlhbGl6YXRpb24gbXkgcmVxdWlyZSB0aGUgaW5wdXQpIHNob3VsZAotCSAqIGFkZGl0aW9uYWxseSBpbml0aWFsaXplIHRoZSBwYXJzZXIsIGV0Yy4sIGFwcHJvcHJpYXRlIHRvIHRoZSBpbnB1dC4KLQkgKiAKLQkgKiBBcyBhbHdheXMsIHRoZSBhcHByb3ByaWF0ZSBkZWNvZGluZyBzaG91bGQgYmUgdXNlZC4KLQkgKi8KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChJRmlsZSBpRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChSZWFkZXIgcmVhZGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBJRW5jb2RlZERvY3VtZW50LCB0aGF0IGhhcwotCSAqIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhcHByb3ByaWF0ZSBwYXJzZXIuIEZvciBtYW55IGxvYWRlcnMsIHRoZQotCSAqIChkZWZhdWx0KSBwYXJzZXIgdXNlZCBpcyBrbm93biBmb3IgYW55IGlucHV0LiBGb3Igb3RoZXJzLCB0aGUgY29ycmVjdAotCSAqIHBhcnNlciAoYW5kIGl0cyBpbml0aWFsaXphdGlvbikgaXMgbm9ybWFsbHkgZGVwZW5kZW50IG9uIHRoZSBjb250ZW50IG9mCi0JICogdGhlIGZpbGUuIFRoaXMgbm8tYXJndW1lbnQgbWV0aG9kIHNob3VsZCBhc3N1bWUgImVtcHR5IGlucHV0IiBhbmQgd291bGQKLQkgKiB0aGVyZWZvcmUgcmV0dXJuIHRoZSBkZWZhdWx0IHBhcnNlciBmb3IgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpc3RyZWFtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCUlFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaXN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQlJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCi0JSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpOwotCi0JLyoqCi0JICogQSB1dGlsaXR5IG1ldGhvZCwgYnV0IGRlcGVuZHMgb24gc3ViY2xhc3NlcyB0byBpbXBsaW1lbnQgdGhlIHByZWZlcnJlZAotCSAqIGVuZCBvZiBsaW5lIGZvciBhIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLiBOb3RlOiBzdWJjbGFzc2VzIHNob3VsZCBub3QKLQkgKiByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgKHRoZXJlJ3Mgbm8gcmVhc29uIHRvLCBldmVuIHRob3VnaCBpdHMgcGFydCBvZgotCSAqIGludGVyZmFjZSkuIFRoaXMgbWV0aG9kIG5vdCBvbmx5IGNvbnZlcnRzIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMsIGlmCi0JICogbmVlZGVkLCBidXQgc2V0cyB0aGUgY29ycmVjdCBlbmQtb2YtbGluZSBkZWxpbWl0ZXIgaW4KLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBlaXRoZXIgdGhlIG9yaWdpbmFsIHN0cmluZywKLQkgKiBpZiBubyBjb252ZXJzaW9uIGlzIG5lZWRlZCwgb3IgYSBuZXcgc3RyaW5nIHdpdGggZW5kLW9mLWxpbmVzCi0JICogY29udmVydGVkLgotCSAqLwotCVN0cmluZ0J1ZmZlciBoYW5kbGVMaW5lRGVsaW1pdGVyKFN0cmluZ0J1ZmZlciBvcmlnaW5hbFN0cmluZywgSUVuY29kZWREb2N1bWVudCB0aGVTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0Jdm9pZCByZWxvYWQoSUVuY29kZWREb2N1bWVudCBkb2N1bWVudCwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9kb2N1bWVudC9JRG9jdW1lbnRMb2FkZXJGb3JGaWxlQnVmZmVycy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9kb2N1bWVudC9JRG9jdW1lbnRMb2FkZXJGb3JGaWxlQnVmZmVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWZmNmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvSURvY3VtZW50TG9hZGVyRm9yRmlsZUJ1ZmZlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudExvYWRlckZvckZpbGVCdWZmZXJzIGV4dGVuZHMgSURvY3VtZW50TG9hZGVyIHsKLQotCUlFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KElGaWxlIGlGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCi0Jdm9pZCByZWxlYXNlKElGaWxlIGlGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9kb2N1bWVudC9JRW5jb2RlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2RvY3VtZW50L0lFbmNvZGVkRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkYTFiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2RvY3VtZW50L0lFbmNvZGVkRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci0KLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUVuY29kZWREb2N1bWVudCBleHRlbmRzIElEb2N1bWVudCB7Ci0KLQlFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQlTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpOwotCi0Jdm9pZCBzZXRFbmNvZGluZ01lbWVudG8oRW5jb2RpbmdNZW1lbnRvIGxvY2FsRW5jb2RpbmdNZW1lbnRvKTsKLQotCXZvaWQgc2V0TGluZURlbGltaXRlcihTdHJpbmcgcHJvYmFibGVMaW5lRGVsaW1pdGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9kb2N1bWVudC9JRXhlY3V0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvSUV4ZWN1dGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOGZlOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9kb2N1bWVudC9JRXhlY3V0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBJRXhlY3V0aW9uRGVsZWdhdGUgewotCi0Jdm9pZCBleGVjdXRlKFJ1bm5hYmxlIHJ1bm5hYmxlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvSUxvY2thYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2RvY3VtZW50L0lMb2NrYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTk1N2I1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvSUxvY2thYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci0KLS8qKgotICogCi0gKiBOb3QgQVBJOiBub3QgdG8gYmUgdXNlZCBvciBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiBUaGlzIGlzIGEgc3BlY2lhbAotICogcHVycG9zZSBpbnRlcmZhY2UgdG8gaGVscCBndWFyZCBzb21lIHRocmVhZGluZyBpc3N1ZXMgYmV0d2VlZW4gbW9kZWwgYW5kCi0gKiBkb2N1bWVudC4gV2lsbCBiZSBjaGFuZ2VkIHNvb24uCi0gKiAgCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJTG9ja2FibGUgewotCi0JSUxvY2sgZ2V0TG9ja09iamVjdCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzc1MTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBBdCB0aGUgbW9tZW50LCB0aGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCBhcyBhIGNvbnZlbmllbmNlIHRvIGhlbHAgc3dpdGNoCi0gKiBiZXR3ZWVuIHZhcmlvdXMgdHlwZXMgb2YgdGhyZWFkaW5nIG1vZGVscyBpbiB0aGUgZG9jdW1lbnQsIGFsbCBpbiBhIGNlbnRyYWwKLSAqIHBpZWNlIG9mIGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUklURV9TWU5DSFJPTklaRUQgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFQgPSBXUklURV9TWU5DSFJPTklaRUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TWU5DSFJPTklaRUQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKCkgewotCQkvLyBiZSBkZWZhdWx0LCB1c2UgdGhyZWFkIHNhZmUgb25lCi0JCXJldHVybiBnZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShERUZBVUxUKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoaW50IHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgVU5TWU5DSFJPTklaRUQgOgotCQkJCXJlc3VsdCA9IG5ldyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFdSSVRFX1NZTkNIUk9OSVpFRCA6Ci0JCQkJcmVzdWx0ID0gbmV3IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVxdWVzdCBkb2N1bWVudCB0eXBlIHdhcyBub3Qga25vd24iKTsKLQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGludCB0eXBlLCBSZWdpb25QYXJzZXIgcGFyc2VyKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIFVOU1lOQ0hST05JWkVEIDoKLQkJCQlyZXN1bHQgPSBuZXcgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQocGFyc2VyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV1JJVEVfU1lOQ0hST05JWkVEIDoKLQkJCQlyZXN1bHQgPSBuZXcgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudChwYXJzZXIpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZXF1ZXN0IGRvY3VtZW50IHR5cGUgd2FzIG5vdCBrbm93biIpOwotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQkvLyBiZSBkZWZhdWx0LCB1c2UgdGhyZWFkIHNhZmUgb25lCi0JCXJldHVybiBnZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShERUZBVUxULCBwYXJzZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZTVhNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5leGNlcHRpb25zLk1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbDsKLQotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50TG9hZGVyIHsKLQotCXByaXZhdGUgSVRleHRGaWxlQnVmZmVyTWFuYWdlciBmQnVmZmVyTWFuYWdlcjsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlciNjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgZm9ybSB3aXRoIHByb2dyZXNzIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoaUZpbGUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChJRmlsZSBpRmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlJUGF0aCBsb2NhdGlvblBhdGggPSBpRmlsZS5nZXRGdWxsUGF0aCgpOwotCi0JCWlmIChpRmlsZS5leGlzdHMoKSkgewotCi0JCQlnZXRCdWZmZXJNYW5hZ2VyKCkuY29ubmVjdChsb2NhdGlvblBhdGgsIG1vbml0b3IpOwotCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IGdldEJ1ZmZlck1hbmFnZXIoKS5nZXRUZXh0RmlsZUJ1ZmZlcihsb2NhdGlvblBhdGgpOwotCQkJZG9jdW1lbnQgPSBidWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWRvY3VtZW50ID0gZ2V0QnVmZmVyTWFuYWdlcigpLmNyZWF0ZUVtcHR5RG9jdW1lbnQobG9jYXRpb25QYXRoKTsKLQkJfQotCi0JCXJldHVybiAoSUVuY29kZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KElQYXRoIGxvY2F0aW9uUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlGaWxlIGZpbGUgPSBudWxsOwotCQlmaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0U3lzdGVtRmlsZUF0TG9jYXRpb24obG9jYXRpb25QYXRoKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCWdldEJ1ZmZlck1hbmFnZXIoKS5jb25uZWN0KGxvY2F0aW9uUGF0aCwgbW9uaXRvcik7Ci0JCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyTWFuYWdlcigpLmdldFRleHRGaWxlQnVmZmVyKGxvY2F0aW9uUGF0aCk7Ci0JCQlkb2N1bWVudCA9IGJ1ZmZlci5nZXREb2N1bWVudCgpOwotCQl9IGVsc2UgewotCQkJZG9jdW1lbnQgPSBnZXRCdWZmZXJNYW5hZ2VyKCkuY3JlYXRlRW1wdHlEb2N1bWVudChsb2NhdGlvblBhdGgpOwotCQl9Ci0JCXJldHVybiAoSUVuY29kZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGdldEJ1ZmZlck1hbmFnZXIoKSB7Ci0JCWlmIChmQnVmZmVyTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmQnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBmQnVmZmVyTWFuYWdlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDaGFyc2V0KFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IocmVhZGVyLCBudWxsLCBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVR9KTsKLQkJU3RyaW5nIGphdmFDaGFyc2V0ID0gKFN0cmluZykgZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJU3RyaW5nIGRldGVjdGVkQ2hhcnNldCA9IChTdHJpbmcpIGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKTsKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0OwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gZGV0ZWN0ZWRDaGFyc2V0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmVyeSBtZWNoYW5pY2FsIG1ldGhvZCwganVzdCB0byByZWFkIHRoZSBjaGFyYWN0ZXJzLCBvbmNlIHRoZSByZWFkZXIgaXMKLQkgKiBjb3JyZWN0bHkgY3JlYXRlZC4gQ2FuIHRocm93IE1hbEZvcm1lZElucHV0RXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdCdWZmZXIgcmVhZElucHV0U3RyZWFtKFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaW50IGZCbG9ja3NSZWFkID0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG51bVJlYWQgPSAwOwotCQl0cnkgewotCQkJY2hhciB0QnVmZltdID0gbmV3IGNoYXJbQ29kZWRJTy5NQVhfQlVGX1NJWkVdOwotCQkJd2hpbGUgKChudW1SZWFkID0gcmVhZGVyLnJlYWQodEJ1ZmYsIDAsIHRCdWZmLmxlbmd0aCkpICE9IC0xKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh0QnVmZiwgMCwgbnVtUmVhZCk7Ci0JCQkJZkJsb2Nrc1JlYWQrKzsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIGNoYXJzZXQgPSBnZXRDaGFyc2V0KHJlYWRlcik7Ci0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKGNoYXJzZXQsIGZCbG9ja3NSZWFkICogQ29kZWRJTy5NQVhfQlVGX1NJWkUgKyBlLmdldElucHV0TGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZShJRmlsZSBpRmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIGxvY2F0aW9uUGF0aCA9IGlGaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCWdldEJ1ZmZlck1hbmFnZXIoKS5kaXNjb25uZWN0KGxvY2F0aW9uUGF0aCwgbW9uaXRvcik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxvYWQoSUVuY29kZWREb2N1bWVudCBkb2N1bWVudCwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc2V0RG9jdW1lbnRDb250ZW50c0Zyb21SZWFkZXIoZG9jdW1lbnQsIHJlYWRlcik7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlTdHJpbmdCdWZmZXIgYWxsVGV4dCA9IHJlYWRJbnB1dFN0cmVhbShyZWFkZXIpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0KGFsbFRleHQudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9ldmVudHMvQWJvdXRUb0JlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ0MWFhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbmQgdG8gIlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UgbGlzdG5lcnMiLiBJdHMKLSAqIHBlcmZlY3RseSBhbmFsYWdvdXMgdG8gdGhlIGpmYWNlIERvY3VtZW50RXZlbnQgYW5kIGlzIHByb3ZpZGVkIHNpbXBseSB0bwotICogYWxsb3cgY2xpZW50cyB0byB0YWtlIGEgcHVyZSBtb2RlbCBwb2ludCBvZiB2aWV3LCBpbnN0ZWFkIG9mIHVzaW5nIHRoZQotICogZG9jdW1lbnQgZXZlbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBYm91dFRvQmVDaGFuZ2VFdmVudCBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHsKLQotCi0JcHVibGljIEFib3V0VG9CZUNoYW5nZUV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlLCBPYmplY3Qgb3JpZ2luYWxTb3VyY2UsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgb3JpZ2luYWxTb3VyY2UsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V2ZW50cy9JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL0lNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzA2ZTRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL0lNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzOwotCi0KLQotLyoqCi0gKiBDbGllbnRzIGNhbiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGFuZCByZWdpc3RlciB3aXRoIHRoZQotICogc3RydWN0dXJlZERvY3VtZW50IHVzaW5nIGFkZEFib3V0VG9CZUNoYW5nZWRMaXN0bmVyIHRvIGJlIG5vdGlmaWVkIHRoYXQgdGhlCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgYWJvdXQgdG8gYmUgY2hhbmdlZCwgYnV0IGhhc24ndCBiZWVuIGNoYW5nZWQgYXQgdGhlCi0gKiB0aW1lIHRoaXMgZXZlbnQgaXMgZmlyZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIHsKLQotCXZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKEFib3V0VG9CZUNoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL0lTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9ldmVudHMvSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZDlhNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9ldmVudHMvSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHM7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL05ld0RvY3VtZW50Q29udGVudEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MDBiODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogVGhlIE5ld01vZGVsRXZlbnQgaXMgZmlyZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc2V0cwotICogb3IgcmVwbGFjZXMgYWxsIG9mIGl0cyB0ZXh0LiBTbywgaW4gdGhlIGNhc2Ugb2YgcmVwbGFjZW1lbnQsIGl0cyBhIG5ldwotICogbW9kZWwsIGNvbmNlcHR1YWxseSBhbmQgcHJhY3RpY2FsbHksIGV2ZW4gdGhvdWdoIGl0IGlzIHRlY2huaWNhbGx5IHRoZSBzYW1lCi0gKiBpbnN0YW5jZSBvZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIE5ld0RvY3VtZW50Q29udGVudEV2ZW50IGV4dGVuZHMgTmV3RG9jdW1lbnRFdmVudCB7Ci0JcHVibGljIE5ld0RvY3VtZW50Q29udGVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlLCBPYmplY3Qgb3JpZ2luYWxTb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlLCBvcmlnaW5hbFNvdXJjZSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL05ld0RvY3VtZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL05ld0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkZmQwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V2ZW50cy9OZXdEb2N1bWVudEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBOZXdEb2N1bWVudEV2ZW50IGV4dGVuZHMgTmV3TW9kZWxFdmVudCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIG9yaWdpbmFsU291cmNlCi0JICovCi0JcHVibGljIE5ld0RvY3VtZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzb3VyY2UsIE9iamVjdCBvcmlnaW5hbFNvdXJjZSkgewotCQlzdXBlcihzb3VyY2UsIG9yaWdpbmFsU291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXNuJ3QgbWVhbiBxdWl0ZSB0aGUgc2FtZSB0aGluZyBhcyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudAotCSAqIEV2ZW50cyBpbiB0aGUgc3VwZXIgY2xhc3MuCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lc24ndCBtZWFuIHF1aXRlIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JICogRXZlbnRzIGluIHRoZSBzdXBlciBjbGFzcy4gSXQgYWx3YXlzIHdpbGwgcmV0dXJuIHplcm8uCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lc24ndCBtZWFuIHF1aXRlIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JICogRXZlbnRzIGluIHRoZSBzdXBlciBjbGFzcy4gQWxsIHRoZSB0ZXh0IG9mIHRoZSBuZXcgbW9kZWwgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcmlnaW5hbENoYW5nZXMoKSB7Ci0JCVN0cmluZyByZXN1bHRzID0gbnVsbDsKLQkJcmVzdWx0cyA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFRleHQoKTsKLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2Vzbid0IG1lYW4gcXVpdGUgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiBFdmVudHMgaW4gdGhlIHN1cGVyIGNsYXNzLiBTaW5jZSB3ZSBoYXZlLCBiYXNpY2FsbHkgbm8ga25vd2xlZGdlIG9mCi0JICogd2hhdCB3ZSBhcmUgcmVwbGFjaW5nIC4uLiBzbyB3ZSdsbCByZXR1cm4gemVyby4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3JpZ2luYWxMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lc24ndCBtZWFuIHF1aXRlIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JICogRXZlbnRzIGluIHRoZSBzdXBlciBjbGFzcy4gSXQgYWx3YXlzIHdpbGwgcmV0dXJuIHplcm8uCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yaWdpbmFsU3RhcnQoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHJlc3VsdHMgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRUZXh0KCk7Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL05ld01vZGVsRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL05ld01vZGVsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwODA0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V2ZW50cy9OZXdNb2RlbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gdXNlIE5ld0RvY3VtZW50RXZlbnQgb3IgTmV3RG9jdW1lbnRDb250ZW50RXZlbnQgKHRoaXMgY2xhc3MKLSAqICAgICAgICAgICAgIHdpbGwgc2ltcGx5IGJlIGRlbGV0ZWQgaW4gbmV4dCB2ZXJzaW9uLCBtb3ZpbmcgaXRzIHN1YmNsYXNzCi0gKiAgICAgICAgICAgICAidXAiIHRvIHRha2UgaXRzIHBsYWNlLgotICovCi1wdWJsaWMgY2xhc3MgTmV3TW9kZWxFdmVudCBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHsKLQlwdWJsaWMgTmV3TW9kZWxFdmVudChJU3RydWN0dXJlZERvY3VtZW50IHNvdXJjZSwgT2JqZWN0IG9yaWdpbmFsU291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgb3JpZ2luYWxTb3VyY2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL05vQ2hhbmdlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL05vQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiYWZlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V2ZW50cy9Ob0NoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIHRoaXMgZXZlbnQgaXMgdGhyb3duIGlmLCBhZnRlciBhbmFseXNpcywgaXQgaXMgZm91bmQgdGhlcmUgaXMgbm8gcmVhc29uIHRvCi0gKiBjaGFuZ2UgdGhlIHN0cnVjdHVyZWREb2N1bWVudC4gVGhpcyBtaWdodCBvY2N1ciwgZm9yIGV4YW1wbGUsIGlmIHNvbWVvbmUKLSAqIHBhc3RlcyBpbiB0aGUgZXhhY3Qgc2FtZSB0ZXh0IHRoYXQgdGhleSBhcmUgcmVwbGFjaW5nLCBvciBpZiBzb21lb25lIHRyaWVzCi0gKiB0byBjaGFuZ2UgYSByZWFkLW9ubHkgcmVnaW9uLgotICogCi0gKiBUaGlzIG1pZ2h0IGJlIGltcG9ydGFudCwgZm9yIGV4YW1wbGUsIGlmIHNvbWUgc3RhdGUgdmFyaWFibGVzIGFyZSBzZXQgb24gYW4KLSAqICJhYm91dCB0aGUgY2hhbmdlIiBldmVudC4gdGhlbiBpZiB0aGVyZSBpcyBubyBjaGFuZ2UgKGkuZS5ubyBvdGhlciBldmVudCBpcwotICogZmlyZWQpLCB0aG9zZSBzdGF0ZSB2YXJpYWJsZXMgY291bGQgcmVzZXQsIG9yIHdoYXRldmVyLCB1cG9uIHJlY2VpdmluZyB0aGlzCi0gKiBldmVudC4KLSAqLwotcHVibGljIGNsYXNzIE5vQ2hhbmdlRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0JLyoqCi0JICogTk9fQ09OVEVOVF9DSEFOR0UgbWVhbnMgdGhhdCBhIHNvbWUgdGV4dCB3YXMgcmVxdWVzdGVkIHRvIGJlIHJlcGxhY2VkCi0JICogd2l0aCBpZGVudGljYWwgdGV4dCwgc28gbm8gY2hhbmdlIGlzIGFjdHVhbGx5IGRvbmUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9fQ09OVEVOVF9DSEFOR0UgPSAyOwotCS8qKgotCSAqIE5PX0VWRU5UIGlzIHVzZWQgaW4gcmFyZSBlcnJvciBjb25kaXRpb25zLCB3aGVuLCBiYXNpY2FsbHksIGEgcmVxdWVzdAotCSAqIHRvIGNoYW5nZSB0aGUgZG9jdW1lbnQgaXMgbWFkZSBiZWZvcmUgdGhlIHByZXZpb3VzIHJlcXVlc3QgaGFzCi0JICogY29tcGxldGVkLiBUaGlzIGV2ZW50IHRvIHVzZWQgc28gYWJvdXRUb0NoYW5nZS9DaGFuZ2VkIGN5Y2xlcyBjYW4KLQkgKiBjb21wbGV0ZSBhcyByZXF1aXJlZCwgYnV0IHRoZSBkb2N1bWVudCBpcyBtb3N0IGxpa2VseSBub3QgbW9kaWZpZWQgYXMKLQkgKiBleHBlY3RlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19FVkVOVCA9IDg7Ci0JLyoqCi0JICogUkVBRF9PTkxZX1NUQVRFX0NIQU5HRSBtZWFucyB0aGF0IHRoZSAicmVhZCBvbmx5IiBzdGF0ZSBvZiB0aGUgdGV4dCB3YXMKLQkgKiBjaGFuZ2VkLCBub3QgdGhlIGNvbnRlbnQgaXRzZWxmLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFQURfT05MWV9TVEFURV9DSEFOR0UgPSA0OwotCi0JLyoqCi0JICogc2V0IHRvIG9uZSBvZiB0aGUgYWJvdmUgZGV0YWlsZWQgcmVhc29ucyBmb3Igd2h5IG5vIGNoYW5nZSB3YXMgZG9uZS4KLQkgKi8KLQlwdWJsaWMgaW50IHJlYXNvbiA9IDA7Ci0KLQkvKioKLQkgKiBOb0NoYW5nZUV2ZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuIFRoaXMgZXZlbnQgY2FuIG9jY3VyIGlmIHRoZXJlIHdhcyBhCi0JICogcmVxdWVzdCB0byBtb2RpZnkgYSBkb2N1bWVudCBvciBpdHMgcHJvcGVydGllcywgYnV0IHRoZXJlIGFzIG5vdCByZWFsbHkKLQkgKiBpcyBubyBjaGFuZ2UgdG8gYSBkb2N1bWVudCdzIGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiBAcGFyYW0gb3JpZ2luYWxTb3VyY2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBOb0NoYW5nZUV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlLCBPYmplY3Qgb3JpZ2luYWxTb3VyY2UsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgb3JpZ2luYWxTb3VyY2UsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V2ZW50cy9SZWdpb25DaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjYzZmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgdXNlZCB3aGVuIGEgbm9kZSBjaGFuZ2VzIGluIGEgbm9uLXN0cnVjdHVyYWwgd2F5LgotICogTm9uLXN0cnVjdHVyYWwsIHRoYXQgaXMsIGFzIGZhciBhcyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBpcyBjb25jZXJuZWQuCi0gKiBUaGUgd2hvbGUgbm9kZSwgYWxvbmcgd2l0aCB0aGUgbmV3IHRleHQgaXMgc2VudCwganVzdCBpbiBjYXNlIGEgbGlzdGVuZXIKLSAqIChlLmcuIGEgdHJlZSBtb2RlbCkgbWlnaHQgbWFrZSBpdHMgb3duIGRldGVybWluYXRpb24gb2Ygd2hhdCB0byBkbywgYW5kCi0gKiBuZWVkIHRoZSB3aG9sZSBub2RlIHRvIGFjdCBhcHByb3ByaWF0ZWx5LgotICogCi0gKiBOb3RlOiB1c2VycyBzaG91bGQgbm90IG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQgd2hldGhlciB0aGUgbm9kZSBpcyBsaXRlcmFsbHkKLSAqIHRoZSBzYW1lIGluc3RhbmNlIG9yIG5vdCAtLSBpdCBpcyBjdXJyZW50bHkgYSBkaWZmZXJlbnQgaW5zdGFuY2UgdGhhdCBpcwotICogaWRlbnRpY2FsIHRvIHRoZSBvbGQgZXhjZXB0IGZvciB0aGUgY2hhbmdlZCByZWdpb24sIGJ1dCB0aGlzIGltcGxlbWVudGF0aW9uCi0gKiBtYXkgY2hhbmdlLgotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uQ2hhbmdlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSVRleHRSZWdpb24gZkNoYW5nZWRSZWdpb247Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQlwdWJsaWMgUmVnaW9uQ2hhbmdlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlLCBPYmplY3Qgb3JpZ2luYWxTb3VyY2UsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgb3JpZ2luYWxTb3VyY2UsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCQlmQ2hhbmdlZFJlZ2lvbiA9IGNoYW5nZWRSZWdpb247Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZDaGFuZ2VkUmVnaW9uOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9ldmVudHMvUmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL1JlZ2lvbnNSZXBsYWNlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NTRiMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9ldmVudHMvUmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyB1c2VkIHdoZW4gYSBub2RlJ3MgcmVnaW9ucyBjaGFuZ2UsIGJ1dCB0aGUgbm9kZSBpdHNlbGYKLSAqIGRvZXNuJ3QuIFRoaXMgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhlIG5vZGUsIHRoYXQgbWF5IHN0aWxsCi0gKiBoYXZlIGNoYW5nZWQuIEFsc28sIGl0cyBhc3N1bWVkL3JlcXVpcmVkIHRoYXQgQUxMIHRoZSByZWdpb25zIGFyZSByZXBsYWNlZAotICogKGV2ZW4gdGhvc2UgdGhhdCBtYXkgbm90IGhhdmUgY2hhbmdlZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpb25zUmVwbGFjZWRFdmVudCBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHsKLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBmTmV3UmVnaW9uczsKLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBmT2xkUmVnaW9uczsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCXB1YmxpYyBSZWdpb25zUmVwbGFjZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IHNvdXJjZSwgT2JqZWN0IG9yaWdpbmFsU291cmNlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgb3JpZ2luYWxTb3VyY2UsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCQlmT2xkUmVnaW9ucyA9IG9sZFJlZ2lvbnM7Ci0JCWZOZXdSZWdpb25zID0gbmV3UmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldE5ld1JlZ2lvbnMoKSB7Ci0JCXJldHVybiBmTmV3UmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldE9sZFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBmT2xkUmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL1N0cnVjdHVyZWREb2N1bWVudEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmY2NDNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL1N0cnVjdHVyZWREb2N1bWVudEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBJU3RydWN0dXJlZERvY3VtZW50IGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBJU3RydWN0dXJlZERvY3VtZW50LCBhZnRlcgotICogdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYWN0cyBvbiBhIHJlcXVlc3QuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBleHRlbmRzIERvY3VtZW50RXZlbnQgewotCXByb3RlY3RlZCBTdHJpbmcgZkRlbGV0ZWRUZXh0OwotCXByb3RlY3RlZCBPYmplY3QgZk9yaWdpbmFsUmVxdWVzdGVyOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZlN0cnVjdHVyZWREb2N1bWVudDsKLQotCS8vcHVibGljIGludCBmT2Zmc2V0OwotCS8vcHVibGljIGludCBmTGVuZ3RoOwotCS8vcHVibGljIFN0cmluZyBmVGV4dDsKLQkvKioKLQkgKiBXZSBhc3N1bWUgdGhhdCBJU3RydWN0dXJlZERvY3VtZW50J3MgYXJlIEFMV0FZUyB0aGUgc291cmNlIG9mCi0JICogSVN0cnVjdHVyZWREb2N1bWVudCBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzb3VyY2UpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCBzb3VyY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlmRG9jdW1lbnQgPSBzb3VyY2U7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlLCBPYmplY3Qgb3JpZ2luYWxTb3VyY2UpIHsKLQkJdGhpcyhzb3VyY2UpOwotCQlmT3JpZ2luYWxSZXF1ZXN0ZXIgPSBvcmlnaW5hbFNvdXJjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzb3VyY2UsIE9iamVjdCBvcmlnaW5hbFNvdXJjZSwgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJdGhpcyhzb3VyY2UpOwotCQlmT3JpZ2luYWxSZXF1ZXN0ZXIgPSBvcmlnaW5hbFNvdXJjZTsKLQkJZlRleHQgPSBjaGFuZ2VzOwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmTGVuZ3RoID0gbGVuZ3RoVG9SZXBsYWNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlbGV0ZWRUZXh0KCkgewotCQlyZXR1cm4gZkRlbGV0ZWRUZXh0OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0KLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0KLQkJcmV0dXJuIGdldE9yaWdpbmFsU3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvYmplY3QgdGhhdCBvcmlnaW5hbGx5IGNhdXNlZCB0aGUgZXZlbnQgdG8KLQkgKiBmaXJlLiBUaGlzIGlzIHR5cGljYWxseSBub3QgdGhlIG9iamVjdCB0aGF0IGNyZWF0ZWQgdGhlIGV2ZW50ICh0aGUKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50KSBidXQgaW5zdGVhZCB0aGUgb2JqZWN0IG9iamVjdCB0aGF0IG1hZGUgYSByZXF1ZXN0Ci0JICogdG8gdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0T3JpZ2luYWxTb3VyY2UoKSB7Ci0JCXJldHVybiBmT3JpZ2luYWxSZXF1ZXN0ZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRPcmlnaW5hbFN0YXJ0KCkgewotCQlyZXR1cm4gZk9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvICdnZXRTb3VyY2UnIGV4Y2VwdCBpdCByZXR1cm5zIGFuIG9iamVjdCBvZgotCSAqIHRoZSBhcHByb3ByaWF0ZSB0eXBlIChuYW1lbHksIGEgSVN0cnVjdHVyZWREb2N1bWVudCwgaW5zdGVhZCBvZgotCSAqIE9iamVjdCkuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQkvLyBhIHNhZmUgY2FzZSwgc2luY2UgY29uc3RydWN0b3IgY2FuIG9ubHkgYmUgY2FsbGVkIHdpdGggYQotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0RlbGV0ZWRUZXh0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZFRleHQoamF2YS5sYW5nLlN0cmluZyBuZXdEZWxldGVkVGV4dCkgewotCQlmRGVsZXRlZFRleHQgPSBuZXdEZWxldGVkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRoZSBjbGFzc25hbWUsIGJ1dCBub3QgdGhlICdzb3VyY2U9JyAoYXMgc3VwZXIgZG9lcykuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJLy9yZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiW3NvdXJjZT0iICsgc291cmNlICsgIl0iOwotCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXZlbnRzL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTY5YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50czsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgdXNlZCB3aGVuIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBkZWxldGVkLCBvciByZXBsYWNlZAotICogd2l0aCBtb3JlIHRoYW4gb25lIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIG9yIHdoZW4gc2ltcGx5IG1vcmUgdGhhbiBvbmUKLSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY2hhbmdlcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzb3VyY2UsIE9iamVjdCBvcmlnaW5hbFNvdXJjZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJc3VwZXIoc291cmNlLCBvcmlnaW5hbFNvdXJjZSwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JCWZOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJcmV0dXJuIGZOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlyZXR1cm4gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9leGNlcHRpb25zL1Jlc291cmNlQWxyZWFkeUV4aXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9leGNlcHRpb25zL1Jlc291cmNlQWxyZWFkeUV4aXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDhiYjAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXhjZXB0aW9ucy9SZXNvdXJjZUFscmVhZHlFeGlzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUFscmVhZHlFeGlzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBbHJlYWR5RXhpc3RzKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFJlc291cmNlQWxyZWFkeUV4aXN0cyhTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V4Y2VwdGlvbnMvUmVzb3VyY2VJblVzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9leGNlcHRpb25zL1Jlc291cmNlSW5Vc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmMWM4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V4Y2VwdGlvbnMvUmVzb3VyY2VJblVzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9uczsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluVXNlIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUFscmVhZHlFeGlzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VJblVzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUFscmVhZHlFeGlzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUluVXNlKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXhjZXB0aW9ucy9Tb3VyY2VFZGl0aW5nRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V4Y2VwdGlvbnMvU291cmNlRWRpdGluZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE0NzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXhjZXB0aW9ucy9Tb3VyY2VFZGl0aW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci0KLS8qKgotICogVGhlIFNvdXJjZUVkaXRpbmdFeGNlcHRpb24gaXMgb2Z0ZW4gdGhyb3duIGJ5IFNvdXJjZSBFZGl0b3IgbWV0aG9kcyBpbgotICogb3JkZXIgdG8gaGF2ZSBhIHByZWRpY3RhYmxlLCB1bmlmb3JtIGludGVyZmFjZSB0byB0aGUgU291cmNlIEVkaXRpbmcgQVBJcy4KLSAqIElmIHRoZSBPcmlnaW5hbEV4Y2VwdGlvbiBpcyBub3QgbnVsbCwgdGhlbiBpdCBtdXN0IGJlIGV4YW1pbmVkIHRvIGRldGVybWluZQotICogdGhlIHRydWUgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUVkaXRpbmdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIFRocm93YWJsZSBvcmlnaW5hbEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBTb3VyY2VFZGl0aW5nRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTb3VyY2VFZGl0aW5nRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgY29uc3RydWN0b3IgaXMgdXNlZCB0byB3cmFwcGVyIGFub3RoZXIgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBTb3VyY2VFZGl0aW5nRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCXN1cGVyKCk7Ci0JCW9yaWdpbmFsRXhjZXB0aW9uID0gdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gd3JhcHBlciBhbm90aGVyIGV4Y2VwdGlvbiwgYnV0Ci0JICogc3RpbGwgcHJvdmlkZSBhIG5ldyBkZXNjcmlwdGl2ZSBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBTb3VyY2VFZGl0aW5nRXhjZXB0aW9uKFRocm93YWJsZSB0LCBTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQkJb3JpZ2luYWxFeGNlcHRpb24gPSB0OwotCX0KLQotCS8qKgotCSAqIFRoZSBtZXNzYWdlIGRlcGVuZHMgb24gaWYgdGhpcyBpcyBhIGNhc2UgdGhhdCBoYXMgYW4gZW1iZWRkZWQKLQkgKiBleGNlcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG9yaWdpbmFsRXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IG9yaWdpbmFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBUaHJvd2FibGUgZ2V0T3JpZ2luYWxFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBvcmlnaW5hbEV4Y2VwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkvLyB3ZSBkb24ndCBwdXQgc3VwZXIudG9TdHJpbmcgdG8gImhpZGUiIHRoYXQgaXQgd2FzIGEKLQkJLy8gc291cmNlRWRpdGluZyBleGNlcHRpb24KLQkJU3RyaW5nIHMgPSBudWxsOyAvL3N1cGVyLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBvcmlnaW5hbEVycm9yID0gU1NFQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJU9yaWdpbmFsX0Vycm9yX19VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJPcmlnaW5hbCBFcnJvcjoiCi0KLQkJaWYgKG9yaWdpbmFsRXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCXMgPSBvcmlnaW5hbEVycm9yICsgIiAiICsgb3JpZ2luYWxFeGNlcHRpb24udG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJCAKLQkJfQotCQlyZXR1cm4gczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2V4Y2VwdGlvbnMvU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXhjZXB0aW9ucy9Tb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjA5YTYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZXhjZXB0aW9ucy9Tb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotCi0vKioKLSAqIFRoZSBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbiBpcyBvZnRlbiB0aHJvd24gYnkgU291cmNlIEVkaXRvciBtZXRob2RzCi0gKiB3aGVuIGEgc2VydmljZSB3ZSB1c2UgdGhyb3dzIGEgY2hlY2tlZCBleGNlcHRpb24sIGJ1dCB3ZSB3YW50IHRvIGNvbnZlcnQKLSAqIGFuZCB0cmVhdCBhcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLiAoU3VjaCBhcyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiBpcyBhIGNvbW1vbgotICogZXhhbXBsZSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIFRocm93YWJsZSBvcmlnaW5hbEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIHdyYXBwZXIgYW5vdGhlciBleGNlcHRpb24uCi0JICovCi0JcHVibGljIFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCXN1cGVyKCk7Ci0JCW9yaWdpbmFsRXhjZXB0aW9uID0gdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gd3JhcHBlciBhbm90aGVyIGV4Y2VwdGlvbiwgYnV0Ci0JICogc3RpbGwgcHJvdmlkZSBhIG5ldyBkZXNjcmlwdGl2ZSBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihUaHJvd2FibGUgdCwgU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JCW9yaWdpbmFsRXhjZXB0aW9uID0gdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBzdXBlci5nZXRNZXNzYWdlKCk7Ci0JCWlmICgocmVzdWx0ICE9IG51bGwpICYmICghcmVzdWx0LmVuZHNXaXRoKCIuIikpKSAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSByZXN1bHQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9yaWdpbmFsRXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBlbWJlZGRlZE1lc3NhZ2UgPSBvcmlnaW5hbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCk7Ci0JCQllbWJlZGRlZE1lc3NhZ2UgPSBvcmlnaW5hbEV4Y2VwdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6ICIgKyBvcmlnaW5hbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIG5vdCBhbGwgZXhjZXB0aW9ucyBoYXZlIG1lc3NhZ2VzIChlLmcuIG1hbnkKLQkJCS8vIE51bGxQb2ludGVyRXhjZXB0aW9uKQotCQkJU3RyaW5nIG9yaWdpbmFsRXJyb3IgPSBTU0VDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlT3JpZ2luYWxfRXJyb3JfX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIk9yaWdpbmFsIEVycm9yOiIKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVtYmVkZGVkTWVzc2FnZSAhPSBudWxsKQotCQkJCXJlc3VsdCA9IHJlc3VsdCArICIgICIgKyBvcmlnaW5hbEVycm9yICsgIiAiICsgZW1iZWRkZWRNZXNzYWdlOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcmVzdWx0ID0gcmVzdWx0ICsgIiAgIiArIG9yaWdpbmFsRXJyb3IgKyAiICIgKyBvcmlnaW5hbEV4Y2VwdGlvbi50b1N0cmluZygpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgVGhyb3dhYmxlIGdldE9yaWdpbmFsRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gb3JpZ2luYWxFeGNlcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJLy8gd2UgZG9uJ3QgcHV0IHN1cGVyLnRvU3RyaW5nIG9yIGdldENsYXNzIHRvICJoaWRlIiB0aGF0IGl0IHdhcyBhCi0JCS8vIFNvdXJjZUVkaXRpbmcgZXhjZXB0aW9uIChvdGhlcndpc2UsIGZvY3VzIGdvZXMgb24gdGhhdCwKLQkJLy8gaW5zdGVhZCBvZiBvcmlnaW5hbCBleGNlcHRpb24uCi0JCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZSgpOwotCQkvLyBtZXNzYWdlIHNob3VsZCBuZXZlciBiZSBudWxsIC4uLiBidXQganVzdCBpbiBjYXNlCi0JCXJldHVybiAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiBzdXBlci50b1N0cmluZygpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9maWxlYnVmZmVycy9CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZmlsZWJ1ZmZlcnMvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGNhYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9maWxlYnVmZmVycy9CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZpbGVidWZmZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5OdWxsU3RydWN0dXJlZERvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLQotCi1wdWJsaWMgY2xhc3MgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IGltcGxlbWVudHMgSURvY3VtZW50RmFjdG9yeSwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCi0JLy8gVGhlIGNvbnRlbnQgdHlwZSBJRCB1c2VkIHRvIGRlY2xhcmUgdGhpcyBmYWN0b3J5OyBpdCBpcyB1c2VkIHRvIGZpbmQKLQkvLyB0aGUgY29ycmVzcG9uZGluZyBNb2RlbEhhbmRsZXIKLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVJZGVudGlmaWVyID0gbnVsbDsKLQotCXB1YmxpYyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQl3aGlsZSAoaGFuZGxlciA9PSBudWxsICYmICFJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQuZXF1YWxzKGNvbnRlbnRUeXBlLmdldElkKCkpKSB7Ci0JCQloYW5kbGVyID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCWNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJfQotCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWRvY3VtZW50ID0gbmV3IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCi0JCWlmIChkb2N1bWVudC5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgPT0gbnVsbCkgewotCQkJSURvY3VtZW50UGFydGl0aW9uZXIgZGVmYXVsdFBhcnRpdGlvbmVyID0gbmV3IE51bGxTdHJ1Y3R1cmVkRG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCQkJZG9jdW1lbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihkZWZhdWx0UGFydGl0aW9uZXIpOwotCQkJZGVmYXVsdFBhcnRpdGlvbmVyLmNvbm5lY3QoZG9jdW1lbnQpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIGZDb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZDb250ZW50VHlwZUlkZW50aWZpZXIgPSBjb25maWcuZ2V0QXR0cmlidXRlKCJjb250ZW50VHlwZUlkIik7Ci0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nICYmIGRhdGEudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlmQ29udGVudFR5cGVJZGVudGlmaWVyID0gKFN0cmluZykgZGF0YTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZm9ybWF0L0Fic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9mb3JtYXQvQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYzk5MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9mb3JtYXQvQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgewotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZkZvcm1hdENvbnRyYWludHMgPSBudWxsOwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcyA9IHRydWU7IC8vIHNwZWNpYWwgZmxhZyBmb3IgSlVuaXQKLQotCXByb3RlY3RlZCB2b2lkIGVuc3VyZUNsb3NlZChPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCi0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQkJdHJ5IHsKLQkJCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOyAvLyBob3BlbGVzcwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb3JtYXRDb250ZW50KFN0cmluZyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlyZXR1cm4gaW5wdXQ7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciByZWFkLiBXaWxsIHJldHVybiBmb3JtYXR0ZWQKLQkJCS8vIHN0cmluZyBhbmQgTk9UIHNhdmUgbW9kZWwuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArICIuIiArIGdldEZpbGVFeHRlbnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9IGZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb3JtYXRDb250ZW50KFN0cmluZyBpbnB1dCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybiBpbnB1dDsKLQotCQlpZiAoc3RhcnQgPj0gMCAmJiBsZW5ndGggPj0gMCAmJiBzdGFydCArIGxlbmd0aCA8PSBpbnB1dC5sZW5ndGgoKSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgcmVhZC4gV2lsbCByZXR1cm4gZm9ybWF0dGVkCi0JCQkJLy8gc3RyaW5nIGFuZCBOT1Qgc2F2ZSBtb2RlbC4KLQkJCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBpZCA9IGlucHV0U3RyZWFtLnRvU3RyaW5nKCkgKyAiLiIgKyBnZXRGaWxlRXh0ZW5zaW9uKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkJLy8gZm9ybWF0Ci0JCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJCS8vIHJldHVybiBvdXRwdXQKLQkJCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQllbnN1cmVDbG9zZWQobnVsbCwgaW5wdXRTdHJlYW0pOwotCQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvL091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmIG1vZGVsCi0JCQkvLyBjaGFuZ2VkLgotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0KLQkJCS8vIGZvcm1hdAotCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQotCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChzdGFydCA+PSAwICYmIGxlbmd0aCA+PSAwICYmIHN0YXJ0ICsgbGVuZ3RoIDw9IGRvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQkvL091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmCi0JCQkJLy8gbW9kZWwgY2hhbmdlZC4KLQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJCS8vIGZvcm1hdAotCQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy9PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCi0JCQlzdHJ1Y3R1cmVkTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCS8vIGZvcm1hdAotCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQotCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlzdHJ1Y3R1cmVkTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGUoSUZpbGUgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy9PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGVOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCS8vT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL2Vuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkvL091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmIG1vZGVsCi0JCQkvLyBjaGFuZ2VkLgotCQkJaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZpbGVOYW1lLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGZvcm1hdAotCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJaWYgKHN0YXJ0ID09IDAgJiYgbGVuZ3RoID09IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSkKLQkJCQlzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChzdHJ1Y3R1cmVkTW9kZWwsIGZhbHNlKTsKLQkJCWVsc2UKLQkJCQlzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChzdHJ1Y3R1cmVkTW9kZWwsIHRydWUpOwotCi0JCQlpZiAoc3RhcnQgPj0gMCAmJiBsZW5ndGggPj0gMCAmJiBzdGFydCArIGxlbmd0aCA8PSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlWZWN0b3IgYWN0aXZlTm9kZXMgPSBnZXRBY3RpdmVOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCWlmIChhY3RpdmVOb2Rlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCU5vZGUgZmlyc3ROb2RlID0gKE5vZGUpIGFjdGl2ZU5vZGVzLmZpcnN0RWxlbWVudCgpOwotCQkJCQlOb2RlIGxhc3ROb2RlID0gKE5vZGUpIGFjdGl2ZU5vZGVzLmxhc3RFbGVtZW50KCk7Ci0KLQkJCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQkJCU5vZGUgZWFjaE5vZGUgPSBmaXJzdE5vZGU7Ci0JCQkJCU5vZGUgbmV4dE5vZGUgPSBudWxsOwotCQkJCQkvLyBUT0RPOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBjYWxsIHNvbWV0aGluZyBsaWtlCi0JCQkJCS8vIHNlcXVlbnRpYWxSZXdyaXRlLCBidXQKLQkJCQkJLy8gZG9lc24ndCB3b3JrIGZvcgotCQkJCQkvLyBvdXIgY2FzZSwgc2luY2Ugd2UgZG8gImdldHMiIGR1cmluZyByZXBhcnNpbmcsIHNvIG1ha2VzCi0JCQkJCS8vIHNlcXVlbnRpYWwgcmV3cml0ZQotCQkJCQkvLyBzdG9yZSBhY3R1YWxseQotCQkJCQkvLyBsZXNzIGVmZmljaWVudCB0aGFuIGdhcCBzdG9yZS4gU29tZWRheSB3ZSBuZWVkIG91ciBvd24KLQkJCQkJLy8gZ2FwIHN0b3JlLCB0aGF0Ci0JCQkJCS8vIGhhbmRsZXMKLQkJCQkJLy8gc3RydWN0dXJlZCB0ZXh0IG1vcmUgZWZmaWNpZW50bHkuIEkgdGhvdWdodCBJJ2QgbGVhdmUKLQkJCQkJLy8gdGhpcyBjb21tZW50ZWQgb3V0Ci0JCQkJCS8vIGNvZGUgaGVyZQotCQkJCQkvLyBhcyBhIHJlbWluZGVyLgotCQkJCQkvLwkJCQkJdHJ5IHsKLQkJCQkJLy8JCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc3RhcnRTZXF1ZW50aWFsUmV3cml0ZShmYWxzZSk7Ci0JCQkJCXdoaWxlICghZG9uZSkgewotCQkJCQkJLy8gdXBkYXRlICJkb25lIgotCQkJCQkJZG9uZSA9IChlYWNoTm9kZSA9PSBsYXN0Tm9kZSk7Ci0KLQkJCQkJCS8vIGdldCBuZXh0IHNpYmxpbmcgYmVmb3JlIGZvcm1hdCBiZWNhdXNlIGVhY2hOb2RlCi0JCQkJCQkvLyBtYXkKLQkJCQkJCS8vIGJlIGRlbGV0ZWQsCi0JCQkJCQkvLyBmb3IgZXhhbXBsZSB3aGVuIGl0J3MgYW4gZW1wdHkgdGV4dCBub2RlCi0JCQkJCQluZXh0Tm9kZSA9IGVhY2hOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQkJCS8vIGZvcm1hdCBlYWNoIG5vZGUKLQkJCQkJCWZvcm1hdE5vZGUoZWFjaE5vZGUpOwotCi0JCQkJCQkvLyB1cGRhdGUgZWFjaCBub2RlCi0JCQkJCQlpZiAobmV4dE5vZGUgIT0gbnVsbCAmJiBuZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkKLQkJCQkJCQkvLyBuZXh0Tm9kZSBpcyBkZWxldGVkIGR1cmluZyBmb3JtYXQKLQkJCQkJCQllYWNoTm9kZSA9IGVhY2hOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZWFjaE5vZGUgPSBuZXh0Tm9kZTsKLQotCQkJCQkJLy8gVGhpcyBzaG91bGQgbm90IGJlIG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZQotCQkJCQkJLy8gc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB3aXRoIGVhY2hOb2RlLgotCQkJCQkJLy8gV2UgZG9uJ3Qgd2FudCBhbiBpbmZpbml0ZSBsb29wIGhlcmUuCi0JCQkJCQlpZiAoZWFjaE5vZGUgPT0gbnVsbCkKLQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQkvLwkJCQkJfQotCQkJCQkvLwkJCQkJZmluYWxseSB7Ci0JCQkJCS8vCQkJCQkJc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnN0b3BTZXF1ZW50aWFsUmV3cml0ZSgpOwotCQkJCQkvLwkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJCS8vIGZvcm1hdCB0aGUgb3duZXIgbm9kZSBpZiBpdCdzIGFuIGF0dHJpYnV0ZSBub2RlCi0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJbmV3Tm9kZSA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0KLQkJCS8vIHJlZnJlc2ggZm9ybWF0IHByZWZlcmVuY2VzIGJlZm9yZSBnZXR0aW5nIGZvcm1hdHRlcgotCQkJaWYgKHJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcykKLQkJCQlyZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMoKTsKLQotCQkJLy8gZ2V0IGZvcm1hdHRlciBhbmQgZm9ybWF0IGNvbnRyYWludHMKLQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IGdldEZvcm1hdHRlcihuZXdOb2RlKTsKLQkJCS8vIFRPRE9fZnV0dXJlOiBhZGRlZCBhc3NlcnQgdG8gcmVwbGFjZSAicmVkdW5kYW50IG51bGwgY2hlY2siLgotCQkJLy8gaWYgZm9ybWF0dGVyIGlzIGV2ZXIgbnVsbCwgd2Ugc2hvdWxkIHByb3ZpZGUgc29tZQotCQkJLy8gZGVmYXVsdCBmb3JtYXR0ZXIgdG8gc2VydmUgYXMgcGxhY2UgaG9sZGVyLgotCQkJQXNzZXJ0LmlzTm90TnVsbChmb3JtYXR0ZXIsICJmb3JtYXR0ZXIgd2FzIG51bGwgZm9yIGEgbm9kZSwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCUlTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzID0gZm9ybWF0dGVyLmdldEZvcm1hdENvbnRyYWludHMoKTsKLQkJCWZvcm1hdENvbnRyYWludHMuc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQodHJ1ZSk7Ci0JCQkvLyBmb3JtYXQgZWFjaCBub2RlCi0JCQlmb3JtYXR0ZXIuZm9ybWF0KG5ld05vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFZlY3RvciBnZXRBY3RpdmVOb2RlcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0Tm9kZU9mZnNldCwgaW50IGxlbmd0aCkgewotCQlWZWN0b3IgYWN0aXZlTm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlOb2RlIHN0YXJ0Tm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQpOwotCQkJLy8gc2VlIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00NzExCi0JCQkvLwotCQkJLy8gV2UgaGF2ZSB0byB3YXRjaCBmb3Igc2VsZWN0aW9uIGJvdW5kYXJ5IGNvbmRpdGlvbnMuIFVzZSB0aGlzIGFzCi0JCQkvLyBhbiBleGFtcGxlOiA8YT50ZXh0PC9hPjxiPnRleHQ8L2I+LAotCQkJLy8gSWYgdGhlIHdob2xlIDxhPiBub2RlIGlzIHNlbGVjdGVkLCBsaWtlOgotCQkJLy8gfDxhPnRleHQ8L2E+fDxiPnRleHQ8L2I+LCB3ZSBuZWVkIHRvIHN1YnN0cmFjdCB0aGUgbGVuZ3RoIGJ5IDEKLQkJCS8vIHRvIGZpbmQKLQkJCS8vIHRoZSBub2RlIGF0IHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbjoKLQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCAtIDEpLAotCQkJLy8gb3IgZWxzZQotCQkJLy8gd2UnZCBmaW5kIHRoZSBuZXh0IGFkamFjZW50IG5vZGUuCi0JCQkvLwotCQkJLy8gSG93ZXZlciwgd2hlbiB0aGUgc2VsZWN0aW9uIGxlbmd0aCBpcyAwIChtZWFuaW5nIG5vIHRleHQgaXMKLQkJCS8vIHNlbGVjdGVkKSwgdGhlIGN1cnNvciBpcyBhdCB0aGUgYmVnaW5uaW5nCi0JCQkvLyBvZiB0aGUgbm9kZSB3ZSB3YW50IHRvIGZvcm1hdDogfDxhPnRleHQ8L2E+PGI+dGV4dDwvYj4sIHRoZQotCQkJLy8gbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gaXM6Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGgpLgotCQkJaW50IGVuZE5vZGVPZmZzZXQgPSBsZW5ndGggPiAwID8gc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoIC0gMSA6IHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aDsKLQkJCU5vZGUgZW5kTm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihlbmROb2RlT2Zmc2V0KTsKLQotCQkJLy8gbWFrZSBzdXJlIGl0J3MgYW4gbm9uLWVtcHR5IGRvY3VtZW50Ci0JCQlpZiAoc3RhcnROb2RlICE9IG51bGwpIHsKLQkJCQl3aGlsZSAoaXNTaWJsaW5nT2Yoc3RhcnROb2RlLCBlbmROb2RlKSA9PSBmYWxzZSkgewotCQkJCQlpZiAoZW5kTm9kZSAhPSBudWxsKQotCQkJCQkJZW5kTm9kZSA9IGVuZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAoZW5kTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlzdGFydE5vZGUgPSBzdGFydE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJLy8gc2VlCi0JCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDcxMQotCQkJCQkJLy8gYW5kIG5vdGVzIGFib3ZlCi0JCQkJCQllbmROb2RlT2Zmc2V0ID0gbGVuZ3RoID4gMCA/IHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCAtIDEgOiBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGg7Ci0JCQkJCQllbmROb2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGVuZE5vZGVPZmZzZXQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJd2hpbGUgKHN0YXJ0Tm9kZSAhPSBlbmROb2RlKSB7Ci0JCQkJCWFjdGl2ZU5vZGVzLmFkZEVsZW1lbnQoc3RhcnROb2RlKTsKLQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCkKLQkJCQkJYWN0aXZlTm9kZXMuYWRkRWxlbWVudChzdGFydE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2ZU5vZGVzOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBnZXRGb3JtYXRDb250cmFpbnRzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIDI2MjEzNSAtIE5QRSBkdXJpbmcgZm9ybWF0IG9mIGVtcHR5IGRvY3VtZW50Ci0JCWlmIChmRm9ybWF0Q29udHJhaW50cyA9PSBudWxsICYmIHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oMCk7Ci0KLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBnZXRGb3JtYXR0ZXIobm9kZSk7Ci0JCQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQkJCWZGb3JtYXRDb250cmFpbnRzID0gZm9ybWF0dGVyLmdldEZvcm1hdENvbnRyYWludHMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaWJsaW5nT2YoTm9kZSBub2RlLCBOb2RlIGVuZE5vZGUpIHsKLQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlOb2RlIHNpYmxpbmdOb2RlID0gbm9kZTsKLQkJCXdoaWxlIChzaWJsaW5nTm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNpYmxpbmdOb2RlID09IGVuZE5vZGUpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJc2libGluZ05vZGUgPSBzaWJsaW5nTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgYm9vbGVhbiBmb3JtYXRXaXRoU2libGluZ0luZGVudCkgewotCQkvLyAyNjIxMzUgLSBOUEUgZHVyaW5nIGZvcm1hdCBvZiBlbXB0eSBkb2N1bWVudAotCQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cyA9IGdldEZvcm1hdENvbnRyYWludHMoc3RydWN0dXJlZE1vZGVsKTsKLQotCQlpZiAoZm9ybWF0Q29udHJhaW50cyAhPSBudWxsKQotCQkJZm9ybWF0Q29udHJhaW50cy5zZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChmb3JtYXRXaXRoU2libGluZ0luZGVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2Zvcm1hdC9JU3RydWN0dXJlZENvbnRlbnRGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZm9ybWF0L0lTdHJ1Y3R1cmVkQ29udGVudEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjliNDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZm9ybWF0L0lTdHJ1Y3R1cmVkQ29udGVudEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRDb250ZW50Rm9ybWF0dGVyIHsKLQl2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiY2JkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdDsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgewotCWJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQlTdHJpbmcgZ2V0Q3VycmVudEluZGVudCgpOwotCi0JYm9vbGVhbiBnZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpOwotCi0Jdm9pZCBzZXRDbGVhckFsbEJsYW5rTGluZXMoYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMpOwotCi0Jdm9pZCBzZXRDdXJyZW50SW5kZW50KFN0cmluZyBjdXJyZW50SW5kZW50KTsKLQotCXZvaWQgc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoYm9vbGVhbiBmb3JtYXRXaXRoU2libGluZ0luZGVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMjljYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgewotCWJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQlTdHJpbmcgZ2V0SW5kZW50KCk7Ci0KLQlpbnQgZ2V0TGluZVdpZHRoKCk7Ci0KLQl2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyk7Ci0KLQl2b2lkIHNldEluZGVudChTdHJpbmcgaW5kZW50KTsKLQotCXZvaWQgc2V0TGluZVdpZHRoKGludCBsaW5lV2lkdGgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNzlhNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIHsKLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhbiBpbnB1dCBzdHJpbmcgYXMgaW5wdXQsCi0JICogY3JlYXRlcyBhbiBJbnB1dFN0cmVhbSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbAotCSAqIG9mIHRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkLCBmb3JtYXRzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZXR1cm5zCi0JICogdGhlIGZvcm1hdHRlZCBpbnB1dCBzdHJpbmcuCi0JICovCi0JU3RyaW5nIGZvcm1hdENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGFuIGlucHV0IHN0cmluZyBhcyBpbnB1dCwKLQkgKiBjcmVhdGVzIGFuIElucHV0U3RyZWFtIGZyb20gdGhlIGlucHV0IHN0cmluZywgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsCi0JICogb2YgdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQsIGZvcm1hdHMgdGhlIG1vZGVsIHdpdGhpbiBzdGFydCBhbmQKLQkgKiBsZW5ndGgsIHRoZW4gcmV0dXJucyB0aGUgZm9ybWF0dGVkIGlucHV0IHN0cmluZy4KLQkgKi8KLQlTdHJpbmcgZm9ybWF0Q29udGVudChTdHJpbmcgY29udGVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhbiBJRG9jdW1lbnQgYXMgaW5wdXQsIGNyZWF0ZXMgYQotCSAqIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUgY2FsY3VsYXRlZCB1c2luZyB0aGUgSURvY3VtZW50J3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgZm9ybWF0cyB0aGUgd2hvbGUgbW9kZWwsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLgotCSAqLwotCXZvaWQgZm9ybWF0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhbiBJRG9jdW1lbnQgYXMgaW5wdXQsIGNyZWF0ZXMgYQotCSAqIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUgY2FsY3VsYXRlZCB1c2luZyB0aGUgSURvY3VtZW50J3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgZm9ybWF0cyB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMgdGhlCi0JICogbW9kZWwuCi0JICovCi0Jdm9pZCBmb3JtYXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYW4gSUZpbGUgYXMgaW5wdXQsIGNyZWF0ZXMgYQotCSAqIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUgY2FsY3VsYXRlZCB1c2luZyB0aGUgSUZpbGUncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBmb3JtYXRzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuCi0JICovCi0Jdm9pZCBmb3JtYXRGaWxlKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGFuIElGaWxlIGFzIGlucHV0LCBjcmVhdGVzIGEKLQkgKiB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElGaWxlJ3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgZm9ybWF0cyB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMgdGhlCi0JICogbW9kZWwuCi0JICovCi0Jdm9pZCBmb3JtYXRGaWxlKElGaWxlIGZpbGUsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYSBmaWxlIG5hbWUgYXMgaW5wdXQsY3JlYXRlcyBhbgotCSAqIElucHV0U3RyZWFtIGZyb20gdGhlIGZpbGUsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUKLQkgKiBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmaWxlIG5hbWUncyBmaWxlIGV4dGVuc2lvbiwgZm9ybWF0cyB0aGUgd2hvbGUKLQkgKiBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuCi0JICovCi0Jdm9pZCBmb3JtYXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGEgZmlsZSBuYW1lIGFzIGlucHV0LGNyZWF0ZXMgYW4KLQkgKiBJbnB1dFN0cmVhbSBmcm9tIHRoZSBmaWxlLCBjcmVhdGUgYSB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlCi0JICogY2FsY3VsYXRlZCB1c2luZyB0aGUgZmlsZSBuYW1lJ3MgZmlsZSBleHRlbnNpb24sIGZvcm1hdHMgdGhlIG1vZGVsCi0JICogd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLgotCSAqLwotCXZvaWQgZm9ybWF0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGEgbW9kZWwgYXMgaW5wdXQsIGFuZCBmb3JtYXRzCi0JICogdGhlIHdob2xlIG1vZGVsLgotCSAqLwotCXZvaWQgZm9ybWF0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYSBtb2RlbCBhcyBpbnB1dCwgYW5kIGZvcm1hdHMKLQkgKiB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGguCi0JICovCi0Jdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGEgbm9kZSBhcyBpbnB1dCwgYW5kIGZvcm1hdHMgdGhlCi0JICogbm9kZSBhbmQgYWxsIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGZvcm1hdE5vZGUoTm9kZSBub2RlKTsKLQotCXZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljYjk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZEZvcm1hdHRlciB7Ci0Jdm9pZCBmb3JtYXQoTm9kZSBub2RlKTsKLQotCXZvaWQgZm9ybWF0KE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpOwotCi0JSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoKTsKLQotCUlTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKTsKLQotCXZvaWQgc2V0Rm9ybWF0UHJlZmVyZW5jZXMoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcyk7Ci0KLQl2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2Y5OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIHsKLQlwcm90ZWN0ZWQgaW50IGZBdmFpbGFibGVMaW5lV2lkdGg7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZDdXJyZW50SW5kZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQgPSBmYWxzZTsKLQotCXB1YmxpYyBib29sZWFuIGdldENsZWFyQWxsQmxhbmtMaW5lcygpIHsKLQkJcmV0dXJuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50SW5kZW50KCkgewotCQlyZXR1cm4gZkN1cnJlbnRJbmRlbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSB7Ci0JCXJldHVybiBmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzKSB7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMgPSBjbGVhckFsbEJsYW5rTGluZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudEluZGVudChTdHJpbmcgY3VycmVudEluZGVudCkgewotCQlmQ3VycmVudEluZGVudCA9IGN1cnJlbnRJbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoYm9vbGVhbiBmb3JtYXRXaXRoU2libGluZ0luZGVudCkgewotCQlmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQgPSBmb3JtYXRXaXRoU2libGluZ0luZGVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDFkMTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0OwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyB7Ci0JcHJpdmF0ZSBib29sZWFuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkluZGVudDsKLQlwcml2YXRlIGludCBmTGluZVdpZHRoOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkgewotCQlyZXR1cm4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZGVudCgpIHsKLQkJcmV0dXJuIGZJbmRlbnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMaW5lV2lkdGgoKSB7Ci0JCXJldHVybiBmTGluZVdpZHRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcykgewotCQlmQ2xlYXJBbGxCbGFua0xpbmVzID0gY2xlYXJBbGxCbGFua0xpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZGVudChTdHJpbmcgaW5kZW50KSB7Ci0JCWZJbmRlbnQgPSBpbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZVdpZHRoKGludCBsaW5lV2lkdGgpIHsKLQkJZkxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0ZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmI1ZGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFic3RyYWN0U3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxMb2FkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLk1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5Qcm9qZWN0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLlVSSUhlbHBlcjsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciB7Ci0KLQlzdGF0aWMgY2xhc3MgRG9jdW1lbnRJbmZvIHsKLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWJvb2xlYW4gc2VsZkNvbm5lY3RlZCA9IGZhbHNlOwotCQlpbnQgYnVmZmVyUmVmZXJlbmNlQ291bnQgPSAwOwotCQlpbnQgbW9kZWxSZWZlcmVuY2VDb3VudCA9IDA7Ci0JfQotCi0JLyoqCi0JICogQSBVUklSZXNvbHZlciBpbnN0YW5jZSBvZiBtb2RlbHMgYnVpbHQgb24gamF2YS5pby5GaWxlcwotCSAqLwotCWNsYXNzIEV4dGVybmFsVVJJUmVzb2x2ZXIgaW1wbGVtZW50cyBVUklSZXNvbHZlciB7Ci0JCUlQYXRoIGZMb2NhdGlvbjsKLQotCQlFeHRlcm5hbFVSSVJlc29sdmVyKElQYXRoIGxvY2F0aW9uKSB7Ci0JCQlmTG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUJhc2VMb2NhdGlvbigpIHsKLQkJCXJldHVybiBmTG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlLCBmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQkvLyBpZ25vcmUgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzIHZhbHVlCi0JCQlpZiAodXJpID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAodXJpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKLQkJCQl0cnkgewotCQkJCQlVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotCQkJCQlyZXR1cm4gdXJsLmdldEZpbGUoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFVSSUhlbHBlci5ub3JtYWxpemUodXJpLCBiYXNlUmVmZXJlbmNlLCBQYXRoLlJPT1QudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIElDb250YWluZXIgZ2V0Um9vdExvY2F0aW9uKCkgewotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0VVJJU3RyZWFtKFN0cmluZyB1cmkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RmlsZUJhc2VMb2NhdGlvbihTdHJpbmcgbmV3TG9jYXRpb24pIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgbmV3UHJvamVjdCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFwcyBpbnRlcmVzdGluZyBkb2N1bWVudHMgaW4gZmlsZSBidWZmZXJzIHRvIHRob3NlIGZpbGUgYnVmZmVycy4KLQkgKiBSZXF1aXJlZCB0byBhbGxvd3MgdXMgdG8gZ28gZnJvbSBkb2N1bWVudHMgdG8gY29tcGxldGUgbW9kZWxzLgotCSAqLwotCWNsYXNzIEZpbGVCdWZmZXJNYXBwZXIgaW1wbGVtZW50cyBJRmlsZUJ1ZmZlckxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgYnVmZmVyQ29udGVudEFib3V0VG9CZVJlcGxhY2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgYnVmZmVyQ29udGVudFJlcGxhY2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgYnVmZmVyQ3JlYXRlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgdGV4dEJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQlpZiAoISh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChkZWJ1Z1RleHRCdWZmZXJMaWZlQ3ljbGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMZWFybmVkIG5ldyBidWZmZXI6ICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIiAiICsgYnVmZmVyICsgIiAiICsgKChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcikuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJfQotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gbmV3IERvY3VtZW50SW5mbygpOwotCQkJCWluZm8uYnVmZmVyID0gdGV4dEJ1ZmZlcjsKLQkJCQlpbmZvLmNvbnRlbnRUeXBlSUQgPSBkZXRlY3RDb250ZW50VHlwZShidWZmZXIuZ2V0TG9jYXRpb24oKSkuZ2V0SWQoKTsKLQkJCQlpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50Kys7Ci0JCQkJZkRvY3VtZW50TWFwLnB1dCh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCksIGluZm8pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYnVmZmVyRGlzcG9zZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIHRleHRCdWZmZXIgPSAoSVRleHRGaWxlQnVmZmVyKSBidWZmZXI7Ci0JCQkJaWYgKCEodGV4dEJ1ZmZlci5nZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoZGVidWdUZXh0QnVmZmVyTGlmZUN5Y2xlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGlzY2FyZGVkIGJ1ZmZlcjogIiArIGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiICIgKyBidWZmZXIgKyAiICIgKyAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpKTsKLQkJCQl9Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50LS07Ci0JCQkJCWlmIChpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50ID09IDAgJiYgaW5mby5tb2RlbFJlZmVyZW5jZUNvdW50ID09IDApCi0JCQkJCQlmRG9jdW1lbnRNYXAucmVtb3ZlKHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlydHlTdGF0ZUNoYW5nZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBib29sZWFuIGlzRGlydHkpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlpZiAoZGVidWdUZXh0QnVmZmVyTGlmZUN5Y2xlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQnVmZmVyIGRpcnR5IHN0YXRlIGNoYW5nZWQ6ICgiICsgaXNEaXJ0eSArICIpICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIiAiICsgYnVmZmVyICsgIiAiICsgKChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcikuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJfQotCQkJCUlUZXh0RmlsZUJ1ZmZlciB0ZXh0QnVmZmVyID0gKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyOwotCQkJCWlmICghKHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpKQotCQkJCQlyZXR1cm47Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLm1vZGVsICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1zZyA9ICJVcGRhdGluZyBtb2RlbCBkaXJ0eSBzdGF0ZSBmb3IiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJCQkJaWYgKGRlYnVnRmlsZUJ1ZmZlck1vZGVsTWFuYWdlbWVudCB8fCBkZWJ1Z1RleHRCdWZmZXJMaWZlQ3ljbGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJCQl9Ci0JCQkJCWluZm8ubW9kZWwuc2V0RGlydHlTdGF0ZShpc0RpcnR5KTsKLQotCQkJCQlJRmlsZSB3b3Jrc3BhY2VGaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24oaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCWlmICghaXNEaXJ0eSAmJiB3b3Jrc3BhY2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCWluZm8ubW9kZWwucmVzZXRTeW5jaHJvbml6YXRpb25TdGFtcCh3b3Jrc3BhY2VGaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlRmFpbGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2luZyhJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlVmFsaWRhdGlvbkNoYW5nZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBib29sZWFuIGlzU3RhdGVWYWxpZGF0ZWQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZGVybHlpbmdGaWxlRGVsZXRlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlpZiAoZGVidWdUZXh0QnVmZmVyTGlmZUN5Y2xlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVsZXRlZCBidWZmZXI6ICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkgKyAiICIgKyBidWZmZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZGVybHlpbmdGaWxlTW92ZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBJUGF0aCBwYXRoKSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJaWYgKGRlYnVnVGV4dEJ1ZmZlckxpZmVDeWNsZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vdmVkIGJ1ZmZlciBmcm9tOiAiICsgYnVmZmVyLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpICsgIiAiICsgYnVmZmVyKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3ZlZCBidWZmZXIgdG86ICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICIgIiArIGJ1ZmZlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdGaWxlQnVmZmVyTW9kZWxNYW5hZ2VtZW50ID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9maWxlYnVmZmVycy9tb2RlbG1hbmFnZW1lbnQiKSk7Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1RleHRCdWZmZXJMaWZlQ3ljbGUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL2xpZmVjeWNsZSIpKTsKLQotCXByaXZhdGUgc3RhdGljIEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgaW5zdGFuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXN0YXRpYyBmaW5hbCB2b2lkIHNodXRkb3duKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkgewotCQkJaWYgKGRlYnVnRmlsZUJ1ZmZlck1vZGVsTWFuYWdlbWVudCkgewotCQkJCUlEb2N1bWVudFtdIGRhbmdsaW5nRG9jdW1lbnRzID0gKElEb2N1bWVudFtdKSBpbnN0YW5jZS5mRG9jdW1lbnRNYXAua2V5U2V0KCkudG9BcnJheShuZXcgSURvY3VtZW50WzBdKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRhbmdsaW5nRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgaW5zdGFuY2UuZkRvY3VtZW50TWFwLmdldChkYW5nbGluZ0RvY3VtZW50c1tpXSk7Ci0JCQkJCWlmIChpbmZvLm1vZGVsUmVmZXJlbmNlQ291bnQgPiAwKQotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJMRUFLRUQgTU9ERUw6ICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgKGluZm8ubW9kZWwgIT0gbnVsbCA/IGluZm8ubW9kZWwuZ2V0SWQoKSA6IG51bGwpKTsKLQkJCQkJaWYgKGluZm8uYnVmZmVyUmVmZXJlbmNlQ291bnQgPiAwKQotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJMRUFLRUQgQlVGRkVSOiAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIGluZm8uYnVmZmVyLmdldERvY3VtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLnJlbW92ZUZpbGVCdWZmZXJMaXN0ZW5lcihpbnN0YW5jZS5mRmlsZUJ1ZmZlckxpc3RlbmVyKTsKLQkJCWluc3RhbmNlID0gbnVsbDsKLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCB2b2lkIHN0YXJ0dXAoKSB7Ci0JCWdldEluc3RhbmNlKCk7Ci0JfQotCi0JLy8gYSBtYXAgb2YgSVN0cnVjdHVyZWREb2N1bWVudHMgdG8gRG9jdW1lbnRJbmZvIG9iamVjdHMKLQlNYXAgZkRvY3VtZW50TWFwID0gbnVsbDsKLQotCUlGaWxlQnVmZmVyTGlzdGVuZXIgZkZpbGVCdWZmZXJMaXN0ZW5lciA9IG51bGw7Ci0KLQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnRNYXAgPSBuZXcgSGFzaHRhYmxlKDQpOwotCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5hZGRGaWxlQnVmZmVyTGlzdGVuZXIoZkZpbGVCdWZmZXJMaXN0ZW5lciA9IG5ldyBGaWxlQnVmZmVyTWFwcGVyKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlJUGF0aCBwYXRoID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkvKgotCQkJICogVGhlIElEIG9mIG1vZGVscyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBub3JtYWxpemVkIHBhdGhzCi0JCQkgKiBzdG9yZWQgaW4gdGhlIHVuZGVybHlpbmcgRmlsZUJ1ZmZlcnMgdG8gcmV0cmlldmUgdGhlbSBieSBjb21tb24KLQkJCSAqIElEIGxhdGVyIG9uLiBXZSBjaG9zZSB0aGUgRmlsZUJ1ZmZlciBub3JtYWxpemVkIHBhdGggb3ZlciB0aGUKLQkJCSAqIHByZXZpb3VzbHkgdXNlZCBhYnNvbHV0ZSBJRmlsZSBwYXRoIGJlY2F1c2UgdGhlIGJ1ZmZlcnMgc2hvdWxkCi0JCQkgKiBhbHJlYWR5IGV4aXN0IGJlZm9yZSB3ZSBidWlsZCBhIG1vZGVsIGFuZCB3ZSBjYW4ndCByZXRyaWV2ZSBhCi0JCQkgKiBGaWxlQnVmZmVyIHVzaW5nIHRoZSBJRCBvZiBhIG1vZGVsIHRoYXQgZG9lc24ndCB5ZXQgZXhpc3QuCi0JCQkgKi8KLQkJCWlkID0gRmlsZUJ1ZmZlcnMubm9ybWFsaXplTG9jYXRpb24ocGF0aCkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IGdldEJ1ZmZlcihkb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWQgPSBidWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlVUklSZXNvbHZlciBjcmVhdGVVUklSZXNvbHZlcihJVGV4dEZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCUlQYXRoIGxvY2F0aW9uID0gYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCUlGaWxlIHdvcmtzcGFjZUZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCVVSSVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLQkJaWYgKHdvcmtzcGFjZUZpbGUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZUZpbGUuZ2V0UHJvamVjdCgpOwotCQkJcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXIpIHByb2plY3QuZ2V0QWRhcHRlcihVUklSZXNvbHZlci5jbGFzcyk7Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCXJlc29sdmVyID0gbmV3IFByb2plY3RSZXNvbHZlcihwcm9qZWN0KTsKLQkJCX0KLQkJCXJlc29sdmVyLnNldEZpbGVCYXNlTG9jYXRpb24od29ya3NwYWNlRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzb2x2ZXIgPSBuZXcgRXh0ZXJuYWxVUklSZXNvbHZlcihsb2NhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCi0JSUNvbnRlbnRUeXBlIGRldGVjdENvbnRlbnRUeXBlKElQYXRoIGxvY2F0aW9uKSB7Ci0JCUlDb250ZW50VHlwZSB0eXBlID0gbnVsbDsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvLyBPcHRpbWl6ZWQgZGVzY3JpcHRpb24gbG9va3VwLCBtaWdodCBub3Qgc3VjY2VlZAotCQkJCQlkID0gKChJRmlsZSkgcmVzb3VyY2UpLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCQl0eXBlID0gZC5nZXRDb250ZW50VHlwZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gU2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBnaXZlbiB0aGUgYWNjZXNzaWJsZSBhbmQgZmlsZQotCQkJCQkvLyB0eXBlIGNoZWNrIGFib3ZlCi0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUZpbGUgZmlsZSA9IEZpbGVCdWZmZXJzLmdldFN5c3RlbUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGlucHV0LCBsb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoZmlsZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoSUNvbnRlbnRUeXBlTWFuYWdlci5DVF9URVhUKTsKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRGaWxlQnVmZmVyIGdldEJ1ZmZlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkKLQkJCXJldHVybiBpbmZvLmJ1ZmZlcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JU3RyaW5nIGdldENvbnRlbnRUeXBlSUQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpCi0JCQlyZXR1cm4gaW5mby5jb250ZW50VHlwZUlEOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKEZpbGUgZmlsZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBidWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYgKGRlYnVnRmlsZUJ1ZmZlck1vZGVsTWFuYWdlbWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBjb25uZWN0aW5nIHRvIEZpbGUgIiArIGxvY2F0aW9uKTsKLQkJCX0KLQkJCWJ1ZmZlck1hbmFnZXIuY29ubmVjdChsb2NhdGlvbiwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IGJ1ZmZlck1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIobG9jYXRpb24pOwotCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCQlpbmZvLnNlbGZDb25uZWN0ZWQgPSB0cnVlOwotCQkJCW1vZGVsID0gZ2V0TW9kZWwoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkVycm9yIGdldHRpbmcgbW9kZWwgZm9yICIgKyBmaWxlLmdldFBhdGgoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKElGaWxlIGZpbGUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQl0cnkgewotCQkJaWYgKGRlYnVnRmlsZUJ1ZmZlck1vZGVsTWFuYWdlbWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBjb25uZWN0aW5nIHRvIElGaWxlICIgKyBmaWxlLmdldExvY2F0aW9uKCkpOwotCQkJfQotCQkJYnVmZmVyTWFuYWdlci5jb25uZWN0KGZpbGUuZ2V0TG9jYXRpb24oKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IGJ1ZmZlck1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIoZmlsZS5nZXRMb2NhdGlvbigpKTsKLQkJCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChidWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaW5mby5zZWxmQ29ubmVjdGVkID0gdHJ1ZTsKLQkJCQltb2RlbCA9IGdldE1vZGVsKChJU3RydWN0dXJlZERvY3VtZW50KSBidWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJFcnJvciBnZXR0aW5nIG1vZGVsIGZvciAiICsgZmlsZS5nZXRMb2NhdGlvbigpLCBlKTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5tb2RlbCA9PSBudWxsKSB7Ci0JCQlpZiAoZGVidWdGaWxlQnVmZmVyTW9kZWxNYW5hZ2VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGNyZWF0aW5nIG1vZGVsIGZvciAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIGluZm8uYnVmZmVyLmdldERvY3VtZW50KCkpOwotCQkJfQotCQkJaW5mby5tb2RlbFJlZmVyZW5jZUNvdW50Kys7Ci0KLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChpbmZvLmNvbnRlbnRUeXBlSUQpOwotCQkJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQkJYm9vbGVhbiBtdXN0U2V0RG9jdW1lbnQgPSB0cnVlOwotCQkJaWYgKGxvYWRlciBpbnN0YW5jZW9mIElNb2RlbExvYWRlckV4dGVuc2lvbikgewotCQkJCW11c3RTZXREb2N1bWVudCA9IGZhbHNlOwotCQkJCW1vZGVsID0gKChJTW9kZWxMb2FkZXJFeHRlbnNpb24pIGxvYWRlcikuY3JlYXRlTW9kZWwoZG9jdW1lbnQsIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltb2RlbCA9IGxvYWRlci5jcmVhdGVNb2RlbCgpOwotCQkJCW1vZGVsLnNldEJhc2VMb2NhdGlvbihpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlpbmZvLm1vZGVsID0gbW9kZWw7Ci0JCQkJbW9kZWwuc2V0SWQoaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQltb2RlbC5zZXRNb2RlbEhhbmRsZXIoaGFuZGxlcik7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgbW9kZWwpLnNldENvbnRlbnRUeXBlSWRlbnRpZmllcihpbmZvLmNvbnRlbnRUeXBlSUQpOwotCQkJCX0KLQkJCQltb2RlbC5zZXRSZXNvbHZlcihjcmVhdGVVUklSZXNvbHZlcihnZXRCdWZmZXIoZG9jdW1lbnQpKSk7Ci0JCQkJaWYgKG11c3RTZXREb2N1bWVudCkgewotCQkJCQltb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJCX0KLQkJCQlpZiAoaW5mby5idWZmZXIuaXNEaXJ0eSgpKSB7Ci0JCQkJCW1vZGVsLnNldERpcnR5U3RhdGUodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiYXR0ZW1wdGVkIHRvIGNyZWF0ZSBuZXcgbW9kZWwgd2l0aCBleGlzdGluZyBJRCIsIGUpOwotCQkJCW1vZGVsID0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW5mby5tb2RlbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFeGlzdGluZ0J1ZmZlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJcmV0dXJuIGluZm8gIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlTW9kZWwoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWdGaWxlQnVmZmVyTW9kZWxNYW5hZ2VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIG5vdGljZWQgZnVsbCByZWxlYXNlIG9mIG1vZGVsIGZvciAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIGluZm8uYnVmZmVyLmdldERvY3VtZW50KCkpOwotCQkJfQotCQkJaW5mby5tb2RlbCA9IG51bGw7Ci0JCQlpbmZvLm1vZGVsUmVmZXJlbmNlQ291bnQtLTsKLQkJCWlmIChpbmZvLnNlbGZDb25uZWN0ZWQpIHsKLQkJCQlpZiAoZGVidWdGaWxlQnVmZmVyTW9kZWxNYW5hZ2VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBkaXNjb25uZWN0aW5nIGZyb20gIiArIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkgKyAiICIgKyBpbmZvLmJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCQl9Ci0JCQkJSVBhdGggbG9jYXRpb24gPSBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpOwotCQkJCXRyeSB7Ci0JCQkJCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmRpc2Nvbm5lY3QoaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiRXJyb3IgcmVsZWFzaW5nIG1vZGVsIGZvciAiICsgbG9jYXRpb24sIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSlNQQXdhcmVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9KU1BBd2FyZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOWVmZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9KU1BBd2FyZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBKU1BBd2FyZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnkgewotCi0Jdm9pZCBpbml0aWFsaXplV2l0aChFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkQ29udGVudFR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NGEzN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIExvZ2dlciBpcyBub3QgcmVzcG9uc2libGUgZm9yIHJldHVybmluZyBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBMb2dnZXIgaXMgbm90IHJlc3BvbnNpYmxlIGZvciByZXR1cm5pbmcgcGx1Z2luIGlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL01vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL01vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhN2Q0OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Nb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlciByZWFkZXIgPSBudWxsOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChyZWFkZXIgPT0gbnVsbCkgewotCQkJcmVhZGVyID0gbmV3IE1vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQURBUFRFUktFWSA9ICJhZGFwdGVyS2V5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9DT05URU5UVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9SRUdJU1RFUkFEQVBURVIgPSAicmVnaXN0ZXJBZGFwdGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImFkYXB0T25DcmVhdGVGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiQWRhcHRPbkNyZWF0ZUZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBYTUxFZGl0b3JQbHVnaW5SZWdpc3RyeVJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoSURvY3VtZW50VHlwZUhhbmRsZXIgaGFuZGxlcikgewotCQlyZXR1cm4gbG9hZFJlZ2lzdHJ5KGhhbmRsZXIuZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBsb2FkUmVnaXN0cnkodHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGxvYWRGYWN0b3J5RnJvbUNvbmZpZ3VyYXRpb25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcmVxdWVzdGVyVHlwZSkgewotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCVN0cmluZyBjb250ZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQ09OVEVOVFRZUEUpOwotCQkJaWYgKCFjb250ZW50VHlwZS5lcXVhbHMocmVxdWVzdGVyVHlwZSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DTEFTUyk7Ci0JCQlTdHJpbmcgYWRhcHRlcktleUNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9BREFQVEVSS0VZKTsKLQkJCVN0cmluZyByZWdpc3RlckFkYXB0ZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9SRUdJU1RFUkFEQVBURVIpOwotCi0JCQkvLyBpZiBjbGFzc05hbWUgaXMgbnVsbCwgdGhlbiBubyBvbmUgZGVmaW5lZCB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0JCQkvLyBmb3IgYWRhcHRlciBmYWN0b3JpZXMKLQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUobmFtZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWYgYW4gZXJyb3Igb2NjdXJzIGhlcmUsIGl0cyBwcm9iYWJseSB0aGF0IHRoZSBwbHVnaW4KLQkJCQkJLy8gY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZAotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBidW5kbGU6ICIgKyBuYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfQotCQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIHVzZUV4dGVuZGVkQ29uc3RydWN0b3IgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBkb1JlZ2lzdGVyQWRhcHRlcnMgPSBmYWxzZTsKLQkJCQkJT2JqZWN0IGFkYXB0ZXJLZXkgPSBudWxsOwotCi0JCQkJCWlmIChyZWdpc3RlckFkYXB0ZXJzICE9IG51bGwgJiYgcmVnaXN0ZXJBZGFwdGVycy5sZW5ndGgoKSA+IDAgJiYgQm9vbGVhbi52YWx1ZU9mKHJlZ2lzdGVyQWRhcHRlcnMpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlkb1JlZ2lzdGVyQWRhcHRlcnMgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmIChhZGFwdGVyS2V5Q2xhc3MgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlDbGFzcyBhQ2xhc3MgPSBudWxsOwotLy8JCQkJCQkJYUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhhZGFwdGVyS2V5Q2xhc3MpIDogQ2xhc3MuZm9yTmFtZShhZGFwdGVyS2V5Q2xhc3MpOwotCQkJCQkJCWlmIChidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuVU5JTlNUQUxMRUQpIHsKLQkJCQkJCQkJYUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhhZGFwdGVyS2V5Q2xhc3MpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWFDbGFzcyA9IENsYXNzLmZvck5hbWUoYWRhcHRlcktleUNsYXNzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJCQkJCXVzZUV4dGVuZGVkQ29uc3RydWN0b3IgPSB0cnVlOwotCQkJCQkJCQlhZGFwdGVyS2V5ID0gYUNsYXNzOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWFkYXB0ZXJLZXkgPSBhZGFwdGVyS2V5Q2xhc3M7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGFueUVycm9ycykgewotCQkJCQkJCWFkYXB0ZXJLZXkgPSBhZGFwdGVyS2V5Q2xhc3M7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQl0cnkgewotCQkJCQkJQ2xhc3MgdGhlQ2xhc3MgPSBudWxsOwotLy8JCQkJCQlDbGFzcyB0aGVDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSA6IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCQkJCWlmIChidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuVU5JTlNUQUxMRUQpIHsKLQkJCQkJCQl0aGVDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdGhlQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodXNlRXh0ZW5kZWRDb25zdHJ1Y3RvcikgewotCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yW10gY3RvcnMgPSB0aGVDbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCUNsYXNzW10gcGFyYW1UeXBlcyA9IGN0b3JzW2ldLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQkJCQkJCWlmIChjdG9yc1tpXS5pc0FjY2Vzc2libGUoKSAmJiBwYXJhbVR5cGVzLmxlbmd0aCA9PSAyICYmIHBhcmFtVHlwZXNbMF0uZXF1YWxzKE9iamVjdC5jbGFzcykgJiYgcGFyYW1UeXBlc1sxXS5lcXVhbHMoYm9vbGVhbi5jbGFzcykpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgY3RvcnNbaV0ubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2FkYXB0ZXJLZXksIG5ldyBCb29sZWFuKGRvUmVnaXN0ZXJBZGFwdGVycyl9KTsKLQkJCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCXRocm93IG5ldyBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5Tb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJdGhyb3cgbmV3IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJCQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJdGhyb3cgbmV3IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJCQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJdGhyb3cgbmV3IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGUpIHsKLQkJCQkJCQkJCQl0aHJvdyBuZXcgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfQ0xBU1MpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5Tb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgbG9hZFJlZ2lzdHJ5KE9iamVjdCBjb250ZW50VHlwZSkgewotCQlMaXN0IGZhY3RvcnlMaXN0ID0gbmV3IFZlY3RvcigpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChTU0VDb3JlUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbG9hZEZhY3RvcnlGcm9tQ29uZmlndXJhdGlvbkVsZW1lbnQoZWxlbWVudHNbaV0sIGNvbnRlbnRUeXBlKTsKLQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCQlmYWN0b3J5TGlzdC5hZGQoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY3RvcnlMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm9DYW5jZWxQcm9ncmVzc01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm9DYW5jZWxQcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmMTI5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL05vQ2FuY2VsUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci0KLQotcHVibGljIGNsYXNzIE5vQ2FuY2VsUHJvZ3Jlc3NNb25pdG9yIGV4dGVuZHMgTnVsbFByb2dyZXNzTW9uaXRvciB7Ci0KLQotCXB1YmxpYyBOb0NhbmNlbFByb2dyZXNzTW9uaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwYjk4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL05vdEltcGxlbWVudGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgY2xhc3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHVibGljIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi0JcHVibGljIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9OdWxsTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjdmMmEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTnVsbE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFuIEVuY29kaW5nTWVtZW50byAoaXRzIHN1cGVyIGNsYXNzKSwKLSAqIHdoZW4gdGhlcmUgaXMgbm90IGluIGZhY3QgQU5ZIGVuY29kaW5nIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgd2hlbiBhCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY3JlYXRlZCBkaXJlY3RseSBmcm9tIGEgU3RyaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJc3VwZXIoKTsKLQkJU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQlzZXREZXRlY3RlZENoYXJzZXROYW1lKG51bGwpOwotCQlhZGRUcmFjZShERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjlkYWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5idWlsZGVyLlN0cnVjdHVyZWREb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucHJlZmVyZW5jZXMuQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIG1vZGVsIG1hbmFnZXIgcGx1Z2luIGhlbHBlciBpcyB1c2VkIHRvIHJldHVybiB0aGUgbW9kZWwgbWFuYWdlcgotICogZGVzaXJlZCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBtb2RlbCBtYW5hZ2VyLCBmb3IgbWFuYWdpbmcgKGFkZCBvcgotICogcmVtb3ZlKSBtb2RlbCBsb2FkZXJzIGFuZCBtb2RlbCBkdW1wZXJzLCBhbmQgZm9yIG1hbmFnaW5nIChnZXQsIHJlbGVhc2UsCi0gKiBzYXZlLCBhbmQgc2F2ZSBhcykgbW9kZWxzLiBIZXJlIGlzIGFuIGV4YW1wbGUgb24gb24gaG93IHRvIHVzZSBpdC4gVW5kZXIKLSAqIHRoZSBzdWJkaXJlY3RvcnkgbmFtZWQgYWZ0ZXIgeW91ciBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIHlvdXIKLSAqIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBtYW5hZ2VyIChlLmcuICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiKSBpbgotICogdGhlICJwcm9qZWN0X3Jlc291cmNlc1xwbHVnaW5zIiBkaXJlY3RvcnksIGNyZWF0ZSBhICJwbHVnaW4ueG1sIiBmaWxlLiBJbgotICogdGhpcyBmaWxlICgicHJvamVjdHByb2plY3RfcmVzb3VyY2VzXHBsdWdpbnNcY29tLmlibS5zZWQubW9kZWxccGx1Z2luLnhtbCIpCi0gKiBlbnRlcjogPD94bWwgdmVyc2lvbj0iMS4wIj8+IDxwbHVnaW4gbmFtZT0iSUJNIFdlYiBUb29saW5nIE1vZGVsIE1hbmFnZXIKLSAqIFBsdWdpbiIgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgdmVyc2lvbj0iMS4wIiB2ZW5kb3ItbmFtZT0iUlRQIgotICogY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Nb2RlbE1hbmFnZXJQbHVnaW4iPiA8IS0tIFRoZSBYTUwgcGFja2FnZToKLSAqIGNvbS5pYm0uZXRvb2xzLmIyYnhtbHJ0LCBpcyByZXF1aXJlZCBiZWZvcmUgdGhlIG90aGVycyB0byBnaXZlIHByZWNlZGVuY2UKLSAqIHRvIERPTTIgQVBJcywgaW5zdGVhZCBvZiB0aGUgRE9NMSAodXNlZCBieSBvdGhlcnMsIHN1Y2ggYXMgdGhlIGRlc2t0b3AKLSAqICgiY29tLmlibS5lY2xpcHNlLioiKSkgLS0+IDxyZXF1aXJlcz48aW1wb3J0Ci0gKiBwbHVnaW49ImNvbS5pYm0uZXRvb2xzLmIyYnhtbHJ0IiBleHBvcnQ9InRydWUiLz4gPGltcG9ydAotICogcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbCIgZXhwb3J0PSJ0cnVlIi8+IDwvcmVxdWlyZXM+Ci0gKiA8cnVudGltZT48bGlicmFyeSBuYW1lPSJydW50aW1lL3NlZG1vZGVsLmphciI+IDxleHBvcnQgbmFtZT0iKiIvPgotICogPC9saWJyYXJ5PiA8L3J1bnRpbWU+IDwvcGx1Z2luPiB0byB0ZWxsIHRoZSB3b3JrYmVuY2ggdGhlIG1vZGVsIG1hbmFnZXIKLSAqIHBsdWdpbiBJRCBhbmQgd2hlcmUgdG8gZmluZCB0aGlzIG1vZGVsIG1hbmFnZXIgcGx1Z2luIGNsYXNzLiBUaGVuIGluIHRoZQotICogZ2V0TW9kZWxNYW5hZ2VyIG1ldGhvZCBvZiB0aGlzIG1vZGVsIG1hbmFnZXIgcGx1Z2luIGNsYXNzLCBjcmVhdGUgYW5kCi0gKiByZXR1cm4gdGhlIG1vZGVsIG1hbmFnZXIgZGVzaXJlZCB0byBiZSB1c2VkLiBJbiB0aGUgY2xpZW50IGNvZGUgdGhhdAotICogcmVxdWVzdHMgdGhlIG1vZGVsIG1hbmFnZXIsIHRoZSBmb2xsb3dpbmcgY29kZSBzaG91bGQgYmUgdXNlZCB0byBhY2Nlc3MgdGhlCi0gKiBtb2RlbCBtYW5hZ2VyIAotICogLy8gZ2V0IHRoZSBtb2RlbCBtYW5hZ2VyIGZyb20gdGhlIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIKLSAqIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0gKi8KLXB1YmxpYyBjbGFzcyBTU0VDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIGltcGxlbWVudHMgSU1vZGVsTWFuYWdlclBsdWdpbiB7Ci0Jc3RhdGljIFNTRUNvcmVQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVGSVggPSAiJSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RPVUJMRV9QUkVGSVggPSAiJSUiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9GRiA9ICJvZmYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSVUNUVVJFRF9CVUlMREVSID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkYnVpbGRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTU0VDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgU1NFQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFNldCBkZWZhdWx0IG5vbi1VSQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCS8vIHNldCBtb2RlbCBwcmVmZXJlbmNlIGRlZmF1bHRzCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFLCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MsIHRydWUpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUywgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUywgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIHRydWUpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIHRydWUpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTLCBmYWxzZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlVURl84KTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQUJfV0lEVEgsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfVEFCX1dJRFRIKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5GT1JNQVRUSU5HX1NVUFBPUlRFRCwgZmFsc2UpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUywgZmFsc2UpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLklOREVOVF9VU0lOR19UQUJTLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMsIGZhbHNlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5QUkVGRVJSRURfTUFSS1VQX0NBU0VfU1VQUE9SVEVELCBmYWxzZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSwgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFLCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFTS19UQUdfRU5BQkxFLCBmYWxzZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFTS19UQUdfVEFHUywgIlRPRE8sRklYTUUsWFhYIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQVNLX1RBR19QUklPUklUSUVTLCAiMSwyLDEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RydWN0dXJlZERvY3VtZW50QnVpbGRlci5zaHV0ZG93bigpOwotCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLnNodXRkb3duKCk7Ci0JCQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLQkJU3RyaW5nIGJ1aWxkID0gU3lzdGVtLmdldFByb3BlcnR5KFNUUlVDVFVSRURfQlVJTERFUik7Ci0JCWlmIChidWlsZCA9PSBudWxsIHx8ICFidWlsZC5lcXVhbHNJZ25vcmVDYXNlKE9GRikpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudEJ1aWxkZXIuc3RhcnR1cCgpOwotCQl9Ci0JCS8vIGluaXRpYWxpemUgRmlsZUJ1ZmZlciBoYW5kbGluZwotCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLnN0YXJ0dXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEhhbmRsZXJSZWdpc3RyeSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkgKi8KLQlwdWJsaWMgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgcyA9IHZhbHVlLnRyaW0oKTsKLQkJaWYgKCFzLnN0YXJ0c1dpdGgoS0VZX1BSRUZJWCwgMCkpCi0JCQlyZXR1cm4gczsKLQkJaWYgKHMuc3RhcnRzV2l0aChLRVlfRE9VQkxFX1BSRUZJWCwgMCkpCi0JCQlyZXR1cm4gcy5zdWJzdHJpbmcoMSk7Ci0KLQkJaW50IGl4ID0gcy5pbmRleE9mKCcgJyk7Ci0JCVN0cmluZyBrZXkgPSBpeCA9PSAtMSA/IHMgOiBzLnN1YnN0cmluZygwLCBpeCk7Ci0KLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5LnN1YnN0cmluZygxKSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU2NzA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BX21vZGVsJ3NfaWRfY2FuX25vdF9iZV9udV9FWENfPUEgbW9kZWwncyBpZCBjYW4gbm90IGJlIG51bGwKLVByb2dyYW1fRXJyb3JfX01vZGVsTWFuYWdlX0VYQ189UHJvZ3JhbSBFcnJvcjogTW9kZWxNYW5hZ2VySW1wbDo6c2F2ZU1vZGVsLiBNb2RlbCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlCi1PcmlnaW5hbF9FcnJvcl9fVUlfPU9yaWdpbmFsIEVycm9yOgotTW9kZWxQbHVnaW4uMD1TdHJ1Y3R1cmVkIEJ1aWxkZXIKLVN0cnVjdHVyZWREb2N1bWVudEJ1aWxkZXIuMD1VcGRhdGluZyBidWlsZGVycwotVGV4dF9DaGFuZ2VfVUlfPVRleHQgQ2hhbmdlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Vbmtvd25faW50ZXJuYWxfc2Nhbm5lcl9lcl9FUlJPUl89VW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IKLUludGVybmFsX2Vycm9yX191bmtub3duX3N0X0VSUk9SXz1JbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZQotRXJyb3JfX2NvdWxkX25vdF9tYXRjaF9pbnBfRVJST1JfPUVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQKLUVycm9yX19wdXNoYmFja192YWx1ZV93YXNfX0VSUk9SXz1FcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZQotQW5fSS9PX2Vycm9yX29jY3VyZWRfd2hpbGVfRVhDXz1BbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Ci0zY29uY2F0PUZpbGUgbm90IGZvdW5kIDogXCJ7MH1cIgotNWNvbmNhdD1FcnJvciBvcGVuaW5nIGZpbGUgXCJ7MH1cIgotdWxfX19fXyh0ZW1wbGF0ZSlfVUlfPXVsICAgICAodGVtcGxhdGUpCi08dWw+X25fXzxsaT5fSXRlbV9vbmVfPC9saV9VSV89PHVsPlxuICA8bGk+IEl0ZW0gb25lIDwvbGk+XG4gIDxsaT4gSXRlbSB0d28gPC9saT5cbjwvdWw+XG4KLWRsX19fX18odGVtcGxhdGUpX1VJXz1kbCAgICAgKHRlbXBsYXRlKQotPGRsPl9uX188ZHQ+X0ZpcnN0X2RlZmluaXRfVUlfPTxkbD5cbiAgPGR0PiBGaXJzdCBkZWZpbml0aW9uICA8ZGQ+ICBGaXJzdCBleHBsYW5hdGlvblxuICA8ZHQ+IFNlY29uZCBkZWZpbml0aW9uIDxkZD4gU2Vjb25kIGV4cGxhbmF0aW9uXG48L2RsPlxuCi10YWJsZV9fX19fKHRlbXBsYXRlKV9VSV89dGFibGUgICAgICh0ZW1wbGF0ZSkKLTx0YWJsZV9ib3JkZXI+X25fXzx0cj5fbl9fX1VJXz08dGFibGUgYm9yZGVyPlxuICA8dHI+XG4gICAgPHRoPkNvbHVtbiAxIEhlYWRpbmc8L3RoPlxuICAgIDx0aD5Db2x1bW4gMiBIZWFkaW5nPC90aD5cbiAgPC90cj5cbiAgPHRyPlxuICAgIDx0ZD5Sb3cgMTogQ29sIDE8L3RkPlxuICAgIDx0ZD5Sb3cgMTogQ29sIDI8L3RkPlxuICA8L3RyPlxuPC90YWJsZT5cbgotb2xfX19fXyh0ZW1wbGF0ZSlfVUlfPW9sICAgICAodGVtcGxhdGUpCi08b2w+X25fXzxsaT5fSXRlbV9vbmVfPC9saV9VSV89PG9sPlxuICA8bGk+IEl0ZW0gb25lIDwvbGk+XG4gIDxsaT4gSXRlbSB0d28gPC9saT5cbjwvb2w+XG4KLWh0bWxfX19fKHRlbXBsYXRlKV9VSV89aHRtbCAgICAodGVtcGxhdGUpCi08aHRtbD5fbjxoZWFkPl9uPHRpdGxlPkluc19VSV89PGh0bWw+XG48aGVhZD5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbjx8Yz5cbjwvYm9keT5cbjwvaHRtbD4KLXNjcmlwdF9fX19fKGNvbW1lbnRlZClfVUlfPXNjcmlwdCAgICAgKGNvbW1lbnRlZCkKLXN0eWxlX19fX18oY29tbWVudGVkKV9VSV89c3R5bGUgICAgIChjb21tZW50ZWQpCi1pbWdfX19fXyhtYXApX1VJPWltZyAgICAgKG1hcCkKLVVzYWdlX19famF2YV9IVE1MVG9rZW5pemVyX0VYQ189VXNhZ2UgOiBqYXZhIEhUTUxUb2tlbml6ZXIgPGlucHV0ZmlsZT4KLSMjIG9uIHRoZSBmb2xsb3dpbmcgbGluZSwganVzdCB0cmFuc2xhdGU6ICJwbGFjZSB0aXRsZSBoZXJlIiBhbmQgInBsYWNlIGNvbnRlbnQgaGVyZSIKLV9fPl9uX3RfdDxUSVRMRT48fGM+cGxhY2VfX1VJXz1cIj5cblx0XHQ8VElUTEU+PHxjPnBsYWNlIHRpdGxlIGhlcmU8L1RJVExFPlxuXHQ8L0hFQUQ+XG5cdDxCT0RZPlxuXHRcdHBsYWNlIGNvbnRlbnQgaGVyZVxuXHQ8L0JPRFk+XG48L0hUTUw+Ci1GbGF0bW9kZWxfY29uc3RydWN0b3JfZG9lc25fX3Rfa25vd19ob3dfdG9fZGVhbF93aXRoX25vbi1zdHJpbmdfND1GbGF0bW9kZWwgY29uc3RydWN0b3IgZG9lc25cJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoIG5vbi1zdHJpbmcKLXVuZXhwZWN0ZWRfTW9kZWxNYW5hZ2VyX0ltcGxfMT11bmV4cGVjdGVkIE1vZGVsTWFuYWdlciBJbXBsCi1jb250aW51b3VzXzE9Y29udGludW91cwotcGFnZWRfMj1wYWdlZAotdmlzdWFsXzM9dmlzdWFsCi1hdXJhbF80PWF1cmFsCi10YWN0aWxlXzU9dGFjdGlsZQotZ3JpZF82PWdyaWQKLWJpdG1hcF83PWJpdG1hcAotaW50ZXJhY3RpdmVfOD1pbnRlcmFjdGl2ZQotc3RhdGljXzk9c3RhdGljCi1hbGxfMTA9YWxsCi1DbGVhbmluZ191cF9lbGVtZW50X3swfT1DbGVhbmluZyB1cCBlbGVtZW50IFwiezB9XCIKLVVwcGVyY2FzaW5nX2F0dHJpYnV0ZV9uYW1lX3swfT1VcHBlcmNhc2luZyBhdHRyaWJ1dGUgbmFtZSBcInswfVwiCi1Mb3dlcmNhc2luZ19hdHRyaWJ1dGVfbmFtZV97MH09TG93ZXJjYXNpbmcgYXR0cmlidXRlIG5hbWUgXCJ7MH1cIgotVXBwZXJjYXNpbmdfdGFnX25hbWVfezB9PVVwcGVyY2FzaW5nIHRhZyBuYW1lIFwiezB9XCIKLUxvd2VyY2FzaW5nX3RhZ19uYW1lX3swfT1Mb3dlcmNhc2luZyB0YWcgbmFtZSBcInswfVwiCi1JbnNlcnRpbmdfbWlzc2luZ19lbmRfdGFnX3swfT1JbnNlcnRpbmcgbWlzc2luZyBlbmQgdGFnIFwiezB9XCIKLUluc2VydGluZ19taXNzaW5nX3N0YXJ0X3RhZ197MH09SW5zZXJ0aW5nIG1pc3Npbmcgc3RhcnQgdGFnIFwiezB9XCIKLUluc2VydGluZ19kZWZhdWx0X2F0dHJpYnV0ZV92YWx1ZV97MH09SW5zZXJ0aW5nIGRlZmF1bHQgYXR0cmlidXRlIHZhbHVlIFwiezB9XCIKLVF1b3RpbmdfYXR0cmlidXRlX3ZhbHVlX3swfT1RdW90aW5nIGF0dHJpYnV0ZSB2YWx1ZSBcInswfVwiCi1Gb3JtYXR0aW5nX3N0YXJ0X3RhZ19vZl9lbGVtZW50X3swfT1Gb3JtYXR0aW5nIHN0YXJ0IHRhZyBvZiBlbGVtZW50IFwiezB9XCIKLUZvcm1hdHRpbmdfZW5kX3RhZ19vZl9lbGVtZW50X3swfT1Gb3JtYXR0aW5nIGVuZCB0YWcgb2YgZWxlbWVudCBcInswfVwiCi1Gb3JtYXR0aW5nX2VsZW1lbnRfezB9PUZvcm1hdHRpbmcgZWxlbWVudCBcInswfVwiCi1Gb3JtYXR0aW5nX2luZGVudGF0aW9uX2JlZm9yZV9lbGVtZW50X3swfT1Gb3JtYXR0aW5nIGluZGVudGF0aW9uIGJlZm9yZSBlbGVtZW50IFwiezB9XCIKLUZvcm1hdHRpbmdfaW5kZW50YXRpb25fYWZ0ZXJfZWxlbWVudF97MH09Rm9ybWF0dGluZyBpbmRlbnRhdGlvbiBhZnRlciBlbGVtZW50IFwiezB9XCIKLUZvcm1hdHRpbmdfZWxlbWVudF97MH09Rm9ybWF0dGluZyBlbGVtZW50IFwiezB9XCIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvYnVpbGRlci9CdWlsZGVyTW9kZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9idWlsZGVyL0J1aWxkZXJNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZjI0ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9idWlsZGVyL0J1aWxkZXJNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuYnVpbGRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEJ1aWxkZXJNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUJ1aWxkZXJNb2RlbFByb3ZpZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1ZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGRlci9tb2RlbHByb3ZpZGVyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgTWFwIGZEb2N1bWVudHMgPSBudWxsOwotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBmTW9kZWxNYW5hZ2VyOwotCXByaXZhdGUgTWFwIGZNb2RlbHMgPSBudWxsOwotCi0JcHVibGljIEJ1aWxkZXJNb2RlbFByb3ZpZGVyKElNb2RlbE1hbmFnZXIgbWFuYWdlcikgewotCi0JCXN1cGVyKCk7Ci0JCWZNb2RlbE1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRvY3VtZW50IGZvciB0aGlzIGZpbGU7IGN1cnJlbnQgZG9uZSBieSByZXRyaWV2aW5nIGl0IGZyb20KLQkgKiBhbiBJU3RydWN0dXJlZE1vZGVsCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICogQHRvZG8gR2VuZXJhdGVkIGNvbW1lbnQKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoSUZpbGUgZmlsZSkgewotCi0JCS8vIEZvciBub3csIHdlIGhhdmUgdG8gcmV0cmlldmUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZnJvbSB0aGUKLQkJLy8gSVN0cnVjdHVyZWRNb2RlbC4KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGdldE1vZGVsKGZpbGUpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJaWYgKF9kZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCBJU3RydWN0dXJlZERvY3VtZW50IGZvciAiICsgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtb2RlbCBmb3IgdGhpcyBmaWxlLiBDdXJyZW50bHksIGRvZXMgaXQgdXNpbmcgdGhlCi0JICogSU1vZGVsTWFuYWdlciBmcm9tIHNjcmF0Y2guIFRPRE86IEM0LCBjcmVhdGUgdGhlIG1vZGVsIHVzaW5nIHRoZQotCSAqIGRvY3VtZW50IChjcmVhdGluZyB0aGUgZG9jdW1lbnQgaWYgbmVlZGVkLCBmaXJzdCkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCWlmIChfZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNyZWF0ZWQgSVN0cnVjdHVyZWRNb2RlbCBmb3IgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmaWxlKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gd2UgaGF2ZSBvdXIgcmVmZXJlbmNlLCBhbGxvdyB0aGUKLQkJCQkvLyBJTW9kZWxNYW5hZ2VyIHRvIGRpc3Bvc2UgaWYgbmVlZGVkCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGZpbGUpOwotCQkJfQotCQkJcmV0dXJuIG1vZGVsOwotCQl9Ci0JCS8vIGNhdGNoICdlbSBhbGwKLQkJY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiRXhjZXB0aW9uIGNhdWdodCBjcmVhdGluZyBJU3RydWN0dXJlZE1vZGVsIGZvciBmaWxlICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpICsgIjoiICsgdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmJ1aWxkZXIuSUJ1aWxkZXJNb2RlbFByb3ZpZGVyI2dldERvY3VtZW50KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldERvY3VtZW50KElGaWxlIGZpbGUpIHsKLQotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldERvY3VtZW50cygpLmdldChmaWxlKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCWRvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoZmlsZSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWdldERvY3VtZW50cygpLnB1dChmaWxlLCBkb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZG9jdW1lbnRzLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0RG9jdW1lbnRzKCkgewotCi0JCWlmIChmRG9jdW1lbnRzID09IG51bGwpIHsKLQkJCWZEb2N1bWVudHMgPSBuZXcgV2Vha0hhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gZkRvY3VtZW50czsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyTW9kZWxQcm92aWRlciNnZXRNb2RlbChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChJRmlsZSBmaWxlKSB7Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IChJU3RydWN0dXJlZE1vZGVsKSBnZXRNb2RlbHMoKS5nZXQoZmlsZSk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQltb2RlbCA9IGNyZWF0ZU1vZGVsKGZpbGUpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlnZXRNb2RlbHMoKS5wdXQoZmlsZSwgbW9kZWwpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0KLQkJcmV0dXJuIGZNb2RlbE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtb2RlbHMuCi0JICovCi0JcHVibGljIE1hcCBnZXRNb2RlbHMoKSB7Ci0KLQkJaWYgKGZNb2RlbHMgPT0gbnVsbCkgewotCQkJZk1vZGVscyA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBmTW9kZWxzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoSUZpbGUgZmlsZSkgewotCi0JCWlmIChfZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVsZWFzZWQgcmVzb3VyY2VzIGZvciAiICsgZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlnZXREb2N1bWVudHMoKS5yZW1vdmUoZmlsZSk7Ci0JCWdldE1vZGVscygpLnJlbW92ZShmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlQWxsKCkgewotCi0JCWlmIChfZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVsZWFzZWQgYWxsIHJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZ2V0RG9jdW1lbnRzKCkuY2xlYXIoKTsKLQkJZ2V0TW9kZWxzKCkuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2J1aWxkZXIvQnVpbGRlclBhcnRpY2lwYW50UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvYnVpbGRlci9CdWlsZGVyUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGUxOWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvYnVpbGRlci9CdWlsZGVyUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmJ1aWxkZXIuSUJ1aWxkZXJQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotCi0KLWNsYXNzIEJ1aWxkZXJQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUmVhZGVyID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wYXJ0aWNpcGFudHJlZ2lzdHJ5IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT05URU5UVFlQRV9XSUxEQ0FSRCA9ICIqIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgREVMRUdBVEVfRVhURU5TSU9OX1BPSU5UX0lEID0gU1NFQ29yZVBsdWdpbi5JRCArICIuYnVpbGRlcmRlbGVnYXRlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZkRlbGVnYXRlRWxlbWVudHM7Ci0JLy8gYSBtYXBwaW5nIG9mIGNvbnRlbnQgdHlwZXMgdG8gSUJ1aWxkZXJEZWxlZ2F0ZSBpbnN0YW5jZXMKLQlwcml2YXRlIE1hcCBmRGVsZWdhdGVNYXAgPSBudWxsOwotCi0JLy8gYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnRzIGZvciBvdXIgZXh0ZW5zaW9uIHBvaW50Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmUGFydGljaXBhbnRFbGVtZW50czsKLQotCS8vIGEgbWFwcGluZyBvZiBjb250ZW50IHR5cGVzIHRvIElCdWlsZGVyUGFydGljaXBhbnQgaW5zdGFuY2VzCi0JcHJpdmF0ZSBNYXAgZlBhcnRpY2lwYW50TWFwID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIFBBUlRJQ0lQQU5UX0VYVEVOU0lPTl9QT0lOVF9JRCA9IFNTRUNvcmVQbHVnaW4uSUQgKyAiLmJ1aWxkZXJwYXJ0aWNpcGFudCI7IC8vJE5PTi1OTFMtMSQKLQotCUJ1aWxkZXJQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQnVpbGRlckRlbGVnYXRlW10gZ2V0QnVpbGRlckRlbGVnYXRlcyhPYmplY3QgY29udGVudFR5cGVJRCkgewotCQlpZiAoZkRlbGVnYXRlRWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJSUJ1aWxkZXJEZWxlZ2F0ZVtdIGRlbGVnYXRlcyA9IChJQnVpbGRlckRlbGVnYXRlW10pIGZEZWxlZ2F0ZU1hcC5nZXQoY29udGVudFR5cGVJRCk7Ci0JCWlmIChkZWxlZ2F0ZXMgPT0gbnVsbCkgewotCQkJLy8gZmluZSB0aGUgcmVsZXZhbnQgZXh0ZW5zaW9ucwotCQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBkZWxlZ2F0ZUVsZW1lbnRzID0gZkRlbGVnYXRlRWxlbWVudHM7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRlbGVnYXRlRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlTdHJpbmcgY29udGVudFR5cGVzID0gZGVsZWdhdGVFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoQVRUX0NPTlRFTlRfVFlQRSk7Ci0JCQkJU3RyaW5nW10gY29udGVudFR5cGUgPSBTdHJpbmdVdGlscy51bnBhY2soY29udGVudFR5cGVzKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGNvbnRlbnRUeXBlLmxlbmd0aDsgaysrKSB7Ci0JCQkJCS8vIGFsbG93IHdpbGRjYXJkcyB0byBiZSByZXR1cm5lZCBhcyB3ZWxsCi0JCQkJCWlmIChjb250ZW50VHlwZVtrXS5lcXVhbHMoY29udGVudFR5cGVJRCkpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZChkZWxlZ2F0ZUVsZW1lbnRzW2pdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGluc3RhbnRpYXRlIGFuZCBzYXZlIHRoZW0KLQkJCUxpc3QgZGVsZWdhdGVMaXN0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5zaXplKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCUlCdWlsZGVyRGVsZWdhdGUgZGVsZWdhdGUgPSAoSUJ1aWxkZXJEZWxlZ2F0ZSkgKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnRzLmdldChpKSkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQkJCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJCQkJZGVsZWdhdGVMaXN0LmFkZChkZWxlZ2F0ZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIGNyZWF0aW5nIGJ1aWxkZXIgcGFydGljaXBhbnQgZm9yICIgKyBjb250ZW50VHlwZUlELCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWRlbGVnYXRlcyA9IChJQnVpbGRlckRlbGVnYXRlW10pIGRlbGVnYXRlTGlzdC50b0FycmF5KG5ldyBJQnVpbGRlckRlbGVnYXRlWzBdKTsKLQkJCWZEZWxlZ2F0ZU1hcC5wdXQoY29udGVudFR5cGVJRCwgZGVsZWdhdGVzKTsKLQkJCWlmIChfZGVidWdSZWFkZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZWQgIiArIGRlbGVnYXRlcy5sZW5ndGggKyAiIGJ1aWxkIHBhcnRpY2lwYW50cyBmb3IgIiArIGNvbnRlbnRUeXBlSUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGVzOwotCX0KLQotCXB1YmxpYyBJQnVpbGRlclBhcnRpY2lwYW50W10gZ2V0QnVpbGRQYXJ0aWNpcGFudHMoT2JqZWN0IGNvbnRlbnRUeXBlSUQpIHsKLQkJaWYgKGZQYXJ0aWNpcGFudEVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCUlCdWlsZGVyUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSAoSUJ1aWxkZXJQYXJ0aWNpcGFudFtdKSBmUGFydGljaXBhbnRNYXAuZ2V0KGNvbnRlbnRUeXBlSUQpOwotCQlpZiAocGFydGljaXBhbnRzID09IG51bGwpIHsKLQkJCS8vIGZpbmUgdGhlIHJlbGV2YW50IGV4dGVuc2lvbnMKLQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcGFydGljaXBhbnRFbGVtZW50cyA9IGZQYXJ0aWNpcGFudEVsZW1lbnRzOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJ0aWNpcGFudEVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3RyaW5nIHBhcnRpY2lwYW50Q29udGVudFR5cGVzID0gcGFydGljaXBhbnRFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoQVRUX0NPTlRFTlRfVFlQRSk7Ci0JCQkJU3RyaW5nW10gcGFydGljaXBhbnRDb250ZW50VHlwZSA9IFN0cmluZ1V0aWxzLnVucGFjayhwYXJ0aWNpcGFudENvbnRlbnRUeXBlcyk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBwYXJ0aWNpcGFudENvbnRlbnRUeXBlLmxlbmd0aDsgaysrKSB7Ci0JCQkJCS8vIGFsbG93IHdpbGRjYXJkcyB0byBiZSByZXR1cm5lZCBhcyB3ZWxsCi0JCQkJCWlmIChwYXJ0aWNpcGFudENvbnRlbnRUeXBlW2tdLmVxdWFscyhjb250ZW50VHlwZUlEKSB8fCBDT05URU5UVFlQRV9XSUxEQ0FSRC5lcXVhbHMocGFydGljaXBhbnRDb250ZW50VHlwZVtrXSkpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZChwYXJ0aWNpcGFudEVsZW1lbnRzW2pdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGluc3RhbnRpYXRlIGFuZCBzYXZlIHRoZW0KLQkJCUxpc3QgcGFydGljaXBhbnRzTGlzdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMuc2l6ZSgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlJQnVpbGRlclBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gKElCdWlsZGVyUGFydGljaXBhbnQpICgoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbGVtZW50cy5nZXQoaSkpLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLQkJCQkJaWYgKHBhcnRpY2lwYW50ICE9IG51bGwpIHsKLQkJCQkJCXBhcnRpY2lwYW50c0xpc3QuYWRkKHBhcnRpY2lwYW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gY3JlYXRpbmcgYnVpbGRlciBwYXJ0aWNpcGFudCBmb3IgIiArIGNvbnRlbnRUeXBlSUQsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcGFydGljaXBhbnRzID0gKElCdWlsZGVyUGFydGljaXBhbnRbXSkgcGFydGljaXBhbnRzTGlzdC50b0FycmF5KG5ldyBJQnVpbGRlclBhcnRpY2lwYW50WzBdKTsKLQkJCWZQYXJ0aWNpcGFudE1hcC5wdXQoY29udGVudFR5cGVJRCwgcGFydGljaXBhbnRzKTsKLQkJCWlmIChfZGVidWdSZWFkZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZWQgIiArIHBhcnRpY2lwYW50cy5sZW5ndGggKyAiIGJ1aWxkIHBhcnRpY2lwYW50cyBmb3IgIiArIGNvbnRlbnRUeXBlSUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFydGljaXBhbnRzOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCWZQYXJ0aWNpcGFudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZEZWxlZ2F0ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIEp1c3QgcmVtZW1iZXIgdGhlIGVsZW1lbnRzLCBzbyBwbHVnaW5zIGRvbid0IGhhdmUgdG8gYmUgYWN0aXZhdGVkLAotCQkvLyB1bmxlc3MgZXh0ZW5zaW9uIGF0dHJpYnV0ZXMgbWF0Y2ggdGhvc2Ugb2YgaW50ZXJlc3QKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChQQVJUSUNJUEFOVF9FWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJZlBhcnRpY2lwYW50RWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJfQotCQlwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoREVMRUdBVEVfRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCWZEZWxlZ2F0ZUVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2J1aWxkZXIvU3RydWN0dXJlZERvY3VtZW50QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9idWlsZGVyL1N0cnVjdHVyZWREb2N1bWVudEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRjZDBlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2J1aWxkZXIvU3RydWN0dXJlZERvY3VtZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuYnVpbGRlci5JQnVpbGRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnByZWZlcmVuY2VzLkNvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50QnVpbGRlciBleHRlbmRzIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIgaW1wbGVtZW50cyBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnQnVpbGRlciA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGRlciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z0J1aWxkZXJDb250ZW50VHlwZURldGVjdGlvbiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGRlci9kZXRlY3Rpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdCdWlsZGVyUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGRlci90aW1lIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZvcm1WYWxpZGF0ZUVkaXQgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNHbG9iYWxseUVuYWJsZWQgPSB0cnVlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPRkYgPSAib2ZmIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Jlc291cmNlY2hhbmdlaGFuZGxpbmciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBQcm9qZWN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlpbnQgcmVzb3VyY2VUeXBlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWRlbHRhLmFjY2VwdCh0aGlzKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbWFuYWdpbmcgYnVpbGRzcGVjIGxpc3QiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUk9PVCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQpIHsKLQkJCQkJCWlmIChfZGVidWdSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9qZWN0ICIgKyBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSArICIgYWRkZWQgdG8gd29ya3NwYWNlIGFuZCByZWdpc3RlcmluZyB3aXRoIFNETUIiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJYWRkKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIChJUHJvamVjdCkgcmVzb3VyY2UsIG51bGwpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgewotCQlTdHJpbmcgYnVpbGQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1NFQ29yZVBsdWdpbi5TVFJVQ1RVUkVEX0JVSUxERVIpOwotCQlpc0dsb2JhbGx5RW5hYmxlZCA9IChidWlsZCA9PSBudWxsIHx8ICFidWlsZC5lcXVhbHNJZ25vcmVDYXNlKE9GRikpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgU3RydWN0dXJlZEJ1aWxkZXIgdG8gdGhlIGJ1aWxkIHNwZWMgb2YgYSBzaW5nbGUgSVByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCAtCi0JICogICAgICAgICAgICB0aGUgSVByb2plY3QgdG8gYWRkIHRvLCB3aGVuIG5lZWRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBPYmplY3QgdmFsaWRhdGVFZGl0Q29udGV4dCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBpc0J1aWxkZXJQcmVzZW50ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJRmlsZSBkZXNjcmlwdGlvbkZpbGUgPSBwcm9qZWN0LmdldEZpbGUoSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpOwotCQkJaWYgKGRlc2NyaXB0aW9uRmlsZS5leGlzdHMoKSAmJiBkZXNjcmlwdGlvbkZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJCQlpZiAoY29tbWFuZHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgYnVpbGRlck5hbWUgPSBjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpOwotCQkJCQkJLy8gYnVpbGRlciBuYW1lIHdpbGwgYmUgbnVsbCBpZiBpdCBoYXMgbm90IGJlZW4gc2V0Ci0JCQkJCQlpZiAoYnVpbGRlck5hbWUgIT0gbnVsbCAmJiBidWlsZGVyTmFtZS5lcXVhbHMoZ2V0QnVpbGRlcklkKCkpKSB7Ci0JCQkJCQkJaXNCdWlsZGVyUHJlc2VudCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFpc0J1aWxkZXJQcmVzZW50ICYmICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkvLyB2YWxpZGF0ZSBmb3IgZWRpdAotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQkJCWlmIChwZXJmb3JtVmFsaWRhdGVFZGl0KSB7Ci0JCQkJCQlJU2NoZWR1bGluZ1J1bGUgdmFsaWRhdGVFZGl0UnVsZSA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChfZGVidWdCdWlsZGVyKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXR0ZW1wdGluZyB2YWxpZGF0ZUVkaXQgZm9yICIgKyBkZXNjcmlwdGlvbkZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlJRmlsZVtdIHZhbGlkYXRlRmlsZXMgPSBuZXcgSUZpbGVbXXtkZXNjcmlwdGlvbkZpbGV9OwotCQkJCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gZGVzY3JpcHRpb25GaWxlLmdldFdvcmtzcGFjZSgpOwotCQkJCQkJCXZhbGlkYXRlRWRpdFJ1bGUgPSB3b3Jrc3BhY2UuZ2V0UnVsZUZhY3RvcnkoKS52YWxpZGF0ZUVkaXRSdWxlKHZhbGlkYXRlRmlsZXMpOwotCQkJCQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5iZWdpblJ1bGUodmFsaWRhdGVFZGl0UnVsZSwgbW9uaXRvcik7Ci0JCQkJCQkJc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlRWRpdCh2YWxpZGF0ZUZpbGVzLCBudWxsKTsKLQkJCQkJCQlpZiAoX2RlYnVnQnVpbGRlcikgewotCQkJCQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJWYWxpZGF0ZUVkaXQgY29tcGxldGVkIGZvciAiICsgZGVzY3JpcHRpb25GaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVmFsaWRhdGVFZGl0IGZhaWxlZCBmb3IgIiArIGRlc2NyaXB0aW9uRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgKyAiICIgKyBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCWlmICh2YWxpZGF0ZUVkaXRSdWxlICE9IG51bGwpIHsKLQkJCQkJCQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmVuZFJ1bGUodmFsaWRhdGVFZGl0UnVsZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkvLyBhZGQgdGhlIGJ1aWxkZXIKLQkJCQkJCUlDb21tYW5kIG5ld0NvbW1hbmQgPSBkZXNjcmlwdGlvbi5uZXdDb21tYW5kKCk7Ci0JCQkJCQluZXdDb21tYW5kLnNldEJ1aWxkZXJOYW1lKGdldEJ1aWxkZXJJZCgpKTsKLQkJCQkJCUlDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBudWxsOwotCQkJCQkJaWYgKGNvbW1hbmRzICE9IG51bGwpIHsKLQkJCQkJCQluZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtjb21tYW5kcy5sZW5ndGggKyAxXTsKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbW1hbmRzLCAwLCBuZXdDb21tYW5kcywgMCwgY29tbWFuZHMubGVuZ3RoKTsKLQkJCQkJCQluZXdDb21tYW5kc1tjb21tYW5kcy5sZW5ndGhdID0gbmV3Q29tbWFuZDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW5ld0NvbW1hbmRzID0gbmV3IElDb21tYW5kWzFdOwotCQkJCQkJCW5ld0NvbW1hbmRzWzBdID0gbmV3Q29tbWFuZDsKLQkJCQkJCX0KLQkJCQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0JCQkJCQkvKgotCQkJCQkJICogVGhpcyAncmVmcmVzaCcgd2FzIGFkZGVkIHNpbmNlIHVuaXQgdGVzdHMgd2VyZQotCQkJCQkJICogdGhyb3dpbmcgZXhjZXB0aW9ucyBhYm91dCBiZWluZyBvdXQgb2Ygc3luYy4gVGhhdAotCQkJCQkJICogbWF5IGluZGljYXRlIGEgImRlZXBlciIgcHJvYmxlbSBzdWNoIGFzIG5lZWRpbmcgdG8KLQkJCQkJCSAqIHVzZSBzY2hlZHVsaW5nIHJ1bGVzLCAoYWx0aG91Z2ggdGhlcmUgZG9uJ3QgYXBwZWFyCi0JCQkJCQkgKiB0byBiZSBleGFtcGxlcyBvZiB0aGF0KSBvciBzb21ldGhpbmcgc2ltaWxhci4KLQkJCQkJCSAqLwotCQkJCQkJLy8gcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sCi0JCQkJCQkvLyBzdWJNb25pdG9yRm9yKG1vbml0b3IsIDEsCi0JCQkJCQkvLyBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgc3ViTW9uaXRvckZvcihtb25pdG9yLCAxLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlpZiAoX2RlYnVnQnVpbGRlcikgewotCQkJCQkJCQlpZiAocGVyZm9ybVZhbGlkYXRlRWRpdCkgewotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZXNjcmlwdGlvbiBmb3IgcHJvamVjdCBcIiIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJcIiBjb3VsZCBub3QgYmUgdXBkYXRlZCBkZXNwaXRlIHN1Y2Nlc3NmdWwgdmFsaWRhdGVFZGl0Iik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlc2NyaXB0aW9uIGZvciBwcm9qZWN0IFwiIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIlwiIGNvdWxkIG5vdCBiZSB1cGRhdGVkIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHBlcmZvcm1WYWxpZGF0ZUVkaXQpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkRlc2NyaXB0aW9uIGZvciBwcm9qZWN0IFwiIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIlwiIGNvdWxkIG5vdCBiZSB1cGRhdGVkIGRlc3BpdGUgc3VjY2Vzc2Z1bCB2YWxpZGF0ZUVkaXQiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkRlc2NyaXB0aW9uIGZvciBwcm9qZWN0IFwiIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIlwiIGNvdWxkIG5vdCBiZSB1cGRhdGVkIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoX2RlYnVnQnVpbGRlcikgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlc2NyaXB0aW9uIGZvciBwcm9qZWN0IFwiIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIlwiIGNvdWxkIG5vdCBiZSB1cGRhdGVkIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJEZXNjcmlwdGlvbiBmb3IgcHJvamVjdCBcIiIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJcIiBjb3VsZCBub3QgYmUgdXBkYXRlZCIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWYgd2UgY2FuJ3QgcmVhZCB0aGUgaW5mb3JtYXRpb24sIHRoZSBwcm9qZWN0IGlzbid0IG9wZW4sCi0JCQkvLyBzbyBpdCBjYW4ndCBydW4gYXV0by12YWxpZGF0ZQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIGNhdWdodCB3aGVuIGFkZGluZyBNb2RlbCBCdWlsZGVyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIFN0cnVjdHVyZWRCdWlsZGVyIHRvIGV2ZXJ5IHByb2plY3QgaW4gdGhlIFdvcmtzcGFjZQotCSAqIAotCSAqIEBwYXJhbSByb290Ci0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBhZGQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJV29ya3NwYWNlUm9vdCByb290LCBPYmplY3QgdmFsaWRhdGVFZGl0Q29udGV4dCkgewotCQlpZiAoIWlzR2xvYmFsbHlFbmFibGVkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLQkJSVByb2dyZXNzTW9uaXRvciBsb2NhbE1vbml0b3IgPSBzdWJNb25pdG9yRm9yKG1vbml0b3IsIGFsbFByb2plY3RzLmxlbmd0aCk7Ci0JCWxvY2FsTW9uaXRvci5iZWdpblRhc2soU1NFQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVN0cnVjdHVyZWREb2N1bWVudEJ1aWxkZXIuMCIpLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFByb2plY3RzLmxlbmd0aCAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCk7IGkrKykgewotCQkJYWRkKGxvY2FsTW9uaXRvciwgYWxsUHJvamVjdHNbaV0sIHZhbGlkYXRlRWRpdENvbnRleHQpOwotCQkJbG9jYWxNb25pdG9yLndvcmtlZCgxKTsKLQkJfQotCQlsb2NhbE1vbml0b3IuZG9uZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRCdWlsZGVySWQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnN0cnVjdHVyZWRidWlsZGVyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcywgaW50IHN0eWxlKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzLCBzdHlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZkFjdGl2ZURlbGVnYXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5hbWUgPSAiU3RydWN0dXJlZCBEb2N1bWVudCBCdWlsZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBCdWlsZGVyUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlciByZWdpc3RyeSA9IG51bGw7Ci0KLQlwcml2YXRlIGxvbmcgdGltZTA7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCQlpZiAoaXNHbG9iYWxseUVuYWJsZWQpIHsKLQkJCXJlZ2lzdHJ5ID0gbmV3IEJ1aWxkZXJQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCQlmQWN0aXZlRGVsZWdhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmV2ZW50cy5JbnRlcm5hbEJ1aWxkZXIjYnVpbGQoaW50LAotCSAqICAgICAgamF2YS51dGlsLk1hcCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElQcm9qZWN0W10gYnVpbGQoaW50IGtpbmQsIE1hcCBhcmdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgY3VycmVudFByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCS8vIEN1cnJlbnRseSwganVzdCB1c2UgdGhlIFRhc2sgVGFncyBwcmVmZXJlbmNlCi0JCWJvb2xlYW4gbG9jYWxseUVuYWJsZWQgPSBpc0dsb2JhbGx5RW5hYmxlZCAmJiBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFTS19UQUdfRU5BQkxFKTsKLQkJaWYgKCFsb2NhbGx5RW5hYmxlZCB8fCBjdXJyZW50UHJvamVjdCA9PSBudWxsIHx8ICFjdXJyZW50UHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJaWYgKF9kZWJ1Z0J1aWxkZXJQZXJmIHx8IF9kZWJ1Z0J1aWxkZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNraXBwaW5nIGJ1aWxkIG9mICIgKyBjdXJyZW50UHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbmV3IElQcm9qZWN0W117Y3VycmVudFByb2plY3R9OwotCQl9Ci0KLQkJaWYgKF9kZWJ1Z0J1aWxkZXJQZXJmIHx8IF9kZWJ1Z0J1aWxkZXIpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBnZXREZWx0YShjdXJyZW50UHJvamVjdCk7Ci0JCUlQcm9ncmVzc01vbml0b3IgbG9jYWxNb25pdG9yID0gc3ViTW9uaXRvckZvcihtb25pdG9yLCAxKTsKLQkJbG9jYWxNb25pdG9yLmJlZ2luVGFzayhnZXREaXNwbGF5TmFtZSgpLCAxKTsKLQotCQlpZiAoIWxvY2FsTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCS8vIGNoZWNrIHRoZSBraW5kIG9mIGRlbHRhIGlmIG9uZSB3YXMgZ2l2ZW4KLQkJCWlmIChraW5kID09IEZVTExfQlVJTEQgfHwga2luZCA9PSBDTEVBTl9CVUlMRCB8fCBkZWx0YSA9PSBudWxsKSB7Ci0JCQkJZG9GdWxsQnVpbGQoa2luZCwgYXJncywgbG9jYWxNb25pdG9yLCBnZXRQcm9qZWN0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZG9JbmNyZW1lbnRhbEJ1aWxkKGtpbmQsIGFyZ3MsIGxvY2FsTW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQkJbG9jYWxNb25pdG9yLndvcmtlZCgxKTsKLQkJc2h1dGRvd25EZWxlZ2F0ZXMoKTsKLQkJbG9jYWxNb25pdG9yLmRvbmUoKTsKLQkJaWYgKF9kZWJ1Z0J1aWxkZXJQZXJmIHx8IF9kZWJ1Z0J1aWxkZXIpIHsKLQkJCWlmIChraW5kID09IEZVTExfQlVJTEQgfHwgZGVsdGEgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQgRlVMTCBidWlsZCBvZiAiICsgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICIgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQgSU5DUkVNRU5UQUwvQ0xFQU4vQVVUTyBidWlsZCBvZiAiICsgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICIgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IElQcm9qZWN0W117Z2V0UHJvamVjdCgpfTsKLQl9Ci0KLQl2b2lkIGJ1aWxkKGludCBraW5kLCBNYXAgYXJncywgSVJlc291cmNlIHJlc291cmNlLCBJQ29udGVudFR5cGVbXSB0eXBlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQlJQnVpbGRlckRlbGVnYXRlW10gZGVsZWdhdGVzID0gbnVsbDsKLQkJCUxpc3QgYWxsRGVsZWdhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCUlCdWlsZGVyRGVsZWdhdGVbXSB0eXBlRGVsZWdhdGVzID0gcmVnaXN0cnkuZ2V0QnVpbGRlckRlbGVnYXRlcyh0eXBlc1tpXS5nZXRJZCgpKTsKLQkJCQlpZiAodHlwZURlbGVnYXRlcyAhPSBudWxsICYmIHR5cGVEZWxlZ2F0ZXMubGVuZ3RoID4gMCkgewotCQkJCQlhbGxEZWxlZ2F0ZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodHlwZURlbGVnYXRlcykpOwotCQkJCX0KLQkJCX0KLQkJCWRlbGVnYXRlcyA9IChJQnVpbGRlckRlbGVnYXRlW10pIGFsbERlbGVnYXRlcy50b0FycmF5KG5ldyBJQnVpbGRlckRlbGVnYXRlWzBdKTsKLQkJCWZvciAoaW50IGogPSAwOyBkZWxlZ2F0ZXMgIT0gbnVsbCAmJiBqIDwgZGVsZWdhdGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKGtpbmQgIT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCkgewotCQkJCQltb25pdG9yLnN1YlRhc2soZ2V0RGlzcGxheU5hbWUoKSArICIgYnVpbGRpbmcgIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCWlmICghZkFjdGl2ZURlbGVnYXRlcy5jb250YWlucyhkZWxlZ2F0ZXNbal0pICYmICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJZGVsZWdhdGVzW2pdLnN0YXJ0dXAoZ2V0UHJvamVjdCgpLCBraW5kLCBhcmdzKTsKLQkJCQkJCWZBY3RpdmVEZWxlZ2F0ZXMuYWRkKGRlbGVnYXRlc1tqXSk7Ci0JCQkJCX0KLQkJCQkJZGVsZWdhdGVzW2pdLmJ1aWxkKChJRmlsZSkgcmVzb3VyY2UsIGtpbmQsIGFyZ3MsIHN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciNjbGVhbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKF9kZWJ1Z0J1aWxkZXJQZXJmIHx8IF9kZWJ1Z0J1aWxkZXIpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJc3VwZXIuY2xlYW4obW9uaXRvcik7Ci0JCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAoIWlzR2xvYmFsbHlFbmFibGVkIHx8IGN1cnJlbnRQcm9qZWN0ID09IG51bGwgfHwgIWN1cnJlbnRQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZG9GdWxsQnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IEhhc2hNYXAoMCksIG1vbml0b3IsIGdldFByb2plY3QoKSk7Ci0JCWlmIChfZGVidWdCdWlsZGVyUGVyZiB8fCBfZGVidWdCdWlsZGVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIENMRUFOIGJ1aWxkIG9mICIgKyBjdXJyZW50UHJvamVjdC5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyAiIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlJQ29udGVudFR5cGVbXSBkZXRlY3RDb250ZW50VHlwZXMoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gb3B0aW1pemVkIGRlc2NyaXB0aW9uIGxvb2t1cCwgbWlnaHQgbm90IHN1Y2NlZWQKLQkJCQlkID0gKChJRmlsZSkgcmVzb3VyY2UpLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJdHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW117ZC5nZXRDb250ZW50VHlwZSgpfTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBnaXZlbiB0aGUgYWNjZXNzaWJsZSBhbmQgZmlsZSB0eXBlCi0JCQkJLy8gY2hlY2sgYWJvdmUKLQkJCX0KLQkJCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0JCQkJdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlpZiAoX2RlYnVnQnVpbGRlckNvbnRlbnRUeXBlRGV0ZWN0aW9uKSB7Ci0JCQkJaWYgKHR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJaWYgKHR5cGVzLmxlbmd0aCA+IDEpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpICsgIjogIiArICJtdWx0aXBsZSBiYXNlZCBvbiBuYW1lIChwcm9iYWJseSBoaWVyYXJjaGljYWwpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpICsgIiBtYXRjaGVkOiAiICsgdHlwZXNbaV0uZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHJlc291cmNlcyBhbmQgYnVpbGQgZWFjaCBvbmUKLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0Z1bGxCdWlsZChpbnQga2luZCwgTWFwIGFyZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoX2RlYnVnQnVpbGRlcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBidWlsZGluZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZpbmFsIElQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IHN1Yk1vbml0b3JGb3IobW9uaXRvciwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJZmluYWwgaW50IGxvY2FsS2luZCA9IGtpbmQ7Ci0JCWZpbmFsIE1hcCBsb2NhbEFyZ3MgPSBhcmdzOwotCi0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgdmlzaXRvck1vbml0b3IgPSBtb25pdG9yOwotCQlJUmVzb3VyY2VWaXNpdG9yIGludGVybmFsQnVpbGRlciA9IG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQkvLyBmb3IgYW55IHN1cHBvcnRlZCBmaWxlIHR5cGUsIHJlY29yZCB0aGUgcmVzb3VyY2UKLQkJCQkJSUNvbnRlbnRUeXBlW10gY29udGVudFR5cGVzID0gZGV0ZWN0Q29udGVudFR5cGVzKHJlc291cmNlKTsKLQkJCQkJaWYgKGNvbnRlbnRUeXBlcyAhPSBudWxsKSB7Ci0JCQkJCQlidWlsZChsb2NhbEtpbmQsIGxvY2FsQXJncywgcmVzb3VyY2UsIGNvbnRlbnRUeXBlcywgc3ViTW9uaXRvcik7Ci0JCQkJCQl2aXNpdG9yTW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCXRyeSB7Ci0JCQlwcm9qZWN0LmFjY2VwdChpbnRlcm5hbEJ1aWxkZXIpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luY3JlbWVudGFsQnVpbGQoaW50IGtpbmQsIE1hcCBhcmdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhID0gZ2V0RGVsdGEoZ2V0UHJvamVjdCgpKTsKLQkJaWYgKHByb2plY3REZWx0YSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZWx0YSBpcyBudWxsLCBzaG91bGQgZG8gYSBmdWxsIGJ1aWxkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoX2RlYnVnQnVpbGRlcikgewotCQkJaWYgKHByb2plY3REZWx0YSAhPSBudWxsICYmIHByb2plY3REZWx0YS5nZXRSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGJ1aWxkaW5nICIgKyBwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBidWlsZGluZyBwcm9qZWN0ICIgKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJZmluYWwgTWFwIGxvY2FsQXJncyA9IGFyZ3M7Ci0JCWZpbmFsIGludCBsb2NhbEtpbmQgPSBraW5kOwotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIGxvY2FsTW9uaXRvciA9IHN1Yk1vbml0b3JGb3IobW9uaXRvciwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCQlJUmVzb3VyY2VEZWx0YVZpc2l0b3IgcGFydGljaXBhbnRWaXNpdG9yID0gbmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJaWYgKCFsb2NhbE1vbml0b3IuaXNDYW5jZWxlZCgpICYmIGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCUlDb250ZW50VHlwZVtdIGNvbnRlbnRUeXBlcyA9IGRldGVjdENvbnRlbnRUeXBlcyhkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJaWYgKGNvbnRlbnRUeXBlcyAhPSBudWxsKQotCQkJCQkJYnVpbGQobG9jYWxLaW5kLCBsb2NhbEFyZ3MsIGRlbHRhLmdldFJlc291cmNlKCksIGNvbnRlbnRUeXBlcywgbG9jYWxNb25pdG9yKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGggPiAwOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJcHJvamVjdERlbHRhLmFjY2VwdChwYXJ0aWNpcGFudFZpc2l0b3IpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJZk5hbWUgPSBjb25maWcuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TGFiZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzaHV0ZG93bkRlbGVnYXRlcygpIHsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBmQWN0aXZlRGVsZWdhdGVzLnNpemUoKTsgaisrKSB7Ci0JCQl0cnkgewotCQkJCSgoSUJ1aWxkZXJEZWxlZ2F0ZSkgZkFjdGl2ZURlbGVnYXRlcy5nZXQoaikpLnNodXRkb3duKGdldFByb2plY3QoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCWZBY3RpdmVEZWxlZ2F0ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCX0KLQotCS8vIG1ha2UgcHJpdmF0ZSBpZiBldmVyIHVzZWQgYWdhaW4KLQl2b2lkIGRvVGFza1RhZ1Byb2Nlc3NpbmcoKSB7Ci0JCS8vIE11c3QgbWFrZSBzdXJlIHRoZSBidWlsZGVyIGlzIHJlZ2lzdGVyZWQgZm9yIHByb2plY3RzIHdoaWNoIG1heQotCQkvLyBoYXZlIGJlZW4gY3JlYXRlZCBiZWZvcmUgdGhpcyBwbHVnaW4gd2FzIGFjdGl2YXRlZC4KLQkJSm9iIGFkZGVyID0gbmV3IFdvcmtzcGFjZUpvYihTU0VDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlTW9kZWxQbHVnaW4uMCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWFkZChtb25pdG9yLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBudWxsKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJYWRkZXIuc2V0U3lzdGVtKHRydWUpOwotCQkvLyB1c2UgU0hPUlQsIHNpbmNlIG9uY2UgZXhlY3V0aW5nLCB0aGlzIGpvYiBzaG91bGQgYmUgcXVpY2sKLQkJYWRkZXIuc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsKLQkJLy8gc2luY2Ugd2UgaGF2ZSBwb3RlbnRpYWwgdG8gY2hhbmdlIHNldmVyYWwgLnByb2plY3QgZmlsZXMsCi0JCS8vIHdlIHNob3VsZCB3YWl0IHVudGlsIHdlIGNhbiBnZXQgZXhjbHVzaXZlIGFjY2VzcyB0bwotCQkvLyB3aG9sZSB3b3Jrc3BhY2UuCi0JCS8vIFRPRE86IGZ1dHVyZSByZS1kZXNpZ24gc2hvdWxkIG5vdCByZXF1aXJlIHRoaXMuCi0JCWFkZGVyLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCWFkZGVyLnNjaGVkdWxlKCk7Ci0KLQkJLy8gUmVnaXN0ZXIgdGhlIFByb2plY3RDaGFuZ2VMaXN0ZW5lciBzbyB0aGF0IGl0IGNhbiBhZGQgdGhlCi0JCS8vIGJ1aWxkZXIKLQkJLy8gdG8gcHJvamVjdHMgYXMgbmVlZGVkCi0JCWNoYW5nZUxpc3RlbmVyID0gbmV3IFByb2plY3RDaGFuZ2VMaXN0ZW5lcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IGZvciB1c2UgYnkgTW9kZWxQbHVnaW4gY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JfQotCi0JLyoqCi0JICogT25seSBmb3IgdXNlIGJ5IE1vZGVsUGx1Z2luIGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCS8vIFRPRE86ZGlzYWJsZWQgZm9yIG5vdwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTnVsbFN0cnVjdHVyZWREb2N1bWVudFBhcnRpdGlvbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L051bGxTdHJ1Y3R1cmVkRG9jdW1lbnRQYXJ0aXRpb25lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWEyMmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTnVsbFN0cnVjdHVyZWREb2N1bWVudFBhcnRpdGlvbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFJlZ2lvbjsKLQotLyoqCi0gKiBUbyBiZSB1c2VkIHdoZW4gbm8ga25vd24gcGFydGl0aW9uZXIgaXMgYXZhaWxhYmxlLiBBbHdheXMgcmV0dXJucyB0aGUKLSAqIHVua25vd24gdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIE51bGxTdHJ1Y3R1cmVkRG9jdW1lbnRQYXJ0aXRpb25lciBpbXBsZW1lbnRzIElEb2N1bWVudFBhcnRpdGlvbmVyIHsKLQotCXB1YmxpYyBjbGFzcyBOdWxsU3RydWN0dXJlZFR5cGVkUmVnaW9uIGltcGxlbWVudHMgSVR5cGVkUmVnaW9uIHsKLQotCQlwcml2YXRlIGludCBmTGVuZ3RoOwotCi0JCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gZkxlbmd0aDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQkJcmV0dXJuIGZPZmZzZXQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gZlR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkgewotCQkJZkxlbmd0aCA9IGxlbmd0aDsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCQlmVHlwZSA9IHR5cGU7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUX1VOS05PV05fUEFSVElUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5VTktOT1dOX1BBUlRJVElPTl9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gbGVnYWxUeXBlcyA9IG5ldyBTdHJpbmdbXXtTVF9VTktOT1dOX1BBUlRJVElPTn07Ci0KLQlwdWJsaWMgTnVsbFN0cnVjdHVyZWREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJSVR5cGVkUmVnaW9uW10gYWx3YXlzT25lID0gbmV3IElUeXBlZFJlZ2lvbltde2NyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgU1RfVU5LTk9XTl9QQVJUSVRJT04pfTsKLQkJcmV0dXJuIGFsd2F5c09uZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHVibGljIElUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJSVR5cGVkUmVnaW9uIHJlc3VsdCA9IG5ldyBUeXBlZFJlZ2lvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoaW50IG9mZnNldCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIFNUX1VOS05PV05fUEFSVElUSU9OOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGxlZ2FsVHlwZXM7Ci0JfQotCi0JcHVibGljIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oaW50IG9mZnNldCkgewotCQlyZXR1cm4gY3JlYXRlUGFydGl0aW9uKG9mZnNldCwgMSwgZ2V0RGVmYXVsdCgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIFNUX1VOS05PV05fUEFSVElUSU9OOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0VXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlYzU5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLS8qKgotICogQ29sbGVjdGlvbiBvZiB0ZXh0IGZ1bmN0aW9ucy4KLSAqIAotICogQGRlcHJlY2F0ZWQgLSBtYXJrZWQgYXMgZGVwcmVjYXRlZCB0byByZW1pbmQgdXMgdG8gcGhhc2UgdGhpcyBvdXQgKGFuZC9vcgotICogICAgICAgICAgICAgbW92ZSB0byAiZmluaXNoZWQiIHZlcnNpb24pLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dFV0aWxpdGllcyB7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpZiBwb3NzaWJsZSwgaXRzIGJlc3QgdG8gdXNlCi0JICogICAgICAgICAgICAgSURvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gZmdEZWxpbWl0ZXJzID0gbmV3IFN0cmluZ1tdeyJcbiIsICJcciIsICJcclxuIn07Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoaWNoIG9uZSBvZiBmZ0RlbGltaXRlcnMgYXBwZWFycyBmaXJzdCBpbiB0aGUgdGV4dC4gSWYgbm9uZQotCSAqIG9mIHRoZW0gdGhlIGhpbnQgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0ZXJtaW5lTGluZURlbGltaXRlcihTdHJpbmdCdWZmZXIgdGV4dEJ1ZmZlciwgU3RyaW5nW10gcG9zc2libGVzLCBTdHJpbmcgaGludCkgewotCQl0cnkgewotCQkJLy8gVE9ETzogYXZvaWQgdXNlIG9mIFN0cmluZyBpbnN0YW5jZQotCQkJU3RyaW5nIHRleHQgPSB0ZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQlpbnRbXSBpbmZvID0gaW5kZXhPZihwb3NzaWJsZXMsIHRleHQsIDApOwotCQkJcmV0dXJuIHBvc3NpYmxlc1tpbmZvWzFdXTsKLQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHgpIHsKLQkJfQotCQlyZXR1cm4gaGludDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nIGdyZWF0ZXIgdGhhbiBvZmZzZXQgb2YgdGhlIGxvbmdlc3QKLQkgKiBtYXRjaGluZyBzZWFyY2ggc3RyaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGluZGV4T2YoU3RyaW5nW10gc2VhcmNoU3RyaW5ncywgU3RyaW5nIHRleHQsIGludCBvZmZzZXQpIHsKLQotCQlpbnRbXSByZXN1bHQgPSB7LTEsIC0xfTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWludCBpbmRleCA9IHRleHQuaW5kZXhPZihzZWFyY2hTdHJpbmdzW2ldLCBvZmZzZXQpOwotCQkJaWYgKGluZGV4ID49IDApIHsKLQotCQkJCWlmIChyZXN1bHRbMF0gPT0gLTEpIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfSBlbHNlIGlmIChpbmRleCA8IHJlc3VsdFswXSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4ID09IHJlc3VsdFswXSAmJiBzZWFyY2hTdHJpbmdzW2ldLmxlbmd0aCgpID4gc2VhcmNoU3RyaW5nc1tyZXN1bHRbMV1dLmxlbmd0aCgpKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhYjQzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotCi0vKioKLSAqIFRoZSBlbnRyaWVzIGluIHRoaXMgcmVnaXN0cnkgYXJlLCBjb25jZXB0dWFsbHksIHNpbmdsZXRvbidzIFNpbmNlIG9ubHkgb25lCi0gKiBpbnN0YW5jZSBpcyBjcmVhdGVkIGluIHRoZSByZWdpc3RyeSwgYW5kIHRoZW4gdGhhdCBpbnN0YW5jZSByZXR1cm5lZCB3aGVuCi0gKiByZXF1aXJlZC4KLSAqIAotICogTm90ZSB0aGF0IHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8gJ3JlbW92ZScgbWV0aG9kLCBTaW5jZSB0aGUgcmVnaXN0cnkKLSAqIGl0c2VsZiBpcyByZWFkIGl0IHdoZW4gb25jZSwgZnJvbSB0aGUgcGxhdGZvcm0ncyBwbHVnaW4gcmVnaXN0cnksIGFuZCBpcwotICogbm90IGludGVuZGVkIHRvIGJlIG1vZGlmaWVkIGFmdGVyIHRoYXQuIEEgY2hhbmdlIGluIGFuIGV4dGVuc3Rpb24gaW4gYQotICogcGx1Z2luLnhtbCB3aWxsIG9ubHkgdGFrZSBlZmZlY3Qgd2hlbiB0aGUgd29ya2JlbmNoIGlzIHJlLXN0YXJ0ZWQuCi0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW1iZWRkZWRUeXBlUmVnaXN0cnkgewotCi0JLyoqCi0JICogTWV0aG9kIHRvIHJldHVybiB0aGUgc3BlY2lmaWMgdHlwZSBmb3IgdGhlIHNwZWNpZmljIG1pbWV0eXBlLgotCSAqLwotCXB1YmxpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldFR5cGVGb3IoU3RyaW5nIG1pbWVUeXBlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkNjQyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgc3RhdGljIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaFNldCBoYXNoU2V0ID0gbnVsbDsKLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgcmVnaXN0cnlEZWZhdWx0SGFuZGxlciA9IG51bGw7Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudFR5cGVSZWdpc3RyeSNnZXRUeXBlRm9yKFN0cmluZykKLQkgKi8KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29udGVudFR5cGVSZWdpc3RyeUltcGwuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWhhc2hTZXQgPSBuZXcgSGFzaFNldCgpOwotCQluZXcgRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoaGFzaFNldCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50VHlwZVJlZ2lzdHJ5I2FkZChDb250ZW50VHlwZURlc2NyaXB0aW9uKQotCSAqLwotCXZvaWQgYWRkKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJaGFzaFNldC5hZGQoY29udGVudFR5cGVEZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRUeXBlRm9yKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRSZWdpc3RyeURlZmF1bHQuIFdlIGNhY2hlIHRoZSBkZWZhdWx0IGhhbmRsZXIsIHNpbmNlIGNhbid0Ci0JICogY2hhbmdlIG9uY2UgcGx1Z2luIGRlc2NyaXB0b3JzIGFyZSBsb2FkZWQuCi0JICogCi0JICogQHJldHVybiBFbWJlZGRlZFR5cGVIYW5kbGVyCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldFJlZ2lzdHJ5RGVmYXVsdCgpIHsKLQkJaWYgKHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBoYXNoU2V0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoKHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgJiYgKGl0Lmhhc05leHQoKSkpIHsgLy8gc2FmZQotCQkJCS8vIGNhc3QKLQkJCQkvLyBzaW5jZQotCQkJCS8vICdhZGQnCi0JCQkJLy8gcmVxdWlyZXMKLQkJCQkvLyBFbWJlZGRlZENvbnRlbnRUeXBlRGVzY3JpcHRpb24KLQkJCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGl0ZW0gPSAoRW1iZWRkZWRUeXBlSGFuZGxlcikgaXQubmV4dCgpOwotCQkJCWlmICgoaXRlbSAhPSBudWxsKSAmJiAoaXRlbS5pc0RlZmF1bHQoKSkpIHsKLQkJCQkJcmVnaXN0cnlEZWZhdWx0SGFuZGxlciA9IGl0ZW07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVnaXN0cnlEZWZhdWx0SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgY29udGVudFR5cGVEZXNjcmlwdGlvbiBiYXNlZCBvbiBsaXRlcmFsIGlkLiBJdHMgYmFzaWNhbGx5IGEKLQkgKiAiZmlyc3QgZm91bmQgZmlyc3QgcmV0dXJuZWQiLiBOb3RlIHRoZSBvcmRlciBpcyBmYWlybHkgdW5wcmVkaWN0YWJsZSwKLQkgKiBzbyBub24tdW5pcXVlIGlkcyB3b3VsZCBjYXVzZSBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRUeXBlRm9yKFN0cmluZyBtaW1lVHlwZSkgewotCQkvLyBOb3RlOiB0aGUgcmVhc29uIHdlIGhhdmUgdGhpcyBwcmVjb25kaXRpb24gaXMgdGhhdCB0aGUKLQkJLy8gZGVmYXVsdCBpcyBkaWZmZXJlbnQgaW5zaWRlIHRoZSByZWdpc3RyeSB0aGFuIHdoZW4gY2FsbGVkLAotCQkvLyBmb3IgZXhhbXBsZSwgZnJvbSB0aGUgSlNQTG9hZGVyLiBGb3IgdGhlIEpTUExvYWRlciwgaWYgdGhlcmUKLQkJLy8gaXMgbm8gbWltZXR5cGUsIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBIVE1MLiBIZXJlLCBpZiB0aGVyZSBpcwotCQkvLyBzb21lIG1pbWV0eXBlLCBidXQgaXQgaXMgbm90IHJlY29nbml6ZWQsIHdlIHJldHVybiBhIGRlZmF1bHQKLQkJLy8gZm9yIFhNTC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgdmFyaW91cyB2b2ljZSB4bWwgdHlwZXMsIGV0Yy4KLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBmb3VuZCA9IG51bGw7Ci0JCWlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmb3VuZCA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfSBlbHNlIHsKLQkJCUl0ZXJhdG9yIGl0ID0gaGFzaFNldC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKChmb3VuZCA9PSBudWxsKSAmJiAoaXQuaGFzTmV4dCgpKSkgeyAvLyBzYWZlIGNhc3Qgc2luY2UKLQkJCQkvLyAnYWRkJyByZXF1aXJlcwotCQkJCS8vIEVtYmVkZGVkQ29udGVudFR5cGVEZXNjcmlwdGlvbgotCQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgaXRlbSA9IChFbWJlZGRlZFR5cGVIYW5kbGVyKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChpdGVtICE9IG51bGwpICYmIChpdGVtLmdldFN1cHBvcnRlZE1pbWVUeXBlcygpLmNvbnRhaW5zKG1pbWVUeXBlKSkpIHsKLQkJCQkJZm91bmQgPSBpdGVtOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGZvdW5kID09IG51bGwpIHsKLQkJCWZvdW5kID0gZ2V0UmVnaXN0cnlEZWZhdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIGZvdW5kOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmMxZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuQXNzZXJ0OwotCi0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiZW1iZWRkZWRUeXBlSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHJvdGVjdGVkIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgVEFHX05BTUUgPSAiZW1iZWRkZWRUeXBlSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBFbWJlZGRlZFR5cGVIYW5kbGVyIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCXRyeSB7Ci0JCQkJY29udGVudFR5cGVEZXNjcmlwdGlvbiA9IChFbWJlZGRlZFR5cGVIYW5kbGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24sICJFcnJvciByZWFkaW5nIGNvbnRlbnQgdHlwZSBkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb250ZW50VHlwZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFdlIHNpbXBseSByZXF1aXJlIGFuICdhZGQnIG1ldGhvZCwgb2Ygd2hhdCBldmVyIGl0IGlzIHdlIGFyZSB0byByZWFkCi0JICogaW50bwotCSAqLwotCXZvaWQgcmVhZFJlZ2lzdHJ5KFNldCBzZXQpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkQ29udGVudFR5cGUgPSByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQkJLy8gbnVsbCBjYW4gYmUgcmV0dXJuZWQgaWYgdGhlcmUncyBhbiBlcnJvciByZWFkaW5nIHRoZQotCQkJCS8vIGVsZW1lbnQKLQkJCQlpZiAoZW1iZWRkZWRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJCXNldC5hZGQoZW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4M2FmMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VdGlsaXRpZXM7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IHsKLQlwcml2YXRlIHN0YXRpYyBNb2RlbEhhbmRsZXJSZWdpc3RyeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29udGVudFR5cGVNYW5hZ2VyIGdldENvbnRlbnRUeXBlUmVnaXN0cnkoKSB7Ci0JCUlDb250ZW50VHlwZU1hbmFnZXIgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgTW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGRlZmF1bHRIYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlcigpOwotCi0JLyoKLQkgKiBAc2VlIENvbnRlbnRUeXBlUmVnaXN0cnkjZ2V0VHlwZUZvcihTdHJpbmcpCi0JICovCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbnRlbnRUeXBlUmVnaXN0cnlJbXBsLgotCSAqLwotCXByb3RlY3RlZCBNb2RlbEhhbmRsZXJSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJcmVhZGVyID0gbmV3IE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGRlZmF1bHQgbW9kZWwgaGFuZGxlci4gTm90ZTogd2Ugc3RpbGwgZ28gdGhyb3VnaCB0aGUgcmVnaXN0cnkKLQkgKiB0byBiZSBzdXJlIHRvIGdldCB0aGUgZXhpc3RpbmcgaW5zdGFuY2UsIGJ1dCB0aGVuIHdlIGRvIHJlbWVtYmVyIGl0LCBzbwotCSAqIHN1YnNlcXVlbnQgcmVxdWVzdHMgd2lsbCBiZSBmYXN0ZXIuIFRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHdlIGRvIGNoZWNrCi0JICogdGhlIHdob2xlIGxpc3QsIHRvIGJlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUuCi0JICogIAotCSAqLwotCWZpbmFsIHB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldERlZmF1bHQoKSB7Ci0JCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHJlYWRlci5lbGVtZW50czsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlib29sZWFuIG9mSW50ZXJlc3QgPSByZWFkZXIuaXNFbGVtZW50RGVmYXVsdChlbGVtZW50c1tpXSk7Ci0JCQkJaWYgKG9mSW50ZXJlc3QpIHsKLQkJCQkJLy8gaWYsIGhlcmUgd2l0aGluIHRoZSBzZWFyY2ggbG9vcCB3ZSd2ZSBhbHJlYWR5IGZvdW5kCi0JCQkJCS8vIG9uZSBkZWZhdWx0SGFuZGxlciwgdGhlbiBzb21ldGhpbmcgaXMgd3JvbmchCi0JCQkJCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlkZWZhdWx0SGFuZGxlciA9IHJlYWRlci5nZXRJbnN0YW5jZShlbGVtZW50c1tpXSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSAiUHJvZ3JhbSBvciBjb25maWd1cmF0aW9uIGVycm9yLiBNb3JlIHRoYW4gb25lIGRlZmF1bHQgY29udGVudCBoYW5kbGVyIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIGVycm9yU3RyaW5nKTsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXJyb3JTdHJpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSAiUHJvZ3JhbSBvciBjb25maWd1cmF0aW9uIGVycm9yLiBObyBkZWZhdWx0IGNvbnRlbnQgdHlwZSBoYW5kbGVyIGZvdW5kLiI7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBlcnJvclN0cmluZyk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gYmFzZWQgb24gb3V0Y29tZSBvZiB0aGUKLQkgKiBDb250ZW50VHlwZURlc2NyaXB0aW9uJ3MgY2FuSGFuZGxlKElSZXNvdXJjZSkgbWV0aG9kLgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSBudWxsOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCWJvb2xlYW4gZXhpc3RzID0gaUZpbGUuZXhpc3RzKCk7Ci0JCWlmIChleGlzdHMpIHsKLQkJCS8vIHRyeSB0aGUgb3B0aW1pemVkIG1ldGhvZCBmaXJzdCBhcyB0aGUgZGVzY3JpcHRpb24gbWF5IGJlIGNhY2hlZAotCQkJY29udGVudERlc2NyaXB0aW9uID0gaUZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkvLyB1c2UgdGhlIHByb3ZpZGVkIGRlc2NyaXB0aW9uCi0JCQkJY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdXNlIHRoZSBtb3JlIHRob3JvdWdoIGRpc2NvdmVyeSBtZXRob2QgdG8gZ2V0IGEgZGVzY3JpcHRpb24KLQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGVudHMgPSBpRmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJCQkJY29udGVudERlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoY29udGVudHMsIGlGaWxlLmdldE5hbWUoKSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCWNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdGhpbmcgZnVydGhlciBjYW4gYmUgZG9uZSwgYnV0IHdpbGwgbG9nIGZvciBkZWJ1Z2dpbmcKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkvLyBub3RoaW5nIGNhbiBiZSBkb25lCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB3ZSBjb3VsZG4ndCBnZXQgdGhlIGNvbnRlbnQgdHlwZSBmcm9tIGEgZGVzY3JpcHRpb24sIHRyeSBiYXNpbmcKLQkJLy8gaXQgb24gdGhlIGZpbGVuYW1lCi0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihpRmlsZS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCW1vZGVsSGFuZGxlciA9IGdldEhhbmRsZXJGb3JDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0ZW1wIGhhcmQgY29kaW5nIGZvciBudWxsIGNvbnRlbnQgdHlwZQotCQkJbW9kZWxIYW5kbGVyID0gZ2V0SGFuZGxlckZvcklEKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaGFuZGxlci54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnRlbnRUeXBlUmVnaXN0cnkjYWRkKENvbnRlbnRUeXBlRGVzY3JpcHRpb24pCi0JICovCi0JLy8Jdm9pZCBhZGQoSU1vZGVsSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JLy8JCWFycmF5TGlzdC5hZGQoY29udGVudFR5cGVEZXNjcmlwdGlvbik7Ci0JLy8JfQotCS8qCi0JICogQHNlZSBDb250ZW50VHlwZVJlZ2lzdHJ5I2dldE1vZGVsRm9yKFN0cmluZykKLQkgKi8KLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHNlZSBDb250ZW50VHlwZVJlZ2lzdHJ5I2dldFR5cGVGb3IoU3RyaW5nLCBJbnB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgSU1vZGVsSGFuZGxlciBnZXRIYW5kbGVyRm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGlTdHJlYW0gPSBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0JCUlNb2RlbEhhbmRsZXIgbW9kZWxIYW5kbGVyID0gbnVsbDsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaVN0cmVhbS5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCQkJY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZVJlZ2lzdHJ5KCkuZmluZENvbnRlbnRUeXBlRm9yKFV0aWxpdGllcy5nZXRMaW1pdGVkU3RyZWFtKGlTdHJlYW0pLCBmaWxlbmFtZSk7Ci0JCQl9Ci0JCQkvLyBYWFg6IFJlbW92ZSB3aGVuIHdlIGJ1aWxkIHdpdGggdGhlIGZpeCBmb3IgRWNsaXBzZSBidWcgIzYzNjI1Ci0JCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGZuZmUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaVN0cmVhbSAhPSBudWxsICYmIGlTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQkJCWlTdHJlYW0ucmVzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZVJlZ2lzdHJ5KCkuZmluZENvbnRlbnRUeXBlRm9yKGZpbGVuYW1lKTsKLQkJfQotCQkvLyBpZiBhbGwgZWxzZSBmYWlsZWQsIHRyeSB0byBkZXRlY3Qgc29sZWx5IG9uIGNvbnRlbnRzOyBkb25lIGxhc3QgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGVSZWdpc3RyeSgpLmZpbmRDb250ZW50VHlwZUZvcihVdGlsaXRpZXMuZ2V0TGltaXRlZFN0cmVhbShpU3RyZWFtKSwgbnVsbCk7Ci0JCX0KLQkJbW9kZWxIYW5kbGVyID0gZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQkJcmV0dXJuIG1vZGVsSGFuZGxlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgcmVnaXN0ZXJlZCBtb2RlbEhhbmRsZXJzIGZvciBnaXZlbiBjb250ZW50IHR5cGUuIFRPRE86IGV2ZW50dWFsbHkKLQkgKiBuZWVkIHRvIGxvb2sgYXQgY29udGVudFR5cGUncyBwYXJlbnQgdHlwZXMgdG8gc2VlIGlmIG1vcmUgZ2VuZXJhbCB0eXBlCi0JICogY2FuIGhhbmRsZSAoZS5nLiBpZiB3ZSBnb3QgeHNsIHdoaWNoIHdhcyBhIHN1YnR5cGUgb2YgeG1sKS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3JDb250ZW50VHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQotCQlJTW9kZWxIYW5kbGVyIGZvdW5kID0gbnVsbDsKLQkJLy8gdGVtcCBoYXJkIGNvZGluZyBmb3IgbnVsbCBjb250ZW50IHR5cGUKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZvdW5kID0gZ2V0SGFuZGxlckZvcklEKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaGFuZGxlci54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJLy9TdHJpbmcgYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQgPSBjb250ZW50VHlwZS5nZXRJZCgpOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWFkZXIuZWxlbWVudHM7Ci0JCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIGN1cnJlbnRJZCA9IHJlYWRlci5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChlbGVtZW50c1tpXSk7Ci0JCQkJCUlDb250ZW50VHlwZSBtb2RlbENvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY3VycmVudElkKTsKLQkJCQkJaWYgKGNvbnRlbnRUeXBlLmlzS2luZE9mKG1vZGVsQ29udGVudFR5cGUpKSB7Ci0JCQkJCQlJTW9kZWxIYW5kbGVyIGl0ZW0gPSByZWFkZXIuZ2V0SW5zdGFuY2UoZWxlbWVudHNbaV0pOwotCQkJCQkJZm91bmQgPSBpdGVtOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiVGhlcmUgd2VyZSBubyBNb2RlbCBIYW5kbGVyIGZvdW5kIGluIHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIE1vZGVsSGFuZGxlciBiYXNlZCBvbiBsaXRlcmFsIGNvbnRlbnQgdHlwZSBpZC4gVGhpcyBzaG91bGQKLQkgKiBub3Qgbm9ybWFsbHkgYmUgbmVlZGVkLCBpbiBpcyBpbiBjYXNlcyB3aGVuIGEgbW9kZWwgbmVlZHMgdG8gYmUKLQkgKiBjcmVhdGVkLCBhbmQgdGhlcmUgaXMgbm8gcmVzb3VyY2UuIEl0cyBiYXNpY2FsbHkgYSAiZmlyc3QgZm91bmQgZmlyc3QKLQkgKiByZXR1cm5lZCIuIE5vdGUgdGhlIG9yZGVyIGlzIGZhaXJseSB1bnByZWRpY3RhYmxlLCBzbyBub24tdW5pcXVlIGlkcwotCSAqIHdvdWxkIGNhdXNlIHByb2JsZW1zLCBhbmQgYXJlIG5vdCBjaGVja2VkLgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlyZXR1cm4gZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQkJLy8JCUlNb2RlbEhhbmRsZXIgZm91bmQgPSBudWxsOwotCQkvLwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWFkZXIuZWxlbWVudHM7Ci0JCS8vCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkvLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJLy8JCQkJU3RyaW5nIGN1cnJlbnRJZCA9IHJlYWRlci5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChlbGVtZW50c1tpXSk7Ci0JCS8vCQkJCWlmIChjb250ZW50VHlwZUlkLmVxdWFscyhjdXJyZW50SWQpKSB7Ci0JCS8vCQkJCQlJTW9kZWxIYW5kbGVyIGl0ZW0gPSByZWFkZXIuZ2V0SW5zdGFuY2UoZWxlbWVudHNbaV0pOwotCQkvLwkJCQkJZm91bmQgPSBpdGVtOwotCQkvLwkJCQl9Ci0JCS8vCQkJfQotCQkvLwkJfQotCQkvLwkJZWxzZSB7Ci0JCS8vCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIlRoZXJlIHdlcmUgbm8gTW9kZWwgSGFuZGxlciBmb3VuZAotCQkvLyBpbiByZWdpc3RyeSIpOwotCQkvLwkJfQotCQkvLwkJcmV0dXJuIGZvdW5kOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBNb2RlbEhhbmRsZXIgYmFzZWQgb24gbGl0ZXJhbCBpZC4gSXRzIGJhc2ljYWxseSBhICJmaXJzdAotCSAqIGZvdW5kIGZpcnN0IHJldHVybmVkIi4gTm90ZSB0aGUgb3JkZXIgaXMgZmFpcmx5IHVucHJlZGljdGFibGUsIHNvCi0JICogbm9uLXVuaXF1ZSBpZHMgd291bGQgY2F1c2UgcHJvYmxlbXMsIGFuZCBhcmUgbm90IGNoZWNrZWQuCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3JJRChTdHJpbmcgbW9kZWxJZCkgewotCQlJTW9kZWxIYW5kbGVyIGZvdW5kID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWFkZXIuZWxlbWVudHM7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGN1cnJlbnRJZCA9IHJlYWRlci5nZXRJZChlbGVtZW50c1tpXSk7Ci0JCQkJaWYgKG1vZGVsSWQuZXF1YWxzKGN1cnJlbnRJZCkpIHsKLQkJCQkJSU1vZGVsSGFuZGxlciBpdGVtID0gcmVhZGVyLmdldEluc3RhbmNlKGVsZW1lbnRzW2ldKTsKLQkJCQkJZm91bmQgPSBpdGVtOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJUaGVyZSB3ZXJlIG5vIE1vZGVsIEhhbmRsZXIgZm91bmQgaW4gcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjNDlkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBqdXN0IGNvbnZlcnRzIHdoYXQncyBpbiB0aGUgcGx1Z2lucyByZWdpc3RyeSBpbnRvIGEgZm9ybSBtb3JlCi0gKiBlYXNpbHkgdXNlYWJsZSBieSBvdGhlcnMsIHRoZSBDb250ZW50VHlwZVJlZ2lzdHJ5LgotICovCi1jbGFzcyBNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlciB7Ci0JcHJpdmF0ZSBIYXNoTWFwIGFsbFJlYWR5Q3JlYXRlSW5zdGFuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIEFUVF9BU1NPQ0lBVEVEX0NPTlRFTlRfVFlQRSA9ICJhc3NvY2lhdGVkQ29udGVudFR5cGVJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIEFUVF9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHM7Ci0JcHJvdGVjdGVkIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAibW9kZWxIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCS8vCi0JcHJvdGVjdGVkIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgVEFHX05BTUUgPSAibW9kZWxIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8KLQkvKioKLQkgKiBDb250ZW50VHlwZVJlZ2lzdHJ5UmVhZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JU3RyaW5nIGdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9BU1NPQ0lBVEVEX0NPTlRFTlRfVFlQRSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0SWQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGlkVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlyZXR1cm4gaWRWYWx1ZTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgSU1vZGVsSGFuZGxlciBnZXRJbnN0YW5jZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBNYXkgbmVlZCB0byByZWNvbnNpZGVyLCBidXQgZm9yIG5vdywgd2UnbGwgYXNzdW1lIGFsbCBjbGllbnRzIG11c3QKLQkJLy8gc3ViY2xhc3MgQWJzdHJhY3RDb250ZW50VHlwZUlkZW50aWZpZXIuIEl0cyBlYXNpZXIgYW5kIHNhZmVyLCBmb3IKLQkJLy8gdGhpcwotCQkvLyBsb3cgbGV2ZWwgInN5c3RlbSIgb2JqZWN0LiAoVGhhdCBpcywgd2UgY2FuIGNoZWNrIGFuZCBzZXQgInBhY2thZ2UKLQkJLy8gcHJvdGVjdGVkIgotCQkvLyBhdHRyaWJ1dGVzLgotCQlBYnN0cmFjdE1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSAoQWJzdHJhY3RNb2RlbEhhbmRsZXIpIGFsbFJlYWR5Q3JlYXRlSW5zdGFuY2VzLmdldChnZXRJZChlbGVtZW50KSk7Ci0JCWlmIChtb2RlbEhhbmRsZXIgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbEhhbmRsZXIgPSAoQWJzdHJhY3RNb2RlbEhhbmRsZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQkJCWlmIChtb2RlbEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQlhbGxSZWFkeUNyZWF0ZUluc3RhbmNlcy5wdXQoZ2V0SWQoZWxlbWVudCksIG1vZGVsSGFuZGxlcik7Ci0JCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREVGQVVMVCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1vZGVsSGFuZGxlci5zZXREZWZhdWx0KHRydWUpOwotCQkJCQllbHNlCi0JCQkJCQltb2RlbEhhbmRsZXIuc2V0RGVmYXVsdChmYWxzZSk7Ci0JCQkJCS8vIFRPRE8gLS0gc2V0IGFuZCBjaGVjayBhdHRyaWJ1dGVzIHZzLiBjcmVhdGVkIGluc3RhbmNlCi0JCQkJCS8vY29udGVudFR5cGVJZGVudGlmaWVyLnNldE9yQ2hlY2tJZChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudERlZmF1bHQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERUZBVUxUKTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHMoZGVmYXVsdFZhbHVlKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlciByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCS8vIGp1c3QgcmVtZW1iZXIgdGhlIGVsZW1lbnRzLCBzbyBwbHVnaW5zIGRvbid0IGhhdmUgdG8KLQkJCS8vIGJlIGFjdGl2YXRlZCwgdW5sZXNzIGV4dGVuc2lvbiBtYXRjaGVzIHRob3NlICJvZiBpbnRlcmVzdCIuCi0JCQllbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmYjk0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotLyoqCi0gKiAKLSAqIExpa2VseSBhIHRlbXBvcmFyeSBjbGFzcyB0byBiZSByZXBsYWNlZCBieSBwbHVnaW4sIGV2ZW50dWFsbHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJVdGlsaXR5IHsKLQotCXByaXZhdGUgc3RhdGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNvbnRlbnRUeXBlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgc3RhdGljIElEb2N1bWVudFR5cGVIYW5kbGVyIGdldENvbnRlbnRUeXBlRm9yKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRUeXBlUmVnaXN0cnkoKS5nZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChzdHJpbmcpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldENvbnRlbnRUeXBlUmVnaXN0cnkoKSB7Ci0JCWlmIChjb250ZW50VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlUmVnaXN0cnkgPSBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBjb250ZW50VHlwZVJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXREZWZhdWx0RW1iZWRkZWRUeXBlKCkgewotCQlyZXR1cm4gZ2V0RW1iZWRkZWRDb250ZW50VHlwZUZvcigidGV4dC9odG1sIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RW1iZWRkZWRDb250ZW50VHlwZUZvcihTdHJpbmcgc3RyaW5nKSB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgaW5zdGFuY2UgPSBudWxsOwotCQlpbnN0YW5jZSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVGb3Ioc3RyaW5nKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJVdGlsaXR5KCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1BsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NWNiZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotCi0vKioKLSAqIAotICogQ2xpZW50cyBjYW4gbWFrZSB1c2Ugb2YgSUV4ZWN1dGFibGVFeHRlbnNpb24gdG8gaGFuZGxlIHRoZSBvcHRpb25hbCBhZGFwdGVyCi0gKiBjbGFzcyBhbmQga2V5LiBUeXBpY2FsbHksIG1hbnkgY2xpZW50cyB1c2UgYSB0eXBpY2FsIHBhdHRlcm4gb2YgcHJvdmlkaW5nCi0gKiBhbiBhZGFwdGVyIGNsYXNzIGFuZCBrZXkgaW4gdGhlaXIgbnVsbCBhcmd1bWVudCBjb25zdHJ1Y3RvciBhbnl3YXksIHNvCi0gKiB0aGV5J2Qgb25seSBoYXZlIHRvIHVzZSBJRXhlY3V0YWJsZUV4dGVuc2lvbiBpZiB0aGUgZmFjdG9yeSB3YXMgZm9yIG1vcmUKLSAqIHRoYW4gb25lLgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyIHsKLQkvLwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQURBUFRFUktFWSA9ICJhZGFwdGVyS2V5Q2xhc3MiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfUkVHSVNURVJBREFQVEVSID0gInJlZ2lzdGVyQWRhcHRlcnMiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKHJlYWRlciA9PSBudWxsKSB7Ci0JCQlyZWFkZXIgPSBuZXcgUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0NPTlRFTlRUWVBFID0gImNvbnRlbnRUeXBlSWRlbnRpZmVySWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJmYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoSURvY3VtZW50VHlwZUhhbmRsZXIgaGFuZGxlcikgewotCQlyZXR1cm4gbG9hZFJlZ2lzdHJ5KGhhbmRsZXIuZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBsb2FkUmVnaXN0cnkodHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGxvYWRGYWN0b3J5RnJvbUNvbmZpZ3VyYXRpb25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcmVxdWVzdGVyVHlwZSkgewotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCVN0cmluZyBjb250ZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQ09OVEVOVFRZUEUpOwotCQkJaWYgKCFyZXF1ZXN0ZXJUeXBlLmVxdWFscyhjb250ZW50VHlwZSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DTEFTUyk7Ci0JCQkvLwkJCVN0cmluZyBhZGFwdGVyS2V5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0FEQVBURVJLRVkpOwotCQkJLy8JCQlTdHJpbmcgcmVnaXN0ZXJBZGFwdGVycyA9Ci0JCQkvLyBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1JFR0lTVEVSQURBUFRFUik7Ci0KLQkJCS8vIGlmIGNsYXNzTmFtZSBpcyBudWxsLCB0aGVuIG5vIG9uZSBkZWZpbmVkIHRoZSBleHRlbnNpb24gcG9pbnQKLQkJCS8vIGZvciBhZGFwdGVyIGZhY3RvcmllcwotCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfQ0xBU1MpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZiBhbiBlcnJvciBvY2N1cnMgaGVyZSwgaXRzIHByb2JhYmx5IHRoYXQgdGhlIHBsdWdpbgotCQkJCQkvLyBjb3VsZCBub3QgYmUgZm91bmQvbG9hZGVkCi0JCQkJCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBjbGFzczogIiArIGNsYXNzTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZiBhbiBlcnJvciBvY2N1cnMgaGVyZSwgaXRzIHByb2JhYmx5IHRoYXQgdGhlIHBsdWdpbgotCQkJCQkvLyBjb3VsZCBub3QgYmUgZm91bmQvbG9hZGVkIC0tIGJ1dCBpbiBhbnkgY2FzZSB3ZSBqdXN0Ci0JCQkJCS8vIHdhbnQKLQkJCQkJLy8gdG8gbG9nIHRoZSBlcnJvciBhbmQgY29udGludWUgcnVubmluZyBhbmQgYmVzdCB3ZSBjYW4uCi0JCQkJCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBjbGFzczogIiArIGNsYXNzTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8JCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJLy8JCQkJCWZhY3RvcnkgPSBvbGRBdHRyaWJ1dGVzQ29kZShlbGVtZW50LCBmYWN0b3J5LCBjbGFzc05hbWUsCi0JCQkJLy8gcGx1Z2luKTsKLQkJCQkvLwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgbG9hZFJlZ2lzdHJ5KE9iamVjdCBjb250ZW50VHlwZSkgewotCQlMaXN0IGZhY3RvcnlMaXN0ID0gbnVsbDsgLy8gbmV3IFZlY3RvcigpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChTU0VDb3JlUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJLy8gdGhpcyBpcyBjYWxsZWQgYSBsb3QsIHNvIGRvbid0IGNyZWF0ZSB2ZWN0b3IgdW5sZXNzIHJlYWxseQotCQkJCS8vIG5lZWRlZAotCQkJCS8vIFRPRE86IGNvdWxkIGV2ZW50dWFsbHkgY2FjaGUgaW4gYSBoYXNodGFibGUsIG9yIHNvbWV0aGluZywKLQkJCQkvLyB0byBhdm9pZCByZXBlYXQgcHJvY2Vzc2luZwotCQkJCWZhY3RvcnlMaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGxvYWRGYWN0b3J5RnJvbUNvbmZpZ3VyYXRpb25FbGVtZW50KGVsZW1lbnRzW2ldLCBjb250ZW50VHlwZSk7Ci0JCQkJCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQkJCQlmYWN0b3J5TGlzdC5hZGQoZmFjdG9yeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5TGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYzI2NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiBSZWdpb25zIG9mIHRoaXMgY2xhc3MgYXJlIGludGVuZGVkIHNwZWNpZmljYWxseSBmb3IgWE1ML0hUTUwvSlNQcy4gT3RoZXIKLSAqIGxhbmd1YWdlcyBtYXkgbmVlZCB0aGVpciBvd24gc3ViY2xhc3Nlcy4gKFNlZSB0aGUgdXBkYXRlTW9kZWwgbWV0aG9kKS4KLSAqLwotcHVibGljIGNsYXNzIENvbnRleHRSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JcHJvdGVjdGVkIGludCBmTGVuZ3RoOwotCi0JcHJvdGVjdGVkIGludCBmU3RhcnQ7Ci0JcHJvdGVjdGVkIGludCBmVGV4dExlbmd0aDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIENvbnRleHRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbnRleHRSZWdpb24oU3RyaW5nIG5ld0NvbnRleHQsIGludCBuZXdTdGFydCwgaW50IG5ld1RleHRMZW5ndGgsIGludCBuZXdMZW5ndGgpIHsKLQkJZlR5cGUgPSBuZXdDb250ZXh0OwotCQlmU3RhcnQgPSBuZXdTdGFydDsKLQkJZlRleHRMZW5ndGggPSBuZXdUZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbmV3TGVuZ3RoOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LmNvcmUuSVRleHRSZWdpb25Db3JlI2FkanVzdChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuY29yZS5JVGV4dFJlZ2lvbkNvcmUjYWRqdXN0TGVuZ3RoV2l0aChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoV2l0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuY29yZS5JVGV4dFJlZ2lvbkNvcmUjYWRqdXN0U3RhcnQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uI2FkanVzdFRleHRMZW5ndGgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFsbExldHRlck9yRGlnaXQoU3RyaW5nIGNoYW5nZXMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoKCk7IGkrKykgewotCQkJLy8gVE9fRE9fRlVUVVJFOiBjaGVjayB0aGF0IGEgSmF2YSBMZXR0ZXIgb3IgRGlnaXQgaXMKLQkJCS8vIHRoZSBzYW1lIHRoaW5nIGFzIGFuIFhNTCBsZXR0ZXIgb3IgZGlnaXQKLQkJCWlmICghKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2hhbmdlcy5jaGFyQXQoaSkpKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsV2hpdGVTcGFjZShTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhbmdlcy5jaGFyQXQoaSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgbm9uLXdoaXRlIHNwYWNlIGFyZWEKLQkJaWYgKChyZXF1ZXN0U3RhcnQgPD0gKGdldFRleHRFbmQoKSkpICYmIChhbGxMZXR0ZXJPckRpZ2l0KGNoYW5nZXMpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkhhbmRsZUFzV2hpdGVTcGFjZShTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiB3ZSBhcmUgaW4gdGhlICJ3aGl0ZSBzcGFjZSIgYXJlYSBvZiBhIHJlZ2lvbiwgdGhlbgotCQkvLyB3ZSBkb24ndCB3YW50IHRvIGhhbmRsZSwgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJLy8gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbiBpcyBjb25zaWRlciBhbnl3aGVyZSB0aGF0IHdvdWxkCi0JCS8vIGxlYXZlIHdoaXRlc3BhY2UgYmV0d2VlbiB0aGlzIGNoYXJhY3RlciBhbmQgdGhlIHRleHQgcGFydC4KLQkJLy8gYW5kIG9mIGNvdXJzZSwgd2UgY2FuIGluc2VydCB3aGl0ZXNwYWNlIGluIHdoaXRlc3BhY2UgcmVnaW9uCi0JCS8vCi0JCS8vIGlmIHRoZXJlIGlzIG5vIHdoaXRlc3BhY2UgaW4gdGhpcyByZWdpb24sIG5vIG5lZWQgdG8gbG9vayBmdXJ0aGVyCi0JCWlmIChnZXRFbmQoKSA+IGdldFRleHRFbmQoKSkgewotCQkJLy8gbm8gbmVlZCB0byBhZGQgb25lIHRvIGVuZCBvZiB0ZXh0LCBhcyB3ZSB1c2VkIHRvLCBzaW5jZSB3ZQotCQkJLy8gY2hhbmdlIGRlZmluaXRpb24gb2YgbGVuZ3RoIHRvIGVxdWF0ZSB0byBvZmZzZXQgcGx1cyBvbmUuCi0JCQlpZiAocmVxdWVzdFN0YXJ0ID4gZ2V0VGV4dEVuZCgpKSB7Ci0JCQkJLy8gb2ssIHdlIGFyZSBpbiB0aGUgd2hpdGVzcGFjZSByZWdpb24sIHNvIHdlIGNhbid0IGhhbmRsZSwKLQkJCQkvLyB1bmxlc3MKLQkJCQkvLyB3ZSBhcmUganVzdCBpbnNlcnRpbmcgd2hpdGVzcGFjZS4KLQkJCQlpZiAoYWxsV2hpdGVTcGFjZShjaGFuZ2VzKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5jb3JlLklUZXh0UmVnaW9uQ29yZSNjb250YWlucyhpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHBvc2l0aW9uKSB7Ci0KLQkJcmV0dXJuIGZTdGFydCA8PSBwb3NpdGlvbiAmJiBwb3NpdGlvbiA8IGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuY29yZS5JVGV4dFJlZ2lvbkNvcmUjZXF1YXRlUG9zaXRpb25zKGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24jZ2V0RW5kKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24jZ2V0VGV4dEVuZCgpCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWZUeXBlID0gc3RyaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCS8vID09PiAvLyBTdHJpbmcgcmVzdWx0VGV4dCA9IG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSBzaG9ydENsYXNzTmFtZSArICItLT4gIiArIGdldFR5cGUoKSArICI6ICIgKyBnZXRTdGFydCgpICsgIi0iICsgZ2V0VGV4dEVuZCgpICsgKGdldFRleHRFbmQoKSAhPSBnZXRFbmQoKSA/ICgiLyIgKyBnZXRFbmQoKSkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJLy9yZXR1cm4gY29tLmlibS5zZWQudXRpbC5TdHJpbmdVdGlscy5lc2NhcGUoIignIisoZ2V0Rmlyc3RSZWdpb24oKQotCQkvLyA9PSBudWxsIHx8IGRvY3VtZW50ID09IG51bGw/ICIiIDoKLQkJLy8gZ2V0VGV4dChnZXRGaXJzdFJlZ2lvbigpKSkrIiciK2dldFN0YXJ0KCkrIiAtCi0JCS8vICIrZ2V0RW5kKCkrIiciKyhnZXRDbG9zZSgpID09IG51bGwgfHwgZG9jdW1lbnQgPT0gbnVsbCB8fAotCQkvLyBnZXRSZWdpb25zKCkuc2l6ZSgpPDIgPyAiIiA6IGdldFRleHQoZ2V0Q2xvc2UoKSkpKyInKQotCQkvLyAiK2dldFJlZ2lvbnMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyB0aGUgZm91ciB0eXBlcyB3ZSB1c2VkIHRvIGhhbmRsZSBoZXJlLCBoYXZlIGFsbCBiZWVuIG1vdmVkIHRvCi0JCS8vIHNwZWNpZmljIHJlZ2lvbiBjbGFzc2VzLgotCQkvLyBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRQotCQkvLyBYTUxfVEFHX0FUVFJJQlVURV9OQU1FCi0JCS8vIFhNTF9DT05URU5UCi0JCS8vIFhNTF9DREFUQV9URVhUCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wYXJzZXIvRm9yZWlnblJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wYXJzZXIvRm9yZWlnblJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzIzM2RjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0ZvcmVpZ25SZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIEZvcmVpZ25SZWdpb24gZXh0ZW5kcyBDb250ZXh0UmVnaW9uIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgc3Vycm91bmRpbmdUYWcgPSBudWxsOwotCi0JLyoqCi0JICogRm9yZWlnblJlZ2lvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBGb3JlaWduUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBGb3JlaWduUmVnaW9uKFN0cmluZyBuZXdDb250ZXh0LCBpbnQgbmV3U3RhcnQsIGludCBuZXdUZXh0TGVuZ3RoLCBpbnQgbmV3TGVuZ3RoKSB7Ci0JCXN1cGVyKG5ld0NvbnRleHQsIG5ld1N0YXJ0LCBuZXdUZXh0TGVuZ3RoLCBuZXdMZW5ndGgpOwotCX0KLQotCXB1YmxpYyBGb3JlaWduUmVnaW9uKFN0cmluZyBuZXdDb250ZXh0LCBpbnQgbmV3U3RhcnQsIGludCBuZXdUZXh0TGVuZ3RoLCBpbnQgbmV3TGVuZ3RoLCBTdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJc3VwZXIobmV3Q29udGV4dCwgbmV3U3RhcnQsIG5ld1RleHRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JCXNldExhbmd1YWdlKG5ld0xhbmd1YWdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLQkJcmV0dXJuIGxhbmd1YWdlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN1cnJvdW5kaW5nVGFnKCkgewotCQlyZXR1cm4gc3Vycm91bmRpbmdUYWc7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0xhbmd1YWdlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoamF2YS5sYW5nLlN0cmluZyBuZXdMYW5ndWFnZSkgewotCQlsYW5ndWFnZSA9IG5ld0xhbmd1YWdlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdTdXJyb3VuZGluZ1RhZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cnJvdW5kaW5nVGFnKGphdmEubGFuZy5TdHJpbmcgbmV3U3Vycm91bmRpbmdUYWcpIHsKLQkJc3Vycm91bmRpbmdUYWcgPSBuZXdTdXJyb3VuZGluZ1RhZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkZPUkVJR046ICIgKyBzdXBlci50b1N0cmluZygpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQoZmxhdG5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBmbGF0bm9kZSwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0Jhc2ljU3RydWN0dXJlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4MDgxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQYXJ0aXRpb25pbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdExpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUG9zaXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5OZXdNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5Tb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLlN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlV0aWxpdGllczsKLQotCi0vKioKLSAqIFRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiBzdHJ1Y3R1cmVkIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50LCBJRG9jdW1lbnRFeHRlbnNpb24sIElEb2N1bWVudEV4dGVuc2lvbjMsIENoYXJTZXF1ZW5jZSwgSVJlZ2lvbkNvbXBhcmlibGUgewotCi0JLyoqCi0JICogVGhpcyBUaHJlYWRMb2NhbCBjb25zdHJ1Y3QgaXMgdXNlZCBzbyBlYWNoIHRocmVhZCBjYW4gbWFpbnRhaW4gaXRzIG9ubHkKLQkgKiBwb2ludGVyIHRvIHRoZSBkb3VibGUgbGlua2VkIGxpc3QgdGhhdCBtYW5hZ2VzIHRoZSBkb2N1bWVudHMgcmVnaW9ucy4KLQkgKiBUaGUgb25seSB0aGluZyB3ZSAiZ2F1cmQiIGZvciBpcyB0aGF0IGEgcHJldmlvdXNseSBjYWNoZWQgcmVnaW9uIGhhcwotCSAqIGJlZW4gZGVsZXRlZC4KLQkgKiAKLQkgKiBUaGUgb2JqZWN0IHRoYXQgaXMga2VwdCBpbiB0aGUgdGhyZWFkIGxvY2FsJ3MgbWFwLCBpcyBqdXN0IGEgcG9pbnRlciB0bwotCSAqIGFuIGFycmF5IHBvc2l0aW9uLiBUaGF0J3MgYmVjYXVzZSB0aGUgb2JqZWN0IHRoZXJlIG5lZWRzIHRvIGJlICJmcmVlIgotCSAqIGZyb20gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzLCBvciBpdCB3aWxsIG5vdCBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEN1cnJlbnREb2N1bWVudFJlZ2lvbkNhY2hlIHsKLQkJLy8gSSdtIGFzc3VtaW5nIGZvciBub3cgdGhlcmUgd291bGQgbmV2ZXIgYmUgc28gbWFueSB0aHJlYWRzIHRoYXQKLQkJLy8gdGhpcyBhcnJheUxpc3QgbmVlZHMgdG8gYmUgYm91bmRlZCwgb3IgJ2NsZWFuZWQgdXAnLgotCQkvLyB0aGlzIGFzc3VtcHRpb24gc2hvdWxkIGJlIHRlc3RlZCBpbiBwcmFjdGljZSBhbmQgbG9uZyBydW5uaW5nCi0JCS8vIGpvYnMgLS0gZm91bmQgbm90IHRvIGJlIGEgZ29vZCBhc3N1bXB0aW9uLiBTZWUgYmVsb3cuCi0JCXByaXZhdGUgTGlzdCBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5ID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0KCkpOwotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkJcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NJWkUgPSA1MDsKLQotCi0JCXByaXZhdGUgVGhyZWFkTG9jYWwgdGhyZWFkTG9jYWxDYWNoZVBvc2l0aW9uID0gbmV3IFRocmVhZExvY2FsKCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXQoKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQlpbnQgcG9zID0gZ2V0VGhyZWFkTG9jYWxQb3NpdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlyZWdpb24gPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5nZXQocG9zKTsKLQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCS8vIGV2ZW4gdGhvdWdoIHRoZSBjYWNoZWRSZWdpb25Qb3NpdGlvbiBpcyBzeW5jaHJvbml6ZWQsCi0JCQkJLy8gdGhhdCBqdXN0IG1lYW5zIGVhY2ggYWNjZXNzIGlzIHN5bmNyb25pemVkLCBpdHMKLQkJCQkvLyBzdGlsbCBwb3NzaWJsZSBmb3IgYW5vdGhlciB0aHJlYWQgdG8gY2F1c2UgaXQgdG8KLQkJCQkvLyBiZSBjbGVhcmVkLCBhZnRlciB0aGlzIHRocmVhZCBnZXRzIGl0IHBvc2l0aW9uLgotCQkJCS8vIFNvLCBpZiB0aGF0IGhhcHBlbnMsIGFsbCB3ZSBjYW4gZG8gaXMgcmVzZXQgdG8gYmVnaW5uaW5nLgotCQkJCS8vIFRoaXMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIChpbiBvdGhlciB3b3JkcywgcHJvYmFibHkKLQkJCQkvLyBub3Qgd29ydGggdXNpbmcgc3luY2hyb25pemVkIGJsb2NrcwotCQkJCS8vIHRvIGFjY2VzcyBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LgotCQkJCXJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCQlyZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQlyZWdpb24gPSByZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9IGVsc2UKLQkJCS8vIHJlZ2lvbiBub3QgbnVsbAotCQkJaWYgKHJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJCXJlZ2lvbiA9IHJlc2V0VG9Jbml0aWFsU3RhdGUoKTsKLQkJCX0KLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQotCQlwcml2YXRlIGludCBnZXRUaHJlYWRMb2NhbFBvc2l0aW9uKCkgewotCQkJT2JqZWN0IHRocmVhZExvY2FsT2JqZWN0ID0gdGhyZWFkTG9jYWxDYWNoZVBvc2l0aW9uLmdldCgpOwotCQkJaW50IHBvcyA9IC0xOwotCQkJaWYgKHRocmVhZExvY2FsT2JqZWN0ID09IG51bGwpIHsKLQotCQkJCXBvcyA9IHJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcG9zID0gKChJbnRlZ2VyKSB0aHJlYWRMb2NhbE9iamVjdCkuaW50VmFsdWUoKTsKLQkJCX0KLQkJCXJldHVybiBwb3M7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgcmVpbml0VGhyZWFkTG9jYWxQb3NpdGlvbigpIHsKLQkJCUludGVnZXIgcG9zaXRpb247Ci0JCQlpbnQgcG9zOwotCQkJLy8gVE9ET19mdXR1cmU6IHRoaW5rIG9mIGEgYmV0dGVyIHNvbHV0aW9uIHRoYXQgZG9lc24ndAotCQkJLy8gcmVxdWlyZSB0aGlzIGtsdWRnZS4gVGhpcyBpcyBlc3BlY2lhbGx5IHJlcXVpcmVkIGJlY2F1c2UKLQkJCS8vIHNvbWUgaW5mcmFzdHVyZSwgc3VjaCBhcyByZWNvbmNpbGVyLCBhY3R1YWxseSBudWxsIG91dAotCQkJLy8gdGhlaXIgdGhyZWFkIG9iamVjdCBhbmQgcmVjcmVhdGUgaXQsIDUwMCBtc2VjcyBsYXRlcgotCQkJLy8gKGFwcHJveGltYXRlbHkpLgotCQkJLy8gTm90ZTogdGhlIGxpa2VseSBzb2x1dGlvbiBpbiBmdXR1cmUgaXMgdG8gY2xlYXIgYWZ0ZXIgZXZlcnkKLQkJCS8vIGhlYXZ5IHVzZSBvZiBnZXRDYWNoZWRSZWdpb24sIHN1Y2ggYXMgaW4gY3JlYXRpbmcgbm9kZQotCQkJLy8gbGlzdHMsIG9yIHJlcGFyc2luZyBvciBwYXJ0aW9uaW5nLgotCQkJaWYgKGNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuc2l6ZSgpID4gTUFYX1NJWkUpIHsKLQkJCQljYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LmNsZWFyKCk7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheSBjbGVhcmVkIGF0IHNpemUgIiArIE1BWF9TSVpFKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwb3NpdGlvbiA9IG5ldyBJbnRlZ2VyKGNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuc2l6ZSgpKTsKLQkJCXRocmVhZExvY2FsQ2FjaGVQb3NpdGlvbi5zZXQocG9zaXRpb24pOwotCQkJY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5hZGQocG9zaXRpb24uaW50VmFsdWUoKSwgbnVsbCk7Ci0JCQlwb3MgPSBwb3NpdGlvbi5pbnRWYWx1ZSgpOwotCQkJcmV0dXJuIHBvczsKLQkJfQotCi0JCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXNldFRvSW5pdGlhbFN0YXRlKCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb247Ci0JCQlyZWdpb24gPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJc2V0KHJlZ2lvbik7Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0KLQkJLy8gVE9ETzogbWFrZSBwcml2aXRlIGlmIHVzZWQsIGVsc2UgZGVsZXRlCi0JCXZvaWQgc2V0KGludCBwb3MsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCQljYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LnNldChwb3MsIHJlZ2lvbik7Ci0JCX0KLQotCQl2b2lkIHNldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQkJdHJ5IHsKLQkJCQlpbnQgcG9zID0gZ2V0VGhyZWFkTG9jYWxQb3NpdGlvbigpOwotCQkJCWNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuc2V0KHBvcywgcmVnaW9uKTsKLQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCS8vIGV2ZW4gdGhvdWdoIHRoZSBjYWNoZWRSZWdpb25Qb3NpdGlvbiBpcyBzeW5jaHJvbml6ZWQsCi0JCQkJLy8gdGhhdCBqdXN0IG1lYW5zIGVhY2ggYWNjZXNzIGlzIHN5bmNyb25pemVkLCBpdHMKLQkJCQkvLyBzdGlsbCBwb3NzaWJsZSBmb3IgYW5vdGhlciB0aHJlYWQgdG8gY2F1c2UgaXQgdG8KLQkJCQkvLyBiZSBjbGVhcmVkLCBhZnRlciB0aGlzIHRocmVhZCBnZXRzIGl0IHBvc2l0aW9uLgotCQkJCS8vIFNvLCBpZiB0aGF0IGhhcHBlbnMsIGFsbCB3ZSBjYW4gZG8gaXMgcmVzZXQgdG8gYmVnaW5uaW5nLgotCQkJCS8vIFRoaXMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIChpbiBvdGhlciB3b3JkcywgcHJvYmFibHkKLQkJCQkvLyBub3Qgd29ydGggdXNpbmcgc3luY2hyb25pemVkIGJsb2NrcwotCQkJCS8vIHRvIGFjY2VzcyBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LgotCQkJCXJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCQlyZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIE51bGxEb2N1bWVudEV2ZW50IGlzIHVzZWQgdG8gY29tcGxldGUgdGhlICJhYm91dFRvQ2hhbmdlIiBhbmQKLQkgKiAiY2hhbmdlZCIgY3ljbGUsIHdoZW4gaW4gZmFjdCB0aGUgb3JpZ2luYWwgY2hhbmdlIGlzIG5vIGxvbmdlciB2YWxpZC4KLQkgKiBUaGUgb25seSBrbm93biAodmFsaWQpIGNhc2Ugb2YgdGhpcyBpcyB3aGVuIGEgbW9kZWwgcmUtaW5pdGlhbGl6ZSB0YWtlcwotCSAqIHBsYWNlLCB3aGljaCBjYXVzZXMgc2V0VGV4dCB0byBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBzb21lIHByZXZpb3VzCi0JICogY2hhbmdlLiBbVGhpcyBhcmNoaXRlY3R1cmUgd2lsbCBiZSBpbXByb3ZlZCBpbiBmdXR1cmVdLgotCSAqLwotCXB1YmxpYyBjbGFzcyBOdWxsRG9jdW1lbnRFdmVudCBleHRlbmRzIERvY3VtZW50RXZlbnQgewotCQlwdWJsaWMgTnVsbERvY3VtZW50RXZlbnQoKSB7Ci0JCQl0aGlzKEJhc2ljU3RydWN0dXJlZERvY3VtZW50LnRoaXMsIDAsIDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBOdWxsRG9jdW1lbnRFdmVudChJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQkJc3VwZXIoZG9jLCBvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZWdpc3RlcmVkUmVwbGFjZSB7Ci0JCS8qKiBUaGUgb3duZXIgb2YgdGhpcyByZXBsYWNlIG9wZXJhdGlvbi4gKi8KLQkJSURvY3VtZW50TGlzdGVuZXIgZk93bmVyOwotCQkvKiogVGhlIHJlcGxhY2Ugb3BlcmF0aW9uICovCi0JCUlEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSBmUmVwbGFjZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBidW5kbGUgb2JqZWN0LgotCQkgKiAKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGxpc3RlbmVyIG93bmluZyB0aGUgcmVwbGFjZSBvcGVyYXRpb24KLQkJICogQHBhcmFtIHJlcGxhY2UKLQkJICogICAgICAgICAgICB0aGUgcmVwbGFjZSBvcGVyYXRpb24KLQkJICovCi0JCVJlZ2lzdGVyZWRSZXBsYWNlKElEb2N1bWVudExpc3RlbmVyIG93bmVyLCBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgcmVwbGFjZSkgewotCQkJZk93bmVyID0gb3duZXI7Ci0JCQlmUmVwbGFjZSA9IHJlcGxhY2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGVzZSBjb250cm9sIHZhcmlhYmxlIGlzbid0IG1hcmsgYXMgJ2ZpbmFsJyBzaW5jZSB0aGVyZSdzIHNvbWUgdW5pdAotCSAqIHRlc3RzIHRoYXQgbWFuaXB1bGF0ZSBpdC4gRm9yIGZpbmFsIHByb2R1Y3QsIGl0IHNob3VsZCBiZS4KLQkgKi8KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gVVNFX0xPQ0FMX1RIUkVBRCA9IHRydWU7Ci0KLQkvKioKLQkgKiBwdXJlbHkgZm9yIGRlYnVnZ2luZy9wZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMgSW4gcHJhY3RpY2UsIHdvdWxkIGFsd2F5cwotCSAqIGJlICd0cnVlJy4gKGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ5IGNhbGxlZCBieSBjbGllbnRzKS4gSXRzIG5vdAotCSAqICdmaW5hbCcgb3IgcHJpdmF0ZSBqdXN0IHNvIGl0IGNhbiBiZSB2YXJpZWQgZHVyaW5nCi0JICogZGVidWdnaW5nL3BlcmZvcm1hbmNlIG1lYXN1cmVtZW50IHJ1bnMuCi0JICogCi0JICogQHBhcmFtIHVzZV9sb2NhbF90aHJlYWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VVNFX0xPQ0FMX1RIUkVBRChmaW5hbCBib29sZWFuIHVzZV9sb2NhbF90aHJlYWQpIHsKLQkJVVNFX0xPQ0FMX1RIUkVBRCA9IHVzZV9sb2NhbF90aHJlYWQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNhY2hlZERvY3VtZW50UmVnaW9uOwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50bzsKLQlwcml2YXRlIGJvb2xlYW4gZkFjY2VwdFBvc3ROb3RpZmljYXRpb25SZXBsYWNlcyA9IHRydWU7Ci0JcHJpdmF0ZSBDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZSBmQ3VycmVudERvY3VtbmV0UmVnaW9uQ2FjaGU7Ci0JcHJpdmF0ZSBEb2N1bWVudEV2ZW50IGZEb2N1bWVudEV2ZW50OwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXJbXSBmRG9jdW1lbnRMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBUaGUgcmVnaXN0ZXJlZCBkb2N1bWVudCBwYXJ0aXRpb25lcnMuCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXByaXZhdGUgTWFwIGZEb2N1bWVudFBhcnRpdGlvbmVyczsKLQkvKiogVGhlIHJlZ2lzdGVyZWQgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGxpc3RlbmVycyAqLwotCXByaXZhdGUgTGlzdCBmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0RG9jdW1lbnRSZWdpb247Ci0JcHJpdmF0ZSBSZWdpb25QYXJzZXIgZlBhcnNlcjsKLQlwcml2YXRlIEdlbmVyaWNQb3NpdGlvbk1hbmFnZXIgZlBvc2l0aW9uTWFuYWdlcjsKLQlwcml2YXRlIExpc3QgZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzOwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXJbXSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyczsKLQlwcml2YXRlIGludCBmUmVlbnRyYW5jZUNvdW50ID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGZSZVBhcnNlcjsKLQlwcml2YXRlIGludCBmU3RvcHBlZENvdW50ID0gMDsKLQotCXByaXZhdGUgSVRleHRTdG9yZSBmU3RvcmU7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyczsKLQlwcml2YXRlIE9iamVjdFtdIGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzOwotCXByaXZhdGUgT2JqZWN0W10gZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZlRyYWNrZXI7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBmVW5kb01hbmFnZXI7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3REb2N1bWVudFJlZ2lvbjsKLQotCXByaXZhdGUgYnl0ZVtdIGxpc3RlbmVyTG9jayA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgTnVsbERvY3VtZW50RXZlbnQgTlVMTF9ET0NVTUVOVF9FVkVOVDsKLQotCS8vCi0JLyoqCi0JICogaW4gY2FzZSBwcmVmZXJyZWQgZGVsaW1pdGVyIGlzIG5vdCBzZXQsIHdlJ2xsIGFzc3VtZSB0aGUgcGxhdGZvcm0KLQkgKiBkZWZhdWx0IE5vdGU6IGl0IGlzIG5vdCBmaW5hbCBzdGF0aWMgdG8gbWFrZSBzdXJlIGl0IHdvbid0IGJlIGlubGluZWQKLQkgKiBieSBjb21waWxlci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQbGF0Zm9ybUxpbmVEZWxpbWl0ZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiB0aGVvcmV0aWNhbGx5LCBhIGRvY3VtZW50IGNhbiBjb250YWluIG1peGVkIGxpbmUgZGVsaW1pdGVycwotCSAqLwotCXByaXZhdGUgU3RyaW5nIHByZWZlcmVkRGVsaW1pdGVyOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZID0gIl9SRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWV8iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogZGVidWcgdmFyaWFibGUgb25seQotCSAqIAotCSAqIEBwYXJhbSBwYXJzZXIKLQkgKi8KLQlwcml2YXRlIGxvbmcgc3RhcnRTdHJlYW1UaW1lOwotCS8qKgotCSAqIGRlYnVnIHZhcmlhYmxlIG9ubHkKLQkgKiAKLQkgKiBAcGFyYW0gcGFyc2VyCi0JICovCi0JcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKLQotCXB1YmxpYyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJc3VwZXIoKTsKLQkJZkN1cnJlbnREb2N1bW5ldFJlZ2lvbkNhY2hlID0gbmV3IEN1cnJlbnREb2N1bWVudFJlZ2lvbkNhY2hlKCk7Ci0JCWZTdG9yZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUoNTAsIDMwMCk7Ci0JCXNldExpbmVUcmFja2VyKG5ldyBEZWZhdWx0TGluZVRyYWNrZXIoKSk7Ci0JCU5VTExfRE9DVU1FTlRfRVZFTlQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQotCQlpbnRlcm5hbF9hZGRQb3NpdGlvbkNhdGVnb3J5KFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJaW50ZXJuYWxfYWRkUG9zaXRpb25VcGRhdGVyKG5ldyBEZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlcihSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSkpOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgcHJpbWFyeSB3YXkgdG8gZ2V0IGEgbmV3IHN0cnVjdHVyZWREb2N1bWVudC4gSXRzIGJlc3QgdG8KLQkgKiB1c2UgdGhlIGZhY3RvcnkgbWV0aG9kcyBpbiBNb2RlbE1hbmdlciB0byBjcmVhdGUgYSBuZXcKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50LCBzaW5jZSBpdCB3aWxsIGdldCBhbmQgaW5pdGlhbGl6ZSB0aGUgcGFyc2VyCi0JICogYWNjb3JkaW5nIHRvIHRoZSBkZXNpcmVkIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQl0aGlzKCk7Ci0JCUFzc2VydC5pc05vdE51bGwocGFyc2VyLCAiUHJvZ3JhbSBFcnJvcjogSVN0cnVjdHVyZWREb2N1bWVudCBjYW4gbm90IGJlIGNyZWF0ZWQgd2l0aCBudWxsIHBhcnNlciIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGdvIHRocm91Z2ggc2V0dGVyIGluIGNhc2UgdGhlcmUgaXMgc2lkZSBlZmZlY3RzCi0JCWludGVybmFsX3NldFBhcnNlcihwYXJzZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBfY2xlYXJEb2N1bWVudEV2ZW50KCkgewotCQkvLyBubyBoYXJkIGFuZCBmYXN0IHJlcXVpcmVtZW50IHRvIG51bGwgb3V0IC4uLiBqdXN0IHNlZW1zIGxpa2UKLQkJLy8gYSBnb29kIGlkZWEsIHNpbmNlIHdlIGFyZSBkb25lIHdpdGggaXQuCi0JCWZEb2N1bWVudEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2UoT2JqZWN0W10gbGlzdGVuZXJzKSB7Ci0JCS8vIG1vc3QgRG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkIGxpc3RlbmVycyBkbyBub3QgYW50aWNpcGF0ZQotCQkvLyBEb2N1bWVudEV2ZW50ID09IG51bGwuIFNvIG1ha2Ugc3VyZSBkb2N1bWVudEV2ZW50IGlzIG5vdAotCQkvLyBudWxsLiAodGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCB5ZXQgaXQgZG9lcyBzb21ldGltZXMpCi0JCWlmIChmRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFdmVudCA9IG5ldyBOdWxsRG9jdW1lbnRFdmVudCgpOwotCQl9Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJLy8gTm90ZTogdGhlIGRvY0V2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZVRleHQgQVBJCi0JCQkvLyBmaXJlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElEb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoZkRvY3VtZW50RXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgSVN0cnVjdHVyZWREb2N1bWVudDo6ZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50LiBUaW1lIHdhcyAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgbXNlY3MgdG8gZmlyZSBOZXdNb2RlbEV2ZW50IHRvIGluc3RhbmNlIG9mICIgKyBob2xkTGlzdGVuZXJzW2ldLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0Fib3V0VG9DaGFuZ2UoRG9jdW1lbnRFdmVudCBkb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IGZEb2N1bWVudFBhcnRpdGlvbmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcCA9IChJRG9jdW1lbnRQYXJ0aXRpb25lcikgZS5uZXh0KCk7Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCXAuZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKGRvY3VtZW50RXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBfZmlyZURvY3VtZW50Q2hhbmdlZChPYmplY3RbXSBsaXN0ZW5lcnMsIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQkvLyBOT1RFOiBkb2N1bWVudCBldmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2UgVGV4dCBBUEkgYW5kIHNldFRleHQKLQkJCS8vIEFQSQotCQkJLy8gbm93IGZpcmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJLy8gTm90ZXM6IGZEb2N1bWVudEV2ZW50IGNhbiBiZSAic3VkZGVubHkiIG51bGwsIGlmIG9uZSBvZgotCQkJCQkvLyB0aGUKLQkJCQkJLy8gcHJldmlvdXMgY2hhbmdlcwotCQkJCQkvLyBjYXVzZWQgYSAic2V0VGV4dCIgdG8gYmUgY2FsbGVkLiBUaGUgb25seSBrbm93biBjYXNlIG9mCi0JCQkJCS8vIHRoaXMKLQkJCQkJLy8gaXMgYSBtb2RlbCByZXNldAotCQkJCQkvLyBkdWUgdG8gcGFnZSBkaXJlY3RpdmUgY2hhbmdpbmcuIEV2ZW50dWFsbHkgd2Ugc2hvdWxkCi0JCQkJCS8vIGNoYW5nZQotCQkJCQkvLyBhcmNoZXRlY3R1cmUgdG8gaGF2ZQotCQkJCQkvLyBldmVudCBxdWUgYW5kIGJlIGFibGUgdG8gImNhbmNlbCIgcGVuZGluZyBldmVudHMsIGJ1dAotCQkJCQkvLyBmb3IKLQkJCQkJLy8gbm93LCB3ZSdsbCBqdXN0IHBhc3MgYQotCQkJCQkvLyBOdWxsRG9jdW1lbnRFdmVudC4gQnkgdGhlIHdheSwgaXQgaXMgaW1wb3J0YW50IHRvIHNlbmQKLQkJCQkJLy8gc29tZXRoaW5nLCBzaW5jZSBjbGllbnRzIG1pZ2h0Ci0JCQkJCS8vIGhhdmUgaW5kZXRlcm1pbmFudCBzdGF0ZSBkdWUgdG8gImFib3V0VG9DaGFuZ2UiIGJlaW5nCi0JCQkJCS8vIHNlbnQKLQkJCQkJLy8gZWFybGllci4KLQkJCQkJaWYgKGZEb2N1bWVudEV2ZW50ID09IG51bGwpIHsKLQkJCQkJCSgoSURvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLmRvY3VtZW50Q2hhbmdlZChOVUxMX0RPQ1VNRU5UX0VWRU5UKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCSgoSURvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLmRvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRFdmVudCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBkb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IGZEb2N1bWVudFBhcnRpdGlvbmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcCA9IChJRG9jdW1lbnRQYXJ0aXRpb25lcikgZS5uZXh0KCk7Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCXAuZG9jdW1lbnRDaGFuZ2VkKGRvY3VtZW50RXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBfZmlyZUV2ZW50KE9iamVjdFtdIGxpc3RlbmVycywgTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5uZXdNb2RlbChldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRXZlbnQoT2JqZWN0W10gbGlzdGVuZXJzLCBOb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm5vQ2hhbmdlKGV2ZW50KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFJlZ2lvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5yZWdpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLnJlZ2lvbnNSZXBsYWNlZChldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRXZlbnQoT2JqZWN0W10gbGlzdGVuZXJzLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5ub2Rlc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKE9iamVjdFtdIGxpc3RlbmVycykgewotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCS8vIE5vdGU6IHRoZSBkb2NFdmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2VUZXh0IEFQSQotCQkJLy8gZmlyZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gbm90aWNlIHRoZSBBYm91dFRvQmVDaGFuZ2VkRXZlbnQgaXMgY3JlYXRlZCBmcm9tIHRoZQotCQkJCQkvLyBEb2N1bWVudEV2ZW50LCBzaW5jZSBpdCBpcyAobmVhcmx5KQotCQkJCQkvLyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4gP1doYXQgdG8gZG8gYWJvdXQKLQkJCQkJLy8gb3JpZ2luYWxSZXF1ZXN0ZXI/Ci0JCQkJCWlmIChmRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQkJCQlmRG9jdW1lbnRFdmVudCA9IG5ldyBOdWxsRG9jdW1lbnRFdmVudCgpOwotCQkJCQl9Ci0JCQkJCUFib3V0VG9CZUNoYW5nZUV2ZW50IGFib3V0VG9CZUNoYW5nZWRFdmVudCA9IG5ldyBBYm91dFRvQmVDaGFuZ2VFdmVudCh0aGlzLCBudWxsLCBmRG9jdW1lbnRFdmVudC5nZXRUZXh0KCksIGZEb2N1bWVudEV2ZW50LmdldE9mZnNldCgpLCBmRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCSgoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbEFib3V0VG9CZUNoYW5nZWQoYWJvdXRUb0JlQ2hhbmdlZEV2ZW50KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3F1aXJlTG9jaygpIHsKLQkJLy8gZG8gbm90aGluZyBoZXJlIGluIHN1cGVyIGNsYXNzCi0JfQotCi0JLyoqCi0JICogYWRkTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvcgotCQkJCQkvLyBmaXJzdAotCQkJCQkvLyB0aW1lIHRocm91Z2gKLQkJCQkJb2xkU2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQl9Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQkJfQotCQkJCS8vIGFkZCBsaXN0ZW5lciB0byBsYXN0IHBvc2l0aW9uCi0JCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJCS8vCi0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJCS8vCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgU3RydWN0dXJlZERvY3VtZW50TGlzdG5lcnMgYW5kIE1vZGVsQ2hhZ25lZExpc3RlbmVycyBhcmUgdmVyeQotCSAqIHNpbWlsYXIuIFRoZXkgYm90aCByZWNlaXZlIGlkZW50aWNhbCBldmVudHMuIFRoZSBkaWZmZXJlbmNlIGlzIHRoZQotCSAqIHRpbWluZy4gVGhlICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVycyBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlCi0JICogc3RydWN0dXJlZERvY3VtZW50IGhhcyBiZWVuIGNoYW5nZWQsIGJ1dCBiZWZvcmUgb3RoZXIsIHJlbGF0ZWQgbW9kZWxzCi0JICogbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIHN1Y2ggYXMgdGhlIFN0cnVjdHVyYWwgTW9kZWwuIFRoZSBTdHJ1Y3R1cmFsCi0JICogbW9kZWwgaXMgaW4gZmFjdCBpdHNlbGYgYSAicHVyZSIgU3RydWN0dXJlZERvY3VtZW50TGlzdG5lci4gVGhlCi0JICogTW9kZWxDaGFuZ2VkTGlzdGVuZXJzIGNhbiByZXN0IGFzc3VyZWQgdGhhdCBhbGwgbW9kZWxzIGFuZCBkYXRhIGhhdmUKLQkgKiBiZWVuIHVwZGF0ZWQgZnJvbSB0aGUgY2hhbmdlIGJ5IHRoZSB0aWVtIHRoZXkgYXJlIG5vdGlmaWVkLiBUaGlzIGlzCi0JICogZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHRoZSB0ZXh0IHdpZGdldCwgZm9yIGV4YW1wbGUsIHdoaWNoIG1heSByZWx5Ci0JICogb24gYm90aCBzdHJ1Y3R1cmVkRG9jdW1lbnQgYW5kIHN0cnVjdHVyYWwgbW9kZWwgaW5mb3JtYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIuIFJlcXVlc3QgdG8gYWRkIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIuIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgd2FzIGFkZGVkZWQgbW9yZSB0aGFuIG9uY2UuICIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIuIEFkZGluZyBhbiBpbnN0YW5jZSBvZiAiICsgbGlzdGVuZXIuZ2V0Q2xhc3MoKSArICIgYXMgYSBsaXN0ZW5lciBvbiBzdHJ1Y3R1cmVkRG9jdW1lbnQuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQkvLwotCQkJCS8vIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZCwKLQkJCQkvLyBzZW5kIHRoZSBuZXcgbW9kZWwgZXZlbnQgdG8gdGhhdCBvbmUgcGFydGljdWxhciBsaXN0ZW5lciwKLQkJCQkvLyBzbyBpdAotCQkJCS8vIGNhbiBpbml0aWFsaXplIGl0c2VsZiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2RlbAotCQkJCS8vIGxpc3RlbmVyLm5ld01vZGVsKG5ldyBOZXdNb2RlbEV2ZW50KHRoaXMsIGxpc3RlbmVyKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuIFJlcXVlc3QgdG8gYWRkIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmFkZFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLiBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBhZGRlZGVkIG1vcmUgdGhhbiBvbmNlLiAiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmFkZFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLiBBZGRpbmcgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gc3RydWN0dXJlZERvY3VtZW50LiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpbnQgb2xkU2l6ZSA9IDA7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvcgotCQkJCQkvLyBmaXJzdAotCQkJCQkvLyB0aW1lIHRocm91Z2gKLQkJCQkJb2xkU2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQkJfQotCQkJCS8vIGFkZCBsaXN0ZW5lciB0byBsYXN0IHBvc2l0aW9uCi0JCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJCS8vCi0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQkvLwotCQkJCS8vIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZCwKLQkJCQkvLyBzZW5kIHRoZSBuZXcgbW9kZWwgZXZlbnQgdG8gdGhhdCBvbmUgcGFydGljdWxhciBsaXN0ZW5lciwKLQkJCQkvLyBzbyBpdAotCQkJCS8vIGNhbiBpbml0aWFsaXplIGl0c2VsZiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2RlbAotCQkJCS8vIGxpc3RlbmVyLm5ld01vZGVsKG5ldyBOZXdNb2RlbEV2ZW50KHRoaXMsIGxpc3RlbmVyKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBtYW5hZ2Ugb3VyIG93biBkb2N1bWVudCBsaXN0bmVycywgaW5zdGVhZCBvZiBkZWxlZ2F0aW5nIHRvIG91cgotCSAqIHBhcmVudERvY3VtZW50LCBzbyB3ZSBjYW4gZmlyZSBhdCB2ZXJ5IGVuZCAoYW5kIG5vdCB3aGVuIHRoZQotCSAqIHBhcmVudERvY3VtZW50IGNoYW5nZXMpLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmICghVXRpbGl0aWVzLmNvbnRhaW5zKGZEb2N1bWVudExpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmRG9jdW1lbnRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmRG9jdW1lbnRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCX0KLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJCUlEb2N1bWVudExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbnVsbDsKLQkJCQluZXdMaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbbmV3U2l6ZV07Ci0JCQkJaWYgKGZEb2N1bWVudExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZkRvY3VtZW50TGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCQkJZkRvY3VtZW50TGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2FkZERvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikKLQkgKiAKLQkgKiBSZWdpc3RlcnMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBsaXN0ZW5lciB3aXRoIHRoZSBkb2N1bWVudC4gQWZ0ZXIKLQkgKiByZWdpc3RyYXRpb24gdGhlIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyIGlzIGluZm9ybWVkIGFib3V0IGVhY2gKLQkgKiBwYXJ0aXRpb24gY2hhbmdlIGNhdXNlIGJ5IGEgZG9jdW1lbnQgbWFuaXB1bGF0aW9uLiBJZiBhIGRvY3VtZW50Ci0JICogcGFydGl0aW9uaW5nIGxpc3RlbmVyIGlzIGFsc28gYSBkb2N1bWVudCBsaXN0ZW5lciwgdGhlIGZvbGxvd2luZwotCSAqIG5vdGlmaWNhdGlvbiBzZXF1ZW5jZSBpcyBndWFyYW50ZWVkIGlmIGEgZG9jdW1lbnQgbWFuaXB1bGF0aW9uIGNoYW5nZXMKLQkgKiB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nOiAxKQotCSAqIGxpc3RlbmVyLmRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50KTsgMikKLQkgKiBsaXN0ZW5lci5kb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoKTsgMykKLQkgKiBsaXN0ZW5lci5kb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCk7IElmIHRoZSBsaXN0ZW5lciBpcyBhbHJlYWR5Ci0JICogcmVnaXN0ZXJlZCBub3RoaW5nIGhhcHBlbnMuCi0JICogCi0JICogQHNlZSBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlBc3NlcnQuaXNOb3ROdWxsKGxpc3RlbmVyKTsKLQkJCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQl9Ci0JCQlpZiAoIWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQkJZkRvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBwb3NpdGlvbiB0byB0aGUgZG9jdW1lbnQncyBkZWZhdWx0IHBvc2l0aW9uIGNhdGVnb3J5LiBUaGUKLQkgKiBkZWZhdWx0IGNhdGVnb3J5IG11c3QgYmUgc3BlY2lmaWVkIGJ5IHRoZSBpbXBsZW1lbnRlci4gQSBwb3NpdGlvbiB0aGF0Ci0JICogaGFzIGJlZW4gYWRkZWQgdG8gYSBwb3NpdGlvbiBjYXRlZ29yeSBpcyB1cGRhdGVkIGF0IGVhY2ggY2hhbmdlIGFwcGxpZWQKLQkgKiB0byB0aGUgZG9jdW1lbnQuCi0JICogCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5hZGRQb3NpdGlvbihwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjYWRkUG9zaXRpb24KLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgcG9zaXRpb24gaXMgbm90IGEgdmFsaWQgcmFuZ2UgaW4gdGhlIGRvY3VtZW50Ci0JICogQGV4Y2VwdGlvbiBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIGNhdGVnb3J5IGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5hZGRQb3NpdGlvbihjYXRlZ29yeSwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2FkZFBvc2l0aW9uQ2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQlpbnRlcm5hbF9hZGRQb3NpdGlvbkNhdGVnb3J5KGNhdGVnb3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNhZGRQb3NpdGlvblVwZGF0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWludGVybmFsX2FkZFBvc2l0aW9uVXBkYXRlcih1cGRhdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBkb2N1bWVudCBsaXN0ZW5lciBhcyBvbmUgd2hpY2ggaXMgbm90aWZpZWQgYmVmb3JlIHRob3NlCi0JICogZG9jdW1lbnQgbGlzdGVuZXJzIGFkZGVkIHdpdGggPGNvZGU+YWRkRG9jdW1lbnRMaXN0ZW5lcjwvY29kZT4gYXJlCi0JICogbm90aWZpZWQuIElmIHRoZSBnaXZlbiBsaXN0ZW5lciBpcyBhbHNvIHJlZ2lzdGVyZWQgdXNpbmcKLQkgKiA8Y29kZT5hZGREb2N1bWVudExpc3RlbmVyPC9jb2RlPiBpdCB3aWxsIGJlIG5vdGlmaWVkIHR3aWNlLiBJZiB0aGUKLQkgKiBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgbm90aGluZyBoYXBwZW5zLgotCSAqIDxwPgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBmb3IgcHVibGljIHVzZSwgaXQgbWF5IG9ubHkgYmUgY2FsbGVkIGJ5Ci0JICogaW1wbGVtZW50ZXJzIG9mIDxjb2RlPklEb2N1bWVudEFkYXB0ZXI8L2NvZGU+IGFuZCBvbmx5IGlmIHRob3NlCi0JICogaW1wbGVtZW50ZXJzIG5lZWQgdG8gaW1wbGVtZW50IDxjb2RlPklEb2N1bWVudExpc3RlbmVyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRBZGFwdGVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQgYXMgcHJlbm90aWZpZWQgZG9jdW1lbnQgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgZG9jdW1lbnRBZGFwdGVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmIChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJaW50IHByZXZpb3VzU2l6ZSA9IGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcltwcmV2aW91c1NpemUgKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCAwLCBsaXN0ZW5lcnMsIDAsIHByZXZpb3VzU2l6ZSk7Ci0JCQkJbGlzdGVuZXJzW3ByZXZpb3VzU2l6ZV0gPSBkb2N1bWVudEFkYXB0ZXI7Ci0JCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQl9IGVsc2UgewotCQkJCWZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzID0gbmV3IElEb2N1bWVudExpc3RlbmVyWzFdOwotCQkJCWZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzWzBdID0gZG9jdW1lbnRBZGFwdGVyOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2NoYXJBdChpbnQpCi0JICovCi0JcHVibGljIGNoYXIgY2hhckF0KGludCBhcmcwKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0Q2hhcigwKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQVBJIHJlbW92ZXMgYWxsIHJlYWQgb25seSBwb3NpdGlvbnMsIGFzIHNob3VsZCBiZSBkb25lCi0JICogd2UgJ3NldFRleHQnIGlzIGNhbGxlZC4gTm90ZTogYW4gYWx0ZXJuYXRpdmUgYWxnb3JpdGhtIG1heSBzaW1wbHkKLQkgKiByZW1vdmUgdGhlIGNhdGVnb3J5IChhbmQgaXQgd291bGQgZ2V0IGFkZGVkIGJhY2sgaW4gbGF0ZXIsIGlmL3doZW4KLQkgKiByZWFkb25seSByZWdpb25zIGFkZGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhclJlYWRPbmx5KCkgewotCQlQb3NpdGlvbltdIHBvc2l0aW9ucyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwb3NpdGlvbnMgPSBnZXRQb3NpdGlvbnMoUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkpOwotCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2dyYW0gZXJyb3I6IHNob3VsZCBuZXZlciBvY2N1ciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVBvc2l0aW9uIHBvc2l0aW9uID0gcG9zaXRpb25zW2ldOwotCQkJLy8gbm90ZSB3ZSBkb24ndCBmaXJlIHRoZSAiYWJvdXQgdG8gY2hhbmdlIiBvciAiY2hhbmdlZCIgZXZlbnRzLAotCQkJLy8gc2luY2UgcHJlc3VtYWJseSwgdGV4dCBpcyBhbGwgZ29pbmcgYXdheSBhbmQgYmVpbmcgcmVwbGFjZWQKLQkJCS8vIGFueXdheS4KLQkJCXBvc2l0aW9uLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNjbGVhclJlYWRPbmx5KGludCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQkvLyBUT0RPIERXIEkgc3RpbGwgbmVlZCB0byBpbXBsZW1lbnQgc21hcnRlciBhbGdvcml0aG0gdGhhdAotCQkvLyBhZHVzdCBleGlzdGluZyBSTyByZWdpb25zLCBpZiBuZWVkZWQuIEZvciBub3csIEknbGwganVzdAotCQkvLyByZW1vdmUgYW55IHRoYXQgb3ZlcmxhcC4KLQkJdHJ5IHsKLQkJCVBvc2l0aW9uW10gcG9zaXRpb25zID0gZ2V0UG9zaXRpb25zKFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkJaWYgKHBvc2l0aW9uLm92ZXJsYXBzV2l0aChzdGFydE9mZnNldCwgbGVuZ3RoKSkgewotCQkJCQlTdHJpbmcgZWZmZWN0ZWRUZXh0ID0gdGhpcy5nZXQoc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCS8vIGZEb2N1bWVudEV2ZW50ID0gbmV3IERvY3VtZW50RXZlbnQodGhpcywgc3RhcnRPZmZzZXQsCi0JCQkJCS8vIGxlbmd0aCwgZWZmZWN0ZWRUZXh0KTsKLQkJCQkJZmlyZVJlYWRPbmx5QWJvdXRUb0JlQ2hhbmdlZCgpOwotCQkJCQlwb3NpdGlvbi5kZWxldGUoKTsKLQkJCQkJTm9DaGFuZ2VFdmVudCBub0NoYW5nZUV2ZW50ID0gbmV3IE5vQ2hhbmdlRXZlbnQodGhpcywgbnVsbCwgZWZmZWN0ZWRUZXh0LCBzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJbm9DaGFuZ2VFdmVudC5yZWFzb24gPSBOb0NoYW5nZUV2ZW50LlJFQURfT05MWV9TVEFURV9DSEFOR0U7Ci0JCQkJCWZpcmVSZWFkT25seVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KG5vQ2hhbmdlRXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IG1lYW5zIG5vIHJlYWRvbmx5IHJlZ2lvbnMgYmVlbiBkZWZpbmVkIHlldAotCQkJLy8gc28gbm90aGluZyB0byBkby4KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBpbmRleCBhdCB3aGljaCBhIDxjb2RlPlBvc2l0aW9uPC9jb2RlPiB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBvZmZzZXQgd291bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZ2l2ZW4gY2F0ZWdvcnkuIEFzIHRoZQotCSAqIG9yZGVyaW5nIGluc2lkZSBhIGNhdGVnb3J5IG9ubHkgZGVwZW5kcyBvbiB0aGUgb2Zmc2V0LCB0aGUgaW5kZXggbXVzdAotCSAqIGJlIGNob29zZW4gdG8gYmUgdGhlIGZpcnN0IG9mIGFsbCBwb3NpdGlvbnMgd2l0aCB0aGUgc2FtZSBvZmZzZXQuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICB0aGUgY2F0ZWdvcnkgaW4gd2hpY2ggd291bGQgYmUgYWRkZWQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2Zmc2V0IHRvIGJlIGNvbnNpZGVyZWQKLQkgKiBAcmV0dXJuIHRoZSBpbmRleCBpbnRvIHRoZSBjYXRlZ29yeQotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBvZmZzZXQgaXMgaW52YWxpZCBpbiB0aGlzIGRvY3VtZW50Ci0JICogQGV4Y2VwdGlvbiBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgY2F0ZWdvcnkgaXMgdW5kZWZpbmVkIGluIHRoaXMgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXB1dGVJbmRleEluQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5LCBpbnQgb2Zmc2V0KSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmNvbXB1dGVJbmRleEluQ2F0ZWdvcnkoY2F0ZWdvcnksIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZ2l2ZW4gdGV4dC4gRm9yIGEgZ2l2ZW4gaW1wbGVtZW50ZXIKLQkgKiBvZiB0aGlzIGludGVyZmFjZSB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzYW1lIHJlc3VsdCBhcwotCSAqIDxjb2RlPnNldCh0ZXh0KTsgZ2V0TnVtYmVyT2ZMaW5lcygpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgd2hvc2UgbnVtYmVyIG9mIGxpbmVzIHNob3VsZCBiZSBjb21wdXRlZAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZ2l2ZW4gdGV4dAotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZU51bWJlck9mTGluZXMoU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5jb21wdXRlTnVtYmVyT2ZMaW5lcyh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgcGFydGl0aW9uaW5nIG9mIHRoZSBnaXZlbiBkb2N1bWVudCByYW5nZSB1c2luZyB0aGUKLQkgKiBkb2N1bWVudCdzIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBvZmZzZXQgYXQgd2hpY2ggdGhlIHJhbmdlIHN0YXJ0cwotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJhbmdlCi0JICogQHJldHVybiBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHJhbmdlJ3MgcGFydGl0aW9uaW5nCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJSVR5cGVkUmVnaW9uW10gdHlwZWRSZWdpb25zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXR5cGVkUmVnaW9ucyA9IGNvbXB1dGVQYXJ0aXRpb25pbmcoSVN0cnVjdHVyZWREb2N1bWVudC5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIGxlbmd0aCwgZmFsc2UpOwotCQl9IGNhdGNoIChCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlpZiAodHlwZWRSZWdpb25zID09IG51bGwpIHsKLQkJCXR5cGVkUmVnaW9ucyA9IG5ldyBJVHlwZWRSZWdpb25bMF07Ci0JCX0KLQkJcmV0dXJuIHR5cGVkUmVnaW9uczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zI2NvbXB1dGVaZXJvTGVuZ3RoUGFydGl0aW9uaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBpbnQsIGludCkKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoU3RyaW5nIHBhcnRpdGlvbmluZywgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBpbmNsdWRlWmVyb0xlbmd0aFBhcnRpdGlvbnMpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIHsKLQkJaWYgKCgwID4gb2Zmc2V0KSB8fCAoMCA+IGxlbmd0aCkgfHwgKG9mZnNldCArIGxlbmd0aCA+IGdldExlbmd0aCgpKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCi0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25pbmcpOwotCi0JCWlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikKLQkJCXJldHVybiAoKElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikgcGFydGl0aW9uZXIpLmNvbXB1dGVQYXJ0aXRpb25pbmcob2Zmc2V0LCBsZW5ndGgsIGluY2x1ZGVaZXJvTGVuZ3RoUGFydGl0aW9ucyk7Ci0JCWVsc2UgaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpCi0JCQlyZXR1cm4gcGFydGl0aW9uZXIuY29tcHV0ZVBhcnRpdGlvbmluZyhvZmZzZXQsIGxlbmd0aCk7Ci0JCWVsc2UgaWYgKElTdHJ1Y3R1cmVkRG9jdW1lbnQuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORy5lcXVhbHMocGFydGl0aW9uaW5nKSkKLQkJCXJldHVybiBuZXcgVHlwZWRSZWdpb25bXXtuZXcgVHlwZWRSZWdpb24ob2Zmc2V0LCBsZW5ndGgsIERFRkFVTFRfQ09OVEVOVF9UWVBFKX07Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmNvbnRhaW5zUG9zaXRpb24oY2F0ZWdvcnksIG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXJldHVybiBnZXRQb3NpdGlvbk1hbmFnZXIoKS5jb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoY2F0ZWdvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjY29udGFpbnNSZWFkT25seShpbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVBvc2l0aW9uW10gcG9zaXRpb25zID0gZ2V0UG9zaXRpb25zKFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkJaWYgKHBvc2l0aW9uLm92ZXJsYXBzV2l0aChzdGFydE9mZnNldCwgbGVuZ3RoKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBtZWFucyBubyByZWFkb25seSByZWdpb25zIGJlZW4gZGVmaW5lZCB5ZXQKLQkJCS8vIHNvIG9idmlvdXNseSBmYWxzZQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVBvc3ROb3RpZmljYXRpb25DaGFuZ2VzKCkgewotCQlpZiAoZlN0b3BwZWRDb3VudCA+IDApCi0JCQlyZXR1cm47Ci0JCXdoaWxlIChmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgIT0gbnVsbCkgewotCQkJTGlzdCBjaGFuZ2VzID0gZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzOwotCQkJZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzID0gbnVsbDsKLQkJCUl0ZXJhdG9yIGUgPSBjaGFuZ2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlSZWdpc3RlcmVkUmVwbGFjZSByZXBsYWNlID0gKFJlZ2lzdGVyZWRSZXBsYWNlKSBlLm5leHQoKTsKLQkJCQlyZXBsYWNlLmZSZXBsYWNlLnBlcmZvcm0odGhpcywgcmVwbGFjZS5mT3duZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2VkKCkgewotCQkvLyBtb3N0IERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCBsaXN0ZW5lcnMgZG8gbm90IGFudGljaXBhdGUKLQkJLy8gRG9jdW1lbnRFdmVudCA9PSBudWxsLiBTbyBtYWtlIHN1cmUgZG9jdW1lbnRFdmVudCBpcyBub3QKLQkJLy8gbnVsbC4gKHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgeWV0IGl0IGRvZXMgc29tZXRpbWVzKQotCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJfQotCQkKLQkJX2ZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzKTsKLQkJLy8gTm90ZTogdGhlIGRvY0V2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZVRleHQgQVBJISAob3Igc2V0IFRleHQpCi0JCV9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzKTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNBYm91dFRvQ2hhbmdlKGZEb2N1bWVudEV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2UoZkRvY3VtZW50TGlzdGVuZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGNoYW5nZWQgbm90aWZpY2F0aW9uIHRvIGFsbCByZWdpc3RlcmVkCi0JICogZG9jdW1lbnQgcGFydGl0aW9uaW5nIGxpc3RlbmVycy4gVXNlcyBhIHJvYnVzdCBpdGVyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgY2hhbmdlZCBldmVudAotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24yCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyA9PSBudWxsIHx8IGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyk7Ci0JCUl0ZXJhdG9yIGUgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbCA9IChJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikgZS5uZXh0KCk7Ci0JCQlpZiAobCBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMikgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMiBleHRlbnNpb24yID0gKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMikgbDsKLQkJCQlleHRlbnNpb24yLmRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JCQl9IGVsc2UgaWYgKGwgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbikgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbikgbDsKLQkJCQlleHRlbnNpb24uZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKHRoaXMsIGV2ZW50LmdldENvdmVyYWdlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlsLmRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCh0aGlzKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVSZWFkT25seUFib3V0VG9CZUNoYW5nZWQoKSB7Ci0JCV9maXJlU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZShmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyk7Ci0JCS8vIE5vdGU6IHRoZSBkb2NFdmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2VUZXh0IEFQSSEgKG9yIHNldCBUZXh0KQotCQkvLyBfZmlyZURvY3VtZW50QWJvdXRUb0NoYW5nZShmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyk7Ci0JCS8vIF9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZEb2N1bWVudExpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVSZWFkT25seVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KE5vQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgZXZlbnQpOwotCQkvLyBfZmlyZURvY3VtZW50Q2hhbmdlZChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQkvLyBfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJLy8gX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZkRvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCV9jbGVhckRvY3VtZW50RXZlbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KE5vQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0RvY3VtZW50Q2hhbmdlZChldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0RvY3VtZW50Q2hhbmdlZChldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZkRvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCV9jbGVhckRvY3VtZW50RXZlbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50J3MgY29tcGxldGUgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldCgpIHsKLQkJcmV0dXJuIGdldFN0b3JlKCkuZ2V0KDAsIGdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxlbmd0aCBjaGFyYWN0ZXJzIGZyb20gdGhlIGRvY3VtZW50J3MgdGV4dCBzdGFydGluZyBmcm9tIHRoZQotCSAqIHNwZWNpZmllZCBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSByYW5nZSBpcyBub3QgdmFsaWQgaW4gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaW50IG15TGVuZ3RoID0gZ2V0TGVuZ3RoKCk7Ci0JCWlmICgwID4gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gMDsKLQkJaWYgKDAgPiBsZW5ndGgpCi0JCQlsZW5ndGggPSAwOwotCQlpZiAob2Zmc2V0ICsgbGVuZ3RoID4gbXlMZW5ndGgpIHsKLQkJCS8vIGZpcnN0IHRyeSBhZGp1c3RpbmcgbGVuZ3RoIHRvIGZpdAotCQkJaW50IGxlc3NMZW5ndGggPSBteUxlbmd0aCAtIG9mZnNldDsKLQkJCWlmICgobGVzc0xlbmd0aCA+PSAwKSAmJiAob2Zmc2V0ICsgbGVzc0xlbmd0aCA9PSBteUxlbmd0aCkpIHsKLQkJCQlsZW5ndGggPSBsZXNzTGVuZ3RoOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzZWNvbmQsIHRyeSBvZmZzZXQKLQkJCQlpbnQgbW9yZU9mZnNldCA9IG15TGVuZ3RoIC0gbGVuZ3RoOwotCQkJCWlmICgobW9yZU9mZnNldCA+PSAwKSAmJiAobW9yZU9mZnNldCArIGxlbmd0aCA9PSBteUxlbmd0aCkpIHsKLQkJCQkJb2Zmc2V0ID0gbW9yZU9mZnNldDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCQkJCXRocm93IG5ldyBFcnJvcigpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCS8vIGlmICgoMCA+IG9mZnNldCkgfHwgKDAgPiBsZW5ndGgpIHx8IChvZmZzZXQgKyBsZW5ndGggPiBteUxlbmd0aCkpCi0JCS8vIHRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCQlyZXN1bHQgPSBnZXRTdG9yZSgpLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5jb3JlLklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldENhY2hlZERvY3VtZW50UmVnaW9uKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChVU0VfTE9DQUxfVEhSRUFEKSB7Ci0JCQlyZXN1bHQgPSBmQ3VycmVudERvY3VtbmV0UmVnaW9uQ2FjaGUuZ2V0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjYWNoZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2dldENoYXIKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgcG9zaXRpb24gaXMgbm90IGEgdmFsaWQgcmFuZ2UgaW4gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGNoYXIgZ2V0Q2hhcihpbnQgcG9zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQljaGFyIHJlc3VsdCA9IDB4MDA7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXRTdG9yZSgpLmdldChwb3MpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBkb2N1bWVudCBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4KLQkgKiBjaGFyYWN0ZXIgcG9zaXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpLmdldENvbnRlbnRUeXBlKG9mZnNldCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMyNnZXRaZXJvTGVuZ3RoQ29udGVudFR5cGUoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGludCkKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShTdHJpbmcgcGFydGl0aW9uaW5nLCBpbnQgb2Zmc2V0LCBib29sZWFuIHByZWZlck9wZW5QYXJ0aXRpb25zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCWlmICgoMCA+IG9mZnNldCkgfHwgKG9mZnNldCA+IGdldExlbmd0aCgpKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCi0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25pbmcpOwotCi0JCWlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikKLQkJCXJldHVybiAoKElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikgcGFydGl0aW9uZXIpLmdldENvbnRlbnRUeXBlKG9mZnNldCwgcHJlZmVyT3BlblBhcnRpdGlvbnMpOwotCQllbHNlIGlmIChwYXJ0aXRpb25lciAhPSBudWxsKQotCQkJcmV0dXJuIHBhcnRpdGlvbmVyLmdldENvbnRlbnRUeXBlKG9mZnNldCk7Ci0JCWVsc2UgaWYgKElTdHJ1Y3R1cmVkRG9jdW1lbnQuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORy5lcXVhbHMocGFydGl0aW9uaW5nKSkKLQkJCXJldHVybiBERUZBVUxUX0NPTlRFTlRfVFlQRTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50J3MgcGFydGl0aW9uZXIuCi0JICogCi0JICogQHNlZSBJRG9jdW1lbnRQYXJ0aXRpb25lcgotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJRG9jdW1lbnRFeHRlbnNpb24zLkRFRkFVTFRfUEFSVElUSU9OSU5HKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zI2dldERvY3VtZW50UGFydGl0aW9uZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERvY3VtZW50UGFydGl0aW9uZXIoU3RyaW5nIHBhcnRpdGlvbmluZykgewotCi0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIGRvY3VtZW50UGFydGl0aW9uZXIgPSBudWxsOwotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzICE9IG51bGwpIHsKLQkJCWRvY3VtZW50UGFydGl0aW9uZXIgPSAoSURvY3VtZW50UGFydGl0aW9uZXIpIGZEb2N1bWVudFBhcnRpdGlvbmVycy5nZXQocGFydGl0aW9uaW5nKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRQYXJ0aXRpb25lcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50I2dldEVuY29kaW5nTWVtZW50bygpCi0JICovCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJldHVybiBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCS8vIHNob3VsZCB3ZSB1cGRhdGUgY2FjaGVkTm9kZT8KLQkJLy8gV2Ugc2hvdWxkIHRvIGtlZXAgY29uc2lzdGVudCBwaGlsb3NvcGh5IG9mIHJlbWVtYmVyaW5nIGxhc3QKLQkJLy8gcmVxdWVzdGVkIHBvc2l0aW9uLAotCQkvLyBmb3IgZWZmaWNpZW5jeS4KLQkJc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oZmlyc3REb2N1bWVudFJlZ2lvbik7Ci0JCXJldHVybiBmaXJzdERvY3VtZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCS8vIHNob3VsZCB3ZSB1cGRhdGUgY2FjaGVkTm9kZT8KLQkJLy8gV2Ugc2hvdWxkIHRvIGtlZXAgY29uc2lzdGVudCBwaGlsb3NvcGh5IG9mIHJlbWVtYmVyaW5nIGxhc3QKLQkJLy8gcmVxdWVzdGVkIHBvc2l0aW9uLAotCQkvLyBmb3IgZWZmaWNpZW5jeS4KLQkJc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24obGFzdERvY3VtZW50UmVnaW9uKTsKLQkJcmV0dXJuIGxhc3REb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBhcnRpdGlvbnMKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZ2V0TGVnYWxDb250ZW50VHlwZXMoSVN0cnVjdHVyZWREb2N1bWVudC5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKTsKLQkJfSBjYXRjaCAoQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zI2dldExlZ2FsQ29udGVudFR5cGVzKGphdmEubGFuZy5TdHJpbmcpCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbENvbnRlbnRUeXBlcyhTdHJpbmcgcGFydGl0aW9uaW5nKSB0aHJvd3MgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIHsKLQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBnZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmluZyk7Ci0JCWlmIChwYXJ0aXRpb25lciAhPSBudWxsKQotCQkJcmV0dXJuIHBhcnRpdGlvbmVyLmdldExlZ2FsQ29udGVudFR5cGVzKCk7Ci0JCWlmIChJU3RydWN0dXJlZERvY3VtZW50LkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcuZXF1YWxzKHBhcnRpdGlvbmluZykpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0RFRkFVTFRfQ09OVEVOVF9UWVBFfTsKLQkJdGhyb3cgbmV3IEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tIGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjZ2V0TGVuZ3RoCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRTdG9yZSgpLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJaWYgKHByZWZlcmVkRGVsaW1pdGVyID09IG51bGwpIHsKLQkJCXByZWZlcmVkRGVsaW1pdGVyID0gUGxhdGZvcm1MaW5lRGVsaW1pdGVyOwotCQl9Ci0JCXJldHVybiBwcmVmZXJlZERlbGltaXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5lIGRlbGltaXRlciBvZiB0aGF0IGxpbmUKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIGxpbmUgbnVtYmVyIGlzIGludmFsaWQgaW4gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKGludCBsaW5lKSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGluZURlbGltaXRlcihsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIHNwZWNpZmllZCBsaW5lLiBUaGUgbGluZSBpcyBkZXNjcmliZWQgYnkKLQkgKiBpdHMgb2Zmc2V0IGFuZCBpdHMgbGVuZ3RoIGV4Y2x1ZGluZyB0aGUgbGluZSdzIGRlbGltaXRlci4KLQkgKiAKLQkgKiBAcGFyYW0gbGluZQotCSAqICAgICAgICAgICAgdGhlIGxpbmUgb2YgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIGEgbGluZSBkZXNjcmlwdGlvbgotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGluZSBudW1iZXIgaXMgaW52YWxpZCBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBnZXRMaW5lSW5mb3JtYXRpb24oaW50IGxpbmUpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lSW5mb3JtYXRpb24obGluZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBvZmZzZXQuIFRoZSBkZXNjcmlwdGlvbgotCSAqIGNvbnRhaW5zIHRoZSBvZmZzZXQgYW5kIHRoZSBsZW5ndGggb2YgdGhlIGxpbmUgZXhjbHVkaW5nIHRoZSBsaW5lJ3MKLQkgKiBkZWxpbWl0ZXIuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aG9zZSBsaW5lIHNob3VsZCBiZSBkZXNjcmliZWQKLQkgKiBAcmV0dXJuIGEgcmVnaW9uIGRlc2NyaWJpbmcgdGhlIGxpbmUKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIGludmFsaWQgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoaW50IG9mZnNldCkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCk7Ci0JfQotCi0JLyoKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxpbmUgaW5mb3JtYXRpb24KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZUxlbmd0aChpbnQgbGluZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExpbmVMZW5ndGgobGluZSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGdpdmVuIGxpbmUuCi0JICogCi0JICogQHBhcmFtIGxpbmUKLQkgKiAgICAgICAgICAgIHRoZSBsaW5lIG9mIGludGVyZXN0Ci0JICogQHJldHVybiB0aGUgZG9jdW1lbnQgb2Zmc2V0Ci0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsaW5lIG51bWJlciBpcyBpbnZhbGlkIGluIHRoaXMgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVPZmZzZXQoaW50IGxpbmUpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZU9mT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZ2V0VHJhY2tlcigpLmdldExpbmVOdW1iZXJPZk9mZnNldChvZmZzZXQpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIudHJhY2VFeGNlcHRpb24oIklTdHJ1Y3R1cmVkRG9jdW1lbnQiLCAiRGV2LiBQcm9ncmFtIEluZm8gT25seTogSVN0cnVjdHVyZWREb2N1bWVudDo6Z2V0TGluZU9mT2Zmc2V0OiBvZmZzZXQgb3V0IG9mIHJhbmdlLCB6ZXJvIGFzc3VtZWQuIG9mZnNldCA9ICIgKyBvZmZzZXQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJlc3VsdCA9IDA7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhpcyBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldE51bWJlck9mTGluZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGluZXMgd2hpY2ggYXJlIG9jY3VwaWVkIGJ5IGEgZ2l2ZW4gdGV4dCByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgdGV4dCByYW5nZQotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHNwZWNpZmllZCB0ZXh0IHJhbmdlCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIG9jY3VwaWVkIGJ5IHRoZSBzcGVjaWZpZWQgcmFuZ2UKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgc3BlY2lmaWVkIHJhbmdlIGlzIGludmFsaWQgaW4gdGhpcyB0cmFja2VyCi0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXROdW1iZXJPZkxpbmVzKG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHB1YmxpYywgZm9yIHVzZSBieSB0YWcgbGliIGNsYXNzZXMuCi0JICovCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChmUGFyc2VyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbigiSVN0cnVjdHVyZWREb2N1bWVudDo6Z2V0UGFyc2VyLiBQYXJzZXIgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gZlBhcnNlciA9IGdldFBhcnNlckZhY3RvcnkoKS5jcmVhdGVQYXJzZXIoZlR5cGUpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbmZvcm1hdGlvbjoKLQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmdldFBhcnNlci4KLQkJCS8vIFhNTCBQYXJzZXIgYXNzdW1lZC4iKTsKLQkJCS8vIGZQYXJzZXIgPSBuZXcgWE1MU291cmNlUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgcGFydGl0aW9uIGluIHdoaWNoIHRoZSBwb3NpdGlvbiBpcyBsb2NhdGVkLiBUaGUKLQkgKiBwYXJ0aXRpb24gaXMgc3BlY2lmaWVkIGFzIHR5cGVkIHJlZ2lvbi4KLQkgKi8KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnRpdGlvbiA9IGdldFBhcnRpdGlvbihJU3RydWN0dXJlZERvY3VtZW50LkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIG9mZnNldCwgZmFsc2UpOwotCQl9IGNhdGNoIChCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCWlmIChwYXJ0aXRpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEVycm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zI2dldFplcm9MZW5ndGhQYXJ0aXRpb24oamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGludCkKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oU3RyaW5nIHBhcnRpdGlvbmluZywgaW50IG9mZnNldCwgYm9vbGVhbiBwcmVmZXJPcGVuUGFydGl0aW9ucykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gewotCQlpZiAoKDAgPiBvZmZzZXQpIHx8IChvZmZzZXQgPiBnZXRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQkJSVR5cGVkUmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0KLQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBnZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmluZyk7Ci0KLQkJaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24yKSB7Ci0JCQlyZXN1bHQgPSAoKElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikgcGFydGl0aW9uZXIpLmdldFBhcnRpdGlvbihvZmZzZXQsIHByZWZlck9wZW5QYXJ0aXRpb25zKTsKLQkJfSBlbHNlIGlmIChwYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBwYXJ0aXRpb25lci5nZXRQYXJ0aXRpb24ob2Zmc2V0KTsKLQkJfSBlbHNlIGlmIChJU3RydWN0dXJlZERvY3VtZW50LkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcuZXF1YWxzKHBhcnRpdGlvbmluZykpIHsKLQkJCXJlc3VsdCA9IG5ldyBUeXBlZFJlZ2lvbigwLCBnZXRMZW5ndGgoKSwgREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQl9IGVsc2UKLQkJCXRocm93IG5ldyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjMjZ2V0UGFydGl0aW9uaW5ncygpCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0aXRpb25pbmdzKCkgewotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gcGFydGl0aW9uaW5ncyA9IG5ldyBTdHJpbmdbZkRvY3VtZW50UGFydGl0aW9uZXJzLnNpemUoKV07Ci0JCWZEb2N1bWVudFBhcnRpdGlvbmVycy5rZXlTZXQoKS50b0FycmF5KHBhcnRpdGlvbmluZ3MpOwotCQlyZXR1cm4gcGFydGl0aW9uaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBwb3NpdGlvbiBjYXRlZ29yaWVzIGFkZGVkIHRvIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBvc2l0aW9uQ2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9uQ2F0ZWdvcmllcygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9zaXRpb25NYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciBnZXRQb3NpdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChmUG9zaXRpb25NYW5hZ2VyID09IG51bGwpIHsKLQkJCWZQb3NpdGlvbk1hbmFnZXIgPSBuZXcgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gZlBvc2l0aW9uTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBQb3NpdGlvbnMgb2YgdGhlIGdpdmVuIHBvc2l0aW9uIGNhdGVnb3J5LgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGNhdGVnb3J5IGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRQb3NpdGlvbnMoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9ucyhjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjZ2V0UG9zaXRpb25VcGRhdGVycwotCSAqLwotCXB1YmxpYyBJUG9zaXRpb25VcGRhdGVyW10gZ2V0UG9zaXRpb25VcGRhdGVycygpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9uVXBkYXRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIHdoaWNoIGlzIHRoZSBjYXNlIGlmIHRoZSBvZmZzZXQgaXMganVzdAotCSAqIGJlZm9yZSBvciBqdXN0IGFmdGVyIHRoZSBleGlzdGluZyB0ZXh0LiBDb21wYXJlIHdpdGgKLQkgKiBnZXROb2RlQXRDaGFyYWN0ZXJPZmZzZXQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gRklYTUU6IG5lZWQgdG8gc3luY2ggb24gJ2NhY2hlZFJlZ2lvbicgKGJ1dCBzaW5jZSB0aGF0J3MgYQotCQkvLyBjb25zdGFudGx5IGNoYW5naW5nIG9iamVjdCwgd2UKLQkJLy8gY2FuJ3QsIHNvIG5lZWQgdG8gYWRkIGEgInJlZ2lvbl9sb2NrIiBvYmplY3QsIGFuZCB1c2UgaXQgaGVyZSwgYW5kCi0JCS8vIGluIHJlLXBhcnNlci4KLQkJLy8gT2gsIGFuZCBuZWVkIHRvIG1ha2Ugc3VyZSwgYWZ0ZXIgc3luY2gsIHRoYXQgdGhlIHJlZ2lvbiBpcyBub3QKLQkJLy8gZGVsZXRlZCwgYW5kIGlmIHNvLCBJIGd1ZXNzIGdvIGJhY2sKLQkJLy8gdG8gdGhlIGJlZ2lubmluZyEKLQotCQkvLyBjYWNoZWQgbm9kZSBjYW4gYmUgbnVsbCB3aGVuIGRvY3VtZW50IGlzIGVtcHR5Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG90ZW50aWFsQ2FjaGVkUmVnaW9uID0gZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHBvdGVudGlhbENhY2hlZFJlZ2lvbiAhPSBudWxsKSB7Ci0KLQkJCS8vIAotCi0JCQkvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IG5vZGUsIHJldHVybiB0aGF0LgotCQkJaWYgKHBvdGVudGlhbENhY2hlZFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJcmVzdWx0ID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBmaXJzdCwgZmluZCBvdXQgd2hhdCBkaXJlY3Rpb24gdG8gZ28sIHJlbGF0aXZlIHRvCi0JCQkJLy8gY2FjaGVkTm9kZS4KLQkJCQkvLyBuZWdhdGl2ZSBtZWFucyAidG93YXJkcyB0aGUgZnJvbnQiIG9mIHRoZSBmaWxlLAotCQkJCS8vIHBvc3RpdGl2ZQotCQkJCS8vIG1lYW5zCi0JCQkJLy8gdG93YXJkcyB0aGUgZW5kLgotCQkJCWludCBkaXJlY3Rpb24gPSBvZmZzZXQgLSBwb3RlbnRpYWxDYWNoZWRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQlpZiAoZGlyZWN0aW9uIDwgMCkgewotCQkJCQkvLyBzZWFyY2ggdG93YXJkcyBiZWdpbm5pbmcKLQkJCQkJd2hpbGUgKCFwb3RlbnRpYWxDYWNoZWRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0ZW1wTm9kZSA9IHBvdGVudGlhbENhY2hlZFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJCQkJaWYgKHRlbXBOb2RlID09IG51bGwpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcG90ZW50aWFsQ2FjaGVkUmVnaW9uID0gdGVtcE5vZGU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBzZWFyY2ggdG93YXJkcyBlbmQKLQkJCQkJLy8gVGhlcmUgaXMgYSBsZWdpdGFtYXQgY29uZGl0aW9uIHdoZXJlIHRoZQotCQkJCQkvLyBvZmZzZXQgd2lsbCBub3QgYmUgY29udGFpbmVkIGluIGFueSBub2RlLAotCQkJCQkvLyB3aGljaCBpcyBpZiB0aGUgb2Zmc2V0IGlzIGp1c3QgcGFzdCB0aGUgbGFzdAotCQkJCQkvLyBjaGFyYWN0ZXIgb2YgdGV4dC4KLQkJCQkJLy8gQW5kLCB3ZSBtdXN0IGdhdXJkIGFnYWluc3Qgc2V0dGluZyBjYWNoZWROb2RlIHRvCi0JCQkJCS8vIG51bGwhCi0JCQkJCXdoaWxlICghcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGVtcE5vZGUgPSBwb3RlbnRpYWxDYWNoZWRSZWdpb24uZ2V0TmV4dCgpOwotCQkJCQkJaWYgKHRlbXBOb2RlID09IG51bGwpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcG90ZW50aWFsQ2FjaGVkUmVnaW9uID0gdGVtcE5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSBwb3RlbnRpYWxDYWNoZWRSZWdpb247Ci0JCX0KLQkJLy8ganVzdCB0byBiZSBkb3VibHkgc3VyZSB3ZSBuZXZlciBhc3NpZ24gbnVsbCB0byBhbiBhbHJlYWR5IHZhbGlkCi0JCS8vIGNhY2hlZFJlZ2lvbi4KLQkJLy8gSSBiZWxpZXZlIGFueSB0aW1lICdyZXN1bHQnIGlzIG51bGwgYXQgdGhpcyBwb2ludCwgdGhhdCBqdXN0IG1lYW5zCi0JCS8vIHdlIGhhdmUgYW4KLQkJLy8gZW1wdHkgZG9jdW1lbnQsIGFuZCB0aGUgY2FjaGVkUmVnaW9uIGlzIGFscmVhZHkgbnVsbCwgYnV0IHdlIGNoZWNrCi0JCS8vIGFuZCBwcmludAotCQkvLyB3YXJuaW5nLCBqdXN0IHNvIGR1cmluZyBkZXZlbG9wbWVudCB3ZSBiZSBzdXJlIHdlIG5ldmVyIGFjY2lkZW50bHkKLQkJLy8gYnJlYWsgdGhpcyBhc3N1bXB0aW9uLgotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihyZXN1bHQpOwotCQllbHNlIGlmIChnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IG5vIHJlZ2lvbiBjb3VsZCBiZSBmb3VuZCB0byBjYWNoZSwgYnV0IGNhY2hlIHdhcyBub24gbnVsbC4gSW5kaWNhdGVzIGNvcnJ1cHRlZCBtb2RlbCBvciByZWdpb24gbGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRSZWdpb25MaXN0KCkgewotCQlDb3JlTm9kZUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGdldENhY2hlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG5ldyBDb3JlTm9kZUxpc3QobnVsbCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IG5ldyBDb3JlTm9kZUxpc3QoZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiB3YXMgbWFkZSBwdWJsaWMgZm9yIGVhc2llciB0ZXN0aW5nLiBOb3JtYWxseSBzaG91bGQgbmV2ZXIgYmUgdXNlZCBieQotCSAqIGNsaWVudCBjb2Rlcy4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgZ2V0UmVQYXJzZXIoKSB7Ci0JCWlmIChmUmVQYXJzZXIgPT0gbnVsbCkgewotCQkJZlJlUGFyc2VyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JCQlmUmVQYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmUmVQYXJzZXI7Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFN0b3JlIGdldFN0b3JlKCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGZTdG9yZSk7Ci0JCXJldHVybiBmU3RvcmU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gZ2V0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQncyBsaW5lIHRyYWNrZXIuIEFzc3VtZXMgdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGJlZW4KLQkgKiBpbml0aWFsaXplZCB3aXRoIGEgbGluZSB0cmFja2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50J3MgbGluZSB0cmFja2VyCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0VHJhY2tlcigpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChmVHJhY2tlcik7Ci0JCXJldHVybiBmVHJhY2tlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKSB7Ci0JCWlmIChmVW5kb01hbmFnZXIgPT0gbnVsbCkgewotCQkJZlVuZG9NYW5hZ2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gZlVuZG9NYW5hZ2VyOwotCX0KLQotCXZvaWQgaW5pdGlhbGl6ZUZpcnN0QW5kTGFzdERvY3VtZW50UmVnaW9uKCkgewotCQkvLyBjYWNoZWQgTm9kZSBtdXN0IGFsc28gYmUgZmlyc3QsIGF0IHRoZSBpbml0aWFsIHBvaW50LiBPbmx5Ci0JCS8vIHZhbGlkCi0JCS8vIHRvIGNhbGwgdGhpcyBtZXRob2QgcmlnaHQgYWZ0ZXIgdGhlIGZpcnN0IHBhcnNlLgotCQkvLyAKLQkJLy8gd2hlbiBzdGFydGluZyBhZnJlc2gsIG91ciBjYWNoZWROb2RlIHNob3VsZCBiZSBvdXIgZmlyc3ROb2RlLAotCQkvLyBzbyBiZSBzdXJlIHRvIGluaXRpYWxpemUgdGhlIGZpcnN0Tm9kZQotCQlmaXJzdERvY3VtZW50UmVnaW9uID0gZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gYmUgc3VyZSB0byB1c2UgJ2dldE5leHQnIGZvciB0aGlzIGluaXRpYWwgZmluZGluZyBvZiB0aGUgbGFzdAotCQkvLyBub2RlLAotCQkvLyBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2Ygbm9kZS5nZXRMYXN0Tm9kZSBtYXkgc2ltcGx5IGNhbGwKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24hCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBmaXJzdERvY3VtZW50UmVnaW9uOwotCQlpZiAoYU5vZGUgPT0gbnVsbCkgewotCQkJLy8gZGVmZWN0IDI1NDYwNzogdG8gaGFuZGxlIGVtcHR5IGRvY3VtZW50cyByaWdodCwgaWYKLQkJCS8vIGZpcnN0bm9kZSBpcwotCQkJLy8gbnVsbCwgbWFrZSBzdXJlIGxhc3Qgbm9kZSBpcyBudWxsIHRvbwotCQkJbGFzdERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JCQkJbGFzdERvY3VtZW50UmVnaW9uID0gYU5vZGU7Ci0JCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNpbnNlcnRQb3NpdGlvblVwZGF0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyLCBpbnQgaW5kZXgpIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuaW5zZXJ0UG9zaXRpb25VcGRhdGVyKHVwZGF0ZXIsIGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxfYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsX2FkZFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb25VcGRhdGVyKHVwZGF0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbF9zZXRQYXJzZXIoUmVnaW9uUGFyc2VyIG5ld1BhcnNlcikgewotCQlmUGFyc2VyID0gbmV3UGFyc2VyOwotCX0KLQotCVN0cmluZyBpbnRlcm5hbEdldChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpbnQgbXlMZW5ndGggPSBnZXRMZW5ndGgoKTsKLQkJLy8gaWYgKCgwID4gb2Zmc2V0KSB8fCAoMCA+IGxlbmd0aCkgfHwgKG9mZnNldCArIGxlbmd0aCA+IG15TGVuZ3RoKSkKLQkJLy8gdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCXJlc3VsdCA9IGdldFN0b3JlKCkuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogQHBhcmFtIHJlcGxhY2VtZW50TGVuZ3RoCi0JICogQHBhcmFtIGNoYW5nZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBpbnRlcm5hbFJlcGxhY2VUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgY2hhbmdlcywgYm9vbGVhbiBpZ25vcmVSZWFkT25seVNldHRpbmdzKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0KLQkJc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCk7Ci0JCWlmIChjaGFuZ2VzID09IG51bGwpCi0JCQljaGFuZ2VzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6OnJlcGxhY2VUZXh0KCIgKyBzdGFydCArICIsIiArIHJlcGxhY2VtZW50TGVuZ3RoICsgIiwiICsgY2hhbmdlcyArICIpIik7IC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJaWYgKERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50T25seSB8fCBEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFJhd1N0cnVjdHVyZWREb2N1bWVudE9ubHkpIHsKLQkJCXN0YXJ0U3RyZWFtVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXRyeSB7Ci0JCQkvLyBOb3RlOiBldmVudCBtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSAnZmlyZScgbWV0aG9kIGNhbGxlZAotCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgRG9jdW1lbnRFdmVudCh0aGlzLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMpOwotCQkJZmlyZURvY3VtZW50QWJvdXRUb0NoYW5nZWQoKTsKLQotCQkJdHJ5IHsKLQkJCQlhY3F1aXJlTG9jaygpOwotCi0JCQkJaWYgKCFpZ25vcmVSZWFkT25seVNldHRpbmdzICYmIChjb250YWluc1JlYWRPbmx5KHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCkpKSB7Ci0JCQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIHJlcXVlc3RlciwgY2hhbmdlcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJCQkJbm9DaGFuZ2VFdmVudC5yZWFzb24gPSBOb0NoYW5nZUV2ZW50LlJFQURfT05MWV9TVEFURV9DSEFOR0U7Ci0JCQkJCXJlc3VsdCA9IG5vQ2hhbmdlRXZlbnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gdXBkYXRlTW9kZWwocmVxdWVzdGVyLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJcmVsZWFzZUxvY2soKTsKLQkJCX0KLQotCi0JCQlpZiAoRGVidWcucGVyZlRlc3RSYXdTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5IHx8IERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJbG9uZyBzdG9wU3RyZWFtVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBUaW1lIGZvciBJU3RydWN0dXJlZERvY3VtZW50IHJhdyByZXBsYWNlVGV4dDogIiArIChzdG9wU3RyZWFtVGltZSAtIHN0YXJ0U3RyZWFtVGltZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImV2ZW50IHR5cGUgcmV0dXJuZWQgYnkgcmVwbGFjZVRleHRXaXRoTm9EZWJ1Z2dpbmdUaHJlYWQ6ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBGVVRVUkVfVE9fRE86IGltcGxlbWVudCBjYWxsYmFjayBtZWNoYW5pc20/IHRvIGF2b2lkIGluc3RhbmNlb2YKLQkJCS8vIGFuZCBjYXN0aW5nCi0JCQkvLyBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQgbXVzdCBiZSBjYWxsZWQgaW4gb3JkZXIgdG8gZW5kCi0JCQkvLyBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQgc3RhdGUKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCS8vIHJlc3VsdCBzaG91bGQgbm90IGJlIG51bGwsIGJ1dCBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93biwKLQkJCQkvLyBpdCB3aWxsIGJlCi0JCQkJLy8gc28gc2VuZCBhIG5vQ2hhbmdlRXZlbnQgYW5kIGxvZyB0aGUgcHJvYmxlbQotCQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIHJlcXVlc3RlciwgY2hhbmdlcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuTk9fRVZFTlQ7Ci0JCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KG5vQ2hhbmdlRXZlbnQpOwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiUHJvZ3JhbSBFcnJvcjogaW52YWxpZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IGV2ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlZ2lvbkNoYW5nZWRFdmVudCkgewotCQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoKFJlZ2lvbkNoYW5nZWRFdmVudCkgcmVzdWx0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgoUmVnaW9uc1JlcGxhY2VkRXZlbnQpIHJlc3VsdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCQkJCQkvLyBwcm9iYWJseSBtb3JlIGVmZmljaWVudCB0byBtYXJrIG9sZCByZWdpb25zIGFzCi0JCQkJCQkJLy8gJ2RlbGV0ZWQnIGF0IHRoZSB0aW1lCi0JCQkJCQkJLy8gdGhhdCBhcmUgZGV0ZXJtaW5lZCB0byBiZSBkZWxldGVkLCBidXQgSSdsbCBkbwotCQkJCQkJCS8vIGhlcmUKLQkJCQkJCQkvLyBpbiB0aGVuIGNlbnRyYWwgc3BvdAotCQkJCQkJCS8vIGZvciBwcm9ncmFtbWluZyBlYXNlLgotCQkJCQkJCXVwZGF0ZURlbGV0ZWRGaWVsZHMoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSByZXN1bHQpOwotCQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHJlc3VsdCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSB7Ci0JCQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgoTm9DaGFuZ2VFdmVudCkgcmVzdWx0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBpZiBoZXJlLCB0aGlzIG1lYW5zIGEgbmV3IGV2ZW50IHdhcyBjcmVhdGVkCi0JCQkJCQkJCS8vIGFuZCBub3QgaGFuZGxlZCBoZXJlCi0JCQkJCQkJCS8vIGp1c3Qgc2VuZCBhIG5vIGV2ZW50IHVudGlsIHRoaXMgaXNzdWUgaXMKLQkJCQkJCQkJLy8gcmVzb2x2ZWQuCi0JCQkJCQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIHJlcXVlc3RlciwgY2hhbmdlcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJCQkJCQkJbm9DaGFuZ2VFdmVudC5yZWFzb24gPSBOb0NoYW5nZUV2ZW50Lk5PX0VWRU5UOwotCQkJCQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQobm9DaGFuZ2VFdmVudCk7Ci0JCQkJCQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogdW5leHBlY3RlZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IGV2ZW50OiAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudE9ubHkpIHsKLQkJCQlsb25nIHN0b3BTdHJlYW1UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IFRvdGFsIFRpbWUgZm9yIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnQgc2lnbmFsaW5nL3Byb2Nlc3NpbmcgaW4gcmVwbGFjZVRleHQ6ICIgKyAoc3RvcFN0cmVhbVRpbWUgLSBzdGFydFN0cmVhbVRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNsZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCi0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I21ha2VSZWFkT25seShpbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbWFrZVJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCi0JCS8vIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIGEgcmVhZG9ubHkgcmVnaW9uIG9mIDAgbGVuZ3RoLAotCQkvLyBzbyB3ZSdsbCBpZ25vcmUgdGhvc2UgcmVxdWVzdHMKLQkJaWYgKGxlbmd0aCA8PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgYWZmZWN0ZWRUZXh0ID0gdGhpcy5nZXQoc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0JCS8vIGEgZG9jdW1lbnQgZXZlbnQgZm9yICJyZWFkIG9ubHkiIGNoYW5nZSAuLi4gbXVzdAotCQkvLyBiZSBmb2xsb3dlZCBieSAibm8gY2hhbmdlIiBzdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnQKLQkJLy8gZkRvY3VtZW50RXZlbnQgPSBuZXcgRG9jdW1lbnRFdmVudCh0aGlzLCBzdGFydE9mZnNldCwgbGVuZ3RoLAotCQkvLyBhZmZlY3RlZFRleHQpOwotCQlmaXJlUmVhZE9ubHlBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCS8vIGlmIChjb250YWluc1JlYWRPbmx5KHN0YXJ0T2Zmc2V0LCBsZW5ndGgpKSB7Ci0JCS8vIGFkanVzdFJlYWRPbmx5UmVnaW9ucyhzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQkJLy8gfSBlbHNlIHsKLQkJLy8gd2UgY2FuIGJsaW5kbHkgYWRkIGNhdGVnb3J5LCBzaW5jZSBubyBoYXJtIGRvbmUgaWYgYWxyZWFkeQotCQkvLyBleGlzdHMuCi0JCWFkZFBvc2l0aW9uQ2F0ZWdvcnkoUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkpOwotCQlQb3NpdGlvbiBuZXdQb3NpdGlvbiA9IG5ldyBQb3NpdGlvbihzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQkJdHJ5IHsKLQkJCWFkZFBvc2l0aW9uKFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZLCBuZXdQb3NpdGlvbik7Ci0JCQkvLyBGSVhNRTogbmVlZCB0byBjaGFuZ2UgQVBJIHRvIHBhc3MgaW4gcmVxdWVzdGVyLCBzbyB0aGlzIGV2ZW50Ci0JCQkvLyBjYW4gYmUKLQkJCS8vIGNyZWF0ZWQgY29ycmVjdGx5LCBpbnN0ZWFkIG9mIHVzaW5nIG51bGwuCi0JCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCBudWxsLCBhZmZlY3RlZFRleHQsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkJbm9DaGFuZ2VFdmVudC5yZWFzb24gPSBOb0NoYW5nZUV2ZW50LlJFQURfT05MWV9TVEFURV9DSEFOR0U7Ci0JCQlmaXJlUmVhZE9ubHlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChub0NoYW5nZUV2ZW50KTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZm9yIG5vdywgbG9nIGFuZCBpZ25vcmUuIFBlcmhhcHMgbGF0ZXIgd2UKLQkJCS8vIGNvdWxkIGFkanVzdCB0byBoYW5kbGUgc29tZSBjYXNlcz8KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oKCJjb3VsZCBub3QgY3JlYXRlIHJlYWRvbmx5IHJlZ2lvbiBhdCAiICsgc3RhcnRPZmZzZXQgKyAiIHRvICIgKyBsZW5ndGgpLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIG5ldmVyIG9jY3VyLCBzaW5jZSB3ZSBhZGQgY2F0ZWdvcnkKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50I25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkubmV3SW5zdGFuY2UoKSk7Ci0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIG5ld0luc3RhbmNlKS5zZXRSZVBhcnNlcihnZXRSZVBhcnNlcigpLm5ld0luc3RhbmNlKCkpOwotCQlpZiAoZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgewotCQkJbmV3SW5zdGFuY2Uuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcigoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIGdldERvY3VtZW50UGFydGl0aW9uZXIoKSkubmV3SW5zdGFuY2UoKSk7Ci0JCQluZXdJbnN0YW5jZS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCkuY29ubmVjdChuZXdJbnN0YW5jZSk7Ci0JCX0KLQkJbmV3SW5zdGFuY2Uuc2V0TGluZURlbGltaXRlcihnZXRMaW5lRGVsaW1pdGVyKCkpOwotCQlpZiAoZ2V0RW5jb2RpbmdNZW1lbnRvKCkgIT0gbnVsbCkgewotCQkJbmV3SW5zdGFuY2Uuc2V0RW5jb2RpbmdNZW1lbnRvKChFbmNvZGluZ01lbWVudG8pIGdldEVuY29kaW5nTWVtZW50bygpLmNsb25lKCkpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlI3JlZ2lvbk1hdGNoZXMoaW50LAotCSAqICAgICAgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJVGV4dFN0b3JlIHN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHN0b3JlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIHN0b3JlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBzdHJpbmdUb0NvbXBhcmUpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gZ2V0KG9mZnNldCwgbGVuZ3RoKS5lcXVhbHMoc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJSVRleHRTdG9yZSBzdG9yZSA9IGdldFN0b3JlKCk7Ci0JCWlmIChzdG9yZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQlyZXN1bHQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBzdG9yZSkucmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXQob2Zmc2V0LCBsZW5ndGgpLmVxdWFsc0lnbm9yZUNhc2Uoc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jcmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UpCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZShJRG9jdW1lbnRMaXN0ZW5lciBvd25lciwgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHJlcGxhY2UpIHsKLQkJaWYgKGZBY2NlcHRQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZXMpIHsKLQkJCWlmIChmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgPT0gbnVsbCkKLQkJCQlmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzLmFkZChuZXcgUmVnaXN0ZXJlZFJlcGxhY2Uob3duZXIsIHJlcGxhY2UpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VMb2NrKCkgewotCQkvLyBkbyBub3RoaW5nIGhlcmUgaW4gc3VwZXIgY2xhc3MKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKChmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCQlpbnQgb2xkU2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQkJaW50IG5ld1NpemUgPSBvbGRTaXplIC0gMTsKLQkJCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUKLQkJCQkJCQkvLyByZW1vdmluZwotCQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJCS8vIG9sZAotCQkJCQkvLyBvbmUKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmICgoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQkJaW50IG9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyc1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZQotCQkJCQkvLyBvbGQKLQkJCQkJLy8gb25lCi0JCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJCWludCBvbGRTaXplID0gZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQkJaW50IG5ld1NpemUgPSBvbGRTaXplIC0gMTsKLQkJCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnNbaV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkJLy8gb2xkCi0JCQkJCS8vIG9uZQotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoKGZEb2N1bWVudExpc3RlbmVycyAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZkRvY3VtZW50TGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQkJaW50IG9sZFNpemUgPSBmRG9jdW1lbnRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcltuZXdTaXplXTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJCWlmIChmRG9jdW1lbnRMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmRG9jdW1lbnRMaXN0ZW5lcnNbaV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkJLy8gb2xkCi0JCQkJCS8vIG9uZQotCQkJCQlmRG9jdW1lbnRMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I3JlbW92ZURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCUFzc2VydC5pc05vdE51bGwobGlzdGVuZXIpOwotCQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyAhPSBudWxsKQotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+UG9zaXRpb248L2NvZGU+IGZyb20gdGhlIGRvY3VtZW50J3MgZGVmYXVsdAotCSAqIHBvc2l0aW9uIGNhdGVnb3J5LiBUaGUgZGVmYXVsdCBwb3NpdGlvbiBjYXRlZ29yeSBpcyB0byBiZSBkZWZpbmVkIGJ5Ci0JICogdGhlIGltcGxlbWVudGVycy4gSWYgdGhlIHBvc2l0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBkb2N1bWVudCdzIGRlZmF1bHQKLQkgKiBjYXRlZ29yeSBub3RoaW5nIGhhcHBlbnMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb24oUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkucmVtb3ZlUG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uCi0JICogQGV4Y2VwdGlvbiBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIGNhdGVnb3J5IGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLnJlbW92ZVBvc2l0aW9uKGNhdGVnb3J5LCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25DYXRlZ29yeQotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkucmVtb3ZlUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25VcGRhdGVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5yZW1vdmVQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgbGlzdGVuZXIgZnJvbSB0ZWggZG9jdW1lbnQncyBsaXN0IG9mCi0JICogcHJlbm90aWZpZWQgZG9jdW1lbnQgbGlzdGVuZXJzLiBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aAotCSAqIHRoZSBkb2N1bWVudCBub3RoaW5nIGhhcHBlbnMuCi0JICogPHA+Ci0JICogCi0JICogVGhpcyBtZXRob2QgaXMgbm90IGZvciBwdWJsaWMgdXNlLCBpdCBtYXkgb25seSBiZSBjYWxsZWQgYnkKLQkgKiBpbXBsZW1lbnRlcnMgb2YgPGNvZGU+SURvY3VtZW50QWRhcHRlcjwvY29kZT4gYW5kIG9ubHkgaWYgdGhvc2UKLQkgKiBpbXBsZW1lbnRlcnMgbmVlZCB0byBpbXBsZW1lbnQgPGNvZGU+SURvY3VtZW50TGlzdGVuZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudEFkYXB0ZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkCi0JICogCi0JICogQHNlZSAjYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBkb2N1bWVudEFkYXB0ZXIpKSB7Ci0JCQkJaW50IHByZXZpb3VzU2l6ZSA9IGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpZiAocHJldmlvdXNTaXplID4gMSkgewotCQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcltwcmV2aW91c1NpemUgLSAxXTsKLQkJCQkJaW50IHByZXZpb3VzSW5kZXggPSAwOwotCQkJCQlpbnQgbmV3SW5kZXggPSAwOwotCQkJCQl3aGlsZSAocHJldmlvdXNJbmRleCA8IHByZXZpb3VzU2l6ZSkgewotCQkJCQkJaWYgKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzW3ByZXZpb3VzSW5kZXhdICE9IGRvY3VtZW50QWRhcHRlcikKLQkJCQkJCQlsaXN0ZW5lcnNbbmV3SW5kZXgrK10gPSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyc1twcmV2aW91c0luZGV4XTsKLQkJCQkJCXByZXZpb3VzSW5kZXgrKzsKLQkJCQkJfQotCQkJCQlmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCQl9IGVsc2UgewotCQkJCQlmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIElOVEVSTkFMIFVTRSBPTkxZIGFuZCBpcyBOT1QgQVBJLgotCSAqIAotCSAqIFJlYnVpbGRzIHRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY2hhaW4gZnJvbSB0aGUgZXhpc3RpbmcgdGV4dC4KLQkgKiBGaWxlQnVmZmVyIHN1cHBvcnQgZG9lcyBub3QgYWxsb3cgY2xpZW50cyB0byBrbm93IHRoZSBkb2N1bWVudCdzCi0JICogbG9jYXRpb24gYmVmb3JlIHRoZSB0ZXh0IGNvbnRlbnRzIGFyZSBzZXQuCi0JICogCi0JICogQHNlZSBzZXQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGFyc2UoT2JqZWN0IHJlcXVlc3RlcikgewotCQlOZXdEb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQljbGVhclJlYWRPbmx5KCk7Ci0KLQkJYWNxdWlyZUxvY2soKTsKLQkJdHJ5IHsKLQkJCUNoYXJTZXF1ZW5jZVJlYWRlciBzdWJTZXRUZXh0U3RvcmVSZWFkZXIgPSBuZXcgQ2hhclNlcXVlbmNlUmVhZGVyKChDaGFyU2VxdWVuY2UpIGdldFN0b3JlKCksIDAsIGdldFN0b3JlKCkuZ2V0TGVuZ3RoKCkpOwotCQkJcmVzZXRQYXJzZXIoc3ViU2V0VGV4dFN0b3JlUmVhZGVyLCAwKTsKLQkJCS8vCi0JCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihnZXRQYXJzZXIoKS5nZXREb2N1bWVudFJlZ2lvbnMoKSk7Ci0JCQkvLyB3aGVuIHN0YXJ0aW5nIGFmcmVzaCwgb3VyIGNhY2hlZE5vZGUgc2hvdWxkIGJlIG91ciBmaXJzdE5vZGUsCi0JCQkvLyBzbyBiZSBzdXJlIHRvIGluaXRpYWxpemUgdGhlIGZpcnN0Tm9kZSBhbmQgbGFzdE5vZGUKLQkJCWluaXRpYWxpemVGaXJzdEFuZExhc3REb2N1bWVudFJlZ2lvbigpOwotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0UGFyZW50RG9jdW1lbnQoZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSwgdGhpcyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZWxlYXNlTG9jaygpOwotCQl9Ci0KLQkJcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNyZXBsYWNlCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IHBvcywgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RlOiBJU3RydWN0dXJlZERvY3VtZW50OjpyZXBsYWNlKGludCwgaW50LCBTdHJpbmcpIC4uLi4gaXRzIGJldHRlciB0byB1c2UgcmVwbGFjZVRleHQoc291cmNlLCBzdHJpbmcsIGludCwgaW50KSBBUEkgZm9yIHN0cnVjdHVyZWREb2N1bWVudCB1cGRhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXBsYWNlVGV4dCh0aGlzLCBwb3MsIGxlbmd0aCwgc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSB0ZXh0IHdpdGggIm5ld1RleHQiIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICJzdGFydCIgZm9yIGEKLQkgKiBsZW5ndGggb2YgInJlcGxhY2VMZW5ndGgiLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgc3RhcnQgb2Zmc2V0IG9mIHRleHQgdG8gcmVwbGFjZSBOb25lIG9mIHRoZSBvZmZzZXRzIGluY2x1ZGUKLQkgKiAgICAgICAgICAgIGRlbGltaXRlcnMgb2YgcHJlY2VlZGluZyBsaW5lcy4gT2Zmc2V0IDAgaXMgdGhlIGZpcnN0Ci0JICogICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGRvY3VtZW50LgotCSAqIEBwYXJhbSByZXBsYWNlTGVuZ3RoCi0JICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGV4dCB0byByZXBsYWNlCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UKLQkgKiAgICAgICAgICAgIDxwPgotCSAqICAgICAgICAgICAgSW1wbGVtZW50b3JzIGhhdmUgdG8gbm90aWZ5IFRleHRDaGFuZ2VkIGxpc3RlbmVycyBhZnRlciB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgaGFzIGJlZW4gdXBkYXRlZC4gVGhlIFRleHRDaGFuZ2VkRXZlbnQgc2hvdWxkIGJlIHNldAotCSAqICAgICAgICAgICAgYXMgZm9sbG93czoKLQkgKiAKLQkgKiBldmVudC50eXBlID0gU1dULlRleHRSZXBsYWNlZCBldmVudC5zdGFydCA9IHN0YXJ0IG9mIHRoZSByZXBsYWNlZCB0ZXh0Ci0JICogZXZlbnQubnVtUmVwbGFjZWRMaW5lcyA9IG51bWJlciBvZiByZXBsYWNlZCBsaW5lcyBldmVudC5udW1OZXdMaW5lcyA9Ci0JICogbnVtYmVyIG9mIG5ldyBsaW5lcyBldmVudC5yZXBsYWNlZExlbmd0aCA9IGxlbmd0aCBvZiB0aGUgcmVwbGFjZWQgdGV4dAotCSAqIGV2ZW50Lm5ld0xlbmd0aCA9IGxlbmd0aCBvZiB0aGUgbmV3IHRleHQKLQkgKiAKLQkgKiBOT1RFOiBudW1OZXdMaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGluc2VydGVkIGxpbmVzIGFuZCBudW1SZXBsYWNlZExpbmVzCi0JICogaXMgdGhlIG51bWJlciBvZiBkZWxldGVkIGxpbmVzIGJhc2VkIG9uIHRoZSBjaGFuZ2UgdGhhdCBvY2N1cnMKLQkgKiB2aXN1YWxseS4gRm9yIGV4YW1wbGU6Ci0JICogCi0JICogcmVwbGFjZWRUZXh0IG5ld1RleHQgbnVtUmVwbGFjZWRMaW5lcyBudW1OZXdMaW5lcyAiIiAiXG4iIDAgMSAiXG5cbiIKLQkgKiAiYSIgMiAwICJhIiAiXG5cbiIgMCAyCi0JICovCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCXJldHVybiByZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIGNoYW5nZXMsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5ncykgewotCQlyZXR1cm4gaW50ZXJuYWxSZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgaWdub3JlUmVhZE9ubHlTZXR0aW5ncyk7Ci0JfQotCi0Jdm9pZCByZXNldFBhcnNlcihpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCUlUZXh0U3RvcmUgdGV4dFN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHRleHRTdG9yZSBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgewotCQkJQ2hhclNlcXVlbmNlUmVhZGVyIHN1YlNldFRleHRTdG9yZVJlYWRlciA9IG5ldyBDaGFyU2VxdWVuY2VSZWFkZXIoKENoYXJTZXF1ZW5jZSkgdGV4dFN0b3JlLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJcGFyc2VyLnJlc2V0KHN1YlNldFRleHRTdG9yZVJlYWRlciwgc3RhcnRPZmZzZXQpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG5ld05vZGVUZXh0ID0gZ2V0KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0JCQlwYXJzZXIucmVzZXQobmV3Tm9kZVRleHQsIHN0YXJ0T2Zmc2V0KTsKLQotCQl9Ci0KLQl9Ci0KLQl2b2lkIHJlc2V0UGFyc2VyKFJlYWRlciByZWFkZXIsIGludCBzdGFydE9mZnNldCkgewotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5yZXNldChyZWFkZXIsIHN0YXJ0T2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3Jlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpIHsKLQkJLS1mU3RvcHBlZENvdW50OwotCQlpZiAoZlN0b3BwZWRDb3VudCA9PSAwICYmIGZSZWVudHJhbmNlQ291bnQgPT0gMCkKLQkJCWV4ZWN1dGVQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcygpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MgaW4gMy4wIC0gdXNlIGEgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIKLQkgKiAgICAgICAgICAgICBkaXJlY3RseQotCSAqIEBzZWUgSURvY3VtZW50I3NlYXJjaAotCSAqLwotCXB1YmxpYyBpbnQgc2VhcmNoKGludCBzdGFydFBvc2l0aW9uLCBTdHJpbmcgZmluZFN0cmluZywgYm9vbGVhbiBmb3J3YXJkU2VhcmNoLCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQkvLyAoZG13KSBJIGFkZGVkIHRoaXMgd2FybmluZywgdG8ga25vdyBpZiBzdGlsbCBiZWluZyB1c2VkLiBJJ20gbm90Ci0JCS8vIHN1cmUgaXQKLQkJLy8gd29ya3MgYXMgZXhwZWN0ZWQgYW55IGxvbmdlci4KLQkJLy8gYnV0IHRoZSB3YXJuaW5nIHNob3VsZCBiZSByZW1vdmVkLCBvbmNlIGtub3cuCi0JCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJXQVJOSU5HOiB1c2luZyB1bnN1cHBvcnRlZCBkZXByZWNhdGVkIG1ldGhvZCAnc2VhcmNoJyIpOyAvLyROT04tTkxTLTEkCi0JCWludCBvZmZzZXQgPSAtMTsKLQkJSVJlZ2lvbiBtYXRjaCA9IG5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcih0aGlzKS5maW5kKHN0YXJ0UG9zaXRpb24sIGZpbmRTdHJpbmcsIGZvcndhcmRTZWFyY2gsIGNhc2VTZW5zaXRpdmUsIHdob2xlV29yZCwgZmFsc2UpOwotCQlpZiAobWF0Y2ggIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gbWF0Y2guZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNzZXRUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGU6IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnNldFRleHQoU3RyaW5nKSAuLi4uIGl0cyBiZXR0ZXIgdG8gdXNlIHNldFRleHQoc291cmNlLCBzdHJpbmcpIEFQSSBmb3Igc3RydWN0dXJlZERvY3VtZW50IHVwZGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFRleHQobnVsbCwgc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1heSBiZSBtYXJrZWQgcHVibGljLCBidXQgc2hvdWxkIGJlIHBhY2thZ2VkIHByb3RlY3RlZCwgb25jZQotCSAqIHJlZmFjdG9yaW5nIGlzIGNvbXBsZXRlIChpbiBvdGhlciB3b3Jkcywgbm90IGZvciBjbGllbnQgdXNlKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWRSZWdpb24pIHsKLQkJaWYgKFVTRV9MT0NBTF9USFJFQUQpIHsKLQkJCWZDdXJyZW50RG9jdW1uZXRSZWdpb25DYWNoZS5zZXQoc3RydWN0dXJlZFJlZ2lvbik7Ci0JCX0gZWxzZSB7Ci0JCQljYWNoZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWRSZWdpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCdzIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB7Ci0JCXNldERvY3VtZW50UGFydGl0aW9uZXIoSURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORywgcGFydGl0aW9uZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjMjc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcikKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihTdHJpbmcgcGFydGl0aW9uaW5nLCBJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgewotCQlpZiAocGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQkJZkRvY3VtZW50UGFydGl0aW9uZXJzLnJlbW92ZShwYXJ0aXRpb25pbmcpOwotCQkJCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMuc2l6ZSgpID09IDApCi0JCQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycyA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzID09IG51bGwpCi0JCQkJZkRvY3VtZW50UGFydGl0aW9uZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycy5wdXQocGFydGl0aW9uaW5nLCBwYXJ0aXRpb25lcik7Ci0JCX0KLQkJRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQodGhpcyk7Ci0JCWV2ZW50LnNldFBhcnRpdGlvbkNoYW5nZShwYXJ0aXRpb25pbmcsIDAsIGdldExlbmd0aCgpKTsKLQkJZmlyZURvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudCNzZXRFbmNvZGluZ01lbWVudG8oRW5jb2RpbmdNZW1lbnRvKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB7Ci0JCXRoaXMuZW5jb2RpbmdNZW1lbnRvID0gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXZvaWQgc2V0Rmlyc3REb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlmaXJzdERvY3VtZW50UmVnaW9uID0gcmVnaW9uOwotCi0JfQotCi0Jdm9pZCBzZXRMYXN0RG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJbGFzdERvY3VtZW50UmVnaW9uID0gcmVnaW9uOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBJU3RydWN0dXJlZERvY3VtZW50I3NldExpbmVEZWxpbWl0ZXIoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCQkvLyBtYWtlIHN1cmUgb3VyIHByZWZlcnJlZCBkZWxpbWl0ZXIgaXMKLQkJLy8gb25lIG9mIHRoZSBsZWdhbCBvbmVzCi0JCWlmIChVdGlsaXRpZXMuY29udGFpbnNTdHJpbmcoZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBkZWxpbWl0ZXIpKSB7Ci0JCQlwcmVmZXJlZERlbGltaXRlciA9IGRlbGltaXRlcjsKLQkJfSBlbHNlIHsKLQkJCUxvZ2dlci50cmFjZSgiSVN0cnVjdHVyZWREb2N1bWVudCIsICJBdHRlbXB0IHRvIHNldCBsaW5lZGVsaW1pdGVyIHRvIG5vbi1sZWdhbCBkZWxpbWl0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlwcmVmZXJlZERlbGltaXRlciA9IFBsYXRmb3JtTGluZURlbGltaXRlcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50J3MgbGluZSB0cmFja2VyLiBNdXN0IGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0JICogdGhlIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSB0cmFja2VyCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQncyBsaW5lIHRyYWNrZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TGluZVRyYWNrZXIoSUxpbmVUcmFja2VyIHRyYWNrZXIpIHsKLQkJZlRyYWNrZXIgPSB0cmFja2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcnNlcihSZWdpb25QYXJzZXIgbmV3UGFyc2VyKSB7Ci0JCWludGVybmFsX3NldFBhcnNlcihuZXdQYXJzZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwb3NpdGlvbk1hbmFnZXIKLQkgKiAgICAgICAgICAgIFRoZSBwb3NpdGlvbk1hbmFnZXIgdG8gc2V0LgotCSAqLwotCS8vIFRPRE86IG1ha2UgcHJpdmF0ZSBpcyBuZWVkZWQsIGVsc2UgcmVtb3ZlCi0Jdm9pZCBzZXRQb3NpdGlvbk1hbmFnZXIoR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciBwb3NpdGlvbk1hbmFnZXIpIHsKLQkJZlBvc2l0aW9uTWFuYWdlciA9IHBvc2l0aW9uTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZVBhcnNlcihJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdSZVBhcnNlcikgewotCQlmUmVQYXJzZXIgPSBuZXdSZVBhcnNlcjsKLQkJaWYgKGZSZVBhcnNlciAhPSBudWxsKSB7Ci0JCQlmUmVQYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgdGV4dC4KLQkgKi8KLQlwdWJsaWMgTmV3TW9kZWxFdmVudCBzZXRUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyB0aGVTdHJpbmcpIHsKLQotCQlOZXdEb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQljbGVhclJlYWRPbmx5KCk7Ci0JCS8vIE5vdGU6IGV2ZW50IG11c3QgYmUgY29tcHV0ZWQgYmVmb3JlICdmaXJlJyBtZXRob2QgY2FsbGVkCi0JCS8vIE5vdGU6IGp1ZGdpbmcgZnJvbSBjb2RlIGluIEFic3RyYWN0RG9jdW1lbnQsIGFwcGFyZW50bHkgdGhlCi0JCS8vIGxlbmd0aCBpbiB0aGlzIGV2ZW50IGlzIHRoZSBjdXJyZW50IGxlbmd0aCBvZiAKLQkJLy8gdGhlIGRvY3VtZW50LgotCQlmRG9jdW1lbnRFdmVudCA9IG5ldyBEb2N1bWVudEV2ZW50KHRoaXMsIDAsIGxlbmd0aCgpLCB0aGVTdHJpbmcpOwotCQlmaXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlZCgpOwotCi0JCWFjcXVpcmVMb2NrKCk7Ci0KLQkJdHJ5IHsKLQkJCWdldFN0b3JlKCkuc2V0KHRoZVN0cmluZyk7Ci0JCQlnZXRUcmFja2VyKCkuc2V0KHRoZVN0cmluZyk7Ci0JCQkvLwotCQkJQ2hhclNlcXVlbmNlUmVhZGVyIHN1YlNldFRleHRTdG9yZVJlYWRlciA9IG5ldyBDaGFyU2VxdWVuY2VSZWFkZXIoKENoYXJTZXF1ZW5jZSkgZ2V0U3RvcmUoKSwgMCwgZ2V0U3RvcmUoKS5nZXRMZW5ndGgoKSk7Ci0JCQlyZXNldFBhcnNlcihzdWJTZXRUZXh0U3RvcmVSZWFkZXIsIDApOwotCQkJLy8KLQkJCXNldENhY2hlZERvY3VtZW50UmVnaW9uKGdldFBhcnNlcigpLmdldERvY3VtZW50UmVnaW9ucygpKTsKLQkJCS8vIHdoZW4gc3RhcnRpbmcgYWZyZXNoLCBvdXIgY2FjaGVkTm9kZSBzaG91bGQgYmUgb3VyIGZpcnN0Tm9kZSwKLQkJCS8vIHNvIGJlIHN1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgZmlyc3ROb2RlIGFuZCBsYXN0Tm9kZQotCQkJaW5pdGlhbGl6ZUZpcnN0QW5kTGFzdERvY3VtZW50UmVnaW9uKCk7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5zZXRQYXJlbnREb2N1bWVudChnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpLCB0aGlzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbGVhc2VMb2NrKCk7Ci0JCX0KLQotCQlyZXN1bHQgPSBuZXcgTmV3RG9jdW1lbnRFdmVudCh0aGlzLCByZXF1ZXN0ZXIpOwotCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQocmVzdWx0KTsKLQkJcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCdzIHRleHQgc3RvcmUuIE11c3QgYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0JICogY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHN0b3JlCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQncyB0ZXh0IHN0b3JlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFRleHRTdG9yZShJVGV4dFN0b3JlIHN0b3JlKSB7Ci0JCWZTdG9yZSA9IHN0b3JlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuZG9NYW5hZ2VyKElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyKSB7Ci0KLQkJLy8gaWYgdGhlIHVuZG8gbWFuYWdlciBoYXMgYWxyZWFkeSBiZWVuIHNldCwgdGhlbgotCQkvLyBmYWlsIGZhc3QsIHNpbmNlIGNoYW5naW5nIHRoZSB1bmRvIG1hbmFnZXIgd2lsbCBsZWFkCi0JCS8vIHRvIHVudXN1YWwgcmVzdWx0cyAob3IgYXQgbGVhc3QgbG9zcyBvZiB1bmRvIHN0YWNrKS4KLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsICYmIGZVbmRvTWFuYWdlciAhPSB1bmRvTWFuYWdlcikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjaGFuZ2UgdW5kbyBtYW5hZ2VyIG9uY2UgaXRzIGJlZW4gc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWZVbmRvTWFuYWdlciA9IHVuZG9NYW5hZ2VyOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0YXJ0U2VxdWVudGlhbFJld3JpdGUoYm9vbGVhbikKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRTZXF1ZW50aWFsUmV3cml0ZShib29sZWFuIG5vcm1hbGl6ZWQpIHsKLQkJSVRleHRTdG9yZSBzdG9yZSA9IG5ldyBTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZShnZXRTdG9yZSgpKTsKLQkJc2V0VGV4dFN0b3JlKHN0b3JlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkgewotCQkrK2ZTdG9wcGVkQ291bnQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0b3BTZXF1ZW50aWFsUmV3cml0ZSgpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BTZXF1ZW50aWFsUmV3cml0ZSgpIHsKLQkJaWYgKGdldFN0b3JlKCkgaW5zdGFuY2VvZiBTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZSkgewotCQkJU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUgc3J3cyA9IChTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZSkgZ2V0U3RvcmUoKTsKLQkJCUlUZXh0U3RvcmUgc291cmNlID0gc3J3cy5nZXRTb3VyY2VTdG9yZSgpOwotCQkJc2V0VGV4dFN0b3JlKHNvdXJjZSk7Ci0JCQlzcndzLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBhcmcwLCBpbnQgYXJnMSkgewotCQlyZXR1cm4gZ2V0KGFyZzAsIGFyZzEpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRGVsZXRlZEZpZWxkcyhTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gZXZlbnQuZ2V0T2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFJlZ2lvbnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBvbGRSZWdpb25zLml0ZW0oaSk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uc2V0RGVsZXRlZCh0cnVlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHJlLXBhcnNlci4gTm90ZTogdGhpcyBtZXRob2QgbWF5IGJlICJwdWJsaWMiIGJ1dCBzaG91bGQgb25seQotCSAqIGJlIGNhbGxlZCBieSByZS1wYXJzZXJzIGluIHRoZSByaWdodCBjaXJjdW1zdGFuY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZURvY3VtZW50RGF0YShpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQlnZXRTdG9yZSgpLnJlcGxhY2Uoc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcyk7Ci0JCXRyeSB7Ci0JCQlnZXRUcmFja2VyKCkucmVwbGFjZShzdGFydCwgbGVuZ3RoVG9SZXBsYWNlLCBjaGFuZ2VzKTsKLQkJfQotCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSBoZXJlLCBidXQgd2lsbCBsb2cgZm9yIG5vdwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAoZlBvc2l0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmUG9zaXRpb25NYW5hZ2VyLnVwZGF0ZVBvc2l0aW9ucyhuZXcgRG9jdW1lbnRFdmVudCh0aGlzLCBzdGFydCwgbGVuZ3RoVG9SZXBsYWNlLCBjaGFuZ2VzKSk7Ci0JCX0KLQkJcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSwgU3RyaW5nIGNoYW5nZXMpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgcmVQYXJzZXIgPSBnZXRSZVBhcnNlcigpOwotCQkvLyBpbml0aWFsaXplIHRoZSBJU3RydWN0dXJlZFRleHRSZVBhcnNlciB3aXRoIHRoZSBzdGFuZGFyZCBkYXRhCi0JCS8vIHRoYXQncwotCQkvLyBhbHdheXMgbmVlZGVkCi0JCXJlUGFyc2VyLmluaXRpYWxpemUocmVxdWVzdGVyLCBzdGFydCwgbGVuZ3RoVG9SZXBsYWNlLCBjaGFuZ2VzKTsKLQkJcmVzdWx0ID0gcmVQYXJzZXIucmVwYXJzZSgpOwotCQkvLyBpZiByZXN1bHQgaXMgbnVsbCBhdCB0aGlzIHBvaW50LCB0aGVuIHRoZXJlIG11c3QgYmUgYW4gZXJyb3IsIHNpbmNlCi0JCS8vIGV2ZW4gaWYgdGhlcmUKLQkJLy8gd2FzIG5vIGNoYW5nZSAoZWl0aGVyIGRpc2FsbG93IGR1ZSB0byByZWFkb25seSwgb3IgYSBwZXJzb24gcGFzdGVkCi0JCS8vIHRoZSBzYW1lIHRoaW5nCi0JCS8vIHRoZXkgaGFkIHNlbGVjdGVkKSB0aGVuIGEgIk5vQ2hhbmdlIiBldmVudCBzaG91bGQgaGF2ZSBiZWVuIGZpcmVkLgotCQlBc3NlcnQuaXNOb3ROdWxsKHJlc3VsdCwgIm5vIHN0cnVjdHVyZWREb2N1bWVudCBldmVudCB3YXMgY3JlYXRlZCBpbiBJU3RydWN0dXJlZERvY3VtZW50Ojp1cGRhdGVTdHJ1Y3R1cmVkRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0Jhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMTE5MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0Jhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VdGlsaXRpZXM7Ci0KLQotcHVibGljIGNsYXNzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgT2JqZWN0IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1RPUkVfTk9UX0FTU0lHTkVEID0gInRleHQgc3RvcmUgbm90IGFzc2lnbmVkIHlldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERUZJTkVEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkRG9jdW1lbnQuVU5ERUZJTkVEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbkxpc3QgX3JlZ2lvbnM7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0RlbGV0ZWQgPSBmYWxzZTsKLQkvL3ByaXZhdGUgU3RyaW5nIGZUeXBlOwotCS8qKgotCSAqIGFsbG93IGEgcG9pbnRlciBiYWNrIHRvIHRoaXMgbm9kZXMgbW9kZWwKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZlBhcmVudERvY3VtZW50OwotCS8qKgotCSAqIHdhcyB0aGlzIG5vZGUgdGVybWluYXRlZCBub3JtYWxseQotCSAqLwotCS8vIDAgPT0gZmFsc2UsIDEgPT0gdHJ1ZQotCXByaXZhdGUgYnl0ZSBoYXNFbmQgPSAwOwotCXByb3RlY3RlZCBpbnQgbGVuZ3RoOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0ID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgc3RhcnQ7Ci0KLQlwdWJsaWMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCV9yZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JfQotCi0JLyoqCi0JICogRXZlbiBpbnNpZGUtdGhpcyBjbGFzcyB1c2VzIG9mICdyZWdpb25zJyBzaG91bGQgdXNlIHRoaXMgbWV0aG9kLCBhcwotCSAqIHRoaXMgaXMgd2hlcmUgKHNvZnQpIG1lbW9yeSBtYW5hZ2VtZW50L3JlcGFyc2luZywgZXRjLiwgd2lsbCBiZQotCSAqIGNlbnRyYWxpemVkLgotCSAqLwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IF9nZXRSZWdpb25zKCkgewotCi0JCXJldHVybiBfcmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQlfZ2V0UmVnaW9ucygpLmFkZChhUmVnaW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3QoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQlzdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aFdpdGgoaW50IGkpIHsKLQkJbGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJc3RhcnQgKz0gaTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RUZXh0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbiNjb250YWluc09mZnNldChpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IGkpIHsKLQotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSA8PSBpICYmIGkgPCBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb24jY29udGFpbnNPZmZzZXQoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24jZXF1YXRlUG9zaXRpb25zKGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJLy90ZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQotCX0KLQotCS8qKgotCSAqIGdldEVuZCBhbmQgZ2V0RW5kT2Zmc2V0IGFyZSB0aGUgc2FtZSBvbmx5IGZvcgotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JICovCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBzdGFydCArIGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmQgYW5kIGdldEVuZE9mZnNldCBhcmUgdGhlIHNhbWUgb25seSBmb3IKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldEVuZE9mZnNldChjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pICsgY29udGFpbmVkUmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCS8vCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0Tm9kZSgpIHsKLQkvLwkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCS8vIGZPd25pbmdEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCS8vCQlyZXR1cm4gYU5vZGU7Ci0JLy8JfQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpIHsKLQkJaWYgKF9nZXRSZWdpb25zKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gX2dldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldEZ1bGxUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldFBhcmVudERvY3VtZW50KCkuZ2V0KHN0YXJ0LCBsZW5ndGgpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwcm9ncmFtIGVycm9yCi0JCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgcmVnaW9uU3RhcnQgPSBhUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpbnQgcmVnaW9uTGVuZ3RoID0gYVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCXJlc3VsdCA9IGZQYXJlbnREb2N1bWVudC5nZXQoc3RhcnQgKyByZWdpb25TdGFydCwgcmVnaW9uTGVuZ3RoKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChTdHJpbmcgY29udGV4dCkgewotCQkvLyBETVc6IGxvb3BpbmcgaXMgZmFzdGVyIHRoYW4gZW51bWVyYXRpb24sCi0JCS8vIHNvIHN3aXRjaGVkIGFyb3VuZCAyLzEyLzAzCi0JCS8vRW51bWVyYXRpb24gZSA9IGdldFJlZ2lvbnMoKS5lbGVtZW50cygpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBjb250ZXh0KQotCQkJCXJlc3VsdCArPSBnZXRGdWxsVGV4dChyZWdpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCWlmIChfZ2V0UmVnaW9ucygpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIF9nZXRSZWdpb25zKCkuZ2V0KF9nZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dCgpIHsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7Ci0JCXJldHVybiBfZ2V0UmVnaW9ucygpLnNpemUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uI2dldERvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRQYXJlbnREb2N1bWVudCgpIHsKLQotCQlyZXR1cm4gZlBhcmVudERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzKCkgewotCQlyZXR1cm4gcHJldmlvdXM7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcmFtZXRlciBvZmZzZXQgcmVmZXJzIHRvIHRoZSBvdmVyYWxsIG9mZnNldCBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKF9nZXRSZWdpb25zKCkgIT0gbnVsbCkgewotCQkJLy8gdHJhbnNmb3JtIHRoZSByZXF1ZXN0ZWQgb2Zmc2V0IHRvIHRoZSAic2NhbGUiIHRoYXQKLQkJCS8vIHJlZ2lvbnMgYXJlIHN0b3JlZCBpbiwgd2hpY2ggYXJlIGFsbCByZWxhdGl2ZSB0byB0aGUKLQkJCS8vIHN0YXJ0IHBvaW50LgotCQkJLy9pbnQgdHJhbnNmb3JtZWRPZmZzZXQgPSBvZmZzZXQgLSBnZXRTdGFydE9mZnNldCgpOwotCQkJLy8KLQkJCWludCBsZW5ndGggPSBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVnaW9uKHMpIGluIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb246OmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0OiAiICsgcmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZXF1ZXN0ZWQgb2Zmc2V0OiAiICsgb2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiIHRyYW5zZm9ybWVkT2Zmc2V0OiAiICsKLQkJCQkJLy8gdHJhbnNmb3JtZWRPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBzdGFydDogIiArIHJlZ2lvbi5nZXRTdGFydCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gZW5kOiAiICsgcmVnaW9uLmdldEVuZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gdHlwZTogIiArIHJlZ2lvbi5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBjbGFzczogIiArIHJlZ2lvbi5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfQotCQkJCWlmICgoZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8PSBvZmZzZXQpICYmIChvZmZzZXQgPCBnZXRFbmRPZmZzZXQocmVnaW9uKSkpIHsKLQkJCQkJcmVzdWx0ID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBfZ2V0UmVnaW9ucygpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0IGFuZCBnZXRTdGFydE9mZnNldCBhcmUgdGhlIHNhbWUgb25seSBmb3IKLQkgKiBJU3RydWN1dHJlZERvY3VtZW50UmVnaW9ucwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydCBhbmQgZ2V0U3RhcnRPZmZzZXQgYXJlIHRoZSBzYW1lIG9ubHkgZm9yCi0JICogSVN0cnVjdXRyZWREb2N1bWVudFJlZ2lvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb24jZ2V0U3RhcnRPZmZzZXQoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCS8vIGFzc2VydDogY29udGFpbmVkUmVnaW9uIGNhbiBub3QgYmUgbnVsbAotCQkvLyAobWlnaHQgYmUgcGVyZm9ybWFuY2UgaGl0IGlmIGxpdGVyYWxseSBwdXQgaW4gYXNzZXJ0IGNhbGwsCi0JCS8vIGJ1dCBjb250YWluZWRSZWdpb24gY2FuIG5vdCBiZSBudWxsKS4gTmVlZHMgdG8gYmUgY2hlY2tlZAotCQkvLyBieSBjYWxsaW5nIGNvZGUuCi0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgY29udGFpbmVkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChmUGFyZW50RG9jdW1lbnQgPT0gbnVsbCkgewotCQkJCS8vIGxpa2VseSB0byBoYXBwZW4gZHVyaW5nIGluc3BlY3RpbmcKLQkJCQlyZXN1bHQgPSBURVhUX1NUT1JFX05PVF9BU1NJR05FRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZlBhcmVudERvY3VtZW50LmdldChzdGFydCwgbGVuZ3RoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJLy8gYXNzZXJ0OiBhUmVnaW9uIGNhbiBub3QgYmUgbnVsbAotCQkvLyAobWlnaHQgYmUgcGVyZm9ybWFuY2UgaGl0IGlmIGxpdGVyYWxseSBwdXQgaW4gYXNzZXJ0IGNhbGwsCi0JCS8vIGJ1dCBhUmVnaW9uIGNhbiBub3QgYmUgbnVsbCkuIE5lZWRzIHRvIGJlIGNoZWNrZWQKLQkJLy8gYnkgY2FsbGluZyBjb2RlLgotCQl0cnkgewotCQkJcmV0dXJuIGZQYXJlbnREb2N1bWVudC5nZXQodGhpcy5nZXRTdGFydE9mZnNldChhUmVnaW9uKSwgYVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIGZpcnN0IHJlZ2lvbiB3aXRoIHRoZSBtYXRjaGluZyBjb250ZXh0IHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJLy8gRE1XOiBsb29waW5nIGlzIGZhc3RlciB0aGFuIGVudW1lcmF0aW9uLAotCQkvLyBzbyBzd2l0Y2hlZCBhcm91bmQgMi8xMi8wMwotCQkvL0VudW1lcmF0aW9uIGUgPSBnZXRSZWdpb25zKCkuZWxlbWVudHMoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlyZWdpb24gPSBnZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gY29udGV4dCkgewotCQkJCXJlc3VsdCA9IGdldFRleHQocmVnaW9uKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uI2dldFRleHRFbmQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQotCQkvL3JldHVybiBzdGFydCArIHRleHRMZW5ndGg7Ci0JCXJldHVybiBzdGFydCArIGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldCgpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gX2dldFJlZ2lvbnMoKS5nZXQoX2dldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgKyByZWdpb24uZ2V0VGV4dEVuZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbiNnZXRUZXh0RW5kT2Zmc2V0KGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pICsgY29udGFpbmVkUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNnZXRUZXh0TGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCS8vcmV0dXJuIHRleHRMZW5ndGg7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhlIHR5cGUgb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAuLi4gbm90IHRvIGJlIGNvbmZ1c2VkCi0JICogd2l0aCB0eXBlIG9mIFhNTCBub2RlIQotCSAqLwotCS8vIEZvciBub3cgcmV0dXJuIGEgU3RyaW5nLgotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gZm9yIGEgIm5hbWVkIiBYTUwgbm9kZSAoZS5nLiBzdGFydCB0YWcpLCBidXQgdHlwZSBvZgotCQkvLyBmbGF0bm9kZSBpcyAibmFtZWQgeG1sIG5vZGUiICh3aGljaCBpcyBhbHdheXMgdGhlIHNlY29uZCByZWdpb24pLgotCQkvLyBUaGVyZWZvcmUsIGlmIHRoZXJlJ3MgdHdvIG9yIG1vcmUgcmVnaW9ucywgdGhlIHR5cGUgZm9yIHRoZQotCQkvLyBmbGF0bm9kZQotCQkvLyB3aWxsIGJlIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgcmVnaW9uLiBPdGhlcndpc2UgaXQgd2lsbCBiZSB0aGUKLQkJLy8gdHlwZQotCQkvLyBvZiB0aGUgZmlyc3QgcmVnaW9uLgotCQkvLyBOb3RlOiB0aGlzIGNhbiBiZSByZWZpbmVkIGFzIG5lZWRlZC4KLQkJU3RyaW5nIHJlc3VsdCA9IFVOREVGSU5FRDsgLy8iSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5VTkRFRklORUQiOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIHdlIGFyZSBhc3N1bWUgdGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IG9uZSByZWdpb24gaW4gYSBmbGF0bm9kZSEKLQkJcmVzdWx0ID0gZ2V0UmVnaW9ucygpLmdldCgwKS5nZXRUeXBlKCk7Ci0JCS8vIHR5cGNpYWxseSBzdWJjbGFzc2VkLCBpZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBmaXJzdCByZWdpb24gaXMKLQkJLy8gZGVzaXJlZAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiNpc0RlbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCgpIHsKLQkJcmV0dXJuIGZJc0RlbGV0ZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRlZCgpIHsKLQkJcmV0dXJuIChoYXNFbmQgPT0gMSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgcmVnaW9uID09IG51bGwsIHdlIHJldHVybiBmYWxzZTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBpZiB0aGUgcmVnaW9ucyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UsIHRoZXkgYXJlIGVxdWFsCi0JCQlpZiAodGhpcyA9PSByZWdpb24pIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBub24tdHJpdmlhbCBwYXJ0Ci0JCQkJLy8gbm90ZTogd2UgY2hhbmdlIGZvciB0eXBlIGZpcnN0LCB0aGVuIHN0YXJ0IG9mZnNldCBhbmQgZW5kCi0JCQkJLy8gb2Zmc2V0LAotCQkJCS8vIHNpbmNlIHRoYXQgd291bGQgZGVjaWRlIG1hbnkgY2FzZXMgcmlnaHQgYXdheSBhbmQgYXZvaWQgdGhlCi0JCQkJLy8gdGV4dCBjb21wYXJpc29uCi0JCQkJaWYgKGdldFR5cGUoKSA9PSByZWdpb24uZ2V0VHlwZSgpKSB7Ci0JCQkJCWlmIChzYW1lT2Zmc2V0c0FzKHJlZ2lvbiwgc2hpZnQpICYmIHNhbWVUZXh0QXMocmVnaW9uLCBzaGlmdCkpIHsKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiBvbGRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3RG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5ld1JlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIGFueSByZWdpb24gaXMgbnVsbCwgd2UgcmV0dXJuIGZhbHNlIChldmVuIGlmIGJvdGggYXJlISkKLQkJaWYgKChvbGRSZWdpb24gIT0gbnVsbCkgJiYgKG5ld1JlZ2lvbiAhPSBudWxsKSkgewotCQkJLy8gaWYgdGhlIHJlZ2lvbnMgYXJlIHRoZSBzYW1lIGluc3RhbmNlLCB0aGV5IGFyZSBlcXVhbAotCQkJaWYgKG9sZFJlZ2lvbiA9PSBuZXdSZWdpb24pIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBub24tdHJpdmlhbCBwYXJ0Ci0JCQkJLy8gbm90ZTogd2UgY2hhbmdlIGZvciB0eXBlIGZpcnN0LCB0aGVuIHN0YXJ0IG9mZnNldCBhbmQgZW5kCi0JCQkJLy8gb2Zmc2V0LAotCQkJCS8vIHNpbmNlIHRoYXQgd291bGQgZGVjaWRlIG1hbnkgY2FzZXMgcmlnaHQgYXdheSBhbmQgYXZvaWQgdGhlCi0JCQkJLy8gdGV4dCBjb21wYXJpc29uCi0JCQkJaWYgKG9sZFJlZ2lvbi5nZXRUeXBlKCkgPT0gbmV3UmVnaW9uLmdldFR5cGUoKSkgewotCQkJCQlpZiAoc2FtZU9mZnNldHNBcyhvbGRSZWdpb24sIG5ld0RvY3VtZW50UmVnaW9uLCBuZXdSZWdpb24sIHNoaWZ0KSkgewotCQkJCQkJaWYgKHNhbWVUZXh0QXMob2xkUmVnaW9uLCBuZXdEb2N1bWVudFJlZ2lvbiwgbmV3UmVnaW9uLCBzaGlmdCkpIHsKLQkJCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lT2Zmc2V0c0FzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJaWYgKGdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgLSBzaGlmdCkgewotCQkJaWYgKGdldEVuZE9mZnNldCgpID09IHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIHNoaWZ0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lT2Zmc2V0c0FzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJaWYgKGdldFN0YXJ0T2Zmc2V0KG9sZFJlZ2lvbikgPT0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmV3UmVnaW9uKSAtIHNoaWZ0KSB7Ci0JCQlpZiAoZ2V0RW5kT2Zmc2V0KG9sZFJlZ2lvbikgPT0gZG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KG5ld1JlZ2lvbikgLSBzaGlmdCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2FtZVRleHRBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0VGV4dCgpLmVxdWFscyhyZWdpb24uZ2V0VGV4dCgpKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldE9yaWdpbmFsRXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB8fCBlLmdldE9yaWdpbmFsRXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKSB7Ci0JCQkJLy8gdGhpcyBoYXBwZW5zIG5vcm1hbGx5IGlmIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWQgZnJvbQotCQkJCS8vIGFuZCB0aGVyZWZvcmUgcmVnaW9ucyBhcmUgbm90IGVxdWFsCi0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lVGV4dEFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChnZXRUZXh0KG9sZFJlZ2lvbikuZXF1YWxzKGRvY3VtZW50UmVnaW9uLmdldFRleHQobmV3UmVnaW9uKSkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRPcmlnaW5hbEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQmFkTG9jYXRpb25FeGNlcHRpb24pIHsKLQkJCQkvLyB0aGlzIGhhcHBlbnMgbm9ybWFsbHkgaWYgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZCBmcm9tCi0JCQkJLy8gYW5kIHRoZXJlZm9yZSByZWdpb25zIGFyZSBub3QgZXF1YWwKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uI3NldERlbGV0ZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGV0ZWQoYm9vbGVhbiBpc0RlbGV0ZWQpIHsKLQkJZklzRGVsZXRlZCA9IGlzRGVsZXRlZDsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdIYXNFbmQKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRlZChib29sZWFuIG5ld0hhc0VuZCkgewotCQlpZiAobmV3SGFzRW5kKSB7Ci0JCQloYXNFbmQgPSAxOwotCQl9IGVsc2UgewotCQkJaGFzRW5kID0gMDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbmV3TGVuZ3RoKSB7Ci0JCS8vdGV4dExlbmd0aCA9IG5ld0xlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5leHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0KSB7Ci0JCW5leHQgPSBuZXdOZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZlBhcmVudERvY3VtZW50ID0gZG9jdW1lbnQ7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzKSB7Ci0JCXByZXZpb3VzID0gbmV3UHJldmlvdXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgY29udGFpbmVkUmVnaW9ucykgewotCQlfcmVnaW9ucyA9IGNvbnRhaW5lZFJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KSB7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJLy8gTk9URTogaWYgdGhlIGRvY3VtZW50IGhlbGQgYnkgYW55IHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGFuZCB0aGUKLQkJLy8gcmVnaW9uIG9mZnNldHMgaGF2ZSBub3QKLQkJLy8geWV0IGJlZW4gdXBkYXRlZCwgdGhlIG91dHB1dCBmcm9tIHRoaXMgbWV0aG9kIGludmFsaWQuCi0JCS8vIEFsc28gbm90ZSwgdGhpcyBtZXRob2QgY2FuIG5vdCBiZSBjaGFuZ2VkLCB3aXRob3V0ICJicmVha2luZyIKLQkJLy8gdW5pdCB0ZXN0cywgc2luY2Ugc29tZSBvZiB0aGVtIGNvbXBhcmUgY3VycmVudCByZXN1bHRzIHRvIHByZXZpb3VzCi0JCS8vIHJlc3VsdHMuCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSAiWyIgKyBnZXRTdGFydCgpICsgIiwgIiArIGdldEVuZCgpICsgIl0gKCIgKyBnZXRUZXh0KCkgKyAiKSI7IC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRG93blN0cmVhbVJlZ2lvbnMoSVRleHRSZWdpb24gY2hhbmdlZFJlZ2lvbiwgaW50IGxlbmd0aERpZmZlcmVuY2UpIHsKLQkJaW50IGxpc3RMZW5ndGggPSBfZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkvLyBmaXJzdCwgbG9vcCB0aHJvdWdoIHRvIGZpbmQgaW5kZXggb2Ygd2hlcmUgdG8gc3RhcnQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IF9nZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbiA9PSBjaGFuZ2VkUmVnaW9uKSB7Ci0JCQkJc3RhcnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gbm93LCBiZWdpbm5pbmcgb25lIHBhc3QgdGhlIG9uZSB0aGF0IHdhcyBjaGFuZ2VkLCBsb29wCi0JCS8vIHRocm91Z2ggdG8gZW5kIG9mIGxpc3QsIGFkanVzdGluZyB0aGUgc3RhcnQgcG9zdGlvbnMuCi0JCXN0YXJ0SW5kZXgrKzsKLQkJZm9yIChpbnQgaiA9IHN0YXJ0SW5kZXg7IGogPCBsaXN0TGVuZ3RoOyBqKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IF9nZXRSZWdpb25zKCkuZ2V0KGopOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KGxlbmd0aERpZmZlcmVuY2UpOwotCQl9Ci0JfQotCi0JLy8gVGhpcyBpcyBhIGxhbmd1YWdlIHNwZWNpZmljIG1ldGhvZCAoZS5nLiBIVE1MLCBKYXZhLCBQcm9sb2csIGV0Yy4pIHNvCi0JLy8gY291bGQvc2hvdWxkIGJlIG1hZGUgY29uZmlndXJhYmxlLgotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uI3VwZGF0ZU1vZGVsKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotCSAqLwotCS8vCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcKLQkvLyBjaGFuZ2VzLCBpbnQgc3RhcnQsIGludCBlbmQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUpIHsKLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJLy8gR2V0IHRoZSByZWdpb24gcG9pbnRlZCB0byBieSB0aGUgcmVxdWVzdFN0YXJ0IHBvc3Rpb24sIGFuZCBnaXZlCi0JCS8vIHRoYXQgcmVnaW9uIGEgY2hhbmNlIHRvIGVmZmVjdAotCQkvLyB0aGUgdXBkYXRlLgotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZXF1ZXN0U3RhcnQpOwotCQkvLyBpZiB0aGVyZSBpcyBubyByZWdpb24sIHRoZW4gdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIG11c3QgY29tZSByaWdodAotCQkvLyBhZnRlciB0aGUKLQkJLy8gbm9kZSAoYW5kIHJpZ2h0IGFmdGVyIHRoZSBsYXN0IHJlZ2lvbikuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsCi0JCS8vIHdoZW4gc29tZW9uZQotCQkvLyB0eXBlcyBzb21ldGhpbmcgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIG9yIG1vcmUgY29tbW9ubHksIHdoZW4KLQkJLy8gdGhleSBhcmUgcmlnaHQKLQkJLy8gYXQgdGhlIGJlZ2lubmluZyBvZiBvbmUgbm9kZSwgYW5kIHRoZSBkaXJ0eSBzdGFydCBpcyB0aGVyZWZvcmUKLQkJLy8gY2FsY3VsYXRlZCB0byBiZSB0aGUKLQkJLy8gcHJldmlvdXMgbm9kZS4KLQkJLy8gU28sIGluIHRoaXMgY2FzZSwgd2UnbGwgZ2l2ZSB0aGUgbGFzdCByZWdpb24gYSBjaGFuY2UgdG8gc2VlIGlmIGl0Ci0JCS8vIHdhbnRzIHRvCi0JCS8vIHN3YWxsb3cgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIC0tIGJ1dCBvbmx5IGZvciBpbnNlcnRzIC0tIGRlbGV0ZXMKLQkJLy8gYW5kICJyZXBsYWNlcyIKLQkJLy8gc2hvdWxkIGJlIHJlcGFyc2VkIGlmIHRoZXkgYXJlIGluIHRoZXNlIGJvcmRlciByZWdpb25zLCBhbmQgb25seSBpZgotCQkvLyB0aGUKLQkJaWYgKChyZWdpb24gPT0gbnVsbCkgJiYgKGxlbmd0aFRvUmVwbGFjZSA9PSAwKSkgewotCQkJcmVnaW9uID0gX2dldFJlZ2lvbnMoKS5nZXQoX2dldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQkJCS8vIG1ha2Ugc3VyZSB0aGUgcmVnaW9uIGlzIGNvbnRpZ3VvdXMKLQkJCWlmIChnZXRFbmRPZmZzZXQocmVnaW9uKSA9PSByZXF1ZXN0U3RhcnQpIHsKLQkJCQlyZXN1bHQgPSByZWdpb24udXBkYXRlTW9kZWwocmVxdWVzdGVyLCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkvLwotCQkJCS8vIElmIHRoZSByZXF1ZXN0ZWQgY2hhbmdlIHNwYW5zIG1vcmUgdGhhbiBvbmUgcmVnaW9uLCB0aGVuCi0JCQkJLy8gd2UgZG9uJ3QgZ2l2ZSB0aGUgcmVnaW9uIGEgY2hhbmNlIHRvIHVwZGF0ZS4KLQkJCQlpZiAoKGNvbnRhaW5zT2Zmc2V0KHJlZ2lvbiwgcmVxdWVzdFN0YXJ0KSkgJiYgKGNvbnRhaW5zT2Zmc2V0KHJlZ2lvbiwgcmVxdWVzdFN0YXJ0ICsgbGVuZ3RoVG9SZXBsYWNlKSkpIHsKLQkJCQkJcmVzdWx0ID0gcmVnaW9uLnVwZGF0ZU1vZGVsKHJlcXVlc3RlciwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBpZiByZXN1bHQgaXMgbm90IG51bGwsIHRoZW4gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0YXJ0IGFuZCBlbmQKLQkJLy8gcG9zdGlvbnMgb2YgdGhlIHJlZ2lvbnMgdGhhdCBmb2xsb3cgdGhpcyBvbmUKLQkJLy8gaWYgcmVzdWx0IGlzIG51bGwsIHRoZW4gYXBwbHkgdGhlIGZsYXRub2RlIHNwZWNpZmljIGNoZWNrcyBvbiB3aGF0Ci0JCS8vIGl0IGNhbiBjaGFuZ2UKLQkJLy8gKGkuZS4gbW9yZSB0aGFuIG9uZSByZWdpb24sIGJ1dCBubyBjaGFuZ2UgdG8gdGhlIG5vZGUgaXRzZWxmKQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCS8vIFRoYXQgaXMsIGEgcmVnaW9uIGRlY2lkZWQgaXQgY291bGQgaGFuZGxlIHRoZSBjaGFuZ2UgYW5kCi0JCQkvLyBjcmVhdGVkCi0JCQkvLyBhIHJlZ2lvbiBjaGFuZ2VkIGV2ZW50LgotCQkJQXNzZXJ0LmlzVHJ1ZShyZXN1bHQgaW5zdGFuY2VvZiBSZWdpb25DaGFuZ2VkRXZlbnQsICJQcm9ncmFtIEVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCXVwZGF0ZURvd25TdHJlYW1SZWdpb25zKCgoUmVnaW9uQ2hhbmdlZEV2ZW50KSByZXN1bHQpLmdldFJlZ2lvbigpLCBsZW5ndGhEaWZmZXJlbmNlKTsKLQkJCS8vIFBMVVMsIHdlIG5lZWQgdG8gdXBkYXRlIG91ciBvd24gbm9kZSBlbmQgcG9pbnQgKGxlbmd0aCkKLQkJCXNldExlbmd0aChnZXRMZW5ndGgoKSArIGxlbmd0aERpZmZlcmVuY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9DaGFyU2VxdWVuY2VSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9DaGFyU2VxdWVuY2VSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgxZjYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ2hhclNlcXVlbmNlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBDaGFyU2VxdWVuY2VSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCXByaXZhdGUgaW50IGZDdXJyZW50UG9zaXRpb247Ci0JcHJpdmF0ZSBpbnQgZk1heGltdW1SZWFkT2Zmc2V0OwotCi0JcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZk9yaWdpbmFsU291cmNlOwotCi0JLyoqCi0JICogIAotCSAqLwotCUNoYXJTZXF1ZW5jZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyBDaGFyU2VxdWVuY2VSZWFkZXIoQ2hhclNlcXVlbmNlIG9yaWdpbmFsU291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIElTU1VFOiBzaG91bGQgd2UgImZhaWwgZmFzdCIgaWYgcmVxdWVzdGVkIGxlbmd0aCBpcyBtb3JlIHRoYW4gdGhlcmUKLQkJLy8gaXM/Ci0JCWZPcmlnaW5hbFNvdXJjZSA9IG9yaWdpbmFsU291cmNlOwotCQlpbnQgc3RhcnRPZmZzZXQgPSBvZmZzZXQ7Ci0JCWludCBtYXhSZXF1ZXN0ZWRPZmZzZXQgPSBzdGFydE9mZnNldCArIGxlbmd0aDsKLQkJaW50IG1heFBvc3NpYmxlT2Zmc2V0ID0gMCArIG9yaWdpbmFsU291cmNlLmxlbmd0aCgpOwotCQlmTWF4aW11bVJlYWRPZmZzZXQgPSBNYXRoLm1pbihtYXhSZXF1ZXN0ZWRPZmZzZXQsIG1heFBvc3NpYmxlT2Zmc2V0KTsKLQotCQlmQ3VycmVudFBvc2l0aW9uID0gc3RhcnRPZmZzZXQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jawotCSAqLwotCUNoYXJTZXF1ZW5jZVJlYWRlcihPYmplY3QgbG9jaykgewotCQlzdXBlcihsb2NrKTsKLQkJLy8gZm9yIHRocmVhZCBzYWZldHksIG1heSBuZWVkIHRvIGFkZCBiYWNrIGxvY2tpbmcgbWVjaGFuaXNtCi0JCS8vIGluIG91ciBjdXN0b20gY29uc3RydWN0b3IuIFRoaXMgY29uc3RydWN0b3IgbGVmdCBoZXJlIGp1c3QKLQkJLy8gZm9yIGEgcmVtaW5kZXIuCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RoaW5nIHRvIGRvIHdoZW4gd2UgY2xvc2UKLQkJLy8gKG1heSBiZSB0byBldmVudHVhbGx5ICJ1bmxvY2siIG9yIG51bGwgb3V0IHNvbWUgdmFyaWJsZXMKLQkJLy8ganVzdCBmb3IgaHlnZW5lLgotCQkvLyBvciwgcGVyaGFwcyBpZiBhbHJlYWR5IGNsb3NlZCBvbmNlIHRocm93IElPRXhjZXB0aW9uPyBmb3IKLQkJLy8gY29uc2lzdGVuY3k/Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBvcmlnaW5hbFNvdXJjZS4KLQkgKiBAZGVwcmVjYXRlZCAtIG9ubHkgdGVtcG9yYXJpbHkgcHVibGljLCBzaG91bGQgYmUgJ2RlZmF1bHQnIGV2ZW50dWFsbHkKLQkgKiAgICAgICAgICAgICBvciBnbyBhd2F5IGFsdG9nZXRoZXIuCi0JICovCi0JcHVibGljIENoYXJTZXF1ZW5jZSBnZXRPcmlnaW5hbFNvdXJjZSgpIHsKLQkJcmV0dXJuIGZPcmlnaW5hbFNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaWYgKGZDdXJyZW50UG9zaXRpb24gPCBmTWF4aW11bVJlYWRPZmZzZXQpIHsKLQkJCXJlc3VsdCA9IGZPcmlnaW5hbFNvdXJjZS5jaGFyQXQoZkN1cnJlbnRQb3NpdGlvbisrKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlYWQgY2hhcmFjdGVycyBpbnRvIGEgcG9ydGlvbiBvZiBhbiBhcnJheS4gVGhpcyBtZXRob2Qgd2lsbCBibG9jawotCSAqIHVudGlsIHNvbWUgaW5wdXQgaXMgYXZhaWxhYmxlLCBhbiBJL08gZXJyb3Igb2NjdXJzLCBvciB0aGUgZW5kIG9mIHRoZQotCSAqIHN0cmVhbSBpcyByZWFjaGVkLgotCSAqIAotCSAqIEBwYXJhbSBjYnVmCi0JICogICAgICAgICAgICBEZXN0aW5hdGlvbiBidWZmZXIKLQkgKiBAcGFyYW0gb2ZmCi0JICogICAgICAgICAgICBPZmZzZXQgYXQgd2hpY2ggdG8gc3RhcnQgc3RvcmluZyBjaGFyYWN0ZXJzCi0JICogQHBhcmFtIGxlbgotCSAqICAgICAgICAgICAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkCi0JICogCi0JICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCwgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCi0JICogICAgICAgICBoYXMgYmVlbiByZWFjaGVkCi0JICogCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLQkgKi8KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGNoYXJzVG9SZWFkID0gLTE7Ci0JCS8vIGlmIGFscmVhZHkgb3ZlciBtYXgsIGp1c3QgcmV0dXJuIC0xCi0JCS8vIHJlbWVtYmVyLCBjdXJyZW50UG9zaXRpb24gaXMgd2hhdCBpcyBnZXR0aW5nIHJlYWR5IHRvIGJlIHJlYWQKLQkJLy8gKHRoYXQgaXMsIGl0cyBhbHJlYWR5IGJlZW4gaW5jcmVtZW50ZWQgaW4gcmVhZCgpKS4KLQkJaWYgKGZDdXJyZW50UG9zaXRpb24gPCBmTWF4aW11bVJlYWRPZmZzZXQpIHsKLQotCi0JCQlpbnQgYnVmZk1heFRvUmVhZCA9IGNidWYubGVuZ3RoIC0gb2ZmOwotCQkJaW50IG1pblJlcXVlc3RlZCA9IE1hdGgubWluKGJ1ZmZNYXhUb1JlYWQsIGxlbik7Ci0JCQlpbnQgbGVuZ3RoUmVtYWluaW5nID0gZk1heGltdW1SZWFkT2Zmc2V0IC0gZkN1cnJlbnRQb3NpdGlvbjsKLQkJCWNoYXJzVG9SZWFkID0gTWF0aC5taW4obWluUmVxdWVzdGVkLCBsZW5ndGhSZW1haW5pbmcpOwotCi0KLQkJCUNoYXJTZXF1ZW5jZSBzZXEgPSBmT3JpZ2luYWxTb3VyY2Uuc3ViU2VxdWVuY2UoZkN1cnJlbnRQb3NpdGlvbiwgZkN1cnJlbnRQb3NpdGlvbiArIGNoYXJzVG9SZWFkKTsKLQkJCS8vIGZvciBub3csIGhhcmQgYXNzdW1wdGlvbiB0aGF0IG9yaWdpbmFsIGlzIGEgU3RyaW5nIHNpbmNlIHNvdXJjZQotCQkJLy8gaXMgYXNzdW1lZCB0byBiZSBkb2N1bWVudCwgb3IgdGV4dCBzdG9yZQotCQkJU3RyaW5nIHNlcVN0cmluZyA9IChTdHJpbmcpIHNlcTsKLQkJCXNlcVN0cmluZy5nZXRDaGFycygwLCBzZXFTdHJpbmcubGVuZ3RoKCksIGNidWYsIG9mZik7Ci0KLQotCi0JCQlmQ3VycmVudFBvc2l0aW9uID0gZkN1cnJlbnRQb3NpdGlvbiArIGNoYXJzVG9SZWFkOwotCi0KLQkJfQotCQlyZXR1cm4gY2hhcnNUb1JlYWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NvcmVOb2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NvcmVOb2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2I0MGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Db3JlTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENvcmVOb2RlTGlzdCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IHsKLQlpbnQgY291bnRlZExlbmd0aDsKLQlpbnQgY3VycmVudEluZGV4ID0gLTE7Ci0KLQkvL2NvbS5pYm0uc2VkLmludGVyZmFjZXMuY29yZS5Db3JlCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGZsYXROb2RlczsKLQkvL2NvbS5pYm0uc2VkLmludGVyZmFjZXMuY29yZS5Db3JlCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkOwotCi0JLyoqCi0JICogQ29yZU5vZGVMaXN0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvcmVOb2RlTGlzdCgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gY3JlYXRlIGFuIGFycmF5LCBldmVuIGlmIHplcm8gbGVuZ3RoCi0JCWZsYXROb2RlcyA9IG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uWzBdOwotCX0KLQotCXB1YmxpYyBDb3JlTm9kZUxpc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdIZWFkKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIHNhdmUgaGVhZAotCQloZWFkID0gbmV3SGVhZDsKLQkJaW50IGNvdW50ID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBuZXdIZWFkOwotCQkvLyB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIGxpc3Qgb25jZSwgdG8gZ2V0IGl0cwotCQkvLyBsZW5ndGggaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBhcnJheQotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCWNvdW50Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCS8vIGNyZWF0ZSBhbiBhcnJheSwgZXZlbiBpZiB6ZXJvIGxlbmd0aAotCQlmbGF0Tm9kZXMgPSBuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltjb3VudF07Ci0JCS8vIHN0YXJ0IGNvdW50Tm9kZSBvdmVyIGFnYWluLCBzbyB0byBzcGVhay4KLQkJY291bnROb2RlID0gbmV3SGVhZDsKLQkJY291bnQgPSAwOwotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCWZsYXROb2Rlc1tjb3VudCsrXSA9IGNvdW50Tm9kZTsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGNvdW50ID4gMCkgewotCQkJY3VycmVudEluZGV4ID0gMDsKLQkJCS8vIGVsc2UgaXQgc3RheXMgYXQgLTEgaW5pdGlhbGl6ZWQgYXQgb2JqZWN0IGNyZWF0aW9uCi0JCQkvLwotCQkJLy8gc2F2ZSBsZW5ndGgKLQkJCWNvdW50ZWRMZW5ndGggPSBjb3VudDsKLQkJfQotCX0KLQotCXB1YmxpYyBDb3JlTm9kZUxpc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmQpIHsKLQkJc3VwZXIoKTsKLQkJLy8gc2F2ZSBoZWFkCi0JCWhlYWQgPSBzdGFydDsKLQkJaW50IGNvdW50ID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBzdGFydDsKLQkJaWYgKChzdGFydCA9PSBudWxsKSB8fCAoZW5kID09IG51bGwpKSB7Ci0JCQkvLyBlcnJvciBjb25kaXRpb24KLQkJCS8vdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBwcm92aWRlIHN0YXJ0IGFuZCBlbmQKLQkJCS8vIG5vZGVzIHRvIGNvbnN0cnVjdCBDb3JlTm9kZUxpc3QiKTsKLQkJfSBlbHNlIHsKLQkJCWNvdW50ID0gMTsKLQkJCXdoaWxlICgoY291bnROb2RlICE9IG51bGwpICYmIChjb3VudE5vZGUgIT0gZW5kKSkgewotCQkJCWNvdW50Kys7Ci0JCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBlbmRlZCBiZWNhdXNlIHRoZSBsYXN0IG9uZSB3YXMgbnVsbCwKLQkJLy8gYmFja3VwIG9uZS4KLQkJaWYgKGNvdW50Tm9kZSA9PSBudWxsKQotCQkJY291bnQtLTsKLQkJaWYgKGNvdW50IDwgMCkgewotCQkJY291bnQgPSAwOwotCQl9Ci0JCWZsYXROb2RlcyA9IG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW2NvdW50XTsKLQkJaWYgKGNvdW50ID4gMCkgewotCQkJZmxhdE5vZGVzWzBdID0gY291bnROb2RlID0gc3RhcnQ7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlmbGF0Tm9kZXNbaV0gPSBmbGF0Tm9kZXNbaSAtIDFdLmdldE5leHQoKTsKLQkJCX0KLQotCQl9Ci0JCWN1cnJlbnRJbmRleCA9IDA7Ci0JCWNvdW50ZWRMZW5ndGggPSBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmICgoZmxhdE5vZGVzICE9IG51bGwpICYmIChmbGF0Tm9kZXMubGVuZ3RoID4gMCkpCi0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24oZmxhdE5vZGVzWzBdLCBmbGF0Tm9kZXNbZmxhdE5vZGVzLmxlbmd0aCAtIDFdKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uKG51bGwpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZmxhdE5vZGVzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhPYmplY3QgbykgewotCQlpZiAoZmxhdE5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhdE5vZGVzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGZsYXROb2Rlc1tpXSA9PSBvKQotCQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXRlbShpbnQgaSkgewotCQlyZXR1cm4gZmxhdE5vZGVzW2ldOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Eb2N1bWVudEludGVybmFsU3RhdGVSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvRG9jdW1lbnRJbnRlcm5hbFN0YXRlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmM0NzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Eb2N1bWVudEludGVybmFsU3RhdGVSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci0KLQotcHVibGljIGNsYXNzIERvY3VtZW50SW50ZXJuYWxTdGF0ZVJ1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFJFQURfU1RBVEUgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgRG9jdW1lbnRJbnRlcm5hbFN0YXRlUnVsZSBSRUFEX1JVTEUgPSBuZXcgRG9jdW1lbnRJbnRlcm5hbFN0YXRlUnVsZShSRUFEX1NUQVRFKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBXUklURV9TVEFURSA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBEb2N1bWVudEludGVybmFsU3RhdGVSdWxlIFdSSVRFX1JVTEUgPSBuZXcgRG9jdW1lbnRJbnRlcm5hbFN0YXRlUnVsZShXUklURV9TVEFURSk7Ci0JcHJpdmF0ZSBpbnQgZlN0YXRlOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBEb2N1bWVudEludGVybmFsU3RhdGVSdWxlKGludCBzdGF0ZSkgewotCQlzdXBlcigpOwotCQlmU3RhdGUgPSBzdGF0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZSNjb250YWlucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSAocnVsZSBpbnN0YW5jZW9mIERvY3VtZW50SW50ZXJuYWxTdGF0ZVJ1bGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlI2lzQ29uZmxpY3Rpbmcob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSAoZlN0YXRlID09IFdSSVRFX1NUQVRFKSAmJiAocnVsZSBpbnN0YW5jZW9mIERvY3VtZW50SW50ZXJuYWxTdGF0ZVJ1bGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0dlbmVyaWNQb3NpdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9HZW5lcmljUG9zaXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjZjNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0dlbmVyaWNQb3NpdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5Bc3NlcnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZkNoYXJTZXF1ZW5jZTsKLQotCi0KLQlwcml2YXRlIE1hcCBmUG9zaXRpb25zOwotCS8qKiBBbGwgcmVnaXN0ZXJlZCBkb2N1bWVudCBwb3NpdGlvbiB1cGRhdGVycyAqLwotCXByaXZhdGUgTGlzdCBmUG9zaXRpb25VcGRhdGVyczsKLQotCS8qKgotCSAqIGRvbid0IGFsbG93IGluc3RhbnRpYXRpb24gd2l0aCBvdXQgZG9jdW1lbnQgcG9pbnRlcgotCSAqICAKLQkgKi8KLQlwcml2YXRlIEdlbmVyaWNQb3NpdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBHZW5lcmljUG9zaXRpb25NYW5hZ2VyKENoYXJTZXF1ZW5jZSBjaGFyU2VxdWVuY2UpIHsKLQkJdGhpcygpOwotCQkvLyB3ZSBvbmx5IHVzZSBjaGFyU2VxdWVuY2UgZm9yICJsZW5ndGgiLCB0bwotCQkvLyBtYWRlIG1vcmUgZ2VuZXJpYyB0aGFuICJkb2N1bWVudCIgZXZlbiAidGV4dCBzdG9yZSIKLQkJZkNoYXJTZXF1ZW5jZSA9IGNoYXJTZXF1ZW5jZTsKLQkJY29tcGxldGVJbml0aWFsaXphdGlvbigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGRQb3NpdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJYWRkUG9zaXRpb24oSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlksIHBvc2l0aW9uKTsKLQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2FkZFBvc2l0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgUG9zaXRpb24gcG9zaXRpb24pIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCgwID4gcG9zaXRpb24ub2Zmc2V0KSB8fCAoMCA+IHBvc2l0aW9uLmxlbmd0aCkgfHwgKHBvc2l0aW9uLm9mZnNldCArIHBvc2l0aW9uLmxlbmd0aCA+IGdldERvY3VtZW50TGVuZ3RoKCkpKQotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCWxpc3QuYWRkKGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KGxpc3QsIHBvc2l0aW9uLm9mZnNldCksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjYWRkUG9zaXRpb25DYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoY2F0ZWdvcnkpKQotCQkJZlBvc2l0aW9ucy5wdXQoY2F0ZWdvcnksIG5ldyBBcnJheUxpc3QoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2FkZFBvc2l0aW9uVXBkYXRlcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlpbnNlcnRQb3NpdGlvblVwZGF0ZXIodXBkYXRlciwgZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRvY3VtZW50IGxpc3RlbmVycywgcG9zaXRpb25zLCBhbmQgcG9zaXRpb24gdXBkYXRlcnMuIE11c3QKLQkgKiBiZSBjYWxsZWQgaW5zaWRlIHRoZSBjb25zdHJ1Y3RvciBhZnRlciB0aGUgaW1wbGVtZW50YXRpb24gcGx1Zy1pbnMgaGF2ZQotCSAqIGJlZW4gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKSB7Ci0KLQkJZlBvc2l0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZQb3NpdGlvblVwZGF0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWFkZFBvc2l0aW9uQ2F0ZWdvcnkoSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlkpOwotCQlhZGRQb3NpdGlvblVwZGF0ZXIobmV3IERlZmF1bHRQb3NpdGlvblVwZGF0ZXIoSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlkpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjY29tcHV0ZUluZGV4SW5DYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKDAgPiBvZmZzZXQgfHwgb2Zmc2V0ID4gZ2V0RG9jdW1lbnRMZW5ndGgoKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCi0JCUxpc3QgYyA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCXJldHVybiBjb21wdXRlSW5kZXhJblBvc2l0aW9uTGlzdChjLCBvZmZzZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGluZGV4IGluIHRoZSBsaXN0IG9mIHBvc2l0aW9ucyBhdCB3aGljaCBhIHBvc2l0aW9uIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gb2Zmc2V0IHdvdWxkIGJlIGluc2VydGVkLiBUaGUgcG9zaXRpb24gaXMgc3VwcG9zZWQgdG8gYmVjb21lCi0JICogdGhlIGZpcnN0IGluIHRoaXMgbGlzdCBvZiBhbGwgcG9zaXRpb25zIHdpdGggdGhlIHNhbWUgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0IGluIHdoaWNoIHRoZSBpbmRleCBpcyBjb21wdXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgZm9yIHdoaWNoIHRoZSBpbmRleCBpcyBjb21wdXRlZAotCSAqIEByZXR1cm4gdGhlIGNvbXB1dGVkIGluZGV4Ci0JICogCi0JICogQHNlZSBJRG9jdW1lbnQjY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KExpc3QgcG9zaXRpb25zLCBpbnQgb2Zmc2V0KSB7Ci0KLQkJaWYgKHBvc2l0aW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiAwOwotCi0JCWludCBsZWZ0ID0gMDsKLQkJaW50IHJpZ2h0ID0gcG9zaXRpb25zLnNpemUoKSAtIDE7Ci0JCWludCBtaWQgPSAwOwotCQlQb3NpdGlvbiBwID0gbnVsbDsKLQotCQl3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0KLQkJCW1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKLQotCQkJcCA9IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChtaWQpOwotCQkJaWYgKG9mZnNldCA8IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCQlpZiAobGVmdCA9PSBtaWQpCi0JCQkJCXJpZ2h0ID0gbGVmdDsKLQkJCQllbHNlCi0JCQkJCXJpZ2h0ID0gbWlkIC0gMTsKLQkJCX0gZWxzZSBpZiAob2Zmc2V0ID4gcC5nZXRPZmZzZXQoKSkgewotCQkJCWlmIChyaWdodCA9PSBtaWQpCi0JCQkJCWxlZnQgPSByaWdodDsKLQkJCQllbHNlCi0JCQkJCWxlZnQgPSBtaWQgKyAxOwotCQkJfSBlbHNlIGlmIChvZmZzZXQgPT0gcC5nZXRPZmZzZXQoKSkgewotCQkJCWxlZnQgPSByaWdodCA9IG1pZDsKLQkJCX0KLQotCQl9Ci0KLQkJaW50IHBvcyA9IGxlZnQ7Ci0JCXAgPSAoUG9zaXRpb24pIHBvc2l0aW9ucy5nZXQocG9zKTsKLQkJaWYgKG9mZnNldCA+IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCS8vIGFwcGVuZCB0byB0aGUgZW5kCi0JCQlwb3MrKzsKLQkJfSBlbHNlIHsKLQkJCS8vIGVudHJ5IHdpbGwgYmVjYW1lIHRoZSBmaXJzdCBvZiBhbGwgZW50cmllcyB3aXRoIHRoZSBzYW1lCi0JCQkvLyBvZmZzZXQKLQkJCWRvIHsKLQkJCQktLXBvczsKLQkJCQlpZiAocG9zIDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQkJcCA9IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChwb3MpOwotCQkJfSB3aGlsZSAob2Zmc2V0ID09IHAuZ2V0T2Zmc2V0KCkpOwotCQkJKytwb3M7Ci0JCX0KLQotCQlBc3NlcnQuaXNUcnVlKDAgPD0gcG9zICYmIHBvcyA8PSBwb3NpdGlvbnMuc2l6ZSgpKTsKLQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaW5kZXggPSBjb21wdXRlSW5kZXhJblBvc2l0aW9uTGlzdChsaXN0LCBvZmZzZXQpOwotCQlpZiAoaW5kZXggPCBzaXplKSB7Ci0JCQlQb3NpdGlvbiBwID0gKFBvc2l0aW9uKSBsaXN0LmdldChpbmRleCk7Ci0JCQl3aGlsZSAocCAhPSBudWxsICYmIHAub2Zmc2V0ID09IG9mZnNldCkgewotCQkJCWlmIChwLmxlbmd0aCA9PSBsZW5ndGgpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCSsraW5kZXg7Ci0JCQkJcCA9IChpbmRleCA8IHNpemUpID8gKFBvc2l0aW9uKSBsaXN0LmdldChpbmRleCkgOiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmIChjYXRlZ29yeSAhPSBudWxsKQotCQkJcmV0dXJuIGZQb3NpdGlvbnMuY29udGFpbnNLZXkoY2F0ZWdvcnkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQotCXB1YmxpYyBpbnQgZ2V0RG9jdW1lbnRMZW5ndGgoKSB7Ci0JCXJldHVybiBmQ2hhclNlcXVlbmNlLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHBvc2l0aW9ucyBtYW5hZ2VkIGJ5IHRoZSBkb2N1bWVudCBncm91cGVkIGJ5IGNhdGVnb3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50J3MgcG9zaXRpb25zCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXREb2N1bWVudE1hbmFnZWRQb3NpdGlvbnMoKSB7Ci0JCXJldHVybiBmUG9zaXRpb25zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKSB7Ci0JCVN0cmluZ1tdIGNhdGVnb3JpZXMgPSBuZXcgU3RyaW5nW2ZQb3NpdGlvbnMuc2l6ZSgpXTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZQb3NpdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKQotCQkJY2F0ZWdvcmllc1tpXSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQotCXB1YmxpYyBQb3NpdGlvbltdIGdldFBvc2l0aW9ucyhTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBjID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBuZXcgUG9zaXRpb25bYy5zaXplKCldOwotCQljLnRvQXJyYXkocG9zaXRpb25zKTsKLQkJcmV0dXJuIHBvc2l0aW9uczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjZ2V0UG9zaXRpb25VcGRhdGVycygpCi0JICovCi0JcHVibGljIElQb3NpdGlvblVwZGF0ZXJbXSBnZXRQb3NpdGlvblVwZGF0ZXJzKCkgewotCQlJUG9zaXRpb25VcGRhdGVyW10gdXBkYXRlcnMgPSBuZXcgSVBvc2l0aW9uVXBkYXRlcltmUG9zaXRpb25VcGRhdGVycy5zaXplKCldOwotCQlmUG9zaXRpb25VcGRhdGVycy50b0FycmF5KHVwZGF0ZXJzKTsKLQkJcmV0dXJuIHVwZGF0ZXJzOwotCX0KLQotCi0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjaW5zZXJ0UG9zaXRpb25VcGRhdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyLCBpbnQgaW5kZXgpIHsKLQotCQlmb3IgKGludCBpID0gZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChmUG9zaXRpb25VcGRhdGVycy5nZXQoaSkgPT0gdXBkYXRlcikKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaW5kZXggPT0gZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpKQotCQkJZlBvc2l0aW9uVXBkYXRlcnMuYWRkKHVwZGF0ZXIpOwotCQllbHNlCi0JCQlmUG9zaXRpb25VcGRhdGVycy5hZGQoaW5kZXgsIHVwZGF0ZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlyZW1vdmVQb3NpdGlvbihJRG9jdW1lbnQuREVGQVVMVF9DQVRFR09SWSwgcG9zaXRpb24pOwotCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHBvc2l0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCUxpc3QgYyA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCS8vIHJlbW92ZSBiYXNlZCBvbiBpZGVudGl0eSBub3QgZXF1YWxpdHkKLQkJaW50IHNpemUgPSBjLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChwb3NpdGlvbiA9PSBjLmdldChpKSkgewotCQkJCWMucmVtb3ZlKGkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbkNhdGVnb3J5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSkpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCWZQb3NpdGlvbnMucmVtb3ZlKGNhdGVnb3J5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25VcGRhdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWZvciAoaW50IGkgPSBmUG9zaXRpb25VcGRhdGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGZQb3NpdGlvblVwZGF0ZXJzLmdldChpKSA9PSB1cGRhdGVyKSB7Ci0JCQkJZlBvc2l0aW9uVXBkYXRlcnMucmVtb3ZlKGkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogVXBkYXRlcyBhbGwgcG9zaXRpb25zIG9mIGFsbCBjYXRlZ29yaWVzIHRvIHRoZSBjaGFuZ2UgZGVzY3JpYmVkIGJ5IHRoZQotCSAqIGRvY3VtZW50IGV2ZW50LiBBbGwgcmVnaXN0ZXJlZCBkb2N1bWVudCB1cGRhdGVycyBhcmUgY2FsbGVkIGluIHRoZQotCSAqIHNlcXVlbmNlIHRoZXkgaGF2ZSBiZWVuIGFycmFuZ2VkLiBVc2VzIGEgcm9idXN0IGl0ZXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGV2ZW50IGRlc2NyaWJpbmcgdGhlIGNoYW5nZSB0byB3aGljaCB0byBhZGFwdAotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBvc2l0aW9ucyhEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZlBvc2l0aW9uVXBkYXRlcnMpOwotCQlJdGVyYXRvciBlID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlQb3NpdGlvblVwZGF0ZXIgdSA9IChJUG9zaXRpb25VcGRhdGVyKSBlLm5leHQoKTsKLQkJCXUudXBkYXRlKGV2ZW50KTsKLQkJfQotCX0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9JRXhlY3V0aW9uRGVsZWdhdGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9JRXhlY3V0aW9uRGVsZWdhdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzMTQxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSUV4ZWN1dGlvbkRlbGVnYXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklFeGVjdXRpb25EZWxlZ2F0ZTsKLQotcHVibGljIGludGVyZmFjZSBJRXhlY3V0aW9uRGVsZWdhdGFibGUgewotCi0Jdm9pZCBzZXRFeGVjdXRpb25EZWxlZ2F0ZShJRXhlY3V0aW9uRGVsZWdhdGUgZXhlY3V0aW9uRGVsZWdhdGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lSZWdpb25Db21wYXJpYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSVJlZ2lvbkNvbXBhcmlibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzMDQzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSVJlZ2lvbkNvbXBhcmlibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZ2lvbkNvbXBhcmlibGUgewotCWJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKTsKLQotCWJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGJjNGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSUV4ZWN1dGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5OZXdNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudCBleHRlbmRzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IGltcGxlbWVudHMgSUV4ZWN1dGlvbkRlbGVnYXRhYmxlLCBJTG9ja2FibGUgewotCi0JcHJpdmF0ZSBJRXhlY3V0aW9uRGVsZWdhdGUgZkV4ZWN1dGlvbkRlbGVnYXRlOwotCXByaXZhdGUgSUxvY2sgZkxvY2thYmxlID0gbnVsbDsKLQotCXB1YmxpYyBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQlzdXBlcihwYXJzZXIpOwotCX0KLQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFjcXVpcmVMb2NrKCkgewotCQlnZXRMb2NrT2JqZWN0KCkuYWNxdWlyZSgpOwotCX0KLQotCXByaXZhdGUgSUV4ZWN1dGlvbkRlbGVnYXRlIGdldEV4ZWN1dGlvbkRlbGVnYXRlKCkgewotCQlyZXR1cm4gZkV4ZWN1dGlvbkRlbGVnYXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklMb2NrYWJsZSNnZXRMb2NrKCkKLQkgKi8KLQotCXB1YmxpYyBJTG9jayBnZXRMb2NrT2JqZWN0KCkgewotCQlpZiAoZkxvY2thYmxlID09IG51bGwpIHsKLQkJCWZMb2NrYWJsZSA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7Ci0JCX0KLQkJcmV0dXJuIGZMb2NrYWJsZTsKLQl9Ci0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWxlYXNlTG9jaygpIHsKLQkJZ2V0TG9ja09iamVjdCgpLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjcmVwbGFjZVRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChmaW5hbCBPYmplY3QgcmVxdWVzdGVyLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCByZXBsYWNlbWVudExlbmd0aCwgZmluYWwgU3RyaW5nIGNoYW5nZXMsIGZpbmFsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5ncykgewotCQlPYmplY3QgdGhyZWFkUmVzdWx0ID0gbnVsbDsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQgPSBudWxsOwotCQlpZiAoZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKSA9PSBudWxsKSB7Ci0JCQkvLyBpZiB0aGUgZGVsZWdhdGUgaGFzIG5vdCBiZWVuIHNldCwgd2UgZXhlY3V0ZSBvbiBjdXJyZW50Ci0JCQkvLyB0aHJlYWQsIGxpa2UgIm5vcm1hbCIuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIG5vcm1hbAotCQkJLy8gbm9uLWVkaXRvcgotCQkJLy8gdXNlICh3aGljaCBzaG91bGQgc3RpbGwsIHVsdGltYXRlbHksIGJlIHByb3RlY3RlZCBieQotCQkJLy8gYSBzY2hlZHVsaW5nIHJ1bGUpLgotCQkJZXZlbnQgPSBzdXBlci5yZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgaWdub3JlUmVhZE9ubHlTZXR0aW5ncyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJZiBkb2N1bWVudCBpcyBiZWluZyB1c2VkIGJ5IGFuIGVkaXRvciwgYSBydW5uYWJsZSBpcwotCQkJLy8gY3JlYXRlZCwKLQkJCS8vIGV2ZW4gaWYgbGF0ZXIgKGluIHRoZSBleGVjdXRpb24gZGVsZWdhdGUgaW5zdGFuY2UpIGl0IGlzCi0JCQkvLyBkZWNpZGVkCi0JCQkvLyBub3RoaW5nIHNwZWNpYWwgaXMgbmVlZGVkICh0aGF0IGlzLCBpbiBmYWN0IGJlaW5nIGNhbGxlZAotCQkJLy8gZnJvbQotCQkJLy8gZWRpdG9yJ3MgZGlzcGxheSB0aHJlYWQsIGluIHdoaWNoIGNhc2UgaXRzIGp1c3QgZXhlY3V0ZWQpCi0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFNsb3RbMF0gPSBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LnN1cGVyLnJlcGxhY2VUZXh0KHJlcXVlc3Rlciwgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzLCBpZ25vcmVSZWFkT25seVNldHRpbmdzKTsKLQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJCXJlc3VsdFNsb3RbMF0gPSBlOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCS8vIHN0cm9uZ2x5IGFzc3VtZXMgc3luY2hyb25vdXMgY2FsbCwgdG8gIndhaXQiIGZvcgotCQkJLy8gcmVzdWx0cwotCQkJLy8gYmFzaWNhbGx5IGp1c3Qgcm91dGVzIHRvIERpc3BsYXkuc3luY2hFeGVjKHJ1bm5hYmxlKSwKLQkJCS8vIGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcgb24gZGlzcGxheSB0aHJlYWQuCi0JCQlnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpLmV4ZWN1dGUocnVubmFibGUpOwotCi0JCQkvLyB0aGlzIHJlbWVtYmVyaW5nIGFuZCByZS10aHJvd2luZyBvZiBleGNlcHRpb24gaXMganVzdCB0bwotCQkJLy8gZ2V0IGFuCi0JCQkvLyBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCBvbiBvbmUgdGhyZWFkLCB0byBiZSB0aHJvd24gb24KLQkJCS8vIGNhbGxlcnMKLQkJCS8vIHRocmVhZC4KLQkJCWlmIChyZXN1bHRTbG90WzBdIGluc3RhbmNlb2YgVGhyb3dhYmxlKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKFRocm93YWJsZSkgcmVzdWx0U2xvdFswXSk7Ci0JCQl9IGVsc2UgewotCQkJCWV2ZW50ID0gKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSByZXN1bHRTbG90WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRpb25EZWxlZ2F0ZShJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUpIHsKLQkJZkV4ZWN1dGlvbkRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JfQotCi0KLQlwdWJsaWMgTmV3TW9kZWxFdmVudCBzZXRUZXh0KGZpbmFsIE9iamVjdCByZXF1ZXN0ZXIsIGZpbmFsIFN0cmluZyB0aGVTdHJpbmcpIHsKLQkJTmV3TW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCU9iamVjdCB0aHJlYWRSZXN1bHQgPSBudWxsOwotCQlpZiAoZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKSA9PSBudWxsKSB7Ci0JCQkvLyBpZiB0aGUgZGVsZWdhdGUgaGFzIG5vdCBiZWVuIHNldCwgd2UgZXhlY3V0ZSBvbiBjdXJyZW50Ci0JCQkvLyB0aHJlYWQsIGxpa2UgIm5vcm1hbCIuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIG5vcm1hbAotCQkJLy8gbm9uLWVkaXRvcgotCQkJLy8gdXNlICh3aGljaCBzaG91bGQgc3RpbGwsIHVsdGltYXRlbHksIGJlIHByb3RlY3RlZCBieQotCQkJLy8gYSBzY2hlZHVsaW5nIHJ1bGUpLgotCQkJZXZlbnQgPSBzdXBlci5zZXRUZXh0KHJlcXVlc3RlciwgdGhlU3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCS8vIElmIGRvY3VtZW50IGlzIGJlaW5nIHVzZWQgYnkgYW4gZWRpdG9yLCBhIHJ1bm5hYmxlIGlzCi0JCQkvLyBjcmVhdGVkLAotCQkJLy8gZXZlbiBpZiBsYXRlciAoaW4gdGhlIGV4ZWN1dGlvbiBkZWxlZ2F0ZSBpbnN0YW5jZSkgaXQgaXMKLQkJCS8vIGRlY2lkZWQKLQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgKHRoYXQgaXMsIGluIGZhY3QgYmVpbmcgY2FsbGVkCi0JCQkvLyBmcm9tCi0JCQkvLyBlZGl0b3IncyBkaXNwbGF5IHRocmVhZCwgaW4gd2hpY2ggY2FzZSBpdHMganVzdCBleGVjdXRlZCkKLQkJCWZpbmFsIE9iamVjdFtdIHJlc3VsdFNsb3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0U2xvdFswXSA9IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQuc3VwZXIuc2V0VGV4dChyZXF1ZXN0ZXIsIHRoZVN0cmluZyk7Ci0JCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQlyZXN1bHRTbG90WzBdID0gZTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQkvLyBzdHJvbmdseSBhc3N1bWVzIHN5bmNocm9ub3VzIGNhbGwsIHRvICJ3YWl0IiBmb3IKLQkJCS8vIHJlc3VsdHMKLQkJCS8vIGJhc2ljYWxseSBqdXN0IHJvdXRlcyB0byBEaXNwbGF5LnN5bmNoRXhlYyhydW5uYWJsZSksCi0JCQkvLyBpZiBub3QgYWxyZWFkeSBydW5uaW5nIG9uIGRpc3BsYXkgdGhyZWFkLgotCQkJZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKS5leGVjdXRlKHJ1bm5hYmxlKTsKLQotCQkJLy8gdGhpcyByZW1lbWJlcmluZyBhbmQgcmUtdGhyb3dpbmcgb2YgZXhjZXB0aW9uIGlzIGp1c3QgdG8KLQkJCS8vIGdldCBhbgotCQkJLy8gZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgb24gb25lIHRocmVhZCwgdG8gYmUgdGhyb3duIG9uCi0JCQkvLyBjYWxsZXJzCi0JCQkvLyB0aHJlYWQuCi0JCQlpZiAocmVzdWx0U2xvdFswXSBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKChUaHJvd2FibGUpIHJlc3VsdFNsb3RbMF0pOwotCQkJfSBlbHNlIHsKLQkJCQlldmVudCA9IChOZXdNb2RlbEV2ZW50KSByZXN1bHRTbG90WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhMWZlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvTWluaW1hbERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5OdWxsU3RydWN0dXJlZERvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotCi0KLS8qKgotICogUHVyZWx5IGEgZHVtbXkgIm1hcmtlciIgaW5zdGFuY2UgZm9yIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgd2hpY2ggYXJlCi0gKiBjcmVhdGVkIHRlbW9yYXJpbHkgaW4gdGhlIGNvdXJzZSBvZiByZS1wYXJzaW5nLiBQcmltYXJpbHkgYSBwbGFjZSBob2xkZXIsCi0gKiBidXQgY2FuIGJlIG5lZWRlZCB0byBnZXQgdGV4dCBmcm9tLgotICovCi1wdWJsaWMgY2xhc3MgTWluaW1hbERvY3VtZW50IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudCB7Ci0JcHJpdmF0ZSBTdWJTZXRUZXh0U3RvcmUgZGF0YTsKLQotCS8qKgotCSAqIE1hcmtlZCBwcml2YXRlIHRvIGJlIHN1cmUgbmV2ZXIgY3JlYXRlZCB3aXRob3V0IGRhdGEgYmVpbmcgaW5pdGlhbGl6ZWQuCi0JICogIAotCSAqLwotCXByaXZhdGUgTWluaW1hbERvY3VtZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNaW5pbWFsRG9jdW1lbnQoU3ViU2V0VGV4dFN0b3JlIGluaXRpYWxDb250ZW50cykgewotCQl0aGlzKCk7Ci0JCWRhdGEgPSBpbml0aWFsQ29udGVudHM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgZG9jdW1lbnRBZGFwdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE86IHRoaXMgaXMgY2FsbGVkIGZyb20gbm90aWZpZXIgbG9vcCBpbmFwcHJvcHJpYXRlbHkKLQkJLy8JdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgY29tcHV0ZU51bWJlck9mTGluZXMoU3RyaW5nIHRleHQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1JlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaXJlTmV3RG9jdW1lbnQoT2JqZWN0IHJlcXVlc3RlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGRhdGEuZ2V0KDAsIGRhdGEuZ2V0TGVuZ3RoKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZGF0YS5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGNoYXIgZ2V0Q2hhcihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZGF0YS5nZXQob2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQkvLyB0ZW1wIGZpeAotCQlyZXR1cm4gbmV3IE51bGxTdHJ1Y3R1cmVkRG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCQkvLwkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsQ29udGVudFR5cGVzKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBkYXRhLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRMaW5lSW5mb3JtYXRpb24oaW50IGxpbmUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZUxlbmd0aChpbnQgbGluZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRMaW5lT2Zmc2V0KGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMaW5lcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQW4gaW5zdGFuY2Ugb2YgTWluaW1hbERvY3VtZW50IHdhcyBhc2tlZCBmb3IgaXRzIHBhcnRpdGlvbiwgc29tZXRpbWUgaW5kaWNhdGluZyBhIGRlbGV0ZWQgcmVnaW9uIHdhcyBiZWluZyBhY2Nlc3NlZC4iKTsKLQkJcmV0dXJuIG5ldyBUeXBlZFJlZ2lvbigwLDAsICJ1bmRlZmluZWQiKTsKLQkJLy90aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UG9zaXRpb25DYXRlZ29yaWVzKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRQb3NpdGlvbnMoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUG9zaXRpb25VcGRhdGVyW10gZ2V0UG9zaXRpb25VcGRhdGVycygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZ2V0UmVnaW9uTGlzdCgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGdldFJlUGFyc2VyKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBkYXRhLmdldCgwLCBkYXRhLmdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjZ2V0VW5kb01hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0UG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlciwgaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBjYWxsZWQgZnJvbSBub3RpZmllciBsb29wIGluYXBwcm9wcmlhdGVseQotCQkvLwl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3SW5zdGFuY2UoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jcmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UpCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZShJRG9jdW1lbnRMaXN0ZW5lciBvd25lciwgSVJlcGxhY2UgcmVwbGFjZSkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgUG9zaXRpb24gcG9zaXRpb24pIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgZG9jdW1lbnRBZGFwdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvLwkJZGF0YS5yZXBsYWNlKG9mZnNldCwgbGVuZ3RoLCB0ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHNvdXJjZSwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I3JlcGxhY2VUZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHNvdXJjZSwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5nKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IHNlYXJjaChpbnQgc3RhcnRPZmZzZXQsIFN0cmluZyBmaW5kU3RyaW5nLCBib29sZWFuIGZvcndhcmRTZWFyY2gsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSwgYm9vbGVhbiB3aG9sZVdvcmQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCWRhdGEuc2V0KHRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50UGFydGl0aW9uZXIoSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZURlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBOZXdNb2RlbEV2ZW50IHNldFRleHQoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGFsbFRleHQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I3NldFVuZG9NYW5hZ2VyKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51bmRvLlN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbiNzdGFydFNlcXVlbnRpYWxSZXdyaXRlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRTZXF1ZW50aWFsUmV3cml0ZShib29sZWFuIG5vcm1hbGl6ZSkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0b3BTZXF1ZW50aWFsUmV3cml0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmExZDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlV0aWxpdGllczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjZW50cmFsaXplZCBwbGFjZSB0byBwdXQgInJlcGFyc2luZyIgbG9naWMuIFRoaXMgaXMKLSAqIHRoZSBsb2dpYyB0aGF0IHJlcGFyc2VzIHRoZSB0ZXh0IGluY3JlbWVudGFsbHksIGFzIGEgdXNlciB0eXBlcyBpbiBuZXcKLSAqIGNoYXJhY3RlcnMsIG9yIERPTSBub2RlcyBhcmUgaW5zZXJ0ZWQgb3IgZGVsZXRlZC4gTm90ZTogaXQgaXMgbm90IGEgdGhyZWFkCi0gKiBzYWZlIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQgPSBudWxsOwotCWZpbmFsIHByaXZhdGUgU3RyaW5nIGRvdWJsZVF1b3RlID0gbmV3IFN0cmluZyhuZXcgY2hhcltdeydcIid9KTsKLQlwcm90ZWN0ZWQgZmluYWwgQ29yZU5vZGVMaXN0IEVNUFRZX0xJU1QgPSBuZXcgQ29yZU5vZGVMaXN0KCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmQ2hhbmdlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZEZWxldGVkVGV4dDsKLQotCXByaXZhdGUgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGhEaWZmZXJlbmNlOwotCXByb3RlY3RlZCBpbnQgZkxlbmd0aFRvUmVwbGFjZTsKLQlwcm90ZWN0ZWQgT2JqZWN0IGZSZXF1ZXN0ZXI7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnQ7Ci0JLy8gbm90ZTogdGhpcyBpcyB0aGUgaW1wbCBjbGFzcyBvZiBJU3RydWN0dXJlZERvY3VtZW50LCBub3QgdGhlIGludGVyZmFjZQotCS8vIEZVVFVSRV9UT19ETzogSSBiZWxpZXZlIHNvbWUgb2YgdGhlc2UgY2FuIGJlIG1hZGUgcHJpdmF0ZSBub3cuPwotCXByb3RlY3RlZCBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50OwotCi0JLyoqCi0JICogdmFyaWFibGUgdXNlZCBpbiBhbnRpY2lhcGF0aW9uIG9mIG11bHRpdGhyZWFkaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJzaW5nOwotCWZpbmFsIHByaXZhdGUgU3RyaW5nIHNpbmdsZVF1b3RlID0gbmV3IFN0cmluZyhuZXcgY2hhcltdeydcJyd9KTsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgX2NoZWNrQmxvY2tOb2RlTGlzdChMaXN0IGJsb2NrVGFnTGlzdCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoYmxvY2tUYWdMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tUYWdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5CbG9ja01hcmtlciBibG9ja1RhZyA9IChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrTWFya2VyKSBibG9ja1RhZ0xpc3QuZ2V0KGkpOwotCQkJCVN0cmluZyB0YWdOYW1lID0gYmxvY2tUYWcuZ2V0VGFnTmFtZSgpOwotCQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxOYW1lKCI8IiArIHRhZ05hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQlicmVhazsKLQkJCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsTmFtZSgiPC8iICsgdGFnTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tbW9uIHV0aWxpdHkgZm9yIGNoZWNraW5nIGZvciBjcml0aWNhbCB3b3JkIHN1Y2ggYXMgIiA8U0NSSVBUPiIKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IF9jaGVja0ZvckNyaXRpY2FsV29yZChTdHJpbmcgY3JpdGljYWxUYXJnZXQsIGJvb2xlYW4gY2hlY2tFbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGRvY3VtZW50TGVuZ3RoID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJaW50IHByb3BMZW4gPSBmTGVuZ3RoVG9SZXBsYWNlOwotCQlpZiAocHJvcExlbiA+IGRvY3VtZW50TGVuZ3RoKQotCQkJcHJvcExlbiA9IGRvY3VtZW50TGVuZ3RoOwotCQlpbnQgc3RhcnROZWlnaGJvcmhvb2QgPSBmU3RhcnQgLSBjcml0aWNhbFRhcmdldC5sZW5ndGgoKTsKLQkJaW50IGFkanVzdEluc2VydCA9IDA7Ci0JCWlmIChzdGFydE5laWdoYm9yaG9vZCA8IDApIHsKLQkJCWFkanVzdEluc2VydCA9IDAgLSBzdGFydE5laWdoYm9yaG9vZDsKLQkJCXN0YXJ0TmVpZ2hib3Job29kID0gMDsKLQkJfQotCQlpbnQgZW5kTmVpZ2hib3Job29kID0gZlN0YXJ0ICsgZkxlbmd0aFRvUmVwbGFjZSArIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpIC0gMTsKLQkJaWYgKGVuZE5laWdoYm9yaG9vZCA+IGRvY3VtZW50TGVuZ3RoKQotCQkJZW5kTmVpZ2hib3Job29kID0gZG9jdW1lbnRMZW5ndGggLSAxOwotCQlpbnQgb2xkbGVuID0gZW5kTmVpZ2hib3Job29kIC0gc3RhcnROZWlnaGJvcmhvb2Q7IC8vICsgMTsKLQkJaWYgKG9sZGxlbiArIHN0YXJ0TmVpZ2hib3Job29kID4gZG9jdW1lbnRMZW5ndGgpIHsKLQkJCW9sZGxlbiA9IGRvY3VtZW50TGVuZ3RoIC0gc3RhcnROZWlnaGJvcmhvb2Q7Ci0JCX0KLQkJU3RyaW5nIG9sZFRleHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChzdGFydE5laWdoYm9yaG9vZCwgb2xkbGVuKTsKLQkJU3RyaW5nIHBlZWsgPSBTdHJpbmdVdGlscy5wYXN0ZShvbGRUZXh0LCBmQ2hhbmdlcywgY3JpdGljYWxUYXJnZXQubGVuZ3RoKCkgLSBhZGp1c3RJbnNlcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQlib29sZWFuIGlzQ3JpdGljYWxTdHJpbmcgPSBjaGVja1RhZ05hbWVzKG9sZFRleHQsIGNyaXRpY2FsVGFyZ2V0LCBjaGVja0VuZCk7Ci0JCWJvb2xlYW4gdG9CZUNyaXRpY2FsU3RyaW5nID0gY2hlY2tUYWdOYW1lcyhwZWVrLCBjcml0aWNhbFRhcmdldCwgY2hlY2tFbmQpOwotCQlpZiAoKGlzQ3JpdGljYWxTdHJpbmcgIT0gdG9CZUNyaXRpY2FsU3RyaW5nKSB8fCAvLyBPUiBpZiBib3RoIGFyZQotCQkJCQkvLyBjcml0aWNhbCBhbmQgdGhlcmUncwotCQkJCQkvLyBhIGNoYW5nZSBpbiB0aGUgZW5kCi0JCQkJCS8vIHRhZyAoJz4nKQotCQkJCQkoKGlzQ3JpdGljYWxTdHJpbmcgJiYgdG9CZUNyaXRpY2FsU3RyaW5nKSAmJiAoY2hhbmdlSW5Jc0VuZGVkU3RhdGUob2xkVGV4dCwgcGVlaykpKSkgewotCQkJLy8gaWYgaXQgaW52b2x2ZXMgYSBjaGFuZ2Ugb2YgYSBjcml0aWNhbCBzdHJpbmcgKG1ha2luZyBvbmUgd2hlcmUKLQkJCS8vIHRoZXJlIHdhc24ndCwgb3IgcmVtb3ZpbmcKLQkJCS8vIG9uZSB3aGVyZSB0aGVyZSB3YXMgb25lKSB0aGVuIHJlcGFyc2UgZXZlcnRoaW5nLgotCQkJcmVzdWx0ID0gcmVwYXJzZSgwLCBkb2N1bWVudExlbmd0aCAtIDEpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMoQ29yZU5vZGVMaXN0IG9sZE5vZGVzLCBDb3JlTm9kZUxpc3QgbmV3Tm9kZXMpIHsKLQkJaW50IHN0YXJ0T2ZEaWZmZXJlbmNlcyA9IC0xOwotCQlpbnQgbmV3Tm9kZXNMZW5ndGggPSBuZXdOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJYm9vbGVhbiBmb3VuZERpZmZlcmVuY2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCS8vIHdlJ2xsIGNvbnRyb2wgb3VyIGxvb3AgYmFzZWQgb24gdGhlIG9sZCBMaXN0IGxlbmd0aAotCQlpbnQgb2xkTm9kZXNMZW5ndGggPSBvbGROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJLy8gYmUgc3VyZSB0byBjaGVjayAnZG9uZScgZmlyc3QsIHNvIHN0YXJ0T2ZEaWZmZXJlbmNlcyBpc24ndAotCQkvLyBpY3JlbWVudGVkIGlmIGRvbmUgaXMgdHJ1ZQotCQlkb25lIDogd2hpbGUgKCghZG9uZSkgJiYgKCsrc3RhcnRPZkRpZmZlcmVuY2VzIDwgb2xkTm9kZXNMZW5ndGgpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUgPSBvbGROb2Rlcy5pdGVtKHN0YXJ0T2ZEaWZmZXJlbmNlcyk7Ci0JCQkvLyB0aGlzIGxlc3NUaGFuRWZmZWN0ZWRSZWdpb24gaXMgdG8gY2hlY2sgdG8gYmUgc3VyZSB0aGUgbm9kZSBpcwotCQkJLy8gaW5mYWN0IGEgY2FuZGlkYXRlCi0JCQkvLyB0byBiZSBjb25zaWRlcmVkIGFzICJvbGQiLiBUaGlzIGNoZWNrIGlzIGltcG9ydGFudCBmb3IgdGhlIGNhc2UKLQkJCS8vIHdoZXJlIHNvbWUKLQkJCS8vIHRleHQgaXMgcmVwbGFjZWluZyB0ZXh0IHRoYXQKLQkJCS8vIGFwcGVhcnMgaWRlbnRpY2FsLCBidXQgaXMgYSBkaWZmZXJlbnQgaW5zdGFuY2UuIEZvciBleGFtcGxlLCBpZgotCQkJLy8gdGhlIHRleHQKLQkJCS8vIGlzIDxQPjxCPjwvQj48L1A+IGFuZCA8Qj48L0I+IGlzIGluc2VydGVkIGF0IHBvc3Rpb24gMywKLQkJCS8vIHJlc3VsdGluZyBpbiA8UD48Qj48L0I+PEI+PC9CPjwvUD4KLQkJCS8vIHdlIGRvIG5vdCB3YW50IHRoZQotCQkJLy8gZmlyc3QgPEI+IHRvIGJlIGNvbnNpZGVyZWQgb2xkIC4uLiBpdCBpcyB0aGUgbmV3IG9uZSwgdGhlCi0JCQkvLyBzZWNvbmQKLQkJCS8vIDxCPiBpcyB0aGUgb2xkIG9uZS4KLQkJCWlmIChfbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbihvbGROb2RlKSkgewotCQkJCS8vIGJlIHN1cmUgdG8gY2hlY2sgdGhhdCB3ZSBoYXZlIG5ldyBub2RlcyB0byBjb21wYXJlIGFnYWluc3QuCi0JCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IG5ld05vZGVzTGVuZ3RoKSB7Ci0JCQkJCWZvdW5kRGlmZmVyZW5jZSA9IGZhbHNlOwotCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJY29udGludWUgZG9uZTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGUgPSBuZXdOb2Rlcy5pdGVtKHN0YXJ0T2ZEaWZmZXJlbmNlcyk7Ci0JCQkJCS8vIG5vdGU6IHNoaWZ0IGlzIDAgd2hpbGUgYXQgYmVnaW5uaW5nIG9mIGxpc3QsIGJlZm9yZSB0aGUKLQkJCQkJLy8gaW5zZXJ0aW9uIChvciBkZWxldGlvbikgcG9pbnQuIEFmdGVyIHRoYXQsIGl0IGlzCi0JCQkJCS8vIGZTdGFydCtmTGVuZ3RoRGlmZmVyZW5jZQotCQkJCQlpZiAoIShvbGROb2RlLnNhbWVBcyhuZXdOb2RlLCAwKSkpIHsKLQkJCQkJCWZvdW5kRGlmZmVyZW5jZSA9IHRydWU7Ci0JCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQkJCX0gZWxzZSB7IC8vIGlmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIHdlIHdpbGwgYmUga2VlcGluZyB0aGUKLQkJCQkJCS8vIG9sZCBvbmUsIHNvCi0JCQkJCQkvLyB3ZSBuZWVkIHRvIGJlIHN1cmUgaXRzIHBhcmVudERvY3VtZW50IGlzIHNldCBiYWNrCi0JCQkJCQkvLyB0bwotCQkJCQkJLy8gdGhlIHJpZ2h0IGluc3RhbmNlCi0JCQkJCQlvbGROb2RlLnNldFBhcmVudERvY3VtZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyB3ZSBkaWRuJ3QgbGl0ZXJhbGx5IGZpbmQgYSBkaWZmZXJlbmNlLCBidXQgd2UgY291bnQgaXQgYXMKLQkJCQkvLyBzdWNoIGJ5IGltcGxpY2F0aW9uCi0JCQkJZm91bmREaWZmZXJlbmNlID0gdHJ1ZTsKLQkJCQlkb25lID0gdHJ1ZTsKLQkJCQljb250aW51ZSBkb25lOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGxpdGVyYWxseSBmb3VuZCBhIGRpZmZlcmVuY2UsIHRoZW4gYWxsIGlzIG9rIGFuZCB3ZSBjYW4KLQkJLy8gcmV0dXJuCi0JCS8vIGl0LgotCQkvLyBpZiB3ZSBkaWQgbm90IGxpdGVyYWxseSBmaW5kIG9uZSwgdGhlbiB3ZSBoYXZlIHRvIGRlY2lkZSB3aHkuCi0JCWlmICghZm91bmREaWZmZXJlbmNlKSB7Ci0JCQlpZiAobmV3Tm9kZXNMZW5ndGggPT0gb2xkTm9kZXNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cyBhcmUKLQkJCQkvLyBpZGVudGljYWwKLQkJCQkvLyAoYW5kIG1heSBiZSBvZiB6ZXJvCi0JCQkJLy8gbGVuZ3RoKQotCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IC0xOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobmV3Tm9kZXNMZW5ndGggPiBvbGROb2Rlc0xlbmd0aCkgeyAvLyB0aGVuIGxpc3RzIGFyZQotCQkJCQkvLyBpZGVudGljYWwgZXhjZXB0IGZvcgotCQkJCQkvLyBuZXdOb2RlcyBhZGRlZAotCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBvbGROb2Rlc0xlbmd0aDsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobmV3Tm9kZXNMZW5ndGggPCBvbGROb2Rlc0xlbmd0aCkgeyAvLyB0aGVuIGxpc3RzIGFyZQotCQkJCQkJLy8gaWRlbnRpY2FsIGV4Y2VwdAotCQkJCQkJLy8gZm9yIG9sZCBOb2RlcwotCQkJCQkJLy8gZGVsZXRlZAotCQkJCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gbmV3Tm9kZXNMZW5ndGg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXJ0T2ZEaWZmZXJlbmNlczsKLQl9Ci0KLQlwcml2YXRlIGludCBfY29tcHV0ZVN0YXJ0T2ZEaWZmZXJlbmNlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGVQYXJhbSwgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZVBhcmFtLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucykgewotCQlpbnQgc3RhcnRPZkRpZmZlcmVuY2VzID0gLTE7Ci0JCWludCBuZXdSZWdpb25zTGVuZ3RoID0gbmV3UmVnaW9ucy5zaXplKCk7Ci0JCWJvb2xlYW4gZm91bmREaWZmZXJlbmNlID0gZmFsc2U7Ci0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkvLyB3ZSdsbCBjb250cm9sIG91ciBsb29wIGJhc2VkIG9uIHRoZSBvbGQgTGlzdCBsZW5ndGgKLQkJaW50IG9sZFJlZ2lvbnNMZW5ndGggPSBvbGRSZWdpb25zLnNpemUoKTsKLQkJLy8gYmUgc3VyZSB0byBjaGVjayAnZG9uZScgZmlyc3QsIHNvIHN0YXJ0T2ZEaWZmZXJlbmNlcyBpc24ndAotCQkvLyBpY3JlbWVudGVkIGlmIGRvbmUgaXMgdHJ1ZQotCQlkb25lIDogd2hpbGUgKCghZG9uZSkgJiYgKCsrc3RhcnRPZkRpZmZlcmVuY2VzIDwgb2xkUmVnaW9uc0xlbmd0aCkpIHsKLQkJCUlUZXh0UmVnaW9uIG9sZFJlZ2lvbiA9IG9sZFJlZ2lvbnMuZ2V0KHN0YXJ0T2ZEaWZmZXJlbmNlcyk7Ci0JCQkvLyB0aGlzIGxlc3NUaGFuRWZmZWN0ZWRSZWdpb24gaXMgdG8gY2hlY2sgdG8gYmUgc3VyZSB0aGUgbm9kZSBpcwotCQkJLy8gaW5mYWN0IGEgY2FuZGlkYXRlCi0JCQkvLyB0byBiZSBjb25zaWRlcmVkIGFzICJvbGQiLiBUaGlzIGNoZWNrIGlzIGltcG9ydGFudCBmb3IgdGhlIGNhc2UKLQkJCS8vIHdoZXJlIHNvbWUKLQkJCS8vIHRleHQgaXMgcmVwbGFjZWluZyB0ZXh0IHRoYXQKLQkJCS8vIGFwcGVhcnMgaWRlbnRpY2FsLCBidXQgaXMgYSBkaWZmZXJlbnQgaW5zdGFuY2UuIEZvciBleGFtcGxlLCBpZgotCQkJLy8gdGhlIHRleHQKLQkJCS8vIGlzIDxQPjxCPjwvQj48L1A+IGFuZCA8Qj48L0I+IGlzIGluc2VydGVkIGF0IHBvc3Rpb24gMywKLQkJCS8vIHJlc3VsdGluZyBpbiA8UD48Qj48L0I+PEI+PC9CPjwvUD4KLQkJCS8vIHdlIGRvIG5vdCB3YW50IHRoZQotCQkJLy8gZmlyc3QgPEI+IHRvIGJlIGNvbnNpZGVyZWQgb2xkIC4uLiBpdCBpcyB0aGUgbmV3IG9uZSwgdGhlCi0JCQkvLyBzZWNvbmQKLQkJCS8vIDxCPiBpcyB0aGUgb2xkIG9uZS4KLQkJCWlmIChfbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbihvbGROb2RlUGFyYW0sIG9sZFJlZ2lvbikpIHsKLQkJCQkvLyBiZSBzdXJlIHRvIGNoZWNrIHRoYXQgd2UgaGF2ZSBuZXcgbm9kZXMgdG8gY29tcGFyZSBhZ2FpbnN0LgotCQkJCWlmIChzdGFydE9mRGlmZmVyZW5jZXMgPiBuZXdSZWdpb25zTGVuZ3RoKSB7Ci0JCQkJCWZvdW5kRGlmZmVyZW5jZSA9IGZhbHNlOwotCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJY29udGludWUgZG9uZTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLwotCQkJCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBuZXdSZWdpb25zLmdldChzdGFydE9mRGlmZmVyZW5jZXMpOwotCQkJCQkvLyBub3RlOiBzaGlmdCBpcyAwIHdoaWxlIGF0IGJlZ2lubmluZyBvZiBsaXN0LCBiZWZvcmUgdGhlCi0JCQkJCS8vIGluc2VydGlvbiAob3IgZGVsZXRpb24pIHBvaW50LiBBZnRlciB0aGF0LCBpdCBpcwotCQkJCQkvLyBmU3RhcnQrZkxlbmd0aERpZmZlcmVuY2UKLQkJCQkJaWYgKCEob2xkTm9kZVBhcmFtLnNhbWVBcyhvbGRSZWdpb24sIG5ld05vZGVQYXJhbSwgbmV3UmVnaW9uLCAwKSkpIHsKLQkJCQkJCWZvdW5kRGlmZmVyZW5jZSA9IHRydWU7Ci0JCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBpZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiB3ZSB3aWxsIGJlIGtlZXBpbmcgdGhlIG9sZAotCQkJCQkJLy8gb25lLgotCQkJCQkJLy8gdW5saWtlIHRoZSBmbGF0bm9kZSBjYXNlLCB0aGVyZSBpcyBubyByZWFzb24gdG8KLQkJCQkJCS8vIHVwZGF0ZQotCQkJCQkJLy8gdGhlIHRleHRzdG9yZSwgc2luY2UgaXRzIHRoZSBzYW1lIHRleHQgc3RvcmUgaW4KLQkJCQkJCS8vIGVpdGhlciBjYXNlCi0JCQkJCQkvLyAoc2luY2UgaXRzIHRoZSBzYW1lIGZsYXRub2RlKQotCQkJCQkJLy9vbGRSZWdpb24uc2V0VGV4dFN0b3JlKGZTdHJ1Y3R1cmVkRG9jdW1lbnQucGFyZW50RG9jdW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyB3ZSBkaWRuJ3QgbGl0ZXJhbGx5IGZpbmQgYSBkaWZmZXJlbmNlLCBidXQgd2UgY291bnQgaXQgYXMKLQkJCQkvLyBzdWNoIGJ5IGltcGxpY2F0aW9uCi0JCQkJZm91bmREaWZmZXJlbmNlID0gdHJ1ZTsKLQkJCQlkb25lID0gdHJ1ZTsKLQkJCQljb250aW51ZSBkb25lOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGxpdGVyYWxseSBmb3VuZCBhIGRpZmZlcmVuY2UsIHRoZW4gYWxsIGlzIG9rIGFuZCB3ZSBjYW4KLQkJLy8gcmV0dXJuCi0JCS8vIGl0LgotCQkvLyBpZiB3ZSBkaWQgbm90IGxpdGVyYWxseSBmaW5kIG9uZSwgdGhlbiB3ZSBoYXZlIHRvIGRlY2lkZSB3aHkuCi0JCWlmICghZm91bmREaWZmZXJlbmNlKSB7Ci0JCQlpZiAobmV3UmVnaW9uc0xlbmd0aCA9PSBvbGRSZWdpb25zTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJLy8gaWRlbnRpY2FsIChhbmQgbWF5Ci0JCQkJLy8gYmUgb2YgemVybyBsZW5ndGgpCi0JCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gLTE7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChuZXdSZWdpb25zTGVuZ3RoID4gb2xkUmVnaW9uc0xlbmd0aCkgeyAvLyB0aGVuIGxpc3RzIGFyZQotCQkJCQkvLyBpZGVudGljYWwgZXhjZXB0Ci0JCQkJCS8vIGZvciBuZXdSZWdpb25zCi0JCQkJCS8vIGFkZGVkCi0JCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG9sZFJlZ2lvbnNMZW5ndGg7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG5ld1JlZ2lvbnNMZW5ndGggPCBvbGRSZWdpb25zTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMKLQkJCQkJCS8vIGFyZSBpZGVudGljYWwKLQkJCQkJCS8vIGV4Y2VwdCBmb3IKLQkJCQkJCS8vIG9sZCBOb2RlcwotCQkJCQkJLy8gZGVsZXRlZAotCQkJCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gbmV3UmVnaW9uc0xlbmd0aDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhcnRPZkRpZmZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIFBhcnQgMSBvZiAyIHN0ZXBzIHRvIGRvIGEgY29yZV9yZXBhcnNlCi0JICogCi0JICogUGFyc2VzIGEgcG9ydGlvbiBvZiB0aGUgY3VycmVudCB0ZXh0IGluIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IGFuZAotCSAqIHJldHVybnMgdGhlIHJhdyByZXN1bHQKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gX2NvcmVfcmVwYXJzZV90ZXh0KGludCByZXNjYW5TdGFydCwgaW50IHJlc2NhbkVuZCkgewotCQlmU3RydWN0dXJlZERvY3VtZW50LnJlc2V0UGFyc2VyKHJlc2NhblN0YXJ0LCByZXNjYW5FbmQpOwotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKS5nZXREb2N1bWVudFJlZ2lvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJ0IDIgb2YgMiBzdGVwcyB0byBkbyBhIGNvcmVfcmVwYXJzZQotCSAqIAotCSAqIEludGVncmF0ZXMgYSBsaXN0IG9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgYmFzZWQgb24gdGhlIGN1cnJlbnQKLQkgKiB0ZXh0IGNvbnRlbnRzIG9mIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IGludG8gdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiBkYXRhIHN0cnVjdHVyZQotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgX2NvcmVfcmVwYXJzZV91cGRhdGVfbW9kZWwoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2Rlc0hlYWQsIGludCByZXNjYW5TdGFydCwgaW50IHJlc2NhbkVuZCwgQ29yZU5vZGVMaXN0IG9sZE5vZGVzLCBib29sZWFuIGZpcnN0VGltZSkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlDb3JlTm9kZUxpc3QgbmV3Tm9kZXMgPSBudWxsOwotCQkvLyByZXNjYW4KLQkJbmV3Tm9kZXMgPSBuZXcgQ29yZU5vZGVMaXN0KG5ld05vZGVzSGVhZCk7Ci0JCS8vIGFkanVzdCBvdXIgbmV3Tm9kZSBjaGFpbiBzbyB0aGUgb2Zmc2V0IHBvc2l0aW9ucyBtYXRjaAotCQkvLyBvdXIgdGV4dCBzdG9yZSAobm90IHRoZSBzaW1wbGUgc3RyaW5nIG9mIHRleHQgcmVwYXJzZWQpCi0JCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmFkanVzdFN0YXJ0KG5ld05vZGVzSGVhZCwgcmVzY2FuU3RhcnQpOwotCQkvLyBpbml0aWFsaXplIHRoZSBwYXJlbnREb2N1bWVudCB2YXJpYWJsZSBvZiBlYWNoIGluc3RhbmNlIGluIHRoZSBuZXcKLQkJLy8gY2hhaW4KLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0UGFyZW50RG9jdW1lbnQobmV3Tm9kZXNIZWFkLCBmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlZERvY3VtZW50IHZhcmlhYmxlIG9mIGVhY2ggaW5zdGFuY2UgaW4gdGhlCi0JCS8vIG5ldyBjaGFpbgotCQkvL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLnNldFN0cnVjdHVyZWREb2N1bWVudChuZXdOb2Rlc0hlYWQsCi0JCS8vIGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLwotCQlpZiAoZmlyc3RUaW1lKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKG5ld05vZGVzSGVhZCk7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LmluaXRpYWxpemVGaXJzdEFuZExhc3REb2N1bWVudFJlZ2lvbigpOwotCQkJLy8gbm90ZTogc2luY2Ugd2UgYXJlIGluc2VydGluZyBub2RlcywgZm9yIHRoZSBmaXJzdCB0aW1lLCB0aGVyZQotCQkJLy8gaXMKLQkJCS8vIG5vIGFkanVzdG1lbnRzCi0JCQkvLyB0byBkb3duc3RyZWFtIHN0dWZmIG5lY2Vzc2FyeS4KLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBvbGROb2RlcywgbmV3Tm9kZXMsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQl9IGVsc2UgewotCQkJLy8gbm90ZTogaW50ZWdyYXRlcyBjaGFuZ2VzIGludG8gbW9kZWwgYXMgYSBzaWRlIGVmZmVjdAotCQkJcmVzdWx0ID0gbWluaW11bUV2ZW50KG9sZE5vZGVzLCBuZXdOb2Rlcyk7Ci0JCX0KLQkJcmVzdWx0LnNldERlbGV0ZWRUZXh0KGZEZWxldGVkVGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb3JlTm9kZUxpc3QgX2Zvcm1NaW5pbXVtTGlzdChDb3JlTm9kZUxpc3QgZmxhdG5vZGVzLCBpbnQgc3RhcnRPZkRpZmZlcmVuY2VzLCBpbnQgZW5kT2ZEaWZmZXJlbmNlcykgewotCQlDb3JlTm9kZUxpc3QgbWluaW1hbE5vZGVzID0gbnVsbDsKLQkJLy8gaWYgc3RhcnRPZkRpZmZlcmNlcyBpcyBzdGlsbCBpdHMgaW5pdGlhbCB2YWx1ZSwgdGhlbiB3ZSBoYXZlIGFuCi0JCS8vIGVtcHR5IGRvY3VtZW50Ci0JCWlmIChzdGFydE9mRGlmZmVyZW5jZXMgPT0gLTEpIHsKLQkJCW1pbmltYWxOb2RlcyA9IEVNUFRZX0xJU1Q7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhbnkgZmxhdG5vZGUgaW4gb3VyIGZsYXRub2RlIGxpc3QsIHRoZW4KLQkJCS8vIHNpbXBseQotCQkJLy8gcmV0dXJuIG91ciBzdGFuZGFyZCBlbXB0eSBsaXN0Ci0JCQlpZiAoZmxhdG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCQltaW5pbWFsTm9kZXMgPSBFTVBUWV9MSVNUOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBpZiBzdGFydE9mRGlmZmVyZW5jZXMgaXMgZ3JlYXRlciB0aGFuIGVuZE9mRGlmZmVyZW5jZXMsCi0JCQkJLy8gdGhlbgotCQkJCS8vIHRoYXQgbWVhbnMgdGhlIGNhbGN1bGF0aW9ucyAiY3Jvc3NlZCIgZWFjaCBvdGhlciwgYW5kCi0JCQkJLy8gaGVuY2UsCi0JCQkJLy8gdGhlcmUgcmVhbGx5IGlzIG5vIGRpZmZlcmVuY2VzLCBzbywgYWdhaW4sIHJldHVybiB0aGUgZW1wdHkKLQkJCQkvLyBsaXN0Ci0JCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IGVuZE9mRGlmZmVyZW5jZXMpIHsKLQkJCQkJbWluaW1hbE5vZGVzID0gRU1QVFlfTElTVDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB0aGUgbGFzdCBjaGVjayBiZSBzdXJlIHdlIGhhdmUgc29tZSBkaWZmZXJuY2VzCi0JCQkJCWlmICgoZW5kT2ZEaWZmZXJlbmNlcyA+IC0xKSkgewotCQkJCQkJbWluaW1hbE5vZGVzID0gbmV3IENvcmVOb2RlTGlzdChmbGF0bm9kZXMuaXRlbShzdGFydE9mRGlmZmVyZW5jZXMpLCBmbGF0bm9kZXMuaXRlbShlbmRPZkRpZmZlcmVuY2VzKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyB0aGVyZSB3ZXJlIG5vIGRpZmZlcmVuY2VzLCB0aGUgbGlzdCB3YXNuJ3QKLQkJCQkJCS8vIG1pbmltaXplZCwgc28gc2ltcGx5IHJldHVybiBpdC4KLQkJCQkJCW1pbmltYWxOb2RlcyA9IGZsYXRub2RlczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWluaW1hbE5vZGVzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVTdGFydCA9IG9sZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGNoYW5nZWRSZWdpb25FbmQgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMTsKLQkJcmVzdWx0ID0gbm9kZVN0YXJ0ID4gY2hhbmdlZFJlZ2lvbkVuZDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2dyZWF0ZXJUaGFuRWZmZWN0ZWRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbiBvbGRSZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IHJlZ2lvblN0YXJ0T2Zmc2V0ID0gb2xkTm9kZS5nZXRTdGFydE9mZnNldChvbGRSZWdpb24pOwotCQlpbnQgZWZmZWN0ZWRSZWdpb25FbmQgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMTsKLQkJcmVzdWx0ID0gcmVnaW9uU3RhcnRPZmZzZXQgPiBlZmZlY3RlZFJlZ2lvbkVuZDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2xlc3NUaGFuRWZmZWN0ZWRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBub2RlRW5kID0gb2xkTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDE7Ci0JCXJlc3VsdCA9IG5vZGVFbmQgPCBmU3RhcnQ7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIF9sZXNzVGhhbkVmZmVjdGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSwgSVRleHRSZWdpb24gb2xkUmVnaW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBub2RlRW5kID0gb2xkTm9kZS5nZXRFbmRPZmZzZXQob2xkUmVnaW9uKSAtIDE7Ci0JCXJlc3VsdCA9IG5vZGVFbmQgPCBmU3RhcnQ7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIF9yZWdpb25zU2FtZUtpbmQoSVRleHRSZWdpb24gbmV3UmVnaW9uLCBJVGV4dFJlZ2lvbiBvbGRSZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgb25lIHJlZ2lvbiBpcyBhIGNvbnRhaW5lciByZWdpb24sIGFuZCB0aGUgb3RoZXIgbm90LCBhbHdheXMKLQkJLy8gcmV0dXJuIGZhbHNlCi0JCS8vIGVsc2UsIGp1c3QgY2hlY2sgdGhlaXIgdHlwZS4KLQkJLy8gICAgICBEVyBkcnVpbmcgcmVmYWN0b3JpbmcsIGxvb2tzIGxpa2UgYSAidHlwbyIgaGVyZSwgdXNpbmcgJ29sZCcgaW4KLQkJLy8gYm90aC4KLQkJLy8JCWlmIChpc0NvbnRhaW5lclJlZ2lvbihvbGRSZWdpb24pICE9IGlzQ29udGFpbmVyUmVnaW9uKG9sZFJlZ2lvbikpCi0JCWlmIChpc0NvbGxlY3Rpb25SZWdpb24ob2xkUmVnaW9uKSAhPSBpc0NvbGxlY3Rpb25SZWdpb24obmV3UmVnaW9uKSkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChvbGRSZWdpb24uZ2V0VHlwZSgpID09IG5ld1JlZ2lvbi5nZXRUeXBlKCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vCXByaXZhdGUgYm9vbGVhbiBoYXNDb2xsZWN0aW9uUmVnaW9ucyhJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JLy8JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JLy8JCWlmIChhUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JLy8JCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uQ29udGFpbnRlciA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pCi0JLy8gYVJlZ2lvbjsKLQkvLwkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gcmVnaW9uQ29udGFpbnRlci5nZXRSZWdpb25zKCk7Ci0JLy8JCQlJdGVyYXRvciBpdGVyYXRvciA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkvLwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkvLwkJCQlpZiAoYVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCS8vCQkJCQlyZXN1bHQgPSB0cnVlOwotCS8vCQkJCQlicmVhazsKLQkvLwkJCQl9Ci0JLy8JCQl9Ci0JLy8JCX0KLQkvLwkJcmV0dXJuIHJlc3VsdDsKLQkvLwl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgc3BlY2lmaWNhbGx5IHRvIGRldGVjdCBjaGFuZ2VzIGluICdpc0VuZGVkJyBzdGF0ZSwKLQkgKiBhbHRob3VnaCBpdCBzdGlsbCBkb2VzIHNvIHdpdGggaGV1cmlzdGljcy4gSWYgbnVtYmVyIG9mICc+JyBjaGFuZ2VzLAotCSAqIGFzc3VtZSB0aGUgaXNFbmRlZCBzdGF0ZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdlSW5Jc0VuZGVkU3RhdGUoU3RyaW5nIG9sZFRleHQsIFN0cmluZyBuZXdUZXh0KSB7Ci0JCWludCBuT2xkID0gU3RyaW5nVXRpbHMub2NjdXJyZW5jZXNPZihvbGRUZXh0LCAnPicpOwotCQlpbnQgbk5ldyA9IFN0cmluZ1V0aWxzLm9jY3VycmVuY2VzT2YobmV3VGV4dCwgJz4nKTsKLQkJcmV0dXJuICEobk9sZCA9PSBuTmV3KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tBbmRBc3NpZ25QYXJlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChvbGROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gdGV4dFJlZ2lvbkNvbGxlY3Rpb24gPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb247Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IHRleHRSZWdpb25Db2xsZWN0aW9uLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9uTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIGlubmVyUmVnaW9uID0gcmVnaW9uTGlzdC5nZXQoaSk7Ci0JCQkJY2hlY2tBbmRBc3NpZ25QYXJlbnQob2xkTm9kZSwgaW5uZXJSZWdpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBjaGFuZ2UgdG8gYSBDREFUQSB0YWcgY2FuIHJlc3VsdCBpbiBhbGwgYmVpbmcgcmVwYXJzZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNEQVRBKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8IVtDREFUQVsiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCJdXT4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIGEgY29tbWVudCBzdGFydCBvciBlbmQgdGFnIGlzIGJlaW5nIGFkZGVkIG9yIGRlbGV0ZWQsIHdlJ2xsIHJlc2NhbgotCSAqIHRoZSB3aG9sZSBkb2N1bWVudC4gVGhlIHJlYXNvbiBpcyB0aGF0IGNvbnRlbnQgdGhhdCBpcyByZXZlYWxlZCBvcgotCSAqIGNvbW1lbnRlZCBvdXQgY2FuIGVmZmVjdCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHJlc3Qgb2YgdGhlCi0JICogZG9jdW1lbnQuIE5vdGU6IGZvciBub3cgdGhpcyBpcyB2ZXJ5IFhNTCBzcGVjaWZpYywgY2FuIHJlZmFjdG9yL2ltcHJvdmUKLQkgKiBsYXRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDb21tZW50cygpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiPCEtLSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIi0tPiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHdlJ2xsIGFsc28gY2hlY2sgZm9yIHRoZXNlIGRlZ2VuZXJhdGUgY2FzZXMKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiPCEtLS0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gdXRpbGl0eSBmb3IgY2hlY2tpbmcgZm9yIGNyaXRpY2FsIHdvcmQgc3VjaCBhcyAiIDxTQ1JJUFQ+IgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyaXRpY2FsS2V5KFN0cmluZyBjcml0aWNhbFRhcmdldCkgewotCQlyZXR1cm4gX2NoZWNrRm9yQ3JpdGljYWxXb3JkKGNyaXRpY2FsVGFyZ2V0LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29tbW9uIHV0aWxpdHkgZm9yIGNoZWNraW5nIGZvciBjcml0aWNhbCB3b3JkIHN1Y2ggYXMgIiA8U0NSSVBUPiIKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3JpdGljYWxOYW1lKFN0cmluZyBjcml0aWNhbFRhcmdldCkgewotCQlyZXR1cm4gX2NoZWNrRm9yQ3JpdGljYWxXb3JkKGNyaXRpY2FsVGFyZ2V0LCB0cnVlKTsKLQl9Ci0KLQkvLwkvKioKLQkvLwkgKiBDdXJyZW50bHkgdGhpcyBtZXRob2QgaXMgcHJldHR5IHNwZWNpZmljIHRvID9NTAotCS8vCSAqIEBkZXByZWNhdGVkIC0gbm90IHJlYWxseSBkZXByZWNhdGVkLCBidXQgcGxhbiB0byBtYWtlCi0JLy8JICogcHJvdGVjdGVkIC4uLiBJJ20gbm90IHN1cmUgd2h5IGl0cyBwdWJsaWMgb3IgbWlzc3BlbGxlZD8KLQkvLwkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJvdW5kcnlDYXNlcygpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gQ2FzZSAxOiBTZWUgaWYgdGhlIGxhbmd1YWdlJ3Mgc3ludGF4IHJlcXVpcmVzIHRoYXQgbXVsdGlwbGUKLQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBiZSByZXNjYW5uZWQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uU3ludGF4KCk7Ci0JCX0KLQkJLy8gQ2FzZSAyOiAiYmxvY2sgdGFncyIgd2hvc2UgY29udGVudCBpcyBsZWZ0IHVucGFyc2VkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJT2JqZWN0IHBhcnNlciA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCk7Ci0JCQlpZiAocGFyc2VyIGluc3RhbmNlb2YgQmxvY2tUYWdQYXJzZXIpIHsKLQkJCQlMaXN0IGJsb2NrVGFncyA9ICgoQmxvY2tUYWdQYXJzZXIpIHBhcnNlcikuZ2V0QmxvY2tNYXJrZXJzKCk7Ci0JCQkJcmVzdWx0ID0gX2NoZWNrQmxvY2tOb2RlTGlzdChibG9ja1RhZ3MpOwotCQkJfQotCQl9Ci0JCS8vIEZVVFVSRV9UT19ETzogaXMgdGhlcmUgYSBiZXR0ZXIgcGxhY2UgdG8gZG8gdGhpcz8KLQkJLy8gb3IhIGRvIHdlIGFscmVhZHkgZG8gaXQgc29tZSBvdGhlciBtb3JlIGNlbnRyYWwgcGxhY2U/Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmVzdWx0LnNldERlbGV0ZWRUZXh0KGZEZWxldGVkVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyBhIHJlcGFyc2VyIHRvIGNoZWNrIGZvciBleHRyYSBzeW50YWN0aWMgY2FzZXMgdGhhdCByZXF1aXJlCi0JICogcGFyc2luZyBiZXlvbmQgdGhlIGZsYXROb2RlIGJvdW5kYXJ5LgotCSAqIAotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBYTUwtY2VudHJpYy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0OwotCQkvLyBDYXNlIDE6IFF1b3RlIGNoYXJhY3RlcnMgYXJlIGludm9sdmVkCi0JCXJlc3VsdCA9IGNoZWNrRm9yUXVvdGVzKCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gQ2FzZSAyOiBUaGUgaW5wdXQgZm9ybXMgb3IgdW5kb2VzIGEgY29tbWVudCBiZWdpbm5pbmcgb3IKLQkJCS8vIGNvbW1lbnQKLQkJCS8vIGVuZAotCQkJcmVzdWx0ID0gY2hlY2tGb3JDb21tZW50cygpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gQ2FzZSAzOiBUaGUgaW5wdXQgZm9ybXMgb3IgdW5kb2VzIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotCQkJcmVzdWx0ID0gY2hlY2tGb3JQSSgpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gQ2FzZSA0OiBUaGUgaW5wdXQgZm9ybXMgb3IgdW5kb2VzIGEgQ0RBVEEgc2VjdGlvbgotCQkJcmVzdWx0ID0gY2hlY2tGb3JDREFUQSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBjaGFuZ2UgcmVxdWVzdCBleGFjdGx5IG1hdGNoZXMgdGhlIHRleHQgaXQgd291bGQgYmUKLQkgKiByZXBsYWNpbmcuIChJbiBmdXR1cmUsIHRoaXMsIG9yIHNpbWlsYXIgbWV0aG9kIGlzIHdoZXJlIHRvIGNoZWNrIGZvcgotCSAqICJyZWFkIG9ubHkiIGF0dGVtcHRlZCBjaGFuZ2UuKQotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JOb0NoYW5nZSgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gZG9uJ3QgY2hlY2sgZXF1YWxzIHVubGVzcyBsZW5ndGhzIG1hdGNoCi0JCS8vIHNob3VsZCBiZSBhIHRpbnkgYml0IGZhc3Rlciwgc2luY2UgdXN1YWxseSBub3QKLQkJLy8gb2YgZXF1YWwgbGVuZ3RocyAoSSdtIHN1cnByaXNlZCBTdHJpbmcncyBlcXVhbHMgbWV0aG9kCi0JCS8vIGRvZXNuJ3QgZG8gdGhpcy4pCi0JCWlmICgoZkNoYW5nZXMgIT0gbnVsbCkgJiYgKGZEZWxldGVkVGV4dCAhPSBudWxsKSAmJiAoZkNoYW5nZXMubGVuZ3RoKCkgPT0gZkRlbGV0ZWRUZXh0Lmxlbmd0aCgpKSAmJiAoZkNoYW5nZXMuZXF1YWxzKGZEZWxldGVkVGV4dCkpKSB7Ci0JCQlyZXN1bHQgPSBuZXcgTm9DaGFuZ2VFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEEgY2hhbmdlIHRvIGEgUEkgdGFnIGNhbiByZXN1bHQgaW4gYWxsIGJlaW5nIHJlcGFyc2VkLgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JQSSgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiPD8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI/PiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gIEZvciBzaW1wbGljaXR5LCBpZiBlaXRoZXIgdGV4dCB0byBiZSBkZWxldGVkLCBvciB0ZXh0IHRvIGJlIGluc2VydGVkCi0JLy8gY29udGFpbnMgYXQgbGVhc3QKLQkvLyAgb25lIHF1b3RlLCB3ZSdsbCBzZWFyY2ggZm9yIHByZXZpb3VzIHF1b3RlIGluIGRvY3VtZW50LCBpZiBhbnksIGFuZCB1c2UKLQkvLyB0aGF0IGZsYXRub2RlIGFzCi0JLy8gIGEgZGlydHkgc3RhcnQsIGFuZCB3ZSdsbCB1c2UgZW5kIG9mIGRvY3VtZW50IGFzIGRpcnR5IGVuZC4gV2UgbmVlZCB0bwotCS8vIGFzc3VtZSBlaXRoZXIgXCIgb3IKLQkvLyAgXCcgaXMgYW4gZXhjZXB0YWJsZSBxdW90ZS4gKE5PVEU6IHRoaXMgaXMsIGxvb3NlbHksIGFuIFhNTCBhc3N1bXB0aW9uCi0JLy8gLS0KLQkvLyBvdGhlciBsYW5ndWFnZXMKLQkvLyAgd291bGQgZGlmZmVyLCBidXQgd2UnbGwgImhhcmQgY29kZSIgZm9yIFhNTCBmb3Igbm93LgotCS8vIGZ1dHVyZV9UT0RPOiB0aGlzIGlzIGEgcmVhbGx5IGJhZCBoZXVyaXN0aWMgLi4uIHdlIHNob3VsZCBiZSBsb29raW5nCi0JLy8gZm9yCi0JLy8gb2RkIG51bWJlciBvZiBxdW90ZXMKLQkvLyB3aXRoaW4gYSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gKG9yIHNvbWV0aGluZyEpIFRoaXMgY2F1c2VzIHdheSB0b28KLQkvLyBtdWNoIHJlcGFyc2luZyBvbgotCS8vIHNpbXBsZSBjYXNlcywgbGlrZSBkZWxldGluZyBhIHRhZyB3aXRoIGEgcXVvdGVkIGF0dHJpYnV0ZSEKLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yUXVvdGVzKCkgewotCQkvLyByb3V0aW5lIGlzIHN1cHBvcnRlZCB3aXRoIG51bGwgb3IgZW1wdHkgc3RyaW5nIG1lYW5pbmcgdGhlIHNhbWUKLQkJLy8gdGhpbmc6IGRlbGV0aW9uCi0JCWlmIChmQ2hhbmdlcyA9PSBudWxsKQotCQkJZkNoYW5nZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLwotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJaW50IGRpcnR5U3RhcnRQb3MgPSAtMTsKLQkJCVN0cmluZyBwcm9wb3NlZERlbGV0aW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCWlmIChmU3RhcnQgPCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJaWYgKChmQ2hhbmdlcy5pbmRleE9mKHNpbmdsZVF1b3RlKSA+IC0xKSB8fCAocHJvcG9zZWREZWxldGlvbi5pbmRleE9mKHNpbmdsZVF1b3RlKSA+IC0xKSkgewotCQkJCQlJUmVnaW9uIHNpbmdsZVF1b3RlUmVnaW9uID0gZ2V0RmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoKS5maW5kKGZTdGFydCwgc2luZ2xlUXVvdGUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJaWYgKHNpbmdsZVF1b3RlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWRpcnR5U3RhcnRQb3MgPSBzaW5nbGVRdW90ZVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoKGZDaGFuZ2VzLmluZGV4T2YoZG91YmxlUXVvdGUpID4gLTEpIHx8IChwcm9wb3NlZERlbGV0aW9uLmluZGV4T2YoZG91YmxlUXVvdGUpID4gLTEpKSB7Ci0JCQkJCUlSZWdpb24gZG91YmxlUXVvdGVSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoZlN0YXJ0LCBkb3VibGVRdW90ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCQlpZiAoZG91YmxlUXVvdGVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJZGlydHlTdGFydFBvcyA9IGRvdWJsZVF1b3RlUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRpcnR5U3RhcnRQb3MgPiAtMSkgewotCQkJCS8vIHRoZW4gd2UgZm91bmQgb25lLCBkbyBjcmVhdGUgbmV3IHN0cnVjdHVyZWREb2N1bWVudCBldmVudAotCQkJCS8vIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBxdW90ZSB0byBlbmQgb2YgZG9jdW1lbnQKLQkJCQkvLyBleGNlcHQsIHdlIG5lZWQgdG8gYmUgcG9zaXRpdmUgdGhhdCB0aGUgcHJldmlvdXMgcXVvdGUgaXMKLQkJCQkvLyBpbiBhICJzYWZlIHN0YXJ0IiByZWdpb24gKGUuZy4gaWYgaW4gSlNQIGNvbnRlbnQsIHdlIG5lZWQKLQkJCQkvLyB0bwotCQkJCS8vIGJhY2t1cCB0aWxsIHdlIGluY2x1ZGUgdGhlIHdob2xlIEpTUCByZWdpb24sIGluIG9yZGVyIGZvcgotCQkJCS8vIGl0Ci0JCQkJLy8gdG8gYmUgY29ycmVjdGx5IHJlLXBhcnNlZC4gVGhlIGJhY2tpbmcgdXAgaXMgZG9uZSBpbiB0aGUKLQkJCQkvLyByZXBhcnNlL2ZpbmQgZGlydHkgc3RhcnQgZnJvbSBoaW50Ci0JCQkJLy8gbWV0aG9kLgotCQkJCXJlc3VsdCA9IHJlcGFyc2UoZGlydHlTdGFydFBvcywgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmVzdWx0LnNldERlbGV0ZWRUZXh0KGZEZWxldGVkVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrSGV1cmlzdGljcygpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gY2hlY2tGb3JOb0NoYW5nZSgpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Cb3VuZHJ5Q2FzZXMoKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHF1aWNrQ2hlY2soKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRha2VzIGludG8gYWNjb3VudCAidGFnIG5hbWUiIHJ1bGVzIGZvciBjb21wYXJpc29uczsgY2FzZS1pbnNlbnNpdGl2ZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tUYWdOYW1lcyhTdHJpbmcgY29tcGFyZVRleHQsIFN0cmluZyBjcml0aWNhbFRhcmdldCwgYm9vbGVhbiBjaGVja0VuZCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoKGNvbXBhcmVUZXh0ID09IG51bGwpIHx8IChjcml0aWNhbFRhcmdldCA9PSBudWxsKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHBvc09mQ3JpdGljYWxXb3JkID0gY29tcGFyZVRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKGNyaXRpY2FsVGFyZ2V0LnRvTG93ZXJDYXNlKCkpOwotCQlyZXN1bHQgPSBwb3NPZkNyaXRpY2FsV29yZCA+IC0xOwotCQlpZiAoY2hlY2tFbmQgJiYgcmVzdWx0KSB7Ci0JCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0cnVlIHJpZ2h0IGF3YXksIHdlJ2xsIG9ubHkgcmV0dXJuIHRydWUKLQkJCS8vIHRoZQotCQkJLy8gcG90ZW50aWFsbHkgbWF0Y2hlZCB0YWcgaXMgaW5kZWVkIGEgdGFnLCBmb3IgZXhhbXBsZSwgaWYKLQkJCS8vIDxTQ1JJUFQKLQkJCS8vIGJlY29tZXMgPFNDUklQVFMgd2UgZG9uJ3Qgd2FudCB0byBzYXkgdGhlIGxhdHRlciBpcyBhIGNyaXRpY2FsCi0JCQkvLyB0YWcKLQkJCWludCBsYXN0UG9zID0gcG9zT2ZDcml0aWNhbFdvcmQgKyBjcml0aWNhbFRhcmdldC5sZW5ndGgoKTsKLQkJCWlmIChsYXN0UG9zIDwgY29tcGFyZVRleHQubGVuZ3RoKCkpIHsKLQkJCQljaGFyIGxhc3RDaGFyID0gY29tcGFyZVRleHQuY2hhckF0KGxhc3RQb3MpOwotCQkJCS8vIEZ1dHVyZTogY2hlY2sgZm9ybWFsIGRlZmluaXRpb24gb2YgdGhpcyBqYXZhIG1ldGhvZCwgdnMuCi0JCQkJLy8gWE1MCi0JCQkJLy8gcGFyc2luZyBydWxlcwotCQkJCXJlc3VsdCA9ICghQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChsYXN0Q2hhcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvcmUgcmVwYXJzaW5nIG1ldGhvZCAuLi4gYWZ0ZXIgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eSBlbmQgaGF2ZQotCSAqIGJlZW4gY2FsY3VsYXRlZCBlbHNld2hlcmUsIGFuZCB0aGUgdGV4dCB1cGRhdGVkLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjb3JlX3JlcGFyc2UoaW50IHJlc2NhblN0YXJ0LCBpbnQgcmVzY2FuRW5kLCBDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIGJvb2xlYW4gZmlyc3RUaW1lKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZXNIZWFkID0gbnVsbDsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJbmV3Tm9kZXNIZWFkID0gX2NvcmVfcmVwYXJzZV90ZXh0KHJlc2NhblN0YXJ0LCByZXNjYW5FbmQpOwotCQlyZXN1bHQgPSBfY29yZV9yZXBhcnNlX3VwZGF0ZV9tb2RlbChuZXdOb2Rlc0hlYWQsIHJlc2NhblN0YXJ0LCByZXNjYW5FbmQsIG9sZE5vZGVzLCBmaXJzdFRpbWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyBzdGF0ZSB0byAibm90IHBhcnNpbmciCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBlbmRSZVBhcnNlKCkgewotCQlpc1BhcnNpbmcgPSBmYWxzZTsKLQkJZGlydHlTdGFydCA9IG51bGw7Ci0JCWRpcnR5RW5kID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kRGlydHlFbmQoaW50IGVuZCkgewotCQkvLyBDYXV0aW9uOiBoZXJlJ3Mgb25lIHBsYWNlIHdlIGhhdmUgdG8gY2FzdAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kKTsKLQkJLy8gaWYgbm90IHdlbGwgZm9ybWVkLCBnZXQgb25lIHBhc3QsIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGVyZQotCQlpZiAoKHJlc3VsdCAhPSBudWxsKSAmJiAoIXJlc3VsdC5pc0VuZGVkKCkpKSB7Ci0JCQlpZiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJCX0KLQkJfQotCQkvLyBhbHNvLCBnZXQgb25lIHBhc3QgaWYgZXhhY3RseSBlcXVhbCB0byB0aGUgZW5kICh0aGlzIHdhcyBuZWVkZWQKLQkJLy8gYXMgYSBzaW1wbGUgZml4IHRvIHdoZW4gYSB3aG9sZSBleGFjdCByZWdpb24gaXMgZGVsZXRlZC4KLQkJLy8gdGhlcmUncyBwcm9iYWJseSBhIGJldHRlciB3YXkuCi0JCWlmICgocmVzdWx0ICE9IG51bGwpICYmIChlbmQgPT0gcmVzdWx0LmdldEVuZCgpKSkgewotCQkJaWYgKHJlc3VsdC5nZXROZXh0KCkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJLy8gbW92ZWQgdG8gc3ViY2xhc3MgZm9yIHF1aWNrIHRyYW5zaXRpb24KLQkJLy8gMTIvNi8yMDAxIC0gU2luY2Ugd2UndmUgY2hhbmdlZCB0aGUgcGFyc2VyL3NjYW5uZXIgdG8gYWxsb3cgYSBsb25lCi0JCS8vICc8JyB3aXRob3V0Ci0JCS8vIGFsd2F5cyBpbnRlcnByZXR0aW5nIGl0IGFzIHN0YXJ0IG9mIGEgdGFnIG5hbWUsIHdlIG5lZWQgdG8gYmUgYQotCQkvLyBsaXR0bGUgZmFuY2llciwgaW4gb3JkZXIKLQkJLy8gdG8gInNraXAiIG92ZXIgYW55IHBsYWluICdvbCBjb250ZW50IGJldHdlZW4gdGhlIGxvbmUgJzwnIGFuZCBhbnkKLQkJLy8gcG90ZW50aWFsIG1lYXRpbmcKLQkJLy8gcmVnaW9ucyBwYXN0IHBsYWluICdvbCBjb250ZW50LgotCQkvLwkJaWYgKGlzTG9uZU9wZW5Gb2xsb3dlZEJ5Q29udGVudChyZXN1bHQpICYmIChyZXN1bHQuZ2V0TmV4dCgpICE9Ci0JCS8vIG51bGwpKSB7Ci0JCS8vCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJLy8JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihyZXN1bHQpOwotCQlkaXJ0eUVuZCA9IHJlc3VsdDsKLQkJcmV0dXJuIGRpcnR5RW5kOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmREaXJ0eVN0YXJ0KGludCBzdGFydCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQkvLyBoZXVyaXN0aWM6IGlmIHRoZSBwb3N0aW9uIGlzIGV4YWN0bHkgZXF1YWwgdG8gdGhlIHN0YXJ0LCB0aGVuCi0JCS8vIGdvIGJhY2sgb25lIG1vcmUsIGlmIGl0IGV4aXN0cy4gVGhpcyBwcmV2ZW50cyBwcm9ibGVtcyB3aXRoCi0JCS8vIGluc2VydGlvbnMKLQkJLy8gb2YgdGV4dCB0aGF0IHNob3VsZCBiZSBtZXJnZWQgd2l0aCB0aGUgcHJldmlvdXMgbm9kZSBpbnN0ZWFkIG9mCi0JCS8vIHNpbXBseSBodW5nCi0JCS8vIG9mZiBvZiBpdCBhcyBhIHNlcGFyYXRlIG5vZGUgKGV4LjogWE1MIGNvbnRlbnQgaW5zZXJ0ZWQgcmlnaHQKLQkJLy8gYmVmb3JlCi0JCS8vIGFuIG9wZW4KLQkJLy8gYnJhY2tldCBzaG91bGQgYmVjb21lIHBhcnQgb2YgdGhlIHByZXZpb3VzIGNvbnRlbnQgbm9kZSkKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gcmVzdWx0LmdldFByZXZpb3VzKCk7Ci0JCQlpZiAoKHByZXZpb3VzICE9IG51bGwpICYmICgoIShwcmV2aW91cy5pc0VuZGVkKCkpKSB8fCAoc3RhcnQgPT0gcmVzdWx0LmdldFN0YXJ0KCkpKSkgewotCQkJCXJlc3VsdCA9IHByZXZpb3VzOwotCQkJfQotCQkJLy8gSWYgd2UgYXJlIG5vdyBhdCB0aGUgZW5kIG9mIGEgInRhZyBkZXBlbmRlbnQiIGNvbnRlbnQgYXJlYSAob3IKLQkJCS8vIEpTUCBhcmVhKQotCQkJLy8gdGhlbiB3ZSBuZWVkIHRvIGJhY2sgdXAgYWxsIHRoZSB3YXkgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGF0LgotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwb3RlbnRpYWwgPSByZXN1bHQ7Ci0JCQkvLyBtb3ZlZCB0byBzdWJjbGFzcyB0byBzcGVlZCB0cmFuc2l0aW9uCi0JCQkvLwkJCXdoaWxlIChpc1BhcnRPZkJsb2NrUmVnaW9uKHBvdGVudGlhbCkpIHsKLQkJCS8vCQkJCXBvdGVudGlhbCA9IHBvdGVudGlhbC5nZXRQcmV2aW91cygpOwotCQkJLy8JCQl9Ci0JCQlpZiAocG90ZW50aWFsICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBwb3RlbnRpYWw7Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihyZXN1bHQpOwotCQkJfQotCQl9Ci0JCWRpcnR5U3RhcnQgPSByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvcmVOb2RlTGlzdCBmb3JtT2xkTm9kZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eVN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5RW5kKSB7Ci0JCUNvcmVOb2RlTGlzdCBvbGROb2RlcyA9IG5ldyBDb3JlTm9kZUxpc3QoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCQkvLyBOb3cgc2F2ZSB0aGUgb2xkIHRleHQsIHRoYXQgImdvZXMgd2l0aCIgdGhlIG9sZCBub2RlcyBhbmQgcmVnaW9ucy4KLQkJLy8gTm90aWNlIHdlIGFyZSBnZXR0aW5nIGl0IGRpcmVjdGx5IGZyb20gdGhlIHRleHQgc3RvcmUKLQkJU3RyaW5nIG9sZFRleHQgPSBudWxsOwotCQlpbnQgb2xkU3RhcnQgPSAtMTsKLQkJaW50IG9sZEVuZCA9IC0xOwotCQkvLyBtYWtlIHN1cmUgdGhlcmUgaXMgc29tZSB0ZXh0LCBpZiBub3QsIHVzZSBlbXB0eSBzdHJpbmcKLQkJLy8gKGlmIG9uZSBub2RlIGlzIG5vdCBudWxsLCB0aGUgb3RoZXIgc2hvdWxkIEFMV0FZUyBiZSBub3QgbnVsbCB0b28sCi0JCS8vIHNpbmNlIGl0Ci0JCS8vIHdvdWxkIGF0IGxlYXN0IGJlIGVxdWFsIHRvIGl0LikKLQkJaWYgKGRpcnR5U3RhcnQgIT0gbnVsbCkgewotCQkJb2xkU3RhcnQgPSBkaXJ0eVN0YXJ0LmdldFN0YXJ0KCk7Ci0JCQlvbGRFbmQgPSBkaXJ0eUVuZC5nZXRFbmQoKTsKLQkJCW9sZFRleHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChvbGRTdGFydCwgb2xkRW5kIC0gb2xkU3RhcnQpOwotCQl9IGVsc2UgewotCQkJb2xkU3RhcnQgPSAwOwotCQkJb2xkRW5kID0gMDsKLQkJCW9sZFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIGNyZWF0ZSBhIHRlbXBvcmFyeSB0ZXh0IHN0b3JlIGZvciB0aGlzIHRleHQKLQkJU3ViU2V0VGV4dFN0b3JlIHN1YlRleHRTdG9yZSA9IG5ldyBTdWJTZXRUZXh0U3RvcmUob2xkVGV4dCwgb2xkU3RhcnQsIG9sZEVuZCwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0JCS8vIE5vdyB1cGRhdGUgdGhlIHRleHQgc3RvcmUgb2YgdGhlIG9sZE5vZGVzCi0JCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLnNldFBhcmVudERvY3VtZW50KG9sZE5vZGVzLCBuZXcgTWluaW1hbERvY3VtZW50KHN1YlRleHRTdG9yZSkpOwotCQlyZXR1cm4gb2xkTm9kZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgZ2V0RmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoKSB7Ci0JCWlmIChmRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID0gbmV3IEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCXJldHVybiBmRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci0JfQotCi0JLy8gTm90ZTogaWYgdGhlYWQgc2FmZXR5IGlzIG5lZWRlZCwgdGhpcyBhbmQgYWxsIHRoZSBvdGhlciBwdWJsaWMgbWV0aG9kcwotCS8vIG9mIHRoaXMgY2xhc3MKLQkvLyBzaG91bGQgYmUgc3luY2hyb25pemVkLgotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlLCBTdHJpbmcgY2hhbmdlcykgewotCQlpc1BhcnNpbmcgPSB0cnVlOwotCQlmUmVxdWVzdGVyID0gcmVxdWVzdGVyOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aFRvUmVwbGFjZSA9IGxlbmd0aFRvUmVwbGFjZTsKLQkJZkNoYW5nZXMgPSBjaGFuZ2VzOwotCQkvLyBub3RpY2UgdGhpcyBvbmUgaXMgZGVyaXZlZAotCQlmTGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGZDaGFuZ2VzLCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJZkRlbGV0ZWRUZXh0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzT2xkTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0T2xkTm9kZSwgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROZXcgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROZXcgPSBudWxsOwotCQkvLwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFByZXZpb3VzID0gcHJldmlvdXNPbGROb2RlOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5leHQgPSBuZXh0T2xkTm9kZTsKLQkJLy8KLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJLy8gZ2V0IHBvaW50ZXJzCi0JCQlmaXJzdE5ldyA9IG5ld05vZGVzLml0ZW0oMCk7Ci0JCQlsYXN0TmV3ID0gbmV3Tm9kZXMuaXRlbShuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJLy8gc3dpdGNoIHN1cnJvdW5kaW5nIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMnIHJlZmVyZW5jZXMgdG8KLQkJCS8vIGxpc3RzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KGZpcnN0TmV3KTsKLQkJCWlmIChvbGROZXh0ICE9IG51bGwpIHsKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKGxhc3ROZXcpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBTSURFIEVGRkVDVAotCQkJCS8vIGlmIG9sZE5leHQgaXMgbnVsbCwgdGhhdCBtZWFucyB3ZSBhcmUgcmVwbGFjZWluZyB0aGUKLQkJCQkvLyBsYXN0Tm9kZSBpbiB0aGUgY2hhaW4sCi0JCQkJLy8gc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMgbGFzdE5vZGUgYXMKLQkJCQkvLyB0aGUKLQkJCQkvLyBsYXN0IG9mIHRoZSBuZXcgbm9kZXMuCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRMYXN0RG9jdW1lbnRSZWdpb24obmV3Tm9kZXMuaXRlbShuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDEpKTsKLQkJCX0KLQkJCWlmIChmaXJzdE5ldyAhPSBudWxsKQotCQkJCWZpcnN0TmV3LnNldFByZXZpb3VzKG9sZFByZXZpb3VzKTsKLQkJCWlmIChsYXN0TmV3ICE9IG51bGwpCi0JCQkJbGFzdE5ldy5zZXROZXh0KG9sZE5leHQpOwotCQl9Ci0JCS8vIGVsc2Ugbm90aGluZyB0byBpbnNlcnQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkUmVnaW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29sbGVjdGlvblJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXJldHVybiAoYVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzaW5nKCkgewotCQlyZXR1cm4gaXNQYXJzaW5nOwotCX0KLQotCS8qKgotCSAqIFRoZSBtaW5pbWl6YXRpb24gYWxnb3JpdGhtIHNpbXBseSBjaGVja3MgdGhlIG9sZCBub2RlcyB0byBzZWUgaWYgYW55IG9mCi0JICogdGhlbSAic3Vydml2ZWQiIHRoZSByZXNjYW4gYW5kIGFyZSB1bmNoYW5nZWQuIElmIHNvLCB0aGUgaW5zdGFuY2Ugb2YKLQkgKiB0aGUgb2xkIG5vZGUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBuZXcgbm9kZS4gQmVmb3JlIHRoZSByZXF1ZXN0ZWQKLQkgKiBjaGFuZ2UsIG5lZWQgdG8gY2hlY2sgdHlwZSwgb2Zmc2V0cywgYW5kIHRleHQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzYW1lLgotCSAqIEFmdGVyIHRoZSByZXF1ZXN0ZWQgY2hhbmdlLCBuZWVkIHRvIGNoZWNrIHR5cGUgYW5kIHRleHQsIGJ1dCBhZGp1c3QgdGhlCi0JICogb2Zmc2V0cyB0byB3aGF0IGV2ZXIgdGhlIGNoYW5nZSB3YXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IG1pbmltdW1FdmVudChDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCA9IG51bGw7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsT2xkTm9kZXMgPSBudWxsOwotCQlDb3JlTm9kZUxpc3QgbWluaW1hbE5ld05vZGVzID0gbnVsbDsKLQkJLy8gVG8gbWluaW1pemUgbm9kZXMsIHdlJ2xsIGNvbGxlY3QgYWxsIHRob3NlCi0JCS8vIHRoYXQgYXJlIG5vdCBlcXVhbCBpbnRvIG9sZCBhbmQgbmV3IGxpc3RzCi0JCS8vIE5vdGU6IHdlIGFzc3VtZSB0aGF0IG9sZCBhbmQgbmV3IG5vZGVzCi0JCS8vIGFyZSBiYXNpY2FsbHkgY29udGlndW91cyAtLSBhbmQgd2UgZm9yY2UgaXQgdG8gYmUgc28sCi0JCS8vIGJ5IHN0YXJ0aW5nIGF0IHRoZSBiZWdpbm5pbmcgdG8KLQkJLy8gZmluZCBmaXJzdCBkaWZmZXJlbmNlLCBhbmQgdGhlbiBzdGFydGluZyBhdCB0aGUgZW5kIHRvIGZpbmQKLQkJLy8gbGFzdCBkaWZmZXJlbmNlLiBFdmVyeXRoaW5nIGluIGJldHdlZW4gd2UgYXNzdW1lIGlzIGRpZmZlcmVudC4KLQkJLy8KLQkJLy8KLQkJLy8KLQkJLy8gc3RhcnRPZkRpZmZlcmVuY2VzIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBjb3JlIG5vZGUgbGlzdCB3aGVyZSB0aGUKLQkJLy8gZmlyc3QgZGlmZmVyZW5jZQotCQkvLyBvY2N1cnMuIEJ1dCBpdCBtYXkgcG9pbnQgaW50byB0aGUgb2xkIG9yIHRoZSBuZXcgbGlzdC4KLQkJaW50IHN0YXJ0T2ZEaWZmZXJlbmNlcyA9IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKG9sZE5vZGVzLCBuZXdOb2Rlcyk7Ci0JCWludCBlbmRPZkRpZmZlcmVuY2VzT2xkID0gLTE7Ci0JCWludCBlbmRPZkRpZmZlcmVuY2VzTmV3ID0gLTE7Ci0JCS8vIGlmIG9uZSBvZiB0aGUgbGlzdHMgYXJlIHNob3J0ZXIgdGhhbiB3aGVyZSB0aGUgZGlmZmVyZW5jZXMgc3RhcnQsCi0JCS8vIHRoZW4KLQkJLy8gdGhlbiBzb21lIHBvcnRpb24gb2YgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwKLQkJaWYgKChzdGFydE9mRGlmZmVyZW5jZXMgPj0gb2xkTm9kZXMuZ2V0TGVuZ3RoKCkpIHx8IChzdGFydE9mRGlmZmVyZW5jZXMgPj0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlpZiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPCBuZXdOb2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJCS8vIFRoZW4gdGhlcmUgYXJlIG5ldyByZWdpb25zIHRvIGFkZAotCQkJCS8vICAgICB0aGVzZSBsZW5ndGhzIHdpbGwgY2F1c2UgdGhlIHZlY3RvciBvZiBvbGQgb25lcyB0byBub3QKLQkJCQkvLyAgICAgaGF2ZSBhbnkgZWxlbWVudHMsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldyByZWdpb25zIHRvIGhhdmUKLQkJCQkvLyAgICAganVzdCB0aGUgbmV3IG9uZXMgbm90IGluIGNvbW1vbiB3aXRoIHRoZSBvbGQgb25lcwotCQkJCS8vc3RhcnRPZkRpZmZlcmVuY2VzIHNob3VsZCBlcXVhbCBvbGROb2Rlcy5nZXRMZW5ndGgoKSwKLQkJCQkvLyBjYWxjdWxhdGVkIGFib3ZlIG9uIF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzCi0JCQkJbWluaW1hbE9sZE5vZGVzID0gRU1QVFlfTElTVDsKLQkJCQllbmRPZkRpZmZlcmVuY2VzTmV3ID0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxOwotCQkJCW1pbmltYWxOZXdOb2RlcyA9IF9mb3JtTWluaW11bUxpc3QobmV3Tm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc05ldyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IG5ld05vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJCS8vIGRlbGV0ZSBvbGQKLQkJCQkJLy8gdGhlbiB0aGVyZSBhcmUgb2xkIHJlZ2lvbnMgdG8gZGVsZXRlCi0JCQkJCS8vICAgIHRoZXNlIGxlbmd0aHMgd2lsbCBjYXVzZSB0aGUgdmVjdG9yIG9mIG9sZCByZWdpb25zIHRvCi0JCQkJCS8vICAgIGNvbnRhaW4gdGhlIG9uZXMgdG8gZGVsZXRlLCBhbmQgdGhlIHZlY3RvciBvZiBuZXcKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQkvLyAgICBub3QgaGF2ZSBhbnkgZWxlbWVudHMKLQkJCQkJLy9zdGFydE9mRGlmZmVyZW5jZXMgc2hvdWxkIGVxdWFsIG5ld05vZGVzLmdldExlbmd0aCgpLAotCQkJCQkvLyBjYWxjdWxhdGVkIGFib3ZlIG9uIF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzCi0JCQkJCWVuZE9mRGlmZmVyZW5jZXNPbGQgPSBvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQkJCW1pbmltYWxPbGROb2RlcyA9IF9mb3JtTWluaW11bUxpc3Qob2xkTm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc09sZCk7Ci0JCQkJCW1pbmltYWxOZXdOb2RlcyA9IEVNUFRZX0xJU1Q7Ci0JCQkJfSBlbHNlCi0JCQkJCS8vIHVubGlrZWx5IGV2ZW50Ci0JCQkJCWV2ZW50ID0gbmV3IE5vQ2hhbmdlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3RlciwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBXZSBmb3VuZCBhIG5vcm1hbCBzdGFydE9mRGlmZmVybmNlcywgYnV0IGhhdmUgbm90IHlldCBmb3VuZCB0aGUKLQkJCS8vIGVuZHMuCi0JCQkvLyBXZSdsbCBsb29rIGZvciB0aGUgZW5kIG9mIGRpZmZlcmVuY2VzIGJ5IGdvaW5nIGJhY2t3YXJkcyBkb3duCi0JCQkvLyB0aGUgdHdvIGxpc3RzLgotCQkJLy8gSGVyZSB3ZSBuZWVkIGEgc2VwZXJhdGUgaW5kZXggZm9yIGVhY2ggYXJyYXksIHNpbmNlIHRoZXkgbWF5IGJlCi0JCQkvLyAoYW5kCi0JCQkvLyBwcm9iYWJseSBhcmUpIG9mIGRpZmZlcmVudCBsZW5ndGhzLgotCQkJaW50IGluZGV4T2xkID0gb2xkTm9kZXMuZ2V0TGVuZ3RoKCkgLSAxOwotCQkJaW50IGluZGV4TmV3ID0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxOwotCQkJLy8gVGhlIGdyZWF0ZXJUaGFuRWZmZWN0ZWRSZWdpb24gaXMgaW1wb3J0YW50IHRvIGdhdXJkIGFnYWluc3QKLQkJCS8vIGluY29ycmVjdCBjb3VudGluZwotCQkJLy8gd2hlbiBzb21ldGhpbmcgaWRlbnRpY2FsIGlzIGluc2VydGVkIHRvIHdoYXQncyBhbHJlYWR5IHRoZXJlCi0JCQkvLyAoc2VlIG1pbmltaXphdGlvbiB0ZXN0IGNhc2UgNSkKLQkJCS8vIE5vdGU6IHRoZSBpbmRleE9sZCA+IHN0YXJ0T2ZEaWZmZXJlbmNlcyBrZWVwcyBpbmRleE9sZCBmcm9tCi0JCQkvLyBnZXR0aW5nIHRvbyBzbWFsbCwKLQkJCS8vIHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgb2xkTm9kZXMuaXRlbShpbmRleE9sZCkgaXMgYWx3YXlzIHZhbGlkLgotCQkJd2hpbGUgKChpbmRleE9sZCA+PSBzdGFydE9mRGlmZmVyZW5jZXMpICYmIChfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihvbGROb2Rlcy5pdGVtKGluZGV4T2xkKSkpKSB7Ci0JCQkJaWYgKCEob2xkTm9kZXMuaXRlbShpbmRleE9sZCkuc2FtZUFzKG5ld05vZGVzLml0ZW0oaW5kZXhOZXcpLCBmTGVuZ3RoRGlmZmVyZW5jZSkpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGlmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIHdlIHdpbGwgYmUga2VlcGluZyB0aGUgb2xkIG9uZSwKLQkJCQkJLy8gc28KLQkJCQkJLy8gd2UgbmVlZCB0byBiZSBzdXJlIGl0cyBwYXJlbnREb2N1bWVudCBpcyBzZXQgYmFjayB0bwotCQkJCQkvLyB0aGUKLQkJCQkJLy8gcmlnaHQgaW5zdGFuY2UKLQkJCQkJb2xkTm9kZXMuaXRlbShpbmRleE9sZCkuc2V0UGFyZW50RG9jdW1lbnQoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQkJfQotCQkJCWluZGV4T2xkLS07Ci0JCQkJaW5kZXhOZXctLTsKLQkJCX0KLQkJCWVuZE9mRGlmZmVyZW5jZXNPbGQgPSBpbmRleE9sZDsKLQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBpbmRleE5ldzsKLQkJCW1pbmltYWxPbGROb2RlcyA9IF9mb3JtTWluaW11bUxpc3Qob2xkTm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc09sZCk7Ci0JCQltaW5pbWFsTmV3Tm9kZXMgPSBfZm9ybU1pbmltdW1MaXN0KG5ld05vZGVzLCBzdGFydE9mRGlmZmVyZW5jZXMsIGVuZE9mRGlmZmVyZW5jZXNOZXcpOwotCQl9IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3REb3duU3RyZWFtTm9kZSA9IG51bGw7Ci0JCWV2ZW50ID0gcmVnaW9uQ2hlY2sobWluaW1hbE9sZE5vZGVzLCBtaW5pbWFsTmV3Tm9kZXMpOwotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IG1pbmltYWxPbGROb2Rlcy5pdGVtKDApLmdldE5leHQoKTsKLQkJCWlmIChmaXJzdERvd25TdHJlYW1Ob2RlICE9IG51bGwgJiYgZkxlbmd0aERpZmZlcmVuY2UgIT0gMCkgeyAvLyBpZgotCQkJCS8vIGZpcnN0RG93blN0cmVhbQotCQkJCS8vIGlzCi0JCQkJLy8gbnVsbCwKLQkJCQkvLyB0aGVuCi0JCQkJLy8gd2UncmUKLQkJCQkvLyBhdAotCQkJCS8vIHRoZQotCQkJCS8vIGVuZAotCQkJCS8vIG9mCi0JCQkJLy8gdGhlCi0JCQkJLy8gZG9jdW1lbnQKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQl9IC8vCi0JCX0gZWxzZSB7Ci0JCQlldmVudCA9IG5vZGVzUmVwbGFjZWRDaGVjayhtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQkvLyBub3cgc3BsaWNlIHRoZSBuZXcgY2hhaW4gb2Ygbm9kZXMgdG8gd2hlcmUgdGhlIG9sZCBjaGFpbiBpcyAob3IKLQkJCS8vIHdhcykKLQkJCS8vIHRoZSBmaXJzdERvd25TdHJlYW1Ob2RlICh0aGUgZmlyc3Qgb2YgdGhvc2UgYWZ0ZXIgdGhlIG5ldwotCQkJLy8gbm9kZXMpCi0JCQkvLyBpcwotCQkJLy8gcmVtZW1iZXJlZCBhcyBhIHRpbnkgb3B0aW1pemF0aW9uLgotCQkJaWYgKG1pbmltYWxPbGROb2Rlcy5nZXRMZW5ndGgoKSA9PSAwICYmIG1pbmltYWxOZXdOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBpZiBubyBvbGQgbm9kZXMgYXJlIGJlaW5nIGRlbGV0ZWQsIHRoZW4gdXNlIHRoZQotCQkJCS8vIHRoZSBuZXdOb2RlcyBvZmZzZXQgKG1pbnVzIG9uZSkgdG8gZmluZCB0aGUgcG9pbnQgdG8KLQkJCQkvLyB1cGRhdGUgZG93bnN0cmVhbSBub2RlcywgYW5kIGFmdGVyIHVwZGF0aW5nIGRvd25zdHJlYW0KLQkJCQkvLyBub2RlcyBwb3N0aW9ucywgaW5zZXJ0IHRoZSBuZXcgb25lcy4KLQkJCQlpbnQgaW5zZXJ0T2Zmc2V0ID0gbWluaW1hbE5ld05vZGVzLml0ZW0oMCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RPbGRVbmNoYW5nZWROb2RlID0gbnVsbDsKLQkJCQlpZiAoaW5zZXJ0T2Zmc2V0ID4gMCkgewotCQkJCQlsYXN0T2xkVW5jaGFuZ2VkTm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0T2Zmc2V0IC0gMSk7Ci0JCQkJCWZpcnN0RG93blN0cmVhbU5vZGUgPSBsYXN0T2xkVW5jaGFuZ2VkTm9kZS5nZXROZXh0KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gd2UncmUgaW5zZXJ0aW5nIGF0IHZlcnkgYmVnaW5uaW5nCi0JCQkJCWZpcnN0RG93blN0cmVhbU5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCS8vIFNJREUgRUZGRUNUOiBjaGFuZ2UgdGhlIGZpcnN0Tm9kZSBwb2ludGVyIGlmIHdlJ3JlCi0JCQkJCS8vIGluc2VydGluZyBhdCBiZWdpbm5pbmcKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRGaXJzdERvY3VtZW50UmVnaW9uKG1pbmltYWxOZXdOb2Rlcy5pdGVtKDApKTsKLQkJCQl9Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuYWRqdXN0U3RhcnQoZmlyc3REb3duU3RyZWFtTm9kZSwgZkxlbmd0aERpZmZlcmVuY2UpOwotCQkJCWluc2VydE5vZGVzKGxhc3RPbGRVbmNoYW5nZWROb2RlLCBmaXJzdERvd25TdHJlYW1Ob2RlLCBtaW5pbWFsTmV3Tm9kZXMpOwotCQkJCS8vIHRoaXMgKG5vZGVzIHJlcGxhY2VkKSBpcyB0aGUgb25seSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8KLQkJCQkvLyB1cGRhdGUgdGhlIGNhY2hlZCBOb2RlCi0JCQkJcmVTZXRDYWNoZWROb2RlKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IHN3aXRjaE5vZGVMaXN0cyhtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQkJLy8gbm8gbmVlZCB0byBhZGp1c3QgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IG5vZGVzIHRoZW1zZWx2ZXMsCi0JCQkJLy8gdGhleQotCQkJCS8vIGFyZSBhbHJlYWR5IGNvcnJlY3QsIGJ1dCB3ZSBkbyBuZWVkIHRvCi0JCQkJLy8gYWRqdXN0IGFsbCAiZG93biBzdHJlYW0iIG5vZGVzIHdpdGggdGhlIGxlbmd0aCBvZiB0aGUKLQkJCQkvLyBpbnNlcnRpb24gb3IgZGVsZXRpb24KLQkJCQkvLyAtLS0gYWRqdXN0bWVudCBtb3ZlZCB0byBjYWxsaW5nIG1ldGhvZC4KLQkJCQlpZiAoZmlyc3REb3duU3RyZWFtTm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vICYmIGV2ZW50ICE9IG51bGwKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuYWRqdXN0U3RhcnQoZmlyc3REb3duU3RyZWFtTm9kZSwgZkxlbmd0aERpZmZlcmVuY2UpOwotCQkJCX0gLy8KLQkJCQkvLyB0aGlzIChub2RlcyByZXBsYWNlZCkgaXMgdGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSBuZWVkIHRvCi0JCQkJLy8gdXBkYXRlIHRoZSBjYWNoZWQgTm9kZQotCQkJCXJlU2V0Q2FjaGVkTm9kZShtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV2ZW50OwotCX0KLQotCS8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIGFic3RyYWN0LgotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBub2Rlc1JlcGxhY2VkQ2hlY2soQ29yZU5vZGVMaXN0IG9sZE5vZGVzLCBDb3JlTm9kZUxpc3QgbmV3Tm9kZXMpIHsKLQkJLy8gYWN0dWFsbHksIG5vdGhpbmcgdG8gY2hlY2sgaGVyZSwgc2luY2UgKGFuZCBhc3N1bWluZykgd2UndmUgYWxyZWFkeQotCQkvLyBtaW5pbWl6ZWQgdGhlIG51bWJlciBvZiBub2RlcywgYW5kIHJ1bGVkIG91dCBtZXJlIHJlZ2lvbiBjaGFuZ2VzCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBvbGROb2RlcywgbmV3Tm9kZXMsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEEgbWV0aG9kIHRvIGFsbG93IGFueSBoZXVyaXN0aWMgInF1aWNrIGNoZWNrcyIgdGhhdCBtaWdodCBjb3ZlciBtYW55Ci0JICogbWFueSBjYXNlcywgYmVmb3JlIGV4cGVuZGluZyB0aGUgdGltZSBvbiBhIGZ1bGwgcmVwYXJzZS4KLQkgKiAgCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHF1aWNrQ2hlY2soKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSBkaXJ0eSBzdGFydCBpcyBudWxsLCB0aGVuIHdlIGhhdmUgYW4gZW1wdHkgZG9jdW1lbnQuCi0JCS8vIGluIHdoaWNoIGNhc2Ugd2UnbGwgcmV0dXJuIG51bGwgc28gZXZlcnl0aGluZyBjYW4gYmUKLQkJLy8gcmVwYXJzZWQgImZyb20gc2NyYXRjaCIgLiBJZiBpdHMgbm90IG51bGwsIHdlJ2xsIGdpdmUgdGhlIGZsYXRub2RlCi0JCS8vIGEKLQkJLy8gY2hhbmNlCi0JCS8vIHRvIGhhbmRsZSwgYnV0IG9ubHkgaWYgdGhlcmUgaXMgb25lIGZsYXRub2RlIGludm9sdmVkLgotCQlpZiAoZGlydHlTdGFydCAhPSBudWxsICYmIGRpcnR5U3RhcnQgPT0gZGlydHlFbmQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFyZ2V0Tm9kZSA9IGRpcnR5U3RhcnQ7Ci0JCQlyZXN1bHQgPSBkaXJ0eVN0YXJ0LnVwZGF0ZU1vZGVsKGZSZXF1ZXN0ZXIsIHRhcmdldE5vZGUsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJLy8gYXQgdGhpcyBwb2ludCBvbmx5LCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdGV4dCBzdG9yZSBhbmQKLQkJCQkvLyBhbmQgZG93bnN0cmVhbSBub2Rlcy4KLQkJCQkvLyBGVVRVUkVfVE9fRE86IGNhbiB0aGlzIGRlcGVuZGVuY3kgb24gc3RydWN0dXJlZERvY3VtZW50Ci0JCQkJLy8gbWV0aG9kIGJlIGVsaW1pbmF0ZWQ/Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC51cGRhdGVEb2N1bWVudERhdGEoZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlLCBmQ2hhbmdlcyk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdERvd25TdHJlYW1Ob2RlID0gdGFyZ2V0Tm9kZS5nZXROZXh0KCk7Ci0JCQkJLy8gdGhlbiBmbGF0bm9kZSBtdXN0IGhhdmUgYmVlbiB0aGUgbGFzdCBvbmUsIHNvIG5lZWQgdG8KLQkJCQkvLyB1cGRhdGUKLQkJCQkvLyBhbnkgZG93bnN0cmVhbSBvbmVzCi0JCQkJaWYgKGZpcnN0RG93blN0cmVhbU5vZGUgIT0gbnVsbCkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmVzdWx0LnNldERlbGV0ZWRUZXh0KGZEZWxldGVkVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBvbmx5IG9uZSBub2RlIGlzIGludm9sdmVkLCBzZWVzIGhvdyBtYW55IHJlZ2lvbnMgYXJlIGNoYW5nZWQuIElmCi0JICogb25seSBvbmUsIHRoZW4gaXRzIGEgJ3JlZ2lvbkNoYW5nZWQnIGV2ZW50IC4uLiBpZiBtb3JlIHRoYW4gb25lLCBpdHMgYQotCSAqICdyZWdpb25zUmVwbGFjZWQnIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZWdpb25DaGVjayhDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnJlZ2lvbnNSZXBsYWNlZENoZWNrIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8kTk9OLU5MUy0xJAotCQkvLyROT04tTkxTLTEkCi0JCS8vIHRoZSAicmVnaW9uc1JlcGxhY2VkIiBldmVudCBjb3VsZCBvbmx5IGJlIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlCi0JCS8vIG5vZGVsaXN0cwotCQkvLyBhcmUgZWFjaCBvbmx5ICIxIiBpbiBsZW5ndGguCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBvbGRMZW5ndGggPSBvbGROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJaW50IG5ld0xlbmd0aCA9IG5ld05vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoKG9sZExlbmd0aCAhPSAxKSB8fCAobmV3TGVuZ3RoICE9IDEpKSB7Ci0JCQlyZXN1bHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlID0gb2xkTm9kZXMuaXRlbSgwKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZSA9IG5ld05vZGVzLml0ZW0oMCk7Ci0JCQlyZXN1bHQgPSByZWdpb25DaGVjayhvbGROb2RlLCBuZXdOb2RlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIG9ubHkgb25lIG5vZGUgaXMgaW52b2x2ZWQsIHNlZXMgaG93IG1hbnkgcmVnaW9ucyBhcmUgY2hhbmdlZC4gSWYKLQkgKiBvbmx5IG9uZSwgdGhlbiBpdHMgYSAncmVnaW9uQ2hhbmdlZCcgZXZlbnQgLi4uIGlmIG1vcmUgdGhhbiBvbmUsIGl0cyBhCi0JICogJ3JlZ2lvbnNSZXBsYWNlZCcgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlZ2lvbkNoZWNrKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlKSB7Ci0JCS8vCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gb2xkTm9kZS5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gbmV3Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCS8vIEFsc28gY2F1c2VzIEFycmF5U3RvcmVFeGNlcHRpb25zIHdoZW4gd2UgZW5jb3VudGVyIGEgY29udGFpbmVyCi0JCS8vICAgICAgSVRleHRSZWdpb25bXSBvbGRSZWdpb25zQXJyYXkgPSBuZXcKLQkJLy8gY29tLmlibS5zZWQucGFyc2VyLkNvbnRleHRSZWdpb25bb2xkUmVnaW9ucy5zaXplKCldOwotCQkvLyAgICAgIElUZXh0UmVnaW9uW10gbmV3UmVnaW9uc0FycmF5ID0gbmV3Ci0JCS8vIGNvbS5pYm0uc2VkLnBhcnNlci5Db250ZXh0UmVnaW9uW25ld1JlZ2lvbnMuc2l6ZSgpXTsKLQkJSVRleHRSZWdpb25bXSBvbGRSZWdpb25zQXJyYXkgPSBvbGRSZWdpb25zLnRvQXJyYXkoKTsKLQkJSVRleHRSZWdpb25bXSBuZXdSZWdpb25zQXJyYXkgPSBuZXdSZWdpb25zLnRvQXJyYXkoKTsKLQkJLy8KLQkJLy8gZm9yIHRoZSAncmVnaW9uc1JlcGxhY2VkJyBldmVudCwgd2UgZG9uJ3QgY2FyZSBpZgotCQkvLyB0aGUgcmVnaW9ucyBjaGFuZ2VkIGR1ZSB0byB0eXBlLCBvciB0ZXh0LAotCQkvLyB3ZSdsbCBqdXN0IGNvbGxlY3QgYWxsIHRob3NlIHRoYXQgYXJlIG5vdCBlcXVhbAotCQkvLyBpbnRvIHRoZSBvbGQgYW5kIG5ldyByZWdpb24gbGlzdHMuCi0JCS8vIE5vdGU6IHdlLCBvZiBjb3Vyc2UsIGFzc3VtZSB0aGF0IG9sZCBhbmQgbmV3IHJlZ2lvbnMKLQkJLy8gYXJlIGJhc2ljYWxseSBjb250aWd1b3VzIC0tIGFuZCB3ZSBmb3JjZSBpdCB0byBiZSBzbywKLQkJLy8gZXZlbiBpZiBub3QgbGl0ZXJhbGx5IHNvLCBieSBzdGFydGluZyBhdCBiZWdpbm5pbmcgdG8KLQkJLy8gZmluZCBmaXJzdCBkaWZmZXJlbmNlLCBhbmQgdGhlbiBzdGFydGluZyBhdCBlbmQgdG8gZmluZAotCQkvLyBsYXN0IGRpZmZlcmVuY2UuIEV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB3ZSBhc3N1bWUgaXMgZGlmZmVyZW50LgotCQkvLwotCQkvLyBnb2luZyB1cCBpcyBlYXN5LCB3ZSBzdGFydCBhdCB6ZXJvIGluIGVhY2gsIGFuZCBjb250aW51ZQotCQkvLyB0aWxsIHJlZ2lvbnMgYXJlIG5vdCB0aGUgc2FtZS4KLQkJaW50IHN0YXJ0T2ZEaWZmZXJlbmNlcyA9IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKG9sZE5vZGUsIG9sZFJlZ2lvbnMsIG5ld05vZGUsIG5ld1JlZ2lvbnMpOwotCQlpbnQgZW5kT2ZEaWZmZXJlbmNlc09sZCA9IC0xOwotCQlpbnQgZW5kT2ZEaWZmZXJlbmNlc05ldyA9IC0xOwotCQkvLwotCQkvLwotCQkvLyBpZiBvbmUgb2YgdGhlIGxpc3RzIGFyZSBzaG9ydGVyIHRoYW4gd2hlcmUgdGhlIGRpZmZlcmVuY2VzIHN0YXJ0LAotCQkvLyB0aGVuCi0JCS8vIHRoZW4gc29tZSBwb3J0aW9uIG9mIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsCi0JCWlmICgoc3RhcnRPZkRpZmZlcmVuY2VzID49IG9sZFJlZ2lvbnMuc2l6ZSgpKSB8fCAoc3RhcnRPZkRpZmZlcmVuY2VzID49IG5ld1JlZ2lvbnMuc2l6ZSgpKSkgewotCQkJaWYgKG9sZFJlZ2lvbnMuc2l6ZSgpIDwgbmV3UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkvLyBJTlNFUlQgQ0FTRQotCQkJCS8vIHRoZW4gdGhlcmUgYXJlIG5ldyByZWdpb25zIHRvIGFkZAotCQkJCS8vICAgICB0aGVzZSBsZW5ndGhzIHdpbGwgY2F1c2UgdGhlIHZlY3RvciBvZiBvbGQgb25lcyB0byBub3QKLQkJCQkvLyAgICAgaGF2ZSBhbnkgZWxlbWVudHMsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldyByZWdpb25zIHRvIGhhdmUKLQkJCQkvLyAgICAganVzdCB0aGUgbmV3IG9uZXMuCi0JCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aDsKLQkJCQllbmRPZkRpZmZlcmVuY2VzT2xkID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJZW5kT2ZEaWZmZXJlbmNlc05ldyA9IG5ld1JlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2xkUmVnaW9ucy5zaXplKCkgPiBuZXdSZWdpb25zLnNpemUoKSkgewotCQkJCQkvLyBERUxFVEUgQ0FTRQotCQkJCQkvLyB0aGVuIHRoZXJlIGFyZSBvbGQgcmVnaW9ucyB0byBkZWxldGUKLQkJCQkJLy8gICAgdGhlc2UgbGVuZ3RocyB3aWxsIGNhdXNlIHRoZSB2ZWN0b3Igb2Ygb2xkIHJlZ2lvbnMgdG8KLQkJCQkJLy8gICAgY29udGFpbiB0aGUgb25lcyB0byBkZWxldGUsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldwotCQkJCQkvLyByZWdpb25zCi0JCQkJCS8vICAgIG5vdCBoYXZlIGFueSBlbGVtZW50cwotCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBuZXdSZWdpb25zQXJyYXkubGVuZ3RoOwotCQkJCQllbmRPZkRpZmZlcmVuY2VzT2xkID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBuZXdSZWdpb25zQXJyYXkubGVuZ3RoIC0gMTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBlbHNlIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsIQotCQkJCQkvLyB1bmxpa2VseSBldmVudCwgcHJvYmFibHkgZXJyb3IgaW4gY3VycmVudCBkZXNpZ24sIHNpbmNlCi0JCQkJCS8vIHdlIGNoZWNrIGZvciBpZGVudGl0eSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YKLQkJCQkJLy8gcmVwYXJzaW5nLgotCQkJCQlyZXN1bHQgPSBuZXcgTm9DaGFuZ2VFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IC0xKSAmJiAoZW5kT2ZEaWZmZXJlbmNlc09sZCA8IDApICYmIChlbmRPZkRpZmZlcmVuY2VzTmV3IDwgMCkpIHsKLQkJCQkvLyBXZSBmb3VuZCBhIG5vcm1hbCBzdGFydE9mRGlmZmVybmNlcywgYnV0IGhhdmUgbm90IHlldCBmb3VuZAotCQkJCS8vIHRoZSBlbmRzLgotCQkJCS8vIFdlJ2xsIGxvb2sgZm9yIHRoZSBlbmQgb2YgZGlmZmVyZW5jZXMgYnkgZ29pbmcgYmFja3dhcmRzCi0JCQkJLy8gZG93biB0aGUgdHdvIGxpc3RzLgotCQkJCS8vIEhlcmUgd2UgbmVlZCBhIHNlcGVyYXRlIGluZGV4IGZvciBlYWNoIGFycmF5LCBzaW5jZSB0aGV5Ci0JCQkJLy8gbWF5Ci0JCQkJLy8gYmUgKGFuZAotCQkJCS8vIHByb2JhYmx5IGFyZSkgb2YgZGlmZmVyZW50IGxlbmd0aHMuCi0JCQkJaW50IGluZGV4T2xkID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJaW50IGluZGV4TmV3ID0gbmV3UmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJd2hpbGUgKChpbmRleE9sZCA+PSBzdGFydE9mRGlmZmVyZW5jZXMpICYmIChfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihvbGROb2RlLCBvbGRSZWdpb25zQXJyYXlbaW5kZXhPbGRdKSkpIHsKLQkJCQkJaWYgKCghKG9sZE5vZGUuc2FtZUFzKG9sZFJlZ2lvbnNBcnJheVtpbmRleE9sZF0sIG5ld05vZGUsIG5ld1JlZ2lvbnNBcnJheVtpbmRleE5ld10sIGZMZW5ndGhEaWZmZXJlbmNlKSkpKSB7Ci0JCQkJCQkvL2VuZE9mRGlmZmVyZW5jZXNPbGQgPSBpbmRleE9uZTsKLQkJCQkJCS8vZW5kT2ZEaWZmZXJlbmNlc05ldyA9IGluZGV4VHdvOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaW5kZXhPbGQtLTsKLQkJCQkJaW5kZXhOZXctLTsKLQkJCQl9Ci0JCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IGluZGV4T2xkOwotCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBpbmRleE5ldzsKLQkJCX0KLQkJfQotCQkvLwotCQkvLyByZXN1bHQgIT0gbnVsbCBtZWFucyB0aGUgaW1wb3NzaWJsZSBjYXNlIGFib3ZlIG9jY3VycmVkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gTm93IGZvcm0gdGhlIHR3byB2ZWN0b3JzIG9mIGRpZmZlcmVudCByZWdpb25zCi0JCQlJVGV4dFJlZ2lvbkxpc3QgaG9sZE9sZFJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgaG9sZE5ld1JlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0JCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gLTEgJiYgZW5kT2ZEaWZmZXJlbmNlc09sZCA+IC0xKSB7Ci0JCQkJZm9yIChpbnQgaSA9IHN0YXJ0T2ZEaWZmZXJlbmNlczsgaSA8PSBlbmRPZkRpZmZlcmVuY2VzT2xkOyBpKyspIHsKLQkJCQkJaG9sZE9sZFJlZ2lvbnMuYWRkKG9sZFJlZ2lvbnNBcnJheVtpXSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IC0xICYmIGVuZE9mRGlmZmVyZW5jZXNOZXcgPiAtMSkgewotCQkJCWZvciAoaW50IGkgPSBzdGFydE9mRGlmZmVyZW5jZXM7IGkgPD0gZW5kT2ZEaWZmZXJlbmNlc05ldzsgaSsrKSB7Ci0JCQkJCWhvbGROZXdSZWdpb25zLmFkZChuZXdSZWdpb25zQXJyYXlbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWlmIChob2xkT2xkUmVnaW9ucy5zaXplKCkgPT0gMCAmJiBob2xkTmV3UmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJCS8vIHRoZW4gdGhpcyBtZWFucyB0aGUgcmVnaW9ucyB3ZXJlIGlkZW50aWNhbCwgd2hpY2ggbWVhbnMKLQkJCQkvLyBzb21lb25lCi0JCQkJLy8gcGFzdGVkIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcgdGhleSBoYWQgc2VsZWN0ZWQsIG9yICEhIQotCQkJCS8vIHNvbWVvbmUgZGVsZXRlZCB0aGUgZW5kIGJyYWNrZXQgb2YgdGhlIHRhZy4gISEhPwotCQkJCXJlc3VsdCA9IG5ldyBOb0NoYW5nZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJfSBlbHNlIHsKLQkJCQkvL0lmIGJvdGggaG9sZE9sZFJlZ2lvbnMgYW5kIGhvbGROZXdSZWdpb25zIGFyZSBvZiBsZW5ndGggMSwKLQkJCQkvLyB0aGVuIGl0cwotCQkJCS8vIGEgInJlZ2lvbiBjaGFuZ2VkIiBldmVudCwgZWxzZSBhICJyZWdpb25zIHJlcGxhY2VkIiBldmVudC4KLQkJCQkvLyBzbyB3ZSB3YW50IHRoZSBuZXcgaW5zdGFuY2Ugb2YgcmVnaW9uIHRvIGJlY29tZSBwYXJ0IG9mIHRoZQotCQkJCS8vIG9sZCBpbnN0YW5jZSBvZiBvbGQgbm9kZQotCQkJCWlmICgoaG9sZE9sZFJlZ2lvbnMuc2l6ZSgpID09IDEpICYmIChob2xkTmV3UmVnaW9ucy5zaXplKCkgPT0gMSkgJiYgX3JlZ2lvbnNTYW1lS2luZCgoaG9sZE5ld1JlZ2lvbnMuZ2V0KDApKSwgKGhvbGRPbGRSZWdpb25zLmdldCgwKSkpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5ld09sZFJlZ2lvbiA9IHN3YXBOZXdGb3JPbGRSZWdpb24ob2xkTm9kZSwgaG9sZE9sZFJlZ2lvbnMuZ2V0KDApLCBuZXdOb2RlLCBob2xkTmV3UmVnaW9ucy5nZXQoMCkpOwotCQkJCQkvLyAtLSBuZWVkIHRvIHVwZGF0ZSBhbnkgZG93biBzdHJlYW0gcmVnaW9ucywgd2l0aGluIHRoaXMKLQkJCQkJLy8gJ29sZE5vZGUnCi0JCQkJCXVwZGF0ZURvd25TdHJlYW1SZWdpb25zKG9sZE5vZGUsIG5ld09sZFJlZ2lvbik7Ci0JCQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3Rlciwgb2xkTm9kZSwgbmV3T2xkUmVnaW9uLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXBsYWNlUmVnaW9ucyhvbGROb2RlLCBob2xkT2xkUmVnaW9ucywgbmV3Tm9kZSwgaG9sZE5ld1JlZ2lvbnMpOwotCQkJCQkvLyAtLSBuZWVkIHRvIHVwZGF0ZSBhbnkgZG93biBzdHJlYW0gcmVnaW9ucywgd2l0aGluIHRoaXMKLQkJCQkJLy8gJ29sZE5vZGUnCi0JCQkJCS8vIGRvbid0IG5lZWQgd2l0aCB0aGUgd2F5IHJlcGxhY2VSZWdpb25zIGlzIGltcGxlbWVudGVkLgotCQkJCQkvLyBJdCBoYW5kbGVzLgotCQkJCQkvL2lmKGhvbGROZXdSZWdpb25zLnNpemUoKSA+IDApCi0JCQkJCS8vdXBkYXRlRG93blN0cmVhbVJlZ2lvbnMob2xkTm9kZSwgKElUZXh0UmVnaW9uKQotCQkJCQkvLyBob2xkTmV3UmVnaW9ucy5sYXN0RWxlbWVudCgpKTsKLQkJCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbnNSZXBsYWNlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGUsIGhvbGRPbGRSZWdpb25zLCBob2xkTmV3UmVnaW9ucywgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQW4gZW50cnkgcG9pbnQgZm9yIHJlcGFyc2luZy4gSXQgY2FsY3VsYXRlcyB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5Ci0JICogZW5kIGZsYXRub2RlcyBiYXNlZCBvbiB0aGUgc3RhcnQgcG9pbnQgYW5kIGxlbmd0aCBvZiB0aGUgY2hhbmdlcy4KLQkgKiAgCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHdlIGRvIG5vdCBoYXZlIGEgY2FjaGVkTm9kZSwgdGhlbiB0aGUgZG9jdW1lbnQKLQkJLy8gbXVzdCBiZSBlbXB0eSwgc28gc2ltcGx5IHVzZSAnbnVsbCcgYXMgdGhlIGRpcnR5U3RhcnQgYW5kIGRpcnR5RW5kCi0JCS8vIG90aGVyd2lzZSwgZmluZCB0aGVtLgotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCWZpbmREaXJ0eVN0YXJ0KGZTdGFydCk7Ci0JCQlpbnQgZW5kID0gZlN0YXJ0ICsgZkxlbmd0aFRvUmVwbGFjZTsKLQkJCWZpbmREaXJ0eUVuZChlbmQpOwotCQl9Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50LmdldENhY2hlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tIZXVyaXN0aWNzKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZXBhcnNlKGRpcnR5U3RhcnQsIGRpcnR5RW5kKTsKLQkJfQotCQllbmRSZVBhcnNlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQW4gZW50cnkgcG9pbnQgZm9yIHJlcGFyc2luZy4gSXQgY2FsY3VsYXRlcyB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5Ci0JICogZW5kIGZsYXRub2RlcyBiYXNlZCBvbiBzdWdnZXN0ZWQgcG9zaXRpb25zIHRvIGJlZ2luIGFuZCBlbmQuIFRoaXMgaXMKLQkgKiBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHBhcnNpbmcgbXVzdCBnbyBiZXlvbmQgdGhlIGltbWVkaWF0ZSBub2RlIGFuZAotCSAqIGl0cyBkaXJlY3QgbmVpZ2hib3JzLgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShpbnQgcmVTY2FuU3RhcnRIaW50LCBpbnQgcmVTY2FuRW5kSGludCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGNhY2hlZE5vZGUsIHRoZW4gdGhlIGRvY3VtZW50Ci0JCS8vIG11c3QgYmUgZW1wdHksIHNvIHNpbXBseSB1c2UgJ251bGwnIGFzIHRoZSBkaXJ0eVN0YXJ0IGFuZCBkaXJ0eUVuZAotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCWZpbmREaXJ0eVN0YXJ0KHJlU2NhblN0YXJ0SGludCk7Ci0JCQlmaW5kRGlydHlFbmQocmVTY2FuRW5kSGludCk7Ci0JCX0KLQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JCWlzUGFyc2luZyA9IGZhbHNlOwotCQkvLyBkZWJ1ZwotCQkvL3ZlcmlmeVN0cnVjdHVyZWQocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29yZSByZXBhcnNpbmcgbWV0aG9kIC4uLiBhZnRlciB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5IGVuZCBoYXZlCi0JICogYmVlbiBjYWxjdWxhdGVkIGVsc2V3aGVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IHJlc2NhblN0YXJ0ID0gLTE7Ci0JCWludCByZXNjYW5FbmQgPSAtMTsKLQkJYm9vbGVhbiBmaXJzdFRpbWUgPSBmYWxzZTsKLQkJLy8KLQkJLy8gInNhdmUiIHRoZSBvbGROb2RlcyAodGhhdCBtYXkgYmUgcmVwbGFjZWQpIGluIGEgbGlzdAotCQlDb3JlTm9kZUxpc3Qgb2xkTm9kZXMgPSBmb3JtT2xkTm9kZXMoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCQlpZiAoZGlydHlTdGFydCA9PSBudWxsIHx8IGRpcnR5RW5kID09IG51bGwpIHsKLQkJCS8vIGRpcnR5U3RhcnQgb3IgZGlydHkgZW5kIGFyZSBudWxsLCB0aGVuIHRoYXQgbWVhbnMgd2UgZGlkbid0Ci0JCQkvLyBoYXZlCi0JCQkvLyBhCi0JCQkvLyBjYWNoZWQgbm9kZSwgd2hpY2ggbWVhbnMgd2UgaGF2ZSBhbiBlbXB0eSBkb2N1bWVudCwgc28gd2UKLQkJCS8vIGp1c3QgbmVlZCB0byByZXNjYW4gdGhlIGNoYW5nZXMKLQkJCXJlc2NhblN0YXJ0ID0gMDsKLQkJCXJlc2NhbkVuZCA9IGZDaGFuZ2VzLmxlbmd0aCgpOwotCQkJZmlyc3RUaW1lID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCS8vIHNldCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVzY2FuCi0JCQlyZXNjYW5TdGFydCA9IGRpcnR5U3RhcnQuZ2V0U3RhcnQoKTsKLQkJCS8vCi0JCQkvLyBzZXQgdGhlIGVuZCBvZiB0aGUgdGV4dCB0byByZXNjYW4KLQkJCS8vIG5vdGljZSB3ZSB1c2UgdGhlIHNhbWUgcmF0aW9uYWxlIGFzIGZvciB0aGUgcmVzY2FuU3RhcnQsCi0JCQkvLyB3aXRoIHRoZSBhZGRlZCBjYXZlYXQgdGhhdCBsZW5ndGggaGFzIHRvIGJlIGFkZGVkIHRvIGl0LAotCQkJLy8gdG8gY29tcGVuc2F0ZSBmb3IgdGhlIG5ldyB0ZXh0IHdoaWNoIGhhcyBiZWVuIGFkZGVkIG9yIGRlbGV0ZWQuCi0JCQkvLyBJZiBjaGFuZ2VzIGhhcyB6ZXJvIGxlbmd0aCwgdGhlbiAibGVuZ3RoIiB3aWxsIGJlIG5lZ2F0aXZlLAotCQkJLy8gc2luY2UKLQkJCS8vIHdlIGFyZSBkZWxldGluZyB0ZXh0LiBPdGhlcndpc2UsIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0JCQkvLyB3aGF0J3Mgc2VsZWN0ZWQgdG8gYmUgcmVwbGFjZWQgYW5kIHRoZSBsZW5ndGggb2YgdGhlIG5ldyB0ZXh0LgotCQkJcmVzY2FuRW5kID0gZGlydHlFbmQuZ2V0RW5kKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJfQotCQkvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBvbGQgc3R1ZmYgInNhdmVkIiBhd2F5LCB1cGRhdGUgdGhlIGRvY3VtZW50Ci0JCS8vIHdpdGggdGhlIGNoYW5nZXMuCi0JCS8vIEZVVFVSRV9UT19ETyAtLSBkb24ndCBmaXJlICJkb2N1bWVudCBjaGFuZ2VkIiBldmVudCB0aWxsIGxhdGVyCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQudXBkYXRlRG9jdW1lbnREYXRhKGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSwgZkNoYW5nZXMpOwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0gbm93IHRoZSByZWFsIHdvcmsKLQkJcmVzdWx0ID0gY29yZV9yZXBhcnNlKHJlc2NhblN0YXJ0LCByZXNjYW5FbmQsIG9sZE5vZGVzLCBmaXJzdFRpbWUpOwotCQkvLwotCQkvLyBldmVudCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLCBpbmNhc2UgdGhlcmUgaXMKLQkJLy8gc29tZSBvcGl0bWl6YXRpb24gdGhleSBjYW4gZG8KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zKSB7Ci0JCWludCBpbnNlcnRQb3MgPSAtMTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBvbGROb2RlLmdldFJlZ2lvbnMoKTsKLQkJLy8gbWFrZSBhIGZha2UgZmxhdG5vZGUgdG8gYmUgbmV3IHBhcmVudCBvZiBvbGRSZWdpb25zLCBzbyB0aGVpciB0ZXh0Ci0JCS8vIHdpbGwgYmUgcmlnaHQuCi0JCS8vSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBob2xkT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Ci0JCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZE5vZGUpOwotCQkvLwotCQkvLyBuZWVkIHRvIHJlc2V0IHRoZSBwYXJlbnQgb2YgdGhlIG5ldyB0by1iZS1pbnNlcnRlZCByZWdpb25zIHRvIGJlCi0JCS8vIHRoZQotCQkvLyBzYW1lIG9sZE5vZGUgdGhhdCBpcyB0aGUgb25lIGhhdmluZyBpdHMgcmVnaW9ucyBjaGFuZ2VkCi0JCS8vIERXLCA0LzE2LzIwMDMsIHJlbW92ZWQgc2luY2UgSVRleHRSZWdpb24gbm8gbG9uZ2VyIGhhcyBwYXJlbnQuCi0JCS8vIAkJSVRleHRSZWdpb25Db250YWluZXIgb2xkUGFyZW50ID0gb2xkTm9kZTsKLQkJLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3UmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkvLwkJCUFic3RyYWN0UmVnaW9uIHJlZ2lvbiA9IChBYnN0cmFjdFJlZ2lvbikgbmV3UmVnaW9ucy5lbGVtZW50QXQoaSk7Ci0JCS8vCQkJcmVnaW9uLnNldFBhcmVudChvbGRQYXJlbnQpOwotCQkvLwkJfQotCQkvLyBpZiB0aGVyZSBhcmUgbm8gb2xkIHJlZ2lvbnMsIGluc2VydCB0aGUgbmV3IHJlZ2lvbnMgYWNjb3JkaW5nIHRvCi0JCS8vIG9mZnNldAotCQlpZiAob2xkUmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJSVRleHRSZWdpb24gZmlyc3ROZXdSZWdpb24gPSBuZXdSZWdpb25zLmdldCgwKTsKLQkJCWludCBmaXJzdE9mZnNldCA9IG5ld05vZGUuZ2V0U3RhcnRPZmZzZXQoZmlyc3ROZXdSZWdpb24pOwotCQkJLy8gaWYgYXQgYmVnaW5uaW5nLCBpbnNlcnQgdGhlcmUKLQkJCWlmIChmaXJzdE9mZnNldCA9PSAwKSB7Ci0JCQkJaW5zZXJ0UG9zID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8KLQkJCQlJVGV4dFJlZ2lvbiByZWdpb25BdE9mZnNldCA9IG9sZE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZmlyc3RPZmZzZXQpOwotCQkJCWlmIChyZWdpb25BdE9mZnNldCA9PSBudWxsKQotCQkJCQlpbnNlcnRQb3MgPSByZWdpb25zLnNpemUoKTsKLQkJCQllbHNlCi0JCQkJCWluc2VydFBvcyA9IHJlZ2lvbnMuaW5kZXhPZihyZWdpb25BdE9mZnNldCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBlbHNlLCBkZWxldGUgb2xkIG9uZXMgYmVmb3JlIGluc2VydGluZyBuZXcgb25lcyBpbiB0aGVpciBwbGFjZQotCQkJSVRleHRSZWdpb24gZmlyc3RPbGRSZWdpb24gPSBvbGRSZWdpb25zLmdldCgwKTsKLQkJCWluc2VydFBvcyA9IHJlZ2lvbnMuaW5kZXhPZihmaXJzdE9sZFJlZ2lvbik7Ci0JCQlyZWdpb25zLnJlbW92ZUFsbChvbGRSZWdpb25zKTsKLQkJfQotCQlyZWdpb25zLmFkZEFsbChpbnNlcnRQb3MsIG5ld1JlZ2lvbnMpOwotCQkvLyBub3cgcmVnaW9ucyB2ZWN0b3Igb2YgZWFjaCBub2RlIHNob3VsZCBiZSBvZiBlcXVhbCBsZW5ndGgsCi0JCS8vIHNvIGdvIHRocm91Z2ggZWFjaCwgYW5kIG1ha2Ugc3VyZSB0aGUgb2xkIHJlZ2lvbnMKLQkJLy8gb2Zmc2V0cyBtYXRjaGVzIHRoZSBuZXcgcmVnaW9ucyBvZmZzZXRzCi0JCS8vICh3ZSdsbCBqdXN0IGFzc2lnbiB0aGVtIGFsbCwgYnV0IGNvdWxkIGJlIHNsaWdodGx5IG1vcmUgZWZmaWVjaWVudCkKLQkJSVRleHRSZWdpb25MaXN0IGFsbE5ld1JlZ2lvbnMgPSBuZXdOb2RlLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0T2xkaXNoUmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0TmV3UmVnaW9uID0gYWxsTmV3UmVnaW9ucy5nZXQoaSk7Ci0JCQluZXh0T2xkaXNoUmVnaW9uLmVxdWF0ZVBvc2l0aW9ucyhuZXh0TmV3UmVnaW9uKTsKLQkJCWNoZWNrQW5kQXNzaWduUGFyZW50KG9sZE5vZGUsIG5leHRPbGRpc2hSZWdpb24pOwotCQl9Ci0JCW9sZE5vZGUuc2V0TGVuZ3RoKG5ld05vZGUuZ2V0TGVuZ3RoKCkpOwotCQlvbGROb2RlLnNldEVuZGVkKG5ld05vZGUuaXNFbmRlZCgpKTsKLQkJb2xkTm9kZS5zZXRQYXJlbnREb2N1bWVudChuZXdOb2RlLmdldFBhcmVudERvY3VtZW50KCkpOwotCQkvLyByZW1vdmVkIGNvbmNlcHQgb2YgcGFydCBvZiB0aGVzZSByZWdpb25zLCBzbyBubyBsb25nZXIgbmVlZCB0byBkby4KLQkJLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkUmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkvLwkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgb2xkUmVnaW9ucy5lbGVtZW50QXQoaSk7Ci0JCS8vCQkJcmVnaW9uLnNldFBhcmVudChob2xkT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJLy8JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVTZXRDYWNoZWROb2RlKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCS8vIHVzZSB0aGUgbGFzdCBuZXdOb2RlIGFzIHRoZSBuZXcgY2FjaGVkTm9kZSBwb3N0aW9uLCB1bmxlc3MgaXRzIG51bGwKLQkJLy8gKGUuZy4gd2hlbiBub2RlcyBhcmUgZGVsZXRlZCkgaW4gd2hpY2ggY2FzZSwgYXNzaWduCi0JCS8vIGl0IHRvIGEgInNhZmUiIG5vZGUgc28gd2UgZG9uJ3QgbG9zZSByZWZlcmVuY2UgdG8gdGhlCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCEKLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJLy8gdXNlIGxhc3QgbmV3IG5vZGUgYXMgdGhlIGNhY2hlCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKG5ld05vZGVzLml0ZW0obmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiBjYWNoZWROb2RlIGlzIGFuIG9sZCBub2RlLCB0aGVuIHdlJ3JlIGluIHRyb3VibGU6Ci0JCQkvLyB3ZSBjYW4ndCBsZWF2ZSBpdCBhcyB0aGUgY2FjaGVkIG5vZGUhIGFuZCBpdHMgYWxyZWFkeQotCQkJLy8gYmVlbiBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbW9kZWwsIHNvIHdlIGNhbid0IGRvIGdldE5leHQKLQkJCS8vIG9yIGdldFByZXZpb3VzLCBzbyB3ZSdsbCBnZXQgb25lIHRoYXQgaXMgcmlnaHQgYmVmb3JlCi0JCQkvLyAob3IgcmlnaHQgYWZ0ZXIpIHRoZSBvZmZzZXQgb2YgdGhlIG9sZCBub2RlcyB0aGF0IGFyZSBiZWluZwotCQkJLy8gZGVsZXRlZC4KLQkJCS8vIAotCQkJLy8gaWYgbmV3Tm9kZXNIZWFkIGFuZCBjYWNoZWROb2RlIGFyZSBib3RoIG51bGwsIHRoZW4KLQkJCS8vIGl0IG1lYW5zIHdlIHdlcmUgYXNrZWQgdG8gaW5zZXJ0IGFuIGVtcHR5IHN0cmluZyBpbnRvCi0JCQkvLyBhbiBlbXB0eSBkb2N1bWVudC4gU28gd2UgaGF2ZSBub3RoaW5nIHRvIGRvIGhlcmUKLQkJCS8vICh0aGF0IGlzLCB3ZSBoYXZlIG5vIG5vZGUgdG8gY2FjaGUpCi0JCQkvLyBzaW1pbGFybHkgaWYgdGhlcmUgYXJlIG5vIG5ldyBub2RlcyBhbmQgbm8gb2xkIG5vZGVzIHRoZW4KLQkJCS8vIG5vdGhpbmcgdG8gZG8gKGJ1dCB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4gLi4uIHdlIHNob3VsZG4ndAotCQkJLy8gZ2V0IHRoZXJlIGlmIHRoZXJlIGlzIG5vIGV2ZW50IHRvIGdlbmVyYXRlKS4KLQkJCWlmICgoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQkJLy8gbm90ZTogd2UgY2FuJ3Qgc2ltcGxlIHVzZSBub2RlQXRDaGFyYWN0ZXJPZmZzZXQsIHNpbmNlIGl0Ci0JCQkJLy8gZGVwZW5kcyBvbiBjYWNoZWROb2RlLgotCQkJCWlmIChvbGROb2Rlcy5pbmNsdWRlcyhmU3RydWN0dXJlZERvY3VtZW50LmdldENhY2hlZERvY3VtZW50UmVnaW9uKCkpKQotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQl9Ci0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSAmJiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSkgewotCQkJCS8vIHRoaXMgd2lsbCBoYXBwZW4gbm93IGxlZ2l0YW1hdGVseSB3aGVuIGFsbCB0ZXh0IGlzIGRlbGV0ZWQKLQkJCQkvLyBmcm9tIGEgZG9jdW1lbnQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOjpyZVNldENhY2hlZE5vZGU6IGNvdWxkIG5vdCBmaW5kIGEgbm9kZSB0byBjYWNoZSEgKGl0cyBvayBpZiBhbGwgdGV4dCBkZWxldGVkKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3c3RydWN0dXJlZERvY3VtZW50Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuaW1wbC5JU3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCS8vIE5PVEU6IHRoaXMgbWV0aG9kIChhbmQgY2xhc3MpIGRlcGVuZCBvbiBiZWluZyBhYmxlIHRvCi0JCS8vIGRvIHRoZSBmb2xsb3dpbmcgY2FzdCAoaS5lLiByZWZlcmVuY2VzIHNvbWUgZmllbGRzIGRpcmVjdGx5KQotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCWZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNwbGljZShDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQkvLwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0T2xkID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5ldyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE9sZCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5ldyA9IG51bGw7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkUHJldmlvdXMgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5leHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0ID0gbnVsbDsKLQkJLy8KLQkJLy8gaWYgY2FsbGVkIHdpdGggYm90aCBhcmd1bWVudHMgZW1wdHkgbGlzdHMsIHdlIGNhbiBkaXNyZWdhcmQuCi0JCS8vIHRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsIHdoZW4gc29tZSB0ZXh0IGlzIHJlcGxhY2VkIHdpdGggdGhlCi0JCS8vIGlkZW50aWNhbCB0ZXh0LgotCQlpZiAoKG9sZE5vZGVzLmdldExlbmd0aCgpID09IDApICYmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gZ2V0IHBvaW50ZXJzCi0JCWlmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWZpcnN0TmV3ID0gbmV3Tm9kZXMuaXRlbSgwKTsKLQkJCWxhc3ROZXcgPSBuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJLy8KLQkJaWYgKG9sZE5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJZmlyc3RPbGQgPSBvbGROb2Rlcy5pdGVtKDApOwotCQkJbGFzdE9sZCA9IG9sZE5vZGVzLml0ZW0ob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCWlmIChmaXJzdE9sZCAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzID0gZmlyc3RPbGQuZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChsYXN0T2xkICE9IG51bGwpCi0JCQkJb2xkTmV4dCA9IGxhc3RPbGQuZ2V0TmV4dCgpOwotCQl9Ci0JCS8vIGhhbmRsZSBzd2l0Y2gKLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJLy8gc3dpdGNoIHN1cnJvdW5kaW5nIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMnIHJlZmVyZW5jZXMgdG8KLQkJCS8vIGxpc3RzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KGZpcnN0TmV3KTsKLQkJCWlmIChuZXdQcmV2aW91cyAhPSBudWxsKQotCQkJCW5ld1ByZXZpb3VzLnNldE5leHQoZmlyc3RPbGQpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKGxhc3ROZXcpOwotCQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCQluZXdOZXh0LnNldFByZXZpb3VzKGxhc3RPbGQpOwotCQkJLy8gc3dpdGNoIGxpc3QgcG9pbnRlcnMgdG8gc3Vycm91bmRpbmcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJaWYgKGZpcnN0T2xkICE9IG51bGwpCi0JCQkJZmlyc3RPbGQuc2V0UHJldmlvdXMobmV3UHJldmlvdXMpOwotCQkJaWYgKGxhc3RPbGQgIT0gbnVsbCkKLQkJCQlsYXN0T2xkLnNldE5leHQobmV3TmV4dCk7Ci0JCQlpZiAoZmlyc3ROZXcgIT0gbnVsbCkKLQkJCQlmaXJzdE5ldy5zZXRQcmV2aW91cyhvbGRQcmV2aW91cyk7Ci0JCQlpZiAobGFzdE5ldyAhPSBudWxsKQotCQkJCWxhc3ROZXcuc2V0TmV4dChvbGROZXh0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIHNob3J0IGNpcmN1aXQgd2hlbiB0aGVyZSBhcmUgbm8gbmV3IG5vZGVzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KG9sZE5leHQpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKG9sZFByZXZpb3VzKTsKLQkJfQotCQkvLwotCQkvLyBTSURFIEVGRkVDVHMKLQkJLy8gaWYgd2UgaGF2ZSBvbGROb2RlcywgYW5kIGlmIG9sZE5leHQgb3Igb2xkUHJldmlvdXMgaXMgbnVsbCwKLQkJLy8gdGhhdCBtZWFucyB3ZSBhcmUgcmVwbGFjaW5nCi0JCS8vIHRoZSBsYXN0Tm9kZSBvciBmaXJzdE5vZGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMncyBjaGFpbiBvZiBub2RlcywKLQkJLy8gc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMgbGFzdCBvciBmaXJzdCBOb2RlCi0JCS8vIGFzIHRoZSBsYXN0IG9yIGZpcnN0IG9mIHRoZSBuZXcgbm9kZXMuCi0JCS8vIChhbmQgc29tZXRpbWVzIGV2ZW4gdGhlc2Ugd2lsbCBiZSBudWxsISBzdWNoIGFzIHdoZW4gZGVsZXRpbmcgYWxsCi0JCS8vIHRleHQgaW4gYSBkb2N1bWVudCkuCi0JCWlmICgob2xkTmV4dCA9PSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0TGFzdERvY3VtZW50UmVnaW9uKGxhc3ROZXcpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBpbiB0aGlzIGNhc2UsIHRoZSBsYXN0IG5vZGUgaXMgYmVpbmcgZGVsZXRlZCwgYnV0IG5vdAotCQkJCS8vIHJlcGxhY2VkCi0JCQkJLy8gd2l0aCBhbnl0aGluZy4gSW4gdGhpcyBjYXNlLCB3ZSBjYW4ganVzdCBiYWNrIHVwIG9uZQotCQkJCS8vIGZyb20gdGhlIGZpcnN0IG9sZCBub2RlCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRMYXN0RG9jdW1lbnRSZWdpb24oZmlyc3RPbGQuZ2V0UHJldmlvdXMoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKChvbGRQcmV2aW91cyA9PSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Rmlyc3REb2N1bWVudFJlZ2lvbihmaXJzdE5ldyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGluIHRoaXMgY2FzZSB0aGUgZmlyc3Qgbm9kZSBpcyBiZWluZyBkZWxldGVkLCBidXQgbm90Ci0JCQkJLy8gcmVwbGFjZWQKLQkJCQkvLyB3aXRoIGFueXRoaW5nLiBTbywgd2UganVzdCBnbyBvbmUgZm9yd2FyZCBwYXN0IHRoZSBsYXN0IG9sZAotCQkJCS8vIG5vZGUuCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRGaXJzdERvY3VtZW50UmVnaW9uKGxhc3RPbGQuZ2V0TmV4dCgpKTsKLQkJCX0KLQkJfQotCQkvLyBhcyBhIHRpbnkgb3B0aW1pemF0aW9uLCB3ZSByZXR1cm4gdGhlIGZpcnN0IG9mIHRoZSBkb3duc3RyZWFtCi0JCS8vIG5vZGVzLAotCQkvLyBpZiBhbnkKLQkJcmV0dXJuIG9sZE5leHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gInJldXNlIiB0aGUgb2xkIGNvbnRhaW5lciByZWdpb24sIHdoZW4KLQkgKiBmb3VuZCB0byBiZSBzYW1lIChzbyBzYW1lIGluc3RhbmNlIGRvZXNuJ3QgY2hhbmdlKS4gVGhlIGdvYWwgaXMgdG8KLQkgKiAidHJhbnNmb3JtIiB0aGUgb2xkIHJlZ2lvbiwgc28gaXRzIGVxdWl2ZWxlbnQgdG8gdGhlIG5ld2x5IHBhcnNlZCBvbmUuCi0JICogIAotCSAqLwotCXByaXZhdGUgSVRleHRSZWdpb24gc3dhcE5ld0Zvck9sZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24pIHsKLQkJLy8gbWFrZXMgdGhlIG9sZCByZWdpb24gaW5zdGFuY2UgdGhlIGNvcnJlY3Qgc2l6ZS4KLQkJb2xkUmVnaW9uLmVxdWF0ZVBvc2l0aW9ucyhuZXdSZWdpb24pOwotCQkvLyBhZGp1c3RzIG9sZCBub2RlIGluc3RhbmNlIGFwcHJvcHJpYXRlbHkKLQkJb2xkTm9kZS5zZXRMZW5ndGgobmV3Tm9kZS5nZXRMZW5ndGgoKSk7Ci0JCW9sZE5vZGUuc2V0RW5kZWQobmV3Tm9kZS5pc0VuZGVkKCkpOwotCQkvLyB3ZSBkbyBoYXZlIHRvIHNldCB0aGUgcGFyZW50IGRvY3VtZW50LCBzaW5jZSB0aGUgb2xkTm9kZSdzCi0JCS8vIHdlcmUgc2V0IHRvIGEgdGVtcG9yYXJ5IG9uZSwgdGhlbiBuZXdOb2RlJ3MgaGF2ZSB0aGUKLQkJLy8gcmlnaHQgb25lLgotCQlvbGROb2RlLnNldFBhcmVudERvY3VtZW50KG5ld05vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKSk7Ci0JCS8vIGlmIHdlJ3JlIHRyYW5zZm9ybWluZyBhIGNvbnRhaW5lciByZWdpb24sIHdlIG5lZWQgdG8gYmUgc3VyZSB0bwotCQkvLyB0cmFuc2ZlciB0aGUgbmV3IGVtYmVkZGVkIHJlZ2lvbnMsIHRvIHRoZSBvbGQgcGFyZW50Ci0JCS8vIE5vdGU6IGlmIG9sZFJlZ2lvbiBoYXNFbWJlZGRlZFJlZ2lvbnMsIHRoZW4gd2Uga25vdyB0aGUKLQkJLy8gbmV3UmVnaW9uIGRvZXMgdG9vLCBzaW5jZSB3ZSBnb3QgaGVyZSBiZWNhdXNlIHRoZXkgd2VyZSB0aGUKLQkJLy8gc2FtZSB0eXBlLgotCQlpZiAoaXNDb2xsZWN0aW9uUmVnaW9uKG9sZFJlZ2lvbikpIHsgLy8gfHwKLQkJCS8vIGhhc0NvbnRhaW5lclJlZ2lvbnMob2xkUmVnaW9uKSkKLQkJCS8vIHsKLQkJCXRyYW5zZmVyRW1iZWRkZWRSZWdpb25zKG9sZE5vZGUsIChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgb2xkUmVnaW9uLCAoSVRleHRSZWdpb25Db250YWluZXIpIG5ld1JlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIG9sZFJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3dpdGNoTm9kZUxpc3RzKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gc3BsaWNlKG9sZE5vZGVzLCBuZXdOb2Rlcyk7Ci0JCS8vIGVuc3VyZSB0aGF0IHRoZSBvbGQgbm9kZXMgaG9sZCBubyByZWZlcmVuY2VzIHRvIHRoZSBleGlzdGluZyBtb2RlbAotCQlpZiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0SXRlbSA9IG9sZE5vZGVzLml0ZW0oMCk7Ci0JCQlmaXJzdEl0ZW0uc2V0UHJldmlvdXMobnVsbCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RJdGVtID0gb2xkTm9kZXMuaXRlbShvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJbGFzdEl0ZW0uc2V0TmV4dChudWxsKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvICJyZXVzZSIgdGhlIG9sZCBjb250YWluZXIgcmVnaW9uLCB3aGVuCi0JICogZm91bmQgdG8gYmUgc2FtZSAoc28gc2FtZSBpbnN0YW5jZSBkb2Vzbid0IGNoYW5nZSkuIFRoZSBnb2FsIGlzIHRvCi0JICogInRyYW5zZm9ybSIgdGhlIG9sZCByZWdpb24sIHNvIGl0cyBlcXVpdmVsZW50IHRvIHRoZSBuZXdseSBwYXJzZWQgb25lLgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNmZXJFbWJlZGRlZFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbkNvbnRhaW5lciBvbGRSZWdpb24sIElUZXh0UmVnaW9uQ29udGFpbmVyIG5ld1JlZ2lvbikgewotCQkvLyB0aGUgb2xkUmVnaW9uIHNob3VsZCBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IHBhcmVudCwgc2luY2UKLQkJLy8gd2UgZ290IGhlcmUgYmVjYXVzZSBhbGwncyBlcXVpdmVsZW50IGV4Y2VwdCB0aGUgcmVnaW9uCi0JCS8vIHBvc3Rpb25zIGhhdmUgY2hhbmdlZC4KLQkJLy9vbGRSZWdpb24uc2V0UGFyZW50KG5ld1JlZ2lvbi5nZXRQYXJlbnQoKSk7Ci0JCS8vIGJ1dCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlcmUncyAibmVzdGVkIiBlbWJlZGRlZCByZWdpb25zLCBhbmQgaWYKLQkJLy8gc28sIHdlIGNhbiBqdXN0IG1vdmUgdGhlbSBvdmVyLiBzZXR0aW5nIHRoZWlyIHBhcmVudCBhcyB0aGlzIG9sZAotCQkvLyByZWdpb24uCi0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zVG9UcmFuc2ZlciA9IG5ld1JlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCW9sZFJlZ2lvbi5zZXRSZWdpb25zKG5ld1JlZ2lvbnNUb1RyYW5zZmVyKTsKLQkJSXRlcmF0b3IgbmV3UmVnaW9uc0luT2xkT25lID0gbmV3UmVnaW9uc1RvVHJhbnNmZXIuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG5ld1JlZ2lvbnNJbk9sZE9uZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIG5ld09uZSA9IChJVGV4dFJlZ2lvbikgbmV3UmVnaW9uc0luT2xkT25lLm5leHQoKTsKLQkJCWlmIChpc0NvbGxlY3Rpb25SZWdpb24obmV3T25lKSkgeyAvLyB8fAotCQkJCS8vIGhhc0NvbnRhaW5lclJlZ2lvbnMobmV3T25lKSkgewotCQkJCS8vKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgbmV3T25lKS5zZXRQYXJlbnQob2xkUmVnaW9uKTsKLQkJCQlvbGRSZWdpb24uc2V0UmVnaW9ucyhuZXdSZWdpb24uZ2V0UmVnaW9ucygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVEb3duU3RyZWFtUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiBsYXN0S25vd25SZWdpb24pIHsKLQkJLy8gc28gYWxsIHJlZ2lvbnMgYWZ0ZXIgdGhlIGxhc3Qga25vd24gcmVnaW9uIChsYXN0IGtub3duIHRvIGJlIG9rKQotCQkvLyBoYXZlIHRvIGhhdmUgdGhlaXIgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgYWRqdXN0ZWQuCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpbnQgbGlzdExlbmd0aCA9IHJlZ2lvbnMuc2l6ZSgpOwotCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCS8vIGZpcnN0LCBsb29wIHRocm91Z2ggdG8gZmluZCB3aGVyZSB0byBzdGFydAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uID09IGxhc3RLbm93blJlZ2lvbikgewotCQkJCXN0YXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIG5vdywgYmVnaW5uaW5nIG9uZSBwYXN0IHRoZSBsYXN0IGtub3duIG9uZSwgbG9vcAotCQkvLyB0aHJvdWdoIHRvIGVuZCBvZiBsaXN0LCBhZGp1c3RpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zdGlvbnMuCi0JCXN0YXJ0SW5kZXgrKzsKLQkJZm9yIChpbnQgaiA9IHN0YXJ0SW5kZXg7IGogPCBsaXN0TGVuZ3RoOyBqKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGopOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KGZMZW5ndGhEaWZmZXJlbmNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzVlNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWc7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24gewotCi0JcHJpdmF0ZSBpbnQgY291bnQ7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWQ7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZEhlYWQ7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld0hlYWQpIHsKLQkJc3VwZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBoZWFkID0gbmV3SGVhZDsKLQkJd2hpbGUgKGNvdW50Tm9kZSAhPSBudWxsKSB7Ci0JCQljb3VudCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAoRGVidWcuREVCVUcgPiA1KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk4gTm9kZXMgaW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gQ29udHJ1Y3RvcjogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmQpIHsKLQkJc3VwZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBoZWFkID0gc3RhcnQ7Ci0JCWlmICgoc3RhcnQgPT0gbnVsbCkgfHwgKGVuZCA9PSBudWxsKSkgewotCQkJLy8gZXJyb3IgY29uZGl0aW9uCi0JCQljb3VudCA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy9JZiBib3RoIG5vZGVzIGFyZSBub24tbnVsbCwgd2UgYXNzdW1lIHRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCBvbmUKLQkJLy8gaXRlbQotCQljb3VudCA9IDE7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gZW5kKSB7Ci0JCQljb3VudCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWcuREVCVUcgPiA1KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk4gTm9kZXMgaW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gQ29udHJ1Y3RvcjogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogaGFzTW9yZUVsZW1lbnRzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCXJldHVybiBjb3VudCA+IDA7Ci0JfQotCi0JLyoqCi0JICogbmV4dEVsZW1lbnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCWlmIChjb3VudCA+IDApIHsKLQkJCWNvdW50LS07Ci0JCQlvbGRIZWFkID0gaGVhZDsKLQkJCWhlYWQgPSBoZWFkLmdldE5leHQoKTsKLQkJCXJldHVybiBvbGRIZWFkOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxNzA3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuQXNzZXJ0OwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWRqdXN0U3RhcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSwgaW50IGFkanVzdG1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJYU5vZGUuYWRqdXN0U3RhcnQoYWRqdXN0bWVudCk7Ci0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgY291bnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKGZsYXROb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZmxhdE5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZsYXROb2Rlcy5pdGVtKGkpOwotCQkJCS8vIGRvbid0IGtub3cgd2h5LCBidXQgd2UncmUgZ2V0dGluZyBudWxsIHBvaW50ZXIgZXhjZXB0aW9ucwotCQkJCS8vIGluIHRoaXMgbWV0aG9kCi0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSByZXN1bHQgKyBub2RlLmdldE51bWJlck9mUmVnaW9ucygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGdldFRleHQoQ29yZU5vZGVMaXN0IGZsYXROb2RlcykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkvL0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBudWxsOwotCQkJaW50IGxlbmd0aCA9IGZsYXROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlidWZmLmFwcGVuZChmbGF0Tm9kZXMuaXRlbShpKS5nZXRUZXh0KCkpOwotCQkJfQotCQkJcmVzdWx0ID0gYnVmZi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb3JlTm9kZUxpc3Qgc2V0UGFyZW50RG9jdW1lbnQoQ29yZU5vZGVMaXN0IG5vZGVsaXN0LCBJU3RydWN0dXJlZERvY3VtZW50IHRleHRTdG9yZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGVsaXN0LCAibm9kZWxpc3Qgd2FzIG51bGwgaW4gQ29yZU5vZGVMaXN0OjpzZXRUZXh0U3RvcmUoQ29yZU5vZGVMaXN0LCBTdHJ1Y3R1cmVkVGV4dFN0b3JlKSIpOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW4gPSBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gbm9kZWxpc3QuaXRlbShpKTsKLQkJCS8vQXNzZXJ0LmlzTm90TnVsbChub2RlLCAid2hvJ3MgcHV0dGluZyBudWxsIGluIHRoZSBub2RlIGxpc3Q/IGluCi0JCQkvLyBDb3JlTm9kZUxpc3Q6OnNldFRleHRTdG9yZShDb3JlTm9kZUxpc3QsCi0JCQkvLyBTdHJ1Y3R1cmVkVGV4dFN0b3JlKSIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLnNldFBhcmVudERvY3VtZW50KHRleHRTdG9yZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVsaXN0OwotCX0KLQotCS8vCXB1YmxpYyBmaW5hbCBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCS8vIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlLAotCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCS8vCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFOb2RlID0gaGVhZE5vZGU7Ci0JLy8JCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JLy8JCQlhTm9kZS5zZXRQYXJlbnREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCS8vCQkJYU5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgYU5vZGUuZ2V0TmV4dCgpOwotCS8vCQl9Ci0JLy8JCXJldHVybiBoZWFkTm9kZTsKLQkvLwl9Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJYU5vZGUuc2V0UGFyZW50RG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgVmVjdG9yIHRvVmVjdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCXYuYWRkRWxlbWVudChhTm9kZSk7Ci0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvcigpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzMxYWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5TZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlIGV4dGVuZHMgU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UsIElSZWdpb25Db21wYXJpYmxlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUoSVRleHRTdG9yZSBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXQoaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNsZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGMKLQkgKiBAcGFyYW0gZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc0lnbm9yZUNhc2UoY2hhciBjMSwgY2hhciBjMikgewotCQkvLyB3ZSBjaGVjayBib3RoIGNhc2UgY29udmVyc2lvbnMgdG8gaGFuZGxlIHRob3NlIGZldyBjYXNlcywKLQkJLy8gaW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgVHVya2lzaCwgd2hpY2ggaGF2ZSBzb21lIGNoYXJhY3RlcnMKLQkJLy8gd2hpY2ggc29ydCBvZiBoYXZlIDMgY2FzZXMuCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzEpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzEpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgY29tcGFyZUxlbmd0aCA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJaWYgKGNvbXBhcmVMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJaWYgKGVuZE9mZnNldCA8PSBsZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIGFsbCBsZW5ndGhzIGhhdmUgYmVlbiBjaGVja2VkIGFuZCBmYWxsIHdpdGhpbnQKLQkgKiBleGNlcHRhYmxlIGxpbWl0cwotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gc3RyaW5nVG9Db21wYXJlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpbnQgc3RyaW5nT2Zmc2V0ID0gMDsKLQkJaW50IGxlbiA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoY2hhckF0KGkpICE9IHN0cmluZ1RvQ29tcGFyZS5jaGFyQXQoc3RyaW5nT2Zmc2V0KyspKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBjb21wYXJlTGVuZ3RoID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlpZiAoY29tcGFyZUxlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCWludCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQlpZiAoZW5kT2Zmc2V0IDw9IGxlbmd0aCgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWludCBzdHJpbmdPZmZzZXQgPSAwOwotCQlpbnQgbGVuID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICghbWF0Y2hlc0lnbm9yZUNhc2UoY2hhckF0KGkpLCBzdHJpbmdUb0NvbXBhcmUuY2hhckF0KHN0cmluZ09mZnNldCsrKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCi0JCXJldHVybiBnZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1MWNhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuR2FwVGV4dFN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFRleHRTdG9yZSBpbXBsZW1lbnRzIElUZXh0U3RvcmUsIENoYXJTZXF1ZW5jZSwgSVJlZ2lvbkNvbXBhcmlibGUgewotCi0JcHJpdmF0ZSBHYXBUZXh0U3RvcmUgZkludGVybmFsU3RvcmU7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFRleHRTdG9yZSgpIHsKLQkJdGhpcyg1MCwgMzAwKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG93V2F0ZXJtYXJrCi0JICogQHBhcmFtIGhpZ2hXYXRlcm1hcmsKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlKGludCBsb3dXYXRlcm1hcmssIGludCBoaWdoV2F0ZXJtYXJrKSB7Ci0JCXN1cGVyKCk7Ci0JCWZJbnRlcm5hbFN0b3JlID0gbmV3IEdhcFRleHRTdG9yZShsb3dXYXRlcm1hcmssIGhpZ2hXYXRlcm1hcmspOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNjaGFyQXQoaW50KQotCSAqLwotCXB1YmxpYyBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldChpbmRleCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjZ2V0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXQoaW50IG9mZnNldCkgewotCi0JCXJldHVybiBmSW50ZXJuYWxTdG9yZS5nZXQob2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNnZXQoaW50LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCi0JCXJldHVybiBmSW50ZXJuYWxTdG9yZS5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI2dldExlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0KLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldExlbmd0aCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNsZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCi0JCXJldHVybiBmSW50ZXJuYWxTdG9yZS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc0lnbm9yZUNhc2UoY2hhciBjMSwgY2hhciBjMikgewotCQkvLyB3ZSBjaGVjayBib3RoIGNhc2UgY29udmVyc2lvbnMgdG8gaGFuZGxlIHRob3NlIGZldyBjYXNlcywKLQkJLy8gaW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgVHVya2lzaCwgd2hpY2ggaGF2ZSBzb21lIGNoYXJhY3RlcnMKLQkJLy8gd2hpY2ggc29ydCBvZiBoYXZlIDMgY2FzZXMuCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzEpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzEpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgY29tcGFyZUxlbmd0aCA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJaWYgKGNvbXBhcmVMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJaWYgKGVuZE9mZnNldCA8PSBsZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIGFsbCBsZW5ndGhzIGhhdmUgYmVlbiBjaGVja2VkIGFuZCBmYWxsIHdpdGhpbnQKLQkgKiBleGNlcHRhYmxlIGxpbWl0cwotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gc3RyaW5nVG9Db21wYXJlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpbnQgc3RyaW5nT2Zmc2V0ID0gMDsKLQkJaW50IGxlbiA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoY2hhckF0KGkpICE9IHN0cmluZ1RvQ29tcGFyZS5jaGFyQXQoc3RyaW5nT2Zmc2V0KyspKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBjb21wYXJlTGVuZ3RoID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlpZiAoY29tcGFyZUxlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCWludCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQlpZiAoZW5kT2Zmc2V0IDw9IGxlbmd0aCgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWludCBzdHJpbmdPZmZzZXQgPSAwOwotCQlpbnQgbGVuID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICghbWF0Y2hlc0lnbm9yZUNhc2UoY2hhckF0KGkpLCBzdHJpbmdUb0NvbXBhcmUuY2hhckF0KHN0cmluZ09mZnNldCsrKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI3JlcGxhY2UoaW50LCBpbnQsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJZkludGVybmFsU3RvcmUucmVwbGFjZShvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNzZXQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHRleHQpIHsKLQkJZkludGVybmFsU3RvcmUuc2V0KHRleHQpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI3N1YlNlcXVlbmNlKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCS8vIGNvbnZlcnQgJ2VuZCcgdG8gJ2xlbmd0aCcKLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldChzdGFydCwgZW5kIC0gc3RhcnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdWJTZXRUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdWJTZXRUZXh0U3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjYThiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3ViU2V0VGV4dFN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgY29udmllbmNlIG9yIHV0aWxpdHkgY2xhc3MgdGhhdCBhbGxvd3MgeW91IHRvIG1ha2UgYSBjb3B5IG9mIGEKLSAqIHBhcnQgb2YgYSBsYXJnZXIgdGV4dCBzdG9yZSwgYnV0IGhhdmUgdGhlIGNvcHkgYmVoYXZlIGFzIGlmIGl0IHdhcyB0aGUKLSAqIGxhcmdlciB0ZXh0IHN0b3JlLgotICogCi0gKiBJbiBvdGhlciB3b3JkcywgaXQgcHJvdmlkZXMgYSBzdWJzZXQgb2YgYSBsYXJnZXIgZG9jdW1lbnQsIHRoYXQgImxvb2tzIGxpa2UiCi0gKiB0aGUgb3JnaW5hbCBkb2N1bWVudC4gVGhhdCBpcywgImxvb2tzIGxpa2UiIGluIHRlcm1zIG9mIG9mZnNldHMgYW5kIGxlbmd0aHMuCi0gKiBWYWxpZCBhY2Nlc3MgY2FuIG9ubHkgYmUgbWFkZSB0byBkYXRhIGJldHdlZW4gdGhlIG9yaWduYWwgb2Zmc2V0cywgZXZlbgotICogdGhvdWdoIHRob3NlIG9mZnNldHMgYXJlIGluIHRoZSBzYW1lIHVuaXRzIGF0IHRoZSBvcmlnaW5hbCwgYW5kIGV2ZW4gdGhvdWdoCi0gKiB0aGUgbGVuZ3RoIGFwcGVhcnMgdG8gYmUgbG9uZy4KLSAqIAotICogRm9yIGV4YW1wbGUsIGlmIGEgc3Vic2V0dGV4dCBzdG9yZSBpcyBjcmVhdGVkIGZvciB0aGUgZGVmIHBhcnQgb2YgYWJjZGVmZ2gsCi0gKiB0aGVuIGdldCgzLDUpIGlzIHZhbGlkLCBnZXRMZW5ndGggaXMgOC4gQW55IG90aGVyIGFjY2Vzcywgc3VjaCBhcwotICogZ2V0Q2hhcigyKSwgd291bGQgYmUgaW52YWxpZC4KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZTsKLQotLyoqCi0gKiBTaW1pbGFyIHRvIGJhc2ljcyBvZiBJRG9jdW1lbnQsIGJ1dCB0aGUgb2Zmc2V0cyBhcmUgbWFwcGVkIGZyb20gY29vcmRpbmF0ZXMKLSAqIG9mIHVuZGVybHlpbmcgc3RvcmFnZSB0byBhICJ2aXJ0dWFsIiBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFN1YlNldFRleHRTdG9yZSBpbXBsZW1lbnRzIElUZXh0U3RvcmUgewotCXByaXZhdGUgaW50IHBzZXVkb0JlZ2luT2Zmc2V0OyAvLyBtYXBzIHRvICJ6ZXJvIiBwb3N0aW9uIG9mIG5ldyB0ZXh0Ci0JLy9wcml2YXRlIGludCBwc2V1ZG9FbmRPZmZzZXQ7Ci0JcHJpdmF0ZSBpbnQgcHNldWRvTGVuZ3RoOyAvLyBsZW5ndGggb2Ygb2xkL29yaWdpbmFsIGRvY3VtZW50Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JLyoqCi0JICogU3ViU2V0VGV4dFN0b3JlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGluaXRpYWxDb250ZW50Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN1YlNldFRleHRTdG9yZShTdHJpbmcgaW5pdGlhbENvbnRlbnQsIGludCBiZWdpbk9mZnNldCwgaW50IGVuZE9mZnNldCwgaW50IG9yaWdpbmFsRG9jdW1lbnRMZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJcHNldWRvQmVnaW5PZmZzZXQgPSBiZWdpbk9mZnNldDsKLQkJLy9wc2V1ZG9FbmRPZmZzZXQgPSBlbmRPZmZzZXQ7Ci0JCS8vIHVzZWQgdG8gYmUgb3JpZ2luYWxEb2N1bWVudC5nZXRMZW5ndGggLi4uIG5vdCBzdXJlIGlmIHVzZWQsIG9yCi0JCS8vIHdoaWNoCi0JCS8vIGlzIHJpZ2h0Ci0JCXBzZXVkb0xlbmd0aCA9IG9yaWdpbmFsRG9jdW1lbnRMZW5ndGg7Ci0JCXN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoaW5pdGlhbENvbnRlbnQpOwotCQkvL3NldChpbml0aWFsQ29udGVudCk7Ci0JfQotCi0JLy8gdGhpcyBpcyBvdXIgInByaXZhdGUiIGdldCwgd2hpY2ggbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZAotCS8vIHVzZSB0byBnZXQgdXNpbmcgInJlYWwiIGNvb3JkaW5hdGVzIG9mIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24uCi0JcHJpdmF0ZSBTdHJpbmcgX2dldChpbnQgYmVnaW4sIGludCBsZW5ndGgpIHsKLQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJaW50IHNyY0VuZCA9IGJlZ2luICsgbGVuZ3RoOwotCQlzdHJpbmdCdWZmZXIuZ2V0Q2hhcnMoYmVnaW4sIHNyY0VuZCwgY2hhcnMsIDApOwotCQlyZXR1cm4gbmV3IFN0cmluZyhjaGFycyk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0KGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIHN0cmluZ0J1ZmZlci5jaGFyQXQob2Zmc2V0IC0gcHNldWRvQmVnaW5PZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBiZWdpbgotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXQoaW50IGJlZ2luLCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIHJlbWFwIHRoZSBiZWdpbiBhbmQgZW5kIHRvICJhcHBlYXIiIHRvIGJlIGluIHRoZQotCQkvLyBzYW1lIGNvb3JkaW5hdGVzIG9mIHRoZSBvcmlnaW5hbCBwYXJlbnREb2N1bWVudAotCQlyZXR1cm4gX2dldChiZWdpbiAtIHBzZXVkb0JlZ2luT2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBiZWdpbgotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGNoYXIgZ2V0Q2hhcihpbnQgcG9zKSB7Ci0JCS8vIHJlbWFwIHRoZSBiZWdpbiBhbmQgZW5kIHRvICJhcHBlYXIiIHRvIGJlIGluIHRoZQotCQkvLyBzYW1lIGNvb3JkaW5hdGVzIG9mIHRoZSBvcmlnaW5hbCBwYXJlbnREb2N1bWVudAotCQlyZXR1cm4gZ2V0KHBvcyAtIHBzZXVkb0JlZ2luT2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBXZSByZWRlZmluZSBnZXRMZW5ndGggc28gaXRzIG5vdCB0aGUgdHJ1ZSBsZW5ndGggb2YgdGhpcyBzdWItc2V0Ci0JICogZG9jdW1lbnQsIGJ1dCB0aGUgbGVuZ3RoIG9mIHRoZSBvcmlnaW5hbC4gVGhpcyBpcyBuZWVkZWQsIGFzIGEgc2ltcGxlCi0JICogZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gc2VlIGlmIHRoZSBwc2V1ZG8gZW5kIGlzIGVxdWFsIHRoZSBsYXN0Ci0JICogcG9zaXRpb24gb2YgdGhlIG9yaWdpbmFsIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gcHNldWRvTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBhcyBpZiBjb25zaWRlcmVkIGEgdHJ1ZSwgc3RhbmRhbG9uZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHJ1ZUxlbmd0aCgpIHsKLQkJcmV0dXJuIHN0cmluZ0J1ZmZlci5sZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlKGludCBiZWdpbiwgaW50IGxlbmd0aCwgU3RyaW5nIGNoYW5nZXMpIHsKLQkJLy8gcmVtYXAgdGhlIGJlZ2luIGFuZCBlbmQgdG8gImFwcGVhciIgdG8gYmUgaW4gdGhlCi0JCS8vIHNhbWUgY29vcmRpbmF0ZXMgb2YgdGhlIG9yaWdpbmFsIHBhcmVudERvY3VtZW50Ci0JCWludCBlbmQgPSBiZWdpbiArIGxlbmd0aDsKLQkJc3RyaW5nQnVmZmVyLnJlcGxhY2UoYmVnaW4gLSBwc2V1ZG9CZWdpbk9mZnNldCwgZW5kLCBjaGFuZ2VzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHRleHQpIHsKLQkJc3RyaW5nQnVmZmVyLnNldExlbmd0aCgwKTsKLQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh0ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvVGV4dFJlZ2lvbkxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvVGV4dFJlZ2lvbkxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODVlZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1RleHRSZWdpb25MaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFRleHRSZWdpb25MaXN0SW1wbCBpbXBsZW1lbnRzIElUZXh0UmVnaW9uTGlzdCB7Ci0KLQlwcml2YXRlIGNsYXNzIE51bGxJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJcHVibGljIE51bGxJdGVyYXRvcigpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IHJlbW92ZSByZWdpb25zIHZpYSBpdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBSZWdpb25JdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJcHJpdmF0ZSBJVGV4dFJlZ2lvbltdIGZJdGVyYXRvclJlZ2lvbnM7Ci0JCXByaXZhdGUgaW50IGluZGV4ID0gLTE7Ci0JCXByaXZhdGUgaW50IG1heGluZGV4ID0gLTE7Ci0KLQkJcHVibGljIFJlZ2lvbkl0ZXJhdG9yKCkgewotCQkJZkl0ZXJhdG9yUmVnaW9ucyA9IHRvQXJyYXkoKTsKLQkJCW1heGluZGV4ID0gZkl0ZXJhdG9yUmVnaW9ucy5sZW5ndGggLSAxOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBpbmRleCA8IG1heGluZGV4OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJaWYgKCEoaW5kZXggPCBtYXhpbmRleCkpCi0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCXJldHVybiBmSXRlcmF0b3JSZWdpb25zWysraW5kZXhdOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IHJlbW92ZSByZWdpb25zIHZpYSBpdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IGdyb3d0aENvbnN0YW50ID0gMjsKLQotCXByaXZhdGUgSVRleHRSZWdpb25bXSBmUmVnaW9uczsKLQlwcml2YXRlIGludCBmUmVnaW9uc0NvdW50ID0gMDsKLQotCXB1YmxpYyBUZXh0UmVnaW9uTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRleHRSZWdpb25MaXN0SW1wbChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCkgewotCQl0aGlzKCk7Ci0JCWZSZWdpb25zID0gKElUZXh0UmVnaW9uW10pIHJlZ2lvbkxpc3QudG9BcnJheSgpLmNsb25lKCk7Ci0JCWZSZWdpb25zQ291bnQgPSBmUmVnaW9ucy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCi0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZW5zdXJlQ2FwYWNpdHkoZlJlZ2lvbnNDb3VudCArIDEpOwotCQlmUmVnaW9uc1tmUmVnaW9uc0NvdW50KytdID0gcmVnaW9uOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluc2VydFBvcywgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMpIHsKLQkJLy8gYmVnaW5uaW5nIG9mIGxpc3QgaXMgMCB0byBpbnNlcnRQb3MtMQotCQkvLyByZW1haW5kZXIgb2YgbGlzdCBpcyBpbnNlcnRQb3MgdG8gZlJlZ2lvbnNDb3VudAotCQkvLyByZXN1bHRpbmcgdG90YWwgd2lsbCBiZSBiZSBmUmVnaW9uc0NvdW50ICsgbmV3UmVnaW9ucy5zaXplKCkKLQkJaWYgKGluc2VydFBvcyA8IDAgfHwgaW5zZXJ0UG9zID4gZlJlZ2lvbnNDb3VudCkgewotCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbnNlcnRQb3MpOwotCQl9Ci0KLQkJaW50IG5ld1JlZ2lvbnNTaXplID0gbmV3UmVnaW9ucy5zaXplKCk7Ci0KLQkJZW5zdXJlQ2FwYWNpdHkoZlJlZ2lvbnNDb3VudCArIG5ld1JlZ2lvbnNTaXplKTsKLQotCQlpbnQgbnVtTW92ZWQgPSBmUmVnaW9uc0NvdW50IC0gaW5zZXJ0UG9zOwotCQlpZiAobnVtTW92ZWQgPiAwKQotCQkJU3lzdGVtLmFycmF5Y29weShmUmVnaW9ucywgaW5zZXJ0UG9zLCBmUmVnaW9ucywgaW5zZXJ0UG9zICsgbmV3UmVnaW9uc1NpemUsIG51bU1vdmVkKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1JlZ2lvbnNTaXplOyBpKyspCi0JCQlmUmVnaW9uc1tpbnNlcnRQb3MrK10gPSBuZXdSZWdpb25zLmdldChpKTsKLQotCQlmUmVnaW9uc0NvdW50ICs9IG5ld1JlZ2lvbnNTaXplOwotCQlyZXR1cm4gbmV3UmVnaW9uc1NpemUgIT0gMDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkvLyBub3RlOiBzaXplIG9mIGFycmF5IGlzIG5vdCByZWR1Y2VkIQotCQlmUmVnaW9uc0NvdW50ID0gMDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IG5lZWRlZCkgewotCQlpZiAoZlJlZ2lvbnMgPT0gbnVsbCkgewotCQkJLy8gZmlyc3QgdGltZQotCQkJZlJlZ2lvbnMgPSBuZXcgSVRleHRSZWdpb25bbmVlZGVkXTsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgb2xkTGVuZ3RoID0gZlJlZ2lvbnMubGVuZ3RoOwotCQlpZiAob2xkTGVuZ3RoIDwgbmVlZGVkKSB7Ci0JCQlJVGV4dFJlZ2lvbltdIG9sZEFkYXB0ZXJzID0gZlJlZ2lvbnM7Ci0JCQlJVGV4dFJlZ2lvbltdIG5ld0FkYXB0ZXJzID0gbmV3IElUZXh0UmVnaW9uW25lZWRlZCArIGdyb3d0aENvbnN0YW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQWRhcHRlcnMsIDAsIG5ld0FkYXB0ZXJzLCAwLCBmUmVnaW9uc0NvdW50KTsKLQkJCWZSZWdpb25zID0gbmV3QWRhcHRlcnM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gZlJlZ2lvbnNDb3VudCkgewotCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbmRleCk7Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVzdWx0ID0gZlJlZ2lvbnNbaW5kZXhdOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKGZSZWdpb25zICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChyZWdpb24uZXF1YWxzKGZSZWdpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGZSZWdpb25zQ291bnQgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCWlmIChzaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG5ldyBOdWxsSXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgUmVnaW9uSXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiByZW1vdmUoaW50IGluZGV4KSB7Ci0JCS8vIG11Y2ggbW9yZSBlZmZpY2llbnQgd2F5cyB0byBpbXBsZW1lbnQgdGhpcywgYnV0Ci0JCS8vIEkgZG91YnQgaWYgY2FsbGVkIG9mdGVuCi0JCUlUZXh0UmVnaW9uIG9uZVRvUmVtb3ZlID0gZ2V0KGluZGV4KTsKLQkJcmVtb3ZlKG9uZVRvUmVtb3ZlKTsKLQkJcmV0dXJuIG9uZVRvUmVtb3ZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShJVGV4dFJlZ2lvbiBhKSB7Ci0JCWlmIChmUmVnaW9ucyA9PSBudWxsIHx8IGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5ld0luZGV4ID0gMDsKLQkJSVRleHRSZWdpb25bXSBuZXdSZWdpb25zID0gbmV3IElUZXh0UmVnaW9uW2ZSZWdpb25zQ291bnRdOwotCQlpbnQgb2xkUmVnaW9uQ291bnQgPSBmUmVnaW9uc0NvdW50OwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IG9sZEluZGV4ID0gMDsgb2xkSW5kZXggPCBvbGRSZWdpb25Db3VudDsgb2xkSW5kZXgrKykgewotCQkJSVRleHRSZWdpb24gY2FuZGlkYXRlID0gZlJlZ2lvbnNbb2xkSW5kZXhdOwotCQkJaWYgKGEgPT0gY2FuZGlkYXRlKSB7Ci0JCQkJZlJlZ2lvbnNDb3VudC0tOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCW5ld1JlZ2lvbnNbbmV3SW5kZXgrK10gPSBmUmVnaW9uc1tvbGRJbmRleF07Ci0JCX0KLQkJaWYgKGZvdW5kKQotCQkJZlJlZ2lvbnMgPSBuZXdSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCkgewotCQkvLyBtdWNoIG1vcmUgZWZmaWNpZW50IHdheXMgdG8gaW1wbGVtZW50IHRoaXMsIGJ1dAotCQkvLyBJIGRvdWJ0IGlmIGNhbGxlZCBvZnRlbgotCQlpZiAocmVnaW9uTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbkxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQl0aGlzLnJlbW92ZShyZWdpb25MaXN0LmdldChpKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGZSZWdpb25zQ291bnQ7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uW10gdG9BcnJheSgpIHsKLQkJLy8gcmV0dXJuICJjbG9uZSIgb2YgaW50ZXJuYWwgYXJyYXkKLQkJSVRleHRSZWdpb25bXSBuZXdBcnJheSA9IG5ldyBJVGV4dFJlZ2lvbltmUmVnaW9uc0NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShmUmVnaW9ucywgMCwgbmV3QXJyYXksIDAsIGZSZWdpb25zQ291bnQpOwotCQlyZXR1cm4gbmV3QXJyYXk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlMGY0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5TdHJ1Y3R1cmVkVGV4dENvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkVGV4dENvbW1hbmQgewotCi0JcHJvdGVjdGVkIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOyAvLyBuZWVkZWQgZm9yIHVwZGF0aW5nIHRoZSB0ZXh0Ci0JcHJvdGVjdGVkIFN0cmluZyBmVGV4dERlbGV0ZWQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRleHRFbmQgPSAtMTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUZXh0SW5zZXJ0ZWQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRleHRTdGFydCA9IC0xOwotCi0JLyoqCi0JICogV2UgaGF2ZSBuby1hcmcgY29uc3RydWN0b3Igbm9uLXB1YmxpYyB0byBmb3JjZSBkb2N1bWVudCB0byBiZSBzcGVjZmllZC4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7IC8vIG5lZWRlZCBmb3IgdXBkYXRpbmcgdGhlIHRleHQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCX0KLQotCS8qKgotCSAqIGdldFRleHREZWxldGVkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHREZWxldGVkKCkgewotCQlyZXR1cm4gZlRleHREZWxldGVkOwotCX0KLQotCS8qKgotCSAqIHRleHRFbmQgaXMgdGhlIHNhbWUgYXMgKHRleHRTdGFydCArIHRleHRJbnNlcnRlZC5sZW5ndGgoKSkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmVGV4dEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUZXh0SW5zZXJ0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dEluc2VydGVkKCkgewotCQlyZXR1cm4gZlRleHRJbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUZXh0U3RhcnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0JCXJldHVybiBmVGV4dFN0YXJ0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkvLyBub3RlOiBvbmUgb2YgdGhlIGZldyBwbGFjZXMgd2UgcHJvZ3JhbWF0aWNhbGx5IGlnbm9yZSByZWFkLW9ubHkKLQkJCS8vIHNldHRpbmdzCi0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkucmVwbGFjZVRleHQodGhpcywgZlRleHRTdGFydCwgZlRleHREZWxldGVkLmxlbmd0aCgpLCBmVGV4dEluc2VydGVkLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJZkRvY3VtZW50LnJlcGxhY2UoZlRleHRTdGFydCwgZlRleHREZWxldGVkLmxlbmd0aCgpLCBmVGV4dEluc2VydGVkKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBhc3N1bWVkIGltcG9zc2libGUsIGZvciBub3cKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0VGV4dERlbGV0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dERlbGV0ZWQoamF2YS5sYW5nLlN0cmluZyB0ZXh0RGVsZXRlZCkgewotCQlmVGV4dERlbGV0ZWQgPSB0ZXh0RGVsZXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0RW5kIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRFbmQoaW50IHRleHRFbmQpIHsKLQkJZlRleHRFbmQgPSB0ZXh0RW5kOwotCX0KLQotCS8qKgotCSAqIHNldFRleHRJbnNlcnRlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0SW5zZXJ0ZWQoamF2YS5sYW5nLlN0cmluZyB0ZXh0SW5zZXJ0ZWQpIHsKLQkJZlRleHRJbnNlcnRlZCA9IHRleHRJbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0U3RhcnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFN0YXJ0KGludCB0ZXh0U3RhcnQpIHsKLQkJZlRleHRTdGFydCA9IHRleHRTdGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJLy8gbm90ZTogb25lIG9mIHRoZSBmZXcgcGxhY2VzIHdlIHByb2dyYW1hdGljYWxseSBpZ25vcmUgcmVhZC1vbmx5Ci0JCQkvLyBzZXR0aW5ncwotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlcGxhY2VUZXh0KHRoaXMsIGZUZXh0U3RhcnQsIGZUZXh0SW5zZXJ0ZWQubGVuZ3RoKCksIGZUZXh0RGVsZXRlZCwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWZEb2N1bWVudC5yZXBsYWNlKGZUZXh0U3RhcnQsIGZUZXh0SW5zZXJ0ZWQubGVuZ3RoKCksIGZUZXh0RGVsZXRlZCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gYXNzdW1lZCBpbXBvc3NpYmxlLCBmb3Igbm93Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4ODU2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51bmRvLkNvbW1hbmRDdXJzb3JQb3NpdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kQ3Vyc29yUG9zaXRpb24gewotCXByb3RlY3RlZCBpbnQgZlJlZG9DdXJzb3JQb3NpdGlvbiA9IC0xOwotCXByb3RlY3RlZCBpbnQgZlJlZG9TZWxlY3Rpb25MZW5ndGggPSAwOwotCi0JcHJvdGVjdGVkIGludCBmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JcHJvdGVjdGVkIGludCBmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4LCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBkZXNjcmlwdGlvbiwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoU3RyaW5nIGxhYmVsLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHNldCB0byBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZWRvQ3Vyc29yUG9zaXRpb24oKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCi0JCWlmIChmUmVkb0N1cnNvclBvc2l0aW9uICE9IC0xKQotCQkJY3Vyc29yUG9zaXRpb24gPSBmUmVkb0N1cnNvclBvc2l0aW9uOwotCQllbHNlIGlmICghY29tbWFuZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlpbnQgY29tbWFuZExpc3RTaXplID0gY29tbWFuZExpc3Quc2l6ZSgpOwotCQkJQ29tbWFuZCBsYXN0Q29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQoY29tbWFuZExpc3RTaXplIC0gMSk7Ci0KLQkJCWlmIChsYXN0Q29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikKLQkJCQljdXJzb3JQb3NpdGlvbiA9ICgoQ29tbWFuZEN1cnNvclBvc2l0aW9uKSBsYXN0Q29tbWFuZCkuZ2V0UmVkb0N1cnNvclBvc2l0aW9uKCk7Ci0JCX0KLQotCQlyZXR1cm4gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVkb1NlbGVjdGlvbkxlbmd0aCgpIHsKLQkJcmV0dXJuIGZSZWRvU2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSBzZXQgdG8gYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VW5kb0N1cnNvclBvc2l0aW9uKCkgewotCQlpbnQgY3Vyc29yUG9zaXRpb24gPSAtMTsKLQotCQlpZiAoZlVuZG9DdXJzb3JQb3NpdGlvbiAhPSAtMSkKLQkJCWN1cnNvclBvc2l0aW9uID0gZlVuZG9DdXJzb3JQb3NpdGlvbjsKLQkJZWxzZSBpZiAoIWNvbW1hbmRMaXN0LmlzRW1wdHkoKSkgewotCQkJLy8gbmV2ZXIgdXNlZAotCQkJLy9pbnQgY29tbWFuZExpc3RTaXplID0gY29tbWFuZExpc3Quc2l6ZSgpOwotCQkJQ29tbWFuZCBmaXJzdENvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KDApOwotCi0JCQlpZiAoZmlyc3RDb21tYW5kIGluc3RhbmNlb2YgQ29tbWFuZEN1cnNvclBvc2l0aW9uKQotCQkJCWN1cnNvclBvc2l0aW9uID0gKChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGZpcnN0Q29tbWFuZCkuZ2V0VW5kb0N1cnNvclBvc2l0aW9uKCk7Ci0JCX0KLQotCQlyZXR1cm4gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VW5kb1NlbGVjdGlvbkxlbmd0aCgpIHsKLQkJcmV0dXJuIGZVbmRvU2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSB1c2VkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVkb0N1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbikgewotCQlmUmVkb0N1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWRvU2VsZWN0aW9uTGVuZ3RoKGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJZlJlZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHVzZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmRvQ3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuZG9TZWxlY3Rpb25MZW5ndGgoaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQlmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbkxlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkZjkyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51bmRvLkNvbW1hbmRDdXJzb3JQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5TdHJ1Y3R1cmVkVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uVW5kb0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB7Ci0KLQljbGFzcyBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyIGltcGxlbWVudHMgQ29tbWFuZFN0YWNrTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlyZXNldEludGVybmFsQ29tbWFuZHMoKTsKLQkJfQotCX0KLQotCWNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIERvIG5vdGhpbmcuIERvIG5vdCBwdXNoIHRoZSBuZXcgbW9kZWwncyBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJCS8vIGNoYW5nZXMKLQkJCS8vIG9udG8gdGhlIHVuZG8gY29tbWFuZCBzdGFjaywgb3IgZWxzZSB0aGUgdXNlciBtYXkgYmUgYWJsZSB0bwotCQkJLy8gdW5kbwotCQkJLy8gYW4gZXhpc3RpbmcgZmlsZSB0byBhbiBlbXB0eSBmaWxlLgotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gU2luY2UgIm5vIGNoYW5nZSIsIGRvIG5vdGhpbmcuCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlwcm9jZXNzU3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJpbmcgdGV4dERlbGV0ZWQsIFN0cmluZyB0ZXh0SW5zZXJ0ZWQsIGludCB0ZXh0U3RhcnQsIGludCB0ZXh0RW5kKSB7Ci0JCQlpZiAoZlRleHRDb21tYW5kICE9IG51bGwgJiYgdGV4dFN0YXJ0ID09IGZUZXh0Q29tbWFuZC5nZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBhcHBlbmQgdG8gdGhlIHRleHQgY29tbWFuZAotCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0RGVsZXRlZChmVGV4dENvbW1hbmQuZ2V0VGV4dERlbGV0ZWQoKS5jb25jYXQodGV4dERlbGV0ZWQpKTsKLQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dEluc2VydGVkKGZUZXh0Q29tbWFuZC5nZXRUZXh0SW5zZXJ0ZWQoKS5jb25jYXQodGV4dEluc2VydGVkKSk7Ci0JCQkJZlRleHRDb21tYW5kLnNldFRleHRFbmQodGV4dEVuZCk7Ci0JCQl9IGVsc2UgaWYgKGZUZXh0Q29tbWFuZCAhPSBudWxsICYmIHRleHRTdGFydCA9PSBmVGV4dENvbW1hbmQuZ2V0VGV4dFN0YXJ0KCkgLSAodGV4dEVuZCAtIHRleHRTdGFydCArIDEpICYmIHRleHRFbmQgPD0gZlRleHRDb21tYW5kLmdldFRleHRFbmQoKSAtICh0ZXh0RW5kIC0gdGV4dFN0YXJ0ICsgMSkgJiYgdGV4dERlbGV0ZWQubGVuZ3RoKCkgPT0gMSAmJiB0ZXh0SW5zZXJ0ZWQubGVuZ3RoKCkgPT0gMCkgewotCQkJCS8vIGJhY2tzcGFjZSBwcmVzc2VkCi0KLQkJCQkvLyBlcmFzZSBhIGNoYXJhY3RlciBqdXN0IGluc2VydGVkCi0JCQkJaWYgKGZUZXh0Q29tbWFuZC5nZXRUZXh0SW5zZXJ0ZWQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJZlRleHRDb21tYW5kLnNldFRleHRJbnNlcnRlZChmVGV4dENvbW1hbmQuZ2V0VGV4dEluc2VydGVkKCkuc3Vic3RyaW5nKDAsIGZUZXh0Q29tbWFuZC5nZXRUZXh0RW5kKCkgLSBmVGV4dENvbW1hbmQuZ2V0VGV4dFN0YXJ0KCkgLSAxKSk7Ci0JCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0RW5kKHRleHRFbmQpOwotCQkJCX0KLQkJCQkvLyBlcmFzZSBhIGNoYXJhY3RlciBpbiB0aGUgZmlsZQotCQkJCWVsc2UgewotCQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dERlbGV0ZWQodGV4dERlbGV0ZWQuY29uY2F0KGZUZXh0Q29tbWFuZC5nZXRUZXh0RGVsZXRlZCgpKSk7Ci0JCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0U3RhcnQodGV4dFN0YXJ0KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZU5ld1RleHRDb21tYW5kKHRleHREZWxldGVkLCB0ZXh0SW5zZXJ0ZWQsIHRleHRTdGFydCwgdGV4dEVuZCk7Ci0JCQl9Ci0KLQkJCS8vIHNhdmUgY3Vyc29yIHBvc2l0aW9uCi0JCQlmQ3Vyc29yUG9zaXRpb24gPSB0ZXh0RW5kOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gTm90ZTogZkxpc3RlbmluZyB0ZWxscyB1cyBpZiB3ZSBzaG91bGQgbGlzdGVuIHRvIHRoZQotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50RXZlbnQuCi0JCQkvLyBmTGlzdGVuaW5nIGlzIHNldCB0byBmYWxzZSByaWdodCBiZWZvcmUgdGhlIHVuZG8vcmVkbyBwcm9jZXNzCi0JCQkvLyBhbmQKLQkJCS8vIHRoZW4gc2V0IHRvIHRydWUgYWdhaW4KLQkJCS8vIHJpZ2h0IGFmdGVyIHRoZSB1bmRvL3JlZG8gcHJvY2VzcyB0byBibG9jayBvdXQgYW5kIGlnbm9yZSBhbGwKLQkJCS8vIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50cyBnZW5lcmF0ZWQKLQkJCS8vIGJ5IHRoZSB1bmRvL3JlZG8gcHJvY2Vzcy4KLQotCQkJLy8gUHJvY2VzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBpZiBmTGlzdGVuaW5nIGlzIHRydWUuCi0JCQkvLwotCQkJLy8gV2UgYXJlIGV4ZWN1dGluZyBhIGNvbW1hbmQgZnJvbSB0aGUgY29tbWFuZCBzdGFjayBpZiB0aGUKLQkJCS8vIHJlcXVlc3RlcgotCQkJLy8gaXMgYSBjb21tYW5kIChmb3IgZXhhbXBsZSwgdW5kby9yZWRvKS4KLQkJCS8vIFdlIHNob3VsZCBub3QgcHJvY2VzcyB0aGUgZmxhdCBtb2RlbCBldmVudCB3aGVuIHdlIGFyZQotCQkJLy8gZXhlY3V0aW5nIGEKLQkJCS8vIGNvbW1hbmQgZnJvbSB0aGUgY29tbWFuZCBzdGFjay4KLQkJCWlmIChmVW5kb01hbmFnZW1lbnRFbmFibGVkICYmICEoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxTb3VyY2UoKSBpbnN0YW5jZW9mIENvbW1hbmQpKSB7Ci0JCQkJLy8gY2hlY2sgcmVxdWVzdGVyIGlmIG5vdCByZWNvcmRpbmcKLQkJCQlpZiAoIWZSZWNvcmRpbmcpCi0JCQkJCWNoZWNrUmVxdWVzdGVyKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsU291cmNlKCkpOwotCi0JCQkJLy8gcHJvY2VzcyB0aGUgc3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkJCQlTdHJpbmcgdGV4dERlbGV0ZWQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXREZWxldGVkVGV4dCgpOwotCQkJCVN0cmluZyB0ZXh0SW5zZXJ0ZWQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRUZXh0KCk7Ci0JCQkJaW50IHRleHRTdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsU3RhcnQoKTsKLQkJCQlpbnQgdGV4dEVuZCA9IHRleHRTdGFydCArIHRleHRJbnNlcnRlZC5sZW5ndGgoKTsKLQkJCQlwcm9jZXNzU3RydWN0dXJlZERvY3VtZW50RXZlbnQodGV4dERlbGV0ZWQsIHRleHRJbnNlcnRlZCwgdGV4dFN0YXJ0LCB0ZXh0RW5kKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlwcm9jZXNzU3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlwcm9jZXNzU3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEFOR0VfVEVYVCA9IFNTRUNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVUZXh0X0NoYW5nZV9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgQ29tbWFuZFN0YWNrIGZDb21tYW5kU3RhY2sgPSBudWxsOwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGZDb21wb3VuZENvbW1hbmQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbXBvdW5kQ29tbWFuZExhYmVsID0gbnVsbDsKLQlpbnQgZkN1cnNvclBvc2l0aW9uID0gMDsKLQkvL3ByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyIGZJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyOwotCS8vcHJpdmF0ZSBNYXAgZlRleHRWaWV3ZXJUb0xpc3RlbmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLQlwcml2YXRlIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW10gZk1lZGlhdG9ycyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZSZWNvcmRpbmcgPSBmYWxzZTsKLQlwcml2YXRlIGludCBmUmVjb3JkaW5nQ291bnQgPSAwOwotCXByaXZhdGUgT2JqZWN0IGZSZXF1ZXN0ZXI7Ci0JU3RydWN0dXJlZFRleHRDb21tYW5kSW1wbCBmVGV4dENvbW1hbmQgPSBudWxsOwotCXByaXZhdGUgaW50IGZVbmRvQ3Vyc29yUG9zaXRpb24gPSAtMTsKLQlib29sZWFuIGZVbmRvTWFuYWdlbWVudEVuYWJsZWQgPSB0cnVlOwotCXByaXZhdGUgaW50IGZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyKCkgewotCQl0aGlzKG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcihDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCXNldENvbW1hbmRTdGFjayhjb21tYW5kU3RhY2spOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCWlmICghVXRpbGl0aWVzLmNvbnRhaW5zKGZNZWRpYXRvcnMsIG1lZGlhdG9yKSkgewotCQkJaW50IG9sZFNpemUgPSAwOwotCi0JCQlpZiAoZk1lZGlhdG9ycyAhPSBudWxsKSB7Ci0JCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yIGZpcnN0Ci0JCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJb2xkU2l6ZSA9IGZNZWRpYXRvcnMubGVuZ3RoOwotCQkJfQotCi0JCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbXSBuZXdNZWRpYXRvcnMgPSBuZXcgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbbmV3U2l6ZV07Ci0JCQlpZiAoZk1lZGlhdG9ycyAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmTWVkaWF0b3JzLCAwLCBuZXdNZWRpYXRvcnMsIDAsIG9sZFNpemUpOwotCQkJfQotCi0JCQkvLyBhZGQgdGhlIG5ldyB1bmRvIG1lZGlhdG9yIHRvIGxhc3QgcG9zaXRpb24KLQkJCW5ld01lZGlhdG9yc1tuZXdTaXplIC0gMV0gPSBtZWRpYXRvcjsKLQotCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJZk1lZGlhdG9ycyA9IG5ld01lZGlhdG9yczsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCQkJYWRkRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcihtZWRpYXRvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbnVsbCwgbnVsbCk7Ci0KLQkJZlVuZG9DdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCQlmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpIHsKLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgbnVsbCk7Ci0KLQkJZlVuZG9DdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCQlmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkvLyBzYXZlIHRoZSByZXF1ZXN0ZXIKLQkJZlJlcXVlc3RlciA9IHJlcXVlc3RlcjsKLQotCQkvLyB1cGRhdGUgbGFiZWwgYW5kIGRlc2Mgb25seSBvbiB0aGUgZmlyc3QgbGV2ZWwgd2hlbiByZWNvcmRpbmcgaXMKLQkJLy8gbmVzdGVkCi0JCWlmIChmUmVjb3JkaW5nQ291bnQgPT0gMCkgewotCQkJZkNvbXBvdW5kQ29tbWFuZExhYmVsID0gbGFiZWw7Ci0JCQlpZiAoZkNvbXBvdW5kQ29tbWFuZExhYmVsID09IG51bGwpCi0JCQkJZkNvbXBvdW5kQ29tbWFuZExhYmVsID0gVEVYVF9DSEFOR0VfVEVYVDsKLQotCQkJZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQlpZiAoZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uID09IG51bGwpCi0JCQkJZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uID0gVEVYVF9DSEFOR0VfVEVYVDsKLQotCQkJLy8gY2xlYXIgY29tbWFuZHMKLQkJCWZUZXh0Q29tbWFuZCA9IG51bGw7Ci0JCQlmQ29tcG91bmRDb21tYW5kID0gbnVsbDsKLQkJfQotCi0JCS8vIHVwZGF0ZSBjb3VudGVyIGFuZCBmbGFnCi0JCWZSZWNvcmRpbmdDb3VudCsrOwotCQlmUmVjb3JkaW5nID0gdHJ1ZTsKLQotCQkvLyBubyB1bmRvIGN1cnNvciBwb3NpdGlvbiBhbmQgdW5kbyBzZWxlY3Rpb24gbGVuZ3RoIHNwZWNpZmllZAotCQkvLyByZXNldCB1bmRvIGN1cnNvciBwb3NpdGlvbiBhbmQgdW5kbyBzZWxlY3Rpb24gbGVuZ3RoCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSAtMTsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0Jdm9pZCBjaGVja1JlcXVlc3RlcihPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCWlmIChmUmVxdWVzdGVyICE9IG51bGwgJiYgIWZSZXF1ZXN0ZXIuZXF1YWxzKHJlcXVlc3RlcikpIHsKLQkJCS8vIEZvcmNlIHJlc3RhcnQgb2YgcmVjb3JkaW5nIHNvIHRoZSBsYXN0IGNvbXBvdW5kIGNvbW1hbmQgaXMKLQkJCS8vIGNsb3NlZC4KLQkJCS8vCi0JCQkvLyBIb3dldmVyLCB3ZSBzaG91bGQgbm90IGZvcmNlIHJlc3RhcnQgb2YgcmVjb3JkaW5nIHdoZW4gdGhlCi0JCQkvLyByZXF1ZXN0IGNhbWUgZnJvbSBTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyIG9yCi0JCQkvLyBYTUxNb2RlbEltcGwKLQkJCS8vIGJlY2F1c2UgY3V0L3Bhc3RlIHJlcXVlc3RzIGFuZCBjaGFyYWN0ZXIgaW5zZXJ0cyB0byB0aGUKLQkJCS8vIHRleHRWaWV3ZXIgYXJlIGZyb20gU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlciwKLQkJCS8vIGFuZCByZXF1ZXN0cyB0byBkZWxldGUgYSBub2RlIGluIHRoZSBYTUxUYWJsZVRyZWVWaWV3ZXIgYXJlCi0JCQkvLyBmcm9tIFhNTE1vZGVsSW1wbCAod2hpY2ggaW1wbGVtZW50cyBJU3RydWN0dXJlZE1vZGVsKS4KLQotCQkJaWYgKCEocmVxdWVzdGVyIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRNb2RlbCB8fCByZXF1ZXN0ZXIgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSkgewotCQkJCXJlc2V0SW50ZXJuYWxDb21tYW5kcygpOwotCQkJfQotCQl9Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgbWVkaWF0b3IpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChtZWRpYXRvcik7Ci0JCWlmIChmRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJLy8gYWRkIHRoaXMgdW5kbyBtYW5hZ2VyIGFzIHN0cnVjdHVyZWQgZG9jdW1lbnQgbGlzdGVuZXIKLQkJCWZEb2N1bWVudCA9IG1lZGlhdG9yLmdldERvY3VtZW50KCk7Ci0JCQkvLyBmdXR1cmVfVE9ETzogZXZlbnR1YWxseSB3ZSB3YW50IHRvIHJlZmFjdG9yIG9yIGFsbG93IGVpdGhlcgotCQkJLy8gdHlwZSBvZiBkb2N1bWVudCwgYnV0IGZvciBub3csIHdlJ2xsIGRvIGluc3RhbmNlb2YgY2hlY2ssIGFuZAotCQkJLy8gZmFpbAotCQkJLy8gaWYgbm90IHJpZ2h0IHR5cGUKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGdldEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9ubHkgbWVkaXRhdG9yIHdpdGggc3RydWN0dXJlZCBkb2N1bWVudHMgY3VycmVudGx5IGhhbmRsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gaWYgd2UndmUgYWxyZWFkeSBoYWQgb3VyIGRvY3VtZW50IHNldCwgd2UnbGwganVzdCBkbyB0aGlzIGZhaWwKLQkJCS8vIGZhc3QgaW50ZWdyaXR5IGNoZWNrCi0JCQlpZiAoIWZEb2N1bWVudC5lcXVhbHMobWVkaWF0b3IuZ2V0RG9jdW1lbnQoKSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29ubmVjdGlvbiB0byB1bmRvIG1hbmFnZXIgZmFpbGVkLiBEb2N1bWVudCBmb3IgZG9jdW1lbnQgc2VsZWN0aW9uIG1lZGlhdG9yIGluY29uaXN0ZW50IHdpdGggdW5kbyBtYW5hZ2VyLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlhZGREb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQl9Ci0KLQl2b2lkIGNyZWF0ZU5ld1RleHRDb21tYW5kKFN0cmluZyB0ZXh0RGVsZXRlZCwgU3RyaW5nIHRleHRJbnNlcnRlZCwgaW50IHRleHRTdGFydCwgaW50IHRleHRFbmQpIHsKLQkJU3RydWN0dXJlZFRleHRDb21tYW5kSW1wbCB0ZXh0Q29tbWFuZCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsKGZEb2N1bWVudCk7Ci0JCXRleHRDb21tYW5kLnNldExhYmVsKFRFWFRfQ0hBTkdFX1RFWFQpOwotCQl0ZXh0Q29tbWFuZC5zZXREZXNjcmlwdGlvbihURVhUX0NIQU5HRV9URVhUKTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dFN0YXJ0KHRleHRTdGFydCk7Ci0JCXRleHRDb21tYW5kLnNldFRleHRFbmQodGV4dEVuZCk7Ci0JCXRleHRDb21tYW5kLnNldFRleHREZWxldGVkKHRleHREZWxldGVkKTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dEluc2VydGVkKHRleHRJbnNlcnRlZCk7Ci0KLQkJaWYgKGZSZWNvcmRpbmcpIHsKLQkJCWlmIChmQ29tcG91bmRDb21tYW5kID09IG51bGwpIHsKLQkJCQlTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29tcG91bmRDb21tYW5kID0gbmV3IFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCgpOwotCQkJCWNvbXBvdW5kQ29tbWFuZC5zZXRVbmRvQ3Vyc29yUG9zaXRpb24oZlVuZG9DdXJzb3JQb3NpdGlvbik7Ci0JCQkJY29tcG91bmRDb21tYW5kLnNldFVuZG9TZWxlY3Rpb25MZW5ndGgoZlVuZG9TZWxlY3Rpb25MZW5ndGgpOwotCi0JCQkJY29tcG91bmRDb21tYW5kLnNldExhYmVsKGZDb21wb3VuZENvbW1hbmRMYWJlbCk7Ci0JCQkJY29tcG91bmRDb21tYW5kLnNldERlc2NyaXB0aW9uKGZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbik7Ci0JCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZCh0ZXh0Q29tbWFuZCk7Ci0JCQkJZkNvbW1hbmRTdGFjay5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0KLQkJCQlmQ29tcG91bmRDb21tYW5kID0gY29tcG91bmRDb21tYW5kOwotCQkJfSBlbHNlIHsKLQkJCQlmQ29tcG91bmRDb21tYW5kLmFwcGVuZCh0ZXh0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmQ29tbWFuZFN0YWNrLmV4ZWN1dGUodGV4dENvbW1hbmQpOwotCQl9Ci0KLQkJZlRleHRDb21tYW5kID0gdGV4dENvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogRGlzYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCQlmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQotCQlpZiAoZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID09IDAgJiYgZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQkvLyBmdXR1cmVfVE9ETzogZXZlbnR1YWxseSB3ZSB3YW50IHRvIHJlZmFjdG9yIG9yIGFsbG93IGVpdGhlcgotCQkJLy8gdHlwZSBvZiBkb2N1bWVudCwgYnV0IGZvciBub3csIHdlJ2xsIGRvIGluc3RhbmNlb2YgY2hlY2ssIGFuZAotCQkJLy8gZmFpbAotCQkJLy8gaWYgbm90IHJpZ2h0IHR5cGUKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGdldEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9ubHkgbWVkaXRhdG9yIHdpdGggc3RydWN0dXJlZCBkb2N1bWVudHMgY3VycmVudGx5IGhhbmRsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gaWYgbm8gbG9uZ2VyIGxpc3RlbmluZyB0byBkb2N1bWVudCwgdGhlbiBkb250IGV2ZW4gdHJhY2sgaXQKLQkJCS8vIGFueW1vcmUKLQkJCS8vICh0aGlzIGFsbG93cyBjb25uZWN0IHRvIHJlY29ubmVjdCB0byBkb2N1bWVudCBhZ2FpbikKLQkJCWZEb2N1bWVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVVbmRvTWFuYWdlbWVudCgpIHsKLQkJZlVuZG9NYW5hZ2VtZW50RW5hYmxlZCA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIpIHsKLQkJaW50IGN1cnNvclBvc2l0aW9uID0gKGZUZXh0Q29tbWFuZCAhPSBudWxsKSA/IGZUZXh0Q29tbWFuZC5nZXRUZXh0RW5kKCkgOiAtMTsKLQkJaW50IHNlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQkJZW5kUmVjb3JkaW5nKHJlcXVlc3RlciwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQkvLyBSZWNvcmRpbmcgY291bGQgYmUgc3RvcHBlZCBieSBmb3JjZUVuZE9mUGVuZGluZ0NvbW1hbmQoKS4gTWFrZSBzdXJlCi0JCS8vIHdlIGFyZSBzdGlsbCByZWNvcmRpbmcgYmVmb3JlIHByb2NlZWRpbmcsIG9yIGVsc2UgZlJlY29yZGluZ0NvdW50Ci0JCS8vIG1heSBub3QgYmUgYmFsYW5jZWQuCi0JCWlmIChmUmVjb3JkaW5nKSB7Ci0JCQlpZiAoZkNvbXBvdW5kQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJZkNvbXBvdW5kQ29tbWFuZC5zZXRSZWRvQ3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zaXRpb24pOwotCQkJCWZDb21wb3VuZENvbW1hbmQuc2V0UmVkb1NlbGVjdGlvbkxlbmd0aChzZWxlY3Rpb25MZW5ndGgpOwotCQkJfQotCi0JCQkvLyBlbmQgcmVjb3JkaW5nIGlzIGEgbG9naWNhbCBzdG9wcGluZyBwb2ludCBmb3IgdGV4dCBjb21tYW5kLAotCQkJLy8gZXZlbiB3aGVuIGZSZWNvcmRpbmdDb3VudCA+IDAgKGluIG5lc3RlZCBiZWdpblJlY29yZGluZykKLQkJCWZUZXh0Q29tbWFuZCA9IG51bGw7Ci0KLQkJCS8vIHVwZGF0ZSBjb3VudGVyIGFuZCBmbGFnCi0JCQlpZiAoZlJlY29yZGluZ0NvdW50ID4gMCkKLQkJCQlmUmVjb3JkaW5nQ291bnQtLTsKLQkJCWlmIChmUmVjb3JkaW5nQ291bnQgPT0gMCkgewotCQkJCWZSZWNvcmRpbmcgPSBmYWxzZTsKLQotCQkJCS8vIHJlc2V0IGNvbXBvdW5kIGNvbW1hbmQgb25seSB3aGVuIGZSZWNvcmRpbmdDb3VudCA9PQotCQkJCS8vIDAKLQkJCQlmQ29tcG91bmRDb21tYW5kID0gbnVsbDsKLQkJCQlmQ29tcG91bmRDb21tYW5kTGFiZWwgPSBudWxsOwotCQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IG51bGw7Ci0KLQkJCQkvLyBBbHNvIHJlc2V0IGZSZXF1ZXN0ZXIKLQkJCQlmUmVxdWVzdGVyID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIGZpbmQgbW9kZWwgZ2l2ZW4gZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZmluZFN0cnVjdHVyZWRNb2RlbChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkTW9kZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciNmb3JjZUVuZE9mUGVuZGluZ0NvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcmNlRW5kT2ZQZW5kaW5nQ29tbWFuZChPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3VycmVudFBvc2l0aW9uLCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChmUmVjb3JkaW5nKQotCQkJZW5kUmVjb3JkaW5nKHJlcXVlc3RlciwgY3VycmVudFBvc2l0aW9uLCBsZW5ndGgpOwotCQllbHNlCi0JCQlyZXNldEludGVybmFsQ29tbWFuZHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyI2dldENvbW1hbmRTdGFjaygpCi0JICovCi0JcHVibGljIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbW1hbmRTdGFja0xpc3RlbmVyIGdldEludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCWlmIChmSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBnZXRJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCkgewotCQlpZiAoZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBnZXRSZWRvQ29tbWFuZCgpIHsKLQkJcmV0dXJuIGZDb21tYW5kU3RhY2suZ2V0UmVkb0NvbW1hbmQoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBnZXRVbmRvQ29tbWFuZCgpIHsKLQkJcmV0dXJuIGZDb21tYW5kU3RhY2suZ2V0VW5kb0NvbW1hbmQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlyZWRvKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgcmVxdWVzdGVyKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBmaW5kU3RydWN0dXJlZE1vZGVsKGZEb2N1bWVudCk7Ci0JCWlmIChyZWRvYWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCUNvbW1hbmQgcmVkb0NvbW1hbmQgPSBnZXRSZWRvQ29tbWFuZCgpOwotCi0JCQkJLy8gbWFrZSBzdXJlIHRvIHJlZG8gYmVmb3JlIHNldHRpbmcgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJZkNvbW1hbmRTdGFjay5yZWRvKCk7Ci0KLQkJCQkvLyBzZXQgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJc2V0UmVkb0RvY3VtZW50U2VsZWN0aW9uKHJlcXVlc3RlciwgcmVkb0NvbW1hbmQpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVkb2FibGUoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmNhblJlZG8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcihJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlpZiAoZk1lZGlhdG9ycyAhPSBudWxsICYmIG1lZGlhdG9yICE9IG51bGwpIHsKLQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGFycmF5LCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZk1lZGlhdG9ycywgbWVkaWF0b3IpKSB7Ci0JCQkJaW50IG9sZFNpemUgPSBmTWVkaWF0b3JzLmxlbmd0aDsKLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCUlEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW10gbmV3TWVkaWF0b3JzID0gbmV3IElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW25ld1NpemVdOwotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJaWYgKGZNZWRpYXRvcnNbaV0gPT0gbWVkaWF0b3IpIHsgLy8gaWdub3JlCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUgb25lIHdlIGFyZSByZW1vdmluZwotCQkJCQkJbmV3TWVkaWF0b3JzW2luZGV4KytdID0gZk1lZGlhdG9yc1tpXTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZSBvbGQKLQkJCQkvLyBvbmUKLQkJCQlmTWVkaWF0b3JzID0gbmV3TWVkaWF0b3JzOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCByZXNldEludGVybmFsQ29tbWFuZHMoKSB7Ci0JCS8vIEVpdGhlciB0aGUgcmVxdWVzdGVyIG9mIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IGNoYW5nZSBldmVudCBpcwotCQkvLyBjaGFuZ2VkLCBvciB0aGUgY29tbWFuZCBzdGFjayBpcyBjaGFuZ2VkLiBOZWVkIHRvIHJlc2V0IGludGVybmFsCi0JCS8vIGNvbW1hbmRzIHNvIHdlIHdvbid0IGNvbnRpbnVlIHRvIGFwcGVuZCBjaGFuZ2VzLgotCQlmQ29tcG91bmRDb21tYW5kID0gbnVsbDsKLQkJZlRleHRDb21tYW5kID0gbnVsbDsKLQotCQkvLyBBbHNvIHJlc2V0IGZSZXF1ZXN0ZXIKLQkJZlJlcXVlc3RlciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tbWFuZFN0YWNrKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLQkJaWYgKGZDb21tYW5kU3RhY2sgIT0gbnVsbCkKLQkJCWZDb21tYW5kU3RhY2sucmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIoZ2V0SW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpKTsKLQotCQlmQ29tbWFuZFN0YWNrID0gY29tbWFuZFN0YWNrOwotCi0JCWlmIChmQ29tbWFuZFN0YWNrICE9IG51bGwpCi0JCQlmQ29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKGdldEludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlZG9Eb2N1bWVudFNlbGVjdGlvbihJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIsIENvbW1hbmQgY29tbWFuZCkgewotCQlpbnQgY3Vyc29yUG9zaXRpb24gPSAtMTsKLQkJaW50IHNlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21tYW5kQ3Vyc29yUG9zaXRpb24pIHsKLQkJCUNvbW1hbmRDdXJzb3JQb3NpdGlvbiBjb21tYW5kQ3Vyc29yUG9zaXRpb24gPSAoQ29tbWFuZEN1cnNvclBvc2l0aW9uKSBjb21tYW5kOwotCQkJY3Vyc29yUG9zaXRpb24gPSBjb21tYW5kQ3Vyc29yUG9zaXRpb24uZ2V0UmVkb0N1cnNvclBvc2l0aW9uKCk7Ci0JCQlzZWxlY3Rpb25MZW5ndGggPSBjb21tYW5kQ3Vyc29yUG9zaXRpb24uZ2V0UmVkb1NlbGVjdGlvbkxlbmd0aCgpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Q29tbWFuZCBzdHJ1Y3R1cmVkVGV4dENvbW1hbmQgPSAoU3RydWN0dXJlZFRleHRDb21tYW5kKSBjb21tYW5kOwotCQkJY3Vyc29yUG9zaXRpb24gPSBzdHJ1Y3R1cmVkVGV4dENvbW1hbmQuZ2V0VGV4dFN0YXJ0KCk7Ci0JCQlzZWxlY3Rpb25MZW5ndGggPSBzdHJ1Y3R1cmVkVGV4dENvbW1hbmQuZ2V0VGV4dEluc2VydGVkKCkubGVuZ3RoKCk7Ci0JCX0KLQotCQlpZiAoY3Vyc29yUG9zaXRpb24gPiAtMSAmJiBmTWVkaWF0b3JzICE9IG51bGwgJiYgZk1lZGlhdG9ycy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZNZWRpYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBmTWVkaWF0b3JzW2ldLmdldERvY3VtZW50KCk7Ci0JCQkJZk1lZGlhdG9yc1tpXS51bmRvT3BlcmF0aW9uU2VsZWN0aW9uQ2hhbmdlZChuZXcgVW5kb0RvY3VtZW50RXZlbnQocmVxdWVzdGVyLCBkb2N1bWVudCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFVuZG9Eb2N1bWVudFNlbGVjdGlvbihJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIsIENvbW1hbmQgY29tbWFuZCkgewotCQlpbnQgY3Vyc29yUG9zaXRpb24gPSAtMTsKLQkJaW50IHNlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21tYW5kQ3Vyc29yUG9zaXRpb24pIHsKLQkJCUNvbW1hbmRDdXJzb3JQb3NpdGlvbiBjb21tYW5kQ3Vyc29yUG9zaXRpb24gPSAoQ29tbWFuZEN1cnNvclBvc2l0aW9uKSBjb21tYW5kOwotCQkJY3Vyc29yUG9zaXRpb24gPSBjb21tYW5kQ3Vyc29yUG9zaXRpb24uZ2V0VW5kb0N1cnNvclBvc2l0aW9uKCk7Ci0JCQlzZWxlY3Rpb25MZW5ndGggPSBjb21tYW5kQ3Vyc29yUG9zaXRpb24uZ2V0VW5kb1NlbGVjdGlvbkxlbmd0aCgpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Q29tbWFuZCBzdHJ1Y3R1cmVkVGV4dENvbW1hbmQgPSAoU3RydWN0dXJlZFRleHRDb21tYW5kKSBjb21tYW5kOwotCQkJY3Vyc29yUG9zaXRpb24gPSBzdHJ1Y3R1cmVkVGV4dENvbW1hbmQuZ2V0VGV4dFN0YXJ0KCk7Ci0JCQlzZWxlY3Rpb25MZW5ndGggPSBzdHJ1Y3R1cmVkVGV4dENvbW1hbmQuZ2V0VGV4dERlbGV0ZWQoKS5sZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjdXJzb3JQb3NpdGlvbiA+IC0xICYmIGZNZWRpYXRvcnMgIT0gbnVsbCAmJiBmTWVkaWF0b3JzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZk1lZGlhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGZNZWRpYXRvcnNbaV0uZ2V0RG9jdW1lbnQoKTsKLQkJCQlmTWVkaWF0b3JzW2ldLnVuZG9PcGVyYXRpb25TZWxlY3Rpb25DaGFuZ2VkKG5ldyBVbmRvRG9jdW1lbnRFdmVudChyZXF1ZXN0ZXIsIGRvY3VtZW50LCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQl1bmRvKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgcmVxdWVzdGVyKSB7Ci0JCS8vIEZvcmNlIGFuIGVuZFJlY29yZGluZyBiZWZvcmUgdW5kby4KLQkJLy8KLQkJLy8gRm9yIGV4YW1wbGUsIHJlY29yZGluZyB3YXMgdHVybmVkIG9uIG9uIHRoZSBEZXNpZ24gUGFnZSBvZgotCQkvLyBQYWdlRGVzaWduZXIuCi0JCS8vIFRoZW4gdW5kbyBpcyBpbnZva2VkIG9uIHRoZSBTb3VyY2UgUGFnZS4gUmVjb3JkaW5nIHNob3VsZCBiZQotCQkvLyBzdG9wcGVkIGJlZm9yZSB3ZSB1bmRvLgotCQkvLyBOb3RlIHRoYXQgcmVkbyBzaG91bGQgbm90IGJlIGF2YWlsYWJsZSB3aGVuIHdlIHN3aXRjaCB0byB0aGUgU291cmNlCi0JCS8vIFBhZ2UuCi0JCS8vIFRoZXJlZm9yZSwgdGhpcyBmb3JjZSBlbmRpbmcgb2YgcmVjb3JkaW5nIGlzIG5vdCBuZWVkZWQgaW4gcmVkby4KLQkJaWYgKGZSZWNvcmRpbmcpCi0JCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0KLQkJaWYgKHVuZG9hYmxlKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBmaW5kU3RydWN0dXJlZE1vZGVsKGZEb2N1bWVudCk7Ci0JCQl0cnkgewotCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCUNvbW1hbmQgdW5kb0NvbW1hbmQgPSBnZXRVbmRvQ29tbWFuZCgpOwotCi0JCQkJLy8gbWFrZSBzdXJlIHRvIHVuZG8gYmVmb3JlIHNldHRpbmcgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJZkNvbW1hbmRTdGFjay51bmRvKCk7Ci0KLQkJCQkvLyBzZXQgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKHJlcXVlc3RlciwgdW5kb0NvbW1hbmQpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdW5kb2FibGUoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmNhblVuZG8oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL21vZGVsaGFuZGxlci9BYnN0cmFjdE1vZGVsSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9tb2RlbGhhbmRsZXIvQWJzdHJhY3RNb2RlbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmYWEyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL21vZGVsaGFuZGxlci9BYnN0cmFjdE1vZGVsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5QbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWxIYW5kbGVyIGltcGxlbWVudHMgSU1vZGVsSGFuZGxlciB7Ci0JcHJpdmF0ZSBTdHJpbmcgYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRTZXR0aW5nOwotCXByaXZhdGUgU3RyaW5nIG1vZGVsSGFuZGxlcklEOwotCi0JLy8gWFhYOiBjYW4gYmUgcmVtb3ZlZCBvbmNlIHdlIHRyYW5zaXRpb24gY29tcGxldGVseQotCXByb3RlY3RlZCBib29sZWFuIFVTRV9GSUxFX0JVRkZFUlMgPSBmYWxzZTsKLQotCXB1YmxpYyBBYnN0cmFjdE1vZGVsSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVzZSBmYWN0b3JpZXMgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgbW9kZWwgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIGhvbGRGYWN0b3JpZXMgPSBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3JpZXModGhpcyk7Ci0JCWlmIChob2xkRmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCXJlc3VsdC5hZGRBbGwoaG9sZEZhY3Rvcmllcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCkgewotCQlyZXR1cm4gYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gbW9kZWxIYW5kbGVySUQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmYXVsdFNldHRpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQgPSBjb250ZW50VHlwZUlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoYm9vbGVhbiBkZWZhdWx0UGFyYW0pIHsKLQkJZGVmYXVsdFNldHRpbmcgPSBkZWZhdWx0UGFyYW07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCW1vZGVsSGFuZGxlcklEID0gaWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzFjNTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGVkVHlwZUhhbmRsZXIgewotCi0JLyoqCi0JICogVGhlc2UgQWRhcHRlckZhY3RvcmllcyBhcmUgTk9UIGFkZGVkIHRvIElTdHJ1Y3R1cmVkTW9kZWwncwotCSAqIEFkYXB0ZXJGYWN0b3J5IFJlZ2lzdHJ5IC4uLiB0aGV5IGFyZSBmb3IgdXNlIGJ5ICJKU1AgQXdhcmUKLQkgKiBBZGFwdGVyRmFjdG9yaWVzIiBUaGUgYXJlIGFkZGVkIHRvIHRoZSAicmVnaXN0cnkiIGluIHRoZQotCSAqIFBhZ2VEaXJlY3RpdmVBZGFwdGVyLgotCSAqLwotCUxpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb250ZW50IHR5cGUgZmFtaWx5IHRoaXMKLQkgKiBDb250ZW50VHlwZURlc2NyaXB0aW9uIGJlbG9uZ3MgdG8uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGYW1pbHlJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbWltZSB0eWVwcyAoYXMgU3RyaW5ncykgdGhpcyBoYW5kbGVyIGlzIGFwcHJvcHJpYXRlCi0JICogZm9yCi0JICovCi0JTGlzdCBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHRvIGdpdmUgdGhlIEVtYmVkZGVkQ29udGVudFR5cGUgYW4gb3Bwb3J0dW5pdHkgdG8gYWRkCi0JICogZmFjdG9yaWVzIGRpcmVjdGx5IHRvIHRoZSBJU3RydWN0dXJlZE1vZGVsJ3MgQWRhcHRlckZhY3RvcnkgcmVnaXN0cnkuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KElGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpOwotCi0JLyoqCi0JICogaW5pdGlhbGl6ZVBhcnNlciBJdHMgcHVycG9zZSBpcyB0byBzZXRCbG9ja1RhZ3MKLQkgKi8KLQl2b2lkIGluaXRpYWxpemVQYXJzZXIoSlNQQ2FwYWJsZVBhcnNlciBwYXJzZXIpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQotCXB1YmxpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0luc3RhbmNlKCk7Ci0KLQl2b2lkIHVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShJRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLQotCXZvaWQgdW5pbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvbW9kZWxoYW5kbGVyL0lEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL21vZGVsaGFuZGxlci9JRG9jdW1lbnRUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTU4OTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvbW9kZWxoYW5kbGVyL0lEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGFsbG93IGN1c3RvbSBjb250ZW50IHR5cGVzIHRvIGJlIGRlZmluZWQgYXMgZXh0ZW5zaW9uIHBvaW50cwotICogaW4gcGx1Z2lucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRUeXBlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBUaGUgTG9hZGVyIGlzIHJlcG9uc2libGUgZm9yIGRlY29kaW5nIHRoZSBSZXNvdXJjZSwKLQkgKi8KLQlJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gbGlrZWx5IHRvIGdvIGF3YXksIHNvIEkgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8KLQkgKiAgICAgICAgICAgICBkaXNjb3Vyc2FnZSB1c2UKLQkgKi8KLQlJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpOwotCi0JLyoqCi0JICogTXVzdCByZXR1cm4gdW5pcXVlIElEIHRoYXQgaXMgdGhlIHNhbWUgYXMgaWRlbnRpZmllZCBpbiBwbHVnaW4gcmVnaXN0cnkKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvbW9kZWxoYW5kbGVyL0lNb2RlbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvbW9kZWxoYW5kbGVyL0lNb2RlbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0MWNhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL21vZGVsaGFuZGxlci9JTW9kZWxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Nb2RlbExvYWRlcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEhhbmRsZXIgZXh0ZW5kcyBJRG9jdW1lbnRUeXBlSGFuZGxlciB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBGYWN0b3JpZXMgd2hpY2ggYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHkgYnkKLQkgKiBJTW9kZWxNYW5hZ2VyLiBUaGlzIGNhbiBhbmQgd2lsbCBvZnRlbiBiZSBhbiBlbXB0eSBMaXN0IChvciBudWxsKSwKLQkgKiBzaW5jZSBzb21lIEFkYXB0ZXJGYWN0b3JpZXMgbXVzdCBiZSBhZGRlZCBieSBMb2FkZXIgZGlyZWN0bHksIGFuZCBtb3N0Ci0JICogc2hvdWxkIGJlIGFkZGVkIGJ5IEVkaXRvcnMuIEZvcm1hdEFkYXB0ZXJGYWN0b3J5IGlzIGFuIGV4YW1wbGUgb2Ygb25lCi0JICogdGhhdCBjYW4gYmUgcmV0dXJuZWQgaGVyZSwgc2luY2UgdGhlIHRpbWluZyBvZiBhZGRpbmcgaXQgaXMgbm90Ci0JICogY3JpdGljYWwsIGJ1dCBpdCBtYXkgYmUgbmVlZGVkIGV2ZW4gd2hlbiBhbiBlZGl0b3IgaXMgbm90IGJlaW5nIHVzZWQuCi0JICovCi0JTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRCBmb3IgdGhlIGFzc29jaWF0ZWQgQ29udGVudFR5cGVIYW5kbGVyIEJ1dCBpcyBuZWVkZWQgZm9yCi0JICogbm93LgotCSAqLwotCVN0cmluZyBnZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCi0JLyoqCi0JICogVGhlIExvYWRlciBpcyByZXBvbnNpYmxlIGZvciBkZWNvZGluZyB0aGUgUmVzb3VyY2UsCi0JICovCi0JTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKTsKLQotCWJvb2xlYW4gaXNEZWZhdWx0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjMzOWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIudXRpbC5JZFJlc29sdmVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKTsKLQotCXB1YmxpYyBJZFJlc29sdmVyIGdldElkUmVzb2x2ZXIoKTsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoKTsKLQotCXZvaWQgcmVsZWFzZSgpOwotCi0Jdm9pZCBzZXRJZFJlc29sdmVyKElkUmVzb2x2ZXIgbmV3SWRSZXNvbHZlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MmM1NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLklkUmVzb2x2ZXI7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGVsUXVlcnlBZGFwdGVyIHsKLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZTsKLQlwcm90ZWN0ZWQgSWRSZXNvbHZlciBpZFJlc29sdmVyOwotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckltcGwoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5LCBJZFJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJdGhpcy5jbURvY3VtZW50Q2FjaGUgPSBjbURvY3VtZW50Q2FjaGU7Ci0JCXRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnk7Ci0JCXRoaXMuaWRSZXNvbHZlciA9IGlkUmVzb2x2ZXI7Ci0JfQotCi0JcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKSB7Ci0JCXJldHVybiBjbURvY3VtZW50Q2FjaGU7Ci0JfQotCi0JcHVibGljIElkUmVzb2x2ZXIgZ2V0SWRSZXNvbHZlcigpIHsKLQkJcmV0dXJuIGlkUmVzb2x2ZXI7Ci0JfQotCi0JcHVibGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeSgpIHsKLQkJcmV0dXJuIG1vZGVsUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZGVsUXVlcnlBZGFwdGVyI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb2RlbFF1ZXJ5QWRhcHRlciNzZXRJZFJlc29sdmVyKElkUmVzb2x2ZXIpCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRJZFJlc29sdmVyKElkUmVzb2x2ZXIgbmV3SWRSZXNvbHZlcikgewotCQlpZFJlc29sdmVyID0gbmV3SWRSZXNvbHZlcjsKLQkJaWYgKG1vZGVsUXVlcnkgaW5zdGFuY2VvZiBNb3ZhYmxlTW9kZWxRdWVyeSkKLQkJCSgoTW92YWJsZU1vZGVsUXVlcnkpIG1vZGVsUXVlcnkpLnNldElkUmVzb2x2ZXIobmV3SWRSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9tb2RlbHF1ZXJ5L01vdmFibGVNb2RlbFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL21vZGVscXVlcnkvTW92YWJsZU1vZGVsUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxM2M1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL21vZGVscXVlcnkvTW92YWJsZU1vZGVsUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIudXRpbC5JZFJlc29sdmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIE1vdmFibGVNb2RlbFF1ZXJ5IGV4dGVuZHMgTW9kZWxRdWVyeSB7Ci0KLQl2b2lkIHNldElkUmVzb2x2ZXIoSWRSZXNvbHZlciBuZXdJZFJlc29sdmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL0Jsb2NrTWFya2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3BhcnNlci9CbG9ja01hcmtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjNhZGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL0Jsb2NrTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgQmxvY2tNYXJrZXIgZXh0ZW5kcyBUYWdNYXJrZXIgewotCi0JLy8gYWxsb3cgZm9yIEpTUCBleHByZXNzaW9ucyB3aXRoaW4gdGhlIGJsb2NrCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkFsbG93SlNQID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGZDYXNlU2Vuc2l0aXZlID0gZmFsc2U7Ci0KLQkvLyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdGFnIChCTE9DS19URVhULCBKU1BfQ09OVEVOVCwKLQkvLyBldGMuKQotCXByb3RlY3RlZCBTdHJpbmcgZkNvbnRleHQ7Ci0KLQkvKioKLQkgKiBJdCdzIG5vdCBhcHByb3ByaWF0ZSB0byBtYWtlICJlbXB0eSIgQmxvY2tNYXJrZXIsIHNvIHdlJ2xsIG1hcmsgYXMKLQkgKiBwcml2YXRlLgotCSAqLwotCXByaXZhdGUgQmxvY2tNYXJrZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lLCBJVGV4dFJlZ2lvbiBtYXJrZXIsIFN0cmluZyBjb250ZXh0KSB7Ci0JCXRoaXModGFnTmFtZSwgbWFya2VyLCBjb250ZXh0LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUsIElUZXh0UmVnaW9uIG1hcmtlciwgU3RyaW5nIGNvbnRleHQsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQl0aGlzKHRhZ05hbWUsIG1hcmtlciwgY29udGV4dCwgY2FzZVNlbnNpdGl2ZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lLCBJVGV4dFJlZ2lvbiBtYXJrZXIsIFN0cmluZyBjb250ZXh0LCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gYWxsb3dKU1ApIHsKLQkJc3VwZXIodGFnTmFtZSwgbWFya2VyKTsKLQkJc2V0Q29udGV4dChjb250ZXh0KTsKLQkJc2V0Q2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKLQkJc2V0QWxsb3dKU1AoYWxsb3dKU1ApOwotCX0KLQotCXB1YmxpYyBCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSwgU3RyaW5nIHJlZ2lvbkNvbnRleHQsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQl0aGlzKHRhZ05hbWUsIG51bGwsIHJlZ2lvbkNvbnRleHQsIGNhc2VTZW5zaXRpdmUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhbGxvd0pTUC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWxsb3dzSlNQKCkgewotCQlyZXR1cm4gZkFsbG93SlNQOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRleHQuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gZkNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gZkNhc2VTZW5zaXRpdmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWxsb3dKU1AuCi0JICogCi0JICogQHBhcmFtIGFsbG93SlNQCi0JICogICAgICAgICAgICBUaGUgYWxsb3dKU1AgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dKU1AoYm9vbGVhbiBhbGxvd0pTUCkgewotCQlmQWxsb3dKU1AgPSBhbGxvd0pTUDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gc2Vuc2l0aXZlKSB7Ci0JCWZDYXNlU2Vuc2l0aXZlID0gc2Vuc2l0aXZlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIFRoZSBjb250ZXh0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJZkNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvQmxvY2tUYWdQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL0Jsb2NrVGFnUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNTMyM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvQmxvY2tUYWdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlcjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBCbG9ja1RhZ1BhcnNlciB7Ci0KLQl2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcik7Ci0KLQl2b2lkIGJlZ2luQmxvY2tTY2FuKFN0cmluZyB0YWdOYW1lKTsKLQotCUJsb2NrTWFya2VyIGdldEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKTsKLQotCUxpc3QgZ2V0QmxvY2tNYXJrZXJzKCk7Ci0KLQl2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcik7Ci0KLQl2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL0Jsb2NrVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3BhcnNlci9CbG9ja1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDhmOWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL0Jsb2NrVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBCbG9ja1Rva2VuaXplciB7Ci0KLQl2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcik7Ci0KLQl2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgY29udGV4dCk7Ci0KLQl2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKTsKLQotCUxpc3QgZ2V0QmxvY2tNYXJrZXJzKCk7Ci0KLQlJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlpbnQgZ2V0T2Zmc2V0KCk7Ci0KLQlib29sZWFuIGlzRU9GKCk7Ci0KLQlCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpOwotCi0Jdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpOwotCi0Jdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSk7Ci0KLQl2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpOwotCi0Jdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KTsKLQotCXZvaWQgcmVzZXQoSW5wdXRTdHJlYW0gaW4pOwotCi0Jdm9pZCByZXNldChJbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCk7Ci0KLQl2b2lkIHJlc2V0KFJlYWRlciBpbik7Ci0KLQl2b2lkIHJlc2V0KFJlYWRlciBpbiwgaW50IG5ld09mZnNldCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3BhcnNlci9JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyYmM2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3BhcnNlci9JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLyoqCi0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZSgpOwotCi0Jdm9pZCBzZXRQYXJ0aXRpb25UeXBlKFN0cmluZyBwYXJ0aXRpb25UeXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL0pTUENhcGFibGVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL0pTUENhcGFibGVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4Mzk0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3BhcnNlci9KU1BDYXBhYmxlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBKU1BDYXBhYmxlUGFyc2VyIGV4dGVuZHMgUmVnaW9uUGFyc2VyLCBCbG9ja1RhZ1BhcnNlciB7Ci0Jdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKTsKLQotCS8qKgotCSAqIHJldHVybnMgdGhlIFRhZ01hcmtlcnMgZm9yIHByZWZpeGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgbmVzdGFibGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCk7Ci0KLQl2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyB0YWdOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL1JlZ2lvblBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvUmVnaW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNWZiYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvUmVnaW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUmVnaW9uUGFyc2VyIHsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0KLQlMaXN0IGdldFJlZ2lvbnMoKTsKLQotCS8qKgotCSAqIFRoZSAnbmV3SW5zdGFuY2UnIG1ldGhvZCBpcyBzaW1pbGFyIHRvICdjbG9uZScsIGJ1dCBkb2VzIG5vdCBpbmNsdWRlCi0JICogdGhlIGNvcHlpbmcgb2YgYW55IGNvbnRlbnQuIEZvciBhIHB1cmUgUmVnaW9uUGFyc2VyIGl0c2VsZiwgdGhlcmUgd291bGQKLQkgKiBiZSBsaXR0bGUgc3RhdGUgdG8gImNsb25lIiwgYnV0IGZvciBzb21lIHN1YnR5cGVzLCBzdWNoIGFzCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGFuZCBKU1BDYXBhYmxlUGFyc2VyLCB0aGVyZSBjb3VsZCB0aGUKLQkgKiBtb3JlIGludGVybmFsIGRhdGEgdG8gImNsb25lIiwgc3VjaCBhcyB0aGUgaW50ZXJuYWwgdG9rZW5pemVyIHNob3VsZCBiZQotCSAqIGNsb25lZCAoaW5jbHVkaW5nIGJsb2NrIHRhZ3MsIGV0YykuCi0JICovCi0JUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCk7Ci0KLQl2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpOwotCi0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBvZmZzZXQgZm9yIHVzZSB3aXRoIGFueSBwb3NpdGlvbi1kZXBlbmRhbnQgcGFyc2luZyBydWxlcwotCSAqLwotCXZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlciwgaW50IG9mZnNldCk7Ci0KLQl2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCk7Ci0KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIG9mZnNldCBmb3IgdXNlIHdpdGggYW55IHBvc2l0aW9uLWRlcGVuZGFudCBwYXJzaW5nIHJ1bGVzCi0JICovCi0Jdm9pZCByZXNldChTdHJpbmcgaW5wdXQsIGludCBvZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWYwOThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCi0JLy8gU2VudCB3aGVuIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBmaXJzdCBwYXJzZWQKLQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JLy8gU2VudCB3aGVuIHRoZSBjYWxsaW5nIHBhcnNlcidzIG1vZGVsIHVuZGVyZ29lcyBhIGZ1bGwgcmVzZXQKLQkvLyAgIGFuZCBhbnkgaW5mb3JtYXRpb24gYmFzZWQgdXBvbiB0aGUgb2xkIG1vZGVsIHNob3VsZCBiZQotCS8vICAgY2xlYXJlZAotCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2YjliYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlMjgwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlcjsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGV4dGVuZHMgUmVnaW9uUGFyc2VyIHsKLQotCXZvaWQgYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGhhbmRsZXIpOwotCi0Jdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlcik7Ci0KLQl2b2lkIHJlc2V0SGFuZGxlcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MWI2NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpc3Qgb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgbGlzdGVuaW5nCi0JICogdG8gdGhpcyBwYXJzZXIuCi0JICogCi0JICogQHJldHVybiBMaXN0IC0gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLCB0aGUgbGlzdCBtYXkgbm90IGJlIG51bGwgYW5kIGVhY2gKLQkgKiAgICAgICAgIGVsZW1lbnQgaW4gaXQgbXVzdCBpbXBsZW1lbnQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcgotCSAqLwotCUxpc3QgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFyc2VyL1RhZ01hcmtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvVGFnTWFya2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZGNhNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJzZXIvVGFnTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIFRhZ01hcmtlciB7Ci0KLQkvLyBhIElUZXh0UmVnaW9uIChtZWFudCB0byBiZSB1cGRhdGVkIHdpdGggdGhlIG1vZGVsKSBtYXJraW5nIHRoZSBwb3NpdGlvbgotCS8vIHdoZXJlIHRoaXMgdGFnbmFtZSBiZWNvbWVzIGVmZmVjdGl2ZQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBmTWFya2VyID0gbnVsbDsKLQotCS8vIHRoZSB0YWduYW1lCi0JcHJvdGVjdGVkIFN0cmluZyBmVGFnTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFRhZ01hcmtlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRhZ05hbWUodGFnbmFtZSk7Ci0JfQotCi0JcHVibGljIFRhZ01hcmtlcihTdHJpbmcgdGFnbmFtZSwgSVRleHRSZWdpb24gbWFya2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRhZ05hbWUodGFnbmFtZSk7Ci0JCXNldE1hcmtlcihtYXJrZXIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uCi0JICovCi0JcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE1hcmtlcigpIHsKLQkJcmV0dXJuIGZNYXJrZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlyZXR1cm4gZlRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKSB7Ci0JCXJldHVybiBmTWFya2VyID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld01hcmtlcgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0TWFya2VyKElUZXh0UmVnaW9uIG5ld01hcmtlcikgewotCQlmTWFya2VyID0gbmV3TWFya2VyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdUYWduYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0VGFnTmFtZShTdHJpbmcgbmV3VGFnTmFtZSkgewotCQlmVGFnTmFtZSA9IG5ld1RhZ05hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJ0aWNpcGFudHMvQWJzdHJhY3RCdWlsZGVyUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFydGljaXBhbnRzL0Fic3RyYWN0QnVpbGRlclBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YzY4ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJ0aWNpcGFudHMvQWJzdHJhY3RCdWlsZGVyUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJ0aWNpcGFudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuYnVpbGRlci5JQnVpbGRlclBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotLyoqCi0gKiBQdWJsaWNhbGx5IHVzYWJsZSBpbXBsZW1lbnRvciBvZiBJQnVpbGRlclBhcnRpY2lwYW50LiBJbmNsdWRlcyBwcmUtIGFuZAotICogcG9zdC1idWlsZCBob29rcyBhbmQgaXRlcmF0aW9uIHRocm91Z2ggdGhlIFN0cnVjdHVyZWQgRG9jdW1lbnQKLSAqLwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RCdWlsZGVyUGFydGljaXBhbnQgaW1wbGVtZW50cyBJQnVpbGRlclBhcnRpY2lwYW50IHsKLQotCXByaXZhdGUgSUZpbGUgZkN1cnJlbnRGaWxlOwotCXByaXZhdGUgSUJ1aWxkZXJNb2RlbFByb3ZpZGVyIGZNb2RlbFByb3ZpZGVyOwotCi0JcHVibGljIEFic3RyYWN0QnVpbGRlclBhcnRpY2lwYW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkKElGaWxlIGZpbGUsIElQcm9qZWN0IHByb2plY3QsIElCdWlsZGVyTW9kZWxQcm92aWRlciBwcm92aWRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXByZUJ1aWxkKGZpbGUsIHByb3ZpZGVyLCBtb25pdG9yKTsKLQkJaWYgKGdldEN1cnJlbnRGaWxlKCkuaXNBY2Nlc3NpYmxlKCkgJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gcHJvdmlkZXIuZ2V0RG9jdW1lbnQoZ2V0Q3VycmVudEZpbGUoKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQl3aGlsZSAocmVnaW9uICE9IG51bGwgJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCWJ1aWxkKHJlZ2lvbik7Ci0JCQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXROZXh0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXBvc3RCdWlsZChmaWxlLCBwcm92aWRlciwgbW9uaXRvcik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyUGFydGljaXBhbnQjYnVpbGQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlW10sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyTW9kZWxQcm92aWRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGJ1aWxkKElSZXNvdXJjZVtdIHJlc291cmNlcywgSVByb2plY3QgcHJvamVjdCwgSUJ1aWxkZXJNb2RlbFByb3ZpZGVyIHByb3ZpZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlidWlsZCgoSUZpbGUpIHJlc291cmNlc1tpXSwgcHJvamVjdCwgcHJvdmlkZXIsIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyUGFydGljaXBhbnQjYnVpbGQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyTW9kZWxQcm92aWRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGJ1aWxkKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJUHJvamVjdCBwcm9qZWN0LCBJQnVpbGRlck1vZGVsUHJvdmlkZXIgcHJvdmlkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gYnVpbGQoKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpLCBwcm9qZWN0LCBwcm92aWRlciwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJZG9CdWlsZEZvcihyZWdpb24pOwotCQlJVGV4dFJlZ2lvbkxpc3QgbGlzdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJZG9CdWlsZEZvcihyZWdpb24sIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmJ1aWxkZXIuSUJ1aWxkZXJQYXJ0aWNpcGFudCNjbGVhbnVwKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVtdLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuYnVpbGRlci5JQnVpbGRlck1vZGVsUHJvdmlkZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbGVhbnVwKElSZXNvdXJjZVtdIHJlc291cmNlcywgSVByb2plY3QgcHJvamVjdCwgSUJ1aWxkZXJNb2RlbFByb3ZpZGVyIHByb3ZpZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmJ1aWxkZXIuSUJ1aWxkZXJQYXJ0aWNpcGFudCNjbGVhbnVwKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuYnVpbGRlci5JQnVpbGRlck1vZGVsUHJvdmlkZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbGVhbnVwKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJUHJvamVjdCBwcm9qZWN0LCBJQnVpbGRlck1vZGVsUHJvdmlkZXIgcHJvdmlkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9CdWlsZEZvcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvQnVpbGRGb3IoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnRGaWxlLgotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRDdXJyZW50RmlsZSgpIHsKLQkJcmV0dXJuIGZDdXJyZW50RmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vZGVsUHJvdmlkZXIuCi0JICovCi0JcHVibGljIElCdWlsZGVyTW9kZWxQcm92aWRlciBnZXRNb2RlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gZk1vZGVsUHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEJ1aWxkKElGaWxlIGZpbGUsIElCdWlsZGVyTW9kZWxQcm92aWRlciBwcm92aWRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNldEN1cnJlbnRGaWxlKG51bGwpOwotCQlzZXRNb2RlbFByb3ZpZGVyKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUJ1aWxkKElGaWxlIGZpbGUsIElCdWlsZGVyTW9kZWxQcm92aWRlciBwcm92aWRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNldEN1cnJlbnRGaWxlKGZpbGUpOwotCQlzZXRNb2RlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3VycmVudEZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50RmlsZSB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VycmVudEZpbGUoSUZpbGUgY3VycmVudEZpbGUpIHsKLQkJZkN1cnJlbnRGaWxlID0gY3VycmVudEZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsUHJvdmlkZXIKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbFByb3ZpZGVyIHRvIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbFByb3ZpZGVyKElCdWlsZGVyTW9kZWxQcm92aWRlciBtb2RlbFByb3ZpZGVyKSB7Ci0JCWZNb2RlbFByb3ZpZGVyID0gbW9kZWxQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyUGFydGljaXBhbnQjc2h1dGRvd24ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oSVByb2plY3QgcHJvamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmJ1aWxkZXIuSUJ1aWxkZXJQYXJ0aWNpcGFudCNzdGFydHVwKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0LAotCSAqICAgICAgaW50LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoSVByb2plY3QgcHJvamVjdCwgaW50IGtpbmQsIE1hcCBhcmdzKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJ0aWNpcGFudHMvVGFza1RhZ1NlZWtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9wYXJ0aWNpcGFudHMvVGFza1RhZ1NlZWtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJmZTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcGFydGljaXBhbnRzL1Rhc2tUYWdTZWVrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJ0aWNpcGFudHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotCi0KLS8qKgotICogQSBwYXJ0aWNpcGFudCB0byBjcmVhdGUgSU1hcmtlci5UQVNLcyBmb3IgInRvZG9zIiBhbmQgc2ltaWxpYXIgY29tbWVudHMuCi0gKiBDbGllbnRzIHNob3VsZCBub3Qgc3ViY2xhc3MuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYXNrVGFnU2Vla2VyIGltcGxlbWVudHMgSUJ1aWxkZXJEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRhc2tUYWcgewotCQlwdWJsaWMgaW50IHByaW9yaXR5OwotCQlwdWJsaWMgU3RyaW5nIHRleHQ7Ci0KLQkJcHVibGljIFRhc2tUYWcoU3RyaW5nIHRhc2tUZXh0LCBpbnQgdGFza1ByaW9yaXR5KSB7Ci0JCQl0aGlzLnRleHQgPSB0YXNrVGV4dDsKLQkJCXRoaXMucHJpb3JpdHkgPSB0YXNrUHJpb3JpdHk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1ZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGRlci9wYXJ0aWNpcGFudC90YXNrdGFnIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnQnVpbGRlclBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2J1aWxkZXIvdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXNrTWFya2VyVHlwZSgpIHsKLQkJcmV0dXJuIFNTRUNvcmVQbHVnaW4uSUQgKyAiLnRhc2siOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gVE9ETzogaW1wbGVtZW50IHBlci1wcm9qZWN0IGVuYWJsZW1lbnQgYWNjb3JkaW5nIHRvCi0JLy8gaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9wbGF0Zm9ybS1jb3JlLWhvbWUvZG9jdW1lbnRzL3VzZXJfc2V0dGluZ3MvZmFxLmh0bWwKLQlib29sZWFuIGZFbmFibGVkID0gdHJ1ZTsKLQotCS8vIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoZSBuZXcgdGFza3MgZm9yIHRoZSBjdXJyZW50IGZpbGUKLQlwcm90ZWN0ZWQgTGlzdCBmTmV3TWFya2VyQXR0cmlidXRlcyA9IG51bGw7Ci0KLQlwcml2YXRlIFRhc2tUYWdbXSBmVGFza1RhZ3MgPSBudWxsOwotCUxpc3Qgb2xkTWFya2VycyA9IG51bGw7Ci0JcHJpdmF0ZSBsb25nIHRpbWUwOwotCi0JcHVibGljIFRhc2tUYWdTZWVrZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZOZXdNYXJrZXJBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoX2RlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbmNlIGNyZWF0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuYnVpbGRlci5JQnVpbGRlckRlbGVnYXRlI2J1aWxkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlLAotCSAqICAgICAgaW50LCBqYXZhLnV0aWwuTWFwLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBidWlsZChJRmlsZSBmaWxlLCBpbnQga2luZCwgTWFwIGFyZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkgfHwgIWlzU2hvdWxkQnVpbGQoZmlsZSkpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCWlmIChfZGVidWdCdWlsZGVyUGVyZikgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlpZiAoZlRhc2tUYWdzLmxlbmd0aCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJLy8gRGVsZXRlIG9sZCBUYXNrIG1hcmtlcnMKLQkJCQlmaWxlLmRlbGV0ZU1hcmtlcnMoZ2V0TWFya2VyVHlwZSgpLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gZGVsZXRpbmcgb2xkIHRhc2tzIiwgZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQl9Ci0JCQkvLyBvbiBhIGNsZWFuIGJ1aWxkLCBkb24ndCBhZGQgbmV3IFRhc2tzCi0JCQlpZiAoa2luZCAhPSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxEICYmIGZFbmFibGVkKSB7Ci0JCQkJZmluZFRhc2tzKGZpbGUsIG1vbml0b3IpOwotCQkJCWNyZWF0ZU5ld01hcmtlcnMoZmlsZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKF9kZWJ1Z0J1aWxkZXJQZXJmKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMgZm9yICIgKyBmaWxlLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGVzIHdpdGggd2hpY2ggYSBuZXdseSBjcmVhdGVkIG1hcmtlciB3aWxsIGJlCi0JICogaW5pdGlhbGl6ZWQuIE1vZGlmaWVkIGZyb20gdGhlIG1ldGhvZCBpbiBNYXJrZXJSdWxlckFjdGlvbgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgbWFya2VyIGF0dHJpYnV0ZXMKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGNyZWF0ZUluaXRpYWxNYXJrZXJBdHRyaWJ1dGVzKFN0cmluZyB0ZXh0LCBpbnQgZG9jdW1lbnRMaW5lLCBpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgsIGludCBwcmlvcml0eSkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKDYpOwotCQkvLyBtYXJrZXIgbGluZSBudW1iZXJzIGFyZSAxLWJhc2VkCi0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKGRvY3VtZW50TGluZSArIDEpKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCBuZXcgSW50ZWdlcihzdGFydE9mZnNldCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCBuZXcgSW50ZWdlcihzdGFydE9mZnNldCArIGxlbmd0aCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLk1FU1NBR0UsIHRleHQpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlVTRVJfRURJVEFCTEUsIEJvb2xlYW4uRkFMU0UpOwotCi0JCXN3aXRjaCAocHJpb3JpdHkpIHsKLQkJCWNhc2UgSU1hcmtlci5QUklPUklUWV9ISUdIIDogewotCQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuUFJJT1JJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuUFJJT1JJVFlfSElHSCkpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJTWFya2VyLlBSSU9SSVRZX0xPVyA6IHsKLQkJCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX0xPVykpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6IHsKLQkJCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX05PUk1BTCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmV3TWFya2VycyhJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSUZpbGUgZmluYWxGaWxlID0gZmlsZTsKLQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkgJiYgZk5ld01hcmtlckF0dHJpYnV0ZXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKF9kZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIGZOZXdNYXJrZXJBdHRyaWJ1dGVzLnNpemUoKSArICIgdGFza3MgZm9yICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHIgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZk5ld01hcmtlckF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlJTWFya2VyIG1hcmtlciA9IGZpbmFsRmlsZS5jcmVhdGVNYXJrZXIoZ2V0TWFya2VyVHlwZSgpKTsKLQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlcygoTWFwKSBmTmV3TWFya2VyQXR0cmlidXRlcy5nZXQoaSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQlmaW5hbEZpbGUuZ2V0V29ya3NwYWNlKCkucnVuKHIsIG51bGwsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBtb25pdG9yKTsKLQkJCQlmTmV3TWFya2VyQXR0cmlidXRlcy5jbGVhcigpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGV0ZWN0Q2hhcnNldChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBvcHRpbWl6ZWQgZGVzY3JpcHRpb24gbG9va3VwLCBtaWdodCBub3Qgc3VjY2VlZAotCQkJCWQgPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCWlmIChkICE9IG51bGwpCi0JCQkJCXJldHVybiBkLmdldENoYXJzZXQoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIHNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kIGZpbGUgdHlwZQotCQkJCS8vIGNoZWNrIGFib3ZlCi0JCQl9Ci0JCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihjb250ZW50cywgZmlsZS5nZXROYW1lKCksIG5ldyBRdWFsaWZpZWROYW1lW117SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUfSk7Ci0JCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRlc2NyaXB0aW9uLmdldENoYXJzZXQoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gd2lsbCB0cnkgdG8gY2xlYW51cCBpbiBmaW5hbGx5Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaW5kVGFza3MoSURvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBjb21tZW50KSB7Ci0JCWlmIChpc0NvbW1lbnRSZWdpb24oZG9jdW1lbnRSZWdpb24sIGNvbW1lbnQpKSB7Ci0JCQlpbnQgc3RhcnRPZmZzZXQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21tZW50KTsKLQkJCWludCBlbmRPZmZzZXQgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGNvbW1lbnQpOwotCQkJdHJ5IHsKLQkJCQlpbnQgc3RhcnRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJCQlpbnQgZW5kTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChlbmRPZmZzZXQpOwotCQkJCWZvciAoaW50IGxpbmVOdW1iZXIgPSBzdGFydExpbmU7IGxpbmVOdW1iZXIgPD0gZW5kTGluZTsgbGluZU51bWJlcisrKSB7Ci0JCQkJCUlSZWdpb24gbGluZSA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsaW5lTnVtYmVyKTsKLQkJCQkJaW50IGJlZ2luID0gTWF0aC5tYXgoc3RhcnRPZmZzZXQsIGxpbmUuZ2V0T2Zmc2V0KCkpOwotCQkJCQlpbnQgZW5kID0gTWF0aC5taW4oZW5kT2Zmc2V0LCBsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSk7Ci0JCQkJCWludCBsZW5ndGggPSBlbmQgLSBiZWdpbjsKLQotCQkJCQkvLyBUT0RPOiBpbXByb3ZlIG91ciBzZWFyY2ggYWxnb3JpdGhtOyB1c2Ugc2VhcmNoIG9yCi0JCQkJCS8vIHJlZ2lvbk1hdGNoPwotCi0JCQkJCVN0cmluZyBjb21tZW50ZWRUZXh0ID0gZ2V0Q29tbWVudGVkVGV4dChkb2N1bWVudCwgYmVnaW4sIGxlbmd0aCk7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFza1RhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWludCB0YWdJbmRleCA9IGNvbW1lbnRlZFRleHQuaW5kZXhPZihmVGFza1RhZ3NbaV0udGV4dCk7Ci0JCQkJCQlpZiAodGFnSW5kZXggPj0gMCkgewotCQkJCQkJCVN0cmluZyBtYXJrZXJEZXNjcmlwdGlvbiA9IGNvbW1lbnRlZFRleHQuc3Vic3RyaW5nKHRhZ0luZGV4KTsKLQkJCQkJCQlpbnQgbWFya2VyT2Zmc2V0ID0gYmVnaW4gKyB0YWdJbmRleDsKLQkJCQkJCQlpbnQgbWFya2VyTGVuZ3RoID0gZW5kIC0gbWFya2VyT2Zmc2V0OwotCQkJCQkJCWZOZXdNYXJrZXJBdHRyaWJ1dGVzLmFkZChjcmVhdGVJbml0aWFsTWFya2VyQXR0cmlidXRlcyhtYXJrZXJEZXNjcmlwdGlvbiwgbGluZU51bWJlciwgbWFya2VyT2Zmc2V0LCBtYXJrZXJMZW5ndGgsIGZUYXNrVGFnc1tpXS5wcmlvcml0eSkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZFRhc2tzKElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRIYW5kbGVyRm9yKGZpbGUpOwotCi0JCQkvLyByZWNvcmRzIGlmIHRoZSBvcHRpbWl6ZWQgc3RyZWFtaXNoIHBhcnNlIHdhcyBwb3NzaWJsZQotCQkJYm9vbGVhbiBkaWRTdHJlYW1QYXJzZSA9IGZhbHNlOwotCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCQkJZmluYWwgSUVuY29kZWREb2N1bWVudCBkZWZhdWx0RG9jdW1lbnQgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZGVmYXVsdERvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVJlZ2lvblBhcnNlciBwYXJzZXIgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRlZmF1bHREb2N1bWVudCkuZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgewotCQkJCQlkaWRTdHJlYW1QYXJzZSA9IHRydWU7Ci0JCQkJCVN0cmluZyBjaGFyc2V0ID0gZGV0ZWN0Q2hhcnNldChmaWxlKTsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGRvY3VtZW50UGFyc2VyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgcGFyc2VyOwotCQkJCQlmaW5hbCBJRG9jdW1lbnQgdGV4dERvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCQkJCXNldERvY3VtZW50Q29udGVudCh0ZXh0RG9jdW1lbnQsIGZpbGUuZ2V0Q29udGVudHModHJ1ZSksIGNoYXJzZXQpOwotCQkJCQlkb2N1bWVudFBhcnNlci5yZXNldChuZXcgRG9jdW1lbnRSZWFkZXIodGV4dERvY3VtZW50KSk7Ci0JCQkJCWRvY3VtZW50UGFyc2VyLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIobmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSB7Ci0JCQkJCQkvKioKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyI25vZGVQYXJzZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJCSAqLwotCQkJCQkJcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWdpb25zLnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIGNvbW1lbnQgPSByZWdpb25zLmdldChqKTsKLQkJCQkJCQkJZmluZFRhc2tzKHRleHREb2N1bWVudCwgZG9jdW1lbnRSZWdpb24sIGNvbW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBkaXNjb25uZWN0IHRoZSBkb2N1bWVudCByZWdpb25zCi0JCQkJCQkJaWYgKGRvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCkgIT0gbnVsbCkgewotCQkJCQkJCQlkb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpLnNldFByZXZpb3VzKG51bGwpOwotCQkJCQkJCQlkb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpLnNldE5leHQobnVsbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJCXRleHREb2N1bWVudC5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvKioKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyI3Jlc2V0Tm9kZXMoKQotCQkJCQkJICovCi0JCQkJCQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJZG9jdW1lbnRQYXJzZXIuZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFkaWRTdHJlYW1QYXJzZSkgewotCQkJCS8vIFVzZSBhIFN0cnVjdHVyZWREb2N1bWVudAotCQkJCUlFbmNvZGVkRG9jdW1lbnQgZG9jdW1lbnQgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGZpbGUpOwotCQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCXdoaWxlIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJCQkJCUlUZXh0UmVnaW9uIGNvbW1lbnQgPSByZWdpb25zLmdldChqKTsKLQkJCQkJCQlmaW5kVGFza3MoZG9jdW1lbnQsIGRvY3VtZW50UmVnaW9uLCBjb21tZW50KTsKLQkJCQkJCX0KLQkJCQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiB3aXRoICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZSk7Ci0JCX0gY2F0Y2ggKENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFza1RhZ1NlZWtlciBlbmNvdW50ZXJlZCBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gcmVhZGluZyAiICsgZmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBiZWdpbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tbWVudGVkVGV4dChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBiZWdpbiwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvY3VtZW50LmdldChiZWdpbiwgbGVuZ3RoKTsKLQl9Ci0KLQlmaW5hbCBwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcmtlclR5cGUoKSB7Ci0JCXJldHVybiBTU0VDb3JlUGx1Z2luLklEICsgIi50YXNrIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWdpb24yCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbik7Ci0KLQlib29sZWFuIGlzU2hvdWxkQnVpbGQoSVJlc291cmNlIHIpIHsKLQkJLy8gc2tpcCAiZG90IiBmaWxlcwotCQlTdHJpbmcgcyA9IHIuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcy5sZW5ndGgoKSA9PSAwIHx8IHMuY2hhckF0KDApICE9ICcuJzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFByZWZlcmVuY2UoKSB7Ci0JCWlmIChfZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzICsgIiBsb2FkUHJlZmVyZW5jZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmRW5hYmxlZCA9IFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQVNLX1RBR19FTkFCTEUpOwotCQlTdHJpbmcgdGFnc1N0cmluZyA9IFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBU0tfVEFHX1RBR1MpOwotCQlTdHJpbmcgcHJpb3JpdGllc1N0cmluZyA9IFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBU0tfVEFHX1BSSU9SSVRJRVMpOwotCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VyID0gbnVsbDsKLQkJaWYgKHRhZ3NTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0b2tlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGFnc1N0cmluZywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCS8vIHNpbmNlIHdlJ3JlIHNlcGFyYXRpbmcgdGhlIHZhbHVlcyB3aXRoICcsJywgZXNjYXBlICcsJyBpbgotCQkJCS8vIHRoZQotCQkJCS8vIHZhbHVlcwotCQkJCWxpc3QuYWRkKFN0cmluZ1V0aWxzLnJlcGxhY2UodG9rZXIubmV4dFRva2VuKCksICImY29tbWE7IiwgIiwiKS50cmltKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSB0YWdzID0gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCWxpc3QuY2xlYXIoKTsKLQotCQlpZiAocHJpb3JpdGllc1N0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCXRva2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmlvcml0aWVzU3RyaW5nLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpICYmIGkgPCB0YWdzLmxlbmd0aCkgewotCQkJCUludGVnZXIgbnVtYmVyID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQludW1iZXIgPSBJbnRlZ2VyLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkudHJpbSgpKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQludW1iZXIgPSBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX05PUk1BTCk7Ci0JCQkJfQotCQkJCWlmIChpIDwgdGFncy5sZW5ndGgpIHsKLQkJCQkJbGlzdC5hZGQobmV3IFRhc2tUYWcodGFnc1tpKytdLCBudW1iZXIuaW50VmFsdWUoKSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmVGFza1RhZ3MgPSAoVGFza1RhZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFRhc2tUYWdbMF0pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50IGNvbnRlbnQgZnJvbSB0aGlzIHN0cmVhbSwgY2xvc2luZyB0aGUgc3RyZWFtIHdoZW4KLQkgKiBkb25lCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIGNvbnRlbnRTdHJlYW0KLQkgKiBAcGFyYW0gY2hhcnNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGFyc2V0KSB7Ci0JCVJlYWRlciBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29udGVudFN0cmVhbSwgY2hhcnNldCksIDIwNDgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjA0OCk7Ci0JCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyWzIwNDhdOwotCQkJaW50IG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQluID0gaW4ucmVhZChyZWFkQnVmZmVyKTsKLQkJCX0KLQkJCWRvY3VtZW50LnNldChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuYnVpbGRlci5JQnVpbGRlclBhcnRpY2lwYW50I3NodXRkb3duKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKF9kZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMgKyAiIHNodXRkb3duIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZlRhc2tUYWdzID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5idWlsZGVyLklCdWlsZGVyUGFydGljaXBhbnQjc3RhcnR1cChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCwKLQkgKiAgICAgIGludCwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKElQcm9qZWN0IHByb2plY3QsIGludCBraW5kLCBNYXAgYXJncykgewotCQlpZiAoX2RlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcyArICIgc3RhcnR1cCBmb3IgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChfZGVidWdCdWlsZGVyUGVyZikgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlsb2FkUHJlZmVyZW5jZSgpOwotCQlpZiAoX2RlYnVnQnVpbGRlclBlcmYpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyBsb2FkaW5nIHByZWZzIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcHJlZmVyZW5jZXMvQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcHJlZmVyZW5jZXMvQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmMTVmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3ByZWZlcmVuY2VzL0NvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIEhlcmUgaXMgYSBkZXNjcmlwdGlvbiBvZiBob3cgZWFjaCBjb21tb24gbW9kZWwgZmlsZSBwcmVmZXJlbmNlIGlzIHVzZWQuCi0gKiAKLSAqIHRhYldpZHRoIFRoZSBudW1iZXIgb2Ygc3BhY2VzIHJlcHJlc2VudGluZyBhIHRhYi4gVGhpcyBudW1iZXIgaXMgYWxzbyB1c2VkCi0gKiBhcyBudW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCBkdXJpbmcgZm9ybWF0dGluZyB3aGVuIGluZGVudFVzaW5nVGFicyBpcwotICogZmFsc2UuCi0gKiAKLSAqIHNwbGl0TGluZXMgSW5kaWNhdGVzIGlmIGxvbmcgbGluZXMgc2hvdWxkIGJlIHNwbGl0dGVkLgotICogCi0gKiBzcGxpdExpbmVzVXNpbmdFZGl0b3JzV2lkdGggSW5kaWNhdGVzIGlmIGxvbmcgbGluZXMgc2hvdWxkIGJlIHNwbGl0dGVkCi0gKiB1c2luZyB0aGUgZWRpdG9yJ3MgY3VycmVudCB3aWR0aC4gVGhlIGVkaXRvcidzIGN1cnJlbnQgd2lkdGggd2lsbCBiZSB1c2VkCi0gKiB3aGVuIHNwbGl0dGluZyBsb25nIGxpbmVzIGlmIHNwbGl0TGluZXNVc2luZ0VkaXRvcldpZHRoIGlzIHRydWUuIGxpbmVXaWR0aAotICogd2lsbCBiZSB1c2VkIHdoZW4gc3BsaXR0aW5nIGxvbmcgbGluZXMgaWYgc3BsaXRMaW5lc1VzaW5nRWRpdG9yV2lkdGggaXMKLSAqIGZhbHNlLgotICogCi0gKiBsaW5lV2lkdGggVGhlIG1heGltdW0gd2lkdGggb2YgYSBsaW5lIGJlZm9yZSBhIGxpbmUgc3BsaXQgaXMgbmVlZGVkLiBUaGlzCi0gKiBudW1iZXIgaXMgb25seSB1c2VkIHdoZW4gbGluZVNwbGl0dGluZyBpcyB0cnVlLCBvdGhlcndpc2UgaXQncyBpZ25vcmVkLgotICogCi0gKiBzcGxpdE11bHRpQXR0cnMgSW5kaWNhdGVzIGlmIHRhZ3Mgd2l0aCBtdWx0aXBsZSBhdHRyaWJ1dGVzIHNob3VsZCBiZQotICogZm9ybWF0dGVkIChzcGxpdHRpbmcgZWFjaCBhdHRyIG9uIGEgbmV3IGxpbmUpLgotICogCi0gKiBpbmRlbnRVc2luZ1RhYnMgSW5kaWNhdGVzIGlmIHRhYnMgc2hvdWxkIGJlIHVzZWQgZm9yIGluZGVudGF0aW9uIGR1cmluZwotICogZm9ybWF0dGluZy4gVGhlIHNhbWUgbnVtYmVyIG9mIHNwYWNlcyBzcGVjaWZpZWQgYnkgdGFiV2lkdGggd2lsbCBiZSB1c2VkCi0gKiBmb3IgaW5kZW50YXRpb24gaWYgaW5kZW50VXNpbmdUYWJzIGlzIGZhbHNlLgotICogCi0gKiBjbGVhckFsbEJsYW5rTGluZXMgSW5kaWNhdGVzIGlmIGFsbCBibGFua3MgbGluZXMgc2hvdWxkIGJlIGNsZWFyZWQgZHVyaW5nCi0gKiBmb3JtYXR0aW5nLiBCbGFua3MgbGluZXMgd2lsbCBiZSBrZXB0IHdoZW4gY2xlYXJBbGxCbGFua0xpbmVzIGlzIGZhbHNlLgotICogCi0gKiBmb3JtYXR0aW5nU3VwcG9ydGVkIEluZGljYXRlcyBpZiB0aGUgY3VycmVudCBjb250ZW50IHR5cGUgc3VwcG9ydHMKLSAqIGZvcm1hdHRpbmcuIFRoZSBzcGxpdExpbmVzLCBzcGxpdExpbmVzVXNpbmdFZGl0b3JzV2lkdGgsIGxpbmVXaWR0aCwKLSAqIHNwbGl0TXVsdGlBdHRycywgYW5kIGluZGVudFVzaW5nVGFicyBwcmVmZXJlbmNlcyB3aWxsIGJlIG1lYW5pbmdsZXNzIGlmCi0gKiBmb3JtYXR0aW5nU3VwcG9ydGVkIGlzIGZhbHNlLgotICogCi0gKiBjb250ZW50QXNzaXN0U3VwcG9ydGVkIEluZGljYXRlcyBpZiB0aGUgY3VycmVudCBjb250ZW50IHR5cGUgc3VwcG9ydHMKLSAqIGNvbnRlbnQgYXNzaXN0LiBUaGUgYXV0b1Byb3Bvc2UsIGFuZCBhdXRvUHJvcG9zZUNvZGUgcHJlZmVyZW5jZXMgd2lsbCBiZQotICogbWVhbmluZ2xlc3MgaWYgY29udGVudEFzc2lzdFN1cHBvcnRlZCBpcyBmYWxzZS4KLSAqIAotICogcHJlZmVycmVkTWFya3VwQ2FzZVN1cHBvcnRlZCBJbmRpY2F0ZXMgaWYgdGhlIGN1cnJlbnQgY29udGVudCB0eXBlIHN1cHBvcnRzCi0gKiAicHJlZmVycmVkIG1hcmt1cCBjYXNlIGZvciBjb250ZW50IGFzc2lzdCwgYW5kIGNvZGUgZ2VuZXJhdGlvbiIuIFRoZQotICogdGFnTmFtZUNhc2UsIGFuZCBhdHRyTmFtZUNhc2UgcHJlZmVyZW5jZXMgd2lsbCBiZSBtZWFuaW5nbGVzcyBpZgotICogcHJlZmVycmVkTWFya3VwQ2FzZVN1cHBvcnRlZCBpcyBmYWxzZS4KLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcyB7Ci0JU3RyaW5nIFRBQl9XSURUSCA9ICJ0YWJXaWR0aCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBMSU5FX1dJRFRIID0gImxpbmVXaWR0aCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTUExJVF9NVUxUSV9BVFRSUyA9ICJzcGxpdE11bHRpQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5ERU5UX1VTSU5HX1RBQlMgPSAiaW5kZW50VXNpbmdUYWJzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENMRUFSX0FMTF9CTEFOS19MSU5FUyA9ICJjbGVhckFsbEJsYW5rTGluZXMiOy8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQUdfTkFNRV9DQVNFID0gInRhZ05hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9DQVNFID0gImF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEZPUk1BVFRJTkdfU1VQUE9SVEVEID0gImZvcm1hdHRpbmdTdXBwb3J0ZWQiOy8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBQUkVGRVJSRURfTUFSS1VQX0NBU0VfU1VQUE9SVEVEID0gInByZWZlcnJlZE1hcmt1cENhc2VTdXBwb3J0ZWQiOy8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQVNLX1RBR19UQUdTID0gInRhc2stdGFnLXRhZ3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBU0tfVEFHX1BSSU9SSVRJRVMgPSAidGFzay10YWctcHJpb3JpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFTS19UQUdfRU5BQkxFID0gInRhc2stdGFncyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgZnJvbSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcwotCSAqLwotCVN0cmluZyBPVVRQVVRfQ09ERVNFVCA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUOwotCi0JLyoqCi0JICogdGhlc2UgYXJlIHByZWZlcmVuY2VzIHRoYXQgc2hvdWxkIGJlIGluaGVyaXRlZCBmcm9tIHRoZSAiZW1iZWRkZWQKLQkgKiBwcmVmZXJlbmNlIHN0b3JlIiBmb3IgZXhhbXBsZTogaWYgeW91IGFzayBmb3IgdGggT1ZFUlZJRVdfUlVMRVIKLQkgKiBwcmVmZXJlbmNlIGZvciBKU1AsIHlvdSB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0IHRoZSBwcmVmZXJlbmNlIGZyb20gdGhlCi0JICogSFRNTCBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCVN0cmluZyBFTUJFRERFRF9DT05URU5UX1RZUEVfUFJFRkVSRU5DRVNbXSA9IHtUQUJfV0lEVEgsIExJTkVfV0lEVEgsIFNQTElUX01VTFRJX0FUVFJTLCBJTkRFTlRfVVNJTkdfVEFCUywgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBUQUdfTkFNRV9DQVNFLCBBVFRSX05BTUVfQ0FTRSx9OwotCi0JU3RyaW5nIEZPUk1BVFRJTkdfUFJFRkVSRU5DRVNbXSA9IHtUQUJfV0lEVEgsIExJTkVfV0lEVEgsIFNQTElUX01VTFRJX0FUVFJTLCBJTkRFTlRfVVNJTkdfVEFCUywgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLH07Ci0KLQlTdHJpbmcgQVVUTyA9ICJBdXRvIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVURl84ID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElTT184ODU5XzEgPSAiSVNPLTg4NTktMSI7Ly8kTk9OLU5MUy0xJAotCi0JaW50IEFTSVMgPSAwOwotCWludCBMT1dFUiA9IDE7Ci0JaW50IFVQUEVSID0gMjsKLQotCS8vIGNsZWFudXAgcHJlZmVyZW5jZSBuYW1lcwotCVN0cmluZyBDTEVBTlVQX1RBR19OQU1FX0NBU0UgPSAiY2xlYW51cFRhZ05hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENMRUFOVVBfQVRUUl9OQU1FX0NBU0UgPSAiY2xlYW51cEF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MgPSAiY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOU0VSVF9SRVFVSVJFRF9BVFRSUyA9ICJpbnNlcnRSZXF1aXJlZEF0dHJzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUVVPVEVfQVRUUl9WQUxVRVMgPSAicXVvdGVBdHRyVmFsdWVzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlRfRU9MX0NPREVTID0gImNvbnZlcnRFT0xDb2RlcyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBTlVQX0VPTF9DT0RFID0gImNsZWFudXBFT0xDb2RlIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgTEFTVF9BQ1RJVkVfUEFHRSA9ICJsYXN0QWN0aXZlUGFnZSI7Ly8kTk9OLU5MUy0xJAkKLQotCS8vIG5lZWQgdG8gcHV0IGRlZmF1bHQgdGFiIHdpZHRoIHByZWZlcmVuY2UgaGVyZSBzbyBpdCBpcyBhY2Nlc3NpYmxlIGJ5Ci0JLy8gYm90aCBtb2RlbCBhbmQgZWRpdG9yCi0JLy8gdGhpcyB3YXksIGVkaXRvciBkb2VzIG5vdCBuZWVkIHRvIHF1ZXJ5IG1vZGVsJ3MgZGVmYXVsdCB0YWIgd2lkdGgKLQkvLyBwcmVmZXJlbmNlCi0JaW50IERFRkFVTFRfVEFCX1dJRFRIID0gNDsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSBpbnN0ZWFkCi0JICogICAgICAgICAgICAgVE9ETyByZW1vdmUKLQkgKi8KLQlTdHJpbmcgRU5EX09GX0xJTkVfQ09ERSA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREU7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk5PX1RSQU5TTEFUSU9OIGluc3RlYWQKLQkgKiAgICAgICAgICAgICBUT0RPIHJlbW92ZQotCSAqLwotCVN0cmluZyBOT19UUkFOU0xBVElPTiA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk5PX1RSQU5TTEFUSU9OOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VUIGluc3RlYWQKLQkgKiAgICAgICAgICAgICBUT0RPIHJlbW92ZQotCSAqLwotCVN0cmluZyBJTlBVVF9DT0RFU0VUID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVDsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSTEYgaW5zdGVhZCBUT0RPCi0JICogICAgICAgICAgICAgcmVtb3ZlCi0JICovCi0JU3RyaW5nIFNUUklOR19DUkxGID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSTEY7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19DUiBpbnN0ZWFkIFRPRE8KLQkgKiAgICAgICAgICAgICByZW1vdmUKLQkgKi8KLQlTdHJpbmcgU1RSSU5HX0NSID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfTEYgaW5zdGVhZCBUT0RPCi0JICogICAgICAgICAgICAgcmVtb3ZlCi0JICovCi0JU3RyaW5nIFNUUklOR19MRiA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19MRjsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1JMRiBpbnN0ZWFkIFRPRE8gcmVtb3ZlCi0JICovCi0JU3RyaW5nIENSTEYgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRiBpbnN0ZWFkIFRPRE8gcmVtb3ZlCi0JICovCi0JU3RyaW5nIExGID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEY7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSIGluc3RlYWQgVE9ETyByZW1vdmUKLQkgKi8KLQlTdHJpbmcgQ1IgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTcxMTE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBUaGlzIHVzZWQgdG8gYmUgdXNlZCBieSBvdXIgb3duIFByZWZlcmVuY2VNYW5hZ2VyIGJ1dCBzaW5jZQotICogICAgICAgICAgICAgdGhhdCBjbGFzcyBpcyBubyBsb25nZXIgbmVlZGVkLCB0aGlzIGNsYXNzIHNob3VsZCBhbHNvIG5vCi0gKiAgICAgICAgICAgICBsb25nZXIgYmUgbmVlZGVkLiBVc2UgdGhlIGJhc2UncyBJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIG9yCi0gKiAgICAgICAgICAgICBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbnN0ZWFkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQl2b2lkIHByZWZlcmVuY2VzQ2hhbmdlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0RlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViOWQ3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyOwotCi0vKioKLSAqIEZvbGxvd3MgdGhlIGJlaGF2aW9yIG9mIERlZmF1bHRQb3NpdGlvblVwZGF0ZXIgZXhjZXB0IGluIGFkZGl0aW9uIHRvCi0gKiBkZWxldGluZy9vdmVyd3JpdGluZyB0ZXh0IHdoaWNoIGNvbXBsZXRlbHkgY29udGFpbnMgdGhlIHBvc2l0aW9uIGRlbGV0ZXMKLSAqIHRoZSBwb3NpdGlvbiwgZGVsZXRpbmcgdGV4dCB0aGF0IGVxdWFscyB0aGUgdGV4dCBpbiBwb3NpdGlvbiBhbHNvIGRlbGV0ZXMKLSAqIHRoZSBwb3NpdGlvbi4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRQb3NpdGlvblVwZGF0ZXIKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyIGV4dGVuZHMgRGVmYXVsdFBvc2l0aW9uVXBkYXRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXN1cGVyKGNhdGVnb3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnRseSBpbnZlc3RpZ2F0ZWQgcG9zaXRpb24gaGFzIGJlZW4gZGVsZXRlZAotCSAqIGJ5IHRoZSByZXBsYWNlIG9wZXJhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIGN1cnJlbnQgZXZlbnQuIElmIHNvLCBpdAotCSAqIGRlbGV0ZXMgdGhlIHBvc2l0aW9uIGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIGRvY3VtZW50J3MgcG9zaXRpb24KLQkgKiBjYXRlZ29yeS4KLQkgKiAKLQkgKiBOT1RFOiBwb3NpdGlvbiBpcyBkZWxldGVkIGlmIGN1cnJlbnQgZXZlbnQgY29tcGxldGVseSBvdmVyd3JpdGVzCi0JICogcG9zaXRpb24gT1IgaWYgY3VycmVudCBldmVudCBkZWxldGVzIHRoZSBhcmVhIHN1cnJvdW5kaW5nL2luY2x1ZGluZyB0aGUKLQkgKiBwb3NpdGlvbgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcG9zaXRpb24gaGFzIGJlZW4gZGVsZXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vdERlbGV0ZWQoKSB7Ci0JCS8vIHBvc2l0aW9uIGlzIGRlbGV0ZWQgaWYgY3VycmVudCBldmVudCBjb21wbGV0ZWx5IG92ZXJ3cml0ZXMgcG9zaXRpb24KLQkJLy8gT1IgaWYKLQkJLy8gY3VycmVudCBldmVudCBkZWxldGVzIHRoZSBhcmVhIHN1cnJvdW5kaW5nL2luY2x1ZGluZyB0aGUgcG9zaXRpb24KLQkJaWYgKChmT2Zmc2V0IDwgZlBvc2l0aW9uLm9mZnNldCAmJiAoZlBvc2l0aW9uLm9mZnNldCArIGZQb3NpdGlvbi5sZW5ndGggPCBmT2Zmc2V0ICsgZkxlbmd0aCkpIHx8IChmT2Zmc2V0IDw9IGZQb3NpdGlvbi5vZmZzZXQgJiYgKGZQb3NpdGlvbi5vZmZzZXQgKyBmUG9zaXRpb24ubGVuZ3RoIDw9IGZPZmZzZXQgKyBmTGVuZ3RoKSAmJiBmUmVwbGFjZUxlbmd0aCA9PSAwKSkgewotCi0JCQlmUG9zaXRpb24uZGVsZXRlKCk7Ci0KLQkJCXRyeSB7Ci0JCQkJZkRvY3VtZW50LnJlbW92ZVBvc2l0aW9uKGdldENhdGVnb3J5KCksIGZQb3NpdGlvbik7Ci0JCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHgpIHsKLQkJCX0KLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyY2IwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5ld01vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLQotCi0vKioKLSAqIEEgSVN0cnVjdHVyZWREb2N1bWVudCBpcyBhIGNvbGxlY3Rpb24gb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy4gSXQncwotICogb2Z0ZW4gY2FsbGVkICJmbGF0IiBiZWNhdXNlIGl0cyBjb250ZW50cyBieSBkZXNpZ24gZG8gbm90IGNvbnRhaW4gbXVjaAotICogc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBiZXlvbmQgY29udGFpbm1lbnQuIENsaWVudHMgc2hvdWxkIG5vdCBpbXBsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudCBleHRlbmRzIElFbmNvZGVkRG9jdW1lbnQsIElEb2N1bWVudEV4dGVuc2lvbiwgSUFkYXB0YWJsZSB7Ci0KLQlTdHJpbmcgREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZGVmYXVsdF9zdHJ1Y3R1cmVkX3RleHRfcGFydGl0aW9uaW5nIjsKLQotCXZvaWQgYWRkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcnMgYW5kIE1vZGVsQ2hhbmdlZExpc3RlbmVycyBhcmUgdmVyeQotCSAqIHNpbWlsYXIuIFRoZXkgYm90aCByZWNlaXZlIGlkZW50aWNhbCBldmVudHMuIFRoZSBkaWZmZXJlbmNlIGlzIHRoZQotCSAqIHRpbWluZy4gVGhlICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcnMgYXJlIG5vdGlmaWVkIGFmdGVyIHRoZQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBoYXMgYmVlbiBjaGFuZ2VkLCBidXQgYmVmb3JlIG90aGVyLCByZWxhdGVkIG1vZGVscwotCSAqIG1heSBoYXZlIGJlZW4gY2hhbmdlZCBzdWNoIGFzIHRoZSBTdHJ1Y3R1cmFsIE1vZGVsLiBUaGUgU3RydWN0dXJhbAotCSAqIG1vZGVsIGlzIGluIGZhY3QgaXRzZWxmIGEgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RuZXIuIFRoZQotCSAqIE1vZGVsQ2hhbmdlZExpc3RlbmVycyBjYW4gcmVzdCBhc3N1cmVkIHRoYXQgYWxsIG1vZGVscyBhbmQgZGF0YSBoYXZlCi0JICogYmVlbiB1cGRhdGVkIGZyb20gdGhlIGNoYW5nZSBieSB0aGUgdGllbSB0aGV5IGFyZSBub3RpZmllZC4gVGhpcyBpcwotCSAqIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciB0aGUgdGV4dCB3aWRnZXQsIGZvciBleGFtcGxlLCB3aGljaCBtYXkgcmVseQotCSAqIG9uIGJvdGggc3RydWN0dXJlZERvY3VtZW50IGFuZCBzdHJ1Y3R1cmFsIG1vZGVsIGluZm9ybWF0aW9uLgotCSAqLwotCXZvaWQgYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcnMgYW5kIE1vZGVsQ2hhbmdlZExpc3RlbmVycyBhcmUgdmVyeQotCSAqIHNpbWlsYXIuIFRoZXkgYm90aCByZWNlaXZlIGlkZW50aWNhbCBldmVudHMuIFRoZSBkaWZmZXJlbmNlIGlzIHRoZQotCSAqIHRpbWluZy4gVGhlICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcnMgYXJlIG5vdGlmaWVkIGFmdGVyIHRoZQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBoYXMgYmVlbiBjaGFuZ2VkLCBidXQgYmVmb3JlIG90aGVyLCByZWxhdGVkIG1vZGVscwotCSAqIG1heSBoYXZlIGJlZW4gY2hhbmdlZCBzdWNoIGFzIHRoZSBTdHJ1Y3R1cmFsIE1vZGVsLiBUaGUgU3RydWN0dXJhbAotCSAqIG1vZGVsIGlzIGluIGZhY3QgaXRzZWxmIGEgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RuZXIuIFRoZQotCSAqIE1vZGVsQ2hhbmdlZExpc3RlbmVycyBjYW4gcmVzdCBhc3N1cmVkIHRoYXQgYWxsIG1vZGVscyBhbmQgZGF0YSBoYXZlCi0JICogYmVlbiB1cGRhdGVkIGZyb20gdGhlIGNoYW5nZSBieSB0aGUgdGllbSB0aGV5IGFyZSBub3RpZmllZC4gVGhpcyBpcwotCSAqIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciB0aGUgdGV4dCB3aWRnZXQsIGZvciBleGFtcGxlLCB3aGljaCBtYXkgcmVseQotCSAqIG9uIGJvdGggc3RydWN0dXJlZERvY3VtZW50IGFuZCBzdHJ1Y3R1cmFsIG1vZGVsIGluZm9ybWF0aW9uLgotCSAqLwotCXZvaWQgYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiB0aGlzIEFQSSBlbnN1cmVzIHRoYXQgYW55IHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBzdGFydE9mZiB0bwotCSAqIGxlbmd0aCBpcyBub3QgcmVhZG9ubHkgKHRoYXQgaXMsIHRoYXQgaXRzIGVkaXRhYmxlKS4gTm90ZSB0aGF0IGlmIHRoZQotCSAqIHJhbmdlIG92ZXJsYXBzIHdpdGggb3RoZXIgcmVhZG9ubHkgcmVnaW9ucywgdGhvc2Ugb3RoZXIgcmVhZG9ubHkKLQkgKiByZWdpb25zIHdpbGwgYmUgYWRqdXN0ZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqLwotCXZvaWQgY2xlYXJSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIGFueSBwb3J0aW9uIG9mIHN0YXJ0T2Zmc2V0IHRvIGxlbmd0aCBpcyByZWFkb25seQotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBjb250YWluc1JlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB0byByZW1lbWJlciBpbmZvIGFib3V0IHRoZSBlbmNvZGluZyBXaGVuIHRoZSByZXNvdXJjZQotCSAqIHdhcyBsYXN0IGxvYWRlZCBvciBzYXZlZC4gTm90ZTogaXQgaXMgbm90IGtlcHQgImN1cnJlbnQiLCB0aGF0IGlzLCBjYW4KLQkgKiBub3QgYmUgZGVwZW5kZWQgb24gYmxpbmRseSB0byByZWZsZWN0IHdoYXQgZW5jb2RpbmcgdG8gdXNlLiBGb3IgdGhhdCwKLQkgKiBtdXN0IGdvIHRocm91Z2ggdGhlIG5vcm1hbCBydWxlcyBleHByZXNzZWQgaW4gTG9hZGVycyBhbmQgRHVtcGVycy4KLQkgKi8KLQotCUVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogVGhpcyBjYW4gYmUgY29uc2lkZXJlZCB0aGUgcHJlZmVycmVkIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKTsKLQotCWludCBnZXRMaW5lT2ZPZmZzZXQoaW50IG9mZnNldCk7IC8vIHRocm93cyBTb3VyY2VFZGl0aW5nRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhlIHBhcnNlciBpcyBub3cgcmVxdWlyZWQgb24gY29uc3RydWN0b3IsIHNvIHRoZXJlIGFyZSBvY2Nhc2lvbnMgaXQKLQkgKiBuZWVkcyB0byBiZSByZXRyaWV2ZWQsIHN1Y2ggYXMgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgRW1iZWRkZWRDb250ZW50VHlwZQotCSAqLwotCVJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKTsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCk7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRSZWdpb25MaXN0KCk7Ci0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgbWV0aG9kIHdhcyBtYWRlIHB1YmxpYywgYW5kIHBhcnQgb2YgdGhlIGludGVyZmFjZSwgZm9yCi0JICogZWFzaWVyIHRlc3RpbmcuIENsaWVudHMgbm9ybWFsbHkgbmV2ZXIgbWFuaXB1bGF0ZSB0aGUgcmVwYXJzZXIgZGlyZWN0bHkKLQkgKiAobm9yIHNob3VsZCB0aGV5IG5lZWQgdG8pLgotCSAqLwotCUlTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGdldFJlUGFyc2VyKCk7Ci0KLQlTdHJpbmcgZ2V0VGV4dCgpOwotCi0JSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKTsKLQotCS8qKgotCSAqIGNhdXNlcyB0aGF0IHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IGZyb20gc3RhcnRPZmZzZXQgdG8gbGVuZ3RoIHRvIGJlCi0JICogbWFya2VkIGFzIHJlYWRvbmx5LiBOb3RlIHRoYXQgaWYgdGhpcyByYW5nZSBvdmVybGFwcyB3aXRoIHNvbWUgb3RoZXIKLQkgKiByZWdpb24gd2l0aCBpcyByZWFkb25seSwgdGhlIHJlZ2lvbnMgYXJlIGVmZmVjdGl2bHkgY29tYmluZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqLwotCXZvaWQgbWFrZVJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBuZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgaXQgY29udGFpbnMgbm8gZGF0YS4gT25lCi0JICogaW1wb3J0YW50IHRoaW5nIHRvIGR1cGxpY2F0ZSBpcyB0aGUgcGFyc2VyLCB3aXRoIHRoZSBwYXJzZXIgY29ycmVjdGx5Ci0JICogImNsb25lZCIsIGluY2x1ZGluZyBpdHMgdG9rZW5pbnplciwgYmxvY2sgdGFncywgZXRjLgotCSAqIAotCSAqIE5PVEU6IGV2ZW4gYWZ0ZXIgb2J0YWluaW5nIGEgJ25ld0luc3RhbmNlJyB0aGUgY2xpZW50IG1heSBoYXZlIHRvIGRvCi0JICogc29tZSBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGUsIGl0IG1heSBuZWVkIHRvIGFkZCBpdHMgb3duIG1vZGVsCi0JICogbGlzdGVuZXJzLiBPciwgYXMgYW5vdGhlciBleGFtcGxlLCBpZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBoYXMgYQotCSAqIHBhcnNlciBvZiB0eXBlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciwgdGhlbiB0aGUgY2xpZW50IG1heSBuZWVkCi0JICogdG8gYWRkIGl0cyBvd24gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciB0byB0aGF0IHBhcnNlciwgaWYgaXQgaXMKLQkgKiBpbiBmYWN0IG5lZWRlZC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKCk7Ci0KLQl2b2lkIHJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogcmVwbGFjZVRleHQgcmVwbGFjZXMgdGhlIHRleHQgZnJvbSBvbGRTdGFydCB0byBvbGRFbmQgd2l0aCB0aGUgbmV3IHRleHQKLQkgKiBmb3VuZCBpbiB0aGUgcmVxdWVzdGVkQ2hhbmdlIHN0cmluZy4gSWYgb2xkU3RhcnQgYW5kIG9sZEVuZCBhcmUgZXF1YWwsCi0JICogaXQgaXMgYW4gaW5zZXJ0aW9uIHJlcXVlc3QuIElmIHJlcXVlc3RlZENoYW5nZSBpcyBudWxsIChvciBlbXB0eSkgaXQgaXMKLQkgKiBhIGRlbGV0ZSByZXF1ZXN0LiBPdGhlcndpc2UgaXQgaXMgYSByZXBsYWNlIHJlcXVlc3QuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHNvdXJjZSwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogTm90ZSwgc2FtZSBhcyByZXBsYWNlVGV4dCBBUEksIGJ1dCB3aWxsIGFsbG93IHJlYWRvbmx5IGFyZWFzIHRvIGJlCi0JICogcmVwbGFjZWQuIFRoaXMgc2hvdWxkIHNlbGRvbSBiZSBjYWxsZWQgd2l0aCBhIHZhbHVlIG9mICJ0cnVlIiBmb3IKLQkgKiBpZ25vcmVSZWFkT25seVNldHRpbmcuIE9uZSBjYXNlIHdoZXJlIGl0cyBvayBpcyB3aXRoIHVuZG8gb3BlcmF0aW9ucwotCSAqIChzaW5jZSwgcHJlc3VtYWJseSwgaWYgdXNlciBqdXN0IGRpZCBzb21ldGhpbmcgdGhhdCBoYXBwZW5kZWQgdG8KLQkgKiBpbnZvbHZlIHNvbWUgaW5zZXJ0aW5nIHJlYWRvbmx5IHRleHQsIHRoZXkgc2hvdWxkIG5vcm1hbGx5IGJlIGFsbG93ZWQKLQkgKiB0byBzdGlsbCB1bmRvIHRoYXQgb3BlcmF0aW9uLiBPdGhlcndpc2UsIEkgY2FuJ3QgdGhpbmsgb2YgYSBzaW5nbGUKLQkgKiBleGFtcGxlLCB1bmxlc3MgaXRzIHRvIGdpdmUgdGhlIHVzZXIgYSBjaG9pY2UsIGUuZy4gInlvdSBhcmUgYWJvdXQgdG8KLQkgKiBvdmVyd3JpdGUgcmVhZCBvbmx5IHBvcnRpb25zLCBkbyB5b3Ugd2FudCB0byBjb250aW51ZSIuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHNvdXJjZSwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5nKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHRvIHJlbWVtYmVyIGluZm8gYWJvdXQgdGhlIGVuY29kaW5nIFdoZW4gdGhlIHJlc291cmNlCi0JICogd2FzIGxhc3QgbG9hZGVkIG9yIHNhdmVkLiBOb3RlOiBpdCBpcyBub3Qga2VwdCAiY3VycmVudCIsIHRoYXQgaXMsIGNhbgotCSAqIG5vdCBiZSBkZXBlbmRlZCBvbiBibGluZGx5IHRvIHJlZmxlY3Qgd2hhdCBlbmNvZGluZyB0byB1c2UuIEZvciB0aGF0LAotCSAqIG11c3QgZ28gdGhyb3VnaCB0aGUgbm9ybWFsIHJ1bGVzIGV4cHJlc3NlZCBpbiBMb2FkZXJzIGFuZCBEdW1wZXJzLgotCSAqLwotCXZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pOwotCi0JcHVibGljIHZvaWQgc2V0TGluZURlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKTsKLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgQVBJcyB0byBtYW5pcHVsYXRlIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IGluIHRlcm1zIG9mIFRleHQuCi0JICogCi0JICogVGhlIHNldFRleHQgbWV0aG9kIHJlcGxhY2VzIGFsbCB0ZXh0IGluIHRoZSBtb2RlbC4KLQkgKi8KLQlOZXdNb2RlbEV2ZW50IHNldFRleHQoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGFsbFRleHQpOwotCi0Jdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTJmNDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLQotCi0KLS8qKgotICogQSBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gaXMgYSBjb2xsZWN0aW9uIG9mIElUZXh0UmVnaW9ucy4gSXQgaXMgYSBzdHJ1Y3R1cmFsCi0gKiB1bml0LCBidXQgYSBtaW5pbWFsIG9uZS4gRm9yIGV4YW1wbGUsIGluIG1pZ2h0IGNvbnNpc3Qgb2YgYSAic3RhcnQgdGFnIiBidXQKLSAqIG5vdCBhIHdob2xlIFhNTCBub2RlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gewotCi0JLyoqCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIGFkZFJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKTsKLQotCS8qKgotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RMZW5ndGhXaXRoKGludCBpKTsKLQotCS8qKgotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RTdGFydChpbnQgaSk7Ci0KLQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0KCk7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCk7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzKCk7Ci0KLQlib29sZWFuIGlzRGVsZXRlZCgpOwotCi0JYm9vbGVhbiBpc0VuZGVkKCk7Ci0KLQlib29sZWFuIHNhbWVBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KTsKLQotCWJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpOwotCi0Jdm9pZCBzZXREZWxldGVkKGJvb2xlYW4gZGVsZXRlZCk7Ci0KLQkvKioKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0RW5kZWQoYm9vbGVhbiBoYXNFbmQpOwotCi0JLyoqCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldExlbmd0aChpbnQgbmV3TGVuZ3RoKTsKLQotCS8qKgotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCk7Ci0KLQkvKioKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0UGFyZW50RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCk7Ci0KLQkvKioKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cyk7Ci0KLQkvKioKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KTsKLQotCS8qKgotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCBzdGFydCwgaW50IGVuZCk7Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTkwNmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLS8qKgotICogVGhpcyBpcyBhIGNsYXNzIHVzZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgc28gdGhlCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiBob3cgdGhlIGxpc3QgaXMgZm9ybWVkIGNhbiBiZSBoaWRkZW4gKGVuY2Fwc3VsYXRlZCBieQotICogdGhpcyBjbGFzcykuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgewotCi0JRW51bWVyYXRpb24gZWxlbWVudHMoKTsKLQotCWludCBnZXRMZW5ndGgoKTsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXRlbShpbnQgaSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E3MGE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci0KLQotLyoqCi0gKiBBIHBhcnRpdGlvbmVyIGludGVyZmFjZSByZXF1aXJlZCBieSB0aGUgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCBmb3IKLSAqIGhhbmRsaW5nIHRoZSBlbWJlZGRlZCBjb250ZW50IHR5cGUgcHJvcGVybHkuIFRoaXMgaGFzIG5vdCB5ZXQgYmVlbgotICogZmluYWxpemVkLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgZXh0ZW5kcyBJRG9jdW1lbnRQYXJ0aXRpb25lciB7Ci0Jdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIChkbXcpIG5vdCBzdXJlIHdoeSB3ZSBuZWVkZWQgdG8gbWFrZSB0aGlzIHBhcnQgb2YKLQkgKiAgICAgICAgICAgICBpbnRlcmZhY2UgLi4uIGJ1dCBwcm9iYWJseSBzaG91bGRuJ3QgYmUuCi0JICogCi0JICogKG5zZCkgVXNlZCBieSBKU1AgcGFydGl0aW9uZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHBhcnRpdGlvbmVyIG9mIHRoZQotCSAqIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSBnZXRzIHRvIGNyZWF0ZSB0aGUgcGFydGl0aW9uIGluIGNhc2UgdGhlIHNwZWNpZmljCi0JICogY2xhc3NlcyBhcmUgaW1wb3J0YW50LgotCSAqLwotCVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpOwotCi0Jdm9pZCBkaXNjb25uZWN0KCk7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdCgpOwotCi0JU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKTsKLQotCVN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCk7Ci0KLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c05vZGUsIElUZXh0UmVnaW9uIHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlLCBJVGV4dFJlZ2lvbiBuZXh0RW5kVGFnTmFtZVJlZ2lvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JU3RydWN0dXJlZFRleHRSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2QwYzExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JU3RydWN0dXJlZFRleHRSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIHsKLQotCXZvaWQgaW5pdGlhbGl6ZShPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGluIGFudGljaXBhdGlvbiBvZiBldmVudHVhbCBtdWx0aXRocmVhZGluZy4KLQkgKiBUaGlzIGlzIG5lZWRlZCBzaW5jZSB0aGUgaW50aWFsaXplIG1ldGhvZCBzZXRzIHN0YXRlIHZhcmlhYmxlcyB0aGF0Ci0JICogbXVzdCBiZSAiaW4gc3luYyIgd2l0aCB0aGUgc3RydWN0dXJlZERvY3VtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyc2luZygpOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBBbiBlbnRyeSBwb2ludCBmb3IgcmVwYXJzaW5nLiBJdCBjYWxjdWxhdGVzIHRoZSBkaXJ0eSBzdGFydCBhbmQgZGlydHkKLQkgKiBlbmQgZmxhdG5vZGVzIGJhc2VkIG9uIHRoZSBzdGFydCBwb2ludCBhbmQgbGVuZ3RoIG9mIHRoZSBjaGFuZ2VzLCB3aGljaAotCSAqIGFyZSBwcm92aWRlZCBieSB0aGUgaW5pdGlhbGl6ZSBtZXRob2QuCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lUZXh0UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVRleHRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2MWZlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVRleHRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCi0KLQotLyoqCi0gKiBBIHNpbXBsZSBkZXNjcmlwdGlvbiBvZiBhIGJpdCBvZiB0ZXh0ICh0ZWNobmljYWxseSwgYSBiaXQgb2YgYSB0ZXh0IGJ1ZmZlcikKLSAqIHRoYW4gaGFzIGEgInR5cGUiIGFzc29jaWF0ZWQgd2l0aCBpdC4gRm9yIGV4YW1wbGUsIGZvciB0aGUgWE1MIHRleHQKLSAqICImTFQ7SU1HJkdUOyIsIHRoZSAnIDwnIG1pZ2h0IGZvcm0gYSByZWdpb24gb2YgdHlwZSAib3BlbiBicmFja2V0IiB3aGVyZSBhcwotICogdGhlIHRleHQgIklNRyIgbWlnaHQgZm9ybSBhIHJlZ2lvbiBvZiB0eXBlICJ0YWcgbmFtZSIuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGVyZSBhcmUgdGhyZWUgcG9zaXRpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHJlZ2lvbiwgdGhlIHN0YXJ0LAotICogdGhlIGVuZCwgYW5kIHRoZSBlbmQgb2YgdGhlIHRleHQuIFRoZSBlbmQgb2YgdGhlIHJlZ2lvbiBzaG91bGQgYWx3YXlzIGJlCi0gKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGVuZCBvZiB0aGUgdGV4dCwgYmVjYXVzZSB0aGUgZW5kIG9mIHRoZSB0ZXh0Ci0gKiBzaW1wbHkgaW5jbHVkZXMgYW55IHdoaXRlIHNwYWNlIHRoYXQgbWlnaHQgZm9sbG93IHRoZSBub24td2hpdGVzcGFjZQotICogcG9ydGlvbiBvZiB0aGUgcmVnaW9uLiBUaGlzIHdoaXRlc3BhY2UgaXMgYXNzdW1lZCB0byBiZSBpZ25vcmFibGUgZXhjZXB0Ci0gKiBmb3IgcmVhc29ucyBvZiBtYWludGFpbmluZyBpdCBpbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgZm9yIGZvcm1hdHRpbmcsCi0gKiBhcHBlYXJhbmNlLCBldGMuCi0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb24gewotCi0JLyoqCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIGFkanVzdExlbmd0aFdpdGgoaW50IGkpOwotCi0JLyoqCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIGFkanVzdFN0YXJ0KGludCBpKTsKLQotCS8qKgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKTsKLQotCXZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQlpbnQgZ2V0RW5kKCk7Ci0KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQlpbnQgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIEluIHNvbWUgaW1wbGVtZW50YXRpb25zLCB0aGUgImVuZCIgb2YgdGhlIHJlZ2lvbiAoYWNjZXNzaWJsZSB2aWEKLQkgKiBnZXRFbmQoKSkgYWxzbyBjb250YWlucyBhbnkgYW5kIGFsbCB3aGl0ZSBzcGFjZSB0aGF0IG1heSBvciBtYXkgbm90IGJlCi0JICogcHJlc2VudCBhZnRlciB0aGUgInRva2VuIiAocmVhZDogcmVsZXZhbnQpIHBhcnQgb2YgdGhlIHJlZ2lvbi4gVGhpcwotCSAqIG1ldGhvZCwgZ2V0VGV4dEVuZCgpLCBpcyBzcGVjaWZpYyBmb3IgdGhlICJ0b2tlbiIgcGFydCBvZiB0aGUgcmVnaW9uLAotCSAqIHdpdGhvdXQgdGhlIHdoaXRlc3BhY2UuCi0JICovCi0JaW50IGdldFRleHRFbmQoKTsKLQotCS8qKgotCSAqIFRoZSB0ZXh0IGxlbmd0aCBpcyBlcXVhbCB0byBsZW5ndGggaWYgdGhlcmUgaXMgbm8gd2hpdGUgc3BhY2UgYXQgdGhlCi0JICogZW5kIG9mIGEgcmVnaW9uLiBPdGhlcndpc2UgaXQgaXMgc21hbGxlciB0aGFuIGxlbmd0aC4KLQkgKi8KLQlpbnQgZ2V0VGV4dExlbmd0aCgpOwotCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gZmV3IGltcGxlbWVudCB0aGlzIGluIGEgbWVhbmluZ2Z1bCB3YXkuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lUZXh0UmVnaW9uQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lUZXh0UmVnaW9uQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDkzM2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JVGV4dFJlZ2lvbkNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb25Db2xsZWN0aW9uIGV4dGVuZHMgSVRleHRSZWdpb24gewotCi0JYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSk7Ci0KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IGkpOwotCi0Jdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKTsKLQotCWludCBnZXRFbmRPZmZzZXQoKTsKLQotCWludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCUlUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCk7Ci0KLQlTdHJpbmcgZ2V0RnVsbFRleHQoKTsKLQotCVN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpOwotCi0JaW50IGdldExlbmd0aCgpOwotCi0JaW50IGdldE51bWJlck9mUmVnaW9ucygpOwotCi0JSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCk7Ci0KLQlJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpOwotCi0JaW50IGdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCVN0cmluZyBnZXRUZXh0KCk7Ci0KLQlTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JaW50IGdldFRleHRFbmRPZmZzZXQoKTsKLQotCWludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbik7Ci0KLQkvKioKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JVGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lUZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjBhNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lUZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0OwotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGV4dFJlZ2lvbkNvbnRhaW5lciBleHRlbmRzIElUZXh0UmVnaW9uQ29sbGVjdGlvbiB7Ci0KLQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZ2V0UGFyZW50KCk7Ci0KLQkvKioKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCi0Jdm9pZCBzZXRQYXJlbnQoSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVRleHRSZWdpb25MaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVRleHRSZWdpb25MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOGQzZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lUZXh0UmVnaW9uTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0UmVnaW9uTGlzdCB7Ci0JcHVibGljIGJvb2xlYW4gYWRkKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluc2VydFBvcywgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMpOwotCi0JcHVibGljIHZvaWQgY2xlYXIoKTsKLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXQoaW50IGluZGV4KTsKLQotCXB1YmxpYyBpbnQgaW5kZXhPZihJVGV4dFJlZ2lvbiByZWdpb24pOwotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpOwotCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCk7Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gcmVtb3ZlKGludCBpbmRleCk7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVRleHRSZWdpb24gcmVnaW9uKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCk7Ci0KLQlwdWJsaWMgaW50IHNpemUoKTsKLQotCXB1YmxpYyBJVGV4dFJlZ2lvbltdIHRvQXJyYXkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L1NpbXBsZVN0cnVjdHVyZWRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9TaW1wbGVTdHJ1Y3R1cmVkUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYjVjNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L1NpbXBsZVN0cnVjdHVyZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci0KLQotCi0vKioKLSAqIFNpbWlsYXIgdG8gamZhY2UgcmVnaW9uIGV4Y2VwdCB3ZSB3YW50ZWQgYSBzZXR0aW5nIG9uIGxlbmd0aAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU3RydWN0dXJlZFJlZ2lvbiBpbXBsZW1lbnRzIFN0cnVjdHVyZWRSZWdpb24gewotCS8qKiBUaGUgcmVnaW9uIGxlbmd0aCAqLwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0KLQkvKiogVGhlIHJlZ2lvbiBvZmZzZXQgKi8KLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU3RydWN0dXJlZFJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogVHdvIHJlZ2lvbnMgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBvZmZzZXQgYW5kIGxlbmd0aC4KLQkgKiAKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJUmVnaW9uKSB7Ci0JCQlJUmVnaW9uIHIgPSAoSVJlZ2lvbikgbzsKLQkJCXJldHVybiByLmdldE9mZnNldCgpID09IGZPZmZzZXQgJiYgci5nZXRMZW5ndGgoKSA9PSBmTGVuZ3RoOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlZ2lvbiNnZXRMZW5ndGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWdpb24jZ2V0T2Zmc2V0Ci0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlIGhhc2NvZGUgaXMgb3ZlcnJpZGRlbiBzaW5jZSB3ZSBwcm92aWRlIG91ciBvd24KLQkgKiAgICAgIGVxdWFscy4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKGZPZmZzZXQgPDwgMjQpIHwgKGZMZW5ndGggPDwgMTYpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aC4KLQkgKiAKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICBUaGUgbGVuZ3RoIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9TaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9TaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmMTExNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0OwotCi0KLQotLyoqCi0gKiBTaW1pbGFyIGphY2UgVHlwZWRSZWdpb24sIGJ1dCBoYWQgdG8gc3ViY2xhc3Mgb3VyIHZlcnNpb24gd2hpY2ggYWxsb3dlZAotICogbGVuZ3RoIHRvIGJlIHNldC4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBleHRlbmRzIFNpbXBsZVN0cnVjdHVyZWRSZWdpb24gaW1wbGVtZW50cyBTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gewotCi0JLyoqIFRoZSByZWdpb24ncyB0eXBlICovCi0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdHlwZWQgcmVnaW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBzcGVjaWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24ncyBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uJ3MgbGVuZ3RoCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24ncyB0eXBlCi0JICovCi0JcHVibGljIFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlcihvZmZzZXQsIGxlbmd0aCk7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUd28gdHlwZWQgcG9zaXRpb25zIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgb2Zmc2V0LCBsZW5ndGgsIGFuZAotCSAqIHR5cGUuCi0JICogCi0JICogQHNlZSBPYmplY3QjZXF1YWxzCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uKSB7Ci0JCQlTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gciA9IChTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24pIG87Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKHIpICYmICgoZlR5cGUgPT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBudWxsKSB8fCBmVHlwZS5lcXVhbHMoci5nZXRUeXBlKCkpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElUeXBlZFJlZ2lvbiNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IHR5cGUgPSBmVHlwZSA9PSBudWxsID8gMCA6IGZUeXBlLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpIHwgdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzLmFwcGVuZChnZXRPZmZzZXQoKSk7Ci0JCXMuYXBwZW5kKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJcy5hcHBlbmQoZ2V0TGVuZ3RoKCkpOwotCQlzLmFwcGVuZCgiIC0gIik7IC8vJE5PTi1OTFMtMSQKLQkJcy5hcHBlbmQoZ2V0VHlwZSgpKTsKLQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9TdHJ1Y3R1cmVkUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvU3RydWN0dXJlZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZhY2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9TdHJ1Y3R1cmVkUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotCi0vKioKLSAqIExpa2Ugc3VwZXIgY2xhc3MgZXhjZXB0IGFsbG93cyBsZW5ndGggYW5kIG9mZnNldCB0byBiZSBtb2RpZmllZC4gVGhpcyBpcwotICogY29udmVuaWVudCBmb3Igc29tZSBhbGdvcml0aG1zLCBhbmQgYWxsb3dzIHJlZ2lvbiBvYmplY3RzIHRvIGJlIHJldXNlZC4KLSAqIE5vdGU6IFRoZXJlIE1JR0hUIGJlIHNvbWUgY29kZSB0aGF0IGFzc3VtZXMgcmVnaW9ucyBhcmUgaW1tdXRhYmxlLiBUaGlzCi0gKiBjbGFzcyB3b3VsZCBub3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRob3NlIHVzZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZFJlZ2lvbiBleHRlbmRzIElSZWdpb24gewotCXZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpOwotCi0Jdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YWVlMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L1N0cnVjdHVyZWRUeXBlZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotCi0vKioKLSAqIFNpbWlsYXIgdG8gZXh0ZW5kZWQgaW50ZXJmYWNlLCBleGNlcHQgaXQgYWxsb3dzIHRoZSBsZW5ndGgsIG9mZnNldCwgYW5kCi0gKiB0eXBlIHRvIGJlIHNldC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBpdGVyYXRpbmcgdGhyb3VnaCBhIG51bWJlciBvZiAic21hbGwiCi0gKiByZWdpb25zLCB0aGF0IGFsbCBtYXAgdG8gdGhlIHRoZSBzYW1lIHBhcnRpb24gcmVnaW9ucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gZXh0ZW5kcyBTdHJ1Y3R1cmVkUmVnaW9uLCBJVHlwZWRSZWdpb24gewotCXZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzNTY2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQucnVsZXM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LlNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5TdHJ1Y3R1cmVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LlN0cnVjdHVyZWRUeXBlZFJlZ2lvbjsKLQotCi0vKioKLSAqIEJhc2UgRG9jdW1lbnQgcGFydGl0aW9uZXIgZm9yIFN0cnVjdHVyZWREb2N1bWVudHMuIEJMT0NLX1RFWFQgSVRleHRSZWdpb25zCi0gKiBoYXZlIGEgcGFydGl0aW9uIHR5cGUgb2YgQkxPQ0sgb3IgQkxPQ0s6VEFHTkFNRSBpZiBhIHN1cnJvdW5kaW5nIHRhZ25hbWUKLSAqIHdhcyByZWNvcmRlZC4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRQYXJ0aXRpb25lciB7Ci0KLQlzdGF0aWMgY2xhc3MgQ2FjaGVkQ29tcHV0ZWRQYXJ0aXRpb25zIHsKLQkJaW50IGZMZW5ndGg7Ci0JCWludCBmT2Zmc2V0OwotCQlJVHlwZWRSZWdpb25bXSBmUGFydGl0aW9uczsKLQkJYm9vbGVhbiBpc0luVmFsaWQ7Ci0KLQkJQ2FjaGVkQ29tcHV0ZWRQYXJ0aXRpb25zKGludCBvZmZzZXQsIGludCBsZW5ndGgsIElUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMpIHsKLQkJCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQlmTGVuZ3RoID0gbGVuZ3RoOwotCQkJZlBhcnRpdGlvbnMgPSBwYXJ0aXRpb25zOwotCQkJaXNJblZhbGlkID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUX0RFRkFVTFRfUEFSVElUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVF9VTktOT1dOX1BBUlRJVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLlVOS05PV05fUEFSVElUSU9OX1RZUEUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDYWNoZWRDb21wdXRlZFBhcnRpdGlvbnMgY2FjaGVkUGFydGl0aW9ucyA9IG5ldyBDYWNoZWRDb21wdXRlZFBhcnRpdGlvbnMoLTEsIC0xLCBudWxsKTsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZlN1cHBvcnRlZFR5cGVzID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFR5cGVkUmVnaW9uIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlID0gbmV3IFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbigwLCAwLCBTVF9ERUZBVUxUX1BBUlRJVElPTik7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50OwotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbmluZyBvZiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGNvbm5lY3RlZCBkb2N1bWVudC4KLQkgKiBUaGVyZSBtdXN0IGJlIGEgZG9jdW1lbnQgY29ubmVjdGVkIHRvIHRoaXMgcGFydGl0aW9uZXIuCi0JICogCi0JICogTm90ZTogdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmN0bHkgYnkgY2xpZW50cywgdW5sZXNzIHRoZXkgY29udHJvbAotCSAqIHRoZSB0aHJlYWRpbmcgdGhhdCBpbmNsdWRlcyBtb2RpZmljYXRpb25zIHRvIHRoZSBkb2N1bWVudC4gT3RoZXJ3aXNlCi0JICogdGhlIGRvY3VtZW50IGNvdWxkIGJlIG1vZGlmaWVkIHdoaWxlIHBhcnRpdGlvbnMgYXJlIGJlaW5nIGNvbXB1dGVkLiBXZQotCSAqIGFkdmlzZSB0aGF0IGNsaWVudHMgdXNlIHRoZSBjb21wdXRlUGFydGlvbnMgQVBJIGRpcmVjdGx5IGZyb20gdGhlCi0JICogZG9jdW1lbnQsIHNvIHRoZXkgd29uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJhbmdlIG9mIGludGVyZXN0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2Ugb2YgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aXRpb25pbmcgb2YgdGhlIHJhbmdlCi0JICovCi0JcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRvY3VtZW50IHBhcnRpdGlvbmVyIGlzIG5vdCBjb25uZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlUeXBlZFJlZ2lvbltdIHJlc3VsdHMgPSBudWxsOwotCi0KLQotCQlpZiAoKCFjYWNoZWRQYXJ0aXRpb25zLmlzSW5WYWxpZCkgJiYgKG9mZnNldCA9PSBjYWNoZWRQYXJ0aXRpb25zLmZPZmZzZXQpICYmIChsZW5ndGggPT0gY2FjaGVkUGFydGl0aW9ucy5mTGVuZ3RoKSkgewotCQkJcmVzdWx0cyA9IGNhY2hlZFBhcnRpdGlvbnMuZlBhcnRpdGlvbnM7Ci0JCX0gZWxzZSB7Ci0KLQkJCWlmIChsZW5ndGggPT0gMCkgewotCQkJCXJlc3VsdHMgPSBuZXcgSVR5cGVkUmVnaW9uW117Z2V0UGFydGl0aW9uKG9mZnNldCl9OwotCQkJfSBlbHNlIHsKLQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaW50IGVuZFBvcyA9IG9mZnNldCArIGxlbmd0aDsKLQkJCQlpZiAoZW5kUG9zID4gc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJCS8vIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBtb2RlbCBpbnN0YW5jZSBpcyBiZWluZwotCQkJCQkvLyBjaGFuZ2VkCi0JCQkJCS8vIGFuZCBldmVyeW9uZSdzIG5vdCB5ZXQgdXAgdG8gZGF0ZQotCQkJCQlyZXR1cm4gbmV3IElUeXBlZFJlZ2lvbltde2NyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgZ2V0VW5rbm93bigpKX07Ci0JCQkJfQotCQkJCWludCBjdXJyZW50UG9zID0gb2Zmc2V0OwotCQkJCVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBwcmV2aW91c1BhcnRpdGlvbiA9IG51bGw7Ci0JCQkJd2hpbGUgKGN1cnJlbnRQb3MgPCBlbmRQb3MpIHsKLQkJCQkJaW50ZXJuYWxHZXRQYXJ0aXRpb24oY3VycmVudFBvcywgZmFsc2UpOwotCQkJCQljdXJyZW50UG9zICs9IGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldExlbmd0aCgpOwotCQkJCQkvLyBjaGVjayBpZiB0aGlzIHBhcnRpdGlvbiBqdXN0IGNvbnRpbnVlcyBsYXN0IG9uZQotCQkJCQkvLyAodHlwZSBpcyB0aGUgc2FtZSksCi0JCQkJCS8vIGlmIHNvLCBqdXN0IGV4dGVuZCBsZW5ndGggb2YgbGFzdCBvbmUsIG5vdCBuZWVkIHRvCi0JCQkJCS8vIGNyZWF0ZSBuZXcKLQkJCQkJLy8gaW5zdGFuY2UuCi0JCQkJCWlmIChwcmV2aW91c1BhcnRpdGlvbiAhPSBudWxsICYmIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldFR5cGUoKS5lcXVhbHMocHJldmlvdXNQYXJ0aXRpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJLy8gc2FtZSBwYXJ0aXRpb24gdHlwZQotCQkJCQkJcHJldmlvdXNQYXJ0aXRpb24uc2V0TGVuZ3RoKHByZXZpb3VzUGFydGl0aW9uLmdldExlbmd0aCgpICsgaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2UuZ2V0TGVuZ3RoKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbm90IHRoZSBzYW1lLCBzbyBhZGQgdG8gbGlzdAotCQkJCQkJU3RydWN0dXJlZFR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IGNyZWF0ZU5ld1BhcnRpdGlvbkluc3RhbmNlKCk7Ci0JCQkJCQlsaXN0LmFkZChwYXJ0aXRpb24pOwotCQkJCQkJLy8gYW5kIG1ha2UgY3VycmVudCwgcHJldmlvdXMKLQkJCQkJCXByZXZpb3VzUGFydGl0aW9uID0gcGFydGl0aW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlc3VsdHMgPSBuZXcgSVR5cGVkUmVnaW9uW2xpc3Quc2l6ZSgpXTsKLQkJCQlsaXN0LnRvQXJyYXkocmVzdWx0cyk7Ci0JCQl9Ci0JCQlpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7Ci0JCQkJLy8gdHJ1bmNhdGUgcmV0dXJuZWQgcmVzdWx0cyB0byByZXF1ZXN0ZWQgcmFuZ2UKLQkJCQlpZiAocmVzdWx0c1swXS5nZXRPZmZzZXQoKSA8IG9mZnNldCAmJiByZXN1bHRzWzBdIGluc3RhbmNlb2YgU3RydWN0dXJlZFJlZ2lvbikgewotCQkJCQkoKFN0cnVjdHVyZWRSZWdpb24pIHJlc3VsdHNbMF0pLnNldE9mZnNldChvZmZzZXQpOwotCQkJCX0KLQkJCQlpbnQgbGFzdEVuZCA9IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXS5nZXRPZmZzZXQoKSArIHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXS5nZXRMZW5ndGgoKTsKLQkJCQlpZiAobGFzdEVuZCA+IG9mZnNldCArIGxlbmd0aCAmJiByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkUmVnaW9uKSB7Ci0JCQkJCSgoU3RydWN0dXJlZFJlZ2lvbikgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdKS5zZXRMZW5ndGgob2Zmc2V0ICsgbGVuZ3RoIC0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLmdldE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGggPSBsZW5ndGg7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZQYXJ0aXRpb25zID0gcmVzdWx0czsKLQkJCWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0KLQotCS8qKgotCSAqIENvbm5lY3RzIHRoZSBkb2N1bWVudCB0byB0aGUgcGFydGl0aW9uZXIsIGkuZS4gaW5kaWNhdGVzIHRoZSBiZWdpbiBvZgotCSAqIHRoZSB1c2FnZSBvZiB0aGUgcmVjZWl2ZXIgYXMgcGFydGl0aW9uZXIgb2YgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmlzSW5WYWxpZCA9IHRydWU7Ci0JCQl0aGlzLnN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudDsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoaXMgY2xhc3MgYW5kIEFQSSBhcmUgZm9yIFN0cnVjdHVyZWQgRG9jdW1lbnRzIG9ubHkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gSVRleHRSZWdpb25Db250YWluZXIgaXRzZWxmIGNvbnRhaW5zIGFub3RoZXIKLQkgKiBJVGV4dFJlZ2lvbkNvbnRhaW5lcgotCSAqIAotCSAqIEBwYXJhbSBJVGV4dFJlZ2lvbkNvbnRhaW5lcgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zRW1iZWRkZWRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIpIHsKLQkJYm9vbGVhbiBjb250YWluc0VtYmVkZGVkUmVnaW9uID0gZmFsc2U7Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJY29udGFpbnNFbWJlZGRlZFJlZ2lvbiA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5zRW1iZWRkZWRSZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gY3JlYXRlTmV3UGFydGl0aW9uSW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uKGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldE9mZnNldCgpLCBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRMZW5ndGgoKSwgaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2UuZ2V0VHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb25jcmV0ZSBwYXJ0aXRpb24gZnJvbSB0aGUgZ2l2ZW4gdmFsdWVzLiBSZXR1cm5zIGEgbmV3Ci0JICogaW5zdGFuY2UgZm9yIGVhY2ggY2FsbC4KLQkgKiAKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybiBJVHlwZWRSZWdpb24KLQkgKiAKLQkgKiBUT0RPOiBzaG91bGQgYmUgcHJvdGVjdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUpOwotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3RzIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBwYXJ0aXRpb25lciwgaS5lLiBpbmRpY2F0ZXMgdGhlIGVuZAotCSAqIG9mIHRoZSB1c2FnZSBvZiB0aGUgcmVjZWl2ZXIgYXMgcGFydGl0aW9uZXIgb2YgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNkaXNjb25uZWN0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJY2FjaGVkUGFydGl0aW9ucy5pc0luVmFsaWQgPSB0cnVlOwotCQl0aGlzLnN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhYm91dCBhIGZvcnRoY29taW5nIGRvY3VtZW50IGNoYW5nZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJY2FjaGVkUGFydGl0aW9ucy5pc0luVmFsaWQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRoZSBkb2N1bWVudCBoYXMgYmVlbiBjaGFuZ2VkLiBUaGUgcGFydGl0aW9uZXIgdXBkYXRlcyB0aGUgc2V0IG9mCi0JICogcmVnaW9ucyBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZwotCSAqIGhhcyBiZWVuIGNoYW5nZWQsIGkuZS4gd2hldGhlciBwYXJ0aXRpb25zIGhhdmUgYmVlbiBhZGRlZCBvciByZW1vdmVkLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgewotCQkJLy8gcGFydGl0aW9ucyBkb24ndCBhbHdheXMgY2hhbmdlIHdoaWxlIGRvY3VtZW50IHJlZ2lvbnMgZG8sCi0JCQkvLyBidXQgdGhhdCdzIHRoZSBvbmx5ICJxdWljayBjaGVjayIgd2UgaGF2ZS4KLQkJCS8vIEknbSBub3Qgc3VyZSBpZiBzb21ldGhpbmcgbW9yZSBzb3BoaXN0aWNhdGVkIHdpbGwgYmUgbmVlZGVkCi0JCQkvLyBpbiB0aGUgZnV0dXJlLiAoZG13LCAwMi8xOC8wNCkuCi0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9QYXJzZXJTcGVjaWZpY0NoZWNrKGludCBvZmZzZXQsIGJvb2xlYW4gcGFydGl0aW9uRm91bmQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5leHQsIElUZXh0UmVnaW9uIHByZXZpb3VzU3RhcnQpIHsKLQkJLy8gdGhpcyAoY29uY2VwdHVhbGx5KSBhYnN0cmFjdCBtZXRob2QgaXMgbm90IGNvbmNlcm5lZCB3aXRoCi0JCS8vIHNwZWNpZmljIHJlZ2lvbiB0eXBlcwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4KLQkgKiBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgdGhlIGdpdmVuIGRvY3VtZW50LiBUaGUgZG9jdW1lbnQgaGFzIHByZXZpb3VzbHkKLQkgKiBiZWVuIGNvbm5lY3RlZCB0byB0aGUgcGFydGl0aW9uZXIuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2dldENvbnRlbnRUeXBlKGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGdldFBhcnRpdGlvbihvZmZzZXQpLmdldFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUbyBiZSB1c2VkIGJ5IGRlZmF1bHQhCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0KCkgewotCi0JCXJldHVybiBTVF9ERUZBVUxUX1BBUlRJVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIGNvbnRlbnQgdHlwZXMgdGhlIHBhcnRpdG9uZXIgc3VwcG9ydHMuCi0JICogSS5lLiBBbnkgcmVzdWx0IGRlbGl2ZXJlZCBieSB0aGlzIHBhcnRpdGlvbmVyIG1heSBub3QgY29udGFpbiBhIGNvbnRlbnQKLQkgKiB0eXBlIHdoaWNoIHdvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGlzIG1ldGhvZCdzIHJlc3VsdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZ2V0TGVnYWxDb250ZW50VHlwZXMoKQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCWlmIChmU3VwcG9ydGVkVHlwZXMgPT0gbnVsbCkgewotCQkJaW5pdExlZ2FsQ29udGVudFR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGZTdXBwb3J0ZWRUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZQotCSAqIGdpdmVuIGRvY3VtZW50LiBUaGUgZG9jdW1lbnQgaGFzIHByZXZpb3VzbHkgYmVlbiBjb25uZWN0ZWQgdG8gdGhlCi0JICogcGFydGl0aW9uZXIuCi0JICogCi0JICogTm90ZTogdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmN0bHkgYnkgY2xpZW50cywgdW5sZXNzIHRoZXkgY29udHJvbAotCSAqIHRoZSB0aHJlYWRpbmcgdGhhdCBpbmNsdWRlcyBtb2RpZmljYXRpb25zIHRvIHRoZSBkb2N1bWVudC4gT3RoZXJ3aXNlCi0JICogdGhlIGRvY3VtZW50IGNvdWxkIGJlIG1vZGlmaWVkIHdoaWxlIHBhcnRpdGlvbnMgYXJlIGJlaW5nIGNvbXB1dGVkLiBXZQotCSAqIGFkdmlzZSB0aGF0IGNsaWVudHMgdXNlIHRoZSBnZXRQYXJ0aXRpb24gQVBJIGRpcmVjdGx5IGZyb20gdGhlCi0JICogZG9jdW1lbnQsIHNvIHRoZXkgd29uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LgotCSAqIAotCSAqIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNnZXRQYXJ0aXRpb24oaW50KQotCSAqLwotCXB1YmxpYyBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKGludCBvZmZzZXQpIHsKLQkJaW50ZXJuYWxHZXRQYXJ0aXRpb24ob2Zmc2V0LCB0cnVlKTsKLQkJcmV0dXJuIGNyZWF0ZU5ld1BhcnRpdGlvbkluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0LCBTdHJpbmcgcmVzdWx0KSB7Ci0JCS8vIHBhcnNlciBzZW5zaXRpdmUgY29kZSB3YXMgbW92ZWQgdG8gc3ViY2xhc3MgZm9yIHF1aWNrIHRyYW5zaXRpb24KLQkJLy8gdGhpcyAoY29uY2VwdHVhbGx5KSBhYnN0cmFjdCB2ZXJzaW9uIGlzbid0IGNvbmNlcm5lZCB3aXRoIGJsb2NrZWQKLQkJLy8gdGV4dAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0YWduYW1lID0gcmVnaW9uLmdldFN1cnJvdW5kaW5nVGFnKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAodGFnbmFtZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiQkxPQ0s6IiArIHRhZ25hbWUudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSAiQkxPQ0siOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLm1vZGVsLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjZ2V0UGFydGl0aW9uVHlwZShjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVRleHRSZWdpb24pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gYmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0KLQkJLy8gcmVnaW9ucyBzaG91bGQgbmV2ZXIgYmUgbnVsbCwgb3IgaG9sZCB6ZXJvIHJlZ2lvbnMsIGJ1dCBqdXN0IGluCi0JCS8vIGNhc2UuLi4KLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCAmJiByZWdpb25zLnNpemUoKSA+IDApIHsKLQkJCWlmIChyZWdpb25zLnNpemUoKSA9PSAxKSB7Ci0JCQkJLy8gaWYgb25seSBvbmUsIHRoZW4gaXRzIGEgInB1cmUiIGJsb2NrZWQgbm90ZS4KLQkJCQkvLyBpZiBtb3JlIHRoYW4gb25lLCB0aGVuIG11c3QgY29udGFpbiBzb21lIGVtYmVkZGVkIHJlZ2lvbgotCQkJCS8vIGNvbnRhaW5lcgotCQkJCUlUZXh0UmVnaW9uIGJsb2NrZWRSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJCQkvLyBkb3VibGUgY2hlY2sgZm9yIGNvZGUgc2FmZWZ5LCB0aG91Z2ggc2hvdWxkIGFsd2F5cyBiZSB0cnVlCi0JCQkJaWYgKGJsb2NrZWRSZWdpb24gaW5zdGFuY2VvZiBGb3JlaWduUmVnaW9uKSB7Ci0JCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKEZvcmVpZ25SZWdpb24pIGJsb2NrZWRSZWdpb24sIG9mZnNldCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBtdXN0IGhhdmUgc29tZSBlbWJlZGRlZCByZWdpb24gY29udGFpbmVyLCBzbyB3ZSdsbCBtYWtlCi0JCQkJLy8gc3VyZSB3ZSdsbCBnZXQgdGhlIGFwcHJvcHJpYXRlIG9uZQotCQkJCXJlc3VsdCA9IGdldFJlbGV2ZW50UmVnaW9uVHlwZShibG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBvZmZzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFBhcnRpdGlvblR5cGUuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJLy8gaWYgaXQgZ2V0J3MgdG8gdGhpcyAicmF3IiBsZXZlbCwgdGhlbgotCQkvLyBtdXN0IGJlIGRlZmF1bHQuCi0JCXJldHVybiBnZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIGJhc2VkIG9uIHJlZ2lvbiB0eXBlLiBUaGlzIGJhc2ljYWxseSBtYXBzIGZyb20KLQkgKiBvbmUgcmVnaW9uLXR5cGUgc3BhY2UgdG8gYW5vdGhlciwgaGlnaGVyIGxldmVsLCByZWdpb24tdHlwZSBzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gZ2V0RGVmYXVsdCgpOwotCQkvLwkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIENvbnRleHRSZWdpb25Db250YWluZXIpIHsKLQkJLy8JCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uLCBvZmZzZXQpOwotCQkvLwkJfSBlbHNlIHsKLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0KLQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uRnJvbUJsb2NrZWRUZXh0KHJlZ2lvbiwgb2Zmc2V0LCByZXN1bHQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIG1ldGhvZCB3aXRoICdJVGV4dFJlZ2lvbicgYXMgYXJndW1lbnQsIGV4Y2VwdCBmb3IKLQkgKiBSZWdpb25Db250YWluZXJzLCBpZiBpdCBoYXMgZW1iZWRkZWQgcmVnaW9ucywgdGhlbiB3ZSBuZWVkIHRvIGRyaWxsCi0JICogZG93biBhbmQgcmV0dXJuIERvY3VtZW50UGFydGl0aW9uIGJhc2VkIG9uICJsb3dlc3QgbGV2ZWwiIHJlZ2lvbiB0eXBlLgotCSAqIEZvciBleGFtcGxlLCBpbiA8Ym9keSBpZD0iIDwlPSBvYmplY3QuZ2V0SUQoKSAlPiIgPiBUaGUgdGV4dCBiZXR3ZWVuCi0JICogPCU9IGFuZCAlPiB3b3VsZCBiZSBhICJqYXZhIHJlZ2lvbiIgbm90IGFuICJIVE1MIHJlZ2lvbiIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uQ29udGFpbmVyIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyBUT0RPIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlICdjbGVhbmVkIHVwJyBhZnRlciByZWZhY3RvcmluZwotCQkvLyBpdHMgaW5zdGFuY2VvZiBsb2dpYyBzZWVtcyBtZXNzZWQgdXAgbm93LgotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjb3JlUmVnaW9uID0gcmVnaW9uOwotCQkJaWYgKGNvcmVSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb3JlUmVnaW9uLCAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb3JlUmVnaW9uKS5nZXRSZWdpb25zKCksIG9mZnNldCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUocmVnaW9uKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uKSByZWdpb24sIG9mZnNldCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb25Db250YWluZXIgY29yZVJlZ2lvbiwgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMsIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoY29yZVJlZ2lvbi5jb250YWluc09mZnNldChyZWdpb24sIG9mZnNldCkpIHsKLQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBwYXJ0aXRpb24gdHlwZSBmb3IgdGhlIHplcm8tbGVuZ3RoIHBhcnRpdGlvbiBiZXR3ZWVuIGEKLQkgKiBzdGFydCB0YWcgYW5kIGVuZCB0YWcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSByZWdpb25zLgotCSAqIAotCSAqIEBwYXJhbSBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbgotCSAqIEBwYXJhbSBuZXh0RW5kVGFnTmFtZVJlZ2lvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzTm9kZSwgSVRleHRSZWdpb24gcHJldmlvdXNTdGFydFRhZ05hbWVSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUsIElUZXh0UmVnaW9uIG5leHRFbmRUYWdOYW1lUmVnaW9uKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJVGV4dFJlZ2lvbiBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LiBGb3IgbW9zdCBjYXNlcywgdGhpcyB3aWxsCi0JICogYmUgdGhlIGZsYXROb2RlIGl0c2VsZi4gU2hvdWxkIGl0IGNvbnRhaW4gYW4gZW1iZWRkZWQKLQkgKiBJVGV4dFJlZ2lvbkNvbnRhaW5lciwgd2lsbCByZXR1cm4gdGhlIGludGVybmFsIHJlZ2lvbiBhdCB0aGUgb2Zmc2V0Ci0JICogCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gSVRleHRSZWdpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRSZWxldmVudFJlZ2lvblR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgaW50IG9mZnNldCkgewotCQkvLwkJKiBOb3RlOiB0aGUgb3JpZ2luYWwgZm9ybSBvZiB0aGlzIG1ldGhvZCAtLSB3aGljaCByZXR1cm5lZCAiZGVlcCIKLQkJLy8gcmVnaW9uLCBpc24ndCB0aGF0Ci0JCS8vCQkqIHVzZWZ1bCwgYWZ0ZXIgZG9pbmcgcGFyZW50IGVsaW1pbmF0aW9uIHJlZmFjdG9yaW5nLAotCQkvLwkJKiBzaW5jZSBvbmNlIHRoZSBkZWVwIHJlZ2lvbiBpcyByZXR1cm5lZCwgaXRzIGhhcmQgdG8gZ2V0IGl0cyB0ZXh0Ci0JCS8vIG9yIG9mZnNldCB3aXRob3V0Ci0JCS8vCQkqIHByb3BlciBwYXJlbnQuCi0JCUlUZXh0UmVnaW9uIHJlc3VsdFJlZ2lvbiA9IG51bGw7Ci0JCWlmIChjb250YWluc0VtYmVkZGVkUmVnaW9uKGZsYXROb2RlKSkgewotCQkJcmVzdWx0UmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChyZXN1bHRSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCXJlc3VsdFJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZXN1bHRSZWdpb24pLmdldFJlZ2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pIDw9IG9mZnNldCAmJiBvZmZzZXQgPCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSkgewotCQkJCQkJcmVzdWx0UmVnaW9uID0gcmVnaW9uOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHRSZWdpb24gPSBmbGF0Tm9kZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0UmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUbyBiZSB1c2VkLCBpbnN0ZWFkIG9mIGRlZmF1bHQsIHdoZW4gdGhlcmUgaXMgc29tZSB0aGluZyBzdXJwcmlzaW5nCi0JICogYWJvdXQgYXJlIGF0dGVtcHQgdG8gcGFydGl0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmtub3duKCkgewotCQlyZXR1cm4gU1RfVU5LTk9XTl9QQVJUSVRJT047Ci0JfQotCi0JLyoqCi0JICogdG8gYmUgYWJzdHJhY3QgZXZlbnR1YWxseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IFN0cmluZ1tde1NUX0RFRkFVTFRfUEFSVElUSU9OLCBTVF9VTktOT1dOX1BBUlRJVElPTn07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGNoYXJhY3RlciBwb3NpdGlvbiBvZiB0aGUKLQkgKiBnaXZlbiBkb2N1bWVudC4gVGhlIGRvY3VtZW50IGhhcyBwcmV2aW91c2x5IGJlZW4gY29ubmVjdGVkIHRvIHRoZQotCSAqIHBhcnRpdGlvbmVyLiBJZiB0aGUgY2hlY2tCZXR3ZWVuIHBhcmFtZXRlciBpcyB0cnVlLCBhbiBvZmZzZXQgYmV0d2VlbiBhCi0JICogc3RhcnQgYW5kIGVuZCB0YWcgd2lsbCByZXR1cm4gYSB6ZXJvLWxlbmd0aCByZWdpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsR2V0UGFydGl0aW9uKGludCBvZmZzZXQsIGJvb2xlYW4gY2hlY2tCZXR3ZWVuKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZG9jdW1lbnQgcGFydGl0aW9uZXIgaXMgbm90IGNvbm5lY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlib29sZWFuIHBhcnRpdGlvbkZvdW5kID0gZmFsc2U7Ci0JCWludCBkb2NMZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCS8vIGdldCBkb2N1bWVudCByZWdpb24gdHlwZSBhbmQgbWFwIHRvIHBhcnRpdGlvbiB0eXBlIDoKLQkJLy8gTm90ZTogYSBwYXJ0aW9uIGNhbiBiZSBzbWFsbGVyIHRoYW4gYSBmbGF0bm9kZSwgaWYgdGhhdCBmbGF0bm9kZQotCQkvLyBjb250YWlucyBhIHJlZ2lvbiBjb250YWluZXIuCi0JCS8vIFRoYXQncyB3aHkgd2UgbmVlZCB0byBnZXQgInJlbGV2ZW50IHJlZ2lvbiIuCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCS8vIGZsYXROb2RlIGlzIG51bGwgaWYgZW1wdHkgZG9jdW1lbnQKLQkJLy8gdGhpcyBpcyBraW5nIG9mIGEgIm5vcm1hbCBjYXNlIiBmb3IgZW1wdHkgZG9jdW1lbnQKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsICYmIGRvY0xlbmd0aCA9PSAwKSB7Ci0JCQkvLyBJbiBvcmRlciB0byBwcmV2ZW50IGluZmluaXRlIGVycm9yIGxvb3BzLCB0aGlzIHBhcnRpdGlvbiBtdXN0Ci0JCQkvLyBuZXZlciBoYXZlIGEgemVybyBsZW5ndGgKLQkJCS8vIHVubGVzcyB0aGUgZG9jdW1lbnQgaXMgYWxzbyB6ZXJvIGxlbmd0aAotCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCAwLCBnZXREZWZhdWx0KCkpOwotCQkJcGFydGl0aW9uRm91bmQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsICYmIGRvY0xlbmd0aCAhPSAwKSB7Ci0JCQkvLyB0aGlzIGNhc2UgaXMgInVudXN1YWwiLiBXaGVuIHdvdWxkIHJlZ2lvbiBiZSBudWxsLCBhbmQgZG9jdW1lbnQKLQkJCS8vIGxvbmdlcgotCQkJLy8gdGhhbiAwLiBJIHRoaW5rIHRoaXMgbWVhbnMgc29tZXRoaW5ncyAib3V0IG9mIHN5bmMiLiBBbmQgd2UgbWF5Ci0JCQkvLyB3YW50Ci0JCQkvLyB0byAiZmxhZyIgdGhhdCBmYWN0IGFuZCBqdXN0IHJldHVybiBvbmUgYmlnIHJlZ2lvbiBvZgotCQkJLy8gJ3Vua25vd24nLCBpbnN0ZWFkCi0JCQkvLyBvZiBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZS4KLQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMSwgZ2V0VW5rbm93bigpKTsKLQkJCXBhcnRpdGlvbkZvdW5kID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjaGVja0JldHdlZW4pIHsKLQkJCS8vIGRtdzogbWluaW1pemVzIG91dCB0byB0aGUgZmlyc3QgaWYgdGVzdCBhYm92ZQotCQkJLy8JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgJiYgZG9jTGVuZ3RoID09IDApIHsKLQkJCS8vCQkJCS8vIGtub3duIHNwZWNpYWwgY2FzZSBmb3IgYW4gZW1wdHkgZG9jdW1lbnQKLQkJCS8vCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMCwgZ2V0RGVmYXVsdCgpKTsKLQkJCS8vCQkJCXBhcnRpdGlvbkZvdW5kID0gdHJ1ZTsKLQkJCS8vCQkJfQotCQkJLy8JCQllbHNlCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPT0gb2Zmc2V0KSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJCWlmIChwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQkJSVRleHRSZWdpb24gcHJldmlvdXNTdGFydCA9IHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQlwYXJ0aXRpb25Gb3VuZCA9IGRvUGFyc2VyU3BlY2lmaWNDaGVjayhvZmZzZXQsIHBhcnRpdGlvbkZvdW5kLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBuZXh0LCBwcmV2aW91c1N0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZG13OiBHaXZlbiB0aGUgZmlyc3QgdHdvIHRlc3RzIGFib3ZlIG1pbmltaXplIHRvIHRoaXMsIHRoaXMgYmxvY2sKLQkJLy8gY2FuIG5ldmVyIHJ1biwgcmlnaHQ/Ci0JCS8vCQllbHNlIGlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkvLwkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMCwgZ2V0RGVmYXVsdCgpKTsKLQkJLy8JCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCS8vCQl9Ci0KLQkJaWYgKCFwYXJ0aXRpb25Gb3VuZCkgewotCQkJSVRleHRSZWdpb24gcmVzdWx0UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlwYXJ0aXRpb25Gb3VuZCA9IGlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlc3VsdFJlZ2lvbiwgb2Zmc2V0KTsKLQkJCWlmICghcGFydGl0aW9uRm91bmQpIHsKLQkJCQkvLyBOb3RlOiB0aGlzIG5ldyBsb2dpYyBkb2Vzbid0IGhhbmRsZSBjb250YWluZXIgcmVnaW9ucwotCQkJCS8vIGluc2lkZSBvZgotCQkJCS8vIGNvbnRhaW5lciByZWdpb25zIC4uLiBtYXkgbmVlZCB0byBtYWtlIHRoaXMgZmlyc3QgY2xhdXNlCi0JCQkJLy8gYSByZWN1cnNpdmUgbWV0aG9kCi0JCQkJaWYgKHJlc3VsdFJlZ2lvbiAhPSBudWxsICYmIHJlc3VsdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lclJlZ2lvbiA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVzdWx0UmVnaW9uOwotCQkJCQkvLyB0aGVuIG5lZWQgdG8gImRyaWxsIGRvd24iIGZvciByZWxldmVudCByZWdpb24gYW5kCi0JCQkJCS8vIHJlbGV2ZW50IG9mZnNldAotCQkJCQlJVGV4dFJlZ2lvbiBkZWVwUmVnaW9uID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJCWludCBlbmRPZmZzZXQgPSBjb250YWluZXJSZWdpb24uZ2V0RW5kT2Zmc2V0KGRlZXBSZWdpb24pOwotCQkJCQlTdHJpbmcgdHlwZSA9IGdldFBhcnRpdGlvblR5cGUoZGVlcFJlZ2lvbiwgZW5kT2Zmc2V0KTsKLQkJCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCBlbmRPZmZzZXQgLSBvZmZzZXQsIHR5cGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChyZXN1bHRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKHJlc3VsdFJlZ2lvbiwgb2Zmc2V0KTsKLQkJCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChyZXN1bHRSZWdpb24pIC0gb2Zmc2V0LCB0eXBlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGNhbiBoYXBwZW4gYXQgRU9GCi0JCQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIDEsIGdldFVua25vd24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBmb3IgYSBwZXItU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG92ZXJyaWRlIHNlbGVjdGluZyB0aGUKLQkgKiBwYXJ0aXRpb24gdHlwZSB1c2luZyBtb3JlIHRoYW4ganVzdCBhIHNpbmdsZSBJVGV4dFJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogICAgICAgICAgICB0aGUgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbnRhaW5lZENoaWxkUmVnaW9uCi0JICogICAgICAgICAgICBhbiBJVGV4dFJlZ2lvbiB3aXRoaW4gdGhlIGdpdmVuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhhdCB3b3VsZCBub3JtYWxseSBkZXRlcm1pbmUgdGhlIHBhcnRpdGlvbiB0eXBlIGJ5IGl0c2VsZgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBvZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcnRpdGlvbiB0eXBlIHdpbGwgYmUgb3ZlcnJpZGRlbiwgZmFsc2UgdG8KLQkgKiAgICAgICAgIGNvbnRpbnVlIG5vcm1hbCBwcm9jZXNzaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudFJlZ2lvbkJhc2VkUGFydGl0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBjb250YWluZWRDaGlsZFJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCWludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLnNldFR5cGUodHlwZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3VuZG8vQ29tbWFuZEN1cnNvclBvc2l0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3VuZG8vQ29tbWFuZEN1cnNvclBvc2l0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OTFhZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91bmRvL0NvbW1hbmRDdXJzb3JQb3NpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kbzsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEN1cnNvclBvc2l0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSBzZXQgdG8gYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0UmVkb1NlbGVjdGlvbkxlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHNldCB0byBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFVuZG9DdXJzb3JQb3NpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXZvaWQgc2V0UmVkb0N1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXZvaWQgc2V0UmVkb1NlbGVjdGlvbkxlbmd0aChpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSB1c2VkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0Jdm9pZCBzZXRVbmRvQ3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0Jdm9pZCBzZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKGludCBzZWxlY3Rpb25MZW5ndGgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91bmRvL0lEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3VuZG8vSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyMWMzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3VuZG8vSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IncyBpbnB1dCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IncyBpbnB1dCBkb2N1bWVudAotCSAqLwotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpOwotCi0JLyoqCi0JICogU2V0cyBhIG5ldyBzZWxlY3Rpb24gaW4gdGhlIGRvY3VtZW50IGFzIGEgcmVzdWx0IG9mIGFuIHVuZG8gb3BlcmF0aW9uLgotCSAqIAotCSAqIFVuZG9Eb2N1bWVudEV2ZW50IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIHVuZG8gb3BlcmF0aW9uLCBhbmQgdGhlCi0JICogb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIG5ldyBzZWxlY3Rpb24uIEltcGxlbWVudGF0aW9uIG9mCi0JICogSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgY2FuIGNoZWNrIGlmIGl0J3MgdGhlIHJlcXVlc3RlciB0aGF0IGNhdXNlZAotCSAqIHRoZSBuZXcgc2VsZWN0aW9uLCBhbmQgZGVjaWRlIGlmIHRoZSBuZXcgc2VsZWN0aW9uIHNob3VsZCBiZSBhcHBsaWVkLgotCSAqLwotCXZvaWQgdW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQoVW5kb0RvY3VtZW50RXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91bmRvL0lTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2NTgyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51bmRvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBDb25uZWN0IHRoZSBtZWRpYXRvciB0byB0aGUgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcik7Ci0KLQkvKioKLQkgKiBEaXNhYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKi8KLQl2b2lkIGRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGUgbWVkaWF0b3IgZnJvbSB0aGUgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcik7Ci0KLQkvKioKLQkgKiBFbmFibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQotCS8qKgotCSAqIEVuZCByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBFbmQgcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBOb3JtYWxseSwgdGhlIHVuZG8gbWFuYWdlciBjYW4gZmlndXJlIG91dCB0aGUgYmVzdCB0aW1lcyB3aGVuIHRvIGVuZCBhCi0JICogcGVuZGluZyBjb21tYW5kIGFuZCBiZWdpbiBhIG5ldyBvbmUgLi4uIHRvIHRoZSBzdHJ1Y3R1cmUgb2YgYSBzdHJ1Y3R1ZWQKLQkgKiBkb2N1bWVudC4gVGhlcmUgYXJlIHRpbWVzLCBob3dldmVyLCB3aGVuIGNsaWVudHMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUKLQkgKiB0aG9zZSBhbGdvcml0aG1zIGFuZCBlbmQgb25lIGVhcmxpZXIgdGhhbiBub3JtYWwuIFRoZSBvbmUga25vd24gY2FzZSBpcwotCSAqIGZvciBtdWx0aXBhZ2UgZWRpdG9ycy4gSWYgYSB1c2VyIGlzIG9uIG9uZSBwYWdlLCBhbmQgdHlwZSAnMTIzJyBhcwotCSAqIGF0dHJpYnV0ZSB2YWx1ZSwgdGhlbiBjbGljayBhcm91bmQgdG8gb3RoZXIgcGFydHMgb2YgcGFnZSwgb3IgZGlmZmVyZW50Ci0JICogcGFnZXMsIHRoZW4gcmV0dXJuIHRvICcxMjN8JyBhbmQgdHlwZSA0NTYsIHRoZW4gInVuZG8iIHRoZXkgdHlwaWNhbGx5Ci0JICogZXhwZWN0IHRoZSB1bmRvIHRvIGp1c3QgdW5kbyB3aGF0IHRoZXkganVzdCB0eXBlZCwgdGhlIDQ1Niwgbm90IHRoZQotCSAqIHdob2xlIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiBJZiB0aGVyZSBpcyBubyBwZW5kaW5nIGNvbW1hbmQsIHRoZSByZXF1ZXN0IGlzIGlnbm9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJyZW50UG9zaXRpb24sIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogU29tZSBjbGllbnRzIG5lZWQgdG8gZG8gY29tcGxpY2F0ZWQgdGhpbmdzIHdpdGggdW5kbyBzdGFjay4gUGx1cywgaW4KLQkgKiBzb21lIGNhc2VzLCBpZiBjbGllbnRzIHNldENvbW1hbmRTdGFjayB0ZW1wb3JhcmlseSwgdGhleSBoYXZlCi0JICogcmVwb25zaWJpbGl0eSB0byBzZXQgYmFjayB0byBvcmlnaW5hbCBvbmUgd2hlbiBmaW5pc2hlZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpOwotCi0JLyoqCi0JICogR2V0IHRoZSByZWRvIGNvbW1hbmQgZXZlbiBpZiBpdCdzIG5vdCBjb21taXR0ZWQgeWV0LgotCSAqLwotCUNvbW1hbmQgZ2V0UmVkb0NvbW1hbmQoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdW5kbyBjb21tYW5kIGV2ZW4gaWYgaXQncyBub3QgY29tbWl0dGVkIHlldC4KLQkgKi8KLQlDb21tYW5kIGdldFVuZG9Db21tYW5kKCk7Ci0KLQkvKioKLQkgKiBSZWRvIHRoZSBsYXN0IGNvbW1hbmQgaW4gdGhlIHVuZG8gbWFuYWdlci4KLQkgKi8KLQl2b2lkIHJlZG8oKTsKLQotCS8qKgotCSAqIFJlZG8gdGhlIGxhc3QgY29tbWFuZCBpbiB0aGUgdW5kbyBtYW5hZ2VyIGFuZCBub3RpZnkgdGhlIHJlcXVlc3RlcgotCSAqIGFib3V0IHRoZSBuZXcgc2VsZWN0aW9uLgotCSAqLwotCXZvaWQgcmVkbyhJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSB0ZXh0IGNoYW5nZSBjYW4gYmUgcmVwZWF0ZWQuIEEgdGV4dCBjaGFuZ2UKLQkgKiBjYW4gYmUgcmVwZWF0ZWQgb25seSBpZiBpdCB3YXMgZXhlY3V0ZWQgYW5kIHJvbGxlZCBiYWNrLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb24gdGV4dCBjaGFuZ2UgY2FuIGJlIHJlcGVhdGVkCi0JICovCi0JYm9vbGVhbiByZWRvYWJsZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBjb21tYW5kIHN0YWNrLgotCSAqLwotCXZvaWQgc2V0Q29tbWFuZFN0YWNrKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spOwotCi0JLyoqCi0JICogVW5kbyB0aGUgbGFzdCBjb21tYW5kIGluIHRoZSB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCB1bmRvKCk7Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBsYXN0IGNvbW1hbmQgaW4gdGhlIHVuZG8gbWFuYWdlciBhbmQgbm90aWZ5IHRoZSByZXF1ZXN0ZXIKLQkgKiBhYm91dCB0aGUgbmV3IHNlbGVjdGlvbi4KLQkgKi8KLQl2b2lkIHVuZG8oSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBhdCBsZWFzdCBvbmUgdGV4dCBjaGFuZ2UgY2FuIGJlIHJvbGxlZCBiYWNrLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIHRleHQgY2hhbmdlIGNhbiBiZSByb2xsZWQKLQkgKiAgICAgICAgIGJhY2sKLQkgKi8KLQlib29sZWFuIHVuZG9hYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMGU0NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kbzsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZFRleHRDb21tYW5kIHsKLQotCVN0cmluZyBnZXRUZXh0RGVsZXRlZCgpOwotCi0JaW50IGdldFRleHRFbmQoKTsKLQotCVN0cmluZyBnZXRUZXh0SW5zZXJ0ZWQoKTsKLQotCWludCBnZXRUZXh0U3RhcnQoKTsKLQotCXZvaWQgc2V0VGV4dERlbGV0ZWQoU3RyaW5nIHRleHREZWxldGVkKTsKLQotCXZvaWQgc2V0VGV4dEVuZChpbnQgdGV4dEVuZCk7Ci0KLQl2b2lkIHNldFRleHRJbnNlcnRlZChTdHJpbmcgdGV4dEluc2VydGVkKTsKLQotCXZvaWQgc2V0VGV4dFN0YXJ0KGludCB0ZXh0U3RhcnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91bmRvL1VuZG9Eb2N1bWVudEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwODgyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFVuZG9Eb2N1bWVudEV2ZW50IHsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCXByaXZhdGUgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgZlJlcXVlc3RlcjsKLQotCXB1YmxpYyBVbmRvRG9jdW1lbnRFdmVudChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlmUmVxdWVzdGVyID0gcmVxdWVzdGVyOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIGdldFJlcXVlc3RlcigpIHsKLQkJcmV0dXJuIGZSZXF1ZXN0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlsL0Fzc2VydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlsL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmIxZDBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MgaW4KLSAqIGNvZGUuIFRoZSBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZSB0eXBlIG9mCi0gKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlIHRocm93biB3aGVuCi0gKiBzb21ldGhpbmcgaXMgbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseSB1bnNwZWNpZmllZAotICogYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbiB0aGVzZSBiZWluZyB0aHJvd24KLSAqIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbSBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQotCS8qKgotCSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLQkgKiBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluIDxjb2RlPkFzc2VydDwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcwotCSAqIHRoYXQgY2F0Y2ggb3Igb3RoZXJ3aXNlIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvCi0JICogdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogPC9wPgotCSAqLwotCWNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsKLQkJCXN1cGVyKGRldGFpbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdAotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzCi0JICogdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc0xlZ2FsKGV4cHJlc3Npb24sICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90Ci0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcwotCSAqIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlzTm90TnVsbChvYmplY3QsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcwotCSAqIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4KLQkgKiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIm51bGxfYXJndW1lbnQ6ICIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QKLQkgKiB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdAotCSAqIHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlCi0JICogaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiYXNzZXJ0aW9uIGZhaWxlZDogIiArIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQXNzZXJ0KCkubmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KLQlwcml2YXRlIEFzc2VydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvRGVidWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9EZWJ1Zy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmY0MGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9EZWJ1Zy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIERlYnVnIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2hlY2tGb3JNZW1vcnlMZWFrcyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbGxlY3RTdGF0cyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVCVUcgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RIUkVBRExPQ0FMID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdCcmVha3BvaW50cyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0NhcmV0TWVkaWF0b3IgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdEaXNwbGF5VHJlZVBvc2l0aW9ucyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTWVkaWF0b3IgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTm90aWZ5RGVmZXJyZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdSZWNvbmNpbGluZyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnUnRmRm9ybWF0UHJvdmlkZXIgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1RhZ2xpYnMgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1Rva2VuaXplciA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnVHJlZU1vZGVsID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnVXBkYXRlVHJlZVBvc2l0aW9ucyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkaXNwbGF5SW5mbyA9IGZhbHNlOwotCi0JLyoqIGVmZmVjdHMgb3V0cHV0IG9mIExvZ2dlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkaXNwbGF5VG9Db25zb2xlID0gdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGlzcGxheVdhcm5pbmdzID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZmFpbGVkVGVzdHMgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGVhZFBhcnNpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4ganNEZWJ1Z0NvbnRleHRBc3Npc3QgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBqc0RlYnVnU3ludGF4Q29sb3JpbmcgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NLUyA9IGZhbHNlOwotCS8vIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdEFkYXB0ZXJDbGFzc0xvYWRpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RGb3JtYXQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RSYXdTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50T25seSA9IGZhbHNlOwotCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3ludGF4SGlnaGxpZ2h0aW5nID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlU3RhbmRhcmRFb2xJbldpZGdldCA9IGZhbHNlOwotCi0JLyoqCi0JICogRm9yIHRlc3RzIGFuZCBkZWJ1ZyBvbmx5Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZHVtcChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlkdW1wKHN0cnVjdHVyZWREb2N1bWVudCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBkdW1wKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBib29sZWFuIHZlcmJvc2UpIHsKLQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIGZsYXROb2RlID0gbnVsbDsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJEdW1wIG9mIHN0cnVjdHVyZWREb2N1bWVudDoiKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlFbnVtZXJhdGlvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gZmxhdE5vZGVzLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlmbGF0Tm9kZSA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghdmVyYm9zZSkgewotCQkJCVN0cmluZyBvdXRTdHJpbmcgPSBmbGF0Tm9kZS50b1N0cmluZygpOwotCQkJCW91dFN0cmluZyA9IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzLmVzY2FwZShvdXRTdHJpbmcpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihvdXRTdHJpbmcpOwotCQkJfSBlbHNlIHsKLQkJCQlkdW1wKGZsYXROb2RlLCB2ZXJib3NlKTsKLQkJCX0KLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCI9ID0gPSA9ID0gPSIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqIEBwYXJhbSB2ZXJib3NlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGR1bXAoSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbiwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHZlcmJvc2UpIHsKLQkJCXByaW50UGFyZW50KHJlZ2lvbik7Ci0JCX0KLQkJcHJpbnRDaGlsZFJlZ2lvbnMocmVnaW9uLCAwKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50Q2hpbGRSZWdpb25zKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24sIGludCBkZXB0aCkgewotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vID09PiAvLyBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uQ29sbGVjdGlvbiA9IHJlZ2lvbjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZWdpb24pOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSByZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbkxpc3QuZ2V0KGkpOwotCQkJCWlmIChyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiByYyA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHI7Ci0JCQkJCXByaW50Q2hpbGRSZWdpb25zKHJjLCBkZXB0aCsrKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3BhY2UoZGVwdGgpICsgcik7Ci0JCQkJCWRlcHRoLS07Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2ltcGxlIHV0aWxpdHkgdG8gbWFrZSBzdXJlIHByaW50bG4ncyBhcmUgc29tZSB3aGF0IGluIG9yZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBwcmludGxuKFN0cmluZyBtc2cpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIlx0IiArIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UGFyZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyB0b1N0cmluZ1V0aWwocmVnaW9uLmdldFBhcmVudERvY3VtZW50KCkpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBhcmVudChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlwcmludFBhcmVudCgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcmVnaW9uKTsKLQkJfSBlbHNlIGlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJcHJpbnRQYXJlbnQoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pOwotCQl9IGVsc2UKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyAiKG5hKSIgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRQYXJlbnQoSVRleHRSZWdpb25Db250YWluZXIgcmVnaW9uKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyB0b1N0cmluZ1V0aWwocmVnaW9uLmdldFBhcmVudCgpKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXB0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3BhY2UoaW50IGRlcHRoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiICAiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJcmVzdWx0ICs9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nVXRpbChJU3RydWN0dXJlZERvY3VtZW50IG9iamVjdCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gPT0+IC8vIFN0cmluZyByZXN1bHRUZXh0ID0gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lOwotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJLy9yZXR1cm4gY29tLmlibS5zZWQudXRpbC5TdHJpbmdVdGlscy5lc2NhcGUoIignIisoZ2V0Rmlyc3RSZWdpb24oKQotCQkvLyA9PSBudWxsIHx8IGRvY3VtZW50ID09IG51bGw/ICIiIDoKLQkJLy8gZ2V0VGV4dChnZXRGaXJzdFJlZ2lvbigpKSkrIiciK2dldFN0YXJ0KCkrIiAtCi0JCS8vICIrZ2V0RW5kKCkrIiciKyhnZXRDbG9zZSgpID09IG51bGwgfHwgZG9jdW1lbnQgPT0gbnVsbCB8fAotCQkvLyBnZXRSZWdpb25zKCkuc2l6ZSgpPDIgPyAiIiA6IGdldFRleHQoZ2V0Q2xvc2UoKSkpKyInKQotCQkvLyAiK2dldFJlZ2lvbnMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZ1V0aWwoSVRleHRSZWdpb25Db2xsZWN0aW9uIG9iamVjdCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gPT0+IC8vIFN0cmluZyByZXN1bHRUZXh0ID0gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lOwotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJLy9yZXR1cm4gY29tLmlibS5zZWQudXRpbC5TdHJpbmdVdGlscy5lc2NhcGUoIignIisoZ2V0Rmlyc3RSZWdpb24oKQotCQkvLyA9PSBudWxsIHx8IGRvY3VtZW50ID09IG51bGw/ICIiIDoKLQkJLy8gZ2V0VGV4dChnZXRGaXJzdFJlZ2lvbigpKSkrIiciK2dldFN0YXJ0KCkrIiAtCi0JCS8vICIrZ2V0RW5kKCkrIiciKyhnZXRDbG9zZSgpID09IG51bGwgfHwgZG9jdW1lbnQgPT0gbnVsbCB8fAotCQkvLyBnZXRSZWdpb25zKCkuc2l6ZSgpPDIgPyAiIiA6IGdldFRleHQoZ2V0Q2xvc2UoKSkpKyInKQotCQkvLyAiK2dldFJlZ2lvbnMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBEZWJ1ZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEZWJ1ZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvRG9jdW1lbnRJbnB1dFN0cmVhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlsL0RvY3VtZW50SW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2YjIxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvRG9jdW1lbnRJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBpbnQgZk1hcmsgPSAtMTsKLQlwcml2YXRlIGludCBmUG9zaXRpb24gPSAwOwotCi0JcHVibGljIERvY3VtZW50SW5wdXRTdHJlYW0oSURvY3VtZW50IHNvdXJjZSkgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnQgPSBzb3VyY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI2F2YWlsYWJsZSgpCi0JICovCi0JcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZkRvY3VtZW50LmdldExlbmd0aCgpIC0gZlBvc2l0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI21hcmsoaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsKLQkJZk1hcmsgPSBmUG9zaXRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGZQb3NpdGlvbiA8IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCQlyZXR1cm4gZkRvY3VtZW50LmdldENoYXIoZlBvc2l0aW9uKyspOwotCQkJZWxzZQotCQkJCXJldHVybiAtMTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNyZXNldCgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlBvc2l0aW9uID0gZk1hcms7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJbG9uZyBza2lwcGVkID0gbjsKLQkJaWYgKG4gPCBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSBmUG9zaXRpb24pIHsKLQkJCXNraXBwZWQgPSBuOwotCQkJZlBvc2l0aW9uICs9IHNraXBwZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlza2lwcGVkID0gZkRvY3VtZW50LmdldExlbmd0aCgpIC0gZlBvc2l0aW9uOwotCQkJZlBvc2l0aW9uID0gZkRvY3VtZW50LmdldExlbmd0aCgpOwotCQl9Ci0JCXJldHVybiBza2lwcGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9KYXJVdGlsaXRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9KYXJVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3YjY2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvSmFyVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgSmFyVXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIEBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3AvZXJyYXRhXzFfMV9hXzA0MjgwMC5odG1sLCBJc3N1ZXMKLQkgKiAgICAgIDggJiA5Ci0JICogCi0JICogIlRoZXJlIGFyZSB0d28gY2FzZXMuIEluIGJvdGggY2FzZXMgdGhlIFRMRF9VUkkgaXMgdG8gYmUgaW50ZXJwcmV0ZWQKLQkgKiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV2ViIEFwcGxpY2F0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSB0aGUKLQkgKiBUTERfVVJJIHJlZmVycyB0byBhIFRMRCBmaWxlIGRpcmVjdGx5LiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBUTERfVVJJCi0JICogcmVmZXJzIHRvIGEgSkFSIGZpbGUuIElmIHNvLCB0aGF0IEpBUiBmaWxlIHNob3VsZCBoYXZlIGEgVExEIGF0Ci0JICogbG9jYXRpb24gTUVUQS1JTkYvdGFnbGliLnRsZC4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQMTFfVEFHTElCID0gIk1FVEEtSU5GL3RhZ2xpYi50bGQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VKYXJGaWxlKFppcEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJZmlsZS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiQ291bGQgbm90IGNsb3NlIGZpbGUgIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgYSBzdHJlYW0gdG8gYSBsb2NhbCBjb3B5IG9mIHRoZSBpbnB1dCBvciBudWxsIGlmIG5vdCBwb3NzaWJsZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0Q2FjaGVkSW5wdXRTdHJlYW0oU3RyaW5nIGphckZpbGVuYW1lLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCUZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShqYXJGaWxlbmFtZSk7Ci0JCWlmICghdGVzdEZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG51bGw7Ci0JCUlGaWxlW10gamFySUZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChqYXJGaWxlbmFtZSkpOwotCQlJU2NoZWR1bGluZ1J1bGVbXSBydWxlcyA9IG5ldyBJU2NoZWR1bGluZ1J1bGVbamFySUZpbGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamFySUZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlydWxlc1tpXSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmRlbGV0ZVJ1bGUoamFySUZpbGVzW2ldKTsKLQkJfQotCQlpZiAoamFySUZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCXJ1bGUgPSBuZXcgTXVsdGlSdWxlKHJ1bGVzKTsKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5iZWdpblJ1bGUocnVsZSwgbnVsbCk7Ci0JCX0KLQkJWmlwRmlsZSBqYXJmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphcmZpbGUgPSBuZXcgWmlwRmlsZShqYXJGaWxlbmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlvRXhjKTsKLQkJCWNsb3NlSmFyRmlsZShqYXJmaWxlKTsKLQkJfQotCi0JCUlucHV0U3RyZWFtIGNhY2hlID0gbnVsbDsKLQotCQlpZiAoamFyZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVppcEVudHJ5IHplbnRyeSA9IGphcmZpbGUuZ2V0RW50cnkoZW50cnlOYW1lKTsKLQkJCQlpZiAoemVudHJ5ICE9IG51bGwpIHsKLQkJCQkJSW5wdXRTdHJlYW0gZW50cnlJbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQllbnRyeUlucHV0U3RyZWFtID0gamFyZmlsZS5nZXRJbnB1dFN0cmVhbSh6ZW50cnkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpb0V4Yyk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZW50cnlJbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgYzsKLQkJCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBudWxsOwotCQkJCQkJaWYgKHplbnRyeS5nZXRTaXplKCkgPiAwKSB7Ci0JCQkJCQkJYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgoaW50KSB6ZW50cnkuZ2V0U2l6ZSgpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGFycmF5IGRpbSByZXN0cmljdGlvbj8KLQkJCQkJCWJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlWzIwNDhdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQl3aGlsZSAoKGMgPSBlbnRyeUlucHV0U3RyZWFtLnJlYWQoYnl0ZXMpKSA+PSAwKSB7Ci0JCQkJCQkJCWJ1ZmZlci53cml0ZShieXRlcywgMCwgYyk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhY2hlID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlci50b0J5dGVBcnJheSgpKTsKLQkJCQkJCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZQotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJZW50cnlJbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWNsb3NlSmFyRmlsZShqYXJmaWxlKTsKLQkJCX0KLQkJfQotCQlpZiAocnVsZSAhPSBudWxsKSB7Ci0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuZW5kUnVsZShydWxlKTsKLQkJfQotCQlyZXR1cm4gY2FjaGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnRyeU5hbWVzKElSZXNvdXJjZSBqYXJSZXNvdXJjZSkgewotCQlpZiAoamFyUmVzb3VyY2UgPT0gbnVsbCB8fCBqYXJSZXNvdXJjZS5nZXRMb2NhdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJcmV0dXJuIGdldEVudHJ5TmFtZXMoamFyUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEVudHJ5TmFtZXMoU3RyaW5nIGphckZpbGVuYW1lKSB7Ci0JCXJldHVybiBnZXRFbnRyeU5hbWVzKGphckZpbGVuYW1lLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEVudHJ5TmFtZXMoU3RyaW5nIGphckZpbGVuYW1lLCBib29sZWFuIGV4Y2x1ZGVEaXJlY3RvcmllcykgewotCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG51bGw7Ci0JCUlGaWxlW10gamFySUZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChqYXJGaWxlbmFtZSkpOwotCQlJU2NoZWR1bGluZ1J1bGVbXSBydWxlcyA9IG5ldyBJU2NoZWR1bGluZ1J1bGVbamFySUZpbGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamFySUZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlydWxlc1tpXSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmRlbGV0ZVJ1bGUoamFySUZpbGVzW2ldKTsKLQkJfQotCQlpZiAoamFySUZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCXJ1bGUgPSBuZXcgTXVsdGlSdWxlKHJ1bGVzKTsKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5iZWdpblJ1bGUocnVsZSwgbnVsbCk7Ci0JCX0KLQotCQlaaXBGaWxlIGphcmZpbGUgPSBudWxsOwotCQlMaXN0IGVudHJ5TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlqYXJmaWxlID0gbmV3IFppcEZpbGUoamFyRmlsZW5hbWUpOwotCQkJRW51bWVyYXRpb24gZW50cmllcyA9IGphcmZpbGUuZW50cmllcygpOwotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlaaXBFbnRyeSB6ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKCEoei5pc0RpcmVjdG9yeSgpICYmIGV4Y2x1ZGVEaXJlY3RvcmllcykpCi0JCQkJCWVudHJ5TmFtZXMuYWRkKHouZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9FeGMpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJKYXJVdGlsaXRpZXM6ICIgKyBpb0V4Yy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2xvc2VKYXJGaWxlKGphcmZpbGUpOwotCQkJaWYgKHJ1bGUgIT0gbnVsbCkgewotCQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5lbmRSdWxlKHJ1bGUpOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIG5hbWVzID0gKFN0cmluZ1tdKSBlbnRyeU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElSZXNvdXJjZSBqYXJSZXNvdXJjZSwgU3RyaW5nIGVudHJ5TmFtZSkgewotCQlpZiAoamFyUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW0oamFyUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCBlbnRyeU5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIGphckZpbGVuYW1lLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCS8vIGNoZWNrIHNhbml0eQotCQlpZiAoamFyRmlsZW5hbWUgPT0gbnVsbCB8fCBqYXJGaWxlbmFtZS5sZW5ndGgoKSA8IDEgfHwgZW50cnlOYW1lID09IG51bGwgfHwgZW50cnlOYW1lLmxlbmd0aCgpIDwgMSkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEpBUiBmaWxlcyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBsZWFkaW5nICcvJyBpbiBtZW1iZXIgbmFtZXMKLQkJU3RyaW5nIGludGVybmFsTmFtZSA9IG51bGw7Ci0JCWlmIChlbnRyeU5hbWUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDEpOwotCQllbHNlCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWU7Ci0KLQkJcmV0dXJuIGdldENhY2hlZElucHV0U3RyZWFtKGphckZpbGVuYW1lLCBpbnRlcm5hbE5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9QYXRoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvUGF0aEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGE2NmJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9QYXRoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIGhlbHBlciBtZXRob2RzIHRvIG1hbmFnZSBhbmQgY29udmVydCBsaW5rcyBPcmlnaW5hbGx5IHBhcnQgb2YKLSAqIHRoZSBMaW5rc01hbmFnZXIgKGNvbS5pYm0uaXd0LnBhcnNlci51dGlsKQotICovCi1wdWJsaWMgY2xhc3MgUGF0aEhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1dBUkRfU0xBU0ggPSAiXFwiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfU0xBU0ggPSAiLyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTEFUSVZFX1BBVEhfU0lHID0gIi4uLyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogYWRqdXN0IHJlbGF0aXZlIHBhdGggaXNzaWRlIHRoZSBhYnNvbHV0ZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRqdXN0UGF0aChTdHJpbmcgcGF0aCkgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICgoaSA9IHBhdGguaW5kZXhPZihSRUxBVElWRV9QQVRIX1NJRykpID4gMCkgewotCQkJLy8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHR3bwotCQkJU3RyaW5nIHBhcnQxID0gcGF0aC5zdWJzdHJpbmcoMCwgaSAtIDEpOwotCQkJU3RyaW5nIHBhcnQyID0gcGF0aC5zdWJzdHJpbmcoaSArIFJFTEFUSVZFX1BBVEhfU0lHLmxlbmd0aCgpIC0gMSk7Ci0JCQkvLyBzdHJpcCBvbmUgcGF0aCBzZWcgZnJvbSBwYXJ0MQotCQkJaW50IGogPSBwYXJ0MS5sYXN0SW5kZXhPZihGT1JXQVJEX1NMQVNIKTsKLQkJCWlmIChqID09IC0xKSB7Ci0JCQkJLy8gY2FuJ3QgcmVzb2x2ZS4gcGFzc2VkIHBhdGggaXMgbGlrZQotCQkJCS8vIEU6L2VjbGlwc2Vwcm9qZWN0Ly4uLy4uL3NhbXBsZS5jc3MuCi0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXBhcnQxID0gcGFydDEuc3Vic3RyaW5nKDAsIGopOwotCQkJcGF0aCA9IHBhcnQxICsgcGFydDI7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRyYWlsaW5nIHVybCBzbGFzaCBpZiBuZWVkZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRUcmFpbGluZ1VSTFNsYXNoKFN0cmluZyBpbnB1dCkgewotCQkvLyBjaGVjayB0byBzZWUgYWxyZWFkeSBhIHNsYXNoCi0JCWlmICghaW5wdXQuZW5kc1dpdGgoRk9SV0FSRF9TTEFTSCkpIHsKLQkJCWlucHV0ICs9IEZPUldBUkRfU0xBU0g7Ci0JCX0KLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdG8gcmVsYXRpdmUgdXJsIGJhc2VkIG9uIGJhc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9SZWxhdGl2ZShTdHJpbmcgaW5wdXQsIFN0cmluZyBiYXNlKSB7Ci0JCS8vIHRva2VuaXplIHRoZSBzdHJpbmdzCi0JCVN0cmluZ1Rva2VuaXplciBpbnB1dFRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5wdXQsIEZPUldBUkRfU0xBU0gpOwotCQlTdHJpbmdUb2tlbml6ZXIgYmFzZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYmFzZSwgRk9SV0FSRF9TTEFTSCk7Ci0JCVN0cmluZyB0b2tlbjEgPSAiIiwgdG9rZW4yID0gIiI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJLy8KLQkJLy8gR28gdGhyb3VnaCB1bnRpbCBlcXVscwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKCFpbnB1dFRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgfHwgIWJhc2VUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotCQkJCWJyZWFrOwotCQkJdG9rZW4xID0gYmFzZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCXRva2VuMiA9IGlucHV0VG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKCF0b2tlbjEuZXF1YWxzKHRva2VuMikpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLy8gbm93IGdlbmVyYXRlIHRoZSBiYWNrcwotCQlTdHJpbmcgb3V0cHV0ID0gIiI7Ly8kTk9OLU5MUy0xJAotCQl3aGlsZSAoYmFzZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWJhc2VUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlvdXRwdXQgKz0gIi4uLyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlvdXRwdXQgKz0gdG9rZW4yOwotCQkvLyBnZW5lcmF0ZSB0aGUgcmVzdAotCQl3aGlsZSAoaW5wdXRUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlvdXRwdXQgPSBvdXRwdXQgKyBGT1JXQVJEX1NMQVNIICsgaW5wdXRUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5pbmcgZm9sZGVyIHBhdGguIFdpbGwgaGFuZGxlIGJvdGggdXJsIGFuZCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250YWluaW5nRm9sZGVyUGF0aChTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgcmV0VmFsdWUgPSBwYXRoOwotCi0JCWludCB1cmxTbGFzaEluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihGT1JXQVJEX1NMQVNIKTsKLQkJaW50IGZpbGVQYXRoU2xhc2hJbmRleCA9IHBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwotCQlpbnQgaW5kZXggPSBmaWxlUGF0aFNsYXNoSW5kZXg7Ci0JCWlmICh1cmxTbGFzaEluZGV4ID4gZmlsZVBhdGhTbGFzaEluZGV4KQotCQkJaW5kZXggPSB1cmxTbGFzaEluZGV4OwotCQlpZiAoaW5kZXggPj0gMCkKLQkJCXJldFZhbHVlID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQlyZXR1cm4gcmV0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVMZWFkaW5nUGF0aFNlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhGaWxlLnNlcGFyYXRvci5sZW5ndGgoKSk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBsZWFkaW5nIHBhdGggc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1NlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhGaWxlLnNlcGFyYXRvci5sZW5ndGgoKSk7Ci0JCWVsc2UgaWYgKHBhdGguc3RhcnRzV2l0aChGT1JXQVJEX1NMQVNIKSB8fCBwYXRoLnN0YXJ0c1dpdGgoQkFDS1dBUkRfU0xBU0gpKQotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKEZPUldBUkRfU0xBU0gubGVuZ3RoKCkpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBTd2l0Y2ggdG8gZmlsZSBwYXRoIHNsYXNoZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzd2l0Y2hUb0ZpbGVQYXRoU2xhc2hlcyhTdHJpbmcgcGF0aCkgewotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZPUldBUkRfU0xBU0guY2hhckF0KDApLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEJBQ0tXQVJEX1NMQVNILmNoYXJBdCgwKSwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogU3dpdGNoIHRvIGZpbGUgcGF0aCBzbGFzaGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoVG9Gb3J3YXJkU2xhc2hlcyhTdHJpbmcgcGF0aCkgewotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgRk9SV0FSRF9TTEFTSC5jaGFyQXQoMCkpOwotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEJBQ0tXQVJEX1NMQVNILmNoYXJBdCgwKSwgRk9SV0FSRF9TTEFTSC5jaGFyQXQoMCkpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvUHJvamVjdFJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvUHJvamVjdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2Y4NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlsL1Byb2plY3RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuVVJJSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXIgewotCXByaXZhdGUgU3RyaW5nIGZGaWxlQmFzZUxvY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0ID0gbnVsbDsKLQotCS8qKgotCSAqIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgY2xpZW50cyB1c2UKLQkgKiBwcm9qZWN0LmdldEFkYXB0ZXIoVVJJUmVzb2x2ZXIuY2xhc3MpIHRvIG9idGFpbiBhIFVSSVJlc29sdmVyIGF3YXJlIG9mCi0JICogdGhlIFByb2plY3QncyBzcGVjaWFsIHJlcXVpcmVtZW50cy4gTm90ZSB0aGF0IGEgVVJJUmVzb2x2ZXIgbWF5IG5vdCBiZQotCSAqIHJldHVybmVkIGF0IGFsbCBzbyBtYW51YWxseSBjcmVhdGluZyB0aGlzIG9iamVjdCBtYXkgc3RpbGwgYmUgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFByb2plY3RSZXNvbHZlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmRmlsZUJhc2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSk7Ci0JfQotCi0JLy8JZGVmZWN0IDI0NDgxNyBlbmQKLQkvKioKLQkgKiBSZXNvbHZlIHRoZSAocG9zc2libHkgcmVsYXRpdmUpIFVSSSBhY29yZGluZyB0byBSRkMxODA4IHVzaW5nIHRoZQotCSAqIGRlZmF1bHQgZmlsZSBiYXNlIGxvY2F0aW9uLiBSZXNvbHZlcyByZXNvdXJjZSByZWZlcmVuY2VzIGludG8gYWJzb2x1dGUKLQkgKiByZXNvdXJjZSBsb2NhdGlvbnMgd2l0aG91dCBlbnN1cmluZyB0aGF0IHRoZSByZXNvdXJjZSBhY3R1YWxseSBleGlzdHMuCi0JICogCi0JICogTm90ZTogY3VycmVudGx5IHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyBpcyBpZ25vcmVkIGluIHRoaXMKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBnZXRGaWxlQmFzZUxvY2F0aW9uKCksIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvKgotCQkgKiBkZWZlY3QgMjQ0ODE3IHRyeSB7IFVSTCBhVVJMID0gbmV3IFVSTCh1cmkpOwotCQkgKi8KLQkJLyoqCi0JCSAqIEFuIGFjdHVhbCBVUkwgd2FzIGdpdmVuLCBidXQgb25seSB0aGUgImZpbGU6Ly8vIiBwcm90b2NvbCBpcwotCQkgKiBzdXBwb3J0ZWQuIFJlc29sdmUgdGhlIFVSSSBieSBmaW5kaW5nIHRoZSBmaWxlIHRvIHdoaWNoIGl0IHBvaW50cy4KLQkJICovCi0JCS8qCi0JCSAqIGRlZmVjdCAyNDQ4MTcgaWYgKCFhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKSB7Ci0JCSAqIC8vJE5PTi1OTFMtMSQgaWYgKGFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSAmJgotCQkgKiAoYVVSTC5nZXRIb3N0KCkuZXF1YWxzKCJsb2NhbGhvc3QiKSB8fCBhVVJMLmdldEhvc3QoKS5sZW5ndGgoKSA9PQotCQkgKiAwKSkgeyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJCByZXR1cm4gYVVSTC5nZXRGaWxlKCk7IH0gcmV0dXJuCi0JCSAqIHVyaTsgfSB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWZ1RXhjKSB7IH0KLQkJICovCi0JCS8vIGRlZmVjdCAyNDQ4MTcgc3RhcnQKLQkJaWYgKGlzRmlsZVVSTCh1cmkpKSB7Ci0JCQl0cnkgewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCQkJcmV0dXJuIGdldFBhdGgodXJsKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJLy8gZGVmZWN0IDI0NDgxNyBlbmQKLQkJCi0JCS8vIHdoaWNoIG9mIHRoZSBzZXJ2ZXJhbCBhcmUgd2Ugc3VwcG9zZSB0byB1c2UgaGVyZT8KLQkJLy8KLSAgICAgICAgCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MTIyMwotICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGluIFVSSUhlbHBlcjsgdXJpcyBzdGFydGluZyB3aXRoICcvJyBhcmUKLSAgICAgICAgLy8gcmV0dXJuZWQgYXMtaXMuCi0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHVyaTsKLSAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIElQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICBpZihwICE9IG51bGwgJiYgcC5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IHAuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgdXJpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbG9jYXRpb24gPSBVUklIZWxwZXIubm9ybWFsaXplKHVyaSwgYmFzZVJlZmVyZW5jZSwgZ2V0Um9vdExvY2F0aW9uU3RyaW5nKCkpOwotICAgICAgICB9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtIHRoZSBnZXRMb2NhdGlvbkJ5VVJJIGFjdGlvbiB1c2luZyB0aGUgYmFzZVJlZmVyZW5jZSBhcyB0aGUKLQkgKiBwb2ludCBvZiByZWZlcmVuY2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmb3IgdGhpcyByZXNvbHZlcgotCSAqIAotCSAqIE5vdGU6IGN1cnJlbnRseSByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgaWdub3JlZCBpbiB0aGlzCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgewotCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGJhc2VSZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIGhvc3QKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhdGgoSVBhdGggcGF0aCwgU3RyaW5nIGhvc3QpIHsKLQkJSVBhdGggbmV3UGF0aCA9IHBhdGg7Ci0JCS8vIFRoZXkgYXJlIHBvdGVudGlhbGx5IGZvciBvbmx5IFdpbmRvd3Mgb3BlcmF0aW5nIHN5c3RlbS4KLQkJLy8gIGEuKSBpZiBwYXRoIGhhcyBhIGRldmljZSwgYW5kIGlmIGl0IGJlZ2lucyB3aXRoIElQYXRoLlNFUEFSQVRPUiwKLQkJLy8gcmVtb3ZlIGl0Ci0JCWZpbmFsIFN0cmluZyBkZXZpY2UgPSBwYXRoLmdldERldmljZSgpOwotCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmxlbmd0aCgpID4gMCkpIHsKLQkJCWlmIChkZXZpY2UuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCWZpbmFsIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2Uuc3Vic3RyaW5nKDEpOwotCQkJCW5ld1BhdGggPSBwYXRoLnNldERldmljZShuZXdEZXZpY2UpOwotCQkJfQotCQl9Ci0JCS8vIGIuKSBpZiBpdCBoYXMgYSBob3N0bmFtZSwgaXQgaXMgVU5DIG5hbWUuLi4gQW55IGphdmEgb3IgZWNsaXBzZSBhcGkKLQkJLy8gaGVscHMgaXQgPz8KLQkJaWYgKHBhdGggIT0gbnVsbCAmJiBob3N0ICE9IG51bGwgJiYgaG9zdC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlJUGF0aCB1bmNQYXRoID0gbmV3IFBhdGgoaG9zdCk7Ci0JCQl1bmNQYXRoID0gdW5jUGF0aC5hcHBlbmQocGF0aCk7Ci0JCQluZXdQYXRoID0gdW5jUGF0aC5tYWtlVU5DKHRydWUpOwotCQl9Ci0JCXJldHVybiBuZXdQYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aChVUkwgdXJsKSB7Ci0JCVN0cmluZyByZWYgPSB1cmwuZ2V0UmVmKCkgPT0gbnVsbCA/ICIiIDogIiMiICsgdXJsLmdldFJlZigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nIHN0clBhdGggPSB1cmwuZ2V0RmlsZSgpICsgcmVmOwotCQlJUGF0aCBwYXRoOwotCQlpZiAoc3RyUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwYXRoID0gUGF0aC5ST09UOwotCQl9IGVsc2UgewotCQkJcGF0aCA9IG5ldyBQYXRoKHN0clBhdGgpOwotCQkJU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKLQkJCVN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0clBhdGgsICI/Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCB0b2tlbkNvdW50ID0gcGFyc2VyLmNvdW50VG9rZW5zKCk7Ci0JCQlpZiAodG9rZW5Db3VudCA9PSAyKSB7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKChTdHJpbmcpIHBhcnNlci5uZXh0RWxlbWVudCgpKTsKLQkJCQlxdWVyeSA9IChTdHJpbmcpIHBhcnNlci5uZXh0RWxlbWVudCgpOwotCQkJfQotCQkJaWYgKHF1ZXJ5ID09IG51bGwpIHsKLQkJCQlwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgudG9TdHJpbmcoKSwgIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRva2VuQ291bnQgPSBwYXJzZXIuY291bnRUb2tlbnMoKTsKLQkJCQlpZiAodG9rZW5Db3VudCA9PSAyKSB7Ci0JCQkJCXBhdGggPSBuZXcgUGF0aCgoU3RyaW5nKSBwYXJzZXIubmV4dEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRQYXRoKHBhdGgsIHVybC5nZXRIb3N0KCkpOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIgZ2V0Um9vdExvY2F0aW9uKCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSb290TG9jYXRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBmUHJvamVjdC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldFVSSVN0cmVhbShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vCWRlZmVjdCAyNDQ4MTcgc3RhcnQKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFzc2VkU3BlYwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZpbGVVUkwoU3RyaW5nIHBhc3NlZFNwZWMpIHsKLQkJaWYgKHBhc3NlZFNwZWMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbmFsIFN0cmluZyBzcGVjID0gcGFzc2VkU3BlYy50cmltKCk7Ci0JCWlmIChzcGVjLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmaW5hbCBpbnQgbGltaXQgPSBzcGVjLmxlbmd0aCgpOwotCQlTdHJpbmcgbmV3UHJvdG9jb2wgPSBudWxsOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGltaXQ7IGluZGV4KyspIHsKLQkJCWZpbmFsIGNoYXIgcCA9IHNwZWMuY2hhckF0KGluZGV4KTsKLQkJCWlmIChwID09ICcvJykgeyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocCA9PSAnOicpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5ld1Byb3RvY29sID0gc3BlYy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiAobmV3UHJvdG9jb2wgIT0gbnVsbCAmJiBuZXdQcm90b2NvbC5jb21wYXJlVG9JZ25vcmVDYXNlKCJmaWxlIikgPT0gMCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdGaWxlQmFzZUxvY2F0aW9uKSB7Ci0JCWZGaWxlQmFzZUxvY2F0aW9uID0gbmV3RmlsZUJhc2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJZlByb2plY3QgPSBuZXdQcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9SZXNvdXJjZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwN2NmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvUmVzb3VyY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gaW5jb3JyZWN0IGFuZCBub3QgdXBkYXRlZCBmb3IgTTMgY2hhbmdlcwotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VVdGlsIHsKLQotCS8qKgotCSAqIE9idGFpbiBJRmlsZSBmcm9tIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcGF0aCA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcGF0aCA9IGlkLnRvU3RyaW5nKCk7Ci0JCX0KLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSByb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChwYXRoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIE9idGFpbiBJRmlsZXMgZnJvbSBJU3RydWN0dXJlZE1vZGVsIChpbmNsdWRlcyBsaW5rZWRSZXNvdXJjZXMpCi0JICogCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLCBvciBhbiBlbXB0eSBhcnJheSBpZgotCSAqICAgICAgICAgbm9uZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGVbXSBnZXRGaWxlc0ZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUlGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbMF07Ci0KLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJCU9iamVjdCBpZCA9IG1vZGVsLmdldElkKCk7Ci0JCQkJaWYgKGlkID09IG51bGwpCi0JCQkJCXJldHVybiBmaWxlczsKLQkJCQlwYXRoID0gaWQudG9TdHJpbmcoKTsKLQkJCX0KLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJZmlsZXMgPSByb290LmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKHBhdGgpKTsKLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlsL1NjcmlwdExhbmd1YWdlS2V5cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlsL1NjcmlwdExhbmd1YWdlS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGVlMjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9TY3JpcHRMYW5ndWFnZUtleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWw7Ci0KLS8qKgotICogQ29udGFpbnMgbGlzdCBvZiBzY3JpcHQgbGFuZ3VhZ2VzIGFuZCBtaW1lIHR5cGVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NyaXB0TGFuZ3VhZ2VLZXlzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkEgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQV9MQU5HVUFHRV9LRVlTID0gbmV3IFN0cmluZ1tdeyJqYXZhIn07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFTQ1JJUFQgPSAiamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUyA9IHsiamF2YXNjcmlwdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuMCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuMSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuMiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuMyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuNCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuNSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkianNjcmlwdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkic2FzaHNjcmlwdCJ9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEpBVkFTQ1JJUFRfTUlNRV9UWVBFX0tFWVMgPSB7InRleHQvamF2YXNjcmlwdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkidGV4dC9qc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L3Nhc2hzY3JpcHQifTsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlsL1N0cmluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvU3RyaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwMDk3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvU3RyaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFN0cmluZ1V0aWxzIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTVBFUlNUQU5EID0gIiYiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QRVJTVEFORF9FTlRJVFkgPSAiJiY7IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBUlJJQUdFX1JFVFVSTiA9ICJcciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVJSSUFHRV9SRVRVUk5fRU5USVRZID0gIlxcciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9ICJcciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkxGID0gIlxyXG4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSUyA9ICIgXHRcblxyXGYiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFID0gIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEVfQ0hBUiA9ICdcIic7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEVfRU5USVRZID0gIiZxdW90OyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUFMX1NJR04gPSAiPSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVBTF9TSUdOX0VOVElUWSA9ICImIzYxOyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFQVRFUl9USEFOID0gIj4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFQVRFUl9USEFOX0VOVElUWSA9ICImZ3Q7IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExFU1NfVEhBTiA9ICI8IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExFU1NfVEhBTl9FTlRJVFkgPSAiJmx0OyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRiA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRUQgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9GRUVEX0VOVElUWSA9ICJcXG4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9GRUVEX1RBRyA9ICI8ZGw+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfVEFCID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfVEFCX0VOVElUWSA9ICJcXHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9UQUJfVEFHID0gIjxkZD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1FVT1RFID0gIiciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URV9DSEFSID0gJ1wnJzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URV9FTlRJVFkgPSAiJiMwMzk7IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFID0gIiAiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0VfRU5USVRZID0gIiZuYnNwOyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQXBwZW5kIGFwcGVuZFN0cmluZyB0byB0aGUgZW5kIG9mIGFTdHJpbmcgb25seSBpZiBhU3RyaW5nIGRvZXMgbm90IGVuZAotCSAqIHdpdGggdGhlIGluc2VydFN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRJZk5vdEVuZFdpdGgoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBhcHBlbmRTdHJpbmcpIHsKLQkJaWYgKChhU3RyaW5nICE9IG51bGwpICYmIChhcHBlbmRTdHJpbmcgIT0gbnVsbCkpCi0JCQlpZiAoYVN0cmluZy5lbmRzV2l0aChhcHBlbmRTdHJpbmcpKQotCQkJCXJldHVybiBhU3RyaW5nOwotCQkJZWxzZQotCQkJCXJldHVybiBhU3RyaW5nICsgYXBwZW5kU3RyaW5nOwotCQllbHNlCi0JCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBCcmVha3Mgb3V0IHNwYWNlLXNlcGFyYXRlZCB3b3JkcyBpbnRvIGFuIGFycmF5IG9mIHdvcmRzLiBGb3IgZXhhbXBsZToKLQkgKiA8Y29kZT4ibm8gY29tbWVudCI8L2NvZGU+IGludG8gYW4gYXJyYXkgPGNvZGU+YVswXT0ibm8iPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5hWzFdPSAiY29tbWVudCI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHdvcmRzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhc0FycmF5KFN0cmluZyB2YWx1ZSkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlKTsKLQkJd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQlsaXN0LmFkZChzdG9rLm5leHRUb2tlbigpKTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0W10gPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQnJlYWtzIG91dCBkZWxpbS1zZXBhcmF0ZWQgd29yZHMgaW50byBhbiBhcnJheSBvZiB3b3Jkcy4gRm9yIGV4YW1wbGU6Ci0JICogPGNvZGU+Im5vIGNvbW1lbnQiPC9jb2RlPiBpbnRvIGFuIGFycmF5IDxjb2RlPmFbMF09Im5vIjwvY29kZT4gYW5kCi0JICogPGNvZGU+YVsxXT0gImNvbW1lbnQiPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiB3b3JkcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXNBcnJheShTdHJpbmcgdmFsdWUsIFN0cmluZyBkZWxpbSkgewotCQlyZXR1cm4gYXNBcnJheSh2YWx1ZSwgZGVsaW0sIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBCcmVha3Mgb3V0IGRlbGltLXNlcGFyYXRlZCB3b3JkcyBpbnRvIGFuIGFycmF5IG9mIHdvcmRzLiBGb3IgZXhhbXBsZToKLQkgKiA8Y29kZT4ibm8gY29tbWVudCI8L2NvZGU+IGludG8gYW4gYXJyYXkgPGNvZGU+YVswXT0ibm8iPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5hWzFdPSAiY29tbWVudCI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHdvcmRzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhc0FycmF5KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGRlbGltLCBib29sZWFuIHJldHVyblRva2VucykgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCBkZWxpbSwgcmV0dXJuVG9rZW5zKTsKLQkJd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQlsaXN0LmFkZChzdG9rLm5leHRUb2tlbigpKTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0W10gPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQnJlYWtzIG91dCBkZWxpbS1zZXBhcmF0ZWQgd29yZHMgaW50byBhbiBhcnJheSBvZiB3b3Jkcy4gRm9yIGV4YW1wbGU6Ci0JICogPGNvZGU+ImFiYywsZGVmIjwvY29kZT4gaW50byBhbiBhcnJheSA8Y29kZT5hWzBdPSJhYmMiPC9jb2RlPiwKLQkgKiA8Y29kZT5hWzFdPW51bGw8L2NvZGU+LCBhbmQgPGNvZGU+YVsyXT0gImRlZiI8L2NvZGU+IHdoZXJlICIsIiBpcwotCSAqIHRoZSBkZWxpbS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiB3b3JkcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXNGaXhlZEFycmF5KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGRlbGltKSB7Ci0JCVN0cmluZyBhcnJheVtdID0gYXNBcnJheSh2YWx1ZSwgZGVsaW0sIHRydWUpOwotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWJvb2xlYW4gc3RyaW5nRm91bmQgPSBmYWxzZTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSBhcnJheVtpXTsKLQkJCWlmICh0b2tlbi5jb21wYXJlVG8oZGVsaW0pID09IDApIHsKLQkJCQlpZiAoIXN0cmluZ0ZvdW5kKQotCQkJCQlsaXN0LmFkZChudWxsKTsKLQkJCQlzdHJpbmdGb3VuZCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbGlzdC5hZGQodG9rZW4pOwotCQkJCXN0cmluZ0ZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBhZGQgb25lIG1vcmUgbnVsbCBpZiBsYXN0IHRva2VuIGlzIHRoZSBkZWxpbQotCQlpZiAoIXN0cmluZ0ZvdW5kKQotCQkJbGlzdC5hZGQobnVsbCk7Ci0KLQkJU3RyaW5nIHJlc3VsdFtdID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNob3AoU3RyaW5nIHNvdXJjZSkgewotCQlyZXR1cm4gY2hvcChzb3VyY2UsICIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaG9wKFN0cmluZyBzb3VyY2UsIFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc291cmNlLmxhc3RJbmRleE9mKGRlbGltaXRlcikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmdbXSBhcnJheU9mU3RyaW5ncywgU3RyaW5nIG5lZWRsZSwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChuZWVkbGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGFycmF5T2ZTdHJpbmdzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGNhc2VTZW5zaXRpdmUpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlPZlN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobmVlZGxlLmVxdWFscyhhcnJheU9mU3RyaW5nc1tpXSkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheU9mU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChuZWVkbGUuZXF1YWxzSWdub3JlQ2FzZShhcnJheU9mU3RyaW5nc1tpXSkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zTGV0dGVycyhTdHJpbmcgZnVsbFZhbHVlKSB7Ci0KLQkJaWYgKGZ1bGxWYWx1ZSA9PSBudWxsIHx8IGZ1bGxWYWx1ZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWNoYXJbXSBjaGFycyA9IGZ1bGxWYWx1ZS50b0NoYXJBcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bGxWYWx1ZS5sZW5ndGgoKTsgaSsrKQotCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihjaGFyc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0xpbmVEZWxpbWl0ZXIoU3RyaW5nIGFTdHJpbmcpIHsKLQkJcmV0dXJuIGluZGV4T2ZMaW5lRGVsaW1pdGVyKGFTdHJpbmcpICE9IC0xOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRMaW5lRGVsaW1pdGVycyhTdHJpbmcgYWxsVGV4dCwgU3RyaW5nIGxpbmVEZWxpbWl0ZXJUb1VzZSkgewotCQlJRG9jdW1lbnQgdGVtcERvYyA9IG5ldyBEb2N1bWVudChhbGxUZXh0KTsKLQotCQlpZiAobGluZURlbGltaXRlclRvVXNlID09IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyVG9Vc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgbmV3VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBsaW5lQ291bnQgPSB0ZW1wRG9jLmdldE51bWJlck9mTGluZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gbGluZUluZm8gPSB0ZW1wRG9jLmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQlpbnQgbGluZVN0YXJ0T2Zmc2V0ID0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGxpbmVMZW5ndGggPSBsaW5lSW5mby5nZXRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZUVuZE9mZnNldCA9IGxpbmVTdGFydE9mZnNldCArIGxpbmVMZW5ndGg7Ci0JCQkJbmV3VGV4dCArPSBhbGxUZXh0LnN1YnN0cmluZyhsaW5lU3RhcnRPZmZzZXQsIGxpbmVFbmRPZmZzZXQpOwotCi0JCQkJaWYgKChpIDwgbGluZUNvdW50IC0gMSkgJiYgKHRlbXBEb2MuZ2V0TGluZURlbGltaXRlcihpKSAhPSBudWxsKSkKLQkJCQkJbmV3VGV4dCArPSBsaW5lRGVsaW1pdGVyVG9Vc2U7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHNwZWNpYWwgSFRNTCBjaGFyYWN0ZXJzIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogSFRNTCBlbnRpdHkgZXF1aXZhbGVudC4gV0FSTklORyBvbmx5IHVzZSB0aGlzIG1ldGhvZCBmb3Igc3RyaW5ncyB0aGF0Ci0JICogZG9udCBhbHJlYWR5IGhhdmUgSFRNTC1zcGVjaWZpYyBpdGVtcyBzdWNoIGFzIHRhZ3MgYW5kIGVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgU3RyaW5nIHRvIGNvbnZlcnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29udmVydGVkIHN0cmluZwotCSAqIEBzZWUgSFRNTFByaW50ZXIjY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgQU1QRVJTVEFORCwgQU1QRVJTVEFORF9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMRVNTX1RIQU4sIExFU1NfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBHUkVBVEVSX1RIQU4sIEdSRUFURVJfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX0ZFRUQsIExJTkVfRkVFRF9UQUcpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX1RBQiwgTElORV9UQUJfVEFHKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU0lOR0xFX1FVT1RFLCBTSU5HTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgRE9VQkxFX1FVT1RFLCBET1VCTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU1BBQ0UgKyBTUEFDRSwgU1BBQ0VfRU5USVRZICsgU1BBQ0VfRU5USVRZKTsgLy8gcmVwbGFjaW5nCi0JCS8vIGV2ZXJ5Ci0JCS8vIHNwYWNlCi0JCS8vIHdvdWxkCi0JCS8vIGJlCi0JCS8vIHRvbwotCQkvLyBtdWNoCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSBmb3JtIHRoYXQgd2lsbCBub3QgY29uZmxpY3Qgd2l0aCBzYXZpbmcgaXQKLQkgKiBpbnRvIGFuIElOSSBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBub3JtYWxTdHJpbmcpIHsKLQkJaWYgKG5vcm1hbFN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBlc2NhcGVkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5vcm1hbFN0cmluZywgRVFVQUxfU0lHTiArIExJTkVfRkVFRCArIENBUlJJQUdFX1JFVFVSTiArIExJTkVfVEFCLCB0cnVlKTsKLQkJU3RyaW5nIGNodW5rID0gbnVsbDsKLQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJY2h1bmsgPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCWlmIChjaHVuay5lcXVhbHMoRVFVQUxfU0lHTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChFUVVBTF9TSUdOX0VOVElUWSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaHVuay5lcXVhbHMoTElORV9GRUVEKSkgewotCQkJCWVzY2FwZWRCdWZmZXIuYXBwZW5kKExJTkVfRkVFRF9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSBpZiAoY2h1bmsuZXF1YWxzKENBUlJJQUdFX1JFVFVSTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChDQVJSSUFHRV9SRVRVUk5fRU5USVRZKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNodW5rLmVxdWFscyhMSU5FX1RBQikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChMSU5FX1RBQl9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXNjYXBlZEJ1ZmZlci5hcHBlbmQoY2h1bmspOwotCQkJfQotCQl9Ci0JCXJldHVybiBlc2NhcGVkQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZ2l2ZW4gdGV4dCB3aXRob3V0IGEgdHJhaWxpbmcgZGVsaW1pdGVyCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlyc3RMaW5lT2YoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDwgMSkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJSURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCh0ZXh0KTsKLQkJdHJ5IHsKLQkJCWludCBsaW5lTnVtYmVyID0gZG9jLmdldExpbmVPZk9mZnNldCgwKTsKLQkJCUlSZWdpb24gbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24obGluZU51bWJlcik7Ci0JCQlyZXR1cm4gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKGFTdHJpbmcsIGFTdHJpbmcubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZywgaW50IG9mZnNldCkgewotCQlpbnQgaW5kZXggPSAtMTsKLQotCQlpZiAoYVN0cmluZyAhPSBudWxsICYmIGFTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpbmRleCA9IGFTdHJpbmcubGFzdEluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihDUiwgb2Zmc2V0KTsKLQkJCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihMRiwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mTGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkxpbmVEZWxpbWl0ZXIoU3RyaW5nIGFTdHJpbmcsIGludCBvZmZzZXQpIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0KLQkJaWYgKGFTdHJpbmcgIT0gbnVsbCAmJiBhU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5pbmRleE9mKENSLCBvZmZzZXQpOwotCQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoTEYsIG9mZnNldCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBpbmRleE9mTm9uYmxhbmsoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBpbmRleCA9IC0xOwotCi0JCWlmIChhU3RyaW5nICE9IG51bGwgJiYgYVN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBhU3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoREVMSU1JVEVSUy5pbmRleE9mKGFTdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAxKSkgPT0gLTEpIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IGluc2VydFN0cmluZyB0byB0aGUgYmVnaW5uaW5nIG9mIGFTdHJpbmcgb25seSBpZiBhU3RyaW5nIGRvZXMKLQkgKiBub3Qgc3RhcnQgd2l0aCB0aGUgaW5zZXJ0U3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc2VydElmTm90U3RhcnRXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgaW5zZXJ0U3RyaW5nKSB7Ci0JCWlmICgoYVN0cmluZyAhPSBudWxsKSAmJiAoaW5zZXJ0U3RyaW5nICE9IG51bGwpKQotCQkJaWYgKGFTdHJpbmcuc3RhcnRzV2l0aChpbnNlcnRTdHJpbmcpKQotCQkJCXJldHVybiBhU3RyaW5nOwotCQkJZWxzZQotCQkJCXJldHVybiBpbnNlcnRTdHJpbmcgKyBhU3RyaW5nOwotCQllbHNlCi0JCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNRdW90ZWQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZyA9PSBudWxsKSB8fCAoc3RyaW5nLmxlbmd0aCgpIDwgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0cmluZy5sZW5ndGgoKSAtIDE7Ci0JCWNoYXIgZmlyc3RDaGFyID0gc3RyaW5nLmNoYXJBdCgwKTsKLQkJY2hhciBsYXN0Q2hhciA9IHN0cmluZy5jaGFyQXQobGFzdEluZGV4KTsKLQotCQlyZXR1cm4gKCgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URV9DSEFSKSAmJiAobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFX0NIQVIpKSB8fCAoKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEVfQ0hBUikgJiYgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkpOwotCX0KLQotCS8qKgotCSAqIFVuaXQgdGVzdHMuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy8gdGVzdFBhc3RlKCk7Ci0JCXRlc3RTdHJpcE5vbkxldHRlckRpZ2l0cygpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbWVyZ2VkIGZvcm0gb2YgYm90aCBzdHJpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2UoU3RyaW5nIG5ld1N0YXJ0LCBTdHJpbmcgbmV3RW5kKSB7Ci0JCVN0cmluZ1tdIHJlZ2lvbnMgPSBvdmVybGFwUmVnaW9ucyhuZXdTdGFydCwgbmV3RW5kKTsKLQkJcmV0dXJuIHJlZ2lvbnNbMF0gKyByZWdpb25zWzFdICsgcmVnaW9uc1syXTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBvY2N1cnJlbmNlc09mKFN0cmluZyBzZWFyY2hTdHJpbmcsIGNoYXIgdGFyZ2V0Q2hhcikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaW50IGxlbiA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHRhcmdldENoYXIgPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKSkKLQkJCQlyZXN1bHQrKzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIAotCSAqIFJldHVybnMgYSAzIFN0cmluZyBhcnJheSBjb250YWluaW5nIHVuaXF1ZSB0ZXh0IGZyb20gdGhlIHN0YXJ0LAotCSAqIGR1cGxpY2F0ZWQgdGV4dCB0aGF0IG92ZXJsYXBzIHRoZSBzdGFydCBhbmQgZW5kLCBhbmQgdGhlIHVuaXF1ZSB0ZXh0Ci0JICogZnJvbSB0aGUgZW5kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG92ZXJsYXBSZWdpb25zKFN0cmluZyBzdGFydCwgU3RyaW5nIGVuZCkgewotCQlTdHJpbmdbXSByZXN1bHRzID0gbnVsbDsKLQkJaWYgKHN0YXJ0ICE9IG51bGwgJiYgZW5kID09IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBuZXcgU3RyaW5nW117c3RhcnQsICIiLCAiIn07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsIGVuZH07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgPT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgIT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCi0JCQlpbnQgc3RhcnRMZW5ndGggPSBzdGFydC5sZW5ndGgoKTsKLQkJCWludCBlbmRMZW5ndGggPSBlbmQubGVuZ3RoKCk7Ci0KLQkJCWlmIChzdGFydExlbmd0aCA9PSAwIHx8IGVuZExlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHRzID0gbmV3IFN0cmluZ1szXTsKLQkJCQlTdHJpbmcgdGVzdFN0YXJ0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGVzdEVuZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IG1lcmdlTGVuZ3RoID0gTWF0aC5taW4oc3RhcnRMZW5ndGgsIGVuZExlbmd0aCk7Ci0JCQkJYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOwotCQkJCXdoaWxlIChtZXJnZUxlbmd0aCA+IDAgJiYgIWZpbmlzaGVkKSB7Ci0JCQkJCXRlc3RTdGFydCA9IHN0YXJ0LnN1YnN0cmluZyhzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJdGVzdEVuZCA9IGVuZC5zdWJzdHJpbmcoMCwgbWVyZ2VMZW5ndGgpOwotCQkJCQkvLyBjYXNlIHNlbnNpdGl2ZQotCQkJCQlpZiAodGVzdFN0YXJ0LmVxdWFscyh0ZXN0RW5kKSkgewotCQkJCQkJZmluaXNoZWQgPSB0cnVlOwotCQkJCQkJcmVzdWx0c1swXSA9IHN0YXJ0LnN1YnN0cmluZygwLCBzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJCXJlc3VsdHNbMV0gPSBzdGFydC5zdWJzdHJpbmcoc3RhcnRMZW5ndGggLSBtZXJnZUxlbmd0aCk7Ci0JCQkJCQlyZXN1bHRzWzJdID0gZW5kLnN1YnN0cmluZyhtZXJnZUxlbmd0aCk7Ci0JCQkJCX0KLQkJCQkJbWVyZ2VMZW5ndGgtLTsKLQkJCQl9Ci0JCQkJaWYgKCFmaW5pc2hlZCkgewotCQkJCQlyZXN1bHRzWzBdID0gc3RhcnQ7Ci0JCQkJCXJlc3VsdHNbMV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHRzWzJdID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBQYWNrcyBhbiBhcnJheSBvZiBTdHJpbmdzIGludG8gYSBzaW5nbGUgY29tbWEgZGVsaW1pdGVkIFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqIEByZXR1cm4KLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2soU3RyaW5nW10gc3RyaW5ncykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMucmVwbGFjZShzdHJpbmdzW2ldLCAiLCIsICImY29tbWE7IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChpIDwgc3RyaW5ncy5sZW5ndGggLSAxKQotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIFBhc3RlcyB0aGUgbmV3IHRleHQgaW50byB0aGUgb2xkIGF0IHRoZSBzdGFydCBwb3NpdGlvbiwgcmVwbGFjaW5nIHRleHQKLQkgKiBpbXBsaWVkIGJ5IGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZShTdHJpbmcgb2xkVGV4dCwgU3RyaW5nIG5ld1RleHQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgc3RhcnRJbmRleCA9IHN0YXJ0OwotCQlpbnQgZW5kSW5kZXggPSBzdGFydCArIGxlbmd0aDsKLQkJaWYgKHN0YXJ0SW5kZXggPiBvbGRUZXh0Lmxlbmd0aCgpKSB7Ci0JCQlzdGFydEluZGV4ID0gb2xkVGV4dC5sZW5ndGgoKTsKLQkJfQotCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCkpOwotCQkvLyBudWxsIG9yIGVtcHR5IG5ldyB0ZXh0IGFjY29tcGxpY2hlcyBhIGRlbGV0ZQotCQlpZiAobmV3VGV4dCAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQobmV3VGV4dCk7Ci0JCX0KLQkJaWYgKGVuZEluZGV4IDwgb2xkVGV4dC5sZW5ndGgoKSkgewotCi0JCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoZW5kSW5kZXgpKTsKLQkJfQotCQlyZXN1bHQgPSBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgbWF0Y2hpbmcgbGl0ZXJhbCBwb3J0aW9ucyBvZiBhIHN0cmluZyB3aXRoIGFub3RoZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkgewotCQlpZiAoYVN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBub3JtYWxTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gYVN0cmluZy5sZW5ndGgoKTsKLQkJaW50IHBvc2l0aW9uID0gMDsKLQkJaW50IHByZXZpb3VzID0gMDsKLQkJaW50IHNwYWNlciA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJd2hpbGUgKHBvc2l0aW9uICsgc3BhY2VyIC0gMSA8IGxlbmd0aCAmJiBhU3RyaW5nLmluZGV4T2Yoc291cmNlLCBwb3NpdGlvbikgPiAtMSkgewotCQkJcG9zaXRpb24gPSBhU3RyaW5nLmluZGV4T2Yoc291cmNlLCBwcmV2aW91cyk7Ci0JCQlub3JtYWxTdHJpbmcgPSBub3JtYWxTdHJpbmcgKyBhU3RyaW5nLnN1YnN0cmluZyhwcmV2aW91cywgcG9zaXRpb24pICsgdGFyZ2V0OwotCQkJcG9zaXRpb24gKz0gc3BhY2VyOwotCQkJcHJldmlvdXMgPSBwb3NpdGlvbjsKLQkJfQotCQlub3JtYWxTdHJpbmcgPSBub3JtYWxTdHJpbmcgKyBhU3RyaW5nLnN1YnN0cmluZyhwb3NpdGlvbiwgYVN0cmluZy5sZW5ndGgoKSk7Ci0KLQkJcmV0dXJuIG5vcm1hbFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHRoZSBlbnRpdHkgcmVmZXJlbmNlcyBmb3IgbWFya3VwIGRlbGltaXRlcnMgaW4gdGV4dCB3aGVyZSB0aGV5Ci0JICogaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBwcm9wZXIgVW5pY29kZSB2YWx1ZXMgdGhyb3VnaCBhIERPTSB0ZXh0Ci0JICogcGFyc2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3RvcmVNYXJrZXJzKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBjb250ZW50ID0gdGV4dDsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgQU1QRVJTVEFORCwgQU1QRVJTVEFORF9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMRVNTX1RIQU4sIExFU1NfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBHUkVBVEVSX1RIQU4sIEdSRUFURVJfVEhBTl9FTlRJVFkpOwotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGV4dHJhIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhbmQgcXVvdGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXAoU3RyaW5nIHF1b3RlZFN0cmluZykgewotCQlpZiAocXVvdGVkU3RyaW5nID09IG51bGwgfHwgcXVvdGVkU3RyaW5nLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gcXVvdGVkU3RyaW5nOwotCQlTdHJpbmcgdHJpbW1lZCA9IHF1b3RlZFN0cmluZy50cmltKCk7Ci0JCWlmICh0cmltbWVkLmxlbmd0aCgpIDwgMikKLQkJCXJldHVybiBxdW90ZWRTdHJpbmc7Ci0KLQkJY2hhciBmaXJzdCA9IHRyaW1tZWQuY2hhckF0KDApOwotCQljaGFyIG5leHRUb0xhc3QgPSB0cmltbWVkLmNoYXJBdCh0cmltbWVkLmxlbmd0aCgpIC0gMik7Ci0JCWNoYXIgbGFzdCA9IHRyaW1tZWQuY2hhckF0KHRyaW1tZWQubGVuZ3RoKCkgLSAxKTsKLQotCQlpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInICYmIG5leHRUb0xhc3QgIT0gJ1xcJykgfHwgKGZpcnN0ID09ICdcJycgJiYgbGFzdCA9PSAnXCcnICYmIG5leHRUb0xhc3QgIT0gJ1xcJykpIHsKLQkJCXJldHVybiB0cmltbWVkLnN1YnN0cmluZygxLCB0cmltbWVkLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHRyaW1tZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3RyaXBzIGFueXRoaW5nIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nIHRoYXQKLQkgKiBpcyBub3QgYSBsZXR0ZXIgb3IgZGlnaXQuIEl0IGlzIHVzZWQgYnkgc29tZSBlbmNvZGluZyBkZXRlY3RvcnMgdG8gY29tZQotCSAqIHVwIHdpdGggdGhlIGVuY29kaW5nIG5hbWUgZnJvbSBpbGxmb3JtZWQgaW5wdXQgKGUuZyBpbiA8P3htbAotCSAqIGVuY29kaW5nPSJhYmM/PiAtLSB3aGVyZSBmaW5hbCBxdW90ZSBpcyBsZWZ0IG9mZiwgdGhlICc+JyBpcyByZXR1cm5lZAotCSAqIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAnYWJjJykuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBOb25MZXR0ZXJEaWdpdHMoU3RyaW5nIGZ1bGxWYWx1ZSkgewotCQlpZiAoZnVsbFZhbHVlID09IG51bGwgfHwgZnVsbFZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZnVsbFZhbHVlOwotCQlpbnQgZnVsbFZhbHVlTGVuZ3RoID0gZnVsbFZhbHVlLmxlbmd0aCgpOwotCQlpbnQgZmlyc3RQb3MgPSAwOwotCQl3aGlsZSAoZmlyc3RQb3MgPCBmdWxsVmFsdWVMZW5ndGggJiYgIUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoZnVsbFZhbHVlLmNoYXJBdChmaXJzdFBvcykpKSB7Ci0JCQlmaXJzdFBvcysrOwotCQl9Ci0JCWludCBsYXN0UG9zID0gZnVsbFZhbHVlTGVuZ3RoIC0gMTsKLQkJd2hpbGUgKGxhc3RQb3MgPiBmaXJzdFBvcyAmJiAhQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChmdWxsVmFsdWUuY2hhckF0KGxhc3RQb3MpKSkgewotCQkJbGFzdFBvcy0tOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSBmdWxsVmFsdWU7Ci0JCWlmIChmaXJzdFBvcyAhPSAwIHx8IGxhc3RQb3MgIT0gZnVsbFZhbHVlTGVuZ3RoKSB7Ci0JCQlyZXN1bHQgPSBmdWxsVmFsdWUuc3Vic3RyaW5nKGZpcnN0UG9zLCBsYXN0UG9zICsgMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIHN0cmlwLCBleGNlcHQgcXVvdGVzIGRvbid0IG5lZWQgdG8gbWF0Y2ggc3VjaCBhcyAiVVRGJyBpcwotCSAqIHN0aWxsIHN0cmlwcGVkIG9mIGJvdGggcXVvdGVzLiAoUGx1cywgdGhpcyBvbmUgZG9lcyBub3QgZGV0ZWN0IGVzY2FwZWQKLQkgKiBxdW90ZXMpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXMoU3RyaW5nIHF1b3RlZFZhbHVlKSB7Ci0JCWlmIChxdW90ZWRWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIG5vcm1hbGx5IHdpbGwgbmV2ZXIgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIGJsYW5rcywKLQkJLy8gYnV0IGlmIGl0IGRvZXMsIHdlJ2xsIGRvIGxlbmllbnQgaW50ZXJwcmV0YXRpb24KLQkJcmV0dXJuIHN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShxdW90ZWRWYWx1ZSkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIExpa2Ugc3RyaXAgcXVvdGVzLCBleGNlcHQgbGVhdmVzIHRoZSBzdGFydCBhbmQgZW5kIHNwYWNlIGluc2lkZSB0aGUKLQkgKiBxdW90ZXMKLQkgKiAKLQkgKiBAcGFyYW0gcXVvdGVkVmFsdWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXNMZWF2ZUluc2lkZVNwYWNlKFN0cmluZyBxdW90ZWRWYWx1ZSkgewotCQlpZiAocXVvdGVkVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBub21hbGx5IHdpbGwgbmV2ZXIgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIGJsYW5rcyAuLi4gYnV0IGp1c3QgaW4KLQkJLy8gY2FzZS4KLQkJU3RyaW5nIHJlc3VsdCA9IHF1b3RlZFZhbHVlLnRyaW0oKTsKLQkJaW50IGxlbiA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCWNoYXIgZmlyc3RDaGFyID0gcmVzdWx0LmNoYXJBdCgwKTsKLQkJCWlmICgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URV9DSEFSKSB8fCAoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMSwgbGVuKTsKLQkJCX0KLQkJCWxlbiA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJY2hhciBsYXN0Q2hhciA9IHJlc3VsdC5jaGFyQXQobGVuIC0gMSk7Ci0JCQkJaWYgKChsYXN0Q2hhciA9PSBTSU5HTEVfUVVPVEVfQ0hBUikgfHwgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkgewotCQkJCQlyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0UGFzdGUoKSB7Ci0JCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRoZSBxdWljayBicm93biBmb3ggLi4uIjsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgbnVsbCwgNCwgNSkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgbnVsbCwgNCwgNikpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgIiIsIDQsIDYpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgImZhc3QiLCA0LCA2KSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsICJmYXN0ICIsIDQsIDYpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgIkJ1dCAiLCAwLCAwKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKCIiLCAiYnVycCIsIDQsIDYpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFN0cmlwTm9uTGV0dGVyRGlnaXRzKCkgewotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJhYmMiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiXCJhYmNcIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiXCJhYi1jMT8iOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIisrKyI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiYWJjPSI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiYWJjICI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhib29sZWFuIGJvb2xlYW5WYWx1ZSkgewotCQlpZiAoYm9vbGVhblZhbHVlKQotCQkJcmV0dXJuIFRSVUU7Ci0JCWVsc2UKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgImVzY2FwZWQiIGNoYXJzIGZyb20gYSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIGFTdHJpbmcpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbm9ybWFsU3RyaW5nID0gcmVwbGFjZShhU3RyaW5nLCBFUVVBTF9TSUdOX0VOVElUWSwgRVFVQUxfU0lHTik7Ci0JCW5vcm1hbFN0cmluZyA9IHJlcGxhY2Uobm9ybWFsU3RyaW5nLCBMSU5FX0ZFRURfRU5USVRZLCBMSU5FX0ZFRUQpOwotCQlub3JtYWxTdHJpbmcgPSByZXBsYWNlKG5vcm1hbFN0cmluZywgQ0FSUklBR0VfUkVUVVJOX0VOVElUWSwgQ0FSUklBR0VfUkVUVVJOKTsKLQkJbm9ybWFsU3RyaW5nID0gcmVwbGFjZShub3JtYWxTdHJpbmcsIExJTkVfVEFCX0VOVElUWSwgTElORV9UQUIpOwotCQlyZXR1cm4gbm9ybWFsU3RyaW5nOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZUVuZE9mKFN0cmluZyBuZXdTdGFydCwgU3RyaW5nIG5ld0VuZCkgewotCQlTdHJpbmdbXSByZWdpb25zID0gb3ZlcmxhcFJlZ2lvbnMobmV3U3RhcnQsIG5ld0VuZCk7Ci0JCXJldHVybiByZWdpb25zWzJdOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgYSBjb21tYSBkZWxpbWl0ZWQgU3RyaW5nIGludG8gYW4gYXJyYXkgb2YgU3RyaW5ncwotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybgotCSAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB1bnBhY2soU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkvLyBzaW5jZSB3ZSdyZSBzZXBhcmF0aW5nIHRoZSB2YWx1ZXMgd2l0aCAnLCcsIGVzY2FwZSAnLCcgaW4gdGhlCi0JCQkvLyB2YWx1ZXMKLQkJCWxpc3QuYWRkKFN0cmluZ1V0aWxzLnJlcGxhY2UodG9rZXIubmV4dFRva2VuKCksICImY29tbWE7IiwgIiwiKS50cmltKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogU3RyaW5nVXRpbHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1V0aWxzKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlsL1RleHRVdGlsaXRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9UZXh0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NGQyYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlsL1RleHRVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWw7Ci0KLQotCi0vKioKLSAqIENvbGxlY3Rpb24gb2YgdGV4dCBmdW5jdGlvbnMuCi0gKiBAZGVwcmVjYXRlZCAtIHRoZSBKRmFjZSBjbGFzcyBpcyBwdWJsaWMgaW4gMy4xCi0gKi8KLS8vIFRoaXMgY2xhc3Mgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwgYW5kIG1hZGUKLS8vIHB1YmxpYwotcHVibGljIGNsYXNzIFRleHRVdGlsaXRpZXMgewotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdGV4dCBlbmRzIHdpdGggb25lIG9mIHRoZSBnaXZlbiBzZWFyY2ggc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoU3RyaW5nW10gc2VhcmNoU3RyaW5ncywgU3RyaW5nIHRleHQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGV4dC5lbmRzV2l0aChzZWFyY2hTdHJpbmdzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcG9zaXRpb24gaW4gdGhlIHN0cmluZyBncmVhdGVyIHRoYW4gb2Zmc2V0IG9mIHRoZSBsb25nZXN0Ci0JICogbWF0Y2hpbmcgc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGluZGV4T2YoU3RyaW5nW10gc2VhcmNoU3RyaW5ncywgU3RyaW5nIHRleHQsIGludCBvZmZzZXQpIHsKLQotCQlpbnRbXSByZXN1bHQgPSB7LTEsIC0xfTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWludCBpbmRleCA9IHRleHQuaW5kZXhPZihzZWFyY2hTdHJpbmdzW2ldLCBvZmZzZXQpOwotCQkJaWYgKGluZGV4ID49IDApIHsKLQotCQkJCWlmIChyZXN1bHRbMF0gPT0gLTEpIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfSBlbHNlIGlmIChpbmRleCA8IHJlc3VsdFswXSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4ID09IHJlc3VsdFswXSAmJiBzZWFyY2hTdHJpbmdzW2ldLmxlbmd0aCgpID4gc2VhcmNoU3RyaW5nc1tyZXN1bHRbMV1dLmxlbmd0aCgpKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvVVJJUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9VUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmUyOGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9VUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqIAotICogQGF1dGhvciBuc2QKLSAqCi0gKiBXaWxsIGJlIHJlbW92ZWQgaW4gTTQgYW5kIHJlcGxhY2VkIHdpdGggRmxleGlibGUgUHJvamVjdCBzdXBwb3J0Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBVUklSZXNvbHZlciB7Ci0KLQlTdHJpbmcgZ2V0RmlsZUJhc2VMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgKHBvc3NpYmx5IHJlbGF0aXZlKSBVUkkgYWNvcmRpbmcgdG8gUkZDMTgwOCB1c2luZyB0aGUKLQkgKiBkZWZhdWx0IGZpbGUgYmFzZSBsb2NhdGlvbi4gUmVzb2x2ZXMgcmVzb3VyY2UgcmVmZXJlbmNlcyBpbnRvIGFic29sdXRlCi0JICogcmVzb3VyY2UgbG9jYXRpb25zIHdpdGhvdXQgZW5zdXJpbmcgdGhhdCB0aGUgcmVzb3VyY2UgYWN0dWFsbHkgZXhpc3RzLgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgKHBvc3NpYmx5IHJlbGF0aXZlKSBVUkkgYWNvcmRpbmcgdG8gUkZDMTgwOCB1c2luZyB0aGUKLQkgKiBkZWZhdWx0IGZpbGUgYmFzZSBsb2NhdGlvbi4gUmVzb2x2ZXMgcmVzb3VyY2UgcmVmZXJlbmNlcyBpbnRvIGFic29sdXRlCi0JICogcmVzb3VyY2UgbG9jYXRpb25zIHdpdGhvdXQgZW5zdXJpbmcgdGhhdCB0aGUgcmVzb3VyY2UgYWN0dWFsbHkgZXhpc3RzLgotCSAqIAotCSAqIElmIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsCi0JICogcHJvcGVybHkgcmVzb2x2ZSB0aGUgVVJJIGlmIGl0IGlzIGEgdmFsaWQgVVJJIHRvIGFub3RoZXIgKGFwcHJvcHJpYXRlKQotCSAqIHByb2plY3QuCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpOwotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgZ2V0TG9jYXRpb25CeVVSSSBhY3Rpb24gdXNpbmcgdGhlIGJhc2VSZWZlcmVuY2UgYXMgdGhlCi0JICogcG9pbnQgb2YgcmVmZXJlbmNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9yIHRoaXMgcmVzb2x2ZXIKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSk7Ci0KLQkvKioKLQkgKiBQZXJmb3JtIHRoZSBnZXRMb2NhdGlvbkJ5VVJJIGFjdGlvbiB1c2luZyB0aGUgYmFzZVJlZmVyZW5jZSBhcyB0aGUKLQkgKiBwb2ludCBvZiByZWZlcmVuY2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmb3IgdGhpcyByZXNvbHZlcgotCSAqIAotCSAqIElmIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsCi0JICogcHJvcGVybHkgcmVzb2x2ZSB0aGUgVVJJIGlmIGl0IGlzIGEgdmFsaWQgVVJJIHRvIGFub3RoZXIgKGFwcHJvcHJpYXRlKQotCSAqIHByb2plY3QuCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQotCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQotCUlDb250YWluZXIgZ2V0Um9vdExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBBdHRlbXB0cyB0byByZXR1cm4gYSBkaXJlY3QgaW5wdXRzdHJlYW0gdG8gdGhlIGdpdmVuIFVSSSB3aGljaCBtdXN0IGJlCi0JICogcmVsYXRpdmUgdG8gdGhlIGRlZmF1bHQgcG9pbnQgb2YgcmVmZXJlbmNlLgotICAgICAqIEBkZXByZWNhdGVkCi0JICovCi0JSW5wdXRTdHJlYW0gZ2V0VVJJU3RyZWFtKFN0cmluZyB1cmkpOwotCi0Jdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbik7Ci0KLQl2b2lkIHNldFByb2plY3QoSVByb2plY3QgbmV3UHJvamVjdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9VdGlsaXRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbC9VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjNmEzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWwvVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmludGVybmFsLkJ1ZmZlcmVkTGltaXRlZFN0cmVhbTsKLQotCi0KLXB1YmxpYyBjbGFzcyBVdGlsaXRpZXMgewotCi0JLyoqCi0JICogYSBjb21tb24gY2FsY3VsYXRpb24gaW4gc29tZSBvZiB0aGUgcGFyc2luZyBtZXRob2RzIChlLmcuIGluCi0JICogQ29udGV4dFJlZ2lvbiBhbmQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKFN0cmluZyBjaGFuZ2VzLCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGRldGVybWluZSB0aGUgbGVuZ3RoIGJ5IHRoZSB0ZXh0IGl0c2VsZiwgb3IsIGlmIHRoZXJlIGlzIG5vIHRleHQgdG8KLQkJLy8gaW5zZXJ0IChpLmUuIHdlIGFyZSBkb2luZyBhIGRlbGV0ZSkgdGhlbiBjYWxjdWxhdGUgdGhlIGxlbmd0aCBhcwotCQkvLyBhIG5lZ2F0aXZlIG51bWJlciB0byBkZW5vdGUgdGhlIGFtb3VudCB0byBkZWxldGUuCi0JCS8vIEZvciBhIHN0cmFpZ2h0IGluc2VydCwgdGhlIHNlbGVjdGlvbiBMZW5ndGggd2lsbCBiZSB6ZXJvLgotCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IDA7Ci0JCWlmIChjaGFuZ2VzID09IG51bGwpIHsKLQkJCS8vIHRoZSBkZWxldGUgY2FzZQotCQkJbGVuZ3RoRGlmZmVyZW5jZSA9IDAgLSBsZW5ndGhUb1JlcGxhY2U7Ci0JCX0gZWxzZSB7Ci0JCQlsZW5ndGhEaWZmZXJlbmNlID0gY2hhbmdlcy5sZW5ndGgoKSAtIGxlbmd0aFRvUmVwbGFjZTsKLQkJfQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibGVuZ3RoRGlmZmVyZW5jZTogIiArIGxlbmd0aERpZmZlcmVuY2UpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbGVuZ3RoRGlmZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWZmIGJvdGggcGFyYW1ldGVycyBhcmUgbm90IG51bGwgYW5kIHRoZSBvYmplY3QgaXMgd2l0aGluCi0JICogdGhlIGFycmF5LiBDYXJlZnVsLCB0aGlzIHVzZXMgaWRlbnRpdHkuIE5vdCBnb29kIGZvciBiYXNpYyBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhPYmplY3RbXSBvYmplY3RBcnJheSwgT2JqZWN0IG9iamVjdCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiBvYmplY3Qgb3Igb2JqZWN0QXJyYXkgaXMgbnVsbCwgcmV0dXJuIGZhbHNlCi0JCWlmICgob2JqZWN0QXJyYXkgIT0gbnVsbCkgJiYgKG9iamVjdCAhPSBudWxsKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvYmplY3RBcnJheVtpXSA9PSBvYmplY3QpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zU3RyaW5nKFN0cmluZ1tdIG9iamVjdEFycmF5LCBTdHJpbmcgb2JqZWN0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIG9iamVjdCBvciBvYmplY3RBcnJheSBpcyBudWxsLCByZXR1cm4gZmFsc2UKLQkJaWYgKChvYmplY3RBcnJheSAhPSBudWxsKSAmJiAob2JqZWN0ICE9IG51bGwpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9iamVjdEFycmF5W2ldLmVxdWFscyhvYmplY3QpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCBhbiBJbnB1dFN0cmVhbSBoYXMgbWFyay9yZXNldCBzdXBwb3J0LCBpcyByZWFkbGltaXQgaXMKLQkgKiBzZXQsIGFuZCB0aGF0IHRoZSBzdHJlYW0gaXMgImxpbWl0YWJsZSIgKHRoYXQgaXMsIHJlcG9ydHMgImVuZCBvZgotCSAqIGlucHV0IiByYXRoZXIgdGhhbiBhbGxvdyBnb2luZyBwYXN0IG1hcmspLiBUaGlzIGlzIHZlcnkgc3BlY2lhbGl6ZWQKLQkgKiBzdHJlYW0gaW50cm9kdWNlZCB0byBvdmVyY29tZQotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzIxMS4gU2VlIGFsc28KLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg1NjUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldExpbWl0ZWRTdHJlYW0oSW5wdXRTdHJlYW0gb3JpZ2luYWwpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9yaWdpbmFsIGluc3RhbmNlb2YgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKQotCQkJcmV0dXJuIG9yaWdpbmFsOwotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkTGltaXRlZFN0cmVhbShvcmlnaW5hbCwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCBhbiBJbnB1dFN0cmVhbSBoYXMgbWFyay9yZXNldCBzdXBwb3J0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShJbnB1dFN0cmVhbSBvcmlnaW5hbCkgewotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob3JpZ2luYWwubWFya1N1cHBvcnRlZCgpKQotCQkJcmV0dXJuIG9yaWdpbmFsOwotCQlJbnB1dFN0cmVhbSBidWZmZXJlZCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG9yaWdpbmFsLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCWJ1ZmZlcmVkLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJcmV0dXJuIGJ1ZmZlcmVkOwotCX0KLQotCS8qKgotCSAqIFVzZWQgZm9yIGxvZy90cmFjZSBtZXNzYWdlcy4gSWQgaXMgYXNzdW1lZCB0byBiZSBzb21lIGZvcm0gb2YgYQotCSAqIGZpbGVuYW1lLiBTZWUgSU1vZGVsTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlU2hvcnRJZChPYmplY3QgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlpZCA9ICJOT0lEIjsgLy9jb20uaWJtLnNlZC51dGlsLkFzc2VydC5pc05vdE51bGwoaWQpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB3aG9sZSA9IGlkLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBwYXJ0ID0gd2hvbGUuc3Vic3RyaW5nKHdob2xlLmxhc3RJbmRleE9mKCIvIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gIi4uLiIgKyBwYXJ0OyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBVdGlsaXRpZXMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVXRpbGl0aWVzKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdmFsaWRhdGUvVmFsaWRhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdmFsaWRhdGUvVmFsaWRhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzMTZkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3ZhbGlkYXRlL1ZhbGlkYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JbmRleGVkUmVnaW9uOwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcik7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3ZhbGlkYXRlL1ZhbGlkYXRpb25NZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3ZhbGlkYXRlL1ZhbGlkYXRpb25NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YzM4YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS92YWxpZGF0ZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudmFsaWRhdGU7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT1JNQVRJT04gPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSAyOwotCXByaXZhdGUgaW50IGxlbmd0aDsKLQotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0OwotCXByaXZhdGUgaW50IHNldmVyaXR5OwotCi0JLyoqCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgb2Zmc2V0LCBpbnQgc2V2ZXJpdHkpIHsKLQkJdGhpcyhtZXNzYWdlLCBvZmZzZXQsIDAsIHNldmVyaXR5KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBzZXZlcml0eSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc2V2ZXJpdHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS92YWxpZGF0ZS9WYWxpZGF0aW9uUmVwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdmFsaWRhdGUvVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZWQwOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS92YWxpZGF0ZS9WYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnZhbGlkYXRlOwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblJlcG9ydGVyIHsKLQotCS8qKgotCSAqLwotCXZvaWQgcmVwb3J0KFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlYzY2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXhtbG1vZGVsLmphcgotb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwZGY4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS9kZWJ1Zy90cmFjZWZpbHRlcj0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTc1MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz48L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2RiYjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSNXZWQgSmFuIDEyIDEzOjUwOjUyIEVTVCAyMDA1DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTY0NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRIZSBYTUwgc3BlY2lmaWMgbW9kZWwgaW1wbGVtZW50YXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDFkNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICB4bWwuamFyLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGV4dGVuc2lvbnMueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGV4dGVuc2lvbnMueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucwotc291cmNlLnhtbG1vZGVsLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNmI0YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBYTUwgTW9kZWwKLW5sRmVhdHVyZU5hbWU9U3RydWN0dXJlZCBTb3VyY2UgWE1MIE1vZGVsIE5MIFN1cHBvcnQKLVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBYTUwgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLVhNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YTUwgQ29udGVudCBUeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmZTQ0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InhtbG1vZGVsLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlciIvPgotICAgPC9yZXF1aXJlcz4KLQotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0gICAgICA8bW9kZWxIYW5kbGVyCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yWE1MIgotICAgICAgICAgICAgYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVsaGFuZGxlciI+Ci0gICAgICA8L21vZGVsSGFuZGxlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5lbWJlZGRlZFR5cGVIYW5kbGVyIj4KLSAgICAgIDxlbWJlZGRlZFR5cGVIYW5kbGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVsaGFuZGxlci5FbWJlZGRlZFhNTCI+Ci0gICAgICA8L2VtYmVkZGVkVHlwZUhhbmRsZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5idWlsZGVyZGVsZWdhdGUudG9kbyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuYnVpbGRlcmRlbGVnYXRlIj4KLSAgICAgIDxwYXJ0aWNpcGFudAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5idWlsZGVyLmRlbGVnYXRlcy5YTUxUYXNrVGFnU2Vla2VyIgotICAgICAgICAgICAgY29udGVudFR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSI+Ci0gICAgICA8L3BhcnRpY2lwYW50PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMiCi0gICAgICAgICBuYW1lPSIlU3RydWN0dXJlZF9YTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSI+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLQkKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249InhzbCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249InhzbHQiPgotICAgICAgPC9maWxlVHlwZXM+Ci0gICAgICA8ZmlsZVR5cGVzCi0gICAgICAgICAgICB0eXBlPSJ0ZXh0IgotICAgICAgICAgICAgZXh0ZW5zaW9uPSJkYWR4Ij4KLSAgICAgIDwvZmlsZVR5cGVzPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0id3NkbCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249Im5zdCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249InhtaSI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249InhzZCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXRQcm9jZXNzb3JzIj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTCIKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotICAgICAgICAgPGNvbnRlbnQtdHlwZQotICAgICAgICAgICAgICAgZmlsZS1leHRlbnNpb25zPSJ4bWwseHNsLHhzbHQsZGFkeCx3c2RsLG5zdCx4bWkseHNkLGV4c2QiCi0gICAgICAgICAgICAgICBwcmlvcml0eT0ibG93IgotICAgICAgICAgICAgICAgbmFtZT0iJVhNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLSAgICAgICAgICAgICAgIGlkPSJ4bWxzb3VyY2UiCi0gICAgICAgICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQkgICBkZWZhdWx0LWNoYXJzZXQ9IlVURi04IgotCQkJICAgYWxpYXMtZm9yPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJICAgPgotCQkJPGRlc2NyaWJlciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkNvbnRlbnREZXNjcmliZXJGb3JYTUwiLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDFjMjllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotbm90ZWJvb2suanBhZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODg3MTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGludGVybmFsIHBhY2thZ2UgYmVjYXVzZSBvbmx5IHRoaXMgcGx1Z2luIHNob3VsZCBiZQotICogdXNpbmcgdGhpcyBMb2dnZXIgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyIHsKLQkvLyBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcgotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9OYW1lVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL05hbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkNTY0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL05hbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTDEwTmFtZXM7Ci0KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZVZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUwxME5hbWVzIGNoYXJDaGVja2VyID0gbmV3IFhNTDEwTmFtZXMoKFJlYWRlcikgbnVsbCk7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVmFsaWQoU3RyaW5nIG5hbWUpIHsKLQotCQlyZXR1cm4gY2hhckNoZWNrZXIuaXNWYWxpZFhNTDEwTmFtZShuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL1hNTE1vZGVsUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL1hNTE1vZGVsUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YWY5MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9YTUxNb2RlbFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgWE1MQ29yZVBsdWdpbiBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbFBsdWdpbiBleHRlbmRzIFhNTENvcmVQbHVnaW4gewotCS8vIGp1c3QgZXh0ZW5kaW5nIFhNTENvcmVQbHVnaW4gdG8ga2VlcCBldmVyeXRoaW5nIGNvbXBhdGlibGUKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvWE1MUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL1hNTFByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGYwNmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvWE1MUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MUHJlZmVyZW5jZU5hbWVzIHsKLQlTdHJpbmcgQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSA9ICJjbGVhbnVwQXR0ck5hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENMRUFOVVBfRU9MX0NPREUgPSAiY2xlYW51cEVPTENvZGUiOy8vJE5PTi1OTFMtMSQKLQkvLyBjbGVhbnVwIHByZWZlcmVuY2UgbmFtZXMKLQlTdHJpbmcgQ0xFQU5VUF9UQUdfTkFNRV9DQVNFID0gImNsZWFudXBUYWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05WRVJUX0VPTF9DT0RFUyA9ICJjb252ZXJ0RU9MQ29kZXMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRk9STUFUX1NPVVJDRSA9ICJmb3JtYXRTb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5TRVJUX01JU1NJTkdfVEFHUyA9ICJpbnNlcnRNaXNzaW5nVGFncyI7Ly8kTk9OLU5MUy0xJAotCi0JLy8gb3RoZXJzCi0JU3RyaW5nIExBU1RfQUNUSVZFX1BBR0UgPSAibGFzdEFjdGl2ZVBhZ2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUVVPVEVfQVRUUl9WQUxVRVMgPSAicXVvdGVBdHRyVmFsdWVzIjsvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIG5vdCB1c2VkIGZvciBub3cgLy8gaGlnaGxpZ2h0aW5nIHR5cGVzIFN0cmluZyBDT01NRU5UX0JPUkRFUiA9Ci0JICogImNvbW1lbnRCb3JkZXIiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENPTU1FTlRfVEVYVCA9Ci0JICogImNvbW1lbnRUZXh0IjsvLyROT04tTkxTLTEkIFN0cmluZyBDREFUQV9CT1JERVIgPQotCSAqICJjZGF0YUJvcmRlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQ0RBVEFfVEVYVCA9Ci0JICogImNkYXRhVGV4dCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgUElfQk9SREVSID0gInBpQm9yZGVyIjsvLyROT04tTkxTLTEkCi0JICogU3RyaW5nIFBJX0NPTlRFTlQgPSAicGlDb250ZW50IjsvLyROT04tTkxTLTEkIFN0cmluZyBUQUdfQk9SREVSID0KLQkgKiAidGFnQm9yZGVyIjsvLyROT04tTkxTLTEkIFN0cmluZyBUQUdfTkFNRSA9ICJ0YWdOYW1lIjsvLyROT04tTkxTLTEkCi0JICogU3RyaW5nIFRBR19BVFRSSUJVVEVfTkFNRSA9ICJ0YWdBdHRyaWJ1dGVOYW1lIjsvLyROT04tTkxTLTEkIFN0cmluZwotCSAqIFRBR19BVFRSSUJVVEVfVkFMVUUgPSAidGFnQXR0cmlidXRlVmFsdWUiOy8vJE5PTi1OTFMtMSQgU3RyaW5nCi0JICogREVDTF9CT1JERVIgPSAiZGVjbEJvZGVyIjsvLyROT04tTkxTLTEkIFN0cmluZyBET0NUWVBFX05BTUUgPQotCSAqICJkb2N0eXBlTmFtZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRCA9Ci0JICogImRvY3R5cGVFeHRlcm5hbElkIjsvLyROT04tTkxTLTEkIFN0cmluZyBET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiA9Ci0JICogImRvY3R5cGVFeHRlcm5hbFB1YnJlZiI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYgPQotCSAqICJkb2N0eXBlRXh0cmVuYWxTeXNyZWYiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIFhNTF9DT05URU5UID0KLQkgKiAieG1sQ29udGVudCI7Ly8kTk9OLU5MUy0xJCAvLyBoaWdobGlnaHRpbmcgcHJlZmVyZW5jZXMgU3RyaW5nIENPTU1BID0KLQkgKiAiLCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQ09MT1IgPSAiY29sb3IiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIE5BTUUgPQotCSAqICJuYW1lIjsvLyROT04tTkxTLTEkIFN0cmluZyBGT1JFR1JPVU5EID0gImZvcmVncm91bmQiOy8vJE5PTi1OTFMtMSQKLQkgKiBTdHJpbmcgQkFDS0dST1VORCA9ICJiYWNrZ3JvdW5kIjsvLyROT04tTkxTLTEkIFN0cmluZyBCT0xEID0KLQkgKiAiYm9sZCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgSVRBTElDID0gIml0YWxpYyI7Ly8kTk9OLU5MUy0xJAotCSAqLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9idWlsZGVyL2RlbGVnYXRlcy9YTUxUYXNrVGFnU2Vla2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2J1aWxkZXIvZGVsZWdhdGVzL1hNTFRhc2tUYWdTZWVrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliYmEzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2J1aWxkZXIvZGVsZWdhdGVzL1hNTFRhc2tUYWdTZWVrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmJ1aWxkZXIuZGVsZWdhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnRpY2lwYW50cy5UYXNrVGFnU2Vla2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxUYXNrVGFnU2Vla2VyIGV4dGVuZHMgVGFza1RhZ1NlZWtlciB7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFhNTFRhc2tUYWdTZWVrZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFydGljaXBhbnRzLlRhc2tUYWdTZWVrZXIjaXNDb21tZW50UmVnaW9uKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHRleHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhYTUxSZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0NDRmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY2xlYW51cC5BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNsZWFudXAuU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwUHJvY2Vzc29yWE1MIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGZDbGVhbnVwUHJlZmVyZW5jZXMgPSBudWxsOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgZ2V0Q2xlYW51cEhhbmRsZXIoTm9kZSBub2RlKSB7Ci0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCWNsZWFudXBIYW5kbGVyID0gbmV3IE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluaXQgQ2xlYW51cFByZWZlcmVuY2VzCi0JCWNsZWFudXBIYW5kbGVyLnNldENsZWFudXBQcmVmZXJlbmNlcyhnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSk7Ci0KLQkJcmV0dXJuIGNsZWFudXBIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmQ2xlYW51cFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcygpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRUYWdOYW1lQ2FzZShwcmVmZXJlbmNlcy5nZXRJbnQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRBdHRyTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Rm9ybWF0U291cmNlKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmQ2xlYW51cFByZWZlcmVuY2VzOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBnZXRGb3JtYXRQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWY0ZTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2xlYW51cDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBOb2RlQ2xlYW51cEhhbmRsZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEUgPSAnXCInOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFUyA9ICJcIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1RBR19DTE9TRSA9ICIvPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHX09QRU4gPSAiPC8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVTID0gIicnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIE5vbi1OTFMgc3RyaW5ncyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBR19PUEVOID0gIjwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIj4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlOb2RlIG5ld05vZGUgPSBjbGVhbnVwQ2hpbGRyZW4obm9kZSk7Ci0JCVhNTE5vZGUgcmVuYW1lZE5vZGUgPSBuZXdOb2RlIGluc3RhbmNlb2YgWE1MTm9kZSA/IChYTUxOb2RlKSBuZXdOb2RlIDogbnVsbDsKLQotCQkvLyBjYWxsIHF1b3RlQXR0clZhbHVlKCkgZmlyc3Qgc28gaXQgd2lsbCBjbG9zZSBhbnkgdW5jbG9zZWQgYXR0cgotCQkvLyBxdW90ZUF0dHJWYWx1ZSgpIHdpbGwgcmV0dXJuIHRoZSBuZXcgc3RhcnQgdGFnIGlmIHRoZXJlIGlzIGEKLQkJLy8gc3RydWN0dXJlIGNoYW5nZQotCQlyZW5hbWVkTm9kZSA9IHF1b3RlQXR0clZhbHVlKHJlbmFtZWROb2RlKTsKLQotCQkvLyBpbnNlcnQgdGFnIGNsb3NlIGlmIG1pc3NpbmcKLQkJLy8gaWYgbm9kZSBpcyBub3QgY29tbWVudCB0YWcKLQkJLy8gYW5kIG5vdCBpbXBsaWNpdCB0YWcKLQkJaWYgKCFpc0NvbW1lbnRUYWcocmVuYW1lZE5vZGUpICYmICFpc0ltcGxpY2l0VGFnKHJlbmFtZWROb2RlKSkgewotCQkJWE1MTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gcmVuYW1lZE5vZGUuZ2V0TW9kZWwoKTsKLQotCQkJLy8gc2F2ZSBzdGFydCBvZmZzZXQgYmVmb3JlIGluc2VydFRhZ0Nsb3NlKCkKLQkJCS8vIG9yIGVsc2UgcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSB3aWxsIGJlIHplcm8gaWYKLQkJCS8vIHJlbmFtZWROb2RlIHJlcGxhY2VkIGJ5IGluc2VydFRhZ0Nsb3NlKCkKLQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJLy8gZm9yIHN0YXJ0IHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbnNlcnRUYWdDbG9zZShzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJLy8gdXBkYXRlIHJlbmFtZWROb2RlIGFuZCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhZnRlcgotCQkJLy8gaW5zZXJ0VGFnQ2xvc2UoKQotCQkJcmVuYW1lZE5vZGUgPSAoWE1MTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7Ci0JCQlzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJCS8vIGZvciBlbmQgdGFnCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQlpbnNlcnRUYWdDbG9zZShzdHJ1Y3R1cmVkTW9kZWwsIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQotCQkvLyBjYWxsIGluc2VydE1pc3NpbmdUYWdzKCkgbmV4dCwgaXQgd2lsbCBnZW5lcmF0ZSBpbXBsaWNpdCB0YWdzIGlmCi0JCS8vIHRoZXJlIGFyZSBhbnkKLQkJLy8gaW5zZXJ0TWlzc2luZ1RhZ3MoKSB3aWxsIHJldHVybiB0aGUgbmV3IG1pc3Npbmcgc3RhcnQgdGFnIGlmIG9uZSBpcwotCQkvLyBtaXNzaW5nCi0JCXJlbmFtZWROb2RlID0gaW5zZXJ0TWlzc2luZ1RhZ3MocmVuYW1lZE5vZGUpOwotCi0JCXJlbmFtZWROb2RlID0gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWcocmVuYW1lZE5vZGUpOwotCi0JCXJlbmFtZWROb2RlID0gaW5zZXJ0UmVxdWlyZWRBdHRycyhyZW5hbWVkTm9kZSk7Ci0KLQkJcmV0dXJuIHJlbmFtZWROb2RlOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGNsZWFudXBDaGlsZHJlbihOb2RlIG5vZGUpIHsKLQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZTsKLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0IGNsZWFudXAgaGFuZGxlcgotCQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBnZXRDbGVhbnVwSGFuZGxlcihjaGlsZE5vZGUpOwotCi0JCQkJLy8gY2xlYW51cCBlYWNoIGNoaWxkCi0JCQkJY2hpbGROb2RlID0gY2xlYW51cEhhbmRsZXIuY2xlYW51cChjaGlsZE5vZGUpOwotCi0JCQkJLy8gZ2V0IG5ldyBwYXJlbnQgbm9kZQotCQkJCXBhcmVudE5vZGUgPSAoWE1MTm9kZSkgY2hpbGROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCS8vIGdldCBuZXh0IGNoaWxkIG5vZGUKLQkJCQljaGlsZE5vZGUgPSAoWE1MTm9kZSkgY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIFhNTE5vZGUgY29tcHJlc3NFbXB0eUVsZW1lbnRUYWcoWE1MTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKCk7Ci0JCVhNTE5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQlpZiAoY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzICYmIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAmJiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJLy8gZm9ybWF0IGNoaWxkcmVuIGFuZCBlbmQgdGFnIGlmIG5vdCBlbXB0eSBlbGVtZW50IHRhZwotCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBuZXdOb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQlpZiAoY2hpbGROb2RlcyA9PSBudWxsIHx8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCB8fCAoY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA9PSAxICYmIChjaGlsZE5vZGVzLml0ZW0oMCkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKChjaGlsZE5vZGVzLml0ZW0oMCkpLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkpIHsKLQkJCQkJWE1MTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbmV3Tm9kZS5nZXRNb2RlbCgpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5ld05vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJaW50IG9mZnNldCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpOwotCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW5ld05vZGUgPSAoWE1MTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQotCQkJCQlvZmZzZXQgPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpICsgbGFzdFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIDAsICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3Tm9kZSA9IChYTUxOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2Ugb3JnLnczYy5kb20uTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBvcmcudzNjLmRvbS5Ob2RlLlRFWFRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0IENsZWFudXBQcmVmZXJlbmNlcwotCQljbGVhbnVwSGFuZGxlci5zZXRDbGVhbnVwUHJlZmVyZW5jZXMoZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBjbGVhbnVwSGFuZGxlcjsKLQl9Ci0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoRG9jdW1lbnQpIG5vZGUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWRBdHRycyhOb2RlIG5vZGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gZ2V0TW9kZWxRdWVyeShub2RlKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBYTUxOb2RlIGluc2VydEVuZFRhZyhYTUxOb2RlIG5vZGUpIHsKLQkJWE1MTm9kZSBuZXdOb2RlID0gbm9kZTsKLQkJWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJWE1MTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCi0JCWlmIChpc0VtcHR5RWxlbWVudChlbGVtZW50KSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCBsYXN0UmVnaW9uLmdldExlbmd0aCgpLCBFTVBUWV9UQUdfQ0xPU0UpOwotCi0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uQmVmb3JlVGFnQ2xvc2UgPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEgLSAxKTsKLQotCQkJCS8vIGluc2VydCBhIHNwYWNlIHNlcGFyYXRvciBiZWZvcmUgdGFnIGNsb3NlIGlmIHRoZSBwcmV2aW91cwotCQkJCS8vIHJlZ2lvbiBkb2VzIG5vdCBoYXZlIGV4dHJhIHNwYWNlcwotCQkJCWlmIChyZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRUZXh0TGVuZ3RoKCkgPT0gcmVnaW9uQmVmb3JlVGFnQ2xvc2UuZ2V0TGVuZ3RoKCkpCi0JCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZyBlbmRUYWcgPSBFTkRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCi0JCQlYTUxOb2RlIGxhc3RDaGlsZCA9IChYTUxOb2RlKSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaW50IGVuZFRhZ1N0YXJ0T2Zmc2V0ID0gMDsKLQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkKLQkJCQkvLyBpZiB0aGlzIG5vZGUgaGFzIGNoaWxkcmVuLCBpbnNlcnQgdGhlIGVuZCB0YWcgYWZ0ZXIgdGhlCi0JCQkJLy8gbGFzdCBjaGlsZAotCQkJCWVuZFRhZ1N0YXJ0T2Zmc2V0ID0gbGFzdENoaWxkLmdldEVuZE9mZnNldCgpOwotCQkJZWxzZQotCQkJCS8vIGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXMgY2hpbGRyZW4sIGluc2VydCB0aGUgZW5kIHRhZwotCQkJCS8vIGFmdGVyIHRoZSBzdGFydCB0YWcKLQkJCQllbmRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgZW5kVGFnU3RhcnRPZmZzZXQsIDAsIGVuZFRhZyk7Ci0JCX0KLQotCQluZXdOb2RlID0gKFhNTE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCS8vIG5ldwotCQkvLyBub2RlCi0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBYTUxOb2RlIGluc2VydE1pc3NpbmdUYWdzKFhNTE5vZGUgbm9kZSkgewotCQlib29sZWFuIGluc2VydE1pc3NpbmdUYWdzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0SW5zZXJ0TWlzc2luZ1RhZ3MoKTsKLQkJWE1MTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCS8vIGltcGxpY2l0IHN0YXJ0IHRhZzsgZ2VuZXJhdGUgdGFnIGZvciBpdAotCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhub2RlKTsKLQkJCQlzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVRleHRSZWdpb25MaXN0IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucyAhPSBudWxsICYmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblJlZ2lvbnMuZ2V0KHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucy5zaXplKCkgLSAxKSkuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCi0JCQl9IGVsc2UgewotCQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIHN0YXJ0IHRhZyBtaXNzaW5nCi0JCQkJCWlmIChpc1N0YXJ0VGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0U3RhcnRUYWcobmV3Tm9kZSk7Ci0JCQkJfSBlbHNlIGlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQkvLyBlbmQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzRW5kVGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0RW5kVGFnKG5ld05vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgWE1MTm9kZSBpbnNlcnRSZXF1aXJlZEF0dHJzKFhNTE5vZGUgbm9kZSkgewotCQlib29sZWFuIGluc2VydFJlcXVpcmVkQXR0cnMgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRJbnNlcnRSZXF1aXJlZEF0dHJzKCk7Ci0JCVhNTE5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKGluc2VydFJlcXVpcmVkQXR0cnMpIHsKLQkJCUxpc3QgcmVxdWlyZWRBdHRycyA9IGdldFJlcXVpcmVkQXR0cnMobmV3Tm9kZSk7Ci0JCQlpZiAocmVxdWlyZWRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJTmFtZWROb2RlTWFwIGN1cnJlbnRBdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCUxpc3QgaW5zZXJ0QXR0cnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKSA9PSAwKQotCQkJCQlpbnNlcnRBdHRycy5hZGRBbGwocmVxdWlyZWRBdHRycyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWRBdHRycy5zaXplKCk7IGkrKykgewotCQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0ck5hbWUgPSAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJlcXVpcmVkQXR0cnMuZ2V0KGkpKS5nZXRBdHRyTmFtZSgpOwotCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCVN0cmluZyBjdXJyZW50QXR0ck5hbWUgPSBjdXJyZW50QXR0cnMuaXRlbShqKS5nZXROb2RlTmFtZSgpOwotCQkJCQkJCWlmIChyZXF1aXJlZEF0dHJOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoY3VycmVudEF0dHJOYW1lKSA9PSAwKSB7Ci0JCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFmb3VuZCkKLQkJCQkJCQlpbnNlcnRBdHRycy5hZGQocmVxdWlyZWRBdHRycy5nZXQoaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpbnNlcnRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWludCBpbmRleCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCQlpbmRleC0tOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0gZWxzZSBpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJCQlpbmRleCA9IGluZGV4IC0gMjsKLQkJCQkJCWxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCAtIDEpOwotCQkJCQl9Ci0JCQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBpID0gaW5zZXJ0QXR0cnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGluc2VydEF0dHJzLmdldChpKTsKLQkJCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyaWJ1dGVOYW1lID0gYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ckRlY2wuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKQotCQkJCQkJCQlkZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBuYW1lQW5kRGVmYXVsdFZhbHVlID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGkgPT0gMCAmJiBsYXN0UmVnaW9uLmdldExlbmd0aCgpID4gbGFzdFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpCi0JCQkJCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgKz0gcmVxdWlyZWRBdHRyaWJ1dGVOYW1lICsgIj1cIiIgKyBkZWZhdWx0VmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGluZGV4LCBuYW1lQW5kRGVmYXVsdFZhbHVlKSk7Ci0JCQkJCQkJLy8gQlVHMzM4MTogTXVsdGlUZXh0RWRpdCBhcHBsaWVzIGFsbCBjaGlsZAotCQkJCQkJCS8vIFRleHRFZGl0J3MgYmFzaW5nIG9uIG9mZnNldHMKLQkJCQkJCQkvLyAgICAgICAgICBpbiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBmaXJzdCBUZXh0RWRpdCwgbm90Ci0JCQkJCQkJLy8gYWZ0ZXIgZWFjaAotCQkJCQkJCS8vICAgICAgICAgIGNoaWxkIFRleHRFZGl0LiBUaGVyZWZvcmUsIGRvIG5vdCBuZWVkIHRvCi0JCQkJCQkJLy8gYWR2YW5jZSB0aGUgaW5kZXguCi0JCQkJCQkJLy9pbmRleCArPSBuYW1lQW5kRGVmYXVsdFZhbHVlLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQkJbXVsdGlUZXh0RWRpdC5hcHBseShuZXdOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBYTUxOb2RlIGluc2VydFN0YXJ0VGFnKFhNTE5vZGUgbm9kZSkgewotCQlYTUxOb2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpc0NvbW1lbnRUYWcobm9kZSkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgc3RhcnRUYWcgPSBTVEFSVF9UQUdfT1BFTi5jb25jYXQodGFnTmFtZSkuY29uY2F0KFRBR19DTE9TRSk7Ci0JCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCi0JCVhNTE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0VGFnU3RhcnRPZmZzZXQsIDAsIHN0YXJ0VGFnKTsKLQkJbmV3Tm9kZSA9IChYTUxOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkvLyBuZXcKLQkJLy8gbm9kZQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnNlcnRUYWdDbG9zZShYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCBmbGF0bm9kZVJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlpZiAoZmxhdG5vZGVSZWdpb25zICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gZmxhdG5vZGVSZWdpb25zLmdldChmbGF0bm9kZVJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGxhc3RSZWdpb24uZ2V0VHlwZSgpOwotCQkJCQlpZiAoKHJlZ2lvblR5cGUgIT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSAmJiAocmVnaW9uVHlwZSAhPSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQkJLy8gaW5zZXJ0ICI+IiBhZnRlciBsYXN0UmVnaW9uIG9mIGZsYXROb2RlCi0JCQkJCQkvLyBhcyBpbiAiPGE8L2E+IiBpZiBmbGF0Tm9kZSBpcyBmb3Igc3RhcnQgdGFnLCBvciBpbgotCQkJCQkJLy8gIjxhPjwvYSIgaWYgZmxhdE5vZGUgaXMgZm9yIGVuZCB0YWcKLQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQobGFzdFJlZ2lvbiksIDAsICI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZW5hbWVkTm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50VGFnKE5vZGUgcmVuYW1lZE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHJlbmFtZWROb2RlIGluc3RhbmNlb2YgWE1MRWxlbWVudCkgewotCQkJWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIHJlbmFtZWROb2RlOwotCQkJcmVzdWx0ID0gZWxlbWVudC5pc0NvbW1lbnRUYWcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5RWxlbWVudChYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VuZFRhZ1JlcXVpcmVkKFhNTE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbm9kZS5pc0NvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEEgdGFnIGlzIGltcGxpY2l0IGlmIGl0IGhhcyBub3QgY29ycmVzcG9uZGluZyByZWdpb24gaW4gZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlbmFtZWROb2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ltcGxpY2l0VGFnKFhNTE5vZGUgcmVuYW1lZE5vZGUpIHsKLQkJcmV0dXJuIHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5kIHRhZ3Mgb2YgSFRNTCBFTVBUWSBjb250ZW50IHR5cGUsIHN1Y2ggYXMgSU1HLCBhbmQgSFRNTAotCSAqIHVuZGVmaW5lZCB0YWdzIGFyZSBwYXJzZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBzdGFydCB0YWdzLiBTbyBpbnNlcnRpbmcKLQkgKiB0aGUgbWlzc2luZyBzdGFydCB0YWcgaXMgdXNlbGVzcyBhbmQgZXZlbiBoYXJtZnVsLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1N0YXJ0VGFnUmVxdWlyZWQoWE1MTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBub2RlLmlzQ29udGFpbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MVHlwZShYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwgJiYgc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCVhNTERvY3VtZW50IGRvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldERvY3VtZW50KCk7Ci0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGRvY3VtZW50LmlzWE1MVHlwZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFhNTE5vZGUgcXVvdGVBdHRyVmFsdWUoWE1MTm9kZSBub2RlKSB7Ci0JCVhNTE5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0JCS8vWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChpc0NvbW1lbnRUYWcobm9kZSkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0KLQkJaWYgKHF1b3RlQXR0clZhbHVlcykgewotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBuZXdOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQlpbnQgYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJWE1MR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0xlbmd0aDsgaSsrKSB7Ci0JCQkJCWF0dHJpYnV0ZXMgPSBuZXdOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJCVhNTEF0dHIgZWFjaEF0dHIgPSAoWE1MQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCQkvL0lUZXh0UmVnaW9uIG9sZEF0dHJWYWx1ZVJlZ2lvbiA9Ci0JCQkJCS8vIGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJCVN0cmluZyBvbGRBdHRyVmFsdWUgPSBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKG9sZEF0dHJWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCQlYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQkJCQlpZiAoaXNYTUxUeXBlKHN0cnVjdHVyZWRNb2RlbCkpIHsKLQkJCQkJCQlTdHJpbmcgbmV3QXR0clZhbHVlID0gIlwiIiArIGVhY2hBdHRyLmdldE5hbWVSZWdpb25UZXh0KCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQkJCWlmIChlYWNoQXR0ci5nZXRFcXVhbFJlZ2lvbigpICE9IG51bGwpCi0JCQkJCQkJCS8vIGVxdWFsIHJlZ2lvbiBleGlzdHMKLQkJCQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgZWFjaEF0dHIuZ2V0RW5kT2Zmc2V0KCksIDAsIG5ld0F0dHJWYWx1ZSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQkvLyBubyBlcXVhbCByZWdpb24KLQkJCQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgZWFjaEF0dHIuZ2V0TmFtZVJlZ2lvblRleHRFbmRPZmZzZXQoKSwgMCwgIj0iLmNvbmNhdChuZXdBdHRyVmFsdWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5ld05vZGUgPSAoWE1MTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24obm9kZS5nZXRTdGFydE9mZnNldCgpKTsgLy8gc2F2ZQotCQkJCQkJCS8vIG5ldwotCQkJCQkJCS8vIG5vZGUKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vU3RyaW5nIG9sZEF0dHJWYWx1ZSA9IG9sZEF0dHJWYWx1ZVJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQkJCQljaGFyIHF1b3RlID0gU3RyaW5nVXRpbHMuaXNRdW90ZWQob2xkQXR0clZhbHVlKSA/IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCkgOiBET1VCTEVfUVVPVEU7Ci0JCQkJCQlTdHJpbmcgbmV3QXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGVhY2hBdHRyLCBxdW90ZSk7Ci0KLQkJCQkJCS8vIFRoZXJlIGlzIGEgcHJvYmxlbSBpbgotCQkJCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoSVRleHRSZWdpb24pCi0JCQkJCQkvLyB3aGVuIHRoZSByZWdpb24gaXMgaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uLgotCQkJCQkJLy8gV29ya2Fyb3VuZCBmb3Igbm93Li4uCi0JCQkJCQlpZiAob2xkQXR0clZhbHVlLmxlbmd0aCgpID09IDEpIHsKLQkJCQkJCQljaGFyIGZpcnN0Q2hhciA9IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCk7Ci0JCQkJCQkJaWYgKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEUpCi0JCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IFNJTkdMRV9RVU9URVM7Ci0JCQkJCQkJZWxzZSBpZiAoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URSkKLQkJCQkJCQkJbmV3QXR0clZhbHVlID0gRE9VQkxFX1FVT1RFUzsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZS5jb21wYXJlVG8ob2xkQXR0clZhbHVlKSAhPSAwKSB7Ci0JCQkJCQkJCWludCBhdHRyVmFsdWVTdGFydE9mZnNldCA9IGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQkJCQkJaW50IGF0dHJWYWx1ZUxlbmd0aCA9IG9sZEF0dHJWYWx1ZS5sZW5ndGgoKTsKLQkJCQkJCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCQkJCQkJWE1MTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgYXR0clZhbHVlU3RhcnRPZmZzZXQsIGF0dHJWYWx1ZUxlbmd0aCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCQkJbmV3Tm9kZSA9IChYTUxOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkJCQkJCQkvLyBuZXcKLQkJCQkJCQkJLy8gbm9kZQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjZjI3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNsZWFudXAuU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucHJlZmVyZW5jZXMuQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTm9kZUNsZWFudXBIYW5kbGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnBhcnRpdGlvbkNsZWFudXAuQ2xlYW51cEhhbmRsZXIjY2xlYW51cChjb20uaWJtLnNlZC5tb2RlbC54bWwuWE1MTm9kZSkKLQkgKi8KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCi0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQucGFydGl0aW9uQ2xlYW51cC5DbGVhbnVwSGFuZGxlciNnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmQ2xlYW51cFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcygpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRUYWdOYW1lQ2FzZShwcmVmZXJlbmNlcy5nZXRJbnQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRBdHRyTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Rm9ybWF0U291cmNlKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmQ2xlYW51cFByZWZlcmVuY2VzOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGVhbnVwUHJlZmVyZW5jZXMoSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgY2xlYW51cFByZWZlcmVuY2VzKSB7Ci0KLQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NsZWFudXAvWE1MQ2xlYW51cFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NsZWFudXAvWE1MQ2xlYW51cFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWU0N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jbGVhbnVwL1hNTENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCByZW5hbWVkIHRvIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzCi0gKiAKLSAqIFRPRE8gd2lsbCBkZWxldGUgaW4gQzUKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxDbGVhbnVwUHJlZmVyZW5jZXMgewotCi0JaW50IGdldEF0dHJOYW1lQ2FzZSgpOwotCi0JYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXMoKTsKLQotCVN0cmluZyBnZXRFT0xDb2RlKCk7Ci0KLQlib29sZWFuIGdldEZvcm1hdFNvdXJjZSgpOwotCi0JYm9vbGVhbiBnZXRJbnNlcnRNaXNzaW5nVGFncygpOwotCi0JYm9vbGVhbiBnZXRRdW90ZUF0dHJWYWx1ZXMoKTsKLQotCWludCBnZXRUYWdOYW1lQ2FzZSgpOwotCi0Jdm9pZCBzZXRBdHRyTmFtZUNhc2UoaW50IGF0dHJOYW1lQ2FzZSk7Ci0KLQl2b2lkIHNldENvbnZlcnRFT0xDb2Rlcyhib29sZWFuIGNvbnZlcnRFT0xDb2Rlcyk7Ci0KLQl2b2lkIHNldEVPTENvZGUoU3RyaW5nIEVPTENvZGUpOwotCi0Jdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpOwotCi0Jdm9pZCBzZXRJbnNlcnRNaXNzaW5nVGFncyhib29sZWFuIGluc2VydE1pc3NpbmdUYWdzKTsKLQotCS8vdm9pZCBzZXRQcmVmZXJlbmNlU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUpOwotCXZvaWQgc2V0UHJlZmVyZW5jZXMoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpOwotCi0Jdm9pZCBzZXRRdW90ZUF0dHJWYWx1ZXMoYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMpOwotCi0Jdm9pZCBzZXRUYWdOYW1lQ2FzZShpbnQgdGFnTmFtZUNhc2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jbGVhbnVwL1hNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTI5MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jbGVhbnVwL1hNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5YTUxQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgcmVuYW1lZCB0byBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzCi0gKiAKLSAqIFRPRE8gd2lsbCBkZWxldGUgaW4gQzUKLSAqLwotcHVibGljIGNsYXNzIFhNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwgaW1wbGVtZW50cyBYTUxDbGVhbnVwUHJlZmVyZW5jZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbCBmSW5zdGFuY2U7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsIGdldEluc3RhbmNlKCkgewotCi0JCS8vIGFkZGVkIGZvciBvbmUgbWV0aG9kIGluIENsZWFudXBEaWFsb2cgLi4uIG1heSBiZSBiZXR0ZXIgd2F5Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IFhNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgaW50IGZBdHRyTmFtZUNhc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZDb252ZXJ0RU9MQ29kZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVPTENvZGU7Ci0JcHJpdmF0ZSBib29sZWFuIGZGb3JtYXRTb3VyY2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbnNlcnRNaXNzaW5nVGFnczsKLQkvL3ByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQlwcml2YXRlIFByZWZlcmVuY2VzIGZQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZRdW90ZUF0dHJWYWx1ZXM7Ci0JcHJpdmF0ZSBpbnQgZlRhZ05hbWVDYXNlOwotCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZBdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29udmVydEVPTENvZGVzKCkgewotCi0JCXJldHVybiBmQ29udmVydEVPTENvZGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RU9MQ29kZSgpIHsKLQotCQlyZXR1cm4gZkVPTENvZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0U291cmNlKCkgewotCi0JCXJldHVybiBmRm9ybWF0U291cmNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEluc2VydE1pc3NpbmdUYWdzKCkgewotCi0JCXJldHVybiBmSW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JfQotCi0JcHVibGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCi0JCWlmIChmUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZlByZWZlcmVuY2VzID0gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gZlByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFF1b3RlQXR0clZhbHVlcygpIHsKLQotCQlyZXR1cm4gZlF1b3RlQXR0clZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhZ05hbWVDYXNlKCkgewotCi0JCXJldHVybiBmVGFnTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0ck5hbWVDYXNlKGludCBhdHRyTmFtZUNhc2UpIHsKLQotCQlmQXR0ck5hbWVDYXNlID0gYXR0ck5hbWVDYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRFT0xDb2Rlcyhib29sZWFuIGNvbnZlcnRFT0xDb2RlcykgewotCi0JCWZDb252ZXJ0RU9MQ29kZXMgPSBjb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RU9MQ29kZShTdHJpbmcgRU9MQ29kZSkgewotCi0JCWZFT0xDb2RlID0gRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpIHsKLQotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc2VydE1pc3NpbmdUYWdzKGJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQotCQlmSW5zZXJ0TWlzc2luZ1RhZ3MgPSBpbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlcyhQcmVmZXJlbmNlcyBwcmVmcykgewotCi0JCWZQcmVmZXJlbmNlcyA9IHByZWZzOwotCQl1cGRhdGVPcHRpb25zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVvdGVBdHRyVmFsdWVzKGJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzKSB7Ci0KLQkJZlF1b3RlQXR0clZhbHVlcyA9IHF1b3RlQXR0clZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWdOYW1lQ2FzZShpbnQgdGFnTmFtZUNhc2UpIHsKLQotCQlmVGFnTmFtZUNhc2UgPSB0YWdOYW1lQ2FzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPcHRpb25zKCkgewotCi0JCVByZWZlcmVuY2VzIHAgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlmVGFnTmFtZUNhc2UgPSBwLmdldEludChYTUxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKTsKLQkJZkF0dHJOYW1lQ2FzZSA9IHAuZ2V0SW50KFhNTFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFKTsKLQkJZkluc2VydE1pc3NpbmdUYWdzID0gcC5nZXRCb29sZWFuKFhNTFByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKTsKLQkJZlF1b3RlQXR0clZhbHVlcyA9IHAuZ2V0Qm9vbGVhbihYTUxQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpOwotCQlmRm9ybWF0U291cmNlID0gcC5nZXRCb29sZWFuKFhNTFByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFKTsKLQkJZkNvbnZlcnRFT0xDb2RlcyA9IHAuZ2V0Qm9vbGVhbihYTUxQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpOwotCQlmRU9MQ29kZSA9IHAuZ2V0U3RyaW5nKFhNTFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlMzU0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbW1lbnRlbGVtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlRhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50RWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50cyBUYWdBZGFwdGVyIHsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiBmQ29uZmlndXJhdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBmRW5kVGFnOwotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGZIYW5kbGVyOwotCi0JcHVibGljIENvbW1lbnRFbGVtZW50QWRhcHRlcihib29sZWFuIGlzRW5kVGFnLCBDb21tZW50RWxlbWVudEhhbmRsZXIgaGFuZGxlcikgewotCQlmRW5kVGFnID0gaXNFbmRUYWc7Ci0JCWZIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZW5lcmF0ZUNvbW1lbnRDbG9zZShYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50LmlzSlNQVGFnKCkpID8gIi0tJT4iIDogIi0tPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlQ29tbWVudE9wZW4oWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudC5pc0pTUFRhZygpKSA/ICI8JS0tIiA6ICI8IS0tIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQubW9kZWwueG1sLlRhZ0FkYXB0ZXIjZ2V0RW5kVGFnKFhNTEVsZW1lbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmRUYWcoWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBjb250ZW50ID0gZkhhbmRsZXIuZ2VuZXJhdGVFbmRUYWdDb250ZW50KGVsZW1lbnQpOwotCQlpZiAoY29udGVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50T3BlbihlbGVtZW50KSk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50Q2xvc2UoZWxlbWVudCkpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJJRCgpIHsKLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb24oKS5nZXRIYW5kbGVySUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIHNob3VsZCBub3QgYmUgbmVlZGVkIGJ5IGFueW9uZQotCSAqLwotCXB1YmxpYyBJUGx1Z2luRGVzY3JpcHRvciBnZXRIYW5kbGVyUGx1Z2luRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uLmdldEhhbmRsZXJQbHVnaW5EZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQubW9kZWwueG1sLlRhZ0FkYXB0ZXIjZ2V0U3RhcnRUYWcoWE1MRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnKFhNTEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgY29udGVudCA9IGZIYW5kbGVyLmdlbmVyYXRlU3RhcnRUYWdDb250ZW50KGVsZW1lbnQpOwotCQlpZiAoY29udGVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50T3BlbihlbGVtZW50KSk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50Q2xvc2UoZWxlbWVudCkpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLm1vZGVsLklOb2RlQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDb21tZW50RWxlbWVudEFkYXB0ZXIuY2xhc3MgfHwgdHlwZSA9PSBUYWdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuICghZkhhbmRsZXIuaXNFbXB0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLm1vZGVsLnhtbC5UYWdBZGFwdGVyI2lzRW5kVGFnKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZygpIHsKLQkJcmV0dXJuIGZFbmRUYWc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5tb2RlbC5JTm9kZUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyLCBpbnQsCi0JICogICAgICBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlmQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZWFlMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb21tZW50ZWxlbWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1lbnRFbGVtZW50SGFuZGxlciB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHByZWZpeCBvZiB0aGUgY29tbWVudCBjb250ZW50IG1hdGNoZXMKLQkgKiB0aGUgc3RyaW5nIHNwZWNpZmllZCBpbiAmbHQ7c3RhcnRzd2l0aCBwcmVmaXg9IiIvJmd0OyBpbiBwbHVnaW4KLQkgKiBleHRlbnNpb24uIENvbW1lbnQgY29udGVudCBpcyBwYXJzZWQgYW5kIG5ldyBET00gZWxlbWVudCBpcyBjcmVhdGVkIGluCi0JICogdGhpcyBtZXRob2QuIEltcGxlbWVudG9yIGhhcyB0byBkbyBmb2xsb3dpbmc6Ci0JICogPGxpPkZvciBzdGFydCB0YWcgOgotCSAqIDx1bD4KLQkgKiA8bGk+cGFyc2UgY29tbWVudCBjb250ZW50IGFuZCBjcmVhdGUgbmV3IGVsZW1lbnQgaW5zdGFuY2UuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogPGxpPkZvciBlbmQgdGFnIDoKLQkgKiA8dWw+Ci0JICogPGxpPnBhcnNlIGNvbW1lbnQgY29udGVudCBhbmQgY3JlYXRlIG5ldyBlbGVtZW50IGluc3RhbmNlLjwvbGk+Ci0JICogPGxpPm1ha2UgaXNFbmRUYWcgZmxhZyB0cnVlLjwvbGk+Ci0JICogPGxpPlBhcnNlciBmcmFtZXdvcmsgc2VhcmNoZXMgbWFjaGVkIHN0YXJ0IHRhZyBlbGVtZW50IGluc3RhbmNlIGFmdGVyCi0JICogdGhpcyBjcmVhdGVFbGVtZW50IGNhbGwsIGFuZCBuZXcgaW5zdGFuY2UgaXMganVzdCB0aHJvd24gYXdheS48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9saT4KLQkgKiA8bGk+Rm9yIGVtcHR5IHRhZyA6Ci0JICogPHVsPgotCSAqIDxsaT5wYXJzZSBjb21tZW50IGNvbnRlbnQgYW5kIGNyZWF0ZSBuZXcgZWxlbWVudCBpbnN0YW5jZS48L2xpPgotCSAqIDxsaT5tYWtlIGlzRW5kVGFnIGZsYWcgdHJ1ZS48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9saT4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHBhcmVudCBET00gZG9jdW1lbnQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgY29tbWVudCBjb250ZW50LiBjb21tZW50IHByZWZpeCAoJmx0OyEtLSBvciAmbHQ7JS0tKSwgc3VmZml4Ci0JICogICAgICAgICAgICAoLS0mZ3Q7IG9yIC0tJSZndDspLCBhbmQgc3Vycm91bmRpbmcgc3BhY2VzIGFyZSB0cmltbWVkLgotCSAqIEBwYXJhbSBpc0pTUFRhZwotCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgY29tbWVudCBpcyBKU1Agc3R5bGUgY29tbWVudC4gVGhpcyBpbmZvcm1hdGlvbgotCSAqICAgICAgICAgICAgbWF5IGJlIHJlcXVpcmVkIGJ5IGhhbmRsZXIgd2hlbiB0aGUgaGFuZGxlciBhY2NlcHRzIGJvdGggWE1MCi0JICogICAgICAgICAgICBzdHlsZSBhbmQgSlNQIHN0eWxlIGNvbW1lbnQgKG5hbWVseSwKLQkgKiAgICAgICAgICAgIGNvbW1lbnR0eXBlPSZxdW90O2JvdGgmcXVvdDsgaW4gcGx1Z2luLnhtbCkuCi0JICogQHJldHVybiBjb21tZW50IGVsZW1lbnQgaW5zdGFuY2UgaWYgdGhlIGNvbW1lbnQgY29udGVudCBpcyByaWdodGx5Ci0JICogICAgICAgICBwYXJzZWQuIGlmIHBhcnNlIGZhaWxlZCwgcmV0dXJucyBudWxsLgotCSAqLwotCUVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBzb3VyY2UgdGV4dCBvZiB0aGUgZW5kIHRhZyBmb3IgdGhlIHBhc3NlZAotCSAqIGVsZW1lbnQuIERvIG5vdCBnZW5lcmF0ZSBjb21tZW50IHByZWZpeCAoJmx0OyEtLSBvciAmbHQ7JS0tKSBhbmQgc3VmZml4Ci0JICogKC0tJmd0OyBvciAtLSUmZ3Q7KS4gWE1MR2VuZXJhdG9yIHVzZXMgdGhpcyBtZXRob2QgdG8gZ2VuZXJhdGUgWE1ML0hUTUwKLQkgKiBzb3VyY2UgZm9yIGEgY29tbWVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgY29tbWVudCBlbGVtZW50Ci0JICogQHJldHVybiBnZW5lcmF0ZWQgdGFnIHN0cmluZwotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoWE1MRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgc291cmNlIHRleHQgb2YgdGhlIHN0YXJ0IHRhZyBmb3IgdGhlIHBhc3NlZAotCSAqIGVsZW1lbnQuIERvIG5vdCBnZW5lcmF0ZSBjb21tZW50IHByZWZpeCAoJmx0OyEtLSBvciAmbHQ7JS0tKSBhbmQgc3VmZml4Ci0JICogKC0tJmd0OyBvciAtLSUmZ3Q7KS4gWE1MR2VuZXJhdG9yIHVzZXMgdGhpcyBtZXRob2QgdG8gZ2VuZXJhdGUgWE1ML0hUTUwKLQkgKiBzb3VyY2UgZm9yIGEgY29tbWVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgY29tbWVudCBlbGVtZW50Ci0JICogQHJldHVybiBnZW5lcmF0ZWQgdGFnIHN0cmluZwotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChYTUxFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY29tbWVudCBlbGVtZW50IG9yIG5vdAotCSAqLwotCWJvb2xlYW4gaXNDb21tZW50RWxlbWVudChYTUxFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhpcyBlbGVtZW50IGNhbiBoYXZlIGNoaWxkcmVuIG9yIG5vdAotCSAqLwotCWJvb2xlYW4gaXNFbXB0eSgpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQkvLwlTdHJpbmcgZ2V0RWxlbWVudFByZWZpeCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NvbW1lbnRlbGVtZW50L2ltcGwvQmFzaWNDb21tZW50RWxlbWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlZmFjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NvbW1lbnRlbGVtZW50L2ltcGwvQmFzaWNDb21tZW50RWxlbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb21tZW50ZWxlbWVudC5pbXBsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbW1lbnRlbGVtZW50LnV0aWwuQ29tbWVudEVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb21tZW50ZWxlbWVudC51dGlsLlRhZ1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi0KLS8qKgotICovCi1jbGFzcyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlciBpbXBsZW1lbnRzIENvbW1lbnRFbGVtZW50SGFuZGxlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eTsKLQotCXB1YmxpYyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlcihTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gaXNFbXB0eSkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0JCXRoaXMuaXNFbXB0eSA9IGlzRW1wdHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5tb2RlbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXIjY3JlYXRlRWxlbWVudChEb2N1bWVudCwKLQkgKiAgICAgIFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQlTdHJpbmcgc3RyID0gZGF0YS50cmltKCk7Ci0JCUNvbW1lbnRFbGVtZW50RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENvbW1lbnRFbGVtZW50RmFjdG9yeShkb2N1bWVudCwgaXNKU1BUYWcsIHRoaXMpOwotCQlpZiAoc3RyLmNoYXJBdCgwKSA9PSAnLycpIHsgLy8gZW5kIHRhZwotCQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoc3RyLCAxKTsgLy8gc2tpcCAnLycKLQkJCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCWVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZShuYW1lLCBDb21tZW50RWxlbWVudEZhY3RvcnkuSVNfRU5EKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gc3RhcnQgdGFnCi0JCQlUYWdTY2FubmVyIHNjYW5uZXIgPSBuZXcgVGFnU2Nhbm5lcihzdHIsIDApOwotCQkJU3RyaW5nIG5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlKG5hbWUsIChpc0VtcHR5KSA/IENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19FTVBUWSA6IENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19TVEFSVCk7Ci0JCQkJLy8gc2V0IGF0dHJpYnV0ZXMKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQkJd2hpbGUgKGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IHNjYW5uZXIubmV4dFZhbHVlKCk7Ci0JCQkJCUF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0JCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkKLQkJCQkJCQkoKFhNTEF0dHIpIGF0dHIpLnNldFZhbHVlU291cmNlKGF0dHJWYWx1ZSk7Ci0JCQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJCX0KLQkJCQkJYXR0ck5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQubW9kZWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyI2dldEVuZFRhZyhYTUxFbGVtZW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KFhNTEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoaXNFbXB0eSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJWE1MR2VuZXJhdG9yIGdlbmVyYXRvciA9IGVsZW1lbnQuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKCIgLyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQubW9kZWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyI2dldFN0YXJ0VGFnKFhNTEVsZW1lbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJWE1MR2VuZXJhdG9yIGdlbmVyYXRvciA9IGVsZW1lbnQuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0ck5hbWUoYXR0cik7Ci0JCQlpZiAoYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0ck5hbWUpOwotCQkJfQotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCS8vIGF0dHIgbmFtZSBvbmx5IGZvciBIVE1MIGJvb2xlYW4gYW5kIEpTUAotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQubW9kZWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyI2lzQ29tbWVudEVsZW1lbnQoY29tLmlibS5zZWQubW9kZWwueG1sLlhNTEVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21tZW50RWxlbWVudChYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzKGVsZW1lbnROYW1lKSkgPyB0cnVlIDogZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5tb2RlbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXIjaXNFbXB0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGlzRW1wdHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWEwYjAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb21tZW50ZWxlbWVudC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIE1hcCBmQXR0cmlidXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZDdXN0b207Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZFbXB0eTsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50SGFuZGxlciBmSGFuZGxlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZklEID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkpTUENvbW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmUHJlZml4ID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlhNTENvbW1lbnQ7Ci0KLQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCWZFbGVtZW50ID0gZWxlbWVudDsKLQkJZkN1c3RvbSA9IChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJoYW5kbGVyLWN1c3RvbSIpKSA/IHRydWUgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbGxBdHRyaWJ1dGVzKGVsZW1lbnQpOwotCi0JCWZYTUxDb21tZW50ID0gZkpTUENvbW1lbnQgPSBmYWxzZTsKLQkJU3RyaW5nIGNvbW1lbnRUeXBlID0gZ2V0UHJvcGVydHkoImNvbW1lbnR0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbW1lbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoInhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZYTUxDb21tZW50ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjb21tZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3AiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmSlNQQ29tbWVudCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoY29tbWVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiYm90aCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZYTUxDb21tZW50ID0gZkpTUENvbW1lbnQgPSB0cnVlOwotCQl9Ci0JCVN0cmluZyBlbXB0eSA9IGdldFByb3BlcnR5KCJpc2VtcHR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJZkVtcHR5ID0gKGVtcHR5ICE9IG51bGwgJiYgIWVtcHR5LmVxdWFscygiZmFsc2UiKSkgPyB0cnVlIDogZmFsc2U7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRKU1BDb21tZW50KCkgewotCQlyZXR1cm4gZkpTUENvbW1lbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0WE1MQ29tbWVudCgpIHsKLQkJcmV0dXJuIGZYTUxDb21tZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCVhNTEVsZW1lbnQgZWxlbWVudCA9IChYTUxFbGVtZW50KSBnZXRIYW5kbGVyKCkuY3JlYXRlRWxlbWVudChkb2N1bWVudCwgZGF0YSwgaXNKU1BUYWcpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlDb21tZW50RWxlbWVudEFkYXB0ZXIgYWRhcHRlciA9IChDb21tZW50RWxlbWVudEFkYXB0ZXIpIGVsZW1lbnQuZ2V0QWRhcHRlckZvcihDb21tZW50RWxlbWVudEFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuc2V0Q29uZmlndXJhdGlvbih0aGlzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbEF0dHJpYnV0ZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGZBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWZBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfSBlbHNlIHsKLQkJCWZBdHRyaWJ1dGVzLmNsZWFyKCk7Ci0JCX0KLQkJU3RyaW5nW10gbmFtZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWlmIChuYW1lcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGxlbmd0aCA9IG5hbWVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLQkJCWZBdHRyaWJ1dGVzLnB1dChuYW1lLnRvTG93ZXJDYXNlKCksIGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb21tZW50RWxlbWVudEhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLQkJaWYgKGZIYW5kbGVyID09IG51bGwpIHsKLQkJCWlmIChmRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGlzQ3VzdG9tKCkpIHsKLQkJCQkJCWZIYW5kbGVyID0gKENvbW1lbnRFbGVtZW50SGFuZGxlcikgZkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gZ2V0UHJvcGVydHkoImVsZW1lbnRuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZIYW5kbGVyID0gbmV3IEJhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyKGVsZW1lbnROYW1lLCBmRW1wdHkpOwotCQkJCQl9Ci0JCQkJCS8vCQkJCQkoKEFic3RyYWN0Q29tbWVudEVsZW1lbnRIYW5kbGVyKWZIYW5kbGVyKS5zZXRFbGVtZW50UHJlZml4KGZFbGVtZW50LmdldEF0dHJpYnV0ZSgicHJlZml4IikpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGNhdGNoIGFuZCBsb2cgKGFuZCBpZ25vcmUpIEFOWSBleGNlcHRpb24gY3JlYXRlZAotCQkJCQkvLyBieSBleGVjdXRhYmxlIGV4dGVuc2lvbi4KLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJZkhhbmRsZXIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJZkhhbmRsZXIgPSBuZXcgQ29tbWVudEVsZW1lbnRIYW5kbGVyKCkgewotCQkJCQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRW5kVGFnQ29udGVudChYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50UHJlZml4KCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnRFbGVtZW50KFhNTEVsZW1lbnQgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlcklEKCkgewotCQlpZiAoZklEID09IG51bGwpIHsKLQkJCWZJRCA9IGdldFByb3BlcnR5KCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZklEID09IG51bGwpIHsKLQkJCQlpZiAoaXNDdXN0b20oKSkgewotCQkJCQlmSUQgPSBnZXRQcm9wZXJ0eSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlidWYuYXBwZW5kKGZFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpKTsKLQkJCQkJYnVmLmFwcGVuZCgnLicpOwotCQkJCQlidWYuYXBwZW5kKGdldFByb3BlcnR5KCJlbGVtZW50bmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmSUQgPSBidWYudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZJRDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIHNob3VsZCBub3QgYmUgbmVlZGVkIGJ5IGFueW9uZQotCSAqLwotCXB1YmxpYyBJUGx1Z2luRGVzY3JpcHRvciBnZXRIYW5kbGVyUGx1Z2luRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGZFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UHJlZml4KCkgewotCQlpZiAoZlByZWZpeCA9PSBudWxsKSB7Ci0JCQlpZiAoZkVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChpc0N1c3RvbSgpKSB7IC8vIGN1c3RvbQotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwcmVmaXhlcyA9IGZFbGVtZW50LmdldENoaWxkcmVuKCJzdGFydHdpdGgiKTsgLy8kTk9OLU5MUy0xJAkKLQkJCQkJaWYgKHByZWZpeGVzICE9IG51bGwpIHsKLQkJCQkJCWZQcmVmaXggPSBuZXcgU3RyaW5nW3ByZWZpeGVzLmxlbmd0aF07Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJZlByZWZpeFtpXSA9IHByZWZpeGVzW2ldLmdldEF0dHJpYnV0ZSgicHJlZml4Iik7IC8vJE5PTi1OTFMtMSQJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgeyAvLyBiYXNpYwotCQkJCQlTdHJpbmcgbmFtZSA9IGdldFByb3BlcnR5KCJlbGVtZW50bmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJCWlmIChpc0VtcHR5KCkpIHsKLQkJCQkJCQlmUHJlZml4ID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJCQlmUHJlZml4WzBdID0gbmFtZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZlByZWZpeCA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJCQkJZlByZWZpeFswXSA9IG5hbWU7Ci0JCQkJCQkJZlByZWZpeFsxXSA9ICcvJyArIG5hbWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGZQcmVmaXggPT0gbnVsbCkgewotCQkJZlByZWZpeCA9IG5ldyBTdHJpbmdbMV07Ci0JCQlmUHJlZml4WzBdID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZlByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoZkF0dHJpYnV0ZXMgIT0gbnVsbCkgPyAoU3RyaW5nKSBmQXR0cmlidXRlcy5nZXQobmFtZSkgOiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0N1c3RvbSgpIHsKLQkJcmV0dXJuIGZDdXN0b207Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBmRW1wdHk7Ci0JfQotCi0Jdm9pZCBzZXR1cENvbW1lbnRFbGVtZW50KFhNTEVsZW1lbnQgZWxlbWVudCkgewotCQllbGVtZW50LnNldENvbW1lbnRUYWcodHJ1ZSk7Ci0JCUNvbW1lbnRFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gbmV3IENvbW1lbnRFbGVtZW50QWRhcHRlcihmYWxzZSwgZkhhbmRsZXIpOwotCQlhZGFwdGVyLnNldENvbmZpZ3VyYXRpb24odGhpcyk7Ci0JCWVsZW1lbnQuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhYjVlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29tbWVudGVsZW1lbnQuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRFbGVtZW50UmVnaXN0cnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSBmSW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImNvbW1lbnRFbGVtZW50SGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltdIGZDb25maWd1cmF0aW9ucyA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbW1lbnRFbGVtZW50UmVnaXN0cnkuCi0JICovCi0JcHJpdmF0ZSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb25bXSBnZXRDb25maWd1cmF0aW9ucygpIHsKLQkJaWYgKGZDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZDb25maWd1cmF0aW9ucyA9IG5ldyBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb25bZWxlbWVudHMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZDb25maWd1cmF0aW9uc1tpXSA9IG5ldyBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24oZWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmQ29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJCWZDb25maWd1cmF0aW9ucyA9IG5ldyBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb25bMF07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXR1cENvbW1lbnRFbGVtZW50KFhNTEVsZW1lbnQgZWxlbWVudCkgewotCQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbnNbXSA9IGdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWludCBsZW5ndGggPSBjb25maWd1cmF0aW9ucy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiBjb25mID0gY29uZmlndXJhdGlvbnNbaV07Ci0JCQlib29sZWFuIGlzSlNQID0gZWxlbWVudC5pc0pTUFRhZygpOwotCQkJaWYgKGlzSlNQICYmIGNvbmYuYWNjZXB0SlNQQ29tbWVudCgpIHx8ICFpc0pTUCAmJiBjb25mLmFjY2VwdFhNTENvbW1lbnQoKSkgewotCQkJCUNvbW1lbnRFbGVtZW50SGFuZGxlciBoYW5kbGVyID0gY29uZi5nZXRIYW5kbGVyKCk7Ci0JCQkJaWYgKGhhbmRsZXIuaXNDb21tZW50RWxlbWVudChlbGVtZW50KSkgewotCQkJCQljb25mLnNldHVwQ29tbWVudEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWU0Yzg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvY29tbWVudGVsZW1lbnQvdXRpbC9Db21tZW50RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbW1lbnRlbGVtZW50LnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50RWxlbWVudEZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX0VNUFRZID0gNDg2NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU19FTkQgPSAxODA4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNfU1RBUlQgPSAyODAxMTsKLQotCXByaXZhdGUgRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGZIYW5kbGVyOwotCXByaXZhdGUgYm9vbGVhbiBmSlNQVGFnOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbW1lbnRFbGVtZW50RmFjdG9yeS4KLQkgKi8KLQlwcml2YXRlIENvbW1lbnRFbGVtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWVudEVsZW1lbnRGYWN0b3J5KERvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIGlzSlNQVGFnLCBDb21tZW50RWxlbWVudEhhbmRsZXIgaGFuZGxlcikgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZkpTUFRhZyA9IGlzSlNQVGFnOwotCQlmSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlKFN0cmluZyBuYW1lLCBpbnQgbm9kZVR5cGUpIHsKLQkJWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIGZEb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsZW1lbnQuc2V0Q29tbWVudFRhZyh0cnVlKTsKLQkJaWYgKG5vZGVUeXBlID09IElTX0VNUFRZKSB7Ci0JCQllbGVtZW50LnNldEVtcHR5VGFnKHRydWUpOwotCQl9Ci0JCWVsZW1lbnQuc2V0SlNQVGFnKGZKU1BUYWcpOwotCi0JCUNvbW1lbnRFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gbmV3IENvbW1lbnRFbGVtZW50QWRhcHRlcigobm9kZVR5cGUgPT0gSVNfRU5EKSwgZkhhbmRsZXIpOwotCQllbGVtZW50LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC91dGlsL1RhZ1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvY29tbWVudGVsZW1lbnQvdXRpbC9UYWdTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NGZlMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb21tZW50ZWxlbWVudC91dGlsL1RhZ1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb21tZW50ZWxlbWVudC51dGlsOwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdTY2FubmVyIHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09ICc9Jyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJyInIHx8IGMgPT0gJ1wnJyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCXByaXZhdGUgaW50IG1lbU9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlwcml2YXRlIGJvb2xlYW4gb25lTGluZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRhZyA9IHRhZzsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubWVtT2Zmc2V0ID0gLTE7Ci0JCWlmICh0YWcgIT0gbnVsbCkKLQkJCXRoaXMubGVuZ3RoID0gdGFnLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQsIGJvb2xlYW4gb25lTGluZSkgewotCQl0aGlzKHRhZywgb2Zmc2V0KTsKLQotCQl0aGlzLm9uZUxpbmUgPSBvbmVMaW5lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TmV4dE9mZnNldCgpIHsKLQkJaW50IGk7Ci0JCWNoYXIgYzsKLQkJZm9yIChpID0gb2Zmc2V0OyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWMgPSB0YWcuY2hhckF0KGkpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzUXVvdGUoYykpIHsKLQkJCQlpKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIWlzU3BhY2UoYykgJiYgIWlzRXF1YWwoYykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm1lbU9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFbmQoY2hhciBjKSB7Ci0JCXJldHVybiAodGhpcy5vbmVMaW5lICYmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdMaW5lKCkgewotCQlpZiAob25lTGluZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJY2hhciBjOwotCQlmb3IgKGludCBpID0gbWVtT2Zmc2V0IC0gMTsgMCA8PSBpOyBpLS0pIHsKLQkJCWMgPSB0YWcuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoIWlzU3BhY2UoYykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNoYXIgbmV4dENoYXIoKSB7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFpc1NwYWNlKGMpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgbmV4dE5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChuZXh0Q2hhcigpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbmFtZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSB8fCBpc1NwYWNlKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzRXF1YWwoYykgJiYgdGhpcy5vZmZzZXQgPiBuYW1lT2Zmc2V0KQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0aGlzLm9mZnNldCA9PSBuYW1lT2Zmc2V0KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdGhpcy5tZW1PZmZzZXQgPSBuYW1lT2Zmc2V0OwotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKG5hbWVPZmZzZXQsIHRoaXMub2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5leHRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudGFnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY2hhciBzZXBlcmF0b3IgPSBuZXh0Q2hhcigpOwotCQlpZiAoIWlzRXF1YWwoc2VwZXJhdG9yKSkKLQkJCXJldHVybiBudWxsOwotCQl0aGlzLm9mZnNldCsrOyAvLyBza2lwICc9JwotCQljaGFyIHF1b3RlID0gbmV4dENoYXIoKTsKLQkJaWYgKHF1b3RlID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGlzUXVvdGUocXVvdGUpKQotCQkJdGhpcy5vZmZzZXQrKzsKLQkJZWxzZQotCQkJcXVvdGUgPSAwOwotCi0JCWludCB2YWx1ZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSkgewotCQkJCXF1b3RlID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChxdW90ZSA9PSAwKSB7Ci0JCQkJaWYgKGlzU3BhY2UoYykpCi0JCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYyA9PSBxdW90ZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHZhbHVlRW5kID0gdGhpcy5vZmZzZXQ7Ci0JCWlmIChxdW90ZSAhPSAwICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGgpCi0JCQl0aGlzLm9mZnNldCsrOwotCQlpZiAodmFsdWVFbmQgPT0gdmFsdWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0aGlzLm1lbU9mZnNldCA9IHZhbHVlT2Zmc2V0OwotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKHZhbHVlT2Zmc2V0LCB2YWx1ZUVuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyMDNhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29udGVudHR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZpZW5jZSB0byBwcm92aWRlIGNvbXBpbGUtdGltZQotICogc2FmZXR5IHdoZW4gcmVmZXJpbmcgdG8gYSBjb250ZW50VHlwZSBJRC4gVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZAotICogZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JYTUwgewotCS8qKgotCSAqIFRoaXMgY29udGVudCB0eXBlIGlzIGFjdHVhbGx5IHN1cHBsaWVkIGJ5IGJhc2UgRWNsaXBzZS4gSXRzIGdpdmVuIGhlcmUKLQkgKiBqdXN0IGFzIGRvY3VtZW50YXRpb24gZm9yIFdUUCBiYXNlZCBjbGllbnRzLiBUeXBpY2FsbHksIGNsaWVudHMgc2hvdWxkCi0JICogdXNlIHRoZSB2YWx1ZXMvY29uc3RhbnRzIHN1cHBsaWVkIGJ5IGJhc2UgRWNsaXBzZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX1hNTCA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoaXMgdmFsdWUgaXMgcHVibGljIG9ubHkgZm9yIHRlc3RpbmcgYW5kIHNwZWNpYWwgaW5mcmFzdHJ1Y3R1cmUgVGhlCi0JICogY29uc3RhbnQgbm9yIGlzIHZhbHVlIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgotCSAqIAotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBub3QgZGVjbGFyZWQgYXMgZmluYWwsCi0JICogc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX1NTRVhNTCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L0RvY3VtZW50TG9hZGVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L0RvY3VtZW50TG9hZGVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjFlNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudExvYWRlckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db2RlZFJlYWRlckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXJGb3JGaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5lbmNvZGluZy5YTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuRG9jdW1lbnRGYWN0b3J5Rm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRMb2FkZXJGb3JYTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRMb2FkZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMb2FkZXIsIElEb2N1bWVudExvYWRlckZvckZpbGVCdWZmZXJzIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXIjY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50RmFjdG9yeUZvclhNTCBmYWN0b3J5ID0gbmV3IERvY3VtZW50RmFjdG9yeUZvclhNTCgpOwotCQlJRW5jb2RlZERvY3VtZW50IGRvY3VtZW50ID0gKElFbmNvZGVkRG9jdW1lbnQpIGZhY3RvcnkuY3JlYXRlRG9jdW1lbnQoKTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChSZWFkZXIgcmVhZGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlTdHJpbmdCdWZmZXIgYWxsVGV4dCA9IHJlYWRJbnB1dFN0cmVhbShyZWFkZXIpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0KGFsbFRleHQudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXIjY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmlvLklucHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlciNjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sIGNvbS5pYm0uZW5jb2RpbmcucmVzb3VyY2UuRW5jb2RpbmdSdWxlKQotCSAqLwotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCAmJiBpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGhhdmUgYm90aCBudWxsIGZpbGVuYW1lIGFuZCBpbnB1dHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNvZGVkUmVhZGVyQ3JlYXRvciA9IG5ldyBDb2RlZFJlYWRlckNyZWF0b3IoKTsKLQkJUmVhZGVyIGZ1bGxQcmVwYXJlZFJlYWRlciA9IG51bGw7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXRyeSB7Ci0JCQljb2RlZFJlYWRlckNyZWF0b3Iuc2V0KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCQljb2RlZFJlYWRlckNyZWF0b3Iuc2V0RW5jb2RpbmdSdWxlKGVuY29kaW5nUnVsZSk7Ci0JCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJZnVsbFByZXBhcmVkUmVhZGVyID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldENvZGVkUmVhZGVyKCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTWVtZW50byk7Ci0JCQlTdHJpbmdCdWZmZXIgYWxsVGV4dCA9IHJlYWRJbnB1dFN0cmVhbShmdWxsUHJlcGFyZWRSZWFkZXIpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldChhbGxUZXh0LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZnVsbFByZXBhcmVkUmVhZGVyICE9IG51bGwpIHsKLQkJCQlmdWxsUHJlcGFyZWRSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlciNnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpCi0JICovCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXIjZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlciNoYW5kbGVMaW5lRGVsaW1pdGVyKGphdmEubGFuZy5TdHJpbmdCdWZmZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGhhbmRsZUxpbmVEZWxpbWl0ZXIoU3RyaW5nQnVmZmVyIG9yaWdpbmFsU3RyaW5nLCBJRW5jb2RlZERvY3VtZW50IHRoZVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBvcmlnaW5hbFN0cmluZzsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1YWQ4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50VHlwZUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCXN0YXRpYyBmaW5hbCBpbnQgTE9XRVJfQ0FTRSA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBTVFJJQ1RfQ0FTRSA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBVUFBFUl9DQVNFID0gMTsKLQotCS8qKgotCSAqLwotCWludCBnZXRBdHRyTmFtZUNhc2UoKTsKLQotCS8qKgotCSAqLwotCURvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKTsKLQotCS8qKgotCSAqLwotCWludCBnZXRUYWdOYW1lQ2FzZSgpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNYTUxUeXBlKCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMmVmZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudDsKLQotCi0KLS8qKgotICogVGhyb3duIGFuIGludmFsaWQgY2hhcmFjdGVyIGlzIHNwZWNpZmllZCBpbiA6IFhNTE5vZGUjc2V0U291cmNlKFN0cmluZykKLSAqLwotcHVibGljIGNsYXNzIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgY2hhciBpbnZhbGlkQ2hhciA9IDA7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gLTE7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbihTdHJpbmcgcywgY2hhciBjKSB7Ci0JCXN1cGVyKHMpOwotCQl0aGlzLmludmFsaWRDaGFyID0gYzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbihTdHJpbmcgcywgY2hhciBjLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyKHMpOwotCQl0aGlzLmludmFsaWRDaGFyID0gYzsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGNoYXIgZ2V0SW52YWxpZENoYXIoKSB7Ci0JCXJldHVybiB0aGlzLmludmFsaWRDaGFyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9KU1BUYWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvSlNQVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0Mzk4ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9KU1BUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiBKU1BUYWcgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQVGFnIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfQ0xPU0UgPSAiLS0lPiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9PUEVOID0gIjwlLS0iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xBUkFUSU9OX1RPS0VOID0gIiEiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9UT0tFTiA9ICJAIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1RPS0VOID0gIj0iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTiA9ICJqc3A6ZGVjbGFyYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkUgPSAianNwOmRpcmVjdGl2ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT04gPSAianNwOmV4cHJlc3Npb24iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ST09UID0gImpzcDpyb290IjsvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVQgPSAianNwOnNjcmlwdGxldCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIiU+IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfT1BFTiA9ICI8JSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9UYWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1RhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3ZDBjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1RhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ0FkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldEVuZFRhZyhYTUxFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldFN0YXJ0VGFnKFhNTEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGlzRW5kVGFnKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTEF0dHIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MQXR0ci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGI4MDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MQXR0ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxBdHRyIGV4dGVuZHMgWE1MTm9kZSwgQXR0ciB7Ci0KLQkvKioKLQkgKi8KLQlJVGV4dFJlZ2lvbiBnZXRFcXVhbFJlZ2lvbigpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXROYW1lUmVnaW9uRW5kT2Zmc2V0KCk7Ci0KLQlpbnQgZ2V0TmFtZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0KLQlTdHJpbmcgZ2V0TmFtZVJlZ2lvblRleHQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgZ2V0TmFtZVJlZ2lvblRleHRFbmRPZmZzZXQoKTsKLQotCWludCBnZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0KLQlTdHJpbmcgZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBBdHRyIGhhcyBKU1AgaW4gdmFsdWUKLQkgKi8KLQlib29sZWFuIGhhc0pTUFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBBdHRyIGhhcyBvbmx5IG5hbWUgYnV0IG5vdCBlcXVhbCBzaWduIG5vciB2YWx1ZQotCSAqLwotCWJvb2xlYW4gaGFzTmFtZU9ubHkoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNHbG9iYWxBdHRyKCk7Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGlzWE1MQXR0cigpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTENoYXJFbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MQ2hhckVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTk4NGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MQ2hhckVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIFhNTCBOYW1lc3BhY2UgY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MQ2hhckVudGl0eSB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBBTVBfTkFNRSA9ICJhbXAiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFNUF9SRUYgPSAiJmFtcDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFNUF9WQUxVRSA9ICImIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBUE9TX05BTUUgPSAiYXBvcyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBPU19SRUYgPSAiJmFwb3M7IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBUE9TX1ZBTFVFID0gIiciOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdUX05BTUUgPSAiZ3QiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdUX1JFRiA9ICImZ3Q7IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHVF9WQUxVRSA9ICI+IjsvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIExUX05BTUUgPSAibHQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExUX1JFRiA9ICImbHQ7IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMVF9WQUxVRSA9ICI8IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UX05BTUUgPSAicXVvdCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVF9SRUYgPSAiJnF1b3Q7IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UX1ZBTFVFID0gIlwiIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NjFjYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9YTUxEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5Eb2N1bWVudFJhbmdlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Eb2N1bWVudFRyYXZlcnNhbDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBlbmFibGVzIGNyZWF0aW9uIG9mIERPQ1RZUEUgZGVjbGFyYXRpb24gYW5kIHNvbWUgRE9NIExldmVsIDIKLSAqIGludGVyZmFjZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MRG9jdW1lbnQgZXh0ZW5kcyBYTUxOb2RlLCBEb2N1bWVudCwgRG9jdW1lbnRSYW5nZSwgRG9jdW1lbnRUcmF2ZXJzYWwgewotCi0JLyoqCi0JICogY3JlYXRlIGNvbW1lbnQgZWxlbWVudC4gdGFnTmFtZSBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgY29tbWVudCBlbGVtZW50Ci0JICogbmFtZSBpbiBwbHVnaW4ueG1sCi0JICogCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUKLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgSlNQIHN0eWxlIGNvbW1lbnQgKCZsdDslLS0gLi4uCi0JICogICAgICAgICAgICAtLSUmZ3Q7KQotCSAqIEByZXR1cm4gRWxlbWVudCBlbGVtZW50IGluc3RhbmNlCi0JICogQHRocm93cyBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB0aHJvd2VkIGlmIHRoZSBlbGVtZW50IG5hbWUgaXMgcmVnaXN0ZXJlZCBhcyBjb21tZW50Ci0JICogICAgICAgICAgICAgZWxlbWVudAotCSAqLwotCUVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIGJvb2xlYW4gaXNKU1BUYWcpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKi8KLQlEb2N1bWVudFR5cGUgY3JlYXRlRG9jdHlwZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlSWQoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNKU1BEb2N1bWVudCgpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc0pTUFR5cGUoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNYTUxUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MRG9jdW1lbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTERvY3VtZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODJkNGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MRG9jdW1lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZW5hYmxlcyBzZXR0aW5nIG9mIFB1YmxpYyBhbmQgU3lzdGVtIElEIGZvciBET0NUWVBFCi0gKiBkZWNsYXJhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxEb2N1bWVudFR5cGUgZXh0ZW5kcyBYTUxOb2RlLCBEb2N1bWVudFR5cGUgewotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpOwotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9YTUxFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4Mzk3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxFbGVtZW50IGV4dGVuZHMgWE1MTm9kZSwgRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIHNob3VsZCBwcm9iYWJseSBub3QgYmUgcHVibGljLCBidXQgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqLwotCWludCBnZXRFbmRTdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldEVuZFRhZ05hbWUoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHRoaXMgc2hvdWxkIHByb2JhYmx5IG5vdCBiZSBwdWJsaWMsIGJ1dCBhbHJlYWR5IGltcGxlbWVudGVkCi0JICogIAotCSAqLwotCWludCBnZXRTdGFydEVuZE9mZnNldCgpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBoYXNFbmRUYWcoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaGFzU3RhcnRUYWcoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNDb21tZW50VGFnKCk7Ci0KLQkvKioKLQkgKiBpc0VtcHR5VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNFbXB0eVRhZygpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc0VuZFRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGZvciAiZ2xvYmFsIHRhZyIgKGJhc2ljYWxseSwgd2l0aG91dCBwcmVmaXgpCi0JICovCi0JYm9vbGVhbiBpc0dsb2JhbFRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGZvciBubyB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgdGFncwotCSAqLwotCWJvb2xlYW4gaXNJbXBsaWNpdFRhZygpOwotCi0JLyoqCi0JICogaXNKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0pTUFRhZygpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc1N0YXJ0VGFnQ2xvc2VkKCk7Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGlzWE1MVGFnKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIHNob3VsZCBwcm9iYWJseSBub3QgYmUgcHVibGljLCBidXQgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqLwotCXZvaWQgbm90aWZ5RW5kVGFnQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdGhpcyBzaG91bGQgcHJvYmFibHkgbm90IGJlIHB1YmxpYywgYnV0IGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKi8KLQl2b2lkIG5vdGlmeVN0YXJ0VGFnQ2hhbmdlZCgpOwotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRDb21tZW50VGFnKGJvb2xlYW4gaXNDb21tZW50VGFnKTsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RW1wdHlUYWcoYm9vbGVhbiBpc0VtcHR5VGFnKTsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0SlNQVGFnKGJvb2xlYW4gaXNKU1BUYWcpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9YTUxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTMyMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9YTUxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTEdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyTmFtZShBdHRyIGF0dHIpOwotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0cik7Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyLCBjaGFyIHF1b3RlKTsKLQotCS8qKgotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShTdHJpbmcgdmFsdWUsIGNoYXIgcXVvdGUpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDREFUQVNlY3Rpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbgotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGEpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNoaWxkKE5vZGUgcGFyZW50Tm9kZSk7Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVDbG9zZVRhZyhOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Db21tZW50Ci0JICovCi0JU3RyaW5nIGdlbmVyYXRlQ29tbWVudChDb21tZW50IGNvbW1lbnQpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVEb2N0eXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkb2NUeXBlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVEb2N0eXBlKERvY3VtZW50VHlwZSBkb2NUeXBlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgRWxlbWVudAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JU3RyaW5nIGdlbmVyYXRlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVudGl0eVJlZiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZW50aXR5UmVmCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2UKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVFbnRpdHlSZWYoRW50aXR5UmVmZXJlbmNlIGVudGl0eVJlZik7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVBJIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwaQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlUEkoUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlU291cmNlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU291cmNlKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBFbGVtZW50Ci0JICovCi0JU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRhZ05hbWUoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlVGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRleHQoVGV4dCB0ZXh0KTsKLQotCS8qKgotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRleHREYXRhKFRleHQgdGV4dCwgU3RyaW5nIGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9YTUxNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9YTUxNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTVjZmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxNb2RlbCBleHRlbmRzIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JWE1MRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqLwotCVhNTEdlbmVyYXRvciBnZXRHZW5lcmF0b3IoKTsKLQotCS8qKgotCSAqLwotCVhNTE1vZGVsTm90aWZpZXIgZ2V0TW9kZWxOb3RpZmllcigpOwotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRNb2RlbE5vdGlmaWVyKFhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZTg4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBYTUxNb2RlbE5vdGlmaWVyIHsKLQotCS8qKgotCSAqIGF0dHJSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQl2b2lkIGF0dHJSZXBsYWNlZChFbGVtZW50IGVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKTsKLQotCS8qKgotCSAqLwotCXZvaWQgYmVnaW5DaGFuZ2luZygpOwotCi0JLyoqCi0JICovCi0Jdm9pZCBiZWdpbkNoYW5naW5nKGJvb2xlYW4gbmV3TW9kZWwpOwotCi0JLyoqCi0JICogQ2FuY2VsIHBlbmRpbmcgbm90aWZpY2F0aW9ucy4gVGhpcyBpcyBjYWxsZWQgaW4gdGhlIGNvbnRleHQgb2YKLQkgKiAicmVpbml0aWFsaXphdGlvbiIgc28gaXMgYXNzdW1lZCBBTEwgbm90aWZpY2F0aW9ucyBjYW4gYmUgc2FmZWx5Ci0JICogY2FuY2VsZWQsIGFzc3VtaW5nIHRoYXQgb25jZSBmYWN0b3JpZXMgYW5kIGFkYXB0ZXJzIGFyZSByZS1pbml0aWFsaXplZAotCSAqIHRoZXkgd2lsbCBiZSByZS1ub3RpZmllZCBhcyB0ZXh0IGlzIHNldCBpbiBtb2RlbCwgaWYgc3RpbGwgYXBwcm9wcmlhdGUuCi0JICovCi0Jdm9pZCBjYW5jZWxQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBjaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBjaGlsZFJlcGxhY2VkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGVkaXRhYmxlQ2hhbmdlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICovCi0Jdm9pZCBlbmRDaGFuZ2luZygpOwotCi0JLyoqCi0JICovCi0Jdm9pZCBlbmRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGhhc0NoYW5nZWQoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNDaGFuZ2luZygpOwotCi0JLyoqCi0JICovCi0Jdm9pZCBwcm9wZXJ0eUNoYW5nZWQoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqLwotCXZvaWQgc3RhcnRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHN0cnVjdHVyZUNoYW5nZWQoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIHZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXZvaWQgdmFsdWVDaGFuZ2VkKE5vZGUgbm9kZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTE5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE4OGE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudDsKLQotCi0KLS8qKgotICogWE1MIE5hbWVzcGFjZSBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxOYW1lc3BhY2UgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfUFJFRklYID0gInhtbG5zOiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjAwNTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiBBIGludGVyZmFjZSB0byBtYWtlIGNvbmNlcHQgY2xlYXJlciwganVzdCB0byBkZW5vdGUgdGhlIGNvbWJpbmF0aW9uIG9mCi0gKiB0aHJlZSBvdGhlciBpbnRlcmZhY2VzLgotICogIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTE5vZGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbiwgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXIsIG9yZy53M2MuZG9tLk5vZGUgewotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqLwotCVhNTE1vZGVsIGdldE1vZGVsKCk7Ci0KLQkvKioKLQkgKi8KLQlJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCk7Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKi8KLQlJVGV4dFJlZ2lvbiBnZXRWYWx1ZVJlZ2lvbigpOwotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldFZhbHVlU291cmNlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gV2hldGhlciBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudCBjYW4gYmUgYXBwZW5kZWQgb3IKLQkgKiAgICAgICAgIHJlbW92ZWQuCi0JICovCi0JYm9vbGVhbiBpc0NoaWxkRWRpdGFibGUoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNDbG9zZWQoKTsKLQotCS8qKgotCSAqIGlzQ29udGFpbmVyIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNDb250YWluZXIoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNEYXRhRWRpdGFibGUoKTsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0Q2hpbGRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKTsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RGF0YUVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpOwotCi0JLyoqCi0JICogZmFzdGVyIGFwcHJvYWNoIHRvIHNldAotCSAqLwotCXZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSwgYm9vbGVhbiBkZWVwKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHNwZWNpZmllZCByYXcgc291cmNlIHRvIHRoZSBUZXh0IG5vZGUuIFRocm93cwotCSAqIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gd2hlbiB0aGUgc3BlY2lmaWVkIHJhdyBzb3VyY2UgaW5jbHVkZXMKLQkgKiBpbnZhbGlkIGNoYXJhY3RlcnMsIHN1Y2ggYXMsICcgPCcsICc+JyBhbmQgJyYnLiBWYWxpZCBjaGFyYWN0ZXIKLQkgKiBlbnRpdGllcywgc3VjaCBhcywgIiZhbXA7bHQ7IiwgYXJlIGFjY2VwdGVkLgotCSAqLwotCXZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2V0cyB0aGUgc3BlY2lmaWVkIHJhdyBzb3VyY2UgdG8gdGhlIFRleHQgb3IgQXR0ciBub2RlJ3MgdmFsdWUuIFdoZW4KLQkgKiB0aGUgc3BlY2lmaWVkIHJhdyBzb3VyY2UgaW5jbHVkZXMgaW52YWxpZCBjaGFyYWN0ZXJzLCBzdWNoIGFzLCAnIDwnLAotCSAqICc+JyBhbmQgJyYnLCBjb252ZXJ0cyB0aGVtLiBWYWxpZCBjaGFyYWN0ZXIgZW50aXRpZXMsIHN1Y2ggYXMsCi0JICogIiZhbXA7bHQ7IiwgYXJlIGFjY2VwdGVkLgotCSAqLwotCXZvaWQgc2V0VmFsdWVTb3VyY2UoU3RyaW5nIHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2RvY3VtZW50L1hNTFRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgwYTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZG9jdW1lbnQvWE1MVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MVGV4dCBleHRlbmRzIFhNTE5vZGUsIFRleHQgewotCi0JLyoqCi0JICogQXBwZW5kcyB0aGUgY29udGVudCBvZiB0aGUgdGV4dCBub2RlCi0JICovCi0Jdm9pZCBhcHBlbmRUZXh0KFRleHQgdGV4dCk7Ci0KLQkvKioKLQkgKiBJbnNlcnRzIHRoZSBjb250ZW50IG9mIHRoZSB0ZXh0IG5vZGUgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbgotCSAqLwotCXZvaWQgaW5zZXJ0VGV4dChUZXh0IHRleHQsIGludCBvZmZzZXQpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc0ludmFsaWQoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNXaGl0ZXNwYWNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2VuY29kaW5nL1hNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2VuY29kaW5nL1hNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzA3Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9lbmNvZGluZy9YTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyBhbmQgcGFyc2VzIGZpcnN0IG9mIFhNTCBmaWxlIHRvIGdldCBlbmNvZGluZy4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yIGV4dGVuZHMgWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIHsKLQotCS8qKgotCSAqIFhNTExvYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2VuY29kaW5nL1hNTERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2VuY29kaW5nL1hNTERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NGFkZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9lbmNvZGluZy9YTUxEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW4gWE1MIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIFN0cnVjdHVyZWQgTW9kZWwuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgWE1MRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gYnkgZGVmYXVsdCwgVVRGLTggYXMgcGVyIFhNTCBzcGVjCi0JCWZpbmFsIFN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuc2V0UmVQYXJzZXIobmV3IFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCkpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvQ29tbWVudE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZm9ybWF0L0NvbW1lbnROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NjJmMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvQ29tbWVudE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENvbW1lbnROb2RlRm9ybWF0dGVyIGV4dGVuZHMgTm9kZUZvcm1hdHRlciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGFkanVzdEluZGVudGF0aW9ucyhTdHJpbmcgYVN0cmluZywgU3RyaW5nIGxpbmVJbmRlbnQsIFN0cmluZyBzaW5nbGVJbmRlbnQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcoKTsKLQotCQlpbnQgaW5kZXhPZkxpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTGluZURlbGltaXRlcihhU3RyaW5nKTsKLQkJcmVzdWx0ID0gYVN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXhPZkxpbmVEZWxpbWl0ZXIpOwotCQl3aGlsZSAoaW5kZXhPZkxpbmVEZWxpbWl0ZXIgIT0gLTEpIHsKLQkJCS8vIEJlZm9yZSBmaW5kIHRoZSBuZXh0IExpbmVEZWxpbWl0ZXIsIHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUKLQkJCS8vIHNpemUgb2YgdGhlIGN1cnJlbnQgTGluZURlbGltaXRlcgotCQkJLy8gc28gd2UgY2FuIGZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgdG8gc2tpcCBiZWZvcmUgZmluZGluZyB0aGUKLQkJCS8vIG5leHQgTGluZURlbGltaXRlci4KLQkJCS8vIE90aGVyd2lzZSwgd2UgbWF5IHRyZWF0IHRoZSBMRiBpbiBDUkxGIGFzIHRoZSBuZXh0Ci0JCQkvLyBMaW5lRGVsaW1pdGVyLgotCQkJaW50IGxpbmVEZWxpbWl0ZXJTaXplID0gMTsKLQkJCWlmIChhU3RyaW5nLmxlbmd0aCgpID49IGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgMiAmJiBhU3RyaW5nLnN1YnN0cmluZyhpbmRleE9mTGluZURlbGltaXRlciwgaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyAxKS5jb21wYXJlVG8oQ1IpID09IDAgJiYgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyAxLCBpbmRleE9mTGluZURlbGltaXRlciArIDIpLmNvbXBhcmVUbyhMRikgPT0gMCkKLQkJCQlsaW5lRGVsaW1pdGVyU2l6ZSA9IDI7Ci0KLQkJCWludCBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTGluZURlbGltaXRlcihhU3RyaW5nLCBpbmRleE9mTGluZURlbGltaXRlciArIGxpbmVEZWxpbWl0ZXJTaXplKTsKLQkJCWludCBpbmRleE9mTm9uYmxhbmsgPSBTdHJpbmdVdGlscy5pbmRleE9mTm9uYmxhbmsoYVN0cmluZywgaW5kZXhPZkxpbmVEZWxpbWl0ZXIpOwotCi0JCQlpZiAoaW5kZXhPZk5vbmJsYW5rICE9IC0xKSB7Ci0JCQkJaWYgKGluZGV4T2ZOZXh0TGluZURlbGltaXRlciA9PSAtMSkgewotCQkJCQkvLyBsYXN0IGxpbmU7IGNvcHkgdGlsbCB0aGUgZW5kCi0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50ICsgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZk5vbmJsYW5rKTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4T2ZOZXh0TGluZURlbGltaXRlciAhPSAtMSAmJiBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgPCBpbmRleE9mTm9uYmxhbmspIHsKLQkJCQkJLy8gYmxhbmsgbGluZTsganVzdCBhZGQgYSBpbmRlbnQKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gY29weSBhbGwgdGV4dCBiZXR3ZWVuIGluZGV4T2ZOb25ibGFuayBhbmQKLQkJCQkJLy8gaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyCi0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50ICsgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZk5vbmJsYW5rLCBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIpOwotCQkJCX0KLQotCQkJCWluZGV4T2ZMaW5lRGVsaW1pdGVyID0gaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyID09IC0xKSB7Ci0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGJsYW5rIGxpbmU7IGp1c3QgYWRkIGEgaW5kZW50Ci0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCX0KLQotCQkJCWluZGV4T2ZMaW5lRGVsaW1pdGVyID0gaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKFhNTE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJLy8gbGluZURlbGltaXRlckZvdW5kIG1lYW5zIG11bHRpIGxpbmUgY29tbWVudAotCQkJU3RyaW5nIG5vZGVWYWx1ZSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlib29sZWFuIGxpbmVEZWxpbWl0ZXJGb3VuZEluQ29tbWVudCA9IFN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihub2RlVmFsdWUpOwotCi0JCQlpZiAobGluZURlbGltaXRlckZvdW5kSW5Db21tZW50KSB7Ci0JCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGJlZm9yZSBub2RlCi0JCQkJZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkJLy8gYWRqdXN0IGluZGVudGF0aW9ucyBpbiBtdWx0aSBsaW5lIGNvbW1lbnQKLQkJCQlTdHJpbmcgbGluZURlbGltaXRlciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQkJCQlTdHJpbmcgbmV3Tm9kZXZhbHVlID0gYWRqdXN0SW5kZW50YXRpb25zKG5vZGVWYWx1ZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQsIHNpbmdsZUluZGVudCk7Ci0JCQkJaWYgKG5vZGVWYWx1ZS5jb21wYXJlVG8obmV3Tm9kZXZhbHVlKSAhPSAwKQotCQkJCQlub2RlLnNldE5vZGVWYWx1ZShuZXdOb2RldmFsdWUpOwotCQkJfQotCi0JCQlpZiAoIW5vZGVIYXNTaWJsaW5ncyhub2RlKSB8fCAobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSAhPSBudWxsICYmIG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkuZ2V0Tm9kZVZhbHVlKCkpICYmIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSkgewotCQkJCS8vIHNpbmdsZSBjaGlsZAotCQkJCS8vIG9yIGlubGluZSBjb21tZW50IGFmdGVyIHRleHQKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9IGVsc2UKLQkJCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYWZ0ZXIgbm9kZQotCQkJCWZvcm1hdEluZGVudGF0aW9uQWZ0ZXJOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvRG9jdW1lbnROb2RlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2Zvcm1hdC9Eb2N1bWVudE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2NzFhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2Zvcm1hdC9Eb2N1bWVudE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERvY3VtZW50Tm9kZUZvcm1hdHRlciBleHRlbmRzIE5vZGVGb3JtYXR0ZXIgewotCXByb3RlY3RlZCB2b2lkIGZvcm1hdENoaWxkcmVuKFhNTE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJU3RyaW5nIHNpbmdsZUluZGVudCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0SW5kZW50KCk7Ci0JCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCS8vIG5vcm1hbGl6ZSBub2RlIGZpcnN0IHRvIGNvbWJpbmUgYWRqYWNlbnQgdGV4dCBub2RlcwotCQkJbm9kZS5ub3JtYWxpemUoKTsKLQotCQkJWE1MTm9kZSBuZXh0Q2hpbGQgPSAoWE1MTm9kZSkgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQlYTUxOb2RlIGVhY2hDaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gKFhNTE5vZGUpIGVhY2hDaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBnZXRGb3JtYXR0ZXIoZWFjaENoaWxkTm9kZSk7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGNoaWxkRm9ybWF0Q29udHJhaW50cyA9IGZvcm1hdHRlci5nZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0JCQkJU3RyaW5nIGNoaWxkSW5kZW50ID0gbGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJCQljaGlsZEZvcm1hdENvbnRyYWludHMuc2V0Q3VycmVudEluZGVudChjaGlsZEluZGVudCk7Ci0JCQkJY2hpbGRGb3JtYXRDb250cmFpbnRzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhmb3JtYXRDb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKTsKLQotCQkJCS8vIGZvcm1hdCBlYWNoIGNoaWxkCi0JCQkJZm9ybWF0dGVyLmZvcm1hdChlYWNoQ2hpbGROb2RlLCBjaGlsZEZvcm1hdENvbnRyYWludHMpOwotCi0JCQkJaWYgKG5leHRDaGlsZCAhPSBudWxsICYmIG5leHRDaGlsZC5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkKLQkJCQkJLy8gbmV4dE5vZGUgaXMgZGVsZXRlZCBkdXJpbmcgZm9ybWF0Ci0JCQkJCW5leHRDaGlsZCA9IChYTUxOb2RlKSBlYWNoQ2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKFhNTE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCWZvcm1hdENoaWxkcmVuKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZm9ybWF0L0VsZW1lbnROb2RlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2Zvcm1hdC9FbGVtZW50Tm9kZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDVlODNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZm9ybWF0L0VsZW1lbnROb2RlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnROb2RlRm9ybWF0dGVyIGV4dGVuZHMgRG9jdW1lbnROb2RlRm9ybWF0dGVyIHsKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFID0gJyInOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEVTID0gIlwiXCIiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIGNoYXIgRVFVQUxfQ0hBUiA9ICc9JzsgLy8gZXF1YWwgc2lnbiROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUFJFU0VSVkUgPSAicHJlc2VydmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBQUkVTRVJWRV9RVU9URUQgPSAiXCJwcmVzZXJ2ZVwiIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFhNTF9TUEFDRSA9ICJ4bWw6c3BhY2UiOy8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEVuZFRhZyhYTUxOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmICghaXNFbmRUYWdNaXNzaW5nKG5vZGUpKSB7Ci0JCQkvLyBlbmQgdGFnIGV4aXN0cwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCVN0cmluZyBub2RlSW5kZW50YXRpb24gPSBnZXROb2RlSW5kZW50KG5vZGUpOwotCQkJWE1MTm9kZSBsYXN0Q2hpbGQgPSAoWE1MTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCAmJiBsYXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCWlmIChpc0VuZFRhZ01pc3NpbmcobGFzdENoaWxkKSkgewotCQkJCQkvLyBmaW5kIGRlZXBlc3QgY2hpbGQKLQkJCQkJWE1MTm9kZSBkZWVwZXN0Q2hpbGQgPSAoWE1MTm9kZSkgbGFzdENoaWxkLmdldExhc3RDaGlsZCgpOwotCQkJCQl3aGlsZSAoZGVlcGVzdENoaWxkICE9IG51bGwgJiYgZGVlcGVzdENoaWxkLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgaXNFbmRUYWdNaXNzaW5nKGRlZXBlc3RDaGlsZCkpIHsKLQkJCQkJCWxhc3RDaGlsZCA9IGRlZXBlc3RDaGlsZDsKLQkJCQkJCWRlZXBlc3RDaGlsZCA9IChYTUxOb2RlKSBkZWVwZXN0Q2hpbGQuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZGVlcGVzdENoaWxkICE9IG51bGwpIHsKLQkJCQkJCWlmIChkZWVwZXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJCS8vIFNwZWNpYWwgaW5kZW50YXRpb24gaGFuZGxpbmcgaWYgbGFzdENoaWxkJ3MgZW5kCi0JCQkJCQkJLy8gdGFnIGlzIG1pc3NpbmcgYW5kIGRlZXBlc3RDaGlsZCBpcyBhIHRleHQgbm9kZS4KLQkJCQkJCQlTdHJpbmcgbm9kZVRleHQgPSBkZWVwZXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCk7Ci0KLQkJCQkJCQlpZiAoIW5vZGVUZXh0LmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pKSB7Ci0JCQkJCQkJCW5vZGVUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKG5vZGVUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQkJbm9kZVRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgobm9kZVRleHQsIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJCQkJfQotCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShkZWVwZXN0Q2hpbGQsIG5vZGVUZXh0KTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pOwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCS8vIGluZGVudCBlbmQgdGFnCi0JCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pOwotCQkJfSBlbHNlIGlmIChsYXN0Q2hpbGQgPT0gbnVsbCAmJiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5zTGluZURlbGltaXRlcnMobm9kZSkpIHsKLQkJCQkvLyBpbmRlbnQgZW5kIHRhZwotCQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCksIDAsIGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pOwotCQkJfQotCi0JCQkvLyBmb3JtYXQgZW5kIHRhZyBuYW1lCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCQlJVGV4dFJlZ2lvbiBlbmRUYWdOYW1lUmVnaW9uID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJcmVtb3ZlUmVnaW9uU3BhY2VzKG5vZGUsIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZW5kVGFnTmFtZVJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKFhNTE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGJlZm9yZSBub2RlCi0JCQlmb3JtYXRJbmRlbnRhdGlvbkJlZm9yZU5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCS8vIGZvcm1hdCBzdGFydCB0YWcKLQkJCVhNTE5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0JCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCVhNTE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQotCQkJZm9ybWF0U3RhcnRUYWcobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkvLyBzYXZlIG5ldyBub2RlCi0JCQluZXdOb2RlID0gKFhNTE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3Tm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCQkvLyBmb3JtYXQgY2hpbGRyZW4gYW5kIGVuZCB0YWcgaWYgbm90IGVtcHR5IHN0YXJ0IHRhZwotCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSAhPSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gZm9ybWF0IGNoaWxkcmVuCi0JCQkJCWZvcm1hdENoaWxkcmVuKG5ld05vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkJCS8vIHNhdmUgbmV3IG5vZGUKLQkJCQkJbmV3Tm9kZSA9IChYTUxOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsKLQotCQkJCQkvLyBmb3JtYXQgZW5kIHRhZwotCQkJCQlmb3JtYXRFbmRUYWcobmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYWZ0ZXIgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25BZnRlck5vZGUobmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBmb3JtYXRzIHRoZSBzdGFydCB0YWcgbmFtZSwgYW5kIGZvcm1hdHMgdGhlIGF0dHJpYnV0ZXMgaWYKLQkgKiBhdmFpbGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0U3RhcnRUYWcoWE1MTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJU3RyaW5nIGF0dHJJbmRlbnQgPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQlib29sZWFuIHNwbGl0TXVsdGlBdHRycyA9ICgoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5nZXRTcGxpdE11bHRpQXR0cnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkvLyBOb3RlOiBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgbnVsbCBldmVuIGlmIHRoZSBub2RlIGhhcyBubwotCQkvLyBhdHRyaWJ1dGVzLiBIb3dldmVyLCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpIHdpbGwgYmUgMC4gQnV0LCBjaGVjawotCQkvLyBmb3IgbnVsbCBqdXN0IGluIGNhc2UuCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCS8vIGNvbXB1dGUgY3VycmVudCBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSAwOwotCQkJdHJ5IHsKLQkJCQkvLyAxIGlzIGZvciAiPCIKLQkJCQlpbnQgbm9kZU5hbWVPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyAxICsgbm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpOwotCQkJCWludCBsaW5lT2Zmc2V0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChub2RlTmFtZU9mZnNldCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldChsaW5lT2Zmc2V0LCBub2RlTmFtZU9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQkJCWludCB1c2VkV2lkdGggPSBnZXRJbmRlbnRhdGlvbkxlbmd0aCh0ZXh0KTsKLQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKSAtIHVzZWRXaWR0aDsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCi0JCQlTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQkJaW50IGF0dHJMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJaW50IGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTGVuZ3RoOyBpKyspIHsKLQkJCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIuZ2V0TmFtZVJlZ2lvbigpOwotCQkJCUlUZXh0UmVnaW9uIGVxdWFsUmVnaW9uID0gYXR0ci5nZXRFcXVhbFJlZ2lvbigpOwotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCi0JCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJU3RyaW5nIHVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgYXR0ci5nZXRTdGFydE9mZnNldCgpIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCWxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSBhdHRyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCQkvLyBjaGVjayBmb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZQotCQkJCWlmIChmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pLmNvbXBhcmVUbyhYTUxfU1BBQ0UpID09IDApIHsKLQkJCQkJaWYgKHZhbHVlUmVnaW9uID09IG51bGwpIHsKLQkJCQkJCU1vZGVsUXVlcnlBZGFwdGVyIGFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoWE1MRG9jdW1lbnQpIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01Ob2RlKG5vZGUpOwotCQkJCQkJaWYgKGVsZW1lbnREZWNsYXJhdGlvbiA9PSBudWxsKQotCQkJCQkJCS8vIENNRWxlbWVudERlY2xhcmF0aW9uIG5vdCBmb3VuZCwgZGVmYXVsdCB0bwotCQkJCQkJCS8vIFBSRVNFUlZFCi0JCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZmFsc2UpOwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShYTUxfU1BBQ0UpOwotCQkJCQkJCWlmIChhdHRyaWJ1dGVEZWNsYXJhdGlvbiA9PSBudWxsKQotCQkJCQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG5vdCBmb3VuZCwgZGVmYXVsdAotCQkJCQkJCQkvLyB0byBQUkVTRVJWRQotCQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhmYWxzZSk7Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpOwotCi0JCQkJCQkJCWlmIChkZWZhdWx0VmFsdWUuY29tcGFyZVRvKFBSRVNFUlZFKSA9PSAwKQotCQkJCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZmFsc2UpOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlYTUxHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbm9kZS5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQotCQkJCQkJLy8gVGhlcmUgaXMgYSBwcm9ibGVtIGluCi0JCQkJCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShJVGV4dFJlZ2lvbikKLQkJCQkJCS8vIHdoZW4gdGhlIHJlZ2lvbiBpcyBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24uCi0JCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBub3cuCi0JCQkJCQlpZiAoZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikubGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikuY2hhckF0KDApOwotCQkJCQkJCWlmICgoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URSkgfHwgKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEUpKQotCQkJCQkJCQluZXdBdHRyVmFsdWUgPSBET1VCTEVfUVVPVEVTOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmV3QXR0clZhbHVlLmNvbXBhcmVUbyhQUkVTRVJWRV9RVU9URUQpID09IDApCi0JCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZmFsc2UpOwotCQkJCQkJZWxzZQotCQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHNwbGl0TXVsdGlBdHRycyAmJiBhdHRyTGVuZ3RoID4gMSkgewotCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGxpbmVEZWxpbWl0ZXIgKyBhdHRySW5kZW50KTsKLQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pKTsKLQkJCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCQkJdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChlcXVhbFJlZ2lvbikgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQkJCWxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChlcXVhbFJlZ2lvbik7Ci0KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoRVFVQUxfQ0hBUik7Ci0KLQkJCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCQkJdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbikgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQkJCWxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbik7Ci0KLQkJCQkJCS8vIE5vdGU6IHRyaW0oKSBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IKLQkJCQkJCS8vIHZhbHVlUmVnaW9uLmdldFRleHQoKS4gSnVzdCBhIHdvcmthcm91bmQgZm9yIGEKLQkJCQkJCS8vIHByb2JsZW0gZm91bmQgaW4gdmFsdWVSZWdpb24gZm9yIG5vdy4KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikudHJpbSgpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgdGV4dExlbmd0aCA9IDEgKyBmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pLmxlbmd0aCgpICsgMSArIGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLmxlbmd0aCgpOwotCQkJCQkJaWYgKGkgPT0gYXR0ckxlbmd0aCAtIDEpIHsKLQkJCQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQkJCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkJCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSAhPSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpCi0JCQkJCQkJCQkvLyAzIGlzIGZvciAiIC8+IgotCQkJCQkJCQkJdGV4dExlbmd0aCArPSAzOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkvLyAxIGlzIGZvciAiPiIKLQkJCQkJCQkJCXRleHRMZW5ndGgrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID49IHRleHRMZW5ndGgpIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKFNQQUNFX0NIQVIpOwotCQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgtLTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyICsgYXR0ckluZGVudCk7Ci0JCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCkgLSBhdHRySW5kZW50Lmxlbmd0aCgpOwotCQkJCQkJfQotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikpOwotCi0JCQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQkJCXVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZXF1YWxSZWdpb24pIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZXF1YWxSZWdpb24pOwotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKEVRVUFMX0NIQVIpOwotCi0JCQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQkJCXVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pOwotCi0JCQkJCQkvLyBOb3RlOiB0cmltKCkgc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yCi0JCQkJCQkvLyB2YWx1ZVJlZ2lvbi5nZXRUZXh0KCkuIEp1c3QgYSB3b3JrYXJvdW5kIGZvciBhCi0JCQkJCQkvLyBwcm9ibGVtIGZvdW5kIGluIHZhbHVlUmVnaW9uIGZvciBub3cuCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLnRyaW0oKSk7Ci0KLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLT0gZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKTsKLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgtLTsKLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLT0gZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikudHJpbSgpLmxlbmd0aCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPj0gMSArIGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikubGVuZ3RoKCkpIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKFNQQUNFX0NIQVIpOwotCQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgtLTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyICsgYXR0ckluZGVudCk7Ci0JCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCkgLSBhdHRySW5kZW50Lmxlbmd0aCgpOwotCQkJCQkJfQotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikpOwotCi0JCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC09IGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJU3RyaW5nIHVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgbm9kZS5nZXRFbmRPZmZzZXQoKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCi0JCQlYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIDEgaXMgZm9yICI8IgotCQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIDEgKyBub2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCk7Ci0JCQkvLyAxIGlzIGZvciAiPCIKLQkJCWludCBsZW5ndGggPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dExlbmd0aCgpIC0gMSAtIG5vZGUuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKTsKLQotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCi0JCQkJaWYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pCi0JCQkJCS8vIHNraXAgZm9ybWF0dGluZyBmb3IgZW5kIHRhZ3MgaW4gdGhpcyBmb3JtYXQ6IDwvdGFnTmFtZT4KLQkJCQkJcmV0dXJuOwotCQkJCWVsc2UgewotCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkJCWxlbmd0aCA9IGxlbmd0aCAtIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkJCS8vIGxlYXZlIHNwYWNlIGJlZm9yZSBYTUxfRU1QVFlfVEFHX0NMT1NFOiA8dGFnTmFtZSAvPgotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChTUEFDRV9DSEFSKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmRlZmluZWRSZWdpb25zKFhNTE5vZGUgbm9kZSwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCi0JCQlpZiAocmVnaW9uVHlwZS5jb21wYXJlVG8oWE1MUmVnaW9uQ29udGV4dC5VTkRFRklORUQpID09IDAgJiYgcmVnaW9uU3RhcnRPZmZzZXQgPj0gc3RhcnRPZmZzZXQgJiYgcmVnaW9uU3RhcnRPZmZzZXQgPCBzdGFydE9mZnNldCArIGxlbmd0aCkKLQkJCQlyZXN1bHQgPSByZXN1bHQgKyBmbGF0Tm9kZS5nZXRGdWxsVGV4dChyZWdpb24pOwotCQl9Ci0KLQkJaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gU1BBQ0UgKyByZXN1bHQudHJpbSgpOwotCQllbHNlCi0JCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZm9ybWF0L0Zvcm1hdFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MmJkZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ0RBVEFTZWN0aW9uSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRm9ybWF0UHJvY2Vzc29yWE1MIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZGb3JtYXRQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldFNwbGl0TXVsdGlBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuSU5ERU5UX1VTSU5HX1RBQlMpKQotCQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZSB7Ci0JCQkJCWludCB0YWJXaWR0aCA9IFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBQl9XSURUSCk7Ci0JCQkJCVN0cmluZyBpbmRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYldpZHRoOyBpKyspIHsKLQkJCQkJCWluZGVudCArPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKE5vZGUgbm9kZSkgewotCQkvLyAyNjIxMzUgLSBOUEUgZHVyaW5nIGZvcm1hdCBvZiBlbXB0eSBkb2N1bWVudAotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IEVsZW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ0RBVEFTZWN0aW9uSW1wbCkKLQkJCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdHRlciA9IG5ldyBUZXh0Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgQ29tbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluaXQgZm9tYXR0ZXIKLQkJZm9ybWF0dGVyLnNldEZvcm1hdFByZWZlcmVuY2VzKGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQlmb3JtYXR0ZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGZQcm9ncmVzc01vbml0b3IpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjM2ZhY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZXh0ZW5kcyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIHsKLQlib29sZWFuIGdldFNwbGl0TXVsdGlBdHRycygpOwotCi0Jdm9pZCBzZXRTcGxpdE11bHRpQXR0cnMoYm9vbGVhbiBzcGxpdE11bHRpQXR0cnMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Q3YWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZm9ybWF0L05vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5Tb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucHJlZmVyZW5jZXMuQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNEQVRBU2VjdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLlRhZ05hbWVSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE5vZGVGb3JtYXR0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdHRlciB7Ci0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQ1IgPSAiXHIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQ1JMRiA9ICJcclxuIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERFTElNSVRFUlMgPSAiIFx0XG5cclxmIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRkYgPSAiXGYiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgTEYgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIGNoYXIgU1BBQ0VfQ0hBUiA9ICcgJzsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRBQiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIGNoYXIgVEFCX0NIQVIgPSAnXHQnOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmRm9ybWF0Q29udHJhaW50cyA9IG51bGw7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHJlc3NTcGFjZXMoU3RyaW5nIHN0cmluZywgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJLyoKLQkJICogTm90ZSB0aGF0IHRoZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBzdXBwb3J0cyBtaXhlZCBuZXcgbGluZQotCQkgKiBjaGFyYWN0ZXJzIChDUiwgTEYsIENSTEYpIGluIG9uZSBmaWxlLiBXZSBoYXZlIHRvIGhhbmRsZSB0aGF0IHdoZW4KLQkJICogd2UgdHJ5IHRvIHByZXNlcnZlIGJsYW5rIGxpbmVzLgotCQkgKi8KLQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBudWxsOwotCQlib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykKLQkJCXN0cmluZ0FycmF5ID0gU3RyaW5nVXRpbHMuYXNBcnJheShzdHJpbmcpOwotCQllbHNlCi0JCQlzdHJpbmdBcnJheSA9IFN0cmluZ1V0aWxzLmFzQXJyYXkoc3RyaW5nLCBERUxJTUlURVJTLCB0cnVlKTsKLQotCQlTdHJpbmdCdWZmZXIgY29tcHJlc3NlZFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHN0cmluZ0FycmF5Lmxlbmd0aCA+IDApIHsKLQkJCWJvb2xlYW4gY3IgPSBmYWxzZSwgbGYgPSBmYWxzZSwgY3IyID0gZmFsc2UsIG5vblNwYWNlID0gdHJ1ZTsKLQotCQkJaWYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhDUikgPT0gMCkKLQkJCQljciA9IHRydWU7Ci0JCQllbHNlIGlmIChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oTEYpID09IDApCi0JCQkJbGYgPSB0cnVlOwotCQkJZWxzZSBpZiAoKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhTUEFDRSkgIT0gMCkgJiYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhUQUIpICE9IDApICYmIChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oRkYpICE9IDApKSB7Ci0JCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbMF0pOwotCQkJCW5vblNwYWNlID0gdHJ1ZTsKLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oQ1IpID09IDApIHsKLQkJCQkJaWYgKGNyICYmIGxmKSB7Ci0JCQkJCQlpZiAobm9uU3BhY2UpIHsKLQkJCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChDUiArIExGKTsKLQkJCQkJCQlub25TcGFjZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCQkJCQkJY3IyID0gdHJ1ZTsKLQkJCQkJfSBlbHNlIGlmIChjcikgewotCQkJCQkJaWYgKG5vblNwYWNlKSB7Ci0JCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoQ1IpOwotCQkJCQkJCW5vblNwYWNlID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVtpXSk7Ci0JCQkJCQljcjIgPSB0cnVlOwotCQkJCQl9IGVsc2UKLQkJCQkJCWNyID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhMRikgPT0gMCkgewotCQkJCQlpZiAoY3IgJiYgbGYgJiYgY3IyKSB7Ci0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVtpXSk7Ci0JCQkJCX0gZWxzZSBpZiAobGYpIHsKLQkJCQkJCWlmIChub25TcGFjZSkgewotCQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKExGKTsKLQkJCQkJCQlub25TcGFjZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCQkJCQl9IGVsc2UKLQkJCQkJCWxmID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oU1BBQ0UpICE9IDApICYmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oVEFCKSAhPSAwKSAmJiAoc3RyaW5nQXJyYXlbaV0uY29tcGFyZVRvKEZGKSAhPSAwKSkgewotCQkJCQlpZiAoY29tcHJlc3NlZFN0cmluZy5sZW5ndGgoKSA+IDApCi0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChTUEFDRSk7Ci0JCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQotCQkJCQljciA9IGZhbHNlOwotCQkJCQlsZiA9IGZhbHNlOwotCQkJCQljcjIgPSBmYWxzZTsKLQkJCQkJbm9uU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb21wcmVzc2VkU3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluc0xpbmVEZWxpbWl0ZXJzKFhNTE5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQkJcmVzdWx0ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMgPSBnZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0KLQkJZm9ybWF0KG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEN1cnJlbnRJbmRlbnQoZ2V0U2libGluZ0luZGVudChub2RlKSk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBYTUxOb2RlKQotCQkJZm9ybWF0Tm9kZSgoWE1MTm9kZSkgbm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0SW5kZW50YXRpb25BZnRlck5vZGUoWE1MTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlYTUxOb2RlIG5leHRTaWJsaW5nID0gKFhNTE5vZGUpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaW50IGxpbmUgPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG5vZGUuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQkJdHJ5IHsKLQkJCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIobGluZSk7Ci0JCQkJaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCQkJbGluZURlbGltaXRlciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQotCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCWlmIChuZXh0U2libGluZyAhPSBudWxsKQotCQkJCQkJaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQkJZ2V0Rm9ybWF0dGVyKG5leHRTaWJsaW5nKS5mb3JtYXQobmV4dFNpYmxpbmcsIGZvcm1hdENvbnRyYWludHMpOwotCQkJCQkJZWxzZSBpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewotCQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJfQotCi0JCQkJZWxzZSBpZiAobmV4dFNpYmxpbmcgIT0gbnVsbCkKLQkJCQkJaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlnZXRGb3JtYXR0ZXIobmV4dFNpYmxpbmcpLmZvcm1hdChuZXh0U2libGluZywgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJCWVsc2UgaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVhNTE5vZGUgaW5kZW50Tm9kZSA9IGdldFBhcmVudEluZGVudE5vZGUobm9kZSk7Ci0JCQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZ2V0Tm9kZUluZGVudChpbmRlbnROb2RlKTsKLQkJCQkJWE1MTm9kZSBsYXN0Q2hpbGQgPSBnZXREZWVwZXN0Q2hpbGROb2RlKG5vZGUpOwotCQkJCQlib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQkJCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoKGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobGFzdENoaWxkLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkpIHsKLQkJCQkJCQkvLyB0aGlzIHRleHQgbm9kZSBhbHJlYWR5IGVuZHMgd2l0aCB0aGUgcmVxdWVzdGVkCi0JCQkJCQkJLy8gaW5kZW50YXRpb24KLQkJCQkJCX0KLQotCQkJCQkJZWxzZSBpZiAoKGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobGFzdENoaWxkLmdldE5vZGVWYWx1ZSgpICE9IG51bGwgJiYgbGFzdENoaWxkLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSkKLQkJCQkJCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKSB7Ci0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVJbmRlbnQpOwotCQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJCWlmIChsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRJbmRlbnRhdGlvbkJlZm9yZU5vZGUoWE1MTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlYTUxOb2RlIHByZXZpb3VzU2libGluZyA9IChYTUxOb2RlKSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpbnQgbGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQobm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGxpbmUgPiAwKSB7Ci0JCQkJCWxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcihsaW5lIC0gMSk7Ci0JCQkJCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpCi0JCQkJCQlsaW5lRGVsaW1pdGVyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0KLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCWlmIChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCkKLQkJCQkJCWlmIChwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlnZXRGb3JtYXR0ZXIocHJldmlvdXNTaWJsaW5nKS5mb3JtYXQocHJldmlvdXNTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCWluc2VydEJlZm9yZU5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwcmV2aW91c1NpYmxpbmcgPT0gbnVsbCB8fCBwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJLy8gMjYxOTY4IC0gZm9ybWF0dGluZyB0YWcgd2l0aG91dCBjbG9zaW5nIGJyYWNrZXQ6Ci0JCQkJCQkvLyA8dDE+PHQxCi0JCQkJCQkvLyAyNjU2NzMgLSBOdWxsIHB0ciBpbiBmb3JtYXRJbmRlbnRhdGlvbkJlZm9yZU5vZGUKLQkJCQkJCWludCBwcmV2RW5kTm9kZU9mZnNldCA9IC0xOwotCQkJCQkJaW50IHByZXZFbmRSZWdpb25PZmZzZXQgPSAtMTsKLQkJCQkJCWlmIChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCkgewotCQkJCQkJCXByZXZFbmROb2RlT2Zmc2V0ID0gcHJldmlvdXNTaWJsaW5nLmdldEVuZE9mZnNldCgpOwotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gcHJldmlvdXNTaWJsaW5nLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQlwcmV2RW5kUmVnaW9uT2Zmc2V0ID0gZW5kUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoKHByZXZpb3VzU2libGluZyA9PSBudWxsKSB8fCAocHJldkVuZE5vZGVPZmZzZXQgIT0gLTEgJiYgcHJldkVuZE5vZGVPZmZzZXQgPT0gcHJldkVuZFJlZ2lvbk9mZnNldCkpIHsKLQkJCQkJCQlpbnNlcnRCZWZvcmVOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHByZXZpb3VzU2libGluZy5nZXROb2RlVmFsdWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUocHJldmlvdXNTaWJsaW5nLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWlmICghcHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkgewotCQkJCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUocHJldmlvdXNTaWJsaW5nLCBsaW5lSW5kZW50KTsKLQkJCQkJCQkJfSBlbHNlCi0JCQkJCQkJCQlnZXRGb3JtYXR0ZXIocHJldmlvdXNTaWJsaW5nKS5mb3JtYXQocHJldmlvdXNTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKFhNTE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBiZWZvcmUgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYWZ0ZXIgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25BZnRlck5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGNvbXB1dGUgdGhlIGNvcnJlY3QgaW5kZW50YXRpb24gYWZ0ZXIgdGhpcyBub2RlCi0JICogZGVwZW5kaW5nIG9uIHRoZSBpbmRlbnRhdGlvbnMgb2YgaXRzIHNpYmxpbmcgbm9kZXMgYW5kIHBhcmVudCBub2RlLiBOb3QKLQkgKiBuZWVkZWQgYW55bW9yZT8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRUcmFpbGluZ1RleHQoWE1MTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCVN0cmluZyBwYXJlbnRMaW5lSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0JCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZm9ybWF0Q29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQlYTUxOb2RlIG5leHRTaWJsaW5nID0gKFhNTE5vZGUpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmICgobmV4dFNpYmxpbmcgIT0gbnVsbCkgJiYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKSB7Ci0JCQkJU3RyaW5nIG5leHRTaWJsaW5nVGV4dCA9IG5leHRTaWJsaW5nLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChuZXh0U2libGluZy5nZXROZXh0U2libGluZygpID09IG51bGwpCi0JCQkJCWlmICgobmV4dFNpYmxpbmcuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobmV4dFNpYmxpbmdUZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJCQkJCS8vIGRlbGV0ZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQKLQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobmV4dFNpYmxpbmcsIEVNUFRZX1NUUklORyk7Ci0JCQkJCWVsc2UKLQkJCQkJCS8vIHJlcGxhY2UgdGhlIHRleHQgbm9kZSB3aXRoIHBhcmVudCBpbmRlbnRhdGlvbgotCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShuZXh0U2libGluZywgbGluZURlbGltaXRlciArIHBhcmVudExpbmVJbmRlbnQpOwotCQkJCWVsc2UKLQkJCQkJLy8gcmVwbGFjZSB0aGUgdGV4dCBub2RlIHdpdGggaW5kZW50YXRpb24KLQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShuZXh0U2libGluZywgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobmV4dFNpYmxpbmcgPT0gbnVsbCkgewotCQkJCQlsaW5lSW5kZW50ID0gcGFyZW50TGluZUluZGVudDsKLQotCQkJCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpKSkgewotCQkJCQkJCS8vIHRoaXMgdGV4dCBub2RlIGFscmVhZHkgZW5kcyB3aXRoIHRoZSByZXF1ZXN0ZWQKLQkJCQkJCQkvLyBpbmRlbnRhdGlvbgotCQkJCQkJfQotCi0JCQkJCQllbHNlIGlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyKSkpCi0JCQkJCQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykKLQkJCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVJbmRlbnQpOwotCQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJCWlmIChub2RlLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApCi0JCQkJCQkJCS8vIHJlcGxhY2UKLQkJCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWlmICghbm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpCi0JCQkJCQkJCWlmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKQotCQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVJbmRlbnQpOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkpIHsKLQkJCQkJCS8vIHRoaXMgdGV4dCBub2RlIGFscmVhZHkgZW5kcyB3aXRoIHRoZSByZXF1ZXN0ZWQKLQkJCQkJCS8vIGluZGVudGF0aW9uCi0JCQkJCX0KLQotCQkJCQllbHNlIGlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyKSkpCi0JCQkJCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJZWxzZQotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lSW5kZW50KTsKLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJZWxzZQotCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcHJlc3NlZE5vZGVUZXh0KFhNTE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJcmV0dXJuIGNvbXByZXNzU3BhY2VzKGdldE5vZGVUZXh0KG5vZGUpLCBmb3JtYXRDb250cmFpbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTm9kZSBnZXREZWVwZXN0Q2hpbGROb2RlKFhNTE5vZGUgbm9kZSkgewotCQlYTUxOb2RlIHJlc3VsdCA9IG51bGw7Ci0JCVhNTE5vZGUgbGFzdENoaWxkID0gKFhNTE5vZGUpIG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0KLQkJaWYgKGxhc3RDaGlsZCA9PSBudWxsKQotCQkJcmVzdWx0ID0gbm9kZTsKLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXREZWVwZXN0Q2hpbGROb2RlKGxhc3RDaGlsZCk7Ci0KLQkJCWlmICgocmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgfHwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpICYmICFpc0VuZFRhZ01pc3Npbmcobm9kZSkpCi0JCQkJcmVzdWx0ID0gbm9kZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBnZXRGb3JtYXRDb250cmFpbnRzKCkgewotCQlpZiAoZkZvcm1hdENvbnRyYWludHMgPT0gbnVsbCkgewotCQkJZkZvcm1hdENvbnRyYWludHMgPSBuZXcgU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMoKTsKLQotCQkJZkZvcm1hdENvbnRyYWludHMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRDb250cmFpbnRzOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkZvcm1hdFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRMaW5lV2lkdGgocHJlZmVyZW5jZXMuZ2V0SW50KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJCQkoKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5JTkRFTlRfVVNJTkdfVEFCUykpCi0JCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIHsKLQkJCQkJaW50IHRhYldpZHRoID0gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFCX1dJRFRIKTsKLQkJCQkJU3RyaW5nIGluZGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFiV2lkdGg7IGkrKykgewotCQkJCQkJaW5kZW50ICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoaW5kZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdFByZWZlcmVuY2VzOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoWE1MTm9kZSBub2RlKSB7Ci0JCS8vIDI2MjEzNSAtIE5QRSBkdXJpbmcgZm9ybWF0IG9mIGVtcHR5IGRvY3VtZW50Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlzaG9ydCBub2RlVHlwZSA9ICgoTm9kZSkgbm9kZSkuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgRWxlbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDREFUQVNlY3Rpb25JbXBsKQotCQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0dGVyID0gbmV3IFRleHROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBDb21tZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IERvY3VtZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW5pdCBmb21hdHRlcgotCQlmb3JtYXR0ZXIuc2V0Rm9ybWF0UHJlZmVyZW5jZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCWZvcm1hdHRlci5zZXRQcm9ncmVzc01vbml0b3IoZlByb2dyZXNzTW9uaXRvcik7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEluZGVudGF0aW9uTGVuZ3RoKFN0cmluZyBpbmRlbnQpIHsKLQkJLy8gVE9ETyBLaXQgOiBUaGUgY2FsY3VsYXRpb24gb2YgSW5kZW50YXRpb25MZW5ndGggaXMgbm90IGNvcnJlY3QKLQkJLy8gaGVyZS4KLQkJLy8gbm9kZUluZGVudGF0aW9uIG1heSBjb250YWluIHRhYnMuIE11bHRpcGx5IGJ5IDQgdGVtcG9yYXJpbHkgdG8gZ2V0Ci0JCS8vIGFwcHJveC4gd2lkdGguCi0JCS8vIE5lZWQgdG8gcmUtd29yay4KLQotCQlpbnQgaW5kZW50YXRpb25MZW5ndGggPSAwOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50Lmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChpbmRlbnQuc3Vic3RyaW5nKGksIGkgKyAxKS5jb21wYXJlVG8oVEFCKSA9PSAwKQotCQkJCWluZGVudGF0aW9uTGVuZ3RoICs9IDQ7Ci0JCQllbHNlCi0JCQkJaW5kZW50YXRpb25MZW5ndGgrKzsKLQkJfQotCi0JCXJldHVybiBpbmRlbnRhdGlvbkxlbmd0aDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBmaW5kIHRoZSBpbmRlbnRhdGlvbiBmb3IgdGhpcyBub2RlLiBJdCB3aWxsIHNlYXJjaAotCSAqIGJhY2t3YXJkcyBzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5vZGUgdW50aWwgYSBjaGFyYWN0ZXIKLQkgKiBvdGhlciB0aGFuIGEgc3BhY2Ugb3IgYSB0YWIgaXMgZm91bmQuIElmIHRoaXMgbm9kZSBpcyBudWxsIG9yIGl0J3MgYQotCSAqIGRvY3VtZW50IG5vZGUgb3IgaXQncyBhIGZpcnN0IGxldmVsIG5vZGUgKG5vZGUncyBwYXJlbnQgaXMgYSBkb2N1bWVudAotCSAqIG5vZGUpIHRoZSBkZWZhdWx0IGVtcHR5IHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSBpbmRlbnRhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5vZGVJbmRlbnQoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJWE1MTm9kZSBzaWJsaW5nVGV4dE5vZGUgPSAoWE1MTm9kZSkgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmICgoc2libGluZ1RleHROb2RlICE9IG51bGwpICYmIChzaWJsaW5nVGV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpIHsKLQkJCQkvLyBmaW5kIHRoZSBpbmRlbnRhdGlvbgotCQkJCVN0cmluZyBzaWJsaW5nVGV4dCA9IHNpYmxpbmdUZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpbnQgc2libGluZ1RleHRMZW5ndGggPSBzaWJsaW5nVGV4dC5sZW5ndGgoKTsKLQkJCQlpZiAoKHNpYmxpbmdUZXh0ICE9IG51bGwpICYmIChzaWJsaW5nVGV4dExlbmd0aCA+IDApICYmICgoc2libGluZ1RleHQuY2hhckF0KHNpYmxpbmdUZXh0TGVuZ3RoIC0gMSkgPT0gU1BBQ0VfQ0hBUikgfHwgKHNpYmxpbmdUZXh0LmNoYXJBdChzaWJsaW5nVGV4dExlbmd0aCAtIDEpID09IFRBQl9DSEFSKSkpIHsKLQkJCQkJaW50IHNlYXJjaEluZGV4ID0gc2libGluZ1RleHRMZW5ndGggLSAxOwotCQkJCQl3aGlsZSAoKHNlYXJjaEluZGV4ID49IDApICYmICgoc2libGluZ1RleHQuY2hhckF0KHNlYXJjaEluZGV4KSA9PSBTUEFDRV9DSEFSKSB8fCAoc2libGluZ1RleHQuY2hhckF0KHNlYXJjaEluZGV4KSA9PSBUQUJfQ0hBUikpKQotCQkJCQkJc2VhcmNoSW5kZXgtLTsKLQotCQkJCQlpZiAoc2VhcmNoSW5kZXggPCBzaWJsaW5nVGV4dExlbmd0aCkKLQkJCQkJCXJlc3VsdCA9IHNpYmxpbmdUZXh0LnN1YnN0cmluZyhzZWFyY2hJbmRleCArIDEsIHNpYmxpbmdUZXh0TGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZU5hbWUoWE1MTm9kZSBub2RlKSB7Ci0JCXJldHVybiBub2RlLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROb2RlVGV4dChYTUxOb2RlIG5vZGUpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCi0JCWlmICgobm9kZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DaGFyYWN0ZXJEYXRhSW1wbCkgJiYgIShub2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsKSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ0RBVEFTZWN0aW9uSW1wbCkgJiYgIWlzSlNQVGFnKG5vZGUpKQotCQkJdGV4dCA9ICgob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNoYXJhY3RlckRhdGFJbXBsKSBub2RlKS5nZXRTb3VyY2UoKTsKLQkJZWxzZQotCQkJdGV4dCA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTE5vZGUgZ2V0UGFyZW50SW5kZW50Tm9kZShYTUxOb2RlIG5vZGUpIHsKLQkJWE1MTm9kZSByZXN1bHQgPSBudWxsOwotCQlYTUxOb2RlIHBhcmVudE5vZGUgPSAoWE1MTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQlyZXN1bHQgPSBwYXJlbnROb2RlOwotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHBhcmVudE5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pCi0JCQkJcmVzdWx0ID0gcGFyZW50Tm9kZTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBnZXRQYXJlbnRJbmRlbnROb2RlKHBhcmVudE5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGZpbmQgdGhlIGluZGVudGF0aW9uIGZvciBhIG5vZGUgc2libGluZyB0byB0aGlzIG5vZGUuCi0JICogSXQgd2lsbCB0cnkgdG8gZmluZCBhIHNpYmxpbmcgbm9kZSBiZWZvcmUgdGhpcyBub2RlIGZpcnN0LiBJZiB0aGVyZSBpcwotCSAqIG5vIHNpYmxpbmcgbm9kZSBiZWZvcmUgdGhpcyBub2RlLCBpdCB3aWxsIHRyeSB0byBmaW5kIGEgc2libGluZyBub2RlCi0JICogYWZ0ZXIgdGhpcyBub2RlLiBJZiBzdGlsbCBub3QgZm91bmQsIHdlIHdpbGwgY2hlY2sgaWYgdGhpcyBub2RlIGlzCi0JICogYWxyZWFkeSBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQuIElmIHllcywgdGhpcyBub2RlJ3MgaW5kZW50YXRpb24gd2lsbAotCSAqIGJlIHVzZWQuIE90aGVyd2lzZSwgdGhlIHBhcmVudCBub2RlJ3MgaW5kZW50YXRpb24gcGx1cyBvbmUgaW5kZW50YXRpb24KLQkgKiB3aWxsIGJlIHVzZWQuIElmIHRoaXMgbm9kZSBpcyBudWxsIG9yIGl0J3MgYSBkb2N1bWVudCBub2RlIG9yIGl0J3MgYQotCSAqIGZpcnN0IGxldmVsIG5vZGUgKG5vZGUncyBwYXJlbnQgaXMgYSBkb2N1bWVudCBub2RlKSB0aGUgZGVmYXVsdCBlbXB0eQotCSAqIHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSBpbmRlbnRhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNpYmxpbmdJbmRlbnQoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJLy8gZmluZCB0aGUgdGV4dCBub2RlIGJlZm9yZSB0aGUgcHJldmlvdXMgbm9uLXRleHQgc2libGluZwotCQkJLy8gaWYgdGhhdCdzIG5vdCBmb3VuZCwgd2Ugd2lsbCB0cnkgdGhlIHRleHQgbm9kZSBiZWZvcmUgdGhlIG5leHQKLQkJCS8vIG5vbi10ZXh0IHNpYmxpbmcKLQkJCVhNTE5vZGUgc2libGluZyA9IChYTUxOb2RlKSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJd2hpbGUgKChzaWJsaW5nICE9IG51bGwpICYmIChzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgfHwgc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSkgewotCQkJCWlmIChzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUgJiYgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKSAhPSBudWxsICYmIHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIoc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVmFsdWUoKSkpCi0JCQkJCWJyZWFrOwotCQkJCXNpYmxpbmcgPSAoWE1MTm9kZSkgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCX0KLQkJCWlmIChzaWJsaW5nID09IG51bGwpIHsKLQkJCQlzaWJsaW5nID0gKFhNTE5vZGUpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl3aGlsZSAoKHNpYmxpbmcgIT0gbnVsbCkgJiYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpCi0JCQkJCXNpYmxpbmcgPSAoWE1MTm9kZSkgc2libGluZy5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJU3RyaW5nIHNpbmdsZUluZGVudCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0SW5kZW50KCk7Ci0JCQlTdHJpbmcgcGFyZW50TGluZUluZGVudCA9IGdldE5vZGVJbmRlbnQobm9kZS5nZXRQYXJlbnROb2RlKCkpOwotCi0JCQlpZiAoc2libGluZyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHNpYmxpbmdJbmRlbnQgPSBnZXROb2RlSW5kZW50KHNpYmxpbmcpOwotCQkJCWlmIChzaWJsaW5nSW5kZW50Lmxlbmd0aCgpID4gMCkKLQkJCQkJcmVzdWx0ID0gc2libGluZ0luZGVudDsKLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIG5vZGVJbmRlbnQgPSBnZXROb2RlSW5kZW50KG5vZGUpOwotCQkJCQlpZiAobm9kZUluZGVudC5sZW5ndGgoKSA+IHBhcmVudExpbmVJbmRlbnQubGVuZ3RoKCkpCi0JCQkJCQkvLyB0aGlzIG5vZGUgaXMgaW5kZW50ZWQgZnJvbSBpdHMgcGFyZW50LCBpdHMKLQkJCQkJCS8vIGluZGVudGF0aW9uIHdpbGwgYmUgdXNlZAotCQkJCQkJcmVzdWx0ID0gbm9kZUluZGVudDsKLQkJCQkJZWxzZQotCQkJCQkJcmVzdWx0ID0gcGFyZW50TGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBub2RlSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlKTsKLQkJCQlpZiAobm9kZUluZGVudC5sZW5ndGgoKSA+IHBhcmVudExpbmVJbmRlbnQubGVuZ3RoKCkpCi0JCQkJCS8vIHRoaXMgbm9kZSBpcyBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQsIGl0cyBpbmRlbnRhdGlvbgotCQkJCQkvLyB3aWxsIGJlIHVzZWQKLQkJCQkJcmVzdWx0ID0gbm9kZUluZGVudDsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdCA9IHBhcmVudExpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydEFmdGVyTm9kZShYTUxOb2RlIG5vZGUsIFN0cmluZyBzdHJpbmcpIHsKLQkJWE1MTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IDA7Ci0KLQkJLy8gMjYxOTY4IC0gZm9ybWF0dGluZyB0YWcgd2l0aG91dCBjbG9zaW5nIGJyYWNrZXQ6IDx0MT48dDEKLQkJaWYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBub2RlLmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQl9Ci0JCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRCZWZvcmVOb2RlKFhNTE5vZGUgbm9kZSwgU3RyaW5nIHN0cmluZykgewotCQlYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBub2RlLmdldFN0YXJ0T2Zmc2V0KCksIDAsIHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhJU3RydWN0dXJlZEZvcm1hdHRlci5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmRUYWdNaXNzaW5nKFhNTE5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgIWlzSlNQVGFnKG5vZGUpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJSVRleHRSZWdpb24gc3RhcnRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMSkKLQkJCQlzdGFydFRhZ05hbWVSZWdpb24gPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gZW5kVGFnTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPiAxKQotCQkJCWVuZFRhZ05hbWVSZWdpb24gPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQotCQkJSVRleHRSZWdpb25MaXN0IHN0YXJ0VGFnUmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChzdGFydFRhZ05hbWVSZWdpb24gPT0gZW5kVGFnTmFtZVJlZ2lvbiAmJiBzdGFydFRhZ05hbWVSZWdpb24gIT0gbnVsbCAmJiAoc3RhcnRUYWdSZWdpb25zLmdldCgwKSkuZ2V0VHlwZSgpICE9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiAmJiAoc3RhcnRUYWdSZWdpb25zLmdldChzdGFydFRhZ1JlZ2lvbnMuc2l6ZSgpIC0gMSkuZ2V0VHlwZSgpKSAhPSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpCi0JCQkJLy8gZW5kIHRhZyBtaXNzaW5nCi0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1BUYWcoWE1MTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gaW4gc29tZSBjYXNlcywgdGhlIG5vZGVzIGV4aXN0cywgYnV0IGhhc24ndCBiZWVuIGFzc29jaWF0ZWQgd2l0aAotCQkvLyBhIGZsYXRub2RlIHlldCAodGhlIHNjcmVlbiB1cGRhdGVzIGNhbiBiZSBpbml0aWF0ZWQgb24gYSBkaWZmZXJlbnQKLQkJLy8gdGhyZWFkLAotCQkvLyBzbyB0aGUgcmVxdWVzdCBmb3IgYSBmbGF0bm9kZSBjYW4gY29tZSBpbiBiZWZvcmUgdGhlIG5vZGUgaXMgZnVsbHkKLQkJLy8gZm9ybWVkLgotCQkvLyBpZiB0aGUgZmxhdG5vZGUgaXMgbnVsbCwgd2UnbGwganVzdCBhbGxvdyB0aGUgZGVmYXVsdHMgdG8gYXBwbHkuCi0JCS8vIChodG1sIGFkYXB0ZXIgaW4gdGhpcyBjYXNlKS4KLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmbGF0Tm9kZVR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCQlpZiAoKGZsYXROb2RlVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgfHwgKGZsYXROb2RlVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCAoZmxhdE5vZGVUeXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgKGZsYXROb2RlVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgKGZsYXROb2RlVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFKSB8fCAoZmxhdE5vZGVUeXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgfHwgKGZsYXROb2RlVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pIHx8IChmbGF0Tm9kZVR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG5vZGVIYXNTaWJsaW5ncyhYTUxOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwpIHx8IChub2RlLmdldE5leHRTaWJsaW5nKCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTm9kZSBjaGFuZ2VkLiBObyBmb3JtYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWdpb25TcGFjZXMoWE1MTm9kZSBub2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKChyZWdpb24gIT0gbnVsbCkgJiYgKHJlZ2lvbiBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24gfHwgcmVnaW9uIGluc3RhbmNlb2YgVGFnTmFtZVJlZ2lvbikgJiYgKGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pID4gZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSkgewotCQkJWE1MTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbiksIGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pIC0gZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pLCBFTVBUWV9TVFJJTkcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXBsYWNlIHRoZSBzdHJpbmcgYXQgb2Zmc2V0IGFuZCBsZW5ndGggd2l0aCBhIG5ldwotCSAqIHN0cmluZy4gSWYgdGhlIHN0cmluZyB0byBiZSByZXBsYWNlZCBpcyB0aGUgc2FtZSBhcyB0aGUgbmV3IHN0cmluZywgdGhlCi0JICogc3RyaW5nIHdpbGwgbm90IGJlIHJlcGxhY2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2UoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmcpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJ1Y3R1cmVkRG9jdW1lbnRTdHJpbmcgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRTdHJpbmcuY29tcGFyZVRvKHN0cmluZykgIT0gMCkKLQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSB0aGUgbm9kZSB2YWx1ZSB3aXRoIGEgbmV3IHN0cmluZy4gSWYgdGhlIG5vZGUKLQkgKiB2YWx1ZSB0byBiZSByZXBsYWNlZCBpcyB0aGUgc2FtZSBhcyB0aGUgbmV3IHN0cmluZywgdGhlIG5vZGUgdmFsdWUgd2lsbAotCSAqIG5vdCBiZSByZXBsYWNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlTm9kZVZhbHVlKFhNTE5vZGUgbm9kZSwgU3RyaW5nIHN0cmluZykgewotCQlYTUxNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cnVjdHVyZWREb2N1bWVudFN0cmluZyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFN0cmluZy5jb21wYXJlVG8oc3RyaW5nKSAhPSAwKQotCQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZm9ybWF0UHJlZmVyZW5jZXMpIHsKLQkJZkZvcm1hdFByZWZlcmVuY2VzID0gZm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWFlNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCBleHRlbmRzIFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgewotCXByaXZhdGUgYm9vbGVhbiBmU3BsaXRNdWx0aUF0dHJzOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0U3BsaXRNdWx0aUF0dHJzKCkgewotCQlyZXR1cm4gZlNwbGl0TXVsdGlBdHRyczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGxpdE11bHRpQXR0cnMoYm9vbGVhbiBzcGxpdE11bHRpQXR0cnMpIHsKLQkJZlNwbGl0TXVsdGlBdHRycyA9IHNwbGl0TXVsdGlBdHRyczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2Zvcm1hdC9UZXh0Tm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9mb3JtYXQvVGV4dE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjNGZlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2Zvcm1hdC9UZXh0Tm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgVGV4dE5vZGVGb3JtYXR0ZXIgZXh0ZW5kcyBOb2RlRm9ybWF0dGVyIHsKLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKFhNTE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpbnQgbGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQobm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUpOwotCQkJCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpCi0JCQkJCWxpbmVEZWxpbWl0ZXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCQlpbnQgbGluZVdpZHRoID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKTsKLQkJCVhNTE5vZGUgcGFyZW50Tm9kZSA9IChYTUxOb2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCVN0cmluZyBub2RlSW5kZW50YXRpb24gPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQotCQkJLy8gY29tcHV0ZSBjdXJyZW50IGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQlpbnQgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IDA7Ci0JCQl0cnkgewotCQkJCWludCBub2RlTmFtZU9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGluZU9mZnNldCA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQobm9kZU5hbWVPZmZzZXQpLmdldE9mZnNldCgpOwotCQkJCVN0cmluZyB0ZXh0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQobGluZU9mZnNldCwgbm9kZU5hbWVPZmZzZXQgLSBsaW5lT2Zmc2V0KTsKLQkJCQlpbnQgdXNlZFdpZHRoID0gZ2V0SW5kZW50YXRpb25MZW5ndGgodGV4dCk7Ci0JCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCkgLSB1c2VkV2lkdGg7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQotCQkJU3RyaW5nIGNvbXByZXNzZWRUZXh0ID0gZ2V0Q29tcHJlc3NlZE5vZGVUZXh0KG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQlpZiAoKChjb21wcmVzc2VkVGV4dC5sZW5ndGgoKSA8PSAoY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCAtIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVOYW1lKCkubGVuZ3RoKCkgLSAzKSAmJiAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKGNvbXByZXNzZWRUZXh0KSkgJiYgKCFub2RlSGFzU2libGluZ3Mobm9kZSkgfHwgKCFTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIobm9kZS5nZXROb2RlVmFsdWUoKSkgJiYgbm9kZS5nZXROZXh0U2libGluZygpICE9IG51bGwgJiYgbm9kZS5nZXROZXh0U2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUgJiYgIVN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihub2RlLmdldE5leHRTaWJsaW5nKCkuZ2V0Tm9kZVZhbHVlKCkpKSkgJiYgIWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycygoWE1MTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCkpKSB8fCBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSAwKSB7Ci0JCQkJLy8gZW5vdWdoIHNwYWNlCi0JCQkJLy8gYW5kIHRleHQgaGFzIG5vIGxpbmUgZGVsaW1pdGVycwotCQkJCS8vIGFuZCAobm9kZSBoYXMgbm8gc2libGluZ3Mgb3IgZm9sbG93ZWQgYnkgaW5saW5lIGNvbW1lbnQpCi0JCQkJLy8gYW5kCi0JCQkJLy8gcGFyZW50Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluc0xpbmVEZWxpbWl0ZXJzCi0KLQkJCQlpZiAoaXNFbmRUYWdNaXNzaW5nKHBhcmVudE5vZGUpKSB7Ci0JCQkJCXBhcmVudE5vZGUgPSAoWE1MTm9kZSkgcGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCXdoaWxlIChpc0VuZFRhZ01pc3NpbmcocGFyZW50Tm9kZSkpCi0JCQkJCQlwYXJlbnROb2RlID0gKFhNTE5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCS8vIGFkZCBwYXJlbnQncyBpbmRlbnRhdGlvbiB0byBlbmQKLQkJCQkJbm9kZUluZGVudGF0aW9uID0gZ2V0Tm9kZUluZGVudChwYXJlbnROb2RlKTsKLQotCQkJCQlpZiAoIWNvbXByZXNzZWRUZXh0LmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pKSB7Ci0JCQkJCQljb21wcmVzc2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChjb21wcmVzc2VkVGV4dCwgbGluZURlbGltaXRlcik7Ci0JCQkJCQljb21wcmVzc2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChjb21wcmVzc2VkVGV4dCwgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICgocGFyZW50Tm9kZSAhPSBudWxsKSAmJiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPiAwKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgJiYgKChub2RlLmdldFByZXZpb3VzU2libGluZygpID09IG51bGwpIHx8IChub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkpKQotCQkJCQkvLyBkZWxldGUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBkb2N1bWVudAotCQkJCQljb21wcmVzc2VkVGV4dCA9IEVNUFRZX1NUUklORzsKLQotCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgY29tcHJlc3NlZFRleHQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBub3QgZW5vdWdoIHNwYWNlLCBuZWVkIHRvIHJlZmxvdyB0ZXh0Ci0KLQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gbGluZVdpZHRoIC0gZ2V0SW5kZW50YXRpb25MZW5ndGgobm9kZUluZGVudGF0aW9uKTsKLQkJCQlMaXN0IHZlY3RvciA9IHJlZmxvd1RleHQoY29tcHJlc3NlZFRleHQsIGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgpOwotCQkJCWludCB2ZWN0b3JTaXplID0gdmVjdG9yLnNpemUoKTsKLQkJCQlTdHJpbmcgcmVmbG93ZWRUZXh0ID0gbmV3IFN0cmluZygpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3JTaXplOyBpKyspIHsKLQkJCQkJaWYgKCgoU3RyaW5nKSB2ZWN0b3IuZ2V0KGkpKS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJcmVmbG93ZWRUZXh0ID0gcmVmbG93ZWRUZXh0ICsgbGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbiArIChTdHJpbmcpIHZlY3Rvci5nZXQoaSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlZmxvd2VkVGV4dCA9IHJlZmxvd2VkVGV4dCArIGxpbmVEZWxpbWl0ZXI7Ci0JCQkJfQotCi0JCQkJaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7Ci0JCQkJCWlmIChpc0VuZFRhZ01pc3NpbmcocGFyZW50Tm9kZSkpIHsKLQkJCQkJCS8vIGRvbid0IGFkZCBpbmRlbnRhdGlvbiB0byBlbmQgaWYgcGFyZW50IGVuZCB0YWcgaXMKLQkJCQkJCS8vIG1pc3NpbmcKLQkJCQkJfQotCi0JCQkJCWVsc2UgewotCQkJCQkJLy8gYWRkIHBhcmVudCdzIGluZGVudGF0aW9uIHRvIGVuZAotCQkJCQkJbm9kZUluZGVudGF0aW9uID0gZ2V0Tm9kZUluZGVudChwYXJlbnROb2RlKTsKLQotCQkJCQkJaWYgKCFyZWZsb3dlZFRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFyZWZsb3dlZFRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQkJCS8vIG5vdCBhbHJlYWR5IGVuZGVkIHdpdGggdGhlIGV4cGVjdGVkIGluZGVudGF0aW9uCi0KLQkJCQkJCWlmIChub2RlLmdldE5leHRTaWJsaW5nKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewotCQkJCQkJCS8vIGFkZCBpbmRlbnRhdGlvbiB0byBlbmQgaWYKLQkJCQkJCQkvLyBjdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlcgotCQkJCQkJCS8vIG9yIGZvbGxvd2VkIGJ5IG11bHRpTGluZUNvbW1lbnQKLQotCQkJCQkJCVN0cmluZyBub2RlVGV4dCA9IGdldE5vZGVUZXh0KG5vZGUpOwotCQkJCQkJCWludCBpbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIobm9kZVRleHQpOwotCQkJCQkJCWJvb2xlYW4gY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIgPSBpbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIgIT0gLTE7Ci0JCQkJCQkJaWYgKGN1cnJlbnRUZXh0RW5kc1dpdGhMaW5lRGVsaW1pdGVyKSB7Ci0JCQkJCQkJCS8vIG5vIG1vcmUgbm9uIGJsYW5rIGNoYXJhY3RlciBhZnRlciB0aGUgbGFzdAotCQkJCQkJCQkvLyBsaW5lIGRlbGltaXRlcgotCQkJCQkJCQljdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlciA9IFN0cmluZ1V0aWxzLmluZGV4T2ZOb25ibGFuayhub2RlVGV4dCwgaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKSA9PSAtMTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlTdHJpbmcgbm9kZVZhbHVlID0gbm9kZS5nZXROZXh0U2libGluZygpLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCWJvb2xlYW4gbXVsdGlMaW5lQ29tbWVudCA9IFN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihub2RlVmFsdWUpOwotCi0JCQkJCQkJaWYgKGN1cnJlbnRUZXh0RW5kc1dpdGhMaW5lRGVsaW1pdGVyIHx8IG11bHRpTGluZUNvbW1lbnQpIHsKLQkJCQkJCQkJcmVmbG93ZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKHJlZmxvd2VkVGV4dCwgbGluZURlbGltaXRlcik7Ci0JCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBub3QgYSBjb21tZW50LCBqdXN0IGFkZCBhZGQgaW5kZW50YXRpb24gdG8gZW5kCi0JCQkJCQkJcmVmbG93ZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKHJlZmxvd2VkVGV4dCwgbGluZURlbGltaXRlcik7Ci0JCQkJCQkJcmVmbG93ZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKHJlZmxvd2VkVGV4dCwgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgcmVmbG93ZWRUZXh0KTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFZlY3RvciByZWZsb3dUZXh0KFN0cmluZyB0ZXh0LCBpbnQgYXZhaWxhYmxlV2lkdGgpIHsKLQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBudWxsOwotCQlib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykKLQkJCXN0cmluZ0FycmF5ID0gU3RyaW5nVXRpbHMuYXNBcnJheSh0ZXh0KTsKLQkJZWxzZQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHRleHQsIERFTElNSVRFUlMsIHRydWUpOwotCi0JCVZlY3RvciBvdXRwdXQgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmICgoc3RyaW5nQXJyYXkgIT0gbnVsbCkgJiYgKHN0cmluZ0FycmF5Lmxlbmd0aCA+IDApKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhDUikgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKHN0cmluZ0FycmF5WzBdKTsKLQkJCWludCBidWZmZXJMZW5ndGggPSBzdHJpbmdBcnJheVswXS50b1N0cmluZygpLmxlbmd0aCgpOwotCQkJYm9vbGVhbiBjciA9IHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhDUikgPT0gMDsKLQotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBlYWNoU3RyaW5nID0gc3RyaW5nQXJyYXlbaV07Ci0JCQkJaWYgKChlYWNoU3RyaW5nLmNvbXBhcmVUbyhTUEFDRSkgIT0gMCkgJiYgKGVhY2hTdHJpbmcuY29tcGFyZVRvKFRBQikgIT0gMCkgJiYgKGVhY2hTdHJpbmcuY29tcGFyZVRvKEZGKSAhPSAwKSkgewotCQkJCQlpZiAoKGJ1ZmZlckxlbmd0aCArIDEgKyBlYWNoU3RyaW5nLmxlbmd0aCgpID4gYXZhaWxhYmxlV2lkdGgpIHx8IChlYWNoU3RyaW5nLmNvbXBhcmVUbyhDUikgPT0gMCkgfHwgKGVhY2hTdHJpbmcuY29tcGFyZVRvKExGKSA9PSAwKSkgewotCQkJCQkJaWYgKChlYWNoU3RyaW5nLmNvbXBhcmVUbyhMRikgPT0gMCkgJiYgY3IpIHsKLQkJCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW91dHB1dC5hZGQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQlidWZmZXJMZW5ndGggPSAwOwotCQkJCQkJfQotCQkJCQkJY3IgPSBlYWNoU3RyaW5nLmNvbXBhcmVUbyhDUikgPT0gMDsKLQkJCQkJfSBlbHNlIGlmIChidWZmZXIudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKFNQQUNFKTsKLQkJCQkJCWJ1ZmZlckxlbmd0aCsrOwotCQkJCQl9Ci0JCQkJCWlmICgoZWFjaFN0cmluZy5jb21wYXJlVG8oQ1IpICE9IDApICYmIChlYWNoU3RyaW5nLmNvbXBhcmVUbyhMRikgIT0gMCkpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoZWFjaFN0cmluZyk7Ci0JCQkJCQlidWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGggKyBlYWNoU3RyaW5nLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJb3V0cHV0LmFkZChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0gZWxzZQotCQkJb3V0cHV0LmFkZCh0ZXh0KTsKLQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRGVidWdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9EZWJ1Z0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzVjNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9EZWJ1Z0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgRGVidWdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuCi0JICovCi0JcHVibGljIERlYnVnQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXRoaXMoSURlYnVnQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICovCi0JcHVibGljIERlYnVnQWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5I2FkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb250cmlidXRlZEZhY3RvcmllcyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCS8vbm9uZSBleHBlY3RlZAotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IERlYnVnQWRhcHRlckZhY3RvcnkodGhpcy5hZGFwdGVyS2V5LCB0aGlzLnNob3VsZFJlZ2lzdGVyQWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCUV2ZXJ5Tm9kZURlYnVnQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0KLQkJcmV0dXJuIElEZWJ1Z0FkYXB0ZXIuY2xhc3MgPT0gdHlwZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5I3NldENvbnRyaWJ1dGVkRmFjdG9yaWVzKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMoQXJyYXlMaXN0IGxpc3QpIHsKLQkJLy8gbm9uZSBleHBlY3RlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0V2ZXJ5Tm9kZURlYnVnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzIzODk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLkFib3V0VG9CZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci0KLQotLyoqCi0gKiBQdXJlbHkgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcKLSAqLwotcHVibGljIGNsYXNzIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlciBpbXBsZW1lbnRzIElEZWJ1Z0FkYXB0ZXIgewotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsRG9jdW1lbnRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudExpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJJZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkOiAiICsgZXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oIklkb2N1bWVudENoYW5nZWQ6ICIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJTW9kZWxTdGF0ZUxpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbEFib3V0VG9CZUNoYW5nZWQ6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxDaGFuZ2VkOiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsRGlydHlTdGF0ZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbERpcnR5U3RhdGVDaGFuZ2VkOiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZURlbGV0ZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbFJlc291cmNlRGVsZXRlZDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VNb3ZlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbFJlc291cmNlTW92ZWQ6ICIgKyAib2xkTW9kZWw6ICIgKyBvbGRNb2RlbCArICJuZXdNb2RlbDogIiArIG5ld01vZGVsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSBpbXBsZW1lbnRzIElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChBYm91dFRvQmVDaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25ld01vZGVsKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3RG9jdW1lbnRDb250ZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbmV3TW9kZWw6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNub0NoYW5nZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5vQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbm9DaGFuZ2U6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNub2Rlc1JlcGxhY2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbm9kZXNSZXBsYWNlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbkNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZCAtIHJlZ2lvbkNoYW5nZWQ6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25zUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZCAtIHJlZ2lvbnNSZXBsYWNlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlciBzaW5nbGV0b25JbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoc2luZ2xldG9uSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc2luZ2xldG9uSW5zdGFuY2UgPSBuZXcgRXZlcnlOb2RlRGVidWdBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbkluc3RhbmNlOwotCX0KLQotCUludGVybmFsRG9jdW1lbnRMaXN0ZW5lciBmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyOwotCUludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQlJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZTsKLQlJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotCUlTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKCk7Ci0JCWZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UgPSBuZXcgSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKCk7Ci0JCWZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID0gbmV3IEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKTsKLQkJZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID0gbmV3IEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqLwotCXB1YmxpYyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJdGhpcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSURlYnVnQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXIsCi0JICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgWE1MTm9kZSkgewotCQkJc2V0TW9kZWwoKChYTUxOb2RlKSBub3RpZmllcikuZ2V0TW9kZWwoKSk7Ci0JCX0KLQkJRGVidWcucHJpbnRsbigibm90aWZpZXI6ICIgKyBub3RpZmllciArICIgIiArIElOb2RlTm90aWZpZXIuRVZFTlRfVFlQRV9TVFJJTkdTW2V2ZW50VHlwZV0gKyAiIGNoYW5nZWRGZWF0dXJlOiAiICsgY2hhbmdlZEZlYXR1cmUgKyAiIG9sZFZhbHVlOiAiICsgb2xkVmFsdWUgKyAiIG5ld1ZhbHVlOiAiICsgbmV3VmFsdWUgKyAiIHBvczogIiArIHBvcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRGVidWdBZGFwdGVyI3NldERvY3VtZW50KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWlmIChmTW9kZWwgPT0gc3RydWN0dXJlZE1vZGVsKQotCQkJcmV0dXJuOwotCi0JCWlmIChmTW9kZWwgIT0gbnVsbCkgewotCQkJZk1vZGVsLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQkJLy8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJZk1vZGVsID0gc3RydWN0dXJlZE1vZGVsOwotCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKLQotCQkJZk1vZGVsLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQkJLy8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIoZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9JRGVidWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0lEZWJ1Z0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiOTAyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0lEZWJ1Z0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEZWJ1Z0FkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzcwYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5OTJjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucHJlZmVyZW5jZXMuQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXM7Ci0KLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFhNTENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBYTUxDb3JlUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFRklYID0gIiUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ET1VCTEVfUFJFRklYID0gIiUlIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBYTUxDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNpbml0aWFsaXplRGVmYXVsdFBsdWdpblByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBsdWdpblByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkvLyBzZXQgbW9kZWwgcHJlZmVyZW5jZSBkZWZhdWx0cwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSwgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSwgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIHRydWUpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MsIHRydWUpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUywgZmFsc2UpOwotCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlVURl84KTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBQl9XSURUSCwgNCk7Ci0KLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5GT1JNQVRUSU5HX1NVUFBPUlRFRCwgdHJ1ZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgNzIpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTLCBmYWxzZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuSU5ERU5UX1VTSU5HX1RBQlMsIHRydWUpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUywgZmFsc2UpOwotCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuUFJFRkVSUkVEX01BUktVUF9DQVNFX1NVUFBPUlRFRCwgZmFsc2UpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UsIENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSwgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgcyA9IHZhbHVlLnRyaW0oKTsKLQkJaWYgKCFzLnN0YXJ0c1dpdGgoS0VZX1BSRUZJWCwgMCkpCi0JCQlyZXR1cm4gczsKLQkJaWYgKHMuc3RhcnRzV2l0aChLRVlfRE9VQkxFX1BSRUZJWCwgMCkpCi0JCQlyZXR1cm4gcy5zdWJzdHJpbmcoMSk7Ci0KLQkJaW50IGl4ID0gcy5pbmRleE9mKCcgJyk7Ci0JCVN0cmluZyBrZXkgPSBpeCA9PSAtMSA/IHMgOiBzLnN1YnN0cmluZygwLCBpeCk7Ci0KLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5LnN1YnN0cmluZygxKSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWExOGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1JbnZhbGlkX2NoYXJhY3Rlcl8oJzwnKV9mb19FUlJPUl89SW52YWxpZCBjaGFyYWN0ZXIgKCc8JykgZm91bmQKLUludmFsaWRfY2hhcmFjdGVyXygnPicpX2ZvX0VSUk9SXz1JbnZhbGlkIGNoYXJhY3RlciAoJz4nKSBmb3VuZAotSW52YWxpZF9jaGFyYWN0ZXJfKCcmJylfZm9fRVJST1JfPUludmFsaWQgY2hhcmFjdGVyICgnJicpIGZvdW5kCi1JbnZhbGlkX2NoYXJhY3Rlcl8oJ19fJylfZl9FWENfPUludmFsaWQgY2hhcmFjdGVyICgnXCInKSBmb3VuZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGY4ZTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5pbnRlcm5hbC5CeXRlUmVhZGVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCi0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gVE9ETzogaWYgZGV0ZWN0ZWRDaGFyc2V0IGFuZCBzcGVjIGRlZmF1bHQgaXMKLQkJLy8gbnVsbCwgbmVlZCB0byB1c2UgIndvcmsKLQkJLy8gYmVuY2ggYmFzZWQiIGRlZmF1bHRzLgotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEBwYXJhbSByZWFzb24KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24pIHsKLQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQlmRW5jb2RpbmdNZW1lbnRvLmFkZFRyYWNlKHJlYXNvbik7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQkvLyB0byBlbnN1cmUgY29uc2lzdCBvdmVyYWxsIHJ1bGVzIHVzZWQsIHdlJ2xsIG1hcmsgYXMKLQkvLyBmaW5hbCwKLQkvLyBhbmQgcmVxdWlyZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgY2VydGFpbiBwaWVjZXMgb2YKLQkvLyB0aGUKLQkvLyBpbXBsZW1lbnRhdGlvbgotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdG8gcmV0dXJuIGEgZGVmYXVsdCBlbmNvZGluZyAtLSBhcyBzcGVjaWZpZWQgYnkgYW4gaW5kdXN0cnkKLQkgKiBjb250ZW50IHR5cGUgc3BlYyAtLSB3aGVuIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIGZvciBleGFtcGxlLCBYTUwKLQkgKiBzcGVjaWZpZXMgVVRGLTgsIEpTUCBzcGVjaWZpZXMgSVNPLTg4NTktMS4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgotCSAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCAic3BlYyBkZWZhdWx0Ii4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTmFtZSwKLQkJCS8vIEVuY29kaW5nTWVtZW50by5VU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uYWRkVHJhY2UoRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXZlcnkgc3ViY2xhc3MgbXVzdCBwcm92aWRlIGEgd2F5IHRvIHBhcnNlIHRoZSBpbnB1dC4gVGhpcyBtZXRob2QgaGFzCi0JICogc2V2ZXJhbCBjcml0aWNhbCByZXNwb25zaWJpbGl0aWVzOgotCSAqIDxsaT5zZXQgdGhlIGZFbmNvZGluZ01lbWVudG8gZmllbGQgYXBwcm9wcmlhdGVseSwgYWNjb3JkaW5nIHRvIHRoZQotCSAqIHJlc3VsdHMgb2YgdGhlIHBhcnNlIG9mIGZSZWFkZXIuPC9saT4KLQkgKiA8bGk+c2V0IGZIYXJkZXJQYXJzZWQgdG8gdHJ1ZSwgdG8gYXZvaWQgd2FzdGVkIHJlLXBhcnNpbmcuPC9saT4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZIZWFkZXJQYXJzZWQgPSBmYWxzZTsKLQkJZkVuY29kaW5nTWVtZW50byA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXNldEFsbCgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGlTdG9yYWdlLmdldENvbnRlbnRzKCk7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJc2V0KHJlc2V0dGFibGVTdHJlYW0pOwotCQkvLyBUT0RPIHdlJ2xsIG5lZWQgdG8gInJlbWVtYmVyIiBJRmlsZSwgb3IKLQkJLy8gZ2V0IGl0cyAob3IgaXRzIHByb2plY3Qncykgc2V0dGluZ3MsIGluIGNhc2UKLQkJLy8gdGhvc2UgYXJlIG5lZWRlZCB0byBoYW5kbGUgY2FzZXMgd2hlbiB0aGUKLQkJLy8gZW5jb2RpbmcgaXMgbm90IGluIHRoZSBmaWxlIHN0cmVhbS4KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBwYXJ0IG9mIGludGVyZmFjZSB0byBoZWxwIGF2b2lkIGNvbmZ1c2lvbiAuLi4gaXQKLQkgKiBleHBlY3RlZCB0aGlzIFJlYWRlciBpcyBhIHdlbGwgZm9ybWVkIGNoYXJhY3RlciByZWFkZXIgLi4uIHRoYXQgaXMsIGl0cwotCSAqIGFsbCByZWFkeSBiZWVuIGRldGVybWluZWQgdG8gbm90IGJlIGEgdW5pY29kZSBtYXJrZWQgaW5wdXQgc3RyZWFtLiBBbmQsCi0JICogaXRzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24sIGF0IHBvc2l0aW9uIHplcm8sIHJlYWR5IHRvCi0JICogcmVhZCBmaXJzdCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJaWYgKCFmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJfQotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2JsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmIG1hcmthYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWYwNGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBub3QgbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JLyoqIERlZmF1bHQgYnl0ZSBidWZmZXIgc2l6ZSAoMjA0OCkuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDIwNDg7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHJvdGVjdGVkIEJ5dGVSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKLQkJZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCXJldHVybiAoYjAgJiAweDAwRkYpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsZW5ndGggPiBmQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSBmSW5wdXRTdHJlYW0ucmVhZChmQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OWNmMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29udGVudERlc2NyaWJlckZvclhNTCBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFR9OwotCi0JcHJvdGVjdGVkIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uSW5wdXRTdHJlYW0sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uKQotCSAqLwotCXB1YmxpYyBpbnQgZGVzY3JpYmUoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNnZXRTdXBwb3J0ZWRPcHRpb25zKCkKLQkgKi8KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0KLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4KLQkJLy8gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsIGhhcHBlbiwgZm9yIGV4YW1wbGUsCi0JCS8vIGlmIHRoZXJlJ3MKLQkJLy8gZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMgZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLyBpZiAoIWRldGVjdGVkQ2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkvLyBkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwKLQkJCS8vIGRldGVjdGVkQ2hhcnNldCk7Ci0JCQkvLyB9Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJLy8gZWxzZSBpZgotCQkvLyAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8pKQotCQkvLyByZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDYWxjdWxhdGlvbnMoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RlOiBpZiB3ZSdyZSBhc2tlZCBmb3Igb25lLCB3ZSBzZXQgdGhlbSBhbGwuIEkgbmVlZCB0byBiZSBzdXJlIGlmCi0JCS8vIGNhbGxlZAotCQkvLyBtdWxpdGlwbGUgdGltZXMgKG9uZSBmb3IgZWFjaCwgc2F5KSB0aGF0IHdlIGRvbid0IHdhc3RlIHRpbWUKLQkJLy8gcHJvY2Vzc2luZyBzYW1lCi0JCS8vIGNvbnRlbnQgYWdhaW4uCi0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSBkZXRlY3Rvci5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQudGhlCi0JCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZ2V0RGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYXZvaWQgYWRkaW5nIGFueXRoaW5nIGlmIG5vdCBhYnNvbHV0bHkgbmVlZGVkLCBzaW5jZSBhbHdheXMKLQkJLy8gImNhY2hlZCIgcGVyIHNlc3Npb24KLQkJLy8gZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8sCi0JCS8vIGVuY29kaW5nTWVtZW50byk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nUGFyc2VyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nUGFyc2VyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDAyYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ1BhcnNlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cyB7Ci0KLQlmaW5hbCBTdHJpbmcgRU9GID0gIkVPRiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSA9ICJJbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBJbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlID0gIkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIE1BWF9DSEFSU19SRUFDSEVEID0gIk1BWF9DSEFSU19SRUFDSEVEIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBTdHJpbmdWYWx1ZSA9ICJzdHJ2YWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUgPSAiVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFVURjE2QkUgPSAiVVRGMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFVURjE2TEUgPSAiVVRGMTZMRSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIGZpbmFsIFN0cmluZyBVVEY4M0J5dGVCT00gPSAiVVRGODNCeXRlQk9NIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxNGI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDEwNTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKgotICogCi0gKiBBIG5vbi1yZXNpemFibGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciBvZiBqYXZhLnV0aWwuU3RhY2ssIGJ1dAotICogZGlyZWN0bHkgZm9yIHRoZSA8Y29kZT4gaW50ZWdlciA8L2NvZGU+IHByaW1pdGl2ZS4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW50U3RhY2sgewotCXByaXZhdGUgaW50W10gbGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBJbnRTdGFjaygpIHsKLQkJdGhpcygxMDApOwotCX0KLQotCXB1YmxpYyBJbnRTdGFjayhpbnQgbWF4ZGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbGlzdCA9IG5ldyBpbnRbbWF4ZGVwdGhdOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldChpbnQgc2xvdCkgewotCQlyZXR1cm4gbGlzdFtzbG90XTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QubGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5MmJlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL051bGxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQkJYWRkVHJhY2UoREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxEZWNsRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDNmNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxEZWNsRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWE1MRGVjbERldGVjdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRl9TSVpFID0gMTAyNCAqIDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9NQVJLX1NJWkUgPSAxMDI0ICogMjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCXByaXZhdGUgYm9vbGVhbiBmSXNYTUw7Ci0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCS8vcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQkvL2ZVbmljb2RlID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJLy9mVW5pY29kZSA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCS8vZlVuaWNvZGUgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW07Ci0JfQotCi0JZmluYWwgcHJpdmF0ZSB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vcHJpdmF0ZSBTdHJpbmcgZlVuaWNvZGU7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRva2VuaXplci4KLQkgKi8KLQlwcml2YXRlIFhNTEhlYWRUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzWE1MLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCX0KLQkJcmV0dXJuIGZJc1hNTDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVhNTEhlYWRUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJSGVhZFBhcnNlclRva2VuIHRva2VuID0gbnVsbDsKLQkJU3RyaW5nIHRva2VuVHlwZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJZlJlYWRlci5yZXNldCgpOwotCQkJCS8vIHRoaXMgaXMgKG9idmlvdXNseSkgbm90IGFsd2F5cyB0cnVlLgotCQkJCS8vIFRPRE86IG5lZWQgdG8gZml4IHNvIHdlICJyZW1lbWJlciIgb3JpZ2luYWwgaUZpbGUgb3IKLQkJCQkvLyBpbnB1dHN0cmVhbSwgYW5kCi0JCQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIElucHV0U3RyZWFtUmVhZGVyLgotCQkJCS8vIEknbSBub3Qgc3VyZSB3aGF0IHRvIGRvIGZvciB0aGUgc2V0KHJlYWRlcikgY2FzZSAuLi4gaWYgaXRzCi0JCQkJLy8gZXZlbiByZWxldmVudC4KLQkJCQkvLyBwbHVzLCBlbnN1cmUgYWdhaW5zdCBpbmZpbml0ZSBsb29wcyEKLQkJCQlmSXNYTUwgPSB0cnVlOwotCQkJCS8vZlJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmUmVhZGVyLCBmVW5pY29kZSk7Ci0JCQkJLy8gcGFyc2VJbnB1dCgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJZklzWE1MID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmSXNYTUwgPSBmYWxzZTsKLQkJLy9mVW5pY29kZSA9IG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzZXRBbGwoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpRmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBNQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCXNldChyZXNldHRhYmxlU3RyZWFtKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDJlM2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiA0LzYvMDQgMTE6MTMgUE0gKi8KLQotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSA8YQotICogaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleCA8L2E+IDEuMi4yCi0gKiBvbiA0LzYvMDQgMTE6MTMgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTEhlYWRUb2tlbml6ZXIgewotCi0JLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotCS8qKiBsZXhpY2FsIHN0YXRlcyAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA2OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDg7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA0OwotCi0JLyoqCi0JICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLQkgKiBZWV9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsIGF0IHRoZQotCSAqIGJlZ2lubmluZyBvZiBhIGxpbmUgbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHswLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2fTsKLQotCS8qKgotCSAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gIlwxMVwwXDFcNlwxXDdcMlwwXDFcMTFcMjJcMFwxXDZcMVwwXDFcMjdcMlwwIiArICJcMVwzMVwxXDBcMVwzMFwyNFwwXDFcMTJcMVwxMFwxXDI2XDFcMTNcM1wwXDFcMjEiICsgIlwxXDIzXDFcMTdcMVwwXDFcMjVcMVwwXDFcMjRcMlwwXDFcMTZcMVwxNVwxXDIwIiArICJcMVwyMlwxMFwwXDFcMTRcMTJcMFwxXDIxXDFcMjNcMVwxN1wxXDBcMVwyNVwxXDAiICsgIlwxXDI0XDJcMFwxXDE2XDFcMTVcMVwyMFwxXDIyXDEwXDBcMVwxNFwxMDJcMFwxXDQiICsgIlwzXDBcMVw1XDE3XDBcMVwzXDE2XDBcMVwxXDIwXDBcMVwzXDE2XDBcMVwxIiArICJcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQKLQotCS8qKgotCSAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXJbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0JLyogZXJyb3IgY29kZXMgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0JLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLCAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLCAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSJ9OwotCi0JLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQlwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKioKLQkgKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzIHRoZSBzb3VyY2UKLQkgKiBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQlwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLQkvKioKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQgZnJvbQotCSAqIGlucHV0Ci0JICovCi0JcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkvLyBmdXR1cmVfVE9ETzogcmVtb3ZlIGZyb20gc2tlbGV0b24KLQkvLyBwcml2YXRlIGludCB5eWxpbmU7Ci0JLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXByaXZhdGUgaW50IHl5Y2hhcjsKLQotCS8qKgotCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZQotCSAqIG1hdGNoZWQgdGV4dAotCSAqLwotCS8vIGZ1dHVyZV9UT0RPOiByZW1vdmUgZnJvbSBza2VsZXRvbgotCS8vcHJpdmF0ZSBpbnQgeXljb2x1bW47Ci0JLyoqCi0JICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT50aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLQkvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT50aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0JLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotCS8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDEwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCXB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciBpbikgewotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXl5X3JlYWRlciA9IGluOwotCi0JCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQkJeXlfc3RhdGUgPSAwOwotCi0JCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotCQkvKgotCQkgKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzIHRoZQotCQkgKiBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZwotCQkgKi8KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpIDApOwotCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0JCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9jdXJyZW50UG9zID0gMDsKLQotCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfc3RhcnRSZWFkID0gMDsKLQotCQkvKioKLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCSAqIGZyb20gaW5wdXQKLQkJICovCi0JCXl5X2VuZFJlYWQgPSAwOwotCi0JCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQkvLyBmdXR1cmVfVE9ETzogcmVtb3ZlIGZyb20gc2tlbGV0b24KLQkJLy95eWxpbmUgPSAwOwotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXljaGFyID0gMDsKLQotCQkvKioKLQkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YKLQkJICogdGhlIG1hdGNoZWQgdGV4dAotCQkgKi8KLQkJLy8gZnV0dXJlX1RPRE86IHJlbW92ZSBmcm9tIHNrZWxldG9uCi0JCS8veXljb2x1bW4gPSAwOwotCQkvKioKLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT50aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhCi0JCSAqIGxpbmUKLQkJICovCi0JCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLQkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCQl5eV9hdEVPRiA9IGZhbHNlOwotCi0JCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLQkJZlN0YXRlU3RhY2suY2xlYXIoKTsKLQotCQloYXNNb3JlID0gdHJ1ZTsKLQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0KLQotCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9Ci0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YKLQkgKiB0aGlzIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqICAgICAgICAgICAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLQkgKi8KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotCQl0aGlzLnl5X3JlYWRlciA9IGluOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4gVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMKLQkgKiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLQkgKi8KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0JCXRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFja2VkCi0JICogICAgICAgICAgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotCSAqIEByZXR1cm4gdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0JCWNoYXJbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLQkJaW50IGkgPSAwOyAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICovCi0JCWludCBqID0gMDsgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLQkJd2hpbGUgKGkgPCAxMjgpIHsKLQkJCWludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0JCQlkbwotCQkJCW1hcFtqKytdID0gdmFsdWU7Ci0JCQl3aGlsZSAoLS1jb3VudCA+IDApOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlIGVuZCBvZiB0aGUKLQkgKiAgICAgICAgIHN0cmVhbSBpcyByZWFjaGVkLgotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotCSAqLwotCXByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLQkJLyogc3RhbmRhcmQgY2FzZSAqLwotCQlpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpCi0JCQlyZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLQkJLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLwotCQlpZiAoeXlfYXRFT0YpCi0JCQlyZXR1cm4gWVlFT0Y7Ci0KLQkJLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLQkJLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLQkJaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X2J1ZmZlciwgMCwgeXlfZW5kUmVhZCAtIHl5X3N0YXJ0UmVhZCk7Ci0KLQkJCS8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0JCQl5eV9lbmRSZWFkIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X2N1cnJlbnRQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfbWFya2VkUG9zIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X3B1c2hiYWNrUG9zIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0JCX0KLQotCQkvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0JCWlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCS8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotCQkJY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MgKiAyXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotCQkJeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotCQl9Ci0KLQkJLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0JCWludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCB5eV9idWZmZXIubGVuZ3RoIC0geXlfZW5kUmVhZCk7Ci0KLQkJaWYgKG51bVJlYWQgPT0gLTEpCi0JCQlyZXR1cm4gWVlFT0Y7Ci0KLQkJeXlfZW5kUmVhZCArPSBudW1SZWFkOwotCi0JCXJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQl9Ci0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXl5X2F0RU9GID0gdHJ1ZTsgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLQkJeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgLyogaW52YWxpZGF0ZSBidWZmZXIgKi8KLQkJeXlfcmVhZGVyLmNsb3NlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0JICovCi0JZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotCQlyZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotCSAqIAotCSAqIEBwYXJhbSBuZXdTdGF0ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcyAtIHl5X3N0YXJ0UmVhZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotCSAqLwotCWZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0JCXJldHVybiB5eV9tYXJrZWRQb3MgLSB5eV9zdGFydFJlYWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JDb2RlCi0JICogICAgICAgICAgICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0JCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLQkJfQotCi0JCS8vIFN5c3RlbS5leGl0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBudW1iZXIKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLiBUaGlzIG51bWJlciBtdXN0Ci0JICogICAgICAgICAgICBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0JICovCi0JcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotCQlpZiAobnVtYmVyID4geXlsZW5ndGgoKSkKLQkJCXl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotCQl5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotCX0KLQotCi0JLyoqCi0JICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsIHdoZW4gdGhlCi0JICogZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotCSAqLwotCXByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0JCWlmICgheXlfZW9mX2RvbmUpIHsKLQkJCXl5X2VvZl9kb25lID0gdHJ1ZTsKLQkJCWhhc01vcmUgPSBmYWxzZTsKLQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLCB0aGUgZW5kCi0JICogb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IHRva2VuCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlpbnQgeXlfaW5wdXQ7Ci0JCWludCB5eV9hY3Rpb247Ci0KLQotCQl3aGlsZSAodHJ1ZSkgewotCi0JCQl5eWNoYXIgKz0geXlsZW5ndGgoKTsKLQotCQkJeXlfYXRCT0wgPSB5eV9tYXJrZWRQb3MgPD0gMCB8fCB5eV9idWZmZXJbeXlfbWFya2VkUG9zIC0gMV0gPT0gJ1xuJzsKLQkJCWlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcyAtIDFdID09ICdccicpIHsKLQkJCQl5eV9hdEJPTCA9IHl5X2FkdmFuY2UoKSAhPSAnXG4nOwotCQkJCWlmICgheXlfYXRFT0YpCi0JCQkJCXl5X2N1cnJlbnRQb3MtLTsKLQkJCX0KLQotCQkJeXlfYWN0aW9uID0gLTE7Ci0KLQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLQkJCWlmICh5eV9hdEJPTCkKLQkJCQl5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGUgKyAxXTsKLQkJCWVsc2UKLQkJCQl5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLQkJCXl5X2ZvckFjdGlvbiA6IHsKLQkJCQl3aGlsZSAodHJ1ZSkgewotCi0JCQkJCXl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0JCQkJCWlmICh5eV9pbnB1dCA9PSBZWUVPRikKLQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQotCQkJCQl5eV9pbnB1dCA9IHl5Y21hcFt5eV9pbnB1dF07Ci0KLQkJCQkJYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4geXlfbm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotCQkJCQl5eV9mb3JOZXh0IDogewotCQkJCQkJc3dpdGNoICh5eV9zdGF0ZSkgewotCQkJCQkJCWNhc2UgMCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDExOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDEyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyNCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyNCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyMyA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA0IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDEyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDEzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxNCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxNyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyMiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMjQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMjYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDI5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDMzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTIgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzOCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNDMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNDQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNDUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE0IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNDYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNDcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDUyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDUzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQl5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHl5X2lzRmluYWwpIHsKLQkJCQkJCXl5X2FjdGlvbiA9IHl5X3N0YXRlOwotCQkJCQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJCQkJCWlmICh5eV9ub0xvb2tBaGVhZCkKLQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCi0JCQlzd2l0Y2ggKHl5X2FjdGlvbikgewotCi0JCQkJY2FzZSAyNSA6IHsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA1NSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjEgOiB7Ci0JCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA1NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTUgOgotCQkJCWNhc2UgMTYgOiB7Ci0JCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCXl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOwotCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCX0KLQkJCQljYXNlIDU3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOCA6Ci0JCQkJY2FzZSAyOSA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDU4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOSA6IHsKLQkJCQkJeXlwdXNoYmFjaygyKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDU5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MSA6IHsKLQkJCQkJeXlwdXNoYmFjaygyKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDYwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA3IDoKLQkJCQljYXNlIDggOgotCQkJCWNhc2UgOSA6Ci0JCQkJY2FzZSAxMCA6Ci0JCQkJY2FzZSAxMSA6Ci0JCQkJY2FzZSAxMiA6Ci0JCQkJY2FzZSAxMyA6Ci0JCQkJY2FzZSAxNCA6Ci0JCQkJY2FzZSAxNyA6IHsKLQkJCQkJaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7Ci0JCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2FzZSA2MSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzAgOiB7Ci0JCQkJCWlmICh5eWNoYXIgPT0gMCkgewotCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2FzZSA2MiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzEgOiB7Ci0JCQkJCWlmICh5eWNoYXIgPT0gMCkgewotCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2FzZSA2MyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDIgOiB7Ci0JCQkJCWlmICh5eWNoYXIgPT0gMCkgewotCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXNlIDY0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OSA6IHsKLQkJCQkJaWYgKHl5Y2hhciA9PSAwKSB7Ci0JCQkJCQl5eWJlZ2luKFNUX1hNTERlY2wpOwotCQkJCQkJcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0OwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhc2UgNjUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDM2IDogewotCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsKLQkJCQl9Ci0JCQkJY2FzZSA2NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNTMgOiB7Ci0JCQkJCXB1c2hDdXJyZW50U3RhdGUoKTsKLQkJCQkJeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7Ci0JCQkJCXJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOwotCQkJCX0KLQkJCQljYXNlIDY3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMyA6IHsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA2OCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjAgOgotCQkJCWNhc2UgMjIgOgotCQkJCWNhc2UgMjQgOgotCQkJCWNhc2UgMjYgOiB7Ci0JCQkJCXN0cmluZy5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCX0KLQkJCQljYXNlIDY5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOSA6IHsKLQkJCQkJeXliZWdpbihTUV9TVFJJTkcpOwotCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCX0KLQkJCQljYXNlIDcwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOCA6IHsKLQkJCQkJeXliZWdpbihEUV9TVFJJTkcpOwotCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCX0KLQkJCQljYXNlIDcxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNyA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDcyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotCQkJCQkJeXlfYXRFT0YgPSB0cnVlOwotCQkJCQkJeXlfZG9fZW9mKCk7Ci0JCQkJCQl7Ci0JCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotCSAqIAotCSAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4gSXQgcHJpbnRzCi0JICogZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkLCBvcgotCSAqIGFuIGVycm9yIG9jY3VyZWQuCi0JICogCi0JICogQHBhcmFtIGFyZ3YKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuIHRoZSBzY2FubmVyCi0JICogICAgICAgICAgICBvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotCQkJWE1MSGVhZFRva2VuaXplciBzY2FubmVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc2Nhbm5lciA9IG5ldyBYTUxIZWFkVG9rZW5pemVyKG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkpOwotCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIgKyBhcmd2W2ldICsgIlwiIik7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCQkvLwkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIiArIGFyZ3ZbaV0gKyAiXCIiKTsKLQkJCS8vCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJLy8JCQl9Ci0JCQljYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBYTUxIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJZG8gewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci5wcmltR2V0TmV4dFRva2VuKCkpOwotCQkJCX0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJBbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Iik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2EyMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotCi07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MSGVhZFRva2VuaXplckNvbnN0YW50cyBleHRlbmRzIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzIHsKLQotCWZpbmFsIFN0cmluZyBYTUxEZWNsRW5kID0gIlhNTERlY2xFbmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlY2xTdGFydCA9ICJYTUxEZWNsU3RhcnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlbEVuY29kaW5nID0gIlhNTERlbEVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCS8vCWZpbmFsIFN0cmluZyBYTUxEZWNsVmVyc2lvbiA9ICJYTUxEZWNsVmVyc2lvbiI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyMWIyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQlwcml2YXRlIFhNTEhlYWRUb2tlbml6ZXIgZlRva2VuaXplcjsKLQotCXByaXZhdGUgYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0oU3RyaW5nIHRva2VuVHlwZSkgewotCQlib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IGZhbHNlOwotCQlpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2QkUiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCX0gZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gYnkgZGVmYXVsdCwgVVRGLTggYXMgcGVyIFhNTCBzcGVjCi0JCWZpbmFsIFN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbmM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJLy8gVE9ETzogbmVlZCB0byB3b3JrIG9uICdyZXNldCcgaW4gdG9rZW5pemVyLCBzbyBuZXcgaW5zdGFuY2UgaXNuJ3QKLQkJLy8gYWx3YXlzIG5lZWRlZAotCQkvL2lmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJZlRva2VuaXplciA9IG5ldyBYTUxIZWFkVG9rZW5pemVyKCk7Ci0JCS8vfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMZWdhbFN0cmluZyhTdHJpbmcgdmFsdWVUb2tlblR5cGUpIHsKLQkJaWYgKHZhbHVlVG9rZW5UeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkgewotCQkJCS8vIHNpZGUgZWZmZWN0IG9mIGNhbkhhbmRsZSBpcyB0byBjcmVhdGUgYXBwcm9wcmlhdGUgbWVtZW50bwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodG9rZW5UeXBlKSkgewotCQkJCQkJCVN0cmluZyBlbmMgPSB0b2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQkJCQkJCX0KLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BdHRySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BdHRySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTlmNTEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQXR0ckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQXR0ckltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEF0dHJJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBYTUxBdHRyIHsKLQlwcml2YXRlIElUZXh0UmVnaW9uIGVxdWFsUmVnaW9uID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLQlwcml2YXRlIEVsZW1lbnRJbXBsIG93bmVyRWxlbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVTb3VyY2UgPSBudWxsOwotCi0JLyoqCi0JICogQXR0ckltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0ckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQXR0ckltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQXR0ckltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0ckltcGwoQXR0ckltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGF0Lm5hbWU7Ci0JCQl0aGlzLnZhbHVlU291cmNlID0gdGhhdC5nZXRWYWx1ZVNvdXJjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQXR0ckltcGwgY2xvbmVkID0gbmV3IEF0dHJJbXBsKHRoaXMpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBnZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGVsZW1lbnQuZ2V0RGVjbGFyYXRpb24oKTsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW5kT2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWludCBvZmZzZXQgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMudmFsdWVSZWdpb24uZ2V0RW5kKCkpOwotCQl9Ci0JCWlmICh0aGlzLmVxdWFsUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy5lcXVhbFJlZ2lvbi5nZXRFbmQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMubmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMubmFtZVJlZ2lvbi5nZXRFbmQoKSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogZ2V0RXF1YWxSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVRleHRSZWdpb24KLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RXF1YWxSZWdpb24oKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFsUmVnaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gdGhpcy5uYW1lLmluZGV4T2YoJzonKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCXJldHVybiB0aGlzLm5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZVJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JVGV4dFJlZ2lvbgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lUmVnaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lUmVnaW9uU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lUmVnaW9uVGV4dCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCh0aGlzLm5hbWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvblRleHRFbmRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQodGhpcy5uYW1lUmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJU3RyaW5nIG5zQXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAocHJlZml4LmVxdWFscyhYTUxOYW1lc3BhY2UuWE1MTlMpKSB7Ci0JCQkJLy8gZml4ZWQgVVJJCi0JCQkJcmV0dXJuIFhNTE5hbWVzcGFjZS5YTUxOU19VUkk7Ci0JCQl9Ci0JCQluc0F0dHJOYW1lID0gWE1MTmFtZXNwYWNlLlhNTE5TX1BSRUZJWCArIHByZWZpeDsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhYTUxOYW1lc3BhY2UuWE1MTlMpKSB7Ci0JCQkJLy8gZml4ZWQgVVJJCi0JCQkJcmV0dXJuIFhNTE5hbWVzcGFjZS5YTUxOU19VUkk7Ci0JCQl9Ci0JCQkvLyBkb2VzIG5vdCBpbmhlcml0IG5hbWVzcGFjZSBmcm9tIG93bmVyIGVsZW1lbnQKLQkJCS8vIGlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSByZXR1cm4KLQkJCS8vIHRoaXMub3duZXJFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlVVJJOwotCQl9Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSB0aGlzLm93bmVyRWxlbWVudDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWJyZWFrOwotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobnNBdHRyTmFtZSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUkk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQVRUUklCVVRFX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRPd25lckVsZW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0T3duZXJFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5vd25lckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSB0aGlzLm5hbWUuaW5kZXhPZignOicpOwotCQlpZiAoaW5kZXggPD0gMCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBleGNsdWRlIEpTUCB0YWcgaW4gbmFtZQotCQlpZiAodGhpcy5uYW1lLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMubmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGdldFNwZWNpZmllZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0T2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJaW50IG9mZnNldCA9IHRoaXMub3duZXJFbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmICh0aGlzLm5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLm5hbWVSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMuZXF1YWxSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLmVxdWFsUmVnaW9uLmdldFN0YXJ0KCkpOwotCQl9Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy52YWx1ZVJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0VmFsdWUoZ2V0VmFsdWVTb3VyY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB2YWx1ZSBmb3IgdGhlIHNvdXJjZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJaWYgKHNvdXJjZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHNvdXJjZTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoJzsnLCByZWYgKyAxKTsKLQkJCWlmIChlbmQgPiByZWYgKyAxKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHJlZiArIDEsIGVuZCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gZ2V0Q2hhclZhbHVlKG5hbWUpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCQkJaWYgKHJlZiA+IG9mZnNldCkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIHJlZikpOwotCQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCQkJb2Zmc2V0ID0gZW5kICsgMTsKLQkJCQkJcmVmID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJCXJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJywgcmVmICsgMSk7Ci0JCX0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZTsKLQkJaWYgKGxlbmd0aCA+IG9mZnNldCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlUmVnaW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFZhbHVlUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZVJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHRoaXMudmFsdWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVSZWdpb25UZXh0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIGF0dHJpYnV0ZXMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQodGhpcy52YWx1ZVJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpIHsKLQkJaWYgKHRoaXMudmFsdWVTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLnZhbHVlU291cmNlOwotCQkvLyBEVzogNC8xNi8yMDAzIGR1ZSB0byBjaGFuZ2UgaW4gc3RydWN0dXJlZERvY3VtZW50IC4uLiB3ZSBuZWVkIGEKLQkJLy8gZmxhdG5vZGUgdG8KLQkJLy8gZ2V0IGF0IHJlZ2lvbiB2YWx1ZXMuIEZvciBub3cgSSdsbCBhc3N1bWUgdGhpcyBpcyBhbHdheXMgdGhlIGZpcnN0Ci0JCS8vIGZsYXRub2RlIC4uIG1heSBuZWVkIHRvIG1ha2Ugc21hcnRlciBsYXRlciAoZS5nLiB0byBzZWFyY2ggZm9yCi0JCS8vIHRoZSBmbGF0bm9kZSB0aGF0IHRoaXMudmFsdWVSZWdpb24gYmVsb25ncyB0by4KLQkJLy8gRFc6IDQvMzAvMjAwMyBGb3Igc29tZSByZWFzb24sIHRoaXMgbWV0aG9kIGlzIGdldHRpbmcgY2FsbGVkIGEgbG90Ci0JCS8vIE5vdCBzdXJlIGlmIGl0cyBhIHRocmVhZGluZyBwcm9ibGVtLCBvciBhIGZ1bmRhbWVudGFsIGVycm9yCi0JCS8vIGVsc2V3aGVyZS4KLQkJLy8gSXQgbmVlZHMgbW9yZSBpbnZlc3RpZ2F0aW9uLCBidXQgaW4gdGhlIHVzZSBjYXNlcyBJJ3ZlIHNlZW4sCi0JCS8vIGRvZXNuJ3QKLQkJLy8gc2VlbSB0byBodXJ0IHRvIHNpbXBseSByZXR1cm4gbnVsbCBpbiB0aG9zZSBjYXNlcy4gSSBzYXcgdGhpcyBudWxsCi0JCS8vIGNhc2UsCi0JCS8vIHdoZW4gdHJ5aW50IGdvIGZvcm1hdCBhbiBYTUwgZmlsZS4KLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvd25lclJlZ2lvbiA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChvd25lclJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUob3duZXJSZWdpb24sIHRoaXMudmFsdWVSZWdpb24pOwotCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlU291cmNlKEVsZW1lbnRJbXBsIG93bmVyRWxlbWVudCkgewotCQlpZiAodGhpcy52YWx1ZVNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMudmFsdWVTb3VyY2U7Ci0JCS8vIERXOiA0LzE2LzIwMDMgZHVlIHRvIGNoYW5nZSBpbiBzdHJ1Y3R1cmVkRG9jdW1lbnQgLi4uIHdlIG5lZWQgYQotCQkvLyBmbGF0bm9kZSB0bwotCQkvLyBnZXQgYXQgcmVnaW9uIHZhbHVlcy4gRm9yIG5vdyBJJ2xsIGFzc3VtZSB0aGlzIGlzIGFsd2F5cyB0aGUgZmlyc3QKLQkJLy8gZmxhdG5vZGUgLi4gbWF5IG5lZWQgdG8gbWFrZSBzbWFydGVyIGxhdGVyIChlLmcuIHRvIHNlYXJjaCBmb3IKLQkJLy8gdGhlIGZsYXRub2RlIHRoYXQgdGhpcy52YWx1ZVJlZ2lvbiBiZWxvbmdzIHRvLgotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKG93bmVyRWxlbWVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgdGhpcy52YWx1ZVJlZ2lvbik7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHZhbHVlOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaW50IGFtcCA9IHZhbHVlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKGFtcCA+PSAwKSB7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA0KTsKLQkJCWlmIChhbXAgPiBvZmZzZXQpCi0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZS5zdWJzdHJpbmcob2Zmc2V0LCBhbXApKTsKLQkJCWJ1ZmZlci5hcHBlbmQoWE1MQ2hhckVudGl0eS5BTVBfUkVGKTsKLQkJCW9mZnNldCA9IGFtcCArIDE7Ci0JCQlhbXAgPSB2YWx1ZS5pbmRleE9mKCcmJywgb2Zmc2V0KTsKLQkJfQotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCWlmIChsZW5ndGggPiBvZmZzZXQpCi0JCQlidWZmZXIuYXBwZW5kKHZhbHVlLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIEF0dHIgaGFzIEpTUCBpbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0pTUFZhbHVlKCkgewotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISh0aGlzLnZhbHVlUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIHRoaXMudmFsdWVSZWdpb24pLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIEF0dHIgaGFzIG9ubHkgbmFtZSBidXQgbm90IGVxdWFsIHNpZ24gbm9yIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTmFtZU9ubHkoKSB7Ci0JCXJldHVybiAodGhpcy5uYW1lUmVnaW9uICE9IG51bGwgJiYgdGhpcy5lcXVhbFJlZ2lvbiA9PSBudWxsICYmIHRoaXMudmFsdWVSZWdpb24gPT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzUHJlZml4KCkgewotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLm5hbWUuaW5kZXhPZignOicpIDw9IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiBuYW1lCi0JCWlmICh0aGlzLm5hbWUuY2hhckF0KDApID09ICc8JykKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaWdub3JlQ2FzZSgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLm93bmVyRWxlbWVudC5pZ25vcmVDYXNlKCkpIHsKLQkJCQlyZXR1cm4gIWhhc1ByZWZpeCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaWdub3JlQ2FzZSgpKSB7Ci0JCQkJLy8gZXZlbiBpbiBjYXNlIGluc2Vuc2l0aXZlIGRvY3VtZW50LCBpZiBoYXZpbmcgcHJlZml4LCBpdCdzCi0JCQkJLy8gY2FzZSBzZW5zaXRpdmUKLQkJCQlyZXR1cm4gIWhhc1ByZWZpeCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbEF0dHIoKSB7Ci0JCWlmIChoYXNQcmVmaXgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0aGlzLm93bmVyRWxlbWVudC5pc0dsb2JhbFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWE1MQXR0cigpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmICghdGhpcy5vd25lckVsZW1lbnQuaXNYTUxUYWcoKSkgewotCQkJCXJldHVybiBoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmICFkb2N1bWVudC5pc1hNTFR5cGUoKSkgewotCQkJCS8vIGV2ZW4gaW4gbm9uLVhNTCBkb2N1bWVudCwgaWYgaGF2aW5nIHByZWZpeCwgaXQncyBYTUwgdGFnCi0JCQkJcmV0dXJuIGhhc1ByZWZpeCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIG1hdGNoTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuICh0aGlzLm5hbWUgPT0gbnVsbCk7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFpZ25vcmVDYXNlKCkpCi0JCQlyZXR1cm4gdGhpcy5uYW1lLmVxdWFscyhuYW1lKTsKLQkJcmV0dXJuIHRoaXMubmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlOYW1lQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMub3duZXJFbGVtZW50LmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbEltcGwgbW9kZWwgPSAoWE1MTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwubmFtZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMub3duZXJFbGVtZW50LmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbEltcGwgbW9kZWwgPSAoWE1MTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwudmFsdWVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZVJlZ2lvbnMgbWV0aG9kCi0JICovCi0Jdm9pZCByZW1vdmVSZWdpb25zKCkgewotCQl0aGlzLm5hbWVSZWdpb24gPSBudWxsOwotCQl0aGlzLnZhbHVlUmVnaW9uID0gbnVsbDsKLQkJdGhpcy5lcXVhbFJlZ2lvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoKSB7Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZSgpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoRWxlbWVudEltcGwgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZShvd25lckVsZW1lbnQpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0RXF1YWxSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVxdWFsUmVnaW9uCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVRleHRSZWdpb24KLQkgKi8KLQl2b2lkIHNldEVxdWFsUmVnaW9uKElUZXh0UmVnaW9uIGVxdWFsUmVnaW9uKSB7Ci0JCXRoaXMuZXF1YWxSZWdpb24gPSBlcXVhbFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCkgewotCQkJdmFsdWUgPSBnZXRWYWx1ZSgpOwotCQkJc3RhcnRPZmZzZXQgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQkJdGhpcy5vd25lckVsZW1lbnQubm90aWZ5KENIQU5HRSwgdGhpcywgdmFsdWUsIG51bGwsIHN0YXJ0T2Zmc2V0KTsKLQkJfQotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCkgewotCQkJdGhpcy5vd25lckVsZW1lbnQubm90aWZ5KENIQU5HRSwgdGhpcywgbnVsbCwgdmFsdWUsIHN0YXJ0T2Zmc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldE5hbWVSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWVSZWdpb24KLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JVGV4dFJlZ2lvbgotCSAqLwotCXZvaWQgc2V0TmFtZVJlZ2lvbihJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uKSB7Ci0JCXRoaXMubmFtZVJlZ2lvbiA9IG5hbWVSZWdpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0JfQotCi0JLyoqCi0JICogc2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldFZhbHVlKG5vZGVWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0T3duZXJFbGVtZW50IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckVsZW1lbnQoRWxlbWVudCBvd25lckVsZW1lbnQpIHsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG93bmVyRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsICYmICF0aGlzLm93bmVyRWxlbWVudC5pc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IHByZWZpeExlbmd0aCA9IChwcmVmaXggIT0gbnVsbCA/IHByZWZpeC5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gZ2V0TG9jYWxOYW1lKCk7Ci0JCWlmIChwcmVmaXhMZW5ndGggPT0gMCkgewotCQkJc2V0TmFtZShsb2NhbE5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChsb2NhbE5hbWUgPT0gbnVsbCkKLQkJCWxvY2FsTmFtZSA9IG5ldyBTdHJpbmcoKTsKLQkJaW50IGxvY2FsTGVuZ3RoID0gbG9jYWxOYW1lLmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXhMZW5ndGggKyAxICsgbG9jYWxMZW5ndGgpOwotCQlidWZmZXIuYXBwZW5kKHByZWZpeCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJzonKTsKLQkJYnVmZmVyLmFwcGVuZChsb2NhbE5hbWUpOwotCQlzZXROYW1lKGJ1ZmZlci50b1N0cmluZygpKTsKLQotCQlub3RpZnlOYW1lQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldFZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkvLyBSZW1lbWJlcjogYXMgd2UgYWNjb3VudCBmb3IgImZsb2F0ZXJzIiBpbgotCQkvLyBmdXR1cmUsIHJlbWVtYmVyIHRoYXQgc29tZSBhcmUgY3JlYXRlZAotCQkvLyBpbiB0aGUgbmF0dXJhbCBwcm9jZXNzIG9mIGltcGxlbWVudGluZwotCQkvLyBET00gYXBpcy4KLQkJLy8gdGhpcyAic2VsZiBub3RpZmljYXRpb24iIG9mIGFib3V0L2NoYW5nZWQsCi0JCS8vIGlzIGFkZGVkIGZvciB0aGlzIGNhc2UsIGJlY2F1c2UgaXQga25vd24gdG8KLQkJLy8gYmUgY2FsbGVkIGZyb20gcHJvcGVydGllcyBwYWdlcy4gU2hvdWxkIGJlIGEKLQkJLy8gYWRkZWQgdG8gYWxsIERPTSBNb2RpZml5aW5nIEFQSXMgZXZlbnR1YWxseS4KLQkJdHJ5IHsKLQkJCWdldE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQlzZXRWYWx1ZVNvdXJjZShnZXRWYWx1ZVNvdXJjZSh2YWx1ZSkpOwotCQl9IGZpbmFsbHkgewotCQkJZ2V0TW9kZWwoKS5jaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldFZhbHVlUmVnaW9uIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZVJlZ2lvbgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uCi0JICovCi0Jdm9pZCBzZXRWYWx1ZVJlZ2lvbihJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbikgewotCQl0aGlzLnZhbHVlUmVnaW9uID0gdmFsdWVSZWdpb247Ci0JCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKQotCQkJdGhpcy52YWx1ZVNvdXJjZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCAmJiAhdGhpcy5vd25lckVsZW1lbnQuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBzb3VyY2U7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NEQVRBU2VjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1NGNhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NEQVRBU2VjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQ0RBVEFTZWN0aW9uSW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ0RBVEFTZWN0aW9uSW1wbCBleHRlbmRzIFRleHRJbXBsIGltcGxlbWVudHMgQ0RBVEFTZWN0aW9uIHsKLQotCS8qKgotCSAqIENEQVRBU2VjdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ0RBVEFTZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDREFUQVNlY3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIENEQVRBU2VjdGlvbkltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ0RBVEFTZWN0aW9uSW1wbChDREFUQVNlY3Rpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDREFUQVNlY3Rpb25JbXBsIGNsb25lZCA9IG5ldyBDREFUQVNlY3Rpb25JbXBsKHRoaXMpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIGluc3RlYWQgb2Ygc3VwZXIoVGV4dEltcGwpLmdldERhdGEoKSwgY2FsbCBnZXRDaGFyYWN0ZXJEYXRhKCkKLQkJU3RyaW5nIGRhdGEgPSBnZXRDaGFyYWN0ZXJEYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWRhdGEgPSBnZXREYXRhKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJCWlmIChkYXRhID09IG51bGwpCi0JCQkJZGF0YSA9IG5ldyBTdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbiBjb250ZW50UmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNvbnRlbnRSZWdpb24gPT0gbnVsbCkgeyAvLyBmaXJzdCBjb250ZW50Ci0JCQkJY29udGVudFJlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0gZWxzZSB7IC8vIG11bHRpcGxlIGNvbnRlbnRzCi0JCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZmxhdE5vZGUuZ2V0VGV4dChjb250ZW50UmVnaW9uKSk7Ci0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pKTsKLQkJCX0KLQkJfQotCi0JCWlmIChidWZmZXIgIT0gbnVsbCkKLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJaWYgKGNvbnRlbnRSZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRUZXh0KGNvbnRlbnRSZWdpb24pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiNjZGF0YS1zZWN0aW9uIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENEQVRBX1NFQ1RJT05fTk9ERTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOyAvLyB3aWxsIGJlIGdlbmVyYXRlZAotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ01Ob2RlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DTU5vZGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZWNmYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DTU5vZGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENNTm9kZVV0aWwgewotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKEF0dHJJbXBsKSBhdHRyKS5nZXREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKEVsZW1lbnRJbXBsKSBlbGVtZW50KS5nZXREZWNsYXJhdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhcmFjdGVyRGF0YUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhcmFjdGVyRGF0YUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0YTJkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJhY3RlckRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuanNwLm1vZGVsLnBhcnNlci50ZW1wLlhNTEpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBDaGFyYWN0ZXJEYXRhSW1wbCBjbGFzcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hhcmFjdGVyRGF0YUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIFhNTEpTUFJlZ2lvbkNvbnRleHRzLCBDaGFyYWN0ZXJEYXRhIHsKLQotCXByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyRGF0YUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hhcmFjdGVyRGF0YUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyRGF0YUltcGwoQ2hhcmFjdGVyRGF0YUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRhdGEgPSB0aGF0LmdldERhdGEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGVuZERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSBhcmc7Ci0JCWVsc2UKLQkJCWRhdGEgKz0gYXJnOwotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmIChjb3VudCA8IDAgfHwgb2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChvZmZzZXQgPT0gMCkgewotCQkJaWYgKGNvdW50ID4gbGVuZ3RoKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBuZXcgU3RyaW5nKCk7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGNvdW50KTsKLQkJfSBlbHNlIHsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCWlmIChlbmQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpOwotCQkJZWxzZQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgZGF0YS5zdWJzdHJpbmcoZW5kKTsKLQkJfQotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0Q2hhcmFjdGVyRGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZGF0YS5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGFyZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlkYXRhID0gYXJnOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlkYXRhID0gYXJnICsgZGF0YTsKLQkJfSBlbHNlIHsKLQkJCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKG9mZnNldCA9PSBsZW5ndGgpCi0JCQkJZGF0YSArPSBhcmc7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBhcmcgKyBkYXRhLnN1YnN0cmluZyhvZmZzZXQpOwotCQl9Ci0JCXNldERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BDb250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQQ29udGVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlyZXR1cm4gZWxlbWVudC5pc0pTUENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKGFyZyA9PSBudWxsKSB7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlpbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKGNvdW50ID09IGxlbmd0aCkKLQkJCQlkYXRhID0gYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBhcmcgKyBkYXRhLnN1YnN0cmluZyhjb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCWlmIChlbmQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnICsgZGF0YS5zdWJzdHJpbmcoZW5kKTsKLQkJfQotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQl0aGlzLmRhdGEgPSBnZXREYXRhKCk7Ci0JCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5kYXRhID0gZGF0YTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGVWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0RGF0YShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLmRhdGEgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHN1YnN0cmluZ0RhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHN1YnN0cmluZ0RhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID09IDAgJiYgY291bnQgPT0gbGVuZ3RoKQotCQkJcmV0dXJuIGRhdGE7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJaWYgKGVuZCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGRhdGEuc3Vic3RyaW5nKG9mZnNldCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldE5vZGVOYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RGF0YSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOGQyNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db21tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBDb21tZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEltcGwgZXh0ZW5kcyBDaGFyYWN0ZXJEYXRhSW1wbCBpbXBsZW1lbnRzIENvbW1lbnQgewotCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQVGFnID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21tZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBDb21tZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21tZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBDb21tZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBDb21tZW50SW1wbChDb21tZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuaXNKU1BUYWcgPSB0aGF0LmlzSlNQVGFnOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDb21tZW50SW1wbCBjbG9uZWQgPSBuZXcgQ29tbWVudEltcGwodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGRhdGEgPSBnZXRDaGFyYWN0ZXJEYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWRhdGEgPSBnZXREYXRhKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJCWlmIChkYXRhID09IG51bGwpCi0JCQkJZGF0YSA9IG5ldyBTdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbiBjb250ZW50UmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiB8fCByZWdpb25UeXBlID09IEpTUF9DT01NRU5UX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gSlNQX0NPTU1FTlRfQ0xPU0UpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb250ZW50UmVnaW9uID09IG51bGwpIHsgLy8gZmlyc3QgY29udGVudAotCQkJCWNvbnRlbnRSZWdpb24gPSByZWdpb247Ci0JCQl9IGVsc2UgeyAvLyBtdWx0aXBsZSBjb250ZW50cwotCQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbikpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCWlmIChjb250ZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dChjb250ZW50UmVnaW9uKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjY29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDT01NRU5UX05PREU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1AgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BUYWcoKSB7Ci0JCXJldHVybiB0aGlzLmlzSlNQVGFnOwotCX0KLQotCS8qKgotCSAqIHNldEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKU1BUYWcoYm9vbGVhbiBpc0pTUFRhZykgewotCQlpZiAoaXNKU1BUYWcgPT0gdGhpcy5pc0pTUFRhZykKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGlzSlNQVGFnKSB7Ci0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCAhZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5pc0pTUFRhZyA9IGlzSlNQVGFnOwotCi0JCWlmIChnZXRDb250YWluZXJEb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgaW4gdGhlIHRyZWUsIHVwZGF0ZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JCQlzZXREYXRhKGdldERhdGEoKSk7IC8vIGNhbGxzIG5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZyYWdtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZyYWdtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjA1OGE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGcmFnbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIERvY3VtZW50RnJhZ21lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEZyYWdtZW50SW1wbCBleHRlbmRzIE5vZGVDb250YWluZXIgaW1wbGVtZW50cyBEb2N1bWVudEZyYWdtZW50IHsKLQotCS8qKgotCSAqIERvY3VtZW50RnJhZ21lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50RnJhZ21lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERvY3VtZW50RnJhZ21lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnRJbXBsCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50RnJhZ21lbnRJbXBsKERvY3VtZW50RnJhZ21lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlEb2N1bWVudEZyYWdtZW50SW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRGcmFnbWVudEltcGwodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjZG9jdW1lbnQtZnJhZ21lbnQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfRlJBR01FTlRfTk9ERTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmNWZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8vIGZvciBvcmcuYXBhY2hlLnhlcmNlcyAzLjIuMQotLy8gaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWxzLlhNTENoYXJhY3RlclByb3BlcnRpZXM7Ci0vLyBETVcgbW9kaWZpZWQgZm9yIFhNTDRKIDQuMC4xCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbnRpdHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5OYW1lVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb21tZW50ZWxlbWVudC5pbXBsLkNvbW1lbnRFbGVtZW50UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LkpTUFRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5SYW5nZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5UcmVlV2Fsa2VyOwotCi0KLS8qKgotICogRG9jdW1lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIGltcGxlbWVudHMgWE1MRG9jdW1lbnQgewotCi0JLyoqCi0JICogSW50ZXJuYWwtdXNlIG9ubHkgY2xhc3MuIFRoaXMgY2xhc3Mgd2FzIGFkZGVkIHRvIGJldHRlciBhYmxlIHRvIGhhbmRsZQotCSAqIHJlcGV0ZXRpdmUgcmVxdWVzdCBmb3IgZ2V0RWxlbWVudHNCeVRhZ05hbWUuIFRoZSBjYWNoZSBpcyBjbGVhcmVkIHdoZW4KLQkgKiBldmVyIHRoZSBkb2N1bWVudCBjaGFuZ2VzIGF0IGFsbCwgc28gc3RpbGwgbm90IHJlYWwgZWZmaWNpZW50LAotCSAqLwotCWNsYXNzIFRhZ05hbWVDYWNoZSB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGFjdGl2ZSA9IHRydWU7Ci0KLQkJcHJpdmF0ZSBNYXAgY2FjaGU7Ci0KLQkJcHVibGljIFRhZ05hbWVDYWNoZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCQljYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGIKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjdGl2YXRlKGJvb2xlYW4gYikgewotCQkJYWN0aXZlID0gYjsKLQkJCWlmICghYikKLQkJCQljbGVhcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkSXRlbShTdHJpbmcgdGFnbmFtZSwgTm9kZUxpc3RJbXBsIG5vZGVsaXN0KSB7Ci0JCQlpZiAodGFnbmFtZSA9PSBudWxsIHx8IG5vZGVsaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJY2FjaGUucHV0KHRhZ25hbWUsIG5vZGVsaXN0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJY2FjaGUuY2xlYXIoKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlTGlzdEltcGwgZ2V0SXRlbShTdHJpbmcgdGFnTmFtZSkgewotCQkJTm9kZUxpc3RJbXBsIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoYWN0aXZlKSB7Ci0JCQkJcmVzdWx0ID0gKE5vZGVMaXN0SW1wbCkgY2FjaGUuZ2V0KHRhZ05hbWUpOwotCQkJCS8vCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkvLwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudHNCeVRhZ25hbWUgZnJvbSBjYWNoZTogIiArCi0JCQkJLy8gdGFnTmFtZSk7Ci0JCQkJLy8JCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCX0KLQotCS8vIHRoaXMgaXMgYSBjb25zdGFudCBqdXN0IHRvIGdpdmUgY29tcGlsZS10aW1lIGNvbnRyb2wgb3ZlcgotCS8vIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgY2FjaGUuIElmLCBpbiBmdXR1cmUsIGl0cyBmb3VuZCB0aGF0Ci0JLy8gdGhlcmUgYXJlIG5vIChvciBmZXcpICJkdXBsaWNhdGUgcmVxdWVzdHMiIC4uLiB0aGVuIHRoaXMgY2FjaGUKLQkvLyBpcyBub3QgbmVlZGVkLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNldGFnbmFtZWNhY2hlID0gdHJ1ZTsKLQlwcml2YXRlIERvY3VtZW50VHlwZUFkYXB0ZXIgZG9jdW1lbnRUeXBlQWRhcHRlciA9IG51bGw7Ci0KLQlwcml2YXRlIFhNTE1vZGVsSW1wbCBtb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBUYWdOYW1lQ2FjaGUgdGFnTmFtZUNhY2hlOwotCi0JLyoqCi0JICogRG9jdW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHVzZXRhZ25hbWVjYWNoZSkgewotCQkJdGFnTmFtZUNhY2hlID0gbmV3IFRhZ05hbWVDYWNoZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIERvY3VtZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEltcGwoRG9jdW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCWlmICh1c2V0YWduYW1lY2FjaGUpIHsKLQkJCXRhZ05hbWVDYWNoZSA9IG5ldyBUYWdOYW1lQ2FjaGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0Jdm9pZCBhY3RpdmF0ZVRhZ05hbWVDYWNoZShib29sZWFuIGIpIHsKLQkJdGFnTmFtZUNhY2hlLmFjdGl2YXRlKGIpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBDaGFuZ2VzIHRoZSA8Y29kZT5vd25lckRvY3VtZW50PC9jb2RlPiBvZiBhIG5vZGUsIGl0cyBjaGlsZHJlbiwgYXMKLQkgKiB3ZWxsIGFzIHRoZSBhdHRhY2hlZCBhdHRyaWJ1dGUgbm9kZXMgaWYgdGhlcmUgYXJlIGFueS4gSWYgdGhlIG5vZGUgaGFzCi0JICogYSBwYXJlbnQgaXQgaXMgZmlyc3QgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgY2hpbGQgbGlzdC4gVGhpcwotCSAqIGVmZmVjdGl2ZWx5IGFsbG93cyBtb3ZpbmcgYSBzdWJ0cmVlIGZyb20gb25lIGRvY3VtZW50IHRvIGFub3RoZXIuIFRoZQotCSAqIGZvbGxvd2luZyBsaXN0IGRlc2NyaWJlcyB0aGUgc3BlY2lmaWNzIGZvciBlYWNoIHR5cGUgb2Ygbm9kZS4KLQkgKiA8ZGw+Ci0JICogPGR0PkFUVFJJQlVURV9OT0RFPC9kdD4KLQkgKiA8ZGQ+VGhlIDxjb2RlPm93bmVyRWxlbWVudDwvY29kZT4gYXR0cmlidXRlIGlzIHNldCB0bwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGFuZCB0aGUgPGNvZGU+c3BlY2lmaWVkPC9jb2RlPiBmbGFnIGlzIHNldCB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IG9uIHRoZSBhZG9wdGVkIDxjb2RlPkF0dHI8L2NvZGU+LiBUaGUKLQkgKiBkZXNjZW5kYW50cyBvZiB0aGUgc291cmNlIDxjb2RlPkF0dHI8L2NvZGU+IGFyZSByZWN1cnNpdmVseSBhZG9wdGVkLgotCSAqIDwvZGQ+Ci0JICogPGR0PkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU8L2R0PgotCSAqIDxkZD5UaGUgZGVzY2VuZGFudHMgb2YgdGhlIHNvdXJjZSBub2RlIGFyZSByZWN1cnNpdmVseSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PkRPQ1VNRU5UX05PREU8L2R0PgotCSAqIDxkZD48Y29kZT5Eb2N1bWVudDwvY29kZT4gbm9kZXMgY2Fubm90IGJlIGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+RE9DVU1FTlRfVFlQRV9OT0RFPC9kdD4KLQkgKiA8ZGQ+PGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBub2RlcyBjYW5ub3QgYmUgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5FTEVNRU5UX05PREU8L2R0PgotCSAqIDxkZD5TcGVjaWZpZWQgYXR0cmlidXRlIG5vZGVzIG9mIHRoZSBzb3VyY2UgZWxlbWVudCBhcmUgYWRvcHRlZCwgYW5kCi0JICogdGhlIGdlbmVyYXRlZCA8Y29kZT5BdHRyPC9jb2RlPiBub2Rlcy4gRGVmYXVsdCBhdHRyaWJ1dGVzIGFyZQotCSAqIGRpc2NhcmRlZCwgdGhvdWdoIGlmIHRoZSBkb2N1bWVudCBiZWluZyBhZG9wdGVkIGludG8gZGVmaW5lcyBkZWZhdWx0Ci0JICogYXR0cmlidXRlcyBmb3IgdGhpcyBlbGVtZW50IG5hbWUsIHRob3NlIGFyZSBhc3NpZ25lZC4gVGhlIGRlc2NlbmRhbnRzCi0JICogb2YgdGhlIHNvdXJjZSBlbGVtZW50IGFyZSByZWN1cnNpdmVseSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PkVOVElUWV9OT0RFPC9kdD4KLQkgKiA8ZGQ+PGNvZGU+RW50aXR5PC9jb2RlPiBub2RlcyBjYW5ub3QgYmUgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5FTlRJVFlfUkVGRVJFTkNFX05PREU8L2R0PgotCSAqIDxkZD5Pbmx5IHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG5vZGUgaXRzZWxmIGlzIGFkb3B0ZWQsCi0JICogdGhlIGRlc2NlbmRhbnRzIGFyZSBkaXNjYXJkZWQsIHNpbmNlIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCi0JICogZG9jdW1lbnRzIG1pZ2h0IGhhdmUgZGVmaW5lZCB0aGUgZW50aXR5IGRpZmZlcmVudGx5LiBJZiB0aGUgZG9jdW1lbnQKLQkgKiBiZWluZyBpbXBvcnRlZCBpbnRvIHByb3ZpZGVzIGEgZGVmaW5pdGlvbiBmb3IgdGhpcyBlbnRpdHkgbmFtZSwgaXRzCi0JICogdmFsdWUgaXMgYXNzaWduZWQuPC9kZD4KLQkgKiA8ZHQ+Tk9UQVRJT05fTk9ERTwvZHQ+Ci0JICogPGRkPjxjb2RlPk5vdGF0aW9uPC9jb2RlPiBub2RlcyBjYW5ub3QgYmUgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUsIFRFWFRfTk9ERSwgQ0RBVEFfU0VDVElPTl9OT0RFLAotCSAqIENPTU1FTlRfTk9ERTwvZHQ+Ci0JICogPGRkPlRoZXNlIG5vZGVzIGNhbiBhbGwgYmUgYWRvcHRlZC4gTm8gc3BlY2lmaWNzLjwvZGQ+Ci0JICogU2hvdWxkIHRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm4gbnVsbCB3aGVuIGl0IGZhaWxzPyBIb3cgImV4Y2VwdGlvbmFsIgotCSAqIGlzIGZhaWx1cmUgZm9yIHRoaXMgbWV0aG9kP1N0aWNrIHdpdGggcmFpc2luZyBleGNlcHRpb25zIG9ubHkgaW4KLQkgKiBleGNlcHRpb25hbCBjaXJjdW1zdGFuY2VzLCByZXR1cm4gbnVsbCBvbiBmYWlsdXJlIChGMkYgMTkgSnVuIDIwMDApLkNhbgotCSAqIGFuIGVudGl0eSBub2RlIHJlYWxseSBiZSBhZG9wdGVkP05vLCBuZWl0aGVyIGNhbiBOb3RhdGlvbiBub2RlcyAoVGVsY29uCi0JICogMTMgRGVjIDIwMDApLkRvZXMgdGhpcyBhZmZlY3Qga2V5cyBhbmQgaGFzaENvZGUncyBvZiB0aGUgYWRvcHRlZAotCSAqIHN1YnRyZWUgbm9kZXM/SWYgc28sIHdoYXQgYWJvdXQgcmVhZG9ubHktbmVzcyBvZiBrZXkgYW5kIGhhc2hDb2RlP2lmCi0JICogbm90LCB3b3VsZCBhcHBlbmRDaGlsZCBhZmZlY3Qga2V5cy9oYXNoQ29kZXMgb3Igd291bGQgaXQgZ2VuZXJhdGUKLQkgKiBleGNlcHRpb25zIGlmIGtleSdzIGFyZSBkdXBsaWNhdGU/IFVwZGF0ZTogSGFzaGNvZGVzIGhhdmUgYmVlbiBkcm9wcGVkLgotCSAqIEdpdmVuIHRoYXQgdGhlIGtleSBpcyBvbmx5IHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudCBhbiBhZG9wdGVkIG5vZGUKLQkgKiBuZWVkcyB0byBiZSBnaXZlbiBhIG5ldyBrZXksIGJ1dCB3aGF0IGRvZXMgaXQgbWVhbiBmb3IgdGhlIGFwcGxpY2F0aW9uPwotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBub2RlIHRvIG1vdmUgaW50byB0aGlzIGRvY3VtZW50LgotCSAqIEByZXR1cm4gVGhlIGFkb3B0ZWQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvcGVyYXRpb24KLQkgKiAgICAgICAgIGZhaWxzLCBzdWNoIGFzIHdoZW4gdGhlIHNvdXJjZSBub2RlIGNvbWVzIGZyb20gYSBkaWZmZXJlbnQKLQkgKiAgICAgICAgIGltcGxlbWVudGF0aW9uLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiB0aGUgc291cmNlIG5vZGUgaXMgb2YgdHlwZQotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkRPQ1VNRU5UPC9jb2RlPiw8Y29kZT5ET0NVTUVOVF9UWVBFPC9jb2RlPi4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgc291cmNlIG5vZGUKLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seS4KLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBhZG9wdE5vZGUob3JnLnczYy5kb20uTm9kZSBzb3VyY2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrVGFnTmFtZVZhbGlkaXR5KFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICghaXNWYWxpZE5hbWUodGFnTmFtZSkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgY3JlYXRlRE9NRXhjZXB0aW9uTWVzc2FnZShET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSLCB0YWdOYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURvY3VtZW50SW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lZC5pbXBvcnRDaGlsZE5vZGVzKHRoaXMsIHRydWUpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUF0dHJpYnV0ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUF0dHJJbXBsIGF0dHIgPSBuZXcgQXR0ckltcGwoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQXR0ckltcGwgYXR0ciA9IG5ldyBBdHRySW1wbCgpOwotCQlhdHRyLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWF0dHIuc2V0TmFtZShuYW1lKTsKLQkJYXR0ci5zZXROYW1lc3BhY2VVUkkodXJpKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQ0RBVEFTZWN0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ0RBVEFTZWN0aW9uIGNyZWF0ZUNEQVRBU2VjdGlvbihTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIGFsbG93IENEQVRBIHNlY3Rpb24KLQkJLy8gaWYgKCFpc1hNTFR5cGUoKSkgewotCQkvLwl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgbmV3Ci0JCS8vIFN0cmluZygpKTsKLQkJLy8gfQotCQlDREFUQVNlY3Rpb25JbXBsIGNkYXRhID0gbmV3IENEQVRBU2VjdGlvbkltcGwoKTsKLQkJY2RhdGEuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNkYXRhLnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiBjZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ29tbWVudAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudChTdHJpbmcgZGF0YSkgewotCQlDb21tZW50SW1wbCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0JCWNvbW1lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNvbW1lbnQuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5tb2RlbC54bWwuWE1MRG9jdW1lbnQjY3JlYXRlQ29tbWVudEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIGJvb2xlYW4gaXNKU1BUYWcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzSlNQVHlwZSgpICYmIGlzSlNQVGFnKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLQkJZWxlbWVudC5zZXRKU1BUYWcoaXNKU1BUYWcpOwotCQlDb21tZW50RWxlbWVudFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlpZiAocmVnaXN0cnkuc2V0dXBDb21tZW50RWxlbWVudChlbGVtZW50KSkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0NIQVJBQ1RFUl9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N0eXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3R5cGUoU3RyaW5nIG5hbWUpIHsKLQkJRG9jdW1lbnRUeXBlSW1wbCBkb2NUeXBlID0gbmV3IERvY3VtZW50VHlwZUltcGwoKTsKLQkJZG9jVHlwZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlkb2NUeXBlLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBkb2NUeXBlOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50Ci0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpIHsKLQkJRG9jdW1lbnRGcmFnbWVudEltcGwgZnJhZ21lbnQgPSBuZXcgRG9jdW1lbnRGcmFnbWVudEltcGwoKTsKLQkJZnJhZ21lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJcmV0dXJuIGZyYWdtZW50OwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUVsZW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hlY2tUYWdOYW1lVmFsaWRpdHkodGFnTmFtZSk7Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IG5ldyBFbGVtZW50SW1wbCgpOwotCQllbGVtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWVsZW1lbnQuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudE5TKFN0cmluZyB1cmksIFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkTmFtZSh0YWdOYW1lKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IG5ldyBFbGVtZW50SW1wbCgpOwotCQllbGVtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWVsZW1lbnQuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQkJZWxlbWVudC5zZXROYW1lc3BhY2VVUkkodXJpKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRW50aXR5IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRW50aXR5Ci0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRW50aXR5IGNyZWF0ZUVudGl0eShTdHJpbmcgbmFtZSkgewotCQlFbnRpdHlJbXBsIGVudGl0eSA9IG5ldyBFbnRpdHlJbXBsKCk7Ci0JCWVudGl0eS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQllbnRpdHkuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVFbnRpdHlSZWZlcmVuY2UgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBFbnRpdHlSZWZlcmVuY2UgY3JlYXRlRW50aXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1hNTFR5cGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlFbnRpdHlSZWZlcmVuY2VJbXBsIHJlZiA9IG5ldyBFbnRpdHlSZWZlcmVuY2VJbXBsKCk7Ci0JCXJlZi5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlyZWYuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTm9kZUl0ZXJhdG9yIGNyZWF0ZU5vZGVJdGVyYXRvcihOb2RlIHJvb3QsIGludCB3aGF0VG9TaG93LCBOb2RlRmlsdGVyIGZpbHRlciwgYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VFeHBhbnNpb24pIHsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJvb3QgPSB0aGlzOwotCQlyZXR1cm4gbmV3IE5vZGVJdGVyYXRvckltcGwocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVOb3RhdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vdGF0aW9uCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm90YXRpb24gY3JlYXRlTm90YXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJTm90YXRpb25JbXBsIG5vdGF0aW9uID0gbmV3IE5vdGF0aW9uSW1wbCgpOwotCQlub3RhdGlvbi5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlub3RhdGlvbi5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gbm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gbmV3IFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwoKTsKLQkJcGkuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJcGkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQlwaS5zZXREYXRhKGRhdGEpOwotCQlyZXR1cm4gcGk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFJhbmdlIGNyZWF0ZVJhbmdlKCkgewotCQlyZXR1cm4gbmV3IFJhbmdlSW1wbCgpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZVRleHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uVGV4dAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dE5vZGUoU3RyaW5nIGRhdGEpIHsKLQkJVGV4dEltcGwgdGV4dCA9IG5ldyBUZXh0SW1wbCgpOwotCQl0ZXh0LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXRleHQuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFRyZWVXYWxrZXIgY3JlYXRlVHJlZVdhbGtlcihOb2RlIHJvb3QsIGludCB3aGF0VG9TaG93LCBOb2RlRmlsdGVyIGZpbHRlciwgYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VFeHBhbnNpb24pIHsKLQkJLy8gbm90IHN1cHBvZXJ0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudFR5cGUgZmluZERvY3R5cGUoTm9kZSBub2RlKSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IERPQ1VNRU5UX1RZUEVfTk9ERSAmJiBjaGlsZCBpbnN0YW5jZW9mIERvY3VtZW50VHlwZSkgewotCQkJCXJldHVybiAoRG9jdW1lbnRUeXBlKSBjaGlsZDsKLQkJCX0gZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBFTEVNRU5UX05PREUgJiYgKChYTUxFbGVtZW50KSBjaGlsZCkuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkvLyBzZWFyY2ggRE9DVFlQRSBpbnNpZGUgb2YgZ2VuZXJpYyBjb21tZW50IGVsZW1lbnQKLQkJCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGZpbmREb2N0eXBlKGNoaWxkKTsKLQkJCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkb2NUeXBlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRWxlbWVudCBmaW5kRG9jdW1lbnRFbGVtZW50KFN0cmluZyBkb2NOYW1lLCBOb2RlIG5vZGUsIE5vZGVbXSBmaXJzdEZvdW5kKSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNoaWxkOwotCQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQlFbGVtZW50IGRvY0VsZW1lbnQgPSBmaW5kRG9jdW1lbnRFbGVtZW50KGRvY05hbWUsIGVsZW1lbnQsIGZpcnN0Rm91bmQpOwotCQkJCWlmIChkb2NFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRvY0VsZW1lbnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gYWRkZWQgJ2Vsc2UgY29udGludWUnIHRvIGJldHRlciBoYW5kbGUgY2FzZXMgd2hlcmUKLQkJCQkJLy8gdGhlcmUgaXMgIm1vcmUgdGhhbiBvbmUgcm9vdCIgZWxlbWVudAotCQkJCQkvLyBlc3BlY2lhbGx5IGNvbXBsaWNhdGVkIGJ5IENvbW1lbnRFbGVtZW50cywgd2hpY2ggYXJlCi0JCQkJCS8vIHNvbWV0aW1lcyB0cmVhdGVkIGFzIGVsZW1lbnRzLCBidXQgc2hvdWxkCi0JCQkJCS8vIGJlIHRyZWF0ZWQgYXMgY29tbWVudHMgaW4gdGhpcyBjb250ZXh0LgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBub3RlOiB0aGUgIm5hbWUiIHdvbid0IG1hdGNoIGluIHRoZSBldmVudCBvZiBhIGpzcCB0YWcgLi4uIGJ1dAotCQkJLy8gaW5jYXNlCi0JCQkvLyB0aGUgbmFtZSBpcyBudWxsLCB3ZSBkbyBub3Qgd2FudCB0aGUganNwIGVsZW1lbnQgcmV0dXJuZWQgYXMKLQkJCS8vIGRvY3VtZW50RWxlbWVudAotCQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChkb2NOYW1lID09IG51bGwpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkvLyB1c2UgbG9jYWwgbmFtZSBmb3IgbmFtZXNwYWNlCi0JCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChpc1hNTFR5cGUoKSkgewotCQkJCWlmIChsb2NhbE5hbWUuZXF1YWxzKGRvY05hbWUpKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGRvY05hbWUpKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJCWlmIChmaXJzdEZvdW5kWzBdID09IG51bGwpCi0JCQkJZmlyc3RGb3VuZFswXSA9IGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2hhclZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGFyVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKG5hbWUuY2hhckF0KDApID09ICcjJykgeyAvLyBjaGFyYWN0ZXIgcmVmZXJlbmNlCi0JCQlpZiAobGVuZ3RoID09IDEpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpbnQgcmFkaXggPSAxMDsKLQkJCVN0cmluZyBzID0gbnVsbDsKLQkJCS8vIG5vdyBhbGxvdyBoZXhhZGVjaW1hbCBhbHNvIGZvciBub24gWE1MIGRvY3VtZW50Ci0JCQlpZiAobmFtZS5jaGFyQXQoMSkgPT0gJ3gnKSB7IC8vIGhleGFkZWNpbWFsCi0JCQkJcmFkaXggPSAxNjsKLQkJCQlzID0gbmFtZS5zdWJzdHJpbmcoMik7Ci0JCQl9IGVsc2UgeyAvLyBkZWNpbWFsCi0JCQkJcyA9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAocy5jaGFyQXQoMCkgPT0gJy0nKQotCQkJCXJldHVybiBudWxsOyAvLyBubyBtaW51cyBhY2NlcHRlZAotCQkJY2hhciBjID0gMDsKLQkJCXRyeSB7Ci0JCQkJYyA9IChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KHMsIHJhZGl4KTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJfQotCQkJaWYgKGMgPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihjKTsKLQkJfQotCi0JCS8vIGltcGxpY2l0IGNoYXJhY3RlciBlbnRpdGllcyBmb3IgWE1MCi0JCWlmIChuYW1lLmVxdWFscyhYTUxDaGFyRW50aXR5LkxUX05BTUUpKQotCQkJcmV0dXJuIFhNTENoYXJFbnRpdHkuTFRfVkFMVUU7Ci0JCWlmIChuYW1lLmVxdWFscyhYTUxDaGFyRW50aXR5LkdUX05BTUUpKQotCQkJcmV0dXJuIFhNTENoYXJFbnRpdHkuR1RfVkFMVUU7Ci0JCWlmIChuYW1lLmVxdWFscyhYTUxDaGFyRW50aXR5LkFNUF9OQU1FKSkKLQkJCXJldHVybiBYTUxDaGFyRW50aXR5LkFNUF9WQUxVRTsKLQkJaWYgKG5hbWUuZXF1YWxzKFhNTENoYXJFbnRpdHkuUVVPVF9OQU1FKSkKLQkJCXJldHVybiBYTUxDaGFyRW50aXR5LlFVT1RfVkFMVUU7Ci0JCWlmIChpc1hNTFR5cGUoKSkgewotCQkJaWYgKG5hbWUuZXF1YWxzKFhNTENoYXJFbnRpdHkuQVBPU19OQU1FKSkKLQkJCQlyZXR1cm4gWE1MQ2hhckVudGl0eS5BUE9TX1ZBTFVFOwotCQl9Ci0KLQkJQ01Eb2N1bWVudCBjbSA9IGdldENNRG9jdW1lbnQoKTsKLQkJaWYgKGNtICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIG1hcCA9IGNtLmdldEVudGl0aWVzKCk7Ci0JCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQlDTUVudGl0eURlY2xhcmF0aW9uIGRlY2wgPSAoQ01FbnRpdHlEZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IGRlY2wuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJaW50IHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCQkJCWlmICh2YWx1ZUxlbmd0aCA+IDEgJiYgdmFsdWUuY2hhckF0KDApID09ICcmJyAmJiB2YWx1ZS5jaGFyQXQoMSkgPT0gJyMnICYmIHZhbHVlLmNoYXJBdCh2YWx1ZUxlbmd0aCAtIDEpID09ICc7JykgewotCQkJCQkJLy8gY2hhcmFjdGVyIHJlZmVyZW5jZQotCQkJCQkJcmV0dXJuIGdldENoYXJWYWx1ZSh2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWVMZW5ndGggLSAxKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkodGhpcyk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZSgpIHsKLQkJcmV0dXJuIGZpbmREb2N0eXBlKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGdldERvY3VtZW50RWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudCBGcm9tIERPTSAyIFNwZWM6IGRvY3VtZW50RWxlbWVudCBvZiB0eXBlCi0JICogICAgICAgICBFbGVtZW50IFtwLjYyXSAsIHJlYWRvbmx5IFRoaXMgaXMgYSBjb252ZW5pZW5jZSBbcC4xMTldCi0JICogICAgICAgICBhdHRyaWJ1dGUgdGhhdCBhbGxvd3MgZGlyZWN0IGFjY2VzcyB0byB0aGUgY2hpbGQgbm9kZSB0aGF0IGlzCi0JICogICAgICAgICB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4gRm9yIEhUTUwgZG9jdW1lbnRzLCB0aGlzIGlzCi0JICogICAgICAgICB0aGUgZWxlbWVudCB3aXRoIHRoZSB0YWdOYW1lICJIVE1MIi4gTm90ZTogd2UgZGlmZmVyIGZyb20gdGhpcwotCSAqICAgICAgICAgZGVmaW5pdGlvbiBhIGxpdHRsZSBpbiB0aGF0IHdlIGRvbid0IG5lY2Vzc2FyaWx5IHRha2UgdGhlIGZpcnN0Ci0JICogICAgICAgICBjaGlsZCBidXQgYWxzbyBsb29rIHRvIG1hdGNoIHRoZSBuYW1lLiBJbiBhIHdlbGwgZm9ybWVkCi0JICogICAgICAgICBkb2N1bWVudCwgb2YgY291cnNlLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lLCBidXQgbm90Ci0JICogICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBpbiBhbiBpbGwtZm9ybWVkIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGdldERvY3VtZW50RWxlbWVudCgpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQluYW1lID0gZG9jVHlwZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlFbGVtZW50IGZpcnN0W10gPSBuZXcgRWxlbWVudFsxXTsKLQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZmluZERvY3VtZW50RWxlbWVudChuYW1lLCB0aGlzLCBmaXJzdCk7Ci0JCWlmIChkb2NFbGVtZW50ID09IG51bGwpIHsKLQkJCWRvY0VsZW1lbnQgPSBmaXJzdFswXTsKLQkJfQotCi0JCXJldHVybiBkb2NFbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGUgZ2V0RG9jdW1lbnRUeXBlKCkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXREb2N1bWVudFR5cGVBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZ2V0RG9jdHlwZSgpOwotCQlyZXR1cm4gYWRhcHRlci5nZXREb2N1bWVudFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlQWRhcHRlciBnZXREb2N1bWVudFR5cGVBZGFwdGVyKCkgewotCQlpZiAodGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID09IG51bGwpIHsKLQkJCXRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJLy8gYWRkIGRlZmF1bHQgYWRhcHRlcgotCQkJCXRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlciA9IG5ldyBEb2N1bWVudFR5cGVBZGFwdGVySW1wbCh0aGlzKTsKLQkJCQlhZGRBZGFwdGVyKHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VHlwZUlkKCkgewotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQlpZiAoZG9jVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBpZCA9IGRvY1R5cGUuZ2V0UHVibGljSWQoKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlpZCA9IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKTsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlSXRlcmF0b3IgaXQgPSBjcmVhdGVOb2RlSXRlcmF0b3IodGhpcywgTm9kZUZpbHRlci5TSE9XX0FMTCwgbnVsbCwgZmFsc2UpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKGlkKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnRzQnlUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBudWxsOwotCi0JCWlmICh1c2V0YWduYW1lY2FjaGUpIHsKLQkJCWVsZW1lbnRzID0gdGFnTmFtZUNhY2hlLmdldEl0ZW0odGFnTmFtZSk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJZWxlbWVudHMgPSBpbnRlcm5hbEdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOwotCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJTm9kZUl0ZXJhdG9yIGl0ID0gY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA9PSAxICYmIHVyaS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl1cmkgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCAhbG9jYWxOYW1lLmVxdWFscyh0YWdOYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbnNVUkkgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCWlmIChuc1VSSSA9PSBudWxsIHx8ICFuc1VSSS5lcXVhbHModXJpKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hcHBlbmROb2RlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB0aGUgZW5jb2RpbmcKLQkgKiBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdW5zcGVjaWZpZWQuCi0JICogCi0JICogQHNpbmNlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRJbXBsZW1lbnRhdGlvbigpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIG90aGVyIG5vZGVzIHdpbGwgYmUgcmVmZXJyaW5nIHRvIHRoaXMgb25lIHRvIGdldCB0aGUgb3duaW5nIG1vZGVsCi0JICovCi0JcHVibGljIFhNTE1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjZG9jdW1lbnQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIFhNTCBkZWNsYXJhdGlvbiwgd2hldGhlciB0aGlzCi0JICogZG9jdW1lbnQgaXMgc3RhbmRhbG9uZS4KLQkgKiAKLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTdGFuZGFsb25lKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHdoZXRoZXIgZXJyb3JzIGNoZWNraW5nIGlzIGVuZm9yY2VkIG9yIG5vdC4KLQkgKiBXaGVuIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIG5vdAotCSAqIHRlc3QgZXZlcnkgcG9zc2libGUgZXJyb3IgY2FzZSBub3JtYWxseSBkZWZpbmVkIG9uIERPTSBvcGVyYXRpb25zLCBhbmQKLQkgKiBub3QgcmFpc2UgYW55IDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4uIEluIGNhc2Ugb2YgZXJyb3IsIHRoZQotCSAqIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4gVGhpcyBhdHRyaWJ1dGUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gYnkKLQkgKiBkZWZhdWx0cy4KLQkgKiAKLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTdHJpY3RFcnJvckNoZWNraW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZUNhc2UoKSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IGdldERvY3VtZW50VHlwZUFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChhZGFwdGVyLmdldFRhZ05hbWVDYXNlKCkgIT0gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW1wb3J0Q2hpbGROb2RlcyhOb2RlIHBhcmVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlOb2RlIGltcG9ydGVkID0gaW1wb3J0Tm9kZShjaGlsZCwgZGVlcCk7Ci0JCQlpZiAoaW1wb3J0ZWQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWFwcGVuZENoaWxkKGltcG9ydGVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBOb2RlIGltcG9ydE5vZGUoTm9kZSBub2RlLCBib29sZWFuIGRlZXApIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVJbXBsIGltcG9ydGVkID0gKE5vZGVJbXBsKSBub2RlLmNsb25lTm9kZShkZWVwKTsKLQkJaWYgKGltcG9ydGVkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW1wb3J0ZWQuc2V0T3duZXJEb2N1bWVudCh0aGlzLCBkZWVwKTsKLQkJcmV0dXJuIGltcG9ydGVkOwotCX0KLQotCXByaXZhdGUgTm9kZUxpc3RJbXBsIGludGVybmFsR2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnRzQnlUYWduYW1lOiAiICsgdGFnTmFtZSk7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlpZiAoIWVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQkJaWYgKHVzZXRhZ25hbWVjYWNoZSkgewotCQkJdGFnTmFtZUNhY2hlLmFkZEl0ZW0odGFnTmFtZSwgZWxlbWVudHMpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0pTUERvY3VtZW50KCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzKEpTUFRhZy5KU1BfUk9PVCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BUeXBlKCkgewotCQlpZiAodGhpcy5tb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSB0aGlzLm1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaWQgPSBoYW5kbGVyLmdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBJU1NVRTogLS0gYXZvaWQgdGhpcyBoYXJkY29kZWQgc3RyaW5nCi0JCXJldHVybiBpZC5lcXVhbHMoIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8JLy8gRE1XOiBtb2RpZmllZCBmb3IgWE1MNEogNC4wLjEKLQkJLy8JaWYgKFhNTENoYXIuaXNWYWxpZE5hbWUobmFtZSkpIHJldHVybiB0cnVlOwotCQlpZiAoTmFtZVZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCS8vIHNwZWNpYWwgZm9yIGludmFsaWQgZGVjbGFyYXRpb24KLQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMSAmJiBuYW1lLmNoYXJBdCgwKSA9PSAnIScpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8gc3BlY2lhbCBmb3IgSlNQIHRhZyBpbiB0YWcgbmFtZQotCQlpZiAobmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gZ2V0RG9jdW1lbnRUeXBlQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBhZGFwdGVyLmlzWE1MVHlwZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VEb2N1bWVudFR5cGUoKSB7Ci0JCWlmICh0aGlzLmRvY3VtZW50VHlwZUFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyLnJlbGVhc2UoKTsKLQkJdGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIFhNTCBkZWNsYXJhdGlvbiwgdGhlIGVuY29kaW5nCi0JICogb2YgdGhpcyBkb2N1bWVudC4gVGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHVuc3BlY2lmaWVkLgotCSAqIAotCSAqIEBzaW5jZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKGphdmEubGFuZy5TdHJpbmcgZW5jb2RpbmcpIHsKLQl9Ci0KLQkvKioKLQkgKiBzZXRNb2RlbCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFhNTE1vZGVsCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChYTUxNb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gKFhNTE1vZGVsSW1wbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHdoZXRoZXIgdGhpcwotCSAqIGRvY3VtZW50IGlzIHN0YW5kYWxvbmUuCi0JICogCi0JICogQHNpbmNlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhbmRhbG9uZShib29sZWFuIHN0YW5kYWxvbmUpIHsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcgd2hldGhlciBlcnJvcnMgY2hlY2tpbmcgaXMgZW5mb3JjZWQgb3Igbm90LgotCSAqIFdoZW4gc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gbm90Ci0JICogdGVzdCBldmVyeSBwb3NzaWJsZSBlcnJvciBjYXNlIG5vcm1hbGx5IGRlZmluZWQgb24gRE9NIG9wZXJhdGlvbnMsIGFuZAotCSAqIG5vdCByYWlzZSBhbnkgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPi4gSW4gY2FzZSBvZiBlcnJvciwgdGhlCi0JICogYmVoYXZpb3IgaXMgdW5kZWZpbmVkLiBUaGlzIGF0dHJpYnV0ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiBieQotCSAqIGRlZmF1bHRzLgotCSAqIAotCSAqIEBzaW5jZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmljdEVycm9yQ2hlY2tpbmcoYm9vbGVhbiBzdHJpY3RFcnJvckNoZWNraW5nKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbikgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2M2Q5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFR5cGVBZGFwdGVySW1wbCBpbXBsZW1lbnRzIERvY3VtZW50VHlwZUFkYXB0ZXIgewotCi0JcHJpdmF0ZSBYTUxEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBEb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGVBZGFwdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlQWRhcHRlckltcGwoWE1MRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJdGhpcy5kb2N1bWVudFR5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIFNUUklDVF9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBYTUxEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIERvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhZ05hbWVDYXNlKCkgewotCQlyZXR1cm4gU1RSSUNUX0NBU0U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNYTUxUeXBlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKGV2ZW50VHlwZSAhPSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEKQotCQkJcmV0dXJuOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCB8fCAhKG5vdGlmaWVyIGluc3RhbmNlb2YgWE1MRG9jdW1lbnQpKQotCQkJcmV0dXJuOwotCQl0aGlzLmRvY3VtZW50VHlwZSA9ICgoWE1MRG9jdW1lbnQpIG5vdGlmaWVyKS5nZXREb2N0eXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RG9jdW1lbnRUeXBlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MTW9kZWwgbW9kZWwgPSB0aGlzLmRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkoKFhNTE1vZGVsSW1wbCkgbW9kZWwpLmRvY3VtZW50VHlwZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRUeXBlKERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUpIHsKLQkJdGhpcy5kb2N1bWVudFR5cGUgPSBkb2N1bWVudFR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxMzdkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxEb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIERvY3VtZW50VHlwZSBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRUeXBlSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgWE1MRG9jdW1lbnRUeXBlIHsKLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbFN1YnNldCA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JLyoqCi0JICogRG9jdW1lbnRUeXBlSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERvY3VtZW50VHlwZUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRG9jdW1lbnRUeXBlSW1wbAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGVJbXBsKERvY3VtZW50VHlwZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGF0Lm5hbWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURvY3VtZW50VHlwZUltcGwgY2xvbmVkID0gbmV3IERvY3VtZW50VHlwZUltcGwodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW50aXRpZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludGVybmFsU3Vic2V0KCkgewotCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFN1YnNldDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIERPQ1VNRU5UX1RZUEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb3RhdGlvbnMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldE5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50ZXJuYWxTdWJzZXQoU3RyaW5nIGludGVybmFsU3Vic2V0KSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pbnRlcm5hbFN1YnNldCA9IGludGVybmFsU3Vic2V0OwotCX0KLQotCS8qKgotCSAqIHNldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldE5hbWUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRQdWJsaWNJZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0U3lzdGVtSWQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnQCcpOwotCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDhkMjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotCi0vKioKLSAqIEVsZW1lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW1wbCBleHRlbmRzIE5vZGVDb250YWluZXIgaW1wbGVtZW50cyBYTUxFbGVtZW50IHsKLQotCXByaXZhdGUgY2xhc3MgQXR0cmlidXRlcyBpbXBsZW1lbnRzIE5hbWVkTm9kZU1hcCB7Ci0JCUF0dHJpYnV0ZXMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlpZiAoYXR0ck5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlyZXR1cm4gYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGF0dHJOb2Rlcy5pdGVtKGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gcmVtb3ZlQXR0cmlidXRlTm9kZShuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJCXJldHVybiByZW1vdmVBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbShOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc2V0QXR0cmlidXRlTm9kZSgoQXR0ckltcGwpIGFyZyk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW1OUyhOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc2V0QXR0cmlidXRlTm9kZU5TKChBdHRySW1wbCkgYXJnKTsKLQkJfQotCX0KLQotCU5vZGVMaXN0SW1wbCBhdHRyTm9kZXMgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRUYWcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVRhZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFRhZyA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIEVsZW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEVsZW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEVsZW1lbnRJbXBsCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbXBsKEVsZW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy50YWdOYW1lID0gdGhhdC50YWdOYW1lOwotCQkJdGhpcy5pc0VtcHR5VGFnID0gdGhhdC5pc0VtcHR5VGFnOwotCQkJdGhpcy5pc0pTUFRhZyA9IHRoYXQuaXNKU1BUYWc7Ci0JCQl0aGlzLmlzQ29tbWVudFRhZyA9IHRoYXQuaXNDb21tZW50VGFnOwotCi0JCQkvLyBjbG9uZSBhdHRyaWJ1dGVzCi0JCQl0aGF0LmNsb25lQXR0cmlidXRlcyh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZEVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnKEVsZW1lbnQgZW5kVGFnKSB7Ci0JCWlmIChlbmRUYWcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGhhc0VuZFRhZygpKQotCQkJcmV0dXJuOwotCQlFbGVtZW50SW1wbCBlbmQgPSAoRWxlbWVudEltcGwpIGVuZFRhZzsKLQotCQkvLyBtb3ZlIHRoZSBlbmQgZmxhdCBub2RlIGZyb20gdGhlIGVuZCB0YWcKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVuZC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVuZC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCXNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQXR0aWJ1dGVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIEF0dHIgYXBwZW5kQXR0cmlidXRlTm9kZShBdHRyIG5ld0F0dHIpIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlpZiAoYXR0ci5nZXRPd25lckVsZW1lbnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXRoaXMuYXR0ck5vZGVzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQl0aGlzLmF0dHJOb2Rlcy5hcHBlbmROb2RlKGF0dHIpOwotCQlhdHRyLnNldE93bmVyRWxlbWVudCh0aGlzKTsKLQotCQlub3RpZnlBdHRyUmVwbGFjZWQoYXR0ciwgbnVsbCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIGNsb25lQXR0cmlidXRlcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T3duZXIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUF0dHJpYnV0ZXMoRWxlbWVudCBuZXdPd25lcikgewotCQlpZiAobmV3T3duZXIgPT0gbnVsbCB8fCBuZXdPd25lciA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld093bmVyOwotCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZXMoKTsKLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJQXR0ciBjbG9uZWQgPSAoQXR0cikgbm9kZS5jbG9uZU5vZGUoZmFsc2UpOwotCQkJaWYgKGNsb25lZCAhPSBudWxsKQotCQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZShjbG9uZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlFbGVtZW50SW1wbCBjbG9uZWQgPSBuZXcgRWxlbWVudEltcGwodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQlyZXR1cm4gYXR0cjsgLy8gZm91bmQKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbnNVUkkgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobnNVUkkgPT0gbnVsbCB8fCAhbnNVUkkuZXF1YWxzKHVyaSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBmb3VuZAotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgewotCQlBdHRyIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlcygpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnRzQnlUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUl0ZXJhdG9yIGl0ID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJaWYgKHRhZ05hbWUubGVuZ3RoKCkgPT0gMSAmJiB0YWdOYW1lLmNoYXJBdCgwKSA9PSAnKicpIHsKLQkJCXRhZ05hbWUgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCWlmICghZWxlbWVudC5tYXRjaFRhZ05hbWUodGFnTmFtZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYXBwZW5kTm9kZShub2RlKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUl0ZXJhdG9yIGl0ID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA9PSAxICYmIHVyaS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl1cmkgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCAhbG9jYWxOYW1lLmVxdWFscyh0YWdOYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbnNVUkkgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCWlmIChuc1VSSSA9PSBudWxsIHx8ICFuc1VSSS5lcXVhbHModXJpKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hcHBlbmROb2RlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIGdldEVuZE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIGdldEVuZFN0YXJ0T2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRTdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmRUYWdOYW1lKCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUgfHwgcmVnaW9uVHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSB0aGlzLnRhZ05hbWUuaW5kZXhPZignOicpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIHRoaXMudGFnTmFtZTsKLQkJcmV0dXJuIHRoaXMudGFnTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJU3RyaW5nIG5zQXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQluc0F0dHJOYW1lID0gWE1MTmFtZXNwYWNlLlhNTE5TX1BSRUZJWCArIHByZWZpeDsKLQkJfSBlbHNlIHsKLQkJCW5zQXR0ck5hbWUgPSBYTUxOYW1lc3BhY2UuWE1MTlM7Ci0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5zQXR0ck5hbWUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUYWdOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEVMRU1FTlRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IHRoaXMudGFnTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiB0YWcgbmFtZQotCQlpZiAodGhpcy50YWdOYW1lLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMudGFnTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0RW5kT2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydEVuZE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRFbmQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAoZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWhhc0NoaWxkTm9kZXMoKSkgewotCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0VGFnTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhZ05hbWUoKSB7Ci0JCWlmICh0aGlzLnRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLnRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoZ2V0QXR0cmlidXRlTm9kZShuYW1lKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKGdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiAodGhpcy5hdHRyTm9kZXMgIT0gbnVsbCAmJiB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKSA+IDApOwotCX0KLQotCS8qKgotCSAqIGhhc0VuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNFbmRUYWcoKSB7Ci0JCXJldHVybiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzUHJlZml4KCkgewotCQlpZiAodGhpcy50YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLnRhZ05hbWUuaW5kZXhPZignOicpIDw9IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiB0YWcgbmFtZQotCQlpZiAodGhpcy50YWdOYW1lLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGhhc1N0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1N0YXJ0VGFnKCkgewotCQlyZXR1cm4gKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlnbm9yZUNhc2UoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaWdub3JlQ2FzZSgpKSB7Ci0JCQkvLyBldmVuIGluIGNhc2UgaW5zZW5zaXRpdmUgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MgY2FzZQotCQkJLy8gc2Vuc2l0aXZlIHRhZwotCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEF0dHIgaW5zZXJ0QXR0cmlidXRlTm9kZShBdHRyIG5ld0F0dHIsIGludCBpbmRleCkgewotCQlpZiAobmV3QXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIG5ld0F0dHI7Ci0JCWlmIChhdHRyLmdldE93bmVyRWxlbWVudCgpICE9IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXRoaXMuYXR0ck5vZGVzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQl0aGlzLmF0dHJOb2Rlcy5pbnNlcnROb2RlKGF0dHIsIGluZGV4KTsKLQkJYXR0ci5zZXRPd25lckVsZW1lbnQodGhpcyk7Ci0KLQkJbm90aWZ5QXR0clJlcGxhY2VkKGF0dHIsIG51bGwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRCZWZvcmUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZkNoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzaG91bGQgdGhyb3cgRE9NRXhjZXB0aW9uIGluc3RlYWQgb2YgcmV0dXJuIG51bGw/Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghaXNDb250YWluZXIoKSkgeyAvLyBuZXZlciBiZSBjb250YWluZXIKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAobmV3Q2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBURVhUX05PREUpIHsKLQkJCWlmIChpc0pTUENvbnRhaW5lcigpIHx8IGlzQ0RBVEFDb250YWluZXIoKSkgeyAvLyBhY2NlcHRzIG9ubHkgVGV4dAotCQkJCS8vIGNoaWxkCi0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHJlZkNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NEQVRBQ29udGFpbmVyKCkgewotCQkvLyB1c2UgQmxvY2tNYWtlciBpbnN0ZWFkIG9mIENNRWxlbWVudERlY2xhcmF0aW9uCi0JCS8vIGJlY2F1c2UgPHN0eWxlPiBhbmQgPHNjcmlwdD4gaW4gWEhUTUwgaXMgbm90IENEQVRBIGNvbnRlbnQgdHlwZQotCQlYTUxNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBlcnJvcgotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGVyb3IKLQkJUmVnaW9uUGFyc2VyIHBhcnNlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJaWYgKHBhcnNlciA9PSBudWxsIHx8ICEocGFyc2VyIGluc3RhbmNlb2YgWE1MU291cmNlUGFyc2VyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoKFhNTFNvdXJjZVBhcnNlcikgcGFyc2VyKS5nZXRCbG9ja01hcmtlcih0aGlzLnRhZ05hbWUpICE9IG51bGwpOwotCQkvKgotCQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RGVjbGFyYXRpb24oKTsgaWYgKGRlY2wgPT0gbnVsbCkKLQkJICogcmV0dXJuIGZhbHNlOyBpZiAoZGVjbCBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIpIHsgZGVjbCA9Ci0JCSAqIChDTUVsZW1lbnREZWNsYXJhdGlvbikoKENNTm9kZVdyYXBwZXIpZGVjbCkuZ2V0T3JpZ2luTm9kZSgpOyBpZgotCQkgKiAoZGVjbCA9PSBudWxsKSByZXR1cm4gZmFsc2U7IH0gaWYgKGRlY2wgaW5zdGFuY2VvZgotCQkgKiBUTERFbGVtZW50RGVjbGFyYXRpb24pIHsgU3RyaW5nIGNvbnRlbnQgPQotCQkgKiAoKFRMREVsZW1lbnREZWNsYXJhdGlvbilkZWNsKS5nZXRCb2R5Y29udGVudCgpOyBpZiAoY29udGVudCA9PQotCQkgKiBudWxsKSByZXR1cm4gZmFsc2U7IHJldHVybgotCQkgKiBjb250ZW50LmVxdWFscyhKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKTsgfSBpZgotCQkgKiAoIWlzR2xvYmFsVGFnKCkpIHJldHVybiBmYWxzZTsgcmV0dXJuIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0KLQkJICogQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEEpOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCWlmIChpc0VtcHR5VGFnKCkgfHwgIWlzQ29udGFpbmVyKCkpIHsKLQkJCWZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJfSBlbHNlIHsKLQkJCWZsYXROb2RlID0gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIG11c3QgYmUgZ2VuZXJhdGVkCi0JCX0KLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKTsKLQkJfQotCQlpZiAoaXNKU1BUYWcoKSkgewotCQkJcmV0dXJuIChyZWdpb25UeXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSB8fCByZWdpb25UeXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UpOwotCQl9Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb21tZW50VGFnKCkgewotCQlyZXR1cm4gdGhpcy5pc0NvbW1lbnRUYWc7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkgewotCQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoQ29tbWVudEVsZW1lbnRBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKENvbW1lbnRFbGVtZW50QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChhZGFwdGVyLmlzQ29udGFpbmVyKCkpOwotCQkJfQotCQkJcmV0dXJuIChnZXREZWNsYXJhdGlvbigpID09IG51bGwpOwotCQl9Ci0JCWlmIChpc0pTUFRhZygpKSB7Ci0JCQkvLyBleGNsdWRlIEpTUCBkaXJlY3RpdmUKLQkJCXJldHVybiAobWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfU0NSSVBUTEVUKSB8fCBtYXRjaFRhZ05hbWUoSlNQVGFnLkpTUF9ERUNMQVJBVElPTikgfHwgbWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfRVhQUkVTU0lPTikpOwotCQl9Ci0JCWlmICghaXNYTUxUYWcoKSkgeyAvLyBub24tWE1MIHRhZwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsgLy8gdW5kZWZpbmVkIHRhZwotCQkJcmV0dXJuIChkZWNsLmdldENvbnRlbnRUeXBlKCkgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGlzRW1wdHlUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eVRhZygpIHsKLQkJaWYgKGlzSlNQVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFpc1hNTFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5pc0VtcHR5VGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKCkgewotCQlyZXR1cm4gKGhhc0VuZFRhZygpICYmICFoYXNTdGFydFRhZygpICYmICFoYXNDaGlsZE5vZGVzKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsVGFnKCkgewotCQlyZXR1cm4gIWhhc1ByZWZpeCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRUYWcoKSB7Ci0JCWlmIChoYXNTdGFydFRhZygpIHx8IGhhc0VuZFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBtYWtlIHN1cmUgdGhpcyBpcyBpbiB0aGUgZG9jdW1lbnQgdHJlZQotCQkvLyBiZWNhdXNlIGlmIG5vdCBpbiB0aGUgZG9jdW1lbnQgdHJlZSwgbm8gdGFncyBhcmUgZ2VuZXJhdGVkIHlldAotCQlyZXR1cm4gKGdldENvbnRhaW5lckRvY3VtZW50KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BDb250YWluZXIoKSB7Ci0JCXJldHVybiAoaXNKU1BUYWcoKSAmJiAhaXNDb21tZW50VGFnKCkgJiYgaXNDb250YWluZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNKU1BUYWcoKSB7Ci0JCXJldHVybiB0aGlzLmlzSlNQVGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhcnRUYWdDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKTsKLQkJfQotCQlpZiAoaXNKU1BUYWcoKSkgewotCQkJaWYgKGlzQ29udGFpbmVyKCkpCi0JCQkJcmV0dXJuIHRydWU7IC8vIHN0YXJ0IHRhZyBhbHdheXMgaGFzIGEgc2luZ2xlIHJlZ2lvbgotCQkJcmV0dXJuIChyZWdpb25UeXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UpOwotCQl9Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNYTUxUYWcoKSB7Ci0JCWlmIChpc0pTUFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgIWRvY3VtZW50LmlzWE1MVHlwZSgpKSB7Ci0JCQkvLyBldmVuIGluIG5vbi1YTUwgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MgWE1MIHRhZwotCQkJcmV0dXJuIGhhc1ByZWZpeCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQlpZiAoaXNKU1BUYWcoKSAmJiAhaXNDb21tZW50VGFnKCkpIHsKLQkJCXJldHVybiAoaW1wbC5pc0pTUFRhZygpICYmICFpbXBsLmlzQ29tbWVudFRhZygpKTsKLQkJfQotCQlyZXR1cm4gbWF0Y2hUYWdOYW1lKGVsZW1lbnQuZ2V0VGFnTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBtYXRjaFRhZ05hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAodGhpcy50YWdOYW1lID09IG51bGwpOwotCQlpZiAodGhpcy50YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghaWdub3JlQ2FzZSgpKQotCQkJcmV0dXJuIHRoaXMudGFnTmFtZS5lcXVhbHModGFnTmFtZSk7Ci0JCXJldHVybiB0aGlzLnRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBub3RpZnlBdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUF0dHJSZXBsYWNlZChBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cikgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MTW9kZWxJbXBsIG1vZGVsID0gKFhNTE1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmF0dHJSZXBsYWNlZCh0aGlzLCBuZXdBdHRyLCBvbGRBdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBub3RpZnlWYWx1ZUNoYW5nZWQgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5RW5kVGFnQ2hhbmdlZCgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsSW1wbCBtb2RlbCA9IChYTUxNb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5lbmRUYWdDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeVN0YXJ0VGFnQ2hhbmdlZCgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsSW1wbCBtb2RlbCA9IChYTUxNb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5zdGFydFRhZ0NoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJlZmVyRW1wdHlUYWcoKSB7Ci0JCWlmIChoYXNDaGlsZE5vZGVzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc0pTUFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghaXNYTUxUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVBdHRyaWJ1dGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZW1vdmVBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwdWJsaWMgQXR0ciByZW1vdmVBdHRyaWJ1dGVOb2RlKEF0dHIgb2xkQXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKSB7IC8vIG5vIGF0dHJpYnV0ZQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyICE9IG9sZEF0dHIpCi0JCQkJY29udGludWU7Ci0KLQkJCS8vIGZvdW5kCi0JCQl0aGlzLmF0dHJOb2Rlcy5yZW1vdmVOb2RlKGkpOwotCQkJYXR0ci5zZXRPd25lckVsZW1lbnQobnVsbCk7Ci0KLQkJCW5vdGlmeUF0dHJSZXBsYWNlZChudWxsLCBhdHRyKTsKLQkJCXJldHVybiBhdHRyOwotCQl9Ci0KLQkJLy8gbm90IGZvdW5kCi0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQXR0cmlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBdHRyIHJlbW92ZUF0dHJpYnV0ZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIWF0dHIubWF0Y2hOYW1lKG5hbWUpKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBmb3VuZAotCQkJdGhpcy5hdHRyTm9kZXMucmVtb3ZlTm9kZShpKTsKLQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCi0JCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQlyZXR1cm4gYXR0cjsKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciByZW1vdmVBdHRyaWJ1dGVOb2RlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbG9jYWxOYW1lID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKLQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCAhbG9jYWxOYW1lLmVxdWFscyhuYW1lKSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBuc1VSSSA9IGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlpZiAodXJpID09IG51bGwpIHsKLQkJCQlpZiAobnNVUkkgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChuc1VSSSA9PSBudWxsIHx8ICFuc1VSSS5lcXVhbHModXJpKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIGZvdW5kCi0JCQl0aGlzLmF0dHJOb2Rlcy5yZW1vdmVOb2RlKGkpOwotCQkJYXR0ci5zZXRPd25lckVsZW1lbnQobnVsbCk7Ci0KLQkJCW5vdGlmeUF0dHJSZXBsYWNlZChudWxsLCBhdHRyKTsKLQkJCXJldHVybiBhdHRyOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQXR0cmlidXRlcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVzKCkgewotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQkJCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmF0dHJOb2RlcyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50IHJlbW92ZUVuZFRhZygpIHsKLQkJaWYgKCFoYXNFbmRUYWcoKSkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlTGlzdEltcGwgYXR0ck5vZGVzID0gdGhpcy5hdHRyTm9kZXM7Ci0JCXRoaXMuYXR0ck5vZGVzID0gbnVsbDsgLy8gbm90IHRvIGNvcHkgYXR0cmlidXRlcwotCQlFbGVtZW50SW1wbCBlbmQgPSAoRWxlbWVudEltcGwpIGNsb25lTm9kZShmYWxzZSk7Ci0JCXRoaXMuYXR0ck5vZGVzID0gYXR0ck5vZGVzOwotCQlpZiAoZW5kID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBtb3ZlIHRoZSBlbmQgZmxhdCBub2RlIHRvIHRoZSBlbmQgdGFnCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQllbmQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTdGFydFRhZygpIHsKLQkJcmVtb3ZlQXR0cmlidXRlcygpOwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4KLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJaWYgKHRoaXMuYXR0ck5vZGVzICE9IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWF0dHIucmVzZXRSZWdpb25zKCk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5yZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsgLy8gZm9yIGNoaWxkcmVuCi0KLQkJdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHNldEF0dHJpYnV0ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUF0dHIgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCWF0dHIuc2V0VmFsdWUodmFsdWUpOyAvLyBjaGFuZ2UgdmFsdWUKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5ldyBhdHRyaWJ1dGUKLQkJRG9jdW1lbnQgZG9jID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHIgPSBkb2MuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQkJYXBwZW5kQXR0cmlidXRlTm9kZShhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRBdHRyaWJ1dGVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIEF0dHIgc2V0QXR0cmlidXRlTm9kZShBdHRyIG5ld0F0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3QXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIG5vdGhpbmcgdG8gZG8KLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIG5ld0F0dHI7Ci0JCUVsZW1lbnQgb3duZXIgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQlpZiAob3duZXIgIT0gbnVsbCkgewotCQkJaWYgKG93bmVyID09IHRoaXMpCi0JCQkJcmV0dXJuIG51bGw7IC8vIG5vdGhpbmcgdG8gZG8KLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVVNFX0FUVFJJQlVURV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlBdHRyIG9sZEF0dHIgPSByZW1vdmVBdHRyaWJ1dGVOb2RlKG5ld0F0dHIuZ2V0TmFtZSgpKTsKLQkJYXBwZW5kQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJcmV0dXJuIG9sZEF0dHI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEF0dHIgc2V0QXR0cmlidXRlTm9kZU5TKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJRWxlbWVudCBvd25lciA9IGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChvd25lciAhPSBudWxsKSB7Ci0JCQlpZiAob3duZXIgPT0gdGhpcykKLQkJCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5VU0VfQVRUUklCVVRFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gbmV3QXR0ci5nZXRMb2NhbE5hbWUoKTsKLQkJU3RyaW5nIHVyaSA9IG5ld0F0dHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCUF0dHIgb2xkQXR0ciA9IHJlbW92ZUF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQlyZXR1cm4gb2xkQXR0cjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUF0dHIgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsgLy8gY2hhbmdlIHZhbHVlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuZXcgYXR0cmlidXRlCi0JCURvY3VtZW50IGRvYyA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZU5TKHVyaSwgbmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnRUYWcoYm9vbGVhbiBpc0NvbW1lbnRUYWcpIHsKLQkJWE1MTm9kZSBwYXJlbnQgPSAoWE1MTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pc0NvbW1lbnRUYWcgPSBpc0NvbW1lbnRUYWc7Ci0JfQotCi0JLyoqCi0JICogc2V0RW1wdHlUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGlzRW1wdHlUYWcKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbXB0eVRhZyhib29sZWFuIGlzRW1wdHlUYWcpIHsKLQkJWE1MTm9kZSBwYXJlbnQgPSAoWE1MTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pc0VtcHR5VGFnID0gaXNFbXB0eVRhZzsKLQl9Ci0KLQkvKioKLQkgKiBzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXZvaWQgc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBmbGF0Tm9kZTsKLQotCQlOb2RlQ29udGFpbmVyIHBhcmVudCA9IChOb2RlQ29udGFpbmVyKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LnN5bmNDaGlsZEVkaXRhYmxlU3RhdGUodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXRKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGlzSlNQVGFnCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SlNQVGFnKGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJWE1MTm9kZSBwYXJlbnQgPSAoWE1MTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pc0pTUFRhZyA9IGlzSlNQVGFnOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCXN1cGVyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCwgZGVlcCk7Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWF0dHIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJWE1MTm9kZSBwYXJlbnQgPSAoWE1MTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IHByZWZpeExlbmd0aCA9IChwcmVmaXggIT0gbnVsbCA/IHByZWZpeC5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gZ2V0TG9jYWxOYW1lKCk7Ci0JCWlmIChwcmVmaXhMZW5ndGggPT0gMCkgewotCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsIHx8IGxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJLy8gaW52YWxpZCBsb2NhbCBuYW1lCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJc2V0VGFnTmFtZShsb2NhbE5hbWUpOwotCQl9IGVsc2UgewotCQkJaW50IGxvY2FsTGVuZ3RoID0gKGxvY2FsTmFtZSAhPSBudWxsID8gbG9jYWxOYW1lLmxlbmd0aCgpIDogMCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXhMZW5ndGggKyAxICsgbG9jYWxMZW5ndGgpOwotCQkJYnVmZmVyLmFwcGVuZChwcmVmaXgpOwotCQkJYnVmZmVyLmFwcGVuZCgnOicpOwotCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQobG9jYWxOYW1lKTsKLQkJCXNldFRhZ05hbWUoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJYm9vbGVhbiBjaGFuZ2VFbmRUYWcgPSBoYXNFbmRUYWcoKTsKLQkJbm90aWZ5U3RhcnRUYWdDaGFuZ2VkKCk7Ci0JCWlmIChjaGFuZ2VFbmRUYWcpCi0JCQlub3RpZnlFbmRUYWdDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXZvaWQgc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIHNldFRhZ05hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXRoaXMudGFnTmFtZSA9IHRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogdG9TdHJpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBnZXRUYWdOYW1lKCk7Ci0JCWlmIChoYXNTdGFydFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJaWYgKGlzRW1wdHlUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoJy8nKTsKLQkJaWYgKGhhc0VuZFRhZygpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcvJyk7Ci0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0JCWlmIChidWZmZXIubGVuZ3RoKCkgPT0gMCkKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnQCcpOwotCQkJYnVmZmVyLmFwcGVuZChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZTVkNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEVudGl0eUltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIEVudGl0eSB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBub3RhdGlvbk5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBFbnRpdHlJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRW50aXR5SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBFbnRpdHlJbXBsCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eUltcGwoRW50aXR5SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJCXRoaXMucHVibGljSWQgPSB0aGF0LnB1YmxpY0lkOwotCQkJdGhpcy5zeXN0ZW1JZCA9IHRoYXQuc3lzdGVtSWQ7Ci0JCQl0aGlzLm5vdGF0aW9uTmFtZSA9IHRoYXQubm90YXRpb25OYW1lOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlFbnRpdHlJbXBsIGNsb25lZCA9IG5ldyBFbnRpdHlJbXBsKHRoaXMpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIGVuY29kaW5nCi0JICogb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRU5USVRZX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm90YXRpb25OYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5ub3RhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLCB0aGUgdmVyc2lvbgotCSAqIG51bWJlciBvZiB0aGlzIGVudGl0eSwgd2hlbiBpdCBpcyBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5LiBUaGlzIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBzaW5jZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIGVuY29kaW5nCi0JICogb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nKSB7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb3RhdGlvbk5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vdGF0aW9uTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uTmFtZShTdHJpbmcgbm90YXRpb25OYW1lKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5ub3RhdGlvbk5hbWUgPSBub3RhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIHRleHQgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZW50aXR5LCB3aGVuIGl0IGlzIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkuIFRoaXMgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNpbmNlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eVJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjZlY2MwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogRW50aXR5UmVmZXJlbmNlIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlSZWZlcmVuY2VJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBFbnRpdHlSZWZlcmVuY2UgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBFbnRpdHlSZWZlcmVuY2VJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eVJlZmVyZW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRW50aXR5UmVmZXJlbmNlSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBFbnRpdHlSZWZlcmVuY2VJbXBsCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eVJlZmVyZW5jZUltcGwoRW50aXR5UmVmZXJlbmNlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRW50aXR5UmVmZXJlbmNlSW1wbCBjbG9uZWQgPSBuZXcgRW50aXR5UmVmZXJlbmNlSW1wbCh0aGlzKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBFTlRJVFlfUkVGRVJFTkNFX05PREU7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01vZGVsUGFyc2VyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Nb2RlbFBhcnNlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExMDc5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01vZGVsUGFyc2VyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxQYXJzZXJBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRhaW4oRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUNvbW1lbnRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZyk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVJbXBsaWNpdEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluZFJvb3ROYW1lKFN0cmluZyB0YWdOYW1lKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKFhNTEVsZW1lbnQgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjFkNTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIE5vZGVDb250YWluZXIgY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVDb250YWluZXIgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIE5vZGUsIE5vZGVMaXN0IHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgY2xhc3MgQ2hpbGROb2Rlc0NhY2hlIGltcGxlbWVudHMgTm9kZUxpc3QgewotCQlwcml2YXRlIE5vZGUgY3VyQ2hpbGQgPSBudWxsOwotCQlwcml2YXRlIGludCBjdXJJbmRleCA9IC0xOwotCQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JCUNoaWxkTm9kZXNDYWNoZSgpIHsKLQkJCWluaXRpYWxpemVDYWNoZSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkvLyBhdG9taWMKLQkJCXJldHVybiB0aGlzLmxlbmd0aDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ2FjaGUoKSB7Ci0JCQkvLyBub3RlIHdlIHVzZSB0aGUgb3V0dGVyIG9iamVjdHMgbG9ja29iamVjdAotCQkJLy8gKHNpbmNlIHdlIGFyZSB1c2luZyB0aGVpciAiY2hpbGRyZW4iLgotCQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQkJZm9yIChOb2RlIGNoaWxkID0gZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCXRoaXMubGVuZ3RoKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJCWlmICh0aGlzLmxlbmd0aCA9PSAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGgpCi0JCQkJCXJldHVybiBudWxsOwotCi0JCQkJaWYgKHRoaXMuY3VySW5kZXggPCAwKSB7IC8vIGZpcnN0IHRpbWUKLQkJCQkJaWYgKGluZGV4ICogMiA+PSB0aGlzLmxlbmd0aCkgeyAvLyBzZWFyY2ggZnJvbSB0aGUgbGFzdAotCQkJCQkJdGhpcy5jdXJJbmRleCA9IHRoaXMubGVuZ3RoIC0gMTsKLQkJCQkJCXRoaXMuY3VyQ2hpbGQgPSBsYXN0Q2hpbGQ7Ci0JCQkJCX0gZWxzZSB7IC8vIHNlYXJjaCBmcm9tIHRoZSBmaXJzdAotCQkJCQkJdGhpcy5jdXJJbmRleCA9IDA7Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gZmlyc3RDaGlsZDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChpbmRleCA9PSB0aGlzLmN1ckluZGV4KQotCQkJCQlyZXR1cm4gdGhpcy5jdXJDaGlsZDsKLQotCQkJCWlmIChpbmRleCA+IHRoaXMuY3VySW5kZXgpIHsKLQkJCQkJd2hpbGUgKGluZGV4ID4gdGhpcy5jdXJJbmRleCkgewotCQkJCQkJdGhpcy5jdXJJbmRleCsrOwotCQkJCQkJdGhpcy5jdXJDaGlsZCA9IHRoaXMuY3VyQ2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7IC8vIGluZGV4IDwgdGhpcy5jdXJJbmRleAotCQkJCQl3aGlsZSAoaW5kZXggPCB0aGlzLmN1ckluZGV4KSB7Ci0JCQkJCQl0aGlzLmN1ckluZGV4LS07Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gdGhpcy5jdXJDaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiB0aGlzLmN1ckNoaWxkOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBOb2RlTGlzdCBjaGlsZE5vZGVzQ2FjaGUgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZDaGlsZEVkaXRhYmxlID0gdHJ1ZTsKLQlOb2RlSW1wbCBmaXJzdENoaWxkID0gbnVsbDsKLQlOb2RlSW1wbCBsYXN0Q2hpbGQgPSBudWxsOwotCi0JT2JqZWN0IGxvY2tPYmplY3QgPSBuZXcgYnl0ZVswXTsKLQotCS8qKgotCSAqIE5vZGVDb250YWluZXIgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlQ29udGFpbmVyIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vZGVDb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lcihOb2RlQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNsb25lQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUNoaWxkTm9kZXMoTm9kZSBuZXdQYXJlbnQsIGJvb2xlYW4gZGVlcCkgewotCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50ID09IHRoaXMpCi0JCQlyZXR1cm47Ci0JCWlmICghKG5ld1BhcmVudCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpKQotCQkJcmV0dXJuOwotCi0JCU5vZGVDb250YWluZXIgY29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIG5ld1BhcmVudDsKLQkJY29udGFpbmVyLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJTm9kZSBjbG9uZWQgPSBjaGlsZC5jbG9uZU5vZGUoZGVlcCk7Ci0JCQlpZiAoY2xvbmVkICE9IG51bGwpCi0JCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5maXJzdENoaWxkOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmxhc3RDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaWYgKHRoaXMuZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJaWYgKHRoaXMuY2hpbGROb2Rlc0NhY2hlID09IG51bGwpCi0JCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBuZXcgQ2hpbGROb2Rlc0NhY2hlKCk7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZE5vZGVzQ2FjaGUuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQl9Ci0KLQkJZm9yIChOb2RlSW1wbCBjaGlsZCA9IGZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gY2hpbGQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogaGFzQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gKHRoaXMuZmlyc3RDaGlsZCAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRCZWZvcmUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZkNoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0JCWlmIChyZWZDaGlsZCAhPSBudWxsICYmIHJlZkNoaWxkLmdldFBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAobmV3Q2hpbGQgPT0gcmVmQ2hpbGQpCi0JCQlyZXR1cm4gbmV3Q2hpbGQ7IC8vIG5vdGhpbmcgdG8gZG8KLQotCQlpZiAobmV3Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7Ci0JCQkvLyBpbnNlcnQgY2hpbGQgbm9kZXMgaW5zdGVhZAotCQkJZm9yIChOb2RlIGNoaWxkID0gbmV3Q2hpbGQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IG5ld0NoaWxkLmdldEZpcnN0Q2hpbGQoKSkgewotCQkJCW5ld0NoaWxkLnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlpbnNlcnRCZWZvcmUoY2hpbGQsIHJlZkNoaWxkKTsKLQkJCX0KLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJfQotCQkvLyBzeW5jaHJvbml6ZWQgaW4gY2FzZSBhbm90aGVyIHRocmVhZCBpcyBnZXR0aW5nIGl0ZW0sIG9yIGxlbmd0aAotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCXRoaXMuY2hpbGROb2Rlc0NhY2hlID0gbnVsbDsgLy8gaW52YWxpZGF0ZSBjaGlsZCBub2RlcyBjYWNoZQotCQl9Ci0KLQkJTm9kZUltcGwgY2hpbGQgPSAoTm9kZUltcGwpIG5ld0NoaWxkOwotCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSByZWZDaGlsZDsKLQkJTm9kZUltcGwgcHJldiA9IG51bGw7Ci0JCU5vZGUgb2xkUGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAob2xkUGFyZW50ICE9IG51bGwpCi0JCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQlpZiAobmV4dCA9PSBudWxsKSB7Ci0JCQlwcmV2ID0gdGhpcy5sYXN0Q2hpbGQ7Ci0JCQl0aGlzLmxhc3RDaGlsZCA9IGNoaWxkOwotCQl9IGVsc2UgewotCQkJcHJldiA9IChOb2RlSW1wbCkgbmV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKGNoaWxkKTsKLQkJfQotCQlpZiAocHJldiA9PSBudWxsKQotCQkJdGhpcy5maXJzdENoaWxkID0gY2hpbGQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotCQljaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0JCWNoaWxkLnNldE5leHRTaWJsaW5nKG5leHQpOwotCQljaGlsZC5zZXRQYXJlbnROb2RlKHRoaXMpOwotCQkvLyBtYWtlIHN1cmUgaGF2aW5nIHRoZSBzYW1lIG93bmVyIGRvY3VtZW50Ci0JCWlmIChjaGlsZC5nZXRPd25lckRvY3VtZW50KCkgPT0gbnVsbCkgewotCQkJaWYgKGdldE5vZGVUeXBlKCkgPT0gRE9DVU1FTlRfTk9ERSkgewotCQkJCWNoaWxkLnNldE93bmVyRG9jdW1lbnQoKERvY3VtZW50KSB0aGlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuc2V0T3duZXJEb2N1bWVudChnZXRPd25lckRvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0KLQkJbm90aWZ5Q2hpbGRSZXBsYWNlZChjaGlsZCwgbnVsbCk7Ci0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFZGl0YWJsZSgpIHsKLQkJaWYgKCFmQ2hpbGRFZGl0YWJsZSkgewotCQkJWE1MTW9kZWxJbXBsIG1vZGVsID0gKFhNTE1vZGVsSW1wbCkgZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmlzUmVwYXJzaW5nKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNoaWxkRWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAodGhpcy5maXJzdENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAodGhpcy5jaGlsZE5vZGVzQ2FjaGUgPT0gbnVsbCkKLQkJCQl0aGlzLmNoaWxkTm9kZXNDYWNoZSA9IG5ldyBDaGlsZE5vZGVzQ2FjaGUoKTsKLQkJCXJldHVybiB0aGlzLmNoaWxkTm9kZXNDYWNoZS5pdGVtKGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIG5vdGlmeUNoaWxkUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hpbGRSZXBsYWNlZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN5bmNDaGlsZEVkaXRhYmxlU3RhdGUobmV3Q2hpbGQpOwotCi0JCVhNTE1vZGVsSW1wbCBtb2RlbCA9IChYTUxNb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5jaGlsZFJlcGxhY2VkKHRoaXMsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvbGRDaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gdGhpcykgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCS8vIHN5bmNocm9uaXplZCBpbiBjYXNlIGFub3RoZXIgdGhyZWFkIGlzIGdldHRpbmcgaXRlbSwgb3IgbGVuZ3RoCi0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBudWxsOyAvLyBpbnZhbGlkYXRlIGNoaWxkIG5vZGVzIGNhY2hlCi0JCX0KLQotCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgb2xkQ2hpbGQ7Ci0JCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCWNoaWxkLnNldEVkaXRhYmxlKHRydWUsIHRydWUpOyAvLyBjbGVhciBSZWFkT25seSBmbGFncwotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZpcnN0Q2hpbGQgPSBuZXh0OwotCQllbHNlCi0JCQlwcmV2LnNldE5leHRTaWJsaW5nKG5leHQpOwotCQlpZiAobmV4dCA9PSBudWxsKQotCQkJdGhpcy5sYXN0Q2hpbGQgPSBwcmV2OwotCQllbHNlCi0JCQluZXh0LnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZShudWxsKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKG51bGwsIGNoaWxkKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGROb2RlcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBuZXh0Q2hpbGQpIHsKLQkJCW5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlyZW1vdmVDaGlsZChjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqIEBwYXJhbSBmaXJzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGxhc3RDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IHJlbW92ZUNoaWxkTm9kZXMoTm9kZSBmaXJzdENoaWxkLCBOb2RlIGxhc3RDaGlsZCkgewotCQlpZiAoIWhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChnZXROb2RlVHlwZSgpID09IERPQ1VNRU5UX05PREUpCi0JCQlkb2N1bWVudCA9IChEb2N1bWVudCkgdGhpczsKLQkJZWxzZQotCQkJZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50RnJhZ21lbnQgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0JCWlmIChmcmFnbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCWZpcnN0Q2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChsYXN0Q2hpbGQgPT0gbnVsbCkKLQkJCWxhc3RDaGlsZCA9IGdldExhc3RDaGlsZCgpOwotCQlOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gbmV4dENoaWxkKSB7Ci0JCQluZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJcmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJaWYgKGNoaWxkID09IGxhc3RDaGlsZCkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBmcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpCi0JCQlpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG9sZENoaWxkKTsKLQkJcmV0dXJuIHJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaWYgKGZDaGlsZEVkaXRhYmxlID09IGVkaXRhYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCU5vZGUgbm9kZTsKLQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQlmb3IgKG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJvYy51bmxvY2tOb2RlKChYTUxOb2RlKSBub2RlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAobm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJcm9jLmxvY2tOb2RlKChYTUxOb2RlKSBub2RlKTsKLQkJCX0KLQkJfQotCi0JCWZDaGlsZEVkaXRhYmxlID0gZWRpdGFibGU7Ci0JCW5vdGlmeUVkaXRhYmxlQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNDaGlsZEVkaXRhYmxlU3RhdGUoTm9kZSBjaGlsZCkgewotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChmQ2hpbGRFZGl0YWJsZSkgewotCQkJcm9jLnVubG9ja05vZGUoKE5vZGVJbXBsKSBjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQlyb2MubG9ja05vZGUoKE5vZGVJbXBsKSBjaGlsZCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYTVkZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BYnN0cmFjdE5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogTm9kZUltcGwgY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVJbXBsIGV4dGVuZHMgQWJzdHJhY3ROb3RpZmllciBpbXBsZW1lbnRzIFhNTE5vZGUgewotCS8vIGRlZmluZSBvbmUgZW1wdHkgbm9kZWxpc3QsIGZvciByZXBlYXRlZCB1c2UKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBOb2RlTGlzdCBFTVBUWV9OT0RFX0xJU1QgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkRhdGFFZGl0YWJsZSA9IHRydWU7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIG5leHRTaWJsaW5nID0gbnVsbDsKLQotCXByaXZhdGUgRG9jdW1lbnRJbXBsIG93bmVyRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgcGFyZW50Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlSW1wbCBwcmV2aW91c1NpYmxpbmcgPSBudWxsOwotCi0JLyoqCi0JICogTm9kZUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm9kZUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgTm9kZUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUltcGwoTm9kZUltcGwgdGhhdCkgewotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm93bmVyRG9jdW1lbnQgPSB0aGF0Lm93bmVyRG9jdW1lbnQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmRDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXcgU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnRhaW5zIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIChvZmZzZXQgPj0gZ2V0U3RhcnRPZmZzZXQoKSAmJiBvZmZzZXQgPCBnZXRFbmRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZURPTUV4Y2VwdGlvbk1lc3NhZ2Uoc2hvcnQgcywgU3RyaW5nIHRhZ05hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIFRPRE86IFNob3VsZCBsb2NhbGl6ZSB0aGVzZSBtZXNzYWdlcywgYW5kIHByb3ZpZGUgL3UgZXNjYXBlZAotCQkvLyB2ZXJzaW9uIG9mIHRhZ05hbWUKLQkJcmVzdWx0ID0gbG9va3VwTWVzc2FnZShzKSArICIgIiArIHRhZ05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENoYXJWYWx1ZShTdHJpbmcgbmFtZSkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkb2N1bWVudC5nZXRDaGFyVmFsdWUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCS8vIEFzIHBlciBET00gc3BlYywgY29ycmVjdCBiZWhhdmlvciBmb3IgZ2V0Q2hpbGROb2RlcyBpcyB0byByZXR1cm4gYQotCQkvLyB6ZXJvIGxlbmd0aCBOb2RlTGlzdCwgbm90IG51bGwsIHdoZW4gdGhlcmUgYXJlIG5vIGNoaWxkcmVuLgotCQkvLyBXZSdsbCB1c2UgYSBjb21tb24gaW5zdGFuY2Ugb2YgYW4gZW1wdHkgbm9kZSBsaXN0LCBqdXN0IHRvIHByZXZlbnQKLQkJLy8gY3JlYXRpbmcgYSB0cml2YWwgb2JqZWN0IG1hbnkgbWFueSB0aW1lcy4KLQotCQlyZXR1cm4gRU1QVFlfTk9ERV9MSVNUOwotCX0KLQotCS8qKgotCSAqIGdldENvbW1vbkFuY2VzdG9yIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q29tbW9uQW5jZXN0b3IoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKE5vZGUgbmEgPSBub2RlOyBuYSAhPSBudWxsOyBuYSA9IG5hLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChOb2RlIHRhID0gdGhpczsgdGEgIT0gbnVsbDsgdGEgPSB0YS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAodGEgPT0gbmEpCi0JCQkJCXJldHVybiB0YTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb250YWluZXJEb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHVibGljIERvY3VtZW50IGdldENvbnRhaW5lckRvY3VtZW50KCkgewotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCXJldHVybiAoRG9jdW1lbnQpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW5kT2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCU5vZGUgbm9kZSA9IHRoaXM7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQkJCXJldHVybiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCQl9Ci0KLQkJCU5vZGUgbGFzdCA9IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpZiAobGFzdCAhPSBudWxsKSB7IC8vIGRpZyBpbnRvIHRoZSBsYXN0Ci0JCQkJbm9kZSA9IGxhc3Q7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9ICgoTm9kZUltcGwpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQlyZXR1cm4gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQotCQkJTm9kZSBwcmV2ID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmIChwcmV2ICE9IG51bGwpIHsgLy8gbW92ZSB0byB0aGUgcHJldmlvdXMKLQkJCQlub2RlID0gcHJldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCW5vZGUgPSBudWxsOwotCQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJfQotCQkJCU5vZGUgcGFyZW50UHJldiA9IHBhcmVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQlpZiAocGFyZW50UHJldiAhPSBudWxsKSB7IC8vIG1vdmUgdG8gdGhlIHByZXZpb3VzCi0JCQkJCW5vZGUgPSBwYXJlbnRQcmV2OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJWE1MTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJSUZhY3RvcnlSZWdpc3RyeSByZWcgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0Q2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5mbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsgLy8gZXJyb3IKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgPT0gdGhpcykKLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCQlpbmRleCsrOwotCQl9Ci0JCXJldHVybiAtMTsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKiBnZXRMYXN0Q2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5mbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbiBqdXN0IHJlZmVyIHRvIHRoZSBvd25pbmcgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgWE1MTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCWlmICh0aGlzLm93bmVyRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogYWxsIGJ1dCBhdHRyIHJldHVybiBudWxsCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROZXh0U2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMubmV4dFNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZUF0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCU5vZGUgZ2V0Tm9kZUF0KGludCBvZmZzZXQpIHsKLQkJWE1MTm9kZSBwYXJlbnQgPSB0aGlzOwotCQlYTUxOb2RlIGNoaWxkID0gKFhNTE5vZGUpIGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXRFbmRPZmZzZXQoKSA8PSBvZmZzZXQpIHsKLQkJCQljaGlsZCA9IChYTUxOb2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJfQotCi0JCQkvLyBkaWcgbW9yZQotCQkJcGFyZW50ID0gY2hpbGQ7Ci0JCQljaGlsZCA9IChYTUxOb2RlKSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0T3duZXJEb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHVibGljIERvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0UGFyZW50Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcmV2aW91c1NpYmxpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5wcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCWlmICh0aGlzLmZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlyZXR1cm4gdGhpcy5mbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJTm9kZUltcGwgcHJldiA9IChOb2RlSW1wbCkgZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWlmIChwcmV2ICE9IG51bGwpCi0JCQlyZXR1cm4gcHJldi5nZXRFbmRPZmZzZXQoKTsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJaWYgKGVsZW1lbnQuaGFzU3RhcnRUYWcoKSkKLQkJCQlyZXR1cm4gZWxlbWVudC5nZXRTdGFydEVuZE9mZnNldCgpOwotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQkvLyBmaW5hbCBmYWxsYmFjayB0byBsb29rIGludG8gZmlyc3QgY2hpbGQKLQkJTm9kZUltcGwgY2hpbGQgPSAoTm9kZUltcGwpIGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY2hpbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChjaGlsZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCXJldHVybiBjaGlsZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJY2hpbGQgPSAoTm9kZUltcGwpIGNoaWxkLmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogRXZlcnkgbm9kZSAoaW5kaXJlY3RseSkga25vd3MgaXRzIHN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiB0aGlzLmZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqIGFsbCBidXQgYXR0ciByZXR1cm4gbnVsbAotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRWYWx1ZVJlZ2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBoYXNDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBoYXNQcm9wZXJ0aWVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRCZWZvcmUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZkNoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDaGlsZEVkaXRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGlzQ29udGFpbmVyIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEYXRhRWRpdGFibGUoKSB7Ci0JCWlmICghZkRhdGFFZGl0YWJsZSkgewotCQkJWE1MTW9kZWxJbXBsIG1vZGVsID0gKFhNTE1vZGVsSW1wbCkgZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmlzUmVwYXJzaW5nKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkRhdGFFZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZChTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKHRoaXMub3duZXJEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlET01JbXBsZW1lbnRhdGlvbiBpbXBsID0gdGhpcy5vd25lckRvY3VtZW50LmdldEltcGxlbWVudGF0aW9uKCk7Ci0JCWlmIChpbXBsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpbXBsLmhhc0ZlYXR1cmUoZmVhdHVyZSwgdmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbG9va3VwTWVzc2FnZShzaG9ydCBzKSB7Ci0JCS8vIFRPRE86IG1ha2UgbG9jYWxpemVkIHZlcnNpb24KLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXN3aXRjaCAocykgewotCQkJY2FzZSBET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSIDoKLQkJCQlyZXN1bHQgPSAiSU5WQUxJRF9DSEFSQUNURVJfRVJSIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlyZXN1bHQgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBub3JtYWxpemUgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgbm9ybWFsaXplKCkgewotCQlUZXh0SW1wbCBwcmV2VGV4dCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIFRFWFRfTk9ERSA6IHsKLQkJCQkJaWYgKHByZXZUZXh0ID09IG51bGwpIHsKLQkJCQkJCXByZXZUZXh0ID0gKFRleHRJbXBsKSBjaGlsZDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KSBjaGlsZDsKLQkJCQkJcmVtb3ZlQ2hpbGQodGV4dCk7Ci0JCQkJCXByZXZUZXh0LmFwcGVuZFRleHQodGV4dCk7Ci0JCQkJCWNoaWxkID0gcHJldlRleHQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIEVMRU1FTlRfTk9ERSA6IHsKLQkJCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkOwotCQkJCQllbGVtZW50Lm5vcm1hbGl6ZSgpOwotCQkJCQlwcmV2VGV4dCA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJcHJldlRleHQgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUVkaXRhYmxlQ2hhbmdlZCgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsSW1wbCBtb2RlbCA9IChYTUxNb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5lZGl0YWJsZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZCgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc3luY0RhdGFFZGl0YWJsZVN0YXRlKCk7Ci0KLQkJWE1MTW9kZWxJbXBsIG1vZGVsID0gKFhNTE1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLnZhbHVlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgbmV3IFN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkTm9kZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQKLQkgKiBAcGFyYW0gZmlyc3RDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBsYXN0Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCByZW1vdmVDaGlsZE5vZGVzKE5vZGUgZmlyc3RDaGlsZCwgTm9kZSBsYXN0Q2hpbGQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZUNoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXcgU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyBjaGlsZHJlbiB2YWx1ZXMgZnJvbSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlmb3IgKE5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQljaGlsZC5yZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJfQotCQl0aGlzLmZsYXROb2RlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJLy8gbm9wCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YUVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaWYgKGZEYXRhRWRpdGFibGUgPT0gZWRpdGFibGUpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVJlYWRPbmx5Q29udHJvbGxlciByb2MgPSBSZWFkT25seUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQlyb2MudW5sb2NrRGF0YSh0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCXJvYy5sb2NrRGF0YSh0aGlzKTsKLQkJfQotCi0JCWZEYXRhRWRpdGFibGUgPSBlZGl0YWJsZTsKLQotCQlub3RpZnlFZGl0YWJsZUNoYW5nZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlLCBib29sZWFuIGRlZXApIHsKLQkJaWYgKGRlZXApIHsKLQkJCVhNTE5vZGUgbm9kZSA9IChYTUxOb2RlKSBnZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZS5zZXRFZGl0YWJsZShlZGl0YWJsZSwgZGVlcCk7Ci0JCQkJbm9kZSA9IChYTUxOb2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJc2V0Q2hpbGRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCXNldERhdGFFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0TmV4dFNpYmxpbmcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5leHRTaWJsaW5nCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmV4dFNpYmxpbmcoTm9kZSBuZXh0U2libGluZykgewotCQl0aGlzLm5leHRTaWJsaW5nID0gKE5vZGVJbXBsKSBuZXh0U2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGVWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBzZXRPd25lckRvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvd25lckRvY3VtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQl0aGlzLm93bmVyRG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBvd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCXRoaXMub3duZXJEb2N1bWVudCA9IChEb2N1bWVudEltcGwpIG93bmVyRG9jdW1lbnQ7Ci0KLQkJaWYgKGRlZXApIHsKLQkJCWZvciAoTm9kZUltcGwgY2hpbGQgPSAoTm9kZUltcGwpIGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSAoTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQljaGlsZC5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQsIGRlZXApOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0UGFyZW50Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFBhcmVudE5vZGUoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IChOb2RlSW1wbCkgcGFyZW50Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogc2V0UHJldmlvdXNTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwcmV2aW91c1NpYmxpbmcKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcmV2aW91c1NpYmxpbmcoTm9kZSBwcmV2aW91c1NpYmxpbmcpIHsKLQkJdGhpcy5wcmV2aW91c1NpYmxpbmcgPSAoTm9kZUltcGwpIHByZXZpb3VzU2libGluZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQl0aGlzLmZsYXROb2RlID0gZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlzZXROb2RlVmFsdWUoc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jRGF0YUVkaXRhYmxlU3RhdGUoKSB7Ci0JCVJlYWRPbmx5Q29udHJvbGxlciByb2MgPSBSZWFkT25seUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGZEYXRhRWRpdGFibGUpIHsKLQkJCXJvYy51bmxvY2tEYXRhKHRoaXMpOwotCQl9IGVsc2UgewotCQkJcm9jLmxvY2tEYXRhKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdG9TdHJpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVJdGVyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhMjc4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVJdGVyYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotCi0vKioKLSAqIE5vZGVJdGVyYXRvckltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE5vZGVJdGVyYXRvckltcGwgaW1wbGVtZW50cyBOb2RlSXRlcmF0b3IgewotCXByaXZhdGUgTm9kZUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCXByaXZhdGUgTm9kZSBuZXh0Tm9kZSA9IG51bGw7Ci0KLQlwcml2YXRlIE5vZGUgcm9vdE5vZGUgPSBudWxsOwotCXByaXZhdGUgaW50IHdoYXRUb1Nob3cgPSBOb2RlRmlsdGVyLlNIT1dfQUxMOwotCi0JLyoqCi0JICogTm9kZUl0ZXJhdG9ySW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSByb290Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGVJdGVyYXRvckltcGwoTm9kZSByb290Tm9kZSwgaW50IHdoYXRUb1Nob3csIE5vZGVGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMucm9vdE5vZGUgPSByb290Tm9kZTsKLQkJdGhpcy5uZXh0Tm9kZSA9IHJvb3ROb2RlOwotCQl0aGlzLndoYXRUb1Nob3cgPSB3aGF0VG9TaG93OwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWNjZXB0Tm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKHRoaXMud2hhdFRvU2hvdyAhPSBOb2RlRmlsdGVyLlNIT1dfQUxMKSB7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJc3dpdGNoICh0aGlzLndoYXRUb1Nob3cpIHsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19BVFRSSUJVVEUgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfVEVYVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfQ0RBVEFfU0VDVElPTiA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRU5USVRZIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRU5USVRZX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0NPTU1FTlQgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5DT01NRU5UX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRE9DVU1FTlRfVFlQRSA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRE9DVU1FTlRfRlJBR01FTlQgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19OT1RBVElPTiA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLk5PVEFUSU9OX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoaXMuZmlsdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiAodGhpcy5maWx0ZXIuYWNjZXB0Tm9kZShub2RlKSA9PSBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERldGFjaGVzIHRoZSA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+IGZyb20gdGhlIHNldCB3aGljaCBpdCBpdGVyYXRlZAotCSAqIG92ZXIsIHJlbGVhc2luZyBhbnkgY29tcHV0YXRpb25hbCByZXNvdXJjZXMgYW5kIHBsYWNpbmcgdGhlIGl0ZXJhdG9yIGluCi0JICogdGhlIElOVkFMSUQgc3RhdGUuIEFmdGVyIDxjb2RlPmRldGFjaDwvY29kZT4gaGFzIGJlZW4gaW52b2tlZCwgY2FsbHMKLQkgKiB0byA8Y29kZT5uZXh0Tm9kZTwvY29kZT4gb3IgPGNvZGU+cHJldmlvdXNOb2RlPC9jb2RlPiB3aWxsIHJhaXNlCi0JICogdGhlIGV4Y2VwdGlvbiBJTlZBTElEX1NUQVRFX0VSUi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXRhY2goKSB7Ci0JCXRoaXMucm9vdE5vZGUgPSBudWxsOwotCQl0aGlzLm5leHROb2RlID0gbnVsbDsKLQkJdGhpcy5maWx0ZXIgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjaGlsZHJlbiBvZiBlbnRpdHkKLQkgKiByZWZlcmVuY2Ugbm9kZXMgYXJlIHZpc2libGUgdG8gdGhlIGl0ZXJhdG9yLiBJZiBmYWxzZSwgdGhleSBhbmQgdGhlaXIKLQkgKiBkZXNjZW5kYW50cyB3aWxsIGJlIHJlamVjdGVkLiBOb3RlIHRoYXQgdGhpcyByZWplY3Rpb24gdGFrZXMgcHJlY2VkZW5jZQotCSAqIG92ZXIgPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gYW5kIHRoZSBmaWx0ZXIuIEFsc28gbm90ZSB0aGF0IHRoaXMgaXMKLQkgKiBjdXJyZW50bHkgdGhlIG9ubHkgc2l0dWF0aW9uIHdoZXJlIDxjb2RlPk5vZGVJdGVyYXRvcnM8L2NvZGU+IG1heQotCSAqIHJlamVjdCBhIGNvbXBsZXRlIHN1YnRyZWUgcmF0aGVyIHRoYW4gc2tpcHBpbmcgaW5kaXZpZHVhbCBub2Rlcy4gPGJyPgotCSAqIDxicj4KLQkgKiBUbyBwcm9kdWNlIGEgdmlldyBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgZW50aXR5IHJlZmVyZW5jZXMgZXhwYW5kZWQKLQkgKiBhbmQgZG9lcyBub3QgZXhwb3NlIHRoZSBlbnRpdHkgcmVmZXJlbmNlIG5vZGUgaXRzZWxmLCB1c2UgdGhlCi0JICogPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gZmxhZ3MgdG8gaGlkZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZAotCSAqIHNldCA8Y29kZT5leHBhbmRFbnRpdHlSZWZlcmVuY2VzPC9jb2RlPiB0byB0cnVlIHdoZW4gY3JlYXRpbmcgdGhlCi0JICogaXRlcmF0b3IuIFRvIHByb2R1Y2UgYSB2aWV3IG9mIHRoZSBkb2N1bWVudCB0aGF0IGhhcyBlbnRpdHkgcmVmZXJlbmNlCi0JICogbm9kZXMgYnV0IG5vIGVudGl0eSBleHBhbnNpb24sIHVzZSB0aGUgPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gZmxhZ3MKLQkgKiB0byBzaG93IHRoZSBlbnRpdHkgcmVmZXJlbmNlIG5vZGUgYW5kIHNldAotCSAqIDxjb2RlPmV4cGFuZEVudGl0eVJlZmVyZW5jZXM8L2NvZGU+IHRvIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiB1c2VkIHRvIHNjcmVlbiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgTm9kZUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIE5vZGUgZ2V0TmV4dE5vZGUoKSB7Ci0JCWlmICh0aGlzLm5leHROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBvbGROZXh0ID0gdGhpcy5uZXh0Tm9kZTsKLQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJdGhpcy5uZXh0Tm9kZSA9IGNoaWxkOwotCQkJcmV0dXJuIG9sZE5leHQ7Ci0JCX0KLQkJZm9yIChOb2RlIG5vZGUgPSB0aGlzLm5leHROb2RlOyBub2RlICE9IG51bGwgJiYgbm9kZSAhPSB0aGlzLnJvb3ROb2RlOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLm5leHROb2RlID0gbmV4dDsKLQkJCQlyZXR1cm4gb2xkTmV4dDsKLQkJCX0KLQkJfQotCQl0aGlzLm5leHROb2RlID0gbnVsbDsKLQkJcmV0dXJuIG9sZE5leHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOb2RlIGdldFByZXZpb3VzTm9kZSgpIHsKLQkJaWYgKHRoaXMubmV4dE5vZGUgPT0gdGhpcy5yb290Tm9kZSkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlIHByZXYgPSBudWxsOwotCQlpZiAodGhpcy5uZXh0Tm9kZSA9PSBudWxsKSB7Ci0JCQlwcmV2ID0gdGhpcy5yb290Tm9kZTsgLy8gbmV2ZXIgbnVsbAotCQl9IGVsc2UgewotCQkJcHJldiA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5uZXh0Tm9kZSA9IHRoaXMubmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCXJldHVybiB0aGlzLm5leHROb2RlOwotCQkJfQotCQl9Ci0JCU5vZGUgbGFzdCA9IHByZXYuZ2V0TGFzdENoaWxkKCk7Ci0JCXdoaWxlIChsYXN0ICE9IG51bGwpIHsKLQkJCXByZXYgPSBsYXN0OwotCQkJbGFzdCA9IHByZXYuZ2V0TGFzdENoaWxkKCk7Ci0JCX0KLQkJdGhpcy5uZXh0Tm9kZSA9IHByZXY7Ci0JCXJldHVybiB0aGlzLm5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIFRoZSByb290IG5vZGUgb2YgdGhlIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4sIGFzIHNwZWNpZmllZCB3aGVuIGl0Ci0JICogd2FzIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXMucm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB3aGljaCBub2RlIHR5cGVzIGFyZSBwcmVzZW50ZWQgdmlhIHRoZQotCSAqIGl0ZXJhdG9yLiBUaGUgYXZhaWxhYmxlIHNldCBvZiBjb25zdGFudHMgaXMgZGVmaW5lZCBpbiB0aGUKLQkgKiA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiBpbnRlcmZhY2UuIE5vZGVzIG5vdCBhY2NlcHRlZCBieQotCSAqIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IHdpbGwgYmUgc2tpcHBlZCwgYnV0IHRoZWlyIGNoaWxkcmVuIG1heSBzdGlsbAotCSAqIGJlIGNvbnNpZGVyZWQuIE5vdGUgdGhhdCB0aGlzIHNraXAgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBmaWx0ZXIsIGlmCi0JICogYW55LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2hhdFRvU2hvdygpIHsKLQkJcmV0dXJuIHRoaXMud2hhdFRvU2hvdzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHNldCBhbmQgYWR2YW5jZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotCSAqIGl0ZXJhdG9yIGluIHRoZSBzZXQuIEFmdGVyIGEgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBpcyBjcmVhdGVkLAotCSAqIHRoZSBmaXJzdCBjYWxsIHRvIDxjb2RlPm5leHROb2RlKCk8L2NvZGU+IHJldHVybnMgdGhlIGZpcnN0IG5vZGUgaW4KLQkgKiB0aGUgc2V0LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5leHQgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZCBvdmVyLCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyCi0JICogICAgICAgICAgICAgICAgdGhlIDxjb2RlPmRldGFjaDwvY29kZT4gbWV0aG9kIHdhcyBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBOb2RlIG5leHROb2RlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWZvciAoTm9kZSBub2RlID0gZ2V0TmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gZ2V0TmV4dE5vZGUoKSkgewotCQkJaWYgKGFjY2VwdE5vZGUobm9kZSkpCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJldmlvdXMgbm9kZSBpbiB0aGUgc2V0IGFuZCBtb3ZlcyB0aGUgcG9zaXRpb24gb2YgdGhlCi0JICogPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBiYWNrd2FyZHMgaW4gdGhlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwcmV2aW91cyA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkCi0JICogICAgICAgICBvdmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBtZW1iZXJzIGluCi0JICogICAgICAgICB0aGF0IHNldC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyCi0JICogICAgICAgICAgICAgICAgdGhlIDxjb2RlPmRldGFjaDwvY29kZT4gbWV0aG9kIHdhcyBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBOb2RlIHByZXZpb3VzTm9kZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlmb3IgKE5vZGUgbm9kZSA9IGdldFByZXZpb3VzTm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBnZXRQcmV2aW91c05vZGUoKSkgewotCQkJaWYgKGFjY2VwdE5vZGUobm9kZSkpCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZmVkNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBOb2RlTGlzdEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLQotCU9iamVjdCBsb2NrT2JqZWN0ID0gbmV3IGJ5dGVbMF07Ci0KLQlwcml2YXRlIFZlY3RvciBub2RlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBOb2RlTGlzdEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGFwcGVuZE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBhcHBlbmROb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQl0aGlzLm5vZGVzID0gbmV3IFZlY3RvcigpOwotCQl0aGlzLm5vZGVzLmFkZEVsZW1lbnQobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlyZXR1cm4gdGhpcy5ub2Rlcy5zaXplKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBpbnNlcnROb2RlKE5vZGUgbm9kZSwgaW50IGluZGV4KSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCB8fCBpbmRleCA+PSB0aGlzLm5vZGVzLnNpemUoKSkgewotCQkJcmV0dXJuIGFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQkJdGhpcy5ub2Rlcy5pbnNlcnRFbGVtZW50QXQobm9kZSwgaW5kZXgpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKE5vZGUpIHRoaXMubm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSByZW1vdmVOb2RlKGludCBpbmRleCkgewotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIG5vIG5vZGUKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLm5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCi0JCU5vZGUgcmVtb3ZlZCA9IChOb2RlKSB0aGlzLm5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JCXRoaXMubm9kZXMucmVtb3ZlRWxlbWVudEF0KGluZGV4KTsKLQkJcmV0dXJuIHJlbW92ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob3RhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm90YXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDg5NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob3RhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob3RhdGlvbjsKLQotLyoqCi0gKiBOb3RhdGlvbkltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE5vdGF0aW9uSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgTm90YXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCS8qKgotCSAqIE5vdGF0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBOb3RhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90YXRpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vdGF0aW9uSW1wbAotCSAqLwotCXByb3RlY3RlZCBOb3RhdGlvbkltcGwoTm90YXRpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQkJdGhpcy5wdWJsaWNJZCA9IHRoYXQucHVibGljSWQ7Ci0JCQl0aGlzLnN5c3RlbUlkID0gdGhhdC5zeXN0ZW1JZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJTm90YXRpb25JbXBsIGNsb25lZCA9IG5ldyBOb3RhdGlvbkltcGwodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gTk9UQVRJT05fTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaWNJZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTeXN0ZW1JZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gdGhpcy5zeXN0ZW1JZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIHNldFB1YmxpY0lkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQl0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogc2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTlhNGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotCi0vKioKLSAqIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIFhNTEpTUFJlZ2lvbkNvbnRleHRzLCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gewotCXByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0ID0gbnVsbDsKLQotCS8qKgotCSAqIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy50YXJnZXQgPSB0aGF0LnRhcmdldDsKLQkJCXRoaXMuZGF0YSA9IHRoYXQuZ2V0RGF0YSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGNsb25lZCA9IG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKHRoaXMpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlpZiAodGhpcy5kYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5kYXRhOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBkYXRhUmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb24gY2xvc2VSZWdpb24gPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpIHsKLQkJCQljbG9zZVJlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRhcmdldFJlZ2lvbiA9PSBudWxsKQotCQkJCQl0YXJnZXRSZWdpb24gPSByZWdpb247Ci0JCQkJZWxzZSBpZiAoZGF0YVJlZ2lvbiA9PSBudWxsKQotCQkJCQlkYXRhUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQl9Ci0JCWlmIChkYXRhUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpbnQgb2Zmc2V0ID0gZGF0YVJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgZW5kID0gZmxhdE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChjbG9zZVJlZ2lvbiAhPSBudWxsKQotCQkJZW5kID0gY2xvc2VSZWdpb24uZ2V0U3RhcnQoKTsKLQkJU3RyaW5nIHNvdXJjZSA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldERhdGEoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUYXJnZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0JCWlmICh0aGlzLnRhcmdldCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXRoaXMuZGF0YSA9IGdldERhdGEoKTsKLQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCX0KLQotCS8qKgotCSAqIHNldERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmRhdGEgPSBkYXRhOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXREYXRhKG5vZGVWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMuZGF0YSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc2V0VGFyZ2V0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldCkgewotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldFRhcmdldCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlidWZmZXIuYXBwZW5kKGdldERhdGEoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmFuZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JhbmdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzU0YmE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmFuZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5SYW5nZTsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuUmFuZ2VFeGNlcHRpb247Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBSYW5nZUltcGwgaW1wbGVtZW50cyBSYW5nZSB7Ci0JcHJpdmF0ZSBOb2RlIGVuZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZW5kT2Zmc2V0ID0gMDsKLQotCXByaXZhdGUgTm9kZSBzdGFydENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAwOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFJhbmdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgUmFuZ2VJbXBsKFJhbmdlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydENvbnRhaW5lciA9IHRoYXQuc3RhcnRDb250YWluZXI7Ci0JCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdGhhdC5zdGFydE9mZnNldDsKLQkJCXRoaXMuZW5kQ29udGFpbmVyID0gdGhhdC5lbmRDb250YWluZXI7Ci0JCQl0aGlzLmVuZE9mZnNldCA9IHRoYXQuZW5kT2Zmc2V0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogRHVwbGljYXRlcyB0aGUgY29udGVudHMgb2YgYSBSYW5nZQotCSAqIAotCSAqIEByZXR1cm4gQSBEb2N1bWVudEZyYWdtZW50IHRoYXQgY29udGFpbnMgY29udGVudCBlcXVpdmFsZW50IHRvIHRoaXMKLQkgKiAgICAgICAgIFJhbmdlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgYSBEb2N1bWVudFR5cGUgbm9kZQotCSAqICAgICAgICAgICAgICAgIHdvdWxkIGJlIGV4dHJhY3RlZCBpbnRvIHRoZSBuZXcgRG9jdW1lbnRGcmFnbWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGNsb25lQ29udGVudHMoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQcm9kdWNlcyBhIG5ldyBSYW5nZSB3aG9zZSBib3VuZGFyeS1wb2ludHMgYXJlIGVxdWFsIHRvIHRoZQotCSAqIGJvdW5kYXJ5LXBvaW50cyBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQHJldHVybiBUaGUgZHVwbGljYXRlZCBSYW5nZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBSYW5nZSBjbG9uZVJhbmdlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmFuZ2VJbXBsKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENvbGxhcHNlIGEgUmFuZ2Ugb250byBvbmUgb2YgaXRzIGJvdW5kYXJ5LXBvaW50cwotCSAqIAotCSAqIEBwYXJhbSB0b1N0YXJ0SWYKLQkgKiAgICAgICAgICAgIFRSVUUsIGNvbGxhcHNlcyB0aGUgUmFuZ2Ugb250byBpdHMgc3RhcnQ7IGlmIEZBTFNFLAotCSAqICAgICAgICAgICAgY29sbGFwc2VzIGl0IG9udG8gaXRzIGVuZC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbGxhcHNlKGJvb2xlYW4gdG9TdGFydCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0b1N0YXJ0KSB7Ci0JCQl0aGlzLmVuZENvbnRhaW5lciA9IHRoaXMuc3RhcnRDb250YWluZXI7Ci0JCQl0aGlzLmVuZE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQ7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gdGhpcy5lbmRDb250YWluZXI7Ci0JCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wYXJlIHRoZSBib3VuZGFyeS1wb2ludHMgb2YgdHdvIFJhbmdlcyBpbiBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBob3dBCi0JICogICAgICAgICAgICBjb2RlIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBjb21wYXJpc29uLCBhcyBkZWZpbmVkIGFib3ZlLgotCSAqIEBwYXJhbSBzb3VyY2VSYW5nZVRoZQotCSAqICAgICAgICAgICAgPGNvZGU+UmFuZ2U8L2NvZGU+IG9uIHdoaWNoIHRoaXMgY3VycmVudAotCSAqICAgICAgICAgICAgPGNvZGU+UmFuZ2U8L2NvZGU+IGlzIGNvbXBhcmVkIHRvLgotCSAqIEByZXR1cm4gLTEsIDAgb3IgMSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29ycmVzcG9uZGluZwotCSAqICAgICAgICAgYm91bmRhcnktcG9pbnQgb2YgdGhlIFJhbmdlIGlzIHJlc3BlY3RpdmVseSBiZWZvcmUsIGVxdWFsIHRvLAotCSAqICAgICAgICAgb3IgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgYm91bmRhcnktcG9pbnQgb2YKLQkgKiAgICAgICAgIDxjb2RlPnNvdXJjZVJhbmdlPC9jb2RlPi4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIHRoZSB0d28gUmFuZ2VzIGFyZSBub3QgaW4KLQkgKiAgICAgICAgICAgICAgICB0aGUgc2FtZSBEb2N1bWVudCBvciBEb2N1bWVudEZyYWdtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHNob3J0IGNvbXBhcmVCb3VuZGFyeVBvaW50cyhzaG9ydCBob3csIFJhbmdlIHNvdXJjZVJhbmdlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHNvdXJjZVJhbmdlID09IG51bGwpCi0JCQlyZXR1cm4gKHNob3J0KSAwOyAvLyBlcnJvcgotCi0JCU5vZGUgY29udGFpbmVyMSA9IG51bGw7Ci0JCWludCBvZmZzZXQxID0gMDsKLQkJTm9kZSBjb250YWluZXIyID0gbnVsbDsKLQkJaW50IG9mZnNldDIgPSAwOwotCi0JCXN3aXRjaCAoaG93KSB7Ci0JCQljYXNlIFNUQVJUX1RPX1NUQVJUIDoKLQkJCQljb250YWluZXIxID0gdGhpcy5zdGFydENvbnRhaW5lcjsKLQkJCQlvZmZzZXQxID0gdGhpcy5zdGFydE9mZnNldDsKLQkJCQljb250YWluZXIyID0gc291cmNlUmFuZ2UuZ2V0U3RhcnRDb250YWluZXIoKTsKLQkJCQlvZmZzZXQyID0gc291cmNlUmFuZ2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBUlRfVE9fRU5EIDoKLQkJCQljb250YWluZXIxID0gdGhpcy5zdGFydENvbnRhaW5lcjsKLQkJCQlvZmZzZXQxID0gdGhpcy5zdGFydE9mZnNldDsKLQkJCQljb250YWluZXIyID0gc291cmNlUmFuZ2UuZ2V0RW5kQ29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldEVuZE9mZnNldCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkRfVE9fRU5EIDoKLQkJCQljb250YWluZXIxID0gdGhpcy5lbmRDb250YWluZXI7Ci0JCQkJb2Zmc2V0MSA9IHRoaXMuZW5kT2Zmc2V0OwotCQkJCWNvbnRhaW5lcjIgPSBzb3VyY2VSYW5nZS5nZXRFbmRDb250YWluZXIoKTsKLQkJCQlvZmZzZXQyID0gc291cmNlUmFuZ2UuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVORF9UT19TVEFSVCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuZW5kQ29udGFpbmVyOwotCQkJCW9mZnNldDEgPSB0aGlzLmVuZE9mZnNldDsKLQkJCQljb250YWluZXIyID0gc291cmNlUmFuZ2UuZ2V0U3RhcnRDb250YWluZXIoKTsKLQkJCQlvZmZzZXQyID0gc291cmNlUmFuZ2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAoc2hvcnQpIDA7IC8vIGVycm9yCi0JCX0KLQotCQlyZXR1cm4gY29tcGFyZVBvaW50cyhjb250YWluZXIxLCBvZmZzZXQxLCBjb250YWluZXIyLCBvZmZzZXQyKTsKLQl9Ci0KLQkvKgotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBjb21wYXJlUG9pbnRzKE5vZGUgY29udGFpbmVyMSwgaW50IG9mZnNldDEsIE5vZGUgY29udGFpbmVyMiwgaW50IG9mZnNldDIpIHsKLQkJaWYgKGNvbnRhaW5lcjEgPT0gbnVsbCB8fCBjb250YWluZXIyID09IG51bGwpCi0JCQlyZXR1cm4gKHNob3J0KSAwOyAvLyBlcnJvcgotCi0JCWlmIChjb250YWluZXIxID09IGNvbnRhaW5lcjIpIHsKLQkJCWlmIChvZmZzZXQxID4gb2Zmc2V0MikKLQkJCQlyZXR1cm4gKHNob3J0KSAxOwotCQkJaWYgKG9mZnNldDEgPCBvZmZzZXQyKQotCQkJCXJldHVybiAoc2hvcnQpIC0xOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvLyBnZXQgbm9kZSBvZmZzZXRzCi0JCVhNTE5vZGUgbm9kZTEgPSBudWxsOwotCQlpZiAoY29udGFpbmVyMS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCU5vZGUgY2hpbGQgPSBjb250YWluZXIxLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0MTsgaSsrKSB7Ci0JCQkJTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQljaGlsZCA9IG5leHQ7Ci0JCQl9Ci0JCQlub2RlMSA9IChYTUxOb2RlKSBjaGlsZDsKLQkJCW9mZnNldDEgPSAwOwotCQl9IGVsc2UgewotCQkJbm9kZTEgPSAoWE1MTm9kZSkgY29udGFpbmVyMTsKLQkJfQotCQlpbnQgbm9kZU9mZnNldDEgPSBub2RlMS5nZXRTdGFydE9mZnNldCgpOwotCQlYTUxOb2RlIG5vZGUyID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lcjIuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlOb2RlIGNoaWxkID0gY29udGFpbmVyMi5nZXRGaXJzdENoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDI7IGkrKykgewotCQkJCU5vZGUgbmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQkJY2hpbGQgPSBuZXh0OwotCQkJfQotCQkJbm9kZTIgPSAoWE1MTm9kZSkgY2hpbGQ7Ci0JCQlvZmZzZXQyID0gMDsKLQkJfSBlbHNlIHsKLQkJCW5vZGUyID0gKFhNTE5vZGUpIGNvbnRhaW5lcjE7Ci0JCX0KLQkJaW50IG5vZGVPZmZzZXQyID0gbm9kZTIuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlpZiAobm9kZU9mZnNldDEgPiBub2RlT2Zmc2V0MikKLQkJCXJldHVybiAoc2hvcnQpIDE7Ci0JCWlmIChub2RlT2Zmc2V0MSA8IG5vZGVPZmZzZXQyKQotCQkJcmV0dXJuIChzaG9ydCkgLTE7Ci0JCWlmIChvZmZzZXQxID4gb2Zmc2V0MikKLQkJCXJldHVybiAoc2hvcnQpIDE7Ci0JCWlmIChvZmZzZXQxIDwgb2Zmc2V0MikKLQkJCXJldHVybiAoc2hvcnQpIC0xOwotCQlyZXR1cm4gKHNob3J0KSAwOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGNvbnRlbnRzIG9mIGEgUmFuZ2UgZnJvbSB0aGUgY29udGFpbmluZyBkb2N1bWVudCBvcgotCSAqIGRvY3VtZW50IGZyYWdtZW50IHdpdGhvdXQgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkIGNvbnRlbnQuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBhbnkgcG9ydGlvbiBvZgotCSAqICAgICAgICAgICAgICAgIHRoZSBjb250ZW50IG9mIHRoZSBSYW5nZSBpcyByZWFkLW9ubHkgb3IgYW55IG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIG5vZGVzIHRoYXQgY29udGFpbiBhbnkgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGFyZQotCSAqICAgICAgICAgICAgICAgIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRlbnRzKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUmFuZ2UgaXMgbm8gbG9uZ2VyIGluIHVzZSBhbmQgdGhhdCB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBtYXkgcmVsaW5xdWlzaCBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJhbmdlLgotCSAqIFN1YnNlcXVlbnQgY2FsbHMgdG8gYW55IG1ldGhvZHMgb3IgYXR0cmlidXRlIGdldHRlcnMgb24gdGhpcyBSYW5nZSB3aWxsCi0JICogcmVzdWx0IGluIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBiZWluZyB0aHJvd24gd2l0aCBhbiBlcnJvciBjb2RlCi0JICogb2YgPGNvZGU+SU5WQUxJRF9TVEFURV9FUlI8L2NvZGU+LgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgZGV0YWNoKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRoaXMuc3RhcnRDb250YWluZXIgPSBudWxsOwotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gMDsKLQkJdGhpcy5lbmRDb250YWluZXIgPSBudWxsOwotCQl0aGlzLmVuZE9mZnNldCA9IDA7Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgdGhlIGNvbnRlbnRzIG9mIGEgUmFuZ2UgZnJvbSB0aGUgY29udGFpbmluZyBkb2N1bWVudCBvciBkb2N1bWVudAotCSAqIGZyYWdtZW50IHRvIGEgbmV3IERvY3VtZW50RnJhZ21lbnQuCi0JICogCi0JICogQHJldHVybiBBIERvY3VtZW50RnJhZ21lbnQgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIGNvbnRlbnRzLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW55IHBvcnRpb24gb2YKLQkgKiAgICAgICAgICAgICAgICB0aGUgY29udGVudCBvZiB0aGUgUmFuZ2UgaXMgcmVhZC1vbmx5IG9yIGFueSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBub2RlcyB3aGljaCBjb250YWluIGFueSBvZiB0aGUgY29udGVudCBvZiB0aGUgUmFuZ2UgYXJlCi0JICogICAgICAgICAgICAgICAgcmVhZC1vbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgYSBEb2N1bWVudFR5cGUgbm9kZQotCSAqICAgICAgICAgICAgICAgIHdvdWxkIGJlIGV4dHJhY3RlZCBpbnRvIHRoZSBuZXcgRG9jdW1lbnRGcmFnbWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGV4dHJhY3RDb250ZW50cygpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRSVUUgaWYgdGhlIFJhbmdlIGlzIGNvbGxhcHNlZAotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29sbGFwc2VkKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLnN0YXJ0Q29udGFpbmVyID09IHRoaXMuZW5kQ29udGFpbmVyICYmIHRoaXMuc3RhcnRPZmZzZXQgPT0gdGhpcy5lbmRPZmZzZXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWVwZXN0IGNvbW1vbiBhbmNlc3RvciBjb250YWluZXIgb2YgdGhlIFJhbmdlJ3MgdHdvCi0JICogYm91bmRhcnktcG9pbnRzLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q29tbW9uQW5jZXN0b3JDb250YWluZXIoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuc3RhcnRDb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChOb2RlSW1wbCkgdGhpcy5zdGFydENvbnRhaW5lcikuZ2V0Q29tbW9uQW5jZXN0b3IodGhpcy5lbmRDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIE5vZGUgd2l0aGluIHdoaWNoIHRoZSBSYW5nZSBlbmRzCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRFbmRDb250YWluZXIoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZW5kQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIE9mZnNldCB3aXRoaW4gdGhlIGVuZGluZyBub2RlIG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmVuZE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlIHdpdGhpbiB3aGljaCB0aGUgUmFuZ2UgYmVnaW5zCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRTdGFydENvbnRhaW5lcigpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5zdGFydENvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBPZmZzZXQgd2l0aGluIHRoZSBzdGFydGluZyBub2RlIG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuc3RhcnRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyBhIG5vZGUgaW50byB0aGUgRG9jdW1lbnQgb3IgRG9jdW1lbnRGcmFnbWVudCBhdCB0aGUgc3RhcnQgb2YKLQkgKiB0aGUgUmFuZ2UuIElmIHRoZSBjb250YWluZXIgaXMgYSBUZXh0IG5vZGUsIHRoaXMgd2lsbCBiZSBzcGxpdCBhdCB0aGUKLQkgKiBzdGFydCBvZiB0aGUgUmFuZ2UgKGFzIGlmIHRoZSBUZXh0IG5vZGUncyBzcGxpdFRleHQgbWV0aG9kIHdhcwotCSAqIHBlcmZvcm1lZCBhdCB0aGUgaW5zZXJ0aW9uIHBvaW50KSBhbmQgdGhlIGluc2VydGlvbiB3aWxsIG9jY3VyIGJldHdlZW4KLQkgKiB0aGUgdHdvIHJlc3VsdGluZyBUZXh0IG5vZGVzLiBBZGphY2VudCBUZXh0IG5vZGVzIHdpbGwgbm90IGJlCi0JICogYXV0b21hdGljYWxseSBtZXJnZWQuIElmIHRoZSBub2RlIHRvIGJlIGluc2VydGVkIGlzIGEgRG9jdW1lbnRGcmFnbWVudAotCSAqIG5vZGUsIHRoZSBjaGlsZHJlbiB3aWxsIGJlIGluc2VydGVkIHJhdGhlciB0aGFuIHRoZSBEb2N1bWVudEZyYWdtZW50Ci0JICogbm9kZSBpdHNlbGYuCi0JICogCi0JICogQHBhcmFtIG5ld05vZGVUaGUKLQkgKiAgICAgICAgICAgIG5vZGUgdG8gaW5zZXJ0IGF0IHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFuIGFuY2VzdG9yCi0JICogICAgICAgICAgICAgICAgY29udGFpbmVyIG9mIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UgaXMgcmVhZC1vbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+bmV3Tm9kZTwvY29kZT4gYW5kCi0JICogICAgICAgICAgICAgICAgdGhlIGNvbnRhaW5lciBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlIHdlcmUgbm90IGNyZWF0ZWQKLQkgKiAgICAgICAgICAgICAgICBmcm9tIHRoZSBzYW1lIGRvY3VtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgUmFuZ2UgaXMgb2YgYSB0eXBlIHRoYXQgZG9lcyBub3QgYWxsb3cKLQkgKiAgICAgICAgICAgICAgICBjaGlsZHJlbiBvZiB0aGUgdHlwZSBvZiA8Y29kZT5uZXdOb2RlPC9jb2RlPiBvciBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPm5ld05vZGU8L2NvZGU+IGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBjb250YWluZXIuCi0JICogICAgICAgICAgICAgICAgPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5uZXdOb2RlPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIGlzIGFuIEF0dHIsIEVudGl0eSwgTm90YXRpb24sIG9yIERvY3VtZW50IG5vZGUuCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0Tm9kZShOb2RlIG5ld05vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIG5vZGUgYW5kIGl0cyBjb250ZW50cwotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlVGhlCi0JICogICAgICAgICAgICBub2RlIHRvIHNlbGVjdC4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgYW4gYW5jZXN0b3Igb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksIE5vdGF0aW9uIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlIG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdE5vZGUoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gcmVmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gKChOb2RlSW1wbCkgcmVmTm9kZSkuZ2V0SW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJc2V0U3RhcnQocGFyZW50LCBpbmRleCk7Ci0JCXNldEVuZChwYXJlbnQsIGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IHRoZSBjb250ZW50cyB3aXRoaW4gYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVOb2RlCi0JICogICAgICAgICAgICB0byBzZWxlY3QgZnJvbQotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIG9yIGFuIGFuY2VzdG9yIG9mIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGFuIEVudGl0eSwKLQkgKiAgICAgICAgICAgICAgICBOb3RhdGlvbiBvciBEb2N1bWVudFR5cGUgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdE5vZGVDb250ZW50cyhOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHJlZk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIHJlZk5vZGU7Ci0JCQlzZXRTdGFydChyZWZOb2RlLCAwKTsKLQkJCXNldEVuZChyZWZOb2RlLCB0ZXh0LmdldExlbmd0aCgpKTsKLQkJfSBlbHNlIHsKLQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSByZWZOb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWludCBsZW5ndGggPSAoY2hpbGROb2RlcyAhPSBudWxsID8gY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA6IDApOwotCQkJc2V0U3RhcnQocmVmTm9kZSwgMCk7Ci0JCQlzZXRFbmQocmVmTm9kZSwgbGVuZ3RoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgZW5kIG9mIGEgUmFuZ2UuCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IHZhbHVlLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlCi0JICogICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gb2Zmc2V0VGhlCi0JICogICAgICAgICAgICA8Y29kZT5lbmRPZmZzZXQ8L2NvZGU+IHZhbHVlLgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIG9yIGFuIGFuY2VzdG9yIG9mIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGFuIEVudGl0eSwKLQkgKiAgICAgICAgICAgICAgICBOb3RhdGlvbiwgb3IgRG9jdW1lbnRUeXBlIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjaGlsZCB1bml0cyBpbgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+LiBDaGlsZCB1bml0cyBhcmUgMTYtYml0IHVuaXRzIGlmCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYSB0eXBlIG9mIENoYXJhY3RlckRhdGEgbm9kZQotCSAqICAgICAgICAgICAgICAgIChlLmcuLCBhIFRleHQgb3IgQ29tbWVudCBub2RlKSBvciBhCi0JICogICAgICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIG5vZGUuIENoaWxkIHVuaXRzIGFyZSBOb2RlcyBpbiBhbGwKLQkgKiAgICAgICAgICAgICAgICBvdGhlciBjYXNlcy4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZChOb2RlIHJlZk5vZGUsIGludCBvZmZzZXQpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJdGhpcy5lbmRDb250YWluZXIgPSByZWZOb2RlOwotCQl0aGlzLmVuZE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmQgb2YgYSBSYW5nZSB0byBiZSBhZnRlciBhIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVJhbmdlCi0JICogICAgICAgICAgICBlbmRzIGFmdGVyIDxjb2RlPnJlZk5vZGU8L2NvZGU+LgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZEFmdGVyKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldEVuZChwYXJlbnQsIGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5kIHBvc2l0aW9uIHRvIGJlIGJlZm9yZSBhIG5vZGUuCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgZW5kcyBiZWZvcmUgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50LCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kQmVmb3JlKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldEVuZChwYXJlbnQsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVRoZQotCSAqICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gdmFsdWUuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUKLQkgKiAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBvZmZzZXRUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnN0YXJ0T2Zmc2V0PC9jb2RlPiB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBvciBhbiBhbmNlc3RvciBvZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksCi0JICogICAgICAgICAgICAgICAgTm90YXRpb24sIG9yIERvY3VtZW50VHlwZSBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzCi0JICogICAgICAgICAgICAgICAgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgY2hpbGQgdW5pdHMgaW4KLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPi4gQ2hpbGQgdW5pdHMgYXJlIDE2LWJpdCB1bml0cyBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEgdHlwZSBvZiBDaGFyYWN0ZXJEYXRhIG5vZGUKLQkgKiAgICAgICAgICAgICAgICAoZS5nLiwgYSBUZXh0IG9yIENvbW1lbnQgbm9kZSkgb3IgYQotCSAqICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBub2RlLiBDaGlsZCB1bml0cyBhcmUgTm9kZXMgaW4gYWxsCi0JICogICAgICAgICAgICAgICAgb3RoZXIgY2FzZXMuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChOb2RlIHJlZk5vZGUsIGludCBvZmZzZXQpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJdGhpcy5zdGFydENvbnRhaW5lciA9IHJlZk5vZGU7Ci0JCXRoaXMuc3RhcnRPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhcnQgcG9zaXRpb24gdG8gYmUgYWZ0ZXIgYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgc3RhcnRzIGFmdGVyIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCwgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0QWZ0ZXIoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gcmVmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gKChOb2RlSW1wbCkgcmVmTm9kZSkuZ2V0SW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJc2V0U3RhcnQocGFyZW50LCBpbmRleCArIDEpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIGJlIGJlZm9yZSBhIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVJhbmdlCi0JICogICAgICAgICAgICBzdGFydHMgYmVmb3JlIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCwgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0QmVmb3JlKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldFN0YXJ0KHBhcmVudCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJlcGFyZW50cyB0aGUgY29udGVudHMgb2YgdGhlIFJhbmdlIHRvIHRoZSBnaXZlbiBub2RlIGFuZCBpbnNlcnRzIHRoZQotCSAqIG5vZGUgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQHBhcmFtIG5ld1BhcmVudFRoZQotCSAqICAgICAgICAgICAgbm9kZSB0byBzdXJyb3VuZCB0aGUgY29udGVudHMgd2l0aC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFuIGFuY2VzdG9yCi0JICogICAgICAgICAgICAgICAgY29udGFpbmVyIG9mIGVpdGhlciBib3VuZGFyeS1wb2ludCBvZiB0aGUgUmFuZ2UgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT4gbmV3UGFyZW50PC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIGFuZCB0aGUgY29udGFpbmVyIG9mIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2Ugd2VyZSBub3QKLQkgKiAgICAgICAgICAgICAgICBjcmVhdGVkIGZyb20gdGhlIHNhbWUgZG9jdW1lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgY29udGFpbmVyIG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBSYW5nZSBpcyBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBhbGxvdwotCSAqICAgICAgICAgICAgICAgIGNoaWxkcmVuIG9mIHRoZSB0eXBlIG9mIDxjb2RlPm5ld1BhcmVudDwvY29kZT4gb3IgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5uZXdQYXJlbnQ8L2NvZGU+IGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBjb250YWluZXIKLQkgKiAgICAgICAgICAgICAgICBvciBpZiA8Y29kZT5ub2RlPC9jb2RlPiB3b3VsZCBlbmQgdXAgd2l0aCBhIGNoaWxkIG5vZGUKLQkgKiAgICAgICAgICAgICAgICBvZiBhIHR5cGUgbm90IGFsbG93ZWQgYnkgdGhlIHR5cGUgb2YgPGNvZGU+bm9kZTwvY29kZT4uCi0JICogICAgICAgICAgICAgICAgPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBCQURfQk9VTkRBUllQT0lOVFNfRVJSOiBSYWlzZWQgaWYgdGhlIFJhbmdlIHBhcnRpYWxseQotCSAqICAgICAgICAgICAgICAgIHNlbGVjdHMgYSBub24tdGV4dCBub2RlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+IG5vZGU8L2NvZGU+IGlzCi0JICogICAgICAgICAgICAgICAgYW4gQXR0ciwgRW50aXR5LCBEb2N1bWVudFR5cGUsIE5vdGF0aW9uLCBEb2N1bWVudCwgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUuCi0JICovCi0JcHVibGljIHZvaWQgc3Vycm91bmRDb250ZW50cyhOb2RlIG5ld1BhcmVudCkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWFkT25seUNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVhZE9ubHlDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YWE1OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWFkT25seUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLWNsYXNzIFJlYWRPbmx5Q29udHJvbGxlciB7Ci0KLQljbGFzcyBTcGFuIHsKLQkJaW50IGxlbmd0aDsKLQkJaW50IG9mZnNldDsKLQotCQlTcGFuKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBSZWFkT25seUNvbnRyb2xsZXIgZkluc3RhbmNlOwotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBSZWFkT25seUNvbnRyb2xsZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IFJlYWRPbmx5Q29udHJvbGxlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgdm9pZCBsb2NrKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGNhbkluc2VydEJlZm9yZSwgYm9vbGVhbiBjYW5JbnNlcnRBZnRlcikgewotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlkb2MubWFrZVJlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIGxvY2soSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBib29sZWFuIGNhbkluc2VydEJlZm9yZSwgYm9vbGVhbiBjYW5JbnNlcnRBZnRlcikgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBub2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWRvYy5tYWtlUmVhZE9ubHkobm9kZS5nZXRTdGFydCgpLCBub2RlLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIHVubG9jayhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlkb2MuY2xlYXJSZWFkT25seShub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgUmVhZE9ubHlDb250cm9sbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgU3BhbiBnZXREYXRhU3BhbihYTUxOb2RlIG5vZGUpIHsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXJldHVybiBnZXREYXRhU3BhbkZvckVsZW1lbnQoKFhNTEVsZW1lbnQpIG5vZGUpOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdldERhdGFTcGFuRm9yVGV4dCgoWE1MVGV4dCkgbm9kZSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTcGFuIGdldERhdGFTcGFuRm9yRWxlbWVudChYTUxFbGVtZW50IG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChkb2NSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZG9jUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCi0JCVN0cmluZyBzdGFydFR5cGU7Ci0JCVN0cmluZyBlbmRUeXBlOwotCQlpZiAobm9kZS5pc0NvbW1lbnRUYWcoKSkgewotCQkJc3RhcnRUeXBlID0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOOwotCQkJZW5kVHlwZSA9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0U7Ci0JCX0gZWxzZSB7Ci0JCQlzdGFydFR5cGUgPSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRTsKLQkJCWVuZFR5cGUgPSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0U7Ci0JCX0KLQotCQlpbnQgc3RhcnRPZmZzZXQgPSAtMTsKLQkJaW50IGVuZE9mZnNldCA9IC0xOwotCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gc3RhcnRUeXBlKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSByZWdpb24uZ2V0RW5kKCk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gZW5kVHlwZSAmJiBwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQllbmRPZmZzZXQgPSBwcmV2UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCX0KLQkJCXByZXZSZWdpb24gPSByZWdpb247Ci0JCX0KLQotCQlpZiAoMCA8PSBzdGFydE9mZnNldCAmJiAwIDw9IGVuZE9mZnNldCkgewotCQkJcmV0dXJuIG5ldyBTcGFuKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTcGFuIGdldERhdGFTcGFuRm9yVGV4dChYTUxUZXh0IG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGRvY1JlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0JCXJldHVybiBuZXcgU3BhbigwLCBkb2NSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZnJvbSBwYXJlbnQncyBzZXRDaGlsZEVkaXRhYmxlKCkKLQkgKiAKLQkgKiBjYXNlIDE6PHBhcmVudD48bm9kZSBhdHRyPSJ2YWx1ZSIvPiA8bm9kZTI+PC9wYXJlbnQ+Ci0JICogeCMjIyMjIyMjIyMjIyMjIyMjIyMjeCBjYXNlIDI6PHBhcmVudD48bm9kZSBhdHRyPSJ2YWx1ZSI+IDxjaGlsZD4KLQkgKiA8L2NoaWxkPiA8L25vZGU+IDwvcGFyZW50PiB4IyMjIyMjIyMjIyMjIyMjIyMjIz8gPyMjIyMjIyN4ICg/IDoKLQkgKiBlZGl0YWJsZSBpZiBub2RlLmlzRWRpdGFibGUoKSA9PSB0cnVlKQotCSAqLwotCXZvaWQgbG9ja0JvdGgoWE1MTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCWJvb2xlYW4gY2FuSW5zZXJ0ID0gZmFsc2U7Ci0KLQkJLy8gZW5kIG5vZGUgKGVsZW1lbnQpCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJY2FuSW5zZXJ0ID0gbm9kZS5pc0NoaWxkRWRpdGFibGUoKTsKLQkJCQlsb2NrKGZsYXROb2RlLCBjYW5JbnNlcnQsIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJbG9jayhmbGF0Tm9kZSwgZmFsc2UsIGNhbkluc2VydCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGxvY2tEYXRhKFhNTE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJaWYgKDAgPD0gc3Bhbi5sZW5ndGgpIHsKLQkJCWxvY2sobm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyBzcGFuLm9mZnNldCwgc3Bhbi5sZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBsb2NrIGl0c2VsZiBhbmQgYWxsIGRlc2NlbmRhbnRzCi0JICovCi0Jdm9pZCBsb2NrRGVlcChYTUxOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0KLQkJYm9vbGVhbiBjYW5JbnNlcnQgPSB0cnVlOwotCQlYTUxOb2RlIHBhcmVudCA9IChYTUxOb2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCWNhbkluc2VydCA9IGZhbHNlOwotCQl9Ci0JCWxvY2sobm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgb2Zmc2V0LCBsZW5ndGgsIGNhbkluc2VydCwgY2FuSW5zZXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZyb20gcGFyZW50J3Mgc2V0Q2hpbGRFZGl0YWJsZSgpCi0JICogCi0JICogY2FzZSAxOjxwYXJlbnQ+PG5vZGUgYXR0cj0idmFsdWUiLz4gPG5vZGUyPjwvcGFyZW50PiB4IyMjIyMjeCB4IyN4Ci0JICogY2FzZSAyOjxwYXJlbnQ+PG5vZGUgYXR0cj0idmFsdWUiPiA8Y2hpbGQ+PC9jaGlsZD4gPC9ub2RlPiA8L3BhcmVudD4KLQkgKiB4IyMjIyMjeCB4Iz8gPyMjIyMjIyN4ICg/IDogZWRpdGFibGUgaWYgbm9kZS5pc0VkaXRhYmxlKCkgPT0gdHJ1ZSkKLQkgKi8KLQl2b2lkIGxvY2tOb2RlKFhNTE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCFub2RlLmlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCWxvY2tCb3RoKG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJYm9vbGVhbiBjYW5JbnNlcnQgPSBmYWxzZTsKLQotCQkvLyBlbmQgbm9kZSAoZWxlbWVudCkKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJZmxhdE5vZGUgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQljYW5JbnNlcnQgPSBub2RlLmlzQ2hpbGRFZGl0YWJsZSgpOwotCQkJCWxvY2soZmxhdE5vZGUsIGNhbkluc2VydCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCS8vIHN0YXJ0IG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJCWlmICgwIDw9IHNwYW4ubGVuZ3RoKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmbGF0Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCWludCBvZmZzZXQsIGxlbmd0aDsKLQkJCQlvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJCWxlbmd0aCA9IHNwYW4ub2Zmc2V0OwotCQkJCWxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQkJCQlvZmZzZXQgPSBvZmZzZXQgKyBzcGFuLm9mZnNldCArIHNwYW4ubGVuZ3RoOwotCQkJCWxlbmd0aCA9IGZsYXROb2RlLmdldEVuZCgpIC0gb2Zmc2V0OwotCQkJCWxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgY2FuSW5zZXJ0LCBmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCWxvY2soZmxhdE5vZGUsIGZhbHNlLCBjYW5JbnNlcnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVubG9jayhJU3RydWN0dXJlZERvY3VtZW50IGRvYywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlkb2MuY2xlYXJSZWFkT25seShvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0Jdm9pZCB1bmxvY2tCb3RoKFhNTE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJfQotCQkvLyBlbmQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQl1bmxvY2soZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0Jdm9pZCB1bmxvY2tEYXRhKFhNTE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJaWYgKDAgPD0gc3Bhbi5sZW5ndGgpIHsKLQkJCXVubG9jayhub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIHNwYW4ub2Zmc2V0LCBzcGFuLmxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHVubG9ja0RlZXAoWE1MTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBub2RlLmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCi0JCXVubG9jayhub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0Jdm9pZCB1bmxvY2tOb2RlKFhNTE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQkvLyBlbmQgbm9kZQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCVNwYW4gc3BhbiA9IGdldERhdGFTcGFuKG5vZGUpOwotCQkJCWlmIChzcGFuLmxlbmd0aCA8PSAwKSB7Ci0JCQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmbGF0Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCQlpbnQgb2Zmc2V0LCBsZW5ndGg7Ci0JCQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJCWxlbmd0aCA9IHNwYW4ub2Zmc2V0IC0gb2Zmc2V0OwotCQkJCQl1bmxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCW9mZnNldCA9IHNwYW4ub2Zmc2V0ICsgc3Bhbi5sZW5ndGg7Ci0JCQkJCWxlbmd0aCA9IGZsYXROb2RlLmdldEVuZCgpIC0gc3Bhbi5vZmZzZXQ7Ci0JCQkJCXVubG9jayhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1NvdXJjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Tb3VyY2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdkODlhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1NvdXJjZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LkludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LkpTUFRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIE5vZGVJbXBsIG5vZGUgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFNvdXJjZVZhbGlkYXRvcihOb2RlIG5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQl0aGlzLm5vZGUgPSAoTm9kZUltcGwpIG5vZGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMubm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJLy8gc2V0dXAgY29udmVyc2lvbiBjb25kaXRpb25zCi0JCWJvb2xlYW4gYWNjZXB0VGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0Q2xvc2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRRdW90ZSA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdEFtcGVyc2FuZCA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdEVudGl0eVJlZiA9IHRydWU7Ci0JCWJvb2xlYW4gYWNjZXB0SlNQRW5kID0gdHJ1ZTsKLQkJU3RyaW5nIGVuZFRhZ05hbWUgPSBudWxsOwotCQlpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSAoWE1MRG9jdW1lbnQpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pc0pTUFR5cGUoKSkKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJaWYgKGFjY2VwdFRhZykgewotCQkJCUF0dHIgYXR0ciA9IChBdHRyKSB0aGlzLm5vZGU7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJYWNjZXB0VGFnID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgc291cmNlIGRvZXMgbm90IGluY2x1ZGUgc2luZ2xlIHF1b3RlLAotCQkJLy8gZG91YmxlIHF1b3RlIGlzIHZhbGlkCi0JCQlhY2NlcHRRdW90ZSA9IChzb3VyY2UuaW5kZXhPZignXCcnKSA8IDApOwotCQl9IGVsc2UgaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm5vZGU7Ci0JCQlpZiAodGV4dC5pc0pTUENvbnRlbnQoKSkgewotCQkJCWludCBpbmRleCA9IHNvdXJjZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybiBzb3VyY2U7Ci0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCQlhY2NlcHRDbG9zZSA9IHRydWU7Ci0JCQkJYWNjZXB0UXVvdGUgPSB0cnVlOwotCQkJCWFjY2VwdEFtcGVyc2FuZCA9IHRydWU7Ci0JCQkJYWNjZXB0SlNQRW5kID0gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKHRleHQuaXNDREFUQUNvbnRlbnQoKSkgewotCQkJCWVuZFRhZ05hbWUgPSB0ZXh0LmdldFBhcmVudE5vZGUoKS5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChlbmRUYWdOYW1lID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQkJYWNjZXB0Q2xvc2UgPSB0cnVlOwotCQkJCWFjY2VwdFF1b3RlID0gdHJ1ZTsKLQkJCQlhY2NlcHRBbXBlcnNhbmQgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCWRvY3VtZW50ID0gKFhNTERvY3VtZW50KSB0aGlzLm5vZGU7Ci0JCQl9IGVsc2UgewotCQkJCWRvY3VtZW50ID0gKFhNTERvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJfQotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpbnQgY29waWVkTGVuZ3RoID0gMDsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlZiA9IG51bGw7Ci0JCQljaGFyIGMgPSBzb3VyY2UuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnPCcgOgotCQkJCQlpZiAoYWNjZXB0VGFnKSB7Ci0JCQkJCQlpZiAoZW5kVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtYXRjaEVuZFRhZyhzb3VyY2UsIGkgKyAxLCBlbmRUYWdOYW1lKSkKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBza2lwID0gc2tpcFRhZyhzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gaW52YWxpZCBKU1AgdGFnCi0JCQkJCX0KLQkJCQkJcmVmID0gWE1MQ2hhckVudGl0eS5MVF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJz4nIDoKLQkJCQkJaWYgKGFjY2VwdENsb3NlKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXJlZiA9IFhNTENoYXJFbnRpdHkuR1RfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICcmJyA6Ci0JCQkJCWlmIChhY2NlcHRBbXBlcnNhbmQpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKGFjY2VwdEVudGl0eVJlZikgewotCQkJCQkJaW50IHNraXAgPSBza2lwRW50aXR5UmVmKHNvdXJjZSwgaSArIDEpOwotCQkJCQkJaWYgKHNraXAgPj0gMCkgewotCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZWYgPSBYTUxDaGFyRW50aXR5LkFNUF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInIDoKLQkJCQkJaWYgKGFjY2VwdFF1b3RlKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXJlZiA9IFhNTENoYXJFbnRpdHkuUVVPVF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyUnIDoKLQkJCQkJaWYgKGFjY2VwdEpTUEVuZCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAoc291cmNlLmNoYXJBdChpICsgMSkgIT0gJz4nKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWkrKzsKLQkJCQkJcmVmID0gWE1MQ2hhckVudGl0eS5HVF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCQkJfQotCQkJCWlmIChpID4gY29waWVkTGVuZ3RoKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhjb3BpZWRMZW5ndGgsIGkpKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWYpOwotCQkJCWNvcGllZExlbmd0aCA9IGkgKyAxOyAvLyBza2lwIHRoaXMgY2hhcmFjdGVyCi0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmIChjb3BpZWRMZW5ndGggPCBsZW5ndGgpIHsKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZS5zdWJzdHJpbmcoY29waWVkTGVuZ3RoLCBsZW5ndGgpKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtYXRjaEVuZFRhZyhTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0LCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQlpZiAoc291cmNlID09IG51bGwgfHwgZW5kVGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoc291cmNlLmNoYXJBdChvZmZzZXQpICE9ICcvJykKLQkJCXJldHVybiBmYWxzZTsKLQkJb2Zmc2V0Kys7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBlbmRUYWdOYW1lLmxlbmd0aCgpOwotCQlpZiAoZW5kID4gbGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZW5kVGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBza2lwRW50aXR5UmVmKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gc291cmNlLmxlbmd0aCgpKQotCQkJcmV0dXJuIC0xOwotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsgLy8gZXJyb3IKLQotCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoJzsnLCBvZmZzZXQpOwotCQlpZiAoZW5kIDwgMCB8fCBlbmQgPT0gb2Zmc2V0KQotCQkJcmV0dXJuIC0xOwotCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8IGRvY3VtZW50LmdldENoYXJWYWx1ZShuYW1lKSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gKGVuZCArIDEgLSBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHNraXBUYWcoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBzb3VyY2UubGVuZ3RoKCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaW50IGVuZCA9IG9mZnNldDsKLQkJaWYgKHNvdXJjZS5jaGFyQXQob2Zmc2V0KSA9PSAnJScpIHsKLQkJCS8vIEpTUCB0YWcKLQkJCWludCBmb3VuZCA9IHNvdXJjZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UsIG9mZnNldCArIDEpOwotCQkJaWYgKGZvdW5kIDwgMCkKLQkJCQlyZXR1cm4gLTE7IC8vIGludmFsaWQgSlNQIHRhZwotCQkJZW5kID0gZm91bmQgKyAyOwotCQl9IGVsc2UgewotCQkJLy8gbm9ybWFsIHRhZwotCQkJaW50IGZvdW5kID0gc291cmNlLmluZGV4T2YoJz4nLCBvZmZzZXQpOwotCQkJaWYgKGZvdW5kIDwgMCkKLQkJCQlyZXR1cm4gLTE7IC8vIGludmFsaWQgdGFnCi0JCQllbmQgPSBmb3VuZCArIDE7Ci0JCX0KLQkJcmV0dXJuIChlbmQgLSBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0aGlzLm5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gZXJyb3IKLQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCi0JCS8vIHNldHVwIHZhbGlkYXRpb24gY29uZGl0aW9ucwotCQlib29sZWFuIGFjY2VwdFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdENsb3NlID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0UXVvdGUgPSB0cnVlOwotCQlib29sZWFuIGFjY2VwdEVudGl0eVJlZiA9IHRydWU7Ci0JCVN0cmluZyBlbmRUYWdOYW1lID0gbnVsbDsKLQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCVhNTERvY3VtZW50IGRvY3VtZW50ID0gKFhNTERvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCWlmIChhY2NlcHRUYWcpIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgdGhpcy5ub2RlOwotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCWFjY2VwdFRhZyA9IGZhbHNlOwotCQkJfQotCQkJLy8gaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBpbmNsdWRlIHNpbmdsZSBxdW90ZSwKLQkJCS8vIGRvdWJsZSBxdW90ZSBpcyB2YWxpZAotCQkJYWNjZXB0UXVvdGUgPSAoc291cmNlLmluZGV4T2YoJ1wnJykgPCAwKTsKLQkJfSBlbHNlIGlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5ub2RlOwotCQkJaWYgKHRleHQuaXNKU1BDb250ZW50KCkpIHsKLQkJCQlpbnQgaW5kZXggPSBzb3VyY2UuaW5kZXhPZihKU1BUYWcuVEFHX0NMT1NFKTsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQltZXNzYWdlID0gWE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJUludmFsaWRfY2hhcmFjdGVyXygnPicpX2ZvX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkludmFsaWQgY2hhcmFjdGVyICgnPicpIGZvdW5kIgotCQkJCXRocm93IG5ldyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKG1lc3NhZ2UsICc+JywgaW5kZXggKyAxKTsKLQkJCX0gZWxzZSBpZiAodGV4dC5pc0NEQVRBQ29udGVudCgpKSB7Ci0JCQkJZW5kVGFnTmFtZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBlcnJvcgotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQkJYWNjZXB0Q2xvc2UgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJWE1MRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCWRvY3VtZW50ID0gKFhNTERvY3VtZW50KSB0aGlzLm5vZGU7Ci0JCQl9IGVsc2UgewotCQkJCWRvY3VtZW50ID0gKFhNTERvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJfQotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJfQotCi0JCWNoYXIgYyA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWMgPSBzb3VyY2UuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnPCcgOgotCQkJCQlpZiAoYWNjZXB0VGFnKSB7Ci0JCQkJCQlpZiAoZW5kVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtYXRjaEVuZFRhZyhzb3VyY2UsIGkgKyAxLCBlbmRUYWdOYW1lKSkKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBza2lwID0gc2tpcFRhZyhzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gaW52YWxpZCB0YWcKLQkJCQkJfQotCQkJCQltZXNzYWdlID0gWE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJUludmFsaWRfY2hhcmFjdGVyXygnPCcpX2ZvX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkludmFsaWQgY2hhcmFjdGVyICgnPCcpIGZvdW5kIgotCQkJCQlicmVhazsKLQkJCQljYXNlICc+JyA6Ci0JCQkJCWlmIChhY2NlcHRDbG9zZSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQltZXNzYWdlID0gWE1MQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJUludmFsaWRfY2hhcmFjdGVyXygnPicpX2ZvX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkludmFsaWQgY2hhcmFjdGVyICgnPicpIGZvdW5kIgotCQkJCQlicmVhazsKLQkJCQljYXNlICcmJyA6Ci0JCQkJCWlmIChhY2NlcHRFbnRpdHlSZWYpIHsKLQkJCQkJCWlmIChlbmRUYWdOYW1lICE9IG51bGwpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlpbnQgc2tpcCA9IHNraXBFbnRpdHlSZWYoc291cmNlLCBpICsgMSk7Ci0JCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJaSArPSBza2lwOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJLy8gaW52YWxpZCBlbnRpdHkgcmVmZXJlbmNlCi0JCQkJCX0KLQkJCQkJbWVzc2FnZSA9IFhNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVJbnZhbGlkX2NoYXJhY3Rlcl8oJyYnKV9mb19FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJCA9ICJJbnZhbGlkIGNoYXJhY3RlciAoJyYnKSBmb3VuZCIKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIicgOgotCQkJCQlpZiAoYWNjZXB0UXVvdGUpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJbWVzc2FnZSA9IFhNTENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVJbnZhbGlkX2NoYXJhY3Rlcl8oJ19fJylfZl9FWENfIik7IC8vJE5PTi1OTFMtMSQgPSAiSW52YWxpZCBjaGFyYWN0ZXIgKCdcIicpIGZvdW5kIgotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbihtZXNzYWdlLCBjLCBpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YTUwZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIGRlYnVnIHB1cnBvc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyIHsKLQlTdHJpbmcgRU9MID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCVdyaXRlciB0ZXN0V3JpdGVyID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyKFdyaXRlciB3cml0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGVzdFdyaXRlciA9IHdyaXRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tDaGlsZE5vZGVzKE5vZGUgbm9kZSkgewotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQljaGVja05vZGUoY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNb2RlbChYTUxNb2RlbCBtb2RlbCkgewotCQljaGVja0NoaWxkTm9kZXMobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTm9kZShOb2RlIG5vZGUpIHsKLQkJY2hlY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGVja0NoaWxkTm9kZXMobm9kZSk7Ci0JCQljaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigoKEVsZW1lbnRJbXBsKSBub2RlKS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBuID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYyA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGMgPT0gbnVsbCkgewotCQkJCQlyZXBvcnRFcnJvcigibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChzdGFydCA8IHRoaXMub2Zmc2V0KQotCQkJcmVwb3J0RXJyb3IoIm92ZXJ3cmFwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN0YXJ0ID4gdGhpcy5vZmZzZXQpCi0JCQlyZXBvcnRFcnJvcigiZ2FwIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGVuZCA9IGZsYXROb2RlLmdldEVuZCgpOwotCQl0aGlzLm9mZnNldCA9IGVuZDsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocCA9PSBudWxsKSB7Ci0JCQkJcmVwb3J0RXJyb3IoIm51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBzID0gcC5nZXRTdGFydCgpOwotCQkJaW50IGUgPSBwLmdldEVuZCgpOwotCQkJaWYgKHMgPiBzdGFydCB8fCBlIDwgZW5kKQotCQkJCXJlcG9ydEVycm9yKCJvdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHMgPT0gc3RhcnQgJiYgZSA9PSBlbmQpCi0JCQkJcmVwb3J0V2FybmluZygidmFpbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nIG1zZyA9ICJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyIDogZXJyb3IgOiAiICsgbWVzc2FnZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVzdFdyaXRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRlc3RXcml0ZXIud3JpdGUobXNnICsgRU9MKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwb3J0V2FybmluZyhTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmcgbXNnID0gIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIgOiB3YXJuaW5nIDogIiArIG1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlc3RXcml0ZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0ZXN0V3JpdGVyLndyaXRlKG1zZyArIEVPTCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NmQ4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLWNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCi0JcHJpdmF0ZSBWZWN0b3IgZmxhdE5vZGVzID0gbmV3IFZlY3RvcigyKTsKLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uI2FkZFJlZ2lvbihjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3QoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uI2FkanVzdExlbmd0aFdpdGgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aFdpdGgoaW50IGkpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RTdGFydChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RUZXh0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBhcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgPiAwKSB7Ci0JCQkJdGhpcy5mbGF0Tm9kZXMuYWRkQWxsKGNvbnRhaW5lci5mbGF0Tm9kZXMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5mbGF0Tm9kZXMuYWRkRWxlbWVudChmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb24jY29udGFpbnNPZmZzZXQoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBpKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2NvbnRhaW5zT2Zmc2V0KGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChJVGV4dFJlZ2lvbiByZWdpb24sIGludCBpKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24jZXF1YXRlUG9zaXRpb25zKGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldERlZXBlc3RSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQpCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldERlZXBlc3RSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAobGFzdCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBsYXN0LmdldEVuZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldEVuZE9mZnNldChjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb24jZ2V0Rmlyc3RSZWdpb24oKQotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCWlmICh0aGlzLmZsYXROb2Rlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoMCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJcmV0dXJuIGdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldExhc3RSZWdpb24oKQotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChzaXplIC0gMSk7Ci0JfQotCi0JLyoqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gKGdldEVuZCgpIC0gZ2V0U3RhcnQoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiNnZXROZXh0KCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0KCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkNvbnRhaW5lciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jZ2V0UGFyZW50RG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiNnZXRQcmV2aW91cygpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UHJldmlvdXMoKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZpcnN0LmdldFN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldFN0YXJ0T2Zmc2V0KGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZpcnN0LmdldFBhcmVudERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKSB7Ci0JCXJldHVybiB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChTdHJpbmcgY29udGV4dCkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFRleHRFbmQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb24jZ2V0VGV4dEVuZE9mZnNldChjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogVGhlIHRleHQgbGVuZ3RoIGlzIGVxdWFsIHRvIGxlbmd0aCBpZiB0aGVyZSBpcyBubyB3aGl0ZSBzcGFjZSBhdCB0aGUKLQkgKiBlbmQgb2YgYSByZWdpb24uIE90aGVyd2lzZSBpdCBpcyBzbWFsbGVyIHRoYW4gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIChnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgaW50IGluZGV4KSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJaWYgKGluZGV4ID4gc2l6ZSkKLQkJCXJldHVybjsKLQkJaWYgKGluZGV4ID09IHNpemUpIHsKLQkJCWFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5mbGF0Tm9kZXMuaW5zZXJ0RWxlbWVudEF0KGZsYXROb2RlLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgewotCQkvLyBJJ2xsIGFzc3VtZSBuZXZlciByZWFsbHkgbmVlZGVkIGhlcmUKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jaXNFbmRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRlZCgpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmZsYXROb2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLmZsYXROb2Rlcy5yZW1vdmVFbGVtZW50QXQoaW5kZXgpOwotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBzaXplID0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJdGhpcy5mbGF0Tm9kZXMucmVtb3ZlRWxlbWVudEF0KGkpOwotCQkJCXJldHVybiBmbGF0Tm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIGludCBpbmRleCkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpOwotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZmxhdE5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLmZsYXROb2Rlcy5zZXRFbGVtZW50QXQoZmxhdE5vZGUsIGluZGV4KTsKLQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uI3NhbWVBcyhjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQkvLyBub3Qgc3VwcG9ydAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiNzYW1lQXMoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uLAotCSAqICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sCi0JICogICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24sIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlbGV0ZWQoYm9vbGVhbiBkZWxldGVkKSB7Ci0JCS8vIEknbGwgYXNzdW1lIG5ldmVyIHJlYWxseSBuZWVkZWQgaGVyZQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0RW5kZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRlZChib29sZWFuIGhhc0VuZCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IG5ld0xlbmd0aCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0TmV4dChjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0UGFyZW50RG9jdW1lbnQoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0UHJldmlvdXMoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucykgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiNzZXRTdGFydChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoqCi0JICogdG9TdHJpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgneycpOwotCQlpbnQgY291bnQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWlmIChpICE9IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoIm51bGwiKTsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS50b1N0cmluZygpKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCd9Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiN1cGRhdGVNb2RlbChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCBzdGFydCwgaW50IGVuZCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyYmM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV4Y2VwdGlvbnMuU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCJJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1hbmFnZW1lbnQgZmFpbGVkLiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDM4NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1jbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCXByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0KLQkvKioKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KGludCBvZmZzZXQsIGludCBsZW5ndGgsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMuZmxhdE5vZGUgPSBmbGF0Tm9kZTsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMub2Zmc2V0IC09IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uI2FkZFJlZ2lvbihjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3QoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uI2FkanVzdExlbmd0aFdpdGgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aFdpdGgoaW50IGkpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RTdGFydChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RUZXh0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2NvbnRhaW5zT2Zmc2V0KGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbiNjb250YWluc09mZnNldChjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24sCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgaSkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uI2VxdWF0ZVBvc2l0aW9ucyhjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbiNnZXREZWVwZXN0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50KQotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXREZWVwZXN0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCWludCBmbGF0Tm9kZU9mZnNldCA9IDA7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlmbGF0Tm9kZU9mZnNldCA9IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIGZsYXROb2RlT2Zmc2V0ICsgdGhpcy5vZmZzZXQgKyB0aGlzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbiNnZXRFbmRPZmZzZXQoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldEZpcnN0UmVnaW9uKCkKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb24jZ2V0TGFzdFJlZ2lvbigpCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiogCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uI2dldE5leHQoKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHQoKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiogCi0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqIAotCSAqLwotCWludCBnZXRPZmZzZXQoKSB7Ci0JCWludCBmbGF0Tm9kZU9mZnNldCA9IDA7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlmbGF0Tm9kZU9mZnNldCA9IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIGZsYXROb2RlT2Zmc2V0ICsgdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiNnZXRQYXJlbnREb2N1bWVudCgpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uI2dldFByZXZpb3VzKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRSZWdpb25zKCkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCWludCBmbGF0Tm9kZU9mZnNldCA9IDA7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlmbGF0Tm9kZU9mZnNldCA9IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIGZsYXROb2RlT2Zmc2V0ICsgdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldFN0YXJ0T2Zmc2V0KGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKiAKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJU3RyaW5nIHRleHQgPSB0aGlzLmZsYXROb2RlLmdldFRleHQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCWludCBlbmQgPSB0aGlzLm9mZnNldCArIHRoaXMubGVuZ3RoOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcodGhpcy5vZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRUZXh0RW5kKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldFRleHRFbmRPZmZzZXQoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0IGxlbmd0aCBpcyBlcXVhbCB0byBsZW5ndGggaWYgdGhlcmUgaXMgbm8gd2hpdGUgc3BhY2UgYXQgdGhlCi0JICogZW5kIG9mIGEgcmVnaW9uLiBPdGhlcndpc2UgaXQgaXMgc21hbGxlciB0aGFuIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCS8vIEknbGwgYXNzdW1lIG5ldmVyIHJlYWxseSBuZWVkZWQgaGVyZQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiNpc0VuZGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZGVkKCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2FtZUFzKGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2FtZUFzKGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiwKLQkgKiAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLAotCSAqICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uLCBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVkKGJvb2xlYW4gZGVsZXRlZCkgewotCQkvLyBJJ2xsIGFzc3VtZSBuZXZlciByZWFsbHkgbmVlZGVkIGhlcmUKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uI3NldEVuZGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kZWQoYm9vbGVhbiBoYXNFbmQpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKioKLQkgKiBoYWQgdG8gbWFrZSBwdWJsaWMsIGR1ZSB0byBBUEkgdHJhbnNpdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkgewotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uI3NldE5leHQoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQpIHsKLQkJLy8gWFhYIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgLT0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0UGFyZW50RG9jdW1lbnQoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0UHJldmlvdXMoY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQkvLyBYWFggQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucykgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiNzZXRTdGFydChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgKz0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQl0aGlzLmZsYXROb2RlID0gZmxhdE5vZGU7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLm9mZnNldCAtPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJ1snKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRTdGFydCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQlidWZmZXIuYXBwZW5kKGdldEVuZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnXScpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHRoaXMuZmxhdE5vZGUudG9TdHJpbmcoKSk7Ci0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIm51bGwiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uI3VwZGF0ZU1vZGVsKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXRub2RlLCBTdHJpbmcgY2hhbmdlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCS8vIFhYWCBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmM4NDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5qc3AubW9kZWwucGFyc2VyLnRlbXAuWE1MSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogUHJvdmlkZXMgY29udmVuaWVudCBmdW5jdGlvbnMgdG8gaGFuZGxlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kCi0gKiBJVGV4dFJlZ2lvbi4KLSAqLwotY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbCBpbXBsZW1lbnRzIFhNTEpTUFJlZ2lvbkNvbnRleHRzIHsKLQotCS8qKgotCSAqIEV4dHJhY3RzIGNvbnRlbnRzIGVuY2xvc2VkIHdpdGggcXVvdGVzLiBRdW90ZXMgbWF5IGJlIGRvdWJsZSBvciBzaW5nbGUuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRBdHRyVmFsdWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsdWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIHZhbHVlOwotCQljaGFyIGZpcnN0Q2hhciA9IHZhbHVlLmNoYXJBdCgwKTsKLQkJaWYgKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RDaGFyID09ICdcJycpIHsKLQkJCWlmIChsZW5ndGggPT0gMSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICh2YWx1ZS5jaGFyQXQobGVuZ3RoIC0gMSkgPT0gZmlyc3RDaGFyKQotCQkJCWxlbmd0aC0tOwotCQkJcmV0dXJuIHZhbHVlLnN1YnN0cmluZygxLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgbmFtZSB3aXRob3V0IGhlYWRpbmcgJyYnIGFuZCB0YWlsaW5nICc7Jy4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEVudGl0eVJlZk5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVmID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlpbnQgbGVuZ3RoID0gcmVmLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gcmVmOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaWYgKHJlZi5jaGFyQXQoMCkgPT0gJyYnKQotCQkJb2Zmc2V0ID0gMTsKLQkJaWYgKHJlZi5jaGFyQXQobGVuZ3RoIC0gMSkgPT0gJzsnKQotCQkJbGVuZ3RoLS07Ci0JCWlmIChvZmZzZXQgPj0gbGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZWYuc3Vic3RyaW5nKG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCByZWdpb24uCi0JICovCi0Jc3RhdGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVnaW9ucy5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RSZWdpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gWE1MUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gWE1MUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlyZXR1cm4gcmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXN0IHJlZ2lvbi4KLQkgKi8KLQlzdGF0aWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0TGFzdFJlZ2lvblR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBYTUxSZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBYTUxSZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJcmV0dXJuIHJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGUpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlmbGF0Tm9kZSA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNmZlNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogVGV4dEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFRleHRJbXBsIGV4dGVuZHMgQ2hhcmFjdGVyRGF0YUltcGwgaW1wbGVtZW50cyBYTUxUZXh0IHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgY2xhc3MgU3RyaW5nUGFpciB7Ci0JCXByaXZhdGUgU3RyaW5nIGZGaXJzdCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZTZWNvbmQgPSBudWxsOwotCi0JCVN0cmluZ1BhaXIoU3RyaW5nIGZpcnN0LCBTdHJpbmcgc2Vjb25kKSB7Ci0JCQl0aGlzLmZGaXJzdCA9IGZpcnN0OwotCQkJdGhpcy5mU2Vjb25kID0gc2Vjb25kOwotCQl9Ci0KLQkJU3RyaW5nIGdldEZpcnN0KCkgewotCQkJcmV0dXJuIHRoaXMuZkZpcnN0OwotCQl9Ci0KLQkJU3RyaW5nIGdldFNlY29uZCgpIHsKLQkJCXJldHVybiB0aGlzLmZTZWNvbmQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmU291cmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRleHRJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFRleHRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRleHRJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIFRleHRJbXBsCi0JICovCi0JcHJvdGVjdGVkIFRleHRJbXBsKFRleHRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5mU291cmNlID0gdGhhdC5nZXRTb3VyY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGVuZERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCB8fCBhcmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBuZXdTb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJaWYgKG5ld1NvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXNldFRleHRTb3VyY2Uoc291cmNlICsgbmV3U291cmNlKTsKLQkJZWxzZQotCQkJc2V0VGV4dFNvdXJjZShuZXdTb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9IGVsc2UgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lcik7Ci0JCX0KLQotCQlyZXR1cm4gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIGFwcGVuZFRleHQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRUZXh0KFRleHQgbmV3VGV4dCkgewotCQlpZiAobmV3VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbmV3VGV4dDsKLQkJU3RyaW5nIG5ld1NvdXJjZSA9IHRleHQuZ2V0U291cmNlKCk7Ci0JCWlmIChuZXdTb3VyY2UgPT0gbnVsbCAmJiBuZXdTb3VyY2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlzZXRUZXh0U291cmNlKHNvdXJjZSArIG5ld1NvdXJjZSk7Ci0JCWVsc2UKLQkJCXNldFRleHRTb3VyY2UobmV3U291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVRleHRJbXBsIGNsb25lZCA9IG5ldyBUZXh0SW1wbCh0aGlzKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBkZWxldGVEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKGNvdW50IDwgMCB8fCBvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgY291bnQpOwotCQlpZiAocGFpciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzb3VyY2UgPSBudWxsOwotCQlTdHJpbmcgZmlyc3QgPSBwYWlyLmdldEZpcnN0KCk7Ci0JCWlmIChmaXJzdCAhPSBudWxsKQotCQkJc291cmNlID0gZmlyc3Q7Ci0JCVN0cmluZyBzZWNvbmQgPSBwYWlyLmdldFNlY29uZCgpOwotCQlpZiAoc2Vjb25kICE9IG51bGwpIHsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlzb3VyY2UgKz0gc2Vjb25kOwotCQkJZWxzZQotCQkJCXNvdXJjZSA9IHNlY29uZDsKLQkJfQotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7IC8vIGRlbGV0ZSBhbGwKLQkJc2V0VGV4dFNvdXJjZShzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmZTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBnZXREYXRhKHRoaXMuZlNvdXJjZSk7Ci0JCVN0cmluZyBkYXRhID0gc3VwZXIuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIGRhdGE7Ci0JCXJldHVybiBnZXREYXRhKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGxlbmd0aCA9IGNvbnRhaW5lci5nZXRMZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggPCAxNikKLQkJCQlsZW5ndGggPSAxNjsgLy8gZGVmYXVsdAotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoY29udGVudCk7Ci0JCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSB8fCByZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEVudGl0eVJlZk5hbWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBkb2N1bWVudC5nZXRDaGFyVmFsdWUobmFtZSk7Ci0JCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZGF0YSBmb3IgdGhlIHNvdXJjZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoJzsnLCByZWYgKyAxKTsKLQkJCWlmIChlbmQgPiByZWYgKyAxKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHJlZiArIDEsIGVuZCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gZ2V0Q2hhclZhbHVlKG5hbWUpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCQkJaWYgKHJlZiA+IG9mZnNldCkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIHJlZikpOwotCQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCQkJb2Zmc2V0ID0gZW5kICsgMTsKLQkJCQkJcmVmID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJCXJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJywgcmVmICsgMSk7Ci0JCX0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZTsKLQkJaWYgKGxlbmd0aCA+IG9mZnNldCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI3RleHQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gVEVYVF9OT0RFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlpZiAodGhpcy5mU291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5mU291cmNlOwotCQlTdHJpbmcgZGF0YSA9IHN1cGVyLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZShkYXRhKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc291cmNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNvdXJjZSBmb3IgdGhlIGRhdGEKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTb3VyY2UoU3RyaW5nIGRhdGEpIHsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlYTUxNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCVhNTEdlbmVyYXRvciBnZW5lcmF0b3IgPSBtb2RlbC5nZXRHZW5lcmF0b3IoKTsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCXJldHVybiBnZW5lcmF0b3IuZ2VuZXJhdGVUZXh0RGF0YSh0aGlzLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZlNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBoYXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChmbGF0Tm9kZSA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGluc2VydERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydERhdGEoaW50IG9mZnNldCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCB8fCBhcmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlzb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlzZXRUZXh0U291cmNlKHNvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgMCk7Ci0JCWlmIChwYWlyID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZS5sZW5ndGgoKSArIGFyZy5sZW5ndGgoKSk7Ci0JCVN0cmluZyBmaXJzdCA9IHBhaXIuZ2V0Rmlyc3QoKTsKLQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGZpcnN0KTsKLQkJc291cmNlID0gZ2V0U291cmNlKGFyZyk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJU3RyaW5nIHNlY29uZCA9IHBhaXIuZ2V0U2Vjb25kKCk7Ci0JCWlmIChzZWNvbmQgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc2Vjb25kKTsKLQkJc2V0VGV4dFNvdXJjZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBhcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJaWYgKGZsYXROb2RlID09IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIpOwotCQkJcmV0dXJuIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQlyZXR1cm4gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JfQotCi0JLyoqCi0JICogaW5zZXJ0VGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFRleHQoVGV4dCBuZXdUZXh0LCBpbnQgb2Zmc2V0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1RleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbmV3VGV4dDsKLQkJU3RyaW5nIG5ld1NvdXJjZSA9IHRleHQuZ2V0U291cmNlKCk7Ci0JCWlmIChuZXdTb3VyY2UgPT0gbnVsbCAmJiBuZXdTb3VyY2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlzZXRUZXh0U291cmNlKG5ld1NvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgMCk7Ci0JCWlmIChwYWlyID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZS5sZW5ndGgoKSArIG5ld1NvdXJjZS5sZW5ndGgoKSk7Ci0JCVN0cmluZyBmaXJzdCA9IHBhaXIuZ2V0Rmlyc3QoKTsKLQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGZpcnN0KTsKLQkJYnVmZmVyLmFwcGVuZChuZXdTb3VyY2UpOwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzZWNvbmQpOwotCQlzZXRUZXh0U291cmNlKGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBpc0NEQVRBQ29udGVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NEQVRBQ29udGVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlyZXR1cm4gZWxlbWVudC5pc0NEQVRBQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnZhbGlkKCkgewotCQlyZXR1cm4gaXNJbnZhbGlkKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnZhbGlkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGlzSW52YWxpZChjb250ZW50KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJcmV0dXJuIGlzSW52YWxpZChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCX0KLQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvblR5cGUgIT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCAmJiByZWdpb25UeXBlICE9IEpTUF9DT05URU5UICYmIHJlZ2lvblR5cGUgIT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSAmJiByZWdpb25UeXBlICE9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFICYmIHJlZ2lvblR5cGUgIT0gWE1MUmVnaW9uQ29udGV4dC5CTE9DS19URVhUICYmIHJlZ2lvblR5cGUgIT0gWE1MUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc1NoYXJpbmdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlID09IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb250ZW50ID09IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKCkgewotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGRhdGEuY2hhckF0KGkpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCS8vIHJlbW92ZWQgd2l0aCBwcm94eQotCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJaWYgKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpID09IDEpIHsKLQkJCQkJCS8vIGdldCBiYWNrIHRvIHNpbmdsZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigwKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkvLyByZW1vdmVkIHdpdGggcHJveHkKLQkJCQkJCWNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgPT0gMSkgewotCQkJCQkJCS8vIGdldCBiYWNrIHRvIHNpbmdsZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oMCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JfQotCi0JLyoqCi0JICogcmVwbGFjZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZURhdGEoaW50IG9mZnNldCwgaW50IGNvdW50LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKGFyZyA9PSBudWxsIHx8IGFyZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlpbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nUGFpciBwYWlyID0gc3Vic3RyaW5nU291cmNlRXhjbHVkZWQoc291cmNlLCBvZmZzZXQsIGNvdW50KTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc291cmNlLmxlbmd0aCgpICsgYXJnLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGZpcnN0ID0gcGFpci5nZXRGaXJzdCgpOwotCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZmlyc3QpOwotCQlzb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzZWNvbmQpOwotCQlzZXRUZXh0U291cmNlKGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCS8vIHByb3h5IG11c3Qgbm90IGJlIG5lc3RlZAotCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCQkJLy8gcHJveHkgbXVzdCBub3QgYmUgbmVzdGVkCi0JCQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCkKLQkJCXRoaXMuZlNvdXJjZSA9IHNvdXJjZTsKLQkJc3VwZXIucmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmZTb3VyY2UgPSBudWxsOwotCQlzdXBlci5zZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB0aHJvd3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU291cmNlVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTb3VyY2VWYWxpZGF0b3IodGhpcyk7Ci0JCWlmICh2YWxpZGF0b3IudmFsaWRhdGVTb3VyY2Uoc291cmNlKSkKLQkJCXNldFRleHRTb3VyY2Uoc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5mU291cmNlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmZTb3VyY2UgPSBzb3VyY2U7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVNvdXJjZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU291cmNlVmFsaWRhdG9yKHRoaXMpOwotCQlzZXRUZXh0U291cmNlKHZhbGlkYXRvci5jb252ZXJ0U291cmNlKHNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIHNwbGl0VGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgVGV4dCBzcGxpdFRleHQoaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gZ2V0TGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAob2Zmc2V0IDwgbGVuZ3RoKSB7Ci0JCQlpbnQgY291bnQgPSBsZW5ndGggLSBvZmZzZXQ7Ci0JCQlzb3VyY2UgPSBzdWJzdHJpbmdTb3VyY2Uob2Zmc2V0LCBjb3VudCk7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQl9Ci0JCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG51bGwpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQl0ZXh0LnNldFRleHRTb3VyY2Uoc291cmNlKTsKLQotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcGFyZW50Lmluc2VydEJlZm9yZSh0ZXh0LCBnZXROZXh0U2libGluZygpKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlUZXh0IHNwbGl0VGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwgfHwgIShmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewotCQkJaWYgKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpID09IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGluZGV4ID49IGNvdW50KSB7Ci0JCQkvLyB0aGlzIGlzIHRoZSBjYXNlIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYSBuZXcKLQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCS8vIHNlYXJjaCBnYXAgYnkgb2Zmc2V0Ci0JCQlpbnQgb2Zmc2V0ID0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGluZGV4KTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpID49IG9mZnNldCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaW5kZXggPj0gY291bnQpCi0JCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQkJaWYgKGluZGV4ID09IDApCi0JCQlyZXR1cm4gdGhpczsgLy8gbm90aGluZyB0byBkbwotCi0JCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCVRleHRJbXBsIG5leHRUZXh0ID0gKFRleHRJbXBsKSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShudWxsKTsKLQkJaWYgKG5leHRUZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlmb3IgKDsgaW5kZXggPCBjb3VudDsgY291bnQtLSkgewotCQkJbmV4dFRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpKTsKLQkJfQotCi0JCS8vIG5vcm1hbGl6ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCWlmIChpbmRleCA9PSAxKSB7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigwKSk7Ci0JCX0KLQotCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5leHRUZXh0LCBnZXROZXh0U2libGluZygpKTsKLQkJcmV0dXJuIG5leHRUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHJ1bnMgZGF0YSBmb3IgdGhlIHJhbmdlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3Vic3RyaW5nRGF0YShTdHJpbmcgZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc3VyZSBvZmZzZXQgYW5kIGNvdW50IGFyZSBub24tbmVnYXRpdmUKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCQlpZiAoZW5kID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlIGZvciB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5OiBvZmZzZXQ6IGRhdGEgb2Zmc2V0IGNvdW50OgotCSAqIGRhdGEgY291bnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdWJzdHJpbmdTb3VyY2UoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc3VyZSBvZmZzZXQgYW5kIGNvdW50IGFyZSBub24tbmVnYXRpdmUKLQkJaWYgKHRoaXMuZlNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHN1YnN0cmluZ1NvdXJjZSh0aGlzLmZTb3VyY2UsIG9mZnNldCwgY291bnQpOwotCi0JCVN0cmluZyBkYXRhID0gc3VwZXIuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlkYXRhID0gc3Vic3RyaW5nRGF0YShkYXRhLCBvZmZzZXQsIGNvdW50KTsKLQkJCWlmIChkYXRhID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoZGF0YSk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHNvdXJjZTsKLQkJfQotCi0JCXJldHVybiBzdWJzdHJpbmdTb3VyY2UoZ2V0U291cmNlKCksIG9mZnNldCwgY291bnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlIGZvciB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5OiBvZmZzZXQ6IGRhdGEgb2Zmc2V0IGNvdW50OgotCSAqIGRhdGEgY291bnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdWJzdHJpbmdTb3VyY2UoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc3VyZSBvZmZzZXQgYW5kIGNvdW50IGFyZSBub24tbmVnYXRpdmUKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCi0JCS8vIGZpbmQgY2hhcmFjdGVyIHJlZmVyZW5jZQotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpZiAocmVmID49IGVuZCkKLQkJCQlicmVhazsKLQkJCWludCByZWZFbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKHJlZkVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgcmVmRW5kKTsKLQkJCQlpZiAoZ2V0Q2hhclZhbHVlKG5hbWUpICE9IG51bGwpIHsKLQkJCQkJLy8gZm91bmQsIHNoaWZ0IGZvciBzb3VyY2Ugb2Zmc2V0cwotCQkJCQlpbnQgcmVmQ291bnQgPSByZWZFbmQgLSByZWY7Ci0JCQkJCWlmIChyZWYgPCBvZmZzZXQpCi0JCQkJCQlvZmZzZXQgKz0gcmVmQ291bnQ7Ci0JCQkJCWlmIChyZWYgPCBlbmQpCi0JCQkJCQllbmQgKz0gcmVmQ291bnQ7Ci0JCQkJCXJlZiA9IHJlZkVuZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWYgPSBzb3VyY2UuaW5kZXhPZignJicsIHJlZiArIDEpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA+IGxlbmd0aCB8fCBlbmQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlcyBiZWZvcmUgYW5kIGFmdGVyIHRoZSByYW5nZSBzcGVjaWZpZWQgYnk6IG9mZnNldDogZGF0YQotCSAqIG9mZnNldCBjb3VudDogZGF0YSBjb3VudAotCSAqLwotCXByaXZhdGUgU3RyaW5nUGFpciBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzdXJlIG9mZnNldCBhbmQgY291bnQgYXJlIG5vbi1uZWdhdGl2ZQotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCWlmIChvZmZzZXQgPT0gMCAmJiBjb3VudCA9PSAwKQotCQkJCXJldHVybiBuZXcgU3RyaW5nUGFpcihudWxsLCBudWxsKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCi0JCS8vIGZpbmQgY2hhcmFjdGVyIHJlZmVyZW5jZQotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpZiAocmVmID49IGVuZCkKLQkJCQlicmVhazsKLQkJCWludCByZWZFbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKHJlZkVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgcmVmRW5kKTsKLQkJCQlpZiAoZ2V0Q2hhclZhbHVlKG5hbWUpICE9IG51bGwpIHsKLQkJCQkJLy8gZm91bmQsIHNoaWZ0IGZvciBzb3VyY2Ugb2Zmc2V0cwotCQkJCQlpbnQgcmVmQ291bnQgPSByZWZFbmQgLSByZWY7Ci0JCQkJCWlmIChyZWYgPCBvZmZzZXQpCi0JCQkJCQlvZmZzZXQgKz0gcmVmQ291bnQ7Ci0JCQkJCWlmIChyZWYgPCBlbmQpCi0JCQkJCQllbmQgKz0gcmVmQ291bnQ7Ci0JCQkJCXJlZiA9IHJlZkVuZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWYgPSBzb3VyY2UuaW5kZXhPZignJicsIHJlZiArIDEpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA+IGxlbmd0aCB8fCBlbmQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGZpcnN0ID0gKG9mZnNldCA+IDAgPyBzb3VyY2Uuc3Vic3RyaW5nKDAsIG9mZnNldCkgOiBudWxsKTsKLQkJU3RyaW5nIHNlY29uZCA9IChlbmQgPCBsZW5ndGggPyBzb3VyY2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSA6IG51bGwpOwotCQlyZXR1cm4gbmV3IFN0cmluZ1BhaXIoZmlyc3QsIHNlY29uZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxHZW5lcmF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTEdlbmVyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwMGE0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTEdlbmVyYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5UYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTEdlbmVyYXRvckltcGwgaW1wbGVtZW50cyBYTUxHZW5lcmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9DTE9TRSA9ICJdXT4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfT1BFTiA9ICI8IVtDREFUQVsiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DTE9TRSA9ICItLT4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9PUEVOID0gIjwhLS0iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV9PUEVOID0gIjwhRE9DVFlQRSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9DTE9TRSA9ICIgLz4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX09QRU4gPSAiPC8iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFhNTEdlbmVyYXRvckltcGwgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DTE9TRSA9ICI/PiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9PUEVOID0gIjw/IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19JRCA9ICJQVUJMSUMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1BSRUZJWCA9ICJzc2kiOy8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRkVBVFVSRSA9ICJTU0kiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1RPS0VOID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0lEID0gIlNZU1RFTSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xPU0UgPSAiPiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MR2VuZXJhdG9yIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFhNTEdlbmVyYXRvckltcGwoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqLwotCS8vcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudFRhZyhYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkvLwlpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy8JRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCllbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkvLwlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCS8vCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IGRvY3VtZW50LmdldERvY3VtZW50VHlwZUFkYXB0ZXIoKTsKLQkvLwlpZiAoYWRhcHRlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy8JaWYgKCFhZGFwdGVyLmhhc0ZlYXR1cmUoU1NJX0ZFQVRVUkUpKSByZXR1cm4gZmFsc2U7Ci0JLy8JU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JLy8JcmV0dXJuIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKFNTSV9QUkVGSVgpKTsKLQkvL30KLQkvKioKLQkgKiBIZWxwZXIgdG8gbW9kaWZ5IHRoZSB0YWcgbmFtZSBpbiBzdWItY2xhc3NlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0VGFnTmFtZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgdGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkoKEVsZW1lbnRJbXBsKSBlbGVtZW50KS5zZXRUYWdOYW1lKHRhZ05hbWUpOwotCX0KLQotCS8qKgotCSAqIFhNTE1vZGVsR2VuZXJhdG9yIGNvbnN0cnVjdG9yCi0JICovCi0JcHJpdmF0ZSBYTUxHZW5lcmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVBdHRyTmFtZShBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKGF0dHJOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGF0dHJOYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLlRBR19PUEVOKSkgewotCQkJaWYgKCFhdHRyTmFtZS5lbmRzV2l0aChKU1BUYWcuVEFHX0NMT1NFKSkgewotCQkJCS8vIGNsb3NlIEpTUAotCQkJCXJldHVybiAoYXR0ck5hbWUgKyBKU1BUYWcuVEFHX0NMT1NFKTsKLQkJCX0KLQkJfQotCQlpZiAoKChYTUxBdHRyKSBhdHRyKS5pc0dsb2JhbEF0dHIoKSAmJiBDTU5vZGVVdGlsLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpICE9IG51bGwpIHsKLQkJCXN3aXRjaCAoZ2V0QXR0ck5hbWVDYXNlKGF0dHIpKSB7Ci0JCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLlVQUEVSX0NBU0UgOgotCQkJCQlhdHRyTmFtZSA9IGF0dHJOYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFIDoKLQkJCQkJYXR0ck5hbWUgPSBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJLy8gQVNJU19DQVNFCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0cikgewotCQlyZXR1cm4gZ2VuZXJhdGVBdHRyVmFsdWUoYXR0ciwgKGNoYXIpIDApOyAvLyBubyBxdW90ZSBwcmVmZXJlbmNlCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShBdHRyIGF0dHIsIGNoYXIgcXVvdGUpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlTb3VyY2VWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNvdXJjZVZhbGlkYXRvcihhdHRyKTsKLQkJU3RyaW5nIHZhbHVlID0gdmFsaWRhdG9yLmNvbnZlcnRTb3VyY2UoKChYTUxOb2RlKSBhdHRyKS5nZXRWYWx1ZVNvdXJjZSgpKTsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLlRBR19PUEVOKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpc0Jvb2xlYW5BdHRyKGF0dHIpKSB7Ci0JCQkJaWYgKCgoQXR0ckltcGwpIGF0dHIpLmlzWE1MQXR0cigpKSB7Ci0JCQkJCS8vIGdlbmVyYXRlIHRoZSBuYW1lIGFzIHZhbHVlCi0JCQkJCXZhbHVlID0gYXR0ci5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gbm90IHRvIGdlbmVyYXRlICc9JyBhbmQgdmFsdWUgZm9yIEhUTUwgYm9vbGVhbgotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYXRlQXR0clZhbHVlKHZhbHVlLCBxdW90ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShTdHJpbmcgdmFsdWUsIGNoYXIgcXVvdGUpIHsKLQkJLy8gYXNzdW1lIHRoZSB2YWxpZCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBub3QgdG8gaW5jbHVkZSBib3RoIHF1b3RlcwotCQlpZiAocXVvdGUgPT0gJyInKSB7Ci0JCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5pbmRleE9mKCciJykgPj0gMCkpCi0JCQkJcXVvdGUgPSAnXCcnOyAvLyBmb3JjZQotCQl9IGVsc2UgaWYgKHF1b3RlID09ICdcJycpIHsKLQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmluZGV4T2YoJ1wnJykgPj0gMCkpCi0JCQkJcXVvdGUgPSAnIic7IC8vIGZvcmNlCi0JCX0gZWxzZSB7IC8vIG5vIHByZWZlcmVuY2UKLQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmluZGV4T2YoJyInKSA8IDApKQotCQkJCXF1b3RlID0gJyInOwotCQkJZWxzZQotCQkJCXF1b3RlID0gJ1wnJzsKLQkJfQotCi0JCWludCBsZW5ndGggPSAodmFsdWUgPT0gbnVsbCA/IDAgOiB2YWx1ZS5sZW5ndGgoKSk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDIpOwotCQlidWZmZXIuYXBwZW5kKHF1b3RlKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJYnVmZmVyLmFwcGVuZChxdW90ZSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGEpIHsKLQkJaWYgKGNkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZGF0YSA9IGNkYXRhLmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9IChkYXRhICE9IG51bGwgPyBkYXRhLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDE2KTsKLQkJYnVmZmVyLmFwcGVuZChDREFUQV9PUEVOKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ0RBVEFfQ0xPU0UpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDaGlsZChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIXBhcmVudE5vZGUuaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJU3RyaW5nIGNoaWxkU291cmNlID0gZ2VuZXJhdGVTb3VyY2UoY2hpbGQpOwotCQkJaWYgKGNoaWxkU291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChjaGlsZFNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDbG9zZVRhZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJCXJldHVybiBKU1BUYWcuQ09NTUVOVF9DTE9TRTsKLQkJCQkJcmV0dXJuIENPTU1FTlRfQ0xPU0U7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCXJldHVybiBKU1BUYWcuVEFHX0NMT1NFOwotCQkJCWlmIChlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJcmV0dXJuIEVNUFRZX0NMT1NFOwotCQkJCXJldHVybiBUQUdfQ0xPU0U7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCUNvbW1lbnRJbXBsIGNvbW1lbnQgPSAoQ29tbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKGNvbW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJcmV0dXJuIEpTUFRhZy5DT01NRU5UX0NMT1NFOwotCQkJCXJldHVybiBDT01NRU5UX0NMT1NFOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJcmV0dXJuIFRBR19DTE9TRTsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXJldHVybiBQSV9DTE9TRTsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXJldHVybiBDREFUQV9DTE9TRTsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Db21tZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNvbW1lbnQoQ29tbWVudCBjb21tZW50KSB7Ci0JCWlmIChjb21tZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZGF0YSA9IGNvbW1lbnQuZ2V0RGF0YSgpOwotCQlpbnQgbGVuZ3RoID0gKGRhdGEgIT0gbnVsbCA/IGRhdGEubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCUNvbW1lbnRJbXBsIGltcGwgPSAoQ29tbWVudEltcGwpIGNvbW1lbnQ7Ci0JCWlmICghaW1wbC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZChDT01NRU5UX09QRU4pOwotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX09QRU4pOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJaWYgKCFpbXBsLmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKENPTU1FTlRfQ0xPU0UpOwotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX0NMT1NFKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZG9jVHlwZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZURvY3R5cGUoRG9jdW1lbnRUeXBlIGRvY1R5cGUpIHsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBuYW1lID0gZG9jVHlwZS5nZXROYW1lKCk7Ci0JCWludCBsZW5ndGggPSAobmFtZSAhPSBudWxsID8gbmFtZS5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyAxNik7Ci0JCWJ1ZmZlci5hcHBlbmQoRE9DVFlQRV9PUEVOKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlpZiAobmFtZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChuYW1lKTsKLQkJRG9jdW1lbnRUeXBlSW1wbCBkdCA9IChEb2N1bWVudFR5cGVJbXBsKSBkb2NUeXBlOwotCQlTdHJpbmcgcHVibGljSUQgPSBkdC5nZXRQdWJsaWNJZCgpOwotCQlTdHJpbmcgc3lzdGVtSUQgPSBkdC5nZXRTeXN0ZW1JZCgpOwotCQlpZiAocHVibGljSUQgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZChQVUJMSUNfSUQpOwotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJYnVmZmVyLmFwcGVuZChwdWJsaWNJRCk7Ci0JCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQlpZiAoc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChzeXN0ZW1JRCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHN5c3RlbUlEICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChTWVNURU1fSUQpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChzeXN0ZW1JRCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJfQotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJz4nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgRWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaWYgZW1wdHkgdGFnIGlzIHByZWZlcnJhYmxlLCBnZW5lcmF0ZSBhcyBlbXB0eSB0YWcKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGltcGwucHJlZmVyRW1wdHlUYWcoKSkKLQkJCWltcGwuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnID0gZ2VuZXJhdGVTdGFydFRhZyhlbGVtZW50KTsKLQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHN0YXJ0VGFnKTsKLQkJU3RyaW5nIGNoaWxkID0gZ2VuZXJhdGVDaGlsZChlbGVtZW50KTsKLQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGNoaWxkKTsKLQkJU3RyaW5nIGVuZFRhZyA9IGdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQlpZiAoZW5kVGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGVuZFRhZyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCi0JCS8vIGZpcnN0IGNoZWNrIGlmIHRhZyBhZGFwdGVyIGV4aXN0cwotCQlUYWdBZGFwdGVyIGFkYXB0ZXIgPSAoVGFnQWRhcHRlcikgaW1wbC5nZXRFeGlzdGluZ0FkYXB0ZXIoVGFnQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBlbmRUYWcgPSBhZGFwdGVyLmdldEVuZFRhZyhpbXBsKTsKLQkJCWlmIChlbmRUYWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZW5kVGFnOwotCQl9Ci0KLQkJaWYgKGltcGwuaXNFbXB0eVRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpbXBsLmlzSlNQVGFnKCkpCi0JCQlyZXR1cm4gSlNQVGFnLlRBR19DTE9TRTsKLQotCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJaW50IGxlbmd0aCA9ICh0YWdOYW1lICE9IG51bGwgPyB0YWdOYW1lLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDQpOwotCQlidWZmZXIuYXBwZW5kKEVORF9PUEVOKTsKLQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJz4nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRW50aXR5UmVmIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbnRpdHlSZWYKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbnRpdHlSZWYoRW50aXR5UmVmZXJlbmNlIGVudGl0eVJlZikgewotCQlpZiAoZW50aXR5UmVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IGVudGl0eVJlZi5nZXROb2RlTmFtZSgpOwotCQlpbnQgbGVuZ3RoID0gKG5hbWUgIT0gbnVsbCA/IG5hbWUubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgNCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyYnKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJzsnKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlUEkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBpCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlUEkoUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKSB7Ci0JCWlmIChwaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHRhcmdldCA9IHBpLmdldFRhcmdldCgpOwotCQlTdHJpbmcgZGF0YSA9IHBpLmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9ICh0YXJnZXQgIT0gbnVsbCA/IHRhcmdldC5sZW5ndGgoKSA6IDApOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJbGVuZ3RoICs9IGRhdGEubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDgpOwotCQlidWZmZXIuYXBwZW5kKFBJX09QRU4pOwotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHRhcmdldCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCWJ1ZmZlci5hcHBlbmQoUElfQ0xPU0UpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVTb3VyY2UgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU291cmNlKE5vZGUgbm9kZSkgewotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRWxlbWVudCgoRWxlbWVudCkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVUZXh0KChUZXh0KSBub2RlKTsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZUNvbW1lbnQoKENvbW1lbnQpIG5vZGUpOwotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRG9jdHlwZSgoRG9jdW1lbnRUeXBlKSBub2RlKTsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZVBJKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpOwotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlQ0RBVEFTZWN0aW9uKChDREFUQVNlY3Rpb24pIG5vZGUpOwotCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRW50aXR5UmVmKChFbnRpdHlSZWZlcmVuY2UpIG5vZGUpOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gRE9DVU1FTlQKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZ2VuZXJhdGVDaGlsZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBFbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotCQlpZiAoaW1wbC5pc0pTUFRhZygpKSB7Ci0JCQkvLyBjaGVjayBpZiBKU1AgY29udGVudCB0eXBlIGFuZCBKU1AgRG9jdW1lbnQKLQkJCVhNTERvY3VtZW50IGRvY3VtZW50ID0gKFhNTERvY3VtZW50KSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmlzSlNQVHlwZSgpKSB7Ci0JCQkJaWYgKGRvY3VtZW50LmlzSlNQRG9jdW1lbnQoKSAmJiAhaW1wbC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJaW1wbC5zZXRKU1BUYWcoZmFsc2UpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW1wbC5zZXRKU1BUYWcoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWlmIChpbXBsLmlzQ29tbWVudFRhZygpICYmIGltcGwuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpID09IG51bGwpIHsKLQkJCUNvbW1lbnRFbGVtZW50UmVnaXN0cnkgcmVnaXN0cnkgPSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCQlyZWdpc3RyeS5zZXR1cENvbW1lbnRFbGVtZW50KGltcGwpOwotCQl9Ci0KLQkJLy8gZmlyc3QgY2hlY2sgaWYgdGFnIGFkYXB0ZXIgZXhpc3RzCi0JCVRhZ0FkYXB0ZXIgYWRhcHRlciA9IChUYWdBZGFwdGVyKSBpbXBsLmdldEV4aXN0aW5nQWRhcHRlcihUYWdBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHN0YXJ0VGFnID0gYWRhcHRlci5nZXRTdGFydFRhZyhpbXBsKTsKLQkJCWlmIChzdGFydFRhZyAhPSBudWxsKQotCQkJCXJldHVybiBzdGFydFRhZzsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKGltcGwuaXNDb21tZW50VGFnKCkpIHsKLQkJCWlmIChpbXBsLmlzSlNQVGFnKCkpCi0JCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuQ09NTUVOVF9PUEVOKTsKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKENPTU1FTlRfT1BFTik7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfSBlbHNlIGlmIChpbXBsLmlzSlNQVGFnKCkpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoSlNQVGFnLlRBR19PUEVOKTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQkJaWYgKGltcGwuaXNDb250YWluZXIoKSkKLQkJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7IC8vIEpTUCBjb250YWluZXIKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJzwnKTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBnZW5lcmF0ZUF0dHJOYW1lKGF0dHIpOwotCQkJaWYgKGF0dHJOYW1lICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChhdHRyTmFtZSk7Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gZ2VuZXJhdGVBdHRyVmFsdWUoYXR0cik7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkvLyBhdHRyIG5hbWUgb25seSBmb3IgSFRNTCBib29sZWFuIGFuZCBKU1AKLQkJCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyVmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGNsb3NlVGFnID0gZ2VuZXJhdGVDbG9zZVRhZyhlbGVtZW50KTsKLQkJaWYgKGNsb3NlVGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVRhZ05hbWUoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJWE1MRWxlbWVudCB4ZSA9IChYTUxFbGVtZW50KSBlbGVtZW50OwotCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh4ZS5pc0pTUFRhZygpKSB7Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHMoSlNQVGFnLkpTUF9FWFBSRVNTSU9OKSkKLQkJCQlyZXR1cm4gSlNQVGFnLkVYUFJFU1NJT05fVE9LRU47Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHMoSlNQVGFnLkpTUF9ERUNMQVJBVElPTikpCi0JCQkJcmV0dXJuIEpTUFRhZy5ERUNMQVJBVElPTl9UT0tFTjsKLQkJCWlmICh0YWdOYW1lLmVxdWFscyhKU1BUYWcuSlNQX0RJUkVDVElWRSkpCi0JCQkJcmV0dXJuIEpTUFRhZy5ESVJFQ1RJVkVfVE9LRU47Ci0JCQlpZiAodGFnTmFtZS5zdGFydHNXaXRoKEpTUFRhZy5KU1BfRElSRUNUSVZFKSkgewotCQkJCWludCBvZmZzZXQgPSBKU1BUYWcuSlNQX0RJUkVDVElWRS5sZW5ndGgoKSArIDE7IC8vIGFmdGVyICcuJwotCQkJCXJldHVybiAoSlNQVGFnLkRJUkVDVElWRV9UT0tFTiArIHRhZ05hbWUuc3Vic3RyaW5nKG9mZnNldCkpOwotCQkJfQotCQkJcmV0dXJuICh4ZS5pc0NvbW1lbnRUYWcoKSkgPyB0YWdOYW1lIDogbnVsbDsKLQkJfSBlbHNlIGlmICh0YWdOYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLlRBR19PUEVOKSkgewotCQkJaWYgKCF0YWdOYW1lLmVuZHNXaXRoKEpTUFRhZy5UQUdfQ0xPU0UpKSB7Ci0JCQkJLy8gY2xvc2UgSlNQCi0JCQkJcmV0dXJuICh0YWdOYW1lICsgSlNQVGFnLlRBR19DTE9TRSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoeGUuaXNDb21tZW50VGFnKCkpIHsKLQkJCVN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotCQkJaWYgKHByZWZpeC5lcXVhbHMoU1NJX1BSRUZJWCkpIHsKLQkJCQlyZXR1cm4gKFNTSV9UT0tFTiArIGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCF4ZS5pc0pTUFRhZygpICYmIHhlLmlzR2xvYmFsVGFnKCkgJiYgLy8gZ2xvYmFsIHRhZwotCQkJCQkJQ01Ob2RlVXRpbC5nZXRFbGVtZW50RGVjbGFyYXRpb24oeGUpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IHRhZ05hbWU7Ci0JCQkJc3dpdGNoIChnZXRUYWdOYW1lQ2FzZSh4ZSkpIHsKLQkJCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLlVQUEVSX0NBU0UgOgotCQkJCQkJbmV3TmFtZSA9IHRhZ05hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRSA6Ci0JCQkJCQluZXdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChuZXdOYW1lICE9IHRhZ05hbWUpIHsKLQkJCQkJdGFnTmFtZSA9IG5ld05hbWU7Ci0JCQkJCXNldFRhZ05hbWUoZWxlbWVudCwgdGFnTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0YWdOYW1lOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlVGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVUZXh0KFRleHQgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVRleHRJbXBsIGltcGwgPSAoVGV4dEltcGwpIHRleHQ7Ci0JCVN0cmluZyBzb3VyY2UgPSBpbXBsLmdldFRleHRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZTsKLQkJcmV0dXJuIGdlbmVyYXRlVGV4dERhdGEodGV4dCwgaW1wbC5nZXREYXRhKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVUZXh0RGF0YShUZXh0IHRleHQsIFN0cmluZyBkYXRhKSB7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlUZXh0SW1wbCBpbXBsID0gKFRleHRJbXBsKSB0ZXh0OwotCQlpZiAoaW1wbC5pc0pTUENvbnRlbnQoKSB8fCBpbXBsLmlzQ0RBVEFDb250ZW50KCkpIHsKLQkJCXJldHVybiBuZXcgU291cmNlVmFsaWRhdG9yKGltcGwpLmNvbnZlcnRTb3VyY2UoZGF0YSk7Ci0JCX0KLQkJU3RyaW5nIHNvdXJjZSA9IGRhdGE7Ci0KLQkJLy8gY29udmVydCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGVudGl0aWVzCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0Q2hhck5hbWUoZGF0YS5jaGFyQXQoaSkpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDgpOwotCQkJaWYgKGkgPiBvZmZzZXQpCi0JCQkJYnVmZmVyLmFwcGVuZChkYXRhLnN1YnN0cmluZyhvZmZzZXQsIGkpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyYnKTsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCQlidWZmZXIuYXBwZW5kKCc7Jyk7Ci0JCQlvZmZzZXQgPSBpICsgMTsKLQkJfQotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmIChsZW5ndGggPiBvZmZzZXQpCi0JCQkJYnVmZmVyLmFwcGVuZChkYXRhLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJCXNvdXJjZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0QXR0ck5hbWVDYXNlKEF0dHIgYXR0cikgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBhdHRyLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRTsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRUeXBlQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCXJldHVybiBhZGFwdGVyLmdldEF0dHJOYW1lQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENoYXJOYW1lKGNoYXIgYykgewotCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJzwnIDoKLQkJCQlyZXR1cm4gWE1MQ2hhckVudGl0eS5MVF9OQU1FOwotCQkJY2FzZSAnPicgOgotCQkJCXJldHVybiBYTUxDaGFyRW50aXR5LkdUX05BTUU7Ci0JCQljYXNlICcmJyA6Ci0JCQkJcmV0dXJuIFhNTENoYXJFbnRpdHkuQU1QX05BTUU7Ci0JCQljYXNlICciJyA6Ci0JCQkJcmV0dXJuIFhNTENoYXJFbnRpdHkuUVVPVF9OQU1FOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgaW50IGdldFRhZ05hbWVDYXNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRTsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRUeXBlQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCXJldHVybiBhZGFwdGVyLmdldFRhZ05hbWVDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQm9vbGVhbkF0dHIoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gZGVjbCA9IENNTm9kZVV0aWwuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNRGF0YVR5cGUgdHlwZSA9IGRlY2wuZ2V0QXR0clR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHZhbHVlc1tdID0gdHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICh2YWx1ZXMubGVuZ3RoID09IDEgJiYgdmFsdWVzWzBdLmVxdWFscyhkZWNsLmdldEF0dHJOYW1lKCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3OTlmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFhNTE1vZGVsQ29udGV4dCBjbGFzcwotICovCi1jbGFzcyBYTUxNb2RlbENvbnRleHQgewotCXByaXZhdGUgTm9kZSBuZXh0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlIHBhcmVudE5vZGUgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBYTUxNb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZSByb290Tm9kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxNb2RlbENvbnRleHQgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcm9vdE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlYTUxNb2RlbENvbnRleHQoTm9kZSByb290Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMucm9vdE5vZGUgPSByb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBmaW5kRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JRWxlbWVudCBmaW5kRW5kVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCWlmIChlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJLy8gaWYgYW5jZXN0b3IgZWxlbWVudCBoYXMgZW5kIHRhZyBzdG9wIHNlYXJjaAotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JVGV4dCBmaW5kTmV4dFRleHQoKSB7Ci0JCU5vZGUgbm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlICE9IHRoaXMubmV4dE5vZGUgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbm9kZTsKLQkJCQkvLyBza2lwIGVtcHR5IHRleHQKLQkJCQlpZiAodGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJCQlyZXR1cm4gdGV4dDsKLQkJCX0KLQkJCU5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJbm9kZSA9IGNoaWxkOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCW5vZGUgPSBuZXh0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGZpbmRQcmV2aW91c1RleHQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5UZXh0Ci0JICovCi0JVGV4dCBmaW5kUHJldmlvdXNUZXh0KCkgewotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCW5vZGUgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQllbHNlCi0JCQlub2RlID0gdGhpcy5wYXJlbnROb2RlLmdldExhc3RDaGlsZCgpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFRleHQpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZmluZFN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JRWxlbWVudCBmaW5kU3RhcnRUYWcoU3RyaW5nIHRhZ05hbWUsIFN0cmluZyByb290TmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2hlY2sgcHJldmlvdXMgZm9yIGVtcHR5IGNvbnRlbnQgZWxlbWVudAotCQlOb2RlIHByZXYgPSBudWxsOwotCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJcHJldiA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWVsc2UgaWYgKHRoaXMucGFyZW50Tm9kZSAhPSBudWxsKQotCQkJcHJldiA9IHRoaXMucGFyZW50Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHByZXY7Ci0JCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgIWVsZW1lbnQuaXNFbXB0eVRhZygpICYmIGVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJZm9yIChOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCWlmIChyb290TmFtZSAhPSBudWxsICYmIGVsZW1lbnQubWF0Y2hUYWdOYW1lKHJvb3ROYW1lKSkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5leHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0TmV4dE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLm5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JTm9kZSBnZXRQYXJlbnROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFJvb3ROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0Um9vdE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIHNldExhc3QgbWV0aG9kCi0JICovCi0Jdm9pZCBzZXRMYXN0KCkgewotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpIHsKLQkJCU5vZGUgcHJldiA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiA9PSBudWxsIHx8IHByZXYuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwcmV2OwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgIWVsZW1lbnQuaXNDb250YWluZXIoKSB8fCBlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQlyZXR1cm47Ci0JCQlzZXRQYXJlbnROb2RlKHByZXYpOwotCQl9Ci0KLQkJLy8gZmluZCBsYXN0IG9wZW4gcGFyZW50Ci0JCU5vZGUgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwotCQlOb2RlIGxhc3QgPSBwYXJlbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCXdoaWxlIChsYXN0ICE9IG51bGwpIHsKLQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgIWVsZW1lbnQuaXNDb250YWluZXIoKSB8fCBlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQlicmVhazsKLQkJCXBhcmVudCA9IGVsZW1lbnQ7Ci0JCQlsYXN0ID0gcGFyZW50LmdldExhc3RDaGlsZCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgIT0gdGhpcy5wYXJlbnROb2RlKQotCQkJc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIHNldE5leHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXh0Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXZvaWQgc2V0TmV4dE5vZGUoTm9kZSBuZXh0Tm9kZSkgewotCQl0aGlzLm5leHROb2RlID0gbmV4dE5vZGU7Ci0JCWlmIChuZXh0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLnBhcmVudE5vZGUgPSBuZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0UGFyZW50Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXZvaWQgc2V0UGFyZW50Tm9kZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNDFlZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWxOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBYTUxNb2RlbEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsSW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLCBYTUxNb2RlbCwgRE9NSW1wbGVtZW50YXRpb24gewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUUkFDRV9QQVJTRVJfTUFOQUdFTUVOVF9FWENFUFRJT04gPSAicGFyc2VyTWFuYWdlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE9iamVjdCBhY3RpdmUgPSBudWxsOwotCXByb3RlY3RlZCBEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgWE1MR2VuZXJhdG9yIGdlbmVyYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gbnVsbDsKLQlwcml2YXRlIFhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQlwcml2YXRlIFhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFhNTE1vZGVsSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBYTUxNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBpbnRlcm5hbENyZWF0ZURvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGNsaWVudHMgdG8gZGVjbGFyZSB0aGF0IHRoZXkgYXJlIGFib3V0IHRvIG1ha2UgYQotCSAqICJsYXJnZSIgY2hhbmdlIHRvIHRoZSBtb2RlbC4gVGhpcyBjaGFuZ2UgbWlnaHQgYmUgaW4gdGVybXMgb2YgY29udGVudAotCSAqIG9yIGl0IG1pZ2h0IGJlIGluIHRlcm1zIG9mIHRoZSBtb2RlbCBpZCBvciBiYXNlIGxvY2F0aW9uLgotCSAqIAotCSAqIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBlbWJlZGRlZCBjYWxscywgbm90aWZpY2F0aW9uIHRvIGxpc3RuZXJzIGlzCi0JICogc2VudCBvbmx5IG9uY2UuCi0JICogCi0JICogTm90ZSB0aGF0IHRoZSBjbGllbnQgd2hvIGlzIG1ha2luZyB0aGVzZSBjaGFuZ2VzIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkKLQkgKiB0byByZXN0b3JlIHRoZSBtb2RlbHMgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFuZ2VzLiBTZWUKLQkgKiBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuCi0JICogCi0JICogVGhlIG1ldGhvZCBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2hhbmdlTW9kZWwoKSB7Ci0JCXN1cGVyLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkvLyB0ZWNobmljYWxseSwgbm8gbmVlZCB0byBjYWxsIGJlZ2luQ2hhbmdpbmcgc28gb2Z0ZW4sCi0JCS8vIHNpbmNlIGFib3V0VG9DaGFuZ2VNb2RlbCBjYW4gYmUgbmVzdGVkLgotCQkvLyBidXQgd2lsbCBsZWF2ZSBhcyBpcyBmb3IgdGhpcyByZWxlYXNlLgotCQkvLyBzZWUgbW9kZWxDaGFuZ2VkLCBhbmQgYmUgc3VyZSBzdGF5cyBjb29yZGluYXRlZCB0aGVyZS4KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmJlZ2luQ2hhbmdpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhYm91dFRvUmVpbml0aWFsaXplTW9kZWwoKSB7Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCW5vdGlmaWVyLmNhbmNlbFBlbmRpbmcoKTsKLQkJc3VwZXIuYWJvdXRUb1JlaW5pdGlhbGl6ZU1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogYXR0clJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF0dHJSZXBsYWNlZChFbGVtZW50IGVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLnJlcGxhY2VBdHRyKGVsZW1lbnQsIG5ld0F0dHIsIG9sZEF0dHIpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5hdHRyUmVwbGFjZWQoZWxlbWVudCwgbmV3QXR0ciwgb2xkQXR0cik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RuZXJzIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyCi0JICogdG8gYWJvdXRUb0NoYW5nZU1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWJvdXRUb0NoYW5nZU1vZGVsIC4uLgotCSAqIG9yIHNvbWUgbGlzdGVuZXJzIGNvdWxkIGJlIGxlZnQgd2FpdGluZyBpbmRlZmluaXRlbHkgZm9yIHRoZSBjaGFuZ2VkCi0JICogZXZlbnQuIFNvLCBpdHMgc3VnZ2VzdGVkIHRoYXQgY2hhbmdlZE1vZGVsIGFsd2F5cyBiZSBpbiBhIGZpbmFsbHkKLQkgKiBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LgotCSAqIAotCSAqIEluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFuZ2VkTW9kZWwoKSB7Ci0JCS8vIE5PVEU6IHRoZSBvcmRlciBvZiAnY2hhbmdlZE1vZGVsJyBhbmQgJ2VuZENoYW5naW5nJyBpcyBzaWduaWZpY2FudC4KLQkJLy8gQnkgY2FsbGluZyBjaGFuZ2VkTW9kZWwgZmlyc3QsIHRoaXMgYmFzaWNhbGx5IGRlY3JlbWVudHMgdGhlCi0JCS8vICJpc0NoYW5naW5nIiBjb3VudGVyCi0JCS8vIGluIHN1cGVyIGNsYXNzIGFuZCB3aGVuIHplcm8gYWxsIGxpc3RlbmVycyB0byBtb2RlbCBzdGF0ZSBldmVudHMKLQkJLy8gd2lsbCBiZSBub3RpZmllZAotCQkvLyB0aGF0IHRoZSBtb2RlbCBoYXMgYmVlbiBjaGFuZ2VkLiAnZW5kQ2hhbmdpbmcnIHdpbGwgbm90aWZ5IGFsbAotCQkvLyBkZWZlcnJlZCBhZGFwdGVycy4KLQkJLy8gU28sIHRoZSBzaWduaWZpY2FuY2Ugb2Ygb3JkZXIgaXMgdGhhdCBhZGFwdGVycyAoYW5kIG1ldGhvZHMgdGhleQotCQkvLyBjYWxsKQotCQkvLyBjYW4gY291bnQgb24gdGhlIHN0YXRlIG9mIG1vZGVsICJpc0NoYW5naW5nIiB0byBiZSBhY2N1cmF0ZS4KLQkJLy8gQnV0LCByZW1lbWJlciwgdGhhdCB0aGlzIG1lYW5zIHRoZSAibW9kZWxDaGFuZ2VkIiBldmVudCBjYW4gYmUKLQkJLy8gcmVjZWl2ZWQgYmVmb3JlIGFsbAotCQkvLyBhZGFwdGVycyBoYXZlIGZpbmlzaGVkIHRoZWlyIHByb2Nlc3NpbmcuCi0JCS8vIE5PVEUgTk9URTogVGhlIGFib3ZlIG5vdGUgaXMgb2Jzb2xldGUgaW4gZmFjdCAodGhvdWdoIHN0aWxsIHN0YXRlcwotCQkvLyBpc3N1ZSBjb3JyZWN0bHkpLgotCQkvLyBEdWUgdG8gcG9wdWxhciBkZW1hbmQsIHRoZSBvcmRlciBvZiB0aGVzZSBjYWxscyB3ZXJlIHJldmVyc2VkIGFuZAotCQkvLyBiZWhhdmlvcgotCQkvLyBjaGFuZ2VkIG9uIDA3LzIyLzIwMDQuCi0JCS8vIAotCQkvLyBzZWUgYWxzbwotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDMwMgotCQkvLyBmb3IgbW90aXZhdGlvbiBmb3IgdGhpcyAnb24gdmVyZ2Ugb2YnIGNhbGwuCi0JCS8vIHRoaXMgY291bGQgYmUgaW1wcm92ZWQgaW4gZnV0dXJlIGlmIG5vdGlmaWVyIGFsc28gdXNlZCBjb3VudGluZwotCQkvLyBmbGFnIHRvIGF2b2lkIG5lc3RlZCBjYWxscy4gSWYvd2hlbiBjaGFuZ2VkIGJlIHN1cmUgdG8gY2hlY2sgaWYKLQkJLy8gYWJvdXRUb0NoYW5nZU1vZGVsIG5lZWRzIGFueSBjaGFuZ2VzIHRvby4KLQkJaWYgKGlzTW9kZWxDaGFuZ2VTdGF0ZU9uVmVyZ2VPZkVuZGluZygpKSB7Ci0JCQkvLyBlbmQgbG9jayBiZWZvcmUgbm90aWNpYXRpb24gbG9vcCwgc2luY2UgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQotCQkJLy8gd2UgbWF5IGJlICJjYWxsZWQgZnJvbSBmb3JpZWduIGNvZGUiIGR1cmluZyBub3RpZmljYXRpb24uCi0JCQllbmRMb2NrKCk7Ci0KLQkJCS8vIHRoZSBub3RpZmllciBpcyB3aGF0IGNvbnRyb2xzIGFkYXBlciBub3RpZmljYXRpb24sIHdoaWNoCi0JCQkvLyBzaG91bGQgYmUgc2VudCBvdXQgYmVmb3JlIHRoZSAnbW9kZWxDaGFuZ2VkJyBldmVudC4KLQkJCWdldE1vZGVsTm90aWZpZXIoKS5lbmRDaGFuZ2luZygpOwotCQl9Ci0JCS8vIGNoYW5nZWRNb2RlbCBoYW5kbGVzICduZXN0aW5nJywgc28gb25seSBvbmUgZXZlbnQgc2VudCBvdXQKLQkJLy8gd2hlbiBtdWxpdHBsZSBjYWxscyB0byAnYWJvdXRUb0NoYW5nZS9DaGFuZ2VkJy4KLQkJc3VwZXIuY2hhbmdlZE1vZGVsKCk7Ci0JCWhhbmRsZVJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRSZXBsYWNlZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIucmVwbGFjZUNoaWxkKHBhcmVudE5vZGUsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmNoaWxkUmVwbGFjZWQocGFyZW50Tm9kZSwgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIFhNTCA8Y29kZT5Eb2N1bWVudDwvY29kZT4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZQotCSAqIHdpdGggaXRzIGRvY3VtZW50IGVsZW1lbnQuIEhUTUwtb25seSBET00gaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvCi0JICogaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUklUaGUKLQkgKiAgICAgICAgICAgIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGRvY3VtZW50IGVsZW1lbnQgdG8gY3JlYXRlLgotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lVGhlCi0JICogICAgICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0byBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBkb2N0eXBlVGhlCi0JICogICAgICAgICAgICB0eXBlIG9mIGRvY3VtZW50IHRvIGJlIGNyZWF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4uIFdoZW4KLQkgKiAgICAgICAgICAgIDxjb2RlPmRvY3R5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgaXRzCi0JICogICAgICAgICAgICA8Y29kZT5Ob2RlLm93bmVyRG9jdW1lbnQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzZXQgdG8gdGhlCi0JICogICAgICAgICAgICBkb2N1bWVudCBiZWluZyBjcmVhdGVkLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkCi0JICogICAgICAgICAgICAgICAgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsIGNoYXJhY3Rlci4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5BTUVTUEFDRV9FUlI6IFJhaXNlZCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBpcyBtYWxmb3JtZWQsIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBoYXMgYQotCSAqICAgICAgICAgICAgICAgIHByZWZpeCBhbmQgdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgb3IgaWYgdGhlCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaGFzIGEgcHJlZml4IHRoYXQgaXMgInhtbCIKLQkgKiAgICAgICAgICAgICAgICBhbmQgdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gIgotCSAqICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgLjxicj4KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kb2N0eXBlPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gdXNlZCB3aXRoIGEgZGlmZmVyZW50IGRvY3VtZW50IG9yIHdhcwotCSAqICAgICAgICAgICAgICAgIGNyZWF0ZWQgZnJvbSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAc2luY2UgRE9NIExldmVsIDIKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsIERvY3VtZW50VHlwZSBkb2N0eXBlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IG5vZGUuIEVudGl0eSBkZWNsYXJhdGlvbnMKLQkgKiBhbmQgbm90YXRpb25zIGFyZSBub3QgbWFkZSBhdmFpbGFibGUuIEVudGl0eSByZWZlcmVuY2UgZXhwYW5zaW9ucyBhbmQKLQkgKiBkZWZhdWx0IGF0dHJpYnV0ZSBhZGRpdGlvbnMgZG8gbm90IG9jY3VyLiBJdCBpcyBleHBlY3RlZCB0aGF0IGEgZnV0dXJlCi0JICogdmVyc2lvbiBvZiB0aGUgRE9NIHdpbGwgcHJvdmlkZSBhIHdheSBmb3IgcG9wdWxhdGluZyBhCi0JICogPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPi48YnI+Ci0JICogSFRNTC1vbmx5IERPTSBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lVGhlCi0JICogICAgICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZG9jdW1lbnQgdHlwZSB0byBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBwdWJsaWNJZFRoZQotCSAqICAgICAgICAgICAgZXh0ZXJuYWwgc3Vic2V0IHB1YmxpYyBpZGVudGlmaWVyLgotCSAqIEBwYXJhbSBzeXN0ZW1JZFRoZQotCSAqICAgICAgICAgICAgZXh0ZXJuYWwgc3Vic2V0IHN5c3RlbSBpZGVudGlmaWVyLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBub2RlIHdpdGgKLQkgKiAgICAgICAgIDxjb2RlPk5vZGUub3duZXJEb2N1bWVudDwvY29kZT4gc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQKLQkgKiAgICAgICAgICAgICAgICBuYW1lIGNvbnRhaW5zIGFuIGlsbGVnYWwgY2hhcmFjdGVyLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTkFNRVNQQUNFX0VSUjogUmFpc2VkIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIGlzIG1hbGZvcm1lZC4KLQkgKiBAc2luY2UgRE9NIExldmVsIDIKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3VtZW50VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlEb2N1bWVudFR5cGVJbXBsIGRvY3VtZW50VHlwZSA9IG5ldyBEb2N1bWVudFR5cGVJbXBsKCk7Ci0JCWRvY3VtZW50VHlwZS5zZXROYW1lKHF1YWxpZmllZE5hbWUpOwotCQlkb2N1bWVudFR5cGUuc2V0UHVibGljSWQocHVibGljSWQpOwotCQlkb2N1bWVudFR5cGUuc2V0U3lzdGVtSWQoc3lzdGVtSWQpOwotCQlyZXR1cm4gZG9jdW1lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvY3VtZW50VHlwZUNoYW5nZWQoKSB7Ci0JCWlmICh0aGlzLnJlZnJlc2gpCi0JCQlyZXR1cm47Ci0JCS8vIHVubGlrZSAncmVzZnJlc2gnLCAncmVpbml0aWFsaXplJyBmaW5pc2hlcyBsb29wCi0JCS8vIGFuZCBmbHVzaGVzIHJlbWFpbmluZyBub3RpZmljYXRpb24gcXVlIGJlZm9yZQotCQkvLyBhY3R1YWxseSByZWluaXRpYWxpemluZy4KLQkJLy8gSVNTVUU6IHNob3VsZCByZWluaXQgYmUgdXNlZCBpbnN0ZWFkIG9mIGhhbmRsZXJlZnJlc2g/Ci0JCS8vIHRoaXMuc2V0UmVpbml0aWFsaXplTmVlZGVkKHRydWUpOwotCQlpZiAodGhpcy5hY3RpdmUgIT0gbnVsbCB8fCBnZXRNb2RlbE5vdGlmaWVyKCkuaXNDaGFuZ2luZygpKQotCQkJcmV0dXJuOyAvLyBkZWZlcgotCQloYW5kbGVSZWZyZXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdGFibGVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlnZXRNb2RlbE5vdGlmaWVyKCkuZWRpdGFibGVDaGFuZ2VkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5kVGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIuY2hhbmdlRW5kVGFnKGVsZW1lbnQpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5lbmRUYWdDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxQYXJzZXIgZ2V0QWN0aXZlUGFyc2VyKCkgewotCQlpZiAodGhpcy5wYXJzZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5wYXJzZXIgIT0gdGhpcy5hY3RpdmUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMucGFyc2VyOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxVcGRhdGVyIGdldEFjdGl2ZVVwZGF0ZXIoKSB7Ci0JCWlmICh0aGlzLnVwZGF0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy51cGRhdGVyICE9IHRoaXMuYWN0aXZlKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aGlzLnVwZGF0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoRG9jdW1lbnQuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJcmV0dXJuIGdldERvY3VtZW50KCk7Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIGdldERvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gWE1MRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgWE1MRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBYTUxHZW5lcmF0b3IgZ2V0R2VuZXJhdG9yKCkgewotCQlpZiAodGhpcy5nZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0b3IgPSBYTUxHZW5lcmF0b3JJbXBsLmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIEluZGV4ZWRSZWdpb24gZ2V0SW5kZXhlZFJlZ2lvbihpbnQgb2Zmc2V0KSB7Ci0JCWlmICh0aGlzLmRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gc2VhcmNoIGluIGRvY3VtZW50IGNoaWxkcmVuCi0JCVhNTE5vZGUgcGFyZW50ID0gbnVsbDsKLQkJaW50IGxlbmd0aCA9IHRoaXMuZG9jdW1lbnQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChvZmZzZXQgKiAyIDwgbGVuZ3RoKSB7Ci0JCQkvLyBzZWFyY2ggZnJvbSB0aGUgZmlyc3QKLQkJCVhNTE5vZGUgY2hpbGQgPSAoWE1MTm9kZSkgdGhpcy5kb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZC5nZXRFbmRPZmZzZXQoKSA8PSBvZmZzZXQpIHsKLQkJCQkJY2hpbGQgPSAoWE1MTm9kZSkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpID4gb2Zmc2V0KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCkgPiBvZmZzZXQpCi0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJfQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSA8PSBvZmZzZXQpCi0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJfQotCQkJCS8vIGRpZyBtb3JlCi0JCQkJcGFyZW50ID0gY2hpbGQ7Ci0JCQkJY2hpbGQgPSAoWE1MTm9kZSkgcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIHNlYXJjaCBmcm9tIHRoZSBsYXN0Ci0JCQlYTUxOb2RlIGNoaWxkID0gKFhNTE5vZGUpIHRoaXMuZG9jdW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpID4gb2Zmc2V0KSB7Ci0JCQkJCWNoaWxkID0gKFhNTE5vZGUpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNoaWxkLmdldEVuZE9mZnNldCgpIDw9IG9mZnNldCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpID4gb2Zmc2V0KQotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgPD0gb2Zmc2V0KQotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCQkvLyBkaWcgbW9yZQotCQkJCXBhcmVudCA9IGNoaWxkOwotCQkJCWNoaWxkID0gKFhNTE5vZGUpIHBhcmVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBYTUxNb2RlbE5vdGlmaWVyIGdldE1vZGVsTm90aWZpZXIoKSB7Ci0JCWlmICh0aGlzLm5vdGlmaWVyID09IG51bGwpIHsKLQkJCXRoaXMubm90aWZpZXIgPSBuZXcgWE1MTW9kZWxOb3RpZmllckltcGwoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5ub3RpZmllcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFhNTE1vZGVsUGFyc2VyIGdldE1vZGVsUGFyc2VyKCkgewotCQlpZiAodGhpcy5wYXJzZXIgPT0gbnVsbCkgewotCQkJdGhpcy5wYXJzZXIgPSBuZXcgWE1MTW9kZWxQYXJzZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucGFyc2VyOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxVcGRhdGVyIGdldE1vZGVsVXBkYXRlcigpIHsKLQkJaWYgKHRoaXMudXBkYXRlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnVwZGF0ZXIgPSBuZXcgWE1MTW9kZWxVcGRhdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiB0aGlzLnVwZGF0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlZnJlc2goKSB7Ci0JCWlmICghdGhpcy5yZWZyZXNoKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCWlmICghaXNDaGFuZ2luZykKLQkJCW5vdGlmaWVyLmJlZ2luQ2hhbmdpbmcodHJ1ZSk7Ci0JCVhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IGdldE1vZGVsUGFyc2VyKCk7Ci0JCXNldEFjdGl2ZShwYXJzZXIpOwotCQl0aGlzLmRvY3VtZW50LnJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25MaXN0KCksIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKQotCQkJCW5vdGlmaWVyLmVuZENoYW5naW5nKCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIERPTSBpbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZVRoZQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0IChjYXNlLWluc2Vuc2l0aXZlKS4gVGhlIHZhbHVlcwotCSAqICAgICAgICAgICAgdXNlZCBieSBET00gZmVhdHVyZXMgYXJlIGRlZmluZWQgdGhyb3VnaG91dCB0aGUgRE9NIExldmVsIDIKLQkgKiAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIGFuZCBsaXN0ZWQgaW4gdGhlIHNlY3Rpb24uIFRoZSBuYW1lIG11c3QgYmUKLQkgKiAgICAgICAgICAgIGFuIFhNTCBuYW1lLiBUbyBhdm9pZCBwb3NzaWJsZSBjb25mbGljdHMsIGFzIGEgY29udmVudGlvbiwKLQkgKiAgICAgICAgICAgIG5hbWVzIHJlZmVycmluZyB0byBmZWF0dXJlcyBkZWZpbmVkIG91dHNpZGUgdGhlIERPTQotCSAqICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBzaG91bGQgYmUgbWFkZSB1bmlxdWUgYnkgcmV2ZXJzaW5nIHRoZSBuYW1lIG9mCi0JICogICAgICAgICAgICB0aGUgSW50ZXJuZXQgZG9tYWluIG5hbWUgb2YgdGhlIHBlcnNvbiAob3IgdGhlIG9yZ2FuaXphdGlvbgotCSAqICAgICAgICAgICAgdGhhdCB0aGUgcGVyc29uIGJlbG9uZ3MgdG8pIHdobyBkZWZpbmVzIHRoZSBmZWF0dXJlLAotCSAqICAgICAgICAgICAgY29tcG9uZW50IGJ5IGNvbXBvbmVudCwgYW5kIHVzaW5nIHRoaXMgYXMgYSBwcmVmaXguIEZvcgotCSAqICAgICAgICAgICAgaW5zdGFuY2UsIHRoZSBXM0MgU1ZHIFdvcmtpbmcgR3JvdXAgZGVmaW5lcyB0aGUgZmVhdHVyZQotCSAqICAgICAgICAgICAgIm9yZy53M2MuZG9tLnN2ZyIuCi0JICogQHBhcmFtIHZlcnNpb25UaGlzCi0JICogICAgICAgICAgICBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4gSW4gTGV2ZWwgMiwKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgY2FuIGJlIGVpdGhlciAiMi4wIiBvciAiMS4wIi4gSWYgdGhlIHZlcnNpb24gaXMKLQkgKiAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQsIHN1cHBvcnRpbmcgYW55IHZlcnNpb24gb2YgdGhlIGZlYXR1cmUgY2F1c2VzCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIHRvIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIGltcGxlbWVudGVkIGluIHRoZQotCSAqICAgICAgICAgc3BlY2lmaWVkIHZlcnNpb24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkgewotCQkJaWYgKCF2ZXJzaW9uLmVxdWFscygiMS4wIikgJiYgIXZlcnNpb24uZXF1YWxzKCIyLjAiKSkgeyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAoZmVhdHVyZS5lcXVhbHNJZ25vcmVDYXNlKCJDb3JlIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCWlmIChmZWF0dXJlLmVxdWFsc0lnbm9yZUNhc2UoIlhNTCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudCBpbnRlcm5hbENyZWF0ZURvY3VtZW50KCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnRJbXBsKCk7Ci0JCWRvY3VtZW50LnNldE1vZGVsKHRoaXMpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JYm9vbGVhbiBpc1JlcGFyc2luZygpIHsKLQkJcmV0dXJuIChhY3RpdmUgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogbmFtZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBuYW1lQ2hhbmdlZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIuY2hhbmdlTmFtZShub2RlKTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQkvLyBub3RpZmljYXRpb24gaXMgYWxyZWFkeSBzZW50Ci0JfQotCi0JLyoqCi0JICogbmV3TW9kZWwgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuaW1wbC5ldmVudHMuTmV3TW9kZWxFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGZvciB0aGUgY2FzZQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpKQotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmIChmbGF0Tm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYmVpbmcgY29uc3RydWN0ZWQKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJfQotCQkJLy8JCQkvLyBmb3IgbmV3IG1vZGVsLCB3ZSBtaWdodCBuZWVkIHRvCi0JCQkvLwkJCS8vIHJlLWluaXQsIGUuZy4gaWYgc29tZW9uZSBjYWxscyBzZXRUZXh0Ci0JCQkvLwkJCS8vIG9uIGFuIGV4aXN0aW5nIG1vZGVsCi0JCQkvLyAgICAgICAgICBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJLy8gY2FsbCBldmVuIGlmIGNoYW5naW5nIHRvIG5vdGlmeSBkb2luZyBuZXcgbW9kZWwKLQkJZ2V0TW9kZWxOb3RpZmllcigpLmJlZ2luQ2hhbmdpbmcodHJ1ZSk7Ci0JCVhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IGdldE1vZGVsUGFyc2VyKCk7Ci0JCXNldEFjdGl2ZShwYXJzZXIpOwotCQl0aGlzLmRvY3VtZW50LnJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhmbGF0Tm9kZXMsIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJLy8gbWVhbmluZ2xlc3MgdG8gcmVmcmVzaCwgYmVjYXVzZSB0aGUgcmVzdWx0IG1pZ2h0IGJlIHRoZSBzYW1lCi0JCX0gZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpIHsKLQkJCQlnZXRNb2RlbE5vdGlmaWVyKCkuZW5kQ2hhbmdpbmcoKTsKLQkJCX0KLQkJCS8vIGlnbm9yZSByZWZyZXNoCi0JCQl0aGlzLnJlZnJlc2ggPSBmYWxzZTsKLQkJfQotCQkvLwkJCWNoZWNrRm9yUmVpbml0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBldmVudCkgewotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQkvLyBjbGVhbnVwIHVwZGF0ZXIgc3RhZmZzCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobnVsbCwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJfQotCQkJLy8gSSBndWVzcyBubyBjaGFuYWdlIG1lYW5zIHRoZSBtb2RlbCBjb3VsZCBub3QgbmVlZCByZS1pbml0Ci0JCQkvL2NoZWNrRm9yUmVpbml0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBub2Rlc1JlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LmltcGwuZXZlbnRzLk5vZGVzUmVwbGFjZWRFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJaWYgKGV4LmdldENsYXNzKCkuZXF1YWxzKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24uY2xhc3MpKSB7Ci0JCQkJCUxvZ2dlci50cmFjZUV4Y2VwdGlvbihUUkFDRV9QQVJTRVJfTUFOQUdFTUVOVF9FWENFUFRJT04sIGV4KTsKLQkJCQl9IGVsc2UgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCWlmICghaXNDaGFuZ2luZykKLQkJCW5vdGlmaWVyLmJlZ2luQ2hhbmdpbmcoKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJaGFuZGxlUmVmcmVzaCgpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlZ2lvbkNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuaW1wbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGV2ZW50LmdldFJlZ2lvbigpOwotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5jaGFuZ2VSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJfQotCQkJLy8JCQljaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZygpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5jaGFuZ2VSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJaGFuZGxlUmVmcmVzaCgpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQkJLy8JCQljaGVja0ZvclJlaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIHJlZ2lvbnNSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5pbXBsLmV2ZW50cy5SZWdpb25SZXBsYWNlZEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucyA9IGV2ZW50LmdldE9sZFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBldmVudC5nZXROZXdSZWdpb25zKCk7Ci0JCWlmIChvbGRSZWdpb25zID09IG51bGwgJiYgbmV3UmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVJlZ2lvbnMoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vCQkJY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCWlmICghaXNDaGFuZ2luZykKLQkJCW5vdGlmaWVyLmJlZ2luQ2hhbmdpbmcoKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVJlZ2lvbnMoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCWlmICghaXNDaGFuZ2luZykgewotCQkJCW5vdGlmaWVyLmVuZENoYW5naW5nKCk7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JCS8vCQkJY2hlY2tGb3JSZWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbUVkaXQoKSB7Ci0JCWlmICghaXNTaGFyZWQoKSkgewotCQkJLy90aGlzLmRvY3VtZW50LnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQkJdGhpcy5kb2N1bWVudC5yZWxlYXNlRG9jdW1lbnRUeXBlKCk7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZUZyb21FZGl0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCQlpZiAoIWlzU2hhcmVkKCkpIHsKLQkJCS8vdGhpcy5kb2N1bWVudC5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJCXRoaXMuZG9jdW1lbnQucmVsZWFzZURvY3VtZW50VHlwZSgpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmUoT2JqZWN0IGFjdGl2ZSkgewotCQl0aGlzLmFjdGl2ZSA9IGFjdGl2ZTsKLQkJLy8gc2lkZSBlZmZlY3QKLQkJLy8gd2hlbiBldmVyIGJlY29tZXMgYWN0aXZlLCBiZXN1cmUgdGFnTmFtZUNhY2hlIGlzIGNsZWFyZWQKLQkJLy8gKGFuZCBub3QgdXNlZCkKLQkJaWYgKGFjdGl2ZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudC5hY3RpdmF0ZVRhZ05hbWVDYWNoZSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWRvY3VtZW50LmFjdGl2YXRlVGFnTmFtZUNhY2hlKGZhbHNlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yKFhNTEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxOb3RpZmllcihYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCXRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbFBhcnNlcihYTUxNb2RlbFBhcnNlciBwYXJzZXIpIHsKLQkJdGhpcy5wYXJzZXIgPSBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxVcGRhdGVyKFhNTE1vZGVsVXBkYXRlciB1cGRhdGVyKSB7Ci0JCXRoaXMudXBkYXRlciA9IHVwZGF0ZXI7Ci0JfQotCi0JLyoqCi0JICogc2V0U3RydWN0dXJlZERvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50KQotCQkJcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID4gMCkgewotCQkJbmV3TW9kZWwobmV3IE5ld0RvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50LCB0aGlzKSk7Ci0JCX0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFRhZ0NoYW5nZWQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLmNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5zdGFydFRhZ0NoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogdmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VWYWx1ZShub2RlKTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQlnZXRNb2RlbE5vdGlmaWVyKCkudmFsdWVDaGFuZ2VkKG5vZGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxOb3RpZmllckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxOb3RpZmllckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4NDlkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbE5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTE1vZGVsTm90aWZpZXJJbXBsIGltcGxlbWVudHMgWE1MTW9kZWxOb3RpZmllciB7Ci0KLQkvKiBlbmQ6IGZvciBkZWJ1Z2dpbmcgb25seSAqLwotCXByaXZhdGUgY2xhc3MgTm90aWZ5RXZlbnQgewotCQlPYmplY3QgY2hhbmdlZEZlYXR1cmU7Ci0JCWJvb2xlYW4gZGlzY2FyZGVkOwotCQlPYmplY3QgbmV3VmFsdWU7Ci0JCS8vIG5vdGU6IGRvbid0IGluaXRpYWxpemUgaW5zdGFuY2UgdmFyaWFibGVzLCBzaW5jZQotCQkvLyB0aGF0IGNhdXNlcyBkb3VibGUgYXNzaWdubWVudHMsIGFuZCBsb3RzIG9mIHRoZXNlIGFyZSBjcmVhdGVkLgotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyOwotCQlPYmplY3Qgb2xkVmFsdWU7Ci0JCWludCBwb3M7Ci0JCVN0cmluZyByZWFzb247Ci0JCWludCB0eXBlOwotCi0JCU5vdGlmeUV2ZW50KElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCB0eXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5jaGFuZ2VkRmVhdHVyZSA9IGNoYW5nZWRGZWF0dXJlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQkJdGhpcy5wb3MgPSBwb3M7Ci0JCQl0aGlzLnJlYXNvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURERURfVEhFTl9SRU1PVkVEID0gIkRpc2NhcmQ6IEFkZGVkIHRoZW4gcmVtb3ZlZCBydWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZk9wdGltaXplRGVmZXJyZWQgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZk9wdGltaXplRGVmZXJyZWRBY2NvcmRpbmdUb1BhcmVudEFkZGVkID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZPcHRpbWl6ZURlZmVycmVkQWNjb3JkaW5nVG9QYXJlbnRSZW1vdmVkID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSRU5UX0lTX0FEREVEID0gIkRpc2FyZGVkOiBQYXJlbnQgaGFzIGp1c3QgYmVlbiBhZGRlZCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBzdGFydDogZm9yIGRlYnVnZ2luZyBvbmx5ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkVOVF9JU19SRU1PVkVEX1RPTyA9ICJEaXNjYXJkOiBQYXJlbnQgd2FzIHJlbW92ZWQgdG9vIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVJFTlRfSVNfUkVQQVJFTlRFRCA9ICJOb3QgRGlzY2FyZDogUGFyZW50IHdhcyByZW1vdmVkIHNvIHRoaXMgaW1wbGllcyByZXBhcmVudGluZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE5vZGUgY2hhbmdlZFJvb3QgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGNoYW5naW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRvaW5nTmV3TW9kZWwgPSBmYWxzZTsKLQlwcml2YXRlIFZlY3RvciBldmVudHMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmbHVzaGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHVibGljIFhNTE1vZGVsTm90aWZpZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGF0dHJSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRyUmVwbGFjZWQoRWxlbWVudCBlbGVtZW50LCBBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cikgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlBdHRyIGF0dHIgPSBudWxsOwotCQlTdHJpbmcgb2xkVmFsdWUgPSBudWxsOwotCQlTdHJpbmcgbmV3VmFsdWUgPSBudWxsOwotCQlpZiAob2xkQXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyID0gb2xkQXR0cjsKLQkJCW9sZFZhbHVlID0gb2xkQXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0JCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCWF0dHIgPSBuZXdBdHRyOwotCQkJbmV3VmFsdWUgPSBuZXdBdHRyLmdldFZhbHVlKCk7Ci0JCX0KLQkJWE1MTm9kZSBub3RpZmllciA9IChYTUxOb2RlKSBlbGVtZW50OwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgYXR0ciwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQobm90aWZpZXIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luQ2hhbmdpbmcoKSB7Ci0JCXRoaXMuY2hhbmdpbmcgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luQ2hhbmdpbmcoYm9vbGVhbiBuZXdNb2RlbCkgewotCQliZWdpbkNoYW5naW5nKCk7Ci0JCXRoaXMuZG9pbmdOZXdNb2RlbCA9IG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5zZWQubW9kZWwueG1sLlhNTE1vZGVsTm90aWZpZXIjY2FuY2VsUGVuZGluZygpCi0JICovCi0JcHVibGljIHZvaWQgY2FuY2VsUGVuZGluZygpIHsKLQkJLy8gd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhpcyBhcnJheSwgc2luY2UKLQkJLy8gdGhlIGFycmF5IG1heSBiZSBiZWluZyBwcm9jZXNzZWQsIGluIHRoZSBkZWZmZXJyZWQgbm90aWZpY2F0aW9uCi0JCS8vIGxvb3AsIGJ1dCB3ZSBjYW4gc2lnbmFsIHRoYXQgYWxsCi0JCS8vIHNob3VsZCBiZSBkaXNjYXJkZWQsIHNvIGFueSByZW1haW5pbmcgb25lcyB3aWxsIGJlIGlnbm9yZWQuCi0JCWlmICh0aGlzLmV2ZW50cyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMuZXZlbnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlldmVudC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIHRoaXMgY2FuY2VsIGlzIHByZXN1bWFibHkgYmVpbmcgY2FsbGVkIGFzIGEgZnVuY3Rpb24gb2YKLQkJLy8gInJlaW5pdGlhaWxpemF0aW9uIiBzbyB3ZSBjYW4gaWdub3JlIGNoYW5nZXMgdG8gdGhlCi0JCS8vIG9sZCByb290LCBhbmQgY2hhbmdlcyB0byB0aGUgbmV3IG9uZSB3aWxsIGJlIHRyaWdnZXJlZCBkdXJpbmcKLQkJLy8gcmVpbml0aWFsaXphdGlvbi4KLQkJY2hhbmdlZFJvb3QgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIGNoaWxkUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGlsZFJlcGxhY2VkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgewotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxOb2RlIG5vdGlmaWVyID0gKFhNTE5vZGUpIHBhcmVudE5vZGU7Ci0JCWludCB0eXBlID0gSU5vZGVOb3RpZmllci5DSEFOR0U7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IElOb2RlTm90aWZpZXIuUkVNT1ZFOwotCQllbHNlIGlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IElOb2RlTm90aWZpZXIuQUREOwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCB0eXBlLCBvbGRDaGlsZCwgb2xkQ2hpbGQsIG5ld0NoaWxkLCBvZmZzZXQpOwotCQlzdHJ1Y3R1cmVDaGFuZ2VkKG5vdGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlZGl0YWJsZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE5vZGUgbm90aWZpZXIgPSAoWE1MTm9kZSkgbm9kZTsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgSU5vZGVOb3RpZmllci5DSEFOR0UsIG51bGwsIG51bGwsIG51bGwsIG9mZnNldCk7Ci0JCXByb3BlcnR5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZW5kQ2hhbmdpbmcoKSB7Ci0JCXRoaXMuZG9pbmdOZXdNb2RlbCA9IGZhbHNlOwotCQlpZiAoIXRoaXMuY2hhbmdpbmcpCi0JCQlyZXR1cm47IC8vIGF2b2lkIG5lc3RpbmcgY2FsbHMKLQkJbm90aWZ5RGVmZXJyZWQoKTsKLQkJaWYgKHRoaXMuY2hhbmdlZFJvb3QgIT0gbnVsbCkgewotCQkJbm90aWZ5U3RydWN0dXJlQ2hhbmdlZCh0aGlzLmNoYW5nZWRSb290KTsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJU3RyaW5nIHAgPSB0aGlzLmNoYW5nZWRSb290LmdldE5vZGVOYW1lKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZWZlcnJlZCBTVFJVQ1VUUkVfQ0hBTkdFRDogIiArIHApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmNoYW5nZWRSb290ID0gbnVsbDsKLQkJfQotCQl0aGlzLmNoYW5naW5nID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZW5kVGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MTm9kZSBub3RpZmllciA9IChYTUxOb2RlKSBlbGVtZW50OwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgbnVsbCwgbnVsbCwgbnVsbCwgb2Zmc2V0KTsKLQkJcHJvcGVydHlDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoYW5nZWQoKSB7Ci0JCXJldHVybiAodGhpcy5ldmVudHMgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeShJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jaGFuZ2luZyAmJiAhdGhpcy5mbHVzaGluZykgewotCQkJLy8gZGVmZXIgbm90aWZpY2F0aW9uCi0JCQlpZiAodGhpcy5ldmVudHMgPT0gbnVsbCkKLQkJCQl0aGlzLmV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLQkJCS8vIHdlIGRvIG5vdCBkZWZlciBhbnl0aGluZyBpZiB3ZSBhcmUgZG9pbmcgYSBuZXcgTW9kZWwsCi0JCQkvLyBleGNlcHQgZm9yIHRoZSBkb2N1bWVudCBldmVudCwgc2luY2UgYWxsIG90aGVycyBhcmUKLQkJCS8vIHRyaXZpYWwgYW5kIG5vdCBuZWVkZWQgYXQgdGhhdCBpbml0aWFsIHBvaW50LgotCQkJLy8gQnV0IGV2ZW4gZm9yIHRoYXQgb25lIGRvY3VtZW50IGV2ZW50LCBpbiB0aGUgbmV3IG1vZGVsIGNhc2UsCi0JCQkvLyBpdCBpcyBzdGlsbCBpbXBvcnRhbnQgdG8gZGVmZXIgaXQuCi0JCQlpZiAoKCFkb2luZ05ld01vZGVsKSB8fCAoKChOb2RlKSBub3RpZmllcikuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQkJdGhpcy5ldmVudHMuYWRkRWxlbWVudChuZXcgTm90aWZ5RXZlbnQobm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vIEl0cyBpbXBvcnRhbnQgdG8gImtlZXAgZ29pbmciIGlmIGV4Y2VwdGlvbiBvY2N1cnMsIHNpbmNlIHRoaXMKLQkJCS8vIG5vdGlmaWNhdGlvbgotCQkJLy8gY29tZXMgaW4gYmV0d2VlbiAiYWJvdXQgdG8gY2hhbmdlIiBhbmQgImNoYW5nZWQiIGV2ZW50cy4gV2UgZG8KLQkJCS8vIGxvZywgaG93ZXZlciwKLQkJCS8vIHNpbmNlIHdvdWxkIGluZGljYXRlIGEgcHJvZ3JhbSBlcnJvci4KLQkJCW5vdGlmaWVyLm5vdGlmeShldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJBIHN0cnVjdHVyZWQgbW9kZWwgY2xpZW50IHRocmV3IGZvbGxvd2luZyBleGNlcHRpb24gZHVyaW5nIGFkYXB0ZXIgbm90aWZpY2F0aW9uICgiICsgSU5vZGVOb3RpZmllci5FVkVOVF9UWVBFX1NUUklOR1NbZXZlbnRUeXBlXSArICIgKSIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlEZWZlcnJlZCgpIHsKLQkJaWYgKHRoaXMuZXZlbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmZsdXNoaW5nKQotCQkJcmV0dXJuOwotCQl0aGlzLmZsdXNoaW5nID0gdHJ1ZTsgLy8gZm9yY2Ugbm90aWZpY2F0aW9uCi0JCWludCBjb3VudCA9IHRoaXMuZXZlbnRzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlOb3RpZnlFdmVudCBldmVudCA9IChOb3RpZnlFdmVudCkgdGhpcy5ldmVudHMuZWxlbWVudEF0KGkpOwotCQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQkJY29udGludWU7IC8vIGVycm9yCi0JCQlpZiAoZXZlbnQuZGlzY2FyZGVkKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFkb2luZ05ld01vZGVsICYmIGZPcHRpbWl6ZURlZmVycmVkKSB7Ci0JCQkJLy8gY2hlY2sgcmVkdW5kYW50IGV2ZW50cyAobm8gbmVlZCB0byBjaGVjayBpZiBkb2luZyBOZXdNb2RlbCwKLQkJCQkvLyBzaW5jZQotCQkJCS8vIHNob3VsZG4ndCBiZSByZWR1bmFuY2llcykKLQkJCQlpZiAoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJCQlmb3IgKGludCBuID0gaSArIDE7IG4gPCBjb3VudDsgbisrKSB7Ci0JCQkJCQlOb3RpZnlFdmVudCBuZXh0ID0gKE5vdGlmeUV2ZW50KSB0aGlzLmV2ZW50cy5lbGVtZW50QXQobik7Ci0JCQkJCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCQkJaWYgKG5leHQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSAmJiBuZXh0Lm9sZFZhbHVlID09IGV2ZW50Lm5ld1ZhbHVlKSB7Ci0JCQkJCQkJLy8gQWRkZWQgdGhlbiByZW1vdmVkIGxhdGVyLCBkaXNjYXJkIGJvdGgKLQkJCQkJCQlldmVudC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJCQkJCW5leHQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCQlldmVudC5yZWFzb24gPSBldmVudC5yZWFzb24gKyBBRERFRF9USEVOX1JFTU9WRUQgKyAiKHNlZSAiICsgbiArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCW5leHQucmVhc29uID0gbmV4dC5yZWFzb24gKyBBRERFRF9USEVOX1JFTU9WRUQgKyAiKHNlZSAiICsgaSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChldmVudC5kaXNjYXJkZWQpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKGZPcHRpbWl6ZURlZmVycmVkQWNjb3JkaW5nVG9QYXJlbnRBZGRlZCkgewotCQkJCQkJZm9yIChpbnQgcCA9IDA7IHAgPCBpOyBwKyspIHsKLQkJCQkJCQlOb3RpZnlFdmVudCBwcmV2ID0gKE5vdGlmeUV2ZW50KSB0aGlzLmV2ZW50cy5lbGVtZW50QXQocCk7Ci0JCQkJCQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJCQkJaWYgKHByZXYudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSAmJiBwcmV2Lm9sZFZhbHVlID09IGV2ZW50Lm5vdGlmaWVyKSB7Ci0JCQkJCQkJCS8vIHBhcmVudCBpcyByZXBhcmVudGVkLCBkbyBub3QgZGlzY2FyZAotCQkJCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCQkJZXZlbnQucmVhc29uID0gZXZlbnQucmVhc29uICsgUEFSRU5UX0lTX1JFUEFSRU5URUQgKyAiKHNlZSAiICsgcCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfSBlbHNlIGlmIChwcmV2LnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgJiYgcHJldi5uZXdWYWx1ZSA9PSBldmVudC5ub3RpZmllcikgewotCQkJCQkJCQkvLyBwYXJlbnQgaGFzIGJlZW4gYWRkZWQsIGRpc2NhcmQgdGhpcwotCQkJCQkJCQlldmVudC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCQkJZXZlbnQucmVhc29uID0gZXZlbnQucmVhc29uICsgUEFSRU5UX0lTX0FEREVEICsgIihzZWUgIiArIHAgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChldmVudC5kaXNjYXJkZWQpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJaWYgKGZPcHRpbWl6ZURlZmVycmVkQWNjb3JkaW5nVG9QYXJlbnRSZW1vdmVkKSB7Ci0JCQkJCQlmb3IgKGludCBuID0gaSArIDE7IG4gPCBjb3VudDsgbisrKSB7Ci0JCQkJCQkJTm90aWZ5RXZlbnQgbmV4dCA9IChOb3RpZnlFdmVudCkgdGhpcy5ldmVudHMuZWxlbWVudEF0KG4pOwotCQkJCQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCQkJCWlmIChuZXh0LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJCQkJaWYgKG5leHQub2xkVmFsdWUgPT0gZXZlbnQubm90aWZpZXIpIHsKLQkJCQkJCQkJCS8vIHBhcmVudCB3aWxsIGJlIHJlbW92ZWQsIGRpc2NhcmQgdGhpcwotCQkJCQkJCQkJZXZlbnQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCQkJCQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJCQkJCQkJZXZlbnQucmVhc29uID0gZXZlbnQucmVhc29uICsgUEFSRU5UX0lTX1JFTU9WRURfVE9PICsgIihzZWUgIiArIG4gKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZXZlbnQuZGlzY2FyZGVkKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbm90aWZ5KGV2ZW50Lm5vdGlmaWVyLCBldmVudC50eXBlLCBldmVudC5jaGFuZ2VkRmVhdHVyZSwgZXZlbnQub2xkVmFsdWUsIGV2ZW50Lm5ld1ZhbHVlLCBldmVudC5wb3MpOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQlmb3IgKGludCBsID0gMDsgbCA8IGNvdW50OyBsKyspIHsKLQkJCQlOb3RpZnlFdmVudCBldmVudCA9IChOb3RpZnlFdmVudCkgdGhpcy5ldmVudHMuZWxlbWVudEF0KGwpOwotCQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCQlTdHJpbmcgdCA9IG51bGw7Ci0JCQkJaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQpIHsKLQkJCQkJbyA9IGV2ZW50Lm5ld1ZhbHVlOwotCQkJCQl0ID0gIiArICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJbyA9IGV2ZW50Lm9sZFZhbHVlOwotCQkJCQl0ID0gIiAtICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCVN0cmluZyBwID0gKChOb2RlKSBldmVudC5ub3RpZmllcikuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJU3RyaW5nIGMgPSAoKE5vZGUpIG8pLmdldE5vZGVOYW1lKCk7Ci0JCQkJCVN0cmluZyBkID0gKGV2ZW50LmRpc2NhcmRlZCA/ICIhICIgOiAiICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihkICsgcCArIHQgKyBjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhpcy5mbHVzaGluZyA9IGZhbHNlOwotCQl0aGlzLmV2ZW50cyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVN0cnVjdHVyZUNoYW5nZWQoTm9kZSByb290KSB7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgcm9vdDsKLQkJdHJ5IHsKLQkJCS8vIEl0cyBpbXBvcnRhbnQgdG8gImtlZXAgZ29pbmciIGlmIGV4Y2VwdGlvbiBvY2N1cnMsIHNpbmNlIHRoaXMKLQkJCS8vIG5vdGlmaWNhdGlvbgotCQkJLy8gY29tZXMgaW4gYmV0d2VlbiAiYWJvdXQgdG8gY2hhbmdlIiBhbmQgImNoYW5nZWQiIGV2ZW50cy4gV2UgZG8KLQkJCS8vIGxvZywgaG93ZXZlciwKLQkJCS8vIHNpbmNlIHdvdWxkIGluZGljYXRlIGEgcHJvZ3JhbSBlcnJvci4KLQkJCW5vdGlmaWVyLm5vdGlmeShJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VELCBudWxsLCBudWxsLCBudWxsLCAtMSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJBIHN0cnVjdHVyZWQgbW9kZWwgY2xpZW50IHRocmV3IGZvbGxvd2luZyBleGNlcHRpb24gZHVyaW5nIGFkYXB0ZXIgbm90aWZpY2F0aW9uICgiICsgSU5vZGVOb3RpZmllci5FVkVOVF9UWVBFX1NUUklOR1NbSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRF0gKyAiICkiLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChOb2RlIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDb21tb25Sb290SWZOZWVkZWQoTm9kZSBub2RlKSB7Ci0JCS8vIGRlZmVyIG5vdGlmaWNhdGlvbgotCQlpZiAodGhpcy5jaGFuZ2VkUm9vdCA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoYW5nZWRSb290ID0gbm9kZTsKLQkJfSBlbHNlIHsKLQkJCS8vIHRpbnkgb3B0aW1pemF0aW9uOiBpZiBwcmV2aW91cyBjb21tb25BbmNlc3RvciAoY2hhbmdlZFJvb3QpIGlzCi0JCQkvLyBhbHJlYWR5ICdkb2N1bWVudCcsCi0JCQkvLyBvciBpZiBhbHJlYWR5IGVxdWFsIHRvIHRoaXMgJ25vZGUnLAotCQkJLy8gdGhlbiBubyBuZWVkIHRvIHJlLWNhbGN1bGF0ZQotCQkJaWYgKGNoYW5nZWRSb290LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFICYmIGNoYW5nZWRSb290ICE9IG5vZGUpIHsKLQkJCQlOb2RlIGNvbW1vbiA9ICgoTm9kZUltcGwpIHRoaXMuY2hhbmdlZFJvb3QpLmdldENvbW1vbkFuY2VzdG9yKG5vZGUpOwotCQkJCWlmIChjb21tb24gIT0gbnVsbCkKLQkJCQkJdGhpcy5jaGFuZ2VkUm9vdCA9IGNvbW1vbjsKLQkJCQllbHNlCi0JCQkJCXRoaXMuY2hhbmdlZFJvb3QgPSBub2RlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxOb2RlIG5vdGlmaWVyID0gKFhNTE5vZGUpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBudWxsLCBudWxsLCBudWxsLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc3RydWN0dXJlQ2hhbmdlZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2hhbmdpbmcoKSkgewotCQkJc2V0Q29tbW9uUm9vdElmTmVlZGVkKG5vZGUpOwotCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQlTdHJpbmcgcCA9IHRoaXMuY2hhbmdlZFJvb3QuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlcXVlc3RlZCBTVFJVQ1VUUkVfQ0hBTkdFRDogIiArIHApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCVN0cmluZyBwID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTVFJVQ1VUUkVfQ0hBTkdFRDogIiArIHApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbm90aWZ5U3RydWN0dXJlQ2hhbmdlZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiB2YWx1ZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE5vZGUgbm90aWZpZXIgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCUF0dHIgYXR0ciA9IChBdHRyKSBub2RlOwotCQkJbm90aWZpZXIgPSAoWE1MTm9kZSkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCS8vIFRPRE9fZG13OiBleHBlcmltZW50YWw6IGNoYW5nZWQgMDYvMjkvMjAwNCB0byBzZW5kICJzdHJ1Y3V0dXJlCi0JCQkvLyBjaGFuZ2VkIiBldmVuIGZvciBhdHRyaWJ1dGUgdmFsdWUgY2hhbmdlcwotCQkJLy8gdGhlcmUgYXJlIHByb3MgYW5kIGNvbnMgdG8gY29uc2lkZXJpbmcgYXR0cmlidXRlIHZhbHVlCi0JCQkvLyAic3RydWN0dXJlIGNoYW5nZWQiLiBXaWxsIChyZSljb25zaWRlcgotCQkJLy8gc2V0Q29tbW9uUm9vdElmTmVlZGVkKG5vdGlmaWVyKTsKLQkJCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCVN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgYXR0ciwgbnVsbCwgdmFsdWUsIG9mZnNldCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RlOiB3ZSBkbyBub3Qgc2VuZCBzdHJ1Y3R1cmVkIGNoYW5nZWQgZXZlbnQgZm9yIGNvbnRlbnQKLQkJCS8vIGNoYW5nZWQKLQkJCW5vdGlmaWVyID0gKFhNTE5vZGUpIG5vZGU7Ci0JCQlTdHJpbmcgdmFsdWUgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBudWxsLCBudWxsLCB2YWx1ZSwgb2Zmc2V0KTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlYTUxOb2RlIHBhcmVudCA9IChYTUxOb2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJbm90aWZ5KHBhcmVudCwgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQsIG5vZGUsIG51bGwsIHZhbHVlLCBvZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwcm9wZXJ0eUNoYW5nZWQobm90aWZpZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2NDc0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb21tZW50ZWxlbWVudC5pbXBsLkNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogWE1MTW9kZWxQYXJzZXIKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsUGFyc2VyIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0cyB7Ci0JcHJpdmF0ZSBNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JcHJpdmF0ZSBYTUxNb2RlbENvbnRleHQgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBYTUxNb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFhNTE1vZGVsUGFyc2VyKFhNTE1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCQl0aGlzLmRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmICh0aGlzLmRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQl0aGlzLmFkYXB0ZXIgPSAoTW9kZWxQYXJzZXJBZGFwdGVyKSB0aGlzLmRvY3VtZW50LmdldEFkYXB0ZXJGb3IoTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICh0aGlzLmFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuYWRhcHRlci5jYW5CZUltcGxpY2l0VGFnKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCkgewotCQlpZiAodGhpcy5hZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmFkYXB0ZXIuY2FuQmVJbXBsaWNpdFRhZyhlbGVtZW50LCBjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkNvbnRhaW4oRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGltcGwuaXNFbmRUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsgLy8gaW52YWxpZCAoZmxvYXRpbmcpIGVuZCB0YWcKLQkJaWYgKCFpbXBsLmlzQ29udGFpbmVyKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlpZiAoaW1wbC5pc0pTUENvbnRhaW5lcigpIHx8IGltcGwuaXNDREFUQUNvbnRhaW5lcigpKSB7Ci0JCQkJLy8gYWNjZXB0cyBvbmx5IFRleHQgY2hpbGQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoaXMuYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmNhbkNvbnRhaW4oZWxlbWVudCwgY2hpbGQpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyRXF1YWwoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCQkvLyBqdXN0IG5vdGlmeSB0aGUgY2hhbmdlIGluc3RlYWQgb2Ygc2V0dGluZyBkYXRhCi0JCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKSBub2RlOwotCQkJCXBpLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGFjdHVhbGx5LCBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogY2hhbmdlQXR0ck5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JVGV4dFJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIG5vZGU7Ci0JCQkJcGkubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLmdldE5hbWVSZWdpb24oKSAhPSByZWdpb24pCi0JCQkJY29udGludWU7Ci0KLQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJYXR0ci5zZXROYW1lKG5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VBdHRyVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JVGV4dFJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyVmFsdWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCQkvLyBqdXN0IG5vdGlmeSB0aGUgY2hhbmdlIGluc3RlYWQgb2Ygc2V0dGluZyBkYXRhCi0JCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKSBub2RlOwotCQkJCXBpLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYXR0ci5nZXRWYWx1ZVJlZ2lvbigpICE9IHJlZ2lvbikKLQkJCQljb250aW51ZTsKLQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIHZhbHVlCi0JCQlhdHRyLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVRleHRSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlRGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbm9kZTsKLQkJCQlpZiAodGV4dC5pc1NoYXJpbmdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpKSB7Ci0JCQkJCS8vIGhhcyBjb25zZWN1dGl2ZSB0ZXh0IHNoYXJpbmcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShub2RlKTsKLQkJCQljbGVhbnVwVGV4dCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJLy8gY29tbWVudCB0YWcKLQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJldHVybjsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJTm9kZUltcGwgaW1wbCA9IChOb2RlSW1wbCkgbm9kZTsKLQkJaW1wbC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBjaGFuZ2UgaXMgb25seSBmb3IgY2xvc2UgdGFnCi0JCWlmIChuZXdSZWdpb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBuZXdSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKG9sZFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IG9sZFJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQkvLyBvdGhlciByZWdpb24gaGFzIGNoYW5nZWQKLQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIGNoYW5nZSBmb3IgY2xvc2UgdGFnIGhhcyBubyBpbXBhY3QKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIGNoYW5nZVJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uCi0JICovCi0Jdm9pZCBjaGFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLmNvbnRleHQgPSBuZXcgWE1MTW9kZWxDb250ZXh0KHRoaXMuZG9jdW1lbnQpOwotCi0JCS8vIG9wdGltaXplIHR5cGljYWwgY2FzZXMKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DT05URU5UIHx8IHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUIHx8IHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCB8fCByZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCB8fCByZWdpb25UeXBlID09IEpTUF9DT05URU5UKSB7Ci0JCQljaGFuZ2VEYXRhKGZsYXROb2RlLCByZWdpb24pOwotCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQljaGFuZ2VBdHRyTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfSBlbHNlIGlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWNoYW5nZUF0dHJWYWx1ZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfSBlbHNlIGlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQljaGFuZ2VBdHRyRXF1YWwoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0gZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCByZWdpb25UeXBlID09IEpTUF9ST09UX1RBR19OQU1FIHx8IHJlZ2lvblR5cGUgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQljaGFuZ2VUYWdOYW1lKGZsYXROb2RlLCByZWdpb24pOwotCQl9IGVsc2UgewotCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0KLQkJLy8gY2hlY2sgaWYgY2hhbmdlcyBhcmUgb25seSBmb3IgYXR0cmlidXRlcyBhbmQgY2xvc2UgdGFnCi0JCWJvb2xlYW4gdGFnTmFtZVVuY2hhbmdlZCA9IGZhbHNlOwotCQlpZiAobmV3UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbmV3UmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gY2hhbmdlIGZyb20gZW1wdHkgdGFnIG1heSBoYXZlIGltcGFjdCBvbiBzdHJ1Y3R1cmUKLQkJCQkJaWYgKCFlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCByZWdpb25UeXBlID09IEpTUF9ST09UX1RBR19OQU1FIHx8IHJlZ2lvblR5cGUgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJCVN0cmluZyBvbGRUYWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdUYWdOYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCQlpZiAob2xkVGFnTmFtZSAhPSBudWxsICYmIG5ld1RhZ05hbWUgIT0gbnVsbCAmJiBvbGRUYWdOYW1lLmVxdWFscyhuZXdUYWdOYW1lKSkgewotCQkJCQkJLy8gdGhlIHRhZyBuYW1lIGlzIHVuY2hhbmdlZAotCQkJCQkJdGFnTmFtZVVuY2hhbmdlZCA9IHRydWU7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIG90aGVyIHJlZ2lvbiBoYXMgY2hhbmdlZAotCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChvbGRSZWdpb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBvbGRSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUgfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyB8fCByZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJCQkvLyBjaGFuZ2UgZnJvbSBlbXB0eSB0YWcgbWF5IGhhdmUgaW1wYWN0IG9uIHN0cnVjdHVyZQotCQkJCQlpZiAoIWVsZW1lbnQuaXNFbXB0eVRhZygpKQotCQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IHJlZ2lvblR5cGUgPT0gSlNQX1JPT1RfVEFHX05BTUUpIHsKLQkJCQkJLy8gaWYgbmV3IHRhZyBuYW1lIGlzIHVuY2hhbmdlZCwgaXQncyBPSwotCQkJCQlpZiAodGFnTmFtZVVuY2hhbmdlZCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCS8vIG90aGVyIHJlZ2lvbiBoYXMgY2hhbmdlZAotCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gdXBkYXRlIGF0dHJpYnV0ZXMKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJLy8gZmlyc3QgcmVtb3ZlIGF0dHJpYnV0ZXMKLQkJaW50IHJlZ2lvbkluZGV4ID0gMDsKLQkJaW50IGF0dHJJbmRleCA9IDA7Ci0JCUF0dHJJbXBsIGF0dHIgPSBudWxsOwotCQl3aGlsZSAoYXR0ckluZGV4IDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKSkgewotCQkJYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGF0dHJJbmRleCk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKSB7IC8vIGVycm9yCi0JCQkJYXR0ckluZGV4Kys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gYXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsKSB7IC8vIGVycm9yCi0JCQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IHJlZ2lvbkluZGV4OyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCWlmIChyZWdpb24gPT0gbmFtZVJlZ2lvbikgewotCQkJCQlyZWdpb25JbmRleCA9IGkgKyAxOyAvLyBuZXh0IHJlZ2lvbgotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCkgewotCQkJCWF0dHJJbmRleCsrOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbnNlcnQgb3IgdXBkYXRlIGF0dHJpYnV0ZXMKLQkJYXR0ckluZGV4ID0gMDsgLy8gcmVzZXQgdG8gZmlyc3QKLQkJQXR0ckltcGwgbmV3QXR0ciA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIG9sZFZhbHVlUmVnaW9uID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJCQkvLyBpbnNlcnQgZGVmZXJyZWQgbmV3IGF0dHJpYnV0ZQotCQkJCQllbGVtZW50Lmluc2VydEF0dHJpYnV0ZU5vZGUobmV3QXR0ciwgYXR0ckluZGV4KyspOwotCQkJCQluZXdBdHRyID0gbnVsbDsKLQkJCQl9IGVsc2UgaWYgKGF0dHIgIT0gbnVsbCAmJiBvbGRWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCS8vIG5vdGlmeSBleGlzdGluZyBhdHRyaWJ1dGUgdmFsdWUgcmVtb3ZhbAotCQkJCQlhdHRyLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJCX0KLQotCQkJCW9sZFZhbHVlUmVnaW9uID0gbnVsbDsKLQkJCQlhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oYXR0ckluZGV4KTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIuZ2V0TmFtZVJlZ2lvbigpID09IHJlZ2lvbikgewotCQkJCQkvLyBleGlzdGluZyBhdHRyaWJ1dGUKLQkJCQkJYXR0ckluZGV4Kys7Ci0JCQkJCS8vIGNsZWFyIG90aGVyIHJlZ2lvbnMKLQkJCQkJb2xkVmFsdWVSZWdpb24gPSBhdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24obnVsbCk7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24obnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCWF0dHIgPSAoQXR0ckltcGwpIHRoaXMuZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIGRlZmVyIGluc2VydGlvbiBvZiBuZXcgYXR0cmlidXRlCi0JCQkJCW5ld0F0dHIgPSBhdHRyOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWlmIChhdHRyICE9IG5ld0F0dHIgJiYgb2xkVmFsdWVSZWdpb24gIT0gcmVnaW9uKSB7Ci0JCQkJCQkvLyBub3RpZnkgZXhpc3RpbmcgYXR0cmlidXRlIHZhbHVlIGNoYW5nZWQKLQkJCQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQkJCX0KLQkJCQkJb2xkVmFsdWVSZWdpb24gPSBudWxsOwotCQkJCQlhdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQkvLyBpbnNlcnQgZGVmZXJyZWQgbmV3IGF0dHJpYnV0ZQotCQkJZWxlbWVudC5hcHBlbmRBdHRyaWJ1dGVOb2RlKG5ld0F0dHIpOwotCQl9IGVsc2UgaWYgKGF0dHIgIT0gbnVsbCAmJiBvbGRWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBub3RpZnkgZXhpc3RpbmcgYXR0cmlidXRlIHZhbHVlIHJlbW92YWwKLQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzZXR1cENvbnRleHQoZmxhdE5vZGUpOwotCi0JCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGlzIHNldCB0byBkZWVwZXN0IGxldmVsCi0JCS8vIHdoZW4gZW5kIHRhZyBoYXMgYmVlbiByZW1vdmVkCi0JCXRoaXMuY29udGV4dC5zZXRMYXN0KCk7Ci0JCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0KLQkJY2xlYW51cFRleHQoKTsKLQkJY2xlYW51cEVuZFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VUYWdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlTdHJpbmcgbmV3VGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJaWYgKG5ld1RhZ05hbWUgPT0gbnVsbCB8fCAhZWxlbWVudC5tYXRjaFRhZ05hbWUobmV3VGFnTmFtZSkpIHsKLQkJCS8vIHRoZSB0YWcgbmFtZSBpcyBjaGFuZ2VkCi0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gdGhlIHRhZyBuYW1lIGlzIHVuY2hhbmdlZAotCQkvLyB0aGlzIGhhcHBlbnMgd2hlbiB0eXBpbmcgc3BhY2VzIGFmdGVyIHRoZSB0YWcgbmFtZQotCQkvLyBkbyBub3RoaW5nLCBidXQuLi4KLQkJLy8gaWYgaXQncyBub3QgYSBjaGFuZ2UgaW4gdGhlIGVuZCB0YWcgb2YgYW4gZWxlbWVudCB3aXRoIHRoZSBzdGFydAotCQkvLyB0YWcsCi0JCS8vIGFuZCBjYXNlIGhhcyBiZWVuIGNoYW5nZWQsIHNldCB0byBlbGVtZW50IGFuZCBub3RpZnkKLQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgfHwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpICE9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCWlmICh0YWdOYW1lID09IG51bGwgfHwgIXRhZ05hbWUuZXF1YWxzKG5ld1RhZ05hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXRUYWdOYW1lKG5ld1RhZ05hbWUpOwotCQkJCWVsZW1lbnQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbGVhbnVwQ29udGV4dCBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW51cEVuZFRhZygpIHsKLQkJTm9kZSBwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQlpZiAoZWxlbWVudC5pc0VuZFRhZygpKSB7Ci0JCQkJCQkvLyBmbG9hdGluZyBlbmQgdGFnCi0JCQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQkJCQkJRWxlbWVudEltcGwgc3RhcnQgPSAoRWxlbWVudEltcGwpIHRoaXMuY29udGV4dC5maW5kU3RhcnRUYWcodGFnTmFtZSwgcm9vdE5hbWUpOwotCQkJCQkJaWYgKHN0YXJ0ICE9IG51bGwpIHsKLQkJCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQkJCS8vIG1vdmUgdGhlIGVuZCB0YWcgZnJvbSAnZWxlbWVudCcgdG8gJ3N0YXJ0JwotCQkJCQkJCXN0YXJ0LmFkZEVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQkJCQkJCXBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJbmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBmaXJzdCA9IG5leHQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBmaXJzdDsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgZWxlbWVudC5oYXNTdGFydFRhZygpICYmIGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRFbmRUYWcodGFnTmFtZSk7Ci0JCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQkJLy8gbW92ZSB0aGUgZW5kIHRhZyBmcm9tICdlbmQnIHRvICdlbGVtZW50JwotCQkJCQkJZWxlbWVudC5hZGRFbmRUYWcoZW5kKTsKLQkJCQkJCXJlbW92ZUVuZFRhZyhlbmQpOwotCQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsgLy8gcmVzZXQgY29udGV4dAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCW5leHQgPSBwYXJlbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBUZXh0KCkgewotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBuZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCU5vZGUgcHJldiA9IChuZXh0ID09IG51bGwgPyBwYXJlbnQuZ2V0TGFzdENoaWxkKCkgOiBuZXh0LmdldFByZXZpb3VzU2libGluZygpKTsKLQotCQlUZXh0SW1wbCBuZXh0VGV4dCA9IG51bGw7Ci0JCVRleHRJbXBsIHByZXZUZXh0ID0gbnVsbDsKLQkJaWYgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCW5leHRUZXh0ID0gKFRleHRJbXBsKSBuZXh0OwotCQl9Ci0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlwcmV2VGV4dCA9IChUZXh0SW1wbCkgcHJldjsKLQkJfQotCQlpZiAobmV4dFRleHQgPT0gbnVsbCAmJiBwcmV2VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobmV4dFRleHQgIT0gbnVsbCAmJiBwcmV2VGV4dCAhPSBudWxsKSB7Ci0JCQkvLyBjb25zZWN1dGl2ZSBUZXh0IG5vZGVzIGNyZWF0ZWQgYnkgc2V0dXBDb250ZXh0KCksCi0JCQkvLyBjb25jYXQgdGhlbQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5leHRUZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQkJcHJldlRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCU5vZGUgbmV3TmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXh0KTsKLQkJCW5leHQgPSBudWxsOwotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQl9Ci0KLQkJVGV4dEltcGwgY2hpbGRUZXh0ID0gKHByZXZUZXh0ICE9IG51bGwgPyBwcmV2VGV4dCA6IG5leHRUZXh0KTsKLQkJaWYgKGNoaWxkVGV4dC5nZXROZXh0U2libGluZygpID09IG51bGwgJiYgY2hpbGRUZXh0LmdldFByZXZpb3VzU2libGluZygpID09IG51bGwpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlpZiAoIXBhcmVudEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiAhcGFyZW50RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQlpZiAoY2hpbGRUZXh0LmlzV2hpdGVzcGFjZSgpIHx8IGNoaWxkVGV4dC5pc0ludmFsaWQoKSkgewotCQkJCQkJLy8gaW1wbGljaXQgcGFyZW50IGlzIG5vdCByZXF1aXJlZAotCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBuZXdOZXh0ID0gcGFyZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJbmV3UGFyZW50LnJlbW92ZUNoaWxkKHBhcmVudCk7Ci0JCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkVGV4dCk7Ci0JCQkJCQkJbmV3UGFyZW50Lmluc2VydEJlZm9yZShjaGlsZFRleHQsIG5ld05leHQpOwotCQkJCQkJCWlmIChjaGlsZFRleHQgPT0gbmV4dCkgewotCQkJCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGRUZXh0KTsKLQkJCQkJCQl9IGVsc2UgaWYgKG5ld05leHQgIT0gbnVsbCkgewotCQkJCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3UGFyZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gdHJ5IGFnYWluCi0JCQkJCQkJY2xlYW51cFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcm91dGluZSBjcmVhdGUgYW4gRWxlbWVudCBmcm9tIGNvbW1lbnQgZGF0YSBmb3IgY29tbWVudCBzdHlsZQotCSAqIGVsZW1lbnRzLCBzdWNoIGFzIFNTSSBhbmQgTUVUQURBVEEKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVDb21tZW50RWxlbWVudChTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlTdHJpbmcgdHJpbW1lZERhdGEgPSBkYXRhLnRyaW0oKTsKLQkJQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uW10gY29uZmlncyA9IENvbW1lbnRFbGVtZW50UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKGludCBpQ29uZmlnID0gMDsgaUNvbmZpZyA8IGNvbmZpZ3MubGVuZ3RoOyBpQ29uZmlnKyspIHsKLQkJCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2lDb25maWddOwotCQkJaWYgKChpc0pTUFRhZyAmJiAhY29uZmlnLmFjY2VwdEpTUENvbW1lbnQoKSkgfHwgKCFpc0pTUFRhZyAmJiAhY29uZmlnLmFjY2VwdFhNTENvbW1lbnQoKSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZ1tdIHByZWZpeGVzID0gY29uZmlnLmdldFByZWZpeCgpOwotCQkJZm9yIChpbnQgaVByZWZpeCA9IDA7IGlQcmVmaXggPCBwcmVmaXhlcy5sZW5ndGg7IGlQcmVmaXgrKykgewotCQkJCWlmICh0cmltbWVkRGF0YS5zdGFydHNXaXRoKHByZWZpeGVzW2lQcmVmaXhdKSkgewotCQkJCQlyZXR1cm4gY29uZmlnLmNyZWF0ZUVsZW1lbnQodGhpcy5kb2N1bWVudCwgZGF0YSwgaXNKU1BUYWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodGhpcy5hZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmFkYXB0ZXIuY3JlYXRlQ29tbWVudEVsZW1lbnQodGhpcy5kb2N1bWVudCwgZGF0YSwgaXNKU1BUYWcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcm91dGluZSBjcmVhdGUgYW4gaW1wbGljaXQgRWxlbWVudCBmb3IgZ2l2ZW4gcGFyZW50IGFuZCBjaGlsZCwKLQkgKiBzdWNoIGFzIEhUTUwsIEJPRFksIEhFQUQsIGFuZCBUQk9EWSBmb3IgSFRNTCBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVJbXBsaWNpdEVsZW1lbnQoTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJaWYgKHRoaXMuYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmNyZWF0ZUltcGxpY2l0RWxlbWVudCh0aGlzLmRvY3VtZW50LCBwYXJlbnQsIGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVtb3RlTm9kZXMoTm9kZSByb290LCBOb2RlIG5ld1BhcmVudCwgTm9kZSBvbGRQYXJlbnQsIE5vZGUgbmV4dCkgewotCQlpZiAobmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQotCQkvLyBmaW5kIG5leHQKLQkJd2hpbGUgKG5leHQgPT0gbnVsbCkgewotCQkJaWYgKG9sZFBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybjsKLQkJCUVsZW1lbnRJbXBsIG9sZEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG9sZFBhcmVudDsKLQkJCWlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKQotCQkJCXJldHVybjsKLQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKG9sZFBhcmVudCA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCW5leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCWlmIChuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQlpZiAoIW5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCWlmIChuZXh0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJLy8gZGVtb3RlIGNoaWxkcmVuCi0JCQkJCQluZXh0ID0gbmV4dENoaWxkOwotCQkJCQkJb2xkUGFyZW50ID0gbmV4dEVsZW1lbnQ7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChuZXh0RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQkJaWYgKG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJLy8gc3RvcCBhdCB0aGUgbWF0Y2hlZCBpbnZhbGlkIGVuZCB0YWcKLQkJCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJCW5ld0VsZW1lbnQuYWRkRW5kVGFnKG5leHRFbGVtZW50KTsKLQotCQkJCQkJCWlmIChuZXdFbGVtZW50ID09IHJvb3QpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQlOb2RlIHAgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQkvLyBjaGVjayBpZiByZWFjaGVkIHRvIHRvcAotCQkJCQkJCWlmIChwID09IG51bGwgfHwgcCA9PSBvbGRQYXJlbnQgfHwgcC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcDsKLQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHJlbW92ZSBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFkb25lKSB7Ci0JCQkJaWYgKCFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCWlmIChuZXdFbGVtZW50ID09IHJvb3QpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCU5vZGUgcCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkvLyBjaGVjayBpZiByZWFjaGVkIHRvIHRvcAotCQkJCQlpZiAocCA9PSBudWxsIHx8IHAgPT0gb2xkUGFyZW50IHx8IHAuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCXJldHVybjsKLQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCWluc2VydE5vZGUobmV3RWxlbWVudCwgY2hpbGQsIG51bGwpOwotCQkJCU5vZGUgY2hpbGRQYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKGNoaWxkUGFyZW50ICE9IG5ld0VsZW1lbnQpIHsKLQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgY2hpbGRQYXJlbnQ7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmaW5kIG5leHQgcGFyZW50IGFuZCBzaWJsaW5nCi0JCQl3aGlsZSAobmV4dCA9PSBudWxsKSB7Ci0JCQkJaWYgKG9sZFBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQlyZXR1cm47Ci0JCQkJRWxlbWVudEltcGwgb2xkRWxlbWVudCA9IChFbGVtZW50SW1wbCkgb2xkUGFyZW50OwotCi0JCQkJLy8gZHVnIHBhcmVudCBtdXN0IG5vdCBoYXZlIGNoaWxkcmVuIGF0IHRoaXMgcG9pbnQKLQkJCQlpZiAoIW9sZEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpICYmICFvbGRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJb2xkUGFyZW50ID0gb2xkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCQkJbmV4dCA9IG9sZEVsZW1lbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKQotCQkJCQlyZXR1cm47Ci0JCQkJb2xkUGFyZW50ID0gb2xkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKG9sZFBhcmVudCA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQkJbmV4dCA9IG9sZEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBYTUxEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5kUm9vdE5hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRoaXMuYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEZpbmRSb290TmFtZSh0YWdOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgWE1MTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGVsOwotCX0KLQotCS8qKgotCSAqIGluc2VydENEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydENEQVRBU2VjdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNEQVRBU2VjdGlvbkltcGwgY2RhdGEgPSBudWxsOwotCQl0cnkgewotCQkJY2RhdGEgPSAoQ0RBVEFTZWN0aW9uSW1wbCkgdGhpcy5kb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24obnVsbCk7Ci0JCX0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChjZGF0YSA9PSBudWxsKSB7IC8vIENEQVRBIHNlY3Rpb24gbWlnaHQgbm90IGJlIHN1cHBvcnRlZAotCQkJaW5zZXJ0SW52YWxpZERlY2woZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCBkZWNsCi0JCQlyZXR1cm47Ci0JCX0KLQotCQljZGF0YS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGNkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Q29tbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBkYXRhID0gbnVsbDsKLQkJYm9vbGVhbiBpc0pTUFRhZyA9IGZhbHNlOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBKU1BfQ09NTUVOVF9PUEVOKSB7Ci0JCQkJaXNKU1BUYWcgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCByZWdpb25UeXBlID09IEpTUF9DT01NRU5UX1RFWFQpIHsKLQkJCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQkJCWRhdGEgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgY3JlYXRlQ29tbWVudEVsZW1lbnQoZGF0YSwgaXNKU1BUYWcpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmICghaXNFbmRUYWcoZWxlbWVudCkpIHsKLQkJCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCWluc2VydFN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gZW5kIHRhZwotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQotCQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQkJCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSB0aGlzLmNvbnRleHQuZmluZFN0YXJ0VGFnKHRhZ05hbWUsIHJvb3ROYW1lKTsKLQkJCQlpZiAoc3RhcnQgIT0gbnVsbCkgeyAvLyBzdGFydCB0YWcgZm91bmQKLQkJCQkJaW5zZXJ0RW5kVGFnKHN0YXJ0KTsKLQkJCQkJc3RhcnQuYWRkRW5kVGFnKGVsZW1lbnQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gaW52YWxpZCBlbmQgdGFnCi0JCQkJaW5zZXJ0Tm9kZShlbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlDb21tZW50SW1wbCBjb21tZW50ID0gKENvbW1lbnRJbXBsKSB0aGlzLmRvY3VtZW50LmNyZWF0ZUNvbW1lbnQobnVsbCk7Ci0JCWlmIChjb21tZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0pTUFRhZykKLQkJCWNvbW1lbnQuc2V0SlNQVGFnKHRydWUpOwotCQljb21tZW50LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoY29tbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGVjbCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydERlY2woSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlib29sZWFuIGlzRG9jVHlwZSA9IGZhbHNlOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCVN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pIHsKLQkJCQlpc0RvY1R5cGUgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSkgewotCQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJCW5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpIHsKLQkJCQlpZiAocHVibGljSWQgPT0gbnVsbCkKLQkJCQkJcHVibGljSWQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0gZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRikgewotCQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKQotCQkJCQlzeXN0ZW1JZCA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJLy8gaW52YWxpZCBkZWNsYXJhdGlvbgotCQlpZiAoIWlzRG9jVHlwZSkgewotCQkJaW5zZXJ0SW52YWxpZERlY2woZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRG9jdW1lbnRUeXBlSW1wbCBkb2NUeXBlID0gKERvY3VtZW50VHlwZUltcGwpIHRoaXMuZG9jdW1lbnQuY3JlYXRlRG9jdHlwZShuYW1lKTsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHB1YmxpY0lkICE9IG51bGwpCi0JCQlkb2NUeXBlLnNldFB1YmxpY0lkKHB1YmxpY0lkKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JCQlkb2NUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJZG9jVHlwZS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGRvY1R5cGUpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBuZXdQYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5ld1BhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmICghKChFbGVtZW50SW1wbCkgZWxlbWVudCkuaXNDb250YWluZXIoKSkgewotCQkJLy8ganVzdCB1cGRhdGUgY29udGV4dAotCQkJTm9kZSBlbGVtZW50TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3UGFyZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHByb21vdGUgY2hpbGRyZW4KLQkJTm9kZSBuZXdOZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQlOb2RlIG9sZFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBvbGROZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCXByb21vdGVOb2RlcyhlbGVtZW50LCBuZXdQYXJlbnQsIG5ld05leHQsIG9sZFBhcmVudCwgb2xkTmV4dCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJLy8gcmUtY2hlY2sgdGhlIG5leHQgc2libGluZwotCQluZXdOZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQllbHNlCi0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdQYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydEVuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCByZWdpb24uZ2V0VHlwZSgpID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQkJCXRhZ05hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFnTmFtZSA9PSBudWxsKSB7IC8vIGludmFsaWQgZW5kIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyByb290TmFtZSA9IGdldEZpbmRSb290TmFtZSh0YWdOYW1lKTsKLQkJRWxlbWVudEltcGwgc3RhcnQgPSAoRWxlbWVudEltcGwpIHRoaXMuY29udGV4dC5maW5kU3RhcnRUYWcodGFnTmFtZSwgcm9vdE5hbWUpOwotCQlpZiAoc3RhcnQgIT0gbnVsbCkgeyAvLyBzdGFydCB0YWcgZm91bmQKLQkJCWluc2VydEVuZFRhZyhzdGFydCk7Ci0JCQlzdGFydC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gaW52YWxpZCBlbmQgdGFnCi0JCUVsZW1lbnRJbXBsIGVuZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbmQgPSAoRWxlbWVudEltcGwpIHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLQkJfSBjYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJaWYgKGVuZCA9PSBudWxsKSB7IC8vIGludmFsaWQgZW5kIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCQllbmQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShlbmQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEVudGl0eVJlZiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydEVudGl0eVJlZihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSB8fCByZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQkJbmFtZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0RW50aXR5UmVmTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpIHsgLy8gaW52YWxpZCBlbnRpdHkKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHZhbHVlID0gdGhpcy5kb2N1bWVudC5nZXRDaGFyVmFsdWUobmFtZSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7IC8vIGNoYXJhY3RlciBlbnRpdHkKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMuY29udGV4dC5maW5kUHJldmlvdXNUZXh0KCk7Ci0JCQlpZiAodGV4dCAhPSBudWxsKSB7IC8vIGV4aXN0aW5nIHRleHQgZm91bmQKLQkJCQkvLyBkbyBub3QgYXBwZW5kIGRhdGEKLQkJCQl0ZXh0LmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCQl0ZXh0Lm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gbmV3IHRleHQKLQkJCXRleHQgPSAoVGV4dEltcGwpIHRoaXMuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobnVsbCk7Ci0JCQlpZiAodGV4dCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCWluc2VydE5vZGUodGV4dCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBnZW5lcmFsIGVudGl0eSByZWZlcmVuY2UKLQkJRW50aXR5UmVmZXJlbmNlSW1wbCByZWYgPSBudWxsOwotCQl0cnkgewotCQkJcmVmID0gKEVudGl0eVJlZmVyZW5jZUltcGwpIHRoaXMuZG9jdW1lbnQuY3JlYXRlRW50aXR5UmVmZXJlbmNlKG5hbWUpOwotCQl9IGNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAocmVmID09IG51bGwpIHsgLy8gZW50aXR5IHJlZmVyZW5jZSBtaWdodCBub3QgYmUgc3VwcG9ydGVkCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVmLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRJbnZhbGlkRGVjbCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydEludmFsaWREZWNsKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIiEiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsgLy8gaW52YWxpZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0SlNQVGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0SlNQVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJVmVjdG9yIGF0dHJOb2RlcyA9IG51bGw7Ci0JCWJvb2xlYW4gaXNDbG9zZVRhZyA9IGZhbHNlOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBKU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQl0YWdOYW1lID0gSlNQVGFnLkpTUF9TQ1JJUFRMRVQ7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gSlNQX0VYUFJFU1NJT05fT1BFTikgewotCQkJCXRhZ05hbWUgPSBKU1BUYWcuSlNQX0VYUFJFU1NJT047Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHsKLQkJCQl0YWdOYW1lID0gSlNQVGFnLkpTUF9ERUNMQVJBVElPTjsKLQkJCX0gZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBKU1BfRElSRUNUSVZFX09QRU4pIHsKLQkJCQl0YWdOYW1lID0gSlNQVGFnLkpTUF9ESVJFQ1RJVkU7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJdGFnTmFtZSArPSAnLic7Ci0JCQkJdGFnTmFtZSArPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gSlNQX0NMT1NFKSB7Ci0JCQkJaXNDbG9zZVRhZyA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYXR0ciA9IChBdHRySW1wbCkgdGhpcy5kb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldE5hbWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCQkJYXR0ck5vZGVzID0gbmV3IFZlY3RvcigpOwotCQkJCQlhdHRyTm9kZXMuYWRkRWxlbWVudChhdHRyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihyZWdpb24pOwotCQkJCQlhdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFnTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAoaXNDbG9zZVRhZykgewotCQkJCS8vIGNsb3NlIEpTUCB0YWcKLQkJCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJCWlmIChzdGFydC5pc0pTUENvbnRhaW5lcigpKSB7Ci0JCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQkJc3RhcnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGludmFsaWQgSlNQIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQl9IGNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7IC8vIGludmFsaWQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChhdHRyTm9kZXMgIT0gbnVsbCkgewotCQkJRW51bWVyYXRpb24gYWUgPSBhdHRyTm9kZXMuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChhZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUF0dHIgYSA9IChBdHRyKSBhZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZShhKTsKLQkJCX0KLQkJfQotCQllbGVtZW50LnNldEpTUFRhZyh0cnVlKTsKLQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydFN0YXJ0VGFnKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydE5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGNoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBuZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJaWYgKGNhbkNvbnRhaW4oZWxlbWVudCwgbm9kZSkpIHsKLQkJCQlpZiAoIWVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0ID09IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKSB7Ci0JCQkJCS8vIGZpcnN0IGNoaWxkIG9mIGltcGxpY2l0IHRhZwotCQkJCQkvLyBkZWxldGVnZSB0byB0aGUgcGFyZW50Ci0JCQkJCXBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCW5leHQgPSBlbGVtZW50OwotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCXBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJLy8gcHJvbW90ZSBzaWJsaW5ncwotCQkJTm9kZSBuZXdOZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCU5vZGUgbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQllbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXdOZXh0KTsKLQkJCQljaGlsZCA9IG5leHRDaGlsZDsKLQkJCX0KLQotCQkJLy8gbGVhdmUgdGhlIG9sZCBlbmQgdGFnIHdoZXJlIGl0IGlzCi0JCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCUVsZW1lbnQgZW5kID0gZWxlbWVudC5yZW1vdmVFbmRUYWcoKTsKLQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShlbmQsIG5ld05leHQpOwotCQkJCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCQkJbmV4dCA9IGVuZDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCS8vIGltcGxpY2l0IGVsZW1lbnQKLQkJCQlpZiAoIWVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXBhcmVudC5yZW1vdmVDaGlsZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCW5leHQgPSBuZXdOZXh0OwotCQkJaWYgKG5leHQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJfQotCi0JCWluc2VydE5vZGUocGFyZW50LCBub2RlLCBuZXh0KTsKLQkJbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJaWYgKG5leHQgIT0gbnVsbCkKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJZWxzZQotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobm9kZS5nZXRQYXJlbnROb2RlKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnROb2RlKE5vZGUgcGFyZW50LCBOb2RlIG5vZGUsIE5vZGUgbmV4dCkgewotCQl3aGlsZSAobmV4dCAhPSBudWxsICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQlpZiAobmV4dEVsZW1lbnQuaGFzU3RhcnRUYWcoKSkKLQkJCQlicmVhazsKLQkJCWlmICghY2FuQmVJbXBsaWNpdFRhZyhuZXh0RWxlbWVudCwgbm9kZSkpCi0JCQkJYnJlYWs7Ci0JCQlwYXJlbnQgPSBuZXh0RWxlbWVudDsKLQkJCW5leHQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJRWxlbWVudCBpbXBsaWNpdEVsZW1lbnQgPSBjcmVhdGVJbXBsaWNpdEVsZW1lbnQocGFyZW50LCBub2RlKTsKLQkJaWYgKGltcGxpY2l0RWxlbWVudCAhPSBudWxsKQotCQkJbm9kZSA9IGltcGxpY2l0RWxlbWVudDsKLQkJcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRQSSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhcmdldCA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQl0YXJnZXQgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCX0KLQotCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIHRoaXMuZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgbnVsbCk7Ci0JCWlmIChwaSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlwaS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKHBpKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRTdGFydFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWluc2VydE5vZGUoZWxlbWVudCk7Ci0KLQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKG5ld0VsZW1lbnQuaXNFbXB0eVRhZygpIHx8ICFuZXdFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZGVtb3RlIHNpYmxpbmdzCi0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJZGVtb3RlTm9kZXMoZWxlbWVudCwgZWxlbWVudCwgcGFyZW50LCBuZXh0KTsKLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGZpcnN0Q2hpbGQgIT0gbnVsbCkKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShmaXJzdENoaWxkKTsKLQkJZWxzZQotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0U3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBpc0VtcHR5VGFnID0gZmFsc2U7Ci0JCUF0dHJJbXBsIGF0dHIgPSBudWxsOwotCQlWZWN0b3IgYXR0ck5vZGVzID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgcmVnaW9uVHlwZSA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCByZWdpb25UeXBlID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQkJCXRhZ05hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJaXNFbXB0eVRhZyA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYXR0ciA9IChBdHRySW1wbCkgdGhpcy5kb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldE5hbWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCQkJYXR0ck5vZGVzID0gbmV3IFZlY3RvcigpOwotCQkJCQlhdHRyTm9kZXMuYWRkRWxlbWVudChhdHRyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihyZWdpb24pOwotCQkJCQlhdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFnTmFtZSA9PSBudWxsKSB7IC8vIGludmFsaWQgc3RhcnQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsgLy8gaW52YWxpZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBhZSA9IGF0dHJOb2Rlcy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGFlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJQXR0ciBhID0gKEF0dHIpIGFlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJZWxlbWVudC5hcHBlbmRBdHRyaWJ1dGVOb2RlKGEpOwotCQkJfQotCQl9Ci0JCWlmIChpc0VtcHR5VGFnKQotCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydFN0YXJ0VGFnKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJaW5zZXJ0U3RhcnRUYWcoZmxhdE5vZGUpOwotCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlpbnNlcnRFbmRUYWcoZmxhdE5vZGUpOwotCQl9IGVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gSlNQX0NPTU1FTlRfT1BFTikgewotCQkJaW5zZXJ0Q29tbWVudChmbGF0Tm9kZSk7Ci0JCX0gZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFIHx8IHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHsKLQkJCWluc2VydEVudGl0eVJlZihmbGF0Tm9kZSk7Ci0JCX0gZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQlpbnNlcnREZWNsKGZsYXROb2RlKTsKLQkJfSBlbHNlIGlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHsKLQkJCWluc2VydFBJKGZsYXROb2RlKTsKLQkJfSBlbHNlIGlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pIHsKLQkJCWluc2VydENEQVRBU2VjdGlvbihmbGF0Tm9kZSk7Ci0JCX0gZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBKU1BfU0NSSVBUTEVUX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBKU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBKU1BfRElSRUNUSVZFX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBKU1BfQ0xPU0UpIHsKLQkJCWluc2VydEpTUFRhZyhmbGF0Tm9kZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGluc2VydFRleHQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRQcmV2aW91c1RleHQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgeyAvLyBleGlzdGluZyB0ZXh0IGZvdW5kCi0JCQl0ZXh0LmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkvLyBub3RpZnkgdGhlIGNoYW5nZQotCQkJdGV4dC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5ldyB0ZXh0Ci0JCXRleHQgPSAoVGV4dEltcGwpIHRoaXMuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobnVsbCk7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZSh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuZFRhZyhYTUxFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKHRoaXMuYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmlzRW5kVGFnKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50LmlzRW5kVGFnKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb21vdGVOb2RlcyhOb2RlIHJvb3QsIE5vZGUgbmV3UGFyZW50LCBOb2RlIG5ld05leHQsIE5vZGUgb2xkUGFyZW50LCBOb2RlIG5leHQpIHsKLQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IG51bGw7Ci0JCWlmIChuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQl9Ci0KLQkJTm9kZSByb290UGFyZW50ID0gcm9vdC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChvbGRQYXJlbnQgIT0gcm9vdFBhcmVudCkgewotCQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCWJvb2xlYW4gZW5kVGFnID0gZmFsc2U7Ci0JCQkJaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCQlOb2RlIG5leHRDaGlsZCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCWlmIChuZXh0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJCS8vIHByb21vdGUgY2hpbGRyZW4KLQkJCQkJCQluZXh0ID0gbmV4dENoaWxkOwotCQkJCQkJCW9sZFBhcmVudCA9IG5leHRFbGVtZW50OwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmV4dEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJCQlpZiAobmV4dEVsZW1lbnQubWF0Y2hFbmRUYWcobmV3RWxlbWVudCkpIHsKLQkJCQkJCQkJZW5kVGFnID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHJlbW92ZSBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICghZG9uZSkgewotCQkJCQlpZiAoIWVuZFRhZyAmJiBuZXdFbGVtZW50ICE9IG51bGwgJiYgIWNhbkNvbnRhaW4obmV3RWxlbWVudCwgbmV4dCkpIHsKLQkJCQkJCW5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsKQotCQkJCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCQkJCU5vZGUgZWxlbWVudE5leHQgPSBuZXdFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkvLyBwcm9tb3RlIHNpYmxpbmdzCi0JCQkJCQlwcm9tb3RlTm9kZXMobmV3RWxlbWVudCwgbmV3UGFyZW50LCBlbGVtZW50TmV4dCwgbmV3RWxlbWVudCwgbmV3TmV4dCk7Ci0JCQkJCQluZXdOZXh0ID0gbmV3RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJaWYgKG5ld1BhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCWluc2VydE5vZGUobmV3UGFyZW50LCBjaGlsZCwgbmV3TmV4dCk7Ci0JCQkJCU5vZGUgY2hpbGRQYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChjaGlsZFBhcmVudCAhPSBuZXdQYXJlbnQpIHsKLQkJCQkJCW5ld1BhcmVudCA9IGNoaWxkUGFyZW50OwotCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJbmV3TmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChvbGRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvbGRQYXJlbnQ7Ci0JCQlvbGRQYXJlbnQgPSBvbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQluZXh0ID0gb2xkRWxlbWVudC5nZXROZXh0U2libGluZygpOwotCi0JCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCUVsZW1lbnQgZW5kID0gbnVsbDsKLQkJCQlpZiAoIW9sZEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpICYmICFvbGRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKG9sZEVsZW1lbnQpOwotCQkJCQllbmQgPSBvbGRFbGVtZW50OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVuZCA9IG9sZEVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJfQotCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQlpbnNlcnROb2RlKG5ld1BhcmVudCwgZW5kLCBuZXdOZXh0KTsKLQkJCQkJTm9kZSBlbmRQYXJlbnQgPSBlbmQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAoZW5kUGFyZW50ICE9IG5ld1BhcmVudCkgewotCQkJCQkJbmV3UGFyZW50ID0gZW5kUGFyZW50OwotCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJbmV3TmV4dCA9IGVuZC5nZXROZXh0U2libGluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAoISgoRWxlbWVudEltcGwpIGVsZW1lbnQpLmlzQ29udGFpbmVyKCkpIHsKLQkJCS8vIGp1c3QgdXBkYXRlIGNvbnRleHQKLQkJCU5vZGUgZWxlbWVudE5leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoZWxlbWVudE5leHQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZWxlbWVudE5leHQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBkZW1vdGUgc2libGluZ3MKLQkJTm9kZSBuZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQkvLyBmaW5kIG5ldyBwYXJlbnQKLQkJZm9yIChOb2RlIGxhc3QgPSBuZXdFbGVtZW50LmdldExhc3RDaGlsZCgpOyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0LmdldExhc3RDaGlsZCgpKSB7Ci0JCQlpZiAobGFzdC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWJyZWFrOwotCQkJRWxlbWVudEltcGwgbGFzdEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQlpZiAobGFzdEVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgbGFzdEVsZW1lbnQuaXNFbXB0eVRhZygpIHx8ICFsYXN0RWxlbWVudC5pc0NvbnRhaW5lcigpKQotCQkJCWJyZWFrOwotCQkJbmV3RWxlbWVudCA9IGxhc3RFbGVtZW50OwotCQl9Ci0JCU5vZGUgbGFzdENoaWxkID0gbmV3RWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJZGVtb3RlTm9kZXMoZWxlbWVudCwgbmV3RWxlbWVudCwgcGFyZW50LCBuZXh0KTsKLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIG5ld05leHQgPSBudWxsOwotCQlpZiAobGFzdENoaWxkICE9IG51bGwpCi0JCQluZXdOZXh0ID0gbGFzdENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCWVsc2UKLQkJCW5ld05leHQgPSBuZXdFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJZWxzZQotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbm9kZSBpZiBpdCBpcyBubyBsb25nZXIgcmVxdWlyZWQgaW1wbGljaXQgdGFnIHdpdGgKLQkgKiByZW1haW5pbmcgY2hpbGQgbm9kZXMgcHJvbW90ZWQuCi0JICovCi0JcHJpdmF0ZSBFbGVtZW50IHJlbW92ZUltcGxpY2l0RWxlbWVudChOb2RlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJaWYgKCFlbGVtZW50LmlzSW1wbGljaXRUYWcoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY2FuQmVJbXBsaWNpdFRhZyhlbGVtZW50KSkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgZWxlbWVudFBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAoZWxlbWVudFBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCU5vZGUgZmlyc3RDaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlOb2RlIGNoaWxkID0gZmlyc3RDaGlsZDsKLQkJTm9kZSBlbGVtZW50TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCU5vZGUgbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJZWxlbWVudFBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIGVsZW1lbnROZXh0KTsKLQkJCWNoaWxkID0gbmV4dENoaWxkOwotCQl9Ci0KLQkJLy8gcmVzZXQgY29udGV4dAotCQlpZiAodGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKSA9PSBlbGVtZW50KSB7Ci0JCQlOb2RlIG9sZE5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChvbGROZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUob2xkTmV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZWxlbWVudFBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpID09IGVsZW1lbnQpIHsKLQkJCWlmIChmaXJzdENoaWxkICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZmlyc3RDaGlsZCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZWxlbWVudFBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJTm9kZSBvbGRQYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAobm9kZSA9PSBvbGRQYXJlbnQpIHsKLQkJCWlmIChuZXh0ICE9IG51bGwpCi0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlOb2RlIG9sZE5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChub2RlID09IG9sZE5leHQpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0KLQkJaWYgKHJlbW92ZUltcGxpY2l0RWxlbWVudChwYXJlbnQpICE9IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZGVtb3RlIHNpYmxpbmcKLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHByZXY7Ci0JCQlpZiAoIW5ld0VsZW1lbnQuaGFzRW5kVGFnKCkgJiYgIW5ld0VsZW1lbnQuaXNFbXB0eVRhZygpICYmIG5ld0VsZW1lbnQuaXNDb250YWluZXIoKSkgewotCQkJCS8vIGZpbmQgbmV3IHBhcmVudAotCQkJCWZvciAoTm9kZSBsYXN0ID0gbmV3RWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCQlpZiAobGFzdC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJYnJlYWs7Ci0JCQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJCQlpZiAobGFzdEVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgbGFzdEVsZW1lbnQuaXNFbXB0eVRhZygpIHx8ICFsYXN0RWxlbWVudC5pc0NvbnRhaW5lcigpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJCQl9Ci0JCQkJTm9kZSBsYXN0Q2hpbGQgPSBuZXdFbGVtZW50LmdldExhc3RDaGlsZCgpOwotCQkJCWRlbW90ZU5vZGVzKHByZXYsIG5ld0VsZW1lbnQsIHBhcmVudCwgbmV4dCk7Ci0KLQkJCQkvLyB1cGRhdGUgY29udGV4dAotCQkJCU5vZGUgbmV3TmV4dCA9IG51bGw7Ci0JCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKQotCQkJCQluZXdOZXh0ID0gbGFzdENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQluZXdOZXh0ID0gbmV3RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVTdGFydFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGZvciBpbXBsaWNpdCB0YWcKLQkJRWxlbWVudEltcGwgb2xkRWxlbWVudCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGNhbkJlSW1wbGljaXRUYWcob2xkRWxlbWVudCkpIHsKLQkJCU5vZGUgbmV3UGFyZW50ID0gbnVsbDsKLQkJCU5vZGUgcHJldiA9IG9sZEVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIHByZXZFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwcmV2OwotCQkJCWlmICghcHJldkVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJaWYgKHByZXZFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgfHwgcHJldkVsZW1lbnQubWF0Y2hUYWdOYW1lKG9sZEVsZW1lbnQuZ2V0VGFnTmFtZSgpKSkgewotCQkJCQkJbmV3UGFyZW50ID0gcHJldkVsZW1lbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3UGFyZW50ID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIGVsZW1lbnQgc2hvdWxkIHN0YXkgYXMgaW1wbGljaXQgdGFnCi0JCQkJLy8ganVzdCByZW1vdmUgYWxsIGF0dHJpYnV0ZXMKLQkJCQlvbGRFbGVtZW50LnJlbW92ZVN0YXJ0VGFnKCk7Ci0KLQkJCQkvLyB1cGRhdGUgY29udGV4dAotCQkJCU5vZGUgY2hpbGQgPSBvbGRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJCX0gZWxzZSBpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShvbGRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8vIGZvciBjb21tZW50IHRhZwotCQlpZiAob2xkRWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCW9sZEVsZW1lbnQucmVtb3ZlU3RhcnRUYWcoKTsKLQotCQkvLyBwcm9tb3RlIGNoaWxkcmVuCi0JCU5vZGUgZWxlbWVudFBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQlOb2RlIHBhcmVudCA9IGVsZW1lbnRQYXJlbnQ7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBmaXJzdCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlOb2RlIGZpcnN0RWxlbWVudCA9IG51bGw7IC8vIGZvciB0aGUgY2FzZSBmaXJzdCBpcyByZW1vdmVkIGFzIGVuZCB0YWcKLQkJaWYgKGZpcnN0ICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgbmV3IHBhcmVudCBmb3IgY2hpbGRyZW4KLQkJCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSBudWxsOwotCQkJZm9yIChOb2RlIGxhc3QgPSBlbGVtZW50LmdldFByZXZpb3VzU2libGluZygpOyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0LmdldExhc3RDaGlsZCgpKSB7Ci0JCQkJaWYgKGxhc3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJYnJlYWs7Ci0JCQkJRWxlbWVudEltcGwgbGFzdEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQkJaWYgKGxhc3RFbGVtZW50Lmhhc0VuZFRhZygpIHx8IGxhc3RFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbGFzdEVsZW1lbnQuaXNDb250YWluZXIoKSkKLQkJCQkJYnJlYWs7Ci0JCQkJbmV3RWxlbWVudCA9IGxhc3RFbGVtZW50OwotCQkJfQotCQkJTm9kZSBuZXh0ID0gZmlyc3Q7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJCQlpZiAoIW5ld0VsZW1lbnQuaGFzRW5kVGFnKCkgJiYgbmV3RWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJCQlpZiAoIW5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dEVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgbmV4dEVsZW1lbnQubWF0Y2hFbmRUYWcobmV3RWxlbWVudCkpIHsKLQkJCQkJCQkvLyBzdG9wIGF0IHRoZSBtYXRjaGVkIGludmFsaWQgZW5kIHRhZwotCQkJCQkJCU5vZGUgZWxlbWVudENoaWxkID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQkJCXdoaWxlIChlbGVtZW50Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJCQlOb2RlIG5leHRDaGlsZCA9IGVsZW1lbnRDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQluZXh0RWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50Q2hpbGQpOwotCQkJCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnRDaGlsZCk7Ci0JCQkJCQkJCWVsZW1lbnRDaGlsZCA9IG5leHRDaGlsZDsKLQkJCQkJCQl9Ci0KLQkJCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQllbGVtZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCQluZXdFbGVtZW50LmFkZEVuZFRhZyhuZXh0RWxlbWVudCk7Ci0JCQkJCQkJaWYgKG5leHRFbGVtZW50ID09IGZpcnN0KQotCQkJCQkJCQlmaXJzdEVsZW1lbnQgPSBuZXdFbGVtZW50OwotCi0JCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQlpZiAobmV3UGFyZW50ID09IHBhcmVudCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCQlicmVhazsgLy8gZXJyb3IKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCQlOb2RlIG5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCW5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCX0KLQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCX0KLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCX0KLQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQlpZiAobmV3RWxlbWVudCA9PSBudWxsIHx8IGNhbkNvbnRhaW4obmV3RWxlbWVudCwgbmV4dCkpIHsKLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBlbGVtZW50KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJcGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQkvLyBwcm9tb3RlIHNpYmxpbmdzCi0JCQkJTm9kZSBuZXdOZXh0ID0gbmV3RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCU5vZGUgY2hpbGQgPSBlbGVtZW50OwotCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCU5vZGUgbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJbmV3RWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5ld05leHQpOwotCQkJCQljaGlsZCA9IG5leHRDaGlsZDsKLQkJCQl9Ci0KLQkJCQkvLyBsZWF2ZSB0aGUgb2xkIGVuZCB0YWcgd2hlcmUgaXQgaXMKLQkJCQlpZiAobmV3RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQlFbGVtZW50IGVuZCA9IG5ld0VsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShlbmQsIG5ld05leHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghbmV3RWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCS8vIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJaWYgKCFuZXdFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5ld0VsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQl9IGVsc2UgewotCQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlOb2RlIG5ld05leHQgPSBlbGVtZW50OwotCQlOb2RlIHN0YXJ0RWxlbWVudCA9IG51bGw7IC8vIGZvciB0aGUgY2FzZSBlbGVtZW50IGlzIHJlbW92ZWQgYXMgZW5kCi0JCS8vIHRhZwotCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJLy8gZmluZCBuZXcgcGFyZW50IGZvciBpbnZhbGlkIGVuZCB0YWcgYW5kIHNpYmxpbmdzCi0JCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gbnVsbDsKLQkJCWZvciAoTm9kZSBsYXN0ID0gZWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWJyZWFrOwotCQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJCWJyZWFrOwotCQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJCX0KLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkvLyBkZW1vdGUgaW52YWxpZCBlbmQgdGFnIGFuZCBzaWJsaW5nCi0JCQkJTm9kZSBuZXh0ID0gZWxlbWVudDsKLQkJCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCWlmICghbmV3RWxlbWVudC5oYXNFbmRUYWcoKSAmJiBuZXdFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQkJCWlmICghbmV4dEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0RWxlbWVudC5oYXNFbmRUYWcoKSAmJiBuZXh0RWxlbWVudC5tYXRjaEVuZFRhZyhuZXdFbGVtZW50KSkgewotCQkJCQkJCS8vIHN0b3AgYXQgdGhlIG1hdGNoZWQgaW52YWxpZCBlbmQgdGFnCi0JCQkJCQkJTm9kZSBlbGVtZW50Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQkJd2hpbGUgKGVsZW1lbnRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQkJCU5vZGUgbmV4dENoaWxkID0gZWxlbWVudENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJCW5leHRFbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnRDaGlsZCk7Ci0JCQkJCQkJCW5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudENoaWxkKTsKLQkJCQkJCQkJZWxlbWVudENoaWxkID0gbmV4dENoaWxkOwotCQkJCQkJCX0KLQotCQkJCQkJCW5leHQgPSBuZXh0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQkJbmV3RWxlbWVudC5hZGRFbmRUYWcobmV4dEVsZW1lbnQpOwotCQkJCQkJCWlmIChuZXh0RWxlbWVudCA9PSBuZXdOZXh0KQotCQkJCQkJCQlzdGFydEVsZW1lbnQgPSBuZXdFbGVtZW50OwotCi0JCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQlpZiAobmV3UGFyZW50ID09IHBhcmVudCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCQlicmVhazsgLy8gZXJyb3IKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCQlOb2RlIG5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJaWYgKGNoaWxkID09IG9sZEVsZW1lbnQpIHsKLQkJCQkJCWlmICghb2xkRWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJCQkJCS8vIGNsb25lIChyZS1jcmVhdGUpIGVuZCB0YWcKLQkJCQkJCQlFbGVtZW50IGVuZCA9IG9sZEVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCWNoaWxkID0gZW5kOwotCQkJCQkJCQluZXdOZXh0ID0gZW5kOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICghb2xkRWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJCQkvLyBjbG9uZSAocmUtY3JlYXRlKSBlbmQgdGFnCi0JCQkJCUVsZW1lbnQgZW5kID0gb2xkRWxlbWVudC5yZW1vdmVFbmRUYWcoKTsKLQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGVuZCwgb2xkRWxlbWVudCk7Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQob2xkRWxlbWVudCk7Ci0JCQkJCQluZXdOZXh0ID0gZW5kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJbmV3TmV4dCA9IG9sZEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZChvbGRFbGVtZW50KTsKLQkJfQotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCU5vZGUgb2xkUGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJTm9kZSBvbGROZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCWlmIChlbGVtZW50ID09IG9sZFBhcmVudCkgewotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShvbGROZXh0KTsgLy8gcmVzZXQgZm9yIG5ldyBwYXJlbnQKLQkJCX0gZWxzZSBpZiAobmV3TmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgPT0gb2xkTmV4dCkgewotCQkJaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZmlyc3RFbGVtZW50KTsKLQkJCX0gZWxzZSBpZiAoZmlyc3QgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShmaXJzdCk7Ci0JCQl9IGVsc2UgaWYgKHN0YXJ0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoc3RhcnRFbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQkJfQotCQl9Ci0KLQkJcmVtb3ZlSW1wbGljaXRFbGVtZW50KGVsZW1lbnRQYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogICAgICAgICAgICBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJTm9kZUltcGwgbmV4dCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gbmV4dC5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5leHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlyZW1vdmVOb2RlKG5leHQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIGZvciBlbXB0eSBUZXh0Ci0JCQkJCS8vIHJlbW92ZSBhbmQgY29udGludWUKLQkJCQkJcmVtb3ZlTm9kZShuZXh0KTsKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbmV4dDsKLQkJCQlib29sZWFuIGlzU2hhcmVkID0gdGV4dC5pc1NoYXJpbmdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlpZiAoaXNTaGFyZWQpIHsKLQkJCQkJLy8gbWFrZSBzdXJlIHRoZXJlIGlzIG5leHQgVGV4dCBub2RlIHNoYXJpbmcgdGhpcwotCQkJCQlUZXh0SW1wbCBuZXh0VGV4dCA9IChUZXh0SW1wbCkgdGhpcy5jb250ZXh0LmZpbmROZXh0VGV4dCgpOwotCQkJCQlpZiAobmV4dFRleHQgPT0gbnVsbCB8fCAhbmV4dFRleHQuaGFzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCQkJCWlzU2hhcmVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGV4dC5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaWYgKHRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIHBhcnRpYWwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcwotCQkJCQkvLyByZW1vdmVkCi0JCQkJCXJlbW92ZU5vZGUodGV4dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCQkJdGV4dC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQl9Ci0JCQkJLy8gaWYgc2hhcmVkLCBjb250aW51ZSB0byByZW1vdmUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCS8vIGZyb20gdGhlbQotCQkJCWlmIChpc1NoYXJlZCkKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJaWYgKGVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSB8fCBlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCQlyZW1vdmVTdGFydFRhZyhlbGVtZW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCS8vIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlpZiAoZW5kLmhhc0VuZFRhZygpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZW5kLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoIWVuZC5oYXNTdGFydFRhZygpICYmICFlbmQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVuZCk7Ci0JCQkJcmVtb3ZlTm9kZShlbmQpOwotCQkJfSBlbHNlIHsKLQkJCQllbmQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCXJlbW92ZUVuZFRhZyhlbmQpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbmV4dCA9IChOb2RlSW1wbCkgZW5kLmdldE5leHRTaWJsaW5nKCk7Ci0JCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcGFyZW50ID0gKE5vZGVJbXBsKSBlbmQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VSZWdpb25zIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gbmV3UmVnaW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvcgotCSAqIEBwYXJhbSBvbGRSZWdpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yCi0JICovCi0Jdm9pZCByZXBsYWNlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5kb2N1bWVudCk7Ci0KLQkJLy8gb3B0aW1pemUgdHlwaWNhbCBjYXNlcwotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGZsYXROb2RlLCBuZXdSZWdpb25zLCBvbGRSZWdpb25zKTsKLQkJfSBlbHNlIGlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJY2hhbmdlRW5kVGFnKGZsYXROb2RlLCBuZXdSZWdpb25zLCBvbGRSZWdpb25zKTsKLQkJfSBlbHNlIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCSAqICAgICAgICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0Ci0JICogQHBhcmFtIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdAotCSAqLwotCXZvaWQgcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLmNvbnRleHQgPSBuZXcgWE1MTW9kZWxDb250ZXh0KHRoaXMuZG9jdW1lbnQpOwotCi0JCWludCBuZXdDb3VudCA9IChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgPyBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpIDogMCk7Ci0JCWludCBvbGRDb3VudCA9IChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgPyBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpIDogMCk7Ci0KLQkJaWYgKG9sZENvdW50ID4gMCkgewotCQkJc2V0dXBDb250ZXh0KG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSk7Ci0JCQkvLyBOb2RlIHN0YXJ0UGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQotCQkJRW51bWVyYXRpb24gZSA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobmV3Q291bnQgPT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlzZXR1cENvbnRleHQobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKTsKLQkJfQotCQkvLyBtYWtlIHN1cmUgdGhlIHBhcmVudCBpcyBzZXQgdG8gZGVlcGVzdCBsZXZlbAotCQkvLyB3aGVuIGVuZCB0YWcgaGFzIGJlZW4gcmVtb3ZlZAotCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCi0JCWlmIChuZXdDb3VudCA+IDApIHsKLQkJCUVudW1lcmF0aW9uIGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJY2xlYW51cFRleHQoKTsKLQkJY2xlYW51cEVuZFRhZygpOwotCX0KLQotCS8qKgotCSAqIHNldHVwQ29udGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkvLyBhdCB0aGUgYmVnZ2luaW5nIG9mIGRvY3VtZW50Ci0JCQlOb2RlIGNoaWxkID0gcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHJvb3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJLy8gbWlnaHQgYmUgYXQgdGhlIGVuZCBvZiBkb2N1bWVudAotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocm9vdCk7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA9PSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShub2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5vZGU7Ci0JCQlUZXh0IG5leHRUZXh0ID0gdGV4dC5zcGxpdFRleHQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCXRleHQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlpZiAobmV4dFRleHQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dFRleHQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG9mZnNldCA+PSAoKE5vZGVJbXBsKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkpCi0JCQkJY29udGludWU7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5vZGUpOwotCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWNhYjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuanNwLm1vZGVsLnBhcnNlci50ZW1wLlhNTEpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIFhNTE1vZGVsVXBkYXRlciBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxVcGRhdGVyIGltcGxlbWVudHMgWE1MSlNQUmVnaW9uQ29udGV4dHMgewotCXByaXZhdGUgaW50IGRpZmYgPSAwOwotCXByaXZhdGUgaW50IGdhcExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZ2FwT2Zmc2V0ID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIFhNTEdlbmVyYXRvciBnZW5lcmF0b3IgPSBudWxsOwotCXByaXZhdGUgWE1MTW9kZWxJbXBsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIG5leHROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIHBhcmVudE5vZGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIFhNTE1vZGVsVXBkYXRlcihYTUxNb2RlbEltcGwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQkJdGhpcy5nZW5lcmF0b3IgPSBtb2RlbC5nZXRHZW5lcmF0b3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gYXR0ck5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0ck5hbWUoQXR0ciBhdHRyTm9kZSkgewotCQlpZiAoYXR0ck5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyTm9kZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0KLQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBuZXcgU3RyaW5nKCk7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJaWYgKG5hbWVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJc3RhcnQgKz0gbmFtZVJlZ2lvbi5nZXRTdGFydCgpOwotCQkvLyB1c2UgZ2V0VGV4dEVuZCgpIGJlY2F1c2UgZ2V0RW5kKCkgbWF5IGluY2x1ZGUgdGhlIHRhaWxpbmcgc3BhY2VzCi0JCWVuZCArPSBuYW1lUmVnaW9uLmdldFRleHRFbmQoKTsKLQotCQlyZXBsYWNlU291cmNlKG5hbWUsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gYXR0ck5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0clZhbHVlKEF0dHIgYXR0ck5vZGUpIHsKLQkJaWYgKGF0dHJOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0ck5vZGU7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJY2hhciBxdW90ZSA9IDA7IC8vIG5vIHF1b3RlIHByZWZlcmVuY2UKLQkJCS8vIERXOiA0LzE2LzIwMDMgZHVlIHRvIGNoYW5nZSBpbiBzdHJ1Y3R1cmVkRG9jdW1lbnQgLi4uIHdlIG5lZWQgYQotCQkJLy8gZmxhdG5vZGUgdG8KLQkJCS8vIGdldCBhdCByZWdpb24gdmFsdWVzLiBGb3Igbm93IEknbGwgYXNzdW1lIHRoaXMgaXMgYWx3YXlzIHRoZQotCQkJLy8gZmlyc3QKLQkJCS8vIGZsYXRub2RlIC4uIG1heSBuZWVkIHRvIG1ha2Ugc21hcnRlciBsYXRlciAoZS5nLiB0byBzZWFyY2ggZm9yCi0JCQkvLyB0aGUgZmxhdG5vZGUgdGhhdCB0aGlzLnZhbHVlUmVnaW9uIGJlbG9uZ3MgdG8uCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJU3RyaW5nIG9sZFZhbHVlID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dCh2YWx1ZVJlZ2lvbik7Ci0JCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiBvbGRWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQljaGFyIGZpcnN0Q2hhciA9IG9sZFZhbHVlLmNoYXJBdCgwKTsKLQkJCQlpZiAoZmlyc3RDaGFyID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgewotCQkJCQlxdW90ZSA9IGZpcnN0Q2hhcjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlUZXh0UmVnaW9uIHN0YXJ0UmVnaW9uID0gdmFsdWVSZWdpb247Ci0KLQkJCXZhbHVlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoYXR0ciwgcXVvdGUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9IG5ldyBTdHJpbmcoKTsKLQkJCQkvLyByZW1vdmUgZXF1YWwgdG9vCi0JCQkJSVRleHRSZWdpb24gZXF1YWxSZWdpb24gPSBhdHRyLmdldEVxdWFsUmVnaW9uKCk7Ci0JCQkJaWYgKGVxdWFsUmVnaW9uICE9IG51bGwpCi0JCQkJCXN0YXJ0UmVnaW9uID0gZXF1YWxSZWdpb247Ci0JCQl9Ci0JCQlhdHRyLnNldFZhbHVlUmVnaW9uKHZhbHVlUmVnaW9uKTsgLy8gcmVzZXQgdmFsdWUKLQotCQkJc3RhcnQgKz0gc3RhcnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUgdGFpbGluZwotCQkJLy8gc3BhY2VzCi0JCQllbmQgKz0gdmFsdWVSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQl9IGVsc2UgewotCQkJSVRleHRSZWdpb24gZXF1YWxSZWdpb24gPSBhdHRyLmdldEVxdWFsUmVnaW9uKCk7Ci0KLQkJCXZhbHVlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoYXR0cik7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCWlmIChlcXVhbFJlZ2lvbiA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIG5vdGhuZyB0byBkbwotCQkJCXZhbHVlID0gbmV3IFN0cmluZygpOwotCQkJCS8vIHJlbW92ZSBlcXVhbAotCQkJCXN0YXJ0ICs9IGVxdWFsUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJZW5kICs9IGVxdWFsUmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGVxdWFsUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJLy8gdXNlIGdldFRleHRFbmQoKSBiZWNhdXNlIGdldEVuZCgpIG1heSBpbmNsdWRlIHRoZQotCQkJCQkvLyB0YWlsaW5nIHNwYWNlcwotCQkJCQlzdGFydCArPSBlcXVhbFJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIuZ2V0TmFtZVJlZ2lvbigpOwotCQkJCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsKQotCQkJCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJCQkvLyB1c2UgZ2V0VGV4dEVuZCgpIGJlY2F1c2UgZ2V0RW5kKCkgbWF5IGluY2x1ZGUgdGhlCi0JCQkJCS8vIHRhaWxpbmcgc3BhY2VzCi0JCQkJCXN0YXJ0ICs9IG5hbWVSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJCQl2YWx1ZSA9ICc9JyArIHZhbHVlOwotCQkJCX0KLQkJCQllbmQgPSBzdGFydDsKLQkJCX0KLQkJfQotCi0JCXJlcGxhY2VTb3VyY2UodmFsdWUsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgY2hhbmdlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBpbXBsLmdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IG9mZnNldDsKLQkJaW50IGVuZCA9IG9mZnNldDsKLQkJaWYgKGltcGwuaGFzRW5kVGFnKCkpIHsKLQkJCWVuZCA9IGltcGwuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGltcGwuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbXBsLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpKTsKLQkJfQotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VOYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBjaGFuZ2VOYW1lKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBzdXBwb3J0IGNoYW5naW5nIG5hbWUgb2YgYXR0cmlidXRlIGZvciBzZXRQcmVmaXgoKQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCWNoYW5nZUF0dHJOYW1lKChBdHRyKSBub2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuOwotCX0KLQotCXZvaWQgY2hhbmdlUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvLyBmdXR1cmVfVE9ETzogb3B0aW1pemUKLQotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIoZmxhdE5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBmYWxsYmFjayBtZXRob2QgdG8gcmVnZW5lcmF0ZSB0aGUgc3RhcnQgdGFnLgotCSAqLwotCXZvaWQgY2hhbmdlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0KLQkJaWYgKCFpbXBsLmhhc1N0YXJ0VGFnKCkgJiYgIWltcGwuaGFzRW5kVGFnKCkpIHsKLQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MKLQkJCU5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlyZXBsYWNlQ2hpbGQocGFyZW50LCBlbGVtZW50LCBlbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBlbHNlIGVycm9yCi0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTdGFydFRhZyhlbGVtZW50KTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9IGltcGwuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCQlpZiAoaW1wbC5oYXNTdGFydFRhZygpKSB7Ci0JCQllbmQgPSBpbXBsLmdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0JCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGltcGwuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpbXBsLnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCkpOwotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBvbGRPZmZzZXQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJaW50IG9sZEVuZCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJYm9vbGVhbiBpc0VuZFRhZyA9IGZhbHNlOwotCi0JCS8vIGZpbmQgb3duZXIgbm9kZQotCQlOb2RlSW1wbCBvd25lck5vZGUgPSBudWxsOwotCQl3aGlsZSAodGhpcy5wYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLm5leHROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaW50IG5leHRPZmZzZXQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWlmIChuZXh0T2Zmc2V0ID09IG9sZE9mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMubmV4dE5vZGU7Ci0JCQkJCQlpZiAodGV4dC5oYXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgbmV4dEVuZCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJCQlpZiAobmV4dE9mZnNldCA8IG9sZEVuZCAmJiBuZXh0RW5kID4gb2xkT2Zmc2V0KSB7Ci0JCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCU5vZGUgY2hpbGQgPSB0aGlzLm5leHROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQl0aGlzLnBhcmVudE5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSBjaGlsZDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQl0aGlzLnBhcmVudE5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQl0aGlzLm5leHROb2RlID0gbnVsbDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5uZXh0Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAodGhpcy5wYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaW50IGVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpZiAoZW5kT2Zmc2V0ID09IG9sZE9mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBvd25lck5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lck5vZGU7Ci0JCQlpZiAoaXNFbmRUYWcpIHsKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJdXBkYXRlQXR0clJlZ2lvbnMoZWxlbWVudCwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgb3duZXJOb2RlOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQlpbnQgbmV3T2Zmc2V0ID0gb2xkT2Zmc2V0OwotCQkJCWludCBuZXdFbmQgPSBvbGRFbmQ7Ci0JCQkJaWYgKG9sZE9mZnNldCA9PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQluZXdPZmZzZXQgKz0gdGhpcy5kaWZmOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5ld0VuZCA9IHRoaXMuZ2FwT2Zmc2V0OwotCQkJCX0KLQkJCQlpbnQgbmV3TGVuZ3RoID0gbmV3RW5kIC0gbmV3T2Zmc2V0OwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG5ld09mZnNldCwgbmV3TGVuZ3RoLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCQlpZiAob2xkRW5kID4gbmV3RW5kKSB7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQlpZiAob2Zmc2V0ID09IG9sZE9mZnNldCAmJiBlbmQgPT0gb2xkRW5kKSB7Ci0JCQkJCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGVuZCA+IG9sZEVuZCkgewotCQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCXByb3h5LnNldE9mZnNldChvbGRFbmQpOwotCQkJCQkJCXByb3h5LnNldExlbmd0aChlbmQgLSBvbGRFbmQpOwotCQkJCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocHJveHkpOwotCQkJCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChvZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9mZnNldCArIHRoaXMuZGlmZik7Ci0JCQkJCWVuZCArPSB0aGlzLmRpZmY7Ci0JCQkJfQotCQkJCWlmIChlbmQgPCBvbGRFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJaW50IG5ld09mZnNldCA9IG9sZE9mZnNldDsKLQkJCQkJCWludCBuZXdFbmQgPSBvbGRFbmQ7Ci0JCQkJCQlpZiAob2xkT2Zmc2V0ID09IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCQkJbmV3T2Zmc2V0ICs9IHRoaXMuZGlmZjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbmV3RW5kID0gdGhpcy5nYXBPZmZzZXQ7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgbmV3TGVuZ3RoID0gbmV3RW5kIC0gbmV3T2Zmc2V0OwotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkobmV3T2Zmc2V0LCBuZXdMZW5ndGgsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCi0JCQkJCQlpZiAob2xkRW5kID4gbmV3RW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCQkJaW50IGVuZCA9IG9mZnNldCArIHByb3h5LmdldExlbmd0aCgpOwotCQkJCQkJaWYgKGVuZCA8PSBvbGRPZmZzZXQpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQkJCWlmIChvZmZzZXQgPT0gb2xkT2Zmc2V0ICYmIGVuZCA9PSBvbGRFbmQpIHsKLQkJCQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoZW5kID4gb2xkRW5kKSB7Ci0JCQkJCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQkJCQlwcm94eS5zZXRPZmZzZXQob2xkRW5kKTsKLQkJCQkJCQkJCXByb3h5LnNldExlbmd0aChlbmQgLSBvbGRFbmQpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCQkJCQkJCWlmIChlbmQgPCBvbGRFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG9mZnNldCA+PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCQkJCWVuZCArPSB0aGlzLmRpZmY7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZW5kIDwgb2xkRW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlVGV4dERhdGEoVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU291cmNlKHRleHQpOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0KLQkJVGV4dEltcGwgaW1wbCA9IChUZXh0SW1wbCkgdGV4dDsKLQkJaW50IHN0YXJ0ID0gaW1wbC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gaW1wbC5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IG9mZnNldCA9IHN0YXJ0OwotCi0JCS8vIG1ha2Ugc3VyZSBwcmV2aW91cyB0YWcgaXMgY2xvc2VkCi0JCU5vZGUgcHJldiA9IHRleHQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVUYWcgPSBnZXRDbG9zZVRhZygoWE1MTm9kZSkgcHJldik7Ci0JCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCW9mZnNldCArPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJc291cmNlID0gcHJlVGFnICsgc291cmNlOwotCQkJfQotCQl9IGVsc2UgewotCQkJTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlTdHJpbmcgcHJlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCQlvZmZzZXQgKz0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlidWZmZXIuYXBwZW5kKHByZVRhZyk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJCQkJaWYgKHRleHQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsICYmICFlbGVtZW50Lmhhc0VuZFRhZygpICYmIChlbGVtZW50LmlzSlNQQ29udGFpbmVyKCkgfHwgZWxlbWVudC5pc0NEQVRBQ29udGFpbmVyKCkpKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBlbmQgdGFnCi0JCQkJCQlTdHJpbmcgcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJaWYgKHBvc3RUYWcgIT0gbnVsbCkgewotCQkJCQkJCWludCBwb3N0TGVuZ3RoID0gcG9zdFRhZy5sZW5ndGgoKTsKLQkJCQkJCQlpZiAocG9zdExlbmd0aCA+IDApIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZChwb3N0VGFnKTsKLQkJCQkJCQkJaW50IHBvc3RPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkocG9zdE9mZnNldCwgcG9zdExlbmd0aCk7Ci0JCQkJCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBpbXBsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJaW1wbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoYW5nZVZhbHVlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQljaGFuZ2VUZXh0RGF0YSgoVGV4dCkgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCWNoYW5nZUF0dHJWYWx1ZSgoQXR0cikgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdGFydFRhZygoRWxlbWVudCkgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2Uobm9kZSk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQotCQlOb2RlSW1wbCBpbXBsID0gKE5vZGVJbXBsKSBub2RlOwotCQlpbnQgc3RhcnQgPSBpbXBsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBpbXBsLmdldEVuZE9mZnNldCgpOwotCi0JCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoc3RhcnQsIGxlbmd0aCk7Ci0JCWltcGwuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0clZhbHVlQ2xvc2UoWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb24oZmxhdE5vZGUpOwotCQlpZiAocmVnaW9uID09IG51bGwgfHwgcmVnaW9uLmdldFR5cGUoKSAhPSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB2YWx1ZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBjaGVjayBvcGVuIEpTUCB0YWcKLQkJYm9vbGVhbiBjbG9zZUpTUFRhZyA9IGZhbHNlOwotCQlpbnQgb2Zmc2V0ID0gdmFsdWUuaW5kZXhPZihKU1BUYWcuVEFHX09QRU4pOwotCQl3aGlsZSAob2Zmc2V0ID49IDApIHsKLQkJCW9mZnNldCA9IHZhbHVlLmluZGV4T2YoSlNQVGFnLlRBR19DTE9TRSwgb2Zmc2V0ICsgMik7Ci0JCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJCWNsb3NlSlNQVGFnID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW9mZnNldCA9IHZhbHVlLmluZGV4T2YoSlNQVGFnLlRBR19PUEVOLCBvZmZzZXQgKyAyKTsKLQkJfQotCi0JCS8vIGNoZWNrIHF1b3RlCi0JCWJvb2xlYW4gY2xvc2VRdW90ZSA9IGZhbHNlOwotCQljaGFyIGZpcnN0Q2hhciA9IHZhbHVlLmNoYXJBdCgwKTsKLQkJaWYgKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RDaGFyID09ICdcJycpIHsKLQkJCWlmIChjbG9zZUpTUFRhZyB8fCBsZW5ndGggPT0gMSB8fCB2YWx1ZS5jaGFyQXQobGVuZ3RoIC0gMSkgIT0gZmlyc3RDaGFyKSB7Ci0JCQkJY2xvc2VRdW90ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWNsb3NlSlNQVGFnICYmICFjbG9zZVF1b3RlKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGNsb3NlSlNQVGFnKQotCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuVEFHX0NMT1NFKTsKLQkJaWYgKGNsb3NlUXVvdGUpCi0JCQlidWZmZXIuYXBwZW5kKGZpcnN0Q2hhcik7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHYXRoZXIgY2xvc2UgdGFncyByZWN1cnNpdmVseS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDbG9zZVRhZyhYTUxOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlLmlzQ2xvc2VkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVDbG9zZVRhZyhub2RlKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkvLyBlbmQgdGFnIGlzIG5vdCBjbG9zZWQKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gbm8gZW5kIHRhZwotCQlpbnQgb2Zmc2V0ID0gZWxlbWVudC5nZXRFbmRPZmZzZXQoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlYTUxOb2RlIGxhc3RDaGlsZCA9IChYTUxOb2RlKSBlbGVtZW50LmdldExhc3RDaGlsZCgpOwotCQlpZiAobGFzdENoaWxkID09IG51bGwpIHsKLQkJCWlmICghZWxlbWVudC5pc1N0YXJ0VGFnQ2xvc2VkKCkpIHsKLQkJCQlpZiAoZWxlbWVudC5wcmVmZXJFbXB0eVRhZygpKQotCQkJCQllbGVtZW50LnNldEVtcHR5VGFnKHRydWUpOwotCQkJCVN0cmluZyBjbG9zZVRhZyA9IGdldFN0YXJ0Q2xvc2VUYWcoZWxlbWVudCk7Ci0JCQkJaWYgKGNsb3NlVGFnICE9IG51bGwpIHsKLQkJCQkJaW50IGxlbmd0aCA9IGNsb3NlVGFnLmxlbmd0aCgpOwotCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJYnVmZmVyLmFwcGVuZChjbG9zZVRhZyk7Ci0JCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJU3RyaW5nIGNsb3NlVGFnID0gZ2V0Q2xvc2VUYWcobGFzdENoaWxkKTsKLQkJCWlmIChjbG9zZVRhZyAhPSBudWxsKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGNsb3NlVGFnLmxlbmd0aCgpOwotCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVN0cmluZyBlbmRUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJaWYgKGVuZFRhZyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZW5kVGFnLmxlbmd0aCgpOwotCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKGVuZFRhZyk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJZWxlbWVudC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFN0YXJ0Q2xvc2VUYWcoWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5pc1N0YXJ0VGFnQ2xvc2VkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgYXR0clZhbHVlQ2xvc2UgPSBnZXRBdHRyVmFsdWVDbG9zZShlbGVtZW50KTsKLQkJaWYgKGF0dHJWYWx1ZUNsb3NlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZUNsb3NlKTsKLQkJU3RyaW5nIGNsb3NlVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVDbG9zZVRhZyhlbGVtZW50KTsKLQkJaWYgKGNsb3NlVGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJdGhpcy5nYXBPZmZzZXQgPSAwOwotCQl0aGlzLmdhcExlbmd0aCA9IDA7Ci0JCXRoaXMuZGlmZiA9IDA7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IG51bGw7Ci0JCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcihpbnQgZW5kT2Zmc2V0KSB7Ci0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9IGVsc2UgaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQuZ2V0U3RhcnQoKSA8IGVuZE9mZnNldCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKGludCBzdGFydE9mZnNldCkgewotCQlpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJfSBlbHNlIGlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb250ZW50LmdldFN0YXJ0KCkgPj0gc3RhcnRPZmZzZXQpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGVudCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IG5ld09mZnNldCA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgbmV3RW5kID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlib29sZWFuIGlzRW5kVGFnID0gZmFsc2U7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgbmV4dE9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKG5leHRPZmZzZXQgPT0gbmV3T2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJaW50IG5leHRFbmQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJCQkJaWYgKG5leHRPZmZzZXQgPCBuZXdFbmQgJiYgbmV4dEVuZCA+IG5ld09mZnNldCkgewotCQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlOb2RlIGNoaWxkID0gdGhpcy5uZXh0Tm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgY2hpbGQ7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMubmV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHRoaXMucGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5wYXJlbnROb2RlOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IGVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpZiAoZW5kT2Zmc2V0ID09IG5ld09mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBvd25lck5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lck5vZGU7Ci0JCQlpZiAoaXNFbmRUYWcpIHsKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJdXBkYXRlQXR0clJlZ2lvbnMoZWxlbWVudCwgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgb3duZXJOb2RlOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0ZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWludCBvbGRPZmZzZXQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWludCBvbGRFbmQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCQlpZiAob2xkT2Zmc2V0ID09IG5ld09mZnNldCAmJiBvbGRFbmQgPT0gbmV3RW5kKSB7Ci0JCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJaWYgKG9sZEVuZCA+IG5ld0VuZCkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJCQlpZiAob2xkT2Zmc2V0ID09IG5ld09mZnNldCkgewotCQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgbmV3UHJveHkgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoKTsKLQkJCQkJCW5ld1Byb3h5LnNldE9mZnNldChvbGRPZmZzZXQpOwotCQkJCQkJbmV3UHJveHkuc2V0TGVuZ3RoKG5ld0VuZCAtIG9sZE9mZnNldCk7Ci0JCQkJCQluZXdQcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3UHJveHkpOwotCQkJCQl9Ci0JCQkJCXByb3h5LnNldE9mZnNldChuZXdFbmQpOwotCQkJCQlwcm94eS5zZXRMZW5ndGgob2xkRW5kIC0gbmV3RW5kKTsKLQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihwcm94eSk7Ci0JCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCQkJaWYgKG9sZEVuZCA8IG5ld0VuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaW50IG9mZnNldCA9IGNvbnRlbnQuZ2V0U3RhcnQoKTsKLQkJCQkJaW50IGVuZCA9IGNvbnRlbnQuZ2V0RW5kKCk7Ci0JCQkJCWlmIChlbmQgPD0gbmV3T2Zmc2V0KQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChvZmZzZXQgPT0gbmV3T2Zmc2V0ICYmIGVuZCA9PSBuZXdFbmQpIHsKLQkJCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJCWlmIChlbmQgPiBuZXdFbmQpIHsKLQkJCQkJCQlpZiAob2Zmc2V0ID09IG5ld09mZnNldCkgewotCQkJCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgbmV3UHJveHkgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoKTsKLQkJCQkJCQkJbmV3UHJveHkuc2V0T2Zmc2V0KG9mZnNldCk7Ci0JCQkJCQkJCW5ld1Byb3h5LnNldExlbmd0aChuZXdFbmQgLSBvZmZzZXQpOwotCQkJCQkJCQluZXdQcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdQcm94eSwgaSk7Ci0JCQkJCQkJfQotCQkJCQkJCXByb3h5LnNldE9mZnNldChuZXdFbmQpOwotCQkJCQkJCXByb3h5LnNldExlbmd0aChlbmQgLSBuZXdFbmQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJaWYgKGVuZCA9PSBuZXdFbmQpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChvbGRFbmQgPCBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW93bmVyTm9kZS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQl9IGVsc2UgaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCWlmIChjb3VudCA+IDEpCi0JCQkJCQljb250YWluZXIucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQllbHNlCi0JCQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJaWYgKGNvdW50ID4gMSkKLQkJCQkJCQljb250YWluZXIucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQkJZWxzZQotCQkJCQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IGdhcEVuZCA9IHRoaXMuZ2FwT2Zmc2V0ICsgdGhpcy5nYXBMZW5ndGg7Ci0JCWludCBvbGRPZmZzZXQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJaW50IG9sZEVuZCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJaWYgKG9sZE9mZnNldCA+PSB0aGlzLmdhcE9mZnNldCAmJiBvbGRFbmQgPD0gZ2FwRW5kKQotCQkJcmV0dXJuOyAvLyBkbyBub3RoaW5nCi0JCWludCBvbGRMZW5ndGggPSBvbGRFbmQgLSBvbGRPZmZzZXQ7Ci0JCWlmIChvbGRPZmZzZXQgPj0gZ2FwRW5kKQotCQkJb2xkT2Zmc2V0ICs9IHRoaXMuZGlmZjsKLQotCQkvLyBmaW5kIG93bmVyIG5vZGUKLQkJTm9kZUltcGwgb3duZXJOb2RlID0gbnVsbDsKLQkJRWxlbWVudEltcGwgb3duZXJFbmRUYWcgPSBudWxsOwotCQlUZXh0SW1wbCBvd25lclRleHQgPSBudWxsOwotCQl3aGlsZSAodGhpcy5wYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpIHsKLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5uZXh0Tm9kZTsKLQkJCQkJaWYgKHRleHQuaGFzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQlvd25lclRleHQgPSB0ZXh0OwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlOb2RlIGNoaWxkID0gdGhpcy5uZXh0Tm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgY2hpbGQ7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMubmV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHRoaXMucGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5wYXJlbnROb2RlOwotCQkJCWlmIChlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlvd25lck5vZGUgPSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJCW93bmVyRW5kVGFnID0gZWxlbWVudDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXRoaXMucGFyZW50Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlpZiAob3duZXJOb2RlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCi0JCWlmIChvd25lclRleHQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG93bmVyVGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvbGRPZmZzZXQsIG9sZExlbmd0aCk7Ci0JCQkJb3duZXJUZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpbnQgb2Zmc2V0ID0gcHJveHkuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZCA9IG9mZnNldCArIHByb3h5LmdldExlbmd0aCgpOwotCQkJCWlmIChvZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9mZnNldCArIHRoaXMuZGlmZik7Ci0JCQkJfQotCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCQlpZiAoZW5kIDwgb2xkRW5kICYmIChlbmQgPCB0aGlzLmdhcE9mZnNldCB8fCBvbGRFbmQgPiBnYXBFbmQpKSB7IC8vIGhhcwotCQkJCQkvLyBzaGFyZWQKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2xkT2Zmc2V0LCBvbGRMZW5ndGgpOwotCQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJCWludCBvZmZzZXQgPSBwcm94eS5nZXRPZmZzZXQoKTsKLQkJCQkJCQlpbnQgZW5kID0gb2Zmc2V0ICsgcHJveHkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJaWYgKG9mZnNldCA+PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQkJCQlwcm94eS5zZXRPZmZzZXQob2Zmc2V0ICsgdGhpcy5kaWZmKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCQkJCWlmIChlbmQgPCBvbGRFbmQgJiYgKGVuZCA8IHRoaXMuZ2FwT2Zmc2V0IHx8IG9sZEVuZCA+IGdhcEVuZCkpIHsgLy8gaGFzCi0JCQkJCQkJCS8vIHNoYXJlZAotCQkJCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9sZE9mZnNldCwgb2xkTGVuZ3RoKTsKLQkJCWlmIChvd25lckVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJb3duZXJFbmRUYWcuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCW93bmVyTm9kZS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VBdHRyIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0Jdm9pZCByZXBsYWNlQXR0cihFbGVtZW50IG93bmVyRWxlbWVudCwgQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJaWYgKG93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lckVsZW1lbnQ7Ci0JCWlmICghZWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQljaGFuZ2VTdGFydFRhZyhlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0KLQkJYm9vbGVhbiBpbnNlcnRTcGFjZSA9IGZhbHNlOwotCQlTdHJpbmcgYXR0clZhbHVlQ2xvc2UgPSBudWxsOwotCQlpZiAob2xkQXR0ciAhPSBudWxsKSB7Ci0JCQlBdHRySW1wbCBpbXBsID0gKEF0dHJJbXBsKSBvbGRBdHRyOwotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGltcGwuZ2V0TmFtZVJlZ2lvbigpOwotCQkJaWYgKG5hbWVSZWdpb24gPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gaW1wbC5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCWVuZCArPSBsYXN0UmVnaW9uLmdldEVuZCgpOwotCQkJfSBlbHNlIHsKLQkJCQlsYXN0UmVnaW9uID0gaW1wbC5nZXRFcXVhbFJlZ2lvbigpOwotCQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJZW5kICs9IGxhc3RSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW5kICs9IG5hbWVSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJCWxhc3RSZWdpb24gPSBuYW1lUmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNoZWNrIHRoZXJlIGFyZSBleHRyYSBzcGFjZSBiZWZvcmUgdGhlIGxhc3QgYXR0cmlidXRlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQkJCUlUZXh0UmVnaW9uIHByZXZSZWdpb24gPSBudWxsOwotCQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQlpZiAocmVnaW9uID09IG5hbWVSZWdpb24pIHsKLQkJCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCQlwcmV2UmVnaW9uID0gcmVnaW9ucy5nZXQoaSAtIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZWdpb24gPT0gbGFzdFJlZ2lvbikgewotCQkJCQlpZiAoaSArIDEgPCByZWdpb25zLnNpemUoKSkgewotCQkJCQkJbmV4dFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkgKyAxKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlib29sZWFuIGlzTGFzdEF0dHIgPSBmYWxzZTsKLQkJCWlmIChuZXh0UmVnaW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IG5leHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IEpTUF9DTE9TRSB8fCByZWdpb25UeXBlID09IEpTUF9ESVJFQ1RJVkVfQ0xPU0UpIHsKLQkJCQkJaXNMYXN0QXR0ciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzTGFzdEF0dHIgJiYgcHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnQgKz0gcHJldlJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXJ0ICs9IG5hbWVSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCX0KLQotCQkJLy8JCWltcGwucmVzZXRSZWdpb25zKG93bmVyRWxlbWVudCk7Ci0JCQlpbXBsLnJlc2V0UmVnaW9ucyhlbGVtZW50KTsKLQkJfSBlbHNlIHsgLy8gYXBwZW5kIGF0dHJpYnV0ZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQotCQkJYXR0clZhbHVlQ2xvc2UgPSBnZXRBdHRyVmFsdWVDbG9zZShlbGVtZW50KTsKLQkJCWlmIChhdHRyVmFsdWVDbG9zZSAhPSBudWxsICYmIGF0dHJWYWx1ZUNsb3NlLmxlbmd0aCgpID4gMCkgewotCQkJCWluc2VydFNwYWNlID0gdHJ1ZTsKLQkJCQlzdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCWVuZCA9IHN0YXJ0OwotCQkJfSBlbHNlIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQkJaW50IGF0dHJTdGFydCA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IHJlZ2lvbnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJaWYgKHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gSlNQX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gSlNQX0RJUkVDVElWRV9DTE9TRSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpbnQgcmVnaW9uRW5kID0gcmVnaW9uLmdldEVuZCgpOwotCQkJCQlpZiAocmVnaW9uRW5kID09IHJlZ2lvbi5nZXRUZXh0RW5kKCkpCi0JCQkJCQlpbnNlcnRTcGFjZSA9IHRydWU7Ci0JCQkJCWF0dHJTdGFydCA9IHJlZ2lvbkVuZDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChhdHRyU3RhcnQgPT0gMCkKLQkJCQkJcmV0dXJuOyAvLyBub3QgZm91bmQsIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQkJc3RhcnQgKz0gYXR0clN0YXJ0OwotCQkJCWVuZCA9IHN0YXJ0OwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IG51bGw7Ci0JCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gMjsKLQkJCWlmIChhdHRyVmFsdWVDbG9zZSAhPSBudWxsKQotCQkJCXNpemUgKz0gYXR0clZhbHVlQ2xvc2UubGVuZ3RoKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlQXR0ck5hbWUobmV3QXR0cik7Ci0JCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCXNpemUgKz0gbmFtZS5sZW5ndGgoKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKG5ld0F0dHIpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJc2l6ZSArPSB2YWx1ZS5sZW5ndGgoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNpemUpOwotCQkJaWYgKGF0dHJWYWx1ZUNsb3NlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChhdHRyVmFsdWVDbG9zZSk7Ci0JCQlpZiAoaW5zZXJ0U3BhY2UpCi0JCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZChuYW1lKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnPScpOwotCQkJCWJ1ZmZlci5hcHBlbmQodmFsdWUpOwotCQkJfQotCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZUNoaWxkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCByZXBsYWNlQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsICYmIG9sZENoaWxkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBzdGFydCA9IDA7Ci0JCWludCBlbmQgPSAwOwotCQlTdHJpbmcgcHJlVGFnID0gbnVsbDsKLQkJU3RyaW5nIHBvc3RUYWcgPSBudWxsOwotCQlFbGVtZW50SW1wbCBwb3N0RWxlbWVudCA9IG51bGw7Ci0JCWlmIChvbGRDaGlsZCAhPSBudWxsKSB7Ci0JCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBvbGRDaGlsZDsKLQkJCXN0YXJ0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJZW5kID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChvbGRDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCQkJbm9kZS5yZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsgLy8gcmVzZXQgdmFsdWVzIGZyb20KLQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJfSBlbHNlIHsKLQkJCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIG5ld0NoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJCXN0YXJ0ID0gcHJldi5nZXRFbmRPZmZzZXQoKTsKLQkJCQllbmQgPSBzdGFydDsKLQkJCQlwcmVUYWcgPSBnZXRDbG9zZVRhZyhwcmV2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZmlyc3QgY2hpbGQKLQkJCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBuZXdDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQgPSBuZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWVuZCA9IHN0YXJ0OwotCQkJCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlwcmVUYWcgPSBnZXRTdGFydENsb3NlVGFnKChYTUxFbGVtZW50KSBwYXJlbnROb2RlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIG5ld2x5IGhhdmluZyBhIGNoaWxkCi0JCQkJCWlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudE5vZGU7Ci0JCQkJCQlpZiAoZWxlbWVudC5pc0VtcHR5VGFnKCkpIHsgLy8gZW1wdHkgdGFnIGZvcm1hdAotCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MKLQkJCQkJCQllbmQgPSBlbGVtZW50LmdldEVuZE9mZnNldCgpOwotCQkJCQkJCXN0YXJ0ID0gZW5kIC0gMjsgLy8gZm9yICIvPiIKLQkJCQkJCQllbGVtZW50LnNldEVtcHR5VGFnKGZhbHNlKTsKLQkJCQkJCQlwcmVUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQkJCQkJCXBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQlwb3N0RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJCQl9IGVsc2UgaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJCQlzdGFydCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQllbmQgPSBzdGFydDsKLQkJCQkJCQkvLyBpbnZhbGlkIGVuZCB0YWcgb3IgaW1wbGljaXQgdGFnCi0JCQkJCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc3RhcnQgdGFnCi0JCQkJCQkJcHJlVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTdGFydFRhZyhlbGVtZW50KTsKLQkJCQkJCQlpZiAocHJlVGFnICE9IG51bGwpIHsKLQkJCQkJCQkJaW50IGxlbmd0aCA9IHByZVRhZy5sZW5ndGgoKTsKLQkJCQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoc3RhcnQsIGxlbmd0aCk7Ci0JCQkJCQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJCQkJLy8gaW1wbGljaXQgdGFnCi0JCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGVuZCB0YWdzCi0JCQkJCQkJCXBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQkJcG9zdEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3RhcnQgPSBlbGVtZW50LmdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJZW5kID0gc3RhcnQ7Ci0JCQkJCQkJcHJlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQkJCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgKGVsZW1lbnQuaXNKU1BDb250YWluZXIoKSB8fCBlbGVtZW50LmlzQ0RBVEFDb250YWluZXIoKSkpIHsKLQkJCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGVuZCB0YWcKLQkJCQkJCQkJCXBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQkJCXBvc3RFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBlbHNlIG1pZ2h0IERPQ1VNRU5UX05PREUsIHN0YXJ0IGFuZCBlbmQgYXJlIDAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gbnVsbDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgb2Zmc2V0ID0gc3RhcnQ7Ci0JCQlpZiAocHJlVGFnICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCW9mZnNldCArPSBsZW5ndGg7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQocHJlVGFnKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIG5ld0NoaWxkOwotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQkJaWYgKGVsZW1lbnQucHJlZmVyRW1wdHlUYWcoKSkKLQkJCQkJCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgc3RhcnRUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IHN0YXJ0VGFnLmxlbmd0aCgpOwotCQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKHN0YXJ0VGFnKTsKLQkJCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgY29udGVudCA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU291cmNlKG5vZGUpOwotCQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQkJY29udGVudCA9IG5ldyBTdHJpbmcoKTsKLQkJCQkJaW50IGxlbmd0aCA9IGNvbnRlbnQubGVuZ3RoKCk7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJYnVmZmVyLmFwcGVuZChjb250ZW50KTsKLQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCW9mZnNldCArPSBsZW5ndGg7Ci0JCQkJCX0KLQkJCQkJbm9kZS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQotCQkJCU5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQlub2RlID0gY2hpbGQ7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCQkJCVN0cmluZyBlbmRUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJaWYgKGVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gZW5kVGFnLmxlbmd0aCgpOwotCQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKGVuZFRhZyk7Ci0JCQkJCQkJZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJCW9mZnNldCArPSBsZW5ndGg7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxlbWVudC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQotCQkJCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCQkJaWYgKG5vZGUgPT0gbmV3Q2hpbGQpIHsKLQkJCQkJCW5vZGUgPSBudWxsOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJTm9kZUltcGwgbmV4dCA9IChOb2RlSW1wbCkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCQlub2RlID0gbmV4dDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJbm9kZSA9IChOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCQkJCVN0cmluZyBlbmRUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJaWYgKGVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gZW5kVGFnLmxlbmd0aCgpOwotCQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKGVuZFRhZyk7Ci0JCQkJCQkJZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJCW9mZnNldCArPSBsZW5ndGg7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxlbWVudC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBvc3RUYWcgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBwb3N0VGFnLmxlbmd0aCgpOwotCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQocG9zdFRhZyk7Ci0JCQkJCWlmIChwb3N0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCXBvc3RFbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzb3VyY2UgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWlmIChzdGFydCA9PSBlbmQgJiYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gbm8gdGhpbmcgY2hhbmdlZAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXZvaWQgcmVwbGFjZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zKSB7Ci0JCS8vIGZ1dHVyZV9UT0RPOiBvcHRpbWl6ZQotCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJdGhpcy5wYXJlbnROb2RlID0gcm9vdDsKLQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJcmVtb3ZlR2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcihmbGF0Tm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JLyoqCi0JICogV3JhcHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5yZXBsYWNlVGV4dCgpIGFuZCBzZXRzIGNvbnRleHR1YWwKLQkgKiBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwbGFjZVNvdXJjZShTdHJpbmcgc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaW50IGluc2VydGVkID0gMDsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJc291cmNlID0gbmV3IFN0cmluZygpOwotCQllbHNlCi0JCQlpbnNlcnRlZCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaW50IHJlbW92ZWQgPSBlbmQgLSBzdGFydDsKLQkJaWYgKGluc2VydGVkID09IDAgJiYgcmVtb3ZlZCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCXRoaXMuZ2FwT2Zmc2V0ID0gc3RhcnQ7Ci0JCXRoaXMuZ2FwTGVuZ3RoID0gcmVtb3ZlZDsKLQkJdGhpcy5kaWZmID0gaW5zZXJ0ZWQgLSByZW1vdmVkOwotCQkvLyBOb3RlOiBkdWUgdG8gYnVnCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNjE5Ci0JCS8vIGZvciBub3cgYXNzdW1lICJpZ25vcmUgcmVhZG9ubHkiIHJlZ2lvbiBpcyBvayAtLSBhc3N1bWUgRE9NIGl0c2VsZgotCQkvLyBjaGVja3MgaWYKLQkJLy8gb2sgdG8gaW5zZXJ0IG9yIG5vdC4gSW4gcmVhbGl0eSwgd2UgbWF5IGhhdmUgdG8gbWFrZSBvciAiY29udGFpbnMiCi0JCS8vIG1ldGhvZCBtb3JlCi0JCS8vIGJldHRlci4gT3IsIHdlIG1heSBoYXZlIHRvICJwZXJjdWxhdGUgdXAiIHRoZSBwYXJhbWV0ZXIgZm9yIGNsaWVudHMKLQkJLy8gdG8gdGVsbCB1cyBwcm9ncmFtYXRpY2FsbHkKLQkJLy8gdGhhdCBpdHMgb2sgdG8gaW5zZXJ0L2Zvcm1hdCBpbiBhIHJlYWQtb25seSByZWdpb24uCi0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMubW9kZWwsIHRoaXMuZ2FwT2Zmc2V0LCB0aGlzLmdhcExlbmd0aCwgc291cmNlLCB0cnVlKTsKLQl9Ci0KLQl2b2lkIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpIHsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpOwotCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQotCQkJRW51bWVyYXRpb24gZSA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmVtb3ZlR2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJCUVudW1lcmF0aW9uIGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25CZWZvcmUoZmxhdE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0JCQl9Ci0JCQlpZiAobGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIobGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZSh0aGlzLmdhcE9mZnNldCk7Ci0JCQkJLy8gbWFrZSBzdXJlIHRvIHJlc3RvcmUgYWxsIGJhY2t1cGVkIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcih0aGlzLmdhcE9mZnNldCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZSh0aGlzLmdhcE9mZnNldCk7Ci0JCQkvLyBtYWtlIHN1cmUgdG8gcmVzdG9yZSBhbGwgYmFja3VwZWQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIodGhpcy5nYXBPZmZzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUF0dHJSZWdpb25zKEVsZW1lbnQgZWxlbWVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCi0JCS8vIHVwZGF0ZSBhdHRyaWJ1dGVzCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbSgrK2luZGV4KTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0TmFtZVJlZ2lvbihyZWdpb24pOwotCQkJCQkvLyByZXNldCBvdGhlciByZWdpb25zCi0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24obnVsbCk7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24obnVsbCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJfSBlbHNlIGlmIChyZWdpb25UeXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJYXR0ciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9maWxlYnVmZmVycy9Eb2N1bWVudEZhY3RvcnlGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZmlsZWJ1ZmZlcnMvRG9jdW1lbnRGYWN0b3J5Rm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OTc1MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9maWxlYnVmZmVycy9Eb2N1bWVudEZhY3RvcnlGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRGYWN0b3J5Rm9yWE1MIGltcGxlbWVudHMgSURvY3VtZW50RmFjdG9yeSB7Ci0KLQlwdWJsaWMgRG9jdW1lbnRGYWN0b3J5Rm9yWE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRGYWN0b3J5I2NyZWF0ZURvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UobmV3IFhNTFNvdXJjZVBhcnNlcigpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0Jsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9CbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQyYTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0Jsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbXBsZW1lbnRzIElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIHBhcnRpdGlvblR5cGU7Ci0KLQkvKioKLQkgKiBBIEJsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGxpa2UgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLAotCSAqIGJ1dCBpcyB0aGUgcmVzdWx0IG9mIGEgImJsb2NrIHNjYW4iLgotCSAqLwotCXB1YmxpYyBCbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoKSB7Ci0JCWlmIChwYXJ0aXRpb25UeXBlID09IG51bGwpIHsKLQkJCS8vIGV2ZW50dWFsbHkgY2FuIGxvb2sgdXAgc3Vycm91bmRpbmdUYWcgbmFtZQotCQkJLy8gYnV0IHRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IGVudGVuZGVkIGZvciBmdXR1cmUKLQkJCS8vIGV4dGVuc2liaWxpdHkuIFRoaXMgbWF5IGNoYW5nZS4KLQkJCS8vcGFydGl0aW9uVHlwZSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuIiArIHRhZ25hbWU7Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvblR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uVHlwZShTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQl0aGlzLnBhcnRpdGlvblR5cGUgPSBwYXJ0aXRpb25UeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5MDhhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElUZXh0UmVnaW9uQ29udGFpbmVyIHsKLQlwcm90ZWN0ZWQgaW50IGxlbmd0aDsKLQlwcm90ZWN0ZWQgSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudDsKLQlwcm90ZWN0ZWQgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnM7Ci0JcHJvdGVjdGVkIGludCBzdGFydDsKLQlwcm90ZWN0ZWQgaW50IHRleHRMZW5ndGg7Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCi0JcHVibGljIENvbnRleHRSZWdpb25Db250YWluZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiB0aGVzZSAiZGVlcCIgcGFyZW50aW5nIGlzIG5vdCBub3JtYWwsIGJ1dCBqdXN0IGluIGNhc2UuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IF9nZXRQYXJlbnREb2N1bWVudCgpIHsKLQkJLy8gZ28gdXAgZW5vdWdoIHBhcmVudHMgdG8gZ2V0IHRvIGRvY3VtZW50Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCS8vIHdvdWxkIGJlIGFuIGVycm9yIG5vdCB0byBiZSBjb250YWluZXIsIGJ1dAotCQkJLy8gd29uJ3QgY2hlY2sgZm9yIGl0IG5vdwotCQkJcGFyZW50ID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gKChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBwYXJlbnQpLmdldFBhcmVudERvY3VtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24jYWRqdXN0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQotCQlzdGFydCArPSBpOwotCQkvLyBJIGVycm9uZW91c2x5IGFkZGVkIGxlbmd0aCBhbmQgdGV4dExlbmd0aAotCQkvLyBtYXkgd2FudCB0byByZW5hbWUgdGhpcyBtZXRob2QgdG8gYWRqdXN0U3RhcnQKLQkJLy9sZW5ndGggKz0gaTsKLQkJLy90ZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGhXaXRoKGludCBpKSB7Ci0JCWxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCXN0YXJ0ICs9IGk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24jYWRqdXN0VGV4dExlbmd0aChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQl0ZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSkgewotCi0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpIDw9IGkgJiYgaSA8IGdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbiNjb250YWluc09mZnNldChjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24sCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pIDw9IG9mZnNldCAmJiBvZmZzZXQgPCBnZXRFbmRPZmZzZXQoY29udGFpbmVkUmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIGVxdWF0ZSBwb3NpdGlvbnMuIGNsaWVudHMgbWF5ICh3aWxsIHByb2JhYmx5KQotCSAqIHN0aWxsIG5lZWQgdG8gbWFrZSBjYWxscyB0byBlcXVhdGUgcmVnaW9ucywgcGFyZW50LCBldGMuCi0JICovCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlzdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlsZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCXRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gc3RhcnQgKyBsZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCS8vIG91ciBzdGFydE9mZnNldCB0YWtlIGludG8gYWNjb3VudCBvdXIgcGFyZW50LCBhbmQgb3VyIHN0YXJ0Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldEVuZE9mZnNldChjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pICsgY29udGFpbmVkUmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbiNnZXRGaXJzdFJlZ2lvbigpCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9ucygpLmdldCgwKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb24jZ2V0RnVsbFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCS8vIENNVkMgPiAyNTI0MzAsIDI0NTU4NgotCQkvLyB1bml0IHRlc3QgPiBjb20uaWJtLnNlZC50ZXN0cy5vdGhlci5Vbml0VGVzdHMudGVzdERlZXBFbWJlZGRlZEpTUDMKLQkJLy8gdGhpcyBjb2RlIG1vZGlmaWVkIG9uIDYvMjUvMDMgKHBhKQotCi0JCS8vCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8JCXRyeSB7Ci0JCS8vCQkJcmVzdWx0ID0gX2dldFBhcmVudERvY3VtZW50KCkuZ2V0KHN0YXJ0LCBsZW5ndGgpOwotCQkvLwkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkvLwkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2dyYW0gZXJyb3I6IHVucmVhY2hhYmxlIGV4Y2VwdGlvbiIsIGUpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQl9Ci0JCS8vCQlyZXR1cm4gcmVzdWx0OwotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0RnVsbFRleHQodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCS8vIE11c3QgYmUgcHJveGllZCBoZXJlIHNpbmNlIGFSZWdpb24gc2hvdWxkIGFsd2F5cyBiZSBhIGNoaWxkIG9mCi0JCS8vICp0aGlzKiBjb250YWluZXIgYW5kIGluZGV4ZWQgZnJvbQotCQkvLyB0aGlzIGNvbnRhaW5lcidzIG9mZnNldAotCQkvLwl0cnkgewotCQlyZXR1cm4gcGFyZW50LmdldEZ1bGxUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0ICsgYVJlZ2lvbi5nZXRTdGFydCgpLCBzdGFydCArIGFSZWdpb24uZ2V0RW5kKCkpOwotCQkvL30gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCS8vaWYgKGNvbS5pYm0uc2VkLnV0aWwuRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJLy99Ci0JCS8vcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb24jZ2V0TGFzdFJlZ2lvbigpCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRSZWdpb25zKCkuZ2V0KGdldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb24jZ2V0TnVtYmVyT2ZSZWdpb25zKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bWJlck9mUmVnaW9ucygpIHsKLQkJcmV0dXJuIGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcmFtZXRlciBvZmZzZXQgcmVmZXJzIHRvIHRoZSBvdmVyYWxsIG9mZnNldCBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJLy8gdHJhbnNmb3JtIHRoZSByZXF1ZXN0ZWQgb2Zmc2V0IHRvIHRoZSAic2NhbGUiIHRoYXQKLQkJCS8vIHJlZ2lvbnMgYXJlIHN0b3JlZCBpbiwgd2hpY2ggYXJlIGFsbCByZWxhdGl2ZSB0byB0aGUKLQkJCS8vIHN0YXJ0IHBvaW50LgotCQkJLy9pbnQgdHJhbnNmb3JtZWRPZmZzZXQgPSBvZmZzZXQgLSBnZXRTdGFydE9mZnNldCgpOwotCQkJLy8KLQkJCWludCBsZW5ndGggPSBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVnaW9uKHMpIGluIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb246OmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0OiAiICsgcmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZXF1ZXN0ZWQgb2Zmc2V0OiAiICsgb2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiIHRyYW5zZm9ybWVkT2Zmc2V0OiAiICsKLQkJCQkJLy8gdHJhbnNmb3JtZWRPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBzdGFydDogIiArIHJlZ2lvbi5nZXRTdGFydCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gZW5kOiAiICsgcmVnaW9uLmdldEVuZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gdHlwZTogIiArIHJlZ2lvbi5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBjbGFzczogIiArIHJlZ2lvbi5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfQotCQkJCWlmICgoZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8PSBvZmZzZXQpICYmIChvZmZzZXQgPCBnZXRFbmRPZmZzZXQocmVnaW9uKSkpIHsKLQkJCQkJcmVzdWx0ID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXJldHVybiByZWdpb25zOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0U3RhcnRPZmZzZXQoKSArIGdldFN0YXJ0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uI2dldFN0YXJ0T2Zmc2V0KGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCS8qKgotCSAqIHNhbWUgYXMgZ2V0RnVsbFRleHQgZm9yIHRoaXMgcmVnaW9uIHR5cGUgLi4uIGRvIHdlIG5lZWQgdG8gdGFrZSB3aGl0ZQotCSAqIHNwYWNlIG9mZj8KLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHBhcmVudERvY3VtZW50ID0gX2dldFBhcmVudERvY3VtZW50KCk7Ci0JCQlyZXN1bHQgPSBwYXJlbnREb2N1bWVudC5nZXQoc3RhcnQsIGxlbmd0aCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2dyYW0gZXJyb3I6IHVucmVhY2hhYmxlIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQkvLyBNdXN0IGJlIHByb3hpZWQgaGVyZSBzaW5jZSBhUmVnaW9uIHNob3VsZCBhbHdheXMgYmUgYSBjaGlsZCBvZgotCQkvLyAqdGhpcyogY29udGFpbmVyIGFuZCBpbmRleGVkIGZyb20KLQkJLy8gdGhpcyBjb250YWluZXIncyBvZmZzZXQKLQkJLy8JY29tLmlibS5zZWQudXRpbC5Bc3NlcnQuaXNUcnVlKHJlZ2lvbnMuY29udGFpbnMoYVJlZ2lvbikpOwotCQkvL3RyeSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0VGV4dCgpLnN1YnN0cmluZyhzdGFydCArIGFSZWdpb24uZ2V0U3RhcnQoKSwgc3RhcnQgKyBhUmVnaW9uLmdldFRleHRFbmQoKSk7Ci0JCS8vfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJLy9pZiAoY29tLmlibS5zZWQudXRpbC5EZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkKLQkJLy9jb20uaWJtLnNlZC51dGlsLkxvZ2dlci5sb2coZSk7Ci0JCS8vfQotCQkvLyByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNnZXRUZXh0RW5kKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCS8vCQlpbnQgcmVzdWx0ID0gMDsKLQkJLy8JCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0KLQkJLy8gMSk7Ci0JCS8vCQlyZXN1bHQgPSBnZXRTdGFydE9mZnNldChsYXN0UmVnaW9uKSArIGxhc3RSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkvLwkJcmV0dXJuIHJlc3VsdDsKLQkJcmV0dXJuIHN0YXJ0ICsgdGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCS8vIG91ciBzdGFydE9mZnNldCB0YWtlIGludG8gYWNjb3VudCBvdXIgcGFyZW50LCBhbmQgb3VyIHN0YXJ0Ci0JCS8vIChwYSkgMTAvNCBjaGFuZ2VkIHRvIGJlIGJhc2VkIG9uIHRleHQgZW5kCi0JCS8vICAgICAgICAgICBpdCB1c2VkIHRvIHJldHVybiBpbmNvcnJlY3QgdmFsdWUgZm9yIGVtYmVkZGVkIHJlZ2lvbiBjb250YWluZXJzCi0JCS8vCi0KLQkJLy8gVE9ETyBDUklUSUNBTCAtLSBuZWVkIHRvIHJlLXdvcmsgdGhpcyB3b3JrIGFyb3VuZCwgc28gZG9lc24ndAotCQkvLyBkZXBlbmQgb24gWE1MUmVnaW9uQ29udGV4dAotCQkvLwkJLy8gdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIDIyNjgyMy8vLy8vLy8vLy8vCi0JCS8vCQlmb3IgKGludCBpID0gcmVnaW9ucy5zaXplKCkgLSAxOyBpID49IDAgJiYgcmVnaW9uLmdldFR5cGUoKSA9PQotCQkvLyBYTUxSZWdpb25Db250ZXh0LldISVRFX1NQQUNFOyBpLS0pCi0JCS8vCQkJcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKTsKLQkJLy8JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFRleHRFbmQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb24jZ2V0VGV4dEVuZE9mZnNldChjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCQlpZiAocmVnaW9uID09IGNvbnRhaW5lZFJlZ2lvbikgewotCQkJCQlyZXN1bHQgPSBnZXRTdGFydE9mZnNldChyZWdpb24pICsgcmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgaSkgewotCQlsZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcGFyZW50UmVnaW9uKSB7Ci0JCXBhcmVudCA9IHBhcmVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWdpb25zKElUZXh0UmVnaW9uTGlzdCBjb250YWluZWRSZWdpb25zKSB7Ci0JCXJlZ2lvbnMgPSBjb250YWluZWRSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBpKSB7Ci0JCXN0YXJ0ID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRleHRMZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHN0cmluZykgewotCQl0eXBlID0gc3RyaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSAiQ29udGFpbmVyISEhICIgKyBzaG9ydENsYXNzTmFtZSArICItLT4gIiArIGdldFR5cGUoKSArICI6ICIgKyBnZXRTdGFydCgpICsgIi0iICsgZ2V0VGV4dEVuZCgpICsgKGdldFRleHRFbmQoKSAhPSBnZXRFbmQoKSA/ICgiLyIgKyBnZXRFbmQoKSkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBGVVRVUkVfVE9fRE86IG5lZWQgdG8gaW1wbGVtZW50IHJlZ2lvbiBsZXZlbCBwYXJzaW5nIGluCi0JCS8vIElUZXh0UmVnaW9uQ29udGFpbmVyOjp1cGRhdGVNb2RlbAotCQkvLyBuZXZlciBiZWluZyBjYWxsZWQ/Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3MTU0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QubGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1JlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1JlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljNGFiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9SZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotCi0KLXB1YmxpYyBjbGFzcyBSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHBhcmVudCwgY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCS8vbmV3UmVnaW9uLnNldFBhcmVudChwYXJlbnQpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gbmV3IENvbnRleHRSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCXJldHVybiBuZXdSZWdpb247Ci0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTDEwTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTDEwTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmMDVhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUwxME5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40IG9uIDcvMTcvMDQgMzo0MyBBTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXgKLSAqIDwvYT4gMS40IG9uIDcvMTcvMDQgMzo0MyBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5YTUwxME5hbWVzLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTDEwTmFtZXMgewotCi0JLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlZRU9GID0gLTE7Ci0KLQkvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSAyMDQ4OwotCi0JLyoqIGxleGljYWwgc3RhdGVzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlZSU5JVElBTCA9IDA7Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAiXDExXDBcMVwxXDFcMlwyXDBcMVwxXDIyXDBcMVwxXDE0XDBcMVwwXDJcMCIgKyAiXDEyXDBcMVwzXDZcMFwzMlwzXDRcMFwxXDNcMVwwXDMyXDNcNzRcMFwxXDAiICsgIlwxMFwwXDI3XDNcMVwwXDM3XDNcMVwwXDcyXDNcMlwwXDEzXDNcMlwwXDEwXDMiICsgIlwxXDBcNjVcM1wxXDBcMTA0XDNcMTFcMFw0NFwzXDNcMFwyXDNcNFwwXDM2XDMiICsgIlw3MFwwXDEzMVwzXDIyXDBcN1wzXDE2XDBcMlwwXDU2XDBcMTA2XDBcMzJcMFwyXDAiICsgIlw0NFwwXDFcM1wxXDBcM1wzXDFcMFwxXDNcMVwwXDI0XDNcMVwwXDU0XDMiICsgIlwxXDBcN1wzXDNcMFwxXDNcMVwwXDFcM1wxXDBcMVwzXDFcMFwxXDMiICsgIlwxXDBcMjJcM1wxNVwwXDE0XDNcMVwwXDEwMlwzXDFcMFwxNFwzXDFcMFw0NFwzIiArICJcMVwwXDRcMFwxMVwwXDY1XDNcMlwwXDJcM1wyXDBcMlwzXDNcMFwzNFwzIiArICJcMlwwXDEwXDNcMlwwXDJcM1w2N1wwXDQ2XDNcMlwwXDFcM1w3XDBcNDZcMyIgKyAiXDEyXDBcMjFcMFwxXDBcMjdcMFwxXDBcM1wwXDFcMFwxXDBcMVwwXDJcMCIgKyAiXDFcMFwxXDBcMTNcMFwzM1wzXDVcMFwzXDNcNTZcMFwzMlwzXDVcMFwxXDAiICsgIlwxMlwzXDEwXDBcMTVcMFwxMlwwXDZcMFwxXDBcMTA3XDNcMlwwXDVcM1wxXDAiICsgIlwxN1wzXDFcMFw0XDNcMVwwXDFcM1wxN1wwXDJcM1wyXDBcMVwwXDRcMCIgKyAiXDJcMFwxMlwwXHUwMjA3XDBcM1wwXDFcMFw2NVwzXDJcMFwxXDBcMVwzXDIwXDAiICsgIlwzXDBcNFwwXDNcMFwxMlwzXDJcMFwyXDBcMTJcMFwyMVwwXDNcMFwxXDAiICsgIlwxMFwzXDJcMFwyXDNcMlwwXDI2XDNcMVwwXDdcM1wxXDBcMVwzXDNcMCIgKyAiXDRcM1wyXDBcMVwwXDFcMFw3XDBcMlwwXDJcMFwyXDBcM1wwXDExXDAiICsgIlwxXDBcNFwwXDJcM1wxXDBcM1wzXDJcMFwyXDBcMTJcMFwyXDNcMjBcMCIKLQkJCQkrICJcMVwwXDJcMFw2XDNcNFwwXDJcM1wyXDBcMjZcM1wxXDBcN1wzXDFcMCIgKyAiXDJcM1wxXDBcMlwzXDFcMFwyXDNcMlwwXDFcMFwxXDBcNVwwXDRcMCIgKyAiXDJcMFwyXDBcM1wwXDEzXDBcNFwzXDFcMFwxXDNcN1wwXDEyXDBcMlwwIiArICJcM1wzXDE0XDBcM1wwXDFcMFw3XDNcMVwwXDFcM1wxXDBcM1wzXDFcMCIgKyAiXDI2XDNcMVwwXDdcM1wxXDBcMlwzXDFcMFw1XDNcMlwwXDFcMFwxXDMiICsgIlwxMFwwXDFcMFwzXDBcMVwwXDNcMFwyMlwwXDFcM1w1XDBcMTJcMFwyMVwwIiArICJcM1wwXDFcMFwxMFwzXDJcMFwyXDNcMlwwXDI2XDNcMVwwXDdcM1wxXDAiICsgIlwyXDNcMlwwXDRcM1wyXDBcMVwwXDFcM1w2XDBcM1wwXDJcMFwyXDAiICsgIlwzXDBcMTBcMFwyXDBcNFwwXDJcM1wxXDBcM1wzXDRcMFwxMlwwXDIyXDAiICsgIlwyXDBcMVwwXDZcM1wzXDBcM1wzXDFcMFw0XDNcM1wwXDJcM1wxXDAiICsgIlwxXDNcMVwwXDJcM1wzXDBcMlwzXDNcMFwzXDNcM1wwXDEwXDNcMVwwIiArICJcM1wzXDRcMFw1XDBcM1wwXDNcMFwxXDBcNFwwXDExXDBcMVwwXDE3XDAiICsgIlwxMVwwXDIxXDBcM1wwXDFcMFwxMFwzXDFcMFwzXDNcMVwwXDI3XDNcMVwwIiArICJcMTJcM1wxXDBcNVwzXDRcMFw3XDBcMVwwXDNcMFwxXDBcNFwwXDdcMCIgKyAiXDJcMFwxMVwwXDJcM1w0XDBcMTJcMFwyMlwwXDJcMFwxXDBcMTBcM1wxXDAiICsgIlwzXDNcMVwwXDI3XDNcMVwwXDEyXDNcMVwwXDVcM1w0XDBcN1wwXDFcMCIgKyAiXDNcMFwxXDBcNFwwXDdcMFwyXDBcN1wwXDFcM1wxXDBcMlwzXDRcMCIgKyAiXDEyXDBcMjJcMFwyXDBcMVwwXDEwXDNcMVwwXDNcM1wxXDBcMjdcM1wxXDAiICsgIlwyMFwzXDRcMFw2XDBcMlwwXDNcMFwxXDBcNFwwXDExXDBcMVwwXDEwXDAiICsgIlwyXDNcNFwwXDEyXDBcMjIxXDBcNTZcM1wxXDBcMVwzXDFcMFwyXDNcN1wwIgotCQkJCSsgIlw1XDBcNlwzXDFcMFwxMFwwXDFcMFwxMlwwXDQ3XDBcMlwzXDFcMFwxXDMiICsgIlwyXDBcMlwzXDFcMFwxXDNcMlwwXDFcM1w2XDBcNFwzXDFcMFw3XDMiICsgIlwxXDBcM1wzXDFcMFwxXDNcMVwwXDFcM1wyXDBcMlwzXDFcMFwyXDMiICsgIlwxXDBcMVwzXDFcMFwyXDNcNlwwXDFcMFwyXDBcMVwzXDJcMFw1XDMiICsgIlwxXDBcMVwwXDFcMFw2XDBcMlwwXDEyXDBcNzZcMFwyXDBcNlwwXDEyXDAiICsgIlwxM1wwXDFcMFwxXDBcMVwwXDFcMFwxXDBcNFwwXDJcMFwxMFwzXDFcMCIgKyAiXDQxXDNcN1wwXDI0XDBcMVwwXDZcMFw0XDBcNlwwXDFcMFwxXDBcMVwwIiArICJcMjVcMFwzXDBcN1wwXDFcMFwxXDBcMzQ2XDBcNDZcM1wxMlwwXDQ3XDNcMTFcMCIgKyAiXDFcM1wxXDBcMlwzXDFcMFwzXDNcMVwwXDFcM1wxXDBcMlwzXDFcMCIgKyAiXDVcM1w1MVwwXDFcM1wxXDBcMVwzXDFcMFwxXDNcMTNcMFwxXDNcMVwwIiArICJcMVwzXDFcMFwxXDNcM1wwXDJcM1wzXDBcMVwzXDVcMFwzXDNcMVwwIiArICJcMVwzXDFcMFwxXDNcMVwwXDFcM1wxXDBcMVwzXDNcMFwyXDNcM1wwIiArICJcMlwzXDFcMFwxXDNcNTBcMFwxXDNcMTFcMFwxXDNcMlwwXDFcM1wyXDAiICsgIlwyXDNcN1wwXDJcM1wxXDBcMVwzXDFcMFw3XDNcNTBcMFwxXDNcNFwwIiArICJcMVwzXDEwXDBcMVwzXHUwYzA2XDBcMjM0XDNcNFwwXDEzMlwzXDZcMFwyNlwzXDJcMCIgKyAiXDZcM1wyXDBcNDZcM1wyXDBcNlwzXDJcMFwxMFwzXDFcMFwxXDNcMVwwIiArICJcMVwzXDFcMFwxXDNcMVwwXDM3XDNcMlwwXDY1XDNcMVwwXDdcM1wxXDAiICsgIlwxXDNcM1wwXDNcM1wxXDBcN1wzXDNcMFw0XDNcMlwwXDZcM1w0XDAiICsgIlwxNVwzXDVcMFwzXDNcMVwwXDdcM1wzMjNcMFwxNVwwXDRcMFwxXDBcMTA0XDAiICsgIlwxXDNcM1wwXDJcM1wyXDBcMVwzXDEyMVwwXDNcM1x1MGU4MlwwXDFcMFwxXDAiCi0JCQkJKyAiXDFcM1wzMVwwXDExXDNcNlwwXDFcMFw1XDBcMTNcMFwxMjRcM1w0XDBcMlwwIiArICJcMlwwXDJcMFwyXDBcMTMyXDNcMVwwXDNcMFw2XDBcNTBcM1x1MWNkM1wwXHU1MWE2XDMiICsgIlx1MGM1YVwwXHUyYmE0XDNcdTI4NWNcMCI7Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPSAiXDFcMFwxXDFcMVwyXDRcMSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSB6elVucGFja0FjdGlvbigpIHsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFs3XTsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCW9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCB6elVucGFja0FjdGlvbihTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnRbXSByZXN1bHQpIHsKLQkJaW50IGkgPSAwOyAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICovCi0JCWludCBqID0gb2Zmc2V0OyAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotCQlpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLQkJd2hpbGUgKGkgPCBsKSB7Ci0JCQlpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0JCQlpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0JCQlkbwotCQkJCXJlc3VsdFtqKytdID0gdmFsdWU7Ci0JCQl3aGlsZSAoLS1jb3VudCA+IDApOwotCQl9Ci0JCXJldHVybiBqOwotCX0KLQotCi0JLyoqCi0JICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gWlpfUk9XTUFQID0genpVbnBhY2tSb3dNYXAoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9ST1dNQVBfUEFDS0VEXzAgPSAiXDBcMFwwXDRcMFwxMFwwXDE0XDBcMjBcMFwyNFwwXDMwIjsKLQotCXByaXZhdGUgc3RhdGljIGludFtdIHp6VW5wYWNrUm93TWFwKCkgewotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50WzddOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJb2Zmc2V0ID0genpVbnBhY2tSb3dNYXAoWlpfUk9XTUFQX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrUm93TWFwKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludFtdIHJlc3VsdCkgewotCQlpbnQgaSA9IDA7IC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgKi8KLQkJaW50IGogPSBvZmZzZXQ7IC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0JCWludCBsID0gcGFja2VkLmxlbmd0aCgpOwotCQl3aGlsZSAoaSA8IGwpIHsKLQkJCWludCBoaWdoID0gcGFja2VkLmNoYXJBdChpKyspIDw8IDE2OwotCQkJcmVzdWx0W2orK10gPSBoaWdoIHwgcGFja2VkLmNoYXJBdChpKyspOwotCQl9Ci0JCXJldHVybiBqOwotCX0KLQotCS8qKgotCSAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVFJBTlNbXSA9IHsxLCAxLCAtMSwgMiwgLTEsIC0xLCAtMSwgLTEsIDIsIDMsIDQsIDIsIDIsIDMsIDQsIDUsIC0xLCA0LCA0LCA2LCA1LCA1LCA0LCA1LCA2LCA2LCAtMSwgNix9OwotCi0JLyogZXJyb3IgY29kZXMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVU5LTk9XTl9FUlJPUiA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLQkvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0VSUk9SX01TR1tdID0geyJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIn07Ci0KLQkvKioKLQkgKiBaWl9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZQotCSAqIDxjb2RlPmFTdGF0ZTwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBaWl9BVFRSSUJVVEUgPSB6elVucGFja0F0dHJpYnV0ZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FUVFJJQlVURV9QQUNLRURfMCA9ICJcMVwwXDFcMTFcNVwxIjsKLQotCXByaXZhdGUgc3RhdGljIGludFtdIHp6VW5wYWNrQXR0cmlidXRlKCkgewotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50WzddOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJb2Zmc2V0ID0genpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQXR0cmlidXRlKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludFtdIHJlc3VsdCkgewotCQlpbnQgaSA9IDA7IC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgKi8KLQkJaW50IGogPSBvZmZzZXQ7IC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0JCWludCBsID0gcGFja2VkLmxlbmd0aCgpOwotCQl3aGlsZSAoaSA8IGwpIHsKLQkJCWludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWRvCi0JCQkJcmVzdWx0W2orK10gPSB2YWx1ZTsKLQkJCXdoaWxlICgtLWNvdW50ID4gMCk7Ci0JCX0KLQkJcmV0dXJuIGo7Ci0JfQotCi0JLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQlwcml2YXRlIGphdmEuaW8uUmVhZGVyIHp6UmVhZGVyOwotCi0JLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQlwcml2YXRlIGludCB6elN0YXRlOwotCi0JLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQlwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotCS8qKgotCSAqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMgdGhlIHNvdXJjZQotCSAqIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIGNoYXIgenpCdWZmZXJbXSA9IG5ldyBjaGFyW1paX0JVRkZFUlNJWkVdOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQlwcml2YXRlIGludCB6elB1c2hiYWNrUG9zOwotCi0JLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXByaXZhdGUgaW50IHp6Q3VycmVudFBvczsKLQotCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQlwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotCS8qKgotCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZCBmcm9tCi0JICogaW5wdXQKLQkgKi8KLQlwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLQkvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JIGludCB5eWxpbmU7Ci0KLQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JIGludCB5eWNoYXI7Ci0KLQkvKioKLQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUKLQkgKiBtYXRjaGVkIHRleHQKLQkgKi8KLQkgaW50IHl5Y29sdW1uOwotCi0JLyoqCi0JICogenpBdEJPTCA9PSB0cnVlIDw9PnRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotCSAqLwotCSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0JLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT50aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0JcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLQkvKiB1c2VyIGNvZGU6ICovCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLQkgKi8KLQlwdWJsaWMgWE1MMTBOYW1lcygpIHsKLQkJdGhpcy56elJlYWRlciA9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZShTdHJpbmcgc3RyaW5nVG9DaGVjaykgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQl5eXJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihzdHJpbmdUb0NoZWNrKSk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBpc1ZhbGlkWE1MMTBOYW1lKCk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIGJlIGltcG9zc2libGUgd2l0aCBzdHJpbmdzLCBidXQgaWYgb2NjdXJzLCBqdXN0IG1lYW5zCi0JCQkvLyAibm90IgotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YKLQkgKiB0aGlzIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqICAgICAgICAgICAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLQkgKi8KLQlwdWJsaWMgWE1MMTBOYW1lcyhqYXZhLmlvLlJlYWRlciBpbikgewotCQl0aGlzLnp6UmVhZGVyID0gaW47Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcwotCSAqIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqICAgICAgICAgICAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotCSAqLwotCXB1YmxpYyBYTUwxME5hbWVzKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwYWNrZWQKLQkgKiAgICAgICAgICAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICogQHJldHVybiB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHp6VW5wYWNrQ01hcChTdHJpbmcgcGFja2VkKSB7Ci0JCWNoYXJbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLQkJaW50IGkgPSAwOyAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICovCi0JCWludCBqID0gMDsgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLQkJd2hpbGUgKGkgPCAxMjI2KSB7Ci0JCQlpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0JCQljaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotCQkJZG8KLQkJCQltYXBbaisrXSA9IHZhbHVlOwotCQkJd2hpbGUgKC0tY291bnQgPiAwKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCi0JLyoqCi0JICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotCQkvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotCQlpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwgenpCdWZmZXIsIDAsIHp6RW5kUmVhZCAtIHp6U3RhcnRSZWFkKTsKLQotCQkJLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLQkJCXp6RW5kUmVhZCAtPSB6elN0YXJ0UmVhZDsKLQkJCXp6Q3VycmVudFBvcyAtPSB6elN0YXJ0UmVhZDsKLQkJCXp6TWFya2VkUG9zIC09IHp6U3RhcnRSZWFkOwotCQkJenpQdXNoYmFja1BvcyAtPSB6elN0YXJ0UmVhZDsKLQkJCXp6U3RhcnRSZWFkID0gMDsKLQkJfQotCi0JCS8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLQkJaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLQkJCS8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotCQkJY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotCQkJenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0JCX0KLQotCQkvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLQkJaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsIHp6QnVmZmVyLmxlbmd0aCAtIHp6RW5kUmVhZCk7Ci0KLQkJaWYgKG51bVJlYWQgPCAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXp6RW5kUmVhZCArPSBudW1SZWFkOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQkgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl6ekF0RU9GID0gdHJ1ZTsgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLQkJenpFbmRSZWFkID0genpTdGFydFJlYWQ7IC8qIGludmFsaWRhdGUgYnVmZmVyICovCi0KLQkJaWYgKHp6UmVhZGVyICE9IG51bGwpCi0JCQl6elJlYWRlci5jbG9zZSgpOwotCX0KLQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uIERvZXMgbm90IGNsb3NlIHRoZQotCSAqIG9sZCByZWFkZXIuCi0JICogCi0JICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIDxiPmNhbm5vdCA8L2I+Ci0JICogYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4gTGV4aWNhbCBzdGF0ZSBpcyBzZXQKLQkgKiB0byA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotCSAqIAotCSAqIEBwYXJhbSByZWFkZXIKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0JCXp6UmVhZGVyID0gcmVhZGVyOwotCQkvL3p6QXRCT0wgPSB0cnVlOwotCQl6ekF0RU9GID0gZmFsc2U7Ci0JCXp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkID0gMDsKLQkJenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zID0gMDsKLQkJeXlsaW5lID0geXljaGFyID0geXljb2x1bW4gPSAwOwotCQl6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLQkgKi8KLQkgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0JCXJldHVybiB6ekxleGljYWxTdGF0ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0JICogCi0JICogQHBhcmFtIG5ld1N0YXRlCi0JICogICAgICAgICAgICB0aGUgbmV3IGxleGljYWwgc3RhdGUKLQkgKi8KLQkgZmluYWwgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotCQl6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLQkgKi8KLQkgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcyAtIHp6U3RhcnRSZWFkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgbWF0Y2hlZCB0ZXh0LgotCSAqIAotCSAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gcG9zCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gQSB2YWx1ZSBmcm9tIDAgdG8KLQkgKiAgICAgICAgICAgIHl5bGVuZ3RoKCktMS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0JICovCi0JIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotCQlyZXR1cm4genpCdWZmZXJbenpTdGFydFJlYWQgKyBwb3NdOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotCQlyZXR1cm4genpNYXJrZWRQb3MgLSB6elN0YXJ0UmVhZDsKLQl9Ci0KLQotCS8qKgotCSAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotCSAqIAotCSAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgeXlwdXNoYmFjayhpbnQpCi0JICogYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aAotCSAqIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsCi0JICogc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZyAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkKLQkgKiBzY2FubmVyIGV0Yy4pLgotCSAqIAotCSAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lIGluIGVycm9yCi0JICogZmFsbGJhY2sgcnVsZXMuCi0JICogCi0JICogQHBhcmFtIGVycm9yQ29kZQotCSAqICAgICAgICAgICAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLQkJU3RyaW5nIG1lc3NhZ2U7Ci0JCXRyeSB7Ci0JCQltZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0JCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQltZXNzYWdlID0gWlpfRVJST1JfTVNHW1paX1VOS05PV05fRVJST1JdOwotCQl9Ci0KLQkJdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotCX0KLQotCi0JLyoqCi0JICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBudW1iZXIKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLiBUaGlzIG51bWJlciBtdXN0Ci0JICogICAgICAgICAgICBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0JICovCi0JIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0JCWlmIChudW1iZXIgPiB5eWxlbmd0aCgpKQotCQkJenpTY2FuRXJyb3IoWlpfUFVTSEJBQ0tfMkJJRyk7Ci0KLQkJenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotCX0KLQotCi0JLyoqCi0JICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwgdGhlIGVuZAotCSAqIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV4dCB0b2tlbgotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCWludCB6eklucHV0OwotCQlpbnQgenpBY3Rpb247Ci0KLQkJLy8gY2FjaGVkIGZpZWxkczoKLQkJaW50IHp6Q3VycmVudFBvc0w7Ci0JCWludCB6ek1hcmtlZFBvc0w7Ci0JCWludCB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotCQljaGFyW10genpCdWZmZXJMID0genpCdWZmZXI7Ci0JCWNoYXJbXSB6ekNNYXBMID0gWlpfQ01BUDsKLQotCQlpbnRbXSB6elRyYW5zTCA9IFpaX1RSQU5TOwotCQlpbnRbXSB6elJvd01hcEwgPSBaWl9ST1dNQVA7Ci0JCWludFtdIHp6QXR0ckwgPSBaWl9BVFRSSUJVVEU7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCXp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCi0JCQl6ekFjdGlvbiA9IC0xOwotCi0JCQl6ekN1cnJlbnRQb3NMID0genpDdXJyZW50UG9zID0genpTdGFydFJlYWQgPSB6ek1hcmtlZFBvc0w7Ci0KLQkJCXp6U3RhdGUgPSB6ekxleGljYWxTdGF0ZTsKLQotCi0JCQl6ekZvckFjdGlvbiA6IHsKLQkJCQl3aGlsZSAodHJ1ZSkgewotCi0JCQkJCWlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLQkJCQkJCXp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLQkJCQkJZWxzZSBpZiAoenpBdEVPRikgewotCQkJCQkJenpJbnB1dCA9IFlZRU9GOwotCQkJCQkJYnJlYWsgenpGb3JBY3Rpb247Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLQkJCQkJCXp6Q3VycmVudFBvcyA9IHp6Q3VycmVudFBvc0w7Ci0JCQkJCQl6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQkJCQkJCWJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLQkJCQkJCS8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotCQkJCQkJenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvczsKLQkJCQkJCXp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCQkJCQkJenpCdWZmZXJMID0genpCdWZmZXI7Ci0JCQkJCQl6ekVuZFJlYWRMID0genpFbmRSZWFkOwotCQkJCQkJaWYgKGVvZikgewotCQkJCQkJCXp6SW5wdXQgPSBZWUVPRjsKLQkJCQkJCQlicmVhayB6ekZvckFjdGlvbjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWludCB6ek5leHQgPSB6elRyYW5zTFt6elJvd01hcExbenpTdGF0ZV0gKyB6ekNNYXBMW3p6SW5wdXRdXTsKLQkJCQkJaWYgKHp6TmV4dCA9PSAtMSkKLQkJCQkJCWJyZWFrIHp6Rm9yQWN0aW9uOwotCQkJCQl6elN0YXRlID0genpOZXh0OwotCi0JCQkJCWludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotCQkJCQlpZiAoKHp6QXR0cmlidXRlcyAmIDEpID09IDEpIHsKLQkJCQkJCXp6QWN0aW9uID0genpTdGF0ZTsKLQkJCQkJCXp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0JCQkJCQlpZiAoKHp6QXR0cmlidXRlcyAmIDgpID09IDgpCi0JCQkJCQkJYnJlYWsgenpGb3JBY3Rpb247Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCQkJLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLQkJCXp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotCi0JCQlzd2l0Y2ggKHp6QWN0aW9uIDwgMCA/IHp6QWN0aW9uIDogWlpfQUNUSU9OW3p6QWN0aW9uXSkgewotCQkJCWNhc2UgMSA6IHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQljYXNlIDMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOiB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQljYXNlIDQgOgotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaWYgKHp6SW5wdXQgPT0gWVlFT0YgJiYgenpTdGFydFJlYWQgPT0genpDdXJyZW50UG9zKSB7Ci0JCQkJCQl6ekF0RU9GID0gdHJ1ZTsKLQkJCQkJCXsKLQkJCQkJCQl7Ci0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl6elNjYW5FcnJvcihaWl9OT19NQVRDSCk7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxSZWdpb25Db250ZXh0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MUmVnaW9uQ29udGV4dHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2MjJhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxSZWdpb25Db250ZXh0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gdXNlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTFJlZ2lvbkNvbnRleHRzIGV4dGVuZHMgWE1MUmVnaW9uQ29udGV4dCB7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTb3VyY2VQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFNvdXJjZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTE5ZmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFNvdXJjZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ2hhclNlcXVlbmNlUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5CbG9ja1RhZ1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIFRha2VzIGlucHV0IGZyb20gdGhlIEhUTUxUb2tlbml6ZXIgYW5kIGNyZWF0ZXMgYSB0YWcgbGlzdAotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxTb3VyY2VQYXJzZXIgaW1wbGVtZW50cyBSZWdpb25QYXJzZXIsIEJsb2NrVGFnUGFyc2VyLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIsIElSZWdpb25Db21wYXJpYmxlLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24gewotCS8vIG1hZGUgcHVibGljIHRvIGFpZCBhY2Nlc3MgZnJvbSBpbm5lciBjbGFzc2VzIGluIGhpZXJhcmNoeS4KLQkvLyBUT0RPOiBpbiBmdXR1cmUsIGZpZ3VyZSBvdXQgaG93IHRvIHNvbHZlIHdpdGhvdXQgZXhwb3NpbmcgZGF0YS4KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIGZDaGFyU2VxdWVuY2VTb3VyY2UgPSBudWxsOwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudElucHV0OwotCXByb3RlY3RlZCBpbnQgZk9mZnNldCA9IDA7Ci0JLy8gRE1XOiAyLzEyLzAzLiBSZW1vdmVkIHNvbWUgc3RhdGUgZGF0YSwgc2luY2Ugbm90IHJlYWxseSBuZWVkZWQsCi0JLy8gYW5kIHNpbmNlIGl0IGFkZGVkIGEgbG90IHRvIG92ZXJoZWFkIChzaW5jZSBzbyBtYW55IHJlZ2lvbnMgYXJlCi0JLy8gY3JlYXRlZC4KLQkvLyBwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGUgPSBudWxsOwotCS8vIHByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZOb2RlcyA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIExpc3QgZlJlZ2lvbnMgPSBudWxsOwotCS8vIHByb3RlY3RlZCBPYmplY3QgZklucHV0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdHJpbmdJbnB1dCA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3QgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzOwotCi0JcHJvdGVjdGVkIEJsb2NrVG9rZW5pemVyIGZUb2tlbml6ZXIgPSBudWxsOwotCXByb3RlY3RlZCBsb25nIHN0YXJ0VGltZTsKLQlwcm90ZWN0ZWQgbG9uZyBzdG9wVGltZTsKLQotCS8qKgotCSAqIEhUTUxTb3VyY2VQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MU291cmNlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHNpbXBsZSB1dGlsaXR5IHRvIGNvdW50IG5vZGVzLiBVc2VkIG9ubHkgZm9yIGRlYnVnCi0JICogc3RhdGVtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IF9jb3VudE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZXMpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gbm9kZXM7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJcmVzdWx0Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWdldFRva2VuaXplcigpLmFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGhhbmRsZXIpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9PSBudWxsKQotCQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMuYWRkKGhhbmRsZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luQmxvY2tTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7Ci0JCWdldFRva2VuaXplcigpLmJlZ2luQmxvY2tUYWdTY2FuKG5ld1RhZ05hbWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGUgPSBudWxsOwotCQlpZiAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpCi0JCQluZXdOb2RlID0gWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LlhNTF9CTE9DSyk7Ci0JCWVsc2UKLQkJCW5ld05vZGUgPSBYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuWE1MKTsKLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU5vZGVQYXJzZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGUpIHsKLQkJaWYgKGZDdXJyZW50Tm9kZSAhPSBudWxsICYmIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5zaXplKCk7IGkrKykKLQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIpIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5nZXQoaSkpLm5vZGVQYXJzZWQoZkN1cnJlbnROb2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBCbG9ja01hcmtlciBnZXRCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCQlMaXN0IG1hcmtlcnMgPSBnZXRUb2tlbml6ZXIoKS5nZXRCbG9ja01hcmtlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpIG1hcmtlcnMuZ2V0KGkpOwotCQkJaWYgKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCWlmIChtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWdOYW1lKSkKLQkJCQkJcmV0dXJuIG1hcmtlcjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSkKLQkJCQkJcmV0dXJuIG1hcmtlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7Ci0JCXJldHVybiBnZXRUb2tlbml6ZXIoKS5nZXRCbG9ja01hcmtlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZG5vZGUgPSBudWxsOwotCQlpZiAoaGVhZG5vZGUgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQloZWFkbm9kZSA9IHBhcnNlTm9kZXMoKTsKLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCXN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLS0gY3JlYXRpbmcgbm9kZXMgb2YgSVN0cnVjdHVyZWREb2N1bWVudCAtLSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIFRpbWUgcGFyc2UgYW5kIGluaXQgYWxsIHJlZ2lvbnM6ICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiAobXNlY3MpIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIiBmb3IgIiArIGZSZWdpb25zLnNpemUoKSArICIKLQkJCQkvLyBSZWdpb25zIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgIGFuZCAiICsgX2NvdW50Tm9kZXMoaGVhZG5vZGUpICsgIiBOb2RlcyIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBoZWFkbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbigpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldFRva2VuaXplcigpLmdldE5leHRUb2tlbigpOwotCQkJLy8gRE1XOiAyLzEyLzAzIFJlbW92ZWQgc3RhdGUKLQkJCS8vCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vCQkJZlJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkvLwkJfQotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfSBjYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiBpbnB1dCBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0VG9rZW5pemVyKCkuZ2V0T2Zmc2V0KCksIGUpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSArICIgKCIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICIpIiwgZSk7IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbCBsaXN0IG9mIGtub3duIHJlZ2lvbnMuIFR5cGljYWxseSBnZXROb2RlcyBzaG91bGQgYmUKLQkgKiB1c2VkIGluc3RlYWQgb2YgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCWlmICghZ2V0VG9rZW5pemVyKCkuaXNFT0YoKSkgewotCQkJaGVhZE5vZGUgPSBnZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJCS8vCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYXJzaW5nIGhhcyBub3QgZmluaXNoZWQiKTsKLQkJfQotCQkvLyBmb3IgbWVtb3J5IHJlY292ZXJ5LCB3ZSBhc3N1bWUgaWYgc29tZW9uZQotCQkvLyByZXF1ZXN0cyBhbGwgcmVnaW9ucywgd2UgY2FuIHJlc2V0IG91ciBiaWcKLQkJLy8gbWVtb3J5IGNvbnN1bWluZyBvYmplY3RzCi0JCS8vIGJ1dCB0aGUgbmV3ICJnZXRSZWdpb25zIiBtZXRob2QgaXMgdGhlbiBtb3JlIGV4cGVuc2l2ZS4KLQkJLy8gSSBkb24ndCB0aGluayBpdHMgdXNlZCBtdWNoLCB0aG91Z2guCi0JCUxpc3QgbG9jYWxSZWdpb25zTGlzdCA9IGdldFJlZ2lvbnMoaGVhZE5vZGUpOwotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGxvY2FsUmVnaW9uc0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFJlZ2lvbnMuCi0JICogCi0JICogQHBhcmFtIGhlYWROb2RlCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlKSB7Ci0JCUxpc3QgYWxsUmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zID0gY3VycmVudE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlUmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCWFsbFJlZ2lvbnMuYWRkKG5vZGVSZWdpb25zLmdldChpKSk7Ci0JCQl9Ci0JCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gYWxsUmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJfQotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGV4dCBmcm9tIHRoZSBjdXJyZW50IGlucHV0LiBUZXh0IGlzIG9ubHkgdmFsaWQgYmVmb3JlCi0JICogZ2V0Tm9kZXMoKSBoYXMgYmVlbiBjYWxsZWQgYW5kIG9ubHkgd2hlbiBhIHJhdyBTdHJpbmcgb3IgRG9jdW1lbnRSZWFkZXIKLQkgKiBpcyBnaXZlbiBhcyB0aGUgaW5wdXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsKSB7Ci0JCQlpbnQgc3RhcnQgPSBmT2Zmc2V0ICsgb2Zmc2V0OwotCQkJaW50IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwotCQkJdGV4dCA9IGZDaGFyU2VxdWVuY2VTb3VyY2Uuc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKTsKLQkJfSBlbHNlIGlmIChmRG9jdW1lbnRJbnB1dCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRleHQgPSBmRG9jdW1lbnRJbnB1dC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXRleHQgPSAiIjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChmU3RyaW5nSW5wdXQgPT0gbnVsbCB8fCBmU3RyaW5nSW5wdXQubGVuZ3RoKCkgPT0gMCB8fCBvZmZzZXQgKyBsZW5ndGggPiBmU3RyaW5nSW5wdXQubGVuZ3RoKCkgfHwgb2Zmc2V0IDwgMCkgewotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQkvLyBvZmZzZXQgaXMgZW50aXJlbHkgdmFsaWQgZHVyaW5nIHBhcnNpbmcgYXMgdGhlIHBhcnNlCi0JCQkJLy8gICBudW1iZXJzIGhhdmVuJ3QgYmVlbiBhZGp1c3RlZC4KLQkJCQl0ZXh0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEJsb2NrVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBYTUxUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnBhcnNlci5SZWdpb25QYXJzZXIjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVhNTFNvdXJjZVBhcnNlciBuZXdJbnN0YW5jZSA9IG5ldyBYTUxTb3VyY2VQYXJzZXIoKTsKLQkJbmV3SW5zdGFuY2Uuc2V0VG9rZW5pemVyKGdldFRva2VuaXplcigpLm5ld0luc3RhbmNlKCkpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkJd2hpbGUgKChyZWdpb24gPSBnZXROZXh0UmVnaW9uKCkpICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gdGhlc2UgdHlwZXMgKG1pZ2h0KSBkZW1hbmQgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZvciBlYWNoCi0JCQkvLyBvZiB0aGVtCi0JCQlpZiAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCQkvLyBtdWx0aXBsZSBibG9jayB0ZXh0cyBpbmRpY2F0ZWQgZW1iZWRkZWQgY29udGFpbmVyczsgbm8KLQkJCQkJLy8gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gbm90IGNvbnRpbnVpbmcgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdAotCQkJCQkJLy8gdGVybWluYXRlZAotCQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJfQotCQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy9yZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIE9QRU4gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCWVsc2UgaWYgKChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmlzRW5kZWQoKSkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdCB0ZXJtaW5hdGVkCi0JCQkJCWlmICghY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5zZXRUZXh0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0KLQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJfQotCQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCX0KLQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy9yZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgbmVpdGhlciBvcGVuIG5vciBjbG9zZQotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsganVzdCBhZGQgdG8gdGhlbQotCQkJZWxzZSBpZiAoKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQpKSB7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy9yZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgY2xvc2Ugb2ZmIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCS8vIGNsZWFubHkKLQkJCWVsc2UgaWYgKCh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB8fCAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQkvLyB0aGlzIGlzIGV4dHJlbWVseSByYXJlLCBidXQgdmFsaWQKLQkJCWVsc2UgaWYgKHR5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJLy8gcGFjayB0aGUgZW1iZWRkZWQgY29udGFpbmVyIHdpdGggdGhpcyByZWdpb24KLQkJCQlpZiAobGFzdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgbGFzdFJlZ2lvbjsKLQkJCQkJY29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQocmVnaW9uKTsKLQkJCQkJLy8gY29udGFpbmVycyBtdXN0IGhhdmUgcGFyZW50IHNldCAuLi4KLQkJCQkJLy8gc2V0dGluZyBmb3IgRUFDSCBzdWJyZWdpb24gaXMgcmVkdW5kZW50LCBidXQgbm90IHN1cmUKLQkJCQkJLy8gd2hlcmUgZWxzZSB0byBkbywgc28gd2lsbCBkbyBoZXJlIGZvciBub3cuCi0JCQkJCWNvbnRhaW5lci5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vcmVnaW9uLnNldFBhcmVudChjb250YWluZXIpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoY29udGFpbmVyLmdldExlbmd0aCgpIC0gcmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuYWRqdXN0TGVuZ3RoV2l0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWN1cnJlbnROb2RlLmFkanVzdExlbmd0aFdpdGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlVOREVGSU5FRCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gc2tpcCBvbiBhIHZlcnktZmlyc3QgcmVnaW9uIHNpdHVhdGlvbiBhcyB0aGUgZGVmYXVsdAotCQkJCS8vIGJlaGF2aW9yIGlzIGdvb2QgZW5vdWdoCi0JCQkJLy8gY29tYmluZSB3aXRoIHByZXZpb3VzIGlmIGFsc28gdW5kZWZpbmVkCi0JCQkJaWYgKGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCQkJY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmFkanVzdExlbmd0aFdpdGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoV2l0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCQkvLyBwcmV2aW91cyB3YXNuJ3QgdW5kZWZpbmVkCi0JCQkJZWxzZSB7Ci0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGlmIGFuIHVua25vd24gdHlwZSBpcyB0aGUgZmlyc3QgcmVnaW9uIGluIHRoZSBkb2N1bWVudCwKLQkJCQkvLyBlbnN1cmUgdGhhdCBhIG5vZGUgZXhpc3RzCi0JCQkJaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy9yZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQgcmVnaW9uIG9mIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlZCB0eXBlICIgKyByZWdpb24uZ2V0VHlwZSgpICsgIiBAICIgKyByZWdpb24uZ2V0U3RhcnQoKSArICJbIiArIHJlZ2lvbi5nZXRMZW5ndGgoKSArICJdIik7IC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJLy8gdGhlc2UgcmVnaW9ucyBhbHNvIGdldCB0aGVpciBvd24gbm9kZSwgc28gY2xvc2UgdGhlbSBjbGVhbmx5Ci0JCQkvLyBOT1RFOiB0aGVzZSByZWdpb25zIGhhdmUgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgY3JlYXRlZAotCQkJLy8gZm9yIHRoZW0gYWJvdmU7IGl0IG1heQotCQkJLy8gYmUgbW9yZSByZWFkYWJsZSBpZiB0aGF0IGlzIGhhbmRsZWQgaGVyZSBhcyB3ZWxsLCBidXQgdGhlCi0JCQkvLyBjdXJyZW50IGxheW91dAotCQkJLy8gZW5zdXJlcyB0aGF0IHRoZXkgb3BlbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHRoZSBzYW1lIHdheQotCQkJaWYgKCh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gY3VycmVudE5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJfQotCQkvL2ZTdHJpbmdJbnB1dCA9IG51bGw7Ci0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJlc2V0KCkgewotCQkvL2ZOb2RlcyA9IG51bGw7Ci0JCS8vZlJlZ2lvbnMgPSBudWxsOwotCQkvL2ZJbnB1dCA9IG51bGw7Ci0JCWZTdHJpbmdJbnB1dCA9IG51bGw7Ci0JCWZDaGFyU2VxdWVuY2VTb3VyY2UgPSBudWxsOwotCQlmRG9jdW1lbnRJbnB1dCA9IG51bGw7Ci0JCWZPZmZzZXQgPSAwOwotCQkvL2ZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JCS8vIERNVzogYWxzbyByZXNldCB0b2tlbml6ZXIgc28gaXQgZG9lc24ndCBob2xkIG9uCi0JCS8vIHRvIGxhcmdlIGFycmF5cwotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChuZXcgY2hhclswXSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5JUmVnaW9uQ29tcGFyaWJsZSNyZWdpb25NYXRjaGVzKGludCwKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJLy8gYnkgZGVmaW5pdGlvbgotCQlpZiAoc3RyaW5nVG9Db21wYXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCAmJiBmQ2hhclNlcXVlbmNlU291cmNlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBvbGQgZmFzaGlvbmVkIHdheXMKLQkJCVN0cmluZyB0ZXN0ID0gbnVsbDsKLQkJCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZkNoYXJTZXF1ZW5jZVNvdXJjZS5zdWJTZXF1ZW5jZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkudG9TdHJpbmcoKTsKLQkJCX0gZWxzZSBpZiAoZlN0cmluZ0lucHV0ICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBzdHJpbmdUb0NvbXBhcmUuZXF1YWxzKHRlc3QpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQkvLyBieSBkZWZpbml0aW9uCi0JCWlmIChzdHJpbmdUb0NvbXBhcmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsICYmIGZDaGFyU2VxdWVuY2VTb3VyY2UgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJcmVzdWx0ID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZkNoYXJTZXF1ZW5jZVNvdXJjZSkucmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBvbGQgZmFzaGlvbmVkIHdheXMKLQkJCVN0cmluZyB0ZXN0ID0gbnVsbDsKLQkJCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZkNoYXJTZXF1ZW5jZVNvdXJjZS5zdWJTZXF1ZW5jZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkudG9TdHJpbmcoKTsKLQkJCX0gZWxzZSBpZiAoZlN0cmluZ0lucHV0ICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBzdHJpbmdUb0NvbXBhcmUuZXF1YWxzSWdub3JlQ2FzZSh0ZXN0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlnZXRUb2tlbml6ZXIoKS5yZW1vdmVCbG9ja01hcmtlcihtYXJrZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWdldFRva2VuaXplcigpLnJlbW92ZUJsb2NrTWFya2VyKHRhZ05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5jb250YWlucyhoYW5kbGVyKSkKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5yZW1vdmUoaGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBpbnN0cmVhbSkgewotCQlwcmltUmVzZXQoKTsKLQkJLy9mSW5wdXQgPSBpbnN0cmVhbTsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQoaW5zdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0KHJlYWRlciwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIsIGludCBwb3NpdGlvbikgewotCQlwcmltUmVzZXQoKTsKLQkJZk9mZnNldCA9IHBvc2l0aW9uOwotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChyZWFkZXIsIHBvc2l0aW9uKTsKLQkJaWYgKHJlYWRlciBpbnN0YW5jZW9mIERvY3VtZW50UmVhZGVyKSB7Ci0JCQlJRG9jdW1lbnQgZG9jID0gKChEb2N1bWVudFJlYWRlcikgcmVhZGVyKS5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgewotCQkJCWZDaGFyU2VxdWVuY2VTb3VyY2UgPSAoQ2hhclNlcXVlbmNlKSBkb2M7Ci0JCQl9IGVsc2UgewotCQkJCS8vIG9sZCBmYXNoaW9uZWQgSURvY3VtZW50Ci0JCQkJZkRvY3VtZW50SW5wdXQgPSAoKERvY3VtZW50UmVhZGVyKSByZWFkZXIpLmdldERvY3VtZW50KCk7Ci0JCQl9Ci0KLQkJfSBlbHNlIGlmIChyZWFkZXIgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2VSZWFkZXIpIHsKLQkJCWZDaGFyU2VxdWVuY2VTb3VyY2UgPSAoKENoYXJTZXF1ZW5jZVJlYWRlcikgcmVhZGVyKS5nZXRPcmlnaW5hbFNvdXJjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4gVXNlIHRoaXMgdmVyc2lvbiB0byBhbGxvdyB0ZXh0IHRvIGJlIHJldHJpZXZlZAotCSAqIDxlbT5kdXJpbmc8L2VtPiBwYXJzaW5nLCBzdWNoIGFzIGJ5IHRoZQotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHNvdXJjZVN0cmluZykgewotCQlyZXNldChuZXcgU3RyaW5nUmVhZGVyKHNvdXJjZVN0cmluZykpOwotCQlmU3RyaW5nSW5wdXQgPSBzb3VyY2VTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4gVXNlIHRoaXMgdmVyc2lvbiB0byBhbGxvdyB0ZXh0IHRvIGJlIHJldHJpZXZlZAotCSAqIDxlbT5kdXJpbmc8L2VtPiBwYXJzaW5nLCBzdWNoIGFzIGJ5IHRoZQotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHNvdXJjZVN0cmluZywgaW50IHBvc2l0aW9uKSB7Ci0JCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHNvdXJjZVN0cmluZyk7Ci0JCXJlc2V0KHJlYWRlciwgcG9zaXRpb24pOwotCQlmU3RyaW5nSW5wdXQgPSBzb3VyY2VTdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRIYW5kbGVycygpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIpIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5nZXQoaSkpLnJlc2V0Tm9kZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBMaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycykgewotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUb2tlbml6ZXIoQmxvY2tUb2tlbml6ZXIgbmV3VG9rZW5pemVyKSB7Ci0JCS8vIERNVzogY2hhbmdlZCBmcm9tIHByaXZhdGUgdG8gcHJvdGVjdGVkLCBzbyBzdWJjbGFzcyBjb3VsZCB1c2UgaW4KLQkJLy8gY3JlYXRpb24gb2YgJ25ld0luc3RhbmNlJy4KLQkJZlRva2VuaXplciA9IG5ld1Rva2VuaXplcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4ZDRmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcC5YTUxKU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JcHVibGljIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmREaXJ0eUVuZChpbnQgZW5kKSB7Ci0JCS8vIENhdXRpb246IGhlcmUncyBvbmUgcGxhY2Ugd2UgaGF2ZSB0byBjYXN0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQpOwotCQkvLyBpZiBub3Qgd2VsbCBmb3JtZWQsIGdldCBvbmUgcGFzdCwgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlCi0JCWlmICgocmVzdWx0ICE9IG51bGwpICYmICghcmVzdWx0LmlzRW5kZWQoKSkpIHsKLQkJCWlmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JCS8vIGFsc28sIGdldCBvbmUgcGFzdCBpZiBleGFjdGx5IGVxdWFsIHRvIHRoZSBlbmQgKHRoaXMgd2FzIG5lZWRlZAotCQkvLyBhcyBhIHNpbXBsZSBmaXggdG8gd2hlbiBhIHdob2xlIGV4YWN0IHJlZ2lvbiBpcyBkZWxldGVkLgotCQkvLyB0aGVyZSdzIHByb2JhYmx5IGEgYmV0dGVyIHdheS4KLQkJaWYgKChyZXN1bHQgIT0gbnVsbCkgJiYgKGVuZCA9PSByZXN1bHQuZ2V0RW5kKCkpKSB7Ci0JCQlpZiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJCX0KLQkJfQotCi0JCS8vIDEyLzYvMjAwMSAtIFNpbmNlIHdlJ3ZlIGNoYW5nZWQgdGhlIHBhcnNlci9zY2FubmVyIHRvIGFsbG93IGEgbG9uZQotCQkvLyAnPCcgd2l0aG91dAotCQkvLyBhbHdheXMgaW50ZXJwcmV0dGluZyBpdCBhcyBzdGFydCBvZiBhIHRhZyBuYW1lLCB3ZSBuZWVkIHRvIGJlIGEKLQkJLy8gbGl0dGxlIGZhbmNpZXIsIGluIG9yZGVyCi0JCS8vIHRvICJza2lwIiBvdmVyIGFueSBwbGFpbiAnb2wgY29udGVudCBiZXR3ZWVuIHRoZSBsb25lICc8JyBhbmQgYW55Ci0JCS8vIHBvdGVudGlhbCBtZWF0aW5nCi0JCS8vIHJlZ2lvbnMgcGFzdCBwbGFpbiAnb2wgY29udGVudC4KLQkJaWYgKGlzTG9uZU9wZW5Gb2xsb3dlZEJ5Q29udGVudChyZXN1bHQpICYmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQl9Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihyZXN1bHQpOwotCQlkaXJ0eUVuZCA9IHJlc3VsdDsKLQotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluZERpcnR5U3RhcnQoaW50IHN0YXJ0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCS8vIGhldXJpc3RpYzogaWYgdGhlIHBvc3Rpb24gaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgc3RhcnQsIHRoZW4KLQkJLy8gZ28gYmFjayBvbmUgbW9yZSwgaWYgaXQgZXhpc3RzLiBUaGlzIHByZXZlbnRzIHByb2JsZW1zIHdpdGgKLQkJLy8gaW5zZXJ0aW9ucwotCQkvLyBvZiB0ZXh0IHRoYXQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBwcmV2aW91cyBub2RlIGluc3RlYWQgb2YKLQkJLy8gc2ltcGx5IGh1bmcKLQkJLy8gb2ZmIG9mIGl0IGFzIGEgc2VwYXJhdGUgbm9kZSAoZXguOiBYTUwgY29udGVudCBpbnNlcnRlZCByaWdodAotCQkvLyBiZWZvcmUgYW4gb3BlbgotCQkvLyBicmFja2V0IHNob3VsZCBiZWNvbWUgcGFydCBvZiB0aGUgcHJldmlvdXMgY29udGVudCBub2RlKQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSByZXN1bHQuZ2V0UHJldmlvdXMoKTsKLQkJCWlmICgocHJldmlvdXMgIT0gbnVsbCkgJiYgKCghKHByZXZpb3VzLmlzRW5kZWQoKSkpIHx8IChzdGFydCA9PSByZXN1bHQuZ2V0U3RhcnQoKSkpKSB7Ci0JCQkJcmVzdWx0ID0gcHJldmlvdXM7Ci0JCQl9Ci0JCQkvLyBJZiB3ZSBhcmUgbm93IGF0IHRoZSBlbmQgb2YgYSAidGFnIGRlcGVuZGVudCIgY29udGVudCBhcmVhIChvcgotCQkJLy8gSlNQIGFyZWEpCi0JCQkvLyB0aGVuIHdlIG5lZWQgdG8gYmFjayB1cCBhbGwgdGhlIHdheSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoYXQuCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBvdGVudGlhbCA9IHJlc3VsdDsKLQkJCXdoaWxlIChpc1BhcnRPZkJsb2NrUmVnaW9uKHBvdGVudGlhbCkpIHsKLQkJCQlwb3RlbnRpYWwgPSBwb3RlbnRpYWwuZ2V0UHJldmlvdXMoKTsKLQkJCX0KLQkJCWlmIChwb3RlbnRpYWwgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHBvdGVudGlhbDsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJZGlydHlTdGFydCA9IHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcnVsZSBpcywgdGhhdCBpcyB3ZSBhcmUgY29udGVudCwgcHJlY2VkZWQgYnkgbG9uZSA8LCB0aGVuIHdlIG5lZWQKLQkgKiB0byBhZHZhbmNlIG9uZSBtb3JlIGZvciBkaXJ0eSBlbmQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb25lT3BlbkZvbGxvd2VkQnlDb250ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSBmbGF0Tm9kZS5nZXRQcmV2aW91cygpOwotCQkJU3RyaW5nIHByZXZpb3VzVHlwZSA9IG51bGw7Ci0JCQlpZiAocHJldmlvdXMgIT0gbnVsbCkgewotCQkJCXByZXZpb3VzVHlwZSA9IHByZXZpb3VzLmdldFR5cGUoKTsKLQkJCX0KLQkJCWlmIChwcmV2aW91c1R5cGUgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IChwcmV2aW91c1R5cGUgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJ0T2ZCbG9ja1JlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQlyZXN1bHQgPSAodHlwZSA9PSBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfHwgdHlwZSA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxMWQ2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiBBIHNpbXBsZSBjbGFzcyB0byBnZW5lcmF0ZSBpbnN0YW5jZXMgb2YgU3RydWN0dXJlZFJlZ2lvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSlNQX0RJUkVDVElWRSA9IDEwMDM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWE1MID0gMTAwMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBYTUxfQkxPQ0sgPSAxMDAyOwotCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVJlZ2lvbihpbnQgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIFhNTCA6Ci0JCQkJaW5zdGFuY2UgPSBuZXcgWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFhNTF9CTE9DSyA6Ci0JCQkJaW5zdGFuY2UgPSBuZXcgQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFic3RyYWN0UmVnaW9uOjpjcmVhdGVSZWdpb24uIEludmFsaWQgdHlwZS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NDNkMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODgyICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEvMjcvMDUgNDo0OCBQTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLlhNTFBhcnNlclJlZ2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEvMjcvMDUgNDo0OCBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBYTUxSZWdpb25Db250ZXh0IHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfVEFHX05BTUUgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDE5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDE3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9URVhUID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfRU5EID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDMwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OID0gMjA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjJcMlwwXDFcMTRcMjJcMFwxXDE0XDFcMjFcMVwxMVwxXDUxIisKLSAgICAiXDFcMTZcMVwxN1wxXDEyXDFcMTNcMVwxNlwxXDE2XDFcMTZcMVwxNlwxXDE2XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDE1XDFcMTBcMVw1NFwxXDFcMVw0M1wxXDJcMVw0XDFcMTYiKwotICAgICJcMVwzMlwxXDU1XDFcMzBcMVwzMVwxXDM1XDFcNTJcMVwzNFwxXDM0XDFcNDBcMVwzNCIrCi0gICAgIlwxXDM0XDFcMjZcMVwyNVwxXDQyXDFcNDFcMVw0NVwxXDM0XDFcMzZcMVwzN1wxXDMzIisKLSAgICAiXDFcNTNcMlwzNFwxXDIzXDFcNDRcMVwzNFwxXDI3XDFcMFwxXDIwXDFcMFwxXDEwIisKLSAgICAiXDFcMFwxXDQ3XDFcNTVcMVw1NlwxXDUwXDFcMzVcMVw1MlwxXDM0XDFcMzRcMVw0MCIrCi0gICAgIlwyXDM0XDFcMjZcMVwyNVwxXDQyXDFcNDFcMVw0NVwxXDM0XDFcMzZcMVwzN1wxXDQ2IisKLSAgICAiXDFcNTNcMVwzNFwxXDM0XDFcMjRcMVw0NFwxXDM0XDFcMFwxXDBcNzJcMFwxXDYwIisKLSAgICAiXDEwXDBcMjdcNTdcMVwwXDM3XDU3XDFcMFw3Mlw1N1wyXDBcMTNcNTdcMlwwXDEwXDU3IisKLSAgICAiXDFcMFw2NVw1N1wxXDBcMTA0XDU3XDExXDBcNDRcNTdcM1wwXDJcNTdcNFwwXDM2XDU3IisKLSAgICAiXDcwXDBcMTMxXDU3XDIyXDBcN1w1N1wxNlwwXDJcNjBcNTZcMFwxMDZcNjBcMzJcMFwyXDYwIisKLSAgICAiXDQ0XDBcMVw1N1wxXDYwXDNcNTdcMVwwXDFcNTdcMVwwXDI0XDU3XDFcMFw1NFw1NyIrCi0gICAgIlwxXDBcN1w1N1wzXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1NyIrCi0gICAgIlwxXDBcMjJcNTdcMTVcMFwxNFw1N1wxXDBcMTAyXDU3XDFcMFwxNFw1N1wxXDBcNDRcNTciKwotICAgICJcMVwwXDRcNjBcMTFcMFw2NVw1N1wyXDBcMlw1N1wyXDBcMlw1N1wzXDBcMzRcNTciKwotICAgICJcMlwwXDEwXDU3XDJcMFwyXDU3XDY3XDBcNDZcNTdcMlwwXDFcNTdcN1wwXDQ2XDU3IisKLSAgICAiXDEyXDBcMjFcNjBcMVwwXDI3XDYwXDFcMFwzXDYwXDFcMFwxXDYwXDFcMFwyXDYwIisKLSAgICAiXDFcMFwxXDYwXDEzXDBcMzNcNTdcNVwwXDNcNTdcNTZcMFwzMlw1N1w1XDBcMVw2MCIrCi0gICAgIlwxMlw1N1wxMFw2MFwxNVwwXDEyXDYwXDZcMFwxXDYwXDEwN1w1N1wyXDBcNVw1N1wxXDAiKwotICAgICJcMTdcNTdcMVwwXDRcNTdcMVwwXDFcNTdcMTdcNjBcMlw1N1wyXDYwXDFcMFw0XDYwIisKLSAgICAiXDJcMFwxMlw2MFx1MDIwN1wwXDNcNjBcMVwwXDY1XDU3XDJcMFwxXDYwXDFcNTdcMjBcNjAiKwotICAgICJcM1wwXDRcNjBcM1wwXDEyXDU3XDJcNjBcMlwwXDEyXDYwXDIxXDBcM1w2MFwxXDAiKwotICAgICJcMTBcNTdcMlwwXDJcNTdcMlwwXDI2XDU3XDFcMFw3XDU3XDFcMFwxXDU3XDNcMCIrCi0gICAgIlw0XDU3XDJcMFwxXDYwXDFcMFw3XDYwXDJcMFwyXDYwXDJcMFwzXDYwXDExXDAiKwotICAgICJcMVw2MFw0XDBcMlw1N1wxXDBcM1w1N1wyXDYwXDJcMFwxMlw2MFwyXDU3XDIwXDAiKwotICAgICJcMVw2MFwyXDBcNlw1N1w0XDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDJcNTdcMVwwXDJcNTdcMlwwXDFcNjBcMVwwXDVcNjBcNFwwIisKLSAgICAiXDJcNjBcMlwwXDNcNjBcMTNcMFw0XDU3XDFcMFwxXDU3XDdcMFwxMlw2MFwyXDYwIisKLSAgICAiXDNcNTdcMTRcMFwzXDYwXDFcMFw3XDU3XDFcMFwxXDU3XDFcMFwzXDU3XDFcMCIrCi0gICAgIlwyNlw1N1wxXDBcN1w1N1wxXDBcMlw1N1wxXDBcNVw1N1wyXDBcMVw2MFwxXDU3IisKLSAgICAiXDEwXDYwXDFcMFwzXDYwXDFcMFwzXDYwXDIyXDBcMVw1N1w1XDBcMTJcNjBcMjFcMCIrCi0gICAgIlwzXDYwXDFcMFwxMFw1N1wyXDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDJcNTdcMlwwXDRcNTdcMlwwXDFcNjBcMVw1N1w2XDYwXDNcMFwyXDYwXDJcMCIrCi0gICAgIlwzXDYwXDEwXDBcMlw2MFw0XDBcMlw1N1wxXDBcM1w1N1w0XDBcMTJcNjBcMjJcMCIrCi0gICAgIlwyXDYwXDFcMFw2XDU3XDNcMFwzXDU3XDFcMFw0XDU3XDNcMFwyXDU3XDFcMCIrCi0gICAgIlwxXDU3XDFcMFwyXDU3XDNcMFwyXDU3XDNcMFwzXDU3XDNcMFwxMFw1N1wxXDAiKwotICAgICJcM1w1N1w0XDBcNVw2MFwzXDBcM1w2MFwxXDBcNFw2MFwxMVwwXDFcNjBcMTdcMCIrCi0gICAgIlwxMVw2MFwyMVwwXDNcNjBcMVwwXDEwXDU3XDFcMFwzXDU3XDFcMFwyN1w1N1wxXDAiKwotICAgICJcMTJcNTdcMVwwXDVcNTdcNFwwXDdcNjBcMVwwXDNcNjBcMVwwXDRcNjBcN1wwIisKLSAgICAiXDJcNjBcMTFcMFwyXDU3XDRcMFwxMlw2MFwyMlwwXDJcNjBcMVwwXDEwXDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFwyN1w1N1wxXDBcMTJcNTdcMVwwXDVcNTdcNFwwXDdcNjBcMVwwIisKLSAgICAiXDNcNjBcMVwwXDRcNjBcN1wwXDJcNjBcN1wwXDFcNTdcMVwwXDJcNTdcNFwwIisKLSAgICAiXDEyXDYwXDIyXDBcMlw2MFwxXDBcMTBcNTdcMVwwXDNcNTdcMVwwXDI3XDU3XDFcMCIrCi0gICAgIlwyMFw1N1w0XDBcNlw2MFwyXDBcM1w2MFwxXDBcNFw2MFwxMVwwXDFcNjBcMTBcMCIrCi0gICAgIlwyXDU3XDRcMFwxMlw2MFwyMjFcMFw1Nlw1N1wxXDBcMVw1N1wxXDYwXDJcNTdcN1w2MCIrCi0gICAgIlw1XDBcNlw1N1wxXDYwXDEwXDYwXDFcMFwxMlw2MFw0N1wwXDJcNTdcMVwwXDFcNTciKwotICAgICJcMlwwXDJcNTdcMVwwXDFcNTdcMlwwXDFcNTdcNlwwXDRcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDFcNTdcMVwwXDFcNTdcMlwwXDJcNTdcMVwwXDJcNTciKwotICAgICJcMVwwXDFcNTdcMVw2MFwyXDU3XDZcNjBcMVwwXDJcNjBcMVw1N1wyXDBcNVw1NyIrCi0gICAgIlwxXDBcMVw2MFwxXDBcNlw2MFwyXDBcMTJcNjBcNzZcMFwyXDYwXDZcMFwxMlw2MCIrCi0gICAgIlwxM1wwXDFcNjBcMVwwXDFcNjBcMVwwXDFcNjBcNFwwXDJcNjBcMTBcNTdcMVwwIisKLSAgICAiXDQxXDU3XDdcMFwyNFw2MFwxXDBcNlw2MFw0XDBcNlw2MFwxXDBcMVw2MFwxXDAiKwotICAgICJcMjVcNjBcM1wwXDdcNjBcMVwwXDFcNjBcMzQ2XDBcNDZcNTdcMTJcMFw0N1w1N1wxMVwwIisKLSAgICAiXDFcNTdcMVwwXDJcNTdcMVwwXDNcNTdcMVwwXDFcNTdcMVwwXDJcNTdcMVwwIisKLSAgICAiXDVcNTdcNTFcMFwxXDU3XDFcMFwxXDU3XDFcMFwxXDU3XDEzXDBcMVw1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wzXDBcMlw1N1wzXDBcMVw1N1w1XDBcM1w1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wzXDBcMlw1N1wzXDAiKwotICAgICJcMlw1N1wxXDBcMVw1N1w1MFwwXDFcNTdcMTFcMFwxXDU3XDJcMFwxXDU3XDJcMCIrCi0gICAgIlwyXDU3XDdcMFwyXDU3XDFcMFwxXDU3XDFcMFw3XDU3XDUwXDBcMVw1N1w0XDAiKwotICAgICJcMVw1N1wxMFwwXDFcNTdcdTBjMDZcMFwyMzRcNTdcNFwwXDEzMlw1N1w2XDBcMjZcNTdcMlwwIisKLSAgICAiXDZcNTdcMlwwXDQ2XDU3XDJcMFw2XDU3XDJcMFwxMFw1N1wxXDBcMVw1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wxXDBcMzdcNTdcMlwwXDY1XDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwxXDU3XDNcMFwzXDU3XDFcMFw3XDU3XDNcMFw0XDU3XDJcMFw2XDU3XDRcMCIrCi0gICAgIlwxNVw1N1w1XDBcM1w1N1wxXDBcN1w1N1wzMjNcMFwxNVw2MFw0XDBcMVw2MFwxMDRcMCIrCi0gICAgIlwxXDU3XDNcMFwyXDU3XDJcMFwxXDU3XDEyMVwwXDNcNTdcdTBlODJcMFwxXDYwXDFcMCIrCi0gICAgIlwxXDU3XDMxXDBcMTFcNTdcNlw2MFwxXDBcNVw2MFwxM1wwXDEyNFw1N1w0XDBcMlw2MCIrCi0gICAgIlwyXDBcMlw2MFwyXDBcMTMyXDU3XDFcMFwzXDYwXDZcMFw1MFw1N1x1MWNkM1wwXHU1MWE2XDU3IisKLSAgICAiXHUwYzVhXDBcdTJiYTRcNTdcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA0OSwgICAgOTgsICAgMTQ3LCAgIDE5NiwgICAyNDUsICAgMjk0LCAgIDM0MywgICAzOTIsICAgNDQxLCAKLSAgICAgIDQ5MCwgICA1MzksICAgNTg4LCAgIDYzNywgICA2ODYsICAgNzM1LCAgIDc4NCwgICA4MzMsICAgODgyLCAgIDkzMSwgCi0gICAgICA5ODAsICAxMDI5LCAgMTA3OCwgIDExMjcsICAxMTc2LCAgMTIyNSwgIDEyNzQsICAxMzIzLCAgMTM3MiwgIDE0MjEsIAotICAgICAxNDcwLCAgMTUxOSwgIDE1NjgsICAxNjE3LCAgMTY2NiwgIDE3MTUsICAxNzY0LCAgMTcxNSwgIDE3NjQsICAxODEzLCAKLSAgICAgMTcxNSwgIDE3MTUsICAxNzY0LCAgMTg2MiwgIDE5MTEsICAxOTYwLCAgMjAwOSwgIDIwNTgsICAyMTA3LCAgMjE1NiwgCi0gICAgIDE3MTUsICAxNzY0LCAgMjIwNSwgIDIyNTQsICAyMzAzLCAgMTcxNSwgIDIzNTIsICAyMzUyLCAgMjQwMSwgIDI0NTAsIAotICAgICAyNDk5LCAgMjIwNSwgIDE3MTUsICAyNTQ4LCAgMjU5NywgIDE3MTUsICAyNjQ2LCAgMjY5NSwgIDI3NDQsICAyNzkzLCAKLSAgICAgMjg0MiwgIDI4OTEsICAxNzE1LCAgMjk0MCwgIDI5ODksICAzMDM4LCAgMzA4NywgIDE3MTUsICAzMTM2LCAgMzE4NSwgCi0gICAgIDMyMzQsICAzMjgzLCAgMzMzMiwgIDE3MTUsICAzMzgxLCAgMzQzMCwgIDM0NzksICAzNTI4LCAgMzU3NywgIDM2MjYsIAotICAgICAzNjc1LCAgMzcyNCwgIDM3MjQsICAzNzczLCAgMzgyMiwgIDM4NzEsICAzOTIwLCAgMzkyMCwgIDM5NjksICA0MDE4LCAKLSAgICAgNDA2NywgIDQxMTYsICA0MTE2LCAgNDE2NSwgIDQyMTQsICA0MjYzLCAgNDMxMiwgIDE3MTUsICA0MzYxLCAgNDM2MSwgCi0gICAgIDQ0MTAsICA0NDU5LCAgNDUwOCwgIDQ1NTcsICAxNzE1LCAgMTcxNSwgIDE3NjQsICAxNzE1LCAgMTcxNSwgIDQ2MDYsIAotICAgICA0NjU1LCAgNDcwNCwgIDQ3NTMsICA0ODAyLCAgNDg1MSwgIDQ5MDAsICA0OTQ5LCAgMTcxNSwgIDQ5OTgsICA1MDQ3LCAKLSAgICAgMTcxNSwgIDE3MTUsICAyMzUyLCAgNTA5NiwgIDI0NTAsICAxNzE1LCAgNTE0NSwgIDI0OTksICAyNTQ4LCAgMjY0NiwgCi0gICAgIDI2OTUsICA1MTk0LCAgMjc0NCwgIDE3MTUsICA1MjQzLCAgMjc5MywgIDE3MTUsICAzMTM2LCAgNTI5MiwgIDMyMzQsIAotICAgICAxNzE1LCAgNTM0MSwgIDMyODMsICA0NjA2LCAgNTM5MCwgIDU0MzksICA1NDg4LCAgMzUyOCwgIDE3MTUsICA1NTM3LCAKLSAgICAgNTU4NiwgIDM3MjQsICA1NjM1LCAgMzc3MywgIDE3MTUsICA1Njg0LCAgNTczMywgIDU3ODIsICA1NzgyLCAgNTgzMSwgCi0gICAgIDU4ODAsICAzODcxLCAgMzcyNCwgIDM5MjAsICA1OTI5LCAgMzk2OSwgIDE3MTUsICA1OTc4LCAgNDAxOCwgIDQwNjcsIAotICAgICAzOTIwLCAgNDExNiwgIDYwMjcsICA0MTY1LCAgMTcxNSwgIDYwNzYsICA2MTI1LCAgNjE3NCwgIDYxNzQsICA2MjIzLCAKLSAgICAgNjI3MiwgIDYzMjEsICA0MzYxLCAgNjM3MCwgIDQ0MTAsICAxNzE1LCAgNjQxOSwgIDY0NjgsICA2NTE3LCAgNjUxNywgCi0gICAgIDY1NjYsICA2NjE1LCAgNjY2NCwgIDY3MTMsICA2NzYyLCAgNjgxMSwgIDY4NjAsICAxNzE1LCAgNjkwOSwgIDY5NTgsIAotICAgICAxNzE1LCAgMTcxNSwgIDE3MTUsICAyMDA5LCAgNzAwNywgIDcwNTYsICA3MTA1LCAgNzE1NCwgIDcyMDMsICA3MjUyLCAKLSAgICAgNTY4NCwgIDczMDEsICA3MzAxLCAgNjA3NiwgIDczNTAsICA3MzUwLCAgNzM5OSwgIDY0MTksICA3NDQ4LCAgNzQ0OCwgCi0gICAgIDc0OTcsICAxNzE1LCAgNzU0NiwgIDc1OTUsICAxNzE1LCAgNzY0NCwgIDc2OTMsICA3NzQyLCAgNzc5MSwgIDc4NDAsIAotICAgICA3ODg5LCAgNzkzOCwgIDU4MzEsICA2MjIzLCAgNzk4NywgIDY1NjYsICA4MDM2LCAgODA4NSwgIDgxMzQsICA4MTgzLCAKLSAgICAgODIzMiwgIDgyODEsICA4MzMwLCAgODM3OSwgIDg0MjgsICA4NDc3LCAgODUyNiwgIDg1NzUsICA4NjI0LCAgODY3MywgCi0gICAgIDg3MjIsICAxNzE1LCAgMTcxNSwgIDg3NzEsICA4ODIwLCAgODg2OSwgIDg5MTgsICAxNzE1LCAgMTcxNSwgIDE3MTUsIAotICAgICA4OTY3LCAgOTAxNiwgIDkwNjUsICA5MTE0LCAgOTE2MywgIDE3MTUsICA0MjYzLCAgNDUwOAotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNDBcMVw0MVwxMFw0MFwxXDQyXDRcNDBcMVw0M1w0MVw0MFwxXDQ0IisKLSAgICAiXDFcNDVcNTdcNDRcMVw0NlwxXDQ3XDE2XDQ2XDFcNTBcMVw0NlwxXDUxIisKLSAgICAiXDM2XDQ2XDFcNTJcMVw1M1w1N1w1MlwxXDQ2XDFcNDdcNVw0NlwxXDU0IisKLSAgICAiXDEyXDQ2XDFcNTFcMzdcNDZcMVw0N1wyXDQ2XDFcNTVcMVw1NlwyXDQ2IisKLSAgICAiXDFcNTdcM1w0NlwxXDU2XDVcNDZcMVw1NlwyXDYwXDJcNTdcMVw0NiIrCi0gICAgIlwxMFw1N1wxXDYxXDJcNTdcMVw0Nlw1XDU3XDFcNDZcMlw1N1wxXDQ2IisKLSAgICAiXDNcNTdcMlw0NlwxXDQ3XDJcNDZcMVw1NVwxXDYyXDZcNDZcMVw2MiIrCi0gICAgIlw1XDQ2XDFcNjJcMzZcNDZcMVw2M1wxXDY0XDJcNjNcMVw2NVwxNVw2MyIrCi0gICAgIlwxXDUxXDM2XDYzXDFcNDZcMVw0N1wyXDQ2XDFcNjZcMVw1NlwyXDQ2IisKLSAgICAiXDFcNjdcM1w0NlwxXDU2XDVcNDZcMVw1Nlw0XDY3XDFcNDZcMTNcNjciKwotICAgICJcMVw0Nlw1XDY3XDFcNDZcMlw2N1wxXDQ2XDNcNjdcMlw0NlwxXDQ3IisKLSAgICAiXDJcNDZcMVw2NlwxXDU2XDJcNDZcMVw2N1wzXDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDRcNjdcMVw0NlwxM1w2N1wxXDcwXDVcNjdcMVw0NlwyXDY3IisKLSAgICAiXDFcNDZcM1w2N1wxXDQ2XDFcNzFcMVw0N1wxXDQ2XDFcNzJcMVw3MyIrCi0gICAgIlwxXDU2XDNcNzFcMVw3NFwxXDcxXDFcNzVcMVw1Nlw1XDcxXDFcNTYiKwotICAgICJcMzZcNzFcMVw0NlwxXDQ3XDJcNDZcMVw3NlwxNVw0NlwxXDUxXDM3XDQ2IisKLSAgICAiXDFcNDdcMVw3N1wxXDEwMFwxXDQ2XDFcNTZcMlw0NlwxXDEwMVwzXDQ2IisKLSAgICAiXDFcNTZcNVw0NlwxXDU2XDRcMTAxXDFcNDZcMTNcMTAxXDFcNDZcNVwxMDEiKwotICAgICJcMVw0NlwyXDEwMVwxXDQ2XDNcMTAxXDJcNDZcMVw0N1wxXDc3XDFcMTAwIisKLSAgICAiXDFcNDZcMVw1NlwyXDQ2XDFcMTAxXDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNFwxMDFcMVw0NlwxM1wxMDFcMVwxMDJcNVwxMDFcMVw0NlwyXDEwMVwxXDQ2IisKLSAgICAiXDNcMTAxXDFcNDZcMVwxMDNcMVw0N1wxXDc3XDFcMTA0XDFcMTAzXDFcNTYiKwotICAgICJcM1wxMDNcMVwxMDVcMVwxMDNcMVwxMDZcMVw1Nlw1XDEwM1wxXDU2XDM2XDEwMyIrCi0gICAgIlwxXDQ2XDFcNDdcM1w0NlwxXDU2XDZcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcMzZcNDZcMVwxMDdcMVwxMTBcMVwxMTFcMVwxMTJcNFwxMDdcMVwxMTNcMTJcMTA3IisKLSAgICAiXDRcMTE0XDFcMTA3XDEzXDExNFwxXDEwN1w1XDExNFwxXDEwN1wyXDExNFwxXDEwNyIrCi0gICAgIlwzXDExNFwxXDEwN1wxXDQ2XDFcMTEwXDFcMTExXDFcMTEyXDFcNDZcMVw1NiIrCi0gICAgIlwyXDQ2XDFcMTE1XDNcNDZcMVw1Nlw1XDQ2XDFcNTZcNFwxMTVcMVw0NiIrCi0gICAgIlwxM1wxMTVcMVw0Nlw1XDExNVwxXDQ2XDJcMTE1XDFcNDZcM1wxMTVcMlw0NiIrCi0gICAgIlwxXDExMFwxXDExMVwxXDExMlwxXDQ2XDFcNTZcMlw0NlwxXDExNVwzXDQ2IisKLSAgICAiXDFcNTZcNVw0NlwxXDU2XDRcMTE1XDFcNDZcMTNcMTE1XDFcMTE2XDVcMTE1IisKLSAgICAiXDFcNDZcMlwxMTVcMVw0NlwzXDExNVwxXDQ2XDFcMTE3XDFcMTEwXDFcMTExIisKLSAgICAiXDFcMTIwXDFcMTE3XDFcNTZcM1wxMTdcMVwxMjFcMVwxMTdcMVwxMjJcMVw1NiIrCi0gICAgIlw1XDExN1wxXDU2XDM2XDExN1wxXDQ2XDFcMTIzXDFcMTI0XDJcNDZcMVw1NiIrCi0gICAgIlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDZcNDZcMVwxMjVcMVwxMjZcMlw0NiIrCi0gICAgIlwxXDEyN1wxMVw0NlwxXDEyNlwxXDEyNVwxMVw0NlwxXDQ3XDFcMTI0XDJcNDYiKwotICAgICJcMVw1Nlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDRcNDZcMVwxMzBcMzJcNDYiKwotICAgICJcMVw0N1wxXDEyNFwyXDQ2XDFcNTZcMlw0NlwxXDEzMVwzXDQ2XDFcNTYiKwotICAgICJcNVw0NlwxXDU2XDRcMTMxXDFcMTMwXDEzXDEzMVwxXDQ2XDVcMTMxXDFcNDYiKwotICAgICJcMlwxMzFcMVw0NlwzXDEzMVwyXDQ2XDFcNDdcMVwxMjRcMlw0NlwxXDU2IisKLSAgICAiXDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNFw0NlwxXDEzMFw3XDQ2XDFcMTMyIisKLSAgICAiXDVcNDZcMVwxMzNcMTNcNDZcMVwxMzRcMVw0N1wxXDEyNFwxXDEzNVwxXDEzNCIrCi0gICAgIlwxXDU2XDNcMTM0XDFcMTM2XDFcMTM0XDFcMTM3XDFcNTZcNVwxMzRcMVw1NiIrCi0gICAgIlw0XDEzNFwxXDE0MFwzMVwxMzRcMVwxNDFcMVw0N1wxXDEyNFwxXDE0MlwxXDE0MSIrCi0gICAgIlwxXDU2XDNcMTQxXDFcMTQzXDFcMTQxXDFcMTQ0XDFcNTZcNVwxNDFcMVw1NiIrCi0gICAgIlw0XDE0MVwxXDE0NVwzMVwxNDFcMVwxNDZcMVw0N1wxXDEyNFwxXDE0N1wxXDE0NiIrCi0gICAgIlwxXDU2XDNcMTQ2XDFcMTUwXDFcMTQ2XDFcMTUxXDFcNTZcNVwxNDZcMVw1NiIrCi0gICAgIlwzNlwxNDZcMVwxNTJcMVwxNTNcMVwxNTRcNTZcMTUyXDFcMTU1XDFcNDdcMVwxMjQiKwotICAgICJcMVwxNTZcMVwxNTVcMVw1NlwzXDE1NVwxXDE1N1wxXDE1NVwxXDE2MFwxXDU2IisKLSAgICAiXDVcMTU1XDFcNTZcMzZcMTU1XDFcMTYxXDFcMTYyXDFcMTYzXDU2XDE2MVwxXDE2NCIrCi0gICAgIlwxXDE2NVw1N1wxNjRcMVw0MFwxXDBcMTBcNDBcMVwwXDRcNDBcMVwwIisKLSAgICAiXDQxXDQwXDNcMFwxXDE2NlwxXDE2N1wxNFwwXDFcMTcwXDQ0XDBcMVwxNzEiKwotICAgICJcMlwwXDFcMTcyXDNcMFwxXDE3MVw1XDBcMVwxNzFcNFwxNzJcMVwwIisKLSAgICAiXDEzXDE3MlwxXDBcNVwxNzJcMVwxNzNcMlwxNzJcMVwwXDNcMTcyXDZcMCIrCi0gICAgIlwxXDE3MVwyXDBcMVwxNzRcM1wwXDFcMTcxXDVcMFwxXDE3MVw0XDE3NCIrCi0gICAgIlwxXDBcMTNcMTc0XDFcMFw1XDE3NFwxXDBcMlwxNzRcMVwwXDNcMTc0IisKLSAgICAiXDEwM1wwXDFcMTc1XDU3XDBcMVwxNzZcNDdcMFwxXDE3N1w1M1wwXDFcMjAwIisKLSAgICAiXDYzXDBcMVw1Nlw2XDBcMVw1Nlw1XDBcMVw1Nlw0NFwwXDNcNTciKwotICAgICJcNFwwXDFcNTdcNVwwXDRcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDFcMjAxXDFcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDFcMjAyXDFcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDVcMFwxXDYyXDZcMFwxXDYyIisKLSAgICAiXDVcMFwxXDYyXDQwXDBcMVwyMDNcNjBcMFwxXDIwNFw2NFwwXDNcNjciKwotICAgICJcNFwwXDFcNjdcNVwwXDRcNjdcMVwwXDEzXDY3XDFcMFw1XDY3IisKLSAgICAiXDFcMFwyXDY3XDFcMFw0XDY3XDFcNzFcMlwwXDFcMjA1XDFcNzEiKwotICAgICJcMVwwXDNcNzFcMVwwXDFcNzFcMlwwXDVcNzFcMVwwXDM3XDcxIisKLSAgICAiXDFcMFwxXDIwNFwxXDIwNVwxXDcxXDFcMFwzXDcxXDFcMFwxXDcxIisKLSAgICAiXDJcMFw1XDcxXDFcMFwzNlw3MVwxXDc0XDFcMFwxXDIwNlwxXDIwNyIrCi0gICAgIlwxXDc0XDFcMjA2XDNcNzRcMVwyMTBcMVw3NFwyXDIwNlw1XDc0XDFcMjA2IisKLSAgICAiXDM2XDc0XDFcNzVcMVwwXDFcMjExXDFcMjEyXDFcNzVcMVwyMTFcM1w3NSIrCi0gICAgIlwxXDIxMVwxXDc1XDFcMjEwXDFcMjExXDVcNzVcMVwyMTFcMzZcNzVcMlwwIisKLSAgICAiXDFcNzdcMVwyMTNcNjNcMFwzXDEwMVw0XDBcMVwxMDFcNVwwXDRcMTAxIisKLSAgICAiXDFcMFwxM1wxMDFcMVwwXDVcMTAxXDFcMFwyXDEwMVwxXDBcNFwxMDEiKwotICAgICJcMVwxMDNcMlwwXDFcMjE0XDFcMTAzXDFcMFwzXDEwM1wxXDBcMVwxMDMiKwotICAgICJcMlwwXDVcMTAzXDFcMFwzN1wxMDNcMVwwXDFcNzdcMVwyMTVcMVwxMDMiKwotICAgICJcMVwwXDNcMTAzXDFcMFwxXDEwM1wyXDBcNVwxMDNcMVwwXDM2XDEwMyIrCi0gICAgIlwxXDEwNVwxXDBcMVwyMTZcMVwyMTdcMVwxMDVcMVwyMTZcM1wxMDVcMVwyMjAiKwotICAgICJcMVwxMDVcMlwyMTZcNVwxMDVcMVwyMTZcMzZcMTA1XDFcMTA2XDFcMFwxXDIyMSIrCi0gICAgIlwxXDIyMlwxXDEwNlwxXDIyMVwzXDEwNlwxXDIyMVwxXDEwNlwxXDIyMFwxXDIyMSIrCi0gICAgIlw1XDEwNlwxXDIyMVwzNlwxMDZcMVwxMDdcM1wwXDE3XDEwN1w0XDBcMVwxMDciKwotICAgICJcMTNcMFwxXDEwN1w1XDBcMVwxMDdcMlwwXDFcMTA3XDNcMFwxXDEwNyIrCi0gICAgIlwzXDBcMVwxNjZcMTVcMFwxXDE3MFw0MVwwXDFcMjIzXDU2XDBcMVwxMDciKwotICAgICJcM1wwXDJcMTA3XDNcMTEzXDRcMTA3XDFcMTEzXDVcMTA3XDRcMTE0XDFcMTA3IisKLSAgICAiXDEzXDExNFwxXDEwN1w1XDExNFwxXDEwN1wyXDExNFwxXDEwN1wzXDExNFwxXDExMyIrCi0gICAgIlw2XDBcM1wxMTRcNFwwXDFcMTE0XDVcMFw0XDExNFwxXDBcMTNcMTE0IisKLSAgICAiXDFcMFw1XDExNFwxXDBcMlwxMTRcMVwwXDRcMTE0XDZcMFwzXDExNSIrCi0gICAgIlw0XDBcMVwxMTVcNVwwXDRcMTE1XDFcMFwxM1wxMTVcMVwwXDVcMTE1IisKLSAgICAiXDFcMFwyXDExNVwxXDBcNFwxMTVcMVwxMTdcMlwwXDFcMjI0XDFcMTE3IisKLSAgICAiXDFcMFwzXDExN1wxXDBcMVwxMTdcMlwwXDVcMTE3XDFcMFwzN1wxMTciKwotICAgICJcMVwwXDFcMjIzXDFcMjI0XDFcMTE3XDFcMFwzXDExN1wxXDBcMVwxMTciKwotICAgICJcMlwwXDVcMTE3XDFcMFwzNlwxMTdcMVwxMjFcMVwwXDFcMjI1XDFcMjI2IisKLSAgICAiXDFcMTIxXDFcMjI1XDNcMTIxXDFcMjI3XDFcMTIxXDJcMjI1XDVcMTIxXDFcMjI1IisKLSAgICAiXDM2XDEyMVwxXDEyMlwxXDBcMVwyMzBcMVwyMzFcMVwxMjJcMVwyMzBcM1wxMjIiKwotICAgICJcMVwyMzBcMVwxMjJcMVwyMjdcMVwyMzBcNVwxMjJcMVwyMzBcMzZcMTIyXDNcMCIrCi0gICAgIlwxXDE2NlwxNVwwXDFcMjMyXDEwMFwwXDFcMjMzXDUyXDBcMVwyMzRcMTJcMCIrCi0gICAgIlwxXDIzNFw0MFwwXDFcMjM1XDMyXDBcMjBcMjM2XDFcMjM3XDQwXDIzNlw2XDAiKwotICAgICJcM1wxMzFcNFwwXDFcMTMxXDVcMFw0XDEzMVwxXDBcMTNcMTMxXDFcMCIrCi0gICAgIlw1XDEzMVwxXDBcMlwxMzFcMVwwXDRcMTMxXDQ0XDBcMVwyNDBcNjdcMCIrCi0gICAgIlwxXDI0MVw1XDBcMVwxMzRcMlwwXDFcMjQyXDFcMTM0XDFcMFwzXDEzNCIrCi0gICAgIlwxXDBcMVwxMzRcMlwwXDVcMTM0XDFcMFwzNlwxMzRcMVwxMzZcMVwwIisKLSAgICAiXDFcMjQzXDFcMjQ0XDFcMTM2XDFcMjQzXDNcMTM2XDFcMjQ1XDFcMTM2XDJcMjQzIisKLSAgICAiXDVcMTM2XDFcMjQzXDM2XDEzNlwxXDI0NlwxXDBcMVwyNDdcMVwyNTBcMVwyNTEiKwotICAgICJcMVwyNDdcM1wyNTFcMVwyNDdcMVwyNDZcMVwyNTJcMVwyNTNcM1wyNTFcMVwyNDYiKwotICAgICJcMVwyNTFcMVwyNTNcNFwyNTFcMVwyNDZcMjdcMjUxXDJcMjQ2XDFcMTQwXDJcMjM2IisKLSAgICAiXDFcMjU0XDFcMTQwXDFcMjM2XDNcMTQwXDFcMjM2XDFcMTQwXDJcMjM2XDNcMTQwIisKLSAgICAiXDFcMjU1XDFcMTQwXDFcMjM2XDM2XDE0MFwxXDE0MVwyXDBcMVwyNTZcMVwxNDEiKwotICAgICJcMVwwXDNcMTQxXDFcMFwxXDE0MVwyXDBcNVwxNDFcMVwwXDM2XDE0MSIrCi0gICAgIlwxXDE0M1wyXDI1N1wxXDI2MFwxXDE0M1wxXDI1N1wzXDE0M1wxXDI2MVwxXDE0MyIrCi0gICAgIlwyXDI1N1w1XDE0M1wxXDI1N1wzNlwxNDNcMVwxNDRcMlwyNjJcMVwyNjNcMVwxNDQiKwotICAgICJcMVwyNjJcM1wxNDRcMVwyNjJcMVwxNDRcMVwyNjFcMVwyNjJcNVwxNDRcMVwyNjIiKwotICAgICJcMzZcMTQ0XDFcMTQ1XDJcMjM2XDFcMjY0XDFcMTQ1XDFcMjM2XDNcMTQ1XDFcMjM2IisKLSAgICAiXDFcMTQ1XDJcMjM2XDNcMTQ1XDFcMjY1XDFcMTQ1XDFcMjM2XDM2XDE0NVwxXDE0NiIrCi0gICAgIlwyXDBcMVwyNjZcMVwxNDZcMVwwXDNcMTQ2XDFcMFwxXDE0NlwyXDAiKwotICAgICJcNVwxNDZcMVwwXDM2XDE0NlwxXDE1MFwxXDBcMVwyNjdcMVwyNzBcMVwxNTAiKwotICAgICJcMVwyNjdcM1wxNTBcMVwyNzFcMVwxNTBcMlwyNjdcNVwxNTBcMVwyNjdcMzZcMTUwIisKLSAgICAiXDFcMjcyXDFcMFwxXDI3M1wxXDI3NFwxXDI3NVwxXDI3M1wzXDI3NVwxXDI3MyIrCi0gICAgIlwxXDI3MlwxXDI3NlwxXDI3N1wzXDI3NVwxXDI3MlwxXDI3NVwxXDI3N1w0XDI3NSIrCi0gICAgIlwxXDI3MlwyN1wyNzVcMlwyNzJcMlwxNTJcMVwwXDYwXDE1MlwxXDBcMTZcMTUyIisKLSAgICAiXDFcMzAwXDM3XDE1MlwxXDE1NVwyXDBcMVwzMDFcMVwxNTVcMVwwXDNcMTU1IisKLSAgICAiXDFcMFwxXDE1NVwyXDBcNVwxNTVcMVwwXDM2XDE1NVwxXDE1N1wxXDAiKwotICAgICJcMVwzMDJcMVwzMDNcMVwxNTdcMVwzMDJcM1wxNTdcMVwzMDRcMVwxNTdcMlwzMDIiKwotICAgICJcNVwxNTdcMVwzMDJcMzZcMTU3XDFcMzA1XDFcMFwxXDMwNlwxXDMwN1wxXDMxMCIrCi0gICAgIlwxXDMwNlwzXDMxMFwxXDMwNlwxXDMwNVwxXDMxMVwxXDMxMlwzXDMxMFwxXDMwNSIrCi0gICAgIlwxXDMxMFwxXDMxMlw0XDMxMFwxXDMwNVwyN1wzMTBcMlwzMDVcMlwxNjFcMVwwIisKLSAgICAiXDYwXDE2MVwxXDBcMTZcMTYxXDFcMzEzXDM3XDE2MVw3XDBcMVwzMTRcMTdcMCIrCi0gICAgIlwxXDMxNVwzNlwwXDFcMTcxXDJcMFwxXDQwXDNcMFwxXDE3MVw1XDAiKwotICAgICJcMVwxNzFcNFw0MFwxXDBcMTNcNDBcMVwwXDVcNDBcMVwwXDJcNDAiKwotICAgICJcMVwwXDNcNDBcMVwwXDFcMzE2XDFcMFwzXDMxNlwxXDMxN1wzXDE3MiIrCi0gICAgIlwxXDMxNlwxXDBcMVwzMTZcMVwzMTdcMVwxNzJcMVwzMTZcMVwwXDJcMzE2IisKLSAgICAiXDFcMzE3XDRcMTcyXDFcMzE2XDEzXDE3MlwxXDMxNlw1XDE3MlwxXDMxNlwyXDE3MiIrCi0gICAgIlwxXDMyMFw0XDE3MlwxNVwwXDFcMzIxXDZcMFwxXDMyMlwzNFwwXDFcMzE2IisKLSAgICAiXDFcMFwzXDMxNlwxXDMxN1wzXDE3NFwxXDMxNlwxXDBcMVwzMTZcMVwzMTciKwotICAgICJcMVwxNzRcMVwzMTZcMVwwXDJcMzE2XDFcMzE3XDRcMTc0XDFcMzE2XDEzXDE3NCIrCi0gICAgIlwxXDMxNlw1XDE3NFwxXDMxNlwyXDE3NFwxXDMyM1w0XDE3NFwyN1wwXDFcMzE1IisKLSAgICAiXDMzXDBcMVwzMjRcNjBcMFwxXDMyNVw2NFwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDNcNTdcMVwzMjZcMVwwXDEzXDU3XDFcMFw1XDU3XDFcMCIrCi0gICAgIlwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw0XDU3XDFcMFwxM1w1N1wxXDBcMVw1N1wxXDMyN1wzXDU3XDFcMCIrCi0gICAgIlwyXDU3XDFcMFw0XDU3XDFcMjA2XDFcMFw3XDIwNlwxXDIxMFw0N1wyMDYiKwotICAgICJcMVwyMTFcMVwwXDExXDIxMVwxXDIxMFw0NVwyMTFcMVwyMTZcMVwwXDdcMjE2IisKLSAgICAiXDFcMjIwXDQ3XDIxNlwxXDIyMVwxXDBcMTFcMjIxXDFcMjIwXDQ1XDIyMVwxXDIyNSIrCi0gICAgIlwxXDBcN1wyMjVcMVwyMjdcNDdcMjI1XDFcMjMwXDFcMFwxMVwyMzBcMVwyMjciKwotICAgICJcNDVcMjMwXDMwXDBcMVwzMzBcMjVcMFwxXDMzMFwzNVwwXDFcMzMxXDEyXDAiKwotICAgICJcMVwzMzFcNDdcMFwxXDMzMlw2MlwwXDFcMzMzXDc2XDBcMVwzMzRcM1wwIisKLSAgICAiXDFcMjQzXDFcMFw3XDI0M1wxXDI0NVw0N1wyNDNcMVwyNDZcMVwwXDFcMjQ3IisKLSAgICAiXDFcMzM1XDFcMjQ2XDFcMjQ3XDNcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjQ1XDFcMjQ3IisKLSAgICAiXDVcMjQ2XDFcMjQ3XDM2XDI0NlwxXDI0N1wxXDBcMTFcMjQ3XDFcMjQ1XDQ1XDI0NyIrCi0gICAgIlwxXDI0NlwxXDBcMVwyNDdcMVwzMzVcMVwyNDZcMVwyNDdcM1wyNDZcMVwyNDciKwotICAgICJcMVwyNDZcMVwzMzZcMVwyNDdcNVwyNDZcMVwyNDdcMzZcMjQ2XDEzXDBcMVwzMzciKwotICAgICJcNDVcMFwxXDI0N1wxXDBcMTFcMjQ3XDFcMzM2XDQ1XDI0N1wxMVwyNTdcMVwyNjEiKwotICAgICJcNDdcMjU3XDEzXDI2MlwxXDI2MVw0NVwyNjJcMVwyNjdcMVwwXDdcMjY3XDFcMjcxIisKLSAgICAiXDQ3XDI2N1wxXDI3MlwxXDBcMVwyNzNcMVwzNDBcMVwyNzJcMVwyNzNcM1wyNzIiKwotICAgICJcMVwyNzNcMVwyNzJcMVwyNzFcMVwyNzNcNVwyNzJcMVwyNzNcMzZcMjcyXDFcMjczIisKLSAgICAiXDFcMFwxMVwyNzNcMVwyNzFcNDVcMjczXDFcMjcyXDFcMFwxXDI3M1wxXDM0MCIrCi0gICAgIlwxXDI3MlwxXDI3M1wzXDI3MlwxXDI3M1wxXDI3MlwxXDM0MVwxXDI3M1w1XDI3MiIrCi0gICAgIlwxXDI3M1wzNlwyNzJcMTNcMFwxXDM0Mlw0NVwwXDFcMjczXDFcMFwxMVwyNzMiKwotICAgICJcMVwzNDFcNDVcMjczXDJcMTUyXDFcMFwyNFwxNTJcMVwzNDNcMzFcMTUyXDFcMzAyIisKLSAgICAiXDFcMFw3XDMwMlwxXDMwNFw0N1wzMDJcMVwzMDVcMVwwXDFcMzA2XDFcMzQ0IisKLSAgICAiXDFcMzA1XDFcMzA2XDNcMzA1XDFcMzA2XDFcMzA1XDFcMzA0XDFcMzA2XDVcMzA1IisKLSAgICAiXDFcMzA2XDM2XDMwNVwxXDMwNlwxXDBcMTFcMzA2XDFcMzA0XDQ1XDMwNlwxXDMwNSIrCi0gICAgIlwxXDBcMVwzMDZcMVwzNDRcMVwzMDVcMVwzMDZcM1wzMDVcMVwzMDZcMVwzMDUiKwotICAgICJcMVwzNDVcMVwzMDZcNVwzMDVcMVwzMDZcMzZcMzA1XDEzXDBcMVwzNDZcNDVcMCIrCi0gICAgIlwxXDMwNlwxXDBcMTFcMzA2XDFcMzQ1XDQ1XDMwNlwyXDE2MVwxXDBcMjRcMTYxIisKLSAgICAiXDFcMzQ3XDMxXDE2MVw3XDBcMVwzNTBcMTAxXDBcMVwzNTFcMzBcMFwxXDMxNiIrCi0gICAgIlwxXDBcMTBcMzE2XDFcMFw0XDMxNlwxXDBcMzRcMzE2XDFcMFw1XDMxNiIrCi0gICAgIlwxXDBcM1wzMTZcMVwzMTdcNFwzMTZcMVwwXDFcMzE2XDFcMzE3XDJcMzE2IisKLSAgICAiXDFcMFwyXDMxNlwxXDMxN1wzMVwzMTZcMVwzNTJcNFwzMTZcMTVcMFwxXDMyMSIrCi0gICAgIlwzNlwwXDFcMzUzXDIxXDBcMVwzNTRcMTJcMFwzXDM1NFwyXDBcMVwzNTQiKwotICAgICJcMTFcMFwyXDM1NFwxXDBcMVwzNTRcMlwwXDJcMzU0XDEwXDBcM1w1NyIrCi0gICAgIlw0XDBcMVw1N1w1XDBcNFw1N1wxXDBcMTFcNTdcMVwzNTVcMVw1NyIrCi0gICAgIlwxXDBcNVw1N1wxXDBcMlw1N1wxXDBcNFw1N1wzM1wwXDFcMzU2IisKLSAgICAiXDEyXDBcMVwzNTZcNDBcMFwxXDM1N1w1N1wwXDFcMzYwXDY2XDBcMVwzNjEiKwotICAgICJcMTJcMFwxXDM2MVw0MFwwXDFcMzYyXDM1XDBcMlwzNjNcMVwwXDNcMzYzIisKLSAgICAiXDJcMFwxXDI1Mlw0XDM2M1wxXDBcNlwzNjNcMVwwXDI3XDM2M1w1XDAiKwotICAgICJcMlwzNjRcMVwwXDNcMzY0XDJcMFwxXDI3Nlw0XDM2NFwxXDBcNlwzNjQiKwotICAgICJcMVwwXDI3XDM2NFwyXDBcMlwxNTJcMVwwXDI1XDE1MlwxXDM2NVwzMFwxNTIiKwotICAgICJcM1wwXDJcMzY2XDFcMFwzXDM2NlwyXDBcMVwzMTFcNFwzNjZcMVwwIisKLSAgICAiXDZcMzY2XDFcMFwyN1wzNjZcMlwwXDJcMTYxXDFcMFwyNVwxNjFcMVwzNjciKwotICAgICJcMzBcMTYxXDMxXDBcMVwzNzBcMTAzXDBcMVwzNTJcMjFcMFwxXDM1NFwxMlwwIisKLSAgICAiXDNcMzU0XDJcMFwxXDM1NFwxMVwwXDJcMzU0XDFcMFwxXDM1NFwxXDAiKwotICAgICJcMVwzNTNcMlwzNTRcMTBcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3IisKLSAgICAiXDFcMFw2XDU3XDFcMzcxXDRcNTdcMVwwXDVcNTdcMVwwXDJcNTciKwotICAgICJcMVwwXDRcNTdcNDRcMFwxXDM3Mlw1NFwwXDFcMzczXDU1XDBcMVwzNzQiKwotICAgICJcNjBcMFwxXDM3NVw2M1wwXDFcMzc2XDIwXDBcMlwxNTJcMVwwXDI2XDE1MiIrCi0gICAgIlwxXDM3N1wyN1wxNTJcMlwxNjFcMVwwXDI2XDE2MVwxXHUwMTAwXDI3XDE2MVwzMlwwIisKLSAgICAiXDFcdTAxMDFcMzRcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcdTAxMDJcN1w1N1wxXDBcMlw1N1wxXHUwMTAyXDJcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDRcNTdcNDVcMFwxXHUwMTAzXDUyXDBcMVx1MDEwNFw2M1wwIisKLSAgICAiXDFcdTAxMDVcNDNcMFwxXHUwMTA2XDYzXDBcMVx1MDEwN1wyNVwwXDFcdTAxMDdcMlwwIisKLSAgICAiXDJcMTUyXDFcMFwyN1wxNTJcMVx1MDEwOFwyNlwxNTJcMlwxNjFcMVwwXDI3XDE2MSIrCi0gICAgIlwxXHUwMTA5XDI2XDE2MVwzM1wwXDFcdTAxMGFcMzJcMFwxXHUwMTBiXDNcNTdcM1wwIisKLSAgICAiXDFcdTAxMGJcMVw1N1w0XDBcMVx1MDEwYlw0XDU3XDFcMFwxM1w1N1wxXDAiKwotICAgICJcNVw1N1wxXDBcMlw1N1wxXDBcNFw1N1wzNVwwXDFcdTAxMGNcNTZcMCIrCi0gICAgIlwxXHUwMTBkXDEyXDBcMVx1MDEwZFw0NVwwXDFcdTAxMGVcMTJcMFwxXHUwMTBlXDEyXDAiKwotICAgICJcMlwxNTJcMVwwXDMwXDE1MlwxXHUwMTBmXDI1XDE1MlwyXDE2MVwxXDBcMzBcMTYxIisKLSAgICAiXDFcdTAxMTBcMjVcMTYxXDMyXDBcMVx1MDExMVwzM1wwXDFcdTAxMGJcNlwwXDFcdTAxMGIiKwotICAgICJcNVwwXDFcdTAxMGJcMzZcMFwyXDE1MlwxXDBcMjdcMTUyXDFcdTAxMTJcMjZcMTUyIisKLSAgICAiXDJcMTYxXDFcMFwyN1wxNjFcMVx1MDExM1wyNlwxNjFcMjdcMFwxXHUwMTE0XDMxXDAiKwotICAgICJcMlwxNTJcMVwwXDI0XDE1MlwxXHUwMTE1XDMxXDE1MlwyXDE2MVwxXDBcMjRcMTYxIisKLSAgICAiXDFcdTAxMTZcMzFcMTYxIjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICA5LCAgMSwgIDksICA5LCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAKLSAgICAgMSwgIDEsICA5LCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsIAotICAgICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDksIAotICAgICAwLCAgMCwgIDksICA5LCAgOSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAKLSAgICAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICA5LCAgMSwgIDEsICAwLCAgMSwgIDksICA5LCAgOSwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgOSwgIDEsICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCXJldHVybjsKLQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCX0KLQl9Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JfQotCXJldHVybiBCTE9DS19URVhUOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci19Ci1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0gKgotICogRXhhbXBsZTogCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0gKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLSAqCi0gKiBSZXR1cm5zOgotICoJQkxPQ0tfVEVYVDogMC00MAotICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0gKglYTUxfQ09OVEVOVDogNTAtNTcKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLX0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYW1lID0gdHJ1ZTsKLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQkKLQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMgKHl5X2N1cnJlbnRQb3MgaXMgdGhlICpsYXN0KiBjaGFyYWN0ZXIgd2UgY2FuIGNoZWNrIGFnYWluc3QpCi0JCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBBIGdlbmVyaWMgbG9va2FoZWFkLWxpa2Ugb3BlcmF0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tTY2FuKFN0cmluZyB0YXJnZXQsIFN0cmluZyB0YXJnZXRDb250ZXh0LCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZXR1cm4gZG9TY2FuKHRhcmdldCwgZmFsc2UsIHRhcmdldENvbnRleHQsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0gKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotICoKLSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotICovCi1wdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJc3RhcnQgPSB5eWNoYXI7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQlpZiAoeXlfYXRFT0YpIHsKLQkJCWZUb2tlbkNvdW50Kys7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQlpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCWVsc2UKLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JfQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JfQotCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JfQotCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJLy8gRU9GCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlmVG9rZW5Db3VudCsrOwotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsKLQlzdXBlcigpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQlyZXNldChpbiwgMCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kICoKLSAqCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0gKgotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JfQotCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0KLQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JeXlfcmVhZGVyID0gaW47Ci0KLQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JeXlfc3RhdGUgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JeXlfc3RhcnRSZWFkID0gMDsKLQotCS8qKiAKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkgKiBmcm9tIGlucHV0IAotCSAqLwotCXl5X2VuZFJlYWQgPSAwOwotCi0JLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JeXlsaW5lID0gMDsKLQotCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXl5Y2hhciA9IDA7Ci0KLQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JeXlfYXRFT0YgPSBmYWxzZTsKLQotCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotCS8qIHVzZXIgdmFyczogKi8KLQlmVG9rZW5Db3VudCA9IDA7Ci0gCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCWZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0KLQljb250ZXh0ID0gbnVsbDsKLQlzdGFydCA9IDA7Ci0JdGV4dExlbmd0aCA9IDA7Ci0JbGVuZ3RoID0gMDsKLX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnBhcnNlci5CbG9ja1Rva2VuaXplciNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgewotCQlYTUxUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgWE1MVG9rZW5pemVyKCk7Ci0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOwotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLS8qIHVzZXIgbWV0aG9kICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7Ci19Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFs5MjEyXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAzMjIwKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTM3MikgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3IKLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShjaGFyW10gbWFya2VyVGFnTmFtZSwgaW50IG9mZnNldCwgaW50IHRhZ25hbWVMZW5ndGgpIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBqKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgPT0gdGFnbmFtZUxlbmd0aCkgewotCQkJCWJvb2xlYW4gbWF0Y2hlc1NvRmFyID0gdHJ1ZTsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgewotCQkJCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpICE9IG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXRjaGVzU29GYXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqCi0JICogUmV0dXJuIEFMTCBvZiB0aGUgcmVnaW9ucyBzY2FubmFibGUgd2l0aGluIHRoZSByZW1haW5pbmcgdGV4dAotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlCi0JICovCi0JcHVibGljIGZpbmFsIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCXdoaWxlKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbmNlIHRoaXMgaXMgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBOT1QgdGhlIHJlY29tbWVuZGVkIAotCQkJLy8gd2F5IG9mIGdldHRpbmcgdG9rZW5zLCBtYW55IGVycm9ycyBhcmUgc2ltcGx5IGhpZGRlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcChTdHJpbmcgcykgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJKHl5bGVuZ3RoKCkgKyB5eWNoYXIpICsgIik6XCciICsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1V0aWxzLmVzY2FwZSh5eXRleHQoKSkgKyAiXCciKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgIC0gc2tlbGV0b24uc2VkICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLwotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKFN0cmluZyBtYXJrZXJUYWdOYW1lKSB7Ci0JSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2IKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgYm9vbGVhbiB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICBmb3IgKHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQ7IHl5X2N1cnJlbnRQb3MgPCB5eV9tYXJrZWRQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9jdXJyZW50UG9zKyspIHsKLSAgICAgICAgc3dpdGNoICh5eV9idWZmZXJbeXlfY3VycmVudFBvc10pIHsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHl5X2NvdW50ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHl5X2NvdW50ZWQpCi0gICAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV9jb3VudGVkKSB7Ci0gICAgICAgIGlmICggeXlfYWR2YW5jZSgpID09ICdcbicgKSB5eWxpbmUtLTsKLSAgICAgICAgaWYgKCAheXlfYXRFT0YgKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAxKSA+IDAgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA+IDAgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDI3NTogCi0gICAgICAgIGNhc2UgMjc2OiAKLSAgICAgICAgY2FzZSAyNzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ0RBVEEgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7Ci0JcmV0dXJuIFhNTF9DREFUQV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAyNzk6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjgxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyODI6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQzsKLSB9Ci0gICAgICAgIGNhc2UgMjgzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07Ci0gfQotICAgICAgICBjYXNlIDI4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU3OiAKLSAgICAgICAgY2FzZSAyNjY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMjg1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAyODY6IGJyZWFrOwotICAgICAgICBjYXNlIDIzMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOwotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAyODc6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDI4ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyODk6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfQ0RBVEFfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAyOTE6IGJyZWFrOwotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAyOTI6IGJyZWFrOwotICAgICAgICBjYXNlIDE1ODogCi0gICAgICAgIGNhc2UgMTcyOiAKLSAgICAgICAgY2FzZSAxODA6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsKLSB9Ci0gICAgICAgIGNhc2UgMjkzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gWE1MX0VNUFRZX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjk0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyOTU6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMDogCi0gICAgICAgICAgeyAKLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyOTc6IGJyZWFrOwotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9QSSk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk5OiBicmVhazsKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAwOiBicmVhazsKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgIGNhc2UgMTM1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMDE6IGJyZWFrOwotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAzOiBicmVhazsKLSAgICAgICAgY2FzZSA1MDogCi0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICBjYXNlIDUyOiAKLSAgICAgICAgICB7IAotCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQKLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7Ci0gfQotICAgICAgICBjYXNlIDMwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7Ci0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA1OiBicmVhazsKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgIGNhc2UgNDc6IAotICAgICAgICBjYXNlIDQ4OiAKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICBjYXNlIDEyOTogCi0gICAgICAgIGNhc2UgMjE0OiAKLSAgICAgICAgY2FzZSAyMzY6IAotICAgICAgICBjYXNlIDI0ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMDY6IGJyZWFrOwotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgMzA3OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA4OiBicmVhazsKLSAgICAgICAgY2FzZSAwOiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMTIxOiAKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgIGNhc2UgMjA2OiAKLSAgICAgICAgY2FzZSAyMzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMDk6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzEwOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgNzA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMxMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgY2FzZSAxOTE6IAotICAgICAgICBjYXNlIDIyNjogCi0gICAgICAgIGNhc2UgMjQ0OiAKLSAgICAgICAgY2FzZSAyNTQ6IAotICAgICAgICBjYXNlIDI2MzogCi0gICAgICAgIGNhc2UgMjcwOiAKLSAgICAgICAgY2FzZSAyNzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMxMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICBjYXNlIDIzMDogCi0gICAgICAgIGNhc2UgMjQ2OiAKLSAgICAgICAgY2FzZSAyNTU6IAotICAgICAgICBjYXNlIDI2NDogCi0gICAgICAgIGNhc2UgMjcxOiAKLSAgICAgICAgY2FzZSAyNzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzEzOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMxNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgY2FzZSA4NDogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgODk6IAotICAgICAgICBjYXNlIDkwOiAKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgIGNhc2UgMTA5OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJU3lzdGVtLm91dC5wcmludGxuKCIhISF1bmV4cGVjdGVkISEhOiBcIiIgKyB5eXRleHQoKSArICJcIjoiICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBVTkRFRklORUQ7Ci0gfQotICAgICAgICBjYXNlIDMxNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBibG9ja0NvbnRleHQgPSBkb0Jsb2NrU2NhbigiXV0+IiwgWE1MX0NEQVRBX1RFWFQsIFNUX0NEQVRBX0VORCk7Ly8kTk9OLU5MUy0xJAotCWlmKGJsb2NrQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkKLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOwotCXJldHVybiBibG9ja0NvbnRleHQ7Ci0gfQotICAgICAgICBjYXNlIDMxNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjY6IAotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgY2FzZSA2OTogCi0gICAgICAgIGNhc2UgMTQzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE5OiBicmVhazsKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmKGlzQmxvY2tNYXJrZXIoKSkgewotICAgICAgICAJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JfQotCWVsc2UKLSAgICAgICAgCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzg6IAotICAgICAgICBjYXNlIDgwOiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgMTUwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzI0OiBicmVhazsKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzI1OiBicmVhazsKLSAgICAgICAgY2FzZSA4ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQpOwotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMjY6IGJyZWFrOwotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSAxNjQ6IAotICAgICAgICBjYXNlIDE2NTogCi0gICAgICAgIGNhc2UgMTY4OiAKLSAgICAgICAgY2FzZSAxNjk6IAotICAgICAgICBjYXNlIDIyMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBwdWJsaWMgcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotIH0KLSAgICAgICAgY2FzZSAzMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDk2OiAKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgOTk6IAotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgIGNhc2UgMTc2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0gfQotICAgICAgICBjYXNlIDMyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAxOiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgY2FzZSAxODU6IAotICAgICAgICBjYXNlIDE4ODogCi0gICAgICAgIGNhc2UgMTg5OiAKLSAgICAgICAgY2FzZSAyMjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDEwODogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgY2FzZSAxMTE6IAotICAgICAgICBjYXNlIDE5NTogCi0gICAgICAgIGNhc2UgMTk2OiAKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICBjYXNlIDIwMDogCi0gICAgICAgIGNhc2UgMjI4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzMzOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTU6IAotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgICAgeyAKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JIH0KLSAgICAgICAgY2FzZSAzMzQ6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlRXF1YWxzUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZUVxdWFsc1JlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTU3Nzc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlRXF1YWxzUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRXF1YWxzUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotCXByaXZhdGUgc2hvcnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBBdHRyaWJ1dGVFcXVhbHNSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIGxlbmd0aDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aFdpdGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlTmFtZVJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjc4YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlTmFtZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQkvLyBzcGVjaWZ5IGNvcnJlY3QgdHlwZQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCXB1YmxpYyBBdHRyaWJ1dGVOYW1lUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVOYW1lUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aFdpdGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RUZXh0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IDE7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQl9Ci0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlVmFsdWVSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlVmFsdWVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlYjQ2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZVZhbHVlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlVmFsdWVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCi0JcHVibGljIEF0dHJpYnV0ZVZhbHVlUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGhXaXRoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RUZXh0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IDE7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJZlRleHRMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCX0KLQkJCS8vIHVwZGF0ZSBsZW5ndGggKGFuZCBlbmQpIGFmdGVyIGFib3ZlIGNoZWNrIGZvciB3aGl0ZSBzcGFjZSwKLQkJCS8vIHNpbmNlCi0JCQkvLyBpdCBsb29rcyB0byBkZXRlcm1pbmUgaWYgYXQgZW5kIG9mIHJlZ2lvbi4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0Jsb2NrVGV4dFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9CbG9ja1RleHRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4MjI1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0Jsb2NrVGV4dFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgQmxvY2tUZXh0UmVnaW9uIGV4dGVuZHMgRm9yZWlnblJlZ2lvbiB7Ci0KLQkvKioKLQkgKiBCbG9ja1RleHRSZWdpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQmxvY2tUZXh0UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCbG9ja1RleHRSZWdpb24oU3RyaW5nIG5ld0NvbnRleHQsIGludCBuZXdTdGFydCwgaW50IG5ld1RleHRMZW5ndGgsIGludCBuZXdMZW5ndGgpIHsKLQkJc3VwZXIobmV3Q29udGV4dCwgbmV3U3RhcnQsIG5ld1RleHRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JfQotCi0JcHVibGljIEJsb2NrVGV4dFJlZ2lvbihTdHJpbmcgbmV3Q29udGV4dCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3VGV4dExlbmd0aCwgaW50IG5ld0xlbmd0aCwgU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCXN1cGVyKG5ld0NvbnRleHQsIG5ld1N0YXJ0LCBuZXdUZXh0TGVuZ3RoLCBuZXdMZW5ndGgsIG5ld0xhbmd1YWdlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0dlbmVyaWNUZW1wbGF0ZVJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTFhMzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMganVzdCBwcmVzZW50IHRvIHNlcnZlciBhcyBhCi0gKiBnZW5lcmljIHN0YXJ0aW5nIHBvaW50IGZvciBhZGRpbmcgbmV3IHNwZWNpZmljIHJlZ2lvbiB0eXBlcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1RlbXBsYXRlUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCS8vIHNwZWNpZnkgY29ycmVjdCB0eXBlCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gWE1MUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0KLQotCXB1YmxpYyBHZW5lcmljVGVtcGxhdGVSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEdlbmVyaWNUZW1wbGF0ZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGhXaXRoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24jYWRqdXN0VGV4dExlbmd0aChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSAxOwotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gY2FuIG5ldmVyIGJlIHVwZGF0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1JlZ2lvblRvU3RyaW5nVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25Ub1N0cmluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5M2JlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1JlZ2lvblRvU3RyaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgUmVnaW9uVG9TdHJpbmdVdGlsIHsKLQlzdGF0aWMgcHVibGljIFN0cmluZyB0b1N0cmluZyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHJlZ2lvbi5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCS8vID09PiAvLyBTdHJpbmcgcmVzdWx0VGV4dCA9IG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSBzaG9ydENsYXNzTmFtZSArICItLT4gIiArIHJlZ2lvbi5nZXRUeXBlKCkgKyAiOiAiICsgcmVnaW9uLmdldFN0YXJ0KCkgKyAiLSIgKyByZWdpb24uZ2V0VGV4dEVuZCgpICsgKHJlZ2lvbi5nZXRUZXh0RW5kKCkgIT0gcmVnaW9uLmdldEVuZCgpID8gKCIvIiArIHJlZ2lvbi5nZXRFbmQoKSkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJLy9yZXR1cm4gY29tLmlibS5zZWQudXRpbC5TdHJpbmdVdGlscy5lc2NhcGUoIignIisoZ2V0Rmlyc3RSZWdpb24oKQotCQkvLyA9PSBudWxsIHx8IGRvY3VtZW50ID09IG51bGw/ICIiIDoKLQkJLy8gZ2V0VGV4dChnZXRGaXJzdFJlZ2lvbigpKSkrIiciK2dldFN0YXJ0KCkrIiAtCi0JCS8vICIrZ2V0RW5kKCkrIiciKyhnZXRDbG9zZSgpID09IG51bGwgfHwgZG9jdW1lbnQgPT0gbnVsbCB8fAotCQkvLyBnZXRSZWdpb25zKCkuc2l6ZSgpPDIgPyAiIiA6IGdldFRleHQoZ2V0Q2xvc2UoKSkpKyInKQotCQkvLyAiK2dldFJlZ2lvbnMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1JlZ2lvblVwZGF0ZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVXBkYXRlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjkyNjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVXBkYXRlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlV0aWxpdGllczsKLQotCi0vKioKLSAqIAotICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdG8gY2VudHJhbGl6ZSAncmVnaW9uJyB1cGRhdGUuIE5vdGU6IGNhcmUgbXVzdCBiZQotICogdGFrZW4gdGhhdCBpcyBpcyBub3QgdXNlZCBmb3IgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb3IgY29udGFpbmVyCi0gKiByZWdpb25zLCBpdHMgb25seSBmb3IgInRva2VuIHJlZ2lvbnMiCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpb25VcGRhdGVSdWxlIHsKLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBhbGxMZXR0ZXJPckRpZ2l0KFN0cmluZyBjaGFuZ2VzKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aCgpOyBpKyspIHsKLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2hlY2sgdGhhdCBhIEphdmEgTGV0dGVyIG9yIERpZ2l0IGlzCi0JCQkvLyB0aGUgc2FtZSB0aGluZyBhcyBhbiBYTUwgbGV0dGVyIG9yIGRpZ2l0Ci0JCQlpZiAoIShDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoYW5nZXMuY2hhckF0KGkpKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBhbGxXaGl0ZVNwYWNlKFN0cmluZyBjaGFuZ2VzKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaGFuZ2VzLmNoYXJBdChpKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVBc0xldHRlck9yRGlnaXQoSVRleHRSZWdpb24gcmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChyZWdpb24sIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gTWFrZSBzdXJlIHdlIGFyZSBpbiBhIG5vbi13aGl0ZSBzcGFjZSBhcmVhCi0JCWlmICgocmVxdWVzdFN0YXJ0IDw9IChwYXJlbnQuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSkgJiYgKGFsbExldHRlck9yRGlnaXQoY2hhbmdlcykpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChJVGV4dFJlZ2lvbiByZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSBub24td2hpdGUgc3BhY2UgYXJlYQotCQlpZiAoKHJlcXVlc3RTdGFydCA8PSAocmVnaW9uLmdldFRleHRFbmQoKSkpICYmIChhbGxMZXR0ZXJPckRpZ2l0KGNoYW5nZXMpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVBc1doaXRlU3BhY2UoSVRleHRSZWdpb24gcmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gd2UgZG9uJ3QgZXhwbGVjdCBhIG51bGwgcGFyZW50LCBidXQganVzdCBpbiBjYXNlIQotCQkvLyAoaW4gd2hpY2ggY2FzZSwgd2UgbXVzdCBiZSBkZWFsaW5nIHdpdGggcmVnaW9ucyB0aGF0IGFyZQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKS4KLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGNhbkhhbmRsZUFzV2hpdGVTcGFjZShyZWdpb24sIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgd2UgYXJlIGluIHRoZSAid2hpdGUgc3BhY2UiIGFyZWEgb2YgYSByZWdpb24sIHRoZW4KLQkJLy8gd2UgZG9uJ3Qgd2FudCB0byBoYW5kbGUsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCS8vIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24gaXMgY29uc2lkZXIgYW55d2hlcmUgdGhhdCB3b3VsZAotCQkvLyBsZWF2ZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhpcyBjaGFyYWN0ZXIgYW5kIHRoZSB0ZXh0IHBhcnQuCi0JCS8vIGFuZCBvZiBjb3Vyc2UsIHdlIGNhbiBpbnNlcnQgd2hpdGVzcGFjZSBpbiB3aGl0ZXNwYWNlIHJlZ2lvbgotCQkvLwotCQkvLyBpZiB0aGVyZSBpcyBubyB3aGl0ZXNwYWNlIGluIHRoaXMgcmVnaW9uLCBubyBuZWVkIHRvIGxvb2sgZnVydGhlcgotCQlpZiAocmVnaW9uLmdldEVuZCgpID4gcmVnaW9uLmdldFRleHRFbmQoKSkgewotCQkJLy8gbm8gbmVlZCB0byBhZGQgb25lIHRvIGVuZCBvZiB0ZXh0LCBhcyB3ZSB1c2VkIHRvLCBzaW5jZSB3ZQotCQkJLy8gY2hhbmdlIGRlZmluaXRpb24gb2YgbGVuZ3RoIHRvIGVxdWF0ZSB0byBvZmZzZXQgcGx1cyBvbmUuCi0JCQlpZiAocmVxdWVzdFN0YXJ0ID4gcGFyZW50LmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkgewotCQkJCS8vIG9rLCB3ZSBhcmUgaW4gdGhlIHdoaXRlc3BhY2UgcmVnaW9uLCBzbyB3ZSBjYW4ndCBoYW5kbGUsCi0JCQkJLy8gdW5sZXNzCi0JCQkJLy8gd2UgYXJlIGp1c3QgaW5zZXJ0aW5nIHdoaXRlc3BhY2UuCi0JCQkJaWYgKGFsbFdoaXRlU3BhY2UoY2hhbmdlcykpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKElUZXh0UmVnaW9uIHJlZ2lvbiwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgd2UgYXJlIGluIHRoZSAid2hpdGUgc3BhY2UiIGFyZWEgb2YgYSByZWdpb24sIHRoZW4KLQkJLy8gd2UgZG9uJ3Qgd2FudCB0byBoYW5kbGUsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCS8vIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24gaXMgY29uc2lkZXIgYW55d2hlcmUgdGhhdCB3b3VsZAotCQkvLyBsZWF2ZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhpcyBjaGFyYWN0ZXIgYW5kIHRoZSB0ZXh0IHBhcnQuCi0JCS8vIGFuZCBvZiBjb3Vyc2UsIHdlIGNhbiBpbnNlcnQgd2hpdGVzcGFjZSBpbiB3aGl0ZXNwYWNlIHJlZ2lvbgotCQkvLwotCQkvLyBpZiB0aGVyZSBpcyBubyB3aGl0ZXNwYWNlIGluIHRoaXMgcmVnaW9uLCBubyBuZWVkIHRvIGxvb2sgZnVydGhlcgotCQlpZiAocmVnaW9uLmdldEVuZCgpID4gcmVnaW9uLmdldFRleHRFbmQoKSkgewotCQkJLy8gbm8gbmVlZCB0byBhZGQgb25lIHRvIGVuZCBvZiB0ZXh0LCBhcyB3ZSB1c2VkIHRvLCBzaW5jZSB3ZQotCQkJLy8gY2hhbmdlIGRlZmluaXRpb24gb2YgbGVuZ3RoIHRvIGVxdWF0ZSB0byBvZmZzZXQgcGx1cyBvbmUuCi0JCQlpZiAocmVxdWVzdFN0YXJ0ID4gcmVnaW9uLmdldFRleHRFbmQoKSkgewotCQkJCS8vIG9rLCB3ZSBhcmUgaW4gdGhlIHdoaXRlc3BhY2UgcmVnaW9uLCBzbyB3ZSBjYW4ndCBoYW5kbGUsCi0JCQkJLy8gdW5sZXNzCi0JCQkJLy8gd2UgYXJlIGp1c3QgaW5zZXJ0aW5nIHdoaXRlc3BhY2UuCi0JCQkJaWYgKGFsbFdoaXRlU3BhY2UoY2hhbmdlcykpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBuZWVkIGFuIGFkanVzdCB0ZXh0IGxlbmd0aCBBUEkgYmVmb3JlIHRoaXMgY2FuIGJlIHVzZWQKLQlzdGF0aWMgcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKElUZXh0UmVnaW9uIHJlZ2lvbiwgT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyByZWdpb24uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgocmVnaW9uLmdldFN0YXJ0KCkgPj0gcmVnaW9uLmdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gcmVnaW9uLmdldFRleHRFbmQoKSAtIHJlZ2lvbi5nZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZShyZWdpb24sIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB8fCBSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChyZWdpb24sIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCXJlZ2lvbi5hZGp1c3RMZW5ndGhXaXRoKGxlbmd0aERpZmZlcmVuY2UpOwotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlZ2lvbi5nZXRTdGFydCgpLCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJLy8JCQkJcmVnaW9uLmFkanVzdFRleHRMZW5ndGgobGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgcmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MDQ0ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdDbG9zZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBUYWdDbG9zZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRTsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBUYWdDbG9zZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnQ2xvc2VSZWdpb24oaW50IHN0YXJ0KSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoV2l0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oImludmFsaWQgZm9yIHRoaXMgcmVnaW9uIHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RUZXh0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnTmFtZVJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdOYW1lUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMWU1YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdOYW1lUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFRhZ05hbWVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUU7Ci0JcHJpdmF0ZSBzaG9ydCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIHNob3J0IGZUZXh0TGVuZ3RoOwotCi0KLQlwdWJsaWMgVGFnTmFtZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnTmFtZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gKHNob3J0KSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gKHNob3J0KSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoV2l0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uI2FkanVzdFRleHRMZW5ndGgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSAoc2hvcnQpIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnT3BlblJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdPcGVuUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOWM4M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdPcGVuUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFRhZ09wZW5SZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU47Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0KLQotCXB1YmxpYyBUYWdPcGVuUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUYWdPcGVuUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aFdpdGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RUZXh0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IDE7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvV2hpdGVTcGFjZU9ubHlSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvV2hpdGVTcGFjZU9ubHlSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcyNzA5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1doaXRlU3BhY2VPbmx5UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXhjZXB0aW9ucy5Tb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFdoaXRlU3BhY2VPbmx5UmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAwOwotCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gWE1MUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRTsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnQ7Ci0KLQlwdWJsaWMgV2hpdGVTcGFjZU9ubHlSZWdpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGhXaXRoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RUZXh0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBwb3NpdGlvbikgewotCi0JCXJldHVybiBmU3RhcnQgPD0gcG9zaXRpb24gJiYgcG9zaXRpb24gPCBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgaSkgewotCQlmU3RhcnQgPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRMZW5ndGgoc2hvcnQgaSkgewotCQl0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oImludmFsaWQgY2FsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBjYWxsIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEZvciB0aGlzIElUZXh0UmVnaW9uIHR5cGUsIHRoZSBzdGFydCBtdXN0IGluIHRlcm1zIG9mIHdoYXQgdGhlIHJlZ2lvbgotCSAqIGV4cGVjdHMgLi4uIHRoYXQgaXMsIGl0cyBub3QgZG9jdW1lbnQgb2Zmc2V0LCBidXQgc3RhcnQgcmVsYXRpdmUgdG8KLQkgKiB3aGF0IGV2ZXIgY29udGFpbnMgaXQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCi0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0KLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDRGF0YVRleHRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ0RhdGFUZXh0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjNjYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDRGF0YVRleHRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlci5YTUxSZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxDRGF0YVRleHRSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVDsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCi0JcHVibGljIFhNTENEYXRhVGV4dFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MQ0RhdGFUZXh0UmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aFdpdGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWQudGV4dC5JVGV4dFJlZ2lvbiNhZGp1c3RUZXh0TGVuZ3RoKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkvLyBUT0RPOiBzaG91bGRuJ3QgY2RhdGEgYmUgbGlrZSBYTUwgQ29udGVudCAuLi4gbGVuZ3RoIGFuZCB0ZXh0Ci0JCS8vIGxlbmd0aAotCQkvLyBhbHdheXMgYmUgdGhlIHNhbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hpdGVzcGFjZT8KLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBUT0RPOiB0aGlzIGlzIGEgcHJldHR5IGxhbWUgbWV0aG9kLCBzaW5jZSBYTUwgQ0RhdGEgcmVnaW9uIGNhbiBoYXZlCi0JCS8vIGEgbXVjaAotCQkvLyBiZXR0ZXIgcnVsZSBmb3IgcmVnaW9uIHVwZGF0ZSwgYnV0IHRoaXMgaXMgd2hhdCBwcmV2aW91cwotCQkvLyAodW5mYWN0b3JlZCkKLQkJLy8gdmVyc2lvbiBoYWQsIHNvIEknbGwgY2FycnkgaXQgb3Zlciwgb2Ygbm93LgotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQl9Ci0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ29udGVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDb250ZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTVkZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDb250ZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLQotCi0KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50UmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQ7Ci0JLy8gbGVuZ3RoIGFuZCB0ZXh0TGVuZ3RoIGFyZSBhbHdheXMgdGhlIHNhbWUgZm9yIGNvbnRlbnQgcmVnaW9uCi0JLy9wcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCi0JcHVibGljIFhNTENvbnRlbnRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFhNTENvbnRlbnRSZWdpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGhXaXRoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkLnRleHQuSVRleHRSZWdpb24jYWRqdXN0VGV4dExlbmd0aChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBhIHByZXR0eSBsYW1lIG1ldGhvZCwgc2luY2UgWE1MIENvbnRlbnQgY2FuIGhhdmUgYQotCQkvLyBtdWNoCi0JCS8vIGJldHRlciBydWxlIGZvciByZWdpb24gdXBkYXRlLCBidXQgdGhpcyBpcyB3aGF0IHByZXZpb3VzCi0JCS8vICh1bmZhY3RvcmVkKQotCQkvLyB2ZXJzaW9uIGhhZCwgc28gSSdsbCBjYXJyeSBpdCBvdmVyLCBvZiBub3cuCi0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB8fCBSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdCh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCi0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQkvLyBkb24ndCBuZWVkIGZvciBjb250ZW50IHJlZ2lvbgotCQkJLy8JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIGNoYW5nZXMsCi0JCQkvLyBmU3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCS8vCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQkvLwkJCX0KLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ5ZWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBYTUxIZWFkUGFyc2VyRmFjdG9yeSB7Ci0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQkvLwkJaWYgKGNvbnRleHQgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCQluZXdSZWdpb24gPSBuZXcgWE1MSGVhZFBhcnNlclJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCB0ZXh0KTsKLQkJLy8JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTEhlYWRQYXJzZXJSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlclJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGRhZDc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlclJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCwgaXRzIGp1c3QgcHJlc2VudCB0byBzZXJ2ZXIgYXMgYQotICogZ2VuZXJpYyBzdGFydGluZyBwb2ludCBmb3IgYWRkaW5nIG5ldyBzcGVjaWZpYyByZWdpb24gdHlwZXMuCi0gKi8KLQotcHVibGljIGNsYXNzIFhNTEhlYWRQYXJzZXJSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlwcml2YXRlIFN0cmluZyBmVHlwZSA9IFhNTFJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEOwotCi0JcHVibGljIFhNTEhlYWRQYXJzZXJSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFhNTEhlYWRQYXJzZXJSZWdpb24oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSBjb250ZXh0OwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCQlmVGV4dCA9IHRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoV2l0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5zZWQuc3RydWN0dXJlZC50ZXh0LklUZXh0UmVnaW9uI2FkanVzdFRleHRMZW5ndGgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwMzc5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgcmVnaW9uIGZhY3RvcnkgaXMgdmVyeSBzcGVjaWZpYyB0byB0aGUgcGFyc2VyIG91dHB1dCwgYW5kIHRoZSBzcGVjaWZpYwotICogaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgdmFyaW91cyByZWdpb25zLgotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHBhcmVudCwgY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCS8vbmV3UmVnaW9uLnNldFBhcmVudChwYXJlbnQpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGNvbnRleHQgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCQkJbmV3UmVnaW9uID0gbmV3IFhNTENEYXRhVGV4dFJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBYTUxDb250ZW50UmVnaW9uKHN0YXJ0LCBsZW5ndGgpOwotCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBUYWdOYW1lUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgQXR0cmlidXRlTmFtZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgQXR0cmlidXRlRXF1YWxzUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IEF0dHJpYnV0ZVZhbHVlUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBUYWdPcGVuUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnQ2xvc2VSZWdpb24oc3RhcnQpOwotCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IFdoaXRlU3BhY2VPbmx5UmVnaW9uKHN0YXJ0LCBsZW5ndGgpOwotCQl9IGVsc2UKLQkJLy8gcmVtb3ZlZCB0aGlzIGNvbmRpdGlvbiBkdXJpbmcgdHJhbnNpdGlvbiwgYW5kIGltcGxlbWVudGVkIGluCi0JCS8vIHN1YmNsYXNzCi0JCS8vCQlpZiAoY29udGV4dCA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkvLwkJCW5ld1JlZ2lvbiA9IG5ldyBKU1BDb2RlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQkvLwkJfSBlbHNlCi0JCWlmIChjb250ZXh0ID09IFhNTFJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJbmV3UmVnaW9uID0gbmV3IEJsb2NrVGV4dFJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJCSgoQmxvY2tUZXh0UmVnaW9uKSBuZXdSZWdpb24pLnNldFN1cnJvdW5kaW5nVGFnKHN1cnJvdW5kaW5nVGFnKTsKLQkJfSBlbHNlIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBDb250ZXh0UmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDEzYjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlByb3BhZ2F0aW5nQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGUgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSBpcyBwYXJ0IG9mIHRoZSAiYWRhcHQgb24gY3JlYXRlIiBtZWNoYW5pc20uIEEKLSAqIFByb3BhZ2F0aW5nQWRhcHRlciwgb25jZSBhZGRlZCB0byBhIG5vZGUsIHdpbGwgY2F1c2UgcHJvYWdhdGluZyBhZGFwdGVycyB0bwotICogYmUgY3JlYXRlZCBmb3IgYWxsIGNoaWxkIG5vZGVzLiBBIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGEKLSAqIFByb3BhZ2F0aW5nQWRhcHRlciBmb3IgYSBub2RlIGlzIHRoYXQgaXMgaXMgYWxzbyBjcmVhdGVzIGFkYXB0ZXJzIGZvciBhbmQKLSAqIGFkYXB0cyB0aGUgTm9kZSBmb3IgYWxsIG90aGVyIHJlZ2lzdGVyZWQgJ2NyZWF0ZSBvbiBhZGFwdCcgQWRhcHRlcnMuIFRoaXMKLSAqIG90aGVyIGFkYXB0ZXJzIGFyZSByZWdpc3RlcmVkIGJ5IHJlZ2lzdGVyaW5nIHRoZWlyIGZhY3RvcmllcyB2aWEgcGx1Z2luCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgUHJvcGFnYXRpbmdBZGFwdGVyIGFkYXB0ZXJJbnN0YW5jZTsKLQlwcm90ZWN0ZWQgTGlzdCBjb250cmlidXRlZEZhY3RvcmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCkgewotCQl0aGlzKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsgLy8sCi0JCS8vIE9iamVjdAotCQkvLyBtb2RlbFR5cGUpCi0JCS8vIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ29udHJpYnV0ZWRGYWN0b3JpZXMoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlpZiAoY29udHJpYnV0ZWRGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJY29udHJpYnV0ZWRGYWN0b3JpZXMuYWRkKGZhY3RvcnkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSBjbG9uZWRJbnN0YW5jZSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCh0aGlzLmFkYXB0ZXJLZXksIHRoaXMuc2hvdWxkUmVnaXN0ZXJBZGFwdGVyKTsKLQkJLy8gY2xvbmUgdGhpcyBhZGFwdGVycyBzcGVjaWZpYyBsaXN0IG9mIGFkYXB0ZXIgZmFjdG9yaWVzIHRvbwotCQlpZiAoY29udHJpYnV0ZWRGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250cmlidXRlZEZhY3Rvcmllcy5pdGVyYXRvcigpOwotCQkJY2xvbmVkSW5zdGFuY2Uuc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMobmV3IEFycmF5TGlzdCgpKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBleGlzdGluZ0ZhY3RvcnkgPSAoQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQljbG9uZWRJbnN0YW5jZS5hZGRDb250cmlidXRlZEZhY3RvcmllcyhleGlzdGluZ0ZhY3RvcnkuY29weSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xvbmVkSW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJLy8gZXZlcnkgbm90aWZpZXIgZ2V0J3Mgb25lIG9mIHRoZXNlCi0JCS8vIChhbmQgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgaXQpCi0JCXJldHVybiBnZXRBZGFwdGVySW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVySW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgUHJvcGFnYXRpbmdBZGFwdGVyCi0JICovCi0JcHJvdGVjdGVkIFByb3BhZ2F0aW5nQWRhcHRlciBnZXRBZGFwdGVySW5zdGFuY2UoKSB7Ci0JCWlmIChhZGFwdGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJYWRhcHRlckluc3RhbmNlID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckltcGwoKTsKLQkJCWlmIChjb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlidXRlZEZhY3Rvcmllcy5zaXplKCk7IGkrKykKLQkJCQkJYWRhcHRlckluc3RhbmNlLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KChQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5KSBjb250cmlidXRlZEZhY3Rvcmllcy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVySW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZ2l2ZSB0aGUgYWRhcHRlciBpbnN0YW5jZSBhIGNoYW5jZSB0byByZWxlYXNlIGl0cyBmYWN0b3JpZXMKLQkJZ2V0QWRhcHRlckluc3RhbmNlKCkucmVsZWFzZSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMoQXJyYXlMaXN0IGxpc3QpIHsKLQkJY29udHJpYnV0ZWRGYWN0b3JpZXMgPSBsaXN0OwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMGIzMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFByb3BhZ2F0aW5nQWRhcHRlckltcGwgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBQcm9wYWdhdGluZ0FkYXB0ZXJDbGFzcyA9IFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzczsKLQkvLyBiZWNhdXNlIHNvIG1hbnkgb2YgdGhlc2UgYXJlIGNyZWF0ZWQgaW4gaHVnZSBmaWxlLAotCS8vIEplZmZyZXkgTGl1IHN1Z2dlc3RlZCB0aGVzZSBiZSBkb25lIGxhemlseSwgc2luY2Ugbm90IGFsbAotCS8vIG1vZGVscyBhbmQgbm90IGFsbCBub2RlcyBhY3R1YWxseSBoYXZlIGEgbGlzdCBvZiBmYWN0b3JpZXMuCi0JcHJpdmF0ZSBMaXN0IGFkYXB0T25DcmVhdGVGYWN0b3JpZXMgPSBudWxsOwotCi0JLyoqCi0JICogQWJzdHJhY3RQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFByb3BhZ2F0aW5nQWRhcHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRhcHRPbkNyZWF0ZShYTUxOb2RlIG5vZGUpIHsKLQkJLy8gZ2l2ZSBlYWNoIG9mIHRoZSBmYWN0b3JpZXMgYSBjaGFuY2UgdG8gYWRhcHQgdGhlIG5vZGUsIGlmIGl0Ci0JCS8vIGNob29zZXMgdG8KLQkJaWYgKGFkYXB0T25DcmVhdGVGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWZhY3RvcnkuYWRhcHQobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWVjaGFuaXNtIGNhbiBiZSBtYWRlICJlYXNpZXIgdG8gdXNlIiBsYXRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCS8vYWRhcHRPbkNyZWF0ZUZhY3Rvcmllcy5hZGQoZmFjdG9yeSk7Ci0JCWdldEFkYXB0T25DcmVhdGVGYWN0b3JpZXMoKS5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRPbkNyZWF0ZUZhY3Rvcmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRPbkNyZWF0ZUZhY3RvcmllcygpIHsKLQkJaWYgKGFkYXB0T25DcmVhdGVGYWN0b3JpZXMgPT0gbnVsbCkKLQkJCWFkYXB0T25DcmVhdGVGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzOwotCX0KLQotCS8vCXByb3RlY3RlZCB2b2lkIHVuYWRhcHRPblJlbW92ZShJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkvLwkJLy8gZ2l2ZSBlYWNoIG9mIHRoZSBmYWN0b3JpZXMgYSBjaGFuY2UgdG8gcHJvY2VzcyByZW1vdmUgZXZlbnQKLQkvLwkJLy8gVGhpcyBpcyBhIGJpdCBvdXQgb2YgdGhlIG5vcm1hbCBhZGFwdGVyIHBhdHRlcm4sIGJ1dCBJIGNvdWxkbid0Ci0JLy8JCS8vIHRoaW5rIG9mIGEgYmV0dGVyIHdheSB0byAicmVtb3ZlIiBwYWdlRGlyZWN0aXZlV2F0Y2hlcnMsIGlmIGFuZAotCS8vCQkvLyB3aGVuIHRoZSBwYWdlIGRpcmVjdGl2ZSB3YXMgJ3JlbW92ZWQnIChlZGl0ZWQpLgotCS8vCQkvLwotCS8vCQlJdGVyYXRvciBpdGVyYXRvciA9IGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkvLwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCS8vCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCS8vCQkJaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5KSB7Ci0JLy8JCQkJKChQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5KWZhY3RvcnkpLnVuYWRhcHQobm9kZSk7Ci0JLy8JCQl9Ci0JLy8JCX0KLQkvLwotCS8vCX0KLQotCS8qKgotCSAqIEBzZWUgUHJvcGFnYXRpbmdBZGFwdGVyI2luaXRpYWxpemVGb3JGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5LAotCSAqICAgICAgSU5vZGVOb3RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRm9yRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJLy8gd2UncmUgRE9NIHNwZWNpZmljIGltcGxpbWVudGF0aW9uCi0JCWlmIChub2RlIGluc3RhbmNlb2YgWE1MTm9kZSkgewotCQkJWE1MTm9kZSB4bWxOb2RlID0gKFhNTE5vZGUpIG5vZGU7Ci0JCQlwcm9wYWdhdGVUbyh4bWxOb2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoUHJvcGFnYXRpbmdBZGFwdGVyQ2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW50ZXJlc3RpbmcoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiAobmV3VmFsdWUgIT0gbnVsbCAmJiAobmV3VmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgbmV3VmFsdWUgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gRE1XLCAyMDAyLjguMTAuIEkgY2hhbmdlZCB0aGlzIHNvIHdlIG9ubHkgcHJvcGFnYXRlIHRvIEVsZW1lbnRzIC4uLgotCQkvLyBub3QgYXR0cmlidXRlcyB0b28hCi0JCS8vIEknbSBhc3N1bWluZyB0aGlzIHdpbGwgaGVscCBwZXJmb3JtYW5jZSBhbmQgbWVtb3J5LCBidXQgZG9uJ3Qga25vdwotCQkvLyBpZiBhbnlvbmUgd2FzIGRlcGVuZGluZyBvbgotCQkvLyB0aGlzIGJlaW5nIHByb2FnYXRlIHRvIGF0dHJpYnV0ZXMuCi0JCWlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgJiYgaXNJbnRlcmVzdGluZyhuZXdWYWx1ZSkpIHsKLQkJCXByb3BhZ2F0ZVRvKChYTUxOb2RlKSBuZXdWYWx1ZSk7Ci0JCX0KLQkJLy8JZWxzZSBpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEKSB7Ci0JCS8vCQlub3RpZmllci5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlckNsYXNzKTsKLQkJLy8JfQotCQkvLwllbHNlIGlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DSEFOR0UpIHsKLQkJLy8JfQotCQkvLwkJZWxzZSBpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFICYmCi0JCS8vIGlzSW50ZXJlc3Rpbmcob2xkVmFsdWUpKSB7Ci0JCS8vCQkJdW5hZGFwdE9uUmVtb3ZlKChYTUxOb2RlKW9sZFZhbHVlKTsKLQkJLy8JCX0KLQkJLy8JZWxzZSBpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQpIHsKLQkJLy8JfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb3BhZ2F0ZVRvKFhNTE5vZGUgbm9kZSkgewotCQkvLyBnZXQgYWRhcHRlciB0byBlbnN1cmUgaXRzIGNyZWF0ZWQKLQkJbm9kZS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlckNsYXNzKTsKLQkJYWRhcHRPbkNyZWF0ZShub2RlKTsKLQkJcHJvcGFnYXRlVG9DaGlsZHJlbihub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wYWdhdGVUb0NoaWxkcmVuKFhNTE5vZGUgcGFyZW50KSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJcHJvcGFnYXRlVG8oKFhNTE5vZGUpIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJvcGFnYXRpbmdBZGFwdGVyI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRPbkNyZWF0ZUZhY3Rvcmllcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L1hNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L1hNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2RlMTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQotCXB1YmxpYyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gc3VwZXIuZ2V0VHlwZSgpOwotCQkvLyBub3JtYWxseSwgd2Ugd2FudCB0aGUgc2Vjb25kIHJlZ2lvbiBhcyB0aGUgZmxhdG5vZGUgdHlwZSAuLi4gc2luY2UKLQkJLy8gdGhlCi0JCS8vIGZpcnN0IG9uZSBpcyB1c3VhbGx5IGp1c3QgIm9wZW4gdGFnIi4KLQkJaWYgKChyZXN1bHQgIT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgJiYgKGdldFJlZ2lvbnMoKS5zaXplKCkgPiAxKSkgewotCQkJcmVzdWx0ID0gZ2V0UmVnaW9ucygpLmdldCgxKS5nZXRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3V0aWwvRGVidWdEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC91dGlsL0RlYnVnRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhZmJjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3V0aWwvRGVidWdEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBEZWJ1Z0RvY3VtZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkR1bXAgb2YgRE9NIik7IC8vJE5PTi1OTFMtMSQKLQotCQlkdW1wKGRvY3VtZW50LCBTeXN0ZW0ub3V0KTsKLQotCQkvLwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCI9ID0gPSA9ID0gPSIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGR1bXAoRG9jdW1lbnQgZG9jdW1lbnQsIFByaW50U3RyZWFtIG91dCkgewotCQlOb2RlIG5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWR1bXAobm9kZSwgb3V0KTsKLQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKE5vZGUgdG9wTm9kZSkgewotCQlkdW1wKHRvcE5vZGUsIFN5c3RlbS5vdXQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKE5vZGUgdG9wTm9kZSwgUHJpbnRTdHJlYW0gb3V0KSB7Ci0JCWlmICh0b3BOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIHByaW50IG91dCB0aGlzIG5vZGUKLQkJLy8KLQkJcHJpbnROb2RlKHRvcE5vZGUsIG91dCk7Ci0KLQkJLy8gbm93IHByaW50IG91dCBpdHMgY2hpbGRyZW4KLQkJLy9Ob2RlTGlzdCBub2RlcyA9IHRvcE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkvL2ludCBsZW4gPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJLy9mb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0KLQkJLy9Ob2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkvL2R1bXAobm9kZSwgb3V0KTsKLQkJLy99Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50Tm9kZShOb2RlIHRvcE5vZGUpIHsKLQkJcHJpbnROb2RlKHRvcE5vZGUsIFN5c3RlbS5vdXQpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50Tm9kZShOb2RlIHRvcE5vZGUsIFByaW50U3RyZWFtIG91dCkgewotCQkvLyBwcmludCBvdXQgdGhpcyBub2RlCi0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSAoKFhNTE5vZGUpIHRvcE5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9ICgoWE1MTm9kZSkgdG9wTm9kZSkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHx8IChsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpKSB7Ci0JCQkvLyBubyB0ZXh0IHRvIG91dHB1dAotCQl9IGVsc2UgewotCQkJaW50IHN0YXJ0ID0gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWludCBlbmQgPSBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCi0JCQlTdHJpbmcgb3V0U3RyaW5nID0gdG9wTm9kZS50b1N0cmluZygpOwotCQkJb3V0U3RyaW5nID0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWwuU3RyaW5nVXRpbHMuZXNjYXBlKG91dFN0cmluZyk7Ci0JCQlvdXQucHJpbnRsbigiWyIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiXSIgKyBvdXRTdHJpbmcpOyAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBub3cgZG8gaXRzIGNoaWxkcmVuCi0JCU5vZGVMaXN0IG5vZGVzID0gdG9wTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBsZW4gPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJcHJpbnROb2RlKGNoaWxkTm9kZSwgb3V0KTsKLQkJfQotCi0JfQotCi0JcHVibGljIERlYnVnRG9jdW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Fic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQ0NjYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIEFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFZhbGlkYXRpb25Db21wb25lbnQgZ2V0UHJvcGFnYXRlZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFZhbGlkYXRpb25BZGFwdGVyIGdldFZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLnNlZC5hZGFwdGVycy52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlciN2YWxpZGF0ZShJbmRleGVkUmVnaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRWYWxpZGF0b3IoKS52YWxpZGF0ZShub2RlKTsKLQotCi0JCVByb3BhZ2F0b3IucHJvcGFnYXRlVG9DaGlsZEVsZW1lbnRzKGdldFByb3BhZ2F0ZWUoKSwgKE5vZGUpIG5vZGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Qcm9wYWdhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1Byb3BhZ2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkY2NhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1Byb3BhZ2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFByb3BhZ2F0b3IgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByb3BhZ2F0ZVRvQ2hpbGRFbGVtZW50cyhWYWxpZGF0aW9uQ29tcG9uZW50IHZhbGlkYXRvciwgTm9kZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDbGFzcyBjbGF6eiA9IHZhbGlkYXRvci5nZXRDbGFzcygpOwotCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0KLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgY2hpbGQ7Ci0JCQlWYWxpZGF0aW9uQWRhcHRlciB2YSA9IChWYWxpZGF0aW9uQWRhcHRlcikgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKGNsYXp6KTsKLQkJCWlmICh2YSA9PSBudWxsKSB7Ci0JCQkJbm90aWZpZXIuYWRkQWRhcHRlcih2YWxpZGF0b3IpOwotCQkJCXZhID0gdmFsaWRhdG9yOwotCQkJfQotCQkJdmEudmFsaWRhdGUoKEluZGV4ZWRSZWdpb24pIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3BhZ2F0b3IgaXMganVzdCBhIHBsYWNlaG9sZGVyIG9mIHV0aWxpdGllcy4gRG9uJ3QgaW5zdGFudGlhdGUuCi0JICovCi0JcHJpdmF0ZSBQcm9wYWdhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkNvbXBvbmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2Q5Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBWYWxpZGF0aW9uQWRhcHRlciB7Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFZhbGlkYXRpb25Db21wb25lbnQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbkNvbXBvbmVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IFZhbGlkYXRpb25BZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIFYyLgotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQl0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9qc3AvbW9kZWwvcGFyc2VyL3RlbXAvWE1MSlNQUmVnaW9uQ29udGV4dHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvanNwL21vZGVsL3BhcnNlci90ZW1wL1hNTEpTUFJlZ2lvbkNvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMWQ2NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9qc3AvbW9kZWwvcGFyc2VyL3RlbXAvWE1MSlNQUmVnaW9uQ29udGV4dHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmpzcC5tb2RlbC5wYXJzZXIudGVtcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5wYXJzZXIuWE1MUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIC8vVE9ETwotICogCi0gKiBAZGVwcmVjYXRlZCAtIG1hcmtlZCBhcyBkZXByZWNhdGVkIHRvIHdhcm4gb2YgcGVuZGluZyBjaGFuZ2VzLiBTZWUgdGhlCi0gKiAgICAgICAgICAgICBwYWNrYWdlLmh0bWwgZmlsZSBmb3IgZnVsbCBleHBsYW5hdGlvbi4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTEpTUFJlZ2lvbkNvbnRleHRzIGV4dGVuZHMgWE1MUmVnaW9uQ29udGV4dCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NMT1NFID0gIkpTUF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX09QRU4gPSAiSlNQX0NPTU1FTlRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9URVhUID0gIkpTUF9DT01NRU5UX1RFWFQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJKU1BfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfREVDTEFSQVRJT05fT1BFTiA9ICJKU1BfREVDTEFSQVRJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX0NMT1NFID0gIkpTUF9ESVJFQ1RJVkVfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfT1BFTiA9ICJKU1BfRElSRUNUSVZFX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX0NMT1NFID0gIkpTUF9FTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfQ09OVEVOVCA9ICJKU1BfRUxfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfRFFVT1RFID0gIkpTUF9FTF9EUVVPVEUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfT1BFTiA9ICJKU1BfRUxfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfUVVPVEVEX0NPTlRFTlQgPSAiSlNQX0VMX1FVT1RFRF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FTF9TUVVPVEUgPSAiSlNQX0VMX1NRVU9URSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRVhQUkVTU0lPTl9PUEVOID0gIkpTUF9FWFBSRVNTSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVRfT1BFTiA9ICJKU1BfU0NSSVBUTEVUX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9DTE9TRSA9ICJKU1BfVkJMX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfQ09OVEVOVCA9ICJKU1BfVkJMX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9EUVVPVEUgPSAiSlNQX1ZCTF9EUVVPVEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9PUEVOID0gIkpTUF9WQkxfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkJMX1FVT1RFRF9DT05URU5UID0gIkpTUF9WQkxfUVVPVEVEX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9TUVVPVEUgPSAiSlNQX1ZCTF9TUVVPVEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFID0gIlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSA9ICJYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2pzcC9tb2RlbC9wYXJzZXIvdGVtcC9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2pzcC9tb2RlbC9wYXJzZXIvdGVtcC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOWVmMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9qc3AvbW9kZWwvcGFyc2VyL3RlbXAvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08SFRNTD4KLVRoaXMgcGFja2FnZSBpcyBsb2NhdGVkIGhlcmUgaW4gdGhlIFhNTCBwcm9qZWN0Ci10ZW1wb3JhcmlseS4gT25jZSB0aGUgRE9NIFBhcnNlciBpcyBjbGVhbmluZ2x5IHNwbGl0Ci10byBYTUwgYW5kIEpTUCBjb21wb25lbnRzLCB0aGlzIHBhY2thZ2Ugd2lsbCBtb3ZlCi1iYWNrIHRvIEpTUCBwcm9qZWN0LiAoSWYgaXRzIG5vdCBoZXJlIHRlbXBvcmFyaWx5LCAKLWl0cyBlYXN5IHRvIGdldCBjaXJjbHVhciByZWZlcmVuY2VzIGluIHBsdWdpbi54bWwgCi1kZXBlbmRhbmNpZXMuCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9tb2RlbGhhbmRsZXIvRW1iZWRkZWRYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvbW9kZWxoYW5kbGVyL0VtYmVkZGVkWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjkxNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9tb2RlbGhhbmRsZXIvRW1iZWRkZWRYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MOwotCi0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZFhNTCBpbXBsZW1lbnRzIEVtYmVkZGVkVHlwZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBzdXBwb3J0ZWRNaW1lVHlwZXM7Ci0JcHVibGljIFN0cmluZyBDb250ZW50VHlwZUlEX0VtYmVkZGVkWE1MID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb250ZW50dHlwZS5FbWJlZGRlZFhNTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFbWJlZGRlZFhNTC4KLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjZ2V0QWRhcHRlckZhY3RvcmllcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MKCkpOwotCQkvLyBmYWN0b3JpZXMuYWRkQWxsKFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEZhY3Rvcmllcyh0aGlzKSk7Ci0JCXJldHVybiBmYWN0b3JpZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFbWJlZGRlZENvbnRlbnRUeXBlI2dldEZhbWlseUlkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZhbWlseUlkKCkgewotCQlyZXR1cm4gTW9kZWxIYW5kbGVyRm9yWE1MLkFzc29jaWF0ZWRDb250ZW50VHlwZUlEOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFN1cHBvcnRlZE1pbWVUeXBlcygpIHsKLQkJaWYgKHN1cHBvcnRlZE1pbWVUeXBlcyA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJ0ZXh0L3htbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cHBvcnRlZE1pbWVUeXBlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KElGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJLy9UT0RPOiBpbml0aWFsaXplCi0JfQotCi0JLyoKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjaW5pdGlhbGl6ZVBhcnNlcihSZWdpb25QYXJzZXIpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcikgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUgZm9yICJwdXJlIiBYTUwKLQkJLy8gY29tcGFyZSB3aXRoIFhIVE1MCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRYTUwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoSUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQkvLyBUT0RPOiBuZWVkIHRvIHVuZG8gYW55dGhpbmcgd2UgZGlkIGluIGluaXRpYWxpemUKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcikgewotCQkvLyBuZWVkIHRvIHVuZG8gYW55dGhpbmcgd2UgZGlkIGluIGluaXRpYWxpemUKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDkxMWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLk1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxoYW5kbGVyLkFic3RyYWN0TW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRMb2FkZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmVuY29kaW5nLlhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5lbmNvZGluZy5YTUxEb2N1bWVudExvYWRlcjsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGdlbmVyaWMgWE1MIG1vZGVsIGhhbmRsaW5nLiBJdCBpcyBhbHNvIG1hcmtlZCBhcyB0aGUgZGVmYXVsdAotICogY29udGVudCB0eXBlIGhhbmRsZXIuIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIGRlZmF1bHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0Jc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJRCA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyRm9yWE1MKCkgewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoVVNFX0ZJTEVfQlVGRkVSUykKLQkJCXJldHVybiBuZXcgRG9jdW1lbnRMb2FkZXJGb3JYTUwoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxNb2RlbExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9tb2RlbGhhbmRsZXIvWE1MTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvbW9kZWxoYW5kbGVyL1hNTE1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzBlNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9tb2RlbGhhbmRsZXIvWE1MTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLk1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmVuY29kaW5nLlhNTERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5EZWJ1Z0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUw7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGFuIFhNTCBmaWxlIGFuZCBjcmVhdGVzIGFuIFhNTCBTdHJ1Y3R1cmVkIE1vZGVsLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsTG9hZGVyIHsKLQotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJfRU5DT0RJTkcgPSAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBYTUxMb2FkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MTW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQkvLyBEb2VzIFhNTCBuZWVkIHByb3BhZ2F0aW5nIGFkYXB0ZXI/IE9yIGp1c3QgSlNQPwotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBYTUxEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBYTUxNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsSW1wbCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlzdXBlci5wcmVMb2FkQWRhcHQoc3RydWN0dXJlZE1vZGVsKTsKLQkJWE1MTW9kZWwgZG9tTW9kZWwgPSAoWE1MTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCi0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cykgewotCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ldyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNWYzZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwgZXh0ZW5kcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MKCkgewotCQl0aGlzKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyS2V5Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKi8KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeSNhZGFwdChJTm9kZU5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBvYmplY3QpIHsKLQkJcmV0dXJuIGFkYXB0TmV3KG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRG9jdW1lbnRNYW5hZ2VyKENNRG9jdW1lbnRNYW5hZ2VyIG1ncikgewotCQlzdXBlci5jb25maWd1cmVEb2N1bWVudE1hbmFnZXIobWdyKTsKLQkJbWdyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BU1lOQ19MT0FELCB0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTdjMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuSWRSZXNvbHZlcjsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnlBZGFwdGVySW1wbCBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgc3RhdGVOb3RpZmllciA9IG51bGw7Ci0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MKCkgewotCQl0aGlzKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGF1dG9Mb2FkQ00oKSB7Ci0JCS8vIHVudGlsIHRoZSBleGlzdGVuY2Ugb2YgYSBDTURvY3VtZW50UmVxdWVzdGVyRmFjdG9yeSB0byBjcmVhdGUgdGhlCi0JCS8vIGxvYWQgcmVxdWVzdHMsCi0JCS8vIHJldHVybiB0cnVlCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZURvY3VtZW50TWFuYWdlcihDTURvY3VtZW50TWFuYWdlciBtZ3IpIHsKLQkJLy8gdGhpcyBkZXBlbmRzIG9uIHRoZXJlIGJlaW5nIGEgQ01Eb2N1bWVudFJlcXVlc3RlckZhY3RvcnkgaW5zdGFsbGVkCi0JCW1nci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FELCBhdXRvTG9hZENNKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCi0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MKHRoaXMuYWRhcHRlcktleSwgdGhpcy5zaG91bGRSZWdpc3RlckFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUFkYXB0ZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0KLQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLkRlYnVnLmRpc3BsYXlJbmZvKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC5jcmVhdGVBZGFwdGVyIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVySW1wbCA9PSBudWxsKSB7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgWE1MTm9kZSkgewotCQkJCVhNTE5vZGUgeG1sTm9kZSA9IChYTUxOb2RlKSB0YXJnZXQ7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHN0YXRlTm90aWZpZXIgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpLnRvRmlsZSgpOwotCQkJCWlmKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJYmFzZUxvY2F0aW9uID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJhc2VMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5EZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLi4uIGJhc2VMb2NhdGlvbiA6ICIgKyBiYXNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJCQlDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlID0gbmV3IENNRG9jdW1lbnRDYWNoZSgpOwotCQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IG51bGw7Ci0JCQkJSWRSZXNvbHZlciBpZFJlc29sdmVyID0gbnVsbDsKLQotCQkJCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbC5EZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKlhNTE1vZGVsUXVlcnlJbXBsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbW9kZWwuZ2V0UmVzb2x2ZXIoKSk7Ci0JCQkJbW9kZWxRdWVyeSA9IG5ldyBYTUxNb2RlbFF1ZXJ5SW1wbChjbURvY3VtZW50Q2FjaGUsIGlkUmVzb2x2ZXIpOwotCi0JCQkJLy8gY3MgdG9kby4uLgotCQkJCS8vIGZvciBub3cgd2UgY3JlYXRlIGEgQ01Eb2N1bWVudENhY2hlIG9uIGEgJ3BlciBlZGl0b3InIGJhc2lzCi0JCQkJLy8gaW4gdGhlIGZ1dHVyZSB3ZSBuZWVkIHRvIHN1cHBvcnQgYSBDTURvY3VtZW50Q2FjaGUgdGhhdCBpcwotCQkJCS8vIHNoYXJlZCBiZXR3ZWVuIGVkaXRvcnMKLQkJCQkvLyBuc2QgY29tbWVudDogbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSBkZXBlbmRpbmcgb24KLQkJCQlDTURvY3VtZW50TWFuYWdlciBkb2N1bWVudE1hbmFnZXIgPSBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCWNvbmZpZ3VyZURvY3VtZW50TWFuYWdlcihkb2N1bWVudE1hbmFnZXIpOwotCQkJCX0KLQkJCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwgPSBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKGNtRG9jdW1lbnRDYWNoZSwgbW9kZWxRdWVyeSwgaWRSZXNvbHZlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JICogICAgICBJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCXN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQlzdGF0ZU5vdGlmaWVyID0gbmV3TW9kZWw7Ci0JCXVwZGF0ZVJlc29sdmVyKHN0YXRlTm90aWZpZXIpOwotCQlzdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWlmIChzdGF0ZU5vdGlmaWVyICE9IG51bGwpCi0JCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJc3RhdGVOb3RpZmllciA9IG51bGw7Ci0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlckltcGwgIT0gbnVsbCkKLQkJCW1vZGVsUXVlcnlBZGFwdGVySW1wbC5yZWxlYXNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb2x2ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCUlGaWxlIGJhc2VGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKSk7Ci0JCWlmKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwuc2V0SWRSZXNvbHZlcihuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL21vZGVscXVlcnkvTW9kZWxRdWVyeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmOGNkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL21vZGVscXVlcnkvTW9kZWxRdWVyeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuSWRSZXNvbHZlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBhc3NvY2lhdGUgTW9kZWxRdWVyeSAoYW5kIHJlbGF0ZWQgZGF0YSkgd2l0aCBhCi0gKiBEb2N1bWVudCAob3IgSVN0cnVjdHVyZWRNb2RlbCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5VXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoRG9jdW1lbnQgbm9kZSkgewotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IGdldE1vZGVsUXVlcnlBZGFwdGVyKG5vZGUpOwotCQlyZXR1cm4gbW9kZWxRdWVyeUFkYXB0ZXIgIT0gbnVsbCA/IG1vZGVsUXVlcnlBZGFwdGVyLmdldENNRG9jdW1lbnRDYWNoZSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElkUmVzb2x2ZXIgZ2V0SWRSZXNvbHZlcihEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0SWRSZXNvbHZlcigpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmICgoIShtb2RlbCBpbnN0YW5jZW9mIFhNTE1vZGVsKSkgfHwgbW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0TW9kZWxRdWVyeSgoKFhNTE1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNb2RlbFF1ZXJ5QWRhcHRlciBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0JCQlyZXN1bHQgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL21vZGVscXVlcnkvWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvbW9kZWxxdWVyeS9YTUxDYXRhbG9nSWRSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzhkYTY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvbW9kZWxxdWVyeS9YTUxDYXRhbG9nSWRSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIuWE1MQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLlhNTENhdGFsb2dQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLklkUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLlVSSUhlbHBlcjsKLQotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIgaW1wbGVtZW50cyBJZFJlc29sdmVyIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlTG9jYXRpb247Ci0KLQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXI7Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoU3RyaW5nIHJlc291cmNlTG9jYXRpb24pIHsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoU3RyaW5nIHJlc291cmNlTG9jYXRpb24sIFVSSVJlc29sdmVyIHVyaXJlc29sdmVyKSB7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCXRoaXMudXJpcmVzb2x2ZXIgPSB1cmlyZXNvbHZlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlTG9jYXRpb24uCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUxvY2F0aW9uKCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJaWYgKHVyaXJlc29sdmVyICE9IG51bGwpCi0JCQkJbG9jYXRpb24gPSB1cmlyZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVJZChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlyZXR1cm4gcmVzb2x2ZUlkKGdldFJlc291cmNlTG9jYXRpb24oKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVJZChTdHJpbmcgYmFzZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJLy8gZmlyc3Qgc2VlIGlmIHdlIGNhbiBtYXAgdGhlIHB1YmxpY0lkIHRvIGFuIGFsdGVybmF0aXZlIHN5c3RlbUlkCi0JCS8vIG5vdGU6IHNob3VsZCBwcm9iYWJseSB2ZXJpZnkgdGhlIG1hcHBlZFN5c3RlbUlkIGJlZm9yZSBpZ25vcmluZyB0aGUKLQkJLy8gc3lzdGVtSWQKLQkJWE1MQ2F0YWxvZyB4bWxDYXRhbG9nID0gWE1MQ2F0YWxvZ1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCVN0cmluZyBtYXBwZWRTeXN0ZW1JZCA9IHhtbENhdGFsb2cuZ2V0TWFwcGVkU3lzdGVtSWQocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJaWYgKG1hcHBlZFN5c3RlbUlkICE9IG51bGwpIHsKLQkJCXN5c3RlbUlkID0gbWFwcGVkU3lzdGVtSWQ7Ci0JCX0KLQotCQkvLyBub3JtYWxpemUgdGhlIHN5c3RlbUlkCi0JCWJvb2xlYW4gbm9ybWFsaXplZCA9IGZhbHNlOwotCQkvLyBhY2NvdW50IGZvciBXZWIgUHJvamVjdHMgYW5kIG90aGVycyB3aGVyZSAqYW55KiBzdHJpbmcgbWF5IGxlZ2FsbHkKLQkJLy8gcmVzb2x2ZSBzb21laG93Ci0JCWlmICh0aGlzLnVyaXJlc29sdmVyICE9IG51bGwgJiYgc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJLy8gY2hlY2sgdGhlIHByb3ZpZGVkIFVSSVJlc29sdmVyCi0JCQlTdHJpbmcgcmVzb2x2ZWRWYWx1ZSA9IHRoaXMudXJpcmVzb2x2ZXIuZ2V0TG9jYXRpb25CeVVSSShzeXN0ZW1JZCwgYmFzZSk7Ci0JCQlpZiAocmVzb2x2ZWRWYWx1ZSAhPSBudWxsICYmIHJlc29sdmVkVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3lzdGVtSWQgPSByZXNvbHZlZFZhbHVlOwotCQkJCW5vcm1hbGl6ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICghbm9ybWFsaXplZCkgewotCQkJLy8gbm8gVVJJUmVzb2x2ZXIgYXZhaWxhYmxlOyBhc2sgdGhlIFVSSUhlbHBlciBkaXJlY3RseQotCQkJc3lzdGVtSWQgPSBVUklIZWxwZXIubm9ybWFsaXplKHN5c3RlbUlkLCBiYXNlLCBudWxsKTsKLQkJCW5vcm1hbGl6ZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBzeXN0ZW1JZDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhNTVkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuWE1MQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuSWRSZXNvbHZlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcgotICovCi1jbGFzcyBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBleHRlbmRzIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIElkUmVzb2x2ZXIgaWRSZXNvbHZlcjsKLQotCXB1YmxpYyBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIElkUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlzdXBlcihjYWNoZSk7Ci0JCXRoaXMuaWRSZXNvbHZlciA9IGlkUmVzb2x2ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlR3JhbW1hclVSSShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJcmV0dXJuIGlkUmVzb2x2ZXIucmVzb2x2ZUlkKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjMWMxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuTW9kZWxRdWVyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVscXVlcnkuTW92YWJsZU1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLklkUmVzb2x2ZXI7Ci0KLQotcHVibGljIGNsYXNzIFhNTE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgaW1wbGVtZW50cyBNb3ZhYmxlTW9kZWxRdWVyeSB7Ci0KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGZDYWNoZSA9IG51bGw7Ci0KLQlwdWJsaWMgWE1MTW9kZWxRdWVyeUltcGwoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBJZFJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIobmV3IFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKSk7Ci0JCWZDYWNoZSA9IGNhY2hlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW92YWJsZU1vZGVsUXVlcnkjc2V0SWRSZXNvbHZlcihJZFJlc29sdmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkUmVzb2x2ZXIoSWRSZXNvbHZlciBuZXdJZFJlc29sdmVyKSB7Ci0JCW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyID0gbmV3IFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGZDYWNoZSwgbmV3SWRSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9wYXJzZXIvWE1MUmVnaW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9wYXJzZXIvWE1MUmVnaW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGI0MjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvcGFyc2VyL1hNTFJlZ2lvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnBhcnNlcjsKLQotcHVibGljIGludGVyZmFjZSBYTUxSZWdpb25Db250ZXh0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMT0NLX1RFWFQgPSAiQkxPQ0tfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOREVGSU5FRCA9ICJVTkRFRklORUQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURV9TUEFDRSA9ICJXSElURV9TUEFDRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUTElTVF9ERUNMX0NMT1NFID0gIlhNTF9BVFRMSVNUX0RFQ0xfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FUVExJU1RfREVDTF9DT05URU5UID0gIlhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUTElTVF9ERUNMX05BTUUgPSAiWE1MX0FUVExJU1RfREVDTF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FUVExJU1RfREVDTEFSQVRJT04gPSAiWE1MX0FUVExJU1RfREVDTEFSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NEQVRBX0NMT1NFID0gIlhNTF9DREFUQV9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0RBVEFfT1BFTiA9ICJYTUxfQ0RBVEFfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0RBVEFfVEVYVCA9ICJYTUxfQ0RBVEFfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0hBUl9SRUZFUkVOQ0UgPSAiWE1MX0NIQVJfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DT01NRU5UX0NMT1NFID0gIlhNTF9DT01NRU5UX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfT1BFTiA9ICJYTUxfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DT01NRU5UX1RFWFQgPSAiWE1MX0NPTU1FTlRfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DT05URU5UID0gIlhNTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ERUNMQVJBVElPTl9DTE9TRSA9ICJYTUxfREVDTEFSQVRJT05fQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfREVDTEFSQVRJT05fT1BFTiA9ICJYTUxfREVDTEFSQVRJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OID0gIlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFID0gIlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQyA9ICJYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYgPSAiWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTSA9ICJYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUID0gIlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9OQU1FID0gIlhNTF9ET0NUWVBFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9DTE9TRSA9ICJYTUxfRUxFTUVOVF9ERUNMX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVCA9ICJYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9OQU1FID0gIlhNTF9FTEVNRU5UX0RFQ0xfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gIlhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTVBUWV9UQUdfQ0xPU0UgPSAiWE1MX0VNUFRZX1RBR19DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRU5EX1RBR19PUEVOID0gIlhNTF9FTkRfVEFHX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VOVElUWV9SRUZFUkVOQ0UgPSAiWE1MX0VOVElUWV9SRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUEVfUkVGRVJFTkNFID0gIlhNTF9QRV9SRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BJX0NMT1NFID0gIlhNTF9QSV9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUElfQ09OVEVOVCA9ICJYTUxfUElfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUElfT1BFTiA9ICJYTUxfUElfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgPSAiWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX05BTUUgPSAiWE1MX1RBR19BVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRSA9ICJYTUxfVEFHX0FUVFJJQlVURV9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX0NMT1NFID0gIlhNTF9UQUdfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19OQU1FID0gIlhNTF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfT1BFTiA9ICJYTUxfVEFHX09QRU4iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxNjI5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQucnVsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuRm9yZWlnblJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLkJsb2NrVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUucGFyc2VyLlhNTFJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUX0RFRkFVTFRfWE1MID0gIm9yZy5lY2xpcHNlLndzdC54bWwuREVGQVVMVF9YTUwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RfWE1MX0NEQVRBID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0NEQVRBIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUX1hNTF9QSSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9QSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVF9YTUxfREVDTEFSQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVDTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVF9YTUxfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2hvdWxkIG1hdGNoCi0JICogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmR0ZC5wYXJ0aXRpb25pbmcuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5TVF9EVERfU1VCU0VUCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RfRFREX1NVQlNFVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmR0ZC5pbnRlcm5hbF9zdWJzZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBjb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde1NUX0RFRkFVTFRfWE1MLCBTVF9YTUxfQ0RBVEEsIFNUX1hNTF9QSSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9YTUxfQ09NTUVOVCwgU1RfRFREX1NVQlNFVH07Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSlNQRG9jdW1lbnRQYXJ0aW9uZXIuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIuc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gY29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLm1vZGVsLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjZ2V0UGFydGl0aW9uVHlwZShjb20uaWJtLnNlZC5zdHJ1Y3R1cmVkRG9jdW1lbnQuSVRleHRSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKQotCQkJcmVzdWx0ID0gU1RfWE1MX0NPTU1FTlQ7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkKLQkJCXJlc3VsdCA9IFNUX1hNTF9DREFUQTsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKQotCQkJcmVzdWx0ID0gU1RfWE1MX1BJOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pCi0JCQlyZXN1bHQgPSBTVF9YTUxfREVDTEFSQVRJT047Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQpCi0JCQlyZXN1bHQgPSBTVF9EVERfU1VCU0VUOwotCQllbHNlCi0JCQlyZXN1bHQgPSBzdXBlci5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoRm9yZWlnblJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJLy8gdGVtcCBhZGRlZCBqdXN0IHRvIGRpcy1hbWJpZ3VhdGUgY2FsbCBmcm9tIHN1YmNsYXNzCi0JCXJldHVybiBzdXBlci5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uc2VkLnN0cnVjdHVyZWREb2N1bWVudC5wYXJ0aXRpb24uSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uLAotCSAqICAgICAgY29tLmlibS5zZWQuc3RydWN0dXJlZERvY3VtZW50LklUZXh0UmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c05vZGUsIElUZXh0UmVnaW9uIHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlLCBJVGV4dFJlZ2lvbiBuZXh0RW5kVGFnTmFtZVJlZ2lvbikgewotCQlyZXR1cm4gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4ocHJldmlvdXNOb2RlLCBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiwgbmV4dE5vZGUsIG5leHRFbmRUYWdOYW1lUmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBTVF9ERUZBVUxUX1hNTDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwgaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0LCBTdHJpbmcgcmVzdWx0KSB7Ci0JCS8vIHdhcyBtb3ZlZCB0byBzdWJjbGFzcyBmb3IgcXVpY2sgdHJhbnNpdGlvbgotCQlTdHJpbmcgbmV3UmVzdWx0ID0gcmVzdWx0OwotCQkvLyBuc2RfVE9ETzogRGF2aWQgYW5kIEkgbmVlZCB0byBkaXNjdXNzLCBkZXNpZ24sIGFuZCBpbXBsZW1lbnQgdGhpcwotCQkvLyBmb3IgYWxsIGJsb2NrIHRhZ3MgYW5kIGNvbW1lbnRzCi0JCS8vIGFuZCBtYWtlIHN1cmUgaXMgcGFydCBvZiAiZXh0ZW5zaWJsZSIgZGVzaWduIG9mIGJsb2NrIHRhZ3MKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkvLyBmb3IgY29kZSBzYWZldHksIHdlJ2xsIGFsd2F5cyBjaGVjayBpbnN0YW5jZW9mLCBidXQgSSB0aGluawotCQkJLy8gYWx3YXlzIHRydWUuCi0JCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgQmxvY2tUZXh0UmVnaW9uKSB7Ci0JCQkJLy8gc3VwZXIgaXMgdXNlZCBiZWxvdyBzbyB3b24ndCBiZSBhbWJpZ3VvdXMKLQkJCQluZXdSZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChCbG9ja1RleHRSZWdpb24pIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJCX0gZWxzZSBpZiAocmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCW5ld1Jlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKEZvcmVpZ25SZWdpb24pIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3UmVzdWx0ID0gZ2V0VW5rbm93bigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9QYXJzZXJTcGVjaWZpY0NoZWNrKGludCBvZmZzZXQsIGJvb2xlYW4gcGFydGl0aW9uRm91bmQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5leHQsIElUZXh0UmVnaW9uIHByZXZpb3VzU3RhcnQpIHsKLQkJLy8gdGhpcyB3YXMgbW92ZWQgZG93biB0byBzdWJjbGFzcyBvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpb25lcgotCQkvLyBmb3IgcXVpY2sgZml4IHRvIHRyYW5zaXRpb24gcHJvYmxlbXMuIEhlaXJhcmNoeSBuZWVkcyBsb3RzIG9mCi0JCS8vIGNsZWFudXAuCi0JCWlmIChwcmV2aW91c1N0YXJ0ICE9IG51bGwgJiYgcHJldmlvdXNTdGFydC5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgbmV4dC5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlJVGV4dFJlZ2lvbiBwcmV2aW91c05hbWUgPSBwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQocHJldmlvdXNTdGFydCkpOwotCQkJSVRleHRSZWdpb24gbmV4dE5hbWUgPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRFbmRPZmZzZXQobmV4dCkpOwotCQkJaWYgKHByZXZpb3VzTmFtZSAhPSBudWxsICYmIG5leHROYW1lICE9IG51bGwgJiYgcHJldmlvdXNOYW1lLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSAmJiBuZXh0TmFtZS5nZXRUeXBlKCkgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIDAsIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2aW91c05hbWUsIHNkUmVnaW9uLCBuZXh0TmFtZSkpOwotCQkJCXBhcnRpdGlvbkZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uRm91bmQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3Jhbmdlcy9DT1BZUklHSFQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvQ09QWVJJR0hULmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MDQ5YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3Jhbmdlcy9DT1BZUklHSFQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvbG9vc2UuZHRkIj4KLTxodG1sPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgICA8dGl0bGU+VzNDIElQUiBTT0ZUV0FSRSBOT1RJQ0U8L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiPgotICAgIDxoMT4KLSAgICAgIFczQyBJUFIgU09GVFdBUkUgTk9USUNFCi0gICAgPC9oMT4KLSAgICA8aDM+Ci0gICAgICBDb3B5cmlnaHQgJmNvcHk7IDIwMDAgPGxvYyBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8iPldvcmxkIFdpZGUgV2ViCi0gICAgICBDb25zb3J0aXVtPC9sb2M+LCAoPGxvYyBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1LyI+TWFzc2FjaHVzZXR0cwotICAgICAgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3k8L2xvYz4sIDxsb2MgaHJlZj0iaHR0cDovL3d3dy5pbnJpYS5mci8iPkluc3RpdHV0Ci0gICAgICBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlPC9sb2M+LCA8bG9jCi0gICAgICBocmVmPSJodHRwOi8vd3d3LmtlaW8uYWMuanAvIj5LZWlvIFVuaXZlcnNpdHk8L2xvYz4pLiBBbGwgUmlnaHRzCi0gICAgICBSZXNlcnZlZC4KLSAgICA8L2gzPgotICAgIDxwPgotICAgICAgVGhlIERPTSBiaW5kaW5ncyBhcmUgcHVibGlzaGVkIHVuZGVyIHRoZSBXM0MgU29mdHdhcmUgQ29weXJpZ2h0IE5vdGljZQotICAgICAgYW5kIExpY2Vuc2UuIFRoZSBzb2Z0d2FyZSBsaWNlbnNlIHJlcXVpcmVzICJOb3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IKLSAgICAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIFczQyBmaWxlcywgaW5jbHVkaW5nIHRoZSBkYXRlIGNoYW5nZXMgd2VyZSBtYWRlLiIKLSAgICAgIENvbnNlcXVlbnRseSwgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIERPTSBiaW5kaW5ncyBtdXN0IGRvY3VtZW50IHRoYXQKLSAgICAgIHRoZXkgZG8gbm90IGNvbmZvcm0gdG8gdGhlIFczQyBzdGFuZGFyZDsgaW4gdGhlIGNhc2Ugb2YgdGhlIElETCBiaW5kaW5nLAotICAgICAgdGhlIHByYWdtYSBwcmVmaXggY2FuIG5vIGxvbmdlciBiZSAndzNjLm9yZyc7IGluIHRoZSBjYXNlIG9mIHRoZSBKYXZhCi0gICAgICBiaW5kaW5nLCB0aGUgcGFja2FnZSBuYW1lcyBjYW4gbm8gbG9uZ2VyIGJlIGluIHRoZSAnb3JnLnczYycgcGFja2FnZS4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICA8Yj5Ob3RlOjwvYj4gVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFczQyBTb2Z0d2FyZSBDb3B5cmlnaHQgTm90aWNlCi0gICAgICBhbmQgTGljZW5zZSBjb3VsZCBiZSBmb3VuZCBhdCA8YQotICAgICAgaHJlZj0naHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAnPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwPC9hPgotICAgIDwvcD4KLSAgICA8aDM+Ci0gICAgICBDb3B5cmlnaHQgJmNvcHk7IDE5OTQtMjAwMCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8iPldvcmxkIFdpZGUgV2ViCi0gICAgICBDb25zb3J0aXVtPC9hPiwgKDxhIGhyZWY9Imh0dHA6Ly93d3cubGNzLm1pdC5lZHUvIj5NYXNzYWNodXNldHRzCi0gICAgICBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5yaWEuZnIvIj5JbnN0aXR1dAotICAgICAgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZTwvYT4sIDxhCi0gICAgICBocmVmPSJodHRwOi8vd3d3LmtlaW8uYWMuanAvIj5LZWlvIFVuaXZlcnNpdHk8L2E+KS4gQWxsIFJpZ2h0cwotICAgICAgUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvCi0gICAgPC9oMz4KLSAgICA8cD4KLSAgICAgIFRoaXMgVzNDIHdvcmsgKGluY2x1ZGluZyBzb2Z0d2FyZSwgZG9jdW1lbnRzLCBvciBvdGhlciByZWxhdGVkIGl0ZW1zKSBpcwotICAgICAgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZS4gQnkKLSAgICAgIG9idGFpbmluZywgdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdAotICAgICAgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQKLSAgICAgIGNvbmRpdGlvbnM6Ci0gICAgPC9wPgotICAgIDxwPgotICAgICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIGFuZCBtb2RpZnkgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24sCi0gICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCZuYnNwOyBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIG9yCi0gICAgICByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24gQUxMCi0gICAgICBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZwotICAgICAgbW9kaWZpY2F0aW9ucywgdGhhdCB5b3UgbWFrZToKLSAgICA8L3A+Ci0gICAgPG9sPgotICAgICAgPGxpPgotCVRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUKLQlyZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgd29yay4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0JQW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zCi0JYW5kIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIGEgc2hvcnQgbm90aWNlIG9mIHRoZSBmb2xsb3dpbmcgZm9ybQotCShoeXBlcnRleHQgaXMgcHJlZmVycmVkLCB0ZXh0IGlzIHBlcm1pdHRlZCkgc2hvdWxkIGJlIHVzZWQgd2l0aGluIHRoZQotCWJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlOiAiQ29weXJpZ2h0ICZjb3B5OwotCVskZGF0ZS1vZi1zb2Z0d2FyZV0gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvIj5Xb3JsZCBXaWRlIFdlYgotCUNvbnNvcnRpdW08L2E+LCAoPGEgaHJlZj0iaHR0cDovL3d3dy5sY3MubWl0LmVkdS8iPk1hc3NhY2h1c2V0dHMKLQlJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5yaWEuZnIvIj5JbnN0aXR1dAotCU5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWU8L2E+LCA8YQotCWhyZWY9Imh0dHA6Ly93d3cua2Vpby5hYy5qcC8iPktlaW8gVW5pdmVyc2l0eTwvYT4pLiAgQWxsIFJpZ2h0cwotCVJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyIKLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0JTm90aWNlIG9mIGFueSBjaGFuZ2VzIG9yIG1vZGlmaWNhdGlvbnMgdG8gdGhlIFczQyBmaWxlcywgaW5jbHVkaW5nIHRoZQotCWRhdGUgY2hhbmdlcyB3ZXJlIG1hZGUuIChXZSByZWNvbW1lbmQgeW91IHByb3ZpZGUgVVJJcyB0byB0aGUgbG9jYXRpb24KLQlmcm9tIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKQotICAgICAgPC9saT4KLSAgICA8L29sPgotICAgIDxwPgotICAgICAgVEhJUyBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMsIiBBTkQgQ09QWVJJR0hUCi0gICAgICBIT0xERVJTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwKLSAgICAgIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MKLSAgICAgIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IKLSAgICAgIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsCi0gICAgICBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICBDT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SCi0gICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IKLSAgICAgIERPQ1VNRU5UQVRJT04uCi0gICAgPC9wPgotICAgIDxwPgotICAgICAgVGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgY29weXJpZ2h0IGhvbGRlcnMgbWF5IE5PVCBiZSB1c2VkIGluCi0gICAgICBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKLSAgICAgIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGl0bGUgdG8gY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgYW5kIGFueQotICAgICAgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYXQgYWxsIHRpbWVzIHJlbWFpbiB3aXRoIGNvcHlyaWdodAotICAgICAgaG9sZGVycy4KLSAgICA8L3A+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvRG9jdW1lbnRSYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3Jhbmdlcy9Eb2N1bWVudFJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MGQwODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3Jhbmdlcy9Eb2N1bWVudFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20ucmFuZ2VzOwotCi0vKioKLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1UcmF2ZXJzYWwtUmFuZ2UtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBUcmF2ZXJzYWwgYW5kIFJhbmdlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRSYW5nZSB7Ci0JLyoqCi0JICogVGhpcyBpbnRlcmZhY2UgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlCi0JICogPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IGludGVyZmFjZSB1c2luZyBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcKLQkgKiBtZXRob2RzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIFJhbmdlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QgaXMKLQkgKiAgICAgICAgIHN1Y2ggdGhhdCBib3RoIG9mIGl0cyBib3VuZGFyeS1wb2ludHMgYXJlIHBvc2l0aW9uZWQgYXQgdGhlCi0JICogICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgRG9jdW1lbnQsIGJlZm9yZSBhbnkgY29udGVudC4KLQkgKiAgICAgICAgIFRoZSBSYW5nZSByZXR1cm5lZCBjYW4gb25seSBiZSB1c2VkIHRvIHNlbGVjdCBjb250ZW50Ci0JICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBEb2N1bWVudCwgb3Igd2l0aCBEb2N1bWVudEZyYWdtZW50cyBhbmQKLQkgKiAgICAgICAgIEF0dHJzIGZvciB3aGljaCB0aGlzIERvY3VtZW50IGlzIHRoZSA8Y29kZT5vd25lckRvY3VtZW50PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUmFuZ2UgY3JlYXRlUmFuZ2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3Jhbmdlcy9SYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3Jhbmdlcy9SYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2MzNjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20ucmFuZ2VzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiA8cD4KLSAqIFNlZSBhbHNvIHRoZSA8YQotICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItVHJhdmVyc2FsLVJhbmdlLTIwMDAxMTEzJz5Eb2N1bWVudAotICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgVHJhdmVyc2FsIGFuZCBSYW5nZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiAKLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJhbmdlIHsKLQkvKioKLQkgKiBDb21wYXJlIGVuZCBib3VuZGFyeS1wb2ludCBvZiA8Y29kZT5zb3VyY2VSYW5nZTwvY29kZT4gdG8gZW5kCi0JICogYm91bmRhcnktcG9pbnQgb2YgUmFuZ2Ugb24gd2hpY2ggPGNvZGU+Y29tcGFyZUJvdW5kYXJ5UG9pbnRzPC9jb2RlPgotCSAqIGlzIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBFTkRfVE9fRU5EID0gMjsKLQkvKioKLQkgKiBDb21wYXJlIGVuZCBib3VuZGFyeS1wb2ludCBvZiA8Y29kZT5zb3VyY2VSYW5nZTwvY29kZT4gdG8gc3RhcnQKLQkgKiBib3VuZGFyeS1wb2ludCBvZiBSYW5nZSBvbiB3aGljaCA8Y29kZT5jb21wYXJlQm91bmRhcnlQb2ludHM8L2NvZGU+Ci0JICogaXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEVORF9UT19TVEFSVCA9IDM7Ci0JLyoqCi0JICogQ29tcGFyZSBzdGFydCBib3VuZGFyeS1wb2ludCBvZiA8Y29kZT5zb3VyY2VSYW5nZTwvY29kZT4gdG8gZW5kCi0JICogYm91bmRhcnktcG9pbnQgb2YgUmFuZ2Ugb24gd2hpY2ggPGNvZGU+Y29tcGFyZUJvdW5kYXJ5UG9pbnRzPC9jb2RlPgotCSAqIGlzIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBTVEFSVF9UT19FTkQgPSAxOwotCi0JLy8gQ29tcGFyZUhvdwotCS8qKgotCSAqIENvbXBhcmUgc3RhcnQgYm91bmRhcnktcG9pbnQgb2YgPGNvZGU+c291cmNlUmFuZ2U8L2NvZGU+IHRvIHN0YXJ0Ci0JICogYm91bmRhcnktcG9pbnQgb2YgUmFuZ2Ugb24gd2hpY2ggPGNvZGU+Y29tcGFyZUJvdW5kYXJ5UG9pbnRzPC9jb2RlPgotCSAqIGlzIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBTVEFSVF9UT19TVEFSVCA9IDA7Ci0KLQkvKioKLQkgKiBEdXBsaWNhdGVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlCi0JICogCi0JICogQHJldHVybiBBIERvY3VtZW50RnJhZ21lbnQgdGhhdCBjb250YWlucyBjb250ZW50IGVxdWl2YWxlbnQgdG8gdGhpcwotCSAqICAgICAgICAgUmFuZ2UuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiBhIERvY3VtZW50VHlwZSBub2RlCi0JICogICAgICAgICAgICAgICAgd291bGQgYmUgZXh0cmFjdGVkIGludG8gdGhlIG5ldyBEb2N1bWVudEZyYWdtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgY2xvbmVDb250ZW50cygpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQcm9kdWNlcyBhIG5ldyBSYW5nZSB3aG9zZSBib3VuZGFyeS1wb2ludHMgYXJlIGVxdWFsIHRvIHRoZQotCSAqIGJvdW5kYXJ5LXBvaW50cyBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQHJldHVybiBUaGUgZHVwbGljYXRlZCBSYW5nZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBSYW5nZSBjbG9uZVJhbmdlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbGxhcHNlIGEgUmFuZ2Ugb250byBvbmUgb2YgaXRzIGJvdW5kYXJ5LXBvaW50cwotCSAqIAotCSAqIEBwYXJhbSB0b1N0YXJ0SWYKLQkgKiAgICAgICAgICAgIFRSVUUsIGNvbGxhcHNlcyB0aGUgUmFuZ2Ugb250byBpdHMgc3RhcnQ7IGlmIEZBTFNFLAotCSAqICAgICAgICAgICAgY29sbGFwc2VzIGl0IG9udG8gaXRzIGVuZC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbGxhcHNlKGJvb2xlYW4gdG9TdGFydCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbXBhcmUgdGhlIGJvdW5kYXJ5LXBvaW50cyBvZiB0d28gUmFuZ2VzIGluIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGhvd0EKLQkgKiAgICAgICAgICAgIGNvZGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIGNvbXBhcmlzb24sIGFzIGRlZmluZWQgYWJvdmUuCi0JICogQHBhcmFtIHNvdXJjZVJhbmdlVGhlCi0JICogICAgICAgICAgICA8Y29kZT5SYW5nZTwvY29kZT4gb24gd2hpY2ggdGhpcyBjdXJyZW50Ci0JICogICAgICAgICAgICA8Y29kZT5SYW5nZTwvY29kZT4gaXMgY29tcGFyZWQgdG8uCi0JICogQHJldHVybiAtMSwgMCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nCi0JICogICAgICAgICBib3VuZGFyeS1wb2ludCBvZiB0aGUgUmFuZ2UgaXMgcmVzcGVjdGl2ZWx5IGJlZm9yZSwgZXF1YWwgdG8sCi0JICogICAgICAgICBvciBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBib3VuZGFyeS1wb2ludCBvZgotCSAqICAgICAgICAgPGNvZGU+c291cmNlUmFuZ2U8L2NvZGU+LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgdGhlIHR3byBSYW5nZXMgYXJlIG5vdCBpbgotCSAqICAgICAgICAgICAgICAgIHRoZSBzYW1lIERvY3VtZW50IG9yIERvY3VtZW50RnJhZ21lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHNob3J0IGhvdywgUmFuZ2Ugc291cmNlUmFuZ2UpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlIGZyb20gdGhlIGNvbnRhaW5pbmcgZG9jdW1lbnQgb3IKLQkgKiBkb2N1bWVudCBmcmFnbWVudCB3aXRob3V0IHJldHVybmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVtb3ZlZCBjb250ZW50LgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW55IHBvcnRpb24gb2YKLQkgKiAgICAgICAgICAgICAgICB0aGUgY29udGVudCBvZiB0aGUgUmFuZ2UgaXMgcmVhZC1vbmx5IG9yIGFueSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBub2RlcyB0aGF0IGNvbnRhaW4gYW55IG9mIHRoZSBjb250ZW50IG9mIHRoZSBSYW5nZSBhcmUKLQkgKiAgICAgICAgICAgICAgICByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVDb250ZW50cygpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUmFuZ2UgaXMgbm8gbG9uZ2VyIGluIHVzZSBhbmQgdGhhdCB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBtYXkgcmVsaW5xdWlzaCBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJhbmdlLgotCSAqIFN1YnNlcXVlbnQgY2FsbHMgdG8gYW55IG1ldGhvZHMgb3IgYXR0cmlidXRlIGdldHRlcnMgb24gdGhpcyBSYW5nZSB3aWxsCi0JICogcmVzdWx0IGluIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBiZWluZyB0aHJvd24gd2l0aCBhbiBlcnJvciBjb2RlCi0JICogb2YgPGNvZGU+SU5WQUxJRF9TVEFURV9FUlI8L2NvZGU+LgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgZGV0YWNoKCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE1vdmVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlIGZyb20gdGhlIGNvbnRhaW5pbmcgZG9jdW1lbnQgb3IgZG9jdW1lbnQKLQkgKiBmcmFnbWVudCB0byBhIG5ldyBEb2N1bWVudEZyYWdtZW50LgotCSAqIAotCSAqIEByZXR1cm4gQSBEb2N1bWVudEZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCBjb250ZW50cy4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFueSBwb3J0aW9uIG9mCi0JICogICAgICAgICAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGlzIHJlYWQtb25seSBvciBhbnkgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgbm9kZXMgd2hpY2ggY29udGFpbiBhbnkgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGFyZQotCSAqICAgICAgICAgICAgICAgIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIGEgRG9jdW1lbnRUeXBlIG5vZGUKLQkgKiAgICAgICAgICAgICAgICB3b3VsZCBiZSBleHRyYWN0ZWQgaW50byB0aGUgbmV3IERvY3VtZW50RnJhZ21lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBleHRyYWN0Q29udGVudHMoKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVFJVRSBpZiB0aGUgUmFuZ2UgaXMgY29sbGFwc2VkCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb2xsYXBzZWQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZXBlc3QgY29tbW9uIGFuY2VzdG9yIGNvbnRhaW5lciBvZiB0aGUgUmFuZ2UncyB0d28KLQkgKiBib3VuZGFyeS1wb2ludHMuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRDb21tb25BbmNlc3RvckNvbnRhaW5lcigpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBOb2RlIHdpdGhpbiB3aGljaCB0aGUgUmFuZ2UgZW5kcwotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0RW5kQ29udGFpbmVyKCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9mZnNldCB3aXRoaW4gdGhlIGVuZGluZyBub2RlIG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5vZGUgd2l0aGluIHdoaWNoIHRoZSBSYW5nZSBiZWdpbnMKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldFN0YXJ0Q29udGFpbmVyKCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9mZnNldCB3aXRoaW4gdGhlIHN0YXJ0aW5nIG5vZGUgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBJbnNlcnRzIGEgbm9kZSBpbnRvIHRoZSBEb2N1bWVudCBvciBEb2N1bWVudEZyYWdtZW50IGF0IHRoZSBzdGFydCBvZgotCSAqIHRoZSBSYW5nZS4gSWYgdGhlIGNvbnRhaW5lciBpcyBhIFRleHQgbm9kZSwgdGhpcyB3aWxsIGJlIHNwbGl0IGF0IHRoZQotCSAqIHN0YXJ0IG9mIHRoZSBSYW5nZSAoYXMgaWYgdGhlIFRleHQgbm9kZSdzIHNwbGl0VGV4dCBtZXRob2Qgd2FzCi0JICogcGVyZm9ybWVkIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQpIGFuZCB0aGUgaW5zZXJ0aW9uIHdpbGwgb2NjdXIgYmV0d2VlbgotCSAqIHRoZSB0d28gcmVzdWx0aW5nIFRleHQgbm9kZXMuIEFkamFjZW50IFRleHQgbm9kZXMgd2lsbCBub3QgYmUKLQkgKiBhdXRvbWF0aWNhbGx5IG1lcmdlZC4gSWYgdGhlIG5vZGUgdG8gYmUgaW5zZXJ0ZWQgaXMgYSBEb2N1bWVudEZyYWdtZW50Ci0JICogbm9kZSwgdGhlIGNoaWxkcmVuIHdpbGwgYmUgaW5zZXJ0ZWQgcmF0aGVyIHRoYW4gdGhlIERvY3VtZW50RnJhZ21lbnQKLQkgKiBub2RlIGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZVRoZQotCSAqICAgICAgICAgICAgbm9kZSB0byBpbnNlcnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZQotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW4gYW5jZXN0b3IKLQkgKiAgICAgICAgICAgICAgICBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSBpcyByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5uZXdOb2RlPC9jb2RlPiBhbmQKLQkgKiAgICAgICAgICAgICAgICB0aGUgY29udGFpbmVyIG9mIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2Ugd2VyZSBub3QgY3JlYXRlZAotCSAqICAgICAgICAgICAgICAgIGZyb20gdGhlIHNhbWUgZG9jdW1lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgY29udGFpbmVyIG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBSYW5nZSBpcyBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBhbGxvdwotCSAqICAgICAgICAgICAgICAgIGNoaWxkcmVuIG9mIHRoZSB0eXBlIG9mIDxjb2RlPm5ld05vZGU8L2NvZGU+IG9yIGlmCi0JICogICAgICAgICAgICAgICAgPGNvZGU+bmV3Tm9kZTwvY29kZT4gaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGNvbnRhaW5lci4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPm5ld05vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgaXMgYW4gQXR0ciwgRW50aXR5LCBOb3RhdGlvbiwgb3IgRG9jdW1lbnQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2RlKE5vZGUgbmV3Tm9kZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiwgUmFuZ2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSBub2RlIGFuZCBpdHMgY29udGVudHMKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVRoZQotCSAqICAgICAgICAgICAgbm9kZSB0byBzZWxlY3QuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIGFuIGFuY2VzdG9yIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LCBOb3RhdGlvbiBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZSBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3ROb2RlKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZWxlY3QgdGhlIGNvbnRlbnRzIHdpdGhpbiBhIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZU5vZGUKLQkgKiAgICAgICAgICAgIHRvIHNlbGVjdCBmcm9tCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgb3IgYW4gYW5jZXN0b3Igb2YgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LAotCSAqICAgICAgICAgICAgICAgIE5vdGF0aW9uIG9yIERvY3VtZW50VHlwZSBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0Tm9kZUNvbnRlbnRzKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIGVuZCBvZiBhIFJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlVGhlCi0JICogICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZQotCSAqICAgICAgICAgICAgZGlmZmVyZW50IGZyb20gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIG9mZnNldFRoZQotCSAqICAgICAgICAgICAgPGNvZGU+ZW5kT2Zmc2V0PC9jb2RlPiB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBvciBhbiBhbmNlc3RvciBvZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksCi0JICogICAgICAgICAgICAgICAgTm90YXRpb24sIG9yIERvY3VtZW50VHlwZSBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzCi0JICogICAgICAgICAgICAgICAgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgY2hpbGQgdW5pdHMgaW4KLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPi4gQ2hpbGQgdW5pdHMgYXJlIDE2LWJpdCB1bml0cyBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEgdHlwZSBvZiBDaGFyYWN0ZXJEYXRhIG5vZGUKLQkgKiAgICAgICAgICAgICAgICAoZS5nLiwgYSBUZXh0IG9yIENvbW1lbnQgbm9kZSkgb3IgYQotCSAqICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBub2RlLiBDaGlsZCB1bml0cyBhcmUgTm9kZXMgaW4gYWxsCi0JICogICAgICAgICAgICAgICAgb3RoZXIgY2FzZXMuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmQoTm9kZSByZWZOb2RlLCBpbnQgb2Zmc2V0KSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgdGhlIGVuZCBvZiBhIFJhbmdlIHRvIGJlIGFmdGVyIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIGVuZHMgYWZ0ZXIgPGNvZGU+cmVmTm9kZTwvY29kZT4uCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kQWZ0ZXIoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgdGhlIGVuZCBwb3NpdGlvbiB0byBiZSBiZWZvcmUgYSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIGVuZHMgYmVmb3JlIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCwgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZEJlZm9yZShOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2V0cyB0aGUgYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IHZhbHVlLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlCi0JICogICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gb2Zmc2V0VGhlCi0JICogICAgICAgICAgICA8Y29kZT5zdGFydE9mZnNldDwvY29kZT4gdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgb3IgYW4gYW5jZXN0b3Igb2YgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LAotCSAqICAgICAgICAgICAgICAgIE5vdGF0aW9uLCBvciBEb2N1bWVudFR5cGUgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcwotCSAqICAgICAgICAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNoaWxkIHVuaXRzIGluCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4uIENoaWxkIHVuaXRzIGFyZSAxNi1iaXQgdW5pdHMgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhIHR5cGUgb2YgQ2hhcmFjdGVyRGF0YSBub2RlCi0JICogICAgICAgICAgICAgICAgKGUuZy4sIGEgVGV4dCBvciBDb21tZW50IG5vZGUpIG9yIGEKLQkgKiAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gbm9kZS4gQ2hpbGQgdW5pdHMgYXJlIE5vZGVzIGluIGFsbAotCSAqICAgICAgICAgICAgICAgIG90aGVyIGNhc2VzLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoTm9kZSByZWZOb2RlLCBpbnQgb2Zmc2V0KSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIGJlIGFmdGVyIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIHN0YXJ0cyBhZnRlciA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydEFmdGVyKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGFydCBwb3NpdGlvbiB0byBiZSBiZWZvcmUgYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgc3RhcnRzIGJlZm9yZSA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydEJlZm9yZShOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVwYXJlbnRzIHRoZSBjb250ZW50cyBvZiB0aGUgUmFuZ2UgdG8gdGhlIGdpdmVuIG5vZGUgYW5kIGluc2VydHMgdGhlCi0JICogbm9kZSBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3UGFyZW50VGhlCi0JICogICAgICAgICAgICBub2RlIHRvIHN1cnJvdW5kIHRoZSBjb250ZW50cyB3aXRoLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW4gYW5jZXN0b3IKLQkgKiAgICAgICAgICAgICAgICBjb250YWluZXIgb2YgZWl0aGVyIGJvdW5kYXJ5LXBvaW50IG9mIHRoZSBSYW5nZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIDxjb2RlPiBuZXdQYXJlbnQ8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgYW5kIHRoZSBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSB3ZXJlIG5vdAotCSAqICAgICAgICAgICAgICAgIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBkb2N1bWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBjb250YWluZXIgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIFJhbmdlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90IGFsbG93Ci0JICogICAgICAgICAgICAgICAgY2hpbGRyZW4gb2YgdGhlIHR5cGUgb2YgPGNvZGU+bmV3UGFyZW50PC9jb2RlPiBvciBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPm5ld1BhcmVudDwvY29kZT4gaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgICAgIG9yIGlmIDxjb2RlPm5vZGU8L2NvZGU+IHdvdWxkIGVuZCB1cCB3aXRoIGEgY2hpbGQgbm9kZQotCSAqICAgICAgICAgICAgICAgIG9mIGEgdHlwZSBub3QgYWxsb3dlZCBieSB0aGUgdHlwZSBvZiA8Y29kZT5ub2RlPC9jb2RlPi4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEJBRF9CT1VOREFSWVBPSU5UU19FUlI6IFJhaXNlZCBpZiB0aGUgUmFuZ2UgcGFydGlhbGx5Ci0JICogICAgICAgICAgICAgICAgc2VsZWN0cyBhIG5vbi10ZXh0IG5vZGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT4gbm9kZTwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICBhbiBBdHRyLCBFbnRpdHksIERvY3VtZW50VHlwZSwgTm90YXRpb24sIERvY3VtZW50LCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdXJyb3VuZENvbnRlbnRzKE5vZGUgbmV3UGFyZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uLCBSYW5nZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGEgUmFuZ2UgYXMgYSBzdHJpbmcuIFRoaXMgc3RyaW5nIGNvbnRhaW5zIG9ubHkKLQkgKiB0aGUgZGF0YSBjaGFyYWN0ZXJzLCBub3QgYW55IG1hcmt1cC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgUmFuZ2UuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3Jhbmdlcy9SYW5nZUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3Jhbmdlcy9SYW5nZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWE1ZjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS5yYW5nZXM7Ci0KLS8qKgotICogUmFuZ2Ugb3BlcmF0aW9ucyBtYXkgdGhyb3cgYSA8Y29kZT5SYW5nZUV4Y2VwdGlvbjwvY29kZT4gYXMgc3BlY2lmaWVkIGluCi0gKiB0aGVpciBtZXRob2QgZGVzY3JpcHRpb25zLgotICogPHA+Ci0gKiBTZWUgYWxzbyB0aGUgPGEKLSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVRyYXZlcnNhbC1SYW5nZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFRyYXZlcnNhbCBhbmQgUmFuZ2UgU3BlY2lmaWNhdGlvbiA8L2E+LgotICogCi0gKiBAc2luY2UgRE9NIExldmVsIDIKLSAqLwotcHVibGljIGNsYXNzIFJhbmdlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCS8vIFJhbmdlRXhjZXB0aW9uQ29kZQotCS8qKgotCSAqIElmIHRoZSBib3VuZGFyeS1wb2ludHMgb2YgYSBSYW5nZSBkbyBub3QgbWVldCBzcGVjaWZpYyByZXF1aXJlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBCQURfQk9VTkRBUllQT0lOVFNfRVJSID0gMTsKLQkvKioKLQkgKiBJZiB0aGUgY29udGFpbmVyIG9mIGFuIGJvdW5kYXJ5LXBvaW50IG9mIGEgUmFuZ2UgaXMgYmVpbmcgc2V0IHRvIGVpdGhlcgotCSAqIGEgbm9kZSBvZiBhbiBpbnZhbGlkIHR5cGUgb3IgYSBub2RlIHdpdGggYW4gYW5jZXN0b3Igb2YgYW4gaW52YWxpZAotCSAqIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBJTlZBTElEX05PREVfVFlQRV9FUlIgPSAyOwotCi0JcHVibGljIHNob3J0IGNvZGU7Ci0KLQlwdWJsaWMgUmFuZ2VFeGNlcHRpb24oc2hvcnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JCXRoaXMuY29kZSA9IGNvZGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL3czYy9kb20vcmFuZ2VzL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGZiYWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08aHRtbD4KLVRoaXMgcGFja2FnZSBjb250YWlucyB1bm1vZGlmaWVkIHNvdXJjZXMgcHJvdmlkZWQgYnkgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItVHJhdmVyc2FsLVJhbmdlLTIwMDAxMTEzL2phdmEtYmluZGluZy56aXAKLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL3czYy9kb20vdHJhdmVyc2FsL0NPUFlSSUdIVC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3RyYXZlcnNhbC9DT1BZUklHSFQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwNDliNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL3czYy9kb20vdHJhdmVyc2FsL0NPUFlSSUdIVC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiPgotPGh0bWw+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgIDx0aXRsZT5XM0MgSVBSIFNPRlRXQVJFIE5PVElDRTwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCI+Ci0gICAgPGgxPgotICAgICAgVzNDIElQUiBTT0ZUV0FSRSBOT1RJQ0UKLSAgICA8L2gxPgotICAgIDxoMz4KLSAgICAgIENvcHlyaWdodCAmY29weTsgMjAwMCA8bG9jIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+V29ybGQgV2lkZSBXZWIKLSAgICAgIENvbnNvcnRpdW08L2xvYz4sICg8bG9jIGhyZWY9Imh0dHA6Ly93d3cubGNzLm1pdC5lZHUvIj5NYXNzYWNodXNldHRzCi0gICAgICBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTwvbG9jPiwgPGxvYyBocmVmPSJodHRwOi8vd3d3LmlucmlhLmZyLyI+SW5zdGl0dXQKLSAgICAgIE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWU8L2xvYz4sIDxsb2MKLSAgICAgIGhyZWY9Imh0dHA6Ly93d3cua2Vpby5hYy5qcC8iPktlaW8gVW5pdmVyc2l0eTwvbG9jPikuIEFsbCBSaWdodHMKLSAgICAgIFJlc2VydmVkLgotICAgIDwvaDM+Ci0gICAgPHA+Ci0gICAgICBUaGUgRE9NIGJpbmRpbmdzIGFyZSBwdWJsaXNoZWQgdW5kZXIgdGhlIFczQyBTb2Z0d2FyZSBDb3B5cmlnaHQgTm90aWNlCi0gICAgICBhbmQgTGljZW5zZS4gVGhlIHNvZnR3YXJlIGxpY2Vuc2UgcmVxdWlyZXMgIk5vdGljZSBvZiBhbnkgY2hhbmdlcyBvcgotICAgICAgbW9kaWZpY2F0aW9ucyB0byB0aGUgVzNDIGZpbGVzLCBpbmNsdWRpbmcgdGhlIGRhdGUgY2hhbmdlcyB3ZXJlIG1hZGUuIgotICAgICAgQ29uc2VxdWVudGx5LCBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRE9NIGJpbmRpbmdzIG11c3QgZG9jdW1lbnQgdGhhdAotICAgICAgdGhleSBkbyBub3QgY29uZm9ybSB0byB0aGUgVzNDIHN0YW5kYXJkOyBpbiB0aGUgY2FzZSBvZiB0aGUgSURMIGJpbmRpbmcsCi0gICAgICB0aGUgcHJhZ21hIHByZWZpeCBjYW4gbm8gbG9uZ2VyIGJlICd3M2Mub3JnJzsgaW4gdGhlIGNhc2Ugb2YgdGhlIEphdmEKLSAgICAgIGJpbmRpbmcsIHRoZSBwYWNrYWdlIG5hbWVzIGNhbiBubyBsb25nZXIgYmUgaW4gdGhlICdvcmcudzNjJyBwYWNrYWdlLgotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIDxiPk5vdGU6PC9iPiBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgVzNDIFNvZnR3YXJlIENvcHlyaWdodCBOb3RpY2UKLSAgICAgIGFuZCBMaWNlbnNlIGNvdWxkIGJlIGZvdW5kIGF0IDxhCi0gICAgICBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMCc+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjA8L2E+Ci0gICAgPC9wPgotICAgIDxoMz4KLSAgICAgIENvcHlyaWdodCAmY29weTsgMTk5NC0yMDAwIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+V29ybGQgV2lkZSBXZWIKLSAgICAgIENvbnNvcnRpdW08L2E+LCAoPGEgaHJlZj0iaHR0cDovL3d3dy5sY3MubWl0LmVkdS8iPk1hc3NhY2h1c2V0dHMKLSAgICAgIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5PC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5pbnJpYS5mci8iPkluc3RpdHV0Ci0gICAgICBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlPC9hPiwgPGEKLSAgICAgIGhyZWY9Imh0dHA6Ly93d3cua2Vpby5hYy5qcC8iPktlaW8gVW5pdmVyc2l0eTwvYT4pLiBBbGwgUmlnaHRzCi0gICAgICBSZXNlcnZlZC4gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8KLSAgICA8L2gzPgotICAgIDxwPgotICAgICAgVGhpcyBXM0Mgd29yayAoaW5jbHVkaW5nIHNvZnR3YXJlLCBkb2N1bWVudHMsIG9yIG90aGVyIHJlbGF0ZWQgaXRlbXMpIGlzCi0gICAgICBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlLiBCeQotICAgICAgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssIHlvdSAodGhlIGxpY2Vuc2VlKSBhZ3JlZSB0aGF0Ci0gICAgICB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZAotICAgICAgY29uZGl0aW9uczoKLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgYW5kIG1vZGlmeSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiwKLSAgICAgIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sJm5ic3A7IGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgb3IKLSAgICAgIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbiBBTEwKLSAgICAgIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gb3IgcG9ydGlvbnMgdGhlcmVvZiwgaW5jbHVkaW5nCi0gICAgICBtb2RpZmljYXRpb25zLCB0aGF0IHlvdSBtYWtlOgotICAgIDwvcD4KLSAgICA8b2w+Ci0gICAgICA8bGk+Ci0JVGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mIHRoZQotCXJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSB3b3JrLgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLQlBbnkgcHJlLWV4aXN0aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBkaXNjbGFpbWVycywgbm90aWNlcywgb3IgdGVybXMKLQlhbmQgY29uZGl0aW9ucy4gSWYgbm9uZSBleGlzdCwgYSBzaG9ydCBub3RpY2Ugb2YgdGhlIGZvbGxvd2luZyBmb3JtCi0JKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSBzaG91bGQgYmUgdXNlZCB3aXRoaW4gdGhlCi0JYm9keSBvZiBhbnkgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIGNvZGU6ICJDb3B5cmlnaHQgJmNvcHk7Ci0JWyRkYXRlLW9mLXNvZnR3YXJlXSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8iPldvcmxkIFdpZGUgV2ViCi0JQ29uc29ydGl1bTwvYT4sICg8YSBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1LyI+TWFzc2FjaHVzZXR0cwotCUluc3RpdHV0ZSBvZiBUZWNobm9sb2d5PC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5pbnJpYS5mci8iPkluc3RpdHV0Ci0JTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZTwvYT4sIDxhCi0JaHJlZj0iaHR0cDovL3d3dy5rZWlvLmFjLmpwLyI+S2VpbyBVbml2ZXJzaXR5PC9hPikuICBBbGwgUmlnaHRzCi0JUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLQlOb3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgVzNDIGZpbGVzLCBpbmNsdWRpbmcgdGhlCi0JZGF0ZSBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbgotCWZyb20gd2hpY2ggdGhlIGNvZGUgaXMgZGVyaXZlZC4pCi0gICAgICA8L2xpPgotICAgIDwvb2w+Ci0gICAgPHA+Ci0gICAgICBUSElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBDT1BZUklHSFQKLSAgICAgIEhPTERFUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELAotICAgICAgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUwotICAgICAgRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUgotICAgICAgRE9DVU1FTlRBVElPTiBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgVEhJUkQgUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywKLSAgICAgIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLgotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIENPUFlSSUdIVCBIT0xERVJTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwgT1IKLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUgotICAgICAgRE9DVU1FTlRBVElPTi4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICBUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4KLSAgICAgIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAotICAgICAgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55Ci0gICAgICBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0Ci0gICAgICBob2xkZXJzLgotICAgIDwvcD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3RyYXZlcnNhbC9Eb2N1bWVudFRyYXZlcnNhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3RyYXZlcnNhbC9Eb2N1bWVudFRyYXZlcnNhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWM5MzMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS90cmF2ZXJzYWwvRG9jdW1lbnRUcmF2ZXJzYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20udHJhdmVyc2FsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogPGNvZGU+RG9jdW1lbnRUcmF2ZXJzYWw8L2NvZGU+IGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBjcmVhdGUgaXRlcmF0b3JzIGFuZAotICogdHJlZS13YWxrZXJzIHRvIHRyYXZlcnNlIGEgbm9kZSBhbmQgaXRzIGNoaWxkcmVuIGluIGRvY3VtZW50IG9yZGVyIChkZXB0aAotICogZmlyc3QsIHByZS1vcmRlciB0cmF2ZXJzYWwsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG9yZGVyIGluIHdoaWNoIHRoZQotICogc3RhcnQgdGFncyBvY2N1ciBpbiB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG9jdW1lbnQpLiBJbiBET01zIHdoaWNoCi0gKiBzdXBwb3J0IHRoZSBUcmF2ZXJzYWwgZmVhdHVyZSwgPGNvZGU+RG9jdW1lbnRUcmF2ZXJzYWw8L2NvZGU+IHdpbGwgYmUKLSAqIGltcGxlbWVudGVkIGJ5IHRoZSBzYW1lIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIERvY3VtZW50IGludGVyZmFjZS4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1UcmF2ZXJzYWwtUmFuZ2UtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBUcmF2ZXJzYWwgYW5kIFJhbmdlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRUcmF2ZXJzYWwgewotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+IG92ZXIgdGhlIHN1YnRyZWUgcm9vdGVkIGF0IHRoZQotCSAqIHNwZWNpZmllZCBub2RlLgotCSAqIAotCSAqIEBwYXJhbSByb290VGhlCi0JICogICAgICAgICAgICBub2RlIHdoaWNoIHdpbGwgYmUgaXRlcmF0ZWQgdG9nZXRoZXIgd2l0aCBpdHMgY2hpbGRyZW4uIFRoZQotCSAqICAgICAgICAgICAgaXRlcmF0b3IgaXMgaW5pdGlhbGx5IHBvc2l0aW9uZWQganVzdCBiZWZvcmUgdGhpcyBub2RlLiBUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzIGFuZCB0aGUgZmlsdGVyLCBpZiBhbnksIGFyZQotCSAqICAgICAgICAgICAgbm90IGNvbnNpZGVyZWQgd2hlbiBzZXR0aW5nIHRoaXMgcG9zaXRpb24uIFRoZSByb290IG11c3Qgbm90Ci0JICogICAgICAgICAgICBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gd2hhdFRvU2hvd1RoaXMKLQkgKiAgICAgICAgICAgIGZsYWcgc3BlY2lmaWVzIHdoaWNoIG5vZGUgdHlwZXMgbWF5IGFwcGVhciBpbiB0aGUgbG9naWNhbAotCSAqICAgICAgICAgICAgdmlldyBvZiB0aGUgdHJlZSBwcmVzZW50ZWQgYnkgdGhlIGl0ZXJhdG9yLiBTZWUgdGhlCi0JICogICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiBmb3IgdGhlIHNldCBvZgotCSAqICAgICAgICAgICAgcG9zc2libGUgPGNvZGU+U0hPV188L2NvZGU+IHZhbHVlcy5UaGVzZSBmbGFncyBjYW4gYmUKLQkgKiAgICAgICAgICAgIGNvbWJpbmVkIHVzaW5nIDxjb2RlPk9SPC9jb2RlPi4KLQkgKiBAcGFyYW0gZmlsdGVyVGhlCi0JICogICAgICAgICAgICA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiB0byBiZSB1c2VkIHdpdGggdGhpcwotCSAqICAgICAgICAgICAgPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSBubyBmaWx0ZXIuCi0JICogQHBhcmFtIGVudGl0eVJlZmVyZW5jZUV4cGFuc2lvblRoZQotCSAqICAgICAgICAgICAgdmFsdWUgb2YgdGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciBlbnRpdHkgcmVmZXJlbmNlIG5vZGVzCi0JICogICAgICAgICAgICBhcmUgZXhwYW5kZWQuCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cm9vdDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIE5vZGVJdGVyYXRvciBjcmVhdGVOb2RlSXRlcmF0b3IoTm9kZSByb290LCBpbnQgd2hhdFRvU2hvdywgTm9kZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IDxjb2RlPlRyZWVXYWxrZXI8L2NvZGU+IG92ZXIgdGhlIHN1YnRyZWUgcm9vdGVkIGF0IHRoZQotCSAqIHNwZWNpZmllZCBub2RlLgotCSAqIAotCSAqIEBwYXJhbSByb290VGhlCi0JICogICAgICAgICAgICBub2RlIHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIDxjb2RlPnJvb3Q8L2NvZGU+IGZvciB0aGUKLQkgKiAgICAgICAgICAgIDxjb2RlPlRyZWVXYWxrZXI8L2NvZGU+LiBUaGUgPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4KLQkgKiAgICAgICAgICAgIGZsYWdzIGFuZCB0aGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gYXJlIG5vdCBjb25zaWRlcmVkCi0JICogICAgICAgICAgICB3aGVuIHNldHRpbmcgdGhpcyB2YWx1ZTsgYW55IG5vZGUgdHlwZSB3aWxsIGJlIGFjY2VwdGVkIGFzCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+cm9vdDwvY29kZT4uIFRoZSA8Y29kZT5jdXJyZW50Tm9kZTwvY29kZT4gb2YKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiBpcyBpbml0aWFsaXplZCB0byB0aGlzIG5vZGUsCi0JICogICAgICAgICAgICB3aGV0aGVyIG9yIG5vdCBpdCBpcyB2aXNpYmxlLiBUaGUgPGNvZGU+cm9vdDwvY29kZT4KLQkgKiAgICAgICAgICAgIGZ1bmN0aW9ucyBhcyBhIHN0b3BwaW5nIHBvaW50IGZvciB0cmF2ZXJzYWwgbWV0aG9kcyB0aGF0Ci0JICogICAgICAgICAgICBsb29rIHVwd2FyZCBpbiB0aGUgZG9jdW1lbnQgc3RydWN0dXJlLCBzdWNoIGFzCi0JICogICAgICAgICAgICA8Y29kZT5wYXJlbnROb2RlPC9jb2RlPiBhbmQgbmV4dE5vZGUuIFRoZQotCSAqICAgICAgICAgICAgPGNvZGU+cm9vdDwvY29kZT4gbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHdoYXRUb1Nob3dUaGlzCi0JICogICAgICAgICAgICBmbGFnIHNwZWNpZmllcyB3aGljaCBub2RlIHR5cGVzIG1heSBhcHBlYXIgaW4gdGhlIGxvZ2ljYWwKLQkgKiAgICAgICAgICAgIHZpZXcgb2YgdGhlIHRyZWUgcHJlc2VudGVkIGJ5IHRoZSB0cmVlLXdhbGtlci4gU2VlIHRoZQotCSAqICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gZm9yIHRoZSBzZXQgb2YKLQkgKiAgICAgICAgICAgIHBvc3NpYmxlIFNIT1dfIHZhbHVlcy5UaGVzZSBmbGFncyBjYW4gYmUgY29tYmluZWQgdXNpbmcKLQkgKiAgICAgICAgICAgIDxjb2RlPk9SPC9jb2RlPi4KLQkgKiBAcGFyYW0gZmlsdGVyVGhlCi0JICogICAgICAgICAgICA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiB0byBiZSB1c2VkIHdpdGggdGhpcwotCSAqICAgICAgICAgICAgPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSBubyBmaWx0ZXIuCi0JICogQHBhcmFtIGVudGl0eVJlZmVyZW5jZUV4cGFuc2lvbklmCi0JICogICAgICAgICAgICB0aGlzIGZsYWcgaXMgZmFsc2UsIHRoZSBjb250ZW50cyBvZgotCSAqICAgICAgICAgICAgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiBub2RlcyBhcmUgbm90IHByZXNlbnRlZCBpbgotCSAqICAgICAgICAgICAgdGhlIGxvZ2ljYWwgdmlldy4KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRyZWVXYWxrZXI8L2NvZGU+LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cm9vdDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFRyZWVXYWxrZXIgY3JlYXRlVHJlZVdhbGtlcihOb2RlIHJvb3QsIGludCB3aGF0VG9TaG93LCBOb2RlRmlsdGVyIGZpbHRlciwgYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VFeHBhbnNpb24pIHRocm93cyBET01FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS90cmF2ZXJzYWwvTm9kZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3RyYXZlcnNhbC9Ob2RlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Yzc0NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3RyYXZlcnNhbC9Ob2RlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLnRyYXZlcnNhbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogRmlsdGVycyBhcmUgb2JqZWN0cyB0aGF0IGtub3cgaG93IHRvICJmaWx0ZXIgb3V0IiBub2Rlcy4gSWYgYQotICogPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBvciA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiBpcyBnaXZlbiBhCi0gKiA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiwgaXQgYXBwbGllcyB0aGUgZmlsdGVyIGJlZm9yZSBpdCByZXR1cm5zIHRoZQotICogbmV4dCBub2RlLiBJZiB0aGUgZmlsdGVyIHNheXMgdG8gYWNjZXB0IHRoZSBub2RlLCB0aGUgdHJhdmVyc2FsIGxvZ2ljCi0gKiByZXR1cm5zIGl0OyBvdGhlcndpc2UsIHRyYXZlcnNhbCBsb29rcyBmb3IgdGhlIG5leHQgbm9kZSBhbmQgcHJldGVuZHMgdGhhdAotICogdGhlIG5vZGUgdGhhdCB3YXMgcmVqZWN0ZWQgd2FzIG5vdCB0aGVyZS4KLSAqIDxwPgotICogVGhlIERPTSBkb2VzIG5vdCBwcm92aWRlIGFueSBmaWx0ZXJzLiA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiBpcyBqdXN0IGFuCi0gKiBpbnRlcmZhY2UgdGhhdCB1c2VycyBjYW4gaW1wbGVtZW50IHRvIHByb3ZpZGUgdGhlaXIgb3duIGZpbHRlcnMuCi0gKiA8cD4KLSAqIDxjb2RlPk5vZGVGaWx0ZXJzPC9jb2RlPiBkbyBub3QgbmVlZCB0byBrbm93IGhvdyB0byB0cmF2ZXJzZSBmcm9tIG5vZGUgdG8KLSAqIG5vZGUsIG5vciBkbyB0aGV5IG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpcwotICogYmVpbmcgdHJhdmVyc2VkLiBUaGlzIG1ha2VzIGl0IHZlcnkgZWFzeSB0byB3cml0ZSBmaWx0ZXJzLCBzaW5jZSB0aGUgb25seQotICogdGhpbmcgdGhleSBoYXZlIHRvIGtub3cgaG93IHRvIGRvIGlzIGV2YWx1YXRlIGEgc2luZ2xlIG5vZGUuIE9uZSBmaWx0ZXIgbWF5Ci0gKiBiZSB1c2VkIHdpdGggYSBudW1iZXIgb2YgZGlmZmVyZW50IGtpbmRzIG9mIHRyYXZlcnNhbHMsIGVuY291cmFnaW5nIGNvZGUKLSAqIHJldXNlLgotICogPHA+Ci0gKiBTZWUgYWxzbyB0aGUgPGEKLSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVRyYXZlcnNhbC1SYW5nZS0yMDAwMTExMyc+RG9jdW1lbnQKLSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAyIFRyYXZlcnNhbCBhbmQgUmFuZ2UgU3BlY2lmaWNhdGlvbiA8L2E+LgotICogCi0gKiBAc2luY2UgRE9NIExldmVsIDIKLSAqLwotcHVibGljIGludGVyZmFjZSBOb2RlRmlsdGVyIHsKLQkvLyBDb25zdGFudHMgcmV0dXJuZWQgYnkgYWNjZXB0Tm9kZQotCS8qKgotCSAqIEFjY2VwdCB0aGUgbm9kZS4gTmF2aWdhdGlvbiBtZXRob2RzIGRlZmluZWQgZm9yCi0JICogPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBvciA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiB3aWxsIHJldHVybgotCSAqIHRoaXMgbm9kZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEZJTFRFUl9BQ0NFUFQgPSAxOwotCS8qKgotCSAqIFJlamVjdCB0aGUgbm9kZS4gTmF2aWdhdGlvbiBtZXRob2RzIGRlZmluZWQgZm9yCi0JICogPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBvciA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiB3aWxsIG5vdAotCSAqIHJldHVybiB0aGlzIG5vZGUuIEZvciA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiwgdGhlIGNoaWxkcmVuIG9mIHRoaXMKLQkgKiBub2RlIHdpbGwgYWxzbyBiZSByZWplY3RlZC4gPGNvZGU+Tm9kZUl0ZXJhdG9yczwvY29kZT4gdHJlYXQgdGhpcyBhcwotCSAqIGEgc3lub255bSBmb3IgPGNvZGU+RklMVEVSX1NLSVA8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgRklMVEVSX1JFSkVDVCA9IDI7Ci0JLyoqCi0JICogU2tpcCB0aGlzIHNpbmdsZSBub2RlLiBOYXZpZ2F0aW9uIG1ldGhvZHMgZGVmaW5lZCBmb3IKLQkgKiA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+IG9yIDxjb2RlPlRyZWVXYWxrZXI8L2NvZGU+IHdpbGwgbm90Ci0JICogcmV0dXJuIHRoaXMgbm9kZS4gRm9yIGJvdGggPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiwgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSB3aWxsIHN0aWxsIGJlCi0JICogY29uc2lkZXJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEZJTFRFUl9TS0lQID0gMzsKLQotCS8vIENvbnN0YW50cyBmb3Igd2hhdFRvU2hvdwotCS8qKgotCSAqIFNob3cgYWxsIDxjb2RlPk5vZGVzPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FMTCA9IDB4RkZGRkZGRkY7Ci0JLyoqCi0JICogU2hvdyA8Y29kZT5FbGVtZW50PC9jb2RlPiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0VMRU1FTlQgPSAweDAwMDAwMDAxOwotCS8qKgotCSAqIFNob3cgPGNvZGU+QXR0cjwvY29kZT4gbm9kZXMuIFRoaXMgaXMgbWVhbmluZ2Z1bCBvbmx5IHdoZW4gY3JlYXRpbmcKLQkgKiBhbiBpdGVyYXRvciBvciB0cmVlLXdhbGtlciB3aXRoIGFuIGF0dHJpYnV0ZSBub2RlIGFzIGl0cwotCSAqIDxjb2RlPnJvb3Q8L2NvZGU+OyBpbiB0aGlzIGNhc2UsIGl0IG1lYW5zIHRoYXQgdGhlIGF0dHJpYnV0ZSBub2RlCi0JICogd2lsbCBhcHBlYXIgaW4gdGhlIGZpcnN0IHBvc2l0aW9uIG9mIHRoZSBpdGVyYXRpb24gb3IgdHJhdmVyc2FsLiBTaW5jZQotCSAqIGF0dHJpYnV0ZXMgYXJlIG5ldmVyIGNoaWxkcmVuIG9mIG90aGVyIG5vZGVzLCB0aGV5IGRvIG5vdCBhcHBlYXIgd2hlbgotCSAqIHRyYXZlcnNpbmcgb3ZlciB0aGUgZG9jdW1lbnQgdHJlZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FUVFJJQlVURSA9IDB4MDAwMDAwMDI7Ci0JLyoqCi0JICogU2hvdyA8Y29kZT5UZXh0PC9jb2RlPiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX1RFWFQgPSAweDAwMDAwMDA0OwotCS8qKgotCSAqIFNob3cgPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0NEQVRBX1NFQ1RJT04gPSAweDAwMDAwMDA4OwotCS8qKgotCSAqIFNob3cgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0VOVElUWV9SRUZFUkVOQ0UgPSAweDAwMDAwMDEwOwotCS8qKgotCSAqIFNob3cgPGNvZGU+RW50aXR5PC9jb2RlPiBub2Rlcy4gVGhpcyBpcyBtZWFuaW5nZnVsIG9ubHkgd2hlbiBjcmVhdGluZwotCSAqIGFuIGl0ZXJhdG9yIG9yIHRyZWUtd2Fsa2VyIHdpdGggYW4gPGNvZGU+IEVudGl0eTwvY29kZT4gbm9kZSBhcyBpdHMKLQkgKiA8Y29kZT5yb290PC9jb2RlPjsgaW4gdGhpcyBjYXNlLCBpdCBtZWFucyB0aGF0IHRoZQotCSAqIDxjb2RlPkVudGl0eTwvY29kZT4gbm9kZSB3aWxsIGFwcGVhciBpbiB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlCi0JICogdHJhdmVyc2FsLiBTaW5jZSBlbnRpdGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIGRvY3VtZW50IHRyZWUsIHRoZXkgZG8KLQkgKiBub3QgYXBwZWFyIHdoZW4gdHJhdmVyc2luZyBvdmVyIHRoZSBkb2N1bWVudCB0cmVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfRU5USVRZID0gMHgwMDAwMDAyMDsKLQkvKioKLQkgKiBTaG93IDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4gbm9kZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OID0gMHgwMDAwMDA0MDsKLQkvKioKLQkgKiBTaG93IDxjb2RlPkNvbW1lbnQ8L2NvZGU+IG5vZGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQ09NTUVOVCA9IDB4MDAwMDAwODA7Ci0JLyoqCi0JICogU2hvdyA8Y29kZT5Eb2N1bWVudDwvY29kZT4gbm9kZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19ET0NVTUVOVCA9IDB4MDAwMDAxMDA7Ci0JLyoqCi0JICogU2hvdyA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IG5vZGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfRE9DVU1FTlRfVFlQRSA9IDB4MDAwMDAyMDA7Ci0JLyoqCi0JICogU2hvdyA8Y29kZT5Eb2N1bWVudEZyYWdtZW50PC9jb2RlPiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UID0gMHgwMDAwMDQwMDsKLQkvKioKLQkgKiBTaG93IDxjb2RlPk5vdGF0aW9uPC9jb2RlPiBub2Rlcy4gVGhpcyBpcyBtZWFuaW5nZnVsIG9ubHkgd2hlbgotCSAqIGNyZWF0aW5nIGFuIGl0ZXJhdG9yIG9yIHRyZWUtd2Fsa2VyIHdpdGggYSA8Y29kZT5Ob3RhdGlvbjwvY29kZT4gbm9kZQotCSAqIGFzIGl0cyA8Y29kZT5yb290PC9jb2RlPjsgaW4gdGhpcyBjYXNlLCBpdCBtZWFucyB0aGF0IHRoZQotCSAqIDxjb2RlPk5vdGF0aW9uPC9jb2RlPiBub2RlIHdpbGwgYXBwZWFyIGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUKLQkgKiB0cmF2ZXJzYWwuIFNpbmNlIG5vdGF0aW9ucyBhcmUgbm90IHBhcnQgb2YgdGhlIGRvY3VtZW50IHRyZWUsIHRoZXkgZG8KLQkgKiBub3QgYXBwZWFyIHdoZW4gdHJhdmVyc2luZyBvdmVyIHRoZSBkb2N1bWVudCB0cmVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfTk9UQVRJT04gPSAweDAwMDAwODAwOwotCi0JLyoqCi0JICogVGVzdCB3aGV0aGVyIGEgc3BlY2lmaWVkIG5vZGUgaXMgdmlzaWJsZSBpbiB0aGUgbG9naWNhbCB2aWV3IG9mIGEKLQkgKiA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiBvciA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+LiBUaGlzCi0JICogZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mCi0JICogPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4gYW5kIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT47IGl0IGlzIG5vdAotCSAqIG5vcm1hbGx5IGNhbGxlZCBkaXJlY3RseSBmcm9tIHVzZXIgY29kZS4gKFRob3VnaCB5b3UgY291bGQgZG8gc28gaWYgeW91Ci0JICogd2FudGVkIHRvIHVzZSB0aGUgc2FtZSBmaWx0ZXIgdG8gZ3VpZGUgeW91ciBvd24gYXBwbGljYXRpb24gbG9naWMuKQotCSAqIAotCSAqIEBwYXJhbSBuVGhlCi0JICogICAgICAgICAgICBub2RlIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBwYXNzZXMgdGhlIGZpbHRlciBvciBub3QuCi0JICogQHJldHVybiBhIGNvbnN0YW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBub2RlIGlzIGFjY2VwdGVkLCByZWplY3RlZCwKLQkgKiAgICAgICAgIG9yIHNraXBwZWQsIGFzIGRlZmluZWQgYWJvdmUuCi0JICovCi0JcHVibGljIHNob3J0IGFjY2VwdE5vZGUoTm9kZSBuKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3RyYXZlcnNhbC9Ob2RlSXRlcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS90cmF2ZXJzYWwvTm9kZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNGEzOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy93M2MvZG9tL3RyYXZlcnNhbC9Ob2RlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20udHJhdmVyc2FsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogPGNvZGU+SXRlcmF0b3JzPC9jb2RlPiBhcmUgdXNlZCB0byBzdGVwIHRocm91Z2ggYSBzZXQgb2Ygbm9kZXMsIGUuZy4gdGhlCi0gKiBzZXQgb2Ygbm9kZXMgaW4gYSA8Y29kZT5Ob2RlTGlzdDwvY29kZT4sIHRoZSBkb2N1bWVudCBzdWJ0cmVlIGdvdmVybmVkCi0gKiBieSBhIHBhcnRpY3VsYXIgPGNvZGU+Tm9kZTwvY29kZT4sIHRoZSByZXN1bHRzIG9mIGEgcXVlcnksIG9yIGFueSBvdGhlcgotICogc2V0IG9mIG5vZGVzLiBUaGUgc2V0IG9mIG5vZGVzIHRvIGJlIGl0ZXJhdGVkIGlzIGRldGVybWluZWQgYnkgdGhlCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPi4gRE9NIExldmVsIDIgc3BlY2lmaWVzIGEKLSAqIHNpbmdsZSA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIGZvciBkb2N1bWVudC1vcmRlcgotICogdHJhdmVyc2FsIG9mIGEgZG9jdW1lbnQgc3VidHJlZS4gSW5zdGFuY2VzIG9mIHRoZXNlIGl0ZXJhdG9ycyBhcmUgY3JlYXRlZAotICogYnkgY2FsbGluZyA8Y29kZT5Eb2N1bWVudFRyYXZlcnNhbDwvY29kZT4KLSAqIDxjb2RlPi5jcmVhdGVOb2RlSXRlcmF0b3IoKTwvY29kZT4uCi0gKiA8cD4KLSAqIFNlZSBhbHNvIHRoZSA8YQotICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItVHJhdmVyc2FsLVJhbmdlLTIwMDAxMTEzJz5Eb2N1bWVudAotICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgVHJhdmVyc2FsIGFuZCBSYW5nZSBTcGVjaWZpY2F0aW9uIDwvYT4uCi0gKiAKLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGVJdGVyYXRvciB7Ci0JLyoqCi0JICogVGhlIHJvb3Qgbm9kZSBvZiB0aGUgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiwgYXMgc3BlY2lmaWVkIHdoZW4gaXQKLQkgKiB3YXMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRSb290KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBkZXRlcm1pbmVzIHdoaWNoIG5vZGUgdHlwZXMgYXJlIHByZXNlbnRlZCB2aWEgdGhlCi0JICogaXRlcmF0b3IuIFRoZSBhdmFpbGFibGUgc2V0IG9mIGNvbnN0YW50cyBpcyBkZWZpbmVkIGluIHRoZQotCSAqIDxjb2RlPk5vZGVGaWx0ZXI8L2NvZGU+IGludGVyZmFjZS4gTm9kZXMgbm90IGFjY2VwdGVkIGJ5Ci0JICogPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gd2lsbCBiZSBza2lwcGVkLCBidXQgdGhlaXIgY2hpbGRyZW4gbWF5IHN0aWxsCi0JICogYmUgY29uc2lkZXJlZC4gTm90ZSB0aGF0IHRoaXMgc2tpcCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGZpbHRlciwgaWYKLQkgKiBhbnkuCi0JICovCi0JcHVibGljIGludCBnZXRXaGF0VG9TaG93KCk7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gdXNlZCB0byBzY3JlZW4gbm9kZXMuCi0JICovCi0JcHVibGljIE5vZGVGaWx0ZXIgZ2V0RmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgZW50aXR5Ci0JICogcmVmZXJlbmNlIG5vZGVzIGFyZSB2aXNpYmxlIHRvIHRoZSBpdGVyYXRvci4gSWYgZmFsc2UsIHRoZXkgYW5kIHRoZWlyCi0JICogZGVzY2VuZGFudHMgd2lsbCBiZSByZWplY3RlZC4gTm90ZSB0aGF0IHRoaXMgcmVqZWN0aW9uIHRha2VzIHByZWNlZGVuY2UKLQkgKiBvdmVyIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGFuZCB0aGUgZmlsdGVyLiBBbHNvIG5vdGUgdGhhdCB0aGlzIGlzCi0JICogY3VycmVudGx5IHRoZSBvbmx5IHNpdHVhdGlvbiB3aGVyZSA8Y29kZT5Ob2RlSXRlcmF0b3JzPC9jb2RlPiBtYXkKLQkgKiByZWplY3QgYSBjb21wbGV0ZSBzdWJ0cmVlIHJhdGhlciB0aGFuIHNraXBwaW5nIGluZGl2aWR1YWwgbm9kZXMuIDxicj4KLQkgKiA8YnI+Ci0JICogVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2VzIGV4cGFuZGVkCi0JICogYW5kIGRvZXMgbm90IGV4cG9zZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGl0c2VsZiwgdXNlIHRoZQotCSAqIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzIHRvIGhpZGUgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBhbmQKLQkgKiBzZXQgPGNvZGU+ZXhwYW5kRW50aXR5UmVmZXJlbmNlczwvY29kZT4gdG8gdHJ1ZSB3aGVuIGNyZWF0aW5nIHRoZQotCSAqIGl0ZXJhdG9yLiBUbyBwcm9kdWNlIGEgdmlldyBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgZW50aXR5IHJlZmVyZW5jZQotCSAqIG5vZGVzIGJ1dCBubyBlbnRpdHkgZXhwYW5zaW9uLCB1c2UgdGhlIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzCi0JICogdG8gc2hvdyB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZCBzZXQKLQkgKiA8Y29kZT5leHBhbmRFbnRpdHlSZWZlcmVuY2VzPC9jb2RlPiB0byBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHNldCBhbmQgYWR2YW5jZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotCSAqIGl0ZXJhdG9yIGluIHRoZSBzZXQuIEFmdGVyIGEgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBpcyBjcmVhdGVkLAotCSAqIHRoZSBmaXJzdCBjYWxsIHRvIDxjb2RlPm5leHROb2RlKCk8L2NvZGU+IHJldHVybnMgdGhlIGZpcnN0IG5vZGUgaW4KLQkgKiB0aGUgc2V0LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5leHQgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZCBvdmVyLCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyCi0JICogICAgICAgICAgICAgICAgdGhlIDxjb2RlPmRldGFjaDwvY29kZT4gbWV0aG9kIHdhcyBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBOb2RlIG5leHROb2RlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIHNldCBhbmQgbW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotCSAqIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gYmFja3dhcmRzIGluIHRoZSBzZXQuCi0JICogCi0JICogQHJldHVybiBUaGUgcHJldmlvdXMgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZAotCSAqICAgICAgICAgb3Zlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbgotCSAqICAgICAgICAgdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBwcmV2aW91c05vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGV0YWNoZXMgdGhlIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gZnJvbSB0aGUgc2V0IHdoaWNoIGl0IGl0ZXJhdGVkCi0JICogb3ZlciwgcmVsZWFzaW5nIGFueSBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBhbmQgcGxhY2luZyB0aGUgaXRlcmF0b3IgaW4KLQkgKiB0aGUgSU5WQUxJRCBzdGF0ZS4gQWZ0ZXIgPGNvZGU+ZGV0YWNoPC9jb2RlPiBoYXMgYmVlbiBpbnZva2VkLCBjYWxscwotCSAqIHRvIDxjb2RlPm5leHROb2RlPC9jb2RlPiBvciA8Y29kZT5wcmV2aW91c05vZGU8L2NvZGU+IHdpbGwgcmFpc2UKLQkgKiB0aGUgZXhjZXB0aW9uIElOVkFMSURfU1RBVEVfRVJSLgotCSAqLwotCXB1YmxpYyB2b2lkIGRldGFjaCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL3czYy9kb20vdHJhdmVyc2FsL1RyZWVXYWxrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS90cmF2ZXJzYWwvVHJlZVdhbGtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQ3ZDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS90cmF2ZXJzYWwvVHJlZVdhbGtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcudzNjLmRvbS50cmF2ZXJzYWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiBvYmplY3RzIGFyZSB1c2VkIHRvIG5hdmlnYXRlIGEgZG9jdW1lbnQgdHJlZSBvcgotICogc3VidHJlZSB1c2luZyB0aGUgdmlldyBvZiB0aGUgZG9jdW1lbnQgZGVmaW5lZCBieSB0aGVpcgotICogPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gZmxhZ3MgYW5kIGZpbHRlciAoaWYgYW55KS4gQW55IGZ1bmN0aW9uIHdoaWNoCi0gKiBwZXJmb3JtcyBuYXZpZ2F0aW9uIHVzaW5nIGEgPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4gd2lsbCBhdXRvbWF0aWNhbGx5Ci0gKiBzdXBwb3J0IGFueSB2aWV3IGRlZmluZWQgYnkgYSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPi4KLSAqIDxwPgotICogT21pdHRpbmcgbm9kZXMgZnJvbSB0aGUgbG9naWNhbCB2aWV3IG9mIGEgc3VidHJlZSBjYW4gcmVzdWx0IGluIGEgc3RydWN0dXJlCi0gKiB0aGF0IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50IGZyb20gdGhlIHNhbWUgc3VidHJlZSBpbiB0aGUgY29tcGxldGUsCi0gKiB1bmZpbHRlcmVkIGRvY3VtZW50LiBOb2RlcyB0aGF0IGFyZSBzaWJsaW5ncyBpbiB0aGUgPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4KLSAqIHZpZXcgbWF5IGJlIGNoaWxkcmVuIG9mIGRpZmZlcmVudCwgd2lkZWx5IHNlcGFyYXRlZCBub2RlcyBpbiB0aGUgb3JpZ2luYWwKLSAqIHZpZXcuIEZvciBpbnN0YW5jZSwgY29uc2lkZXIgYSA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiB0aGF0IHNraXBzIGFsbAotICogbm9kZXMgZXhjZXB0IGZvciBUZXh0IG5vZGVzIGFuZCB0aGUgcm9vdCBub2RlIG9mIGEgZG9jdW1lbnQuIEluIHRoZSBsb2dpY2FsCi0gKiB2aWV3IHRoYXQgcmVzdWx0cywgYWxsIHRleHQgbm9kZXMgd2lsbCBiZSBzaWJsaW5ncyBhbmQgYXBwZWFyIGFzIGRpcmVjdAotICogY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSwgbm8gbWF0dGVyIGhvdyBkZWVwbHkgbmVzdGVkIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCi0gKiBvcmlnaW5hbCBkb2N1bWVudC4KLSAqIDxwPgotICogU2VlIGFsc28gdGhlIDxhCi0gKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1UcmF2ZXJzYWwtUmFuZ2UtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBUcmF2ZXJzYWwgYW5kIFJhbmdlIFNwZWNpZmljYXRpb24gPC9hPi4KLSAqIAotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJlZVdhbGtlciB7Ci0JLyoqCi0JICogVGhlIDxjb2RlPnJvb3Q8L2NvZGU+IG5vZGUgb2YgdGhlIDxjb2RlPlRyZWVXYWxrZXI8L2NvZGU+LCBhcwotCSAqIHNwZWNpZmllZCB3aGVuIGl0IHdhcyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBOb2RlIGdldFJvb3QoKTsKLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGRldGVybWluZXMgd2hpY2ggbm9kZSB0eXBlcyBhcmUgcHJlc2VudGVkIHZpYSB0aGUKLQkgKiA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPi4gVGhlIGF2YWlsYWJsZSBzZXQgb2YgY29uc3RhbnRzIGlzIGRlZmluZWQKLQkgKiBpbiB0aGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gaW50ZXJmYWNlLiBOb2RlcyBub3QgYWNjZXB0ZWQgYnkKLQkgKiA8Y29kZT53aGF0VG9TaG93PC9jb2RlPiB3aWxsIGJlIHNraXBwZWQsIGJ1dCB0aGVpciBjaGlsZHJlbiBtYXkgc3RpbGwKLQkgKiBiZSBjb25zaWRlcmVkLiBOb3RlIHRoYXQgdGhpcyBza2lwIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZmlsdGVyLCBpZgotCSAqIGFueS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFdoYXRUb1Nob3coKTsKLQotCS8qKgotCSAqIFRoZSBmaWx0ZXIgdXNlZCB0byBzY3JlZW4gbm9kZXMuCi0JICovCi0JcHVibGljIE5vZGVGaWx0ZXIgZ2V0RmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgZW50aXR5Ci0JICogcmVmZXJlbmNlIG5vZGVzIGFyZSB2aXNpYmxlIHRvIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPi4gSWYKLQkgKiBmYWxzZSwgdGhleSBhbmQgdGhlaXIgZGVzY2VuZGFudHMgd2lsbCBiZSByZWplY3RlZC4gTm90ZSB0aGF0IHRoaXMKLQkgKiByZWplY3Rpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGFuZCB0aGUKLQkgKiBmaWx0ZXIsIGlmIGFueS4gPGJyPgotCSAqIFRvIHByb2R1Y2UgYSB2aWV3IG9mIHRoZSBkb2N1bWVudCB0aGF0IGhhcyBlbnRpdHkgcmVmZXJlbmNlcyBleHBhbmRlZAotCSAqIGFuZCBkb2VzIG5vdCBleHBvc2UgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBpdHNlbGYsIHVzZSB0aGUKLQkgKiA8Y29kZT53aGF0VG9TaG93PC9jb2RlPiBmbGFncyB0byBoaWRlIHRoZSBlbnRpdHkgcmVmZXJlbmNlIG5vZGUgYW5kCi0JICogc2V0IDxjb2RlPmV4cGFuZEVudGl0eVJlZmVyZW5jZXM8L2NvZGU+IHRvIHRydWUgd2hlbiBjcmVhdGluZyB0aGUKLQkgKiA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPi4gVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzCi0JICogZW50aXR5IHJlZmVyZW5jZSBub2RlcyBidXQgbm8gZW50aXR5IGV4cGFuc2lvbiwgdXNlIHRoZQotCSAqIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzIHRvIHNob3cgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBhbmQKLQkgKiBzZXQgPGNvZGU+ZXhwYW5kRW50aXR5UmVmZXJlbmNlczwvY29kZT4gdG8gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogVGhlIG5vZGUgYXQgd2hpY2ggdGhlIDxjb2RlPlRyZWVXYWxrZXI8L2NvZGU+IGlzIGN1cnJlbnRseQotCSAqIHBvc2l0aW9uZWQuIDxicj4KLQkgKiBBbHRlcmF0aW9ucyB0byB0aGUgRE9NIHRyZWUgbWF5IGNhdXNlIHRoZSBjdXJyZW50IG5vZGUgdG8gbm8gbG9uZ2VyIGJlCi0JICogYWNjZXB0ZWQgYnkgdGhlIDxjb2RlPlRyZWVXYWxrZXI8L2NvZGU+J3MgYXNzb2NpYXRlZCBmaWx0ZXIuCi0JICogPGNvZGU+Y3VycmVudE5vZGU8L2NvZGU+IG1heSBhbHNvIGJlIGV4cGxpY2l0bHkgc2V0IHRvIGFueSBub2RlLAotCSAqIHdoZXRoZXIgb3Igbm90IGl0IGlzIHdpdGhpbiB0aGUgc3VidHJlZSBzcGVjaWZpZWQgYnkgdGhlCi0JICogPGNvZGU+cm9vdDwvY29kZT4gbm9kZSBvciB3b3VsZCBiZSBhY2NlcHRlZCBieSB0aGUgZmlsdGVyIGFuZAotCSAqIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzLiBGdXJ0aGVyIHRyYXZlcnNhbCBvY2N1cnMgcmVsYXRpdmUgdG8KLQkgKiA8Y29kZT5jdXJyZW50Tm9kZTwvY29kZT4gZXZlbiBpZiBpdCBpcyBub3QgcGFydCBvZiB0aGUgY3VycmVudCB2aWV3LAotCSAqIGJ5IGFwcGx5aW5nIHRoZSBmaWx0ZXJzIGluIHRoZSByZXF1ZXN0ZWQgZGlyZWN0aW9uOyBpZiBubyB0cmF2ZXJzYWwgaXMKLQkgKiBwb3NzaWJsZSwgPGNvZGU+Y3VycmVudE5vZGU8L2NvZGU+IGlzIG5vdCBjaGFuZ2VkLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gc2V0Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Y3VycmVudE5vZGU8L2NvZGU+IHRvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldEN1cnJlbnROb2RlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Tm9kZShOb2RlIGN1cnJlbnROb2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTW92ZXMgdG8gYW5kIHJldHVybnMgdGhlIGNsb3Nlc3QgdmlzaWJsZSBhbmNlc3RvciBub2RlIG9mIHRoZSBjdXJyZW50Ci0JICogbm9kZS4gSWYgdGhlIHNlYXJjaCBmb3IgPGNvZGU+cGFyZW50Tm9kZTwvY29kZT4gYXR0ZW1wdHMgdG8gc3RlcAotCSAqIHVwd2FyZCBmcm9tIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPidzPGNvZGU+cm9vdDwvY29kZT4gbm9kZSwKLQkgKiBvciBpZiBpdCBmYWlscyB0byBmaW5kIGEgdmlzaWJsZSBhbmNlc3RvciBub2RlLCB0aGlzIG1ldGhvZCByZXRhaW5zIHRoZQotCSAqIGN1cnJlbnQgcG9zaXRpb24gYW5kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3IHBhcmVudCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlCi0JICogICAgICAgICBoYXMgbm8gcGFyZW50IGluIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPidzIGxvZ2ljYWwgdmlldy4KLQkgKi8KLQlwdWJsaWMgTm9kZSBwYXJlbnROb2RlKCk7Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGUgPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4gdG8gdGhlIGZpcnN0IHZpc2libGUgY2hpbGQgb2YgdGhlCi0JICogY3VycmVudCBub2RlLCBhbmQgcmV0dXJucyB0aGUgbmV3IG5vZGUuIElmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vCi0JICogdmlzaWJsZSBjaGlsZHJlbiwgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIHJldGFpbnMgdGhlIGN1cnJlbnQKLQkgKiBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwotCSAqICAgICAgICAgdmlzaWJsZSBjaGlsZHJlbiBpbiB0aGUgPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4ncyBsb2dpY2FsCi0JICogICAgICAgICB2aWV3LgotCSAqLwotCXB1YmxpYyBOb2RlIGZpcnN0Q2hpbGQoKTsKLQotCS8qKgotCSAqIE1vdmVzIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiB0byB0aGUgbGFzdCB2aXNpYmxlIGNoaWxkIG9mIHRoZQotCSAqIGN1cnJlbnQgbm9kZSwgYW5kIHJldHVybnMgdGhlIG5ldyBub2RlLiBJZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwotCSAqIHZpc2libGUgY2hpbGRyZW4sIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4sIGFuZCByZXRhaW5zIHRoZSBjdXJyZW50Ci0JICogbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KLQkgKiAgICAgICAgIGNoaWxkcmVuIGluIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPidzIGxvZ2ljYWwgdmlldy4KLQkgKi8KLQlwdWJsaWMgTm9kZSBsYXN0Q2hpbGQoKTsKLQotCS8qKgotCSAqIE1vdmVzIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPiB0byB0aGUgcHJldmlvdXMgc2libGluZyBvZiB0aGUKLQkgKiBjdXJyZW50IG5vZGUsIGFuZCByZXR1cm5zIHRoZSBuZXcgbm9kZS4gSWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KLQkgKiB2aXNpYmxlIHByZXZpb3VzIHNpYmxpbmcsIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4sIGFuZCByZXRhaW5zIHRoZQotCSAqIGN1cnJlbnQgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KLQkgKiAgICAgICAgIHByZXZpb3VzIHNpYmxpbmcuIGluIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPidzIGxvZ2ljYWwKLQkgKiAgICAgICAgIHZpZXcuCi0JICovCi0JcHVibGljIE5vZGUgcHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGUgPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4gdG8gdGhlIG5leHQgc2libGluZyBvZiB0aGUgY3VycmVudAotCSAqIG5vZGUsIGFuZCByZXR1cm5zIHRoZSBuZXcgbm9kZS4gSWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8gdmlzaWJsZSBuZXh0Ci0JICogc2libGluZywgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIHJldGFpbnMgdGhlIGN1cnJlbnQgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8KLQkgKiAgICAgICAgIG5leHQgc2libGluZy4gaW4gdGhlIDxjb2RlPlRyZWVXYWxrZXI8L2NvZGU+J3MgbG9naWNhbCB2aWV3LgotCSAqLwotCXB1YmxpYyBOb2RlIG5leHRTaWJsaW5nKCk7Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGUgPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4gdG8gdGhlIHByZXZpb3VzIHZpc2libGUgbm9kZSBpbgotCSAqIGRvY3VtZW50IG9yZGVyIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IG5vZGUsIGFuZCByZXR1cm5zIHRoZSBuZXcgbm9kZS4KLQkgKiBJZiB0aGUgY3VycmVudCBub2RlIGhhcyBubyBwcmV2aW91cyBub2RlLCBvciBpZiB0aGUgc2VhcmNoIGZvcgotCSAqIDxjb2RlPnByZXZpb3VzTm9kZTwvY29kZT4gYXR0ZW1wdHMgdG8gc3RlcCB1cHdhcmQgZnJvbSB0aGUKLQkgKiA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPidzPGNvZGU+cm9vdDwvY29kZT4gbm9kZSwgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQgcmV0YWlucyB0aGUgY3VycmVudCBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwotCSAqICAgICAgICAgcHJldmlvdXMgbm9kZSBpbiB0aGUgPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4ncyBsb2dpY2FsIHZpZXcuCi0JICovCi0JcHVibGljIE5vZGUgcHJldmlvdXNOb2RlKCk7Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGUgPGNvZGU+VHJlZVdhbGtlcjwvY29kZT4gdG8gdGhlIG5leHQgdmlzaWJsZSBub2RlIGluCi0JICogZG9jdW1lbnQgb3JkZXIgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbm9kZSwgYW5kIHJldHVybnMgdGhlIG5ldyBub2RlLgotCSAqIElmIHRoZSBjdXJyZW50IG5vZGUgaGFzIG5vIG5leHQgbm9kZSwgb3IgaWYgdGhlIHNlYXJjaCBmb3IgbmV4dE5vZGUKLQkgKiBhdHRlbXB0cyB0byBzdGVwIHVwd2FyZCBmcm9tIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPidzCi0JICogPGNvZGU+cm9vdDwvY29kZT4gbm9kZSwgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIHJldGFpbnMgdGhlCi0JICogY3VycmVudCBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5ldyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBubwotCSAqICAgICAgICAgbmV4dCBub2RlIGluIHRoZSA8Y29kZT5UcmVlV2Fsa2VyPC9jb2RlPidzIGxvZ2ljYWwgdmlldy4KLQkgKi8KLQlwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL3czYy9kb20vdHJhdmVyc2FsL3BhY2thZ2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS90cmF2ZXJzYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGZiYWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvdzNjL2RvbS90cmF2ZXJzYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08aHRtbD4KLVRoaXMgcGFja2FnZSBjb250YWlucyB1bm1vZGlmaWVkIHNvdXJjZXMgcHJvdmlkZWQgYnkgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItVHJhdmVyc2FsLVJhbmdlLTIwMDAxMTEzL2phdmEtYmluZGluZy56aXAKLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTUxZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgoteHNkZWRpdG9yLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LnhzZC51aV8xLjAuMC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiMzgyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNkLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmJhOWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jRnJpIERlYyAxMCAwMDoyOTowMyBFU1QgMjAwNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5YWJiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNGcmkgRGVjIDEwIDAwOjUwOjI2IEVTVCAyMDA0DQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wDQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTANCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTANCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTANCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTANCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wDQotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjczYWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS54c2RlZGl0b3IuamFyID0gc3JjLwotYmluLmluY2x1ZGVzID0geHNkZWRpdG9yLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBpbWFnZS8sXAotICAgICAgICAgICAgICAgZG9jLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBzYW1wbGVzLyxcCi0gICAgICAgICAgICAgICB3M2MvCi1zcmMuaW5jbHVkZXMgPSB3M2MvLFwKLSAgICAgICAgICAgICAgIHNhbXBsZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaW1hZ2UvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBkb2MvLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgdGVzdC8sXAotICAgICAgICAgICAgICAgYnVpbGQueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLnByb2plY3QsXAotICAgICAgICAgICAgICAgLmNsYXNzcGF0aCxcCi0gICAgICAgICAgICAgICB4c2RlZGl0b3IuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvWFNERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvWFNERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDBmMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL1hTREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Fubm90YXRpb25zaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbm5vdGF0aW9uc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZmI2ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Fubm90YXRpb25zaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hdHRyaWJ1dGVncm91cHNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2F0dHJpYnV0ZWdyb3Vwc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MThhMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2F0dHJpYnV0ZWdyb3Vwc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTQ4NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2F0dHJpYnV0ZXNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2RpcmVjdGl2ZXNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2RpcmVjdGl2ZXNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDAwY2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9kaXJlY3RpdmVzaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lbGVtZW50c2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZWxlbWVudHNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmY3MjA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lbGVtZW50c2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZ3JvdXBzaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9ncm91cHNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTc0NWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9ncm91cHNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L25vdGF0aW9uc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvbm90YXRpb25zaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1YzY0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvbm90YXRpb25zaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX2xpc3Rfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX2xpc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyY2Q5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9saXN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfcmVzdHJpY3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViZDU0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfdW5pb25fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3VuaW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDFmOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfdW5pb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi90eXBlc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvdHlwZXNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjY3NTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi90eXBlc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvYXR0cmlidXRlb3ZlcmxheS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvYXR0cmlidXRlb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzFmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2F0dHJpYnV0ZW92ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L3RleHRvdmVybGF5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi90ZXh0b3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTVjMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L3RleHRvdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU4ODM5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTVNDSCAtIFhNTCBUb29scyAtICBYTUwgU2NoZW1hIEVkaXRvcgotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLSEKLSEgUGx1Z2luCi0hCi1fVUlfUExVR0lOX05BTUUgICAgICAgICAgICAgPSBYTUwgU2NoZW1hIEVkaXRvcgotX1VJX0VESVRPUl9OQU1FICAgICAgICAgICAgID0gWE1MIFNjaGVtYSBFZGl0b3IKLQotX1VJX0FDVElPTl9FWFRfR0VORVJBVEUgICAgICA9ICZHZW5lcmF0ZQotX1VJX0FDVElPTl9FWFRfR0VORVJBVEVfRERMICA9ICZEREwuLi4KLV9VSV9BQ1RJT05fRVhUX0dFTkVSQVRFX0RURCAgPSBEJlRELi4uCi1fVUlfQUNUSU9OX0VYVF9HRU5FUkFURV9KQVZBID0gJkphdmEgQmVhbnMuLi4KLQotX1VJX0FDVElPTl9FWFRfR0VORVJBVEVfWFNEID0gJkdlbmVyYXRlIFhNTCBTY2hlbWEKLV9VSV9XSVpBUkRfTkFNRV9ORVdfWFNEICAgICA9IFhNTCBTY2hlbWEKLQotX1VJX1hNTF9UT09MU19QUkVGRVJFTkNFX1BBR0UgID0gWE1MCi1fVUlfWE1MX1NDSEVNQV9QUkVGRVJFTkNFICAgICAgPSBYTUwgU2NoZW1hIEZpbGVzCi0KLV9VSV9XSVpBUkRfTkVXX1hTRCAgICAgICAgICAgICA9IFhNTCBTY2hlbWEKLV9VSV9DUkVBVEVfQV9ORVdfU0NIRU1BICAgICAgICA9IENyZWF0ZSBhIG5ldyBYTUwgc2NoZW1hIGZpbGUKLQotISBOZXcgcHJvcGVydHkgdGFicwotX1VJX0xBQkVMX0dFTkVSQUwgICAgICAgPSBHZW5lcmFsCi1fVUlfTEFCRUxfT1RIRVIgICAgICAgICA9IE90aGVyCi1fVUlfTEFCRUxfQVRUUklCVVRFUyAgICA9IEF0dHJpYnV0ZXMKLV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OID0gRG9jdW1lbnRhdGlvbgotX1VJX0xBQkVMX0ZBQ0VUUyAgICAgICAgPSBGYWNldHMKLV9VSV9MQUJFTF9FTlVNRVJBVElPTlMgID0gRW51bWVyYXRpb25zCi1fVUlfTEFCRUxfTkFNRVNQQUNFICAgICA9IE5hbWVzcGFjZQotCi1fVUlfTEFCRUxfUkVBRF9PTkxZICAgICA9IHJlYWQtb25seQotX1VJX0xBQkVMX0tJTkQgICAgICAgICAgPSBLaW5kOgotX1VJX0xBQkVMX1ZBUklFVFkgICAgICAgPSBWYXJpZXR5OgotCi0hCi0hIFNjaGVtYSBGaWxlIFdpbmRvdwotIQotX1VJX0xBQkVMX0ZJTEVfTkFNRSAgICAgICAgICAgICAgPSBGaWxlIG5hbWU6Ci1fVUlfTEFCRUxfVkVSU0lPTiAgICAgICAgICAgICAgICA9IFZlcnNpb246Ci1fVUlfVE9PTFRJUF9WRVJTSU9OICAgICAgICAgICAgICA9IENvbnZlbmllbnQgYXR0cmlidXRlIHRvIHN0b3JlIHZlcnNpb24gbnVtYmVyCi1fVUlfTEFCRUxfTEFOR1VBR0UgICAgICAgICAgICAgICA9IExhbmd1YWdlOgotX1VJX1RPT0xUSVBfTEFOR1VBR0UgICAgICAgICAgICAgPSBSZXByZXNlbnRzIG5hdHVyYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMKLV9VSV9HUk9VUF9OQU1FU1BBQ0UgICAgICAgICAgICAgID0gTmFtZXNwYWNlCi1fVUlfTEFCRUxfU0NIRU1BX1BSRUZJWCAgICAgICAgICA9IFByZWZpeDoKLV9VSV9UT09MVElQX1NDSEVNQV9QUkVGSVggICAgICAgID0gVGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbmFtZXNwYWNlLgotX1VJX0xBQkVMX1RBUkdFVF9OQU1FX1NQQUNFICAgICAgPSBUYXJnZXQgbmFtZXNwYWNlOgotX1VJX1RPT0xUSVBfVEFSR0VUX05BTUVfU1BBQ0UgICAgPSBUaGUgbmFtZXNwYWNlIGZvciB0aGlzIHNjaGVtYS4KLV9VSV9CVVRUT05fQVBQTFkgICAgICAgICAgICAgICAgID0gQXBwbHkKLV9VSV9MQUJFTF9BVFRSSUJVVEVfRk9STV9ERUZBVUxUID0gQXR0cmlidXRlIGZvcm0gZGVmYXVsdDoKLV9VSV9UT09MVElQX0FUVFJJQlVURV9GT1JNICAgICAgID0gSW5kaWNhdGVzIGlmIGFsbCBhdHRyaWJ1dGVzIGluIGEgc2NoZW1hIG11c3QgYmUgcXVhbGlmaWVkIG9yIG5vdCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9MQUJFTF9FTEVNRU5UX0ZPUk1fREVGQVVMVCAgID0gRWxlbWVudCBmb3JtIGRlZmF1bHQ6Ci1fVUlfVE9PTFRJUF9FTEVNRU5UX0ZPUk1fREVGQVVMVCA9IEluZGljYXRlcyBpZiBhbGwgZWxlbWVudHMgaW4gYSBzY2hlbWEgbXVzdCBiZSBxdWFsaWZpZWQgb3Igbm90IGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudAotX1VJX0xBQkVMX0JMT0NLX0RFRkFVTFQgICAgICAgICAgPSBCbG9jayBkZWZhdWx0OgotX1VJX1RPT0xUSVBfQkxPQ0tfREVGQVVMVCAgICAgICAgPSBDb250cm9sIGRlcml2YXRpb25zIGZvciBldmVyeSB0eXBlIGFuZCBlbGVtZW50IGluIHRoZSBzY2hlbWEKLV9VSV9MQUJFTF9GSU5BTF9ERUZBVUxUICAgICAgICAgID0gRmluYWwgZGVmYXVsdDoKLV9VSV9UT09MVElQX0ZJTkFMX0RFRkFVTFQgICAgICAgID0gQ29udHJvbCBkZXJpdmF0aW9ucyBmb3IgZXZlcnkgdHlwZSBhbmQgZWxlbWVudCBpbiB0aGUgc2NoZW1hCi1fVUlfQUNUSU9OX0RFTEVURV9JTkNMVURFICAgICAgICA9IERlbGV0ZQotX1VJX0FDVElPTl9ERUxFVEVfTk9ERVMgICAgICAgICAgPSBEZWxldGUgTm9kZXMKLSEgTm90ZSB0byB0cmFuc2xhdG9yczogVGhlIGZvbGxvd2luZyBpcyB0aGUgYWNyb255bSBmb3IgVW5pZm9ybSBSZXNvdXJjZSBJbmRpY2F0b3IKLV9VSV9MQUJFTF9VUkkgICAgICAgICAgICAgICAgICAgID0gVVJJOgotCi0KLV9VSV9MQUJFTF9BREQgICAgICAgICAgICAgID0gQWRkLi4uCi1fVUlfTEFCRUxfRURJVCAgICAgICAgICAgICA9IEVkaXQuLi4KLV9VSV9MQUJFTF9QQVRURVJOUyAgICAgICAgID0gUGF0dGVybnMKLV9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTID0gVGhlIGZpbGUgbmFtZSBhbHJlYWR5IGV4aXN0czogezB9Ci0KLSEKLSEgQW55IFNlY3Rpb24KLSEKLSEgTm90ZSB0byB0cmFuc2xhdG9ycyAtIHRyYW5zbGF0ZSBvbmx5IHRoZSB3b3JkIGFuZAotX1VJX0xBQkVMX05BTUVTUEFDRV9BTkRfUFJPQ0VTU19DT05URU5UUyA9IG5hbWVzcGFjZSBhbmQgcHJvY2Vzc0NvbnRlbnRzCi0KLSEKLSEgbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMgc2VjdGlvbgotIQotISBOb3RlIHRvIHRyYW5zbGF0b3JzIC0gdHJhbnNsYXRlIG9ubHkgdGhlIHdvcmQgYW5kCi1fVUlfTEFCRUxfTUlOT0NDVVJTX0FORF9NQVhPQ0NVUlMgPSBtaW5PY2N1cnMgYW5kIG1heE9jY3VycwotCi0hCi0hIFZhbHVlIEluZm9ybWF0aW9uIFNlY3Rpb24KLSEKLV9VSV9MQUJFTF9WQUxVRV9JTkZPUk1BVElPTiAgID0gVmFsdWUgSW5mb3JtYXRpb24KLQotIQotISBOb3RhdGlvbiB3aW5kb3cKLSEKLV9VSV9OT1RBVElPTl9OQU1FICAgICAgICAgICAgICAgID0gTmFtZToKLV9VSV9OT1RBVElPTl9QVUJMSUMgICAgICAgICAgICAgID0gUHVibGljOgotX1VJX05PVEFUSU9OX1NZU1RFTSAgICAgICAgICAgICAgPSBTeXN0ZW06Ci1fVUlfVE9PTFRJUF9QVUJMSUMgICAgICAgICAgICAgICA9IEFuIG9wdGlvbmFsIHB1YmxpYyBpZGVudGlmaWVyCi1fVUlfVE9PTFRJUF9TWVNURU0gICAgICAgICAgICAgICA9IEFuIG9wdGlvbmFsIFVSSSByZWZlcmVuY2UKLQotIQotISBDb21wbGV4IFR5cGUgV2luZG93Ci0hCi1fVUlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICA9IE5hbWU6Ci1fVUlfQUJTVFJBQ1QgICAgICAgICAgICAgICAgICAgICA9IEFic3RyYWN0OgotX1VJX01JWEVEICAgICAgICAgICAgICAgICAgICAgICAgPSBNaXhlZDoKLV9VSV9CTE9DSyAgICAgICAgICAgICAgICAgICAgICAgID0gQmxvY2s6Ci1fVUlfRklOQUwgICAgICAgICAgICAgICAgICAgICAgICA9IEZpbmFsOgotCi1fVUlfQ1RfVE9PTFRJUF9NSVhFRCAgICAgICAgICAgICA9IEluZGljYXRlcyBpZiB0eXBlIG1heSBjb250YWluIG1peGVkIGNvbnRlbnQKLV9VSV9DVF9UT09MVElQX0FCU1RSQUNUICAgICAgICAgID0gV2hlbiBhIGNvbXBsZXggdHlwZSBpcyBkZWNsYXJlZCBhYnN0cmFjdCwgaXQgY2Fubm90IGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9DVF9UT09MVElQX0ZJTkFMICAgICAgICAgICAgID0gWW91IGNhbiB1c2UgdGhpcyB0byBwcmV2ZW50IGZ1cnRoZXIgZGVyaXZhdGlvbnMKLV9VSV9DVF9UT09MVElQX0JMT0NLICAgICAgICAgICAgID0gWW91IGNhbiB1c2UgdGhpcyB0byBibG9jayBhbnkgZGVyaXZhdGlvbnMKLQotIQotISBTaW1wbGVDb250ZW50IGFuZCBDb21wbGV4Q29udGVudCBXaW5kb3cKLSEgCi1fVUlfTEFCRUxfREVSSVZFRF9CWSAgICAgICAgICAgID0gRGVyaXZlZCBieToKLV9VSV9UT09MVElQX0RFUklWRURfQlkgICAgICAgICAgPSBEZXJpdmUgYnkgZXh0ZW5zaW9uIHRvIGluaGVyaXQgZnJvbSBhIGJhc2UgdHlwZSBjb250ZW50IG1vZGVsIGFuZCBhZGQgdG8gaXQuIERlcml2ZSBieSByZXN0cmljdGlvbiB0byByZXN0cmljdCB0aGUgY29udGVudCBtb2RlbCBvZiBhbiBleGlzdGluZyB0eXBlLgotCi0hCi0hIENvbWJvIGJveCBpdGVtcyAtIG5vIG5lZWQgdG8gdHJhbnNsYXRlCi0hCi1fVUlfQ09NQk9fUkVTVFJJQ1RJT04gICAgICAgICAgID0gcmVzdHJpY3Rpb24KLV9VSV9DT01CT19FWFRFTlNJT04gICAgICAgICAgICAgPSBleHRlbnNpb24KLQotIQotISBFbGVtZW50ICYgRWxlbWVudCBSZWYgV2luZG93Ci0hCi1fVUlfRUxFTUVOVF9OQU1FICAgICAgICAgICAgICAgICA9IE5hbWU6Ci1fVUlfQ0hFQ0tCT1hfTklMTEFCTEUgICAgICAgICAgICA9IE5pbGxhYmxlCi1fVUlfQ0hFQ0tCT1hfQUJTVFJBQ1QgICAgICAgICAgICA9IEFic3RyYWN0Ci1fVUlfU1VCU1RJVFVUSU9OICAgICAgICAgICAgICAgICA9IFN1YnN0aXR1dGlvbiBncm91cDoKLV9VSV9NSU5JTVVNICAgICAgICAgICAgICAgICAgICAgID0gTWluaW11bToKLV9VSV9NQVhJTVVNICAgICAgICAgICAgICAgICAgICAgID0gTWF4aW11bToKLV9VSV9SRUZFUkVOQ0VfTkFNRSAgICAgICAgICAgICAgID0gUmVmZXJlbmNlIG5hbWU6Ci0KLV9VSV9UT09MVElQX0VMRU1FTlRfTUlOSU1VTSAgICAgID0gQSBub24tbmVnYXRpdmUgaW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgbWluaW11bSBudW1iZXIgb2YgdGltZXMgYW4gZWxlbWVudCBjYW4gb2NjdXIuCi1fVUlfVE9PTFRJUF9FTEVNRU5UX01BWElNVU0gICAgICA9IEEgbm9uLW5lZ2F0aXZlIGludGVnZXIgb3IgdW5ib3VuZGVkIGlmIHRoZXJlIGlzIG5vIHVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIG9jY3VyLgotX1VJX1RPT0xUSVBfRUxFTUVOVF9BQlNUUkFDVCAgICAgPSBXaGVuIGFuIGVsZW1lbnQgaXMgZGVjbGFyZWQgYWJzdHJhY3QsIGEgbWVtYmVyIG9mIGl0cyBlcXVpdmFsZW50IGNsYXNzIG11c3QgYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCwKLV9VSV9UT09MVElQX0VMRU1FTlRfTklMICAgICAgICAgID0gSWYgc2VsZWN0ZWQsIGFuIGF0dHJpYnV0ZSBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGEgbmlsIHZhbHVlLgotX1VJX1RPT0xUSVBfRUxFTUVOVF9TVUJTVElUVVRJT04gPSBTZWxlY3QgdGhlIGVsZW1lbnQgdGhhdCBjYW4gYmUgc3Vic3RpdHV0ZWQgYnkgdGhpcyBlbGVtZW50Ci1fVUlfVE9PTFRJUF9FTEVNRU5UX0ZPUk0gICAgICAgICA9IEluZGljYXRlcyBpZiB0aGUgZWxlbWVudCBpcyBxdWFsaWZlZCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9UT09MVElQX0VMRU1FTlRfVkFMVUUgICAgICAgID0gUHJvdmlkZXMgYSBkZWZhdWx0IG9yIGZpeGVkIHZhbHVlIGZvciB0aGUgZWxlbWVudC4KLQotCi0hCi0hIEF0dHJpYnV0ZSBXaW5kb3cKLSEgICAgX1VJX0NPTUJPX0JPWCBzdHJpbmdzIGFyZSB1c2VkIGluIGNvZGUgZ2VuZXJhdGlvbi4gCi0hICAgIFByb2JhYmx5IGRvbid0IG5lZWQgdG8gYmUgdHJhbnNsYXRlZAotIQotX1VJX0NPTUJPX0JPWF9SRVFVSVJFRCAgICAgICAgICAgPSByZXF1aXJlZAotX1VJX0NPTUJPX0JPWF9PUFRJT05BTCAgICAgICAgICAgPSBvcHRpb25hbAotX1VJX0NPTUJPX0JPWF9QUk9ISUJJVEVEICAgICAgICAgPSBwcm9oaWJpdGVkCi0KLV9VSV9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgID0gRml4ZWQKLV9VSV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgID0gRGVmYXVsdAotX1VJX0FUVFJJQlVURV9OQU1FICAgICAgICAgICAgICAgPSBBdHRyaWJ1dGUgbmFtZToKLV9VSV9VU0FHRSAgICAgICAgICAgICAgICAgICAgICAgID0gVXNhZ2U6Ci1fVUlfRk9STSAgICAgICAgICAgICAgICAgICAgICAgICA9IEZvcm0gcXVhbGlmaWNhdGlvbjoKLV9VSV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgID0gVmFsdWUKLQotX1VJX0xBQkVMX09USEVSX0FUVFJJQlVURVMgICAgICAgPSBPdGhlciBBdHRyaWJ1dGVzCi0KLV9VSV9UT09MVElQX0FUVFJJQlVURV9VU0UgICAgICAgID0gSW5kaWNhdGVzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQsIG9wdGlvbmFsLCBvciBwcm9oaWJpdGVkCi1fVUlfVE9PTFRJUF9BVFRSSUJVVEVfRk9STSAgICAgICA9IEluZGljYXRlcyBpZiB0aGUgYXR0cmlidXRlIGlzIHF1YWxpZmVkIG9yIG5vdCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9UT09MVElQX0FUVFJJQlVURV9WQUxVRSAgICAgID0gUHJvdmlkZXMgZGVmYXVsdCBvciBmaXhlZCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4gRGVmYXVsdCB2YWx1ZSBvbmx5IHZhbGlkIGlmIFVzYWdlIHZhbHVlIGlzIHNldCB0byBvcHRpb25hbC4KLQotX1VJX1BST0NFU1NfQ09OVEVOVFMgICAgICAgICAgICAgPSBQcm9jZXNzIGNvbnRlbnRzOgotCi0hCi0hIEFubm90YXRpb24gLSBEb2MgJiBBcHBJbmZvIFdpbmRvdwotIQotX1VJX0NPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgPSBDb21tZW50Ci1fVUlfVE9PTFRJUF9DT01NRU5UICAgICAgICAgICAgICA9IEluZm9ybWF0aW9uIHVzZWZ1bCB0byB0aGUgdXNlciBvciBhcHBsaWNhdGlvbgotX1VJX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgPSBTb3VyY2U6Ci1fVUlfVE9PTFRJUF9TT1VSQ0UgICAgICAgICAgICAgICA9IEFuIG9wdGlvbmFsIFVSSSByZWZlcmVuY2UgdG8gc3VwcGxlbWVudCB0aGUgbG9jYWwgaW5mb3JtYXRpb24KLV9VSV9MQU5HVUFHRSAgICAgICAgICAgICAgICAgICAgID0gTGFuZ3VhZ2U6Ci1fVUlfVE9PTFRJUF9MQU5HVUFHRV9BTk5PVEFUSU9OICA9IEluZGljYXRlIHRoZSBsYW5ndWFnZSBpbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBleHByZXNzZWQKLQotIQotISBHcm91cAotISAKLV9VSV9DT05URU5UX01PREVMICAgICAgICAgICAgICAgPSBDb250ZW50IG1vZGVsCi1fVUlfU0VRVUVOQ0UgICAgICAgICAgICAgICAgICAgID0gU2VxdWVuY2UKLV9VSV9DSE9JQ0UgICAgICAgICAgICAgICAgICAgICAgPSBDaG9pY2UKLV9VSV9BTEwgICAgICAgICAgICAgICAgICAgICAgICAgPSBBbGwKLQotCi0hCi0hIFNpbXBsZSBUeXBlIFJlbGF0ZWQgRmFjZXRzICAtIGFwcGVhciBhcyBlbnRyaWVzIGluIGEgdGFibGUgLSByZXN0cmljdGlvbiBvbiBzaW1wbGUgdHlwZQotIQotX1VJX0dST1VQX0ZBQ0VUUyAgICAgICAgICAgICAgICA9IEZhY2V0cwotX1VJX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICA9IExlbmd0aAotX1VJX01JTklNVU1fTEVOR1RIICAgICAgICAgICAgICA9IE1pbmltdW0gTGVuZ3RoCi1fVUlfTUFYSU1VTV9MRU5HVEggICAgICAgICAgICAgID0gTWF4aW11bSBMZW5ndGgKLV9VSV9NSU5JTVVNX0lOQ0xVU0lWRSAgICAgICAgICAgPSBNaW5pbXVtIEluY2x1c2l2ZQotX1VJX01BWElNVU1fSU5DTFVTSVZFICAgICAgICAgICA9IE1heGltdW0gSW5jbHVzaXZlCi1fVUlfTUlOSU1VTV9FWENMVVNJVkUgICAgICAgICAgID0gTWluaW11bSBFeGNsdXNpdmUKLV9VSV9NQVhJTVVNX0VYQ0xVU0lWRSAgICAgICAgICAgPSBNYXhpbXVtIEV4Y2x1c2l2ZQotX1VJX1RPVEFMX0RJR0lUUyAgICAgICAgICAgICAgICA9IFRvdGFsIERpZ2l0cwotX1VJX0ZSQUNUSU9OX0RJR0lUUyAgICAgICAgICAgICA9IEZyYWN0aW9uIERpZ2l0cwotX1VJX1dISVRFX1NQQUNFICAgICAgICAgICAgICAgICA9IFdoaXRlIFNwYWNlCi1fVUlfRkFDRVRfTkFNRSAgICAgICAgICAgICAgICAgID0gTmFtZQotX1VJX0ZBQ0VUX1ZBTFVFICAgICAgICAgICAgICAgICA9IFZhbHVlCi1fVUlfRkFDRVRfRklYRUQgICAgICAgICAgICAgICAgID0gRml4ZWQKLQotX1VJX1RPT0xUSVBfTEVOR1RIICAgICAgICAgICAgICA9IFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgbGVuZ3RoLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuCi1fVUlfVE9PTFRJUF9NSU5fTEVOICAgICAgICAgICAgID0gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHVuaXRzIG9mIGxlbmd0aC4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLgotX1VJX1RPT0xUSVBfTUFYX0xFTiAgICAgICAgICAgICA9IFRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml0cyBvZiBsZW5ndGguIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KLV9VSV9UT09MVElQX01BWF9JTkNMVVNJVkUgICAgICAgPSBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHZhbHVlIHNwYWNlLiBUaGUgdmFsdWUgaXMgaXRzZWxmIGluY2x1ZGVkLgotX1VJX1RPT0xUSVBfTUFYX0VYQ0xVU0lWRSAgICAgICA9IFRoZSB1cHBlciBib3VuZCBvZiB0aGUgdmFsdWUgc3BhY2UuIFRoZSB2YWx1ZSBpcyBpdHNlbGYgZXhjbHVkZWQuCi1fVUlfVE9PTFRJUF9NSU5fSU5DTFVTSVZFICAgICAgID0gVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSB2YWx1ZSBzcGFjZS4gVGhlIHZhbHVlIGlzIGl0c2VsZiBpbmNsdWRlZC4KLV9VSV9UT09MVElQX01JTl9FWENMVVNJVkUgICAgICAgPSBUaGUgbG93ZXIgYm91bmQgb2YgdGhlIHZhbHVlIHNwYWNlLiBUaGUgdmFsdWUgaXMgaXRzZWxmIGV4Y2x1ZGVkLgotX1VJX1RPT0xUSVBfVE9UQUxfRElHSVRTICAgICAgICA9IFRoZSBtYXhpbXVtIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cy4gTXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuCi1fVUlfVE9PTFRJUF9GUkFDVElPTl9ESUdJVFMgICAgID0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGluIHRoZSBmcmFjdGlvbmFsIHBhcnQuIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KLV9VSV9UT09MVElQX1dISVRFX1NQQUNFICAgICAgICAgPSBJbmRpY2F0ZXMgaWYgd2hpdGUgc3BhY2Ugc2hvdWxkIGJlIHByZXNlcnZlZCwgcmVwbGFjZWQgb3IgY29sbGFwc2VkLiAKLQotX1VJX1RPT0xUSVBfUEFUVEVSTiAgICAgICAgICAgICA9IENvbnN0cmFpbnMgdGhlIHZhbHVlIHRvIG1hdGNoIGEgc3BlY2lmaWMgcGF0dGVybi4gVGhlIHBhdHRlcm4gbXVzdCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gCi1fVUlfVE9PTFRJUF9FTlVNICAgICAgICAgICAgICAgID0gQ29uc3RyYWlucyB0aGUgdmFsdWUgdG8gYSBzcGVjaWZpZWQgc2V0IG9mIHZhbHVlcy4gCi0KLSEKLSEgU2ltcGxlL0NvbXBsZXggVHlwZSBTZWxlY3Rpb24gCi0hCi1fVUlfTEFCRUxfVFlQRV9JTkZPUk1BVElPTiAgICAgICAgICA9IFR5cGUgaW5mb3JtYXRpb24KLV9VSV9MQUJFTF9CQVNFX1RZUEUgICAgICAgICAgICAgICAgID0gQmFzZSB0eXBlCi1fVUlfTEFCRUxfQkFTRV9UWVBFX1dJVEhfQ09MT04gICAgICA9IEJhc2UgdHlwZToKLV9VSV9MQUJFTF9TRVRfQkFTRV9UWVBFICAgICAgICAgICAgID0gU2V0IEJhc2UgVHlwZQotX1VJX0FDVElPTl9TRVRfQkFTRV9UWVBFICAgICAgICAgICAgPSBTZXQgQmFzZSBUeXBlLi4uCi1fVUlfUkFESU9fTk9ORSAgICAgICAgICAgICAgICAgICAgICA9IE5vbmUKLV9VSV9SQURJT19CVUlMVF9JTl9TSU1QTEVfVFlQRSAgICAgID0gQnVpbHQtaW4gc2ltcGxlIHR5cGUKLV9VSV9SQURJT19VU0VSX0RFRklORURfU0lNUExFX1RZUEUgID0gVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlCi1fVUlfUkFESU9fVVNFUl9ERUZJTkVEX0NPTVBMRVhfVFlQRSA9IFVzZXItZGVmaW5lZCBjb21wbGV4IHR5cGUKLV9VSV9OT19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgID0gKipub25lKioKLQotIQotISBDb21iby1ib3ggdmFsdWUgCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSBmb2xsb3dpbmcgbGluZQotX1VJX0RFRkFVTFRfQU5PTllNT1VTICAgICAgICAgICAgICAgPSAqKmFub255bW91cyoqCi0KLSEKLSEgVW5pcXVlLCBLZXkgYW5kIEtleVJlZiB3aW5kb3cKLSEKLV9VSV9SRUZFUkVOQ0VfS0VZICAgICAgICAgICAgICAgICAgID0gUmVmZXJlbmNlIGtleQotX1VJX1NFTEVDVE9SICAgICAgICAgICAgICAgICAgICAgICAgPSBTZWxlY3RvcgotX1VJX0ZJRUxEUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBGaWVsZHMKLQotX1VJX1RPT0xUSVBfU0VMRUNUT1JfVEVYVCAgICAgICAgICAgPSBTcGVjaWZpZXMgYW4gWFBhdGggZXhwcmVzc2lvbiByZWxhdGl2ZSB0byBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgZWxlbWVudAotX1VJX1RPT0xUSVBfRklFTERfVEVYVCAgICAgICAgICAgICAgPSBTcGVjaWZpZXMgYW4gWFBhdGggZXhwcmVzc2lvbiByZWxhdGl2ZSB0byBlYWNoIGVsZW1lbnQgc2VsZWN0ZWQgYnkgdGhlIHNlbGVjdG9yCi0KLV9VSV9BRERfQlVUVE9OICAgICAgICAgICAgICAgICAgICAgID0gQWRkPj4KLV9VSV9SRU1PVkVfQlVUVE9OICAgICAgICAgICAgICAgICAgID0gPDxSZW1vdmUKLQotIQotISBJbmNsdWRlICYgSW1wb3J0cwotIQotX1VJX0xBQkVMX1BSRUZJWCAgICAgICAgICAgICAgICA9IFByZWZpeDoKLV9VSV9MQUJFTF9OQU1FU1BBQ0UgICAgICAgICAgICAgPSBOYW1lc3BhY2U6Ci0KLV9VSV9TQ0hFTUFfSU5DTFVERV9ERVNDICAgICAgICAgPSBTZWxlY3QgYSBzY2hlbWEgZmlsZSBzbyB0aGF0IHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgc2NoZW1hIGZpbGUgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGN1cnJlbnQgc2NoZW1hLgotX1VJX0xBQkVMX1NDSEVNQV9JTVBPUlRfREVTQyAgICA9IFNlbGVjdCBhIHNjaGVtYSBmaWxlIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHNvIHRoYXQgaXRzIGRlZmluaXRpb25zIGNhbiBiZSByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50IHNjaGVtYS4gWW91IG11c3QgYXNzb2NpYXRlIGEgcHJlZml4IHdpdGggdGhlIG5ldyBuYW1lc3BhY2UgZm9yIHVzZSBpbiB0aGUgY3VycmVudCBzY2hlbWEuCi0KLV9VSV9MQUJFTF9TQ0hFTUFfTE9DQVRJT04gICAgICAgID0gU2NoZW1hIGxvY2F0aW9uOgotX1VJX0JVVFRPTl9TRUxFQ1QgICAgICAgICAgICAgICAgPSBTZWxlY3QKLV9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfU0NIRU1BID0gU2VsZWN0IFhNTCBzY2hlbWEgZmlsZQotX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9ERVNDICAgPSBTZWxlY3QgYW4gWE1MIHNjaGVtYSBmaWxlIGZyb20gdGhlIFdvcmtiZW5jaCBwcm9qZWN0cwotX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9VUkwgICAgPSBTZWxlY3QgYW4gWE1MIHNjaGVtYSBmaWxlIGZyb20gSFRUUAotCi1fVUlfTEFCRUxfTE9BRElOR19YTUxfU0NIRU1BICAgICA9IExvYWRpbmcgWE1MIFNjaGVtYQotX1VJX0xBQkVMX0ZJTklTSF9MT0FESU5HICAgICAgICAgPSBGaW5pc2ggTG9hZGluZwotX1VJX0xBQkVMX05PX0xPQ0FUSU9OX1NQRUNJRklFRCAgPSBObyBMb2NhdGlvbiBTcGVjaWZpZWQKLQotIQotISBYU0QgRWRpdG9yCi0hCi1fVUlfVEFCX1NPVVJDRSAgICAgICAgICAgICAgICAgID0gU291cmNlCi1fVUlfVEFCX0RFU0lHTiAgICAgICAgICAgICAgICAgID0gRGVzaWduCi0hICBOb3RlIHRvIHRyYW5zbGF0b3JzOiBHcmFwaCBpcyB0aGUgZ3JhcGhpYyB2aWV3IG9mIHRoZSBYTUwgc2NoZW1hCi1fVUlfVEFCX0dSQVBIICAgICAgICAgICAgICAgICAgID0gR3JhcGgKLV9VSV9NRU5VX1VORE8gICAgICAgICAgICAgICAgICAgPSAmVW5kbyBAQ3RybCtaCi1fVUlfTUVOVV9SRURPICAgICAgICAgICAgICAgICAgID0gJlJlZG8gQEN0cmwrWQotCi0hCi0hIFRhc2sgTGlzdCBSZWxhdGVkIE1lc3NhZ2UKLSEKLV9VSV9SRUZfRklMRV9FUlJPUl9ERVNDUklQVElPTiAgICAgID0gVGhlIGVycm9ycyBiZWxvdyB3ZXJlIGRldGVjdGVkIHdoZW4gdmFsaWRhdGluZyB0aGUgZmlsZSAnezB9JyB2aWEgdGhlIGZpbGUgJ3sxfScuICBJbiBtb3N0IGNhc2VzIHRoZXNlIGVycm9ycyBjYW4gYmUgZGV0ZWN0ZWQgYnkgdmFsaWRhdGluZyAnezJ9JyBkaXJlY3RseS4gIEhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCBlcnJvcnMgd2lsbCBvbmx5IG9jY3VyIHdoZW4gezJ9IGlzIHZhbGlkYXRlZCBpbiB0aGUgY29udGV4dCBvZiB7M30uCi1fVUlfUkVGX0ZJTEVfRVJST1JfUFVTSF9IRUxQICAgICAgICA9IFB1c2ggdGhlIGhlbHAgYnV0dG9uIGJlbG93IHRvIHJlYWQgbW9yZS4KLV9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCByaWdodCBjbGljayBvbiB0aGUgbWVzc2FnZSBhbmQgc2VsZWN0ICJTaG93IERldGFpbHMuLi4iCi1fVUlfUkVGX0ZJTEVfU0hPV19ERVRBSUxTICAgICAgICAgICA9IFNob3cgRGV0YWlscy4uLgotCi0KLSEKLSEgWFNERWRpdG9yIE1lbnUgYmFyIGNvbnRyaWJ1dG9yCi0hCi1fVUlfTUVOVV9HRU5FUkFURV9KQVZBICAgICAgICAgICAgICA9IEdlbmVyYXRlICZKYXZhIEJlYW5zLi4uCi1fVUlfTUVOVV9HRU5FUkFURV9EVEQgICAgICAgICAgICAgICA9IEdlbmVyYXRlICZEVEQuLi4KLV9VSV9NRU5VX0dFTkVSQVRFX1NBTVBMRV9YTUwgICAgICAgID0gR2VuZXJhdGUgWE0mTC4uLgotX1VJX01FTlVfWFNEX0VESVRPUiAgICAgICAgICAgICAgICAgPSAmWFNECi1fVUlfTUVOVV9WQUxJREFURV9YTUwgICAgICAgICAgICAgICA9ICZWYWxpZGF0ZSBYTUwgU2NoZW1hCi1fVUlfTUVOVV9WQUxJREFURV9YTUxfVE9PTFRJUCAgICAgICA9IFZhbGlkYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgU2NoZW1hCi1fVUlfTUVOVV9HRU5FUkFURV9KQVZBX1RPT0xUSVAgICAgICA9IEdlbmVyYXRlIEphdmEgYmVhbnMgZm9yIHRoZSBYTUwgU2NoZW1hCi1fVUlfTUVOVV9HRU5FUkFURV9EVERfVE9PTFRJUCAgICAgICA9IEdlbmVyYXRlIGEgRFREIGZyb20gdGhlIFhNTCBTY2hlbWEKLV9VSV9NRU5VX0dFTkVSQVRFX1NBTVBMRV9YTUxfVE9PTFRJUCA9IEdlbmVyYXRlIGFuIFhNTCBmcm9tIHRoZSBYTUwgU2NoZW1hCi1fVUlfTUVOVV9SRUxPQURfREVQRU5ERU5DSUVTX1RPT0xUSVAgPSBSZWxvYWQgRGVwZW5kZW5jaWVzCi1fVUlfTUVOVV9SRUxPQURfREVQRU5ERU5DSUVTID0gJlJlbG9hZCBEZXBlbmRlbmNpZXMKLQotIQotISBQcmVmZXJlbmNlIFBhZ2UKLSEKLV9VSV9URVhUX0lOREVOVF9MQUJFTCAgICAgICAgICAgICAgICAgPSBJbmRlbnRhdGlvbgotX1VJX1RFWFRfSU5ERU5UX1NQQUNFU19MQUJFTCAgICAgICAgICA9ICZOdW1iZXIgb2Ygc3BhY2VzOiAKLV9VSV9URVhUX1hTRF9OQU1FU1BBQ0VfUFJFRklYICAgICAgICAgPSBYTUwgc2NoZW1hIGxhbmd1YWdlCi1fVUlfVEVYVF9YU0RfREVGQVVMVF9QUkVGSVggICAgICAgICAgID0gWE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzICZwcmVmaXg6Ci1fVUlfUVVBTElGWV9YU0QgICAgICAgICAgICAgICAgICAgICAgID0gJlF1YWxpZnkgWE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzCi1fVUlfU0VQQVJBVEVfREVTSUdOX0FORF9TT1VSQ0VfVklFVyAgID0gU2VwYXJhdGUgU291cmNlLCBEZXNpZ24gYW5kIEdyYXBoIHZpZXcKLV9VSV9DT01CSU5FRF9ERVNJR05fQU5EX1NPVVJDRV9WSUVXICAgPSBDb21iaW5lZCBTb3VyY2Ugb3IgR3JhcGggdmlldyB3aXRoIERlc2lnbiB2aWV3IAotX1VJX0xBQkVMX0VESVRPUl9MQVlPVVQgICAgICAgICAgICAgICA9IEVkaXRvciBMYXlvdXQKLV9VSV9QUkVGX0RFU0lHTl9WSUVXX0xBWU9VVCAgICAgICAgICAgPSBEZXNpZ24gVmlldyBMb2NhdGlvbgotX1VJX1BSRUZfREVTSUdOX0JPVFRPTSAgICAgICAgICAgICAgICA9IEJlbG93Ci1fVUlfUFJFRl9ERVNJR05fUklHSFQgICAgICAgICAgICAgICAgID0gUmlnaHQKLV9VSV9URVhUX1hTRF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSBEZWZhdWx0IFRhcmdldCBOYW1lc3BhY2U6Ci0KLSEKLSEgQ29udGVudCBPdXRsaW5lIFZpZXcgYWN0aW9uCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSB0aGUgd29yZChzKSBmb2xsb3dpbmcgIkFkZCIgb24gZWFjaCBsaW5lIGluCi0hICAgdGhpcyBzZWN0aW9uIGkuZS4gQW5ub3RhdGlvbiwgRG9jdW1lbnRhdGlvbiwgQXBwSW5mbyAgVGhlc2Ugd29yZHMgYXJlIFhNTCBTY2hlbWEga2V5d29yZHMuCi1fVUlfQUNUSU9OX0RFTEVURSAgICAgICAgICAgICAgICAgID0gRCZlbGV0ZQotX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiAgICAgICAgICA9IEFkZCAmQW5ub3RhdGlvbgotX1VJX0FDVElPTl9BRERfRE9DICAgICAgICAgICAgICAgICA9IEFkZCAmRG9jdW1lbnRhdGlvbgotX1VJX0FDVElPTl9BRERfQVBQX0lORk8gICAgICAgICAgICA9IEFkZCBBJnBwSW5mbwotX1VJX0FDVElPTl9BRERfR0xPQkFMX0VMRU1FTlQgICAgICA9IEFkZCBHbG9iJmFsIEVsZW1lbnQKLV9VSV9BQ1RJT05fQUREX0tFWSAgICAgICAgICAgICAgICAgPSBBZGQgJktleQotX1VJX0FDVElPTl9BRERfS0VZX1JFRiAgICAgICAgICAgICA9IEFkZCBLZXkgUmUmZgotX1VJX0FDVElPTl9BRERfVU5JUVVFICAgICAgICAgICAgICA9IEFkZCBVbmkmcXVlCi1fVUlfQUNUSU9OX0FERF9HUk9VUCAgICAgICAgICAgICAgID0gQWRkIEcmcm91cAotX1VJX0FERF9HUk9VUF9SRUYgICAgICAgICAgICAgICAgICA9IEFkZCBHciZvdXAgUmVmCi1fVUlfQUNUSU9OX0FERF9DT05URU5UX01PREVMICAgICAgID0gQWRkIENvbnRlbnQgJk1vZGVsCi1fVUlfQUNUSU9OX0FERF9FTEVNRU5UICAgICAgICAgICAgID0gQWRkICZFbGVtZW50Ci1fVUlfQUNUSU9OX0FERF9FTEVNRU5UX1JFRiAgICAgICAgID0gQWRkIEUmbGVtZW50IFJlZgotX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUgICAgICAgICA9IEFkZCAmU2ltcGxlIFR5cGUKLV9VSV9BQ1RJT05fQUREX1BBVFRFUk4gICAgICAgICAgICAgPSBBZGQgJlBhdHRlcm4KLV9VSV9BQ1RJT05fQUREX0VOVU0gICAgICAgICAgICAgICAgPSBBZGQgRW4mdW1lcmF0aW9uCi1fVUlfQUNUSU9OX0FERF9FTlVNUyAgICAgICAgICAgICAgID0gQWRkIEVudSZtZXJhdGlvbnMuLi4KLV9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRSAgICAgICAgPSBBZGQgQ29tcGxleCAmVHlwZQotX1VJX0FDVElPTl9BRERfQ09NUExFWF9DT05URU5UICAgICA9IEFkZCBDb21wbGUmeCBDb250ZW50Ci1fVUlfQUNUSU9OX0FERF9TSU1QTEVfQ09OVEVOVCAgICAgID0gQWRkIFNpbXBsZSAmQ29udGVudAotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFICAgICAgICAgICA9IEFkZCBBdHRyaSZidXRlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVAgICAgID0gQWRkIEF0dHImaWJ1dGUgR3JvdXAKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUYgPSBBZGQgQSZ0dHJpYnV0ZSBHcm91cCBSZWYKLV9VSV9BQ1RJT05fQUREX0lOQ0xVREUgICAgICAgICAgICAgPSBBZGQgSW4mY2x1ZGUKLV9VSV9BQ1RJT05fQUREX0lNUE9SVCAgICAgICAgICAgICAgPSBBZGQgJkltcG9ydAotX1VJX0FDVElPTl9BRERfUkVERUZJTkUgICAgICAgICAgICA9IEFkZCBSZSZkZWZpbmUKLV9VSV9BQ1RJT05fQUREX05PVEFUSU9OICAgICAgICAgICAgPSBBZGQgJk5vdGF0aW9uCi1fVUlfQUNUSU9OX0FERF9BTllfRUxFTUVOVCAgICAgICAgID0gQWRkIEFuJnkKLV9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEUgICAgICAgPSBBZGQgJkFueSBBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fQUREX0dMT0JBTF9BVFRSSUJVVEUgICAgPSBBZGQgJkdsb2JhbCBBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9SRUZFUkVOQ0UgPSBBZGQgQXR0cmliJnV0ZSBSZWYKLV9VSV9BQ1RJT05fQUREX1JFU1RSSUNUSU9OICAgICAgICAgPSBBZGQgUmUmc3RyaWN0aW9uCi1fVUlfQUNUSU9OX0FERF9VTklPTiAgICAgICAgICAgICAgID0gQWRkIFUmbmlvbgotX1VJX0FDVElPTl9BRERfTElTVCAgICAgICAgICAgICAgICA9IEFkZCAmTGlzdAotX1VJX0FDVElPTl9ERUxFVEVfR1JPVVBfU0NPUEUgICAgICA9IEQmZWxldGUKLV9VSV9BQ1RJT05fQUREX0NIT0lDRSAgICAgICAgICAgICAgPSBBZGQgJkNob2ljZQotX1VJX0FDVElPTl9BRERfU0VRVUVOQ0UgICAgICAgICAgICA9IEFkZCBTZSZxdWVuY2UKLV9VSV9BQ1RJT05fQUREX0FMTCAgICAgICAgICAgICAgICAgPSBBZGQgJkFsbAotX1VJX0FDVElPTl9BRERfRVhURU5TSU9OICAgICAgICAgICA9IEFkZCBFJnh0ZW5zaW9uCi1fVUlfQUNUSU9OX0FERF9TRUxFQ1RPUiAgICAgICAgICAgID0gQWRkICZTZWxlY3RvcgotX1VJX0FDVElPTl9BRERfRklFTEQgICAgICAgICAgICAgICA9IEFkZCAmRmllbGQKLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBUcmFuc2xhdGUgQWRkIGFuZCBOb2RlCi1fVUlfQUNUSU9OX0FERF9TQ0hFTUFfTk9ERSAgICAgICAgID0gQWRkICZTY2hlbWEgTm9kZQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IFRSQU5TTEFURSBBZGQgYW5kIExvY2FsCi1fVUlfQUNUSU9OX0FERF9MT0NBTF9TSU1QTEVfVFlQRSAgID0gQWRkIExvY2FsICZTaW1wbGUgVHlwZQotX1VJX0FDVElPTl9BRERfTE9DQUxfQ09NUExFWF9UWVBFICA9IEFkZCBMb2NhbCAmQ29tcGxleCBUeXBlCi1fVUlfQUNUSU9OX0JBQ0tfVE9fU0NIRU1BX1ZJRVcgICAgID0gQmFjayBUbyBTY2hlbWEKLV9VSV9IT1ZFUl9CQUNLX1RPX1NDSEVNQV9WSUVXICAgICA9IEJhY2sgdG8gc2NoZW1hCi0KLV9VSV9BQ1RJT05fTUFLRV9BTk9OWU1PVVNfVFlQRV9HTE9CQUwgPSBNYWtlIEFub255bW91cyBUeXBlIEdsb2JhbAotX1VJX0FDVElPTl9PUEVOX1NDSEVNQSAgICAgICAgICAgICAgICA9IE9wZW4gU2NoZW1hCi0KLV9VSV9BQ1RJT05fSU5TRVJUX0JFRk9SRSAgICAgICAgICAgPSBJbnNlcnQgQmVmb3JlCi1fVUlfQUNUSU9OX0lOU0VSVF9BRlRFUiAgICAgICAgICAgID0gSW5zZXJ0IEFmdGVyCi0KLV9VSV9PVVRMSU5FX1NPUlQgICAgICAgICAgICAgICAgICAgPSBTb3J0IGFscGhhYmV0aWNhbGx5Ci1fVUlfT1VUTElORV9ET19OT1RfU09SVCAgICAgICAgICAgID0gRG8gbm90IHNvcnQgYWxwaGFiZXRpY2FsbHkKLQotX1VJX09VVExJTkVfU0hPV19DT01QTEVYX1RZUEUgICAgICA9IFNob3cgQ29tcGxleCBUeXBlcyBPbmx5Ci1fVUlfT1VUTElORV9TSE9XX1NJTVBMRV9UWVBFICAgICAgID0gU2hvdyBTaW1wbGUgVHlwZXMgT25seQotX1VJX09VVExJTkVfU0hPV19BVFRSSUJVVEVfR1JPVVAgICA9IFNob3cgQXR0cmlidXRlIEdyb3VwcyBPbmx5Ci1fVUlfT1VUTElORV9TSE9XX0dST1VQICAgICAgICAgICAgID0gU2hvdyBHcm91cHMgT25seQotX1VJX09VVExJTkVfU0hPV19HTE9CQUxfRUxFTUVOVCAgICA9IFNob3cgR2xvYmFsIEVsZW1lbnRzIE9ubHkKLV9VSV9PVVRMSU5FX1NIT1dfUkVGRVJFTkNFUyAgICAgICAgPSBTaG93IFJlZmVyZW5jZSBDb250ZW50Ci1fVUlfT1VUTElORV9TSE9XX0lOSEVSSVRFRCAgICAgICAgID0gU2hvdyBJbmhlcml0ZWQgQ29udGVudAotCi0hCi0hIE5ldyBYTUwgU2NoZW1hIFdpemFyZAotIQotX1VJX1dJWkFSRF9DUkVBVEVfWFNEX01PREVMX1RJVExFICAgID0gQ3JlYXRlIFhNTCBTY2hlbWEKLQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IERvIG5vdCB0cmFuc2xhdGUgZm9sbG93aW5nIGxpbmUKLV9VSV9DUkVBVEVYU0QgICAgICAgICAgICAgICAgICAgICAgICA9IGNyZWF0ZVhTRAotX1VJX05FV19YTUxfU0NIRU1BX1RJVExFICAgICAgICAgICAgID0gTmV3IFhNTCBTY2hlbWEKLV9VSV9DUkVBVEVfQV9ORVdfWE1MX1NDSEVNQV9ERVNDICAgICA9IENyZWF0ZSBhIG5ldyBYTUwgc2NoZW1hLgotCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSBmb2xsb3dpbmcgbGluZQotX1VJX05FV19YTUxfU0NIRU1BX0ZJTEVOQU1FICAgICAgICAgID0gTmV3WE1MU2NoZW1hLnhzZAotCi0hCi0hIFhTRCBGcm9tIFJEQiBTY2hlbWEgV2l6YXJkCi0hCi1fVUlfV0laQVJEX0NSRUFURV9YU0RfRlJPTV9SREJfVElUTEUgPSBDcmVhdGUgWFNEIGZyb20gUkRCIFRhYmxlCi0KLQotIQotISBSZWd1bGFyIEV4cHJlc3Npb24gV2l6YXJkCi0hCi1fVUlfUkVHRVhfV0laQVJEX0NSRUFURV9CVVRUT04gPSBDcmVhdGUgUmVndWxhciBFeHByZXNzaW9uLi4uCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQlVUVE9OID0gTGF1bmNoIHRoZSBSZWd1bGFyIEV4cHJlc3Npb24gV2l6YXJkCi1fVUlfUkVHRVhfV0laQVJEX1RJVExFID0gUmVndWxhciBFeHByZXNzaW9uIFdpemFyZAotX1VJX1JFR0VYX1dJWkFSRF9DT01QT1NJVElPTl9QQUdFX1RJVExFID0gQ29tcG9zZSBSZWd1bGFyIEV4cHJlc3Npb24KLV9VSV9SRUdFWF9XSVpBUkRfQ09NUE9TSVRJT05fUEFHRV9ERVNDUklQVElPTiA9IFRvIGFkZCBhIHRva2VuLCBzcGVjaWZ5IGl0cyBjb250ZW50cyBhbmQgb2NjdXJyZW5jZSwgdGhlbiBjbGljayBBZGQuCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfUkVHRVhfRVJST1JfUFJFRklYID0gVGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uIGlzIG5vdCB2YWxpZC4gIFJlYXNvbjogIAotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1RPS0VOX0VSUk9SX1BSRUZJWCA9IFRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCB2YWxpZC4gIFJlYXNvbjogIAotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFR0VYX0VSUk9SID0gVGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uIGlzIG5vdCB2YWxpZC4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9UT0tFTl9FUlJPUiA9IFRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCB2YWxpZC4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NSU5fRVJST1JfU1VGRklYID0gSW52YWxpZCBtaW5pbXVtIHJhbmdlIHZhbHVlLiAgVGhlIHZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZS4KLV9VSV9SRUdFWF9XSVpBUkRfTUlTU0lOR19NSU5fRVJST1JfU1VGRklYID0gSW52YWxpZCBtaW5pbXVtIHJhbmdlIHZhbHVlLiAgQSBtaW5pbXVtIHJhbmdlIG11c3QgYmUgc3BlY2lmaWVkIGlmIGEgbWF4aW11bSByYW5nZSBpcyBzcGVjaWZpZWQuCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfTUFYX0VSUk9SX1NVRkZJWCA9IEludmFsaWQgbWF4aW11bSByYW5nZSB2YWx1ZS4gIFRoZSB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gdmFsdWUuCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfUkVQRUFUX0VSUk9SX1NVRkZJWCA9IEludmFsaWQgcmVwZWF0IHZhbHVlLiAgVGhlIHZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLgotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1NFTEVDVElPTl9FUlJPUiA9IE5vdGhpbmcgaXMgY3VycmVudGx5IHNlbGVjdGVkLiAgRWl0aGVyIG1ha2UgYSBzZWxlY3Rpb24gb3IgY2hvb3NlIGEgZGlmZmVyZW50IHRva2VuLiAKLV9VSV9SRUdFWF9XSVpBUkRfVE9LRU5fTEFCRUwgPSBUb2tlbiBjb250ZW50czoKLV9VSV9SRUdFWF9XSVpBUkRfQVVUT19FU0NBUEVfQ0hFQ0tCT1hfTEFCRUwgPSBBdXRvIGVzY2FwZQotX1VJX1JFR0VYX1dJWkFSRF9PQ0NVUkVOQ0VfTEFCRUwgPSBPY2N1cnJlbmNlCi0hIEluc3RydWN0aW9ucyBmb3IgdHJhbnNsYXRvcnM6IFRoZSBmb2xsb3dpbmcgbGFiZWwgaXMgdXNlZCBpbiBhIHBocmFzZSB0byBpZGVudGlmeSBhIHJhbmdlIG9mIHZhbHVlcy4KLSEgRm9yIGV4YW1wbGU6ICA1IHRvIDEwLgotISBUaGUgdmFsdWVzIGFyZSB0ZXh0IGZpZWxkcyB0aGF0IGFyZSBpbml0aWFsbHkgYmxhbmsgc28gdGhlIHVzZXIgaGFzIHRvIGVudGVyIGluIHZhbHVlcwotISBGb3IgZXhhbXBsZTogICBfX19fX19fIHRvIF9fX19fX19fCi1fVUlfUkVHRVhfV0laQVJEX1RPX0xBQkVMID0gdG8KLV9VSV9SRUdFWF9XSVpBUkRfQUREX0JVVFRPTl9MQUJFTCA9IEFkZCAKLV9VSV9SRUdFWF9XSVpBUkRfQ1VSUkVOVF9SRUdFWF9MQUJFTCA9IEN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uOgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX1RFUk1TID0gQ29udGVudCBvZiBuZXcgdG9rZW4KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9BVVRPX0VTQ0FQRV9DSEVDS0JPWCA9IEluc2VydCBlc2NhcGUgY2hhcmFjdGVycyB0byBtYXRjaCBtZXRhY2hhcmFjdGVyIGxpdGVyYWxzIChlLmcuIGNvbnZlcnRzIFwiKlwiIHRvIFwiXFwqXCIpCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQUREX0JVVFRPTiA9IEFkZCB0aGlzIHRva2VuIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9DVVJSRU5UX1JFR0VYID0gVGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfUkVQRUFUID0gVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSB0b2tlbiBtdXN0IG9jY3VyLgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX01JTiA9IFRoZSBtaW5pbXVtIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSB0b2tlbiBjYW4gb2NjdXIuCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfTUFYID0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIHRva2VuIGNhbiBvY2N1ci4KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9DQVJFVF9MQUJFTCA9IFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgbmV3IHRva2VuIHdpbGwgYmUgaW5zZXJ0ZWQuCi1fVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9USVRMRSA9IFRlc3QgUmVndWxhciBFeHByZXNzaW9uCi1fVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9ERVNDUklQVElPTiA9IFRvIHRlc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgZW50ZXIgc2FtcGxlIHRleHQgdGhhdCB5b3Ugd2lzaCB0byBtYXRjaC4gIFRoZSBzdWNjZXNzIG9mIHRoZSBtYXRjaCB3aWxsIGJlIGluZGljYXRlZCBhYm92ZS4KLV9VSV9SRUdFWF9XSVpBUkRfUkVHRVhfTEFCRUwgPSBSZWd1bGFyIGV4cHJlc3Npb246IAotX1VJX1JFR0VYX1dJWkFSRF9TQU1QTEVfVEVYVCA9ICBTYW1wbGUgdGV4dDogCi1fVUlfUkVHRVhfV0laQVJEX01BVENIRVMgPSBUaGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi1fVUlfUkVHRVhfV0laQVJEX0RPRVNfTk9UX01BVENIID0gVGhlIHRleHQgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9BTllfQ0hBUiA9IEFueSBjaGFyYWN0ZXIKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9BTFBIQU5VTUVSSUNfQ0hBUiA9IEFscGhhbnVtZXJpYyBjaGFyYWN0ZXIKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9XSElURVNQQUNFID0gV2hpdGVzcGFjZQotX1VJX1JFR0VYX1dJWkFSRF9URVJNX0RJR0lUID0gRGlnaXQKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9VUFBFUiA9IFVwcGVyIGNhc2UKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9MT1dFUiA9IExvd2VyIGNhc2UKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9TRUxFQ1RJT04gPSBDdXJyZW50IHNlbGVjdGlvbgotX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1NJTkdMRSA9IEp1c3Qgb25jZQotX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1NUQVIgPSBaZXJvIG9yIG1vcmUKLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9QTFVTID0gT25lIG9yIG1vcmUKLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9PUFRJT05BTCA9IE9wdGlvbmFsCi1fVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUkVQRUFUID0gUmVwZWF0Ci1fVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUkFOR0UgPSBSYW5nZQotCi0hCi0hIFNlbGVjdCBJbmNsdWRlIEZpbGUgV2l6YXJkCi1fVUlfTEFCRUxfSU5DTFVERV9VUkxfRklMRSAgICA9IFNlbGVjdCBzY2hlbWEgZnJvbToKLV9VSV9SQURJT19VUkwgICAgICAgICAgICAgICAgID0gSFRUUAotX1VJX1JBRElPX0ZJTEUgICAgICAgICAgICAgICAgPSBXb3JrYmVuY2ggcHJvamVjdHMKLV9VSV9XSVpBUkRfSU5DTFVERV9GSUxFX1RJVExFID0gSW5jbHVkZSBBbm90aGVyIFNjaGVtYQotX1VJX1dJWkFSRF9JTkNMVURFX0ZJTEVfREVTQyAgPSBTZWxlY3QgYW5vdGhlciBzY2hlbWEgZnJvbSB3b3JrYmVuY2ggcHJvamVjdHMgb3IgZnJvbSBIVFRQLgotX1VJX0xBQkVMX1VSTCAgICAgICAgICAgICAgICAgPSBVUkw6Ci1fVUlfVVJMX1NUQVJUX1dJVEggICAgICAgICAgICA9IFRoZSBVUkwgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8KLV9VSV9TUEVDSUZZX1VSTCAgICAgICAgICAgICAgID0gUGxlYXNlIHNwZWNpZnkgYSBVUkwKLQotIQotISBFbnVtZXJhdGlvbnMgRGlhbG9nCi1fVUlfRU5VTUVSQVRJT05TX0RJQUxPR19USVRMRSA9IEFkZCBFbnVtZXJhdGlvbnMKLV9VSV9MQUJFTF9ERUxJTUlURVJfQ0hBUiAgICAgID0gJkRlbGltaXRlciBjaGFyYWN0ZXJzOgotX1VJX0xBQkVMX1BSRVNFUlZFX1dISVRFU1BBQ0UgPSAmUHJlc2VydmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQotCi1fVUlfQUNUSU9OX0RFTEVURV9FTlVNRVJBVElPTiA9IERlbGV0ZSBFbnVtZXJhdGlvbgotCi0hCi0hIFZhbGlkYXRlIFNjaGVtYSAKLSEKLV9VSV9ESUFMT0dfWE1MX1NDSEVNQV9JTlZBTElEX1RJVExFICA9IFZhbGlkYXRpb24gRmFpbGVkCi1fVUlfRElBTE9HX1hNTF9TQ0hFTUFfVkFMSURfVElUTEUgICAgPSBWYWxpZGF0aW9uIFN1Y2NlZWRlZAotX1VJX0RJQUxPR19YTUxfU0NIRU1BX1ZBTElEX1RFWFQgICAgID0gVGhlIFhNTCBzY2hlbWEgZmlsZSBpcyB2YWxpZC4KLV9VSV9ESUFMT0dfWE1MX1NDSEVNQV9MSU1JVEVfRVhDRUVERUQgID0gVGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBub3QgdmFsaWQuICBUaGUgbWVzc2FnZSBsaW1pdCBmb3IgdGhlIFRhc2tzIHZpZXcgaGFzIGJlZW4gZXhjZWVkZWQuICBQbGVhc2UgaW5jcmVhc2UgdGhlIGxpbWl0IGFuZCB0cnkgYWdhaW4uCi0KLSEKLSEgQ29tYm8tYm94IGNob2ljZXMgCi0hCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSBmb2xsb3dpbmcgMTAgbGluZXMKLV9VSV9DT01CT19RVUFMSUZJRUQgICAgICAgICAgICAgPSBxdWFsaWZpZWQKLV9VSV9DT01CT19VTlFVQUxJRklFRCAgICAgICAgICAgPSB1bnF1YWxpZmllZAotX1VJX0NPTUJPX0VYVEVOU0lPTiAgICAgICAgICAgICA9IGV4dGVuc2lvbgotX1VJX0NPTUJPX1JFU1RSSUNUSU9OICAgICAgICAgICA9IHJlc3RyaWN0aW9uCi1fVUlfQ09NQk9fQUxMICAgICAgICAgICAgICAgICAgID0gYWxsCi1fVUlfQ09NQk9fVFJVRSAgICAgICAgICAgICAgICAgID0gdHJ1ZQotX1VJX0NPTUJPX0ZBTFNFICAgICAgICAgICAgICAgICA9IGZhbHNlCi1fVUlfQ09NQk9fTEFYICAgICAgICAgICAgICAgICAgID0gbGF4Ci1fVUlfQ09NQk9fU0tJUCAgICAgICAgICAgICAgICAgID0gc2tpcAotX1VJX0NPTUJPX1NUUklDVCAgICAgICAgICAgICAgICA9IHN0cmljdAotCi0hIEdlbmVyYXRlIERURCAtIHBhc3MgYXMgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGZvciB3aXphcmQgcGFnZQotX1VJX0dFTkVSQVRFX0RURF9USVRMRSAgICAgICAgICA9IEdlbmVyYXRlIERURAotX1VJX0dFTkVSQVRFX0RURF9ERVNDUklQVElPTiAgICA9IEdlbmVyYXRlIGEgRFREIGZyb20gdGhlIHNlbGVjdGVkIFhNTCBzY2hlbWEgZmlsZS4KLQotISBHZW5lcmF0ZSBEREwgLSBwYXNzIGFzIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBmb3Igd2l6YXJkIHBhZ2UKLV9VSV9HRU5FUkFURV9ERExfVElUTEUgICAgICAgICAgPSBHZW5lcmF0ZSBEREwKLV9VSV9HRU5FUkFURV9ERExfREVTQ1JJUFRJT04gICAgPSBHZW5lcmF0ZSBEREwgZnJvbSB0aGUgc2VsZWN0ZWQgWE1MIHNjaGVtYSBmaWxlLgotCi1fVUlfWE1MX1NDSEVNQV9WQUxJREFUT1IgICAgICAgICAgICA9IFhNTCBTY2hlbWEgVmFsaWRhdG9yCi0KLSEgR2VuZXJhdGlvbiBmcm9tIHRoZSBTY2hlbWEgbW9kZWwgLSBwcmUtY29uZGl0aW9uIGNoZWNrCi1fVUlfRElBTE9HX1RJVExFX0dSQU1NQVJfRVJST1IgICAgICA9IEludmFsaWQgR3JhbW1hcgotX1VJX0RJQUxPR19JTkZPX1NDSEVNQV9JTlZBTElEICAgICAgPSBUaGUgc2NoZW1hIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBYTUwgU2NoZW1hIGVkaXRvciBhbmQgdmFsaWRhdGUgaXQgZm9yIGRldGFpbHMuCi1fVUlfRElBTE9HX1RJVExFX05PX0dMT0JBTF9FTEVNRU5UUyA9IE5vIEdsb2JhbCBFbGVtZW50cwotX1VJX0RJQUxPR19JTkZPX05PX0dMT0JBTF9FTEVNRU5UUyAgPSBUaGUgc2VsZWN0ZWQgc2NoZW1hIGhhcyBubyBnbG9iYWwgZWxlbWVudHMuIEdsb2JhbCBlbGVtZW50cyBhcmUgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYW55dGhpbmcgZnJvbSBhbiBYTUwgc2NoZW1hLgotCi0hIFNlY3Rpb24gdGl0bGUgZm9yIG90aGVyIGF0dHJpYnV0ZXMKLV9VSV9TRUNUSU9OX0FEVkFOQ0VEX0FUVFJJQlVURVMgICA9IEFkdmFuY2VkCi0KLSEgRm9yIHVuZG8gYWN0aW9uIG1lbnVzCi0hIE5vdGUgdG8gVHJhbnNsYXRvcnM6IEZvciB0aGUgZm9sbG93aW5nICJDaGFuZ2UiIHBocmFzZXMsCi0hIG1heE9jY3VycywgbWluT2NjdXJzLCBsYW5nLCB4cGF0aCBhcmUga2V5d29yZHMgc28gcGxlYXNlCi0hIGRvIG5vIHRyYW5zbGF0ZSB0aGVtLiAgVGhlc2UgYXJlIGZvciB0aGUgdW5kbyBhY3Rpb24gbWVudXMuCi0hIEZvciBleGFtcGxlLCBpZiB0aGUgdXNlciBtYWtlcyBhIGNoYW5nZSBpbiB0aGUgbmFtZSBvZiBhbgotISBlbGVtZW50LCB0aGVuIHRoZSB1bmRvIGFjdGlvbiB3b3VsZCBiZSBVbmRvIEVsZW1lbnQgTmFtZSBDaGFuZ2UKLV9VSV9OQU1FU1BBQ0VfQ0hBTkdFICAgICAgICAgICA9IE5hbWVzcGFjZSBDaGFuZ2UKLV9VSV9QUk9DRVNTQ09OVEVOVFNfQ0hBTkdFICAgICA9IFByb2Nlc3MgQ29udGVudHMgQ2hhbmdlCi1fVUlfTUFYT0NDVVJTX0NIQU5HRSAgICAgICAgICAgPSBtYXhPY2N1cnMgQ2hhbmdlCi1fVUlfTUlOT0NDVVJTX0NIQU5HRSAgICAgICAgICAgPSBtaW5PY2N1cnMgQ2hhbmdlCi1fVUlfU09VUkNFX0FUVFJJQlVURV9DSEFOR0UgICAgPSBTb3VyY2UgQ2hhbmdlCi1fVUlfQ09NTUVOVF9DSEFOR0UgICAgICAgICAgICAgPSBDb21tZW50IENoYW5nZQotX1VJX1BSRUZJWF9DSEFOR0UgICAgICAgICAgICAgID0gUHJlZml4IENoYW5nZQotX1VJX0FUVFJJQlVURUdST1VQX1JFRl9DSEFOR0UgID0gQXR0cmlidXRlIEdyb3VwIFJlZmVyZW5jZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVHUk9VUF9OQU1FX0NIQU5HRSA9IEF0dHJpYnV0ZSBHcm91cCBOYW1lIENoYW5nZQotX1VJX0FUVFJJQlVURV9GSVhFRF9DSEFOR0UgICAgID0gQXR0cmlidXRlIEZpeGVkIENoYW5nZQotX1VJX0FUVFJJQlVURV9ERUZBVUxUX0NIQU5HRSAgID0gQXR0cmlidXRlIERlZmF1bHQgQ2hhbmdlCi1fVUlfQVRUUklCVVRFX05BTUVfQ0hBTkdFICAgICAgPSBBdHRyaWJ1dGUgTmFtZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVfVkFMVUVfQ0hBTkdFICAgICA9IEF0dHJpYnV0ZSBWYWx1ZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVfVVNFX0NIQU5HRSAgICAgICA9IEF0dHJpYnV0ZSBVc2UgQ2hhbmdlCi1fVUlfQVRUUklCVVRFX0ZPUk1fQ0hBTkdFICAgICAgPSBBdHRyaWJ1dGUgRm9ybSBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9OQU1FX0NIQU5HRSAgICA9IENvbXBsZXggVHlwZSBOYW1lIENoYW5nZQotX1VJX0NPTVBMRVhUWVBFX0FCU1RSQUNUX0NIQU5HRSA9IENvbXBsZXggVHlwZSBBYnN0cmFjdCBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9NSVhFRF9DSEFOR0UgICA9IENvbXBsZXggVHlwZSBNaXhlZCBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9CTE9DS19DSEFOR0UgICA9IENvbXBsZXggVHlwZSBCbG9jayBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9GSU5BTF9DSEFOR0UgICA9IENvbXBsZXggVHlwZSBGaW5hbCBDaGFuZ2UKLV9VSV9ET0NVTUVOVEFUSU9OX1NPVVJDRV9DSEFOR0UgPSBEb2N1bWVudGF0aW9uIFNvdXJjZSBDaGFuZ2UKLV9VSV9ET0NVTUVOVEFUSU9OX0xBTkdfQ0hBTkdFICAgPSBEb2N1bWVudGF0aW9uIGxhbmcgQ2hhbmdlCi1fVUlfRE9DVU1FTlRBVElPTl9DT01NRU5UX0NIQU5HRSA9IERvY3VtZW50YXRpb24gQ29tbWVudCBDaGFuZ2UKLV9VSV9FTEVNRU5UX05BTUVfQ0hBTkdFICAgICAgICAgID0gRWxlbWVudCBOYW1lIENoYW5nZQotX1VJX0VMRU1FTlRfVkFMVUVfQ0hBTkdFICAgICAgICAgPSBFbGVtZW50IFZhbHVlIENoYW5nZQotX1VJX0VMRU1FTlRfVFlQRV9DSEFOR0UgICAgICAgICAgPSBFbGVtZW50IFR5cGUgQ2hhbmdlCi1fVUlfRU5VTV9WQUxVRV9DSEFOR0UgICAgICAgICAgICA9IEVudW0gVmFsdWUgQ2hhbmdlCi1fVUlfRklFTERfWFBBVEhfQ0hBTkdFICAgICAgICAgICA9IEZpZWxkIHhwYXRoIENoYW5nZQotX1VJX0dST1VQX1JFRl9DSEFOR0UgICAgICAgICAgICAgPSBHcm91cCBSZWZlcmVuY2UgQ2hhbmdlCi1fVUlfR1JPVVBfU0NPUEVfQ0hBTkdFICAgICAgICAgICA9IENvbnRlbnQgTW9kZWwgQ2hhbmdlCi1fVUlfR1JPVVBfTkFNRV9DSEFOR0UgICAgICAgICAgICA9IEdyb3VwIE5hbWUgQ2hhbmdlCi1fVUlfSU1QT1JUX0NIQU5HRSAgICAgICAgICAgICAgICA9IEltcG9ydCBDaGFuZ2UKLV9VSV9LRVlfTkFNRV9DSEFOR0UgICAgICAgICAgICAgID0gS2V5IE5hbWUgQ2hhbmdlCi1fVUlfS0VZUkVGX05BTUVfQ0hBTkdFICAgICAgICAgICA9IEtleSBSZWZlcmVuY2UgTmFtZSBDaGFuZ2UKLSEgTm90ZSB0byB0cmFuc2xhdG9ycwotISBGb3IgdGhlIGZvbGxvd2luZyBpdGVtLCBSZWZlciBpcyB0aGUga2V5cmVmIGF0dHJpYnV0ZSB0byByZWZlciB0byBzb21lIG90aGVyIGtleQotX1VJX0tFWVJFRl9SRUZFUl9DSEFOR0UgICAgICAgICAgPSBLZXkgUmVmZXJlbmNlIFJlZmVyIENoYW5nZQotX1VJX05PVEFUSU9OX05BTUVfQ0hBTkdFICAgICAgICAgPSBOb3RhdGlvbiBOYW1lIENoYW5nZQotX1VJX05PVEFUSU9OX1BVQkxJQ19DSEFOR0UgICAgICAgPSBOb3RhdGlvbiBQdWJsaWMgQ2hhbmdlCi1fVUlfTk9UQVRJT05fU1lTVEVNX0NIQU5HRSAgICAgICA9IE5vdGF0aW9uIFN5c3RlbSBDaGFuZ2UKLV9VSV9QQVRURVJOX1ZBTFVFX0NIQU5HRSAgICAgICAgID0gUGF0dGVybiBWYWx1ZSBDaGFuZ2UKLV9VSV9TQ0hFTUFfVkVSU0lPTl9DSEFOR0UgICAgICAgID0gU2NoZW1hIFZlcnNpb24gQ2hhbmdlCi1fVUlfU0NIRU1BX0xBTkdfQ0hBTkdFICAgICAgICAgICA9IFNjaGVtYSBsYW5nIENoYW5nZQotX1VJX1NFTEVDVE9SX1hQQVRIX0NIQU5HRSAgICAgICAgPSBTZWxlY3RvciB4cGF0aCBDaGFuZ2UKLV9VSV9UWVBFX0NIQU5HRSAgICAgICAgICAgICAgICAgID0gVHlwZSBDaGFuZ2UKLV9VSV9ERVJJVkVEQllfQ0hBTkdFICAgICAgICAgICAgID0gRGVyaXZhdGlvbiBDaGFuZ2UKLV9VSV9GQUNFVF9DSEFOR0UgICAgICAgICAgICAgICAgID0gRmFjZXQgQ2hhbmdlCi1fVUlfU0lNUExFVFlQRV9OQU1FX0NIQU5HRSAgICAgICA9IFNpbXBsZVR5cGUgTmFtZSBDaGFuZ2UKLV9VSV9VTklRVUVfTkFNRV9DSEFOR0UgICAgICAgICAgID0gVW5pcXVlIE5hbWUgQ2hhbmdlCi1fVUlfU0NIRU1BX0FUVFJJQlVURUZPUk1ERUZBVUxUX0NIQU5HRSA9IEF0dHJpYnV0ZSBGb3JtIERlZmF1bHQgQ2hhbmdlCi1fVUlfU0NIRU1BX0VMRU1FTlRGT1JNREVGQVVMVF9DSEFOR0UgPSBFbGVtZW50IEZvcm0gRGVmYXVsdCBDaGFuZ2UKLV9VSV9TQ0hFTUFfQkxPQ0tERUZBVUxUX0NIQU5HRSAgID0gQmxvY2sgRGVmYXVsdCBDaGFuZ2UKLV9VSV9TQ0hFTUFfRklOQUxERUZBVUxUX0NIQU5HRSAgID0gRmluYWwgRGVmYXVsdCBDaGFuZ2UKLV9VSV9FTEVNRU5UX1NVQlNUSVRVVElPTkdST1VQX0NIQU5HRSA9IFN1YnN0aXR1dGlvbiBHcm91cCBDaGFuZ2UKLV9VSV9FTEVNRU5UX0ZPUk1fQ0hBTkdFICAgICAgICAgID0gRm9ybSBDaGFuZ2UKLV9VSV9FTEVNRU5UX0JMT0NLX0NIQU5HRSAgICAgICAgID0gQmxvY2sgQ2hhbmdlCi1fVUlfRUxFTUVOVF9GSU5BTF9DSEFOR0UgICAgICAgICA9IEZpbmFsIENoYW5nZQotX1VJX0VMRU1FTlRfQUJTVFJBQ1RfQ0hBTkdFICAgICAgPSBBYnN0cmFjdCBDaGFuZ2UKLV9VSV9FTEVNRU5UX05JTExBQkxFX0NIQU5HRSAgICAgID0gTmlsbGFibGUgQ2hhbmdlCi1fVUlfVEFSR0VUTkFNRVNQQUNFX0NIQU5HRSAgICAgICA9IFRhcmdldCBOYW1lc3BhY2UgQ2hhbmdlCi0KLSEgV2luZG93IEhlYWRpbmdzIGZvciBGbGF0IFZpZXcKLV9VSV9QQUdFX0hFQURJTkdfQU5ZQVRUUklCVVRFID0gQW55IEF0dHJpYnV0ZQotX1VJX1BBR0VfSEVBRElOR19BTllFTEVNRU5UICAgPSBBbnkgRWxlbWVudAotX1VJX1BBR0VfSEVBRElOR19BUFBJTkZPICAgICAgICAgICAgPSBBcHBJbmZvCi1fVUlfUEFHRV9IRUFESU5HX0FUVFJJQlVURUdST1VQX1JFRiA9IEF0dHJpYnV0ZSBHcm91cCBSZWZlcmVuY2UKLV9VSV9QQUdFX0hFQURJTkdfQVRUUklCVVRFR1JPVVAgICAgID0gQXR0cmlidXRlIEdyb3VwCi1fVUlfUEFHRV9IRUFESU5HX0FUVFJJQlVURV9SRUYgICAgICA9IEF0dHJpYnV0ZSBSZWZlcmVuY2UKLV9VSV9QQUdFX0hFQURJTkdfQVRUUklCVVRFICAgICAgICAgID0gQXR0cmlidXRlCi1fVUlfUEFHRV9IRUFESU5HX0NPTVBMRVhUWVBFICAgICAgICA9IENvbXBsZXggVHlwZQotX1VJX1BBR0VfSEVBRElOR19ET0NVTUVOVEFUSU9OICAgICAgPSBEb2N1bWVudGF0aW9uCi1fVUlfUEFHRV9IRUFESU5HX0VMRU1FTlQgICAgID0gRWxlbWVudAotX1VJX1BBR0VfSEVBRElOR19FTEVNRU5UX1JFRiA9IEVsZW1lbnQgUmVmZXJlbmNlCi1fVUlfUEFHRV9IRUFESU5HX0VOVU0gICAgICAgID0gRW51bWVyYXRpb24KLV9VSV9QQUdFX0hFQURJTkdfRklFTEQgICAgICAgPSBGaWVsZAotX1VJX1BBR0VfSEVBRElOR19HUk9VUF9SRUYgICA9IEdyb3VwIFJlZmVyZW5jZQotX1VJX1BBR0VfSEVBRElOR19DT05URU5UTU9ERUwgID0gQ29udGVudCBNb2RlbAotX1VJX1BBR0VfSEVBRElOR19HUk9VUCAgICAgICAgID0gR3JvdXAKLV9VSV9QQUdFX0hFQURJTkdfSU1QT1JUICAgICAgICA9IEltcG9ydAotX1VJX1BBR0VfSEVBRElOR19JTkNMVURFICAgICAgID0gSW5jbHVkZQotX1VJX1BBR0VfSEVBRElOR19LRVlSRUYgICAgICAgID0gS2V5IFJlZmVyZW5jZQotX1VJX1BBR0VfSEVBRElOR19LRVkgICAgICAgICAgID0gS2V5Ci1fVUlfUEFHRV9IRUFESU5HX05PVEFUSU9OICAgICAgPSBOb3RhdGlvbgotX1VJX1BBR0VfSEVBRElOR19QQVRURVJOICAgICAgID0gUGF0dGVybgotX1VJX1BBR0VfSEVBRElOR19SRURFRklORSAgICAgID0gUmVkZWZpbmUKLV9VSV9QQUdFX0hFQURJTkdfU0NIRU1BICAgICAgICA9IFNjaGVtYQotX1VJX1BBR0VfSEVBRElOR19TRUxFQ1RPUiAgICAgID0gU2VsZWN0b3IKLV9VSV9QQUdFX0hFQURJTkdfTElTVCAgICAgICAgICA9IExpc3QKLV9VSV9QQUdFX0hFQURJTkdfVU5JT04gICAgICAgICA9IFVuaW9uCi1fVUlfUEFHRV9IRUFESU5HX1NJTVBMRUNPTlRFTlQgPSBTaW1wbGUgQ29udGVudAotX1VJX1BBR0VfSEVBRElOR19DT01QTEVYQ09OVEVOVCA9IENvbXBsZXggQ29udGVudAotX1VJX1BBR0VfSEVBRElOR19SRVNUUklDVElPTiAgID0gUmVzdHJpY3Rpb24KLV9VSV9QQUdFX0hFQURJTkdfRVhURU5TSU9OICAgICA9IEV4dGVuc2lvbgotX1VJX1BBR0VfSEVBRElOR19TSU1QTEVUWVBFICAgID0gU2ltcGxlIFR5cGUKLV9VSV9QQUdFX0hFQURJTkdfVU5JUVVFICAgICAgICA9IFVuaXF1ZQotX1VJX1BBR0VfSEVBRElOR19SRUZFUkVOQ0UgICAgID0gcmVmZXJlbmNlCi0KLSEKLSEgR3JhcGggcGFnZQotIQotX1VJX0dSQVBIX1NJTVBMRV9UWVBFUyAgICAgICAgID0gU2ltcGxlIFR5cGVzCi1fVUlfR1JBUEhfQ09NUExFWF9UWVBFUyAgICAgICAgPSBDb21wbGV4IFR5cGVzCi1fVUlfR1JBUEhfR1JPVVBTICAgICAgICAgICAgICAgPSBHcm91cHMKLV9VSV9HUkFQSF9HTE9CQUxfQVRUUklCVVRFUyAgICA9IEdsb2JhbCBBdHRyaWJ1dGVzCi1fVUlfR1JBUEhfR0xPQkFMX0VMRU1FTlRTICAgICAgPSBHbG9iYWwgRWxlbWVudHMKLV9VSV9HUkFQSF9YU0RTQ0hFTUEgICAgICAgICAgICA9IFNjaGVtYQotX1VJX0dSQVBIX1hTRFNDSEVNQV9OT19OQU1FU1BBQ0UgPSAobm8gdGFyZ2V0IG5hbWVzcGFjZSBzcGVjaWZpZWQpCi1fVUlfR1JBUEhfWFNEQ09NUExFWFRZUEVERUZJTklUSU9OID0gWFNEIENvbXBsZXggVHlwZSBEZWZpbml0aW9uOgotX1VJX0dSQVBIX1hTRE1PREVMR1JPVVAgICAgICAgID0gWFNEIE1vZGVsIEdyb3VwCi1fVUlfR1JBUEhfWFNEUEFSVElDTEUgICAgICAgICAgPSBYU0QgUGFydGljbGUKLV9VSV9HUkFQSF9WSUVXX05PVF9BVkFJTEFCTEUgICA9IFZpZXcgaXMgbm90IGF2YWlsYWJsZSBmb3Igc2VsZWN0ZWQgb2JqZWN0LgotX1VJX0dSQVBIX1VOS05PV05fT0JKRUNUICAgICAgID0gVW5rbm93biBvYmplY3QKLQotISBBZGRpdGlvbmFsIENhdGVnb3JpZXMKLV9VSV9HUkFQSF9UWVBFUyAgICAgICAgICAgICAgICA9IFR5cGVzCi1fVUlfR1JBUEhfRUxFTUVOVFMgICAgICAgICAgICAgPSBFbGVtZW50cwotX1VJX0dSQVBIX0FUVFJJQlVURVMgICAgICAgICAgID0gQXR0cmlidXRlcwotX1VJX0dSQVBIX0FUVFJJQlVURV9HUk9VUFMgICAgID0gQXR0cmlidXRlIEdyb3VwcwotX1VJX0dSQVBIX05PVEFUSU9OUyAgICAgICAgICAgID0gTm90YXRpb25zCi1fVUlfR1JBUEhfSURFTlRJVFlfQ09OU1RSQUlOVFMgPSBJZGVudGl0eSBDb25zdHJhaW50cwotX1VJX0dSQVBIX0FOTk9UQVRJT05TICAgICAgICAgID0gQW5ub3RhdGlvbnMKLV9VSV9HUkFQSF9ESVJFQ1RJVkVTICAgICAgICAgICA9IERpcmVjdGl2ZXMKLQotISBGb3IgVW5pb24gTWVtYmVyVHlwZXMgRGlhbG9nCi1fVUlfTEFCRUxfU0VMRUNUX01FTUJFUlRZUEVTICAgPSBTZWxlY3QgZnJvbSB0aGUgYXZhaWxhYmxlIHR5cGVzIGFuZCBhZGQgdG8gdGhlIG1lbWJlclR5cGVzIGxpc3QKLV9VSV9MQUJFTF9NRU1CRVJUWVBFU19DSEFOR0UgICA9IE1lbWJlciBUeXBlcyBDaGFuZ2UKLV9VSV9MQUJFTF9NRU1CRVJUWVBFU19WQUxVRSAgICA9IE1lbWJlciBUeXBlcyBWYWx1ZToKLV9VSV9MQUJFTF9NRU1CRVJUWVBFUyAgICAgICAgICA9IE1lbWJlciB0eXBlczoKLQotX1VJX0xBQkVMX1ZBUklFVFlfQ0hBTkdFICAgICAgID0gVmFyaWV0eSBDaGFuZ2UKLQotX1VJX0xBQkVMX0ZJWEVET1JERUZBVUxUX1ZBTFVFID0gRml4ZWQvRGVmYXVsdCBWYWx1ZQotCi1fVUlfTEFCRUxfSVRFTV9UWVBFX0NIQU5HRSAgICAgPSBJdGVtIFR5cGUgQ2hhbmdlCi0KLV9VSV9MQUJFTF9BVkFJTEFCTEVfVFlQRVMgICAgICA9IEF2YWlsYWJsZSBUeXBlcwotCi1fVUlfTEFCRUxfSU5DTFVERV9DSEFOR0UgICAgICAgPSBJbmNsdWRlIENoYW5nZQotCi1fVUlfTEFCRUxfSVRFTV9UWVBFICAgICAgICAgICAgPSBJdGVtIHR5cGU6Ci1fVUlfTEFCRUxfQkFTRV9UWVBFICAgICAgICAgICAgPSBCYXNlIFR5cGUKLV9VSV9MQUJFTF9UWVBFICAgICAgICAgICAgICAgICA9IFR5cGUKLV9VSV9MQUJFTF9NT0RFTF9HUk9VUCAgICAgICAgICA9IE1vZGVsIEdyb3VwCi0KLV9VSV9MQUJFTF9BQlNFTlQgICAgICAgICAgICAgICA9IGFic2VudAotCi1fVUlfV0FSTklOR19SRVNFVF9BVFRSR1JQX1JFRiAgPSBSZXNldCBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIDx7MH0+Ci1fVUlfV0FSTklOR19SRU1PVkVfQVRUUkdSUF9SRUYgPSBSZW1vdmUgYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSA8ezB9PgotX1VJX1dBUk5JTkdfUkVTRVRfQVRUUl9SRUYgICAgID0gUmVzZXQgYXR0cmlidXRlIHJlZmVyZW5jZSA8ezB9PgotX1VJX1dBUk5JTkdfUkVNT1ZFX0FUVFJfUkVGICAgID0gUmVtb3ZlIGF0dHJpYnV0ZSByZWZlcmVuY2UgPHswfT4KLQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0hCi0hIEhlcmUgaXMgdGhlIGxpc3Qgb2YgRXJyb3Igc3RyaW5nIHRoYXQgaGF2ZSBtZXNzYWdlIElEcyAtIG1ha2Ugc3VyZSB0aGV5IGFyZSB1bmlxdWUKLSEgIFJhbmdlIGZvciBYU0RFZGl0b3IgbWVzc2FnZUlEczogSVdBWDEwMDFFIC0gSVdBWDEyMDBFCi0hCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSEgVGhlc2UgdGhyZWUgZXJyb3JzIGFwcGVhciBpbiB0aGUgc2VsZWN0IGluY2x1ZGUgd2l6YXJkCi0hIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdpbGwgYmUgc3Vic3RpdHV0ZWQgaW4KLV9VSV9ESUZGRVJFTlRfTkFNRV9TUEFDRSAgPSB7MH0gaXMgaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIAotX1VJX1NBTUVfTkFNRV9TUEFDRSAgICAgICA9IHswfSBpcyBpbiB0aGUgc2FtZSBuYW1lc3BhY2UKLV9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSAgPSB7MH0gaXMgYW4gaW52YWxpZCBYTUwgc2NoZW1hIGZpbGUKLQotX0VSUk9SX1NDSEVNQV9OT1RfRVhJU1QgICAgICAgICA9IElXQVgxMDAzRSBkb2VzIG5vdCBleGlzdC4KLV9FUlJPUl9MQUJFTF9JTlZBTElEX1BSRUZJWCAgICAgPSBJV0FYMTAwNEUgSW52YWxpZCBwcmVmaXguIEEgcHJlZml4IG11c3Qgbm90IGJlIGVtcHR5IG9yIGNvbnRhaW4gYW55IHNwYWNlLgotCi0hIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdpbGwgYmUgc3Vic3RpdHV0ZWQgaW4KLV9FUlJPUl9TQ0hFTUFfTkFNRV9USEVfU0FNRSAgPSBJV0FYMTAwNUUgezB9IGlzIHRoZSBjdXJyZW50IHNjaGVtYS4gQSBzY2hlbWEgY2Fubm90IGluY2x1ZGUgaXRzZWxmLiBSZXNldCB0byB0aGUgbGFzdCB2YWxpZCBzY2hlbWEuCi0KLV9FUlJPUl9YU0RfR0VORVJBVElPTiAgICAgICAgICAgICAgICA9IElXQVgxMDA2RSBFcnJvciBnZW5lcmF0aW5nIFhNTCBzY2hlbWEKLV9FUlJPUl9OT19DT05UQUlORVIgICAgICAgICAgICAgICAgICA9IElXQVgxMDA3RSBObyBmb2xkZXIgc2VsZWN0ZWQKLV9FUlJPUl9OT19GSUxFX05BTUUgICAgICAgICAgICAgICAgICA9IElXQVgxMDA4RSBObyBmaWxlIG5hbWUgcHJvdmlkZWQKLV9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9YU0QgICAgICAgICA9IElXQVgxMDExRSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIC54c2QKLQotCi0hCi0hIEZvciBzY2hlbWEgdGhhdCBoYXMgdG9vIG1hbnkgZXJyb3JzLCBhbiBleHRlbmRlZCBtZXNzYWdlLiAKLSEKLV9FUlJPUl9ESUFMT0dfWE1MX1NDSEVNQV9JTlZBTElEX1RFWFQgID0gSVdBWDEwMGQ5RSBUaGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdCB2YWxpZC4gIAotX0VSUk9SX01PUkVfRVJST1JTICAgICAgICAgICAgICAgICAgICA9IFRoZXJlIGFyZSBtb3JlIGVycm9ycyBpbiB0aGUgc2NoZW1hIHRoYW4gYXJlIGRpc3BsYXllZCBpbiB0aGUgVGFza3Mgdmlldy4gIENvcnJlY3QgdGhlIGZpcnN0IHswfSBlcnJvcnMgYW5kIHJlLXZhbGlkYXRlIHRoZSBzY2hlbWEgZmlsZS4KLQotISBEREwgR2VuZXJhdGlvbiBGYWlsZWQgRGlhbG9nCi1fVUlfRElBTE9HX0RETF9HRU5fRkFJTEVEX1RJVExFICAgICA9IERETCBHZW5lcmF0aW9uIEZhaWxlZAotX0VSUk9SX0RJQUxPR19ERExfTk9UX0dFTkVSRUFURUQgICAgPSBJV0FYMTAxMEUgRERMIGhhcyBub3QgYmVlbiBnZW5lcmF0ZWQKLV9VSV9ESUFMT0dfRERMX0dFTl9GQUlMRURfUkVBU09OICAgID0gVGhlIHNlbGVjdGVkIHNjaGVtYSBoYXMgbm8gZ2xvYmFsIGVsZW1lbnRzCi1fVUlfRElBTE9HX0RETF9HRU5fRkFJTEVEX1JFQVNPTjIgICA9IE5vbmUgb2YgdGhlIGdsb2JhbCBlbGVtZW50cyBpbiB0aGUgc2NoZW1hIGhhdmUgYSBjb21wbGV4IHR5cGUgb3IgdGhleSByZWZlcmVuY2UgY29tcGxleCB0eXBlcyB0aGF0IGNhbm5vdCBiZSBmb3VuZC4KLQotX0VYQ19PUEVOX1hTRCA9IElXQVgxMDExRSBDYW5ub3Qgb3BlbiBYTUwgU2NoZW1hIGVkaXRvcgotCi1fRVJST1JfTEFCRUxfUFJFRklYX0VYSVNUUyAgICAgPSBJV0FYMTAxMkUgUHJlZml4IGFscmVhZHkgZXhpc3RzCi0KLV9FUlJPUl9SRU1PVkVfTE9DQUxfU0lNUExFVFlQRSAgPSBJV0FYMTAxM0UgUmVtb3ZlIGxvY2FsIHNpbXBsZSB0eXBlIGZyb20gZXh0ZW5zaW9uCi0KLV9XQVJOX0lOVkFMSURfVEFSR0VUX05BTUVTUEFDRSA9IElXQVgxMDE0RSBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyBub3Qgd2VsbC1mb3JtZWQKLQotX0VSUk9SX1RBUkdFVF9OQU1FU1BBQ0VfQU5EX1BSRUZJWCA9IElXQVgxMDE1RSBBIHRhcmdldCBuYW1lc3BhY2UgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBwcmVmaXgKLQotCi1fVUlfQ09OVEFJTk1FTlQgPSBDb250YWlubWVudAotX1VJX0lOSEVSSVRBTkNFID0gSW5oZXJpdGFuY2UKLV9VSV9TVUJTVElUVVRJT05fR1JPVVBTID0gU3Vic3RpdHV0aW9uIEdyb3VwcwotX1VJX0FOT05ZTU9VUyA9ICoqYW5vbnltb3VzKioKLV9VSV9WQUxVRSA9IFZhbHVlCi1fVUlfQU5ZX0VMRU1FTlQgPSBBbnkgRWxlbWVudAotX1VJX1NPUlQgPSBTb3J0Ci0KLV9VSV9BQ1RJT05fRURJVF9OQU1FU1BBQ0VTID0gRWRpdCBOYW1lc3BhY2VzLi4uCi0KLQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0KLV9VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gQ3JlYXRlIE5ldyB7MH0gVW5kZXIgezF9IEZlYXR1cmUKLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBjaGlsZCBvZiB0eXBlIHswfSBmb3IgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZSBzZWxlY3RlZCB7Mn0uCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50LgotCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gVGhlIHswfSBvZiB0aGUgezF9Ci0KLV9VSV9YU0RBbm5vdGF0aW9uX3R5cGUgPSBBbm5vdGF0aW9uCi1fVUlfWFNEQXR0cmlidXRlRGVjbGFyYXRpb25fdHlwZSA9IEF0dHJpYnV0ZSBEZWNsYXJhdGlvbgotX1VJX1hTREF0dHJpYnV0ZUdyb3VwQ29udGVudF90eXBlID0gQXR0cmlidXRlIEdyb3VwIENvbnRlbnQKLV9VSV9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25fdHlwZSA9IEF0dHJpYnV0ZSBHcm91cCBEZWZpbml0aW9uCi1fVUlfWFNEQXR0cmlidXRlVXNlX3R5cGUgPSBBdHRyaWJ1dGUgVXNlCi1fVUlfWFNEQm91bmRlZEZhY2V0X3R5cGUgPSBCb3VuZGVkIEZhY2V0Ci1fVUlfWFNEQ2FyZGluYWxpdHlGYWNldF90eXBlID0gQ2FyZGluYWxpdHkgRmFjZXQKLV9VSV9YU0RDb21wbGV4VHlwZUNvbnRlbnRfdHlwZSA9IENvbXBsZXggVHlwZSBDb250ZW50Ci1fVUlfWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uX3R5cGUgPSBDb21wbGV4IFR5cGUgRGVmaW5pdGlvbgotX1VJX1hTRENvbXBvbmVudF90eXBlID0gQ29tcG9uZW50Ci1fVUlfWFNEQ29uY3JldGVDb21wb25lbnRfdHlwZSA9IENvbmNyZXRlIENvbXBvbmVudAotX1VJX1hTRENvbnN0cmFpbmluZ0ZhY2V0X3R5cGUgPSBDb25zdHJhaW5pbmcgRmFjZXQKLV9VSV9YU0REaWFnbm9zdGljX3R5cGUgPSBEaWFnbm9zdGljCi1fVUlfWFNERWxlbWVudERlY2xhcmF0aW9uX3R5cGUgPSBFbGVtZW50IERlY2xhcmF0aW9uCi1fVUlfWFNERW51bWVyYXRpb25GYWNldF90eXBlID0gRW51bWVyYXRpb24gRmFjZXQKLV9VSV9YU0RGYWNldF90eXBlID0gRmFjZXQKLV9VSV9YU0RGZWF0dXJlX3R5cGUgPSBGZWF0dXJlCi1fVUlfWFNERml4ZWRGYWNldF90eXBlID0gRml4ZWQgRmFjZXQKLV9VSV9YU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0X3R5cGUgPSBGcmFjdGlvbiBEaWdpdHMgRmFjZXQKLV9VSV9YU0RGdW5kYW1lbnRhbEZhY2V0X3R5cGUgPSBGdW5kYW1lbnRhbCBGYWNldAotX1VJX1hTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25fdHlwZSA9IElkZW50aXR5IENvbnN0cmFpbnQgRGVmaW5pdGlvbgotX1VJX1hTREltcG9ydF90eXBlID0gSW1wb3J0Ci1fVUlfWFNESW5jbHVkZV90eXBlID0gSW5jbHVkZQotX1VJX1hTRExlbmd0aEZhY2V0X3R5cGUgPSBMZW5ndGggRmFjZXQKLV9VSV9YU0RNYXhFeGNsdXNpdmVGYWNldF90eXBlID0gTWF4IEV4Y2x1c2l2ZSBGYWNldAotX1VJX1hTRE1heEZhY2V0X3R5cGUgPSBNYXggRmFjZXQKLV9VSV9YU0RNYXhJbmNsdXNpdmVGYWNldF90eXBlID0gTWF4IEluY2x1c2l2ZSBGYWNldAotX1VJX1hTRE1heExlbmd0aEZhY2V0X3R5cGUgPSBNYXggTGVuZ3RoIEZhY2V0Ci1fVUlfWFNETWluRXhjbHVzaXZlRmFjZXRfdHlwZSA9IE1pbiBFeGNsdXNpdmUgRmFjZXQKLV9VSV9YU0RNaW5GYWNldF90eXBlID0gTWluIEZhY2V0Ci1fVUlfWFNETWluSW5jbHVzaXZlRmFjZXRfdHlwZSA9IE1pbiBJbmNsdXNpdmUgRmFjZXQKLV9VSV9YU0RNaW5MZW5ndGhGYWNldF90eXBlID0gTWluIExlbmd0aCBGYWNldAotX1VJX1hTRE1vZGVsR3JvdXBfdHlwZSA9IE1vZGVsIEdyb3VwCi1fVUlfWFNETW9kZWxHcm91cERlZmluaXRpb25fdHlwZSA9IE1vZGVsIEdyb3VwIERlZmluaXRpb24KLV9VSV9YU0ROYW1lZENvbXBvbmVudF90eXBlID0gTmFtZWQgQ29tcG9uZW50Ci1fVUlfWFNETm90YXRpb25EZWNsYXJhdGlvbl90eXBlID0gTm90YXRpb24gRGVjbGFyYXRpb24KLV9VSV9YU0ROdW1lcmljRmFjZXRfdHlwZSA9IE51bWVyaWMgRmFjZXQKLV9VSV9YU0RPcmRlcmVkRmFjZXRfdHlwZSA9IE9yZGVyZWQgRmFjZXQKLV9VSV9YU0RQYXJ0aWNsZV90eXBlID0gUGFydGljbGUKLV9VSV9YU0RQYXJ0aWNsZUNvbnRlbnRfdHlwZSA9IFBhcnRpY2xlIENvbnRlbnQKLV9VSV9YU0RQYXR0ZXJuRmFjZXRfdHlwZSA9IFBhdHRlcm4gRmFjZXQKLV9VSV9YU0RSZWRlZmluYWJsZUNvbXBvbmVudF90eXBlID0gUmVkZWZpbmFibGUgQ29tcG9uZW50Ci1fVUlfWFNEUmVkZWZpbmVDb250ZW50X3R5cGUgPSBSZWRlZmluZSBDb250ZW50Ci1fVUlfWFNEUmVkZWZpbmVfdHlwZSA9IFJlZGVmaW5lCi1fVUlfWFNEUmVwZWF0YWJsZUZhY2V0X3R5cGUgPSBSZXBlYXRhYmxlIEZhY2V0Ci1fVUlfWFNEU2NoZW1hX3R5cGUgPSBTY2hlbWEKLV9VSV9YU0RTY2hlbWFDb21wb3NpdG9yX3R5cGUgPSBTY2hlbWEgQ29tcG9zaXRvcgotX1VJX1hTRFNjaGVtYUNvbnRlbnRfdHlwZSA9IFNjaGVtYSBDb250ZW50Ci1fVUlfWFNEU2NoZW1hRGlyZWN0aXZlX3R5cGUgPSBTY2hlbWEgRGlyZWN0aXZlCi1fVUlfWFNEU2NvcGVfdHlwZSA9IFNjb3BlCi1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fdHlwZSA9IFNpbXBsZSBUeXBlIERlZmluaXRpb24KLV9VSV9YU0RUZXJtX3R5cGUgPSBUZXJtCi1fVUlfWFNEVG90YWxEaWdpdHNGYWNldF90eXBlID0gVG90YWwgRGlnaXRzIEZhY2V0Ci1fVUlfWFNEVHlwZURlZmluaXRpb25fdHlwZSA9IFR5cGUgRGVmaW5pdGlvbgotX1VJX1hTRFdoaXRlU3BhY2VGYWNldF90eXBlID0gV2hpdGUgU3BhY2UgRmFjZXQKLV9VSV9YU0RXaWxkY2FyZF90eXBlID0gV2lsZGNhcmQKLV9VSV9YU0RYUGF0aERlZmluaXRpb25fdHlwZSA9IFhQYXRoIERlZmluaXRpb24KLV9VSV9Vbmtub3duX3R5cGUgPSBPYmplY3QKLQotX1VJX1hTREFubm90YXRpb25fYXBwbGljYXRpb25JbmZvcm1hdGlvbl9mZWF0dXJlID0gQXBwbGljYXRpb24gSW5mb3JtYXRpb24KLV9VSV9YU0RBbm5vdGF0aW9uX3VzZXJJbmZvcm1hdGlvbl9mZWF0dXJlID0gVXNlciBJbmZvcm1hdGlvbgotX1VJX1hTREFubm90YXRpb25fYXR0cmlidXRlc19mZWF0dXJlID0gQXR0cmlidXRlcwotX1VJX1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uX2F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlX2ZlYXR1cmUgPSBBdHRyaWJ1dGUgRGVjbGFyYXRpb24gUmVmZXJlbmNlCi1fVUlfWFNEQXR0cmlidXRlRGVjbGFyYXRpb25fYW5ub3RhdGlvbl9mZWF0dXJlID0gQW5ub3RhdGlvbgotX1VJX1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uX2Fub255bW91c1R5cGVEZWZpbml0aW9uX2ZlYXR1cmUgPSBBbm9ueW1vdXMgVHlwZSBEZWZpbml0aW9uCi1fVUlfWFNEQXR0cmlidXRlRGVjbGFyYXRpb25fdHlwZURlZmluaXRpb25fZmVhdHVyZSA9IFR5cGUgRGVmaW5pdGlvbgotX1VJX1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uX3Jlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb25fZmVhdHVyZSA9IFJlc29sdmVkIEF0dHJpYnV0ZSBEZWNsYXJhdGlvbgotX1VJX1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbl9hdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2VfZmVhdHVyZSA9IEF0dHJpYnV0ZSBHcm91cCBEZWZpbml0aW9uIFJlZmVyZW5jZQotX1VJX1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbl9hbm5vdGF0aW9uX2ZlYXR1cmUgPSBBbm5vdGF0aW9uCi1fVUlfWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uX2NvbnRlbnRzX2ZlYXR1cmUgPSBDb250ZW50cwotX1VJX1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbl9hdHRyaWJ1dGVVc2VzX2ZlYXR1cmUgPSBBdHRyaWJ1dGUgVXNlcwotX1VJX1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbl9hdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnRfZmVhdHVyZSA9IEF0dHJpYnV0ZSBXaWxkY2FyZCBDb250ZW50Ci1fVUlfWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uX2F0dHJpYnV0ZVdpbGRjYXJkX2ZlYXR1cmUgPSBBdHRyaWJ1dGUgV2lsZGNhcmQKLV9VSV9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25fcmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25fZmVhdHVyZSA9IFJlc29sdmVkIEF0dHJpYnV0ZSBHcm91cCBEZWZpbml0aW9uCi1fVUlfWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uX3N5bnRoZXRpY1dpbGRjYXJkX2ZlYXR1cmUgPSBTeW50aGV0aWMgV2lsZGNhcmQKLV9VSV9YU0RBdHRyaWJ1dGVVc2VfcmVxdWlyZWRfZmVhdHVyZSA9IFJlcXVpcmVkCi1fVUlfWFNEQXR0cmlidXRlVXNlX3ZhbHVlX2ZlYXR1cmUgPSBWYWx1ZQotX1VJX1hTREF0dHJpYnV0ZVVzZV9jb25zdHJhaW50X2ZlYXR1cmUgPSBDb25zdHJhaW50Ci1fVUlfWFNEQXR0cmlidXRlVXNlX3VzZV9mZWF0dXJlID0gVXNlCi1fVUlfWFNEQXR0cmlidXRlVXNlX2xleGljYWxWYWx1ZV9mZWF0dXJlID0gTGV4aWNhbCBWYWx1ZQotX1VJX1hTREF0dHJpYnV0ZVVzZV9hdHRyaWJ1dGVEZWNsYXJhdGlvbl9mZWF0dXJlID0gQXR0cmlidXRlIERlY2xhcmF0aW9uCi1fVUlfWFNEQXR0cmlidXRlVXNlX2NvbnRlbnRfZmVhdHVyZSA9IENvbnRlbnQKLV9VSV9YU0RCb3VuZGVkRmFjZXRfdmFsdWVfZmVhdHVyZSA9IFZhbHVlCi1fVUlfWFNEQ2FyZGluYWxpdHlGYWNldF92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9YU0RDb21wbGV4VHlwZURlZmluaXRpb25fZGVyaXZhdGlvbk1ldGhvZF9mZWF0dXJlID0gRGVyaXZhdGlvbiBNZXRob2QKLV9VSV9YU0RDb21wbGV4VHlwZURlZmluaXRpb25fZmluYWxfZmVhdHVyZSA9IEZpbmFsCi1fVUlfWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uX2Fic3RyYWN0X2ZlYXR1cmUgPSBBYnN0cmFjdAotX1VJX1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbl9jb250ZW50VHlwZUNhdGVnb3J5X2ZlYXR1cmUgPSBDb250ZW50IFR5cGUgQ2F0ZWdvcnkKLV9VSV9YU0RDb21wbGV4VHlwZURlZmluaXRpb25fcHJvaGliaXRlZFN1YnN0aXR1dGlvbnNfZmVhdHVyZSA9IFByb2hpYml0ZWQgU3Vic3RpdHV0aW9ucwotX1VJX1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbl9sZXhpY2FsRmluYWxfZmVhdHVyZSA9IExleGljYWwgRmluYWwKLV9VSV9YU0RDb21wbGV4VHlwZURlZmluaXRpb25fYmxvY2tfZmVhdHVyZSA9IEJsb2NrCi1fVUlfWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uX21peGVkX2ZlYXR1cmUgPSBNaXhlZAotX1VJX1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbl9jb250ZW50QW5ub3RhdGlvbl9mZWF0dXJlID0gQ29udGVudCBBbm5vdGF0aW9uCi1fVUlfWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uX2Jhc2VUeXBlRGVmaW5pdGlvbl9mZWF0dXJlID0gQmFzZSBUeXBlIERlZmluaXRpb24KLV9VSV9YU0RDb21wbGV4VHlwZURlZmluaXRpb25fY29udGVudF9mZWF0dXJlID0gQ29udGVudAotX1VJX1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbl9jb250ZW50VHlwZV9mZWF0dXJlID0gQ29udGVudCBUeXBlCi1fVUlfWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uX2F0dHJpYnV0ZVVzZXNfZmVhdHVyZSA9IEF0dHJpYnV0ZSBVc2VzCi1fVUlfWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uX2F0dHJpYnV0ZUNvbnRlbnRzX2ZlYXR1cmUgPSBBdHRyaWJ1dGUgQ29udGVudHMKLV9VSV9YU0RDb21wbGV4VHlwZURlZmluaXRpb25fYXR0cmlidXRlV2lsZGNhcmRfZmVhdHVyZSA9IEF0dHJpYnV0ZSBXaWxkY2FyZAotX1VJX1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbl9hdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnRfZmVhdHVyZSA9IEF0dHJpYnV0ZSBXaWxkY2FyZCBDb250ZW50Ci1fVUlfWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uX3Jvb3RUeXBlRGVmaW5pdGlvbl9mZWF0dXJlID0gUm9vdCBUeXBlIERlZmluaXRpb24KLV9VSV9YU0RDb21wbGV4VHlwZURlZmluaXRpb25fc3ludGhldGljUGFydGljbGVfZmVhdHVyZSA9IFN5bnRoZXRpYyBQYXJ0aWNsZQotX1VJX1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbl9zeW50aGV0aWNXaWxkY2FyZF9mZWF0dXJlID0gU3ludGhldGljIFdpbGRjYXJkCi1fVUlfWFNEQ29uY3JldGVDb21wb25lbnRfZWxlbWVudF9mZWF0dXJlID0gRWxlbWVudAotX1VJX1hTRENvbmNyZXRlQ29tcG9uZW50X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyCi1fVUlfWFNEQ29uY3JldGVDb21wb25lbnRfcm9vdENvbnRhaW5lcl9mZWF0dXJlID0gUm9vdCBDb250YWluZXIKLV9VSV9YU0RDb25jcmV0ZUNvbXBvbmVudF9zY2hlbWFfZmVhdHVyZSA9IFNjaGVtYQotX1VJX1hTRENvbmNyZXRlQ29tcG9uZW50X2RpYWdub3N0aWNzX2ZlYXR1cmUgPSBEaWFnbm9zdGljcwotX1VJX1hTRERpYWdub3N0aWNfc2V2ZXJpdHlfZmVhdHVyZSA9IFNldmVyaXR5Ci1fVUlfWFNERGlhZ25vc3RpY19tZXNzYWdlX2ZlYXR1cmUgPSBNZXNzYWdlCi1fVUlfWFNERGlhZ25vc3RpY19sb2NhdGlvblVSSV9mZWF0dXJlID0gTG9jYXRpb24gVVJJCi1fVUlfWFNERGlhZ25vc3RpY19saW5lX2ZlYXR1cmUgPSBMaW5lCi1fVUlfWFNERGlhZ25vc3RpY19jb2x1bW5fZmVhdHVyZSA9IENvbHVtbgotX1VJX1hTRERpYWdub3N0aWNfbm9kZV9mZWF0dXJlID0gTm9kZQotX1VJX1hTRERpYWdub3N0aWNfYW5ub3RhdGlvblVSSV9mZWF0dXJlID0gQW5ub3RhdGlvbiBVUkkKLV9VSV9YU0REaWFnbm9zdGljX2NvbXBvbmVudHNfZmVhdHVyZSA9IENvbXBvbmVudHMKLV9VSV9YU0REaWFnbm9zdGljX3ByaW1hcnlDb21wb25lbnRfZmVhdHVyZSA9IFByaW1hcnkgQ29tcG9uZW50Ci1fVUlfWFNERWxlbWVudERlY2xhcmF0aW9uX25pbGxhYmxlX2ZlYXR1cmUgPSBOaWxsYWJsZQotX1VJX1hTREVsZW1lbnREZWNsYXJhdGlvbl9kaXNhbGxvd2VkU3Vic3RpdHV0aW9uc19mZWF0dXJlID0gRGlzYWxsb3dlZCBTdWJzdGl0dXRpb25zCi1fVUlfWFNERWxlbWVudERlY2xhcmF0aW9uX3N1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9uc19mZWF0dXJlID0gU3Vic3RpdHV0aW9uIEdyb3VwIEV4Y2x1c2lvbnMKLV9VSV9YU0RFbGVtZW50RGVjbGFyYXRpb25fYWJzdHJhY3RfZmVhdHVyZSA9IEFic3RyYWN0Ci1fVUlfWFNERWxlbWVudERlY2xhcmF0aW9uX2xleGljYWxGaW5hbF9mZWF0dXJlID0gTGV4aWNhbCBGaW5hbAotX1VJX1hTREVsZW1lbnREZWNsYXJhdGlvbl9ibG9ja19mZWF0dXJlID0gQmxvY2sKLV9VSV9YU0RFbGVtZW50RGVjbGFyYXRpb25fZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlX2ZlYXR1cmUgPSBFbGVtZW50IERlY2xhcmF0aW9uIFJlZmVyZW5jZQotX1VJX1hTREVsZW1lbnREZWNsYXJhdGlvbl9jaXJjdWxhcl9mZWF0dXJlID0gQ2lyY3VsYXIKLV9VSV9YU0RFbGVtZW50RGVjbGFyYXRpb25fYW5ub3RhdGlvbl9mZWF0dXJlID0gQW5ub3RhdGlvbgotX1VJX1hTREVsZW1lbnREZWNsYXJhdGlvbl9hbm9ueW1vdXNUeXBlRGVmaW5pdGlvbl9mZWF0dXJlID0gQW5vbnltb3VzIFR5cGUgRGVmaW5pdGlvbgotX1VJX1hTREVsZW1lbnREZWNsYXJhdGlvbl90eXBlRGVmaW5pdGlvbl9mZWF0dXJlID0gVHlwZSBEZWZpbml0aW9uCi1fVUlfWFNERWxlbWVudERlY2xhcmF0aW9uX2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zX2ZlYXR1cmUgPSBJZGVudGl0eSBDb25zdHJhaW50IERlZmluaXRpb25zCi1fVUlfWFNERWxlbWVudERlY2xhcmF0aW9uX3Jlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uX2ZlYXR1cmUgPSBSZXNvbHZlZCBFbGVtZW50IERlY2xhcmF0aW9uCi1fVUlfWFNERWxlbWVudERlY2xhcmF0aW9uX3N1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb25fZmVhdHVyZSA9IFN1YnN0aXR1dGlvbiBHcm91cCBBZmZpbGlhdGlvbgotX1VJX1hTREVsZW1lbnREZWNsYXJhdGlvbl9zdWJzdGl0dXRpb25Hcm91cF9mZWF0dXJlID0gU3Vic3RpdHV0aW9uIEdyb3VwCi1fVUlfWFNERW51bWVyYXRpb25GYWNldF92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9YU0RGYWNldF9sZXhpY2FsVmFsdWVfZmVhdHVyZSA9IExleGljYWwgVmFsdWUKLV9VSV9YU0RGYWNldF9mYWNldE5hbWVfZmVhdHVyZSA9IEZhY2V0IE5hbWUKLV9VSV9YU0RGYWNldF9lZmZlY3RpdmVWYWx1ZV9mZWF0dXJlID0gRWZmZWN0aXZlIFZhbHVlCi1fVUlfWFNERmFjZXRfYW5ub3RhdGlvbl9mZWF0dXJlID0gQW5ub3RhdGlvbgotX1VJX1hTREZhY2V0X3NpbXBsZVR5cGVEZWZpbml0aW9uX2ZlYXR1cmUgPSBTaW1wbGUgVHlwZSBEZWZpbml0aW9uCi1fVUlfWFNERmVhdHVyZV92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9YU0RGZWF0dXJlX2NvbnN0cmFpbnRfZmVhdHVyZSA9IENvbnN0cmFpbnQKLV9VSV9YU0RGZWF0dXJlX2Zvcm1fZmVhdHVyZSA9IEZvcm0KLV9VSV9YU0RGZWF0dXJlX2xleGljYWxWYWx1ZV9mZWF0dXJlID0gTGV4aWNhbCBWYWx1ZQotX1VJX1hTREZlYXR1cmVfZ2xvYmFsX2ZlYXR1cmUgPSBHbG9iYWwKLV9VSV9YU0RGZWF0dXJlX2ZlYXR1cmVSZWZlcmVuY2VfZmVhdHVyZSA9IEZlYXR1cmUgUmVmZXJlbmNlCi1fVUlfWFNERmVhdHVyZV9zY29wZV9mZWF0dXJlID0gU2NvcGUKLV9VSV9YU0RGZWF0dXJlX3Jlc29sdmVkRmVhdHVyZV9mZWF0dXJlID0gUmVzb2x2ZWQgRmVhdHVyZQotX1VJX1hTREZlYXR1cmVfdHlwZV9mZWF0dXJlID0gVHlwZQotX1VJX1hTREZpeGVkRmFjZXRfZml4ZWRfZmVhdHVyZSA9IEZpeGVkCi1fVUlfWFNERnJhY3Rpb25EaWdpdHNGYWNldF92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uX2lkZW50aXR5Q29uc3RyYWludENhdGVnb3J5X2ZlYXR1cmUgPSBJZGVudGl0eSBDb25zdHJhaW50IENhdGVnb3J5Ci1fVUlfWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbl9hbm5vdGF0aW9uX2ZlYXR1cmUgPSBBbm5vdGF0aW9uCi1fVUlfWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbl9yZWZlcmVuY2VkS2V5X2ZlYXR1cmUgPSBSZWZlcmVuY2VkIEtleQotX1VJX1hTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25fc2VsZWN0b3JfZmVhdHVyZSA9IFNlbGVjdG9yCi1fVUlfWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbl9maWVsZHNfZmVhdHVyZSA9IEZpZWxkcwotX1VJX1hTREltcG9ydF9uYW1lc3BhY2VfZmVhdHVyZSA9IE5hbWVzcGFjZQotX1VJX1hTREltcG9ydF9hbm5vdGF0aW9uX2ZlYXR1cmUgPSBBbm5vdGF0aW9uCi1fVUlfWFNESW5jbHVkZV9hbm5vdGF0aW9uX2ZlYXR1cmUgPSBBbm5vdGF0aW9uCi1fVUlfWFNETGVuZ3RoRmFjZXRfdmFsdWVfZmVhdHVyZSA9IFZhbHVlCi1fVUlfWFNETWF4RmFjZXRfdmFsdWVfZmVhdHVyZSA9IFZhbHVlCi1fVUlfWFNETWF4RmFjZXRfaW5jbHVzaXZlX2ZlYXR1cmUgPSBJbmNsdXNpdmUKLV9VSV9YU0RNYXhGYWNldF9leGNsdXNpdmVfZmVhdHVyZSA9IEV4Y2x1c2l2ZQotX1VJX1hTRE1heExlbmd0aEZhY2V0X3ZhbHVlX2ZlYXR1cmUgPSBWYWx1ZQotX1VJX1hTRE1pbkZhY2V0X3ZhbHVlX2ZlYXR1cmUgPSBWYWx1ZQotX1VJX1hTRE1pbkZhY2V0X2luY2x1c2l2ZV9mZWF0dXJlID0gSW5jbHVzaXZlCi1fVUlfWFNETWluRmFjZXRfZXhjbHVzaXZlX2ZlYXR1cmUgPSBFeGNsdXNpdmUKLV9VSV9YU0RNaW5MZW5ndGhGYWNldF92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9YU0RNb2RlbEdyb3VwX2NvbXBvc2l0b3JfZmVhdHVyZSA9IENvbXBvc2l0b3IKLV9VSV9YU0RNb2RlbEdyb3VwX2Fubm90YXRpb25fZmVhdHVyZSA9IEFubm90YXRpb24KLV9VSV9YU0RNb2RlbEdyb3VwX2NvbnRlbnRzX2ZlYXR1cmUgPSBDb250ZW50cwotX1VJX1hTRE1vZGVsR3JvdXBfcGFydGljbGVzX2ZlYXR1cmUgPSBQYXJ0aWNsZXMKLV9VSV9YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbl9tb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZV9mZWF0dXJlID0gTW9kZWwgR3JvdXAgRGVmaW5pdGlvbiBSZWZlcmVuY2UKLV9VSV9YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbl9hbm5vdGF0aW9uX2ZlYXR1cmUgPSBBbm5vdGF0aW9uCi1fVUlfWFNETW9kZWxHcm91cERlZmluaXRpb25fbW9kZWxHcm91cF9mZWF0dXJlID0gTW9kZWwgR3JvdXAKLV9VSV9YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbl9yZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uX2ZlYXR1cmUgPSBSZXNvbHZlZCBNb2RlbCBHcm91cCBEZWZpbml0aW9uCi1fVUlfWFNETmFtZWRDb21wb25lbnRfbmFtZV9mZWF0dXJlID0gTmFtZQotX1VJX1hTRE5hbWVkQ29tcG9uZW50X3RhcmdldE5hbWVzcGFjZV9mZWF0dXJlID0gVGFyZ2V0IE5hbWVzcGFjZQotX1VJX1hTRE5hbWVkQ29tcG9uZW50X2FsaWFzTmFtZV9mZWF0dXJlID0gQWxpYXMgTmFtZQotX1VJX1hTRE5hbWVkQ29tcG9uZW50X3VSSV9mZWF0dXJlID0gVVJJCi1fVUlfWFNETmFtZWRDb21wb25lbnRfYWxpYXNVUklfZmVhdHVyZSA9IEFsaWFzIFVSSQotX1VJX1hTRE5hbWVkQ29tcG9uZW50X3FOYW1lX2ZlYXR1cmUgPSBRTmFtZQotX1VJX1hTRE5vdGF0aW9uRGVjbGFyYXRpb25fc3lzdGVtSWRlbnRpZmllcl9mZWF0dXJlID0gU3lzdGVtIElkZW50aWZpZXIKLV9VSV9YU0ROb3RhdGlvbkRlY2xhcmF0aW9uX3B1YmxpY0lkZW50aWZpZXJfZmVhdHVyZSA9IFB1YmxpYyBJZGVudGlmaWVyCi1fVUlfWFNETm90YXRpb25EZWNsYXJhdGlvbl9hbm5vdGF0aW9uX2ZlYXR1cmUgPSBBbm5vdGF0aW9uCi1fVUlfWFNETnVtZXJpY0ZhY2V0X3ZhbHVlX2ZlYXR1cmUgPSBWYWx1ZQotX1VJX1hTRE9yZGVyZWRGYWNldF92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9YU0RQYXJ0aWNsZV9taW5PY2N1cnNfZmVhdHVyZSA9IE1pbiBPY2N1cnMKLV9VSV9YU0RQYXJ0aWNsZV9tYXhPY2N1cnNfZmVhdHVyZSA9IE1heCBPY2N1cnMKLV9VSV9YU0RQYXJ0aWNsZV9jb250ZW50X2ZlYXR1cmUgPSBDb250ZW50Ci1fVUlfWFNEUGFydGljbGVfdGVybV9mZWF0dXJlID0gVGVybQotX1VJX1hTRFBhdHRlcm5GYWNldF92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9YU0RSZWRlZmluYWJsZUNvbXBvbmVudF9jaXJjdWxhcl9mZWF0dXJlID0gQ2lyY3VsYXIKLV9VSV9YU0RSZWRlZmluZV9hbm5vdGF0aW9uc19mZWF0dXJlID0gQW5ub3RhdGlvbnMKLV9VSV9YU0RSZWRlZmluZV9jb250ZW50c19mZWF0dXJlID0gQ29udGVudHMKLV9VSV9YU0RSZXBlYXRhYmxlRmFjZXRfYW5ub3RhdGlvbnNfZmVhdHVyZSA9IEFubm90YXRpb25zCi1fVUlfWFNEU2NoZW1hX2RvY3VtZW50X2ZlYXR1cmUgPSBEb2N1bWVudAotX1VJX1hTRFNjaGVtYV9zY2hlbWFMb2NhdGlvbl9mZWF0dXJlID0gU2NoZW1hIExvY2F0aW9uCi1fVUlfWFNEU2NoZW1hX3RhcmdldE5hbWVzcGFjZV9mZWF0dXJlID0gVGFyZ2V0IE5hbWVzcGFjZQotX1VJX1hTRFNjaGVtYV9hdHRyaWJ1dGVGb3JtRGVmYXVsdF9mZWF0dXJlID0gQXR0cmlidXRlIEZvcm0gRGVmYXVsdAotX1VJX1hTRFNjaGVtYV9lbGVtZW50Rm9ybURlZmF1bHRfZmVhdHVyZSA9IEVsZW1lbnQgRm9ybSBEZWZhdWx0Ci1fVUlfWFNEU2NoZW1hX2ZpbmFsRGVmYXVsdF9mZWF0dXJlID0gRmluYWwgRGVmYXVsdAotX1VJX1hTRFNjaGVtYV9ibG9ja0RlZmF1bHRfZmVhdHVyZSA9IEJsb2NrIERlZmF1bHQKLV9VSV9YU0RTY2hlbWFfdmVyc2lvbl9mZWF0dXJlID0gVmVyc2lvbgotX1VJX1hTRFNjaGVtYV9jb250ZW50c19mZWF0dXJlID0gQ29udGVudHMKLV9VSV9YU0RTY2hlbWFfZWxlbWVudERlY2xhcmF0aW9uc19mZWF0dXJlID0gRWxlbWVudCBEZWNsYXJhdGlvbnMKLV9VSV9YU0RTY2hlbWFfYXR0cmlidXRlRGVjbGFyYXRpb25zX2ZlYXR1cmUgPSBBdHRyaWJ1dGUgRGVjbGFyYXRpb25zCi1fVUlfWFNEU2NoZW1hX2F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnNfZmVhdHVyZSA9IEF0dHJpYnV0ZSBHcm91cCBEZWZpbml0aW9ucwotX1VJX1hTRFNjaGVtYV90eXBlRGVmaW5pdGlvbnNfZmVhdHVyZSA9IFR5cGUgRGVmaW5pdGlvbnMKLV9VSV9YU0RTY2hlbWFfbW9kZWxHcm91cERlZmluaXRpb25zX2ZlYXR1cmUgPSBNb2RlbCBHcm91cCBEZWZpbml0aW9ucwotX1VJX1hTRFNjaGVtYV9pZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uc19mZWF0dXJlID0gSWRlbnRpdHkgQ29uc3RyYWludCBEZWZpbml0aW9ucwotX1VJX1hTRFNjaGVtYV9ub3RhdGlvbkRlY2xhcmF0aW9uc19mZWF0dXJlID0gTm90YXRpb24gRGVjbGFyYXRpb25zCi1fVUlfWFNEU2NoZW1hX2Fubm90YXRpb25zX2ZlYXR1cmUgPSBBbm5vdGF0aW9ucwotX1VJX1hTRFNjaGVtYV9hbGxEaWFnbm9zdGljc19mZWF0dXJlID0gQWxsIERpYWdub3N0aWNzCi1fVUlfWFNEU2NoZW1hX3JlZmVyZW5jaW5nRGlyZWN0aXZlc19mZWF0dXJlID0gUmVmZXJlbmNpbmcgRGlyZWN0aXZlcwotX1VJX1hTRFNjaGVtYV9yb290VmVyc2lvbl9mZWF0dXJlID0gUm9vdCBWZXJzaW9uCi1fVUlfWFNEU2NoZW1hX29yaWdpbmFsVmVyc2lvbl9mZWF0dXJlID0gT3JpZ2luYWwgVmVyc2lvbgotX1VJX1hTRFNjaGVtYV9pbmNvcnBvcmF0ZWRWZXJzaW9uc19mZWF0dXJlID0gSW5jb3Jwb3JhdGVkIFZlcnNpb25zCi1fVUlfWFNEU2NoZW1hX3NjaGVtYUZvclNjaGVtYV9mZWF0dXJlID0gU2NoZW1hIEZvciBTY2hlbWEKLV9VSV9YU0RTY2hlbWFDb21wb3NpdG9yX2luY29ycG9yYXRlZFNjaGVtYV9mZWF0dXJlID0gSW5jb3Jwb3JhdGVkIFNjaGVtYQotX1VJX1hTRFNjaGVtYURpcmVjdGl2ZV9zY2hlbWFMb2NhdGlvbl9mZWF0dXJlID0gU2NoZW1hIExvY2F0aW9uCi1fVUlfWFNEU2NoZW1hRGlyZWN0aXZlX3Jlc29sdmVkU2NoZW1hX2ZlYXR1cmUgPSBSZXNvbHZlZCBTY2hlbWEKLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl92YXJpZXR5X2ZlYXR1cmUgPSBWYXJpZXR5Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fZmluYWxfZmVhdHVyZSA9IEZpbmFsCi1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fbGV4aWNhbEZpbmFsX2ZlYXR1cmUgPSBMZXhpY2FsIEZpbmFsCi1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fdmFsaWRGYWNldHNfZmVhdHVyZSA9IFZhbGlkIEZhY2V0cwotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX2NvbnRlbnRzX2ZlYXR1cmUgPSBDb250ZW50cwotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX2ZhY2V0Q29udGVudHNfZmVhdHVyZSA9IEZhY2V0IENvbnRlbnRzCi1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fZmFjZXRzX2ZlYXR1cmUgPSBGYWNldHMKLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl9tZW1iZXJUeXBlRGVmaW5pdGlvbnNfZmVhdHVyZSA9IE1lbWJlciBUeXBlIERlZmluaXRpb25zCi1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fZnVuZGFtZW50YWxGYWNldHNfZmVhdHVyZSA9IEZ1bmRhbWVudGFsIEZhY2V0cwotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX2Jhc2VUeXBlRGVmaW5pdGlvbl9mZWF0dXJlID0gQmFzZSBUeXBlIERlZmluaXRpb24KLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl9wcmltaXRpdmVUeXBlRGVmaW5pdGlvbl9mZWF0dXJlID0gUHJpbWl0aXZlIFR5cGUgRGVmaW5pdGlvbgotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX2l0ZW1UeXBlRGVmaW5pdGlvbl9mZWF0dXJlID0gSXRlbSBUeXBlIERlZmluaXRpb24KLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl9yb290VHlwZURlZmluaXRpb25fZmVhdHVyZSA9IFJvb3QgVHlwZSBEZWZpbml0aW9uCi1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fbWluRmFjZXRfZmVhdHVyZSA9IE1pbiBGYWNldAotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX21heEZhY2V0X2ZlYXR1cmUgPSBNYXggRmFjZXQKLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl9tYXhJbmNsdXNpdmVGYWNldF9mZWF0dXJlID0gTWF4IEluY2x1c2l2ZSBGYWNldAotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX21pbkluY2x1c2l2ZUZhY2V0X2ZlYXR1cmUgPSBNaW4gSW5jbHVzaXZlIEZhY2V0Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fbWluRXhjbHVzaXZlRmFjZXRfZmVhdHVyZSA9IE1pbiBFeGNsdXNpdmUgRmFjZXQKLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl9tYXhFeGNsdXNpdmVGYWNldF9mZWF0dXJlID0gTWF4IEV4Y2x1c2l2ZSBGYWNldAotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX2xlbmd0aEZhY2V0X2ZlYXR1cmUgPSBMZW5ndGggRmFjZXQKLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl93aGl0ZVNwYWNlRmFjZXRfZmVhdHVyZSA9IFdoaXRlIFNwYWNlIEZhY2V0Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fZW51bWVyYXRpb25GYWNldHNfZmVhdHVyZSA9IEVudW1lcmF0aW9uIEZhY2V0cwotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX3BhdHRlcm5GYWNldHNfZmVhdHVyZSA9IFBhdHRlcm4gRmFjZXRzCi1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fY2FyZGluYWxpdHlGYWNldF9mZWF0dXJlID0gQ2FyZGluYWxpdHkgRmFjZXQKLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl9udW1lcmljRmFjZXRfZmVhdHVyZSA9IE51bWVyaWMgRmFjZXQKLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl9tYXhMZW5ndGhGYWNldF9mZWF0dXJlID0gTWF4IExlbmd0aCBGYWNldAotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX21pbkxlbmd0aEZhY2V0X2ZlYXR1cmUgPSBNaW4gTGVuZ3RoIEZhY2V0Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fdG90YWxEaWdpdHNGYWNldF9mZWF0dXJlID0gVG90YWwgRGlnaXRzIEZhY2V0Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fZnJhY3Rpb25EaWdpdHNGYWNldF9mZWF0dXJlID0gRnJhY3Rpb24gRGlnaXRzIEZhY2V0Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fb3JkZXJlZEZhY2V0X2ZlYXR1cmUgPSBPcmRlcmVkIEZhY2V0Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fYm91bmRlZEZhY2V0X2ZlYXR1cmUgPSBCb3VuZGVkIEZhY2V0Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fZWZmZWN0aXZlTWF4RmFjZXRfZmVhdHVyZSA9IEVmZmVjdGl2ZSBNYXggRmFjZXQKLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl9lZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXRfZmVhdHVyZSA9IEVmZmVjdGl2ZSBXaGl0ZSBTcGFjZSBGYWNldAotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX2VmZmVjdGl2ZU1heExlbmd0aEZhY2V0X2ZlYXR1cmUgPSBFZmZlY3RpdmUgTWF4IExlbmd0aCBGYWNldAotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX2VmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXRfZmVhdHVyZSA9IEVmZmVjdGl2ZSBGcmFjdGlvbiBEaWdpdHMgRmFjZXQKLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl9lZmZlY3RpdmVQYXR0ZXJuRmFjZXRfZmVhdHVyZSA9IEVmZmVjdGl2ZSBQYXR0ZXJuIEZhY2V0Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldF9mZWF0dXJlID0gRWZmZWN0aXZlIEVudW1lcmF0aW9uIEZhY2V0Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldF9mZWF0dXJlID0gRWZmZWN0aXZlIFRvdGFsIERpZ2l0cyBGYWNldAotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX2VmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0X2ZlYXR1cmUgPSBFZmZlY3RpdmUgTWluIExlbmd0aCBGYWNldAotX1VJX1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uX2VmZmVjdGl2ZUxlbmd0aEZhY2V0X2ZlYXR1cmUgPSBFZmZlY3RpdmUgTGVuZ3RoIEZhY2V0Ci1fVUlfWFNEU2ltcGxlVHlwZURlZmluaXRpb25fZWZmZWN0aXZlTWluRmFjZXRfZmVhdHVyZSA9IEVmZmVjdGl2ZSBNaW4gRmFjZXQKLV9VSV9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbl9zeW50aGV0aWNGYWNldHNfZmVhdHVyZSA9IFN5bnRoZXRpYyBGYWNldHMKLV9VSV9YU0RUb3RhbERpZ2l0c0ZhY2V0X3ZhbHVlX2ZlYXR1cmUgPSBWYWx1ZQotX1VJX1hTRFR5cGVEZWZpbml0aW9uX2Fubm90YXRpb25fZmVhdHVyZSA9IEFubm90YXRpb24KLV9VSV9YU0RUeXBlRGVmaW5pdGlvbl9kZXJpdmF0aW9uQW5ub3RhdGlvbl9mZWF0dXJlID0gRGVyaXZhdGlvbiBBbm5vdGF0aW9uCi1fVUlfWFNEVHlwZURlZmluaXRpb25fYW5ub3RhdGlvbnNfZmVhdHVyZSA9IEFubm90YXRpb25zCi1fVUlfWFNEVHlwZURlZmluaXRpb25fcm9vdFR5cGVfZmVhdHVyZSA9IFJvb3QgVHlwZQotX1VJX1hTRFR5cGVEZWZpbml0aW9uX2Jhc2VUeXBlX2ZlYXR1cmUgPSBCYXNlIFR5cGUKLV9VSV9YU0RUeXBlRGVmaW5pdGlvbl9zaW1wbGVUeXBlX2ZlYXR1cmUgPSBTaW1wbGUgVHlwZQotX1VJX1hTRFR5cGVEZWZpbml0aW9uX2NvbXBsZXhUeXBlX2ZlYXR1cmUgPSBDb21wbGV4IFR5cGUKLV9VSV9YU0RXaGl0ZVNwYWNlRmFjZXRfdmFsdWVfZmVhdHVyZSA9IFZhbHVlCi1fVUlfWFNEV2lsZGNhcmRfbmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5X2ZlYXR1cmUgPSBOYW1lc3BhY2UgQ29uc3RyYWludCBDYXRlZ29yeQotX1VJX1hTRFdpbGRjYXJkX25hbWVzcGFjZUNvbnN0cmFpbnRfZmVhdHVyZSA9IE5hbWVzcGFjZSBDb25zdHJhaW50Ci1fVUlfWFNEV2lsZGNhcmRfcHJvY2Vzc0NvbnRlbnRzX2ZlYXR1cmUgPSBQcm9jZXNzIENvbnRlbnRzCi1fVUlfWFNEV2lsZGNhcmRfbGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnRfZmVhdHVyZSA9IExleGljYWwgTmFtZXNwYWNlIENvbnN0cmFpbnQKLV9VSV9YU0RXaWxkY2FyZF9hbm5vdGF0aW9uX2ZlYXR1cmUgPSBBbm5vdGF0aW9uCi1fVUlfWFNEV2lsZGNhcmRfYW5ub3RhdGlvbnNfZmVhdHVyZSA9IEFubm90YXRpb25zCi1fVUlfWFNEWFBhdGhEZWZpbml0aW9uX3ZhcmlldHlfZmVhdHVyZSA9IFZhcmlldHkKLV9VSV9YU0RYUGF0aERlZmluaXRpb25fdmFsdWVfZmVhdHVyZSA9IFZhbHVlCi1fVUlfWFNEWFBhdGhEZWZpbml0aW9uX2Fubm90YXRpb25fZmVhdHVyZSA9IEFubm90YXRpb24KLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBVbnNwZWNpZmllZAotCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSEKLSEgVXNlZCBieSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXcKLSEKLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotX1VJX0xBQkVMX1NPVVJDRV9GSUxFUyAgID0gV29ya2JlbmNoIEZpbGVzCi1fVUlfTEFCRUxfU0VMRUNURURfRklMRVMgPSBTZWxlY3RlZCBGaWxlcwotCi1fVUlfSU1QT1JUX0JVVFRPTiAgICAgICAgICA9IEltcG9ydCBGaWxlcy4uLgotX1VJX0lNUE9SVF9CVVRUT05fVE9PTF9USVAgPSBJbXBvcnQgZmlsZXMgZnJvbSBmaWxlIHN5c3RlbQotCi0KLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIQotISByZWZhY3RvcmluZwotIQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1yZWZhY3RvcmluZ0FjdGlvblNldC5sYWJlbD1SZWZhY3RvcgotcmVmYWN0b3JpbmdBY3Rpb25TZXQuZGVzY3JpcHRpb249WFNEIEVkaXRvciByZWZhY3RvcmluZyBhY3Rpb25zCi1yZWZhY3RvcmluZy5tZW51LmxhYmVsPVJlZmFjdG9yCi1yZWZhY3RvcmluZy5yZW5hbWVBY3Rpb24ubGFiZWw9UmUmbmFtZS4uLgotY29udGV4dC50ZXh0LmVkaXRvci54c2QubmFtZT1FZGl0aW5nIFhTRCBjb250ZXh0Ci1jb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudC5uYW1lPVJlbmFtZSBYU0QgZWxlbWVudAotY29tbWFuZC54c2QucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQuZGVzY3JpcHRpb249UmVuYW1lIFhTRCBlbGVtZW50Ci1jb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbC5lbGVtZW50Lm5hbWU9TWFrZSBsb2NhbCBlbGVtZW50IGdsb2JhbAotY29tbWFuZC54c2QucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwuZWxlbWVudC5kZXNjcmlwdGlvbj1Qcm9tb3RlcyBsb2NhbCBlbGVtZW50IHRvIGdsb2JhbCBsZXZlbCBhbmQgcmVwbGFjZXMgaXRzIHJlZmVyZW5jZXMKLWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsLmVsZW1lbnQubmFtZT1NYWtlIGFub255bW91cyB0eXBlIGdsb2JhbAotY29tbWFuZC54c2QucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwuZWxlbWVudC5kZXNjcmlwdGlvbj1Qcm9tb3RlcyBhbm9ueW1vdXMgdHlwZSB0byBnbG9iYWwgbGV2ZWwgYW5kIHJlcGxhY2VzIGl0cyByZWZlcmVuY2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlZDdmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkiCi0gICBuYW1lPSIlX1VJX1BMVUdJTl9OQU1FIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ieHNkZWRpdG9yLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIvPgotICAgICAgCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIi8+Ci0gICAgICAKLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UueHNkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZ2VmIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS54c2QuZWRpdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiLz4gCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iLz4KLSAgICAgIAotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nIiAvPgotCSAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZyIgLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IiVfVUlfRURJVE9SX05BTUUiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvWFNERmlsZS5naWYiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ4c2QiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREFjdGlvbkJhckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuWFNERWRpdG9yIj4KLSAgICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+Ci08IS0tIGRyb3AgdGFyZ2V0cyBmb3IgWFNEVGV4dEVkaXRvci0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZHJvcFRhcmdldFRyYW5zZmVycyI+Ci0gICAgICA8ZHJvcFRhcmdldENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNEVGV4dEVkaXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLkV4dGVuZGVkVHJhbnNmZXJzIj4KLSAgICAgICAgIDx0cmFuc2ZlcgotICAgICAgICAgICAgICAgcHJpb3JpdHk9Im1pZCIKLSAgICAgICAgICAgICAgIHNpbmdsZXRvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciIKLSAgICAgICAgICAgICAgIG1ldGhvZD0iZ2V0SW5zdGFuY2UiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXIiPgotICAgICAgICAgPC90cmFuc2Zlcj4KLSAgICAgICAgIDxkcm9wQWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uRmlsZURyb3BBY3Rpb24iCi0gICAgICAgICAgICAgICB0cmFuc2ZlcklEPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5GaWxlRHJvcEFjdGlvbiI+Ci0gICAgICAgICA8L2Ryb3BBY3Rpb24+Ci0gICAgICAgICA8dHJhbnNmZXIKLSAgICAgICAgICAgICAgIHByaW9yaXR5PSJsb3ciCi0gICAgICAgICAgICAgICBzaW5nbGV0b249InRydWUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiCi0gICAgICAgICAgICAgICBtZXRob2Q9ImdldEluc3RhbmNlIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyIj4KLSAgICAgICAgIDwvdHJhbnNmZXI+Ci0gICAgICAgICA8ZHJvcEFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLlRleHREcm9wQWN0aW9uIgotICAgICAgICAgICAgICAgdHJhbnNmZXJJRD0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiCi0gICAgICAgICAgICAgICBpZD0iY29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLlRleHREcm9wQWN0aW9uIj4KLSAgICAgICAgIDwvZHJvcEFjdGlvbj4KLSAgICAgIDwvZHJvcFRhcmdldENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgPHdpemFyZCBpZCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIgotICAgICAgICBuYW1lID0gIiVfVUlfV0laQVJEX05FV19YU0QiCi0gICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYU0RXaXphcmQiCi0gICAgICAgIGNhdGVnb3J5ID0gIm9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLSAgICAgICAgaWNvbiA9ICJpY29ucy9YU0RGaWxlLmdpZiI+Ci0gICAgICA8ZGVzY3JpcHRpb24+JV9VSV9DUkVBVEVfQV9ORVdfU0NIRU1BPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxzZWxlY3Rpb24gY2xhc3MgPSAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlX1VJX1hNTF9TQ0hFTUFfUFJFRkVSRU5DRSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuZGVkY29uZmlndXJhdGlvbiI+Ci0JCTxkZWZpbml0aW9uIAotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEUHJlZmVyZW5jZVBhZ2UiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yLnNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdXBwb3J0IGhlbHAgb24gdGhlIHRhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uRmlsZXMiPgotICAgICAgPGFubm90YXRpb25GaWxlCi0gICAgICAgICAgICBsb2NhdGlvbj0iL3czYy9zY2hlbWFGb3JDb2RlQXNzaXN0LWFubm90YXRpb25zLnhtbCIKLSAgICAgICAgICAgIHB1YmxpY0lkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICA8L2Fubm90YXRpb25GaWxlPgotICAgPC9leHRlbnNpb24+Ci0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMucHJvcGVydHlDb250cmlidXRvciI+Ci0gICAgICA8cHJvcGVydHlDb250cmlidXRvcgotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3IiCi0gICAgICAgICAgICBzZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5YU0RTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyIgotICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIiPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJnZW5lcmFsIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0ibmFtZXNwYWNlIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0ib3RoZXIiPgotICAgICAgICAgPC9wcm9wZXJ0eUNhdGVnb3J5PgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJhdHRyaWJ1dGVzIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZW51bWVyYXRpb25zIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZG9jdW1lbnRhdGlvbiI+Ci0gICAgICAgICA8L3Byb3BlcnR5Q2F0ZWdvcnk+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImZhY2V0cyI+Ci0gICAgICAgICA8L3Byb3BlcnR5Q2F0ZWdvcnk+Ci0gICAgICA8L3Byb3BlcnR5Q29udHJpYnV0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMucHJvcGVydHlUYWJzIj4KLSAgICAgIDxwcm9wZXJ0eVRhYnMKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yIj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfR0VORVJBTCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJnZW5lcmFsIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI+Ci0gICAgICAgICA8L3Byb3BlcnR5VGFiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9OQU1FU1BBQ0UiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0ibmFtZXNwYWNlIgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLm5hbWVzcGFjZSI+Ci0gICAgICAgICA8L3Byb3BlcnR5VGFiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9PVEhFUiIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLm90aGVyIj4KLSAgICAgICAgIDwvcHJvcGVydHlUYWI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX0FUVFJJQlVURVMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmF0dHJpYnV0ZXMiPgotICAgICAgICAgPC9wcm9wZXJ0eVRhYj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfRU5VTUVSQVRJT05TIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVudW1lcmF0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmVudW1lcmF0aW9ucyI+Ci0gICAgICAgICA8L3Byb3BlcnR5VGFiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBpZD0iY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5kb2N1bWVudGF0aW9uIj4KLSAgICAgICAgIDwvcHJvcGVydHlUYWI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1NFQ1RJT05fQURWQU5DRURfQVRUUklCVVRFUyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJmYWNldHMiCi0gICAgICAgICAgICAgICBpZD0iY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5mYWNldHMiPgotICAgICAgICAgPC9wcm9wZXJ0eVRhYj4KLSAgICAgIDwvcHJvcGVydHlUYWJzPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLmNhdGFsb2dDb250cmlidXRvciI+Ci0gICAgIDxjYXRhbG9nQ29udHJpYnV0b3IgY2F0YWxvZ0lkPSJkZWZhdWx0Ij4KLSAgICAgICA8bWFwcGluZ0luZm8ga2V5PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdXJpPSJ3M2MvWE1MU2NoZW1hLnhzZCIvPgotICAgICAgPC9jYXRhbG9nQ29udHJpYnV0b3I+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAgLS0+Ci0gCi0gIAk8IS0tIGludGlhbGl6ZSB4c2QgcmVjb25jaWxlIHZhbGlkYXRvciAtLT4KLQkgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVjb25jaWxlVmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIHNjb3BlPSJ0b3RhbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlY29uY2lsZS5EZWxlZ2F0aW5nUmVjb25jaWxlVmFsaWRhdG9yRm9yWFNEIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVjb25jaWxlLkRlbGVnYXRpbmdSZWNvbmNpbGVWYWxpZGF0b3JGb3JYU0QiPgotICAJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLnhzZHNvdXJjZSI+Ci0gICAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuREVGQVVMVF9YTUwiPgotICAgICAgICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgICAgPC9jb250ZW50VHlwZUlkZW50aWZpZXI+ICAgICAgIAotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMiPiAKLSAJCTxjb250ZXh0IGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnRleHQuZWRpdG9yLmNvbnRleHQiCi0gCQkJbmFtZT0iJWNvbnRleHQudGV4dC5lZGl0b3IueHNkLm5hbWUiCi0gCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRFZGl0b3JTY29wZSIvPgotIAk8L2V4dGVuc2lvbj4KLSAKLSAJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQk8Y29tbWFuZCBuYW1lPSIlY29tbWFuZC54c2QucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC54c2QucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQiPgotCQk8L2NvbW1hbmQ+Ci0JCTxrZXlCaW5kaW5nIGtleVNlcXVlbmNlPSJBbHQrU2hpZnQrUiIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS50ZXh0LmVkaXRvci5jb250ZXh0IgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50IgotCQkJa2V5Q29uZmlndXJhdGlvbklkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXlCaW5kaW5nPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLQkJPGNvbW1hbmQgbmFtZT0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwuZWxlbWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbCI+Ci0JCTwvY29tbWFuZD4KLQkJPGtleUJpbmRpbmcgCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkudGV4dC5lZGl0b3IuY29udGV4dCIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbCIKLQkJCWtleUNvbmZpZ3VyYXRpb25JZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5QmluZGluZz4KLQk8L2V4dGVuc2lvbj4KLQkKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLQkJPGNvbW1hbmQgbmFtZT0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsLmVsZW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwuZWxlbWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbCI+Ci0JCTwvY29tbWFuZD4KLQkJPGtleUJpbmRpbmcgCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkudGV4dC5lZGl0b3IuY29udGV4dCIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbCIKLQkJCWtleUNvbmZpZ3VyYXRpb25JZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5QmluZGluZz4KLQk8L2V4dGVuc2lvbj4KLSAgIAotICAgIDwhLS1leHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucmVuYW1lUGFydGljaXBhbnRzIj4KLSAgICAgICA8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiV4c2QucmVzb3VyY2UucmVuYW1lLnBhcnRpY2lwYW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuWFNEUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yaW5nLlhTRFJlc291cmNlUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkgIDx3aXRoCi0gICAgICAgICAgICAgICAgICB2YXJpYWJsZT0iZWxlbWVudCI+Ci0gICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLSAgICA8L2V4dGVuc2lvbi0tPgotCi0gIDwhLS0gCi0gIAkgICBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiB0byB0aGUgZmlsZSBjb250ZXh0IG1lbnUgaXMgdGVtcG9yYXJ5IHVudGlsIHJlc291cmNlIAotICAgICAgIG5hdmlnYXRvciB3aWxsIHByb3ZpZGUgYWxsb3cgdG8gZXh0ZW5kIHJlZmFjdG9yIG1lbnUgICAgICAgIAotICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotPCEtLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgbmFtZUZpbHRlcj0iKi54c2QiCi0gICAgICAgICAgaWQ9Im9yZy53c3QueHNkLnVpLnJlbmFtZSI+Ci0gICAgICAgICA8bWVudSBpZD0icmVmYWN0b3JYU0RSZXNvdXJjZSIgcGF0aD0iYWRkaXRpb25zIiBsYWJlbD0iJXJlZmFjdG9yaW5nLm1lbnUubGFiZWwiPgotICAgICAgICAgCTxzZXBhcmF0b3IgbmFtZT0icmVmYWN0b3IiLz4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBsYWJlbD0iJXJlZmFjdG9yaW5nLnJlbmFtZUFjdGlvbi5sYWJlbCIKLSAgICAgICAgICAgICBtZW51YmFyUGF0aD0icmVmYWN0b3JYU0RSZXNvdXJjZS9yZWZhY3RvciIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zLlJlbmFtZVJlc291cmNlQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvcmluZy5hY3Rpb25zLlJlbmFtZVJlc291cmNlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9BYnN0cmFjdFhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9BYnN0cmFjdFhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzY2I5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvQWJzdHJhY3RYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLkRhdGFUeXBlVmFsdWVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLSAgLyoqCi0gICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBleHRlbmQgdGhlIE1vZGVsUXVlcnkgYmVoYXZpb3VyIHNvIHRoYXQgd2UgY2FuIGNvbnRyaWJ1dGUgb3VyIG93bgotICAgKiAnYWxsb3dlZCB2YWx1ZXMnIGZvciBhdHRyaWJ1dGVzIG9yIGVsZW1lbnRzIChlLmcuIHRoZSAndHlwZScgYXR0cmlidXRlKS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24gaW1wbGVtZW50cyBEYXRhVHlwZVZhbHVlRXh0ZW5zaW9uCi0gIHsgCi0gICAgcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLQotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIERBVEFfVFlQRV9WQUxVRV9FWFRFTlNJT047Ci0gICAgfSAgIAotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZCgpOwotCi0gICAgcHVibGljIEFic3RyYWN0WFNERGF0YVR5cGVWYWx1ZUV4dGVuc2lvbihNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkpCi0gICAgewotICAgICAgdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeTsKLSAgICAgIGlmIChtb2RlbFF1ZXJ5ICE9IG51bGwgJiYgbW9kZWxRdWVyeS5nZXRFeHRlbnNpb25NYW5hZ2VyKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbW9kZWxRdWVyeS5nZXRFeHRlbnNpb25NYW5hZ2VyKCkuYWRkRXh0ZW5zaW9uKHRoaXMpOwotICAgICAgfQotICAgIH0gIAotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCAmJiBtb2RlbFF1ZXJ5LmdldEV4dGVuc2lvbk1hbmFnZXIoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBtb2RlbFF1ZXJ5LmdldEV4dGVuc2lvbk1hbmFnZXIoKS5yZW1vdmVFeHRlbnNpb24odGhpcyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFhTRFNjaGVtYSBnZXRFbmNsb3NpbmdYU0RTY2hlbWEoRWxlbWVudCBlbGVtZW50KTsgIAotCi0KLQlwcm90ZWN0ZWQgVHlwZXNIZWxwZXIgY3JlYXRlVHlwZXNIZWxwZXIoWFNEU2NoZW1hIHNjaGVtYSkKLQl7IAotCQlyZXR1cm4gbmV3IFR5cGVzSGVscGVyKHNjaGVtYSk7CQkKLQl9Ci0JCi0gICAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldERhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pCi0gICAgICB7Ci0gICAgICAgIFR5cGVzSGVscGVyIHR5cGVzSGVscGVyID0gY3JlYXRlVHlwZXNIZWxwZXIoZ2V0RW5jbG9zaW5nWFNEU2NoZW1hKGVsZW1lbnQpKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRFbGVtZW50TmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBTdHJpbmcgcGFyZW50TmFtZSA9ICIiOwotICAgICAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hlY2tOYW1lKG5hbWUsICJ0eXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImF0dHJpYnV0ZSIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QgPSB0eXBlc0hlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgICAgbGlzdC5hZGRBbGwodHlwZXNIZWxwZXIuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJlbGVtZW50IikpCi0gICAgICAgICAgewotICAgICAgICAgICAgbGlzdCA9IHR5cGVzSGVscGVyLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0MigpOwotICAgICAgICAgICAgbGlzdC5hZGRBbGwodHlwZXNIZWxwZXIuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgICAgICBsaXN0LmFkZEFsbCh0eXBlc0hlbHBlci5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAiaXRlbVR5cGUiKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAibGlzdCIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgInNpbXBsZVR5cGUiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGlzdCA9IHR5cGVzSGVscGVyLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgICAgIGxpc3QuYWRkQWxsKHR5cGVzSGVscGVyLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgIm1lbWJlclR5cGVzIikpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgInVuaW9uIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlVHlwZSIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsaXN0ID0gdHlwZXNIZWxwZXIuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICAgICAgICAgICAgbGlzdC5hZGRBbGwodHlwZXNIZWxwZXIuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAiYmFzZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJyZXN0cmljdGlvbiIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgInNpbXBsZVR5cGUiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGlzdCA9IHR5cGVzSGVscGVyLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgICAgIGxpc3QuYWRkQWxsKHR5cGVzSGVscGVyLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKHBhcmVudE5hbWUsICJzaW1wbGVDb250ZW50IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxpc3QgPSB0eXBlc0hlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgICAgICBsaXN0LmFkZEFsbCh0eXBlc0hlbHBlci5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgImNvbXBsZXhDb250ZW50IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxpc3QgPSB0eXBlc0hlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgICAgICBsaXN0LmFkZEFsbCh0eXBlc0hlbHBlci5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJleHRlbnNpb24iKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2hlY2tOYW1lKHBhcmVudE5hbWUsICJzaW1wbGVDb250ZW50IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxpc3QgPSB0eXBlc0hlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgICAgICBsaXN0LmFkZEFsbCh0eXBlc0hlbHBlci5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgImNvbXBsZXhDb250ZW50IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxpc3QgPSB0eXBlc0hlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgICAgICBsaXN0LmFkZEFsbCh0eXBlc0hlbHBlci5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAicmVmIikpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImVsZW1lbnQiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0ID0gdHlwZXNIZWxwZXIuZ2V0R2xvYmFsRWxlbWVudHMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImF0dHJpYnV0ZSIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QgPSB0eXBlc0hlbHBlci5nZXRHbG9iYWxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJhdHRyaWJ1dGVHcm91cCIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QgPSB0eXBlc0hlbHBlci5nZXRHbG9iYWxBdHRyaWJ1dGVHcm91cHMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImdyb3VwIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgbGlzdCA9IHR5cGVzSGVscGVyLmdldE1vZGVsR3JvdXBzKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAic3Vic3RpdHV0aW9uR3JvdXAiKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiZWxlbWVudCIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QgPSB0eXBlc0hlbHBlci5nZXRHbG9iYWxFbGVtZW50cygpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotLyogICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAicmVmZXIiKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAia2V5cmVmIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgbGlzdCA9IHR5cGVzSGVscGVyLmdldEtleXMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gKi8KLQotCi0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja05hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHRva2VuKQotICAgIHsKLSAgICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUudHJpbSgpLmVxdWFscyh0b2tlbikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9BYnN0cmFjdFhTRE1vZGVsUXVlcnlDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL0Fic3RyYWN0WFNETW9kZWxRdWVyeUNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxN2FmZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL0Fic3RyYWN0WFNETW9kZWxRdWVyeUNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhTRE1vZGVsUXVlcnlDb250cmlidXRvcgoteyAKLSAgcHJvdGVjdGVkIEFic3RyYWN0WFNERGF0YVR5cGVWYWx1ZUV4dGVuc2lvbiB4c2REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uOwotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKFhNTE1vZGVsIG1vZGVsKQotICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyByZW1vdmUgb3VyIG9sZCBEYXRhVHlwZVZhbHVlRXh0ZW5zaW9uCi0gICAgLy8KLSAgICBpZiAoeHNkRGF0YVR5cGVWYWx1ZUV4dGVuc2lvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHhzZERhdGFUeXBlVmFsdWVFeHRlbnNpb24uZGlzcG9zZSgpOwotICAgICAgeHNkRGF0YVR5cGVWYWx1ZUV4dGVuc2lvbiA9IG51bGw7Ci0gICAgfQotCi0gICAgc2V0SW1wbGljaXRHcmFtbWFyKG1vZGVsLmdldERvY3VtZW50KCkpOwotCi0gICAgLy8gYWRkIGEgbmV3IERhdGFUeXBlVmFsdWVFeHRlbnNpb24KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsLmdldERvY3VtZW50KCkpOwotICAgIHhzZERhdGFUeXBlVmFsdWVFeHRlbnNpb24gPSBjcmVhdGVYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uKG1vZGVsUXVlcnkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRJbXBsaWNpdEdyYW1tYXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLS8vICAgIERPTUV4dGVuc2lvbiBkb21FeHRlbnNpb24gPSBET01FeHRlbnNpb25Qcm92aWRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RE9NRXh0ZW5zaW9uKGRvY3VtZW50KTsKLS8vICAgIGlmIChkb21FeHRlbnNpb24gIT0gbnVsbCkKLS8vICAgIHsKLSAgICAgIFN0cmluZyB1cmkgPSAicGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3czYy9zY2hlbWFGb3JDb2RlQXNzaXN0LnhzZCI7Ci0gICAgICB1cmkgPSByZXNvbHZlUGxhdGZvcm1VcmwodXJpKTsKLSAgICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgVmVjdG9yIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJ4c2QiLCB1cmkpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KCJpc0ltcGxpZWQiLCAidHJ1ZSIpOwotICAgICAgICBsaXN0LmFkZChpbmZvKTsKLS8vICAgICAgICBkb21FeHRlbnNpb24uc2V0SW1wbGljdE5hbWVzcGFjZUluZm9MaXN0KGxpc3QpOwotICAgICAgfQotLy8gICAgfQotICB9IAotCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlc29sdmVQbGF0Zm9ybVVybChTdHJpbmcgdXJsc3BlYykKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIHVybHNwZWMgPSB1cmxzcGVjLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVybHNwZWMpOwotICAgICAgVVJMIHJlc29sdmVkVVJMID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpOwotICAgICAgcmVzdWx0ID0gcmVzb2x2ZWRVUkwudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdFhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24gY3JlYXRlWFNERGF0YVR5cGVWYWx1ZUV4dGVuc2lvbihNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9YU0RBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTREFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmYzNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTREFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZXRhcmdldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudXRpbC5TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuSVNjaGVtYUVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5SZWZhY3RvckFjdGlvbkdyb3VwOwotCi1wdWJsaWMgY2xhc3MgWFNEQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcgotewotICBwcm90ZWN0ZWQgWFNERWRpdG9yIHhzZEVkaXRvcjsKLSAgcHJvdGVjdGVkIFhTRFRleHRFZGl0b3IgdGV4dEVkaXRvcjsKLQotICBwcm90ZWN0ZWQgUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uIHJlbG9hZERlcGVuZGVuY2llc0FjdGlvbjsKLSAgCi0gIHByb3RlY3RlZCBMaXN0IGZQYXJ0TGlzdGVuZXJzPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgcHJvdGVjdGVkIFJldGFyZ2V0QWN0aW9uIHJldGFyZ2V0UmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uOwotICBwcml2YXRlIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiByZW5hbWVFbGVtZW50QWN0aW9uID0gbnVsbDsKLSAgcHJpdmF0ZSBJTWVudU1hbmFnZXIgcmVmYWN0b3JNZW51ID0gbnVsbDsKLSAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBYU0RBY3Rpb25CYXJDb250cmlidXRvci4KLSAgICovCi0gIHB1YmxpYyBYU0RBY3Rpb25CYXJDb250cmlidXRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotCi0gICAgLy8gUmVsb2FkIERlcGVuZGVuY2llcwotICAgIHJlbG9hZERlcGVuZGVuY2llc0FjdGlvbiA9IG5ldyBSZWxvYWREZXBlbmRlbmNpZXNBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX01FTlVfUkVMT0FEX0RFUEVOREVOQ0lFUyIpKTsKLSAgICByZXRhcmdldFJlbG9hZERlcGVuZGVuY2llc0FjdGlvbiA9IG5ldyBSZXRhcmdldEFjdGlvbihJU2NoZW1hRWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFVEFSR0VUX1JFTE9BRF9ERVBFTkRFTkNJRVNfQUNUSU9OX0lELCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTUVOVV9SRUxPQURfREVQRU5ERU5DSUVTIikpOwotICAgIHJldGFyZ2V0UmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9NRU5VX1JFTE9BRF9ERVBFTkRFTkNJRVNfVE9PTFRJUCIpKTsKLSAgICByZXRhcmdldFJlbG9hZERlcGVuZGVuY2llc0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoCi0gICAgICAgIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0Q2xhc3MoKSwgImljb25zL3JlbG9hZGdyYW1tYXIuZ2lmIikpOwotICAgIGZQYXJ0TGlzdGVuZXJzLmFkZChyZXRhcmdldFJlbG9hZERlcGVuZGVuY2llc0FjdGlvbik7Ci0gICAgCi0gICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpKTsKLQlyZW5hbWVFbGVtZW50QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsIElTY2hlbWFFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVUQVJHRVRfUkVOQU1FX0VMRU1FTlRfQUNUSU9OX0lEICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuRE9UKTsKLQlyZW5hbWVFbGVtZW50QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudCIpOyAvLyBUT0RPOiBhZGQgdG8gY29udHN0YW50cyBjb21tYW5kIGlkCi0JCQotCS8vIHRoZSByZWZhY3RvciBtZW51LCBhZGQgdGhlIG1lbnUgaXRzZWxmIHRvIGFkZCBhbGwgcmVmYWN0b3IgYWN0aW9ucwotCXJlZmFjdG9yTWVudSA9IG5ldyBNZW51TWFuYWdlcigiUmVmYWN0b3IiLCBSZWZhY3RvckFjdGlvbkdyb3VwLk1FTlVfSUQpOyAvL1RPRE86IGV4dGVybmFsaXplIHN0cmluZwotCXJlZmFjdG9yTWVudS5hZGQodGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGlvbnMoKQotICB7Ci0gICAgaWYgKHhzZEVkaXRvciAhPSBudWxsICYmIHhzZEVkaXRvci5nZXRDdXJyZW50UGFnZVR5cGUoKS5lcXVhbHMoWFNERWRpdG9yUGx1Z2luLkdSQVBIX1BBR0UpKQotICAgIHsKLSAgICAgIElBY3Rpb24gZGVsZXRlQWN0aW9uID0geHNkRWRpdG9yLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCkuZ2V0TWVudUxpc3RlbmVyKCkuZ2V0RGVsZXRlQWN0aW9uKCk7Ci0gICAgICBnZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLCBkZWxldGVBY3Rpb24pOwotCi0gICAgICBJQWN0aW9uIHByaW50R3JhcGhBY3Rpb24gPSB4c2RFZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5nZXRQcmludEdyYXBoQWN0aW9uKCk7Ci0gICAgICBnZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBSSU5ULmdldElkKCksIHByaW50R3JhcGhBY3Rpb24pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZ2V0QWN0aW9uQmFycygpLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwgbnVsbCk7ICAgICAgCi0gICAgICAvLyBhbHdheXMgZW5hYmxlIHByaW50IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBhcmUgb24gc291cmNlIG9yIGRlc2lnbgotICAgICAgdXBkYXRlQWN0aW9uKEFjdGlvbkZhY3RvcnkuUFJJTlQuZ2V0SWQoKSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUFJJTlQsIHRydWUpOwotICAgIH0KLSAgfQotICAgICAgCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKQotICB7Ci0gICAgdXBkYXRlQWN0aW9ucygpOwotICAgIGdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBY3Rpb24oU3RyaW5nIGdsb2JhbEFjdGlvbklkLCBTdHJpbmcgdGV4dEVkaXRvckFjdGlvbklkLCBib29sZWFuIGVuYWJsZSkKLSAgewotICAgIGdldEFjdGlvbkJhcnMoKS5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKGdsb2JhbEFjdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUgPyBnZXRBY3Rpb24odGV4dEVkaXRvciwgdGV4dEVkaXRvckFjdGlvbklkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGFjdGlvbiByZWdpc3RlZCB3aXRoIHRoZSBnaXZlbiB0ZXh0IGVkaXRvci4KLSAgICogQHJldHVybiBJQWN0aW9uIG9yIG51bGwgaWYgZWRpdG9yIGlzIG51bGwuCi0gICAqLwotICBwcm90ZWN0ZWQgSUFjdGlvbiBnZXRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgYWN0aW9uSUQpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gKGVkaXRvciA9PSBudWxsID8gbnVsbCA6IGVkaXRvci5nZXRBY3Rpb24oYWN0aW9uSUQpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgSU1lbnVNYW5hZ2VyIGVkaXRNZW51OwotCi0gIHB1YmxpYyB2b2lkIGFkZFRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpCi0gIHsKLSAgCS8vbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQsIHJlZmFjdG9yTWVudSk7Ci0gICAgZWRpdE1lbnUgPSBtZW51TWFuYWdlci5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0KLSAgICBNZW51TWFuYWdlciB0cmVlTWVudSA9IG5ldyBNZW51TWFuYWdlcihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTUVOVV9YU0RfRURJVE9SIikpOwotICAgIG1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCB0cmVlTWVudSk7Ci0KLSAgICB0cmVlTWVudS5hZGQobmV3IFNlcGFyYXRvcigiZ3JvdXAxIikpOwotLy8gIEFkZCByZXRhcmdldCBhY3Rpb25zCi0KLSAgICB0cmVlTWVudS5hZGQocmV0YXJnZXRSZWxvYWREZXBlbmRlbmNpZXNBY3Rpb24pOwotCi0gICAgdHJlZU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImdyb3VwMiIpKTsKLSAgfQotCi0KLXB1YmxpYyB2b2lkIGFkZFRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpCi0gIHsKLSAgICB0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiWE1MU2NoZW1hLjIiKSk7Ci0vLyAgQWRkIHJldGFyZ2V0IGFjdGlvbnMKLSAgICB0b29sQmFyTWFuYWdlci5hZGQocmV0YXJnZXRSZWxvYWREZXBlbmRlbmNpZXNBY3Rpb24pOwotCi0gICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoIlhNTFNjaGVtYS4xIikpOwotCi0gICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKQotICB7Ci0gICAgYWRkVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpCi0gIHsKLSAgICBhZGRUb01lbnUobWVudU1hbmFnZXIpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikKLSAgewotICAgIHN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCi0gICAgaWYgKHRhcmdldEVkaXRvciBpbnN0YW5jZW9mIFhTREVkaXRvcikKLSAgICB7Ci0gICAgICB4c2RFZGl0b3IgPSAoWFNERWRpdG9yKSB0YXJnZXRFZGl0b3I7Ci0gICAgICByZWxvYWREZXBlbmRlbmNpZXNBY3Rpb24uc2V0RWRpdG9yKChYU0RFZGl0b3IpdGFyZ2V0RWRpdG9yKTsKLQotICAgICAgdGV4dEVkaXRvciA9ICgoWFNERWRpdG9yKXRhcmdldEVkaXRvcikuZ2V0WFNEVGV4dEVkaXRvcigpOwotICAgICAgaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkKLSAgICAgIHsgICAgICAKLSAgICAgIAkgCi0gICAgICAJcmVuYW1lRWxlbWVudEFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElTY2hlbWFFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVUQVJHRVRfUkVOQU1FX0VMRU1FTlRfQUNUSU9OX0lEKSk7Ci0gICAgICAgIHVwZGF0ZUFjdGlvbnMoKTsgIAotICAgICAgICBnZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkKLSAgewotICAgIEl0ZXJhdG9yIGUgPSBmUGFydExpc3RlbmVycy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChlLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwYWdlLmFkZFBhcnRMaXN0ZW5lcigoUmV0YXJnZXRBY3Rpb24pIGUubmV4dCgpKTsKLSAgICB9Ci0KLSAgICAvLyByZWdpc3RlciBhY3Rpb25zIHRoYXQgaGF2ZSBhIGR5bmFtaWMgZWRpdG9yLiAKLQotICAgIGJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJU2NoZW1hRWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFVEFSR0VUX1JFTE9BRF9ERVBFTkRFTkNJRVNfQUNUSU9OX0lELCByZWxvYWREZXBlbmRlbmNpZXNBY3Rpb24pOwotCi0gICAgc3VwZXIuaW5pdChiYXJzLCBwYWdlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTRENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTRENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjA2YjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9YU0RDb250ZW50T3V0bGluZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLk9wZW5TY2hlbWFBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQ29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlCi17Ci0gIHByb3RlY3RlZCBYU0RFZGl0b3IgeHNkRWRpdG9yOwotICBwcm90ZWN0ZWQgaW50IGxldmVsID0gMDsKLSAgcHJvdGVjdGVkIE9iamVjdCBtb2RlbDsKLSAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLSAgcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBYU0RTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXI7Ci0gIHByb3RlY3RlZCBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgc2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotICBwcm90ZWN0ZWQgVHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IG5ldyBUcmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLSAgWFNEVGV4dEVkaXRvciB4c2RUZXh0RWRpdG9yOwotICBYU0RNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyOwotCi0gIC8qKgotICAgKiAgCi0gICAqLwotICBwdWJsaWMgWFNEQ29udGVudE91dGxpbmVQYWdlKFhTRFRleHRFZGl0b3IgeHNkVGV4dEVkaXRvcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy54c2RUZXh0RWRpdG9yID0geHNkVGV4dEVkaXRvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKE9iamVjdCBuZXdNb2RlbCkKLSAgewotICAgIG1vZGVsID0gbmV3TW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50UHJvdmlkZXIoSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotICB9Ci0KLSAgLy8gZXhwb3NlCi0gIHB1YmxpYyBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldFRyZWVWaWV3ZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICBnZXRUcmVlVmlld2VyKCkuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KG1vZGVsKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCIjcG9wdXAiKTsvLyROT04tTkxTLTEkCi0gICAgbWVudU1hbmFnZXIuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotICAgIE1lbnUgbWVudSA9IG1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KGdldFRyZWVWaWV3ZXIoKS5nZXRDb250cm9sKCkpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLSAgICBtZW51TGlzdGVuZXIgPSBuZXcgWFNETWVudUxpc3RlbmVyKHhzZFRleHRFZGl0b3IuZ2V0WFNERWRpdG9yKCkuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLS8vICBtZW51TGlzdGVuZXIuc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0VHJlZVZpZXdlcigpKTsKLSAgICBtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLSAgICAKLSAgICAvLyBlbmFibGUgcG9wdXBNZW51cyBleHRlbnNpb24KLSAgICBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5wb3B1cC5vdXRsaW5lIiwgbWVudU1hbmFnZXIsIHhzZFRleHRFZGl0b3IuZ2V0WFNERWRpdG9yKCkuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAKLSAgICBzZXRTZWxlY3Rpb25NYW5hZ2VyKHhzZFRleHRFZGl0b3IuZ2V0WFNERWRpdG9yKCkuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAvLyBjcy4uLiB3aHkgYXJlIHdlIGRvaW5nIHRoaXMgZnJvbSB0aGUgb3V0bGluZSB2aWV3PwotICAgIC8vCi0gICAgLy94c2RUZXh0RWRpdG9yLmdldFhTREVkaXRvcigpLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3Ci0gICAgLy8gU3RydWN0dXJlZFNlbGVjdGlvbih4c2RUZXh0RWRpdG9yLmdldFhTRFNjaGVtYSgpKSk7Ci0gICAgWFNES2V5TGlzdGVuZXIga2V5TGlzdGVuZXIgPSBuZXcgWFNES2V5TGlzdGVuZXIoZ2V0VHJlZVZpZXdlcigpLCBtZW51TGlzdGVuZXIpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5nZXRDb250cm9sKCkuYWRkS2V5TGlzdGVuZXIoa2V5TGlzdGVuZXIpOwotICAgIC8vIGRyaWxsIGRvd24gZnJvbSBvdXRsaW5lIHZpZXcKLSAgICBnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gaVNlbGVjdGlvbiA9IGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKGlTZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilpU2VsZWN0aW9uOwotICAgICAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqOwotICAgICAgICAgICAgaWYgKGNvbXAuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhzZFRleHRFZGl0b3IuZ2V0WFNERWRpdG9yKCkuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRJbnB1dChvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLSAgY2xhc3MgWFNES2V5TGlzdGVuZXIgZXh0ZW5kcyBLZXlBZGFwdGVyCi0gIHsKLSAgICBUcmVlVmlld2VyIHZpZXdlcjsKLSAgICBYU0RNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyOwotCi0gICAgcHVibGljIFhTREtleUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyLCBYU0RNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICAgIHRoaXMubWVudUxpc3RlbmVyID0gbWVudUxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyI2tleVJlbGVhc2VkKEtleUV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGUuY2hhcmFjdGVyID09IFNXVC5ERUwpCi0gICAgICB7Ci0gICAgICAgIG1lbnVMaXN0ZW5lci5nZXREZWxldGVBY3Rpb24oKS5ydW4oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUua2V5Q29kZSA9PSBTV1QuRjMpIC8vIG9wZW4gZWRpdG9yIG9uIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZS9pbXBvcnQvcmVkZWZpbmUKLSAgICAgIHsKLSAgICAgICAgaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgVHJlZSkKLSAgICAgICAgewotICAgICAgICAgIFRyZWUgdHJlZSA9IChUcmVlKSBlLndpZGdldDsKLSAgICAgICAgICBUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb25bMF0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgY29tcCA9IChYU0RTY2hlbWFEaXJlY3RpdmUpIHNlbGVjdGlvblswXS5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgIE9wZW5TY2hlbWFBY3Rpb24gb3BlblNjaGVtYSA9IG5ldyBPcGVuU2NoZW1hQWN0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fT1BFTl9TQ0hFTUEiKSwgY29tcCk7Ci0gICAgICAgICAgICAgIG9wZW5TY2hlbWEucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXhwYW5kVG9MZXZlbChpbnQgaSkKLSAgewotICAgIGxldmVsID0gaTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRJbnB1dCh2YWx1ZSk7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLmV4cGFuZFRvTGV2ZWwobGV2ZWwpOwotICB9Ci0KLSAgLy8JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgLy8JewotICAvLwkJaWYgKGdldFRyZWVWaWV3ZXIoKSA9PSBudWxsKQotICAvLwkJCXJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICAvLwkJcmV0dXJuIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgLy8JfQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25NYW5hZ2VyKFhTRFNlbGVjdGlvbk1hbmFnZXIgbmV3U2VsZWN0aW9uTWFuYWdlcikKLSAgewotICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKLSAgICAvLyBkaXNjb25uZWN0IGZyb20gb2xkIG9uZQotICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgc2VsZWN0aW9uTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLSAgICAgIHRyZWVWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0gICAgfQotICAgIHNlbGVjdGlvbk1hbmFnZXIgPSBuZXdTZWxlY3Rpb25NYW5hZ2VyOwotICAgIC8vIGNvbm5lY3QgdG8gbmV3IG9uZQotICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgc2VsZWN0aW9uTWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLSAgICAgIHRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0gICAgfQotICB9Ci0gIGNsYXNzIFNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIGlmIChldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpICE9IGdldFRyZWVWaWV3ZXIoKSkKLSAgICAgIHsKLSAgICAgICAgZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGNsYXNzIFRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICBPYmplY3QgbyA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgLy8gVE9ETyAuLi4KLSAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGltcGxlbWVudCBhIHNlbGVjdGlvbk1hbmFnZXJNYXBwaW5nIGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgIC8vIHNvIHRoYXQgZXh0ZW5zaW9ucyBjYW4gc3BlY2lmeSBob3cgdGhleSdkIGxpa2UgdG8gbWFwIHZpZXcgb2JqZWN0cwotICAgICAgICAgIC8vIHRvIHNlbGVjdGlvbiBvYmplY3RzCi0gICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSB4c2RUZXh0RWRpdG9yLmdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoKEVsZW1lbnQpIG8pOwotICAgICAgICAgICAgICBpZiAobW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPSBtb2RlbE9iamVjdDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHRvZG8uLi4gd2UgbmVlZCB0byBlbnN1cmUgd2UgZWxpbWluYXRlIHRoZSBwcm9wYWdhdGlvbiAKLSAgICAgICAgICAgIC8vIG9mICd2aWV3JyBzcGVjaWZpYyBvYmplY3RzIGludG8gdGhlIFNlbGVjdGlvbk1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIHNvbWUgd29yayB0byBlbnN1cmUgYWxsIHZpZXdzIHV0aWxpemUgdGhlICdDYXRlZ29yeScgbW9kZWwgb2JqZWN0ICAKLSAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBnZXQgcmlkIG9mIHRoaXMgQ2F0ZWdvcnlBZGFwdGVyIGNsYXNzLgotLy8gICAgICAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKSBvOwotLy8gICAgICAgICAgICAgbyA9IGFkYXB0ZXIuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0aW9uTWFuYWdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obyksIGdldFRyZWVWaWV3ZXIoKSk7Ci0vLyAgICAgICAgICBzZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChnZXRUcmVlVmlld2VyKCksbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obykpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgc2VsZWN0aW9uTWFuYWdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSwKLSAgICAgICAgICAgIC8vIGdldFRyZWVWaWV3ZXIoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIEZpbHRlckFjdGlvbiByZWZlcmVuY2VBY3Rpb24sIGluaGVyaXRlZEFjdGlvbjsKLQotICBwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpCi0gIHsKLSAgICBzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotICAgIC8vIFVuY29tbWVudCB0byBhZGQgc29ydCBhY3Rpb24KLSAgICAvLyAgICBTb3J0QWN0aW9uIHNvcnRBY3Rpb24gPSBuZXcgU29ydEFjdGlvbigpOwotICAgIC8vCi0gICAgLy8gICAgYWN0aW9uQmFycy5nZXRUb29sQmFyTWFuYWdlcigpLmFkZChzb3J0QWN0aW9uKTsKLSAgICAvLyAgICBzb3J0QWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotICAgIHJlZmVyZW5jZUFjdGlvbiA9IG5ldyBGaWx0ZXJBY3Rpb24obmV3IFJlZmVyZW5jZUZpbHRlcigiUmVmZXJlbmNlIENvbnRlbnQiKSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX09VVExJTkVfU0hPV19SRUZFUkVOQ0VTIiksIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4KLSAgICAgICAgLmdldFBsdWdpbigpLmdldENsYXNzKCksICJpY29ucy9YU0RFbGVtZW50UmVmLmdpZiIpKTsKLSAgICBib29sZWFuIGluaXRpYWxSZWYgPSB4c2RUZXh0RWRpdG9yLmdldFhTRE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRTaG93UmVmZXJlbmNlcygpOwotICAgIHJlZmVyZW5jZUFjdGlvbi5zZXRDaGVja2VkKGluaXRpYWxSZWYpOwotICAgIGluaGVyaXRlZEFjdGlvbiA9IG5ldyBGaWx0ZXJBY3Rpb24obmV3IFJlZmVyZW5jZUZpbHRlcigiSW5oZXJpdGVkIENvbnRlbnQiKSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX09VVExJTkVfU0hPV19JTkhFUklURUQiKSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKQotICAgICAgICAuZ2V0Q2xhc3MoKSwgImljb25zL1hTRENvbXBsZXhDb250ZW50LmdpZiIpKTsKLSAgICBib29sZWFuIGluaXRpYWxJbmhlcml0ZWQgPSB4c2RUZXh0RWRpdG9yLmdldFhTRE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRTaG93UmVmZXJlbmNlcygpOwotICAgIElNZW51TWFuYWdlciBtZW51ID0gYWN0aW9uQmFycy5nZXRNZW51TWFuYWdlcigpOwotICAgIG1lbnUuYWRkKHJlZmVyZW5jZUFjdGlvbik7Ci0gICAgbWVudS5hZGQoaW5oZXJpdGVkQWN0aW9uKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVBY3Rpb25zKEFjdGlvbiBjdXJyZW50KQotICB7Ci0gICAgaWYgKHJlZmVyZW5jZUFjdGlvbi5pc0NoZWNrZWQoKSkKLSAgICB7Ci0gICAgICB4c2RUZXh0RWRpdG9yLmdldFhTRE1vZGVsQWRhcHRlckZhY3RvcnkoKS5zZXRTaG93UmVmZXJlbmNlcyh0cnVlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHhzZFRleHRFZGl0b3IuZ2V0WFNETW9kZWxBZGFwdGVyRmFjdG9yeSgpLnNldFNob3dSZWZlcmVuY2VzKGZhbHNlKTsKLSAgICB9Ci0gICAgaWYgKGluaGVyaXRlZEFjdGlvbi5pc0NoZWNrZWQoKSkKLSAgICB7Ci0gICAgICB4c2RUZXh0RWRpdG9yLmdldFhTRE1vZGVsQWRhcHRlckZhY3RvcnkoKS5zZXRTaG93SW5oZXJpdGVkKHRydWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgeHNkVGV4dEVkaXRvci5nZXRYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuc2V0U2hvd0luaGVyaXRlZChmYWxzZSk7Ci0gICAgfQotICB9Ci0gIHByaXZhdGUgU29ydGVyIHNvcnRlciA9IG5ldyBTb3J0ZXIoKTsKLSAgcHVibGljIGNsYXNzIFNvcnRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyCi0gIHsKLSAgfQotICBwdWJsaWMgY2xhc3MgU29ydEFjdGlvbiBleHRlbmRzIEFjdGlvbgotICB7Ci0gICAgcHVibGljIFNvcnRBY3Rpb24oKQotICAgIHsKLSAgICAgIHN1cGVyKCJTb3J0IiwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRDbGFzcygpLCAiaWNvbnMvc29ydC5naWYiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IGdldFRyZWVWaWV3ZXIoKS5nZXRFeHBhbmRlZEVsZW1lbnRzKCk7Ci0gICAgICBnZXRUcmVlVmlld2VyKCkuc2V0U29ydGVyKGlzQ2hlY2tlZCgpID8gc29ydGVyIDogbnVsbCk7Ci0gICAgICBPYmplY3QgaW5wdXQgPSBnZXRUcmVlVmlld2VyKCkuZ2V0SW5wdXQoKTsKLSAgICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICBnZXRUcmVlVmlld2VyKCkuc2V0RXhwYW5kZWRFbGVtZW50cyhleHBhbmRlZEVsZW1lbnRzKTsKLSAgICAgIGdldFRyZWVWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkKLSAgICB7Ci0gICAgICBzdXBlci5zZXRDaGVja2VkKGNoZWNrZWQpOwotICAgICAgc2V0VG9vbFRpcFRleHQoY2hlY2tlZCA/IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9PVVRMSU5FX0RPX05PVF9TT1JUIikgOiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfT1VUTElORV9TT1JUIikpOwotICAgIH0KLSAgfQotICBwdWJsaWMgY2xhc3MgRmlsdGVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi0gIHsKLSAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyOwotCi0gICAgcHVibGljIEZpbHRlckFjdGlvbihWaWV3ZXJGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgbGFiZWwsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkKLSAgICB7Ci0gICAgICBzdXBlcihsYWJlbCwgaW1hZ2UpOwotICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0gICAgICBzZXRDaGVja2VkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIHVwZGF0ZUFjdGlvbnModGhpcyk7Ci0gICAgICBpZiAoaXNDaGVja2VkKCkpCi0gICAgICB7Ci0gICAgICAgIGdldFRyZWVWaWV3ZXIoKS5yZXNldEZpbHRlcnMoKTsKLSAgICAgICAgZ2V0VHJlZVZpZXdlcigpLmFkZEZpbHRlcihmaWx0ZXIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnZXRUcmVlVmlld2VyKCkucmVtb3ZlRmlsdGVyKGZpbHRlcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGNsYXNzIFJlZmVyZW5jZUZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciAvLyBEdW1teSBmaWx0ZXIKLSAgewotICAgIHB1YmxpYyBSZWZlcmVuY2VGaWx0ZXIoU3RyaW5nIGVsZW1lbnRUYWcpCi0gICAgewotICAgICAgdGhpcy5lbGVtZW50VGFnID0gZWxlbWVudFRhZzsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50VGFnOwotCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNERWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNERWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNjFlZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTREVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZWRpdG9ycy50ZXh0LkphdmFGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5YU0RHcmFwaFZpZXdlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuWFNETW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuT3Blbk9uU2VsZWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotCi0vLyBwdWJsaWMgY2xhc3MgWFNERWRpdG9yIGV4dGVuZHMgU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0Ci1wdWJsaWMgY2xhc3MgWFNERWRpdG9yIGV4dGVuZHMgWFNETXVsdGlQYWdlRWRpdG9yUGFydCBpbXBsZW1lbnRzIElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yCi17Ci0gIHByb3RlY3RlZCBYU0RUZXh0RWRpdG9yIHRleHRFZGl0b3I7Ci0gIElGaWxlIHJlc291cmNlRmlsZTsKLSAgWFNEU2VsZWN0aW9uTWFuYWdlciB4c2RTZWxlY3Rpb25NYW5hZ2VyOwotCi0gIHByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQ7Ci0gIHByaXZhdGUgWE1MTW9kZWxJbXBsIG1vZGVsOwotCi0gIHB1YmxpYyBYU0RFZGl0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB4c2RTZWxlY3Rpb25NYW5hZ2VyID0gbmV3IFhTRFNlbGVjdGlvbk1hbmFnZXIoKTsKLSAgfQotCi0gIEludGVybmFsUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbFBhcnRMaXN0ZW5lcih0aGlzKTsKLSAgCi0gIC8vIHNob3cgb3V0bGluZSB2aWV3IC0gZGVmZWN0IDI2NjExNgotICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5pbml0KHNpdGUsIGVkaXRvcklucHV0KTsKLSAgICAKLSAgICBJV29ya2JlbmNoV2luZG93IGR3PVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSVdvcmtiZW5jaFBhZ2UgcGFnZT1kdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgewotLy8gICAgICBwYWdlLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Db250ZW50T3V0bGluZSIpOwotICAgICAgICBwYWdlLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgCi0gICAgewotLy8gICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9ICAgICAgCi0gICB9Ci0gIAotICAvLyBGb3IgdGVhbSBzdXBwb3J0Ci0gIC8vICBwcm90ZWN0ZWQgUHJvcGVydHlEaXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoaXMgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqIDxwPgotICAgKiBTdWJjbGFzc2VzIG9mIDxjb2RlPk11bHRpUGFnZUVkaXRvcjwvY29kZT4gbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gICAqIDwvcD4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhZ2VzKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICghbG9hZEZpbGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICAvLyBzb3VyY2UgcGFnZSBNVVNUIGJlIGNyZWF0ZWQgYmVmb3JlIGRlc2lnbiBwYWdlLCBub3cKLSAgICAgIGNyZWF0ZVNvdXJjZVBhZ2UoKTsKLQotICAgICAgYWRkU291cmNlUGFnZSgpOwotICAgICAgYnVpbGRYU0RNb2RlbCgpOwotCi0gICAgICAvLyBjb21tZW50IHRoaXMgbGluZSBvdXQgdG8gaGlkZSB0aGUgZ3JhcGggcGFnZSAKLSAgICAgIC8vIAotICAgICAgY3JlYXRlQW5kQWRkR3JhcGhQYWdlKCk7Ci0KLSAgICAgIGludCBwYWdlSW5kZXhUb1Nob3cgPSBnZXREZWZhdWx0UGFnZVR5cGVJbmRleCgpOwotICAgICAgc2V0QWN0aXZlUGFnZShwYWdlSW5kZXhUb1Nob3cpOwotICAgICAgCi0gICAgICBhZGRDb21tYW5kU3RhY2tMaXN0ZW5lcigpOwotICAgICAgCi0gICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmZXJlbmNlU3RvcmVMaXN0ZW5lcik7Ci0gICAgfQotICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKFNTRUNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIkFuX2Vycm9yX2hhc19vY2N1cnJlZF93aGVuMV9FUlJPUl8iKSk7IC8vJE5PTi1OTFMtMSQgPSAiQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBpbnB1dCBmb3IgdGhlIHRoZSBlZGl0b3IncyBzb3VyY2UgcGFnZS4iCi0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFByb3BlcnR5Q2F0ZWdvcmllcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgImdlbmVyYWwiLCAibmFtZXNwYWNlIiwgIm90aGVyIiwgImF0dHJpYnV0ZXMiLCAiZG9jdW1lbnRhdGlvbiIsICJmYWNldHMiIH07IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IjZ2V0Q29udHJpYnV0b3JJZCgpCi0JICovIAotICBwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKQotCXsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yIjsKLSAgICAvL3JldHVybiBnZXRTaXRlKCkuZ2V0SWQoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21tYW5kU3RhY2tMaXN0ZW5lciBjb21tYW5kU3RhY2tMaXN0ZW5lcjsKLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoKQotICB7Ci0gICAgaWYgKGNvbW1hbmRTdGFja0xpc3RlbmVyID09IG51bGwpCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIgPSBnZXRNb2RlbCgpLmdldFVuZG9NYW5hZ2VyKCk7Ci0gICAgICAgIGNvbW1hbmRTdGFja0xpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyI2NvbW1hbmRTdGFja0NoYW5nZWQoRXZlbnRPYmplY3QpCi0gICAgICAgICAgICovCi0gICAgICAgICAgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChFdmVudE9iamVjdCBldmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQmFzaWNDb21tYW5kU3RhY2spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEJhc2ljQ29tbWFuZFN0YWNrIHN0YWNrID0gKEJhc2ljQ29tbWFuZFN0YWNrKSBvYmo7Ci0gICAgICAgICAgICAgIENvbW1hbmQgcmVjZW50Q29tbWFuZCA9IHN0YWNrLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7Ci0gICAgICAgICAgICAgIENvbW1hbmQgcmVkb0NvbW1hbmQgPSBzdGFjay5nZXRSZWRvQ29tbWFuZCgpOwotICAgICAgICAgICAgICBDb21tYW5kIHVuZG9Db21tYW5kID0gc3RhY2suZ2V0VW5kb0NvbW1hbmQoKTsKLSAgICAgICAgICAgICAgaWYgKHJlY2VudENvbW1hbmQgPT0gcmVkb0NvbW1hbmQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB0aGVyZSBtdXN0IGhhdmUgYmVlbiBhbiB1bmRvIHJlc2V0IGluZm8gdGFza3MgCi0gICAgICAgICAgICAgICAgcmVzZXRJbmZvcm1hdGlvblRhc2tzKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLS8vVE9ETyBXVFAgUG9ydCAgICAgICAgdW5kb01hbmFnZXIuZ2V0Q29tbWFuZFN0YWNrKCkuYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotICAgICAgCi0gICAgfQotICB9IAotCi0gIHByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IGFyZykKLSAgewotICAgIHN1cGVyLnBhZ2VDaGFuZ2UoYXJnKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKCkKLSAgewotICAgIGlmIChjb21tYW5kU3RhY2tMaXN0ZW5lciAhPSBudWxsKQotICAgIHsKLSAgICAgIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyID0gZ2V0TW9kZWwoKS5nZXRVbmRvTWFuYWdlcigpOwotLy9UT0RPIFdUUCBQb3J0ICAgICAgdW5kb01hbmFnZXIuZ2V0Q29tbWFuZFN0YWNrKCkucmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIC8vIFRoaXMgaXMgZnJvbSB0aGUgSVZhbGlkYXRlRWRpdEVkaXRvciBpbnRlcmZhY2UKLS8qICBwdWJsaWMgdm9pZCB1bmRvQ2hhbmdlKCkKLSAgewotICAgIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIgPSB0ZXh0RWRpdG9yLmdldE1vZGVsKCkuZ2V0VW5kb01hbmFnZXIoKTsgICAKLSAgICB1bmRvTWFuYWdlci51bmRvKCk7Ci0gICAgLy8gTWFrZSB0aGUgZWRpdG9yIGNsZWFuCi0gICAgdGV4dEVkaXRvci5nZXRNb2RlbCgpLnNldERpcnR5U3RhdGUoZmFsc2UpOwotICB9ICovCi0KLSAgcHJpdmF0ZSBjbGFzcyBQcmVmZXJlbmNlU3RvcmVMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gIHsKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIgPSBuZXcgUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIoKTsKLQotICBwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRQYWdlVHlwZUluZGV4KCkKLSAgewotICAgIGludCBwYWdlSW5kZXggPSBzb3VyY2VQYWdlSW5kZXg7Ci0gICAgCi0gICAgaWYgKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXREZWZhdWx0UGFnZSgpLmVxdWFscyhYU0RFZGl0b3JQbHVnaW4uR1JBUEhfUEFHRSkpCi0gICAgewotICAgICAgaWYgKGdyYXBoUGFnZUluZGV4ICE9IC0xKQotICAgICAgICBwYWdlSW5kZXggPSBncmFwaFBhZ2VJbmRleDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHBhZ2VJbmRleDsKLSAgfQotICAgICAgCi0JaW50IGN1cnJlbnRQYWdlID0gLTE7ICAgICAgCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50UGFnZVR5cGUoKQotCXsKLQkJLy8gc2hvdWxkIHVwZGF0ZSBwcmVmLiBmb3IgdmFsaWQgcGFnZXMKLQkJaWYgKGdldEFjdGl2ZVBhZ2UoKSAhPSAtMSkKLQkJewotCQkJY3VycmVudFBhZ2UgPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCX0KLQkJaWYgKGN1cnJlbnRQYWdlID09IGdyYXBoUGFnZUluZGV4KQotCQl7Ci0JCQlyZXR1cm4gWFNERWRpdG9yUGx1Z2luLkdSQVBIX1BBR0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXR1cm4gWFNERWRpdG9yUGx1Z2luLlNPVVJDRV9QQUdFOwotICAgIH0KLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBY3RpdmVQYXJ0KCkKLSAgewotCQlyZXR1cm4gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7CQotCX0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotLy8gICAgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5kaXNwb3NlKCk7Ci0gICAgcmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIoKTsKLSAgICAKLSAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuc2V0RGVmYXVsdFBhZ2UoZ2V0Q3VycmVudFBhZ2VUeXBlKCkpOwotICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZlcmVuY2VTdG9yZUxpc3RlbmVyKTsKLSAgICAKLSAgICBnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCi0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gbG9hZEZpbGUoKQotICB7Ci0gICAgT2JqZWN0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgewotICAgICAgcmVzb3VyY2VGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEphdmFGaWxlRWRpdG9ySW5wdXQpCi0gICAgewotICAgICAgSVBhdGggcGF0aCA9ICgoSmF2YUZpbGVFZGl0b3JJbnB1dClpbnB1dCkuZ2V0UGF0aChpbnB1dCk7Ci0gICAgICBTdHJpbmcgZXh0ID0gcGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgICBpZiAoZXh0ICE9IG51bGwgJiYgZXh0LmVxdWFscygieHNkIikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotLy8gICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoIiMjI0Vycm9yLi4uWFNERWRpdG9yOjpjcmVhdGVQYWdlcygpIC4uIENhbid0IGZpbmQgaW5wdXQuLkV4aXRpbmcuLiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2Qgb3Blbk9uR2xvYmFsUmVmZXJlbmNlLgotICAgKiBUaGUgY29tcCBhcmd1bWVudCBpcyBhIHJlc29sdmVkIHhzZCBzY2hlbWEgb2JqZWN0IGZyb20gYW5vdGhlciBmaWxlLiAgVGhpcyBpcyBjcmVhdGVkIGFuZCBjYWxsZWQgZnJvbSBhbm90aGVyCi0gICAqIHNjaGVtYSBtb2RlbCB0byBhbGxvdyBGMyBuYXZpZ2F0aW9uIHRvIG9wZW4gYSBuZXcgZWRpdG9yIGFuZCBjaG9vc2UgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IHdpdGhpbiB0aGF0IGVkaXRvciBjb250ZXh0Ci0gICAqIEBwYXJhbSBjb21wCi0gICAqLwotICBwdWJsaWMgdm9pZCBvcGVuT25HbG9iYWxSZWZlcmVuY2UoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCkKLSAgewotICAgIG9wZW5PblNlbGVjdGlvbkhlbHBlci5vcGVuT25HbG9iYWxSZWZlcmVuY2UoY29tcCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBPcGVuT25TZWxlY3Rpb25IZWxwZXIgb3Blbk9uU2VsZWN0aW9uSGVscGVyOwotCi0gIHB1YmxpYyBPcGVuT25TZWxlY3Rpb25IZWxwZXIgZ2V0T3Blbk9uU2VsZWN0aW9uSGVscGVyKCkKLSAgewotICAgIHJldHVybiBvcGVuT25TZWxlY3Rpb25IZWxwZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNETXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVUZXh0RWRpdG9yKCkKLSAgICovCi0gIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBjcmVhdGVUZXh0RWRpdG9yKCkKLSAgewotICAgIHJldHVybiBuZXcgWFNEVGV4dEVkaXRvcih0aGlzKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0I2NyZWF0ZVNvdXJjZVBhZ2UoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuY3JlYXRlU291cmNlUGFnZSgpOwotICAgIAotICAgIHRleHRFZGl0b3IgPSAoWFNEVGV4dEVkaXRvcikgZ2V0VGV4dEVkaXRvcigpOwotCi0JCW9wZW5PblNlbGVjdGlvbkhlbHBlciA9IG5ldyBPcGVuT25TZWxlY3Rpb25IZWxwZXIodGV4dEVkaXRvcik7Ci0gIH0KLSAKLSAgaW50IHNvdXJjZVBhZ2VJbmRleCA9IC0xOwotICAvKioKLSAgICogQWRkcyB0aGUgc291cmNlIHBhZ2Ugb2YgdGhlIG11bHRpLXBhZ2UgZWRpdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU291cmNlUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gIAotICAgIHNvdXJjZVBhZ2VJbmRleCA9IGFkZFBhZ2UodGV4dEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgc2V0UGFnZVRleHQoc291cmNlUGFnZUluZGV4LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVEFCX1NPVVJDRSIpKTsKLQotICAgIC8vIGRlZmVjdCAyMjMwNDMgLi4uIGRvIHRleHRFZGl0b3Iuc2V0TW9kZWwoKSBoZXJlIGluc3RlYWQgb2YgaW4gY3JlYXRlU291cmNlUGFnZSgpCi0JCS8vIHRoZSB1cGRhdGUncyBjcml0aWNhbCwgdG8gZ2V0IHZpZXdlciBzZWxlY3Rpb24gbWFuYWdlciBhbmQgaGlnaGxpZ2h0aW5nIHRvIHdvcmsKLSAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgewotICAgICAgdGV4dEVkaXRvci5zZXRNb2RlbCgoSUZpbGVFZGl0b3JJbnB1dClnZXRFZGl0b3JJbnB1dCgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLS8vICAgICAgdGV4dEVkaXRvci5zZXRNb2RlbChlZGl0b3JJbnB1dCk7Ci0gICAgfQotICAgIHRleHRFZGl0b3IudXBkYXRlKCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX1RJVExFKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgaW50IGdyYXBoUGFnZUluZGV4ID0gLTE7ICAgICAgICAgICAgCi0gIFhTREdyYXBoVmlld2VyIGdyYXBoVmlld2VyOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIHRoZSBncmFwaCBwYWdlIGFuZCBhZGRzIGl0IHRvIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFuZEFkZEdyYXBoUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBncmFwaFZpZXdlciA9IG5ldyBYU0RHcmFwaFZpZXdlcih0aGlzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBncmFwaFZpZXdlci5zZXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICBDb250cm9sIGdyYXBoQ29udHJvbCA9IGdyYXBoVmlld2VyLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOwotICAgIGdyYXBoUGFnZUluZGV4ID0gYWRkUGFnZShncmFwaENvbnRyb2wpOwotICAgIHNldFBhZ2VUZXh0KGdyYXBoUGFnZUluZGV4LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVEFCX0dSQVBIIikpOwotCi0gICAgLy8gZ3JhcGhWaWV3ZXIuc2V0Vmlld2VyU2VsZWN0aW9uTWFuYWdlcih0ZXh0RWRpdG9yLmdldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKSk7ICAgIAotICAgIGdyYXBoVmlld2VyLnNldFNlbGVjdGlvbk1hbmFnZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAKLSAgICAvLyB0aGlzIGZvcmNlcyB0aGUgZWRpdG9yIHRvIGluaXRpYWxseSBzZWxlY3QgdGhlIHRvcCBsZXZlbCBzY2hlbWEgb2JqZWN0Ci0gICAgLy8KLSAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRleHRFZGl0b3IuZ2V0WFNEU2NoZW1hKCkpKTsgICAgCi0gIH0KLQotICAvKgotICAgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoa2V5ID09IElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcykKLSAgICB7Ci0gICAgICByZXN1bHQgPSB4c2RTZWxlY3Rpb25NYW5hZ2VyOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRleHRFZGl0b3IuZ2V0QWRhcHRlcihrZXkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFhTRFNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4geHNkU2VsZWN0aW9uTWFuYWdlcjsKLSAgfQotIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTRE11bHRpUGFnZUVkaXRvclBhcnQjZG9TYXZlQXMoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZG9TYXZlQXMoKQotICB7Ci0gICAgc3VwZXIuZG9TYXZlQXMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICB7Ci0gICAgc3VwZXIuZG9TYXZlKG1vbml0b3IpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotICBwdWJsaWMgdm9pZCByZXBhcnNlU2NoZW1hKCkKLSAgewotICAgIERvY3VtZW50IGRvY3VtZW50ICA9ICgoWE1MTW9kZWwpZ2V0TW9kZWwoKSkuZ2V0RG9jdW1lbnQoKTsKLSAgICBjcmVhdGVTY2hlbWEoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICB9Ci0gIAotICBwdWJsaWMgWFNEU2NoZW1hIGNyZWF0ZVNjaGVtYShOb2RlIG5vZGUpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBFUGFja2FnZS5SZWdpc3RyeSByZWcgPSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRTsgCi0gICAgICBYU0RQYWNrYWdlIHhzZFBhY2thZ2UgPSAoWFNEUGFja2FnZSlyZWcuZ2V0RVBhY2thZ2UoWFNEUGFja2FnZS5lTlNfVVJJKTsKLSAgICAgIHhzZFNjaGVtYSA9IHhzZFBhY2thZ2UuZ2V0WFNERmFjdG9yeSgpLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgICAgCi0gICAgICAvLyBGb3JjZSB0aGUgbG9hZGluZyBvZiB0aGUgIm1ldGEiIHNjaGVtYSBmb3Igc2NoZW1hIGluc3RhbmNlIGluc3RhbmNlLgotICAgICAgLy8KLSAgICAgIFN0cmluZyBzY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UgPSBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoc2NoZW1hRm9yU2NoZW1hTmFtZXNwYWNlKTsKLQotICAgICAgcmVzb3VyY2VTZXQgPSBYU0RTY2hlbWFJbXBsLmNyZWF0ZVJlc291cmNlU2V0KCk7Ci0gICAgICByZXNvdXJjZVNldC5zZXRVUklDb252ZXJ0ZXIobmV3IFhTRFVSSUNvbnZlcnRlcihyZXNvdXJjZUZpbGUpKTsKLQotICAgICAgU3RyaW5nIHBhdGhOYW1lID0gIiI7Ci0gICAgICAvLyBJZiB0aGUgcmVzb3VyY2UgaXMgaW4gdGhlIHdvcmtzcGFjZS4uLi4KLSAgICAgIC8vIG90aGVyd2lzZSB0aGUgdXNlciBpcyB0cnlpbmcgdG8gb3BlbiBhbiBleHRlcm5hbCBmaWxlCi0gICAgICBpZiAocmVzb3VyY2VGaWxlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHBhdGhOYW1lID0gcmVzb3VyY2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShwYXRoTmFtZSksIHRydWUpOwotLy8gICAgICByZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZCh4c2RTY2hlbWEpOwotICAgICAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotICAgICAgCi0gICAgICAgIE9iamVjdCBvYmogPSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpb2JqOwotICAgICAgICB9Ci0KLS8vICAgICAgVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpOwotLy8gICAgICByZXNvdXJjZVNldC5zZXRVUklDb252ZXJ0ZXIobmV3IFhTRFVSSUNvbnZlcnRlcihyZXNvdXJjZUZpbGUpKTsKLSAKLSAgICAgICAgeHNkU2NoZW1hLnNldEVsZW1lbnQoKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgIHJlc291cmNlLnNldE1vZGlmaWVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgeHNkU2NoZW1hLnNldEVsZW1lbnQoKEVsZW1lbnQpbm9kZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkKLSAgICB7Ci0vLyAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiU3RhY2sgb3ZlcmZsb3cgZW5jb3VudGVyZWQuICBQb3NzaWJseSBhbiBpbnZhbGlkIHJlY3Vyc2l2ZSBjaXJjdWxhciBzY2hlbWEiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0vLyAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0KLSAgY2xhc3MgWFNERG9jdW1lbnRBZGFwdGVyIGV4dGVuZHMgRG9jdW1lbnRBZGFwdGVyCi0gIHsKLSAgCUlOb2RlTm90aWZpZXIgY3VycmVudE5vdGlmaWVyOwotICAJaW50IGN1cnJlbnRFdmVudFR5cGU7Ci0gIAkKLQkJcHVibGljIFhTRERvY3VtZW50QWRhcHRlcihEb2N1bWVudCBkb2N1bWVudCkKLQkJewotCQkJc3VwZXIoZG9jdW1lbnQpOwotCQl9Ci0KLQkJYm9vbGVhbiBoYW5kbGluZ05vdGlmeUNoYW5nZWQgPSBmYWxzZTsKLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotCQl7Ci0JCQlpZiAoIWhhbmRsaW5nTm90aWZ5Q2hhbmdlZCkKLQkJCXsKLQkJCQloYW5kbGluZ05vdGlmeUNoYW5nZWQgPSB0cnVlOwotCQkJCXRyeQotCQkJCXsKLQkJCQkJLy8gZGVsYXkgaGFuZGxlIGV2ZW50cyBvbmx5IGluIHRoZSBzb3VyY2UgdmlldwotCQkJCQlpZiAoZ2V0Q3VycmVudFBhZ2VUeXBlKCkgPT0gWFNERWRpdG9yUGx1Z2luLlNPVVJDRV9QQUdFICYmCi0JCQkJCQkJIShnZXRBY3RpdmVQYXJ0KCkgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSAmJiAKLQkJCQkJCQkhKGdldEFjdGl2ZVBhcnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lKSkgewotCQkJCQkJc3RhcnREZWxheWVkRXZlbnQobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSAvLyBhbGwgb3RoZXIgdmlld3MsIGp1c3QgaGFuZGxlIHRoZSBldmVudHMgcmlnaHQgYXdheQotCQkJCQl7Ci0JCQkJCQloYW5kbGVOb3RpZnlDaGFuZ2Uobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJCXsKLS8vCQkJCQlYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoZSk7Ci0JCQkJfQotCQkJCWhhbmRsaW5nTm90aWZ5Q2hhbmdlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlTm90aWZ5Q2hhbmdlKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotCQl7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbihldmVudFR5cGUgKyAiIDogSGFuZGxlTm90aWZ5Q2hhbmdlICIgKyBub3RpZmllci5oYXNoQ29kZSgpICsgIiBub3RpZmllciAiICsgbm90aWZpZXIpOwotCQkJc3dpdGNoIChldmVudFR5cGUpCi0JCQl7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkFERDoKLQkJCQl7Ci0JCQkJCWlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJCXsKLQkJCQkJCWFkYXB0KChFbGVtZW50KW5ld1ZhbHVlKTsKLS8vCUFkZAkJCXVwZGF0ZVBhcmVudEZvckRlcml2YXRpb24obm9kZSwgbGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLSAgICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLlJFTU9WRToKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKW5vdGlmaWVyOwotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGxpc3RlbmVyID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0gICAgICAgICAKLSAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gd2Ugd2FudCB0byByZXNldCB0aGUgc2NoZW1hJ3MgZXh0ZXJuYWwgZWxlbWVudHMgd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGRlbGV0ZWQKLSAgICAgICAgICAgIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpZmVhdHVyZTsKLSAgICAgICAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtLCBYU0RDb25zdGFudHMuSU5DTFVERV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbSwgWFNEQ29uc3RhbnRzLklNUE9SVF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbSwgWFNEQ29uc3RhbnRzLlJFREVGSU5FX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEucmVzZXQoKTsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEudXBkYXRlKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkNIQU5HRToKLQkJCQl7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKW5vdGlmaWVyOwotCQkJICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGxpc3RlbmVyID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0gICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICB7Ci0gIAkJICAgICAgbGlzdGVuZXIuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKChFbGVtZW50KW5vZGUpOwotICAgIAkgICAgICBsaXN0ZW5lci5lbGVtZW50Q2hhbmdlZCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0ZW5lci5lbGVtZW50QXR0cmlidXRlc0NoYW5nZWQoKChEb2N1bWVudClub2RlKS5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICBsaXN0ZW5lci5lbGVtZW50Q2hhbmdlZCgoKERvY3VtZW50KW5vZGUpLmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgCSAgICBicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEOgotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQ6Ci0JCQkJewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSlub3RpZmllcjsKLQkJCQkJWFNEQ29uY3JldGVDb21wb25lbnQgbGlzdGVuZXIgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChub2RlKTsKLSAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQl7Ci0JCQkJCQlsaXN0ZW5lci5lbGVtZW50Q29udGVudHNDaGFuZ2VkKChFbGVtZW50KW5vZGUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJewotCQkJCQkJRWxlbWVudCBkb2NFbGVtZW50ID0gKChEb2N1bWVudClub2RlKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQkJCS8vIE5lZWQgdG8gYWRkIGNoZWNrIGlmIGRvYyBlbGVtZW50IGlzIGJlaW5nIGVkaXRlZCBpbiB0aGUgc291cmNlCi0JCQkJCQlpZiAoZG9jRWxlbWVudCAhPSBudWxsKQotCQkJCQkgIHsKLQkJCQkJCSAgU3RyaW5nIHByZWZpeCA9IGRvY0VsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JCQkJCQkgIFN0cmluZyB4bWxuc1N0cmluZyA9IHByZWZpeCA9PSBudWxsPyAieG1sbnMiIDogInhtbG5zOiIgKyBwcmVmaXg7Ci0JCQkJCQkgIEF0dHIgYXR0ciA9IGRvY0VsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSh4bWxuc1N0cmluZyk7Ci0JCQkJCQkgIGJvb2xlYW4gZG9QYXJzZSA9IGZhbHNlOwotCQkJCQkJICBpZiAoYXR0ciAhPSBudWxsKQotCQkJCQkJICB7Ci0JCQkJCQkgICAgaWYgKGF0dHIuZ2V0VmFsdWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSAmJiBkb2NFbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscygic2NoZW1hIikpCi0JCQkJCQkgICAgewotCQkJCQkJICAgICAgLy8gV2UgaGF2ZSBhIHZpYWJsZSBzY2hlbWEgc28gcGFyc2UgaXQKLQkJCQkJCSAgICAgIGRvUGFyc2UgPSB0cnVlOwotCQkJCQkJICAgIH0KLQkJCQkJCSAgfQotCQkJCQkJICAKLQkJCQkJCQlpZiAoZG9QYXJzZSkKLQkJCQkJCQl7Ci0JCQkJCSAgICAgIGFkYXB0KGRvY0VsZW1lbnQpOwotIAkJCQkJCSAgICB4c2RTY2hlbWEuc2V0RWxlbWVudChkb2NFbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCSAgfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBEZWxheWVkRXZlbnQgZGVsYXllZFRhc2s7Ci0JCXByb3RlY3RlZCB2b2lkIHN0YXJ0RGVsYXllZEV2ZW50KElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotCQl7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigic3RhcnQgZGVsYXllZCBldmVudCIpOwotICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGRlbGF5ZWQgdGFzayBmb3IgdGhlIHNhbWUgbm90aWZpZXIgYW5kIGV2ZW50VHlwZQotLy8JCQlpZiAoZGVsYXllZFRhc2sgIT0gbnVsbCkKLS8vCQkJewotLy8gIAkJCU5vdGlmaWVyIGFOb3RpZmllciA9IGRlbGF5ZWRUYXNrLmdldE5vdGlmaWVyKCk7Ci0vLwkgIAkJaW50IGFuRXZlbnRUeXBlID0gZGVsYXllZFRhc2suZ2V0RXZlbnRUeXBlKCk7Ci0vLyAgCQkJaWYgKG5vdGlmaWVyID09IGFOb3RpZmllciAmJiBhbkV2ZW50VHlwZSA9PSBldmVudFR5cGUpCi0vLwkJCSAgewotLy8JCQkJICAvLyBzYW1lIGV2ZW50LCBqdXN0IGRpZmZlcmVudCBkYXRhLCBkZWxheSBuZXcgZXZlbnQKLS8vCQkJCSAgZGVsYXllZFRhc2suc2V0Q2FuY2VsKHRydWUpOwotLy8JCQkgIH0KLS8vCQkJfQotCi0JCQlkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLQotCQkJZGVsYXllZFRhc2suc2V0Tm90aWZpZXIobm90aWZpZXIpOwotCQkJZGVsYXllZFRhc2suc2V0RXZlbnRUeXBlKGV2ZW50VHlwZSk7Ci0JCQlkZWxheWVkVGFzay5zZXRGZWF0dXJlKGZlYXR1cmUpOwotCQkJZGVsYXllZFRhc2suc2V0T2xkVmFsdWUob2xkVmFsdWUpOwotCQkJZGVsYXllZFRhc2suc2V0TmV3VmFsdWUobmV3VmFsdWUpOwotCQkJZGVsYXllZFRhc2suc2V0SW5kZXgoaW5kZXgpOwotCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNDAwLGRlbGF5ZWRUYXNrKTsKLQkJfQotCi0JCWNsYXNzIERlbGF5ZWRFdmVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlCi0JCXsKLQkJICBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyOwotCQkJaW50IGV2ZW50VHlwZTsKLQkJCU9iamVjdCBmZWF0dXJlOwotCQkJT2JqZWN0IG9sZFZhbHVlOwotCQkJT2JqZWN0IG5ld1ZhbHVlOwotCQkJaW50IGluZGV4OwotCQkJYm9vbGVhbiBjYW5jZWxFdmVudCA9IGZhbHNlOwotCi0JCQkvKgotCQkJICogQHNlZSBSdW5uYWJsZSNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJewotCQkJCWlmICghY2FuY2VsRXZlbnQpCi0JCQkJewotCQkJCSAgaGFuZGxlTm90aWZ5Q2hhbmdlKG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotCQkJCSAgaWYgKGRlbGF5ZWRUYXNrID09IHRoaXMpCi0JCQkJICB7Ci0JCQkJICAJZGVsYXllZFRhc2sgPSBudWxsOwotCQkJCSAgfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgc2V0Q2FuY2VsKGJvb2xlYW4gZmxhZykKLQkJCXsKLQkJCQljYW5jZWxFdmVudCA9IGZsYWc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldE5vdGlmaWVyKElOb2RlTm90aWZpZXIgbm90aWZpZXIpCi0JCQl7Ci0JCQkJdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHNldEV2ZW50VHlwZShpbnQgZXZlbnRUeXBlKQotCQkJewotCQkJCXRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKE9iamVjdCBmZWF0dXJlKQotCQkJewotCQkJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldE9sZFZhbHVlKE9iamVjdCBvbGRWYWx1ZSkKLQkJCXsKLQkJCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7CQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldE5ld1ZhbHVlKE9iamVjdCBuZXdWYWx1ZSkKLQkJCXsKLQkJCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpbmRleCkKLQkJCXsKLQkJCQl0aGlzLmluZGV4ID0gaW5kZXg7CQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyBJTm9kZU5vdGlmaWVyIGdldE5vdGlmaWVyKCkKLQkJCXsKLQkJCQlyZXR1cm4gbm90aWZpZXI7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkKLQkJCXsKLQkJCQlyZXR1cm4gZXZlbnRUeXBlOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKCkKLQkJCXsKLQkJCQlyZXR1cm4gbmV3VmFsdWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0T2xkVmFsdWUoKQotCQkJewotCQkJCXJldHVybiBvbGRWYWx1ZTsKLQkJCX0KLQotCQl9Ci0gIH0KLQotICBhYnN0cmFjdCBjbGFzcyBEb2N1bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLSAgewotICAgIHB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgewotICAgICAgKChJTm9kZU5vdGlmaWVyKWRvY3VtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotICAgICAgYWRhcHQoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkYXB0KEVsZW1lbnQgZWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoKChJTm9kZU5vdGlmaWVyKWVsZW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcih0aGlzKSA9PSBudWxsKQotICAgICAgewotCi0gICAgICAgICgoSU5vZGVOb3RpZmllcillbGVtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotCi0gICAgICAgIGZvciAoTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhZGFwdCgoRWxlbWVudCljaGlsZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSB0aGlzOwotICAgIH0KLQotICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQKLSAgICAgIChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBNZXRob2QgY3JlYXRlRGVmYXVsdFNjaGVtYU5vZGUuICBTaG91bGQgb25seSBiZSBjYWxsZWQgdG8gaW5zZXJ0IGEgc2NoZW1hIG5vZGUgaW50byBhbiBlbXB0eSBkb2N1bWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFNjaGVtYU5vZGUoKQotICB7Ci0gICAgRG9jdW1lbnQgZG9jdW1lbnQgID0gKChYTUxNb2RlbClnZXRNb2RlbCgpKS5nZXREb2N1bWVudCgpOwotICAgIGlmIChkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICAvLyBpZiBpdCBpcyBhIGNvbXBsZXRlbHkgZW1wdHkgZmlsZSwgdGhlbiBhZGQgdGhlIGVuY29kaW5nIGFuZCB2ZXJzaW9uIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLS8vVE9ETyAgU3RyaW5nIGVuY29kaW5nID0gRW5jb2RpbmdIZWxwZXIuZ2V0RGVmYXVsdEVuY29kaW5nVGFnKCk7Ci0gICAgICBTdHJpbmcgZW5jb2RpbmcgPSAiVVRGLTgiOwotICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGluc3RyID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCAidmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGVuY29kaW5nICsgIlwiIik7Ci0gICAgICBkb2N1bWVudC5hcHBlbmRDaGlsZChpbnN0cik7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIGEgZGVmYXVsdCBzY2hlbWEgdGFnIG5vdwotCi0gICAgLy8gU3RyaW5nIGRlZmF1bHRQcmVmaXhGb3JUYXJnZXROYW1lc3BhY2UgPSBnZXRGaWxlUmVzb3VyY2UoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0gICAgU3RyaW5nIGRlZmF1bHRQcmVmaXhGb3JUYXJnZXROYW1lc3BhY2UgPSAidG5zIjsKLSAgICBTdHJpbmcgcHJlZml4Rm9yU2NoZW1hTmFtZXNwYWNlID0gIiI7Ci0gICAgU3RyaW5nIHNjaGVtYU5hbWVzcGFjZUF0dHJpYnV0ZSA9ICJ4bWxucyI7Ci0gICAgaWYgKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5pc1F1YWxpZnlYTUxTY2hlbWFMYW5ndWFnZSgpKQotICAgIHsKLSAgICAgIC8vIEFkZGVkIHRoaXMgaWYgY2hlY2sgYmVmb3JlIGRpc2FsbG93aW5nIGJsYW5rIHByZWZpeGVzIGluIHRoZSBwcmVmZXJlbmNlcy4uLgotICAgICAgLy8gQ2FuIHRha2UgdGhpcyBvdXQuICBTZWUgYWxzbyBOZXdYU0RXaXphcmQKLSAgICAgIGlmIChYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hUHJlZml4KCkudHJpbSgpLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4Rm9yU2NoZW1hTmFtZXNwYWNlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhNTFNjaGVtYVByZWZpeCgpICsgIjoiOwotICAgICAgICBzY2hlbWFOYW1lc3BhY2VBdHRyaWJ1dGUgKz0gIjoiICsgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhNTFNjaGVtYVByZWZpeCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBkb2N1bWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChwcmVmaXhGb3JTY2hlbWFOYW1lc3BhY2UgKyBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHKTsKLSAgICAKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShzY2hlbWFOYW1lc3BhY2VBdHRyaWJ1dGUsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgCi0gICAgU3RyaW5nIGRlZmF1bHRUYXJnZXRVUkkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUsIGRlZmF1bHRUYXJnZXRVUkkpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgZGVmYXVsdFByZWZpeEZvclRhcmdldE5hbWVzcGFjZSwgZGVmYXVsdFRhcmdldFVSSSk7Ci0gICAgCi0gICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGJ1aWxkWFNETW9kZWwoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgID0gKChYTUxNb2RlbClnZXRNb2RlbCgpKS5nZXREb2N1bWVudCgpOwotICAgICAgaWYgKGRvY3VtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICAvLyB0aGlzIGlzIGFuIGVtcHR5IGRvY3VtZW50LiAgQ3JlYXRlIGEgZGVmYXVsdCBzY2hlbWEgdGFnIG5vdwotICAgICAgICBjcmVhdGVEZWZhdWx0U2NoZW1hTm9kZSgpOwotICAgICAgfQotCi0gICAgICBjcmVhdGVTY2hlbWEoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCi0JCQlYU0REb2N1bWVudEFkYXB0ZXIgZG9jdW1lbnRBZGFwdGVyID0KLQkJCQluZXcgWFNERG9jdW1lbnRBZGFwdGVyKCgoWE1MTW9kZWwpZ2V0TW9kZWwoKSkuZ2V0RG9jdW1lbnQoKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0vLyAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRmFpbGVkIHRvIGNyZWF0ZSBNb2RlbCIpOwotLy8gICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoZSk7Ci0vLyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0KLQotLy8gICAgICBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsLnZhbGlkYXRlKHhzZFNjaGVtYSwgaW5wdXQuZ2V0RmlsZSgpLmdldENvbnRlbnRzKHRydWUpKTsKLSAgfQotCi0vLyAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhcmVudEZvckRlcml2YXRpb24oTm9kZSBub2RlLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb3JyZXNwb25kaW5nQ29tcG9uZW50KQotLy8gIHsKLS8vICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMobm9kZSwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKXx8Ci0vLyAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKG5vZGUsWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLGZhbHNlKSkKLS8vICAgIHsKLS8vICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9Ci0vLyAgICAgICAgY29ycmVzcG9uZGluZ0NvbXBvbmVudC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiA/IAotLy8gICAgICAgICAgKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiljb3JyZXNwb25kaW5nQ29tcG9uZW50LmdldENvbnRhaW5lcigpIDoKLS8vICAgICAgICAgIG51bGw7Ci0vLyAgICAgIGlmICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24gIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAgIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5lbGVtZW50Q29udGVudHNDaGFuZ2VkKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfSAgICAKLQotLy8gIHByaXZhdGUgdm9pZCBjaGVja1VuaW9uKE5vZGUgbm9kZSwgWFNEQ29uY3JldGVDb21wb25lbnQgY29ycmVzcG9uZGluZ0NvbXBvbmVudCwgaW50IGkpCi0vLyAgewotLy8gICAgLy8gYnVnIDIxOTk2NyAtIHVuaW9uIGNoYW5nZXMgdG8gcmVzdHJpY3Rpb24KLS8vICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMobm9kZSwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICB7Ci0vLy8vICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IGNvcnJlc3BvbmRpbmdDb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0vLy8vICAgICAgaWYgKGNvbXAgIT0gbnVsbCkKLS8vLy8gICAgICB7Ci0vLy8vICAgICAgICBzd2l0Y2ggKGkpCi0vLy8vICAgICAgICB7Ci0vLy8vICAgICAgICAgIGNhc2UgMToKLS8vLy8gICAgICAgICAgICBjb21wLmVsZW1lbnRBdHRyaWJ1dGVzQ2hhbmdlZCgoRWxlbWVudClub2RlKTsKLS8vLy8gICAgICAgICAgICBicmVhazsKLS8vLy8gICAgICAgICAgY2FzZSA0OgotLy8vLyAgICAgICAgICAgIGNvbXAuZWxlbWVudENvbnRlbnRzQ2hhbmdlZCgoRWxlbWVudClub2RlKTsKLS8vLy8gICAgICAgICAgICBicmVhazsKLS8vLy8gICAgICAgIH0KLS8vLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICB7Ci0vLyAgICAgIHN3aXRjaCAoaSkKLS8vICAgICAgewotLy8gICAgICAgIGNhc2UgMToKLS8vICAgICAgICBjYXNlIDQ6Ci0vLyAgICAgICAgICAvLyBkbyBib3RoIHR5cGVzIG9mIHVwZGF0ZXMgc2luY2Ugc29tZXRpbWVzIHRoZSBhdHRyaWJ1dGVzIGhhdmUgY2hhbmdlZCBpbmRpcmVjdGx5Ci0vLyAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb250ZW50IGhhcyBjaGFuZ2VkCi0vLyAgICAgICAgICBjb3JyZXNwb25kaW5nQ29tcG9uZW50LmVsZW1lbnRBdHRyaWJ1dGVzQ2hhbmdlZCgoRWxlbWVudClub2RlKTsKLS8vICAgICAgICAgIGNvcnJlc3BvbmRpbmdDb21wb25lbnQuZWxlbWVudENvbnRlbnRzQ2hhbmdlZCgoRWxlbWVudClub2RlKTsKLS8vICAgICAgICAgIGJyZWFrOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotICAKLS8vICBwcml2YXRlIHZvaWQgdXBkYXRlTWFwKFhTRENvbmNyZXRlQ29tcG9uZW50IGxpc3RlbmVyLCBFbGVtZW50IGRvY3VtZW50RWxlbWVudCkKLS8vICB7Ci0vLyAgICBib29sZWFuIGhhbmRsZUNoYW5nZUluU2NoZW1hID0gZmFsc2U7Ci0vLyAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0vLyAgICB7Ci0vLyAgICAgIGlmICghaGFuZGxlQ2hhbmdlSW5TY2hlbWEpCi0vLyAgICAgIHsKLS8vICAgICAgICBoYW5kbGVDaGFuZ2VJblNjaGVtYSA9IHRydWU7Ci0vLyAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpbGlzdGVuZXI7Ci0vLyAgICAgICAgamF2YS51dGlsLk1hcCBwcmVmaXhUb05hbWVTcGFjZU1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0vLyAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLS8vLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGFyZ2V0TmFtZXNwYWNlID0gIiArIHRhcmdldE5hbWVzcGFjZSk7Ci0vLwotLy8gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLS8vICAgICAgICBpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLS8vICAgICAgICAKLS8vICAgICAgICBBcnJheUxpc3Qga2V5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgICBrZXlMaXN0LmFkZEFsbChwcmVmaXhUb05hbWVTcGFjZU1hcC5rZXlTZXQoKSk7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgU3RyaW5nIGtleTsKLS8vCi0vLwotLy8gICAgICAgIC8vIHVwZGF0ZSB0aGUgbWFwIHdoZW4gdGhlIHByZWZpeCBpcyBjaGFuZ2VkCi0vLyAgICAgICAgQ0hFQ0s6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0vLyAgICAgICAgewotLy8gICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpYXR0cmlidXRlcy5pdGVtKGkpOwotLy8gICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5vZGVOYW1lKCk7Ci0vLyAgICAgICAgICAKLS8vICAgICAgICAgIGlmIChpc1ZhbGlkWE1MTlNBdHRyaWJ1dGUobmFtZSkpCi0vLy8vICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInhtbG5zIikpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0Tm9kZVZhbHVlKCk7Ci0vLyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgYnJlYWsgQ0hFQ0s7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7Ci0vLyAgICAgICAgICAgIGtleSAgPSBpbmRleCA9PSAtMSA/IG51bGwgOiBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotLy8vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIEF0dHJpYnV0ZSBrZXkgaXMgIiArIGtleSArICIgLCB2YWx1ZSA9ICIgKyB2YWx1ZSk7Ci0vLy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBtYXAuZ2V0KGtleSkgPSAiICsgcHJlZml4VG9OYW1lU3BhY2VNYXAuZ2V0KGtleSkpOwotLy8gICAgICAgICAgICBpZiAoIXByZWZpeFRvTmFtZVNwYWNlTWFwLmNvbnRhaW5zS2V5KGtleSkpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgU3RyaW5nIGFQcmVmaXggPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotLy8vLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtLT4gQSBNYXAgUHJlZml4IGlzICIgKyBhUHJlZml4KTsKLS8vLy8gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLS0+IG1vZGVsIG1hcC5nZXQocHJlZml4KSAiICsgcHJlZml4VG9OYW1lU3BhY2VNYXAuZ2V0KGFQcmVmaXgpKTsKLS8vICAgICAgICAgICAgICAgIGlmIChwcmVmaXhUb05hbWVTcGFjZU1hcC5nZXQoYVByZWZpeCkgIT0gbnVsbCkKLS8vICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeFRvTmFtZVNwYWNlTWFwLmdldChhUHJlZml4KS5lcXVhbHModmFsdWUpKQotLy8gICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgcHJlZml4VG9OYW1lU3BhY2VNYXAucmVtb3ZlKGFQcmVmaXgpOwotLy8gICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIGVsc2UgaWYgKHByZWZpeFRvTmFtZVNwYWNlTWFwLmNvbnRhaW5zS2V5KGtleSkpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBpZiAocHJlZml4VG9OYW1lU3BhY2VNYXAuZ2V0KGtleSkgIT0gbnVsbCkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIXByZWZpeFRvTmFtZVNwYWNlTWFwLmdldChrZXkpLmVxdWFscyh2YWx1ZSkpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgIFNldCBlbnRyeVNldCA9IHByZWZpeFRvTmFtZVNwYWNlTWFwLmVudHJ5U2V0KCk7Ci0vLyAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0vLyAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgYU1hcEVudHJ5ID0gKE1hcC5FbnRyeSlpdGVyLm5leHQoKTsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAoICAoa2V5ICE9IG51bGwgJiYgKGFNYXBFbnRyeS5nZXRLZXkoKSAhPSBudWxsICYmIGFNYXBFbnRyeS5nZXRLZXkoKS5lcXVhbHMoa2V5KSkpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChrZXkgPT0gbnVsbCAmJiAoYU1hcEVudHJ5LmdldEtleSgpID09IG51bGwpKSkKLS8vICAgICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBhTWFwRW50cnkuc2V0VmFsdWUodmFsdWUpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgU2V0IGVudHJ5U2V0ID0gcHJlZml4VG9OYW1lU3BhY2VNYXAuZW50cnlTZXQoKTsKLS8vICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBhTWFwRW50cnkgPSAoTWFwLkVudHJ5KWl0ZXIubmV4dCgpOwotLy8gICAgICAgICAgICAgICAgICBpZiAoICAoa2V5ICE9IG51bGwgJiYgKGFNYXBFbnRyeS5nZXRLZXkoKSAhPSBudWxsICYmIGFNYXBFbnRyeS5nZXRLZXkoKS5lcXVhbHMoa2V5KSkpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2V5ID09IG51bGwgJiYgKGFNYXBFbnRyeS5nZXRLZXkoKSA9PSBudWxsKSkpCi0vLyAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICBhTWFwRW50cnkuc2V0VmFsdWUodmFsdWUpOwotLy8gICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIAotLy8gICAgICAgIGJvb2xlYW4gbW9kZWxNYXBQcmVmaXhGb3VuZCA9IGZhbHNlOwotLy8gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGtleUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBTdHJpbmcgYVByZWZpeCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0vLyAgICAgICAgICBtb2RlbE1hcFByZWZpeEZvdW5kID0gZmFsc2U7Ci0vLyAgICAgICAgICBhdHRyaWJ1dGVzID0gZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLS8vICAgICAgICAgIGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0vLwotLy8gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpYXR0cmlidXRlcy5pdGVtKGkpOwotLy8gICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5vZGVOYW1lKCk7Ci0vLyAgICAgICAgICAgIAotLy8gICAgICAgICAgICAgIC8vIGlmIChuYW1lLnN0YXJ0c1dpdGgoInhtbG5zIikpCi0vLyAgICAgICAgICAgICAgaWYgKGlzVmFsaWRYTUxOU0F0dHJpYnV0ZShuYW1lKSkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotLy8gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7Ci0vLyAgICAgICAgICAgICAgICBrZXkgID0gaW5kZXggPT0gLTEgPyBudWxsIDogbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLS8vICAgICAgICAgICAgICAgIGlmIChhUHJlZml4ID09IG51bGwgJiYga2V5ID09IG51bGwpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgIG1vZGVsTWFwUHJlZml4Rm91bmQgPSB0cnVlOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgZWxzZSBpZiAoYVByZWZpeCAhPSBudWxsICYmIChhUHJlZml4LmVxdWFscyhrZXkpKSkKLS8vICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgbW9kZWxNYXBQcmVmaXhGb3VuZCA9IHRydWU7Ci0vLyAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4VG9OYW1lU3BhY2VNYXAuZ2V0KGtleSkgIT0gbnVsbCAmJiAhcHJlZml4VG9OYW1lU3BhY2VNYXAuZ2V0KGtleSkuZXF1YWxzKHZhbHVlKSkKLS8vICAgICAgICAgICAgICAgICAgICAgICB8fCAocHJlZml4VG9OYW1lU3BhY2VNYXAuZ2V0KGtleSkgPT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSkKLS8vICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkKLS8vICAgICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhUb05hbWVTcGFjZU1hcC5wdXQoYVByZWZpeCwgdmFsdWUpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5ICE9IG51bGwgJiYgKGtleS5lcXVhbHMoYVByZWZpeCkpKQotLy8gICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICBtb2RlbE1hcFByZWZpeEZvdW5kID0gdHJ1ZTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGlmICghbW9kZWxNYXBQcmVmaXhGb3VuZCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcHJlZml4VG9OYW1lU3BhY2VNYXAucmVtb3ZlKGFQcmVmaXgpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgIAotLy8gICAgICAgIC8vIHRvIGVuc3VyZSBtYXAgaXMgcmVjcmVhdGVkCi0vLy8vICAgICAgICBYU0RTY2hlbWFIZWxwZXIudXBkYXRlRWxlbWVudCh4c2RTY2hlbWEpOyAgICAgICAgCi0vLy8vICAgICAgICByZXBhcnNlU2NoZW1hKCk7Ci0vLwotLy8gICAgICAgIGhhbmRsZUNoYW5nZUluU2NoZW1hID0gZmFsc2U7Ci0vLwotLy8vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJYU0RlZGl0b3IgTWFwIGlzICIgKyBwcmVmaXhUb05hbWVTcGFjZU1hcC52YWx1ZXMoKSk7Ci0vLy8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlhTRGVkaXRvciBNYXAga2V5cyBhcmUgIiArIHByZWZpeFRvTmFtZVNwYWNlTWFwLmtleVNldCgpKTsKLS8vICAgICAgICAKLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgeHNkU2NoZW1hLgotICAgKiBAcmV0dXJuIFhTRFNjaGVtYQotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRYU0RTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc291cmNlRmlsZS4KLSAgICogQHJldHVybiBJRmlsZQotICAgKi8KLSAgcHVibGljIElGaWxlIGdldEZpbGVSZXNvdXJjZSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VGaWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgSURvY3VtZW50IGZyb20gdGhlIHRleHQgdmlld2VyCi0gICAqLwotICBwdWJsaWMgSURvY3VtZW50IGdldEVkaXRvcklEb2N1bWVudCgpCi0gIHsKLSAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpOwotICAgIHJldHVybiBkb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgcmVmIGludGVncml0eSB0YXNrcyBpbiB0YXNrIGxpc3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVRhc2tzSW5UYXNrTGlzdChBcnJheUxpc3QgbWVzc2FnZXMpCi0gIHsKLS8vICAgIERpc3BsYXlFcnJvckluVGFza0xpc3QgdGFza3MgPSBuZXcgRGlzcGxheUVycm9ySW5UYXNrTGlzdChnZXRFZGl0b3JJRG9jdW1lbnQoKSwgZ2V0RmlsZVJlc291cmNlKCksIG1lc3NhZ2VzKTsKLS8vICAgIHRhc2tzLnJ1bigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzZXRJbmZvcm1hdGlvblRhc2tzKCkKLSAgewotLy8gRGlzcGxheUVycm9ySW5UYXNrTGlzdC5yZW1vdmVJbmZvTWFya2VycyhnZXRGaWxlUmVzb3VyY2UoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RHcmFwaFZpZXdlciBnZXRHcmFwaFZpZXdlcigpCi0gIHsKLSAgICByZXR1cm4gZ3JhcGhWaWV3ZXI7Ci0gIH0KLQotLy8gIC8qKgotLy8gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2hhbmRsZVByb3BlcnR5Q2hhbmdlKGludCkKLS8vICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHlJZCkKLS8vICB7Ci0vLyAgICBzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUlkKTsKLS8vICAgIAotLy8gICAgaWYgKHByb3BlcnR5SWQgPT0gSUVkaXRvclBhcnQuUFJPUF9JTlBVVCkKLS8vICAgIHsKLS8vICAgICAgc2V0SW5wdXQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLS8vICAgICAgcmVzb3VyY2VGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0vLyAgICAgIHNldFRpdGxlKHJlc291cmNlRmlsZS5nZXROYW1lKCkpOwotLy8vLyAgICAgIG91dGxpbmUuc2V0TW9kZWwoZ2V0TW9kZWwoKSk7Ci0vLwotLy8gICAgICAvLyBldmVuIHRob3VnaCB3ZSd2ZSBzZXQgdGl0bGUgZXRjLiwgc2V2ZXJhbCB0aW1lcyBhbHJlYWR5IQotLy8gICAgICAvLyBvbmx5IG5vdyBpcyBhbGwgcHJlcGFyZWQgZm9yIGl0LgotLy8gICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSk7Ci0vLyAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKHByb3BlcnR5SWQgPT0gSUVkaXRvclBhcnQuUFJPUF9USVRMRSkKLS8vICAgIHsKLS8vICAgICAgaWYgKGdldEVkaXRvcklucHV0KCkgIT0gdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKQotLy8gICAgICB7Ci0vLyAgICAgICAgc2V0SW5wdXQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLS8vICAgICAgfQotLy8gICAgfSAgICAKLS8vICB9Ci0KLSAgcHVibGljIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvclBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGdldEFjdGl2ZUVkaXRvcigpOwotICB9Ci0gIAotICBwdWJsaWMgWFNEVGV4dEVkaXRvciBnZXRYU0RUZXh0RWRpdG9yKCkKLQl7Ci0gICAgcmV0dXJuIHRleHRFZGl0b3I7Ci0gIH0KLQotCWNsYXNzIEludGVybmFsUGFydExpc3RlbmVyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lcgotCXsKLQkgIFhTREVkaXRvciBlZGl0b3I7Ci0JICBwdWJsaWMgSW50ZXJuYWxQYXJ0TGlzdGVuZXIoWFNERWRpdG9yIGVkaXRvcikKLQkgIHsKLQkgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7IAotCSAgfQotCSAgCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLQkJewotCQkJaWYgKHBhcnQgPT0gZWRpdG9yKQotCQkJewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGdldEN1cnJlbnRQYWdlVHlwZSgpLmVxdWFscyhYU0RFZGl0b3JQbHVnaW4uR1JBUEhfUEFHRSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKSwgc2VsZWN0aW9uKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGdldEN1cnJlbnRQYWdlVHlwZSgpLmVxdWFscyhYU0RFZGl0b3JQbHVnaW4uU09VUkNFX1BBR0UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkKLQkJewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotCQl7Ci0JCX0KLQotICAgCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0JCXsKLQkJfQotCX0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNERWRpdG9yQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTREVkaXRvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5MTM3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNERWRpdG9yQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFhTREVkaXRvckFkYXB0ZXIKLXsKLSAgcHVibGljIElGaWxlIGdldEZpbGVSZXNvdXJjZSgpOwotCi0gIHB1YmxpYyBJRG9jdW1lbnQgZ2V0RWRpdG9ySURvY3VtZW50KCk7Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlVGFza3NJblRhc2tMaXN0KEFycmF5TGlzdCBtZXNzYWdlcyk7Ci0KLSAgcHVibGljIHZvaWQgcmVzZXRJbmZvcm1hdGlvblRhc2tzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNERWRpdG9yQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTREVkaXRvckNvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5NWY1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNERWRpdG9yQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbDsKLQotLyoqCi0gKiBDb250ZXh0IGhlbHAgaWQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhTREVkaXRvckNvbnRleHRJZHMgCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwiOwotCi0gIC8qIENPTlRFWFRfSURzIE5ldyBYU0QgV2l6YXJkIHVzZXMgdGhlIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZnJvbSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzICovCi0gCi0gIC8qIENPTlRFWFRfSURzIGZvciBYU0RFZGl0b3IgZm9sbG93IHRoZSB4c2RleHh4IGNvbnRleHQgSURzICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDAxMCBmb3IgWFNEIEVkaXRvciBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9ERVNJR05fVklFVyAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDEwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgRmlsZSBOYW1lIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotICAvKiBDT05URVhUX0lEIHhzZGUwMDIwIGZvciBWZXJzaW9uIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9WRVJTSU9OICAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDAzMCBmb3IgTGFuZ3VhZ2UgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX0xBTkdVQUdFICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwMzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDQwIGZvciBOYW1lc3BhY2UgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfTkFNRVNQQUNFX0dST1VQICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwNTAgZm9yIFByZWZpeCBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfUFJFRklYICAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwNjAgZm9yIFRhcmdldCBuYW1lc3BhY2UgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwNjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDcwIGZvciBBcHBseSBQdXNoIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9BUFBMWSAgICAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDcwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDA4MCBmb3IgQXR0cmlidXRlIGZvcm0gZGVmYXVsdCBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfQVRUUklCVVRFICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA4MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwOTAgZm9yIEVsZW1lbnQgZm9ybSBkZWZhdWx0IENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9FTEVNRU5UICAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDkwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDEwMCBmb3IgQmxvY2sgZGVmYXVsdCBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfQkxPQ0sgICAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDEwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAxMTAgZm9yIEZpbmFsIERlZmF1bHQgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX0ZJTkFMICAgICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAxMTAiOwotCi0gIAotICAvKiBDT05URVhUX0lEIHhzZGUwMjAwIGZvciBBbm5vdGF0aW9ucyBDb21tZW50IEdyb3VwIC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gRG9jdW1lbnRhdGlvbiBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEFwcCBJbmZvIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5OT1RBVElPTl9DT01NRU5UX0dST1VQID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMjAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDIxMCBmb3IgQW5ub3RhdGlvbnMgQ29tbWVudCBHcm91cCAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIERvY3VtZW50YXRpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBBcHAgSW5mbyBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOTk9UQVRJT05fQ09NTUVOVCAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDIxMCI7Ci0gIAotICAvKiBDT05URVhUX0lEIHhzZGUwMzAwIGZvciBEb2N1bWVudGF0aW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRE9DVU1FTlRBVElPTl9ERVNJR05fVklFVyAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMzAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDMxMCBmb3IgU291cmNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0RPQ1VNRU5UQVRJT05fU09VUkNFICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDMxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAzMjAgZm9yIExhbmd1YWdlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0RPQ1VNRU5UQVRJT05fTEFOR1VBR0UgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDMyMCI7Ci0gIC8qIENPTlRFWFRfSUQgQ29tbWVudCBHcm91cCBpcyBmcm9tIEFubm90YXRpb25zIFdpbmRvdyB4c2RlMDIwMCAqLwotICAvKiBDT05URVhUX0lEIENvbW1lbnQgTXVsdGktbGluZSBFZGl0IGlzIGZyb20gQW5ub3RhdGlvbnMgV2luZG93IHhzZDAyMTAgKi8KLQotICAvKiBDT05URVhUX0lEIHhzZGUwNDAwIGZvciBBcHAgSW5mbyBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FQUF9JTkZPX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNDAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDQxMCBmb3IgQXBwIEluZm8gU291cmNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FQUF9JTkZPX1NPVVJDRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDQxMCI7Ci0gIC8qIENPTlRFWFRfSUQgQ29tbWVudCBHcm91cCBpcyBmcm9tIEFubm90YXRpb25zIFdpbmRvdyB4c2RlMDIwMCAqLwotICAvKiBDT05URVhUX0lEIENvbW1lbnQgTXVsdGktbGluZSBFZGl0IGlzIGZyb20gQW5ub3RhdGlvbnMgV2luZG93IHhzZDAyMTAgKi8KLQotICAvKiBDT05URVhUX0lEIHhzZGUwNTAwIGZvciBDb21wbGV4IFR5cGUgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9DT01QTEVYX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDUxMCBmb3IgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9DT01QTEVYX05BTUUgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNTEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDUyMCBmb3IgQWJzdHJhY3QgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9BQlNUUkFDVCAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDUyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1MzAgZm9yIE1peGVkIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0NPTVBMRVhfTUlYRUQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA1MzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNTQwIGZvciBCbG9jayBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9DT01QTEVYX0JMT0NLICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNTQwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDU1MCBmb3IgRmluYWwgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9GSU5BTCAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDU1MCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDYwMCBmb3IgU2ltcGxlIFR5cGUgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TSU1QTEVfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTA2MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNjEwIGZvciBOYW1lIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NJTVBMRV9OQU1FICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDYxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCBmb3IgR2xvYmFsIEVsZW1lbnQgYW5kIEVsZW1lbnQgRGVzaWduIFZpZXdzIGFyZSB0aGUgc2FtZSAqLwotICAvKiBDT05URVhUX0lEIHhzZGUwNzAwIGZvciBFbGVtZW50IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDcwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3MTAgZm9yIEVsZW1lbnQgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX05BTUUgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDcxMCI7Ci0gIC8qIENPTlRFWFRfSUQgVHlwZSBJbmZvcm1hdGlvbiBHcm91cCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTAwICovCi0gIC8qIENPTlRFWFRfSUQgQnVpbHQtaW4gc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgY29tcGxleCB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTQwICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBpbmZvcm1hdGlvbiBDb21ibyBCb3ggaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk1MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUwNzIwIGZvciBBYnN0cmFjdCBDaGVjayBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0FCU1RSQUNUICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDcyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3MzAgZm9yIE5pbGxhYmxlIENoZWNrIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfTklMTEFCTEUgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNzMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDc0MCBmb3IgVmFsdWUgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX1ZBTFVFICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3NTAgZm9yIEZpeGVkIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfRklYRUQgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNzUwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDc2MCBmb3IgRGVmYXVsdCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0RFRkFVTFQgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc2MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3NzAgZm9yIFZhbHVlIEdyb3VwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9WQUxVRV9HUk9VUCAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3NzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzgwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfTUlOSU1VTSAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNzgwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDc5MCBmb3IgTWF4aW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX01BWElNVU0gICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc5MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA4MDAgZm9yIEJsb2NrIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfQkxPQ0sgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwODAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDgxMCBmb3IgRmluYWwgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9GSU5BTCAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA4MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwODIwIGZvciBTdWJzdGl0dXRpb24gR3JvdXAgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9TVUJTVElUVVRJT04gPSBQTFVHSU5fTkFNRSArICIueHNkZTA4MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwODMwIGZvciBGb3JtIFF1YWxpZmljYXRpb24gQ29tYm8gQm94ICovICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0ZPUk0gICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDgzMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDkwMCBmb3IgVHlwZSBIZWxwZXIgR3JvdXAgLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBBdHRyaWJ1dGUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFJlc3RyaWN0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gTGlzdCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfR1JPVVAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTEwIGZvciBOb25lIFJhZGlvIEJ1dHRvbiAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFNpbXBsZSBDb250ZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gUmVzdHJpY3Rpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBMaXN0IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pb24gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9UWVBFX0hFTFBFUl9OT05FICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDkxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA5MjAgZm9yIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBFbGVtZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEF0dHJpYnV0ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFNpbXBsZSBDb250ZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gUmVzdHJpY3Rpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBMaXN0IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pb24gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9UWVBFX0hFTFBFUl9CVUlMVF9JTiA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDkyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA5MzAgZm9yIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBBdHRyaWJ1dGUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFJlc3RyaWN0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gTGlzdCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfVVNFUl9ERUZJTkVEX1NJTVBMRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDkzMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA5NDAgZm9yIFVzZXItZGVmaW5lZCBjb21wbGV4IHR5cGUgUmFkaW8gQnV0dG9uIC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9UWVBFX0hFTFBFUl9VU0VSX0RFRklORURfQ09NUExFWCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDk0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA5NTAgZm9yIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBSZXN0cmljdGlvbiBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9UWVBFX0hFTFBFUl9UWVBFID0gUExVR0lOX05BTUUgKyAiLnhzZGUwOTUwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUxMDAwIGZvciBBdHRyaWJ1dGUgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwMDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMDEwIGZvciBBdHRyaWJ1dGUgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfTkFNRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwMTAiOwotICAvKiBDT05URVhUX0lEIFR5cGUgSW5mb3JtYXRpb24gR3JvdXAgaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkwMCAqLwotICAvKiBDT05URVhUX0lEIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTIwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTMwICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBpbmZvcm1hdGlvbiBDb21ibyBCb3ggaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk1MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUxMDIwIGZvciBWYWx1ZSBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9WQUxVRV9HUk9VUCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTAyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwMzAgZm9yIEZpeGVkIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9GSVhFRCAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTAzMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNDAgZm9yIERlZmF1bHQgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX0RFRkFVTFQgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDQwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTA1MCBmb3IgVmFsdWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX1ZBTFVFICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDUwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTA2MCBmb3IgVXNhZ2UgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX1VTQUdFICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDYwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTA3MCBmb3IgRm9ybSBxdWFsaWZpY2FpdG9uIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9GT1JNICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA3MCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTEwMCBmb3IgRWxlbWVudCBSZWYgV2luZG93IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTExMDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMTEwIGZvciBSZWZlcmVuY2UgTmFtZSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX1JFRl9SRUZFUkVOQ0UgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTExMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTExMjAgZm9yIE1pbmltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9SRUZfTUlOSU1VTSAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTExMjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMTMwIGZvciBNYXhpbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfUkVGX01BWElNVU0gICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMTMwIjsKLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkZTEyMDAgZm9yIFNpbXBsZSBDb250ZW50IERlc2lnbiBWaWV3IC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFNpbXBsZSBDb250ZW50IERlc2lnbiBWaWV3ICovIAotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIENvbXBsZXggQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0lNUExFX0NPTlRFTlRfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTEyMDAiOwotICAvKiBDT05URVhUX0lEIEJhc2UgVHlwZSBHcm91cCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTAwICovCi0gIC8qIENPTlRFWFRfSUQgTm9uZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkxMCAqLwotICAvKiBDT05URVhUX0lEIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTIwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTMwICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBpbmZvcm1hdGlvbiBDb21ibyBCb3ggaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk1MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUxMjEwIGZvciBEZXJpdmVkIGJ5IENvbWJvIEJveCAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLyAKLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBDb21wbGV4IENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TSU1QTEVfQ09OVEVOVF9ERVJJVkVEID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMjEwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUxMzAwIGZvciBSZXN0cmljdGlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1JFU1RSSUNUSU9OX0RFU0lHTl9WSUVXICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTMwMCI7Ci0gIC8qIENPTlRFWFRfSUQgQmFzZSBUeXBlIEdyb3VwIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBOb25lIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTEwICovCi0gIC8qIENPTlRFWFRfSUQgQnVpbHQtaW4gc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTUwICovCi0gIC8qIENPTlRFWFRfSUQgeHNkZTEzMTAgZm9yIEZhY2V0cyBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1JFU1RSSUNUSU9OX0ZBQ0VUU19HUk9VUCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTMxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEzMjAgZm9yIEZhY2V0cyBUYWJsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1JFU1RSSUNUSU9OX0ZBQ0VUUyAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTMyMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTQwMCBmb3IgTGlzdCBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0xJU1RfREVTSUdOX1ZJRVcgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNDAwIjsKLSAgLyogQ09OVEVYVF9JRCBCYXNlIFR5cGUgR3JvdXAgaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkwMCAqLwotICAvKiBDT05URVhUX0lEIE5vbmUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkyMCAqLwotICAvKiBDT05URVhUX0lEIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkzMCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLQotICAvKiBDT05URVhUX0lEIHhzZGUxNTAwIGZvciBBdHRyaWJ1dGUgR3JvdXAgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfR1JPVVBfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTE1MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxNTEwIGZvciBOYW1lIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9HUk9VUF9OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNTEwIjsKLQotICAvKiBDT05URVhUX0lEIGZvciBHbG9iYWwgQXR0cmlidXRlIGFuZCBBdHRyaWJ1dGUgRGVzaWduIFZpZXdzIGFyZSB0aGUgc2FtZSAqLwotICAvKiBDT05URVhUX0lEIHhzZGUxNjAwIGZvciBBdHRyaWJ1dGUgR3JvdXAgUmVmZXJlbmNlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX0dST1VQX1JFRl9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTYwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTE2MTAgZm9yIFJlZmVyZW5jZSBOYW1lIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9HUk9VUF9SRUZfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTYxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTcwMCBmb3IgQXR0cmlidXRlIFJlZmVyZW5jZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTE3MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxNzEwIGZvciBSZWZlcmVuY2UgTmFtZSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfUkVGX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkZTE3MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE4MDAgZm9yIFBhdHRlcm4gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9QQVRURVJOX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxODAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTgxMCBmb3IgVmFsdWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfUEFUVEVSTl9WQUxVRSAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxODEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTgyMCBmb3IgQ3JlYXRlIFJlZ3VsYXIgRXhwcmVzc2lvbiBQdXNoIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1BBVFRFUk5fUkVHVUxBUiA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTgyMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTkwMCBmb3IgRW51bSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VOVU1fREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTE5MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxOTEwIGZvciBWYWx1ZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTlVNX1ZBTFVFICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxOTEwIjsKLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkZTIwMDAgZm9yIEluY2x1ZGUgRGVzaWduIFBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9JTkNMVURFX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUyMDAwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgU2NoZW1hIExvY2F0aW9uIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotICAvKiBDT05URVhUX0lEIFNlbGVjdCBQdXNoIEJ1dHRvbiBpcyBmcm9tIEluY2x1ZGUgSGVscGVyIHhzZGUyMTAwICovIAotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjEwMCBmb3IgSW5jbHVkZSBIZWxwZXIgU2VsZWN0IFB1c2ggQnV0dG9uIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEluY2x1ZGUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBJbXBvcnQgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9JTkNMVURFX0hFTFBFUl9TRUxFQ1QgPSBQTFVHSU5fTkFNRSArICIueHNkZTIxMDAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTIyMDAgZm9yIEltcG9ydCBEZXNpZ24gUGFnZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0lNUE9SVF9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjIwMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIFNjaGVtYSBMb2NhdGlvbiBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3QgUHVzaCBCdXR0b24gaXMgZnJvbSBJbmNsdWRlIEhlbHBlciB4c2RlMjEwMCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUyMjEwIGZvciBQcmVmaXggVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfSU1QT1JUX1BSRUZJWCAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyMjEwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgTmFtZXNwYWNlIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTIzMDAgZm9yIFJlZGVmaW5lIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfUkVERUZJTkVfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTIzMDAiOwotICAvKiBubyBDT05URVhUX0lEIGZvciBTY2hlbWEgTG9jYXRpb24gVGV4dCBFZGl0IChub3QgZWRpdGFibGUpICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0IFB1c2ggQnV0dG9uIGlzIGZyb20gSW5jbHVkZSBIZWxwZXIgeHNkZTIxMDAgKi8KLQotICAvKiBDT05URVhUX0lEIHhzZGUyNDAwIGZvciBHcm91cCBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNDAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjQxMCBmb3IgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9OQU1FICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjQxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMjUwMCBmb3IgR3JvdXAgU2NvcGUgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9TQ09QRV9ERVNJR05fVklFVyAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjUxMCBmb3IgQ29udGVudCBtb2RlbCBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1NDT1BFX0NPTlRFTlRfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTIwIGZvciBTZXF1ZW5jZSBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9TQ09QRV9TRVFVRU5DRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjUyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI1MzAgZm9yIENob2ljZSBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9TQ09QRV9DSE9JQ0UgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjUzMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI1NDAgZm9yIEFsbCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9TQ09QRV9BTEwgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjU0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI1NTAgZm9yIE1pbmltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfTUlOSU1VTSAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1NTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTYwIGZvciBNYXhpbXVtIFRleHQgRWRpdCovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfTUFYSU1VTSAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1NjAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI2MDAgZm9yIEdyb3VwIFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1JFRl9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjYwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI2MTAgZm9yIFJlZmVyZW5jZSBuYW1lIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1JFRl9SRUZFUkVOQ0UgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjYxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI2MjAgZm9yIE1pbmltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfUkVGX01JTklNVU0gICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNjIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjYzMCBmb3IgTWF4aW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9SRUZfTUFYSU1VTSAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI2MzAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI3MDAgZm9yIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjcwMCI7Ci0gIC8qIENPTlRFWFRfSUQgTmFtZSBUZXh0IEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgwMCAqLwotICAvKiBDT05URVhUX0lEIFNlbGVjdG9yIEdyb3VwIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBNdWxpdC1saW5lIEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgyMCAqLwotICAvKiBDT05URVhUX0lEIEZpZWxkcyBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODMwICovCi0gIC8qIENPTlRFWFRfSUQgU291cmNlIFRleHQgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODQwICovCi0gIC8qIENPTlRFWFRfSUQgQWRkIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NTAgKi8KLSAgLyogQ09OVEVYVF9JRCBSZW1vdmUgUHVzaCBCdXR0b24gaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg2MCAqLwotICAvKiBDT05URVhUX0lEIFRhcmdldCBMaXN0IEJveCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODcwICovCi0gIAotICAvKiBDT05URVhUX0lEIHhzZGUyODAwIGZvciBVbmlxdWUgQmFzZSBOYW1lIFRleHQgRWRpdCAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjgwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4MTAgZm9yIFNlbGVjdG9yIEdyb3VwIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfQkFTRV9TRUxFQ1RPUl9HUk9VUCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjgxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4MjAgZm9yIFNlbGVjdG9yIE11bHRpLWxpbmUgRWRpdCAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfU0VMRUNUT1IgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODMwIGZvciBGaWVsZHMgR3JvdXAgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX0ZJRUxEU19HUk9VUCAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjg0MCBmb3IgU291cmNlIFRleHQgRWRpdCAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfU09VUkNFICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODUwIGZvciBBZGQgUHVzaCBCdXR0b24gLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX0FERCAgICAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODUwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjg2MCBmb3IgUmVtb3ZlIFB1c2ggQnV0dG9uIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfQkFTRV9SRU1PVkUgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjg2MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4NzAgZm9yIFRhcmdldCBMaXN0IEJveCAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfVEFSR0VUICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4NzAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI5MDAgZm9yIEtleSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0tFWV9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjkwMCI7Ci0gIC8qIENPTlRFWFRfSUQgTmFtZSBUZXh0IEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgwMCAqLwotICAvKiBDT05URVhUX0lEIFNlbGVjdG9yIEdyb3VwIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBNdWxpdC1saW5lIEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgyMCAqLwotICAvKiBDT05URVhUX0lEIEZpZWxkcyBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODMwICovCi0gIC8qIENPTlRFWFRfSUQgU291cmNlIFRleHQgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODQwICovCi0gIC8qIENPTlRFWFRfSUQgQWRkIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NTAgKi8KLSAgLyogQ09OVEVYVF9JRCBSZW1vdmUgUHVzaCBCdXR0b24gaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg2MCAqLwotICAvKiBDT05URVhUX0lEIFRhcmdldCBMaXN0IEJveCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODcwICovCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI5MDAgZm9yIEtleSBEZXNpZ24gVmlldyAqLwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjk1MCBmb3IgS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0tFWV9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI5NTAiOwotICAvKiBDT05URVhUX0lEIE5hbWUgVGV4dCBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MDAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMjk2MCBmb3IgUmVmZXJlbmNlIEtleSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9LRVlfUkVGX1JFRkVSRU5DRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjk2MCI7Ci0gIC8qIENPTlRFWFRfSUQgU2VsZWN0b3IgR3JvdXAgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgxMCAqLwotICAvKiBDT05URVhUX0lEIFNlbGVjdG9yIE11bGl0LWxpbmUgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODIwICovCi0gIC8qIENPTlRFWFRfSUQgRmllbGRzIEdyb3VwIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBTb3VyY2UgVGV4dCBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NDAgKi8KLSAgLyogQ09OVEVYVF9JRCBBZGQgUHVzaCBCdXR0b24gaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg1MCAqLwotICAvKiBDT05URVhUX0lEIFJlbW92ZSBQdXNoIEJ1dHRvbiBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODYwICovCi0gIC8qIENPTlRFWFRfSUQgVGFyZ2V0IExpc3QgQm94IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NzAgKi8KLQotICAvKiBDT05URVhUX0lEIHhzZGUzMDAwIGZvciBBbnkgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9FTEVNRU5UX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTMwMDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUzMDEwIGZvciBOYW1lc3BhY2UgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0VMRU1FTlRfTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMDEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAyMCBmb3IgUHJvY2VzcyBDb250ZW50cyBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfRUxFTUVOVF9QUk9DRVNTICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTMwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUzMDMwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9FTEVNRU5UX01JTklNVU0gICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzAzMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMwNDAgZm9yIE1heGltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0VMRU1FTlRfTUFYSU1VTSAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMDQwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUzMTAwIGZvciBBbnkgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0FUVFJJQlVURV9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzExMCBmb3IgTmFtZXNwYWNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9BVFRSSUJVVEVfTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMTEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzEyMCBmb3IgUHJvY2VzcyBDb250ZW50cyBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfQVRUUklCVVRFX1BST0NFU1MgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzEyMCI7Ci0KLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgVW5pb24gRGVzaWduIFZpZXcgLSB1c2VzIGEgZ2VuZXJpYyBpbnRlcmZhY2UgKi8KLSAgLyogQ09OVEVYVF9JRCBUeXBlIEluZm9ybWF0aW9uIEdyb3VwIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkyMCAqLwotICAvKiBDT05URVhUX0lEIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkzMCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLQotICAvKiBDT05URVhUX0lEIHhzZGUzMjAwIGZvciBOb3RhdGlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX05PVEFUSU9OX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTMyMDAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTQwMDAgZm9yIFNvdXJjZSBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU09VUkNFX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTQwMDAiOwotCi0gIC8qIENPTlRFWFRfSURzIGZvciBSZWd1bGFyIEV4cHJlc3Npb24gV2l6YXJkIGZvbGxvdyB0aGUgeHNkcnh4eCBjb250ZXh0IElEcyAqLwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDAxMCBmb3IgQ29tcG9zZSBSZWd1bGFyIEV4cHJlc3Npb24gUGFnZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1BBR0UgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDAxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwMTUgZm9yIFRva2VuIENvbnRlbnRzIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1RPS0VOID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDE1IjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDAyMCBmb3IgT2NjdXJyZWNlIEdyb3VwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fT0NDVVJSRU5DRV9HUk9VUCA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDAyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwMzAgZm9yIEp1c3Qgb25jZSBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9KVVNUX09OQ0UgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwMzAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDQwIGZvciBaZXJvIG9yIG1vcmUgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fWkVST19PUl9NT1JFID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDQwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDA1MCBmb3IgT25lIG9yIG1vcmUgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fT05FX09SX01PUkUgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDUwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDA2MCBmb3IgT3B0aW9uYWwgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fT1BUSU9OQUwgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDYwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDA3MCBmb3IgUmVwZWF0IFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1JFUEVBVCAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA3MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwODAgZm9yIFJhbmdlIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1JBTkdFICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA4MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwOTAgZm9yIFJlcGVhdCBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SRVBFQVRfVEVYVCAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwOTAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMTAwIGZvciBSYW5nZSBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1JBTkdFX01JTiAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDEwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAxMTAgZm9yIFJhbmdlIE1heGltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fUkFOR0VfTUFYICAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMTEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDEyMCBmb3IgQWRkIFB1c2ggQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fQUREICAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMTIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDEzMCBmb3IgQ3VycmVudCBSZWd1bGFyIEV4cHJlc3Npb24gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fQ1VSUkVOVCAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMTMwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZHIwMjAwIGZvciBUZXN0IFJlZ3VsYXIgRXhwcmVzc2lvbiBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfVEVTVF9QQUdFICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAyMDAiOwotICAvKiBubyBDT05URVhUX0lEIGZvciBSZWd1bGFyIEV4cHJlc3Npb24gVGV4dCBFZGl0IChub3QgZWRpdGFibGUpICovCi0gIC8qIENPTlRFWFRfSUQgeHNkcjAyMTAgZm9yIFNhbXBsZSBUZXh0IFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX1RFU1RfU0FNUExFID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMjEwIjsKLQotICAvKiBDT05URVhUX0lEcyBmb3IgUHJlZmVyZW5jZXMgUGFnZSBmb2xsb3dzIHRoZSB4c2RweHh4IGNvbnRleHQgSURzICovCi0gIAotICAvKiBDT05URVhUX0lEIHhzZHAwMDEwIGZvciBYTUwgU2NoZW1hIFByZWZlcmVuY2VzIFBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUF9QUkVGRVJFTkNFX1BBR0UgPSBQTFVHSU5fTkFNRSArICIueHNkcDAwMTAiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTREVkaXRvclBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTREVkaXRvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjdiNTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9YU0RFZGl0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWFNEX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLlhTREVkaXRvciI7Ci0gIAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy5leGFtcGxlLm9yZyI7Ci0gIAotICBwcm90ZWN0ZWQgc3RhdGljIFhTREVkaXRvclBsdWdpbiBwbHVnaW47Ci0gIC8vICBwcm90ZWN0ZWQgWE1MU2NoZW1hUGFja2FnZSB4bWxzY2hlbWFQYWNrYWdlOwotLy8gS0NQb3J0IHByaXZhdGUgc3RhdGljIE1zZ0xvZ2dlciBteU1zZ0xvZ2dlcjsKLSAKLSAgcHVibGljIFhTREVkaXRvclBsdWdpbihJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yKSAKLSAgewotICAgIHN1cGVyKGRlc2NyaXB0b3IpOwotICAgIHBsdWdpbiA9IHRoaXM7Ci0vLyBLQ1BvcnQgICAgbXlNc2dMb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLSAgICAvL215TXNnTG9nZ2VyLndyaXRlKExldmVsLkNPTkZJRywgbmV3IEJ1aWxkSW5mbygpKTsKLSAgICAvL215TXNnTG9nZ2VyLndyaXRlKExldmVsLkNPTkZJRywgQnVpbGRJbmZvLmdldFdTQUJ1aWxkTGV2ZWwoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29weSB0aGUgdzNjIFhNTFNjaGVtYS5kdGQgYW5kIGRhdGF0eXBlcy5kdGQgaW50byB0aGUgcGx1Z2luIG1ldGFkYXRhIGRpcmVjdG9yeQotICAgKiBmb3IgdmFsaWRhdGlvbiBwdXJwb3NlcwotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnR1cCgpCi0gIHsKLSAgICBtb2RlbE1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIElNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyOwotCi0gIHB1YmxpYyBzdGF0aWMgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0gICAgSU1vZGVsTWFuYWdlclBsdWdpbiBwbHVnaW4gPSAoSU1vZGVsTWFuYWdlclBsdWdpbikgUGxhdGZvcm0uZ2V0UGx1Z2luKElNb2RlbE1hbmFnZXJQbHVnaW4uSUQpOwotICAgIHJldHVybiBwbHVnaW4uZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogR2V0IHRoZSBJbnN0YWxsIFVSTAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkwgZ2V0SW5zdGFsbFVSTCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHBsdWdpbiBwaHlzaWNhbCBkaXJlY3RvcnkgbG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UGx1Z2luTG9jYXRpb24oKQotICB7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIElQYXRoIGluc3RhbGxQYXRoID0gbmV3IFBhdGgoZ2V0SW5zdGFsbFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0gICAgICBTdHJpbmcgaW5zdGFsbFN0ciA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChpbnN0YWxsUGF0aC50b1N0cmluZygpKSkuZ2V0RmlsZSgpOwotICAgICAgcmV0dXJuIG5ldyBQYXRoKGluc3RhbGxTdHIpOwotICAgIH0gCi0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIAotICAgIHsKLQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1ldGFkYXRhIGRpcmVjdG9yeSBmb3IgdGhpcyBwbHVnaW4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhRGlyZWN0b3J5KCkKLSAgewotICAgIHJldHVybiBnZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpOwotICB9Ci0KLSAgLyoqIAotICAgKiAgR2V0IHRoZSBvbmUgeG1sc2NoZW1hIHBhY2thZ2UuCi0gICAqLwotLy8gICBwdWJsaWMgWE1MU2NoZW1hUGFja2FnZSBnZXRYTUxTY2hlbWFQYWNrYWdlKCkKLS8vICAgewotLy8gICAgIHJldHVybiB4bWxzY2hlbWFQYWNrYWdlOwotLy8gICB9Ci0KLS8vICAgLyoqIAotLy8gICAgKiAgR2V0IHRoZSBvbmUgeG1sc2NoZW1hIGZhY3RvcnkuCi0vLyAgICAqLwotLy8gICBwdWJsaWMgWE1MU2NoZW1hRmFjdG9yeSBnZXRYTUxTY2hlbWFGYWN0b3J5KCkKLS8vICAgewotLy8gICAgIHJldHVybiAoWE1MU2NoZW1hRmFjdG9yeSl4bWxzY2hlbWFQYWNrYWdlLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLS8vICAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWFNERWRpdG9yUGx1Z2luIGdldFBsdWdpbigpCi0gIHsKLSAgICByZXR1cm4gcGx1Z2luOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRYU0RJbWFnZShTdHJpbmcgaWNvbk5hbWUpCi0gIHsKLSAgICByZXR1cm4gZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoaWNvbk5hbWUpOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uTmFtZSkKLSAgewotICAgIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKLSAgICAKLSAgICBpZiAoaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoZ2V0Q2xhc3MoKSwgaWNvbk5hbWUpKTsKLSAgICAgIHJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYU0RTdHJpbmcoU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShwbHVnaW4uZ2V0QnVuZGxlKCkpLmdldFN0cmluZyhrZXkpOwotICB9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBhbmQgZG9lcyBvbmUgc3Vic3RpdHV0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkKLQl7Ci0JICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoZ2V0QnVuZGxlKCkpLmdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7Ci0JfQotCi0vLyAgcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkKLS8vICB7Ci0vLyAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotLy8gIH0KLQotICBwdWJsaWMgc3RhdGljIFNoZWxsIGdldFNoZWxsKCkgCi0gIHsJCi0gICAgcmV0dXJuIGdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB4bWwgc2NoZW1hIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRYTUxTY2hlbWFQcmVmaXgoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhDT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpCi0gIHsKLSAgCVN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICBpZighdGFyZ2V0TmFtZXNwYWNlLmVuZHNXaXRoKCIvIikpewotICAgIAl0YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2UgKyAiLyI7Ci0gICAgfQotICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB4bWwgc2NoZW1hIGxhbmd1YWdlIHF1YWxpZmljYXRpb24KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUXVhbGlmeVhNTFNjaGVtYUxhbmd1YWdlKCkKLSAgewotICAgIHJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKENPTlNUX1hTRF9MQU5HVUFHRV9RVUFMSUZZKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIE1ldGhvZCBpc0NvbWJpbmVkRGVzaWduQW5kU291cmNlVmlldy4KLSAgICogQHJldHVybiBib29sZWFuIGlmIHRoZSBlZGl0b3Igc2hvdWxkIGhhdmUgYSBzaW5nbGUgcGFnZSB0aGF0IGlzCi0gICAqIGEgY29tYmluZWQgZGVzaWduIGFuZCBzb3VyY2UgcGFnZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDb21iaW5lZERlc2lnbkFuZFNvdXJjZVZpZXcoKQotICB7Ci0gICAgcmV0dXJuIENPTUJJTkVEX0xBWU9VVC5lcXVhbHMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKEVESVRPUl9MQVlPVVQpKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0RGVzaWduTGF5b3V0KCkKLSAgewotICAgIGlmIChUT1BfTEFZT1VULmVxdWFscyhnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoREVTSUdOX0xBWU9VVCkpKQotICAgIHsKLSAgICAgICByZXR1cm4gU1dULlZFUlRJQ0FMOwotICAgIH0KLSAgICBlbHNlIGlmIChCT1RUT01fTEFZT1VULmVxdWFscyhnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoREVTSUdOX0xBWU9VVCkpKQotICAgIHsKLSAgICAgIHJldHVybiBTV1QuVkVSVElDQUw7Ci0gICAgfQotICAgIGVsc2UgaWYgKExFRlRfTEFZT1VULmVxdWFscyhnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoREVTSUdOX0xBWU9VVCkpKQotICAgIHsKLSAgICAgIHJldHVybiBTV1QuSE9SSVpPTlRBTDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoUklHSFRfTEFZT1VULmVxdWFscyhnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoREVTSUdOX0xBWU9VVCkpKQotICAgIHsKLSAgICAgIHJldHVybiBTV1QuSE9SSVpPTlRBTDsKLSAgICB9Ci0gICAgcmV0dXJuIFNXVC5IT1JJWk9OVEFMOyAgICAgIAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREZXNpZ25MYXlvdXRQb3NpdGlvbigpCi0gIHsKLSAgICBpZiAoVE9QX0xBWU9VVC5lcXVhbHMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKERFU0lHTl9MQVlPVVQpKSkKLSAgICB7Ci0gICAgICAgcmV0dXJuIFRPUF9MQVlPVVQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKEJPVFRPTV9MQVlPVVQuZXF1YWxzKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhERVNJR05fTEFZT1VUKSkpCi0gICAgewotICAgICAgcmV0dXJuIEJPVFRPTV9MQVlPVVQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKExFRlRfTEFZT1VULmVxdWFscyhnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoREVTSUdOX0xBWU9VVCkpKQotICAgIHsKLSAgICAgIHJldHVybiBMRUZUX0xBWU9VVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoUklHSFRfTEFZT1VULmVxdWFscyhnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoREVTSUdOX0xBWU9VVCkpKQotICAgIHsKLSAgICAgIHJldHVybiBSSUdIVF9MQVlPVVQ7Ci0gICAgfQotICAgIHJldHVybiBSSUdIVF9MQVlPVVQ7ICAgICAgCi0gIH0KLQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIC8qIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgaW1wbHMgZm9yIHRoZSBJUGx1Z2luSGVscGVyIGludGVyZmFjZSAgICAgICAgICAgKi8KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLy8gIHB1YmxpYyB2b2lkIHNldE1zZ0xvZ2dlckNvbmZpZyhIYXNodGFibGUgbXNnTG9nZ2VyQ29uZmlnKQotLy8gIHsKLS8vICAgIGdldE1zZ0xvZ2dlcigpLnNldE1zZ0xvZ2dlckNvbmZpZyhtc2dMb2dnZXJDb25maWcpOwotLy8gIH0KLS8vCi0vLyAgcHVibGljIEhhc2h0YWJsZSBnZXRNc2dMb2dnZXJDb25maWcoUGx1Z2luIHBsdWdpbikKLS8vICB7Ci0vLyAgICByZXR1cm4gKG5ldyBQbHVnaW5IZWxwZXJJbXBsKCkuZ2V0TXNnTG9nZ2VyQ29uZmlnKHBsdWdpbikpOwotLy8gIH0KLS8vCi0vLyAgcHVibGljIEhhc2h0YWJsZSBnZXRNc2dMb2dnZXJDb25maWcoKQotLy8gIHsKLS8vICAgIHJldHVybiAoZ2V0TXNnTG9nZ2VyQ29uZmlnKHRoaXMpKTsKLS8vICB9Ci0vLwotLy8gIC8qKgotLy8gICAqIFhTREVkaXRvciBhbmQgWFNETW9kZWwgdXNlIHRoZSBzYW1lIGxvZ2dlci4gIFNlZSBwbHVnaW4ueG1sCi0vLyAgICovCi0vLyAgcHVibGljIE1zZ0xvZ2dlciBnZXRNc2dMb2dnZXIoKQotLy8gIHsKLS8vICAgIGlmIChteU1zZ0xvZ2dlciA9PSBudWxsKQotLy8gICAgewotLy8gICAgICBteU1zZ0xvZ2dlciA9IChNc2dMb2dnZXIpIE1zZ0xvZ2dlci5nZXRGYWN0b3J5KCkuZ2V0TG9nZ2VyKG5ldyBQbHVnaW5IZWxwZXJJbXBsKCkuZ2V0TXNnTG9nZ2VyTmFtZSh0aGlzKSwgdGhpcyk7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gKG15TXNnTG9nZ2VyKTsKLS8vICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sc2NoZW1hLnhzZERlZmF1bHRQcmVmaXhUZXh0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlkgPSAib3JnLmVjbGlwc2Uud3N0LnhtbHNjaGVtYS54c2RRdWFsaWZ5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLndzdC54bWxzY2hlbWEuZGVmYXVsdFRhcmdldG5hbWVzcGFjZVRleHQiOwotCi0gIC8vIFByZWZlcmVuY2UgdG8gc3RvcmUgd2hpY2ggcGFnZSBzaG91bGQgY29tZSB1cCBhcyB0aGUgZGVmYXVsdCBwYWdlIGluIHRoZSBlZGl0b3IuICBUaGlzIHNldHRpbmcgaXMgYmFzZWQKLSAgLy8gb24gdGhlIHBhZ2UgdGhhdCB3YXMgbGVmdCBzaG93aW5nIHRoZSBsYXN0IHRpbWUgdGhlIGVkaXRvciB3YXMgY2xvc2VkLgotICBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZWZhdWx0UGFnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFU0lHTl9QQUdFID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduUGFnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPVVJDRV9QQUdFID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc291cmNlUGFnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaFBhZ2UiOwotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgRURJVE9SX0xBWU9VVCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcmxheW91dCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTUJJTkVEX0xBWU9VVCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbWJpbmVkIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VQQVJBVEVfTEFZT1VUID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VwYXJhdGUiOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFU0lHTl9MQVlPVVQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ25sYXlvdXQiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBUT1BfTEFZT1VUID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudG9wIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQk9UVE9NX0xBWU9VVCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmJvdHRvbSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExFRlRfTEFZT1VUID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubGVmdCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJJR0hUX0xBWU9VVCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJpZ2h0IjsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkKLSAgewotICAgIHN1cGVyLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoc3RvcmUpOwotCi0gICAgc3RvcmUuc2V0RGVmYXVsdChDT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCwgInhzZCIpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlksIGZhbHNlKTsKLQotICAgIHN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9QQUdFLCBERVNJR05fUEFHRSk7Ci0gICAgc3RvcmUuc2V0RGVmYXVsdChFRElUT1JfTEFZT1VULCBDT01CSU5FRF9MQVlPVVQpOwotICAgIHN0b3JlLnNldERlZmF1bHQoREVTSUdOX0xBWU9VVCwgUklHSFRfTEFZT1VUKTsKLSAgICAKLSAgICBzdG9yZS5zZXREZWZhdWx0KFhTREVkaXRvclBsdWdpbi5DT05TVF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UsIERFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1bHRQYWdlKFN0cmluZyBwYWdlKQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoREVGQVVMVF9QQUdFLCBwYWdlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIE1ldGhvZCBnZXREZWZhdWx0UGFnZS4KLSAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIHN0cmluZyBjb25zdGFudCB0aGF0IGlzIHRoZSBkZWZhdWx0IHBhZ2UgdGhlIGVkaXRvciBzaG91bGQgdHVybiB0byB3aGVuCi0gICAqIGZpcnN0IG9wZW5lZC4gIENoYW5nZXMgdG8gdGhlIGxhc3QgdmlzaWJsZSBwYWdlIHdoZW4gdGhlIGVkaXRvciB3YXMgY2xvc2VkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoREVGQVVMVF9QQUdFKTsKLSAgfSAgICAKLQotICBwcm90ZWN0ZWQgVVJMIGJhc2VVUkw7Ci0gIHB1YmxpYyBVUkwgZ2V0QmFzZVVSTCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJY29uSW1hZ2UoU3RyaW5nIG9iamVjdCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShuZXcgVVJMKGdldEJhc2VVUkwoKSArICJpY29ucy8iICsgb2JqZWN0ICsgIi5naWYiKSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIGxvYWQgaW1hZ2UgZm9yICciICsgb2JqZWN0ICsgIiciKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9YU0RNZW51TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9YU0RNZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyZjVkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNETWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEVudW1zQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRNb2RlbEdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5CYWNrQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVBbm5vdGF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuQ3JlYXRlSWRlbnRpdHlDb25zdHJhaW50c0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuQ3JlYXRlTG9jYWxDb21wbGV4VHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVTaW1wbGVUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5ET01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuT3BlblNjaGVtYUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuU2V0QmFzZVR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLlNldE11bHRpcGxpY2l0eUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuU2V0VHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuWFNERWRpdE5hbWVzcGFjZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5Ub3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zLlJlZmFjdG9yQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgWFNETWVudUxpc3RlbmVyIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotICAvL3Byb3RlY3RlZCBYU0RUZXh0RWRpdG9yIHRleHRFZGl0b3I7Ci0gIHByb3RlY3RlZCBEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uOwotLy8gIHByb3RlY3RlZCBJQWN0aW9uIHVuZG9BY3Rpb24sIHJlZG9BY3Rpb247Ci0gIHByb3RlY3RlZCBDcmVhdGVFbGVtZW50QWN0aW9uIGFkZENvbXBsZXhUeXBlQWN0aW9uOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seTsKLSAgcHJvdGVjdGVkIE9iamVjdCBzb3VyY2VDb250ZXh0OwotICBwcml2YXRlIFJlZmFjdG9yQWN0aW9uR3JvdXAgZlJlZmFjdG9yTWVudUdyb3VwOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgWFNETWVudUxpc3RlbmVyLgotICAgKi8KLSAgcHVibGljIFhTRE1lbnVMaXN0ZW5lcihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuc2VsZWN0aW9uUHJvdmlkZXIgPSBzZWxlY3Rpb25Qcm92aWRlcjsKLQotICAgIGRlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSwgbnVsbCwgZ2V0WFNEU2NoZW1hKCkpOwotICAgIGRlbGV0ZUFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihzZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGRlbGV0ZUFjdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VDb250ZXh0KE9iamVjdCBzb3VyY2VDb250ZXh0KQotICB7Ci0gICAgdGhpcy5zb3VyY2VDb250ZXh0ID0gc291cmNlQ29udGV4dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMuc2VsZWN0aW9uUHJvdmlkZXIgPSBzZWxlY3Rpb25Qcm92aWRlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKCkKLSAgewotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLQotICBwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGVkRWxlbWVudCgpCi0gIHsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlWFNEU2NoZW1hKCkKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmplY3QpLmdldFNjaGVtYSgpOwotICAgICAgYm9vbGVhbiBmbGFnID0gdHJ1ZTsKLSAgICAgIGlzUmVhZE9ubHkgPSBmYWxzZTsKLSAgICAgIGlmICh4c2RTY2hlbWEgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgd2hpbGUgKGZsYWcpCi0gICAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IHhzZFNjaGVtYS5nZXRSZWZlcmVuY2luZ0RpcmVjdGl2ZXMoKTsKLSAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlzUmVhZE9ubHkgPSB0cnVlOwotICAgICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSB4c2RTY2hlbWFEaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKWxpc3QuZ2V0KDApOwotICAgICAgICAgIFhTRFNjaGVtYSByZWZTY2hlbWEgPSB4c2RTY2hlbWFEaXJlY3RpdmUuZ2V0U2NoZW1hKCk7IAotICAgICAgICAgIC8vIGNoZWNrIGlmIGluY2x1ZGVkIHNjaGVtYSBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCAtIGRvbid0IHdhbnQgY3ljbGUKLSAgICAgICAgICBpZiAocmVmU2NoZW1hICE9IG51bGwgJiYgcmVmU2NoZW1hICE9IHhzZFNjaGVtYSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTY2hlbWEgPSB4c2RTY2hlbWFEaXJlY3RpdmUuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVmU2NoZW1hID09IHhzZFNjaGVtYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gaWYgaXQgaW5jbHVkZXMgaXRzZWxmLCB0aGVuIHdlIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIGVkaXQgaXQKLSAgICAgICAgICAgICAgaXNSZWFkT25seSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxhZyA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmbGFnID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnkpCi0gICAgewotICAgICAgQ2F0ZWdvcnkgY2cgPSAoQ2F0ZWdvcnkpb2JqZWN0OwotICAgICAgeHNkU2NoZW1hID0gY2cuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgY2F0ZWdvcnkgPSAoQ2F0ZWdvcnlBZGFwdGVyKW9iamVjdDsKLSAgICAgIHhzZFNjaGVtYSA9IGNhdGVnb3J5LmdldFhTRFNjaGVtYSgpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSU1lbnVMaXN0ZW5lciNtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyKQotICAgKi8KLSAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKQotICB7Ci0gICAgaXNSZWFkT25seSA9IGZhbHNlOwotICAgIHVwZGF0ZVhTRFNjaGVtYSgpOwotICAgIGlmICh4c2RTY2hlbWEgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGRlbGV0ZUFjdGlvbi5zZXRYU0RTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICBkZWxldGVBY3Rpb24uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgCi0gICAgQmFja0FjdGlvbiBiYWNrQWN0aW9uID0gbmV3IEJhY2tBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9CQUNLX1RPX1NDSEVNQV9WSUVXIikpOyAvLyROT04tTkxTLTEkCi0gICAgYmFja0FjdGlvbi5zZXRYU0RTY2hlbWEoZ2V0WFNEU2NoZW1hKCkpOwotICAgIGJhY2tBY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotICAgIAotICAgIE9iamVjdCBzZWxlY3RlZEVsZW1lbnRPYmogPSBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKLSAgICAKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50T2JqIGluc3RhbmNlb2YgWFNEU2NoZW1hIHx8IHNlbGVjdGVkRWxlbWVudE9iaiBpbnN0YW5jZW9mIENhdGVnb3J5IHx8IHNlbGVjdGVkRWxlbWVudE9iaiBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICB7Ci0gICAgICBiYWNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBtYW5hZ2VyLmFkZChiYWNrQWN0aW9uKTsKLSAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotLy8gICAgaWYgKHVuZG9BY3Rpb24gPT0gbnVsbCAmJiB0ZXh0RWRpdG9yICE9IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIHVuZG9BY3Rpb24gPSB0ZXh0RWRpdG9yLmdldEFjdGlvbihvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8pOwotLy8gICAgICByZWRvQWN0aW9uID0gdGV4dEVkaXRvci5nZXRBY3Rpb24ob3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPKTsKLS8vICAgIH0KLSAgICAvLyAgICBFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IGdldFNlbGVjdGVkRWxlbWVudCgpOwotCi0gICAgRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBudWxsOwotICAgIAotICAgIGlmIChzZWxlY3RlZEVsZW1lbnRPYmogaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIHNlbGVjdGVkRWxlbWVudCA9IChFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnRPYmo7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudE9iaiBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIHNlbGVjdGVkRWxlbWVudCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpIHNlbGVjdGVkRWxlbWVudE9iaikuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRPYmogaW5zdGFuY2VvZiBDYXRlZ29yeSB8fCBzZWxlY3RlZEVsZW1lbnRPYmogaW5zdGFuY2VvZiBDYXRlZ29yeUFkYXB0ZXIpCi0gICAgewotICAgICAgaW50IGdyb3VwVHlwZSA9IC0xOwotICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudE9iaiBpbnN0YW5jZW9mIENhdGVnb3J5KQotICAgICAgewotICAgICAgICBDYXRlZ29yeSBjYXRlZ29yeSA9IChDYXRlZ29yeSkgc2VsZWN0ZWRFbGVtZW50T2JqOwotICAgICAgICBncm91cFR5cGUgPSBjYXRlZ29yeS5nZXRHcm91cFR5cGUoKTsKLSAgICAgIH0KLSAgICAgIC8vIHRvZG8uLi4gV2UgbmVlZCB0byBlbnN1cmUgd2UgZWxpbWluYXRlIHRoZSBuZWVkIGZvcgotICAgICAgLy8gdGhpcyBjYXNlLiBUaGUgWFNETWVudUxpc3RlbmVyIGNsYXNzIHNob3VsZCBub3QgaGF2ZQotICAgICAgLy8gdmlldyBkZXBlbmRhbnQgY29kZS4gV2UgbmVlZCB0byBkbyBzb21lIHdvcmsgdG8gZW5zdXJlIGFsbAotICAgICAgLy8gdmlld3MgdXRpbGl6ZSB0aGUgJ0NhdGVnb3J5JyBtb2RlbCBvYmplY3QKLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudE9iaiBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGNhdGVnb3J5QWRhcHRlciA9IChDYXRlZ29yeUFkYXB0ZXIpIHNlbGVjdGVkRWxlbWVudE9iajsKLSAgICAgICAgZ3JvdXBUeXBlID0gY2F0ZWdvcnlBZGFwdGVyLmdldEdyb3VwVHlwZSgpOwotICAgICAgfQotICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgRWxlbWVudCBwYXJlbnQgPSBnZXRYU0RTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0gICAgICAKLSAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgCi0gICAgICBOb2RlIHJlbGF0aXZlTm9kZSA9IG51bGw7Ci0gICAgICBzd2l0Y2ggKGdyb3VwVHlwZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBDYXRlZ29yeS5UWVBFUyA6IHsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdHbG9iYWxUeXBlTmFtZSgiQ29tcGxleFR5cGUiKSkpOwotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pIGFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3R2xvYmFsVHlwZU5hbWUoIlNpbXBsZVR5cGUiKSkpOwotICAgICAgICAgIEFjdGlvbiBhY3Rpb24yID0gYWRkQ3JlYXRlU2ltcGxlVHlwZUFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbikgYWN0aW9uMikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDYXRlZ29yeS5FTEVNRU5UUyA6IHsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdHbG9iYWxOYW1lKFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCAiR2xvYmFsRWxlbWVudCIpKSk7Ci0gICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpKSk7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0VMRU1FTlQiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbikgYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENhdGVnb3J5LkdST1VQUyA6IHsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdHbG9iYWxOYW1lKFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgIkdyb3VwIikpKTsKLSAgICAgICAgICBDcmVhdGVHcm91cEFjdGlvbiBncm91cEFjdGlvbiA9IGFkZENyZWF0ZUdyb3VwQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfR1JPVVAiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgIGdyb3VwQWN0aW9uLnNldElzR2xvYmFsKHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ2F0ZWdvcnkuQVRUUklCVVRFUyA6IHsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdHbG9iYWxOYW1lKFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsICJHbG9iYWxBdHRyaWJ1dGUiKSkpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0dMT0JBTF9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbikgYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENhdGVnb3J5LkFUVFJJQlVURV9HUk9VUFMgOiB7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3R2xvYmFsTmFtZShYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsICJBdHRyaWJ1dGVHcm91cCIpKSk7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVAiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbikgYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENhdGVnb3J5Lk5PVEFUSU9OUyA6IHsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdHbG9iYWxOYW1lKFhTRENvbnN0YW50cy5OT1RBVElPTl9FTEVNRU5UX1RBRywgIk5vdGF0aW9uIikpKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5QVUJMSUNfQVRUUklCVVRFLCAiIikpOwotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbikgYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENhdGVnb3J5LkRJUkVDVElWRVMgOiB7Ci0gICAgICAgICAgYm9vbGVhbiBiID0gdHJ1ZTsKLSAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLmdldExlbmd0aCgpOwotICAgICAgICAgIE5vZGUgZWZmZWN0aXZlUmVsYXRpdmVOb2RlID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aCAmJiBiOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpIGNoaWxkLCBYU0RDb25zdGFudHMuSU5DTFVERV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCkgY2hpbGQsIFhTRENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIGZhbHNlKQotICAgICAgICAgICAgICAgICAgfHwgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KSBjaGlsZCwgWFNEQ29uc3RhbnRzLlJFREVGSU5FX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KSBjaGlsZCwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJlbGF0aXZlTm9kZSA9IGNoaWxkOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICByZWxhdGl2ZU5vZGUgPSBlZmZlY3RpdmVSZWxhdGl2ZU5vZGUgIT0gbnVsbCA/IFhTRERPTUhlbHBlci5nZXROZXh0RWxlbWVudE5vZGUoZWZmZWN0aXZlUmVsYXRpdmVOb2RlKSA6IG51bGw7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5TQ0hFTUFMT0NBVElPTl9BVFRSSUJVVEUsICIiKSk7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLklOQ0xVREVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lOQ0xVREUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbikgYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lNUE9SVCIpLCBudWxsLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgKChDcmVhdGVFbGVtZW50QWN0aW9uKSBhY3Rpb24pLnNldElzR2xvYmFsKHRydWUpOwotICAgICAgICAgIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlJFREVGSU5FX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9SRURFRklORSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgKChDcmVhdGVFbGVtZW50QWN0aW9uKSBhY3Rpb24pLnNldElzR2xvYmFsKHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ2F0ZWdvcnkuQU5OT1RBVElPTlMgOiB7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgbnVsbCwgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbikgYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotLy8gICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotLy8gICAgICBpZiAodW5kb0FjdGlvbiAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgbWFuYWdlci5hZGQodW5kb0FjdGlvbik7Ci0vLyAgICAgICAgbWFuYWdlci5hZGQocmVkb0FjdGlvbik7Ci0vLyAgICAgIH0KLSAgICAgIAotICAgICAgLy8gaW5zZXJ0aW9uIHBvaW50IGZvciBwb3B1cE1lbnVzIGV4dGVuc2lvbgotICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOyAgICAKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgLy8gQWRkIGNvbnRleHQgbWVudSBpdGVtcyBmb3Igc2VsZWN0ZWQgZWxlbWVudAotICAgICAgYWRkQ29udGV4dEl0ZW1zKG1hbmFnZXIsIHNlbGVjdGVkRWxlbWVudCwgbnVsbCk7Ci0gICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgLy9lbHNlCi0vLyAgICAgIGlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGdldFhTRFNjaGVtYSgpLmdldERvY3VtZW50KCk7Ci0vLyAgICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgRWxlbWVudCBkb2NFbGVtZW50ID0gZ2V0WFNEU2NoZW1hKCkuZ2V0RG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLS8vICAgICAgICAgIGlmICghWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGRvY0VsZW1lbnQsIFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgICAgIC8vICAgICAgICBpZiAobGlzdC5nZXRMZW5ndGgoKSA9PSAwKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICAvLyBubyBzY2hlbWEgdGFnLiBFbmFibGUgdGhlIEFkZCBTY2hlbWEgYWN0aW9uCi0vLyAgICAgICAgICAgIEFkZFNjaGVtYU5vZGVBY3Rpb24gYWN0aW9uID0gbmV3IEFkZFNjaGVtYU5vZGVBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfU0NIRU1BX05PREUiKSk7Ci0vLyAgICAgICAgICAgIGFjdGlvbi5zZXRFZGl0b3IoKFhTREVkaXRvcikgdGV4dEVkaXRvci5nZXRFZGl0b3JQYXJ0KCkpOwotLy8gICAgICAgICAgICBtYW5hZ2VyLmFkZChhY3Rpb24pOwotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgfQotICAgIH0KLS8vICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0vLyAgICBpZiAodW5kb0FjdGlvbiAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBtYW5hZ2VyLmFkZCh1bmRvQWN0aW9uKTsKLS8vICAgICAgbWFuYWdlci5hZGQocmVkb0FjdGlvbik7Ci0vLyAgICB9Ci0gICAgCi0gICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICBpZiAoZGVsZXRlQWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgbWFuYWdlci5hZGQoZGVsZXRlQWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gaW5zZXJ0aW9uIHBvaW50IGZvciBwb3B1cE1lbnVzIGV4dGVuc2lvbgotICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgc3RyaW5nTmFtZSA9ICJzdHJpbmciOwotICAgIGlmIChnZXRYU0RTY2hlbWEoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBzY2hlbWFGb3JTY2hlbWFQcmVmaXggPSBnZXRYU0RTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpOwotICAgICAgaWYgKHNjaGVtYUZvclNjaGVtYVByZWZpeCAhPSBudWxsICYmIHNjaGVtYUZvclNjaGVtYVByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRYU0RTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpOwotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ05hbWUgPSBwcmVmaXggKyAiOiIgKyBzdHJpbmdOYW1lOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdHJpbmdOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBhZGRDb250ZXh0SXRlbXMuCi0gICAqIAotICAgKiBAcGFyYW0gbWFuYWdlcgotICAgKiBAcGFyYW0gcGFyZW50IC0KLSAgICogICAgICAgICAgbWVudSBpdGVtcyBzaG91bGQgYmUgY29udGV4dCBzZW5zaXRpdmUgdG8gdGhpcyBub2RlCi0gICAqIEBwYXJhbSByZWxhdGl2ZU5vZGUgLQotICAgKiAgICAgICAgICBhbnl0aGluZyBpbnNlcnRlZCwgc2hvdWxkIGJlIGluc2VydGVkIGJlZm9yZSB0aGlzIG5vZGUgKHdoaWNoIGlzIGEKLSAgICogICAgICAgICAgY2hpbGQgb2YgdGhlIHBhcmVudCBub2RlLiBBIHZhbHVlIG9mIG51bGwgbWVhbnMgYWRkIHRvIHRoZSBlbmQKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZENvbnRleHRJdGVtcyhJTWVudU1hbmFnZXIgbWFuYWdlciwgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0gICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSBudWxsOwotICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgeyAvLwotICAgICAgYWRkU2NoZW1hRWxlbWVudEl0ZW1zKG1hbmFnZXIsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBib29sZWFuIGIgPSB0cnVlOwotICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgTm9kZSBlZmZlY3RpdmVSZWxhdGl2ZU5vZGUgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKSAmJiBiOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KSBjaGlsZCwgWFNEQ29uc3RhbnRzLklOQ0xVREVfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fCBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpIGNoaWxkLCBYU0RDb25zdGFudHMuSU1QT1JUX0VMRU1FTlRfVEFHLCBmYWxzZSkKLSAgICAgICAgICAgICAgfHwgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KSBjaGlsZCwgWFNEQ29uc3RhbnRzLlJFREVGSU5FX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KSBjaGlsZCwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZmZlY3RpdmVSZWxhdGl2ZU5vZGUgPSBjaGlsZDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGIgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJlbGF0aXZlTm9kZSA9IGVmZmVjdGl2ZVJlbGF0aXZlTm9kZSAhPSBudWxsID8gZWZmZWN0aXZlUmVsYXRpdmVOb2RlLmdldE5leHRTaWJsaW5nKCkgOiBudWxsOwotICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSwgIiIpKTsKLSAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLklOQ0xVREVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lOQ0xVREUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuSU1QT1JUX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9JTVBPUlQiKSwgbnVsbCwgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuUkVERUZJTkVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1JFREVGSU5FIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBudWxsLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgeyAvLwotICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfRE9DIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BUFBJTkZPX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BUFBfSU5GTyIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gZ2V0WFNEU2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChwYXJlbnQpOwotICAgICAgRWxlbWVudCBwYXJlbnROb2RlID0gKEVsZW1lbnQpIHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICBib29sZWFuIGlzR2xvYmFsRWxlbWVudCA9IGZhbHNlOwotICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnROb2RlLCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGlzR2xvYmFsRWxlbWVudCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBib29sZWFuIGFubm90YXRpb25FeGlzdHMgPSBhZGRDcmVhdGVBbm5vdGF0aW9uQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsCi0gICAgICAgICAgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBib29sZWFuIHNpbXBsZVR5cGVFeGlzdHMgPSBlbGVtZW50RXhpc3RzKFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBwYXJlbnQpOwotICAgICAgYm9vbGVhbiBjb21wbGV4VHlwZUV4aXN0cyA9IGVsZW1lbnRFeGlzdHMoWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBwYXJlbnQpOwotICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgIGlmIChhbm5vdGF0aW9uRXhpc3RzKQotICAgICAgewotICAgICAgICBOb2RlIGFubm90YXRpb25Ob2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICAgIGlmICghKHNpbXBsZVR5cGVFeGlzdHMgfHwgY29tcGxleFR5cGVFeGlzdHMpICYmIGFubm90YXRpb25Ob2RlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvL2FkZENyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgICAgICAvLyBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywKLSAgICAgICAgICAvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9MT0NBTF9TSU1QTEVfVFlQRSIpLAotICAgICAgICAgIC8vIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgICAgICAgLy9hZGRDcmVhdGVMb2NhbENvbXBsZXhUeXBlQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLAotICAgICAgICAgIC8vIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgIkFkZCBMb2NhbCBDb21wbGV4IFR5cGUiLAotICAgICAgICAgIC8vIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBTaG91bGQgc3RpbGwgYmUgYWJsZSB0byBhZGQgdGhlIGNvbnRlbnQgbW9kZWxzIGlmIHRoZSBhbm9ueW1vdXMgdHlwZQotICAgICAgICAvLyBleGlzdHMsCi0gICAgICAgIC8vIGllLiB3aXRoIGF0dHJpYnV0ZXMKLSAgICAgICAgLy8gICAgICAgIGlmICghKHNpbXBsZVR5cGVFeGlzdHMgfHwgY29tcGxleFR5cGVFeGlzdHMpKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvL2FkZENyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgICAgLy8gWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsCi0gICAgICAgIC8vIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0xPQ0FMX1NJTVBMRV9UWVBFIiksCi0gICAgICAgIC8vIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgIC8vYWRkQ3JlYXRlTG9jYWxDb21wbGV4VHlwZUFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgICAgLy8gWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCAiQWRkIExvY2FsIENvbXBsZXggVHlwZSIsCi0gICAgICAgIC8vIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQWRkTW9kZWxHcm91cEFjdGlvbiBhZGRNb2RlbEdyb3VwQWN0aW9uID0gbmV3IEFkZE1vZGVsR3JvdXBBY3Rpb24oY29uY3JldGVDb21wb25lbnQsIFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCk7Ci0gICAgICAgICAgYWRkTW9kZWxHcm91cEFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICBtYW5hZ2VyLmFkZChhZGRNb2RlbEdyb3VwQWN0aW9uKTsKLSAgICAgICAgICAKLSAgICAgICAgICBhZGRNb2RlbEdyb3VwQWN0aW9uID0gbmV3IEFkZE1vZGVsR3JvdXBBY3Rpb24oY29uY3JldGVDb21wb25lbnQsIFhTRENvbXBvc2l0b3IuQ0hPSUNFX0xJVEVSQUwpOwotICAgICAgICAgIGFkZE1vZGVsR3JvdXBBY3Rpb24uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgICAgICAgbWFuYWdlci5hZGQoYWRkTW9kZWxHcm91cEFjdGlvbik7Ci0gICAgICAgICAgCi0gICAgICAgICAgYWRkTW9kZWxHcm91cEFjdGlvbiA9IG5ldyBBZGRNb2RlbEdyb3VwQWN0aW9uKGNvbmNyZXRlQ29tcG9uZW50LCBYU0RDb21wb3NpdG9yLkFMTF9MSVRFUkFMKTsKLSAgICAgICAgICBhZGRNb2RlbEdyb3VwQWN0aW9uLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgICAgICAgIG1hbmFnZXIuYWRkKGFkZE1vZGVsR3JvdXBBY3Rpb24pOwotICAgICAgICAgIAotICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgIH0KLS8vICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsICJOZXdfVW5pcXVlIikpOwotLy8gICAgICBhZGRDcmVhdGVJZGVudGl0eUNvbnN0cmFpbnRzQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5VTklRVUVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1VOSVFVRSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotLy8gICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8gICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgIk5ld19LZXkiKSk7Ci0vLyAgICAgIGFkZENyZWF0ZUlkZW50aXR5Q29uc3RyYWludHNBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLktFWV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfS0VZIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0vLyAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCAiTmV3X0tleVJlZiIpKTsKLS8vICAgICAgYWRkQ3JlYXRlSWRlbnRpdHlDb25zdHJhaW50c0FjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuS0VZUkVGX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9LRVlfUkVGIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgRWxlbWVudCBhbm9ueW1vdXNUeXBlID0gKEVsZW1lbnQpIGRvbUhlbHBlci5nZXRDaGlsZE5vZGUocGFyZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgaWYgKGFub255bW91c1R5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5ld0dsb2JhbFR5cGVOYW1lKCJDb21wbGV4VHlwZSIpKSk7Ci0gICAgICAgIGFkZE1vdmVBbm9ueW1vdXNHbG9iYWwobWFuYWdlciwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX01BS0VfQU5PTllNT1VTX1RZUEVfR0xPQkFMIiksIGF0dHJpYnV0ZXMsIGFub255bW91c1R5cGUsIG51bGwpOwotICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGFub255bW91c1R5cGUgPSAoRWxlbWVudCkgZG9tSGVscGVyLmdldENoaWxkTm9kZShwYXJlbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICAgIGlmIChhbm9ueW1vdXNUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdHbG9iYWxUeXBlTmFtZSgiU2ltcGxlVHlwZSIpKSk7Ci0gICAgICAgIGFkZE1vdmVBbm9ueW1vdXNHbG9iYWwobWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fTUFLRV9BTk9OWU1PVVNfVFlQRV9HTE9CQUwiKSwgYXR0cmlidXRlcywgYW5vbnltb3VzVHlwZSwgbnVsbCk7Ci0gICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgfQotICAgICAgCi0gICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgTWVudU1hbmFnZXIgc2V0VHlwZUNhc2NhZGVNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCJTZXQgVHlwZSIpOwotICAgICAgbWFuYWdlci5hZGQoc2V0VHlwZUNhc2NhZGVNZW51KTsKLQotICAgICAgU2V0VHlwZUFjdGlvbiBzZXROZXdDb21wbGV4VHlwZUFjdGlvbiA9IG5ldyBTZXRUeXBlQWN0aW9uKCJOZXcgQ29tcGxleCBUeXBlIiwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTRENvbXBsZXhUeXBlLmdpZiIpLCBjb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICBzZXROZXdDb21wbGV4VHlwZUFjdGlvbi5zZXRUeXBlS2luZChYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVCk7Ci0gICAgICBzZXRUeXBlQ2FzY2FkZU1lbnUuYWRkKHNldE5ld0NvbXBsZXhUeXBlQWN0aW9uKTsKLQotICAgICAgU2V0VHlwZUFjdGlvbiBzZXROZXdTaW1wbGVUeXBlQWN0aW9uID0gbmV3IFNldFR5cGVBY3Rpb24oIk5ldyBTaW1wbGUgVHlwZSIsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpLCBjb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICBzZXROZXdTaW1wbGVUeXBlQWN0aW9uLnNldFR5cGVLaW5kKFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlQpOwotICAgICAgc2V0VHlwZUNhc2NhZGVNZW51LmFkZChzZXROZXdTaW1wbGVUeXBlQWN0aW9uKTsKLSAgICAgIAotICAgICAgU2V0VHlwZUFjdGlvbiBzZXRFeGlzdGluZ1R5cGVBY3Rpb24gPSBuZXcgU2V0VHlwZUFjdGlvbigiU2V0IEV4aXN0aW5nIFR5cGUuLi4iLCBjb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICBzZXRFeGlzdGluZ1R5cGVBY3Rpb24uc2V0VHlwZUtpbmQoMCk7Ci0gICAgICBzZXRUeXBlQ2FzY2FkZU1lbnUuYWRkKHNldEV4aXN0aW5nVHlwZUFjdGlvbik7Ci0gICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICBpZiAoIWlzR2xvYmFsRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgYWRkTXVsdGlwbGljaXR5TWVudShjb25jcmV0ZUNvbXBvbmVudCwgbWFuYWdlcik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5DSE9JQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7IC8vCi0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IGdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocGFyZW50KTsKLSAgICAgIAotICAgICAgYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5DSE9JQ0VfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NIT0lDRSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NFUVVFTkNFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50UmVmQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FERF9HUk9VUF9SRUYiKSwgcGFyZW50LCBudWxsKTsKLSAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5ld05hbWUocGFyZW50LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgIkVsZW1lbnQiLCBmYWxzZSkpKTsKLSAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfRUxFTUVOVCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfRUxFTUVOVF9SRUYiKSwgcGFyZW50LCBudWxsKTsKLSAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOWV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5ZX0VMRU1FTlQiKSwgYXR0cmlidXRlcywgcGFyZW50LCBudWxsKTsKLSAgICAgIAotICAgICAgYWRkTXVsdGlwbGljaXR5TWVudShjb25jcmV0ZUNvbXBvbmVudCwgbWFuYWdlcik7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7IC8vCi0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IGdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocGFyZW50KTsKLSAgICAgIAotICAgICAgYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5ld05hbWUocGFyZW50LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgIkVsZW1lbnQiLCBmYWxzZSkpKTsKLSAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfRUxFTUVOVCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfRUxFTUVOVF9SRUYiKSwgcGFyZW50LCBudWxsKTsKLSAgICAgIAotICAgICAgYWRkTXVsdGlwbGljaXR5TWVudShjb25jcmV0ZUNvbXBvbmVudCwgbWFuYWdlcik7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsgLy8KLSAgICAgIGJvb2xlYW4gYW5ub3RhdGlvbkV4aXN0cyA9IGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwKLSAgICAgICAgICBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIGJvb2xlYW4gYW55QXR0cmlidXRlRXhpc3RzID0gZWxlbWVudEV4aXN0cyhYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBwYXJlbnQpOwotICAgICAgTm9kZSBhbnlBdHRyaWJ1dGVOb2RlID0gbnVsbDsKLSAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBpZiAoYW55QXR0cmlidXRlRXhpc3RzKQotICAgICAgewotICAgICAgICBhbnlBdHRyaWJ1dGVOb2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5ld05hbWUocGFyZW50LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCAiQXR0cmlidXRlIiwgZmFsc2UpKSk7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIGFueUF0dHJpYnV0ZU5vZGUpOwotICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGRVJFTkNFIiksIHBhcmVudCwgYW55QXR0cmlidXRlTm9kZSk7Ci0gICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGIiksIHBhcmVudCwgYW55QXR0cmlidXRlTm9kZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdOYW1lKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgIkF0dHJpYnV0ZSIsIGZhbHNlKSkpOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkpKTsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGRVJFTkNFIiksIHBhcmVudCwgcGFyZW50LmdldExhc3RDaGlsZCgpKTsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUYiKSwgcGFyZW50LCBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotICAgICAgfQotICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTllfQVRUUklCVVRFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5OT1RBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsgLy8KLSAgICAgIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgeyAvLwotICAgICAgYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIGJvb2xlYW4gcmVzdHJpY3Rpb25FeGlzdHMgPSBlbGVtZW50RXhpc3RzKFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgcGFyZW50KTsKLSAgICAgIGJvb2xlYW4gdW5pb25FeGlzdHMgPSBlbGVtZW50RXhpc3RzKFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgcGFyZW50KTsKLSAgICAgIGJvb2xlYW4gbGlzdEV4aXN0cyA9IGVsZW1lbnRFeGlzdHMoWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcsIHBhcmVudCk7Ci0gICAgICBpZiAoIShyZXN0cmljdGlvbkV4aXN0cyB8fCB1bmlvbkV4aXN0cyB8fCBsaXN0RXhpc3RzKSkKLSAgICAgIHsKLSAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpKSk7Ci0gICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfUkVTVFJJQ1RJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBudWxsKTsKLSAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSwgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkpKTsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9VTklPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfTElTVCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LmdldFBhcmVudE5vZGUoKSwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5ld0dsb2JhbFR5cGVOYW1lKCJTaW1wbGVUeXBlIikpKTsKLSAgICAgICAgYWRkTW92ZUFub255bW91c0dsb2JhbChtYW5hZ2VyLCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9NQUtFX0FOT05ZTU9VU19UWVBFX0dMT0JBTCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgeyAvLwotICAgICAgYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ09OVEVOVF9NT0RFTCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7IC8vCi0gICAgICBib29sZWFuIGFubm90YXRpb25FeGlzdHMgPSBmYWxzZTsKLSAgICAgIGJvb2xlYW4gY29udGVudEV4aXN0cyA9IGZhbHNlOwotICAgICAgYm9vbGVhbiBjb21wbGV4T3JTaW1wbGVDb250ZW50RXhpc3RzID0gZmFsc2U7Ci0gICAgICBib29sZWFuIGFueUF0dHJpYnV0ZUV4aXN0cyA9IGZhbHNlOwotICAgICAgTm9kZSBhbm5vdGF0aW9uTm9kZSA9IG51bGw7Ci0gICAgICBOb2RlIGNvbnRlbnROb2RlID0gbnVsbDsKLSAgICAgIE5vZGUgYW55QXR0cmlidXRlTm9kZSA9IG51bGw7Ci0gICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KSBjaGlsZCwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uTm9kZSA9IGNoaWxkOwotICAgICAgICAgICAgYW5ub3RhdGlvbkV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCkgY2hpbGQsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCkgY2hpbGQsIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIGZhbHNlKQotICAgICAgICAgICAgICB8fCBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpIGNoaWxkLCBYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KSBjaGlsZCwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCB0cnVlKQotICAgICAgICAgICAgICB8fCBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpIGNoaWxkLCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCkgY2hpbGQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRlbnRFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgY29udGVudE5vZGUgPSBjaGlsZDsKLSAgICAgICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpIGNoaWxkLCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCkgY2hpbGQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb21wbGV4T3JTaW1wbGVDb250ZW50RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KSBjaGlsZCwgWFNEQ29uc3RhbnRzLkFOWUFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFueUF0dHJpYnV0ZUV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICBhbnlBdHRyaWJ1dGVOb2RlID0gY2hpbGQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBhZGRDcmVhdGVBbm5vdGF0aW9uQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgIGFkZFNldEJhc2VUeXBlQWN0aW9uKG1hbmFnZXIsIHBhcmVudCk7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IGdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocGFyZW50KTsKLSAgICAgIGlmIChhbm5vdGF0aW9uRXhpc3RzKQotICAgICAgewotICAgICAgICBpZiAoIWNvbnRlbnRFeGlzdHMpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGQgY29udGVudCBtb2RlbAotICAgICAgICAgIC8vIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLAotICAgICAgICAgIC8vIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NPTlRFTlRfTU9ERUwiKSwKLSAgICAgICAgICAvLyBhdHRyaWJ1dGVzLCBwYXJlbnQsIGFubm90YXRpb25Ob2RlLmdldE5leHRTaWJsaW5nKCkpOwotICAgICAgICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFkZE1vZGVsR3JvdXBBY3Rpb24gYWRkTW9kZWxHcm91cEFjdGlvbiA9IG5ldyBBZGRNb2RlbEdyb3VwQWN0aW9uKGNvbmNyZXRlQ29tcG9uZW50LCBYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwpOwotICAgICAgICAgICAgYWRkTW9kZWxHcm91cEFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKGFkZE1vZGVsR3JvdXBBY3Rpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRNb2RlbEdyb3VwQWN0aW9uID0gbmV3IEFkZE1vZGVsR3JvdXBBY3Rpb24oY29uY3JldGVDb21wb25lbnQsIFhTRENvbXBvc2l0b3IuQ0hPSUNFX0xJVEVSQUwpOwotICAgICAgICAgICAgYWRkTW9kZWxHcm91cEFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKGFkZE1vZGVsR3JvdXBBY3Rpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRNb2RlbEdyb3VwQWN0aW9uID0gbmV3IEFkZE1vZGVsR3JvdXBBY3Rpb24oY29uY3JldGVDb21wb25lbnQsIFhTRENvbXBvc2l0b3IuQUxMX0xJVEVSQUwpOwotICAgICAgICAgICAgYWRkTW9kZWxHcm91cEFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKGFkZE1vZGVsR3JvdXBBY3Rpb24pOwotCi0gICAgICAgICAgfQotICAgICAgICAgIC8vIFRlbXBvcmFyaWx5IHJlbW92ZSB0aGlzIHVudGlsIHdlIHByb3ZpZGUgYSBncmFwaGljYWwgcmVwIG9mIHRoZXNlCi0gICAgICAgICAgLy8gY29tcG9uZW50cwotICAgICAgICAgIC8vICAgICAgICAgIGFkZENyZWF0ZVNpbXBsZUNvbnRlbnRBY3Rpb24obWFuYWdlciwKLSAgICAgICAgICAvLyBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywKLSAgICAgICAgICAvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9TSU1QTEVfQ09OVEVOVCIpLAotICAgICAgICAgIC8vIGF0dHJpYnV0ZXMsCi0gICAgICAgICAgLy8gcGFyZW50LCBhbm5vdGF0aW9uTm9kZS5nZXROZXh0U2libGluZygpKTsKLSAgICAgICAgICAvLyAgICAgICAgICBhZGRDcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uKG1hbmFnZXIsCi0gICAgICAgICAgLy8gWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLAotICAgICAgICAgIC8vIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NPTVBMRVhfQ09OVEVOVCIpLAotICAgICAgICAgIC8vIGF0dHJpYnV0ZXMsCi0gICAgICAgICAgLy8gcGFyZW50LCBhbm5vdGF0aW9uTm9kZS5nZXROZXh0U2libGluZygpKTsKLSAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50UmVmQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FERF9HUk9VUF9SRUYiKSwgcGFyZW50LCBhbm5vdGF0aW9uTm9kZS5nZXROZXh0U2libGluZygpKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIWNvbnRlbnRFeGlzdHMpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGQgY29udGVudCBtb2RlbAotICAgICAgICAgIC8vIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLAotICAgICAgICAgIC8vIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NPTlRFTlRfTU9ERUwiKSwKLSAgICAgICAgICAvLyBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFkZE1vZGVsR3JvdXBBY3Rpb24gYWRkTW9kZWxHcm91cEFjdGlvbiA9IG5ldyBBZGRNb2RlbEdyb3VwQWN0aW9uKGNvbmNyZXRlQ29tcG9uZW50LCBYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwpOwotICAgICAgICAgICAgYWRkTW9kZWxHcm91cEFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKGFkZE1vZGVsR3JvdXBBY3Rpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRNb2RlbEdyb3VwQWN0aW9uID0gbmV3IEFkZE1vZGVsR3JvdXBBY3Rpb24oY29uY3JldGVDb21wb25lbnQsIFhTRENvbXBvc2l0b3IuQ0hPSUNFX0xJVEVSQUwpOwotICAgICAgICAgICAgYWRkTW9kZWxHcm91cEFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKGFkZE1vZGVsR3JvdXBBY3Rpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRNb2RlbEdyb3VwQWN0aW9uID0gbmV3IEFkZE1vZGVsR3JvdXBBY3Rpb24oY29uY3JldGVDb21wb25lbnQsIFhTRENvbXBvc2l0b3IuQUxMX0xJVEVSQUwpOwotICAgICAgICAgICAgYWRkTW9kZWxHcm91cEFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKGFkZE1vZGVsR3JvdXBBY3Rpb24pOwotCi0gICAgICAgICAgfQotICAgICAgICAgIC8vIFRlbXBvcmFyaWx5IHJlbW92ZSB0aGlzIHVudGlsIHdlIHByb3ZpZGUgYSBncmFwaGljYWwgcmVwIG9mIHRoZXNlCi0gICAgICAgICAgLy8gY29tcG9uZW50cwotICAgICAgICAgIC8vICAgICAgICAgIGFkZENyZWF0ZVNpbXBsZUNvbnRlbnRBY3Rpb24obWFuYWdlciwKLSAgICAgICAgICAvLyBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywKLSAgICAgICAgICAvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9TSU1QTEVfQ09OVEVOVCIpLAotICAgICAgICAgIC8vIGF0dHJpYnV0ZXMsCi0gICAgICAgICAgLy8gcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgICAvLyAgICAgICAgICBhZGRDcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uKG1hbmFnZXIsCi0gICAgICAgICAgLy8gWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLAotICAgICAgICAgIC8vIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NPTVBMRVhfQ09OVEVOVCIpLAotICAgICAgICAgIC8vIGF0dHJpYnV0ZXMsCi0gICAgICAgICAgLy8gcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50UmVmQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FERF9HUk9VUF9SRUYiKSwgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgIGlmIChhbnlBdHRyaWJ1dGVFeGlzdHMpCi0gICAgICB7Ci0gICAgICAgIGlmICghY29tcGxleE9yU2ltcGxlQ29udGVudEV4aXN0cykKLSAgICAgICAgewotLy8gICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdOYW1lKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgIkF0dHJpYnV0ZSIsIGZhbHNlKSkpOwotLy8gICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpKSk7Ci0vLyAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIGFueUF0dHJpYnV0ZU5vZGUpOwotLy8gICAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0vLyAgICAgICAgICAvLyBBUkUgQVRUUklCVVRFIEdST1VQUyBBTExPV0VEID8KLS8vICAgICAgICAgIC8vICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwKLS8vICAgICAgICAgIC8vIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywKLS8vICAgICAgICAgIC8vICJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVAiLCBhdHRyaWJ1dGVzLCBwYXJlbnQsCi0vLyAgICAgICAgICAvLyBhbnlBdHRyaWJ1dGVOb2RlKTsKLS8vICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRkVSRU5DRSIpLCBwYXJlbnQsIGFueUF0dHJpYnV0ZU5vZGUpOwotLy8gICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUYiKSwgcGFyZW50LCBhbnlBdHRyaWJ1dGVOb2RlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIWNvbXBsZXhPclNpbXBsZUNvbnRlbnRFeGlzdHMpCi0gICAgICAgIHsKLS8vICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3TmFtZShwYXJlbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsICJBdHRyaWJ1dGUiLCBmYWxzZSkpKTsKLS8vICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotLy8gICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotLy8gICAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0vLyAgICAgICAgICAvLyBBUkUgQVRUUklCVVRFIEdST1VQUyBBTExPV0VEID8KLS8vICAgICAgICAgIC8vICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwKLS8vICAgICAgICAgIC8vIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywKLS8vICAgICAgICAgIC8vICJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVAiLCBhdHRyaWJ1dGVzLCBwYXJlbnQsCi0vLyAgICAgICAgICAvLyBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotLy8gICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGRVJFTkNFIiksIHBhcmVudCwgcGFyZW50LmdldExhc3RDaGlsZCgpKTsKLS8vICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGIiksIHBhcmVudCwgcGFyZW50LmdldExhc3RDaGlsZCgpKTsKLS8vICAgICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotLy8gICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOWUFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LmdldFBhcmVudE5vZGUoKSwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5ld0dsb2JhbFR5cGVOYW1lKCJDb21wbGV4VHlwZSIpKSk7Ci0gICAgICAgIGFkZE1vdmVBbm9ueW1vdXNHbG9iYWwobWFuYWdlciwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX01BS0VfQU5PTllNT1VTX1RZUEVfR0xPQkFMIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7IC8vCi0gICAgICBYU0RET01IZWxwZXIgeHNkRE9NSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgRWxlbWVudCBkZXJpdmVkQnlOb2RlID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnQocGFyZW50KTsKLSAgICAgIFN0cmluZyBkZXJpdmVkQnlOYW1lID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeU5hbWUocGFyZW50KTsKLSAgICAgIGJvb2xlYW4gYW5ub3RhdGlvbkV4aXN0cyA9IGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwKLSAgICAgICAgICBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBpZiAoZGVyaXZlZEJ5Tm9kZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBUeXBlc0hlbHBlciB0eXBlc0hlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihnZXRYU0RTY2hlbWEoKSk7Ci0gICAgICAgIFN0cmluZyBmaXJzdFR5cGUgPSAiIjsKLSAgICAgICAgTGlzdCBsaXN0T2ZDVCA9IHR5cGVzSGVscGVyLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpOwotICAgICAgICBpZiAobGlzdE9mQ1Quc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0VHlwZSA9IChTdHJpbmcpIChsaXN0T2ZDVCkuZ2V0KDApOwotICAgICAgICB9Ci0gICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFLCBmaXJzdFR5cGUpKTsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9SRVNUUklDVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9FWFRFTlNJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7IC8vCi0gICAgICBYU0RET01IZWxwZXIgeHNkRE9NSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgRWxlbWVudCBkZXJpdmVkQnlOb2RlID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnQocGFyZW50KTsKLSAgICAgIFN0cmluZyBkZXJpdmVkQnlOYW1lID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeU5hbWUocGFyZW50KTsKLSAgICAgIGJvb2xlYW4gYW5ub3RhdGlvbkV4aXN0cyA9IGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwKLSAgICAgICAgICBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBpZiAoZGVyaXZlZEJ5Tm9kZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBUeXBlc0hlbHBlciB0eXBlc0hlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihnZXRYU0RTY2hlbWEoKSk7Ci0gICAgICAgIFN0cmluZyBmaXJzdFR5cGUgPSAiIjsKLSAgICAgICAgTGlzdCBsaXN0T2ZDVCA9IHR5cGVzSGVscGVyLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpOwotICAgICAgICBpZiAobGlzdE9mQ1Quc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0VHlwZSA9IChTdHJpbmcpIChsaXN0T2ZDVCkuZ2V0KDApOwotICAgICAgICB9Ci0gICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFLCBmaXJzdFR5cGUpKTsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9SRVNUUklDVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9FWFRFTlNJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBudWxsKTsKLSAgICAgIH0KLSAgICAgIC8qCi0gICAgICAgKiBmb3IgY29tYmluZWQgU2ltcGxlQ29udGVudCBhbmQgZGVyaXZlZEJ5IG5vZGVzIChidXQgd2l0aG91dAotICAgICAgICogcmVzdHJpY3Rpb25zKSBYU0RET01IZWxwZXIgeHNkRE9NSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOyBFbGVtZW50Ci0gICAgICAgKiBkZXJpdmVkQnlOb2RlID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnQocGFyZW50KTsgU3RyaW5nCi0gICAgICAgKiBkZXJpdmVkQnlOYW1lID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeU5hbWUocGFyZW50KTsKLSAgICAgICAqIAotICAgICAgICogaWYgKGRlcml2ZWRCeU5vZGUgIT0gbnVsbCkgeyBpZiAoZGVyaXZlZEJ5TmFtZS5lcXVhbHMoInJlc3RyaWN0aW9uIikpIHsKLSAgICAgICAqIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsCi0gICAgICAgKiBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgIl9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFIiwKLSAgICAgICAqIGF0dHJpYnV0ZXMsIGRlcml2ZWRCeU5vZGUsIHJlbGF0aXZlTm9kZSk7IH0KLSAgICAgICAqIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsCi0gICAgICAgKiBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iLAotICAgICAgICogYXR0cmlidXRlcywgZGVyaXZlZEJ5Tm9kZSwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAqIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywKLSAgICAgICAqICJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUiLCBhdHRyaWJ1dGVzLCBkZXJpdmVkQnlOb2RlLCByZWxhdGl2ZU5vZGUpOwotICAgICAgICogYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsgYXR0cmlidXRlcy5hZGQobmV3Ci0gICAgICAgKiBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsICIiKSk7Ci0gICAgICAgKiBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsCi0gICAgICAgKiBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsCi0gICAgICAgKiAiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRiIsIGF0dHJpYnV0ZXMsIGRlcml2ZWRCeU5vZGUsCi0gICAgICAgKiByZWxhdGl2ZU5vZGUpOyBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICogYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgICAqIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsICJfVUlfQUNUSU9OX0FERF9BTllfQVRUUklCVVRFIiwKLSAgICAgICAqIGF0dHJpYnV0ZXMsIGRlcml2ZWRCeU5vZGUsIHJlbGF0aXZlTm9kZSk7IH0gZWxzZSB7IFR5cGVzSGVscGVyCi0gICAgICAgKiB0eXBlc0hlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihnZXRYU0RTY2hlbWEoKSk7IFN0cmluZyBmaXJzdFR5cGUgPQotICAgICAgICogKFN0cmluZykodHlwZXNIZWxwZXIuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKSkuZ2V0KDApOyBhdHRyaWJ1dGVzID0KLSAgICAgICAqIG5ldyBBcnJheUxpc3QoKTsgYXR0cmlidXRlcy5hZGQobmV3Ci0gICAgICAgKiBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFLCBmaXJzdFR5cGUpKTsKLSAgICAgICAqIAotICAgICAgICogYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgICAqIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCAiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIsCi0gICAgICAgKiBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgKiBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLAotICAgICAgICogWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCAiX1VJX0FDVElPTl9BRERfUkVTVFJJQ1RJT04iLAotICAgICAgICogYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICogYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgICAqIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsICJfVUlfQUNUSU9OX0FERF9FWFRFTlNJT04iLAotICAgICAgICogYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOyB9Ci0gICAgICAgKi8KLSAgICAgIC8vICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgIC8vIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywKLSAgICAgIC8vICJfVUlfQUNUSU9OX0FERF9DT05URU5UX01PREVMIiwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgLy8gICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgLy8gICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCAiIikpOwotICAgICAgLy8gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLAotICAgICAgLy8gWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLAotICAgICAgLy8gIl9VSV9BRERfR1JPVVBfUkVGIiwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgLy8gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsCi0gICAgICAvLyAiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFIiwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgLy8gICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgLy8gICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCAiIikpOwotICAgICAgLy8gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsCi0gICAgICAvLyBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsCi0gICAgICAvLyAiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRiIsIGF0dHJpYnV0ZXMsIHBhcmVudCwKLSAgICAgIC8vIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAvLyAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsCi0gICAgICAvLyBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCAiX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSIsCi0gICAgICAvLyBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcGFyZW50Tm9kZSA9IChFbGVtZW50KSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgLy8gPHNpbXBsZUNvbnRlbnQ+Ci0gICAgICAvLyAgICA8cmVzdHJpY3Rpb24+Ci0gICAgICAvLyAgICAgIC4uLgotICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnROb2RlLCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBib29sZWFuIGFubm90YXRpb25FeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBhbnlBdHRyaWJ1dGVFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgTm9kZSBhbnlBdHRyaWJ1dGVOb2RlID0gbnVsbDsKLSAgICAgICAgYW55QXR0cmlidXRlRXhpc3RzID0gZWxlbWVudEV4aXN0cyhYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBwYXJlbnQpOwotICAgICAgICBhbm5vdGF0aW9uRXhpc3RzID0gYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQKLSAgICAgICAgICAgIC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICBpZiAoYW5ub3RhdGlvbkV4aXN0cykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgYW5ub3RhdGlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgICAgICAvL2FkZENyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgICAgICAvLyBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywKLSAgICAgICAgICAvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9MT0NBTF9TSU1QTEVfVFlQRSIpLAotICAgICAgICAgIC8vIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy9hZGRDcmVhdGVMb2NhbFNpbXBsZVR5cGVBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsCi0gICAgICAgICAgLy8gWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsCi0gICAgICAgICAgLy8gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfTE9DQUxfU0lNUExFX1RZUEUiKSwKLSAgICAgICAgICAvLyBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywKLSAgICAgICAgICogIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSIsIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICogYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsgYXR0cmlidXRlcy5hZGQobmV3Ci0gICAgICAgICAqIERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSwgIiIpKTsKLSAgICAgICAgICogYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLAotICAgICAgICAgKiBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsCi0gICAgICAgICAqICJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGIiwgYXR0cmlidXRlcywgcGFyZW50LAotICAgICAgICAgKiByZWxhdGl2ZU5vZGUpOyBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgKiBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLAotICAgICAgICAgKiBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLAotICAgICAgICAgKiAiX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSIsIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICovCi0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIGlmIChhbnlBdHRyaWJ1dGVFeGlzdHMpCi0gICAgICAgIHsKLSAgICAgICAgICBhbnlBdHRyaWJ1dGVOb2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdOYW1lKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgIkF0dHJpYnV0ZSIsIGZhbHNlKSkpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW55QXR0cmlidXRlTm9kZSk7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGRVJFTkNFIiksIHBhcmVudCwgYW55QXR0cmlidXRlTm9kZSk7Ci0gICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUYiKSwgcGFyZW50LCBhbnlBdHRyaWJ1dGVOb2RlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdOYW1lKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgIkF0dHJpYnV0ZSIsIGZhbHNlKSkpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldExhc3RDaGlsZCgpKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50UmVmQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9SRUZFUkVOQ0UiKSwgcGFyZW50LCBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGIiksIHBhcmVudCwgcGFyZW50LmdldExhc3RDaGlsZCgpKTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOWUFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0gICAgICB9Ci0gICAgICAvLyA8c2ltcGxlVHlwZT4KLSAgICAgIC8vICAgIDxyZXN0cmljdGlvbj4KLSAgICAgIC8vICAgICAgLi4uCi0gICAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50Tm9kZSwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBhbm5vdGF0aW9uRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgICBhbm5vdGF0aW9uRXhpc3RzID0gYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQKLSAgICAgICAgICAgIC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICBpZiAoYW5ub3RhdGlvbkV4aXN0cykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgYW5ub3RhdGlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgICAgICBhZGRDcmVhdGVMb2NhbFNpbXBsZVR5cGVBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9MT0NBTF9TSU1QTEVfVFlQRSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIGFubm90YXRpb25Ob2RlCi0gICAgICAgICAgICAgIC5nZXROZXh0U2libGluZygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhZGRDcmVhdGVMb2NhbFNpbXBsZVR5cGVBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9MT0NBTF9TSU1QTEVfVFlQRSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudAotICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgfQotICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5QQVRURVJOX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9QQVRURVJOIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9FTlVNIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgICAgIGFkZEVudW1zQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5FTlVNRVJBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfRU5VTVMiKSwgYXR0cmlidXRlcywgcGFyZW50LCBudWxsKTsKLSAgICAgIH0KLSAgICAgIC8vIDxjb21wbGV4Q29udGVudD4KLSAgICAgIC8vICAgIDxyZXN0cmljdGlvbj4KLSAgICAgIC8vICAgICAgLi4uCi0gICAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50Tm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gYW5ub3RhdGlvbkV4aXN0cyA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGFueUF0dHJpYnV0ZUV4aXN0cyA9IGZhbHNlOwotICAgICAgICBOb2RlIGFueUF0dHJpYnV0ZU5vZGUgPSBudWxsOwotICAgICAgICBib29sZWFuIHNlcXVlbmNlRXhpc3RzID0gZWxlbWVudEV4aXN0cyhYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIHBhcmVudCk7Ci0gICAgICAgIGJvb2xlYW4gY2hvaWNlRXhpc3RzID0gZWxlbWVudEV4aXN0cyhYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHLCBwYXJlbnQpOwotICAgICAgICBib29sZWFuIGFsbEV4aXN0cyA9IGVsZW1lbnRFeGlzdHMoWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRywgcGFyZW50KTsKLSAgICAgICAgYm9vbGVhbiBncm91cEV4aXN0cyA9IGVsZW1lbnRFeGlzdHMoWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCBwYXJlbnQpOwotICAgICAgICBhbnlBdHRyaWJ1dGVFeGlzdHMgPSBlbGVtZW50RXhpc3RzKFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHBhcmVudCk7Ci0gICAgICAgIGFubm90YXRpb25FeGlzdHMgPSBhZGRDcmVhdGVBbm5vdGF0aW9uQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudAotICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uRXhpc3RzKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCEoc2VxdWVuY2VFeGlzdHMgfHwgY2hvaWNlRXhpc3RzIHx8IGFsbEV4aXN0cyB8fCBncm91cEV4aXN0cykpCi0gICAgICAgICAgewotICAgICAgICAgICAgTm9kZSBhbm5vdGF0aW9uTm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9DT05URU5UX01PREVMIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUKLSAgICAgICAgICAgICAgICAuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIGFkZENyZWF0ZUdyb3VwQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywKLSAgICAgICAgICAgIC8vICJfVUlfQUNUSU9OX0FERF9HUk9VUCIsIGF0dHJpYnV0ZXMsIHBhcmVudCwKLSAgICAgICAgICAgIC8vIGFubm90YXRpb25Ob2RlLmdldE5leHRTaWJsaW5nKCkpOwotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BRERfR1JPVVBfUkVGIiksIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICghKHNlcXVlbmNlRXhpc3RzIHx8IGNob2ljZUV4aXN0cyB8fCBhbGxFeGlzdHMgfHwgZ3JvdXBFeGlzdHMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ09OVEVOVF9NT0RFTCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBhZGRDcmVhdGVHcm91cEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsCi0gICAgICAgICAgICAvLyAiX1VJX0FDVElPTl9BRERfR1JPVVAiLCBhdHRyaWJ1dGVzLCBwYXJlbnQsCi0gICAgICAgICAgICAvLyBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUREX0dST1VQX1JFRiIpLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBpZiAoYW55QXR0cmlidXRlRXhpc3RzKQotICAgICAgICB7Ci0gICAgICAgICAgYW55QXR0cmlidXRlTm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3TmFtZShwYXJlbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsICJBdHRyaWJ1dGUiLCBmYWxzZSkpKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkpKTsKLSAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIGFueUF0dHJpYnV0ZU5vZGUpOwotICAgICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRkVSRU5DRSIpLCBwYXJlbnQsIGFueUF0dHJpYnV0ZU5vZGUpOwotICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGIiksIHBhcmVudCwgYW55QXR0cmlidXRlTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3TmFtZShwYXJlbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsICJBdHRyaWJ1dGUiLCBmYWxzZSkpKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkpKTsKLSAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGRVJFTkNFIiksIHBhcmVudCwgcGFyZW50LmdldExhc3RDaGlsZCgpKTsKLSAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50UmVmQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRiIpLCBwYXJlbnQsIHBhcmVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgeyAvLwotICAgICAgRWxlbWVudCBwYXJlbnROb2RlID0gKEVsZW1lbnQpIHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAvLyA8c2ltcGxlQ29udGVudD4KLSAgICAgIC8vICAgIDxleHRlbnNpb24+Ci0gICAgICAvLyAgICAgIC4uLgotICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnROb2RlLCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBib29sZWFuIGFubm90YXRpb25FeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBhbnlBdHRyaWJ1dGVFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgTm9kZSBhbnlBdHRyaWJ1dGVOb2RlID0gbnVsbDsKLSAgICAgICAgYW55QXR0cmlidXRlRXhpc3RzID0gZWxlbWVudEV4aXN0cyhYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBwYXJlbnQpOwotICAgICAgICBhbm5vdGF0aW9uRXhpc3RzID0gYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQKLSAgICAgICAgICAgIC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBpZiAoYW55QXR0cmlidXRlRXhpc3RzKQotICAgICAgICB7Ci0gICAgICAgICAgYW55QXR0cmlidXRlTm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3TmFtZShwYXJlbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsICJBdHRyaWJ1dGUiLCBmYWxzZSkpKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkpKTsKLSAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIGFueUF0dHJpYnV0ZU5vZGUpOwotICAgICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRkVSRU5DRSIpLCBwYXJlbnQsIGFueUF0dHJpYnV0ZU5vZGUpOwotICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGIiksIHBhcmVudCwgYW55QXR0cmlidXRlTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3TmFtZShwYXJlbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsICJBdHRyaWJ1dGUiLCBmYWxzZSkpKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkpKTsKLSAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGRVJFTkNFIiksIHBhcmVudCwgcGFyZW50LmdldExhc3RDaGlsZCgpKTsKLSAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50UmVmQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRiIpLCBwYXJlbnQsIHBhcmVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotICAgICAgfQotICAgICAgLy8gPGNvbXBsZXhDb250ZW50PgotICAgICAgLy8gICAgPGV4dGVuc2lvbj4KLSAgICAgIC8vICAgICAgLi4uCi0gICAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50Tm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gYW5ub3RhdGlvbkV4aXN0cyA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGFueUF0dHJpYnV0ZUV4aXN0cyA9IGZhbHNlOwotICAgICAgICBOb2RlIGFueUF0dHJpYnV0ZU5vZGUgPSBudWxsOwotICAgICAgICBib29sZWFuIHNlcXVlbmNlRXhpc3RzID0gZWxlbWVudEV4aXN0cyhYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIHBhcmVudCk7Ci0gICAgICAgIGJvb2xlYW4gY2hvaWNlRXhpc3RzID0gZWxlbWVudEV4aXN0cyhYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHLCBwYXJlbnQpOwotICAgICAgICBib29sZWFuIGFsbEV4aXN0cyA9IGVsZW1lbnRFeGlzdHMoWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRywgcGFyZW50KTsKLSAgICAgICAgYm9vbGVhbiBncm91cEV4aXN0cyA9IGVsZW1lbnRFeGlzdHMoWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCBwYXJlbnQpOwotICAgICAgICBhbnlBdHRyaWJ1dGVFeGlzdHMgPSBlbGVtZW50RXhpc3RzKFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHBhcmVudCk7Ci0gICAgICAgIGFubm90YXRpb25FeGlzdHMgPSBhZGRDcmVhdGVBbm5vdGF0aW9uQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudAotICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uRXhpc3RzKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCEoc2VxdWVuY2VFeGlzdHMgfHwgY2hvaWNlRXhpc3RzIHx8IGFsbEV4aXN0cyB8fCBncm91cEV4aXN0cykpCi0gICAgICAgICAgewotICAgICAgICAgICAgTm9kZSBhbm5vdGF0aW9uTm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9DT05URU5UX01PREVMIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUKLSAgICAgICAgICAgICAgICAuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIGFkZENyZWF0ZUdyb3VwQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywKLSAgICAgICAgICAgIC8vIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0dST1VQIiksIGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAvLyBwYXJlbnQsCi0gICAgICAgICAgICAvLyBhbm5vdGF0aW9uTm9kZS5nZXROZXh0U2libGluZygpKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUREX0dST1VQX1JFRiIpLCBwYXJlbnQsIGFubm90YXRpb25Ob2RlLmdldE5leHRTaWJsaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIShzZXF1ZW5jZUV4aXN0cyB8fCBjaG9pY2VFeGlzdHMgfHwgYWxsRXhpc3RzIHx8IGdyb3VwRXhpc3RzKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NPTlRFTlRfTU9ERUwiKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgYWRkQ3JlYXRlR3JvdXBBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLAotICAgICAgICAgICAgLy8gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfR1JPVVAiKSwgYXR0cmlidXRlcywKLSAgICAgICAgICAgIC8vIHBhcmVudCwKLSAgICAgICAgICAgIC8vIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BRERfR1JPVVBfUkVGIiksIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIGlmIChhbnlBdHRyaWJ1dGVFeGlzdHMpCi0gICAgICAgIHsKLSAgICAgICAgICBhbnlBdHRyaWJ1dGVOb2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdOYW1lKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgIkF0dHJpYnV0ZSIsIGZhbHNlKSkpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW55QXR0cmlidXRlTm9kZSk7Ci0gICAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGRVJFTkNFIiksIHBhcmVudCwgYW55QXR0cmlidXRlTm9kZSk7Ci0gICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUYiKSwgcGFyZW50LCBhbnlBdHRyaWJ1dGVOb2RlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdOYW1lKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgIkF0dHJpYnV0ZSIsIGZhbHNlKSkpOwotICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldExhc3RDaGlsZCgpKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50UmVmQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9SRUZFUkVOQ0UiKSwgcGFyZW50LCBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGIiksIHBhcmVudCwgcGFyZW50LmdldExhc3RDaGlsZCgpKTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOWUFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5SRURFRklORV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsgLy8KLSAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBudWxsKTsKLSAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgICBhZGRDcmVhdGVHcm91cEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0dST1VQIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgYWRkT3BlblNjaGVtYUFjdGlvbihtYW5hZ2VyLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX09QRU5fU0NIRU1BIiksIHBhcmVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgeyAvLwotICAgICAgYm9vbGVhbiBhbm5vdGF0aW9uRXhpc3RzID0gYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LAotICAgICAgICAgIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgIGFkZENyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0xPQ0FMX1NJTVBMRV9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsgLy8KLSAgICAgIGJvb2xlYW4gYW5ub3RhdGlvbkV4aXN0cyA9IGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwKLSAgICAgICAgICBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBhZGRDcmVhdGVMb2NhbFNpbXBsZVR5cGVBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0xPQ0FMX1NJTVBMRV9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5VTklRVUVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7IC8vCi0gICAgICBib29sZWFuIGFubm90YXRpb25FeGlzdHMgPSBhZGRDcmVhdGVBbm5vdGF0aW9uQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsCi0gICAgICAgICAgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlhQQVRIX0FUVFJJQlVURSwgIiIpKTsKLSAgICAgIGlmIChhbm5vdGF0aW9uRXhpc3RzKQotICAgICAgewotICAgICAgICBOb2RlIGFubm90YXRpb25Ob2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5TRUxFQ1RPUl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfU0VMRUNUT1IiKSwgYXR0cmlidXRlcywgcGFyZW50LCBhbm5vdGF0aW9uTm9kZS5nZXROZXh0U2libGluZygpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLlNFTEVDVE9SX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9TRUxFQ1RPUiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgfQotICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlhQQVRIX0FUVFJJQlVURSwgIiIpKTsKLSAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkZJRUxEX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9GSUVMRCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuS0VZUkVGX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgeyAvLwotICAgICAgYm9vbGVhbiBhbm5vdGF0aW9uRXhpc3RzID0gYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LAotICAgICAgICAgIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5YUEFUSF9BVFRSSUJVVEUsICIiKSk7Ci0gICAgICBpZiAoYW5ub3RhdGlvbkV4aXN0cykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBhbm5vdGF0aW9uTm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuU0VMRUNUT1JfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NFTEVDVE9SIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5TRUxFQ1RPUl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfU0VMRUNUT1IiKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIH0KLSAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5YUEFUSF9BVFRSSUJVVEUsICIiKSk7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5GSUVMRF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfRklFTEQiKSwgYXR0cmlidXRlcywgcGFyZW50LCBudWxsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLktFWV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsgLy8KLSAgICAgIGJvb2xlYW4gYW5ub3RhdGlvbkV4aXN0cyA9IGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwKLSAgICAgICAgICBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuWFBBVEhfQVRUUklCVVRFLCAiIikpOwotICAgICAgaWYgKGFubm90YXRpb25FeGlzdHMpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgYW5ub3RhdGlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLlNFTEVDVE9SX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9TRUxFQ1RPUiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIGFubm90YXRpb25Ob2RlLmdldE5leHRTaWJsaW5nKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuU0VMRUNUT1JfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NFTEVDVE9SIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICB9Ci0gICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuWFBBVEhfQVRUUklCVVRFLCAiIikpOwotICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuRklFTERfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0ZJRUxEIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgIGFkZE9wZW5TY2hlbWFBY3Rpb24obWFuYWdlciwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9PUEVOX1NDSEVNQSIpLCBwYXJlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0VMRUNUT1JfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuRklFTERfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuSU5DTFVERV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgYWRkT3BlblNjaGVtYUFjdGlvbihtYW5hZ2VyLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX09QRU5fU0NIRU1BIiksIHBhcmVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5BTllfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IGdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocGFyZW50KTsKLSAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAvLyBuZWVkIHRvIGFkZCBhZGFwdGVycyBmb3IgdGhlIEFOWSBlbGVtZW50LiAgSSdkIHJhdGhlciBub3QgcHJvdmlkZSB0aGlzIG1lbnUKLSAgICAgIC8vIGFuZCBsZXQgdXNlcnMgc2VlIHRoYXQgdGhlIGdyYXBoIHZpZXcgZG9lc24ndCB1cGRhdGUKLS8vICAgICAgYWRkTXVsdGlwbGljaXR5TWVudShjb25jcmV0ZUNvbXBvbmVudCwgbWFuYWdlcik7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIGFkZENyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0xPQ0FMX1NJTVBMRV9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgbnVsbCk7Ci0gICAgfQotICAgIC8vIEZhY2V0cyBhbGwgaGF2ZSBvcHRpb25hbCBhbm5vdGF0aW9uIG5vZGVzCi0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLk1JTkVYQ0xVU0lWRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5NSU5JTkNMVVNJVkVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBhZGRDcmVhdGVBbm5vdGF0aW9uQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuTUFYRVhDTFVTSVZFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLk1BWElOQ0xVU0lWRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5UT1RBTERJR0lUU19FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5GUkFDVElPTkRJR0lUU19FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5MRU5HVEhfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBhZGRDcmVhdGVBbm5vdGF0aW9uQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuTUlOTEVOR1RIX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLk1BWExFTkdUSF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5FTlVNRVJBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5XSElURVNQQUNFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlBBVFRFUk5fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBhZGRDcmVhdGVBbm5vdGF0aW9uQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgIHsKLSAgICAgIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgIHsKLSAgICAgIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICB7Ci0gICAgICAvLyBUT0RPIGNvbW1vbiB0aGlzIHVwIHdpdGggdGhlIG5vbi1yZWYgY2FzZQotLy8gICAgICBhZGRDcmVhdGVBbm5vdGF0aW9uQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpZ2V0WFNEU2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChwYXJlbnQpOwotICAgICAgaWYgKHhzZENvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbil4c2RDb25jcmV0ZUNvbXBvbmVudDsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIGlmIChyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50ID0gcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudCgpOyAKLSAgICAgICAgCi0gICAgICAgICAgRWxlbWVudCBwYXJlbnROb2RlID0gKEVsZW1lbnQpIHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0KLSAgICAgICAgICBib29sZWFuIGlzR2xvYmFsRWxlbWVudCA9IGZhbHNlOwotICAgICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50Tm9kZSwgWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzR2xvYmFsRWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJvb2xlYW4gYW5ub3RhdGlvbkV4aXN0cyA9IGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwKLSAgICAgICAgICAgICAgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgICAgYm9vbGVhbiBzaW1wbGVUeXBlRXhpc3RzID0gZWxlbWVudEV4aXN0cyhYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgcGFyZW50KTsKLSAgICAgICAgICBib29sZWFuIGNvbXBsZXhUeXBlRXhpc3RzID0gZWxlbWVudEV4aXN0cyhYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcsIHBhcmVudCk7Ci0gICAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgICBpZiAoYW5ub3RhdGlvbkV4aXN0cykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIGFubm90YXRpb25Ob2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICAgICAgICBpZiAoIShzaW1wbGVUeXBlRXhpc3RzIHx8IGNvbXBsZXhUeXBlRXhpc3RzKSAmJiBhbm5vdGF0aW9uTm9kZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL2FkZENyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgICAgICAgICAgLy8gWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsCi0gICAgICAgICAgICAgIC8vIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0xPQ0FMX1NJTVBMRV9UWVBFIiksCi0gICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgICAgICAgICAgIC8vYWRkQ3JlYXRlTG9jYWxDb21wbGV4VHlwZUFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgICAgICAgICAgLy8gWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCAiQWRkIExvY2FsIENvbXBsZXggVHlwZSIsCi0gICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTaG91bGQgc3RpbGwgYmUgYWJsZSB0byBhZGQgdGhlIGNvbnRlbnQgbW9kZWxzIGlmIHRoZSBhbm9ueW1vdXMgdHlwZQotICAgICAgICAgICAgLy8gZXhpc3RzLAotICAgICAgICAgICAgLy8gaWUuIHdpdGggYXR0cmlidXRlcwotICAgICAgICAgICAgLy8gICAgICAgIGlmICghKHNpbXBsZVR5cGVFeGlzdHMgfHwgY29tcGxleFR5cGVFeGlzdHMpKQotICAgICAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgICAgIC8vYWRkQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uSWZOb3RFeGlzdChtYW5hZ2VyLAotICAgICAgICAgICAgLy8gWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsCi0gICAgICAgICAgICAvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9MT0NBTF9TSU1QTEVfVFlQRSIpLAotICAgICAgICAgICAgLy8gYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgICAgIC8vYWRkQ3JlYXRlTG9jYWxDb21wbGV4VHlwZUFjdGlvbklmTm90RXhpc3QobWFuYWdlciwKLSAgICAgICAgICAgIC8vIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgIkFkZCBMb2NhbCBDb21wbGV4IFR5cGUiLAotICAgICAgICAgICAgLy8gYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gZ2V0WFNEU2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChwYXJlbnQpOwotICAgICAgICAgICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFkZE1vZGVsR3JvdXBBY3Rpb24gYWRkTW9kZWxHcm91cEFjdGlvbiA9IG5ldyBBZGRNb2RlbEdyb3VwQWN0aW9uKGNvbmNyZXRlQ29tcG9uZW50LCBYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwpOwotICAgICAgICAgICAgICBhZGRNb2RlbEdyb3VwQWN0aW9uLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgICAgICAgICAgICBtYW5hZ2VyLmFkZChhZGRNb2RlbEdyb3VwQWN0aW9uKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGFkZE1vZGVsR3JvdXBBY3Rpb24gPSBuZXcgQWRkTW9kZWxHcm91cEFjdGlvbihjb25jcmV0ZUNvbXBvbmVudCwgWFNEQ29tcG9zaXRvci5DSE9JQ0VfTElURVJBTCk7Ci0gICAgICAgICAgICAgIGFkZE1vZGVsR3JvdXBBY3Rpb24uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgICAgICAgICAgIG1hbmFnZXIuYWRkKGFkZE1vZGVsR3JvdXBBY3Rpb24pOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgYWRkTW9kZWxHcm91cEFjdGlvbiA9IG5ldyBBZGRNb2RlbEdyb3VwQWN0aW9uKGNvbmNyZXRlQ29tcG9uZW50LCBYU0RDb21wb3NpdG9yLkFMTF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgYWRkTW9kZWxHcm91cEFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICAgICAgbWFuYWdlci5hZGQoYWRkTW9kZWxHcm91cEFjdGlvbik7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgLy8gICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsICJOZXdfVW5pcXVlIikpOwotICAgIC8vICAgICAgYWRkQ3JlYXRlSWRlbnRpdHlDb25zdHJhaW50c0FjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuVU5JUVVFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9VTklRVUUiKSwgYXR0cmlidXRlcywgcGFyZW50LCBudWxsKTsKLSAgICAvLyAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgIk5ld19LZXkiKSk7Ci0gICAgLy8gICAgICBhZGRDcmVhdGVJZGVudGl0eUNvbnN0cmFpbnRzQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5LRVlfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0tFWSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgIC8vICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCAiTmV3X0tleVJlZiIpKTsKLSAgICAvLyAgICAgIGFkZENyZWF0ZUlkZW50aXR5Q29uc3RyYWludHNBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLktFWVJFRl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfS0VZX1JFRiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIG51bGwpOwotICAgICAgICAgIFhTRERPTUhlbHBlciBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICAgICAgRWxlbWVudCBhbm9ueW1vdXNUeXBlID0gKEVsZW1lbnQpIGRvbUhlbHBlci5nZXRDaGlsZE5vZGUocGFyZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgICAgIGlmIChhbm9ueW1vdXNUeXBlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3R2xvYmFsVHlwZU5hbWUoIkNvbXBsZXhUeXBlIikpKTsKLSAgICAgICAgICAgIGFkZE1vdmVBbm9ueW1vdXNHbG9iYWwobWFuYWdlciwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX01BS0VfQU5PTllNT1VTX1RZUEVfR0xPQkFMIiksIGF0dHJpYnV0ZXMsIGFub255bW91c1R5cGUsIG51bGwpOwotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGFub255bW91c1R5cGUgPSAoRWxlbWVudCkgZG9tSGVscGVyLmdldENoaWxkTm9kZShwYXJlbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgICBpZiAoYW5vbnltb3VzVHlwZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5ld0dsb2JhbFR5cGVOYW1lKCJTaW1wbGVUeXBlIikpKTsKLSAgICAgICAgICAgIGFkZE1vdmVBbm9ueW1vdXNHbG9iYWwobWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fTUFLRV9BTk9OWU1PVVNfVFlQRV9HTE9CQUwiKSwgYXR0cmlidXRlcywgYW5vbnltb3VzVHlwZSwgbnVsbCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWRkTXVsdGlwbGljaXR5TWVudSh4c2RDb25jcmV0ZUNvbXBvbmVudCwgbWFuYWdlcik7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qCi0gICAgICogVGhlc2UgaGF2ZSBub25lIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsCi0gICAgICogWFNEQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkgeyB9IGVsc2UgaWYKLSAgICAgKiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFQUElORk9fRUxFTUVOVF9UQUcsCi0gICAgICogZmFsc2UpKSB7IH0KLSAgICAgKi8KLSAgICAKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IGdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocGFyZW50KTsKLSAgICBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICB7Ci0gICAgICBhZGRSZWZhY3Rvck1lbnVHcm91cChtYW5hZ2VyKTsKLSAgICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciBpbnN0YW5jZW9mIFhTRFNlbGVjdGlvbk1hbmFnZXIpCi0gICAgICB7Ci0gICAgICAgIGlmIChzb3VyY2VDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RFZGl0UGFydFZpZXdlcikKLSAgICAgICAgewotICAgICAgICAgIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gKEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpc291cmNlQ29udGV4dDsKLSAgICAgICAgCi0gICAgICAgICAgT2JqZWN0IG9iaiA9IHZpZXdlci5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBjYW5FZGl0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbGVtZW50RGVjbGFyYXRpb25FZGl0UGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW0gPSAoKEVsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0KW9iaikuZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICAgIGlmIChlbGVtLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYW5FZGl0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gKChNb2RlbEdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KW9iaikuZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgaWYgKGdyb3VwLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhbkVkaXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9ICgoQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQpb2JqKS5nZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgaWYgKGN0LmdldE5hbWUoKSA9PSBudWxsKSAvLyBhbm9ueW1vdXMKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhbkVkaXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FuRWRpdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhbkVkaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vaWYgKGNhbkVkaXQpCi0gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgR3JhcGhSZW5hbWVBY3Rpb24gZ3JhcGhSZW5hbWVBY3Rpb24gPSBuZXcgR3JhcGhSZW5hbWVBY3Rpb24oKFhTRE5hbWVkQ29tcG9uZW50KWNvbmNyZXRlQ29tcG9uZW50LCAoR3JhcGhpY2FsRWRpdFBhcnQpb2JqKTsKLSAvLyAgICAgICAgICAgICBtYW5hZ2VyLmFkZChncmFwaFJlbmFtZUFjdGlvbik7Ci0gICAgICAgICAgICAJCi0gICAgICAgICAgICAJCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ29udGV4dEluc2VydEl0ZW1zKElNZW51TWFuYWdlciBtYW5hZ2VyLCBFbGVtZW50IHBhcmVudCwgRWxlbWVudCBjdXJyZW50RWxlbWVudCwgTm9kZSByZWxhdGl2ZU5vZGUpCi0gIHsKLSAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjdXJyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLklOQ0xVREVfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fCBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoY3VycmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIGZhbHNlKQotICAgICAgICB8fCBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoY3VycmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5SRURFRklORV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjdXJyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5TQ0hFTUFMT0NBVElPTl9BVFRSSUJVVEUsICIiKSk7Ci0gICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLklOQ0xVREVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lOQ0xVREUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lNUE9SVCIpLCBudWxsLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlJFREVGSU5FX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9SRURFRklORSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OIiksIG51bGwsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGN1cnJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGFkZFNjaGVtYUVsZW1lbnRJdGVtcyhtYW5hZ2VyLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsCi0gICAgICAvLyBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywKLSAgICAgIC8vIGZhbHNlKSkKLSAgICAgIC8vICAgICAgewotICAgICAgLy8gICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsCi0gICAgICAvLyAiX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUiLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAvLyAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBhZGRDcmVhdGVMb2NhbFNpbXBsZVR5cGVBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0xPQ0FMX1NJTVBMRV9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGN1cnJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBhZGRTY2hlbWFFbGVtZW50SXRlbXMobWFuYWdlciwgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoY3VycmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGFkZFNjaGVtYUVsZW1lbnRJdGVtcyhtYW5hZ2VyLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjdXJyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgYWRkU2NoZW1hRWxlbWVudEl0ZW1zKG1hbmFnZXIsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGN1cnJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGFkZFNjaGVtYUVsZW1lbnRJdGVtcyhtYW5hZ2VyLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjdXJyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGFkZFNjaGVtYUVsZW1lbnRJdGVtcyhtYW5hZ2VyLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjdXJyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgYWRkU2NoZW1hRWxlbWVudEl0ZW1zKG1hbmFnZXIsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGN1cnJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0RPQyIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BUFBJTkZPX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BUFBfSU5GTyIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjdXJyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLkFQUElORk9fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9ET0MiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVBQX0lORk8iKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3R2xvYmFsTmFtZShTdHJpbmcgZWxlbWVudFRhZywgU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgcmV0dXJuIGdldE5ld0dsb2JhbE5hbWUoZWxlbWVudFRhZywgZGVzY3JpcHRpb24sIGZhbHNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3R2xvYmFsVHlwZU5hbWUoU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgcmV0dXJuIGdldE5ld0dsb2JhbE5hbWUobnVsbCwgZGVzY3JpcHRpb24sIHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdHbG9iYWxOYW1lKFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaXNTaW1wbGVPckNvbXBsZXhUeXBlKQotICB7ICAKLSAgICAgcmV0dXJuIGdldE5ld05hbWUoZ2V0WFNEU2NoZW1hKCkuZ2V0RG9jdW1lbnQoKSwgZWxlbWVudFRhZywgZGVzY3JpcHRpb24sIGlzU2ltcGxlT3JDb21wbGV4VHlwZSk7Ci0gIH0KLQotICAvLyBUT0RPLi4gLndlIG5lZWQgdG8gcmV3cml0ZSB0aGlzIGNvZGUgdG8gbWUgbW9kZWwgZHJpdmVuLi4uIG5vdCBkb2N1bWVudCBkcml2ZW4KLSAgLy8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdOYW1lKE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBkZXNjcmlwdGlvbiwgYm9vbGVhbiBpc1NpbXBsZU9yQ29tcGxleFR5cGUpCi0gIHsKLSAgICBOb2RlTGlzdCBsaXN0ID0gbnVsbDsKLSAgICBOb2RlTGlzdCB0eXBlTGlzdDIgPSBudWxsOwotICAgIC8vIGlmIHRoZSBnbG9iYWwgbmFtZSBpcyBmb3IgYSBzaW1wbGUgb3IgY29tcGxleCB0eXBlLCB3ZSBpZ25vcmUgdGhlCi0gICAgLy8gZWxlbWVudFRhZyBhbmQgcG9wdWxhdGUgMiBsaXN0cwotICAgIC8vIG9uZSB0byBsb29rIGZvciBhbGwgc2ltcGxlIHR5cGVzIGFuZCB0aGUgb3RoZXIgdG8gbG9vayBmb3IgYWxsIGNvbXBsZXgKLSAgICAvLyB0eXBlcwotICAgIGlmIChpc1NpbXBsZU9yQ29tcGxleFR5cGUpCi0gICAgewotICAgICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9ICgoRG9jdW1lbnQpIHBhcmVudE5vZGUpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgICB0eXBlTGlzdDIgPSAoKERvY3VtZW50KSBwYXJlbnROb2RlKS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSAoKEVsZW1lbnQpIHBhcmVudE5vZGUpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgICB0eXBlTGlzdDIgPSAoKEVsZW1lbnQpIHBhcmVudE5vZGUpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KQotICAgICAgewotICAgICAgICBsaXN0ID0gKChEb2N1bWVudCkgcGFyZW50Tm9kZSkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIGVsZW1lbnRUYWcpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSAoKEVsZW1lbnQpIHBhcmVudE5vZGUpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBlbGVtZW50VGFnKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgU3RyaW5nIG5hbWUgPSAiTmV3IiArIGRlc2NyaXB0aW9uOwotICAgIGlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5nZXRMZW5ndGgoKSA9PSAwICYmICh0eXBlTGlzdDIgIT0gbnVsbCAmJiB0eXBlTGlzdDIuZ2V0TGVuZ3RoKCkgPT0gMCkpCi0gICAgewotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMTAwOyBpKyspCi0gICAgewotICAgICAgYm9vbGVhbiBuZXdOYW1lID0gZmFsc2U7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGorKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGN1cnJOYW1lID0gKChFbGVtZW50KSBsaXN0Lml0ZW0oaikpLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotICAgICAgICBpZiAoY3Vyck5hbWUgPT0gbnVsbCB8fCBjdXJyTmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJOYW1lLmVxdWFscyhuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWUgPSAiTmV3IiArIGRlc2NyaXB0aW9uICsgU3RyaW5nLnZhbHVlT2YoaSk7Ci0gICAgICAgICAgbmV3TmFtZSA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGlmIHRoZXJlIGlzIGFub3RoZXIgdHlwZSBsaXN0IGFuZCB3ZSBoYXZlbid0IGNyZWF0ZWQgYSBuZXcgbmFtZSwgdGhlbgotICAgICAgLy8gY2hlY2sgdGhlIHR5cGUgbGlzdAotICAgICAgaWYgKHR5cGVMaXN0MiAhPSBudWxsICYmICFuZXdOYW1lKQotICAgICAgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGVMaXN0Mi5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGN1cnJOYW1lID0gKChFbGVtZW50KSB0eXBlTGlzdDIuaXRlbShqKSkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0gICAgICAgICAgaWYgKGN1cnJOYW1lID09IG51bGwgfHwgY3Vyck5hbWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGN1cnJOYW1lLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lID0gIk5ldyIgKyBkZXNjcmlwdGlvbiArIFN0cmluZy52YWx1ZU9mKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaXJzdEdsb2JhbEVsZW1lbnRUYWdOYW1lKFN0cmluZyBlbGVtZW50VGFnKQotICB7Ci0gICAgLy9YTUxNb2RlbCBtb2RlbCA9IGdldFhNTE1vZGVsKCk7Ci0gICAgLy9pZiAobW9kZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoc2NoZW1hKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gaGVscGVyLmdldFByZWZpeChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHRydWUpOwotICAgICAgfQotICAgICAgLy8gZ2V0IHRoZSBzY2hlbWEgbm9kZQotICAgICAgTm9kZUxpc3Qgc2xpc3QgPSBzY2hlbWEuZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRyk7Ci0gICAgICBOb2RlIHNjaGVtYU5vZGUgPSBudWxsOwotICAgICAgaWYgKHNsaXN0ICE9IG51bGwgJiYgc2xpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBzY2hlbWFOb2RlID0gc2xpc3QuaXRlbSgwKTsKLSAgICAgIH0KLSAgICAgIE5vZGVMaXN0IGxpc3QgPSBudWxsOwotICAgICAgLy8gZ2V0IHRoZSBzY2hlbWEncyBkaXJlY3QgY2hpbGRyZW4gLSBoZW5jZSwgZ2xvYmFscwotICAgICAgaWYgKHNjaGVtYU5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IHNjaGVtYU5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgfQotICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gUGVyZm9ybWFuY2UgaXNzdWUgcGVyaGFwcz8KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobGlzdC5pdGVtKGkpIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGlzdC5pdGVtKGkpLmdldExvY2FsTmFtZSgpLmVxdWFscyhlbGVtZW50VGFnKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmFtZSA9ICgoRWxlbWVudCkgbGlzdC5pdGVtKGkpKS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyBuYW1lOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZWxlbWVudFRhZy5lcXVhbHMoWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcpKQotICAgICAgewotICAgICAgICByZXR1cm4gaGVscGVyLmdldEdsb2JhbEVsZW1lbnQoc2NoZW1hKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVsZW1lbnRUYWcuZXF1YWxzKFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcpKQotICAgICAgewotICAgICAgICByZXR1cm4gaGVscGVyLmdldEdsb2JhbEF0dHJpYnV0ZShzY2hlbWEpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbWVudFRhZy5lcXVhbHMoWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGhlbHBlci5nZXRHbG9iYWxBdHRyaWJ1dGVHcm91cChzY2hlbWEpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbWVudFRhZy5lcXVhbHMoWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGhlbHBlci5nZXRNb2RlbEdyb3VwKHNjaGVtYSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU2NoZW1hRWxlbWVudEl0ZW1zKElNZW51TWFuYWdlciBtYW5hZ2VyLCBFbGVtZW50IHBhcmVudCwgTm9kZSByZWxhdGl2ZU5vZGUpCi0gIHsKLSAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgLy8gQWRkIEVkaXQgTmFtZXNwYWNlcyBtZW51IGFjdGlvbgotICAgIC8vLy8vLy8vLy8vLy8vLy8gRXh0ZXJuYWxpemUgU3RyaW5nIGJlbG93ISEhISEKLSAgICBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbiBuc0FjdGlvbiA9IG5ldyBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0VESVRfTkFNRVNQQUNFUyIpLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSwgZ2V0WFNEU2NoZW1hKCkpOwotICAgIG1hbmFnZXIuYWRkKG5zQWN0aW9uKTsKLSAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgIERPTUF0dHJpYnV0ZSBuYW1lQXR0cmlidXRlID0gbmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5ld0dsb2JhbFR5cGVOYW1lKCJDb21wbGV4VHlwZSIpKTsKLSAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGF0dHJpYnV0ZXMuYWRkKG5hbWVBdHRyaWJ1dGUpOwotICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pIGFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3R2xvYmFsVHlwZU5hbWUoIlNpbXBsZVR5cGUiKSkpOwotICAgIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pIGFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3R2xvYmFsTmFtZShYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgIkdsb2JhbEVsZW1lbnQiKSkpOwotICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0dMT0JBTF9FTEVNRU5UIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pIGFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3R2xvYmFsTmFtZShYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCAiR2xvYmFsQXR0cmlidXRlIikpKTsKLSAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkpKTsKLSAgICBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0dMT0JBTF9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbikgYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdHbG9iYWxOYW1lKFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgIkF0dHJpYnV0ZUdyb3VwIikpKTsKLSAgICBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pIGFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3R2xvYmFsTmFtZShYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsICJHcm91cCIpKSk7Ci0gICAgQ3JlYXRlR3JvdXBBY3Rpb24gZ3JvdXBBY3Rpb24gPSBhZGRDcmVhdGVHcm91cEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0dST1VQIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICBncm91cEFjdGlvbi5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdHbG9iYWxOYW1lKFhTRENvbnN0YW50cy5OT1RBVElPTl9FTEVNRU5UX1RBRywgIk5vdGF0aW9uIikpKTsKLSAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5QVUJMSUNfQVRUUklCVVRFLCAiIikpOwotICAgIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9OT1RBVElPTiIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgKChDcmVhdGVFbGVtZW50QWN0aW9uKSBhY3Rpb24pLnNldElzR2xvYmFsKHRydWUpOwotICAgIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgbnVsbCwgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbikgYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgfQotCi0gIC8vIHJldHVybnMgd2hldGhlciBlbGVtZW50IGV4aXN0cyBhbHJlYWR5Ci0gIHByb3RlY3RlZCBib29sZWFuIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KElNZW51TWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgZWxlbWVudFRhZywgU3RyaW5nIGxhYmVsLCBMaXN0IGF0dHJpYnV0ZXMsIEVsZW1lbnQgcGFyZW50LCBOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIC8vICAgIGlmCi0gICAgLy8gKCEocGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLAotICAgIC8vIGVsZW1lbnRUYWcpLmdldExlbmd0aCgpID4gMCkpCi0gICAgLy8gICAgWFNERE9NSGVscGVyIGhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAvLyAgICBpZiAoaGVscGVyLmdldENoaWxkTm9kZShwYXJlbnQsIGVsZW1lbnRUYWcpID09IG51bGwpCi0gICAgaWYgKGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBlbGVtZW50VGFnLCBmYWxzZSkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIGVsZW1lbnRUYWcsIGxhYmVsLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIEFjdGlvbiBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKElNZW51TWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgZWxlbWVudFRhZywgU3RyaW5nIGxhYmVsLCBMaXN0IGF0dHJpYnV0ZXMsIEVsZW1lbnQgcGFyZW50LCBOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIENyZWF0ZUVsZW1lbnRBY3Rpb24gYWN0aW9uID0gbmV3IENyZWF0ZUVsZW1lbnRBY3Rpb24obGFiZWwpOwotICAgIGFjdGlvbi5zZXRFbGVtZW50VGFnKGVsZW1lbnRUYWcpOwotICAgIGFjdGlvbi5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotICAgIGFjdGlvbi5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0gICAgYWN0aW9uLnNldFJlbGF0aXZlTm9kZShyZWxhdGl2ZU5vZGUpOwotICAgIGFjdGlvbi5zZXRYU0RTY2hlbWEoZ2V0WFNEU2NoZW1hKCkpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihzZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgYWN0aW9uLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgIGFjdGlvbi5zZXRTb3VyY2VDb250ZXh0KHNvdXJjZUNvbnRleHQpOwotICAgIG1hbmFnZXIuYWRkKGFjdGlvbik7Ci0gICAgcmV0dXJuIGFjdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIExpc3QgYXR0cmlidXRlcywgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlLCBib29sZWFuIGlzRW5hYmxlZCkKLSAgewotICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIGVsZW1lbnRUYWcsIGxhYmVsLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgYWN0aW9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIEVsZW1lbnQgcGFyZW50LCBOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIEFycmF5TGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyByZWYgPSBnZXRGaXJzdEdsb2JhbEVsZW1lbnRUYWdOYW1lKGVsZW1lbnRUYWcpOwotICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIHJlZikpOwotICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIGVsZW1lbnRUYWcsIGxhYmVsLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgYWN0aW9uLnNldEVuYWJsZWQocmVmICE9IG51bGwgJiYgIWlzUmVhZE9ubHkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ3JlYXRlU2ltcGxlQ29udGVudEFjdGlvbihJTWVudU1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBsYWJlbCwgTGlzdCBhdHRyaWJ1dGVzLCBFbGVtZW50IHBhcmVudCwgTm9kZSByZWxhdGl2ZU5vZGUpCi0gIHsKLSAgICAvLyAgICBpZgotICAgIC8vICghKHBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwKLSAgICAvLyBlbGVtZW50VGFnKS5nZXRMZW5ndGgoKSA+IDApKQotICAgIGlmIChnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgZWxlbWVudFRhZywgZmFsc2UpID09IG51bGwpCi0gICAgewotICAgICAgQ3JlYXRlU2ltcGxlQ29udGVudEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlU2ltcGxlQ29udGVudEFjdGlvbihsYWJlbCwgZ2V0WFNEU2NoZW1hKCkpOwotICAgICAgYWN0aW9uLnNldEVsZW1lbnRUYWcoZWxlbWVudFRhZyk7Ci0gICAgICBhY3Rpb24uc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICAgIGFjdGlvbi5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0gICAgICBhY3Rpb24uc2V0UmVsYXRpdmVOb2RlKHJlbGF0aXZlTm9kZSk7Ci0gICAgICBhY3Rpb24uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgICBtYW5hZ2VyLmFkZChhY3Rpb24pOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBDcmVhdGVHcm91cEFjdGlvbiBhZGRDcmVhdGVHcm91cEFjdGlvbihJTWVudU1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBsYWJlbCwgTGlzdCBhdHRyaWJ1dGVzLCBFbGVtZW50IHBhcmVudCwgTm9kZSByZWxhdGl2ZU5vZGUpCi0gIHsKLSAgICBDcmVhdGVHcm91cEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlR3JvdXBBY3Rpb24obGFiZWwsIGdldFhTRFNjaGVtYSgpKTsKLSAgICBhY3Rpb24uc2V0RWxlbWVudFRhZyhlbGVtZW50VGFnKTsKLSAgICBhY3Rpb24uc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICBhY3Rpb24uc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotICAgIGFjdGlvbi5zZXRSZWxhdGl2ZU5vZGUocmVsYXRpdmVOb2RlKTsKLSAgICBhY3Rpb24uc2V0WFNEU2NoZW1hKGdldFhTRFNjaGVtYSgpKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotICAgIGFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICBhY3Rpb24uc2V0U291cmNlQ29udGV4dChzb3VyY2VDb250ZXh0KTsKLSAgICBtYW5hZ2VyLmFkZChhY3Rpb24pOwotICAgIHJldHVybiBhY3Rpb247Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDcmVhdGVJZGVudGl0eUNvbnN0cmFpbnRzQWN0aW9uKElNZW51TWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgZWxlbWVudFRhZywgU3RyaW5nIGxhYmVsLCBMaXN0IGF0dHJpYnV0ZXMsIEVsZW1lbnQgcGFyZW50LCBOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIENyZWF0ZUlkZW50aXR5Q29uc3RyYWludHNBY3Rpb24gYWN0aW9uID0gbmV3IENyZWF0ZUlkZW50aXR5Q29uc3RyYWludHNBY3Rpb24obGFiZWwsIGdldFhTRFNjaGVtYSgpKTsKLSAgICBhY3Rpb24uc2V0RWxlbWVudFRhZyhlbGVtZW50VGFnKTsKLSAgICBhY3Rpb24uc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICBhY3Rpb24uc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotICAgIGFjdGlvbi5zZXRSZWxhdGl2ZU5vZGUocmVsYXRpdmVOb2RlKTsKLSAgICBhY3Rpb24uc2V0WFNEU2NoZW1hKGdldFhTRFNjaGVtYSgpKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotICAgIGFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICBtYW5hZ2VyLmFkZChhY3Rpb24pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRW51bXNBY3Rpb24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIExpc3QgYXR0cmlidXRlcywgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0gICAgQWRkRW51bXNBY3Rpb24gYWN0aW9uID0gbmV3IEFkZEVudW1zQWN0aW9uKGxhYmVsKTsKLSAgICBhY3Rpb24uc2V0RWxlbWVudFRhZyhlbGVtZW50VGFnKTsKLSAgICBhY3Rpb24uc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICBhY3Rpb24uc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotICAgIGFjdGlvbi5zZXRSZWxhdGl2ZU5vZGUocmVsYXRpdmVOb2RlKTsKLSAgICBhY3Rpb24uc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VOVU1FUkFUSU9OU19ESUFMT0dfVElUTEUiKSk7Ci0gICAgYWN0aW9uLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgIG1hbmFnZXIuYWRkKGFjdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQWN0aW9uIGFkZENyZWF0ZVNpbXBsZVR5cGVBY3Rpb24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIExpc3QgYXR0cmlidXRlcywgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0gICAgQ3JlYXRlU2ltcGxlVHlwZUFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlU2ltcGxlVHlwZUFjdGlvbihsYWJlbCk7Ci0gICAgYWN0aW9uLnNldEVsZW1lbnRUYWcoZWxlbWVudFRhZyk7Ci0gICAgYWN0aW9uLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0gICAgYWN0aW9uLnNldFBhcmVudE5vZGUocGFyZW50KTsKLSAgICBhY3Rpb24uc2V0UmVsYXRpdmVOb2RlKHJlbGF0aXZlTm9kZSk7Ci0gICAgYWN0aW9uLnNldFhTRFNjaGVtYShnZXRYU0RTY2hlbWEoKSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLSAgICBhY3Rpb24uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgYWN0aW9uLnNldFNvdXJjZUNvbnRleHQoc291cmNlQ29udGV4dCk7Ci0gICAgbWFuYWdlci5hZGQoYWN0aW9uKTsKLSAgICByZXR1cm4gYWN0aW9uOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRkQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uSWZOb3RFeGlzdChJTWVudU1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBsYWJlbCwgTGlzdCBhdHRyaWJ1dGVzLCBFbGVtZW50IHBhcmVudCwgTm9kZSByZWxhdGl2ZU5vZGUpCi0gIHsKLSAgICAvLyAgICBpZgotICAgIC8vICghKHBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwKLSAgICAvLyBlbGVtZW50VGFnKS5nZXRMZW5ndGgoKSA+IDApKQotICAgIC8vICAgIFhTRERPTUhlbHBlciBoZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgLy8gICAgaWYgKGhlbHBlci5nZXRDaGlsZE5vZGUocGFyZW50LCBlbGVtZW50VGFnKSA9PSBudWxsKQotICAgIGlmIChnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgZWxlbWVudFRhZywgZmFsc2UpID09IG51bGwpCi0gICAgewotICAgICAgYWRkQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uKG1hbmFnZXIsIGVsZW1lbnRUYWcsIGxhYmVsLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU2V0QmFzZVR5cGVBY3Rpb24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFNldEJhc2VUeXBlQWN0aW9uIGFjdGlvbiA9IG5ldyBTZXRCYXNlVHlwZUFjdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX1NFVF9CQVNFX1RZUEUiKSk7Ly8gKwotICAgIC8vICIuLi4iKTsKLSAgICBhY3Rpb24uc2V0Q29tcGxleFR5cGVFbGVtZW50KGVsZW1lbnQpOwotICAgIGFjdGlvbi5zZXRYU0RTY2hlbWEoZ2V0WFNEU2NoZW1hKCkpOwotICAgIGFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICBtYW5hZ2VyLmFkZChhY3Rpb24pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uKElNZW51TWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgZWxlbWVudFRhZywgU3RyaW5nIGxhYmVsLCBMaXN0IGF0dHJpYnV0ZXMsIEVsZW1lbnQgcGFyZW50LCBOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIENyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uKGxhYmVsKTsKLSAgICBhY3Rpb24uc2V0RWxlbWVudFRhZyhlbGVtZW50VGFnKTsKLSAgICBhY3Rpb24uc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICBhY3Rpb24uc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotICAgIGFjdGlvbi5zZXRSZWxhdGl2ZU5vZGUocmVsYXRpdmVOb2RlKTsKLSAgICBhY3Rpb24uc2V0WFNEU2NoZW1hKGdldFhTRFNjaGVtYSgpKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotICAgIGFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICBtYW5hZ2VyLmFkZChhY3Rpb24pOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRkQ3JlYXRlTG9jYWxDb21wbGV4VHlwZUFjdGlvbklmTm90RXhpc3QoSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIExpc3QgYXR0cmlidXRlcywgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0gICAgaWYgKGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBlbGVtZW50VGFnLCBmYWxzZSkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRDcmVhdGVMb2NhbENvbXBsZXhUeXBlQWN0aW9uKG1hbmFnZXIsIGVsZW1lbnRUYWcsIGxhYmVsLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ3JlYXRlTG9jYWxDb21wbGV4VHlwZUFjdGlvbihJTWVudU1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBsYWJlbCwgTGlzdCBhdHRyaWJ1dGVzLCBFbGVtZW50IHBhcmVudCwgTm9kZSByZWxhdGl2ZU5vZGUpCi0gIHsKLSAgICBDcmVhdGVMb2NhbENvbXBsZXhUeXBlQWN0aW9uIGFjdGlvbiA9IG5ldyBDcmVhdGVMb2NhbENvbXBsZXhUeXBlQWN0aW9uKGxhYmVsKTsKLSAgICBhY3Rpb24uc2V0RWxlbWVudFRhZyhlbGVtZW50VGFnKTsKLSAgICBhY3Rpb24uc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICBhY3Rpb24uc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotICAgIGFjdGlvbi5zZXRSZWxhdGl2ZU5vZGUocmVsYXRpdmVOb2RlKTsKLSAgICBhY3Rpb24uc2V0WFNEU2NoZW1hKGdldFhTRFNjaGVtYSgpKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotICAgIGFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICBtYW5hZ2VyLmFkZChhY3Rpb24pOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QoSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIExpc3QgYXR0cmlidXRlcywgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0gICAgLy8gICAgaWYKLSAgICAvLyAoIShwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsCi0gICAgLy8gZWxlbWVudFRhZykuZ2V0TGVuZ3RoKCkgPiAwKSkKLSAgICAvLyAgICBYU0RET01IZWxwZXIgaGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgIC8vICAgIGlmIChoZWxwZXIuZ2V0Q2hpbGROb2RlKHBhcmVudCwgZWxlbWVudFRhZykgPT0gbnVsbCkKLSAgICAvLyBDUy4uLiBJIGNvbW1lbnQgdGhlCi0gICAgLy8KLSAgICAvL2lmIChnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgZWxlbWVudFRhZywgZmFsc2UpID09IG51bGwpCi0gICAgLy97Ci0gICAgLy8gIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb24obWFuYWdlcixlbGVtZW50VGFnLGxhYmVsLGF0dHJpYnV0ZXMscGFyZW50LHJlbGF0aXZlTm9kZSk7Ci0gICAgLy8gIHJldHVybiBmYWxzZTsKLSAgICAvL30KLSAgICAvL3JldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE9wZW5TY2hlbWFBY3Rpb24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBsYWJlbCwgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBPcGVuU2NoZW1hQWN0aW9uIG9wZW5BY3Rpb24gPSBuZXcgT3BlblNjaGVtYUFjdGlvbihsYWJlbCwgZ2V0WFNEU2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChwYXJlbnQpKTsKLSAgICBtYW5hZ2VyLmFkZChvcGVuQWN0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE1vdmVBbm9ueW1vdXNHbG9iYWwoSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIExpc3QgYXR0cmlidXRlcywgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0vLyAgICBNYWtlQW5vbnltb3VzR2xvYmFsIGFjdGlvbiA9IG5ldyBNYWtlQW5vbnltb3VzR2xvYmFsKGxhYmVsLCBwYXJlbnQsIGdldFhTRFNjaGVtYSgpKTsKLS8vICAgIGFjdGlvbi5zZXRFbGVtZW50VGFnKGVsZW1lbnRUYWcpOwotLy8gICAgYWN0aW9uLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0vLyAgICBhY3Rpb24uc2V0UGFyZW50Tm9kZShnZXRYU0RTY2hlbWEoKS5nZXRFbGVtZW50KCkpOwotLy8gICAgYWN0aW9uLnNldFJlbGF0aXZlTm9kZShyZWxhdGl2ZU5vZGUpOwotLy8gICAgYWN0aW9uLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotLy8gICAgLy9tYW5hZ2VyLmFkZChhY3Rpb24pOwotLy8gICAgYWRkUmVmYWN0b3JNZW51R3JvdXAobWFuYWdlcik7Ci0vLyAgICBmUmVmYWN0b3JNZW51R3JvdXAuYWRkQWN0aW9uKGFjdGlvbik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZFJlZmFjdG9yTWVudUdyb3VwKElNZW51TWFuYWdlciBtYW5hZ2VyKXsKLQkgIAlmUmVmYWN0b3JNZW51R3JvdXAgPSBuZXcgUmVmYWN0b3JBY3Rpb25Hcm91cChzZWxlY3Rpb25Qcm92aWRlciwgZ2V0WFNEU2NoZW1hKCkpOwotICAgICAJQWN0aW9uQ29udGV4dCBjb250ZXh0PSBuZXcgQWN0aW9uQ29udGV4dChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgCWZSZWZhY3Rvck1lbnVHcm91cC5zZXRDb250ZXh0KGNvbnRleHQpOwotICAgIAlmUmVmYWN0b3JNZW51R3JvdXAuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotICAgIAlmUmVmYWN0b3JNZW51R3JvdXAuc2V0Q29udGV4dChudWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZENyZWF0ZUFubm90YXRpb25BY3Rpb24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIExpc3QgYXR0cmlidXRlcywgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0gICAgQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbihsYWJlbCk7Ci0gICAgYWN0aW9uLnNldEVsZW1lbnRUYWcoZWxlbWVudFRhZyk7Ci0gICAgYWN0aW9uLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0gICAgYWN0aW9uLnNldFBhcmVudE5vZGUocGFyZW50KTsKLSAgICBhY3Rpb24uc2V0UmVsYXRpdmVOb2RlKHJlbGF0aXZlTm9kZSk7Ci0gICAgYWN0aW9uLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgIG1hbmFnZXIuYWRkKGFjdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTm9kZSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKE5vZGUgcGFyZW50LCBTdHJpbmcgZWxlbWVudFRhZywgYm9vbGVhbiBpc1JlZikKLSAgewotICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBOb2RlIHRhcmdldE5vZGUgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLSAgICAgIGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCkgY2hpbGQsIGVsZW1lbnRUYWcsIGlzUmVmKSkKLSAgICAgICAgewotICAgICAgICAgIHRhcmdldE5vZGUgPSBjaGlsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdGFyZ2V0Tm9kZTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGVsZW1lbnRFeGlzdHMoU3RyaW5nIGVsZW1lbnRUYWcsIEVsZW1lbnQgcGFyZW50KQotICB7Ci0gICAgaWYgKCEocGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBlbGVtZW50VGFnKS5nZXRMZW5ndGgoKSA+IDApKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVsZXRlQWN0aW9uLgotICAgKiAKLSAgICogQHJldHVybiBEZWxldGVBY3Rpb24KLSAgICovCi0gIHB1YmxpYyBEZWxldGVBY3Rpb24gZ2V0RGVsZXRlQWN0aW9uKCkKLSAgewotICAgIHJldHVybiBkZWxldGVBY3Rpb247Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZE11bHRpcGxpY2l0eU1lbnUoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsIElNZW51TWFuYWdlciBtYW5hZ2VyKQotICB7Ci0gICAgU2V0TXVsdGlwbGljaXR5QWN0aW9uIG9uZU11bHRpcGxpY2l0eSA9IG5ldyBTZXRNdWx0aXBsaWNpdHlBY3Rpb24oY29uY3JldGVDb21wb25lbnQsICIxIik7Ci0gICAgb25lTXVsdGlwbGljaXR5LnNldE1heE9jY3VycygxKTsKLSAgICBvbmVNdWx0aXBsaWNpdHkuc2V0TWluT2NjdXJzKDEpOwotICAgIFNldE11bHRpcGxpY2l0eUFjdGlvbiB6ZXJvT3JNb3JlTXVsdGlwbGljaXR5ID0gbmV3IFNldE11bHRpcGxpY2l0eUFjdGlvbihjb25jcmV0ZUNvbXBvbmVudCwgIjAuLiogKFplcm8gb3IgTW9yZSkiKTsKLSAgICB6ZXJvT3JNb3JlTXVsdGlwbGljaXR5LnNldE1heE9jY3VycygtMSk7Ci0gICAgemVyb09yTW9yZU11bHRpcGxpY2l0eS5zZXRNaW5PY2N1cnMoMCk7Ci0gICAgU2V0TXVsdGlwbGljaXR5QWN0aW9uIHplcm9Pck9uZU11bHRpcGxpY2l0eSA9IG5ldyBTZXRNdWx0aXBsaWNpdHlBY3Rpb24oY29uY3JldGVDb21wb25lbnQsICIwLi4xIChaZXJvIG9yIE9uZSkiKTsKLSAgICB6ZXJvT3JPbmVNdWx0aXBsaWNpdHkuc2V0TWF4T2NjdXJzKDEpOwotICAgIHplcm9Pck9uZU11bHRpcGxpY2l0eS5zZXRNaW5PY2N1cnMoMCk7Ci0gICAgU2V0TXVsdGlwbGljaXR5QWN0aW9uIG9uZU9yTW9yZU11bHRpcGxpY2l0eSA9IG5ldyBTZXRNdWx0aXBsaWNpdHlBY3Rpb24oY29uY3JldGVDb21wb25lbnQsICIxLi4qIChPbmUgb3IgTW9yZSkiKTsKLSAgICBvbmVPck1vcmVNdWx0aXBsaWNpdHkuc2V0TWF4T2NjdXJzKC0xKTsKLSAgICBvbmVPck1vcmVNdWx0aXBsaWNpdHkuc2V0TWluT2NjdXJzKDEpOwotICAgIAotICAgIE1lbnVNYW5hZ2VyIG11bHRpcGxpY2l0eU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIlNldCBNdWx0aXBsaWNpdHkiKTsKLSAgICBtYW5hZ2VyLmFkZChtdWx0aXBsaWNpdHlNZW51KTsKLSAgICBtdWx0aXBsaWNpdHlNZW51LmFkZChvbmVNdWx0aXBsaWNpdHkpOwotICAgIG11bHRpcGxpY2l0eU1lbnUuYWRkKHplcm9Pck9uZU11bHRpcGxpY2l0eSk7Ci0gICAgbXVsdGlwbGljaXR5TWVudS5hZGQoemVyb09yTW9yZU11bHRpcGxpY2l0eSk7Ci0gICAgbXVsdGlwbGljaXR5TWVudS5hZGQob25lT3JNb3JlTXVsdGlwbGljaXR5KTsgICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNETXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTRE11bHRpUGFnZUVkaXRvclBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3MzUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNETXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLlhNTFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYU0RNdWx0aVBhZ2VFZGl0b3JQYXJ0IGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydCBpbXBsZW1lbnRzIElQcm9wZXJ0eUxpc3RlbmVyCi17Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFhTRE11bHRpUGFnZUVkaXRvclBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEludGVybmFsIHBhcnQgYWN0aXZhdGlvbiBsaXN0ZW5lcgotICAgKi8KLSAgY2xhc3MgUGFydExpc3RlbmVyIGV4dGVuZHMgU2hlbGxBZGFwdGVyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBmQWN0aXZlUGFydDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWN0aXZhdGlvbigpIHsKLQotICAgICAgaWYgKGZJc0hhbmRsaW5nQWN0aXZhdGlvbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBpZiAoZkFjdGl2ZVBhcnQgPT0gWFNETXVsdGlQYWdlRWRpdG9yUGFydC50aGlzKSB7Ci0gICAgICAgIGZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgIGZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICBmQWN0aXZlUGFydCA9IHBhcnQ7Ci0gICAgICBoYW5kbGVBY3RpdmF0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgZkFjdGl2ZVBhcnQgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBTaGVsbExpc3RlbmVyI3NoZWxsQWN0aXZhdGVkKFNoZWxsRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCBlKSB7Ci0gICAgICBoYW5kbGVBY3RpdmF0aW9uKCk7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgVGV4dElucHV0TGlzdGVuZXIgaW1wbGVtZW50cyBJVGV4dElucHV0TGlzdGVuZXIgewotICAgIHB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLSAgICB9Ci0gIH0KLQotICAvKiogVGhlIHNvdXJjZSBwYWdlIGluZGV4LiAqLwotICBwcml2YXRlIGludCBmU291cmNlUGFnZUluZGV4OwotICAvKiogVGhlIHRleHQgZWRpdG9yLiAqLwotICBwcml2YXRlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGZUZXh0RWRpdG9yOwotCi0gIHByaXZhdGUgUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lcjsKLQotCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gbWFrZSBmaXJlUHJvcGVydHlDaGFuZ2VkIGFjY2Vzc2JpYmxlIGZyb20gc29tZQotICAgKiAoYW5vbm9tb3VzKSBpbm5lciBjbGFzc2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgX2ZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHkpIHsKLSAgICBzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgdGhlIHNvdXJjZSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFNvdXJjZVBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBmU291cmNlUGFnZUluZGV4ID0gYWRkUGFnZShmVGV4dEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICBzZXRQYWdlVGV4dChmU291cmNlUGFnZUluZGV4LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVEFCX1NPVVJDRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gdGhlIHVwZGF0ZSdzIGNyaXRpY2FsLCB0byBnZXQgdmlld2VyIHNlbGVjdGlvbiBtYW5hZ2VyIGFuZAotICAgICAgLy8gaGlnaGxpZ2h0aW5nIHRvIHdvcmsKLSAgICAgIGZUZXh0RWRpdG9yLnVwZGF0ZSgpOwotICAKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX1RJVExFKTsKLSAgCi0gICAgICAvLyBDaGFuZ2VzIHRvIHRoZSBUZXh0IFZpZXdlcidzIGRvY3VtZW50IGluc3RhbmNlIHNob3VsZCBhbHNvIGZvcmNlIGFuCi0gICAgICAvLyBpbnB1dCByZWZyZXNoCi0gICAgICBmVGV4dEVkaXRvci5nZXRUZXh0Vmlld2VyKCkuYWRkVGV4dElucHV0TGlzdGVuZXIobmV3IFRleHRJbnB1dExpc3RlbmVyKCkpOwotICAgIH0KLSAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAvLyBkaXNwb3NlIGVkaXRvcgotICAgICAgZGlzcG9zZSgpOwotCi0gICAgICB0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oU1NFQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW4xX0VSUk9SXyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVQYWdlcygpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBzb3VyY2UgcGFnZSBNVVNUIGJlIGNyZWF0ZWQgYmVmb3JlIGRlc2lnbiBwYWdlLCBub3cKLSAgICAgIGNyZWF0ZVNvdXJjZVBhZ2UoKTsKLSAgICAgIGFkZFNvdXJjZVBhZ2UoKTsKLSAgICAgIHNldEFjdGl2ZVBhZ2UoKTsKLQotICAgIC8vIGZ1dHVyZV9UT0RPOiBhZGQgYSBjYXRjaCBibG9jayBoZXJlIGZvciBhbnkgZXhjZXB0aW9uIHRoZSBkZXNpZ24KLSAgICAvLyBwYWdlIHRocm93cyBhbmQgY29udmVydCBpdCBpbnRvIGEgbW9yZSBpbmZvcm1hdGl2ZSBtZXNzYWdlLgotICAgIH0KLSAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2NyZWF0ZVNpdGUob3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgSUVkaXRvclNpdGUgY3JlYXRlU2l0ZShJRWRpdG9yUGFydCBlZGl0b3IpIHsKLSAgICBJRWRpdG9yU2l0ZSBzaXRlID0gbnVsbDsKLSAgICBpZiAoZWRpdG9yID09IGZUZXh0RWRpdG9yKSB7Ci0gICAgICBzaXRlID0gbmV3IE11bHRpUGFnZUVkaXRvclNpdGUodGhpcywgZWRpdG9yKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZSNnZXRBY3Rpb25CYXJDb250cmlidXRvcigpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotICAgICAgICAgIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IHN1cGVyLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0gICAgICAgICAgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIG11bHRpQ29udHJpYnV0b3IgPSBYU0RNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0vLyAgICAgICAgICBpZiAobXVsdGlDb250cmlidXRvciBpbnN0YW5jZW9mIFhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0vLyAgICAgICAgICAgIGNvbnRyaWJ1dG9yID0gKChYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgbXVsdGlDb250cmlidXRvcikuc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3I7Ci0vLyAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGNvbnRyaWJ1dG9yOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHNpdGUgPSBzdXBlci5jcmVhdGVTaXRlKGVkaXRvcik7Ci0gICAgfQotICAgIHJldHVybiBzaXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIHNvdXJjZSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZVBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgIGZUZXh0RWRpdG9yID0gY3JlYXRlVGV4dEVkaXRvcigpOwotICAgIGZUZXh0RWRpdG9yLnNldEVkaXRvclBhcnQodGhpcyk7Ci0KLSAgICAvLyBTZXQgdGhlIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gbm93IHNvIHRoZSB0ZXh0IGVkaXRvciB3b24ndCB1c2UKLSAgICAvLyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZpcnN0Ci0gICAgLy8gYW5kIHN3aXRjaCB0byB0aGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGxhdGVyLgotICAgIC8vIERNVyByZW1vdmVkIHNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gMy8yNi8yMDAzIHNpbmNlIGFkZGVkCi0gICAgLy8gY3JlYXRlUGFydENvbnRyb2wgdG8gb3VyIHRleHQgZWRpdG9yLgotICAgIC8vIGZUZXh0RWRpdG9yLnNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLSAgICBmVGV4dEVkaXRvci5hZGRQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBjcmVhdGVUZXh0RWRpdG9yLgotICAgKiAKLSAgICogQHJldHVybiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGNyZWF0ZVRleHRFZGl0b3IoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclhNTCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLSAgICB3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLSAgICB3aW5kb3cuZ2V0U2hlbGwoKS5yZW1vdmVTaGVsbExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLSAgICBnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotICAgIGlmIChmVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICBmVGV4dEVkaXRvci5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8vIG1vdmVkIHRvIGxhc3Qgd2hlbiBhZGRlZCB3aW5kb3cgLi4uIHNlZW1zIGxpa2UKLSAgICAvLyB3ZSdkIGJlIGluIGRhbmdlciBvZiBsb3Npbmcgc29tZSBkYXRhLCBsaWtlIHNpdGUsCi0gICAgLy8gb3Igc29tZXRoaW5nLgotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yLiA8cD4gU3ViY2xhc3NlcyBtdXN0Ci0gICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZSBmb3IgYW4KLSAgICogZWRpdG9yLiBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+IElFZGl0b3JQYXJ0IDwvY29kZT48L3A+Ci0gICAqIAotICAgKiBAc2VlIElFZGl0b3JQYXJ0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgZlRleHRFZGl0b3IuZG9TYXZlKG1vbml0b3IpOwotICAgIC8vICAgIC8vIHRoaXMgaXMgYSB0ZW1wb3Jhcnkgd2F5IHRvIGZvcmNlIHZhbGlkYXRpb24uCi0gICAgLy8gICAgLy8gd2hlbiB0aGUgdmFsaWRhdG9yIGlzIGEgd29ya2JlbmNoIGJ1aWxkZXIsIHRoZSBmb2xsb3dpbmcgbGluZXMKLSAgICAvLyBjYW4gYmUgcmVtb3ZlZAotICAgIC8vICAgIGlmIChmRGVzaWduVmlld2VyICE9IG51bGwpCi0gICAgLy8gICAgICBmRGVzaWduVmlld2VyLnNhdmVPY2N1cnJlZCgpOwotCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFNhdmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGVkaXRvciB0byBhbm90aGVyIG9iamVjdC4gPHA+Ci0gICAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZQotICAgKiBsaWZlY3ljbGUgZm9yIGFuIGVkaXRvci4gRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPiBJRWRpdG9yUGFydAotICAgKiA8L2NvZGU+PC9wPgotICAgKiAKLSAgICogQHNlZSBJRWRpdG9yUGFydAotICAgKi8KLSAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0gICAgZlRleHRFZGl0b3IuZG9TYXZlQXMoKTsKLSAgICAvLyAyNTM2MTkKLSAgICAvLyBmb2xsb3dpbmcgdXNlZCB0byBiZSBleGVjdXRlZCBoZXJlLCBidXQgaXMKLSAgICAvLyBub3cgY2FsbGVkICJiYWNrIiBmcm9tIHRleHQgZWRpdG9yIChzaW5jZQotICAgIC8vIG11bGl0aXBsZSBwYXRocyB0byB0aGUgcGVyZm9ybVNhdmVBcyBpbiBTdHJ1Y3R1cmVkVGV4dEVkaXRvci4KLSAgICAvL2RvU2F2ZUFzRm9yU3RydWN0dXJlZFRleHRNdWxpdFBhZ2VQYXJ0KCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZWRpdG9ySW5wdXRJc0FjY2VwdGFibGUoSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgIC8vIHZlcmlmeSB0aGF0IGl0IGNhbiBiZSBvcGVuZWQKLSAgICAgIENvcmVFeGNlcHRpb25bXSBjb3JlRXhjZXB0aW9uQXJyYXkgPSBuZXcgQ29yZUV4Y2VwdGlvblsxXTsKLSAgICAgIGlmIChmaWxlRG9lc05vdEV4aXN0KChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCwgY29yZUV4Y2VwdGlvbkFycmF5KSkgewotICAgICAgICAvLyB0b2RvIHVzZSBtZXNzYWdlIGZvcm1hdHRlciBmb3IgezB9Ci0gICAgICAgIFRocm93YWJsZSBjb3JlRXhjZXB0aW9uID0gY29yZUV4Y2VwdGlvbkFycmF5WzBdOwotICAgICAgICBpZiAoY29yZUV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlc291cmNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgLy8gSSdtIGFzc3VtaW5nIHRoaXMgaXMgYWx3YXlzICdkb2VzIG5vdCBleGlzdCcKLSAgICAgICAgICAvLyB3ZSdsbCByZWZyZXNoIGxvY2FsIGdvIG1pbWljIGJlaGF2aW9yIG9mIGRlZmF1bHQKLSAgICAgICAgICAvLyBlZGl0b3IsIHdoZXJlIHRoZQotICAgICAgICAgIC8vIHRyb3VibGVzb21lIGZpbGUgaXMgcmVmcmVzaGVkIChhbmQgd2lsbCBjYXVzZSBpdCB0bwotICAgICAgICAgIC8vICdkaXNhcHBlYXInIGZyb20gTmF2aWdhdG9yLgotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIC8vIHZlcnkgdW5saWtlbHkKLS8vICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihjZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbihTU0VDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIyM2NvbmNhdF9FWENfIiwgKG5ldyBPYmplY3RbXXtpbnB1dC5nZXROYW1lKCl9KSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgLy8kTk9OLU5MUy0xJCA9ICJSZXNvdXJjZSB7MH0gZG9lcyBub3QgZXhpc3QuIgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbihTU0VDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIzMmNvbmNhdF9FWENfIiwgKG5ldyBPYmplY3RbXXtpbnB1dC5nZXROYW1lKCl9KSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgLy8kTk9OLU5MUy0xJCA9ICJFZGl0b3IgY291bGQgbm90IGJlIG9wZW4gb24gezB9IgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotICAgICAgSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgY29udGVudHMgPSAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0Q29udGVudHMoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIG5vU3RvcmFnZUV4YykgewotICAgICAgfQotICAgICAgaWYgKGNvbnRlbnRzID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKFNTRUNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIjMyY29uY2F0X0VYQ18iLCAobmV3IE9iamVjdFtde2lucHV0LmdldE5hbWUoKX0pKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICB0cnkgewotICAgICAgICAgIGNvbnRlbnRzLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vICB2b2lkIGRvU2F2ZUFzRm9yU3RydWN0dXJlZFRleHRNdWxpdFBhZ2VQYXJ0KCkgewotICAvLyAgICBzZXRQYWdlVGV4dChnZXRBY3RpdmVQYWdlKCksIGZUZXh0RWRpdG9yLmdldFRpdGxlKCkpOwotICAvLyAgICBzZXRJbnB1dChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgLy8gICAgaWYgKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCkgewotICAvLyAgICAgIC8vZkRlc2lnblZpZXdlci5zZXRFZGl0b3JJbnB1dChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgLy8gICAgICBmRGVzaWduVmlld2VyLnNldE1vZGVsKGdldE1vZGVsKCkpOwotICAvLyAgICAgIGZEZXNpZ25WaWV3ZXIuc2F2ZUFzT2NjdXJyZWQoKTsKLSAgLy8gICAgfQotICAvLyAgICAvLyBldmVuIHRob3VnaCB3ZSd2ZSBzZXQgdGl0bGUgZXRjLiwgc2V2ZXJhbCB0aW1lcyBhbHJlYWR5IQotICAvLyAgICAvLyBvbmx5IG5vdyBpcyBhbGwgcHJlcGFyZWQgZm9yIGl0LgotICAvLyAgICBmaXJlUHJvcGVydHlDaGFuZ2UoSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSk7Ci0gIC8vICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLSAgLy8gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHBhcnQgd2l0aCBhIHNpdGUgYW5kIGlucHV0LiA8cD4KLSAgICogU3ViY2xhc3NlcyBvZiA8Y29kZT4gRWRpdG9yUGFydCA8L2NvZGU+IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotICAgKiBXaXRoaW4gdGhlIGltcGxlbWVudGF0aW9uIHN1YmNsYXNzZXMgc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSBpbnB1dCB0eXBlCi0gICAqIGlzIGFjY2VwdGFibGUgYW5kIHRoZW4gc2F2ZSB0aGUgc2l0ZSBhbmQgaW5wdXQuIEhlcmUgaXMgc2FtcGxlIGNvZGU6Ci0gICAqIDwvcD48cHJlPiBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKSB0aHJvdyBuZXcKLSAgICogUGFydEluaXRFeGNlcHRpb24oIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOwotICAgKiBzZXRTaXRlKHNpdGUpOyBzZXRJbnB1dChlZGl0b3JJbnB1dCk7IDwvcHJlPgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZURvZXNOb3RFeGlzdChJRmlsZUVkaXRvcklucHV0IGlucHV0LCBUaHJvd2FibGVbXSBjb3JlRXhjZXB0aW9uKSB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0gICAgaWYgKCghKGlucHV0LmV4aXN0cygpKSkgfHwgKCEoaW5wdXQuZ2V0RmlsZSgpLmV4aXN0cygpKSkpIHsKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdHJ5IHsKLSAgICAgICAgaW5TdHJlYW0gPSBpbnB1dC5nZXRGaWxlKCkuZ2V0Q29udGVudHModHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIHZlcnkgbGlrZWx5IHRvIGJlIGZpbGUgbm90IGZvdW5kCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIGNvcmVFeGNlcHRpb25bMF0gPSBlOwotICAgICAgfQotICAgICAgZmluYWxseSB7Ci0gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgLy8gRE1XOiBJJ20gYnVsbGV0LXByb29maW5nIHRoaXMgYmVjYXVzZQotICAgICAgLy8gaXRzIGJlZW4gcmVwb3J0ZWQgKG9uIDQuMDMgdmVyc2lvbikgYSBudWxsIHBvaW50ZXIgc29tZXRpbWVzCi0gICAgICAvLyBoYXBwZW5zIGhlcmUgb24gc3RhcnR1cCwgd2hlbiBhbiBlZGl0b3IgaGFzIGJlZW4gbGVmdAotICAgICAgLy8gb3BlbiB3aGVuIHdvcmtiZW5jaCBzaHV0ZG93bi4KLSAgICAgIGlmIChmVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgIHJlc3VsdCA9IGZUZXh0RWRpdG9yLmdldEFkYXB0ZXIoa2V5KTsKLSAgICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIElFeHRlbmRlZE1hcmt1cEVkaXRvciBtZXRob2QKLSAgICovCi0gIHB1YmxpYyBOb2RlIGdldENhcmV0Tm9kZSgpIHsKLSAgICBpZiAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIHJldHVybiBnZXRUZXh0RWRpdG9yKCkuZ2V0Q2FyZXROb2RlKCk7Ci0gIH0KLQotICAvKioKLSAgICogSUV4dGVuZGVkU2ltcGxlRWRpdG9yIG1ldGhvZAotICAgKi8KLSAgcHVibGljIGludCBnZXRDYXJldFBvc2l0aW9uKCkgewotICAgIGlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIHJldHVybiBnZXRUZXh0RWRpdG9yKCkuZ2V0Q2FyZXRQb3NpdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIElFeHRlbmRlZFNpbXBsZUVkaXRvciBtZXRob2QKLSAgICovCi0gIHB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0gICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpLmdldERvY3VtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogSUV4dGVuZGVkTWFya3VwRWRpdG9yIG1ldGhvZAotICAgKi8KLSAgcHVibGljIERvY3VtZW50IGdldERPTURvY3VtZW50KCkgewotICAgIGlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgcmV0dXJuIGdldFRleHRFZGl0b3IoKS5nZXRET01Eb2N1bWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIElFeHRlbmRlZFNpbXBsZUVkaXRvciBtZXRob2QKLSAgICovCi0gIHB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkgewotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0gICAgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0gICAgaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpCi0gICAgICBtb2RlbCA9IGZUZXh0RWRpdG9yLmdldE1vZGVsKCk7Ci0gICAgcmV0dXJuIG1vZGVsOwotICB9Ci0KLSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gIH0KLQotICAvKioKLSAgICogSUV4dGVuZGVkTWFya3VwRWRpdG9yIG1ldGhvZAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0U2VsZWN0ZWROb2RlcygpIHsKLSAgICBpZiAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGVkTm9kZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgbWV0aG9kCi0gICAqLwotICBwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uUmFuZ2UoKSB7Ci0gICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ldyBQb2ludCgtMSwgLTEpOwotCi0gICAgcmV0dXJuIGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25SYW5nZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoKSB7Ci0gICAgcmV0dXJuIGZUZXh0RWRpdG9yOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFBhcnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotICAgIFN0cmluZyB0aXRsZSA9IG51bGw7Ci0gICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKSB7Ci0gICAgICBpZiAoZ2V0RWRpdG9ySW5wdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgIHRpdGxlID0gZ2V0RWRpdG9ySW5wdXQoKS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdGl0bGUgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0VGl0bGUoKTsKLSAgICB9Ci0gICAgaWYgKHRpdGxlID09IG51bGwpIHsKLSAgICAgIHRpdGxlID0gZ2V0UGFydE5hbWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRpdGxlOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBTZXRzIHRoZSBjdXJzb3IgYW5kIHNlbGVjdGlvbiBzdGF0ZSBmb3IgdGhpcyBlZGl0b3IgdG8KLSAgICogdGhlIHBhc3NhZ2UgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gbWFya2VyLiA8cD4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0gICAqIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT4gSUVkaXRvclBhcnQgPC9jb2RlPjwvcD4KLSAgICogCi0gICAqIEBzZWUgSUVkaXRvclBhcnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAvLyAocGEpIDIwMDIwMjE3IHRoaXMgd2FzIG51bGwgd2hlbiBvcGVuaW5nIGFuIGVkaXRvciB0aGF0IHdhcwotICAgIC8vIGFscmVhZHkgb3BlbgotICAgIGlmIChmVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICBJR290b01hcmtlciBtYXJrZXJHb3RvZXIgPSAoSUdvdG9NYXJrZXIpIGZUZXh0RWRpdG9yLmdldEFkYXB0ZXIoSUdvdG9NYXJrZXIuY2xhc3MpOwotICAgICAgbWFya2VyR290b2VyLmdvdG9NYXJrZXIobWFya2VyKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICBlZGl0b3JJbnB1dElzQWNjZXB0YWJsZShpbnB1dCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotICAgICAgaWYgKHBhcnRMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgIHBhcnRMaXN0ZW5lciA9IG5ldyBQYXJ0TGlzdGVuZXIoKTsKLSAgICAgIH0KLSAgICAgIC8vZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RuZXIpOwotICAgICAgLy8gd2Ugd2FudCB0byBsaXN0ZW4gZm9yIG91ciBvd24gYWN0aXZhdGlvbgotICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0gICAgICB3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLSAgICAgIHdpbmRvdy5nZXRTaGVsbCgpLmFkZFNoZWxsTGlzdGVuZXIocGFydExpc3RlbmVyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBpZiAoZSBpbnN0YW5jZW9mIFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgIFRocm93YWJsZSB0ID0gKChTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbikgZSkuZ2V0T3JpZ2luYWxFeGNlcHRpb24oKTsKLSAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0KTsKLSAgICAgICAgICAvLyBmaWxlIG5vdCBmb3VuZAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFJldHVybnMgd2hldGhlciB0aGUgInNhdmUgYXMiIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQgYnkKLSAgICogdGhpcyBlZGl0b3IuIDxwPiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wbGVtZW50IHRoZQotICAgKiBvcGVuLXNhdmUtY2xvc2UgbGlmZWN5Y2xlIGZvciBhbiBlZGl0b3IuIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZQotICAgKiA8Y29kZT4gSUVkaXRvclBhcnQgPC9jb2RlPjwvcD4KLSAgICogCi0gICAqIEBzZWUgSUVkaXRvclBhcnQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLSAgICByZXR1cm4gZlRleHRFZGl0b3IgIT0gbnVsbCAmJiBmVGV4dEVkaXRvci5pc1NhdmVBc0FsbG93ZWQoKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgUmV0dXJucyB3aGV0aGVyIHRoZSBjb250ZW50cyBvZiB0aGlzIGVkaXRvciBzaG91bGQgYmUKLSAgICogc2F2ZWQgd2hlbiB0aGUgZWRpdG9yIGlzIGNsb3NlZC4gPHA+IFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+IHRydWUKLSAgICogPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgZWRpdG9yIGlzIGRpcnR5ICggPGNvZGU+IGlzRGlydHkgPC9jb2RlPiApLgotICAgKiA8L3A+Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVPbkNsb3NlTmVlZGVkKCkgewotICAgIC8vIG92ZXJyaWRpbmcgc3VwZXIgY2xhc3Mgc2luY2UgaXQgZG9lcyBhIGxvd2x5IGlzRGlydHkhCi0gICAgaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpCi0gICAgICByZXR1cm4gZlRleHRFZGl0b3IuaXNTYXZlT25DbG9zZU5lZWRlZCgpOwotICAgIHJldHVybiBpc0RpcnR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogTm90aWZpZXMgdGhpcyBtdWx0aS1wYWdlIGVkaXRvciB0aGF0IHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIGlkIGhhcwotICAgKiBiZWVuIGFjdGl2YXRlZC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIGRpZmZlcmVudAotICAgKiB0YWIuCi0gICAqIAotICAgKiBAcGFyYW0gbmV3UGFnZUluZGV4Ci0gICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBhY3RpdmF0ZWQgcGFnZQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0gICAgc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCi0gICAgc2F2ZUxhc3RBY3RpdmVQYWdlSW5kZXgobmV3UGFnZUluZGV4KTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3N0cyB0aGUgdXBkYXRlIGNvZGUgImJlaGluZCIgdGhlIHJ1bm5pbmcgb3BlcmF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcG9zdE9uRGlzcGxheVF1ZShSdW5uYWJsZSBydW5uYWJsZSkgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IHdvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0gICAgaWYgKHdpbmRvd3MgIT0gbnVsbCAmJiB3aW5kb3dzLmxlbmd0aCA+IDApIHsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IHdpbmRvd3NbMF0uZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0gICAgICBkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJ1bm5hYmxlLnJ1bigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB0aGF0IGEgcHJvcGVydHkgaGFzIGNoYW5nZWQuCi0gICAqIAotICAgKiBAcGFyYW0gc291cmNlCi0gICAqICAgICAgICAgICAgdGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZAotICAgKiBAcGFyYW0gcHJvcElkCi0gICAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwcm9wZXJ0eSB3aGljaCBoYXMgY2hhbmdlZDsgcHJvcGVydHkgaWRzIGFyZQotICAgKiAgICAgICAgICAgIGdlbmVyYWxseSBkZWZpbmVkIGFzIGNvbnN0YW50cyBvbiB0aGUgc291cmNlIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkgewotICAgIHN3aXRjaCAocHJvcElkKSB7Ci0gICAgICAvLyBoYWQgdG8gaW1wbGVtZW50IGlucHV0IGNoYW5nZWQgImxpc3RlbmVyIiBzbyB0aGF0Ci0gICAgICAvLyBzdHJ1Y3V0ZWRUZXh0IGNvdWxkIHRlbGwgaXQgY29udGFpbmluZyBlZGl0b3IgdGhhdAotICAgICAgLy8gdGhlIGlucHV0IGhhcyBjaGFuZ2UsIHdoZW4gYSAncmVzb3VyY2UgbW92ZWQnIGV2ZW50IGlzCi0gICAgICAvLyBmb3VuZC4KLSAgICAgIGNhc2UgSUVkaXRvclBhcnQuUFJPUF9JTlBVVCA6Ci0gICAgICBjYXNlIElFZGl0b3JQYXJ0LlBST1BfRElSVFkgOiB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gZlRleHRFZGl0b3IpIHsKLSAgICAgICAgICBpZiAoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSAhPSBnZXRFZGl0b3JJbnB1dCgpKSB7Ci0gICAgICAgICAgICBzZXRJbnB1dChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICAgIC8vIHRpdGxlIHNob3VsZCBhbHdheXMgY2hhbmdlIHdoZW4gaW5wdXQgY2hhbmdlcy4KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBydW5uYWJsZSBmb3IgZm9sbG93aW5nIHBvc3QgY2FsbAotICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBfZmlyZVByb3BlcnR5Q2hhbmdlKElXb3JrYmVuY2hQYXJ0LlBST1BfVElUTEUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gVXBkYXRlIGlzIGp1c3QgdG8gcG9zdCB0aGluZ3Mgb24gdGhlIGRpc3BsYXkgcXVldWUKLSAgICAgICAgICAgIC8vICh0aHJlYWQpLiBXZSBoYXZlIHRvIGRvIHRoaXMgdG8gZ2V0IHRoZSBkaXJ0eQotICAgICAgICAgICAgLy8gcHJvcGVydHkgdG8gZ2V0IHVwZGF0ZWQgYWZ0ZXIgb3RoZXIgdGhpbmdzIG9uIHRoZQotICAgICAgICAgICAgLy8gcXVldWUgYXJlIGV4ZWN1dGVkLgotICAgICAgICAgICAgcG9zdE9uRGlzcGxheVF1ZShydW5uYWJsZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBJV29ya2JlbmNoUGFydC5QUk9QX1RJVExFIDogewotICAgICAgICAvLyB1cGRhdGUgdGhlIGlucHV0IGlmIHRoZSB0aXRsZSBpcyBjaGFuZ2VkCi0gICAgICAgIGlmIChzb3VyY2UgPT0gZlRleHRFZGl0b3IpIHsKLSAgICAgICAgICBpZiAoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSAhPSBnZXRFZGl0b3JJbnB1dCgpKSB7Ci0gICAgICAgICAgICBzZXRJbnB1dChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0IDogewotICAgICAgICAvLyBwcm9wYWdhdGUgY2hhbmdlcy4gSXMgdGhpcyBuZWVkZWQ/IEFuc3dlcjogWWVzLgotICAgICAgICBpZiAoc291cmNlID09IGZUZXh0RWRpdG9yKSB7Ci0gICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzYWZlbHlTYW5pdHlDaGVja1N0YXRlKCkgewotICAgIC8vIElmIHdlJ3JlIGNhbGxlZCBiZWZvcmUgZWRpdG9yIGlzIGNyZWF0ZWQsIHNpbXBseSBpZ25vcmUgc2luY2Ugd2UKLSAgICAvLyBkZWxlZ2F0ZSB0aGlzIGZ1bmN0aW9uIHRvIG91ciBlbWJlZGRlZCBUZXh0RWRpdG9yCi0gICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgZ2V0VGV4dEVkaXRvcigpLnNhZmVseVNhbml0eUNoZWNrU3RhdGUoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KGludCBuZXdQYWdlSW5kZXgpIHsKLSAgICAvLyBzYXZlIHRoZSBsYXN0IGFjdGl2ZSBwYWdlIGluZGV4IHRvIHByZWZlcmVuY2UgbWFuYWdlcgotICAgIGdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFByZWZlcmVuY2VOYW1lcy5MQVNUX0FDVElWRV9QQUdFLCBuZXdQYWdlSW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFnZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldEFjdGl2ZVBhZ2UoKSB7Ci0gICAgLy8gcmV0cmlldmUgdGhlIGxhc3QgYWN0aXZlIHBhZ2UgaW5kZXggZnJvbSBwcmVmZXJlbmNlIG1hbmFnZXIKLSAgICBpbnQgYWN0aXZlUGFnZUluZGV4ID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KFhNTFByZWZlcmVuY2VOYW1lcy5MQVNUX0FDVElWRV9QQUdFKTsKLQotICAgIC8vIFdlIGNoZWNrIHRoaXMgcmFuZ2Ugc2luY2Ugc29tZW9uZSBjb3VsZCBoYW5kIGVkaXQgdGhlIFhNTAotICAgIC8vIHByZWZlcmVuY2UgZmlsZSB0byBhbiBpbnZhbGlkIHZhbHVlIC4uLiB3aGljaCBJIGtub3cgZnJvbQotICAgIC8vIGV4cGVyaWVuY2UgOiggLi4uIGlmIHRoZXkgZG8sIHdlJ2xsIHJlc2V0IHRvIGRlZmF1bHQgYW5kIGNvbnRpbnVlCi0gICAgLy8gcmF0aGVyIHRoYW4gdGhyb3cgYW4gYXNzZXJ0aW9uIGVycm9yIGluIHRoZSBzZXRBY3RpdmVQYWdlKGludCkKLSAgICAvLyBtZXRob2QuCi0gICAgaWYgKGFjdGl2ZVBhZ2VJbmRleCA8IDAgfHwgYWN0aXZlUGFnZUluZGV4ID49IGdldFBhZ2VDb3VudCgpKSB7Ci0gICAgICBhY3RpdmVQYWdlSW5kZXggPSBmU291cmNlUGFnZUluZGV4OwotICAgIH0KLSAgICBzZXRBY3RpdmVQYWdlKGFjdGl2ZVBhZ2VJbmRleCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLSAgICAvLyBJZiBkcml2ZW4gZnJvbSB0aGUgU291cmNlIHBhZ2UsIGl0J3MgIm1vZGVsIiBtYXkgbm90IGJlIHVwIHRvIGRhdGUKLSAgICAvLyB3aXRoIHRoZSBpbnB1dCBqdXN0IHlldC4gV2UnbGwgcmVseSBvbiBsYXRlciBub3RpZmljYXRpb24gZnJvbSB0aGUKLSAgICAvLyBUZXh0Vmlld2VyIHRvIHNldCB1cyBzdHJhaWdodAotICAgIHN1cGVyLnNldElucHV0KGlucHV0KTsKLSAgICBzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIElFeHRlbmRlZE1hcmt1cEVkaXRvciBtZXRob2QKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChTaGVsbCBjb250ZXh0KSB7Ci0gICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNERWRpdG9yUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5JTkZPLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotICAgIHJldHVybiBnZXRUZXh0RWRpdG9yKCkudmFsaWRhdGVFZGl0KGNvbnRleHQpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTRFNlbGVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9YU0RTZWxlY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZjAzNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTRFNlbGVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotcHVibGljIGNsYXNzIFhTRFNlbGVjdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdGhpcyk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIGlmIChlbmFibGVOb3RpZnkpCi0gICAgewotICAgICAgc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpLCBldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLSAgICB9Ci0gIH0KLQotICAKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVOb3RpZnkgPSB0cnVlOwotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSkKLSAgeyAgCi0vLwkgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VsZWN0aW9uTWFuYWdlci5zZXRTZWxlY3Rpb24oKSAiICsgc2VsZWN0aW9uICsgIiwgIiArIHNvdXJjZSk7Ci0gICAgaWYgKGVuYWJsZU5vdGlmeSkKLSAgICB7Ci0gICAgICBjdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgICAgZW5hYmxlTm90aWZ5ID0gZmFsc2U7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzb3VyY2UsIHNlbGVjdGlvbik7Ci0gICAgICAgIExpc3QgY29weU9mTGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdChsaXN0ZW5lckxpc3QpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb3B5T2ZMaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgICAgICBsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBlbmFibGVOb3RpZnkgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfSAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTRFRleHRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9YU0RUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZGU1ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTRFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnV0aWwuU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub24uT3Blbk9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlldy5ldmVudHMuSU5vZGVTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXcuZXZlbnRzLk5vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRFZGl0b3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5YU0RBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5YU0RDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5YU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhTRFRleHRFZGl0b3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclhNTCBpbXBsZW1lbnRzIElOb2RlU2VsZWN0aW9uTGlzdGVuZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFhTRFNlbGVjdGlvbk1hbmFnZXIgeHNkU2VsZWN0aW9uTWFuYWdlcjsKLSAgcHJvdGVjdGVkIFhTRE1vZGVsQWRhcHRlckZhY3RvcnlJbXBsIHhzZE1vZGVsQWRhcHRlckZhY3Rvcnk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLSAgcHJvdGVjdGVkIEludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBJbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0KLSAgcHVibGljIFhTRFRleHRFZGl0b3IoWFNERWRpdG9yIHhzZEVkaXRvcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgeHNkU2VsZWN0aW9uTWFuYWdlciA9IHhzZEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCk7Ci0gICAgeHNkU2VsZWN0aW9uTWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBzZXRIZWxwQ29udGV4dElkKFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9TT1VSQ0VfVklFVyk7Ci0gICAgCi0gICAgeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSA9IG5ldyBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbCgpOwotICAgIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciA9IG5ldyBYU0RBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIHhzZFNlbGVjdGlvbk1hbmFnZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICB9Ci0gIAotICBwdWJsaWMgWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwgZ2V0WFNETW9kZWxBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4geHNkTW9kZWxBZGFwdGVyRmFjdG9yeTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLSAgfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHJlcXVpcmVkKSB7Ci0JICAKLQkJaWYgKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKQotICAgIHsKLQkgICAgZlByb3BlcnR5U2hlZXRQYWdlID0gbmV3IFhTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKGdldFhTREVkaXRvcigpKTsKLSAgICAgIAotCSAgICAoKFhTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKWZQcm9wZXJ0eVNoZWV0UGFnZSkuc2V0WFNETW9kZWxBZGFwdGVyRmFjdG9yeSh4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsKLSAgICAgICgoWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpZlByb3BlcnR5U2hlZXRQYWdlKS5zZXRTZWxlY3Rpb25NYW5hZ2VyKGdldFhTREVkaXRvcigpLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0JICAgICgoWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpZlByb3BlcnR5U2hlZXRQYWdlKS5zZXRYU0RTY2hlbWEoZ2V0WFNEU2NoZW1hKCkpOwotCi0gICAgICByZXR1cm4gZlByb3BlcnR5U2hlZXRQYWdlOwotCQl9Ci0JCWVsc2UgaWYgKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkKLQkJewotCQkJaWYgKGZPdXRsaW5lUGFnZSA9PSBudWxsIHx8IGZPdXRsaW5lUGFnZS5nZXRDb250cm9sKCkgPT0gbnVsbCB8fCBmT3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLQkJCXsKLQkJCQlYU0RDb250ZW50T3V0bGluZVBhZ2Ugb3V0bGluZVBhZ2UgPSBuZXcgWFNEQ29udGVudE91dGxpbmVQYWdlKHRoaXMpOwotICAgICAgICBYU0RDb250ZW50UHJvdmlkZXIgeHNkQ29udGVudFByb3ZpZGVyID0gbmV3IFhTRENvbnRlbnRQcm92aWRlcih4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsKLSAgICAgICAgeHNkQ29udGVudFByb3ZpZGVyLnNldFhTRFNjaGVtYShnZXRYU0RTY2hlbWEoKSk7Ci0JICAgICAgb3V0bGluZVBhZ2Uuc2V0Q29udGVudFByb3ZpZGVyKHhzZENvbnRlbnRQcm92aWRlcik7Ci0JICAgICAgb3V0bGluZVBhZ2Uuc2V0TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIpOwotCQkJCW91dGxpbmVQYWdlLnNldE1vZGVsKGdldFhTRFNjaGVtYSgpLmdldERvY3VtZW50KCkpOwotCQkJCQotCQkJCS8vIFVwZGF0ZSBvdXRsaW5lIHNlbGVjdGlvbiBmcm9tIHNvdXJjZSBlZGl0b3Igc2VsZWN0aW9uOgotCSAgICAgIGdldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKS5hZGROb2RlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JICAgICAgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZ2V0Vmlld2VyU2VsZWN0aW9uTWFuYWdlcigpKTsKLQkgICAgICBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLnNldEV2ZW50U291cmNlKG91dGxpbmVQYWdlKTsKLQotCQkJCWZPdXRsaW5lUGFnZSA9IG91dGxpbmVQYWdlOwotCQkJfQotCQkJcmV0dXJuIGZPdXRsaW5lUGFnZTsKLQkJfQotCQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihyZXF1aXJlZCk7Ci0JfQotICAKLSAgWFNETW9kZWxRdWVyeUNvbnRyaWJ1dG9yIHhzZE1vZGVsUXVlcnlDb250cmlidXRvciA9IG5ldyBYU0RNb2RlbFF1ZXJ5Q29udHJpYnV0b3IoKTsKLQotICBwcm90ZWN0ZWQgWFNEQ29udGVudE91dGxpbmVQYWdlIG91dGxpbmVQYWdlOwotCi0gIC8qCi0gICAqIEBzZWUgU3RydWN0dXJlZFRleHRFZGl0b3IjZ2V0Q29udGVudE91dGxpbmVQYWdlKCkKLSAgICovCi0gIHB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpCi0gIHsKLSAgICByZXR1cm4gZk91dGxpbmVQYWdlOwotICB9Ci0KLSAgLy8gdXNlZCB0byBtYXAgc2VsZWN0aW9ucyBmcm9tIHRoZSBvdXRsaW5lIHZpZXcgdG8gdGhlIHNvdXJjZSB2aWV3Ci0gIC8vIHRoaXMgY2xhc3MgdGhpbmtzIG9mIHNlbGVjdGlvbnMgaW4gdGVybXMgb2YgRE9NIGVsZW1lbnQKLSAgY2xhc3MgSW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIKLSAgewotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IG51bGw7Ci0KLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBub2RlID0gKChYU0RDb21wb25lbnQpb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSAoKENhdGVnb3J5QWRhcHRlcilvYmplY3QpLmdldFhTRFNjaGVtYSgpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLQotICAgICAgLy8gdGhlIHRleHQgZWRpdG9yIGNhbiBvbmx5IGFjY2VwdCBzZWQgbm9kZXMhCi0gICAgICAvLwotICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIFhNTE5vZGUpKQotICAgICAgewotICAgICAgICBub2RlID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gaGVyZSB3ZSBjb252ZXJ0IHRoZSBtb2RlbCBzZWxlY3Rpb24gdG8gYSBub2RlIHNlbGVjdGlvbiByZXEnZCBmb3IgdGhlIHNvdXJjZSB2aWV3Ci0gICAgLy8KLSAgICBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBub2RlU2VsZWN0aW9uQ2hhbmdlZChOb2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gaGVyZSB3ZSBjb252ZXJ0IGFuIG5vZGUgc2VsZWNpdG9uIHRvIGEgbW9kZWwgc2VsZWN0aW9uIGFzIHJlcSdkIGJ5IHRoZSBvdGhlciB2aWV3cwotICAgIC8vCi0gICAgaWYgKCFldmVudC5nZXRTb3VyY2UoKS5lcXVhbHMoaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcikgJiYgZ2V0WFNERWRpdG9yKCkuZ2V0QWN0aXZlRWRpdG9yUGFnZSgpICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgICAgIExpc3QgbGlzdCA9IGV2ZW50LmdldFNlbGVjdGVkTm9kZXMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpLm5leHQoKTsKLSAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICAgICAgewotCSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0JICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgfQotCSAgICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGVsZW1lbnQgPSAoKEF0dHIpbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIE9iamVjdCBvID0gZWxlbWVudDsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBtb2RlbE9iamVjdCA9IGdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZWxlbWVudCk7Ci0gICAgICAgIGlmIChtb2RlbE9iamVjdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbyA9IG1vZGVsT2JqZWN0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZFNlbGVjdGlvbk1hbmFnZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG8pLCBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgeHNkU2VsZWN0aW9uTWFuYWdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSwgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgCi0gIC8qCi0gICAqIEBzZWUgSVRleHRFZGl0b3IjZG9SZXZlcnRUb1NhdmVkKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvUmV2ZXJ0VG9TYXZlZCgpCi0gIHsKLSAgICBzdXBlci5kb1JldmVydFRvU2F2ZWQoKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgU3RydWN0dXJlZFRleHRFZGl0b3IjdXBkYXRlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZSgpCi0gIHsKLSAgICBzdXBlci51cGRhdGUoKTsKLSAgICBpZiAob3V0bGluZVBhZ2UgIT0gbnVsbCkKLSAgICAgb3V0bGluZVBhZ2Uuc2V0TW9kZWwoZ2V0TW9kZWwoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNsaWVudDsKLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZE9wZW5PblNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgewotICAgIGdldFRleHRWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKQotICAgIHsKLSAgICAgIC8qKgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXIja2V5UmVsZWFzZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudCkKLSAgICAgICAgICovCi0gICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBhcmcwKQotICAgICAgewotICAgICAgICBpZiAoYXJnMC5rZXlDb2RlID09IFNXVC5GMykKLSAgICAgICAgewotICAgICAgICAgIGdldFhTREVkaXRvcigpLmdldE9wZW5PblNlbGVjdGlvbkhlbHBlcigpLm9wZW5PblNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9KTsKLSAgfQotCi0gLy8gcHJpdmF0ZSBzdGF0aWMgQ29sb3IgZGl2aWRlckNvbG9yOwotCi0JcHJvdGVjdGVkIElTb3VyY2VWaWV3ZXIgY3JlYXRlU291cmNlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElWZXJ0aWNhbFJ1bGVyIHZlcnRpY2FsUnVsZXIsIGludCBzdHlsZXMpIHsKLQotCQlmQW5ub3RhdGlvbkFjY2Vzcz0gY3JlYXRlQW5ub3RhdGlvbkFjY2VzcygpOwotCQlmT3ZlcnZpZXdSdWxlcj0gY3JlYXRlT3ZlcnZpZXdSdWxlcihnZXRTaGFyZWRDb2xvcnMoKSk7Ci0KLQkJU3RydWN0dXJlZFRleHRWaWV3ZXIgc291cmNlVmlld2VyID0gY3JlYXRlU3RydWN0ZWRUZXh0Vmlld2VyKHBhcmVudCwgdmVydGljYWxSdWxlciwgc3R5bGVzKTsKLQkJaW5pdFNvdXJjZVZpZXdlcihzb3VyY2VWaWV3ZXIpOwotCi0gICAgLy8gZW5kIG9mIHN1cGVyIGNyZWF0ZVNvdXJjZVZpZXdlcgotCQkKLSAgICAvL1N0cnVjdHVyZWRBbm5vdGF0aW9uQWNjZXNzIGFubm90YXRpb25BY2Nlc3MgPSBuZXcgU3RydWN0dXJlZEFubm90YXRpb25BY2Nlc3MoKTsKLQkgLy8gRGVmYXVsdE1hcmtlckFubm90YXRpb25BY2Nlc3MgYW5ub3RhdGlvbkFjY2VzcyA9IG5ldyBEZWZhdWx0TWFya2VyQW5ub3RhdGlvbkFjY2VzcygpOwotCQkKLQkvLyAgSVNoYXJlZFRleHRDb2xvcnMgc2hhcmVkQ29sb3JzID0gZ2V0VGV4dENvbG9yc0NhY2hlKCk7Ci0vLy8vICBmT3ZlcnZpZXdSdWxlciA9IG5ldyBPdmVydmlld1J1bGVyKGFubm90YXRpb25BY2Nlc3MsIE9WRVJWSUVXX1JVTEVSX1dJRFRILCBzaGFyZWRDb2xvcnMpOwotCS8vICBmT3ZlcnZpZXdSdWxlciA9IG5ldyBPdmVydmlld1J1bGVyKGNyZWF0ZUFubm90YXRpb25BY2Nlc3MoKSwgMTIsIHNoYXJlZENvbG9ycyk7Ci0JICAKLS8vCSAgZk92ZXJ2aWV3UnVsZXIuYWRkSGVhZGVyQW5ub3RhdGlvblR5cGUoU3RydWN0dXJlZEFubm90YXRpb25UeXBlLkVSUk9SKTsKLS8vCSAgZk92ZXJ2aWV3UnVsZXIuYWRkSGVhZGVyQW5ub3RhdGlvblR5cGUoU3RydWN0dXJlZEFubm90YXRpb25UeXBlLldBUk5JTkcpOwotCSAgCi0JIC8vIGZTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydCA9IG5ldyBTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydChzb3VyY2VWaWV3ZXIsIGZPdmVydmlld1J1bGVyLCBhbm5vdGF0aW9uQWNjZXNzLCBzaGFyZWRDb2xvcnMpOwotICAgIC8vY29uZmlndXJlU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQoZlNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KTsgICAgCi0KLS8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHdhcyByZW1vdmVkCi0vLyAgICBzb3VyY2VWaWV3ZXIuc2V0RWRpdG9yKHRoaXMpOwotCi0JCXJldHVybiBzb3VyY2VWaWV3ZXI7Ci0JfQotCi0gIC8qCi0gICAqIEBzZWUgU3RydWN0dXJlZFRleHRFZGl0b3Ijc2V0TW9kZWwoSUZpbGVFZGl0b3JJbnB1dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKElGaWxlRWRpdG9ySW5wdXQgaW5wdXQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICBzdXBlci5zZXRNb2RlbChpbnB1dCk7Ci0gICAgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBYTUxNb2RlbCkKLSAgICB7Ci0gICAgICB4c2RNb2RlbFF1ZXJ5Q29udHJpYnV0b3Iuc2V0TW9kZWwoKFhNTE1vZGVsKWdldE1vZGVsKCkpOwotICAgIH0KLSAgICBmaWxlID0gaW5wdXQuZ2V0RmlsZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWxlIGZpbGU7Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgeHNkU2NoZW1hLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBYU0RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKCkKLSAgewotICAgIHJldHVybiAoKFhTREVkaXRvcilnZXRFZGl0b3JQYXJ0KCkpLmdldFhTRFNjaGVtYSgpOwotICB9Ci0gIAotICBwdWJsaWMgWFNERWRpdG9yIGdldFhTREVkaXRvcigpCi0gIHsKLSAgICByZXR1cm4gKFhTREVkaXRvcilnZXRFZGl0b3JQYXJ0KCk7Ci0gIH0KLSAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3Ijc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZShJRWRpdG9ySW5wdXQpCi0gICAqLwotCXB1YmxpYyB2b2lkIHNhZmVseVNhbml0eUNoZWNrU3RhdGUoSUVkaXRvcklucHV0IGlucHV0KQotICB7Ci0gICAgc3VwZXIuc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZShpbnB1dCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgV3JhcHBlZE9wZW5GaWxlQWN0aW9uIGV4dGVuZHMgT3Blbk9uQWN0aW9uCi0gIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgV3JhcHBlZEFjdGlvbi4KLSAgICAgKiBAcGFyYW0gYnVuZGxlCi0gICAgICogQHBhcmFtIHByZWZpeAotICAgICAqIEBwYXJhbSBlZGl0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgV3JhcHBlZE9wZW5GaWxlQWN0aW9uKAotICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlLAotICAgICAgU3RyaW5nIHByZWZpeCwKLSAgICAgIElUZXh0RWRpdG9yIGVkaXRvcikKLSAgICB7Ci0gICAgICBzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBpZiAoIWdldFhTREVkaXRvcigpLmdldE9wZW5PblNlbGVjdGlvbkhlbHBlcigpLm9wZW5PblNlbGVjdGlvbigpKQotICAgICAgewotICAgICAgICBzdXBlci5ydW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBXcmFwcGVkT3BlbkZpbGVBY3Rpb24gd3JhcHBlZEFjdGlvbjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIEFjdGlvbkdyb3VwIGZSZWZhY3Rvck1lbnVHcm91cDsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2NyZWF0ZUFjdGlvbnMoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0gICAgYWRkT3Blbk9uU2VsZWN0aW9uTGlzdGVuZXIoKTsKLSAgICBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7IC8vUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFJFU09VUkNFX0JVTkRMRV9OQU1FKTsKLSAgICAKLSAgICB3cmFwcGVkQWN0aW9uID0gbmV3IFdyYXBwZWRPcGVuRmlsZUFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFICsgRE9ULCB0aGlzKTsKLSAgICBzZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFLCB3cmFwcGVkQWN0aW9uKTsKLQlmUmVmYWN0b3JNZW51R3JvdXAgPSBuZXcgUmVmYWN0b3JBY3Rpb25Hcm91cCh0aGlzLmdldFhTREVkaXRvcigpLmdldFNlbGVjdGlvbk1hbmFnZXIoKSwgZ2V0WFNEU2NoZW1hKCksIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQKLSk7Ci0KLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yI2FkZENvbnRleHRNZW51QWN0aW9ucyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRleHRNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkKLQkJc3VwZXIuYWRkQ29udGV4dE1lbnVBY3Rpb25zKG1lbnUpOwotCQlBY3Rpb25Db250ZXh0IGNvbnRleHQ9IG5ldyBBY3Rpb25Db250ZXh0KGdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpOwotCQlmUmVmYWN0b3JNZW51R3JvdXAuc2V0Q29udGV4dChjb250ZXh0KTsKLQkJZlJlZmFjdG9yTWVudUdyb3VwLmZpbGxDb250ZXh0TWVudShtZW51KTsKLQkJZlJlZmFjdG9yTWVudUdyb3VwLnNldENvbnRleHQobnVsbCk7Ci0JfQotICAgIAotCi0gIGNsYXNzIFhTRE1vZGVsUXVlcnlDb250cmlidXRvciBleHRlbmRzIEFic3RyYWN0WFNETW9kZWxRdWVyeUNvbnRyaWJ1dG9yCi0gIHsKLSAgICBwdWJsaWMgQWJzdHJhY3RYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uIGNyZWF0ZVhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24oTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWFNERGF0YVR5cGVWYWx1ZUV4dGVuc2lvbihtb2RlbFF1ZXJ5KTsKLSAgICB9Ci0gIH0KLSAKLQotICBjbGFzcyBYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3RYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uKE1vZGVsUXVlcnkgbW9kZWxRdWVyeSkKLSAgICB7Ci0gICAgICBzdXBlcihtb2RlbFF1ZXJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIlhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24iOwotICAgIH0KLSAgICAgCi0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYSBnZXRFbmNsb3NpbmdYU0RTY2hlbWEoRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBnZXRYU0RTY2hlbWEoKTsKLSAgICB9ICAgCi0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNEVVJJQ29udmVydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvWFNEVVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZjYzOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL1hTRFVSSUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIudXRpbC5JZFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIudXRpbC5JZFJlc29sdmVySW1wbDsKLQotcHVibGljIGNsYXNzIFhTRFVSSUNvbnZlcnRlciBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwKLXsKLSAgSUZpbGUgcmVzb3VyY2VGaWxlOwotICBwdWJsaWMgWFNEVVJJQ29udmVydGVyKElGaWxlIHJlc291cmNlRmlsZSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5yZXNvdXJjZUZpbGUgPSByZXNvdXJjZUZpbGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIjY3JlYXRlSW5wdXRTdHJlYW0oVVJJKQotICAgKi8KLSAgcHVibGljIElucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5zY2hlbWUoKTsKLSAgICBVUkkgbWFwcGVkVVJJID0gdXJpOwotICAgIGlmIChzY2hlbWUgIT0gbnVsbCAmJiAhc2NoZW1lLmVxdWFscygiZmlsZSIpICYmICFzY2hlbWUuZXF1YWxzKCJwbGF0Zm9ybSIpKQotICAgIC8vIGlmICgiaHR0cCIuZXF1YWxzKHNjaGVtZSkpCi0gICAgewotICAgICAgU3RyaW5nIHRoZVVSSSA9IHVyaS50b1N0cmluZygpOwotICAgICAgSWRSZXNvbHZlciBpZFJlc29sdmVyID0gbmV3IElkUmVzb2x2ZXJJbXBsKHRoZVVSSSk7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gaWRSZXNvbHZlci5yZXNvbHZlSWQoIi8iLCBudWxsLCB0aGVVUkkpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBtYXBwZWRVUkkgPSBjcmVhdGVVUkkocmVzdWx0KTsKLSAgICAgIH0gIAotICAgIH0gIAotICAgIHJldHVybiBzdXBlci5jcmVhdGVVUkxJbnB1dFN0cmVhbShtYXBwZWRVUkkpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIHVyaVN0cmluZykKLSAgewotICAgIGlmIChoYXNQcm90b2NvbCh1cmlTdHJpbmcpKQotICAgICAgcmV0dXJuIFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkodXJpU3RyaW5nKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNQcm90b2NvbChTdHJpbmcgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgICAgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZigiOiIpOwotICAgICAgaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ID4gMikgLy8gYXNzdW1lIHByb3RvY29sIHdpdGggYmUgbGVuZ3RoIDMgc28gdGhhdCB0aGUnQycgaW4gJ0M6LycgaXMgbm90IGludGVycHJldGVkIGFzIGEgcHJvdG9jb2wKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlUGF0aFRvU2NoZW1hKFN0cmluZyBhLCBTdHJpbmcgYikKLSAgewotICAgIFN0cmluZyByZXN1bHQ7Ci0gICAgaWYgKGIuc3RhcnRzV2l0aChhKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBiLnN1YnN0cmluZyhhLmxlbmd0aCgpICsgMSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGI7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyMTQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50OwotCi0gIC8qKgotICAgKiBAcGFyYW0gdGV4dAotICAgKi8KLSAgcHVibGljIEFic3RyYWN0QWN0aW9uKFN0cmluZyB0ZXh0LCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCkKLSAgewotICAgIHN1cGVyKHRleHQpOwotICAgIHRoaXMueHNkQ29uY3JldGVDb21wb25lbnQgPSB4c2RDb25jcmV0ZUNvbXBvbmVudDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdGV4dAotICAgKiBAcGFyYW0gaW1hZ2UKLSAgICovCi0gIHB1YmxpYyBBYnN0cmFjdEFjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlLCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCkKLSAgewotICAgIHN1cGVyKHRleHQsIGltYWdlKTsKLSAgICB0aGlzLnhzZENvbmNyZXRlQ29tcG9uZW50ID0geHNkQ29uY3JldGVDb21wb25lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRleHQKLSAgICogQHBhcmFtIHN0eWxlCi0gICAqLwotICBwdWJsaWMgQWJzdHJhY3RBY3Rpb24oU3RyaW5nIHRleHQsIGludCBzdHlsZSkKLSAgewotICAgIHN1cGVyKHRleHQsIHN0eWxlKTsKLSAgfQotICAKLSAgcHVibGljIERvY3VtZW50SW1wbCBnZXREb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gKERvY3VtZW50SW1wbCkgeHNkQ29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICBnZXREb2N1bWVudCgpLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZGVzY3JpcHRpb24pOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoKQotICB7Ci0gICAgRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIGdldERvY3VtZW50KCk7Ci0gICAgCi0gICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOyAgICAKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEF0dHJpYnV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYTlmM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZEF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBdHRyaWJ1dGVBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbgotewotICBwcm90ZWN0ZWQgQWRkQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kIGNvbW1hbmQ7Ci0gIAotICBwdWJsaWMgQWRkQXR0cmlidXRlQWN0aW9uKFN0cmluZyB0ZXh0LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBwYXJlbnQpOwotICAgIGNvbW1hbmQgPSBuZXcgQWRkQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKHBhcmVudCk7Ci0gIH0KLQotICBwdWJsaWMgQWRkQXR0cmlidXRlQWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UsIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCkKLSAgewotICAgIHN1cGVyKHRleHQsIGltYWdlLCBwYXJlbnQpOwotICAgIGNvbW1hbmQgPSBuZXcgQWRkQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKHBhcmVudCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmVnaW5SZWNvcmRpbmcoZ2V0VGV4dCgpKTsKLSAgICBjb21tYW5kLnJ1bigpOwotICAgIAotICAgIGVuZFJlY29yZGluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbnVtc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRW51bXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjMmY0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbnVtc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtZXJhdGlvbnNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBQYXR0ZXJuIGlzIHNjb3BlZCB0byBFbnVtIFR5cGUKLSAqLwotcHVibGljIGNsYXNzIEFkZEVudW1zQWN0aW9uIGV4dGVuZHMgQ3JlYXRlRWxlbWVudEFjdGlvbgotewotICBwdWJsaWMgQWRkRW51bXNBY3Rpb24oU3RyaW5nIGxhYmVsKQotICB7Ci0gIAlzdXBlcihsYWJlbCk7Ci0gIH0KLSAKLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlQW5kQWRkTmV3Q2hpbGRFbGVtZW50KFN0cmluZyB0b2tlbikKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBwYXJlbnROb2RlLmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOwotICAgIEVsZW1lbnQgY2hpbGROb2RlID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBwcmVmaXggKyBlbGVtZW50VGFnKTsKLSAgICBpZiAoZ2V0QXR0cmlidXRlcygpICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBET01BdHRyaWJ1dGUgYXR0ciA9IChET01BdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICBjaGlsZE5vZGUuc2V0QXR0cmlidXRlKGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZ2V0UmVsYXRpdmVOb2RlKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAoKEVsZW1lbnQpcGFyZW50Tm9kZSkuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSxnZXRSZWxhdGl2ZU5vZGUoKSk7Ci0gICAgfQotICAgIGNoaWxkTm9kZS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgdG9rZW4pOwotICAgIHJldHVybiBjaGlsZE5vZGU7Ci0gIH0gICAgCi0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgLy8gaWYgaXQgaXMgbnVsbCwgZ2V0IHRoZSBkZWZhdWx0IG9uZQotICAgIGRpc3BsYXkgPSBkaXNwbGF5ID09IG51bGwgPyBEaXNwbGF5LmdldERlZmF1bHQoKSA6IGRpc3BsYXk7Ci0gICAgU2hlbGwgcGFyZW50U2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgRW51bWVyYXRpb25zRGlhbG9nIGRpYWxvZyA9IG5ldyBFbnVtZXJhdGlvbnNEaWFsb2cocGFyZW50U2hlbGwpOwotICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQotICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSAKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhnZXREZXNjcmlwdGlvbigpKTsKLQotICAgICAgU3RyaW5nIHRleHQgPSBkaWFsb2cuZ2V0VGV4dCgpOwotICAgICAgU3RyaW5nIGRlbGltaXRlciA9IGRpYWxvZy5nZXREZWxpbWl0ZXIoKTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRleHQsIGRlbGltaXRlcik7Ci0gICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgaWYgKGRpYWxvZy5pc1ByZXNlcnZlV2hpdGVzcGFjZSgpID09IGZhbHNlKSAKLSAgICAgICAgewotICAgICAgICAgIHRva2VuID0gdG9rZW4udHJpbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgRWxlbWVudCBjaGlsZCA9IGNyZWF0ZUFuZEFkZE5ld0NoaWxkRWxlbWVudCh0b2tlbik7Ci0gICAgICAgIGZvcm1hdENoaWxkKGNoaWxkKTsgICAgICAgIAotICAgICAgfQotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkTW9kZWxHcm91cEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkTW9kZWxHcm91cEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzMxNTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZE1vZGVsR3JvdXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkTW9kZWxHcm91cENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi0KLXB1YmxpYyBjbGFzcyBBZGRNb2RlbEdyb3VwQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gICBwcm90ZWN0ZWQgQWRkTW9kZWxHcm91cENvbW1hbmQgY29tbWFuZDsKLSAgIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIAotICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFiZWwoWFNEQ29tcG9zaXRvciBjb21wb3NpdG9yKQotICAgewotICAgICBTdHJpbmcgcmVzdWx0ID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfU0VRVUVOQ0UiKTsgLy8kTk9OLU5MUy0xJAotICAgICBpZiAoY29tcG9zaXRvciAhPSBudWxsKQotICAgICB7Ci0gICAgICAgaWYgKGNvbXBvc2l0b3IgPT0gWFNEQ29tcG9zaXRvci5DSE9JQ0VfTElURVJBTCkKLSAgICAgICB7Ci0gICAgICAgICByZXN1bHQgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9DSE9JQ0UiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICB9Ci0gICAgICAgZWxzZSBpZiAoY29tcG9zaXRvciA9PSBYU0RDb21wb3NpdG9yLkFMTF9MSVRFUkFMKQotICAgICAgIHsKLSAgICAgICAgIHJlc3VsdCA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FMTCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICB9ICAKLSAgICAgfQotICAgICByZXR1cm4gcmVzdWx0OwotICAgfQotICAKLSAgIHB1YmxpYyBBZGRNb2RlbEdyb3VwQWN0aW9uKFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCwgWFNEQ29tcG9zaXRvciBjb21wb3NpdG9yKQotICAgewotICAgICBjb21tYW5kID0gbmV3IEFkZE1vZGVsR3JvdXBDb21tYW5kKHBhcmVudCwgY29tcG9zaXRvcik7Ci0gICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICBzZXRUZXh0KGdldExhYmVsKGNvbXBvc2l0b3IpKTsgICAgIAotICAgfSAgIAotICAgCi0gICBwdWJsaWMgdm9pZCBydW4oKQotICAgewotICAgICBEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgcGFyZW50LmdldEVsZW1lbnQoKS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgIGRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGdldFRleHQoKSk7Ci0gICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFNjaGVtYU5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFNjaGVtYU5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhODk1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRTY2hlbWFOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRTY2hlbWFOb2RlQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQWRkU2NoZW1hTm9kZUFjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBBZGRTY2hlbWFOb2RlQWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFkZFNjaGVtYU5vZGVBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqLwotICBwdWJsaWMgQWRkU2NoZW1hTm9kZUFjdGlvbihTdHJpbmcgdGV4dCkKLSAgewotICAgIHN1cGVyKHRleHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBBZGRTY2hlbWFOb2RlQWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKiBAcGFyYW0gaW1hZ2UKLSAgICovCi0gIHB1YmxpYyBBZGRTY2hlbWFOb2RlQWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3IoWFNERWRpdG9yIGVkaXRvcikKLSAgewotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNERWRpdG9yIGVkaXRvcjsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgZWRpdG9yLmNyZWF0ZURlZmF1bHRTY2hlbWFOb2RlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0JhY2tBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0JhY2tBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiNTE4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYWNrQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLlhTREdyYXBoVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8qKgotICogQGF1dGhvciBrY2hvbmcKLSAqCi0gKiA8YSBocmVmPSJtYWlsdG86a2Nob25nQGNhLmlibS5jb20iPmtjaG9uZ0BjYS5pYm0uY29tPC9hPgotICoKLSAqLwotcHVibGljIGNsYXNzIEJhY2tBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotICBYU0RHcmFwaFZpZXdlciB4c2RHcmFwaFZpZXdlcjsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBCYWNrQWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRleHQKLSAgICovCi0gIHB1YmxpYyBCYWNrQWN0aW9uKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gIH0KLQotICBwdWJsaWMgQmFja0FjdGlvbihTdHJpbmcgdGV4dCwgWFNER3JhcGhWaWV3ZXIgdmlld2VyKQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gICAgeHNkR3JhcGhWaWV3ZXIgPSB2aWV3ZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gdGV4dAotICAgKiBAcGFyYW0gaW1hZ2UKLSAgICovCi0gIHB1YmxpYyBCYWNrQWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRleHQKLSAgICogQHBhcmFtIHN0eWxlCi0gICAqLwotICBwdWJsaWMgQmFja0FjdGlvbihTdHJpbmcgdGV4dCwgaW50IHN0eWxlKQotICB7Ci0gICAgc3VwZXIodGV4dCwgc3R5bGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uUHJvdmlkZXIoSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb25Qcm92aWRlciA9IHNlbGVjdGlvblByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0WFNEU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAKLSAgLyoKLSAgICogQHNlZSBJQWN0aW9uI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih4c2RTY2hlbWEpOwotICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVBbm5vdGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVBbm5vdGF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OGQ0MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIENyZWF0ZUFubm90YXRpb25BY3Rpb24gZXh0ZW5kcyBDcmVhdGVFbGVtZW50QWN0aW9uCi17Ci0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIEVsZW1lbnQgZG9jdW1lbnRhdGlvbk5vZGU7Ci0KLSAgcHVibGljIENyZWF0ZUFubm90YXRpb25BY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBDcmVhdGVBbm5vdGF0aW9uQWN0aW9uKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gIH0KLQotICBwdWJsaWMgQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKQotICB7Ci0gICAgc3VwZXIodGV4dCwgaW1hZ2UpOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlQW5kQWRkTmV3Q2hpbGRFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgY2hpbGROb2RlID0gc3VwZXIuY3JlYXRlQW5kQWRkTmV3Q2hpbGRFbGVtZW50KCk7Ci0KLSAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50Tm9kZS5nZXRQcmVmaXgoKTsKLSAgICBwcmVmaXggPSAocHJlZml4ID09IG51bGwpID8gIiIgOiAocHJlZml4ICsgIjoiKTsKLSAgICBkb2N1bWVudGF0aW9uTm9kZSA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgcHJlZml4ICsgWFNEQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcpOwotICAgIGNoaWxkTm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudGF0aW9uTm9kZSk7Ci0KLSAgICBmb3JtYXRDaGlsZChjaGlsZE5vZGUpOwotICAgIGZvcm1hdENoaWxkKGRvY3VtZW50YXRpb25Ob2RlKTsKLSAgICBmb3JtYXRDaGlsZChjaGlsZE5vZGUpOwotICAgIAotICAgIHJldHVybiBjaGlsZE5vZGU7Ci0gIH0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUF0dHJpYnV0ZUFuZFJlcXVpcmVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVBdHRyaWJ1dGVBbmRSZXF1aXJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTYzNGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUF0dHJpYnV0ZUFuZFJlcXVpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoKLSAqIENsYXNzIHdoaWNoIGNyZWF0ZXMgYW4gQXR0cmlidXRlIGFuZCBuZWNlc3NhcnkgRWxlbWVudHMgcmVxdWlyZWQgYmVmb3JlCi0gKiBhbiBBdHRyaWJ1dGUgY2FuIGJlIGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHdlIHdpc2ggdG8gYWRkIGFuIEF0dHJpYnV0ZQotICogdG8gYSBHbG9iYWxFbGVtZW50IHdpdGhvdXQgYSBDb21wbGV4VHlwZSwgYSBDb21wbGV4VHlwZSB3aWxsIGJlIGNyZWF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVBdHRyaWJ1dGVBbmRSZXF1aXJlZCBleHRlbmRzIEFjdGlvbiB7Ci0JU3RyaW5nIGVsZW1lbnRUYWc7Ci0JU3RyaW5nIGxhYmVsOwotCUxpc3QgYXR0cmlidXRlczsKLQlYU0RTY2hlbWEgeHNkU2NoZW1hOwotCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKLQlPYmplY3QgcGFyZW50OwotCQotCXB1YmxpYyBDcmVhdGVBdHRyaWJ1dGVBbmRSZXF1aXJlZChTdHJpbmcgZWxlbWVudFRhZywgU3RyaW5nIGxhYmVsLCBMaXN0IGF0dHJpYnV0ZXMsIFhTRFNjaGVtYSB4c2RTY2hlbWEsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxQcm92aWRlciwgT2JqZWN0IHBhcmVudCkgewotCQlzdXBlcihsYWJlbCk7Ci0JCQotCQl0aGlzLmVsZW1lbnRUYWcgPSBlbGVtZW50VGFnOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0JCXRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotCQl0aGlzLnNlbGVjdGlvblByb3ZpZGVyID0gc2VsUHJvdmlkZXI7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50OwotCQkJYmVnaW5SZWNvcmRpbmcoZWQuZ2V0RWxlbWVudCgpKTsKLQkgICAgICAgIGVkLnNldFR5cGVEZWZpbml0aW9uKG51bGwpOwotCSAgICAgIAlYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdGQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkgICAgICAgIGVkLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHRkKTsKLQkJCQotCQkgICAgQ3JlYXRlRWxlbWVudEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlRWxlbWVudEFjdGlvbihsYWJlbCk7CQkgICAgCi0JCSAgICBhY3Rpb24uc2V0RWxlbWVudFRhZyhlbGVtZW50VGFnKTsKLQkJICAgIGFjdGlvbi5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQkgICAgYWN0aW9uLnNldFBhcmVudE5vZGUodGQuZ2V0RWxlbWVudCgpKTsKLQkJICAgIGFjdGlvbi5zZXRSZWxhdGl2ZU5vZGUobnVsbCk7Ci0JCSAgICBhY3Rpb24uc2V0WFNEU2NoZW1hKHhzZFNjaGVtYSk7Ci0JCSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotCQkgICAgYWN0aW9uLnJ1bigpOwotCQkgICAgCi0JCSAgICBmb3JtYXRDaGlsZCh0ZC5nZXRFbGVtZW50KCkpOwotICAgICAgICBpZiAodGQuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5zaXplKCkgPiAwKQotICAgICAgICB7Ci0JCSAgICAgIHNlbGVjdE9iamVjdCh0ZC5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmdldCgwKSk7Ci0gICAgICAgIH0KLQkJICAgIGVuZFJlY29yZGluZyhlZC5nZXRFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW5SZWNvcmRpbmcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCSgoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRUZXh0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmRSZWNvcmRpbmcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCSgoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdE9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSk7Ci0JICAgIH0KLQl9Ci0JCi0JICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRDaGlsZChFbGVtZW50IGNoaWxkKQotCSAgewotCSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBYTUxOb2RlKQotCSAgICB7Ci0JICAgICAgWE1MTW9kZWwgbW9kZWwgPSAoKFhNTE5vZGUpY2hpbGQpLmdldE1vZGVsKCk7Ci0JICAgICAgdHJ5Ci0JICAgICAgewotCSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZyBtb2RlbCBjaGFuZ2UKLQkgICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCSAgICAgICAgCi0JCSAgICAgIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLQkJCSAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0JICAgICAgfQotCSAgICAgIGZpbmFsbHkKLQkgICAgICB7Ci0JICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLQkgICAgICAgIG1vZGVsLmNoYW5nZWRNb2RlbCgpOyAKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTkwZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQWJzdHJhY3RFZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkNvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkVsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLk1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRWxlbWVudEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotICBwcm90ZWN0ZWQgRWxlbWVudCBwYXJlbnROb2RlOwotCi0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIHByb3RlY3RlZCBPYmplY3Qgc291cmNlQ29udGV4dDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZUVsZW1lbnRBY3Rpb24uCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlRWxlbWVudEFjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlRWxlbWVudEFjdGlvbi4KLSAgICogQHBhcmFtIHRleHQKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVFbGVtZW50QWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKiBAcGFyYW0gaW1hZ2UKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRYU0RTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLnNlbGVjdGlvblByb3ZpZGVyID0gc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VDb250ZXh0KE9iamVjdCBzb3VyY2VDb250ZXh0KQotICB7Ci0gICAgdGhpcy5zb3VyY2VDb250ZXh0ID0gc291cmNlQ29udGV4dDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldHMgdGhlIHBhcmVudE5vZGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldFBhcmVudE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudE5vZGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcGFyZW50Tm9kZS4KLSAgICogQHBhcmFtIHBhcmVudE5vZGUgVGhlIHBhcmVudE5vZGUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnROb2RlKEVsZW1lbnQgcGFyZW50Tm9kZSkKLSAgewotICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0gIH0KLQotICBib29sZWFuIGlzR2xvYmFsID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJc0dsb2JhbChib29sZWFuIGlzR2xvYmFsKQotICB7Ci0gICAgdGhpcy5pc0dsb2JhbCA9IGlzR2xvYmFsOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRJc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gaXNHbG9iYWw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTm9kZSByZWxhdGl2ZU5vZGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZWxlbWVudFRhZzsKLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFRhZyhTdHJpbmcgZWxlbWVudFRhZykKLSAgewotICAgIHRoaXMuZWxlbWVudFRhZyA9IGVsZW1lbnRUYWc7Ci0gIH0KLSAgCi0gIHB1YmxpYyBEb2N1bWVudEltcGwgZ2V0RG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChEb2N1bWVudEltcGwpIGdldFBhcmVudE5vZGUoKS5nZXRPd25lckRvY3VtZW50KCk7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgZ2V0RG9jdW1lbnQoKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGRlc2NyaXB0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKCkKLSAgewotICAgIERvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSBnZXREb2N1bWVudCgpOwotICAgIAotICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUFuZEFkZE5ld0NoaWxkRWxlbWVudCgpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50Tm9kZS5nZXRQcmVmaXgoKTsKLSAgICBwcmVmaXggPSAocHJlZml4ID09IG51bGwpID8gIiIgOiAocHJlZml4ICsgIjoiKTsKLSAgICBFbGVtZW50IGNoaWxkTm9kZSA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgcHJlZml4ICsgZWxlbWVudFRhZyk7Ci0gICAgaWYgKGdldEF0dHJpYnV0ZXMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRE9NQXR0cmlidXRlIGF0dHIgPSAoRE9NQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgY2hpbGROb2RlLnNldEF0dHJpYnV0ZShhdHRyLmdldE5hbWUoKSwgYXR0ci5nZXRWYWx1ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGdldFJlbGF0aXZlTm9kZSgpID09IG51bGwpCi0gICAgewotICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgKChFbGVtZW50KXBhcmVudE5vZGUpLmluc2VydEJlZm9yZShjaGlsZE5vZGUsZ2V0UmVsYXRpdmVOb2RlKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoaXNHbG9iYWwgJiYgZ2V0UmVsYXRpdmVOb2RlKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBUZXh0IHRleHROb2RlID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG5cbiIpOwotICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlzR2xvYmFsICYmIGdldFJlbGF0aXZlTm9kZSgpICE9IG51bGwpCi0gICAgewotICAgICAgVGV4dCB0ZXh0Tm9kZSA9IGdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuXG4iKTsKLSAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRleHROb2RlLCBnZXRSZWxhdGl2ZU5vZGUoKSk7Ci0gICAgfQotCi0gICAgZm9ybWF0Q2hpbGQoY2hpbGROb2RlKTsKLSAgICAKLSAgICByZXR1cm4gY2hpbGROb2RlOwotICB9ICAgIAotICAgIAotICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRDaGlsZChFbGVtZW50IGNoaWxkKQotICB7Ci0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgWE1MTm9kZSkKLSAgICB7Ci0gICAgICBYTUxNb2RlbCBtb2RlbCA9ICgoWE1MTm9kZSljaGlsZCkuZ2V0TW9kZWwoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLSAgICAgICAgCi0JICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7IAotICAgICAgfQotICAgIH0KLSAgfQotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiZWdpblJlY29yZGluZyhnZXREZXNjcmlwdGlvbigpKTsKLSAgICBmaW5hbCBFbGVtZW50IGNoaWxkID0gY3JlYXRlQW5kQWRkTmV3Q2hpbGRFbGVtZW50KCk7Ci0gICAgZW5kUmVjb3JkaW5nKCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmaW5hbCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoY2hpbGQpOwotLy8gICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgCi0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiljb21wKS5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXAuZ2V0Q29udGFpbmVyKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNvbXAuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpY2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXAuZ2V0Q29udGFpbmVyKCkpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc291cmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgQWJzdHJhY3RFZGl0UGFydFZpZXdlciB2aWV3ZXIgPSAoQWJzdHJhY3RFZGl0UGFydFZpZXdlcilzb3VyY2VDb250ZXh0OwotICAgICAgICAgIAotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHZpZXdlci5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbSA9ICgoRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQpb2JqKS5nZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoIWVsZW0uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAoKEVsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0KW9iaikuZG9FZGl0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNb2RlbEdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoKE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpb2JqKS5nZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIGlmICghZ3JvdXAuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICgoTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydClvYmopLmRvRWRpdE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoKENvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0KW9iaikuZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN0LmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICgoQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQpb2JqKS5kb0VkaXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpb2JqKS5kb0VkaXROYW1lKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwLHJ1bm5hYmxlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgcmVsYXRpdmVOb2RlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgTm9kZSBnZXRSZWxhdGl2ZU5vZGUoKQotICB7Ci0gICAgcmV0dXJuIHJlbGF0aXZlTm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZWxhdGl2ZU5vZGUuCi0gICAqIEBwYXJhbSByZWxhdGl2ZU5vZGUgVGhlIHJlbGF0aXZlTm9kZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlbGF0aXZlTm9kZShOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIHRoaXMucmVsYXRpdmVOb2RlID0gcmVsYXRpdmVOb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGRlc2NyaXB0aW9uLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGdldFRleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgYXR0cmlidXRlczsKLSAgLyoqCi0gICAqIEdldHMgdGhlIG5hbWVBdHRyaWJ1dGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlcygpCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzLgotICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoTGlzdCBhdHRyaWJ1dGVzKQotICB7Ci0gICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlR3JvdXBBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUdyb3VwQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZWFkYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlR3JvdXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVHcm91cEFjdGlvbiBleHRlbmRzIENyZWF0ZUVsZW1lbnRBY3Rpb24KLXsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZUdyb3VwQWN0aW9uLgotICAgKi8KLSAgcHVibGljIENyZWF0ZUdyb3VwQWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVHcm91cEFjdGlvbi4KLSAgICogQHBhcmFtIHRleHQKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVHcm91cEFjdGlvbihTdHJpbmcgdGV4dCkKLSAgewotICAgIHN1cGVyKHRleHQpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlR3JvdXBBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqIEBwYXJhbSBYU0RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVHcm91cEFjdGlvbihTdHJpbmcgdGV4dCwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHRleHQpOwotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlR3JvdXBBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqIEBwYXJhbSBpbWFnZQotICAgKi8KLSAgcHVibGljIENyZWF0ZUdyb3VwQWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVBbmRBZGROZXdDaGlsZEVsZW1lbnQoKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KHBhcmVudE5vZGUpOwotICAgIEVsZW1lbnQgY2hpbGROb2RlID0gc3VwZXIuY3JlYXRlQW5kQWRkTmV3Q2hpbGRFbGVtZW50KCk7Ci0KLSAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50Tm9kZS5nZXRQcmVmaXgoKTsKLSAgICBwcmVmaXggPSAocHJlZml4ID09IG51bGwpID8gIiIgOiAocHJlZml4ICsgIjoiKTsKLSAgICBFbGVtZW50IGNvbnRlbnRNb2RlbE5vZGUgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIHByZWZpeCArIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRyk7Ci0gICAgY2hpbGROb2RlLmFwcGVuZENoaWxkKGNvbnRlbnRNb2RlbE5vZGUpOwotCi0gICAgZm9ybWF0Q2hpbGQoY2hpbGROb2RlKTsKLSAgICAKLSAgICB4c2RDb21wLnNldEVsZW1lbnQocGFyZW50Tm9kZSk7Ci0gICAgCi0gICAgcmV0dXJuIGNoaWxkTm9kZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVJZGVudGl0eUNvbnN0cmFpbnRzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVJZGVudGl0eUNvbnN0cmFpbnRzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOTMzZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlSWRlbnRpdHlDb25zdHJhaW50c0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIENyZWF0ZUlkZW50aXR5Q29uc3RyYWludHNBY3Rpb24gZXh0ZW5kcyBDcmVhdGVFbGVtZW50QWN0aW9uCi17Ci0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVJZGVudGl0eUNvbnN0cmFpbnRzQWN0aW9uLgotICAgKi8KLSAgcHVibGljIENyZWF0ZUlkZW50aXR5Q29uc3RyYWludHNBY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZUlkZW50aXR5Q29uc3RyYWludHNBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqLwotICBwdWJsaWMgQ3JlYXRlSWRlbnRpdHlDb25zdHJhaW50c0FjdGlvbihTdHJpbmcgdGV4dCkKLSAgewotICAgIHN1cGVyKHRleHQpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlSWRlbnRpdHlDb25zdHJhaW50c0FjdGlvbi4KLSAgICogQHBhcmFtIHRleHQKLSAgICogQHBhcmFtIFhTRFNjaGVtYQotICAgKi8KLSAgcHVibGljIENyZWF0ZUlkZW50aXR5Q29uc3RyYWludHNBY3Rpb24oU3RyaW5nIHRleHQsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih0ZXh0KTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZUlkZW50aXR5Q29uc3RyYWludHNBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqIEBwYXJhbSBpbWFnZQotICAgKi8KLSAgcHVibGljIENyZWF0ZUlkZW50aXR5Q29uc3RyYWludHNBY3Rpb24oU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkKLSAgewotICAgIHN1cGVyKHRleHQsIGltYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUFuZEFkZE5ld0NoaWxkRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IGNoaWxkTm9kZSA9IHN1cGVyLmNyZWF0ZUFuZEFkZE5ld0NoaWxkRWxlbWVudCgpOwotCi0gICAgU3RyaW5nIHByZWZpeCA9IHBhcmVudE5vZGUuZ2V0UHJlZml4KCk7Ci0gICAgcHJlZml4ID0gKHByZWZpeCA9PSBudWxsKSA/ICIiIDogKHByZWZpeCArICI6Iik7Ci0gICAgRWxlbWVudCBzZWxlY3Rvck5vZGUgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIHByZWZpeCArIFhTRENvbnN0YW50cy5TRUxFQ1RPUl9FTEVNRU5UX1RBRyk7Ci0KLSAgICBET01BdHRyaWJ1dGUgYXR0ciA9IG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlhQQVRIX0FUVFJJQlVURSwgIiIpOwotICAgIHNlbGVjdG9yTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0VmFsdWUoKSk7Ci0KLSAgICBjaGlsZE5vZGUuYXBwZW5kQ2hpbGQoc2VsZWN0b3JOb2RlKTsKLQotICAgIHJldHVybiBjaGlsZE5vZGU7Ci0gIH0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlTG9jYWxDb21wbGV4VHlwZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlTG9jYWxDb21wbGV4VHlwZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGIwY2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUxvY2FsQ29tcGxleFR5cGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVMb2NhbENvbXBsZXhUeXBlQWN0aW9uIGV4dGVuZHMgQ3JlYXRlRWxlbWVudEFjdGlvbgotewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZUxvY2FsQ29tcGxleFR5cGVBY3Rpb24uCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlTG9jYWxDb21wbGV4VHlwZUFjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlTG9jYWxDb21wbGV4VHlwZUFjdGlvbi4KLSAgICogQHBhcmFtIHRleHQKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVMb2NhbENvbXBsZXhUeXBlQWN0aW9uKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVMb2NhbENvbXBsZXhUeXBlQWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKiBAcGFyYW0gaW1hZ2UKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVMb2NhbENvbXBsZXhUeXBlQWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVBbmRBZGROZXdDaGlsZEVsZW1lbnQoKQotICB7ICAKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocGFyZW50Tm9kZSk7Ci0gICAgCi0gICAgRWxlbWVudCBjaGlsZE5vZGUgPSBzdXBlci5jcmVhdGVBbmRBZGROZXdDaGlsZEVsZW1lbnQoKTsKLSAgCi0gICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnROb2RlLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKSAgCi0gICAgeyAgCi0gICAgICBwYXJlbnROb2RlLnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOyAgCi0gICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50Tm9kZS5nZXRQcmVmaXgoKTsKLSAgICBwcmVmaXggPSAocHJlZml4ID09IG51bGwpID8gIiIgOiAocHJlZml4ICsgIjoiKTsKLSAgICBjaGlsZE5vZGUuYXBwZW5kQ2hpbGQoZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KHByZWZpeCArIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRykpOwotICAgIAotICAgIGZvcm1hdENoaWxkKGNoaWxkTm9kZSk7Ci0gICAgCi0gICAgeHNkQ29tcC5zZXRFbGVtZW50KHBhcmVudE5vZGUpOwotCi0gICAgcmV0dXJuIGNoaWxkTm9kZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTEwNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uIGV4dGVuZHMgQ3JlYXRlRWxlbWVudEFjdGlvbgotewotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uLgotICAgKi8KLSAgcHVibGljIENyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlTG9jYWxTaW1wbGVUeXBlQWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKi8KLSAgcHVibGljIENyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbihTdHJpbmcgdGV4dCkKLSAgewotICAgIHN1cGVyKHRleHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVMb2NhbFNpbXBsZVR5cGVBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqIEBwYXJhbSBpbWFnZQotICAgKi8KLSAgcHVibGljIENyZWF0ZUxvY2FsU2ltcGxlVHlwZUFjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKQotICB7Ci0gICAgc3VwZXIodGV4dCwgaW1hZ2UpOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlQW5kQWRkTmV3Q2hpbGRFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgY2hpbGROb2RlID0gc3VwZXIuY3JlYXRlQW5kQWRkTmV3Q2hpbGRFbGVtZW50KCk7Ci0KLSAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudE5vZGUsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLS8vICAgICAgcGFyZW50Tm9kZS5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnROb2RlLCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50Tm9kZSwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnROb2RlLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBOb2RlIHBhcmVudCA9IHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIHBhcmVudE5vZGUucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnROb2RlLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSk7Ci0gICAgfQotICAgIAotICAgIGZvcm1hdENoaWxkKGNoaWxkTm9kZSk7Ci0gICAgCi0gICAgcmV0dXJuIGNoaWxkTm9kZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDk5MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlU2ltcGxlQ29udGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQHZlcnNpb24gICAxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZVNpbXBsZUNvbnRlbnRBY3Rpb24gZXh0ZW5kcyBDcmVhdGVFbGVtZW50QWN0aW9uCi17Ci0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIC8vSURvY3VtZW50IGRvY3VtZW50OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlU2ltcGxlQ29udGVudEFjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBDcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKi8KLSAgcHVibGljIENyZWF0ZVNpbXBsZUNvbnRlbnRBY3Rpb24oU3RyaW5nIHRleHQpCi0gIHsKLSAgICBzdXBlcih0ZXh0KTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZVNpbXBsZUNvbnRlbnRBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqIEBwYXJhbSBYU0RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uKFN0cmluZyB0ZXh0LCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKiBAcGFyYW0gaW1hZ2UKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVBbmRBZGROZXdDaGlsZEVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBjaGlsZE5vZGUgPSBzdXBlci5jcmVhdGVBbmRBZGROZXdDaGlsZEVsZW1lbnQoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBwYXJlbnROb2RlLmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOwotICAgIEVsZW1lbnQgZGVyaXZlZEJ5Tm9kZSA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgcHJlZml4ICsgInJlc3RyaWN0aW9uIik7Ci0gICAgY2hpbGROb2RlLmFwcGVuZENoaWxkKGRlcml2ZWRCeU5vZGUpOwotICAgIEVsZW1lbnQgc2VxdWVuY2UgPSBudWxsOwotCi0gICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjaGlsZE5vZGUsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHNlcXVlbmNlID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBwcmVmaXggKyAic2VxdWVuY2UiKTsKLSAgICAgIGRlcml2ZWRCeU5vZGUuYXBwZW5kQ2hpbGQoc2VxdWVuY2UpOwotICAgIH0KLQotICAgIC8vIG5vdyBhZGQgdGhlIHJlcXVpcmVkIGJhc2UgYXR0cmlidXRlIGZvciB0aGUgZGVyaXZlZCBieSBub2RlCi0gICAgVHlwZXNIZWxwZXIgdHlwZXNIZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICBMaXN0IGxpc3RPZkNUID0gdHlwZXNIZWxwZXIuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCk7Ci0gICAgU3RyaW5nIGZpcnN0VHlwZSA9ICIiOwotICAgIGlmIChsaXN0T2ZDVC5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIGZpcnN0VHlwZSA9IChTdHJpbmcpKGxpc3RPZkNUKS5nZXQoMCk7Ci0gICAgfQotICAgIERPTUF0dHJpYnV0ZSBhdHRyID0gbmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIGZpcnN0VHlwZSk7Ci0gICAgZGVyaXZlZEJ5Tm9kZS5zZXRBdHRyaWJ1dGUoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0VmFsdWUoKSk7Ci0KLSAgICBmb3JtYXRDaGlsZChkZXJpdmVkQnlOb2RlKTsKLSAgICBpZiAoc2VxdWVuY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3JtYXRDaGlsZChzZXF1ZW5jZSk7Ci0gICAgICBmb3JtYXRDaGlsZChkZXJpdmVkQnlOb2RlKTsKLSAgICB9Ci0gICAgZm9ybWF0Q2hpbGQoY2hpbGROb2RlKTsKLQotICAgIAotICAgIHJldHVybiBjaGlsZE5vZGU7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBBcnJheUxpc3QgbWVzc2FnZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBiZWdpblJlY29yZGluZyhnZXREZXNjcmlwdGlvbigpKTsKLQotICAgIEVsZW1lbnQgY2hpbGQgPSBjcmVhdGVBbmRBZGROZXdDaGlsZEVsZW1lbnQoKTsKLSAgICBlbmRSZWNvcmRpbmcoKTsKLQotICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0vKgotICAgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgTm9kZSBhQ2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgaWYgKGFDaGlsZCAhPSBudWxsICYmIGFDaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpYUNoaWxkLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudClhQ2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSRU1PVkUgQVRUUklCVVRFUyBBTkQgQVRUUklCVVRFIEdST1VQIFJFRlMgRlJPTSBDT01QTEVYIFRZUEVTIExJU1QgT0YgQ0hJTERSRU4KLSAgICAgICAgICBtZXNzYWdlLmFkZEVsZW1lbnQobmV3IE1vZGVsTWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9JTkZPX1JFTU9WRV9BVFRSSUJVVEVfRlJPTSIpICsKLSAgICAgICAgICAgICAgIiA8IiArIHBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJuYW1lIikgKyAiPiIsIGFDaGlsZCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGRvbWFpbk1vZGVsLmNyZWF0ZU1hcmtlcnMobWVzc2FnZSk7Ci0qLwotICAgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgTm9kZSBhQ2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgaWYgKGFDaGlsZCAhPSBudWxsICYmIGFDaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpYUNoaWxkLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudClhQ2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHRydWUpIHx8Ci0gICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpYUNoaWxkLCBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudClhQ2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSRU1PVkUgQVRUUklCVVRFUyBBTkQgQVRUUklCVVRFIEdST1VQIFJFRlMgRlJPTSBDT01QTEVYIFRZUEVTIExJU1QgT0YgQ0hJTERSRU4KLS8vIEtDUG9ydCBUT0RPCi0vLyAgICAgICAgICBFcnJvck1lc3NhZ2UgYVRhc2sgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0vLyAgICAgICAgICBOb2RlIHBhcmVudCA9IGFDaGlsZDsKLS8vICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBOb2RlSW1wbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgYVRhc2suc2V0TW9kZWxPYmplY3QocGFyZW50KTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGFUYXNrLnNldExvY2FsaXplZE1lc3NhZ2UoWFNEUGx1Z2luLmdldFNjaGVtYVN0cmluZygiX0lORk9fUkVNT1ZFX0FUVFJJQlVURV9GUk9NIikgKyAiIDwiICsgcGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSArICI+Iik7Ci0vLyAgICAgICAgICBtZXNzYWdlLmFkZChhVGFzayk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVTaW1wbGVUeXBlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVTaW1wbGVUeXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWMyOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlU2ltcGxlVHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1wdWJsaWMgY2xhc3MgQ3JlYXRlU2ltcGxlVHlwZUFjdGlvbiBleHRlbmRzIENyZWF0ZUVsZW1lbnRBY3Rpb24KLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIENyZWF0ZVNpbXBsZVR5cGVBY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdGV4dAotICAgKi8KLSAgcHVibGljIENyZWF0ZVNpbXBsZVR5cGVBY3Rpb24oU3RyaW5nIHRleHQpCi0gIHsKLSAgICBzdXBlcih0ZXh0KTsKLSAgfQotICAKLSAgcHVibGljIENyZWF0ZVNpbXBsZVR5cGVBY3Rpb24oU3RyaW5nIHRleHQsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih0ZXh0KTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdGV4dAotICAgKiBAcGFyYW0gaW1hZ2UKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVTaW1wbGVUeXBlQWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUFuZEFkZE5ld0NoaWxkRWxlbWVudCgpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocGFyZW50Tm9kZSk7Ci0gICAgRWxlbWVudCBjaGlsZE5vZGUgPSBzdXBlci5jcmVhdGVBbmRBZGROZXdDaGlsZEVsZW1lbnQoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBwYXJlbnROb2RlLmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOwotICAgIEVsZW1lbnQgY29udGVudE1vZGVsTm9kZSA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgcHJlZml4ICsgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICBjb250ZW50TW9kZWxOb2RlLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIHByZWZpeCArICJzdHJpbmciKTsKLSAgICBjaGlsZE5vZGUuYXBwZW5kQ2hpbGQoY29udGVudE1vZGVsTm9kZSk7Ci0KLSAgICBmb3JtYXRDaGlsZChjaGlsZE5vZGUpOwotICAgIAotICAgIHhzZENvbXAuc2V0RWxlbWVudChwYXJlbnROb2RlKTsKLSAgICAKLSAgICByZXR1cm4gY2hpbGROb2RlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9ET01BdHRyaWJ1dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0RPTUF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTgwYjQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0RPTUF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLS8vIFRPRE8gUmVtb3ZlIHRoaXMKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBET01BdHRyaWJ1dGUKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBET01BdHRyaWJ1dGUuCi0gICAqLwotICBwdWJsaWMgRE9NQXR0cmlidXRlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgRE9NQXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIERPTUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lLCB2YWx1ZTsKLSAgLyoqCi0gICAqIEdldHMgdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5hbWUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWUuCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3YTRhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmRlbGV0ZS5CYXNlR2xvYmFsQ2xlYW51cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmRlbGV0ZS5HbG9iYWxBdHRyaWJ1dGVDbGVhbnVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuZGVsZXRlLkdsb2JhbEF0dHJpYnV0ZUdyb3VwQ2xlYW51cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmRlbGV0ZS5HbG9iYWxFbGVtZW50Q2xlYW51cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmRlbGV0ZS5HbG9iYWxHcm91cENsZWFudXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5kZWxldGUuR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZUNsZWFudXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5kZWxldGUuWFNERXh0ZXJuYWxGaWxlQ2xlYW51cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERlbGV0ZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3I7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50WFNEQ29tcG9uZW50OwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBEZWxldGVBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqLwotICBwdWJsaWMgRGVsZXRlQWN0aW9uKFN0cmluZyB0ZXh0LCBJRWRpdG9yUGFydCBlZGl0b3IsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih0ZXh0KTsKLSAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uUHJvdmlkZXIoSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb25Qcm92aWRlciA9IHNlbGVjdGlvblByb3ZpZGVyOwotICB9Ci0gIAotICBwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yKCkKLSAgewotICAgIHJldHVybiBlZGl0b3I7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFhTRFNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIEBzZWUgSUFjdGlvbiNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICBpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICBEb2N1bWVudEltcGwgZG9jID0gbnVsbDsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICBub2RlID0gKE5vZGUpb2JqOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIHhzZFNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgCi0gICAgICAgIG5vZGUgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iaikuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFhNTE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnRYU0RDb21wb25lbnQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iaikuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIAotICAgICAgICAgIGlmIChwYXJlbnRYU0RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBuZWVkIHRvIGdldCB0aGUgbW9kZWxHcm91cAotICAgICAgICAgICAgcGFyZW50WFNEQ29tcG9uZW50ID0gcGFyZW50WFNEQ29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBpZiAoIVhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhub2RlLCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgWE1MTm9kZSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkb2MgPSAoRG9jdW1lbnRJbXBsKSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFX05PREVTIikpOwotICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICBib29sZWFuIHJlZnJlc2ggPSBjbGVhbnVwUmVmZXJlbmNlcyhub2RlKTsKLSAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShub2RlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gV29ya2Fyb3VuZCB0byByZXNldCBpbmNsdWRlZCBlbGVtZW50cyBpbiBYU0QgbW9kZWwKLSAgICAgICAgICBpZiAocmVmcmVzaCkKLSAgICAgICAgICB7Ci0gIC8vICAgICAgICAgIGdldEVkaXRvcigpLnJlcGFyc2VTY2hlbWEoKTsKLSAgLy8gICAgICAgICAgZ2V0RWRpdG9yKCkuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRTY2hlbWEoZ2V0RWRpdG9yKCkuZ2V0WFNEU2NoZW1hKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAocGFyZW50WFNEQ29tcG9uZW50ICE9IG51bGwgJiYgc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocGFyZW50WFNEQ29tcG9uZW50KSk7Ci0gICAgfQotICAgIAotICAgIGlmIChkb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2xlYW51cFJlZmVyZW5jZXMoTm9kZSBkZWxldGVkTm9kZSkKLSAgewotICAgIGJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSBnZXRTY2hlbWEoKS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KGRlbGV0ZWROb2RlKTsKLSAgICAKLSAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREluY2x1ZGUgfHwKLSAgICAgICAgY29tcCBpbnN0YW5jZW9mIFhTREltcG9ydCB8fAotICAgICAgICBjb21wIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgewotICAgICAgWFNEU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gKChYU0RTY2hlbWFEaXJlY3RpdmUpY29tcCkuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgIFhTRFNjaGVtYSByZWZlcmVuY2VkU2NoZW1hID0gbnVsbDsKLSAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICAgIHsKLSAgICAgICAgcmVmZXJlbmNlZFNjaGVtYSA9ICgoWFNESW5jbHVkZSljb21wKS5nZXRJbmNvcnBvcmF0ZWRTY2hlbWEoKTsKLSAgICAgICAgcmVmcmVzaCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICB7Ci0gICAgICAgIHJlZmVyZW5jZWRTY2hlbWEgPSAoKFhTRFJlZGVmaW5lKWNvbXApLmdldEluY29ycG9yYXRlZFNjaGVtYSgpOwotICAgICAgICByZWZyZXNoID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICB7Ci0gICAgICAgIFhTREltcG9ydCBpbXAgPSAoWFNESW1wb3J0KWNvbXA7Ci0gICAgICAgIHJlZmVyZW5jZWRTY2hlbWEgPSAoKFhTREltcG9ydCljb21wKS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgICByZWZyZXNoID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHJlZmVyZW5jZWRTY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cCBjbGVhbkhlbHBlciA9IG5ldyBYU0RFeHRlcm5hbEZpbGVDbGVhbnVwKHJlZmVyZW5jZWRTY2hlbWEpOwotICAgICAgICBjbGVhbkhlbHBlci52aXNpdFNjaGVtYShnZXRTY2hlbWEoKSk7Ci0gICAgICAgIC8vIHBvcHVsYXRlIG1lc3NhZ2VzCi0vLyBUT0RPICAgICAgICBnZXRFZGl0b3IoKS5jcmVhdGVUYXNrc0luVGFza0xpc3QoY2xlYW5IZWxwZXIuZ2V0TWVzc2FnZXMoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICAgIHsKLSAgICAgICAgVHlwZXNIZWxwZXIgdHlwZXNIZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoZ2V0U2NoZW1hKCkpOwotICAgICAgICB0eXBlc0hlbHBlci51cGRhdGVNYXBBZnRlckRlbGV0ZSgoWFNESW1wb3J0KWNvbXApOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChnZXRTY2hlbWEoKS5lcXVhbHMoY29tcC5nZXRDb250YWluZXIoKSkpCi0gICAgewotICAgICAgQmFzZUdsb2JhbENsZWFudXAgY2xlYW5IZWxwZXIgPSBudWxsOwotICAgICAgLy8gT25seSBuZWVkIHRvIGNsZWFuIHVwIHJlZmVyZW5jZXMgaWYgdGhlIGNvbXBvbmVudCBiZWluZyBkZWxldGVkIGlzIGdsb2JhbCBzY29wZWQKLSAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBjbGVhbkhlbHBlciA9IG5ldyBHbG9iYWxFbGVtZW50Q2xlYW51cChjb21wKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsR3JvdXBDbGVhbnVwKGNvbXApOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBjbGVhbkhlbHBlciA9IG5ldyBHbG9iYWxTaW1wbGVPckNvbXBsZXhUeXBlQ2xlYW51cChjb21wKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsQXR0cmlidXRlQ2xlYW51cChjb21wKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGNsZWFuSGVscGVyID0gbmV3IEdsb2JhbEF0dHJpYnV0ZUdyb3VwQ2xlYW51cChjb21wKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgCi0gICAgICBpZiAoY2xlYW5IZWxwZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY2xlYW5IZWxwZXIudmlzaXRTY2hlbWEoZ2V0U2NoZW1hKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVmcmVzaDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9HcmFwaFJlbmFtZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvR3JhcGhSZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3NmJmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9HcmFwaFJlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLlJlbmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotCi0KLXB1YmxpYyBjbGFzcyBHcmFwaFJlbmFtZUFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcm90ZWN0ZWQgUmVuYW1lQ29tbWFuZCBjb21tYW5kOwotICAKLSAgcHVibGljIEdyYXBoUmVuYW1lQWN0aW9uKFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50LCBHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIGNvbW1hbmQgPSBuZXcgUmVuYW1lQ29tbWFuZChuYW1lZENvbXBvbmVudCwgZWRpdFBhcnQpOwotICAgIHNldFRleHQoIlJlbmFtZSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGNvbW1hbmQucnVuKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0lTY2hlbWFFZGl0b3JBY3Rpb25Db25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0lTY2hlbWFFZGl0b3JBY3Rpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4MzZmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9JU2NoZW1hRWRpdG9yQWN0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotcHVibGljIGludGVyZmFjZSBJU2NoZW1hRWRpdG9yQWN0aW9uQ29uc3RhbnRzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVEFSR0VUX1ZBTElEQVRFX1NDSEVNQV9BQ1RJT05fSUQgPSAicmV0YXJnZXRWYWxpZGF0ZVNjaGVtYUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUQVJHRVRfUkVMT0FEX0RFUEVOREVOQ0lFU19BQ1RJT05fSUQgPSAicmV0YXJnZXRSZWxvYWREZXBlbmRlbmNpZXNBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVEFSR0VUX0dFTkVSQVRFX0pBVkFfQUNUSU9OX0lEID0gInJldGFyZ2V0R2VuZXJhdGVKYXZhQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRBUkdFVF9HRU5FUkFURV9EVERfQUNUSU9OX0lEID0gInJldGFyZ2V0R2VuZXJhdGVEdGRBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVEFSR0VUX0dFTkVSQVRFX1hNTF9BQ1RJT05fSUQgPSAicmV0YXJnZXRHZW5lcmF0ZVhNTEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUQVJHRVRfUkVOQU1FX0VMRU1FTlRfQUNUSU9OX0lEID0gIlJlbmFtZUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01ha2VBbm9ueW1vdXNHbG9iYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01ha2VBbm9ueW1vdXNHbG9iYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5NjM4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9NYWtlQW5vbnltb3VzR2xvYmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIE1ha2VBbm9ueW1vdXNHbG9iYWwgZXh0ZW5kcyBDcmVhdGVFbGVtZW50QWN0aW9uCi17Ci0JWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQlFbGVtZW50IHR5cGU7Ci0JCi0JcHVibGljIE1ha2VBbm9ueW1vdXNHbG9iYWwoU3RyaW5nIHRleHQsIEVsZW1lbnQgdHlwZSwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLQl7Ci0JCXN1cGVyKHRleHQpOwotCQl0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJaXNHbG9iYWwgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUFuZEFkZE5ld0NoaWxkRWxlbWVudCgpCi0JewotCQkvLyBjcmVhdGUgdGhlIG5ldyBnbG9iYWwgdHlwZQotCQlFbGVtZW50IGNoaWxkTm9kZSA9IHN1cGVyLmNyZWF0ZUFuZEFkZE5ld0NoaWxkRWxlbWVudCgpOwotICAgIC8vIGFkZCB0aGUgYW5vbnltb3VzIHR5cGUncyBjaGlsZHJlbiB0byB0aGUgbmV3IGdsb2JhbCB0eXBlCi0JCWlmICh0eXBlLmhhc0NoaWxkTm9kZXMoKSkKLQkJeyAgICAgICAgCi0JCQlOb2RlTGlzdCBub2RlcyA9IHR5cGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJLy8gdXNlIGNsb25lcyBzbyB3ZSBkb24ndCBoYXZlIGEgcmVmcmVzaCBwcm9ibGVtCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0JCQl7Ci0JCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsgICAgICAgCi0JCQkJY2hpbGROb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLQkJCX0KLQkJfQotCi0gICAgLy8gY2xlYW4gdXAgdGhlIGVsZW1lbnQgd2hvc2UgdHlwZSB3YXMgYW5vbnltb3VzCi0gICAgLy8gYW5kIHNldCBpdHMgdHlwZSBhdHRyaWJ1dGUgdG8gdGhlIG5ldyBnbG9iYWwgdHlwZQotCQlUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLQkJU3RyaW5nIHByZWZpeCA9IGhlbHBlci5nZXRQcmVmaXgoeHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLCB0cnVlKTsKLQkJaGVscGVyID0gbnVsbDsKLQkJCi0JCUVsZW1lbnQgcGFyZW50RWxlbWVudE9mQW5vbnltb3VzVHlwZSA9IChFbGVtZW50KXR5cGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCXBhcmVudEVsZW1lbnRPZkFub255bW91c1R5cGUucmVtb3ZlQ2hpbGQodHlwZSk7Ci0JCXBhcmVudEVsZW1lbnRPZkFub255bW91c1R5cGUuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgcHJlZml4ICsgY2hpbGROb2RlLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpKTsKLQotCQlmb3JtYXRDaGlsZChjaGlsZE5vZGUpOwotCQkKLSAgICByZXR1cm4gY2hpbGROb2RlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW9kZWxNZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb2RlbE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzMDYxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb2RlbE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE1vZGVsTWVzc2FnZQotewotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0gIHByb3RlY3RlZCBOb2RlIG5vZGU7Ci0KLSAgcHVibGljIE1vZGVsTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgTm9kZSBub2RlKQotICB7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB0aGlzLm5vZGUgPSBub2RlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0gIHsKLSAgICByZXR1cm4gbm9kZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWY3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIE1vdmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWROb2RlczsKLSAgcHJvdGVjdGVkIE5vZGUgcGFyZW50Tm9kZTsKLSAgcHJvdGVjdGVkIE5vZGUgcmVmQ2hpbGQ7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBEZWxldGVBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqLwotICBwdWJsaWMgTW92ZUFjdGlvbihOb2RlIHBhcmVudE5vZGUsIExpc3Qgc2VsZWN0ZWROb2RlcywgTm9kZSByZWZDaGlsZCkKLSAgewotICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0gICAgdGhpcy5zZWxlY3RlZE5vZGVzID0gc2VsZWN0ZWROb2RlczsKLSAgICB0aGlzLnJlZkNoaWxkID0gcmVmQ2hpbGQ7Ci0gIH0gICAgCi0KLSAgcHVibGljIE1vdmVBY3Rpb24oWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50Q29tcG9uZW50LCBMaXN0IHNlbGVjdGVkQ29tcG9uZW50cywgWFNEQ29uY3JldGVDb21wb25lbnQgcmVmQ2hpbGRDb21wb25lbnQpCi0gIHsKLSAgICBzZWxlY3RlZE5vZGVzID0gbmV3IEFycmF5TGlzdChzZWxlY3RlZENvbXBvbmVudHMuc2l6ZSgpKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZWxlY3RlZENvbXBvbmVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudClpLm5leHQoKTsKLSAgICAgIHNlbGVjdGVkTm9kZXMuYWRkKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIHBhcmVudE5vZGUgPSBwYXJlbnRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgIHJlZkNoaWxkID0gcmVmQ2hpbGRDb21wb25lbnQgIT0gbnVsbCA/IHJlZkNoaWxkQ29tcG9uZW50LmdldEVsZW1lbnQoKSA6IG51bGw7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIGJvb2xlYW4gY2FuTW92ZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyBUT0RPLi4uIHRoZXJlIGFyZSBsaWtlbHkgbW9yZSByZXN0cmljdGlvbiB0byBjb25zaWRlciBoZXJlCi0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlbGVjdGVkTm9kZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkID0gKE5vZGUpaS5uZXh0KCk7Ci0gICAgICBpZiAoaXNEZWNlbmRhbnRPclNlbGYoY2hpbGQsIHBhcmVudE5vZGUpKSAKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlY2VuZGFudE9yU2VsZihOb2RlIHBvdGVudGlhbFBhcmVudCwgTm9kZSBub2RlKQotICB7IAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAobm9kZSA9PSBwb3RlbnRpYWxQYXJlbnQpICAgIAotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0gICAgICAgICAgIAotICAgICAgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBiZWdpblJlY29yZGluZygpCi0gIHsKLSAgICBYTUxNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7ICAgICAgCi0gICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgewotICAgICAgbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgIk1vdmUiKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGVuZFJlY29yZGluZygpCi0gIHsKLSAgICBYTUxNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7ICAgICAgCi0gICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgewotICAgICAgbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOyAgICAKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgWE1MTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgWE1MTW9kZWwgbW9kZWwgPSBudWxsOwotICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgWE1MTm9kZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgbW9kZWwgPSAoKFhNTE5vZGUpcGFyZW50Tm9kZSkuZ2V0TW9kZWwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1vZGVsOwotICB9Ci0gIAotCi0gICAgIAotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYmVnaW5SZWNvcmRpbmcoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZWxlY3RlZE5vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE5vZGUgY2hpbGQgPSAoTm9kZSlpLm5leHQoKTsKLSAgICAgICAgcmVwb3NpdGlvbkJlZm9yZShwYXJlbnROb2RlLCBjaGlsZCwgcmVmQ2hpbGQpOwotICAgICAgfSAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgeyAgICAgICAgIAotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgZW5kUmVjb3JkaW5nKCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHJlcG9zaXRpb25CZWZvcmUoTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQsIE5vZGUgcmVmQ2hpbGQpCi0gIHsgICAKLSAgICAvLyBUT0RPLi4uIHdoZW4gdGhlIHJlZkNoaWxkIChpbnNlcnRpbmcgYXMgdGhlIGxhc3QgZWxlbWVudCkgd2UgbmVlZCB0bwotICAgIC8vIHNwZWNpYWwgY2FzZSB0aGUgd2F5IHdlIHByZXNlcnZlIGluZGVudGF0aW9uIAotICAgIE5vZGUgb2xkUGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotICAgIGlmIChvbGRQYXJlbnQgIT0gbnVsbCAmJiByZWZDaGlsZCAhPSBjaGlsZCkKLSAgICB7ICAKLSAgICAgIC8vIGNvbnNpZGVyIGFueSBpbmRlbnRhdGlvbiB0ZXh0IG5vZGUgdGhhdCBwcmVjZWVkcyB0aGUgY2hpbGQKLSAgICAgIC8vICAgICAgCi0gICAgICBOb2RlIHRleHROb2RlID0gaXNXaGl0ZXNwYWNlVGV4dE5vZGUoY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpID8gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgOiBudWxsOwotCi0gICAgICAvLyByZW1vdmUgdGhlIGNoaWxkCi0gICAgICAvLwotICAgICAgb2xkUGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLSAgICAgIAotICAgICAgLy8gSW5zdGVhZCBvZiBpbnNlcnRpbmcgdGhlIGNoaWxkIGltbWVkaWF0bGVseSBpbmZyb250IG9mIHRoZSByZWZDaGlsZCwgd2UgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIHRoZXJlCi0gICAgICAvLyBpcyBhbiBpbmRlbnRhdGlvbiB0ZXh0IG5vZGUgcHJlY2VlZGluZyB0aGUgcmVmQ2hpbGQuICBJZiB3ZSBmaW5kIHN1Y2ggYSBub2RlLCB3ZSBwZXJmb3JtIHRoZSBpbnNlcnRpb24KLSAgICAgIC8vIHNvIHRoYXQgdGhlIGNoaWxkIGlzIGluc2VydGVkIGJlZm9yZSB0aGUgaW5kZW50YXRpb24gdGV4dCBub2RlLgotICAgICAgTm9kZSBhZGp1c3RlZFJlZkNoaWxkID0gcmVmQ2hpbGQ7Ci0gICAgICBpZiAocmVmQ2hpbGQgIT0gbnVsbCAmJiBpc1doaXRlc3BhY2VUZXh0Tm9kZShyZWZDaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSkpCi0gICAgICB7Ci0gICAgICAgIGFkanVzdGVkUmVmQ2hpbGQgPSByZWZDaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgIH0KLSAgICAgICAgICAKLSAgICAgIC8vIHJlcG9zaXRpb24gdGhlIGNoaWxkIGFuZCBhbnkgaW5kZW50YXRpb24gdGV4dCBub2RlIAotICAgICAgLy8KLSAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIGFkanVzdGVkUmVmQ2hpbGQpOwotICAgICAgaWYgKHRleHROb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9sZFBhcmVudC5yZW1vdmVDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIGNoaWxkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgIAotICAgIAotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1doaXRlc3BhY2VUZXh0Tm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotICAgIHsKLSAgICAgIFN0cmluZyBkYXRhID0gKChUZXh0KW5vZGUpLmdldERhdGEoKTsKLSAgICAgIHJlc3VsdCA9IChkYXRhID09IG51bGwgfHwgZGF0YS50cmltKCkubGVuZ3RoKCkgPT0gMCk7Ci0gICAgfSAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL09wZW5TY2hlbWFBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL09wZW5TY2hlbWFBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMWVlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuU2NoZW1hQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuT3Blbk9uU2VsZWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREltcG9ydEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgT3BlblNjaGVtYUFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQ7Ci0gIHB1YmxpYyBPcGVuU2NoZW1hQWN0aW9uKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXZlYWxPYmplY3QoKTsKLSAgICB9Ci0gIH0KLQotICBib29sZWFuIGxhc3RSZXN1bHQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmV2ZWFsT2JqZWN0KCkKLSAgewotICAgIE5vZGUgZWxlbWVudCA9IGNvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gIiI7Ci0gICAgWFNEU2NoZW1hRGlyZWN0aXZlIGRpcjsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgIHsKLSAgICAgIGRpciA9IChYU0RTY2hlbWFEaXJlY3RpdmUpY29tcG9uZW50OwotICAgICAgLy8gZm9yY2UgbG9hZCBvZiBpbXBvcnRlZCBzY2hlbWEKLSAgICAgIGlmIChkaXIgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgewotICAgICAgICAoKFhTREltcG9ydEltcGwpZGlyKS5pbXBvcnRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICAgIGlmIChkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBzY2hlbWFMb2NhdGlvbiA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woZGlyLmdldFJlc29sdmVkU2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgT3Blbk9uU2VsZWN0aW9uSGVscGVyLm9wZW5YU0RFZGl0b3Ioc2NoZW1hTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsYXN0UmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZWxvYWREZXBlbmRlbmNpZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbG9hZERlcGVuZGVuY2llc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2UyMzlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbG9hZERlcGVuZGVuY2llc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uLgotICAgKi8KLSAgcHVibGljIFJlbG9hZERlcGVuZGVuY2llc0FjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBSZWxvYWREZXBlbmRlbmNpZXNBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqLwotICBwdWJsaWMgUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFJlbG9hZERlcGVuZGVuY2llc0FjdGlvbi4KLSAgICogQHBhcmFtIHRleHQKLSAgICogQHBhcmFtIGltYWdlCi0gICAqLwotICBwdWJsaWMgUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3IoWFNERWRpdG9yIGVkaXRvcikKLSAgewotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNERWRpdG9yIGVkaXRvcjsKLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBlZGl0b3IucmVwYXJzZVNjaGVtYSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXRCYXNlVHlwZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvU2V0QmFzZVR5cGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdiYmFiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXRCYXNlVHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHMuU2V0QmFzZVR5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgU2V0QmFzZVR5cGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgRWxlbWVudCBlbGVtZW50OwotICBTdHJpbmcgdHlwZSA9ICIiOwotICBTdHJpbmcgZGVyaXZlZEJ5U3RyaW5nID0gIiI7Ci0gIFhTRERPTUhlbHBlciBkb21IZWxwZXI7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFNldEJhc2VUeXBlQWN0aW9uLgotICAgKi8KLSAgcHVibGljIFNldEJhc2VUeXBlQWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgU2V0QmFzZVR5cGVBY3Rpb24uCi0gICAqIEBwYXJhbSBhcmcwCi0gICAqLwotICBwdWJsaWMgU2V0QmFzZVR5cGVBY3Rpb24oU3RyaW5nIGFyZzApCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgICBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBTZXRCYXNlVHlwZUFjdGlvbi4KLSAgICogQHBhcmFtIGFyZzAKLSAgICogQHBhcmFtIGFyZzEKLSAgICovCi0gIHB1YmxpYyBTZXRCYXNlVHlwZUFjdGlvbihTdHJpbmcgYXJnMCwgSW1hZ2VEZXNjcmlwdG9yIGFyZzEpCi0gIHsKLSAgICBzdXBlcihhcmcwLCBhcmcxKTsKLSAgICBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBTZXRCYXNlVHlwZUFjdGlvbi4KLSAgICogQHBhcmFtIGFyZzAKLSAgICogQHBhcmFtIGFyZzEKLSAgICovCi0gIHB1YmxpYyBTZXRCYXNlVHlwZUFjdGlvbihTdHJpbmcgYXJnMCwgaW50IGFyZzEpCi0gIHsKLSAgICBzdXBlcihhcmcwLCBhcmcxKTsKLSAgICBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgc2V0WFNEU2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHNjaGVtYTsgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb21wbGV4VHlwZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIHRoaXMudHlwZSA9IHR5cGU7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVyaXZlZEJ5KFN0cmluZyBkZXJpdmVkQnlTdHJpbmcpCi0gIHsKLSAgICB0aGlzLmRlcml2ZWRCeVN0cmluZyA9IGRlcml2ZWRCeVN0cmluZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAvLyBpZiBpdCBpcyBudWxsLCBnZXQgdGhlIGRlZmF1bHQgb25lCi0gICAgZGlzcGxheSA9IGRpc3BsYXkgPT0gbnVsbCA/IERpc3BsYXkuZ2V0RGVmYXVsdCgpIDogZGlzcGxheTsKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCA9IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKLQotICAgIFNldEJhc2VUeXBlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZXRCYXNlVHlwZURpYWxvZyhwYXJlbnRTaGVsbCwgeHNkU2NoZW1hLCBlbGVtZW50KTsKLSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0KLSAgICBFbGVtZW50IGNvbnRlbnRNb2RlbEVsZW1lbnQgPSBkb21IZWxwZXIuZ2V0Q29udGVudE1vZGVsRnJvbVBhcmVudChlbGVtZW50KTsgICAgCi0gICAgaWYgKGNvbnRlbnRNb2RlbEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyB0byBzZXQgdGhlIGN1cnJlbnQgdmFsdWVzIHRvIHNob3cgaW4gdGhlIGRpYWxvZwotICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjb250ZW50TW9kZWxFbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjb250ZW50TW9kZWxFbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW1lbnQgPSBkb21IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudEZyb21Db21wbGV4VHlwZShlbGVtZW50KTsKLSAgICAgICAgaWYgKGRlcml2ZWRCeUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjdXJyZW50QmFzZVR5cGUgPSBkZXJpdmVkQnlFbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpOwotICAgICAgICAgIGRpYWxvZy5zZXRDdXJyZW50QmFzZVR5cGUoY3VycmVudEJhc2VUeXBlKTsKLSAgICAgICAgICBkaWFsb2cuc2V0Q3VycmVudERlcml2ZWRCeShkZXJpdmVkQnlFbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkaWFsb2cuc2V0Q3VycmVudEJhc2VUeXBlKCIiKTsKLSAgICAgICAgICBkaWFsb2cuc2V0Q3VycmVudERlcml2ZWRCeSgiIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLSAgICAKLSAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgCi0gICAgewotICAgICAgdHlwZSA9IGRpYWxvZy5nZXRCYXNlVHlwZSgpOwotICAgICAgZGVyaXZlZEJ5U3RyaW5nID0gZGlhbG9nLmdldERlcml2ZWRCeSgpOwotICAgICAgcGVyZm9ybUFjdGlvbigpOwotICAgIH0KLSAgfQotCi0gIFhTRFR5cGVEZWZpbml0aW9uIG5ld1R5cGVEZWZpbml0aW9uID0gbnVsbDsKLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBuZXdUeXBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1BY3Rpb24oKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0KLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZWxlbWVudCk7Ci0gICAgCi0gICAgRWxlbWVudCBjb250ZW50TW9kZWxFbGVtZW50ID0gZG9tSGVscGVyLmdldENvbnRlbnRNb2RlbEZyb21QYXJlbnQoZWxlbWVudCk7Ci0gICAgYm9vbGVhbiBjb250ZW50TW9kZWxFeGlzdHMgPSB0cnVlOwotICAgIGlmIChjb250ZW50TW9kZWxFbGVtZW50ID09IG51bGwpCi0gICAgewotICAgICAgY29udGVudE1vZGVsRXhpc3RzID0gZmFsc2U7Ci0gICAgfQotCi0vLyAgZ2V0IFhTRCBjb21wb25lbnQgb2YgdGhlIG5ldyB0eXBlIGNob3NlbgotICAgIG5ld1R5cGVEZWZpbml0aW9uID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRFR5cGVEZWZpbml0aW9uKWkubmV4dCgpOwotICAgICAgaWYgKHR5cGVEZWYuZ2V0UU5hbWUoKS5lcXVhbHModHlwZSkpCi0gICAgICB7Ci0gICAgICAgIG5ld1R5cGVEZWZpbml0aW9uID0gdHlwZURlZjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgCi0gICAgYm9vbGVhbiBuZWVkc0NvbXBsZXhDb250ZW50ID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBuZWVkc1NpbXBsZUNvbnRlbnQgPSBmYWxzZTsKLQotICAgIGlmIChoZWxwZXIuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKS5jb250YWlucyh0eXBlKSB8fAotICAgICAgIGhlbHBlci5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpLmNvbnRhaW5zKHR5cGUpKQotLy8gICAgaWYgKG5ld1R5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgbmVlZHNTaW1wbGVDb250ZW50ID0gdHJ1ZTsgCi0gICAgfSAgICAgICAgCi0gICAgZWxzZSBpZiAobmV3VHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgbmVlZHNDb21wbGV4Q29udGVudCA9IHRydWU7Ci0vLyAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBuZXdDVE9iaiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pbmV3VHlwZURlZmluaXRpb247Ci0vLyAgICAgIFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBuZXdDVE9iai5nZXRDb250ZW50VHlwZUNhdGVnb3J5KCk7Ci0gICAgfQotICAgIAotICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TRVRfQkFTRV9UWVBFIiksIGVsZW1lbnQpOwotICAgIFN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOwotCi0gICAgRE9NQXR0cmlidXRlIGF0dHIgPSBuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSwgdHlwZSk7Ci0gICAgYm9vbGVhbiBoYXNDaGlsZHJlbkVsZW1lbnRzID0gZG9tSGVscGVyLmhhc0VsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLSAgICBpZiAoIWNvbnRlbnRNb2RlbEV4aXN0cykgLy8gaWYgbm8gY29udGVudCBtb2RlbCBleGlzdHMsIHRoZW4gYWRkIHRoZSBuZXcgbm9kZXMKLSAgICB7Ci0gICAgICBpZiAoaGVscGVyLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCkuY29udGFpbnModHlwZSkgfHwKLSAgICAgICAgICBoZWxwZXIuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKS5jb250YWlucyh0eXBlKSkKLSAgICAgIHsKLSAgICAgICAgdXBkYXRlTW9kZWxBbmREZXJpdmVkQnlLaW5kKHByZWZpeCArIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBwcmVmaXggKyBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBhdHRyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGhlbHBlci5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKS5jb250YWlucyh0eXBlKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlcml2ZWRCeVN0cmluZy5lcXVhbHMoIiIpKSAvLyBkZWZhdWx0Ci0gICAgICAgIHsKLSAgICAgICAgICBkZXJpdmVkQnlTdHJpbmcgPSBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHOwotICAgICAgICB9Ci0gICAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5RWxlbWVudCA9IHVwZGF0ZU1vZGVsQW5kRGVyaXZlZEJ5S2luZChwcmVmaXggKyBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcsIHByZWZpeCArIGRlcml2ZWRCeVN0cmluZywgYXR0cik7Ci0gICAgICAgIEVsZW1lbnQgbmV3TW9kZWxHcm91cEVsZW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBwcmVmaXggKyBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcpOwotICAgICAgICBkZXJpdmVkQnlFbGVtZW50LmFwcGVuZENoaWxkKG5ld01vZGVsR3JvdXBFbGVtZW50KTsKLSAgICAgICAgZm9ybWF0Q2hpbGQoZGVyaXZlZEJ5RWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgIC8vIGVsc2UgdGhlcmUgaXMgYSBjb250ZW50IG1vZGVsCi0gICAgewotICAgICAgaWYgKHR5cGUuZXF1YWxzKCIiKSkgIC8vIHRoZSBjaG9zZW4gdHlwZSBpcyBibGFuaywgaWUuIHRoZXJlIGlzIG5vIGJhc2UgdHlwZQotICAgICAgewotICAgICAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW1lbnQgPSBkb21IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudEZyb21Db21wbGV4VHlwZShlbGVtZW50KTsKLSAgICAgICAgRWxlbWVudCBzb3VyY2VDb250ZW50TW9kZWxFbGVtZW50ID0gZG9tSGVscGVyLmdldENvbnRlbnRNb2RlbEZyb21QYXJlbnQoZGVyaXZlZEJ5RWxlbWVudCk7Ci0gICAgICAgIC8vIFJldGFpbiB0aGUgY29udGVudCBtb2RlbCBpZiB0aGVyZSBpcyBvbmUgZnJvbSB0aGUgY29tcGxleCBvciBzaW1wbGUgY29udGVudCBkZXJpdmUgYnkgZWxlbWVudAotICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHNvdXJjZUNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoc291cmNlQ29udGVudE1vZGVsRWxlbWVudCwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoc291cmNlQ29udGVudE1vZGVsRWxlbWVudCwgWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICB7ICAgICAgCi0gICAgICAgICAgRWxlbWVudCBuZXdOb2RlID0gZG9tSGVscGVyLmNsb25lRWxlbWVudChlbGVtZW50LCBzb3VyY2VDb250ZW50TW9kZWxFbGVtZW50KTsKLSAgICAgICAgICBlbGVtZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBjb250ZW50TW9kZWxFbGVtZW50KTsKLSAgICAgICAgICBmb3JtYXRDaGlsZChlbGVtZW50KTsgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvLyBvdGhlcndpc2UganVzdCBhZGQgdGhlIG5vZGVzCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoY29udGVudE1vZGVsRWxlbWVudCk7Ci0gICAgICAgICAgRWxlbWVudCBuZXdTZXF1ZW5jZUVsZW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBwcmVmaXggKyBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcpOwotICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3U2VxdWVuY2VFbGVtZW50KTsKLSAgICAgICAgICBmb3JtYXRDaGlsZChuZXdTZXF1ZW5jZUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAKLSAgICAgIGVsc2UgLy8gYSBiYXNlIHR5cGUgaXMgc3BlY2lmaWVkCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgc2VxdWVuY2VDaG9pY2VPckFsbEVsZW1lbnQgPSBudWxsOyAgLy8gY29weSB0aGUgbW9kZWwgdG8gcmVwb3NpdGlvbiBpdCBvZmYgb2YgdGhlIG5ldyBkZXJpdmVkIGJ5IGVsZW1lbnQKLSAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjb250ZW50TW9kZWxFbGVtZW50LCBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5DSE9JQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgewotICAgICAgICAgICBzZXF1ZW5jZUNob2ljZU9yQWxsRWxlbWVudCA9IGRvbUhlbHBlci5jbG9uZUVsZW1lbnQoZWxlbWVudCwgY29udGVudE1vZGVsRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmVlZHNDb21wbGV4Q29udGVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjb250ZW50TW9kZWxFbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9tSGVscGVyLmNoYW5nZUNvbnRlbnRNb2RlbChlbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcsIHNlcXVlbmNlQ2hvaWNlT3JBbGxFbGVtZW50KTsKLSAgICAgICAgICAgIGNvbnRlbnRNb2RlbEVsZW1lbnQgPSBkb21IZWxwZXIuZ2V0Q29udGVudE1vZGVsRnJvbVBhcmVudChlbGVtZW50KTsKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkc1NpbXBsZUNvbnRlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIShYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoY29udGVudE1vZGVsRWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBhcHBlbmQgdGhlIGVsZW1lbnQgY29udGVudCB0byBhIHNpbXBsZSBjb250ZW50Ci0gICAgICAgICAgICBzZXF1ZW5jZUNob2ljZU9yQWxsRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBkb21IZWxwZXIuY2hhbmdlQ29udGVudE1vZGVsKGVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBzZXF1ZW5jZUNob2ljZU9yQWxsRWxlbWVudCk7Ci0gICAgICAgICAgICBjb250ZW50TW9kZWxFbGVtZW50ID0gZG9tSGVscGVyLmdldENvbnRlbnRNb2RlbEZyb21QYXJlbnQoZWxlbWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRWxlbWVudCBkZXJpdmVkQnlFbGVtZW50ID0gZG9tSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnRGcm9tQ29tcGxleFR5cGUoZWxlbWVudCk7ICAgICAgICAKLSAgICAgICAgaWYgKGRlcml2ZWRCeUVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZXJpdmVkQnlTdHJpbmcgPT0gbnVsbCB8fCAoZGVyaXZlZEJ5U3RyaW5nICE9IG51bGwgJiYgZGVyaXZlZEJ5U3RyaW5nLmVxdWFscygiIikpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRlcml2ZWRCeVN0cmluZyA9IFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUc7ICAvLyBzaW5jZSB0aGVyZSBpcyBubyBkZXJpdmVkQnlFbGVtZW50Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlcml2ZWRCeUVsZW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBkZXJpdmVkQnlTdHJpbmcpOwotICAgICAgICAgIGNvbnRlbnRNb2RlbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZGVyaXZlZEJ5RWxlbWVudCk7Ci0gICAgICAgICAgZm9ybWF0Q2hpbGQoY29udGVudE1vZGVsRWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHNlcXVlbmNlQ2hvaWNlT3JBbGxFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZGVyaXZlZEJ5RWxlbWVudC5hcHBlbmRDaGlsZChzZXF1ZW5jZUNob2ljZU9yQWxsRWxlbWVudCk7Ci0gICAgICAgICAgICBmb3JtYXRDaGlsZChkZXJpdmVkQnlFbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGhlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpLmNvbnRhaW5zKHR5cGUpIHx8Ci0gICAgICAgICAgICAgIGhlbHBlci5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpLmNvbnRhaW5zKHR5cGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRlcml2ZWRCeVN0cmluZyA9IFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUc7Ci0gICAgICAgICAgICBFbGVtZW50IGFDb250ZW50TW9kZWxFbGVtZW50ID0gZG9tSGVscGVyLmdldENvbnRlbnRNb2RlbEZyb21QYXJlbnQoZGVyaXZlZEJ5RWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoYUNvbnRlbnRNb2RlbEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKGFDb250ZW50TW9kZWxFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZG9tSGVscGVyLmNoYW5nZURlcml2ZWRCeVR5cGUoY29udGVudE1vZGVsRWxlbWVudCwgZGVyaXZlZEJ5U3RyaW5nLCB0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBkZXJpdmVkQnlFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLmdldE5hbWUoKSwgYXR0ci5nZXRWYWx1ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgeHNkQ29tcC5zZXRFbGVtZW50KGVsZW1lbnQpOwotICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgRWxlbWVudCB1cGRhdGVNb2RlbEFuZERlcml2ZWRCeUtpbmQoU3RyaW5nIG1vZGVsVHlwZSwgU3RyaW5nIGRlcml2ZWRCeUtpbmQsIERPTUF0dHJpYnV0ZSBhdHRyKQotICB7Ci0gICAgRWxlbWVudCBuZXdDb250ZW50TW9kZWxFbGVtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgbW9kZWxUeXBlKTsKLSAgICBlbGVtZW50LmFwcGVuZENoaWxkKG5ld0NvbnRlbnRNb2RlbEVsZW1lbnQpOwotCi0gICAgRWxlbWVudCBuZXdEZXJpdmVkQnlFbGVtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgZGVyaXZlZEJ5S2luZCk7Ci0gICAgbmV3Q29udGVudE1vZGVsRWxlbWVudC5hcHBlbmRDaGlsZChuZXdEZXJpdmVkQnlFbGVtZW50KTsKLQotICAgIG5ld0Rlcml2ZWRCeUVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldFZhbHVlKCkpOwotICAgIAotICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLmdldExlbmd0aCgpOwotICAgIEFycmF5TGlzdCBub2Rlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSBub2RlID0gY2hpbGRyZW4uaXRlbShpKTsKLSAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMobm9kZSwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKG5vZGUsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHRydWUpIHx8Ci0gICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKG5vZGUsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgdHJ1ZSkgfHwKLSAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMobm9kZSwgWFNEQ29uc3RhbnRzLkFOWUFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBuZXdEZXJpdmVkQnlFbGVtZW50LmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgbm9kZXNUb1JlbW92ZS5hZGQobm9kZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoKE5vZGUpaS5uZXh0KCkpOwotICAgIH0KLSAgICAKLSAgICBmb3JtYXRDaGlsZChuZXdDb250ZW50TW9kZWxFbGVtZW50KTsKLQotICAgIHJldHVybiBuZXdEZXJpdmVkQnlFbGVtZW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGQoRWxlbWVudCBjaGlsZCkKLSAgewotICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFhNTE5vZGUpCi0gICAgewotICAgICAgWE1MTW9kZWwgbW9kZWwgPSAoKFhNTE5vZGUpY2hpbGQpLmdldE1vZGVsKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0gICAgICAgIAotICAgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXROb2RlKGNoaWxkKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmNoYW5nZWRNb2RlbCgpOyAKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyBEb2N1bWVudEltcGwgZ2V0RG9jdW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIChEb2N1bWVudEltcGwpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoU3RyaW5nIGRlc2NyaXB0aW9uLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBnZXREb2N1bWVudChlbGVtZW50KS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGRlc2NyaXB0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIERvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSBnZXREb2N1bWVudChlbGVtZW50KTsKLSAgICAKLSAgICBkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7ICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXRNdWx0aXBsaWNpdHlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL1NldE11bHRpcGxpY2l0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGU0MzZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL1NldE11bHRpcGxpY2l0eUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLlNldE11bHRpcGxpY2l0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgU2V0TXVsdGlwbGljaXR5QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24KLXsKLSAgU2V0TXVsdGlwbGljaXR5Q29tbWFuZCBjb21tYW5kOwotICAKLSAgcHVibGljIFNldE11bHRpcGxpY2l0eUFjdGlvbihYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQsIFN0cmluZyBtdWx0aXBsaWNpdHkpCi0gIHsKLSAgICBzdXBlcihtdWx0aXBsaWNpdHksIHBhcmVudCk7Ci0gICAgY29tbWFuZCA9IG5ldyBTZXRNdWx0aXBsaWNpdHlDb21tYW5kKHBhcmVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1heE9jY3VycyhpbnQgaSkKLSAgewotICAgIGNvbW1hbmQuc2V0TWF4T2NjdXJzKGkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWluT2NjdXJzKGludCBpKQotICB7Ci0gICAgY29tbWFuZC5zZXRNaW5PY2N1cnMoaSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmVnaW5SZWNvcmRpbmcoZ2V0VGV4dCgpKTsKLSAgICBjb21tYW5kLnJ1bigpOwotICAgIGVuZFJlY29yZGluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXRUeXBlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXRUeXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZjZiOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvU2V0VHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5TZXRUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXRUeXBlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24KLXsKLSAgaW50IHR5cGVLaW5kOwotICBTZXRUeXBlQ29tbWFuZCBjb21tYW5kOwotICAKLSAgcHVibGljIFNldFR5cGVBY3Rpb24oU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBpbWFnZSwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSwgeHNkQ29uY3JldGVDb21wb25lbnQpOwotICAgIGNvbW1hbmQgPSBuZXcgU2V0VHlwZUNvbW1hbmQoeHNkQ29uY3JldGVDb21wb25lbnQpOwotICB9Ci0gIAotICBwdWJsaWMgU2V0VHlwZUFjdGlvbihTdHJpbmcgdGV4dCwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCB4c2RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgY29tbWFuZCA9IG5ldyBTZXRUeXBlQ29tbWFuZCh4c2RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVLaW5kKGludCB0eXBlKQotICB7Ci0gICAgdGhpcy50eXBlS2luZCA9IHR5cGU7Ci0gICAgY29tbWFuZC5zZXRUeXBlS2luZCh0eXBlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGJlZ2luUmVjb3JkaW5nKGdldFRleHQoKSk7Ci0gICAgY29tbWFuZC5ydW4oKTsKLSAgICBlbmRSZWNvcmRpbmcoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9YU0RFZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvWFNERWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhNWEzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9YU0RFZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuYWN0aW9ucy5SZXBsYWNlUHJlZml4QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkudXRpbC5YTUxDb21tb25SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5UYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0cy5YU0RFZGl0U2NoZW1hSW5mb0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhTREVkaXROYW1lc3BhY2VzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIE5vZGUgbm9kZTsKLQlwcml2YXRlIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uOwotCXByaXZhdGUgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgICBwcml2YXRlIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyIG5hbWVzcGFjZUluZm9NYW5hZ2VyID0gbmV3IERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCk7Ci0JCi0JcHVibGljIFhTREVkaXROYW1lc3BhY2VzQWN0aW9uKFN0cmluZyBsYWJlbCwgRWxlbWVudCBlbGVtZW50LCBOb2RlIG5vZGUpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChsYWJlbCk7Ci0JCQotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLm5vZGUgPSBub2RlOwotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8gVGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkLi4uLgotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSAiZHVtbXkiOwkJCi0JfQotCQotCXB1YmxpYyBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbihTdHJpbmcgbGFiZWwsIEVsZW1lbnQgZWxlbWVudCwgTm9kZSBub2RlLCBYU0RTY2hlbWEgc2NoZW1hKSB7Ci0JCXRoaXMgKGxhYmVsLCBlbGVtZW50LCBub2RlKTsKLQkJeHNkU2NoZW1hID0gc2NoZW1hOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpCi0JCXsgICAKLQkJICAgICAgU2hlbGwgc2hlbGwgPSBYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQkgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsKLQkJICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKSB7Ci0JCSAgICAgIAl0YXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCSAgICAgIH0KLQkJICAgICAgWFNERWRpdFNjaGVtYUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IFhTREVkaXRTY2hlbWFJbmZvRGlhbG9nKHNoZWxsLCBuZXcgUGF0aChyZXNvdXJjZUxvY2F0aW9uKSwgdGFyZ2V0TmFtZXNwYWNlKTsgCi0KLQkJICAgICAgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUluZm9NYW5hZ2VyLmdldE5hbWVzcGFjZUluZm9MaXN0KGVsZW1lbnQpOwotCQkgICAgICBMaXN0IG9sZE5hbWVzcGFjZUluZm9MaXN0ID0gTmFtZXNwYWNlSW5mby5jbG9uZU5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQkgICAgICAvLyBoZXJlIHdlIHN0b3JlIGEgY29weSBvZiB0aGUgb2xkIGluZm8gZm9yIGVhY2ggTmFtZXNwYWNlSW5mbwotCQkgICAgICAvLyB0aGlzIGluZm8gd2lsbCBiZSB1c2VkIGluIGNyZWF0ZVByZWZpeE1hcHBpbmcoKSB0byBmaWd1cmUgb3V0IGhvdyB0byB1cGRhdGUgdGhlIGRvY3VtZW50IAotCQkgICAgICAvLyBpbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2VzCi0JCSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCSAgICAgIHsKLQkJICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLQkJICAgICAgICBOYW1lc3BhY2VJbmZvIG9sZENvcHkgPSBuZXcgTmFtZXNwYWNlSW5mbyhpbmZvKTsKLQkJICAgICAgICBpbmZvLnNldFByb3BlcnR5KCJvbGRDb3B5Iiwgb2xkQ29weSk7Ci0JCSAgICAgIH0KLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCSAgICAgIGRpYWxvZy5zZXROYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7ICAgCi0JCSAgICAgIGRpYWxvZy5jcmVhdGUoKTsgICAgICAKLQkJICAgICAgLy9kaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDUwMCwgMzAwKTsKLQkJICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9NRU5VX0VESVRfU0NIRU1BX0lORk9STUFUSU9OX1RJVExFIikpOwotCQkgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCSAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgU3RyaW5nIHhzZFByZWZpeCA9ICIiOyAgICAKLQotCQkgICAgICBpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spCi0JCSAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgeHNkU2NoZW1hRWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICBEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgeHNkU2NoZW1hRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgbmV3SW5mb0xpc3QgPSBkaWFsb2cuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLQotCQkgICAgICAgIC8vIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmFtZSBhbnkgcHJlZml4ZXMKLQkJICAgICAgICBNYXAgcHJlZml4TWFwcGluZyA9IGNyZWF0ZVByZWZpeE1hcHBpbmcob2xkTmFtZXNwYWNlSW5mb0xpc3QsIG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTWFwIG1hcDIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgeHNkTlMgPSAiIjsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0luZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE5hbWVzcGFjZUluZm8gbmkgPSAoTmFtZXNwYWNlSW5mbylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIHByZWYgPSBuaS5wcmVmaXg7Ci0gICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuaS51cmk7Ci0gICAgICAgICAgICAgIGlmIChwcmVmID09IG51bGwpIHByZWYgPSAiIjsKLSAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB1cmkgPSAiIjsKLSAgICAgICAgICAgICAgaWYgKFhTRENvbnN0YW50cy5pc1NjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSh1cmkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkUHJlZml4ID0gcHJlZjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtYXAyLnB1dChwcmVmLCB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAKLQkJICAgICAgICBpZiAobWFwMi5zaXplKCkgPiAwKQotCQkgICAgICAgIHsKLQkJICAgICAgICAJdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTkFNRVNQQUNFX0NIQU5HRSIpKTsKLQotICAgICAgICAgICAgICAgIGlmICh4c2RQcmVmaXggIT0gbnVsbCAmJiB4c2RQcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0VGFyZ2V0TmFtZXNwYWNlKGRpYWxvZy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNjaGVtYVByZWZpeENoYW5nZUhhbmRsZXIgc3BjaCA9IG5ldyBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyKHhzZFNjaGVtYSwgeHNkUHJlZml4KTsKLSAgICAgICAgICAgICAgICBzcGNoLnJlc29sdmUoKTsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEudXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnNldEluY3JlbWVudGFsVXBkYXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VJbmZvTWFuYWdlci5yZW1vdmVOYW1lc3BhY2VJbmZvKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUluZm9NYW5hZ2VyLmFkZE5hbWVzcGFjZUluZm8oZWxlbWVudCwgbmV3SW5mb0xpc3QsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0SW5jcmVtZW50YWxVcGRhdGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBkb24ndCBuZWVkIHRoZXNlIGFueSBtb3JlPwotCQkJICAgICAgICAgIFJlcGxhY2VQcmVmaXhBY3Rpb24gcmVwbGFjZVByZWZpeEFjdGlvbiA9IG5ldyBSZXBsYWNlUHJlZml4QWN0aW9uKG51bGwsIGVsZW1lbnQsIHByZWZpeE1hcHBpbmcpOwotCQkJICAgICAgICAgIHJlcGxhY2VQcmVmaXhBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciB0YXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIoeHNkU2NoZW1hLCB0YXJnZXROYW1lc3BhY2UsIGRpYWxvZy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5yZXNvbHZlKCk7Ci0JCQkJICAgIAl9Ci0gICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgeyAKLS8vICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCSAgICAgCQl9Ci0JCSAgICAgICAgfQotCQkgICB9ICAgICAgCi0gICAgICAgICAgCi0JCX0KLQl9Ci0JCi0JIHByb3RlY3RlZCBNYXAgY3JlYXRlUHJlZml4TWFwcGluZyhMaXN0IG9sZExpc3QsIExpc3QgbmV3TGlzdCkKLQkgIHsgICAgICAgICAgCi0JICAgIE1hcCBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkgICAgSGFzaHRhYmxlIG9sZFVSSVRvUHJlZml4VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JICAgIGZvciAoSXRlcmF0b3IgaSA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLQkgICAgeyAgICAKLQkgICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsgICAgICAgICAgICAgICAgICAgIAotCSAgICAgIG9sZFVSSVRvUHJlZml4VGFibGUucHV0KG9sZEluZm8udXJpLCBvbGRJbmZvKTsKLQkgICAgfQotCSAgICAKLQkgICAgZm9yIChJdGVyYXRvciBpID0gbmV3TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCSAgICB7Ci0JICAgICAgTmFtZXNwYWNlSW5mbyBuZXdJbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0JICAgICAgTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pb2xkVVJJVG9QcmVmaXhUYWJsZS5nZXQobmV3SW5mby51cmkgIT0gbnVsbCA/IG5ld0luZm8udXJpIDogIiIpOyAKLQotCi0JICAgICAgLy8gaWYgb2xkSW5mbyBpcyBub24gbnVsbCAuLi4gdGhlcmUncyBhIG1hdGNoaW5nIFVSSSBpbiB0aGUgb2xkIHNldAotCSAgICAgIC8vIHdlIGNhbiB1c2UgaXRzIHByZWZpeCB0byBkZXRlbWluZSBvdXQgbWFwcGluZwotCSAgICAgIC8vCi0JICAgICAgLy8gaWYgb2xkSW5mbyBpcyBudWxsIC4uLiAgd2UgdXNlIHRoZSAnb2xkQ29weScgd2Ugc3Rhc2hlZCBhd2F5IAotCSAgICAgIC8vIGFzc3VtaW5nIHRoYXQgdGhlIHVzZXIgY2hhbmdlZCB0aGUgVVJJIGFuZCB0aGUgcHJlZml4Ci0JICAgICAgaWYgKG9sZEluZm8gPT0gbnVsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAgIHsKLQkgICAgICAgIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbyluZXdJbmZvLmdldFByb3BlcnR5KCJvbGRDb3B5Iik7ICAgICAgICAgICAKLQkgICAgICB9IAotCi0JICAgICAgaWYgKG9sZEluZm8gIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gbmV3SW5mby5wcmVmaXggIT0gbnVsbCA/IG5ld0luZm8ucHJlZml4IDogIiI7Ci0JICAgICAgICBTdHJpbmcgb2xkUHJlZml4ID0gb2xkSW5mby5wcmVmaXggIT0gbnVsbCA/IG9sZEluZm8ucHJlZml4IDogIiI7Ci0JICAgICAgICBpZiAoIW9sZFByZWZpeC5lcXVhbHMobmV3UHJlZml4KSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgbWFwLnB1dChvbGRQcmVmaXgsIG5ld1ByZWZpeCk7ICAgIAotCSAgICAgICAgfQotCSAgICAgIH0gICAgICAKLQkgICAgfSAgICAgICAgCi0JICAgIHJldHVybiBtYXA7Ci0JICB9Ci0gICAKLS8vICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBbGxOb2RlcyhFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwcmVmaXgpCi0vLyAgICB7Ci0vLyAgICAgIGVsZW1lbnQuc2V0UHJlZml4KHByZWZpeCk7Ci0vLyAgICAgIE5vZGVMaXN0IGxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLS8vICAgICAgaWYgKGxpc3QgIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBOb2RlIGNoaWxkID0gbGlzdC5pdGVtKGkpOwotLy8gICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBjaGlsZC5zZXRQcmVmaXgocHJlZml4KTsKLS8vICAgICAgICAgICAgaWYgKGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHVwZGF0ZUFsbE5vZGVzKChFbGVtZW50KWNoaWxkLCBwcmVmaXgpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9ICAgCi0vLyAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9BYnN0cmFjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9BYnN0cmFjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4YzBhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWJzdHJhY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tbWFuZCAKLXsKLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIHByaXZhdGUgWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWw7Ci0KLSAgcHJvdGVjdGVkIEFic3RyYWN0Q29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQpCi0gIHsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgfQotICAKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKCk7Ci0KLSAgcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldFBhcmVudCgpCi0gIHsKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0gIAotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0TW9kZWxPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbE9iamVjdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotICAKLSAgLy8gRXN0YWJsaXNoIHBhcnQtd2hvbGUgcmVsYXRpb25zaGlwCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKTsKLQotICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRDaGlsZChFbGVtZW50IGNoaWxkKQotICB7Ci0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgWE1MTm9kZSkKLSAgICB7Ci0gICAgICBYTUxNb2RlbCBtb2RlbCA9ICgoWE1MTm9kZSljaGlsZCkuZ2V0TW9kZWwoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLSAgICAgICAgCi0gICAgICAgIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7IAotICAgICAgfQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTczZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kCi17Ci0gIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlZkF0dHJpYnV0ZSA9IG51bGw7Ci0gIC8qKgotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqLwotICBwdWJsaWMgQWRkQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gIH0KLQotICBwdWJsaWMgQWRkQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCwgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gcmVmKQotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLSAgICB0aGlzLnJlZkF0dHJpYnV0ZSA9IHJlZjsKLSAgfQotCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXBhcmVudDsKLQotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgIGF0dHJpYnV0ZS5zZXROYW1lKGdldE5ld05hbWUoIkF0dHJpYnV0ZSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYXR0cmlidXRlLnNldFR5cGVEZWZpbml0aW9uKGN0LmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAKLSAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RBdHRyaWJ1dGVVc2UoKTsKLSAgICAgIGF0dHJpYnV0ZVVzZS5zZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyaWJ1dGUpOwotICAgICAgYXR0cmlidXRlVXNlLnNldENvbnRlbnQoYXR0cmlidXRlKTsKLSAgICAgIAotICAgICAgaWYgKGN0LmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY3QuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQoYXR0cmlidXRlVXNlKTsKLSAgICAgICAgZm9ybWF0Q2hpbGQoYXR0cmlidXRlLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI2Fkb3B0KG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBBcnJheUxpc3QgbmFtZXM7Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWUoU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgU3RyaW5nIGNhbmRpZGF0ZU5hbWUgPSAiTmV3IiArIGRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nQnVmZmVyIGNhbmRpZGF0ZU5hbWVTQiA9IG5ldyBTdHJpbmdCdWZmZXIoIk5ldyIgKyBkZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAgICBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpbnQgaSA9IDE7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXBhcmVudDsKLSAgICAgIHdhbGtVcEluaGVyaXRhbmNlKGN0KTsKLQotICAgICAgYm9vbGVhbiByZWFkeSA9IGZhbHNlOwotICAgICAgd2hpbGUgKCFyZWFkeSkKLSAgICAgIHsKLSAgICAgICAgcmVhZHkgPSB0cnVlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZylpdGVyLm5leHQoKTsKLSAgICAgICAgICBpZiAoY2FuZGlkYXRlTmFtZS5lcXVhbHMoYXR0ck5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlYWR5ID0gZmFsc2U7Ci0gICAgICAgICAgICBjYW5kaWRhdGVOYW1lID0gIk5ldyIgKyBkZXNjcmlwdGlvbiArIFN0cmluZy52YWx1ZU9mKGkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjYW5kaWRhdGVOYW1lOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgd2Fsa1VwSW5oZXJpdGFuY2UoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0KQotICB7Ci0gICAgdXBkYXRlTmFtZXMoY3QpOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBjdC5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICBpZiAoY3QgIT0gY3QuZ2V0Um9vdFR5cGUoKSkKLSAgICB7Ci0gICAgICBpZiAodHlwZURlZiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0MiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdHlwZURlZjsKLSAgICAgICAgd2Fsa1VwSW5oZXJpdGFuY2UoY3QyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTmFtZXMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IGN0LmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlVXNlIHVzZSA9IChYU0RBdHRyaWJ1dGVVc2Upb2JqOwotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gdXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoYXR0ck5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzLmFkZChhdHRyTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZGEzNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgCi0gIHB1YmxpYyBBZGRDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kCi0gICAgKFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCwKLSAgICAgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotICAgIHRoaXMubmFtZSA9IG5hbWU7IC8vIHRoaXMgbWF5IGJlIG51bGwgZm9yIGFub255bW91cyB0eXBlCi0gIH0KLQkgIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gIAlYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZURlZiA9IAotICAgICAgWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgdHlwZURlZi5zZXROYW1lKG5hbWUpOwotICAgIAkKLSAgICBpZiAoYWRvcHQodHlwZURlZikpCi0gICAgICBzZXRNb2RlbE9iamVjdCh0eXBlRGVmKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRvcHQoWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwpCi0gIHsKLSAgCVhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAoKFhTRFNjaGVtYSlwYXJlbnQpLmdldFR5cGVEZWZpbml0aW9ucygpLmFkZChtb2RlbCk7Ci0gICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFyZW50KS5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKW1vZGVsKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7IC8vIGludmFsaWQgcGFyZW50Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkRWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjE2MWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZEVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsgLy8gZWxlbWVudCBuYW1lCi0gIAotICBwdWJsaWMgQWRkRWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZAotICAgIChYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQsCi0gICAgIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gCi0gICAgICBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICBlbGVtZW50RGVjbC5zZXROYW1lKG5hbWUpOwotICAgIAotICAgIGlmIChhZG9wdChlbGVtZW50RGVjbCkpCi0gICAgICBzZXRNb2RlbE9iamVjdChlbGVtZW50RGVjbCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBhZG9wdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCkKLSAgewotICAJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICgoWFNEU2NoZW1hKXBhcmVudCkuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLmFkZChtb2RlbCk7Ci0gICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICAoKFhTRFBhcnRpY2xlKXBhcmVudCkuc2V0Q29udGVudCgoWFNERWxlbWVudERlY2xhcmF0aW9uKW1vZGVsKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7IC8vIGludmFsaWQgcGFyZW50Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRNb2RlbEdyb3VwQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1vZGVsR3JvdXBDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NTE4ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1vZGVsR3JvdXBDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkTW9kZWxHcm91cENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFhTRENvbXBvc2l0b3IgY29tcG9zaXRvcjsKLQotICBwdWJsaWMgQWRkTW9kZWxHcm91cENvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50LCBYU0RDb21wb3NpdG9yIGNvbXBvc2l0b3IpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotICAgIHRoaXMuY29tcG9zaXRvciA9IGNvbXBvc2l0b3I7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgb3duZXIgPSBudWxsOwotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJlbnQ7ICAgICAgCi0gICAgICBpZiAoZWQuZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgaWYgKGVkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGVkLnNldFR5cGVEZWZpbml0aW9uKG51bGwpOwotICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0ZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgIGVkLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgICBvd25lciA9IGVkLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHRkID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgZWQuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24odGQpOwotICAgICAgICAgIG93bmVyID0gdGQ7ICAgICAgICAKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgCi0gICAgICBlbHNlIGlmIChlZC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0ZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBlZC5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICAgIG93bmVyID0gdGQ7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIG93bmVyID0gZWQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHRkID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIGVkLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgb3duZXIgPSB0ZDsgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgICgoWFNETW9kZWxHcm91cCkgcGFyZW50KS5nZXRDb250ZW50cygpLmFkZChjcmVhdGVNb2RlbEdyb3VwKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgb3duZXIgPSAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilwYXJlbnQpOwotICAgIH0KLSAgICBpZiAob3duZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7IAotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gY3JlYXRlTW9kZWxHcm91cCgpOwotICAgICAgcGFydGljbGUuc2V0Q29udGVudChtb2RlbEdyb3VwKTsKLQotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ZCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pb3duZXI7Ci0gICAgICBjdGQuc2V0Q29udGVudChwYXJ0aWNsZSk7Ci0gICAgICBmb3JtYXRDaGlsZChwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICB9ICAKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cCBjcmVhdGVNb2RlbEdyb3VwKCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1vZGVsR3JvdXAoKTsKLSAgICBtb2RlbEdyb3VwLnNldENvbXBvc2l0b3IoY29tcG9zaXRvcik7Ci0gICAgcmV0dXJuIG1vZGVsR3JvdXA7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzM0N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIAotICBwdWJsaWMgQWRkU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kCi0gICAgKFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCwKLSAgICAgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotICAgIHRoaXMubmFtZSA9IG5hbWU7IC8vIHRoaXMgbWF5IGJlIG51bGwgZm9yIGFub255bW91cyB0eXBlCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgCVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAKLSAgICAgIFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gIAl0eXBlRGVmLnNldE5hbWUobmFtZSk7Ci0gIAkKLSAgICBpZiAoYWRvcHQodHlwZURlZikpCi0gICAgICBzZXRNb2RlbE9iamVjdCh0eXBlRGVmKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRvcHQoWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwpCi0gIHsKLSAgCVhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAoKFhTRFNjaGVtYSlwYXJlbnQpLmdldFR5cGVEZWZpbml0aW9ucygpLmFkZChtb2RlbCk7Ci0gICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFyZW50KS5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pbW9kZWwpOwotICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilwYXJlbnQpLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiltb2RlbCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOyAvLyBpbnZhbGlkIHBhcmVudAotICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NjJhMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0KLQlTdHJpbmcgZk5ld05hbWU7Ci0KLQlwdWJsaWMgTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IGVsZW1lbnQsCi0JCQlTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihlbGVtZW50LmdldENvbnRhaW5lcigpKTsKLQkJc2V0TW9kZWxPYmplY3QoZWxlbWVudCk7Ci0JCWZOZXdOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsID0gZ2V0TW9kZWxPYmplY3QoKTsKLQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbW9kZWwuZ2V0Q29udGFpbmVyKCk7Ci0JCVhTRFR5cGVEZWZpbml0aW9uIGdsb2JhbFR5cGVEZWYgPSBudWxsOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkvLyBjbG9uZSB0eXBlZGVmIHdpdGggaXQncyBjb250ZW50IGFuZCBzZXQgaXQgZ2xvYmFsCi0JCQkJZ2xvYmFsVHlwZURlZiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIG1vZGVsCi0JCQkJCQkuY2xvbmVDb25jcmV0ZUNvbXBvbmVudCh0cnVlLCBmYWxzZSk7Ci0JCQkJZ2xvYmFsVHlwZURlZi5zZXROYW1lKGZOZXdOYW1lKTsKLQkJCQlwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0Q29udGVudHMoKS5hZGQoZ2xvYmFsVHlwZURlZik7Ci0JCQkJKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkKLQkJCQkJCS5zZXRUeXBlRGVmaW5pdGlvbihnbG9iYWxUeXBlRGVmKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB7Ci0KLQkJCVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIG1vZGVsOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCS8vIGNsb25lIHR5cGVkZWYgd2l0aCBpdCdzIGNvbnRlbnQgYW5kIHNldCBpdCBnbG9iYWwKLQkJCQlnbG9iYWxUeXBlRGVmID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlRGVmCi0JCQkJCQkuY2xvbmVDb25jcmV0ZUNvbXBvbmVudCh0cnVlLCBmYWxzZSk7Ci0JCQkJZ2xvYmFsVHlwZURlZi5zZXROYW1lKGZOZXdOYW1lKTsKLQkJCQlwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0Q29udGVudHMoKS5hZGQoZ2xvYmFsVHlwZURlZik7Ci0JCQkJKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkKLQkJCQkJCS5zZXRUeXBlRGVmaW5pdGlvbihnbG9iYWxUeXBlRGVmKTsKLQkJCQlmb3JtYXRDaGlsZChnbG9iYWxUeXBlRGVmLmdldEVsZW1lbnQoKSk7Ci0KLQkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHsKLQkJCQkvLyBjbG9uZSB0eXBlZGVmIHdpdGggaXQncyBjb250ZW50IGFuZCBzZXQgaXQgZ2xvYmFsCi0JCQkJZ2xvYmFsVHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZURlZgotCQkJCQkJLmNsb25lQ29uY3JldGVDb21wb25lbnQodHJ1ZSwgZmFsc2UpOwotCQkJCWdsb2JhbFR5cGVEZWYuc2V0TmFtZShmTmV3TmFtZSk7Ci0JCQkJcGFyZW50LmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGdsb2JhbFR5cGVEZWYpOwotCQkJCSgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHBhcmVudCkKLQkJCQkJCS5zZXRUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGdsb2JhbFR5cGVEZWYpOwotCi0JCQl9Ci0KLQkJfQotCi0JCWZvcm1hdENoaWxkKGdsb2JhbFR5cGVEZWYuZ2V0RWxlbWVudCgpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjYWRvcHQob3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwMzkxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kCi17Ci0JCi0gIHB1YmxpYyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZAotICAgIChYU0RDb25jcmV0ZUNvbXBvbmVudCBlbGVtZW50KQotICB7Ci0gICAgc3VwZXIoZWxlbWVudC5nZXRDb250YWluZXIoKSk7Ci0gICAgc2V0TW9kZWxPYmplY3QoZWxlbWVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICAKLSAgIGlmKGdldE1vZGVsT2JqZWN0KCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pewotICAgCi0JICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWdldE1vZGVsT2JqZWN0KCk7Ci0gCVhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IGdldFBhcmVudCgpOwotIAlYU0RDb25jcmV0ZUNvbXBvbmVudCBjb250YWluZXIgPSBwYXJlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gCQotIAkvLyBjbG9uZSBlbGVtZW50IHdpdGggaXQncyBjb250ZW50IGFuZCBzZXQgaXQgZ2xvYmFsCi0JWFNEQ29uY3JldGVDb21wb25lbnQgIGVsZW1lbnREZWNsID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pZ2V0TW9kZWxPYmplY3QoKSkuY2xvbmVDb25jcmV0ZUNvbXBvbmVudCh0cnVlLCB0cnVlKTsKLSAJY29udGFpbmVyLmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGVsZW1lbnREZWNsKTsKLSAJCi0gCS8vIGNyZWF0ZSBsb2NhbCBlbGVtZW50IGFuZCBzZXQgaXQncyByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvbmUKLSAJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnRSZWYgPSAKLQkgICAgICBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQllbGVtZW50UmVmLnNldFZhbHVlKGVsZW1lbnQuZ2V0VmFsdWUoKSk7Ci0gICAgZWxlbWVudFJlZi5zZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKWVsZW1lbnREZWNsKTsgCi0gICAgCi0gICAgLy8gbm93IHNldCBjb250ZW50IG1vZGVscwotIAlpZihwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZUNvbnRlbnQpewotIAkJaWYoY29udGFpbmVyIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCl7Ci0gCQkJWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApY29udGFpbmVyOwotIAkJCS8vIGRpc2Nvbm5lY3QgcGFyZW50IGZyb20gaXRzIGNvbnRhaW5lcgotIAkJCWludCBpbmRleCA9IG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pbmRleE9mKHBhcmVudCk7Ci0gCQkJIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gCi0gCQkJICAgICAgWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAJCSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KGVsZW1lbnRSZWYpOwotIAkJICAgIG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHBhcnRpY2xlKTsgCi0gCQkgICAKLSAJCQltb2RlbEdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKHBhcmVudCk7Ci0gCQkgICAgbW9kZWxHcm91cC51cGRhdGVFbGVtZW50KHRydWUpOwotICAJCSAgICBmb3JtYXRDaGlsZChtb2RlbEdyb3VwLmdldEVsZW1lbnQoKSk7Ci0gCQl9Ci0gCX0KLSAJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbil7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQucnVuOiBwYXJlbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbiIpOwotCQkgCQkKLSAJfQotIAkKLSAJY29udGFpbmVyLmdldFNjaGVtYSgpLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgZm9ybWF0Q2hpbGQoZWxlbWVudERlY2wuZ2V0RWxlbWVudCgpKTsKLSAgCi0gICB9Ci0KLSAgfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI2Fkb3B0KG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZG9wdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9SZW5hbWVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvUmVuYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU0Yjc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9SZW5hbWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkNvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkVsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLk1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5TaW1wbGVEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGtjaG9uZwotICoKLSAqIDxhIGhyZWY9Im1haWx0bzprY2hvbmdAY2EuaWJtLmNvbSI+a2Nob25nQGNhLmlibS5jb208L2E+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVuYW1lQ29tbWFuZAotewotICBwcm90ZWN0ZWQgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSBzaW1wbGVEaXJlY3RFZGl0UG9saWN5ID0gbmV3IFNpbXBsZURpcmVjdEVkaXRQb2xpY3koKTsKLSAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQ7Ci0gIEdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0OwotICAKLSAgcHVibGljIFJlbmFtZUNvbW1hbmQoWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQsIEdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7Ci0gICAgdGhpcy5uYW1lZENvbXBvbmVudCA9IG5hbWVkQ29tcG9uZW50OwotICAgIHRoaXMuZWRpdFBhcnQgPSBlZGl0UGFydDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLnhzZC5lZGl0LmFjdGlvbnMuQWJzdHJhY3RDb21tYW5kI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQpCi0gICAgewotICAgICAgRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQgZWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQgPSAoRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQpZWRpdFBhcnQ7Ci0gICAgICBlbGVtZW50RGVjbGFyYXRpb25FZGl0UGFydC5kb0VkaXROYW1lKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0IHRvcExldmVsRWRpdFBhcnQgPSAoVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCllZGl0UGFydDsKLSAgICAgIHRvcExldmVsRWRpdFBhcnQuZG9FZGl0TmFtZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0KQotICAgIHsKLSAgICAgICgoQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQpZWRpdFBhcnQpLmRvRWRpdE5hbWUoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KQotICAgIHsKLSAgICAgICgoTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydCllZGl0UGFydCkuZG9FZGl0TmFtZSgpOwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLnhzZC5lZGl0LmFjdGlvbnMuQWJzdHJhY3RDb21tYW5kI2Fkb3B0KG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9TZXRNdWx0aXBsaWNpdHlDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvU2V0TXVsdGlwbGljaXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDNiZGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9TZXRNdWx0aXBsaWNpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXRNdWx0aXBsaWNpdHlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kCi17Ci0gIGludCBtYXhPY2N1cnMsIG1pbk9jY3VyczsKLQotICAvKioKLSAgICogQHBhcmFtIHBhcmVudAotICAgKi8KLSAgcHVibGljIFNldE11bHRpcGxpY2l0eUNvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWF4T2NjdXJzKGludCBpKQotICB7Ci0gICAgbWF4T2NjdXJzPWk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cnMoaW50IGkpCi0gIHsKLSAgICBtaW5PY2N1cnM9aTsgICAgCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBvd25lciA9IG51bGw7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgeHNkUGFydGljbGVDb250ZW50ID0gKFhTRFBhcnRpY2xlQ29udGVudClwYXJlbnQ7Ci0gICAgICBYU0RQYXJ0aWNsZSB4c2RQYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSl4c2RQYXJ0aWNsZUNvbnRlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAobWF4T2NjdXJzIDwgMCkKLSAgICAgIHsKLSAgICAgICAgbWF4T2NjdXJzID0gWFNEUGFydGljbGUuVU5CT1VOREVEOwotICAgICAgfQotICAgICAgeHNkUGFydGljbGUuc2V0TWF4T2NjdXJzKG1heE9jY3Vycyk7Ci0gICAgICB4c2RQYXJ0aWNsZS5zZXRNaW5PY2N1cnMobWluT2NjdXJzKTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjYWRvcHQob3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRvcHQoWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1NldFR5cGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0OWU2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueHNkLlhTRENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueHNkLlhTRENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54c2QuWFNEU2V0VHlwZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBTZXRUeXBlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZAotewotICBwcm90ZWN0ZWQgaW50IHR5cGVLaW5kID0gWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlQ7Ci0gIAotICBwdWJsaWMgU2V0VHlwZUNvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VHlwZUtpbmQoaW50IHR5cGUpCi0gIHsKLSAgICB0aGlzLnR5cGVLaW5kID0gdHlwZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJlbnQ7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZWxlbWVudC5nZXRTY2hlbWEoKTsKLSAgICAgIGlmICh0eXBlS2luZCA9PSBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgQWRkQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZCBjdENvbW1hbmQgPSBuZXcgQWRkQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChlbGVtZW50LCBudWxsKTsKLS8vICAgICAgICBjdENvbW1hbmQucnVuKCk7Ci0gICAgICAgIEFkZE1vZGVsR3JvdXBDb21tYW5kIHNlcXVlbmNlQ29tbWFuZCA9IG5ldyBBZGRNb2RlbEdyb3VwQ29tbWFuZChlbGVtZW50LCBYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwpOwotICAgICAgICBzZXF1ZW5jZUNvbW1hbmQucnVuKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlS2luZCA9PSBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UKQotICAgICAgewotICAgICAgICBBZGRTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQgc3RDb21tYW5kID0gbmV3IEFkZFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZChlbGVtZW50LCBudWxsKTsKLSAgICAgICAgc3RDb21tYW5kLnJ1bigpOwotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilzdENvbW1hbmQuZ2V0TW9kZWxPYmplY3QoKTsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYmFzZSA9IHNjaGVtYS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oc2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpLCAic3RyaW5nIik7Ci0gICAgICAgIHN0LnNldEJhc2VUeXBlRGVmaW5pdGlvbihiYXNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgSUZpbGUgY3VycmVudElGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBYU0RDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG5ldyBYU0RDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihjdXJyZW50SUZpbGUsIHNjaGVtYSk7Ci0gICAgICAgICAgWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBYU0RDb21wb25lbnRTZWxlY3Rpb25EaWFsb2coc2hlbGwsICJTZXQgVHlwZSIsIHByb3ZpZGVyKTsgIC8vIFRPRE86IEV4dGVybmFsaXplIFRoaXMKLSAgICAgICAgICBwcm92aWRlci5zZXREaWFsb2coZGlhbG9nKTsKLSAgICAgICAgICAKLSAgICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICBYU0RTZXRUeXBlSGVscGVyIGhlbHBlciA9IG5ldyBYU0RTZXRUeXBlSGVscGVyKGN1cnJlbnRJRmlsZSwgc2NoZW1hKTsKLSAgICAgICAgICAgICAgaGVscGVyLnNldFR5cGUoZWxlbWVudC5nZXRFbGVtZW50KCksICJ0eXBlIiwgZGlhbG9nLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3JtYXRDaGlsZChlbGVtZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgfQotCi0gIH0KLSAgCi0gIHByaXZhdGUgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpOwotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotLy8gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQotICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRvcHQoWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvY29tbW9uL0NvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvY29tbW9uL0NvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmZjNWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL2NvbW1vbi9Db21wb25lbnRTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotICAgIHByaXZhdGUgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGlhbG9nVGl0bGU7Ci0KLSAgICBwcm90ZWN0ZWQgSUNvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyOwotICAgIHByaXZhdGUgTGlzdCBjb21wb25lbnRUcmVlVmlld2VySW5wdXQ7Ci0gICAgcHJpdmF0ZSBMaXN0IG1hc3RlckNvbXBvbmVudExpc3Q7Ci0gICAgCi0gICAgLy8gd2lkZ2V0cwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgdG9wQ29tcG9zaXRlOwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgYm90dG9tQ29tcG9zaXRlOyAKLSAgICBwcml2YXRlIFN0cmluZyBmaWx0ZXJUZXh0TGFiZWwgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBjb21wb25lbnRMaXN0TGFiZWwgPSAiQ29tcG9uZW50czoiOyAgLy8gVE9ETzogRXh0ZXJuYWxpemUgU3RyaW5nCi0gICAgcHJpdmF0ZSBUZXh0IHRleHRGaWx0ZXI7Ci0gICAgcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY29tcG9uZW50VHJlZVZpZXdlcjsKLSAgICBwcml2YXRlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgcXVhbGlmaWVyTGlzdDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNvbXBvbmVudFNlbGVjdGlvbjsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHF1YWxpZmllclRleHRTZWxlY3Rpb247Ci0KLSAgICBwdWJsaWMgQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIElDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBzdXBlcihzaGVsbCk7Ci0gICAgICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgICAgIHRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLSAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAKLSAgICAgICAgY29tcG9uZW50VHJlZVZpZXdlcklucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBtYXN0ZXJDb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHJlZUxhYmVsKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgY29tcG9uZW50TGlzdExhYmVsID0gc3RyaW5nOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsdGVyTGFiZWwoU3RyaW5nIHN0cmluZykgewotICAgICAgICBmaWx0ZXJUZXh0TGFiZWwgPSBzdHJpbmc7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlKCk7Ci0gICAgICAgIHNldFRleHRGaWx0ZXJGb2N1cygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0RmlsdGVyRm9jdXMoKSB7Ci0gICAgICAgIHRleHRGaWx0ZXIuc2V0Rm9jdXMoKTsgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBnZXRTaGVsbCgpLnNldFRleHQoZGlhbG9nVGl0bGUpOwotCi0gICAgICAgIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgICAgICBHcmlkRGF0YSBnRGF0YSA9IChHcmlkRGF0YSkgbWFpbkNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgIGdEYXRhLmhlaWdodEhpbnQgPSA1MDA7Ci0gICAgICAgIGdEYXRhLndpZHRoSGludCA9IDQwMDsKLQotICAgICAgICAvLyBTdWJjbGFzc2VzIG1heSB1c2UgdGhpcyBDb21wb3NpdGUgdG8gYWRkIGRlc2lyZWQgd2lkZ2V0cwotICAgICAgICAvL3RvcENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAvL3RvcENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLSAgICAgICAgLy90b3BDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gZG8gd2UgbmVlZCB0byBpbnRyb2R1Y2UgYSBtZXRob2QgaGVyZSB0byBjb250YWluIHRoaXMKLSAgICAgICAgLy8gc28gd2UgY2FuIGFkZCBkaWZmZXJlbnQgcGFyZW50IG90aGVyIHRoYW4gJ3RvcENvbXBvc2l0ZScKLSAgICAgICAgQ29tcG9zaXRlIGZpbHRlckxhYmVsQW5kVHJlZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGZpbHRlckxhYmVsQW5kVHJlZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgZmlsdGVyTGFiZWxBbmRUcmVlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBUZXh0IHRleHRGaWx0ZXIKLSAgICAgICAgTGFiZWwgZmlsdGVyTGFiZWwgPSBuZXcgTGFiZWwoZmlsdGVyTGFiZWxBbmRUcmVlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGZpbHRlckxhYmVsLnNldFRleHQoZmlsdGVyVGV4dExhYmVsKTsvLyArICIoPyA9IGFueSBjaGFyYWN0ZXIsICogPSBhbnkgc3RyaW5nKToiKTsgLy8gVE9ETzogRXh0ZXJuYWxpemUgU3RyaW5nCi0KLSAgICAgICAgdGV4dEZpbHRlciA9IG5ldyBUZXh0KGZpbHRlckxhYmVsQW5kVHJlZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICB0ZXh0RmlsdGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAgICAgICAgCi0gICAgICAgIHRleHRGaWx0ZXIuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IFRleHRGaWx0ZXJNb2RpZnlBZGFwdGVyKCkpOwotICAgICAgICBHcmlkRGF0YSB0ZXh0RmlsdGVyRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICB0ZXh0RmlsdGVyRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgdGV4dEZpbHRlckRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIHRleHRGaWx0ZXIuc2V0TGF5b3V0RGF0YSh0ZXh0RmlsdGVyRGF0YSk7Ci0KLSAgICAgICAgLy90ZXh0RmlsdGVyLnNldFNlbGVjdGlvbigwKTsKLSAgICAgICAgLy90ZXh0RmlsdGVyLnNldGYKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgQ29tcG9uZW50IFRyZWVWaWV3ZXIKLSAgICAgICAgY3JlYXRlQ29tcG9uZW50VHJlZVZpZXdlcihmaWx0ZXJMYWJlbEFuZFRyZWUpOwotCi0gICAgICAgIC8vIENyZWF0ZSBRdWFsaWZpZXIgTGlzdCB3aWRnZXQKLSAgICAgICAgTGFiZWwgcXVhbGlmaWVyTGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBxdWFsaWZpZXJMYWJlbC5zZXRUZXh0KCJRdWFsaWZpZXI6Iik7ICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcKLQotICAgICAgICBxdWFsaWZpZXJMaXN0ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QobWFpbkNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIGRhdGEuaGVpZ2h0SGludCA9IDQ1OwotICAgICAgICBxdWFsaWZpZXJMaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBib3R0b21Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gUG9wdWxhdGUgdGhlIENvbXBvbmVudCBUcmVlVmlld2VyIHZpYSB0aGUgcHJvdmlkZXIKLSAgICAgICAgLy8gVE9ETzogSXMgdGhpcyB0aGUgcmlnaHQgd2F5IHRvIHNldC9nZXQgdGhlIENvbnRlbnRQcm92aWRlcj8KLSAgICAgICAgY29tcG9uZW50VHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENvbXBvbmVudFRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudFRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlci5nZXRMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICBjb21wb25lbnRUcmVlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotICAgICAgICBjb21wb25lbnRUcmVlVmlld2VyLnNldElucHV0KGNvbXBvbmVudFRyZWVWaWV3ZXJJbnB1dCk7Ci0gICAgICAgIAotICAgICAgICBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3QoKTsKLSAgICAgICAgcmVmcmVzaFRyZWVWaWV3ZXIoIiIpOwotCi0gICAgICAgIHJldHVybiBtYWluQ29tcG9zaXRlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBUcmVlVmlld2VyIGNyZWF0ZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIGNvbXAsIFN0cmluZyB0aXRsZSkgewotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQodGl0bGUpOwotCi0gICAgICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKG5ldyBUcmVlKGNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKSk7Ci0gICAgICAgIENvbnRyb2wgdHJlZVdpZGdldCA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICB0cmVlV2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIHJldHVybiB0cmVlVmlld2VyOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIENyZWF0ZXMgdGhlIENvbXBvbmVudCBUcmVlVmlld2VyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb21wb25lbnRUcmVlVmlld2VyKENvbXBvc2l0ZSBiYXNlKSB7Ci0gICAgICAgIGNvbXBvbmVudFRyZWVWaWV3ZXIgPSBjcmVhdGVUcmVlVmlld2VyKGJhc2UsIGNvbXBvbmVudExpc3RMYWJlbCk7ICAgIAotICAgICAgICAKLSAgICAgICAgY29tcG9uZW50VHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIExpc3QgcXVhbGlmaWVycyA9IHByb3ZpZGVyLmdldFF1YWxpZmllcnMoc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUXVhbGlmaWVyTGlzdChxdWFsaWZpZXJzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDYW5GaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVRdWFsaWZpZXJMaXN0KExpc3QgcXVhbGlmaWVycykgewotICAgICAgICBxdWFsaWZpZXJMaXN0LnJlbW92ZUFsbCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IHF1YWxpZmllcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgcXVhbGlmaWVyTGlzdC5hZGQoaXQubmV4dCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgcHJvY2Vzc2VkIGZpbHRlciB0ZXh0IGZvciB0aGUgVGV4dCBmaWVsZC4gIEluc2VydHMgYSAiLiIKLSAgICAgKiBiZWZvcmUgZWFjaCBzdXBwb3J0ZWQgbWV0YS1jaGFyYWN0ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzRmlsdGVyU3RyaW5nKHRleHRGaWx0ZXIuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHN1cHBvcnRlZCBtZXRhY2hhcmFjdGVycyBhcmUgdXNlZCBpbiB0aGUgZmlsdGVyIHN0cmluZywgd2UgbmVlZCB0bwotICAgICAqIGluc2VydCBhICIuIiBiZWZvcmUgZWFjaCBtZXRhY2hhcmFjdGVyLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NGaWx0ZXJTdHJpbmcoU3RyaW5nIGlucHV0U3RyaW5nKSB7Ci0gICAgICAgIGlmICghKGlucHV0U3RyaW5nLmVxdWFscygiIikpKSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmluZyA9IGluc2VydFN0cmluZygiKiIsICIuIiwgaW5wdXRTdHJpbmcpOwotICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSBpbnNlcnRTdHJpbmcoIj8iLCAiLiIsIGlucHV0U3RyaW5nKTsKLSAgICAgICAgICAgIGlucHV0U3RyaW5nID0gaW5wdXRTdHJpbmcgKyAiLioiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSAiLioiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlucHV0U3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBpbnNlcnQgYSAiLiIgYmVmb3JlIGVhY2ggbWV0YWNoYXJhY3RlciBpbiB0aGUKLSAgICAgKiBzZWFyY2gvZmlsdGVyIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBpbnNlcnRTdHJpbmcoU3RyaW5nIHRhcmdldCwgU3RyaW5nIG5ld1N0cmluZywgU3RyaW5nIHN0cmluZykgewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyaW5nKTsKLQotICAgICAgICBpbnQgaW5kZXggPSBzdHJpbmdCdWZmZXIuaW5kZXhPZih0YXJnZXQpOwotICAgICAgICB3aGlsZSAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlciA9IHN0cmluZ0J1ZmZlci5pbnNlcnQoaW5kZXgsIG5ld1N0cmluZyk7Ci0gICAgICAgICAgICBpbmRleCA9IHN0cmluZ0J1ZmZlci5pbmRleE9mKHRhcmdldCwgaW5kZXggKyBuZXdTdHJpbmcubGVuZ3RoKCkgKyB0YXJnZXQubGVuZ3RoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTGlzdGVucyB0byBjaGFuZ2VzIG1hZGUgaW4gdGhlIHRleHQgZmlsdGVyIHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVGV4dEZpbHRlck1vZGlmeUFkYXB0ZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgaWYgKGUud2lkZ2V0ID09IHRleHRGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVsYXllZEV2ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsYXllZEV2ZW50LkNBTkNFTCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVsYXllZEV2ZW50ID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgICAgICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLnRpbWVyRXhlYyg0MDAsIGRlbGF5ZWRFdmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1RPRE8uLi4gZG8gd2UgcmVhbGx5IG5lZWQgb25lIGluc3RhbmNlPwotICAgIHByaXZhdGUgRGVsYXllZEV2ZW50IGRlbGF5ZWRFdmVudDsKLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBjb21wb25lbnQgVHJlZVZpZXdlciB3aGVuIHRoZSB0ZXh0IGZpbHRlciBpcyBtb2RpZmllZC4KLSAgICAgKiBVc2UgYSBEZWxheWVkRXZlbnQgc28gd2UgZG9uJ3QgdXBkYXRlIG9uIGV2ZXJ5IGtleXN0cm9rZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIERlbGF5ZWRFdmVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gQ0FOQ0VMID0gZmFsc2U7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKCFDQU5DRUwpIHsKLSAgICAgICAgICAgICAgICByZWZyZXNoVHJlZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IGZpcnN0IG1hdGNoCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1Db3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBUcmVlSXRlbSBpdGVtID0gY29tcG9uZW50VHJlZVZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbXMoKVswXTsKLSAgICAgICAgICAgICAgICAgICAgVHJlZUl0ZW0gaXRlbXNbXSA9IG5ldyBUcmVlSXRlbVsxXTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0gPSBpdGVtOwotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUcmVlVmlld2VyLmdldFRyZWUoKS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcXVhbGlmaWVyTGlzdAotICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbXBvbmVudFRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBxdWFsaWZpZXJzID0gcHJvdmlkZXIuZ2V0UXVhbGlmaWVycyhzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVRdWFsaWZpZXJMaXN0KHF1YWxpZmllcnMpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHVwZGF0ZUNhbkZpbmlzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgQ29tcG9uZW50TGlzdCBpbXBsZW1lbnRzIElDb21wb25lbnRMaXN0IHsKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3Igb2JqZWN0VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBwcml2YXRlIGxvbmcgY3VycmVudENoYW5nZUNvdW50ZXIgPSAwOwotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBvYmplY3RWZWN0b3IuYWRkKG8pOwotICAgICAgICAgICAgY3VycmVudENoYW5nZUNvdW50ZXIrKzsKLSAgICAgICAgICAgIGRvVmlld2VyVXBkYXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBkb1ZpZXdlclVwZGF0ZSgpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IEludmVzdGlnYXRlIGlmIHdlIHNob3VsZCBhbHNvIGFkZCBhIHRpbWVyIGNvbmRpdGlvbj8/Ci0gICAgICAgICAgICBpZiAoY3VycmVudENoYW5nZUNvdW50ZXIgPT0gMTApIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2hhbmdlQ291bnRlciA9IDA7Ci0gICAgICAgICAgICAgICAgZmlyZVVwZGF0ZUxpc3QodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqZWN0VmVjdG9yLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIExpc3Qgc3ViTGlzdChpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqZWN0VmVjdG9yLnN1Ykxpc3Qoc3RhcnRJbmRleCwgZW5kSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqZWN0VmVjdG9yLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAKLSAgICAvLyB0aGlzIG1ldGhvZCBnZXRzIGNhbGxlZCBmcm9tIGEgbm9uLXVpIHRocmVhZCBzbyBuZWVkcyB0byBjYWxsCi0gICAgLy8gYXN5bmNFeGVjIHRvIGVuc3VyZSB0aGUgVUkgdXBkYXRlcyBoYXBwZW4gb24gdGhlIFVJIHRocmVhZAotICAgIC8vCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZVVwZGF0ZUxpc3QoZmluYWwgQ29tcG9uZW50TGlzdCBsaXN0KSB7ICAgIAotICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpewotICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgb2JqZWN0cwotICAgICAgICAgICAgICAgIGludCBncm93aW5nTGlzdFNpemUgPSBsaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBpbnQgY3VycmVudFNpemUgPSBtYXN0ZXJDb21wb25lbnRMaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZ3Jvd2luZ0xpc3RTaXplID4gY3VycmVudFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFzdGVyQ29tcG9uZW50TGlzdC5hZGRBbGwobGlzdC5zdWJMaXN0KGN1cnJlbnRTaXplLCBncm93aW5nTGlzdFNpemUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZWZyZXNoVHJlZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsgICAgICAgIAotICAgIH0KLQotICAgIAotICAgIC8qCi0gICAgICogUG9wdWxhdGUgdGhlIENvbXBvbmVudCBUcmVlVmlld2VyIHdpdGggaXRlbXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYXN0ZXJDb21wb25lbnRMaXN0KCkgewotICAgICAgICBtYXN0ZXJDb21wb25lbnRMaXN0LmNsZWFyKCk7Ci0gICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBwcm92aWRlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3QgPSBuZXcgQ29tcG9uZW50TGlzdCgpOwotICAgICAgICBwcm92aWRlci5nZXRDb21wb25lbnRzKGNvbXBvbmVudExpc3QsIHRydWUpOwotICAgICAgICAKLSAgICAgICAgSm9iIGpvYiA9IG5ldyBKb2IoInJlYWQgY29tcG9uZW50cyIpIHsKLSAgICAgICAgICBwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAvLyB0aGlzIHN0dWZmIGdldHMgZXhlY3V0ZWQgb24gYSBub24tVUkgdGhyZWFkCi0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIHByb3ZpZGVyLmdldENvbXBvbmVudHMoY29tcG9uZW50TGlzdCwgZmFsc2UpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gRG8gYSBmaW5hbCB1cGRhdGUgb2Ygb3VyIElucHV0IGZvciB0aGUgY29tcG9uZW50IHRyZWUgdmlld2VyLgotICAgICAgICAgICAgICBmaXJlVXBkYXRlTGlzdChjb21wb25lbnRMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hUcmVlVmlld2VyKFN0cmluZyBmaWx0ZXJUZXh0KSB7Ci0gICAgICAgIGNvbXBvbmVudFRyZWVWaWV3ZXJJbnB1dC5jbGVhcigpOwotICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gcHJvdmlkZXIuZ2V0TGFiZWxQcm92aWRlcigpOwotICAgICAgICBQYXR0ZXJuIHJlZ2V4ID0gUGF0dGVybi5jb21waWxlKGZpbHRlclRleHQpOwotICAgICAgICBJdGVyYXRvciBpdCA9IG1hc3RlckNvbXBvbmVudExpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgaXRlbVN0cmluZyA9IGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChpdGVtKTsgICAgICAgICAgIAotICAgICAgICAgICAgTWF0Y2hlciBtID0gcmVnZXgubWF0Y2hlcihpdGVtU3RyaW5nLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICAgICAgaWYgKGl0ZW1TdHJpbmcudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGZpbHRlclRleHQpIHx8IG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50VHJlZVZpZXdlcklucHV0LmFkZChpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29tcG9uZW50VHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogSWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gaW4gdGhlIENvbXBvbmVudFRyZWVWaWV3ZXIsIGVuYWJsZSBPSwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbkZpbmlzaCgpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb21wb25lbnRUcmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb21wb25lbnRUcmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBjb21wb25lbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGludCBxdWFsaWZpZXJJbmRleCA9IHF1YWxpZmllckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgaWYgKHF1YWxpZmllckluZGV4IDwgMCkgewotICAgICAgICAgICAgcXVhbGlmaWVySW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIHF1YWxpZmllclRleHRTZWxlY3Rpb24gPSBxdWFsaWZpZXJMaXN0LmdldEl0ZW0ocXVhbGlmaWVySW5kZXgpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgY2xhc3MgQ29tcG9uZW50VHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChMaXN0KSBwYXJlbnRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL2NvbW1vbi9JQ29tcG9uZW50TGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvY29tbW9uL0lDb21wb25lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNWQ0NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvY29tbW9uL0lDb21wb25lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudExpc3QgewotICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KE9iamVjdCBvKTsKLSAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvY29tbW9uL0lDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvY29tbW9uL0lDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTY4MjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL2NvbW1vbi9JQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgewotICAgIAotICAgIC8vIHdhcm5pbmcgLi4uIHRoaXMgd2lsbCBnZXQgY2FsbGVkIG9uIGEgbm9uIFVJIHRocmVhZAotICAgIHZvaWQgZ2V0Q29tcG9uZW50cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBib29sZWFuIHF1aWNrKTsKLSAgICAKLQlTdHJpbmcgZ2V0VHlwZShPYmplY3QgY29tcG9uZW50KTsKLQlJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCk7Ci0JTGlzdCBnZXRRdWFsaWZpZXJzKE9iamVjdCBjb21wb25lbnQpOwotCVN0cmluZyBnZXROYW1lRmllbGRUaXRsZSgpOwotCVN0cmluZyBnZXRMaXN0VGl0bGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL3htbC9SZXNvdXJjZVZpZXcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL3htbC9SZXNvdXJjZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2MTQ0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy94bWwvUmVzb3VyY2VWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VWaWV3IHsKLS8qCi0JTGFiZWwgc2NvcGVDb21ib0xhYmVsID0gbmV3IExhYmVsKHRvcENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCXNjb3BlQ29tYm9MYWJlbC5zZXRUZXh0KHNlYXJjaFNjb3BlQ29tYm9MYWJlbCk7Ci0Jc2NvcGVDb21ibyA9IG5ldyBDb21ibyh0b3BDb21wb3NpdGUsIFNXVC5OT05FKTsKLQlpbml0aWFsaXplU2VhcmNoU2NvcGVDb21ibygpOwotCQotCXNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKHRvcENvbXBvc2l0ZSwgIFNXVC5WRVJUSUNBTCk7Ci0JR3JpZERhdGEgc2FzaEdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0Jc2FzaEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCXNhc2hHRC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0Jc2FzaEZvcm0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0Jc2FzaEZvcm0uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCQkJCWludFtdIHNhc2hGb3JtV2VpZ2h0cyA9IG5ldyBpbnRbMl07Ci0JCQlzYXNoRm9ybVdlaWdodHNbMF0gPSAwOwotCQkJc2FzaEZvcm1XZWlnaHRzWzFdID0gNzsKLQkJCXNhc2hGb3JtLnNldFdlaWdodHMoc2FzaEZvcm1XZWlnaHRzKTsKLQkKLQkvLyBDcmVhdGUgUGFnZUJvb2sgZm9yIEhpZ2ggTGV2ZWwgVHJlZVZpZXdlcgotCQkJaGlnaExldmVsUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soc2FzaEZvcm0sIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGZpbGVTeXN0ZW1QQkRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWZpbGVTeXN0ZW1QQkRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJaGlnaExldmVsUGFnZUJvb2suc2V0TGF5b3V0RGF0YShmaWxlU3lzdGVtUEJEYXRhKTsKLQkJCQotCQkJYmxhbmtIaWdoTGV2ZWxDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGhpZ2hMZXZlbFBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0JCQloaWdoTGV2ZWxDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGhpZ2hMZXZlbFBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGZpbGVTeXN0ZW1MYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJZmlsZVN5c3RlbUxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQloaWdoTGV2ZWxDb21wb3NpdGUuc2V0TGF5b3V0KGZpbGVTeXN0ZW1MYXlvdXQpOwotCQkJaGlnaExldmVsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQljcmVhdGVIaWdoTGV2ZWxUcmVlVmlld2VyKGhpZ2hMZXZlbENvbXBvc2l0ZSk7Ci0JCQlwb3B1bGF0ZUhpZ2hMZXZlbFRyZWVWaWV3ZXIoKTsKLQkJCQotCQkJaGlnaExldmVsUGFnZUJvb2suc2hvd1BhZ2UoYmxhbmtIaWdoTGV2ZWxDb21wb3NpdGUpOwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCS8vCi0JCQkKLQkJLyoKLQkJICogQ3JlYXRlcyB0aGUgSGlnaCBMZXZlbCBUcmVlVmlld2VyIChUb3AgVHJlZVZpZXdlcikuCi0JCSAqCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVIaWdoTGV2ZWxUcmVlVmlld2VyKENvbXBvc2l0ZSBiYXNlKSB7Ci0JCQloaWdoTGV2ZWxUcmVlVmlld2VyID0gY3JlYXRlVHJlZVZpZXdlcihoaWdoTGV2ZWxDb21wb3NpdGUsICJSZXNvdXJjZXMiKTsKLQkJCWluaXRpYWxpemVIaWdoTGV2ZWxUcmVlVmlld2VyKCk7Ci0JCQlTdHJpbmcgZXh0W10gPSBuZXcgU3RyaW5nWzFdOwotCQkJZXh0WzBdID0gInhzZCI7Ci0JCQlhZGRGaWx0ZXJFeHRlbnNpb25zKGhpZ2hMZXZlbFRyZWVWaWV3ZXIsIGV4dCwgbmV3IElGaWxlWzBdKTsgCi0JCQkKLQkJCWluaXRpYWxpemVIaWdoTGV2ZWxUcmVlVmlld2VyKCk7Ci0JCQlwb3B1bGF0ZUhpZ2hMZXZlbFRyZWVWaWV3ZXIoKTsKLQkJfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2hvd0hpZ2hMZXZlbFZpZXcoYm9vbGVhbiBzaG93KSB7Ci0gICAgICAgIGlmIChzaG93KSB7Ci0gICAgICAgICAgICBpbnRbXSBzYXNoRm9ybVdlaWdodHMgPSBuZXcgaW50WzJdOwotICAgICAgICAgICAgc2FzaEZvcm1XZWlnaHRzWzBdID0gNDsKLSAgICAgICAgICAgIHNhc2hGb3JtV2VpZ2h0c1sxXSA9IDU7Ci0gICAgICAgICAgICBzYXNoRm9ybS5zZXRXZWlnaHRzKHNhc2hGb3JtV2VpZ2h0cyk7Ci0KLSAgICAgICAgICAgIGhpZ2hMZXZlbFBhZ2VCb29rLnNob3dQYWdlKGhpZ2hMZXZlbENvbXBvc2l0ZSk7Ci0gICAgICAgICAgICB0b3BDb21wb3NpdGUubGF5b3V0KHRydWUsIHRydWUpOwotCi0gICAgICAgICAgICBzaG93SGlnaExldmVsVmlldygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50W10gc2FzaEZvcm1XZWlnaHRzID0gbmV3IGludFsyXTsKLSAgICAgICAgICAgIHNhc2hGb3JtV2VpZ2h0c1swXSA9IDA7Ci0gICAgICAgICAgICBzYXNoRm9ybVdlaWdodHNbMV0gPSA3OwotICAgICAgICAgICAgc2FzaEZvcm0uc2V0V2VpZ2h0cyhzYXNoRm9ybVdlaWdodHMpOwotCi0gICAgICAgICAgICBoaWdoTGV2ZWxQYWdlQm9vay5zaG93UGFnZShibGFua0hpZ2hMZXZlbENvbXBvc2l0ZSk7Ci0gICAgICAgICAgICB0b3BDb21wb3NpdGUubGF5b3V0KHRydWUsIHRydWUpOwotCi0gICAgICAgICAgICBoaWRlSGlnaExldmVsVmlldygpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldEZpbHRlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIFZpZXdlckZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgdHJlZVZpZXdlci5yZXNldEZpbHRlcnMoKTsKLSAgICAgICAgdHJlZVZpZXdlci5hZGRGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICB0cmVlVmlld2VyLmdldFRyZWUoKS5yZWRyYXcoKTsKLSAgICB9Ci0gICAgCi0gIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhbGxvd3MgZmlsdGVyaW5nIG9mIHRoZSBnaXZlbiBmaWxlCi0gICAgLy8gZXhlbnNpb25zLiBJdCBpbnRlcm5hbGx5IGNyZWF0ZXMgYSBSZXNvdXJjZUZpbHRlciBzbyB0aGF0IHVzZXJzIG9mIHRoaXMKLSAgICAvLyBjbGFzcyBkb24ndCBoYXZlIHRvIGNvbnN0cnVjdCBvbmUuCi0gICAgLy8gSWYgdGhlIGV4dGVuc2lvbnMgcHJvdmlkZWQgZG9uJ3QgaGF2ZSAnLicsIG9uZSB3aWxsIGJlIGFkZGVkLgotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoVHJlZVZpZXdlciB0cmVlVmlld2VyLCBTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zLCBJRmlsZVtdIGV4Y2x1ZGVkRmlsZXMpIHsKLSAgICAgICAgLy8gRmlyc3QgYWRkIHRoZSAnLicgdG8gdGhlIGZpbHRlckV4dGVuc2lvbnMgaWYgdGhleSBkb24ndCBhbHJlYWR5IGhhdmUKLSAgICAgICAgLy8gb25lCi0gICAgICAgIFN0cmluZ1tdIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW2ZpbHRlckV4dGVuc2lvbnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgZXh0ZW5zaW9uIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhICcuJywgdGhlbiBhZGQgb25lLgotICAgICAgICAgICAgaWYgKGZpbHRlckV4dGVuc2lvbnNbaV0uc3RhcnRzV2l0aCgiLiIpKSB7Ci0gICAgICAgICAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9IGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSAiLiIgKyBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFZpZXdlckZpbHRlciBmaWx0ZXI7Ci0gICAgICAgIGlmIChleGNsdWRlZEZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbHRlciA9IG5ldyBTZXRUeXBlUmVzb3VyY2VGaWx0ZXIoY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucywgZXhjbHVkZWRGaWxlcywgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaWx0ZXIgPSBuZXcgU2V0VHlwZVJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHNldEZpbHRlcih0cmVlVmlld2VyLCBmaWx0ZXIpOwotICAgIH0gICAgCi0gICAgCi0gICAgCi0gIAotICAgICAqIENyZWF0ZXMgYSBHZW5lcmljIFRyZWVWaWV3ZXIgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBsYWJlbCBhbmQgc2V0cwotICAgICAqIGl0J3MgR3JpZERhdGEgdmFsdWUuCi0gIAotICAgIHByb3RlY3RlZCBUcmVlVmlld2VyIGNyZWF0ZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIGNvbXAsIFN0cmluZyB0aXRsZSkgewotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQodGl0bGUpOwotCi0gICAgICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKG5ldyBUcmVlKGNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKSk7Ci0gICAgICAgIENvbnRyb2wgdHJlZVdpZGdldCA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICB0cmVlV2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIHJldHVybiB0cmVlVmlld2VyOwotICAgIH0KLSovCQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL3htbC9YTUxDb21wb25lbnRGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL3htbC9YTUxDb21wb25lbnRGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1ZDJjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy94bWwvWE1MQ29tcG9uZW50RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotCi0vKioKLSAqIHRoaXMgdGhpbmcgcGFyc2VycyB4bWwgYXJ0aWZhY3RzIGFuZCBwaWNrcyBvdXQgdGhlIHNwZWNpZmllZCBjb21wb25lbnRzIGF0dHJpYnV0ZXMKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29tcG9uZW50RmluZGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNMT1NJTkdfUFJPSkVDVF9TQ09QRSA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVJFX1dPUktTUEFDRV9TQ09QRSA9IDE7Ci0KLSAgICBwcm90ZWN0ZWQgSUZpbGUgY3VycmVudElGaWxlOwotCXByb3RlY3RlZCBMaXN0IHZhbGlkRXh0ZW5zaW9uczsJCQkvLyBMaXN0IG9mIGV4dGVuc2lvbnMgYXMgU3RyaW5nIG9iamVjdHMKLQlwcm90ZWN0ZWQgTGlzdCBleGNsdWRlRmlsZXM7CQkJLy8gTGlzdCBvZiBmaWxlcyAoZnVsbCBwYXRoKSBhcyBTdHJpbmcgb2JqZWN0cwotCi0JcHVibGljIFhNTENvbXBvbmVudEZpbmRlcigpIHsKLQkJdmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlleGNsdWRlRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotICAgIAotICAgIC8qCi0gICAgICogVGFrZXMgaW4gdGhlIElGaWxlIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZy4KLSAgICAgKiBUaGUgY3VycmVudElGaWxlIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgZ2V0RW5jbG9zaW5nUHJvamVjdEZpbGVzKCkKLSAgICAgKiBtZXRob2Qgd2lsbCByZXR1cm4gY29ycmVjdGx5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICBjdXJyZW50SUZpbGUgPSBmaWxlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZEV4dGVuc2lvbnMoTGlzdCBuZXdFeHRlbnNpb25zKSB7Ci0gICAgICAgIHZhbGlkRXh0ZW5zaW9ucy5jbGVhcigpOwotICAgICAgICB2YWxpZEV4dGVuc2lvbnMuYWRkQWxsKG5ld0V4dGVuc2lvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2x1ZGVGaWxlcyhMaXN0IG5ld0V4Y2x1ZGUpIHsKLSAgICAgICAgZXhjbHVkZUZpbGVzLmFkZEFsbChuZXdFeGNsdWRlKTsKLSAgICB9Ci0gICAgCi0vKiAgICAKLSAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9ybWFsaXplZExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgICAgICAgVVJMIHJlc29sdmVkVVJMID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpOwotICAgICAgICAgICAgbG9jYXRpb24gPSByZXNvbHZlZFVSTC5nZXRQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgIH0KLSAgKi8gICAKLQotICAgIC8qCi0gICAgICogUmV0dXJucyBhIExpc3Qgb2YgYWJzb2x1dGUgZmlsZSBsb2NhdGlvbnMuIEZvciBleGFtcGxlCi0gICAgICogIkQ6XGZpbGVzXC4uLi5cZmlsZS54c2QiCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0RW5jbG9zaW5nUHJvamVjdEZpbGVzKCkgewotICAgICAgICBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGN1cnJlbnRJRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJV29ya3NwYWNlUm9vdCBpd3IgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGN1cnJlbnRJRmlsZS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRyYXZlcnNlSUNvbnRhaW5lcihwcm9qZWN0LCB2YWxpZEV4dGVuc2lvbnMsIGV4Y2x1ZGVGaWxlcywgZmlsZXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmlsZXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0V29ya3NwYWNlRmlsZXMoKSB7Ci0gICAgICAgIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IGl3ciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBpd3IuZ2V0UHJvamVjdHMoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHByb2plY3RzLmxlbmd0aDsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgIHRyYXZlcnNlSUNvbnRhaW5lcihwcm9qZWN0c1tpbmRleF0sIHZhbGlkRXh0ZW5zaW9ucywgZXhjbHVkZUZpbGVzLCBmaWxlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBMaXN0IG9mIGFic29sdXRlIGZpbGUgbG9jYXRpb25zLiBGb3IgZXhhbXBsZQotICAgICAqICJEOlxmaWxlc1wuLi4uXGZpbGUueHNkIgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRyYXZlcnNlSUNvbnRhaW5lcihJQ29udGFpbmVyIGNvbnRhaW5lciwgTGlzdCBleHRlbnNpb25zLCBMaXN0IGV4Y2x1ZGVGaWxlcywgTGlzdCBsaXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSVJlc291cmNlW10gY2hpbGRyZW4gPSBjb250YWluZXIubWVtYmVycygpOwotCi0gICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbltpbmRleF0gaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgdHJhdmVyc2VJQ29udGFpbmVyKChJRm9sZGVyKSBjaGlsZHJlbltpbmRleF0sIGV4dGVuc2lvbnMsIGV4Y2x1ZGVGaWxlcywgbGlzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuW2luZGV4XSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgY2hpbGRyZW5baW5kZXhdOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGV4dCA9IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zLmNvbnRhaW5zKGV4dCkgJiYgIWV4Y2x1ZGVGaWxlcy5jb250YWlucyhmaWxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoZmlsZS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy94bWwvWE1MQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy94bWwvWE1MQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOWQ5NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveG1sL1hNTENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMuY29tbW9uLkNvbXBvbmVudFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMuY29tbW9uLklDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sLlhNTENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyLlhNTENvbXBvbmVudFRyZWVPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cgewotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9OQU1FX0ZJRUxEX1RJVExFID0gIkNvbXBvbmVudCBOYW1lOiI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9MSVNUX1RJVExFID0gIk1hdGNoaW5nIENvbXBvbmVudHM6IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX1NQRUNJRklFRF9GSUxFID0gIlNwZWNpZmllZCBGaWxlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX0VOQ0xPU0lOR19QUk9KRUNUID0gIkVuY2xvc2luZyBQcm9qZWN0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX1dPUktTUEFDRSA9ICJXb3Jrc3BhY2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfQ1VSUkVOVF9SRVNPVVJDRSA9ICJDdXJyZW50IFJlc291cmNlIjsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRTZWFyY2hTY29wZSA9IFNDT1BFX0NVUlJFTlRfUkVTT1VSQ0U7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNob29zZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uW10gcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uWzNdOwotCi0JcHVibGljIFhNTENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJSUNvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKHNoZWxsLCBkaWFsb2dUaXRsZSwgcHJvdmlkZXIpOwotCX0KLQotcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgc2V0RmlsdGVyTGFiZWwocHJvdmlkZXIuZ2V0TmFtZUZpZWxkVGl0bGUoKSAhPSBudWxsID8gcHJvdmlkZXIuZ2V0TmFtZUZpZWxkVGl0bGUoKSA6IERFRkFVTFRfTkFNRV9GSUVMRF9USVRMRSk7ICAgICAgICAgCi0gICAgICAgIHNldENvbXBvbmVudFRyZWVMYWJlbChwcm92aWRlci5nZXRMaXN0VGl0bGUoKSAhPSBudWxsID8gcHJvdmlkZXIuZ2V0TGlzdFRpdGxlKCkgOiBERUZBVUxUX0xJU1RfVElUTEUpOwotICAgICAgICBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgIAotICAgICAgICAvLyBXZSB1c2UgdGhlIENvbXBvc2l0ZSB0b3BDb21wb3NpdGUgdG8gY3JlYXRlIGFkZGl0aW9uYWwgd2lkZ2V0cwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChib3R0b21Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICAvL2dyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICAvL2dyaWRMYXlvdXQubWFyZ2luTGVmdCA9IDI7Ci0gICAgICAgIGdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGdyb3VwLnNldFRleHQoIlNlYXJjaCBTY29wZSIpOwotICAgICAgICAKLSAgICAgICAgU2NvcGVDaGFuZ2VMaXN0ZW5lciBzY29wZUNoYW5nZUxpc3RlbmVyID0gbmV3IFNjb3BlQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICAgICAgcmFkaW9CdXR0b25bMF0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOyAgICAgICAKLSAgICAgICAgcmFkaW9CdXR0b25bMF0uc2V0VGV4dChTQ09QRV9XT1JLU1BBQ0UpOwotICAgICAgICAKLSAgICAgICAgcmFkaW9CdXR0b25bMV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICByYWRpb0J1dHRvblsxXS5zZXRUZXh0KFNDT1BFX0VOQ0xPU0lOR19QUk9KRUNUKTsKLSAgICAgICAgCi0gICAgICAgIHJhZGlvQnV0dG9uWzJdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLSAgICAgICAgcmFkaW9CdXR0b25bMl0uc2V0VGV4dChTQ09QRV9DVVJSRU5UX1JFU09VUkNFKTsKLSAgICAgICAgCi0gICAgICAgIC8vcmFkaW9CdXR0b25bM10gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICAvL3JhZGlvQnV0dG9uWzNdLnNldFRleHQoIlJlc291cmNlIFNldCIpOwotCi0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvQnV0dG9uLmxlbmd0aDsgaSsrKQotICAgICAgICB7ICAgICAgICAgIAkKLSAgICAgICAgICBpZiAocmFkaW9CdXR0b25baV0uZ2V0VGV4dCgpLmVxdWFscyhjdXJyZW50U2VhcmNoU2NvcGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAJcmFkaW9CdXR0b25baV0uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIH0JCi0gICAgICAgICAgcmFkaW9CdXR0b25baV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2NvcGVDaGFuZ2VMaXN0ZW5lcik7ICAgICAgICAJCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhbHNlKXsKLSAgICAgICAgQ29tcG9zaXRlIHNlbGVjdEZpbGVHcm91cCA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBzZWxlY3RGaWxlR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dDMgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7ICAgICAgIAotICAgICAgICBncmlkTGF5b3V0My5tYXJnaW5XaWR0aCA9IDA7ICAgIAotICAgICAgICBncmlkTGF5b3V0My5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBzZWxlY3RGaWxlR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQzKTsKLSAgICAgICAgVGV4dCB0ID0gbmV3IFRleHQoc2VsZWN0RmlsZUdyb3VwLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIEJ1dHRvbiBjaG9vc2UgPSBuZXcgQnV0dG9uKHNlbGVjdEZpbGVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBjaG9vc2Uuc2V0VGV4dCgiQ2hvb3NlLi4uIik7Ci0gICAgICAgIGNob29zZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzY29wZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEJ1dHRvbiBjaGVjayA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGNoZWNrLnNldFRleHQoIlVzZSByZXNvdXJjZSB2aWV3IHRvIG5hcnJvdyBzZWFyY2ggc2NvcGUiKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBjaGVjay5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgY2hlY2suc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9CS8qCi0JCSAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBzZWFyY2ggc2NvcGUuCi0JCSAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlYXJjaFNjb3BlKCkgewotCQlyZXR1cm4gY3VycmVudFNlYXJjaFNjb3BlOwotCX0KLQotCXB1YmxpYyBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJWE1MQ29tcG9uZW50VHJlZU9iamVjdCB0cmVlT2JqZWN0ID0gKFhNTENvbXBvbmVudFRyZWVPYmplY3QpIGNvbXBvbmVudFNlbGVjdGlvbjsKLQkJTGlzdCBzcGVjcyA9IHRyZWVPYmplY3QuZ2V0WE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpOwotCi0JCWludCBtYXRjaGluZ0luZGV4ID0gMDsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNwZWNzLnNpemUoKTsgaW5kZXgrKykgewotCQkJWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjID0gKFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24pIHNwZWNzCi0JCQkJCS5nZXQoaW5kZXgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHNwZWMuZ2V0RmlsZUxvY2F0aW9uKCkpOwotCQkJU3RyaW5nIHNwZWNUZXh0ID0gc3BlYy5nZXRUYXJnZXROYW1lc3BhY2UoKSArICIgLSAiCi0JCQkJCSsgcGF0aC5sYXN0U2VnbWVudCgpOwotCQkJaWYgKHNwZWNUZXh0LmVxdWFscyhxdWFsaWZpZXJUZXh0U2VsZWN0aW9uKSkgewotCQkJCW1hdGNoaW5nSW5kZXggPSBpbmRleDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgc3BlY3MuZ2V0KG1hdGNoaW5nSW5kZXgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgU2NvcGVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIEJ1dHRvbikgewotCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0JCQkJaWYgKChiLmdldFN0eWxlKCkgJiBTV1QuUkFESU8pICE9IDApIHsKLQkJCQkJY3VycmVudFNlYXJjaFNjb3BlID0gYi5nZXRUZXh0KCk7Ci0JCQkJCXBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdCgpOwotCQkJCQlyZWZyZXNoVHJlZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0KLQkJCQkJLy8gU2VsZWN0IHRoZSBmaXJzdCBtYXRjaGluZyBjb21wb25lbnQuIFRob3VnaCB3ZSBzaG91bGQgYmUKLQkJCQkJLy8gc21hcnRlciBoZXJlCi0JCQkJCS8vIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgd2FzIGEgc2VsZWN0aW9uIGJlZm9yZSB0aGUgc2NvcGUKLQkJCQkJLy8gc3dpdGNoIChhbmQgaWYKLQkJCQkJLy8gdGhlIGNvbXBvbmVudCBpcyBzdGlsbCBhdmFpbGFibGUuCi0JCQkJCVRyZWUgdHJlZSA9IGNvbXBvbmVudFRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotCQkJCQlUcmVlSXRlbSBpdGVtc1tdID0gdHJlZS5nZXRJdGVtcygpOwotCQkJCQlpZiAoaXRlbXMubGVuZ3RoID4gMCkgewotCQkJCQkJVHJlZUl0ZW0gc2VsZWN0W10gPSBuZXcgVHJlZUl0ZW1bMV07Ci0JCQkJCQlzZWxlY3RbMF0gPSBpdGVtc1swXTsKLQkJCQkJCXRyZWUuc2V0U2VsZWN0aW9uKHNlbGVjdCk7Ci0JCQkJCX0KLQotCQkJCQl1cGRhdGVDYW5GaW5pc2goKTsKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveG1sL1hNTENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy94bWwvWE1MQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmMGEwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy94bWwvWE1MQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54bWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMuY29tbW9uLklDb21wb25lbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5jb21tb24uSUNvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgewotICAgIHB1YmxpYyBMaXN0IGdldFF1YWxpZmllcnMoT2JqZWN0IGNvbXBvbmVudCkgewotICAgICAgICBMaXN0IHF1YWxpZmllcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgWE1MQ29tcG9uZW50VHJlZU9iamVjdCBzcGVjaWZpY2F0aW9uID0gKFhNTENvbXBvbmVudFRyZWVPYmplY3QpIGNvbXBvbmVudDsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gc3BlY2lmaWNhdGlvbi5nZXRYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSAoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIHF1YWxpZmllcnMuYWRkKGNyZWF0ZVF1YWxpZmllclRleHQoc3BlYykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcXVhbGlmaWVyczsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVRdWFsaWZpZXJUZXh0KFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoc3BlYy5nZXRGaWxlTG9jYXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBzcGVjLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIiAtICIgKyBwYXRoLmxhc3RTZWdtZW50KCk7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRGF0YUl0ZW1Ub1RyZWVOb2RlKElDb21wb25lbnRMaXN0IGNvbXBzLCBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIGRhdGFJdGVtKSB7Ci0gICAgICAgIGJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotICAgICAgICBJdGVyYXRvciBpdCA9IGNvbXBzLml0ZXJhdG9yKCk7Ci0gICAgICAgIFhNTENvbXBvbmVudFRyZWVPYmplY3QgY29udGFpbmluZ1RyZWVPYmplY3QgPSBudWxsOwotCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFRyZWVPYmplY3QgdHJlZU9iamVjdCA9IChYTUxDb21wb25lbnRUcmVlT2JqZWN0KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodHJlZU9iamVjdC5nZXROYW1lKCkuZXF1YWxzKGRhdGFJdGVtLmdldEF0dHJpYnV0ZUluZm8oIm5hbWUiKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZXhpc3RpbmcgZGF0YSBpdGVtIGFuZCB0aGUgbmV3IGRhdGEgaXRlbSBoYXZlIHRoZSBzYW1lIG5hbWVzCi0gICAgICAgICAgICAgICAgaWYgKHRyZWVPYmplY3QuZ2V0WE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4aXN0aW5nUGF0aCA9ICgoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgdHJlZU9iamVjdC5nZXRYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKCkuZ2V0KDApKS5nZXRUYWdQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1BhdGguZXF1YWxzKGRhdGFJdGVtLmdldFRhZ1BhdGgoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXkgYXJlIHRoZSBzYW1lICd0eXBlJyBvZiBpdGVtcyAoYWNjb3JkaW5nIHRvIHRoZSBwYXRoIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ1RyZWVPYmplY3QgPSB0cmVlT2JqZWN0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFmb3VuZE1hdGNoKSB7Ci0gICAgICAgICAgICBjb250YWluaW5nVHJlZU9iamVjdCA9IG5ldyBYTUxDb21wb25lbnRUcmVlT2JqZWN0KGRhdGFJdGVtKTsKLSAgICAgICAgICAgIGNvbXBzLmFkZENvbXBvbmVudChjb250YWluaW5nVHJlZU9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBPbmx5IGFkZCB0byB0aGUgdHJlZSBvYmplY3QgaWYgdGhlIHF1YWxpZmllciB0ZXh0IGRpZmZlcnMgdGhhbiBleGlzdGluZwotICAgICAgICAgICAgLy8gcXVhbGlmaWVyIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgdHJlZSBvYmplY3QuCi0gICAgICAgICAgICBJdGVyYXRvciBleGlzdGluZ1F1YWxpZmllcnMgPSBnZXRRdWFsaWZpZXJzKGNvbnRhaW5pbmdUcmVlT2JqZWN0KS5pdGVyYXRvcigpOwotICAgICAgICAgICAgYm9vbGVhbiBhbHJlYWR5RXhpc3RzID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoZXhpc3RpbmdRdWFsaWZpZXJzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBleGlzdGluZ1RleHQgPSAoU3RyaW5nKSBleGlzdGluZ1F1YWxpZmllcnMubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdJdGVtVGV4dCA9IGNyZWF0ZVF1YWxpZmllclRleHQoZGF0YUl0ZW0pOwotICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1RleHQuZXF1YWxzKG5ld0l0ZW1UZXh0KSkgewotICAgICAgICAgICAgICAgICAgICBhbHJlYWR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHsKLSAgICAgICAgICAgICAgICBjb250YWluaW5nVHJlZU9iamVjdC5hZGRYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKGRhdGFJdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vcm1hbGl6ZWRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgIFVSTCByZXNvbHZlZFVSTCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKTsKLSAgICAgICAgICAgIGxvY2F0aW9uID0gcmVzb2x2ZWRVUkwuZ2V0UGF0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAKLSAgICAvKgotICAgICAqIE9iamVjdCB1c2VkIHRvIGhvbGQgY29tcG9uZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudCBxdWFsaWZpZXJzLgotICAgICAqIFRoaXMgb2JqZWN0IHdpbGwgY29udGFpbiBhIGxpc3Qgb2YgWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbnMgKHdpdGggdGhlIHNhbWUKLSAgICAgKiBuYW1lcyBidXQgZGlmZmVyZW50IHF1YWxpZmllcnMpLgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBYTUxDb21wb25lbnRUcmVlT2JqZWN0IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBMaXN0IHhtbENvbXBvbmVudFNwZWNpZmljYXRpb25zOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFhNTENvbXBvbmVudFRyZWVPYmplY3QoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjKSB7Ci0gICAgICAgICAgICB4bWxDb21wb25lbnRTcGVjaWZpY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHhtbENvbXBvbmVudFNwZWNpZmljYXRpb25zLmFkZChzcGVjKTsKLSAgICAgICAgICAgIG5hbWUgPSAoU3RyaW5nKSBzcGVjLmdldEF0dHJpYnV0ZUluZm8oIm5hbWUiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24oWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjKSB7Ci0gICAgICAgICAgICB4bWxDb21wb25lbnRTcGVjaWZpY2F0aW9ucy5hZGQoc3BlYyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBMaXN0IGdldFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4geG1sQ29tcG9uZW50U3BlY2lmaWNhdGlvbnM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFVzZWQgdG8gcHJvdmlkZSBsYWJlbHMgdG8gdGhlIENvbXBvbmVudFNlbGV0aW9uRGlhbG9nCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFhNTENvbXBvbmVudFNlbGVjdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBYTUxDb21wb25lbnRUcmVlT2JqZWN0IHNwZWNpZmljYXRpb24gPSAoWE1MQ29tcG9uZW50VHJlZU9iamVjdCkgZWxlbWVudDsKLSAgICAgICAgICAgIHJldHVybiBzcGVjaWZpY2F0aW9uLmdldE5hbWUoKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveG1sL1hNTENvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL3htbC9YTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YzI1NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveG1sL1hNTENvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qCi0gKiBTaW1wbGUgY2xhc3Mgd2hpY2gga2VlcHMgdHJhY2sgb2YgYXR0cmlidXRlIGluZm9ybWF0aW9uLgotICogVGhpcyBjbGFzcyBpcyBiYXNpY2FsbHkgYSBIYXNodGFibGUgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiB7Ci0gICAgU3RyaW5nIHRhZ1BhdGg7Ci0gICAgSGFzaHRhYmxlIGhhc2h0YWJsZTsKLSAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICAgIFN0cmluZyBmaWxlTG9jYXRpb247Ci0gICAgCi0gICAgcHVibGljIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24oU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgdGhpcy50YWdQYXRoID0gcGF0aDsKLSAgICAgICAgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGVJbmZvKE9iamVjdCBhdHRyaWJ1dGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBoYXNodGFibGUucHV0KGF0dHJpYnV0ZSwgdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZUluZm8oT2JqZWN0IGF0dHJpYnV0ZSkgewotICAgICAgICByZXR1cm4gaGFzaHRhYmxlLmdldChhdHRyaWJ1dGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhZ1BhdGgoKSB7Ci0gICAgICAgIHJldHVybiB0YWdQYXRoOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0bnMpIHsKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gdG5zOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVMb2NhdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICBmaWxlTG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveG1sL1hNTFF1aWNrU2Nhbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveG1sL1hNTFF1aWNrU2Nhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2VmZWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL3htbC9YTUxRdWlja1NjYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxRdWlja1NjYW4gewotICAKLQkvKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgbWF0Y2hlcyBlbmNvdW50ZXJlZAotICAgICAqIGJhc2VkIG9uIHRoZSBjcml0ZXJpYSBwcm92aWRlZC4gCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUYWdJbmZvKFN0cmluZyBmdWxsRmlsZVBhdGgsIExpc3QgcGF0aHMsIExpc3QgYXR0cmlidXRlcykgewotICAgIFhTREdsb2JhbEVsZW1lbnRUeXBlQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYU0RHbG9iYWxFbGVtZW50VHlwZUNvbnRlbnRIYW5kbGVyKCk7Ci0gICAgaGFuZGxlci5zdHJpbmdUYWdQYXRocyA9IHBhdGhzOwotICAgIGhhbmRsZXIuc2VhcmNoQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgaGFuZGxlci5maWxlTG9jYXRpb24gPSBmdWxsRmlsZVBhdGg7Ci0KLSAgICBDbGFzc0xvYWRlciBwcmV2Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgIAotICAgIHRyeSB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChmdWxsRmlsZVBhdGgpOwotICAgIAlGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKSk7Ci0gICAgCQotICAgICAgICAKLS8vICAgICAgU0FYUGFyc2VyICBzcGFyc2VyID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpOwotLy8gICAgICBYTUxSZWFkZXIgcmVhZGVyID0gc3BhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIExpbmUgYmVsb3cgaXMgYSBoYWNrIHRvIGdldCBYTUxSZWFkZXIgd29ya2luZwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihYTUxRdWlja1NjYW4uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc2Zvcm1lckZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgCi0gICAgCVhNTFJlYWRlciByZWFkZXIgPSBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7Ci0gICAgCXJlYWRlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgICAJcmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgZmluYWxseSB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2Q2xhc3NMb2FkZXIpOwotICAgIH0KLSAgICByZXR1cm4gaGFuZGxlci5nZXRTZWFyY2hBdHRyaWJ1dGVWYWx1ZXMoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RHbG9iYWxFbGVtZW50VHlwZUNvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotICAJcHJvdGVjdGVkIExpc3Qgc3RyaW5nVGFnUGF0aHM7Ci0gIAlwcm90ZWN0ZWQgTGlzdCBzZWFyY2hBdHRyaWJ1dGVzOwotICAJcHJpdmF0ZSBMaXN0IG1hdGNoaW5nVGFncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCXByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOwotICAJcHJpdmF0ZSBTdHJpbmcgZmlsZUxvY2F0aW9uOwotCi0gIAlTdHJpbmdCdWZmZXIgY3VycmVudFBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gIAkKLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAJY3VycmVudFBhdGguYXBwZW5kKCIvIiArIGxvY2FsTmFtZSk7Ci0gICAgCQotICAgIAkvLyBTZWFyY2ggZm9yIHRhcmdldE5hbWVzcGFjZSBpZiB3ZSBoYXZlbid0IGVuY291bnRlcmVkIGl0IHlldC4KLSAgICAJaWYgKHRhcmdldE5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0JICAgICAgICBpbnQgbkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cmlidXRlczsgaSsrKQotCSAgICAgICAgewotCSAgICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSkuZXF1YWxzKCJ0YXJnZXROYW1lc3BhY2UiKSkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0JICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLSAgICAJfQotICAgIAkKLSAgICAJLy8gU2VhcmNoIGZvciB0aGUgcGF0aAotICAgIAlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc3RyaW5nVGFnUGF0aHMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIHN0cmluZ1RhZ1BhdGhzLmdldChpbmRleCk7Ci0gICAgCQlpZiAoY3VycmVudFBhdGgubGVuZ3RoKCkgPT0gcGF0aC5sZW5ndGgoKSAmJiBjdXJyZW50UGF0aC50b1N0cmluZygpLmVxdWFscyhwYXRoKSkgewotICAgIAkJCS8vIEZvdW5kIGEgcGF0aCBtYXRjaAotICAgIAkJCWNyZWF0ZVRhZ0luZm8oYXR0cmlidXRlcywgKFN0cmluZ1tdKSBzZWFyY2hBdHRyaWJ1dGVzLmdldChpbmRleCkpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAJaW50IHNsYXNoSW5kZXggPSBjdXJyZW50UGF0aC5sYXN0SW5kZXhPZigiLyIpOwotICAgIAljdXJyZW50UGF0aC5kZWxldGUoc2xhc2hJbmRleCwgY3VycmVudFBhdGgubGVuZ3RoKCkpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIEluZm9ybWF0aW9uIGFib3V0IGEgdGFnIGlzIHN0b3JlZCBpbiBhIFRhZ0luZm8gY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhZ0luZm8oQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBTdHJpbmdbXSBhdHRyaWJ1dGVzVG9TZWFyY2gpIHsKLSAgICAJWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjID0gbmV3IFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24oY3VycmVudFBhdGgudG9TdHJpbmcoKSk7Ci0gICAgCQotLy8gICAgCXRhZ0luZm8uYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKSk7Ci0gICAgCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhdHRyaWJ1dGVzVG9TZWFyY2gubGVuZ3RoOyBpbmRleCsrKSB7Ci0gICAgCQlTdHJpbmcgYXR0clN0cmluZyA9IChTdHJpbmcpIGF0dHJpYnV0ZXNUb1NlYXJjaFtpbmRleF07Ci0gICAgCQlTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGF0dHJTdHJpbmcpOwotICAgIAkJaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAJCQlzcGVjLmFkZEF0dHJpYnV0ZUluZm8oYXR0clN0cmluZywgdmFsdWUpOwotICAgIAkJfQotICAgIAl9Ci0gICAgCXNwZWMuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgCXNwZWMuc2V0RmlsZUxvY2F0aW9uKGZpbGVMb2NhdGlvbik7Ci0gICAgCW1hdGNoaW5nVGFncy5hZGQoc3BlYyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldEF0dHJpYnV0ZU5hbWVJbmRleChTdHJpbmcgYXR0ck5hbWUpIHsKLSAgICAJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNlYXJjaEF0dHJpYnV0ZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgCQlpZiAoc2VhcmNoQXR0cmlidXRlcy5nZXQoaW5kZXgpLmVxdWFscyhhdHRyTmFtZSkpIHsKLSAgICAJCQlyZXR1cm4gaW5kZXg7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJCi0gICAgCS8vIE5vdCBmb3VuZC4gIFdlIGFyZSBub3QgbG9va2luZyBmb3IgdGhpcyBBdHRyaWJ1dGUgTmFtZQotICAgIAlyZXR1cm4gLTE7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgTGlzdCBnZXRTZWFyY2hBdHRyaWJ1dGVWYWx1ZXMoKSB7Ci0gICAgCXJldHVybiBtYXRjaGluZ1RhZ3M7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveHNkL1hTRENvbXBvbmVudEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveHNkL1hTRENvbXBvbmVudEZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjlmYzdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL3hzZC9YU0RDb21wb25lbnRGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxRdWlja1NjYW47Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb21wb25lbnRGaW5kZXIgZXh0ZW5kcyBYTUxDb21wb25lbnRGaW5kZXIgeyAgICAKLSAgICBwdWJsaWMgWFNEQ29tcG9uZW50RmluZGVyKCkgewotICAgICAgICB2YWxpZEV4dGVuc2lvbnMuYWRkKCJ4c2QiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3QgZ2V0V29ya2JlbmNoUmVzb3VyY2VDb21wb25lbnRzKGludCBzY29wZSkgewotICAgICAgICBMaXN0IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIExpc3QgZmlsZVBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBzZWFyY2ggdGhyb3VnaCB0aGUgY3VycmVudCBmaWxlIHdlJ3JlIHdvcmtpbmcgb24uCi0gICAgICAgIGlmIChjdXJyZW50SUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZXhjbHVkZUZpbGVzLmFkZChjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBGaW5kIGZpbGVzIG1hdGNoaW5nIHRoZSBzZWFyY2ggY3JpdGVyaWEgc3BlY2lmaWVkIGluIExpc3QgZXh0ZW5zaW9ucyBhbmQKLSAgICAgICAgLy8gTGlzdCBleGNsdWRlRmlsZXMuCi0gICAgICAgIHN3aXRjaCAoc2NvcGUpIHsKLSAgICAgICAgY2FzZSBFTkNMT1NJTkdfUFJPSkVDVF9TQ09QRToKLSAgICAgICAgICAgIGZpbGVQYXRocyA9IGdldEVuY2xvc2luZ1Byb2plY3RGaWxlcygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgY2FzZSBFTlRJUkVfV09SS1NQQUNFX1NDT1BFOgotICAgICAgICAgICAgZmlsZVBhdGhzID0gZ2V0V29ya3NwYWNlRmlsZXMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgY29tcG9uZW50cyBpbiBlYWNoIG9mIHRoZSBmaWxlcyBzcGVjaWZpZWQgaW4gdGhlIHBhdGguCi0gICAgICAgIExpc3QgcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHBhdGhzLmFkZCgiL3NjaGVtYS9jb21wbGV4VHlwZSIpOwotICAgICAgICBwYXRocy5hZGQoIi9zY2hlbWEvc2ltcGxlVHlwZSIpOwotICAgICAgICAKLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmdbXSBuYW1lQXR0ciA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICAgIG5hbWVBdHRyWzBdID0gIm5hbWUiOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZChuYW1lQXR0cik7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5hbWVBdHRyKTsKLQotICAgICAgICBJdGVyYXRvciBwYXRoc0l0ZXJhdG9yID0gZmlsZVBhdGhzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChwYXRoc0l0ZXJhdG9yLmhhc05leHQoKSkgewotLy8gICAgICAgICAgIFN0cmluZyBzdHJpbmdQYXRoID0gKChQYXRoKSBwYXRoc0l0ZXJhdG9yLm5leHQoKSkudG9PU1N0cmluZygpOwotICAgICAgICAgICBTdHJpbmcgc3RyaW5nUGF0aCA9ICgoUGF0aCkgcGF0aHNJdGVyYXRvci5uZXh0KCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgIGNvbXBvbmVudHMuYWRkQWxsKFhNTFF1aWNrU2Nhbi5nZXRUYWdJbmZvKHN0cmluZ1BhdGgsIHBhdGhzLCBhdHRyaWJ1dGVzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjb21wb25lbnRzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL3hzZC9YU0RDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL3hzZC9YU0RDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2ZTEzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy94c2QvWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54c2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMuY29tbW9uLklDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sLlhNTENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZzsKLQotcHVibGljIGNsYXNzIFhTRENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIFhNTENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFID0gMjsKLQkKLQlwdWJsaWMgWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsCi0JCQlJQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIoc2hlbGwsIGRpYWxvZ1RpdGxlLCBwcm92aWRlcik7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveHNkL1hTRENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy94c2QvWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExNzQ0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy94c2QvWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54c2Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5jb21tb24uSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sLlhNTENvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNESW1wb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLS8qCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBYU0RDb21wb25lbnRGaW5kZXIgeHNkQ29tcG9uZW50RmluZGVyOwotICAgIHByaXZhdGUgWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIGRpYWxvZzsKLSAgICBwcml2YXRlIFhTRFNjaGVtYSBzY2hlbWE7Ci0gICAgcHJpdmF0ZSBYU0RDb21wb25lbnRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3dDb21wbGV4VHlwZXMgPSB0cnVlOwotICAgIAotICAgIC8qCi0gICAgICogVGFrZXMgaW4gdGhlIElGaWxlIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIoSUZpbGUgZmlsZSwgWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgICB4c2RDb21wb25lbnRGaW5kZXIgPSBuZXcgWFNEQ29tcG9uZW50RmluZGVyKCk7Ci0gICAgICAgIHhzZENvbXBvbmVudEZpbmRlci5zZXRGaWxlKGZpbGUpOwotICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICAgICAgbGFiZWxQcm92aWRlciA9IG5ldyBYU0RDb21wb25lbnRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZyhYU0RDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nKSB7Ci0gICAgICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzaG93Q29tcGxleFR5cGVzKGJvb2xlYW4gc2hvdykgewotICAgICAgICBzaG93Q29tcGxleFR5cGVzID0gc2hvdzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAgICAgCi0gICAgLyoKLSAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgTGlzdCBvZiBYTUxDb21wb25lbnRUcmVlT2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBnZXRDb21wb25lbnRzKElDb21wb25lbnRMaXN0IGxpc3QsIGJvb2xlYW4gcXVpY2spIHsKLQkgICAgaWYgKHF1aWNrKSB7Ci0gICAgICAgICAgICAvLyBQb3B1bGF0ZSBJQ29tcG9uZW50TGlzdCBsaXN0IHdpdGggY29tcG9uZW50cyBtb3N0IGVhc2lseSBhY2Nlc3NpYmxlIChmYXN0ZXN0KQotICAgICAgICAgICAgLy8gR3JhYiBCdWlsdC1JbiB0eXBlcwotICAgICAgICAgICAgSXRlcmF0b3IgYnVpbHRJbkl0ID0gZ2V0QnVpbHRJblR5cGVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChidWlsdEluSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiB0YWdJdGVtID0gKFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24pIGJ1aWx0SW5JdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYWRkRGF0YUl0ZW1Ub1RyZWVOb2RlKGxpc3QsIHRhZ0l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgY3VycmVudCBTY2hlbWEncyBjb21wbGV4IGFuZCBzaW1wbGUgdHlwZXMKLSAgICAgICAgICAgIGNyZWF0ZUNvbXBsZXhUeXBlcyhsaXN0KTsKLSAgICAgICAgICAgIGNyZWF0ZVNpbXBsZVR5cGVzKGxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZ2V0Q29tcG9uZW50cyhsaXN0KTsKLSAgICAgICAgfQotCX0KLSAgICAKLSAgICAvKgotICAgICAqIFRPRE86IE5lZWQgdG8gcmV2aXNpdCBob3cgd2UgYnVpbGQgdXAgb3VyIHRyZWVPYmplY3QgbGlzdC4uLi4gCi0gICAgICogQW5kIGl0J3Mgc29tZXdoYXQgbWVzc3ksIGNsZWFuIHRoaXMgdXAuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdldENvbXBvbmVudHMoSUNvbXBvbmVudExpc3QgbGlzdCkgewotICAgICAgICBMaXN0IGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGV4dGVuc2lvbnMuYWRkKCJ4c2QiKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzY29wZSA9ICIiOwotICAgICAgICBpZiAoZGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNjb3BlID0gZGlhbG9nLmdldFNlYXJjaFNjb3BlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIExpc3QgY29tcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChzY29wZS5lcXVhbHMoWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nLlNDT1BFX0VOQ0xPU0lOR19QUk9KRUNUKSkgewotICAgICAgICAgICAgY29tcHMgPSB4c2RDb21wb25lbnRGaW5kZXIuZ2V0V29ya2JlbmNoUmVzb3VyY2VDb21wb25lbnRzKFhNTENvbXBvbmVudEZpbmRlci5FTkNMT1NJTkdfUFJPSkVDVF9TQ09QRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2NvcGUuZXF1YWxzKFhTRENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5TQ09QRV9XT1JLU1BBQ0UpKSB7Ci0gICAgICAgICAgICBjb21wcyA9IHhzZENvbXBvbmVudEZpbmRlci5nZXRXb3JrYmVuY2hSZXNvdXJjZUNvbXBvbmVudHMoWE1MQ29tcG9uZW50RmluZGVyLkVOVElSRV9XT1JLU1BBQ0VfU0NPUEUpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotLy8gICAgICBHcm91cCBzYW1lIGl0ZW0gdHlwZXMgdG9nZXRoZXIgKHNpbXBsZS9jb21wbGV4KQotICAgICAgICBMaXN0IGNvbXBsZXggPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIExpc3Qgc2ltcGxlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdGVtc0l0ZXJhdG9yID0gY29tcHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZW1zSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIHRhZ0l0ZW0gPSAoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgaXRlbXNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGFnSXRlbS5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvc2NoZW1hL2NvbXBsZXhUeXBlIikpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV4LmFkZCh0YWdJdGVtKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGVsc2UgaWYgKHRhZ0l0ZW0uZ2V0VGFnUGF0aCgpLmVxdWFscygiL3NjaGVtYS9zaW1wbGVUeXBlIikpIHsKLSAgICAgICAgICAgICAgICBzaW1wbGUuYWRkKHRhZ0l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBjb21wbGV4SXQgPSBjb21wbGV4Lml0ZXJhdG9yKCk7Ci0gICAgICAgIEl0ZXJhdG9yIHNpbXBsZUl0ID0gc2ltcGxlLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmIChzaG93Q29tcGxleFR5cGVzKSB7Ci0gICAgICAgICAgICB3aGlsZSAoY29tcGxleEl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gaXRlbSA9IChYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBjb21wbGV4SXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGFkZERhdGFJdGVtVG9UcmVlTm9kZShsaXN0LCBpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgd2hpbGUgKHNpbXBsZUl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBpdGVtID0gKFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24pIHNpbXBsZUl0Lm5leHQoKTsKLSAgICAgICAgICAgIGFkZERhdGFJdGVtVG9UcmVlTm9kZShsaXN0LCBpdGVtKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGZyb20gaW1wb3J0cywgaW5jbHVkZXMsIGFuZCByZWRlZmluZXMKLSAgICAgICAgY3JlYXRlRnJvbUltcG9ydChsaXN0KTsKLSAgICAgICAgY3JlYXRlRnJvbUluY2x1ZGUobGlzdCk7Ci0gICAgICAgIGNyZWF0ZUZyb21SZWRlZmluZShsaXN0KTsKLSAgICB9Ci0gICAgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAKLSAgICBwcml2YXRlIExpc3QgZ2V0QnVpbHRJblR5cGVzKCkgeyAgICAgICAgCi0gICAgICAgIExpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgWFNERE9NSGVscGVyLmRhdGFUeXBlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgaXRlbXMuYWRkKFhTRERPTUhlbHBlci5kYXRhVHlwZVtpXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOwotICAgICAgICAKLSAgICAgICAgTGlzdCBidWlsdEluQ29tcG9uZW50U3BlY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGl0ZW1TdHJpbmcgPSBpdGVtLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gYnVpbHRJblR5cGVJdGVtID0gbmV3IFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24oIkJVSUxUX0lOX1NJTVBMRV9UWVBFIik7Ci0gICAgICAgICAgICBidWlsdEluVHlwZUl0ZW0uYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIGl0ZW1TdHJpbmcpOwotICAgICAgICAgICAgYnVpbHRJblR5cGVJdGVtLnNldFRhcmdldE5hbWVzcGFjZShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotLy8gICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oc2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotLy8gICAgICAgICAgICBidWlsdEluVHlwZUl0ZW0uc2V0RmlsZUxvY2F0aW9uKG5vcm1hbGl6ZWRGaWxlKTsKLSAgICAgICAgICAgIGJ1aWx0SW5UeXBlSXRlbS5zZXRGaWxlTG9jYXRpb24oIkJ1aWx0LUluIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJ1aWx0SW5Db21wb25lbnRTcGVjcy5hZGQoYnVpbHRJblR5cGVJdGVtKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1aWx0SW5Db21wb25lbnRTcGVjczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29tcGxleFR5cGVzKElDb21wb25lbnRMaXN0IHRyZWVPYmplY3RMaXN0KSB7Ci0gICAgICAgIFR5cGVzSGVscGVyIHR5cGVzSGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHNjaGVtYSk7Ci0gICAgICAgIExpc3QgY29tcGxleFR5cGVzID0gdHlwZXNIZWxwZXIuZ2V0VXNlckNvbXBsZXhUeXBlcygpOwotICAgICAgICBjcmVhdGVDb21wbGV4U2ltcGxlVHJlZU9iamVjdCh0cmVlT2JqZWN0TGlzdCwgY29tcGxleFR5cGVzLCB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNpbXBsZVR5cGVzKElDb21wb25lbnRMaXN0IHRyZWVPYmplY3RMaXN0KSB7Ci0gICAgICAgIFR5cGVzSGVscGVyIHR5cGVzSGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHNjaGVtYSk7Ci0gICAgICAgIExpc3QgY29tcGxleFR5cGVzID0gdHlwZXNIZWxwZXIuZ2V0VXNlclNpbXBsZVR5cGVzKCk7Ci0gICAgICAgIGNyZWF0ZUNvbXBsZXhTaW1wbGVUcmVlT2JqZWN0KHRyZWVPYmplY3RMaXN0LCBjb21wbGV4VHlwZXMsIHRydWUpOwotICAgIH0KLQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVGcm9tSW1wb3J0KElDb21wb25lbnRMaXN0IHRyZWVPYmplY3RMaXN0KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGltcG9ydHMgPSBnZXRYU0RJbXBvcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGltcG9ydHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBYU0RJbXBvcnQgaW1wb3J0SXRlbSA9IChYU0RJbXBvcnQpIGltcG9ydHMubmV4dCgpOwotICAgICAgICAgICAgaWYgKGltcG9ydEl0ZW0uZ2V0U2NoZW1hTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgKChYU0RJbXBvcnRJbXBsKSBpbXBvcnRJdGVtKS5pbXBvcnRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoaW1wb3J0SXRlbS5nZXRSZXNvbHZlZFNjaGVtYSgpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMaXN0IHR5cGVzID0gaGVscGVyLmdldFVzZXJDb21wbGV4VHlwZXMoKTsKLSAgICAgICAgICAgICAgICB0eXBlcy5hZGRBbGwoaGVscGVyLmdldFVzZXJTaW1wbGVUeXBlcygpKTsKLSAgICAgICAgICAgICAgICBjcmVhdGVDb21wbGV4U2ltcGxlVHJlZU9iamVjdCh0cmVlT2JqZWN0TGlzdCwgdHlwZXMsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUZyb21JbmNsdWRlKElDb21wb25lbnRMaXN0IHRyZWVPYmplY3RMaXN0KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGltcG9ydHMgPSBnZXRYU0RJbmNsdWRlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbXBvcnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgWFNESW5jbHVkZSBpbmNsdWRlSXRlbSA9IChYU0RJbmNsdWRlKSBpbXBvcnRzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChpbmNsdWRlSXRlbS5nZXRTY2hlbWFMb2NhdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoaW5jbHVkZUl0ZW0uZ2V0UmVzb2x2ZWRTY2hlbWEoKSk7ICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMaXN0IHR5cGVzID0gaGVscGVyLmdldFVzZXJDb21wbGV4VHlwZXMoKTsKLSAgICAgICAgICAgICAgICB0eXBlcy5hZGRBbGwoaGVscGVyLmdldFVzZXJTaW1wbGVUeXBlcygpKTsKLSAgICAgICAgICAgICAgICBjcmVhdGVDb21wbGV4U2ltcGxlVHJlZU9iamVjdCh0cmVlT2JqZWN0TGlzdCwgdHlwZXMsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRnJvbVJlZGVmaW5lKElDb21wb25lbnRMaXN0IHRyZWVPYmplY3RMaXN0KSB7Ci0gICAgICAgIEl0ZXJhdG9yIHJlZGVmaW5lcyA9IGdldFhTRFJlZGVmaW5lcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChyZWRlZmluZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBYU0RSZWRlZmluZSByZWRlZmluZUl0ZW0gPSAoWFNEUmVkZWZpbmUpIHJlZGVmaW5lcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocmVkZWZpbmVJdGVtLmdldFNjaGVtYUxvY2F0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihyZWRlZmluZUl0ZW0uZ2V0UmVzb2x2ZWRTY2hlbWEoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTGlzdCB0eXBlcyA9IGhlbHBlci5nZXRVc2VyQ29tcGxleFR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgdHlwZXMuYWRkQWxsKGhlbHBlci5nZXRVc2VyU2ltcGxlVHlwZXMoKSk7Ci0gICAgICAgICAgICAgICAgY3JlYXRlQ29tcGxleFNpbXBsZVRyZWVPYmplY3QodHJlZU9iamVjdExpc3QsIHR5cGVzLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgICAgIHByb3RlY3RlZCBMaXN0IGdldFhTREltcG9ydHMoKSB7Ci0gICAgICAgIExpc3QgaW1wb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0KSB7Ci0gICAgICAgICAgICAgICAgaW1wb3J0cy5hZGQoY29udGVudCk7ICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW1wb3J0czsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0WFNESW5jbHVkZXMoKSB7Ci0gICAgICAgIExpc3QgaW5jbHVkZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBjb250ZW50cyA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChjb250ZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFhTRFNjaGVtYUNvbnRlbnQgY29udGVudCA9IChYU0RTY2hlbWFDb250ZW50KSBjb250ZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREluY2x1ZGUpIHsKLSAgICAgICAgICAgICAgICBpbmNsdWRlcy5hZGQoY29udGVudCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBpbmNsdWRlczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRYU0RSZWRlZmluZXMoKSB7Ci0gICAgICAgIExpc3QgaW5jbHVkZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBjb250ZW50cyA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChjb250ZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFhTRFNjaGVtYUNvbnRlbnQgY29udGVudCA9IChYU0RTY2hlbWFDb250ZW50KSBjb250ZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKSB7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZXMuYWRkKGNvbnRlbnQpOyAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW5jbHVkZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBsZXhTaW1wbGVUcmVlT2JqZWN0KElDb21wb25lbnRMaXN0IHRyZWVPYmplY3RMaXN0LCBMaXN0IGNvbXBsZXhUeXBlcywgYm9vbGVhbiBzYW1lTlMpIHsKLSAgICAgICAgYm9vbGVhbiBwcm9jZWVkID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGxleFR5cGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBpdGVtID0gKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wbGV4VHlwZXMuZ2V0KGkpOyAKLSAgICAgICAgCi0gICAgICAgICAgICBpZiAoc2FtZU5TKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG8gdGhpcyBjaGVjayBiZWNhdXNlIFR5cGVzIGZyb20gSW5jbHVkZXMgbWlnaHQgc2hvdyB1cC4gIEhvd2V2ZXIsIHdlIGRvbid0IHdhbnQgdG8gc2hvdyB0aGVtCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1Mb2NhdGlvbiA9IGl0ZW0uZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFNjaGVtYUxvY2F0aW9uID0gc2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1Mb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2NlZWQgPSBpdGVtTG9jYXRpb24uZXF1YWxzKGN1cnJlbnRTY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9jZWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocHJvY2VlZCkgewotICAgICAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gdHlwZUl0ZW0gPSAgbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoc2hvd0NvbXBsZXhUeXBlcyAmJiBpdGVtIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVJdGVtID0gbmV3IFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24oIi9zY2hlbWEvY29tcGxleFR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUl0ZW0uYWRkQXR0cmlidXRlSW5mbygibmFtZSIsICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBpdGVtKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUl0ZW0gPSBuZXcgWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbigiL3NjaGVtYS9zaW1wbGVUeXBlIik7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVJdGVtLmFkZEF0dHJpYnV0ZUluZm8oIm5hbWUiLCAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpdGVtKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodHlwZUl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0eXBlSXRlbS5zZXRUYXJnZXROYW1lc3BhY2UoaXRlbS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBub3JtYWxpemVkRmlsZSA9IGdldE5vcm1hbGl6ZWRMb2NhdGlvbihzY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVJdGVtLnNldEZpbGVMb2NhdGlvbihub3JtYWxpemVkRmlsZSk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGFkZERhdGFJdGVtVG9UcmVlTm9kZSh0cmVlT2JqZWN0TGlzdCwgdHlwZUl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIAotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0KLSAgICAKLSAgICBwdWJsaWMgY2xhc3MgWFNEQ29tcG9uZW50TGFiZWxQcm92aWRlciBleHRlbmRzIFhNTENvbXBvbmVudFNlbGVjdGlvbkxhYmVsUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFRyZWVPYmplY3Qgc3BlY2lmaWNhdGlvbiA9IChYTUxDb21wb25lbnRUcmVlT2JqZWN0KSBlbGVtZW50OwotICAgICAgICAgICAgWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjID0gKFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24pIHNwZWNpZmljYXRpb24uZ2V0WE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpLmdldCgwKTsKLSAgICAgICAgICAgIGlmIChzcGVjLmdldFRhZ1BhdGgoKS5lcXVhbHMoIi9zY2hlbWEvY29tcGxleFR5cGUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRENvbXBsZXhUeXBlLmdpZiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvc2NoZW1hL3NpbXBsZVR5cGUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzcGVjLmdldFRhZ1BhdGgoKS5lcXVhbHMoIkJVSUxUX0lOX1NJTVBMRV9UWVBFIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RUaXRsZSgpIHsKLQkJcmV0dXJuICJNYXRjaGluZyBUeXBlczoiOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUZpZWxkVGl0bGUoKSB7Ci0JCXJldHVybiAiVHlwZSBOYW1lOiI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveHNkL1hTRFNldFR5cGVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL3hzZC9YU0RTZXRUeXBlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjA5N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMveHNkL1hTRFNldFR5cGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54c2Q7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkNyZWF0ZUVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkRPTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sLlhNTENvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5kZWxldGUuWFNERXh0ZXJuYWxGaWxlQ2xlYW51cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFBhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIFhTRFNldFR5cGVIZWxwZXIgewotICAgIHByaXZhdGUgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgICBwcml2YXRlIElGaWxlIGN1cnJlbnRJRmlsZTsKLSAgICAKLSAgICBwdWJsaWMgWFNEU2V0VHlwZUhlbHBlcihJRmlsZSBpRmlsZSwgWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgICBjdXJyZW50SUZpbGUgPSBpRmlsZTsKLSAgICAgICAgeHNkU2NoZW1hID0gc2NoZW1hOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBhZGRJbXBvcnRJZk5lY2Vzc2FyeShlbGVtZW50LCBzcGVjKTsgICAgICAgIAotICAgICAgICBTdHJpbmcgdHlwZU9iamVjdCA9IGdldFByZWZpeGVkVHlwZU5hbWUoc3BlYyk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIHByZXZpb3VzIHR5cGUgLS0+IHByZXZpb3VzU3RyaW5nVHlwZQotICAgICAgICBTdHJpbmcgcHJldmlvdXNTdHJpbmdUeXBlID0gIiI7Ci0gICAgICAgIEF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShwcm9wZXJ0eSk7Ci0gICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3BlYyAhPSBudWxsICYmIHNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscygiKiphbm9ueW1vdXMqKiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCJBTk9OWU1PVVNfU0lNUExFX1RZUEUiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNTdHJpbmdUeXBlLmVxdWFscygiKiphbm9ueW1vdXMqKiIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHVwZGF0ZUVsZW1lbnRUb0Fub255bW91cyhlbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNTdHJpbmdUeXBlLmVxdWFscygiKiphbm9ueW1vdXMqKiIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHVwZGF0ZUVsZW1lbnRUb0Fub255bW91cyhlbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAvLyBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRERPTUhlbHBlci51cGRhdGVFbGVtZW50VG9Ob3RBbm9ueW1vdXMoZWxlbWVudCk7Ci0gICAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCB0eXBlT2JqZWN0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShwcm9wZXJ0eSwgdHlwZU9iamVjdC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnRJZk5lY2Vzc2FyeShFbGVtZW50IGVsZW1lbnQsIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBTdHJpbmcgdHlwZU9iamVjdCA9ICIiOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBuZXcgdHlwZSAtLT4gdHlwZU9iamVjdAotICAgICAgICBpZiAoc3BlYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaXRlbVR5cGUgPSBzcGVjLmdldFRhZ1BhdGgoKTsKLSAgICAgICAgICAgIHR5cGVPYmplY3QgPSAoU3RyaW5nKSBzcGVjLmdldEF0dHJpYnV0ZUluZm8oIm5hbWUiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFpdGVtVHlwZS5lcXVhbHMoIkJVSUxUX0lOX1NJTVBMRV9UWVBFIikpIHsKLSAgICAgICAgICAgICAgICAvLyBEbyBhbiBhY3R1YWwgaW1wb3J0IGlmIG5lZWRlZAotICAgICAgICAgICAgICAgIFhTRFBhcnNlciBwYXJzZXIgPSBuZXcgWFNEUGFyc2VyKCk7Ci0gICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHNwZWMuZ2V0RmlsZUxvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBwYXJzZXIuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRucyA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0eXBlIGlzIGRlZmluZWQgaW4gdGhlICdjdXJyZW50JyBmaWxlIGl0c2VsZi4KLSAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oeHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIElQYXRoIGN1cnJlbnRGaWxlUGF0aCA9IG5ldyBQYXRoKGN1cnJlbnRGaWxlKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpbGVQYXRoLmVxdWFscyhuZXcgUGF0aChzcGVjLmdldEZpbGVMb2NhdGlvbigpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykgewotICAgICAgICAgICAgICAgICAgICBpZiAodG5zLmVxdWFscyh4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2NoZW1hIGlzIGluIGEgcmVkZWZpbmUvaW5jbHVkZQotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBleGlzdGluZ0xpc3QgPSBnZXRYU0RJbmNsdWRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdMaXN0LmFkZEFsbChnZXRYU0RSZWRlZmluZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGV4aXN0aW5nTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBleGlzdGluZ1NjaGVtYSA9IChYU0RTY2hlbWFEaXJlY3RpdmUpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oZXhpc3RpbmdTY2hlbWEuZ2V0UmVzb2x2ZWRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZFNwZWMgPSBzcGVjLmdldEZpbGVMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkRmlsZS5lcXVhbHMobm9ybWFsaXplZFNwZWMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIGFuZCBleGlzdGluZyBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2NoZW1hIGlzIGluIGEgaW1wb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGV4aXN0aW5nTGlzdCA9IGdldFhTREltcG9ydHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gZXhpc3RpbmdMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hRGlyZWN0aXZlIGV4aXN0aW5nU2NoZW1hID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBub3JtYWxpemVkRmlsZSA9IGdldE5vcm1hbGl6ZWRMb2NhdGlvbihleGlzdGluZ1NjaGVtYS5nZXRSZXNvbHZlZFNjaGVtYSgpLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBub3JtYWxpemVkU3BlYyA9IHNwZWMuZ2V0RmlsZUxvY2F0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZEZpbGUuZXF1YWxzKG5vcm1hbGl6ZWRTcGVjKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCBhbmQgZXhpc3Rpbmcgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvSW1wb3J0KHNwZWMuZ2V0RmlsZUxvY2F0aW9uKCksIHNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBwcmVmaXhlZCB0eXBlIG5hbWUgZm9yIHRoZSB0eXBlIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4KLSAgICAgKiBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIG9iamVjdC4KLSAgICAgKiBJZiB0aGUgdHlwZSBkZXNjcmliZWQgaXMgYSBCdWlsdC1pbiB0eXBlLCBkbyBub3QgYWRkIHRoZSBwcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeGVkVHlwZU5hbWUoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjKSB7Ci0gICAgICAgIFN0cmluZyB0eXBlT2JqZWN0ID0gKFN0cmluZykgc3BlYy5nZXRBdHRyaWJ1dGVJbmZvKCJuYW1lIik7Ci0gICAgICAgIAotICAgICAgICBUeXBlc0hlbHBlciB0eXBlc0hlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOyAvLyA/Pz8/IElzIHRoaXMgY29ycmVjdD8KLSAgICAgICAgTGlzdCBwcmVmaXhlZE5hbWVzID0gdHlwZXNIZWxwZXIuZ2V0UHJlZml4ZWROYW1lcyhzcGVjLmdldFRhcmdldE5hbWVzcGFjZSgpLCB0eXBlT2JqZWN0KTsKLSAgICAgICAgaWYgKHByZWZpeGVkTmFtZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgLy8gR3JhYiB0aGUgZmlyc3QgcHJlZml4ZWQgbmFtZQotICAgICAgICAgICAgdHlwZU9iamVjdCA9IChTdHJpbmcpIHByZWZpeGVkTmFtZXMuZ2V0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHR5cGVPYmplY3Q7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVFbGVtZW50VG9Bbm9ueW1vdXMoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgeHNkVHlwZSkgewotICAgICAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgICAgcHJlZml4ID0gKHByZWZpeCA9PSBudWxsKSA/ICIiIDogKHByZWZpeCArICI6Iik7Ci0gICAgICAgIFhTRERPTUhlbHBlci51cGRhdGVFbGVtZW50VG9Ob3RBbm9ueW1vdXMoZWxlbWVudCk7Ci0gICAgICAgIGJvb2xlYW4gaGFzQ2hpbGRyZW5FbGVtZW50cyA9IGhhc0VsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLSAgICAgICAgRWxlbWVudCBjaGlsZE5vZGUgPSBudWxsOwotICAgICAgICBpZiAoeHNkVHlwZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKSkgewotICAgICAgICAgICAgY2hpbGROb2RlID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgcHJlZml4ICsgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh4c2RUeXBlLmVxdWFscyhYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRykpIHsKLSAgICAgICAgICAgIGNoaWxkTm9kZSA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIHByZWZpeCArIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBYU0RET01IZWxwZXIgaGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgICAgICAgTm9kZSBhbm5vdGF0aW9uTm9kZSA9IGhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25Ob2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBOb2RlIGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50Lmluc2VydEJlZm9yZShjaGlsZE5vZGUsIGZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBOb2RlIG5leHRTaWJsaW5nID0gYW5ub3RhdGlvbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50Lmluc2VydEJlZm9yZShjaGlsZE5vZGUsIG5leHRTaWJsaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhTRERPTUhlbHBlci5mb3JtYXRDaGlsZChjaGlsZE5vZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0VsZW1lbnRDaGlsZHJlbihOb2RlIHBhcmVudE5vZGUpIHsKLSAgICAgICAgYm9vbGVhbiBoYXNDaGlsZHJlbkVsZW1lbnRzID0gZmFsc2U7Ci0gICAgICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLSAgICAgICAgICAgIE5vZGVMaXN0IG5vZGVzID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobm9kZXMuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW5FbGVtZW50cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzQ2hpbGRyZW5FbGVtZW50czsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBXZSBzaG91bGRuJ3QgbmVlZCB0byBwYXNzIGluIElQYXRoIGV4dGVybmFsU2NoZW1hUGF0aC4KLSAgICBwcml2YXRlIHZvaWQgZG9JbXBvcnQoU3RyaW5nIGV4dGVybmFsU2NoZW1hUGF0aCwgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hKSB7Ci0gICAgICAgIC8vIERldGVybWluZSBzY2hlbWFMb2NhdGlvbgotICAgICAgICBTdHJpbmcgbG9jYXRpb25BdHRyaWJ1dGUgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZXh0ZXJuYWxTY2hlbWFQYXRoLCBjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0luY2x1ZGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKGV4dGVybmFsU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyh4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICBpc0luY2x1ZGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZXh0ZXJuYWxTY2hlbWEgIT0gbnVsbCkgeyAvLyBJbiBjYXNlIHdlIGhhdmUgcHJvYmxlbXMgbG9hZGluZyB0aGUgZmlsZS4uLi4gd2Ugc2hvdWxkIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICBFbGVtZW50IG5ld0VsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGlzSW5jbHVkZSkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5TQ0hFTUFMT0NBVElPTl9BVFRSSUJVVEUsIGxvY2F0aW9uQXR0cmlidXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFhTRENvbnN0YW50cy5JTkNMVURFX0VMRU1FTlRfVEFHLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWlzSW5jbHVkZSkgewotICAgICAgICAgICAgICAgICAgICBMaXN0IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUsIGV4dGVybmFsU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSwgbG9jYXRpb25BdHRyaWJ1dGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoWFNEQ29uc3RhbnRzLklNUE9SVF9FTEVNRU5UX1RBRywgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUltcG9ydE5TKG5ld0VsZW1lbnQsIGV4dGVybmFsU2NoZW1hKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlSW1wb3J0TlMoRWxlbWVudCBpbXBvcnRFbGVtZW50LCBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEpIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGV4dGVybmFsU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIG5hbWVzcGFjZSA9ICIiOwotCi0gICAgICAgIFhTREltcG9ydCB4c2RJbXBvcnQgPSAoWFNESW1wb3J0KSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChpbXBvcnRFbGVtZW50KTsKLSAgICAgICAgeHNkSW1wb3J0LnNldFJlc29sdmVkU2NoZW1hKGV4dGVybmFsU2NoZW1hKTsKLSAgICAgICAgCi0gICAgICAgIGphdmEudXRpbC5NYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkIEltcG9ydCBNYXAgaXMgIiArIG1hcC52YWx1ZXMoKSk7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkIGltcG9ydCBNYXAga2V5cyBhcmUgIiArIG1hcC5rZXlTZXQoKSk7Ci0KLSAgICAgICAgLy8gUmVmZXJlbnRpYWwgaW50ZWdyaXR5IG9uIG9sZCBpbXBvcnQKLSAgICAgICAgLy8gSG93IGNhbiB3ZSBiZSBzdXJlIHRoYXQgaWYgdGhlIG5ld2xvY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGRsb2NhdGlvbgotICAgICAgICAvLyB0aGUgZmlsZSBoYXNuJ3QgY2hhbmdlZAotICAgICAgICAKLSAgICAgICAgWFNEU2NoZW1hIHJlZmVyZW5jZWRTY2hlbWEgPSB4c2RJbXBvcnQuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgICAgaWYgKHJlZmVyZW5jZWRTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTREV4dGVybmFsRmlsZUNsZWFudXAgY2xlYW5IZWxwZXIgPSBuZXcgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cChyZWZlcmVuY2VkU2NoZW1hKTsKLSAgICAgICAgICBjbGVhbkhlbHBlci52aXNpdFNjaGVtYSh4c2RTY2hlbWEpOwotICAgICAgICB9Ci0KLSAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIHhtbG5zIGluIHRoZSBzY2hlbWEgZWxlbWVudCBmaXJzdCwgYW5kIHRoZW4gdXBkYXRlIHRoZSBpbXBvcnQgZWxlbWVudCBuZXh0Ci0gICAgICAgIC8vIHNvIHRoYXQgdGhlIGxhc3QgY2hhbmdlIHdpbGwgYmUgaW4gdGhlIGltcG9ydCBlbGVtZW50LiAgVGhpcyBrZWVwcyB0aGUgc2VsZWN0aW9uCi0gICAgICAgIC8vIG9uIHRoZSBpbXBvcnQgZWxlbWVudAotICAgICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoZXh0ZXJuYWxTY2hlbWEpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gaGVscGVyLmdldFByZWZpeChuYW1lc3BhY2UsIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkocHJlZml4KSkKLSAgICAgICAgewotICAgICAgICAgIHByZWZpeCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwgfHwgKHByZWZpeCAhPW51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIG5ld1ByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIoInByZWYiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpbnQgcHJlZml4RXh0ZW5zaW9uID0gMTsKLSAgICAgICAgICB3aGlsZSAobWFwLmNvbnRhaW5zS2V5KG5ld1ByZWZpeC50b1N0cmluZygpKSAmJiBwcmVmaXhFeHRlbnNpb24gPCAxMDApCi0gICAgICAgICAgewotICAgICAgICAgICAgbmV3UHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigicHJlZiIgKyBTdHJpbmcudmFsdWVPZihwcmVmaXhFeHRlbnNpb24pKTsKLSAgICAgICAgICAgIHByZWZpeEV4dGVuc2lvbisrOwotICAgICAgICAgIH0KLSAgICAgICAgICBwcmVmaXggPSBuZXdQcmVmaXgudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaWYgbnMgYWxyZWFkeSBpbiBtYXAsIHVzZSBpdHMgY29ycmVzcG9uZGluZyBwcmVmaXgKLSAgICAgICAgICBpZiAobWFwLmNvbnRhaW5zVmFsdWUobmFtZXNwYWNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlc0hlbHBlciB0eXBlc0hlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgICAgICAgcHJlZml4ID0gdHlwZXNIZWxwZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIC8vIG90aGVyd2lzZSBhZGQgdG8gdGhlIG1hcAotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiK3ByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkIEltcG9ydCBNYXAgaXMgIiArIG1hcC52YWx1ZXMoKSk7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkIGltcG9ydCBNYXAga2V5cyBhcmUgIiArIG1hcC5rZXlTZXQoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBlbGVtZW50VGFnLCBMaXN0IGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgTm9kZSByZWxhdGl2ZU5vZGUgPSBYU0RET01IZWxwZXIuZ2V0TmV4dEVsZW1lbnROb2RlKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgCi0gICAgICAgIENyZWF0ZUVsZW1lbnRBY3Rpb24gYWN0aW9uID0gbmV3IENyZWF0ZUVsZW1lbnRBY3Rpb24oIiIpOwotICAgICAgICBhY3Rpb24uc2V0RWxlbWVudFRhZyhlbGVtZW50VGFnKTsKLSAgICAgICAgYWN0aW9uLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0gICAgICAgIGFjdGlvbi5zZXRQYXJlbnROb2RlKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgICAgICBhY3Rpb24uc2V0UmVsYXRpdmVOb2RlKHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgIGFjdGlvbi5zZXRYU0RTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgICAgcmV0dXJuIGFjdGlvbi5jcmVhdGVBbmRBZGROZXdDaGlsZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3JtYWxpemVkTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0gICAgICAgICAgICBVUkwgcmVzb2x2ZWRVUkwgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCk7Ci0gICAgICAgICAgICBsb2NhdGlvbiA9IHJlc29sdmVkVVJMLmdldFBhdGgoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsb2NhdGlvbjsgCi0gICAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0IGdldFhTREltcG9ydHMoKSB7Ci0gICAgICAgIExpc3QgaW1wb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0geHNkU2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0KSB7Ci0gICAgICAgICAgICAgICAgaW1wb3J0cy5hZGQoY29udGVudCk7ICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW1wb3J0czsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0IGdldFhTREluY2x1ZGVzKCkgewotICAgICAgICBMaXN0IGluY2x1ZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgSXRlcmF0b3IgY29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoY29udGVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgY29udGVudHMubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbmNsdWRlKSB7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZXMuYWRkKGNvbnRlbnQpOyAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW5jbHVkZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IGdldFhTRFJlZGVmaW5lcygpIHsKLSAgICAgICAgTGlzdCBpbmNsdWRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0geHNkU2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpIHsKLSAgICAgICAgICAgICAgICBpbmNsdWRlcy5hZGQoY29udGVudCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBpbmNsdWRlczsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZG5kL0Jhc2VEcmFnTm9kZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZG5kL0Jhc2VEcmFnTm9kZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmQ0ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RuZC9CYXNlRHJhZ05vZGVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZURyYWdOb2Rlc0NvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQmFzZURyYWdOb2Rlc0NvbW1hbmQuCi0gICAqIEBwYXJhbSB0YXJnZXQKLSAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAqIEBwYXJhbSBvcGVyYXRpb25zCi0gICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICogQHBhcmFtIHNvdXJjZXMKLSAgICovCi0gIHB1YmxpYyBCYXNlRHJhZ05vZGVzQ29tbWFuZCgKLSAgICBPYmplY3QgdGFyZ2V0LAotICAgIGZsb2F0IGxvY2F0aW9uLAotICAgIGludCBvcGVyYXRpb25zLAotICAgIGludCBvcGVyYXRpb24sCi0gICAgQ29sbGVjdGlvbiBzb3VyY2VzKQotICB7Ci0gICAgc3VwZXIodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2VzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzRGlyZWN0U2NoZW1hQ2hpbGQoTm9kZSBub2RlKQotICB7Ci0gICAgTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRywgZmFsc2UpICYmCi0gICAgICAgIHBhcmVudC5nZXRQYXJlbnROb2RlKCkuZXF1YWxzKHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gCi0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpYmxpbmdOb2RlcyhOb2RlIGZpcnN0LCBOb2RlIHNlY29uZCkKLSAgewotICAgIGlmIChmaXJzdC5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmlyc3QuZ2V0UGFyZW50Tm9kZSgpLmVxdWFscyhzZWNvbmQuZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBiZWdpblJlY29yZGluZygpCi0gIHsKLSAgICBpZiAodGFyZ2V0ICE9IG51bGwpCi0gICAgewotICAgICAgWE1MTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgoTm9kZSl0YXJnZXQpOwotICAgICAgCi0gICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgIk1vdmUiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGVuZFJlY29yZGluZygpCi0gIHsKLSAgICBpZiAodGFyZ2V0ICE9IG51bGwpCi0gICAgewotICAgICAgWE1MTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgoTm9kZSl0YXJnZXQpOwotICAgICAgCi0gICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotICAgICAgfQotICAgIH0KLSAgfQotICBwcm90ZWN0ZWQgWE1MTW9kZWwgZ2V0TW9kZWwoTm9kZSBub2RlKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEb2N1bWVudEltcGwpCi0gICAgewotICAgICAgcmV0dXJuICgoRG9jdW1lbnRJbXBsKSBvYmplY3QpLmdldE1vZGVsKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBtb3ZlTm9kZShOb2RlIHJlZmVyZW5jZU5vZGUsIE5vZGUgbm9kZVRvTW92ZSwgYm9vbGVhbiBpc0JlZm9yZSkKLSAgewotICAgIFhTRERPTUhlbHBlci5tb3ZlTm9kZShyZWZlcmVuY2VOb2RlLCBub2RlVG9Nb3ZlLCBpc0JlZm9yZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kbmQvRHJhZ05vZGVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNjkyY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdC5Ob2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBEcmFnTm9kZXNDb21tYW5kIGV4dGVuZHMgQmFzZURyYWdOb2Rlc0NvbW1hbmQKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBEcmFnTm9kZXNDb21tYW5kLgotICAgKiBAcGFyYW0gdGFyZ2V0Ci0gICAqIEBwYXJhbSBsb2NhdGlvbgotICAgKiBAcGFyYW0gb3BlcmF0aW9ucwotICAgKiBAcGFyYW0gb3BlcmF0aW9uCi0gICAqIEBwYXJhbSBzb3VyY2VzCi0gICAqLwotICBwdWJsaWMgRHJhZ05vZGVzQ29tbWFuZCgKLSAgICBPYmplY3QgdGFyZ2V0LAotICAgIGZsb2F0IGxvY2F0aW9uLAotICAgIGludCBvcGVyYXRpb25zLAotICAgIGludCBvcGVyYXRpb24sCi0gICAgQ29sbGVjdGlvbiBzb3VyY2VzKQotICB7Ci0gICAgc3VwZXIodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2VzKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZG5kLkRyYWdBbmREcm9wQ29tbWFuZCNjYW5FeGVjdXRlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKQotICB7Ci0gICAgaWYgKHNvdXJjZXMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBOb2RlIGZpcnN0U291cmNlID0gKE5vZGUpIHNvdXJjZXMudG9BcnJheSgpWzBdOwotICAgICAgcmV0dXJuIGlzU2libGluZ05vZGVzKChOb2RlKSB0YXJnZXQsIGZpcnN0U291cmNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotLy8gICAgcmV0dXJuIGlzRGlyZWN0U2NoZW1hQ2hpbGQoKE5vZGUpdGFyZ2V0KTsKLSAgfQotCi0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmRuZC5EcmFnQW5kRHJvcENvbW1hbmQjZXhlY3V0ZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAJTm9kZUZvcm1hdHRlciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotICAgIE5vZGUgcmVmZXJlbmNlTm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLSAgICBiZWdpblJlY29yZGluZygpOwotCi0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSAKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0gICAgICBpZiAoaXNTaWJsaW5nTm9kZXMocmVmZXJlbmNlTm9kZSxub2RlKSkgCi0gICAgICB7Ci0gICAgICAgIG1vdmVOb2RlKHJlZmVyZW5jZU5vZGUsIG5vZGUsICFpc0FmdGVyKCkpOwotICAgICAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0KChYTUxOb2RlKW5vZGUpOwotICAgICAgfQotICAgIH0KLS8vICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXQoKFhNTE5vZGUpcmVmZXJlbmNlTm9kZS5nZXRQYXJlbnROb2RlKCkpOwotICAgIGVuZFJlY29yZGluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZG5kL1hTRERyYWdBbmREcm9wTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RuZC9YU0REcmFnQW5kRHJvcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwYzY0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZG5kL1hTRERyYWdBbmREcm9wTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5kbmQuRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZG5kLkRyYWdBbmREcm9wTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWFNERHJhZ0FuZERyb3BNYW5hZ2VyIGltcGxlbWVudHMgRHJhZ0FuZERyb3BNYW5hZ2VyCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgWFNERHJhZ0FuZERyb3BNYW5hZ2VyLgotICAgKi8KLSAgcHVibGljIFhTRERyYWdBbmREcm9wTWFuYWdlcigpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEaXJlY3RTY2hlbWFDaGlsZChOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkgJiYKLSAgICAgICAgcGFyZW50LmdldFBhcmVudE5vZGUoKS5lcXVhbHMocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfSAKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmRuZC5EcmFnQW5kRHJvcE1hbmFnZXIjY3JlYXRlQ29tbWFuZChPYmplY3QsIGZsb2F0LCBpbnQsIGludCwgQ29sbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQgY3JlYXRlQ29tbWFuZCgKLSAgICBPYmplY3QgdGFyZ2V0LAotICAgIGZsb2F0IGxvY2F0aW9uLAotICAgIGludCBvcGVyYXRpb25zLAotICAgIGludCBvcGVyYXRpb24sCi0gICAgQ29sbGVjdGlvbiBzb3VyY2UpCi0gIHsKLSAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgCi0gICAgewotICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLS8vICAgICAgaWYgKGlzRGlyZWN0U2NoZW1hQ2hpbGQobm9kZSkpCi0vLyAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEcmFnTm9kZXNDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLS8vICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwYXJ0cy9BYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwYXJ0cy9BYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWVmMzk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cGFydHMvQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyTGF5b3V0OwotICAgICAgICAgICAgICAKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCAKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9QTEFDRV9IT0xERVIgPSAiTUVTU0FHRV9QTEFDRV9IT0xERVIiOwotICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OyAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIHJlZnJlc2hDaGlsZHJlbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIFBhbmVsIHBhbmVsID0gbmV3IFBhbmVsKCk7Ci0gICAgQ29udGFpbmVyTGF5b3V0IGxheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKTsKLSAgICBsYXlvdXQuc2V0Qm9yZGVyKDYwKTsKLSAgICBwYW5lbC5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0gICAgcmV0dXJuIHBhbmVsOwotICB9ICAgCi0gICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSAKLSAgeyAgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChpbnB1dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChNRVNTQUdFX1BMQUNFX0hPTERFUik7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9ICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCk7Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7ICAKLSAgfSAgICAgICAgICAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9Db25uZWN0ZWRFZGl0UGFydEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1ZjY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9Db25uZWN0ZWRFZGl0UGFydEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLSAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUgZXh0ZW5kcyBDb250YWluZXJGaWd1cmUgaW1wbGVtZW50cyBJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUKLXsgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNoaWxkQ29ubmVjdGlvbnNFbmFibGVkID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIExpc3QgY29ubmVjdGVkRmlndXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIGludCBjb25uZWN0aW9uVHlwZSA9IFJJR0hUX0NPTk5FQ1RJT047Ci0gICAgCi0gIHB1YmxpYyBDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZShFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHRoaXMuZWRpdFBhcnQgPSBlZGl0UGFydDsgICAgCi0gIH0gICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldENoaWxkQ29ubmVjdGlvbnNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotICAgIGNoaWxkQ29ubmVjdGlvbnNFbmFibGVkID0gZW5hYmxlZDsKLSAgfSAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGdldFBhcmVudEdyYXBoTm9kZUZpZ3VyZSgpCi0gIHsKLSAgICBJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudEVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7IHBhcmVudEVkaXRQYXJ0ICE9IG51bGw7IHBhcmVudEVkaXRQYXJ0ID0gcGFyZW50RWRpdFBhcnQuZ2V0UGFyZW50KCkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBJRmlndXJlIGZpZ3VyZSA9ICgoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClwYXJlbnRFZGl0UGFydCkuZ2V0RmlndXJlKCk7ICAgIAotICAgICAgaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIElDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGdyYXBoTm9kZUZpZ3VyZSA9IChJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUpZmlndXJlOwotICAgICAgICBpZiAoZ3JhcGhOb2RlRmlndXJlLmdldENvbm5lY3Rpb25GaWd1cmUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gZ3JhcGhOb2RlRmlndXJlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgIAotICAgIH0gICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZE5vdGlmeSgpICAgICAgICAgICAgICAgICAgICAgCi0gIHsgICAgICAgICAgIAotICAgIHN1cGVyLmFkZE5vdGlmeSgpOwotICAgIGlmIChnZXRDb25uZWN0aW9uRmlndXJlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUgcGFyZW50R3JhcGhOb2RlRmlndXJlID0gZ2V0UGFyZW50R3JhcGhOb2RlRmlndXJlKCk7Ci0gICAgICBpZiAocGFyZW50R3JhcGhOb2RlRmlndXJlICE9IG51bGwpCi0gICAgICB7ICAgCi0gICAgICAgIHBhcmVudEdyYXBoTm9kZUZpZ3VyZS5hZGRDb25uZWN0ZWRGaWd1cmUodGhpcyk7Ci0gICAgICB9ICAgCi0gICAgfQotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTm90aWZ5KCkKLSAgewotICAgIHN1cGVyLnJlbW92ZU5vdGlmeSgpOwotICAgIGlmIChnZXRDb25uZWN0aW9uRmlndXJlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUgcGFyZW50R3JhcGhOb2RlRmlndXJlID0gZ2V0UGFyZW50R3JhcGhOb2RlRmlndXJlKCk7Ci0gICAgICBpZiAocGFyZW50R3JhcGhOb2RlRmlndXJlICE9IG51bGwpCi0gICAgICB7ICAgCi0gICAgICAgIHBhcmVudEdyYXBoTm9kZUZpZ3VyZS5yZW1vdmVDb25uZWN0ZWRGaWd1cmUodGhpcyk7Ci0gICAgICB9ICAgCi0gICAgfQotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgYWRkQ29ubmVjdGVkRmlndXJlKElDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSBmaWd1cmUpCi0gIHsgICAKLSAgICBpZiAoY2hpbGRDb25uZWN0aW9uc0VuYWJsZWQpIAotICAgIHsgIAotICAgICAgLy8gdGhpcyB0ZXN0IGlzIHJlcXVpcmVkIHNpbmNlIHdlIHNvbWV0aW1lcyByZWNlaXZlIHRoZSAnYWRkTm90aWZ5JyBjYWxsIHR3aWNlCi0gICAgICAvLwotICAgICAgaWYgKCFjb25uZWN0ZWRGaWd1cmVzLmNvbnRhaW5zKGZpZ3VyZSkpCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3RlZEZpZ3VyZXMuYWRkKGZpZ3VyZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlQ29ubmVjdGVkRmlndXJlKElDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSBmaWd1cmUpCi0gIHsKLSAgICBpZiAoY2hpbGRDb25uZWN0aW9uc0VuYWJsZWQpIAotICAgIHsgCi0gICAgICBjb25uZWN0ZWRGaWd1cmVzLnJlbW92ZShmaWd1cmUpOwotICAgIH0KLSAgfSAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBJRmlndXJlIGdldFNlbGVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbm5lY3Rpb25GaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDb25uZWN0ZWRGaWd1cmVzKGludCB0eXBlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbm5lY3RlZEZpZ3VyZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIElDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSBmaWd1cmUgPSAoSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlKWkubmV4dCgpOwotICAgICAgLy9pZiAodHlwZSA9PSAwIHx8IHR5cGUgPT0gZmlndXJlLmdldENvbm5lY3Rpb25UeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGZpZ3VyZSk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25UeXBlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblR5cGUoaW50IHR5cGUpCi0gIHsKLSAgICBjb25uZWN0aW9uVHlwZSA9IHR5cGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0Nvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0Nvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5MjEwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9Db25uZWN0aW9uUmVuZGVyaW5nRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXM7Ci0gICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlCi17ICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzT3V0bGluZWQgPSB0cnVlOwotICBwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5TGF5ZXI7Ci0KLSAgcHVibGljIENvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUoSUZpZ3VyZSBwcmltYXJ5TGF5ZXIpCi0gIHsKLSAgICBzZXRPcGFxdWUoZmFsc2UpOyAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnByaW1hcnlMYXllciA9IHByaW1hcnlMYXllcjsKLSAgICAvL3NldEZvY3VzVHJhdmVyc2FibGUoZmFsc2UpOyAKLSAgICAvL3NldEVuYWJsZWQoZmFsc2UpOyAKLSAgfQotICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNb3VzZUV2ZW50VGFyZ2V0KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgICAgICAgCi0KLSAgcHVibGljIGJvb2xlYW4gY29udGFpbnNQb2ludChpbnQgeCwgaW50IHkpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsgCi0gICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBkcmF3TGluZXMoZ3JhcGhpY3MsIHByaW1hcnlMYXllcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBvdXRsaW5lU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsgCi0gICAgaWYgKGlzT3V0bGluZWQpCi0gICAgewotICAgICAgc3VwZXIub3V0bGluZVNoYXBlKGdyYXBoaWNzKTsKLSAgICB9Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgZHJhd0xpbmVzKEdyYXBoaWNzIGdyYXBoaWNzLCBJRmlndXJlIGZpZ3VyZSkKLSAgeyAgICAgIAotICAgIGlmIChmaWd1cmUgaW5zdGFuY2VvZiBJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUpCi0gICAgewotICAgICAgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGdyYXBoTm9kZUZpZ3VyZSA9IChJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUpZmlndXJlOyAgICAgICAgIAotICAgICAgTGlzdCBjb25uZWN0ZWRGaWd1cmVzID0gZ3JhcGhOb2RlRmlndXJlLmdldENvbm5lY3RlZEZpZ3VyZXMoSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlLlJJR0hUX0NPTk5FQ1RJT04pOwotICAgICAgaW50IGNvbm5lY3RlZEZpZ3VyZXNTaXplID0gY29ubmVjdGVkRmlndXJlcy5zaXplKCk7ICAgICAgICAgICAgICAKLQotICAgICAgaWYgKGNvbm5lY3RlZEZpZ3VyZXNTaXplID4gMCkgCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGZpcnN0R3JhcGhOb2RlRmlndXJlID0gKElDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSljb25uZWN0ZWRGaWd1cmVzLmdldCgwKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBncmFwaE5vZGVGaWd1cmUuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLmdldEJvdW5kcygpOyAgICAKLSAgICAgICAgICAKLSAgICAgICAgaW50IHgxID0gci54ICsgci53aWR0aDsKLSAgICAgICAgaW50IHkxID0gci55ICsgci5oZWlnaHQvMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCBzdGFydE9mQ2hpbGRCb3ggPSBmaXJzdEdyYXBoTm9kZUZpZ3VyZS5nZXRDb25uZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLSAgICAgICAgaW50IHgyID0geDEgKyAoc3RhcnRPZkNoaWxkQm94IC0geDEpIC8gMzsKLSAgICAgICAgaW50IHkyID0geTE7Ci0gICAgICAKLSAgICAgICAgaWYgKGNvbm5lY3RlZEZpZ3VyZXNTaXplID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIHN0YXJ0T2ZDaGlsZEJveCwgeTIpOyAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLy8gKGNvbm5lY3RlZEZpZ3VyZXMubGVuZ3RoID4gMSkKLSAgICAgICAgeyAKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIHgyLCB5Mik7Ci0KLSAgICAgICAgICBpbnQgbWluWSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgIGludCBtYXhZID0gLTE7Ci0KLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25uZWN0ZWRGaWd1cmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGNvbm5lY3RlZEZpZ3VyZSA9IChJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgY2hpbGRDb25uZWN0aW9uUmVjdGFuZ2xlID0gY29ubmVjdGVkRmlndXJlLmdldENvbm5lY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIGludCB5ID0gY2hpbGRDb25uZWN0aW9uUmVjdGFuZ2xlLnkgKyBjaGlsZENvbm5lY3Rpb25SZWN0YW5nbGUuaGVpZ2h0IC8gMjsKLSAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTsKLSAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTsKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHgyLCB5LCBjaGlsZENvbm5lY3Rpb25SZWN0YW5nbGUueCwgeSk7Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MiwgbWluWSwgeDIsIG1heFkpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0gICAgICAgICAgICAKLQotICAgIC8vYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdHJ1ZTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICBkcmF3TGluZXMoZ3JhcGhpY3MsIGNoaWxkKTsKLSAgICB9Ci0gIH0gICAgCi0KLSAgLy8gVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIHByZXZpZXcgY29ubmVjdGlvbiBsaW5lIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gZHJhZyBhbmQgZHJvcAotICAvLyAgICAgCi0gIHB1YmxpYyBQb2ludExpc3QgZ2V0Q29ubmVjdGlvblBvaW50cyhHcmFwaGljYWxFZGl0UGFydCBwYXJlbnRFZGl0UGFydCwgR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGRSZWZFZGl0UGFydCwgUmVjdGFuZ2xlIGRyYWdnZWRGaWd1cmVCb3VuZHMpCi0gIHsgICAgICAgICAgIAotICAgIFBvaW50TGlzdCBwb2ludExpc3QgPSBuZXcgUG9pbnRMaXN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGludFtdIGRhdGEgPSBuZXcgaW50WzFdOwotICAgIFBvaW50IGEgPSBnZXRDb25uZWN0aW9uUG9pbnQocGFyZW50RWRpdFBhcnQsIGNoaWxkUmVmRWRpdFBhcnQsIGRhdGEpOwotICAgIGlmIChhICE9IG51bGwpCi0gICAgeyAgIAotICAgICAgaW50IGRyYWdnZWRGaWd1cmVCb3VuZHNZID0gZHJhZ2dlZEZpZ3VyZUJvdW5kcy55ICsgZHJhZ2dlZEZpZ3VyZUJvdW5kcy5oZWlnaHQvMjsKLQotICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KGEpOyAKLSAgICAgIC8vcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludChkcmFnZ2VkRmlndXJlQm91bmRzLngsIGRyYWdnZWRGaWd1cmVCb3VuZHNZKSk7Ci0gICAgICAKLSAgICAgIGlmIChkYXRhWzBdID09IDApIC8vIGluc2VydCBiZXR3ZWVuIDIgaXRlbXMKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgeCA9IGEueCArIChkcmFnZ2VkRmlndXJlQm91bmRzLnggLSBhLngpLzI7Ci0gICAgICAgIHBvaW50TGlzdC5hZGRQb2ludChuZXcgUG9pbnQoeCwgYS55KSk7Ci0gICAgICAgIHBvaW50TGlzdC5hZGRQb2ludChuZXcgUG9pbnQoeCwgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kpKTsgICAgICAgIAotICAgICAgICBwb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KGRyYWdnZWRGaWd1cmVCb3VuZHMueCwgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgLy8gaW5zZXJ0IGF0IGZpcnN0IG9yIGxhc3QgcG9zaXRpb24KLSAgICAgIHsKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludChhLngsIGRyYWdnZWRGaWd1cmVCb3VuZHNZKSk7ICAgCi0gICAgICAgIHBvaW50TGlzdC5hZGRQb2ludChuZXcgUG9pbnQoZHJhZ2dlZEZpZ3VyZUJvdW5kcy54LCBkcmFnZ2VkRmlndXJlQm91bmRzWSkpOwotICAgICAgfQotICAgIH0gICAgICAgCi0gICAgcmV0dXJuIHBvaW50TGlzdDsKLSAgfQotCi0gICAgICAgICAKLSAgLy8gVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIHByZXZpZXcgY29ubmVjdGlvbiBsaW5lIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gZHJhZyBhbmQgZHJvcAotICAvLyAgICAgCi0gIHByb3RlY3RlZCBQb2ludCBnZXRDb25uZWN0aW9uUG9pbnQoR3JhcGhpY2FsRWRpdFBhcnQgcGFyZW50RWRpdFBhcnQsIEdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkUmVmRWRpdFBhcnQsIGludFtdIGRhdGEpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgUG9pbnQgcG9pbnQgPSBudWxsOyAgICAgCi0gICAgTGlzdCBjaGlsZExpc3QgPSBwYXJlbnRFZGl0UGFydC5nZXRDaGlsZHJlbigpOyAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAocGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUgJiYgY2hpbGRMaXN0LnNpemUoKSA+IDApCi0gICAgeyAgIAotICAgICAgcG9pbnQgPSBuZXcgUG9pbnQoKTsKLQotICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgcHJldiA9IG51bGw7ICAgIAotICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgbmV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgICAgICAgICAgICAgCi0gICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7ICAgIAotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGRFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydClvOwotICAgICAgICAgIGlmIChjaGlsZEVkaXRQYXJ0LmdldEZpZ3VyZSgpIGluc3RhbmNlb2YgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaGlsZEVkaXRQYXJ0ID09IGNoaWxkUmVmRWRpdFBhcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5leHQgPSBjaGlsZEVkaXRQYXJ0OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBwcmV2ID0gY2hpbGRFZGl0UGFydDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICBpZiAobmV4dCAhPSBudWxsICYmIHByZXYgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCB5YSA9IGdldENvbm5lY3RlZEVkaXRQYXJ0Q29ubmVjdGlvbkJvdW5kcyhwcmV2KS5nZXRDZW50ZXIoKS55OwotICAgICAgICBpbnQgeWIgPSBnZXRDb25uZWN0ZWRFZGl0UGFydENvbm5lY3Rpb25Cb3VuZHMobmV4dCkuZ2V0Q2VudGVyKCkueTsKLSAgICAgICAgcG9pbnQueSA9IHlhICsgKHliIC0geWEpLzI7ICAgCi0gICAgICAgIGRhdGFbMF0gPSAwOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UgaWYgKHByZXYgIT0gbnVsbCkgLy8gYWRkIGl0IGxhc3QKLSAgICAgIHsKLSAgICAgICAgcG9pbnQueSA9IGdldENvbm5lY3RlZEVkaXRQYXJ0Q29ubmVjdGlvbkJvdW5kcyhwcmV2KS5nZXRDZW50ZXIoKS55OwotICAgICAgICBkYXRhWzBdID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5leHQgIT0gbnVsbCkgLy8gYWRkIGl0IGZpcnN0IQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBwb2ludC55ID0gZ2V0Q29ubmVjdGVkRWRpdFBhcnRDb25uZWN0aW9uQm91bmRzKG5leHQpLmdldENlbnRlcigpLnk7Ci0gICAgICAgIGRhdGFbMF0gPSAtMTsKLSAgICAgIH0KLSAgICAgICAgICAKLSAgICAgIGlmIChuZXh0ICE9IG51bGwgfHwgcHJldiAhPSBudWxsKQotICAgICAgewotICAgICAgICBHcmFwaGljYWxFZGl0UGFydCBjaGlsZCA9IHByZXYgIT0gbnVsbCA/IHByZXYgOiBuZXh0OwotICAgICAgICBpbnQgc3RhcnRPZkNoaWxkQm94ID0gZ2V0Q29ubmVjdGVkRWRpdFBhcnRDb25uZWN0aW9uQm91bmRzKGNoaWxkKS54OwotICAgICAgICBSZWN0YW5nbGUgciA9IGdldENvbm5lY3RlZEVkaXRQYXJ0Q29ubmVjdGlvbkJvdW5kcyhwYXJlbnRFZGl0UGFydCk7ICAKLSAgICAgICAgaW50IHgxID0gci54ICsgci53aWR0aDsKLSAgICAgICAgcG9pbnQueCA9IHgxICsgKHN0YXJ0T2ZDaGlsZEJveCAtIHgxKSAvIDM7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICByZXR1cm4gcG9pbnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldENvbm5lY3RlZEVkaXRQYXJ0Q29ubmVjdGlvbkJvdW5kcyhHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHJldHVybiAoKElDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSllZGl0UGFydC5nZXRGaWd1cmUoKSkuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLmdldEJvdW5kcygpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvQ29udGFpbmVyRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9Db250YWluZXJGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhNzdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9Db250YWluZXJGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci0gICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIENvbnRhaW5lckZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSBpbXBsZW1lbnRzIElFeHBhbmRhYmxlCi17ICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzT3V0bGluZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHBhbmRlZCA9IHRydWU7Ci0KLSAgcHVibGljIENvbnRhaW5lckZpZ3VyZSgpCi0gIHsKLSAgICBzZXRMYXlvdXRNYW5hZ2VyKG5ldyBDb250YWluZXJMYXlvdXQoKSk7Ci0gICAgc2V0RmlsbChmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0xheW91dCgpCi0gIHsKLQkgIGxheW91dCgpOwotCSAgc2V0VmFsaWQodHJ1ZSk7Ci0gIH0gIAotICAgICAgICAgIAotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0IGdldENvbnRhaW5lckxheW91dCgpCi0gIHsKLSAgICByZXR1cm4gKENvbnRhaW5lckxheW91dClnZXRMYXlvdXRNYW5hZ2VyKCk7Ci0gIH0gICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldE91dGxpbmVkKGJvb2xlYW4gaXNPdXRsaW5lZCkKLSAgewotICAgIHRoaXMuaXNPdXRsaW5lZCA9IGlzT3V0bGluZWQ7Ci0gIH0gICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIG91dGxpbmVTaGFwZShHcmFwaGljcyBncmFwaGljcykKLSAgeyAKLSAgICBpZiAoaXNPdXRsaW5lZCkKLSAgICB7Ci0gICAgICBzdXBlci5vdXRsaW5lU2hhcGUoZ3JhcGhpY3MpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRXhwYW5kZWQoKQotICB7Ci0gICAgcmV0dXJuIGlzRXhwYW5kZWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKGJvb2xlYW4gaXNFeHBhbmRlZCkKLSAgewotICAgIHRoaXMuaXNFeHBhbmRlZCA9IGlzRXhwYW5kZWQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9Db250YWluZXJMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0NvbnRhaW5lckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmY2NTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0NvbnRhaW5lckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBDb250YWluZXJMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdExheW91dAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbDsKLSAgcHJvdGVjdGVkIGludCBzcGFjaW5nID0gMDsKLSAgcHJvdGVjdGVkIGludCBib3JkZXIgPSAwOyAKLQotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0KCkKLSAgeyAKLSAgICB0aGlzKHRydWUsIDApOyAKLSAgfSAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0KGJvb2xlYW4gaXNIb3Jpem9udGFsLCBpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsOyAgIAotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWwoYm9vbGVhbiBpc0hvcml6b250YWwpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgc2V0U3BhY2luZyhpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEJvcmRlcihpbnQgYm9yZGVyKQotICB7Ci0gICAgdGhpcy5ib3JkZXIgPSBib3JkZXI7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBpbnQgYWxpZ25GaWd1cmUoSUZpZ3VyZSBwYXJlbnQsIElGaWd1cmUgY2hpbGQpCi0gIHsgCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBjb250YWluZXIgCi0gICAqIGdpdmVuIGFzIGlucHV0LgotICAgKiAKLSAgICogQHBhcmFtIGZpZ3VyZSAgRmlndXJlIHdob3NlIHByZWZlcnJlZCBzaXplIGlzIHJlcXVpcmVkLgotICAgKiBAcmV0dXJuICBUaGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIHBhc3NlZCBGaWd1cmUuCi0gICAqIEBzaW5jZSAyLjAKLSAgICovCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZUhlbHBlcihJRmlndXJlIHBhcmVudCkKLSAgeyAKLSAgICBEaW1lbnNpb24JcHJlZmVycmVkID0gbmV3IERpbWVuc2lvbigpOwotICAJTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0JCSAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWNoaWxkcmVuLmdldChpKTsgICAgICAKLSAgICAKLSAgICAgIERpbWVuc2lvbgljaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JICAKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7Ci0JCSAgICBwcmVmZXJyZWQud2lkdGggKz0gY2hpbGRTaXplLndpZHRoOwotCQkgICAgcHJlZmVycmVkLmhlaWdodCA9IE1hdGgubWF4KHByZWZlcnJlZC5oZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoID0gTWF0aC5tYXgocHJlZmVycmVkLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotCSAgfSAgIAotCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICBpZiAoY2hpbGRyZW5TaXplID4gMSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkgICAgCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC53aWR0aCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCQkgICAgcHJlZmVycmVkLmhlaWdodCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfSAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByZWZlcnJlZC53aWR0aCArPSBib3JkZXIgKiAyOwotICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gYm9yZGVyICogMjsKLQkgIHByZWZlcnJlZC53aWR0aCArPSBwYXJlbnQuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKTsKLQkgIHByZWZlcnJlZC5oZWlnaHQgKz0gcGFyZW50LmdldEluc2V0cygpLmdldEhlaWdodCgpOyAgICAgICAKLSAgCi0gIAlyZXR1cm4gcHJlZmVycmVkOwotICB9Ci0KLSAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsgICAgCi0gICAgRGltZW5zaW9uCXByZWZlcnJlZCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vIEhlcmUgd2UgZW5zdXJlIHRoYXQgYW4gdW5leHBhbmRlZCBjb250YWluZXIgaXMgZ2l2ZW4gYSBzaXplIG9mICgwLDApCi0gICAgLy8KLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUV4cGFuZGFibGUpCi0gICAgewotICAgICAgSUV4cGFuZGFibGUgZXhwYW5kYWJsZUZpZ3VyZSA9IChJRXhwYW5kYWJsZSlwYXJlbnQ7Ci0gICAgICBpZiAoIWV4cGFuZGFibGVGaWd1cmUuaXNFeHBhbmRlZCgpKQotICAgICAgewotICAgICAgICBwcmVmZXJyZWQgPSBuZXcgRGltZW5zaW9uKCk7IAotICAgICAgfQotICAgIH0gICAKLSAgICAKLSAgICBpZiAocHJlZmVycmVkID09IG51bGwpCi0gICAgewotCSAgICBwcmVmZXJyZWQgPSBjYWxjdWxhdGVQcmVmZXJyZWRTaXplSGVscGVyKHBhcmVudCk7ICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcHJlZmVycmVkOwotICB9Ci0gICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIGFkanVzdExheW91dExvY2F0aW9uKElGaWd1cmUgcGFyZW50LCBEaW1lbnNpb24gZGltZW5zaW9uKQotICB7ICAgICAKLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIHBhcmVudCkKLSAgeyAgICAgICAKLSAgCUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAKLSAgICBpbnQgcnggPSAwOwotICAgIERpbWVuc2lvbglkaW1lbnNpb24gPSBuZXcgRGltZW5zaW9uKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCSAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotCQkgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSljaGlsZHJlbi5nZXQoaSk7Ci0JCSAgRGltZW5zaW9uCWNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7ICAgCi0gICAgICAgIGRpbWVuc2lvbi5oZWlnaHQgPSBNYXRoLm1heChkaW1lbnNpb24uaGVpZ2h0LCBjaGlsZFNpemUuaGVpZ2h0KTsKLSAgICAgICAgcnggKz0gY2hpbGRTaXplLndpZHRoOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkaW1lbnNpb24ud2lkdGggPSBNYXRoLm1heChkaW1lbnNpb24ud2lkdGgsIGNoaWxkU2l6ZS53aWR0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0JICAvL2RpbWVuc2lvbi53aWR0aCArPSBwYXJlbnQuZ2V0SW5zZXRzKCkubGVmdDsKLSAgICAvL2RpbWVuc2lvbi5oZWlnaHQgKz0gcGFyZW50LmdldEluc2V0cygpLnRvcDsKLQotICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgewotICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBib3JkZXIqMjsKLSAgICAJZGltZW5zaW9uLndpZHRoICs9IGJvcmRlcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBib3JkZXIqMjsKLSAgICAJZGltZW5zaW9uLmhlaWdodCArPSBib3JkZXI7Ci0gICAgfQotICAgIGFkanVzdExheW91dExvY2F0aW9uKHBhcmVudCwgZGltZW5zaW9uKTsgICAgCi0KLSAgICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotCSAgICBEaW1lbnNpb24JY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotICAgICAgICAKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7ICAgCi0gICAgICAgIGludCB5ID0gLTE7IAotICAgIAotICAgICAgICB5ID0gYWxpZ25GaWd1cmUocGFyZW50LCBjaGlsZCk7Ci0gICAgCi0gICAgICAgIGlmICh5ID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgIHkgPSAoZGltZW5zaW9uLmhlaWdodCAtIGNoaWxkU2l6ZS5oZWlnaHQpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFJlY3RhbmdsZSByZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKGRpbWVuc2lvbi53aWR0aCwgeSwgY2hpbGRTaXplLndpZHRoLCBjaGlsZFNpemUuaGVpZ2h0KTsKLSAgICAgICAgcmVjdGFuZ2xlLnRyYW5zbGF0ZShwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLmdldExvY2F0aW9uKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKHJlY3RhbmdsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgZGltZW5zaW9uLndpZHRoICs9IGNoaWxkU2l6ZS53aWR0aDsgCi0gICAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBzcGFjaW5nOyAgICAgICAKLQotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTcGFjaW5nRmlndXJlKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIGludCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gcng7Ci0gICAgICAgICAgZGltZW5zaW9uLndpZHRoICs9IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZTsKLSAgICAgICAgfSAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKDAsIGRpbWVuc2lvbi5oZWlnaHQsIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCk7Ci0JICAgICAgcmVjdGFuZ2xlLnRyYW5zbGF0ZShwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLmdldExvY2F0aW9uKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKHJlY3RhbmdsZSk7ICAKLSAgICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBjaGlsZFNpemUuaGVpZ2h0OwotICAgICAgICBkaW1lbnNpb24uaGVpZ2h0ICs9IHNwYWNpbmc7Ci0gICAgICB9Ci0JICB9CSAgICAgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9GaWxsTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9GaWxsTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMjk3NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvRmlsbExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsbExheW91dCBleHRlbmRzIEFic3RyYWN0TGF5b3V0Ci17ICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBpbnQgc3BhY2luZyA9IDA7Ci0gIHB1YmxpYyBEaW1lbnNpb24gbWluOwotCi0gIHB1YmxpYyBGaWxsTGF5b3V0KCl7fSAgICAgCi0gIAotICBwdWJsaWMgRmlsbExheW91dChpbnQgc3BhY2luZykKLSAgeyAKLSAgICB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbChib29sZWFuIGlzSG9yaXpvbnRhbCkKLSAgewotICAgdGhpcy5pc0hvcml6b250YWwgPSBpc0hvcml6b250YWw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgaW5wdXQgY29udGFpbmVyLgotICAgKiBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbAotICAgKiBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzIHNpemUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWd1cmUgIENvbnRhaW5lciBmaWd1cmUgZm9yIHdoaWNoIHByZWZlcnJlZCBzaXplIGlzIHJlcXVpcmVkLgotICAgKiBAcmV0dXJuICBUaGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGlucHV0IGZpZ3VyZS4KLSAgICogQHNpbmNlIDIuMAotICAgKi8KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewkgICAgICAgICAgICAgICAgIAotICAgIERpbWVuc2lvbiBkID0gY2FsY3VsYXRlUHJlZmVycmVkQ2xpZW50QXJlYVNpemUoZmlndXJlKTsKLSAgCWQuZXhwYW5kKGZpZ3VyZS5nZXRJbnNldHMoKS5nZXRXaWR0aCgpLAotICAJICAgICAgICAgZmlndXJlLmdldEluc2V0cygpLmdldEhlaWdodCgpKTsKLSAgCWQudW5pb24oZ2V0Qm9yZGVyUHJlZmVycmVkU2l6ZShmaWd1cmUpKTsKLSAgCXJldHVybiBkOwotICB9IAotICAKLSAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRDbGllbnRBcmVhU2l6ZShJRmlndXJlIGZpZ3VyZSkKLSAgewotICAgIERpbWVuc2lvbiBkID0gbmV3IERpbWVuc2lvbigpOwotICAJTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOyAKLSAgCi0gIAotICAJZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gIAkJSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWkubmV4dCgpOwotICAgICAgRGltZW5zaW9uIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBkLndpZHRoICs9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgICAgZC5oZWlnaHQgPSBNYXRoLm1heChjaGlsZFNpemUuaGVpZ2h0LCBkLmhlaWdodCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGQuaGVpZ2h0ICs9IGNoaWxkU2l6ZS5oZWlnaHQ7Ci0gICAgICAgIGQud2lkdGggPSBNYXRoLm1heChjaGlsZFNpemUud2lkdGgsIGQud2lkdGgpOwotICAgICAgfQotICAJfQkgCi0gIAotICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsgICAgICAgCi0gICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIHsKLSAgICAgICAgZC53aWR0aCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOyAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZC5oZWlnaHQgKz0gc3BhY2luZyAqIChjaGlsZHJlblNpemUgLSAxKTsgIAotICAgICAgfQotICAgIH0gICAgICAgCi0gICAgICAKLSAgICBpZiAobWluICE9IG51bGwpCi0gICAgewotICAgICAgZC53aWR0aCA9IE1hdGgubWF4KGQud2lkdGgsIG1pbi53aWR0aCk7Ci0gICAgICBkLmhlaWdodCA9IE1hdGgubWF4KGQuaGVpZ2h0LCBtaW4uaGVpZ2h0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGQ7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZCBieSB0aGUgaW5wdXQgY29udGFpbmVyLgotICAgKiBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbAotICAgKiBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzIHNpemUuCi0gICAqLwotICBwdWJsaWMgRGltZW5zaW9uIGdldE1pbmltdW1TaXplKElGaWd1cmUgZmlndXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsKLSAgCURpbWVuc2lvbiBkID0gbmV3IERpbWVuc2lvbigpOwotICAJTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotICAJSUZpZ3VyZSBjaGlsZDsKLQotICAJZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAJCWNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotICAJCWQudW5pb24oY2hpbGQuZ2V0TWluaW11bVNpemUoKSk7Ci0gIAl9Ci0gIAlkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwKLSAgCSAgICAgICAgIGZpZ3VyZS5nZXRJbnNldHMoKS5nZXRIZWlnaHQoKSk7Ci0gIAlyZXR1cm4gZDsKLSAgfQotICAKLSAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKElGaWd1cmUgZmlndXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsKLSAgCXJldHVybiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKGZpZ3VyZSwgd2lkdGgsIGhlaWdodCk7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIExheXMgb3V0IHRoZSBjaGlsZHJlbiBvbiB0b3Agb2YgZWFjaCBvdGhlciB3aXRoCi0gICAqIHRoZWlyIHNpemVzIGVxdWFsIHRvIHRoYXQgb2YgdGhlIGF2YWlsYWJsZQotICAgKiBwYWludGFibGUgYXJlYSBvZiB0aGUgaW5wdXQgY29udGFpbmVyIGZpZ3VyZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGZpZ3VyZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBEaW1lbnNpb24JcHJlZmVycmVkU2l6ZSA9IGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKGZpZ3VyZSk7Ci0gIAlSZWN0YW5nbGUgciA9IGZpZ3VyZS5nZXRDbGllbnRBcmVhKCkuZ2V0Q29weSgpOwotICAJTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCi0gICAgaW50IG5DaGlsZHJlbiA9IGNoaWxkcmVuLnNpemUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IGV4dHJhSG9yaXpvbnRhbFNwYWNlID0gci53aWR0aCAtIHByZWZlcnJlZFNpemUud2lkdGg7Ci0KLSAgCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAJCUlGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIERpbWVuc2lvbiBwcmVmZXJyZWRDaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0gICAgICAgICAKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW50IHcgPSBwcmVmZXJyZWRDaGlsZFNpemUud2lkdGggKyAoZXh0cmFIb3Jpem9udGFsU3BhY2UgLyBuQ2hpbGRyZW4pOwotICAJCSAgY2hpbGQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoci54LCByLnksIHcsIE1hdGgubWF4KHByZWZlcnJlZFNpemUuaGVpZ2h0LCByLmhlaWdodCkpKTsKLSAgICAgICAgci54ICs9IHcgKyBzcGFjaW5nOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAJCSAgY2hpbGQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoci54LCByLnksIE1hdGgubWF4KHByZWZlcnJlZFNpemUud2lkdGgsIHIud2lkdGgpLCBwcmVmZXJyZWRDaGlsZFNpemUuaGVpZ2h0KSk7Ci0gICAgICAgIHIueSArPSBwcmVmZXJyZWRDaGlsZFNpemUuaGVpZ2h0ICsgc3BhY2luZzsKLSAgICAgIH0KLSAgCX0KLSAgfSAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0lDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzc4ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlczsKLSAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGV4dGVuZHMgSUNvbm5lY3RlZEZpZ3VyZQoteyAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQX0NPTk5FQ1RJT04gPSAxOyAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTl9DT05ORUNUSU9OID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9DT05ORUNUSU9OID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfQ09OTkVDVElPTiA9IDQ7Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0U2VsZWN0aW9uRmlndXJlKCk7Ci0gIHB1YmxpYyBJRmlndXJlIGdldENvbm5lY3Rpb25GaWd1cmUoKTsKLSAgcHVibGljIExpc3QgZ2V0Q29ubmVjdGVkRmlndXJlcyhpbnQgdHlwZSk7Ci0gIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblR5cGUoKTsgICAgICAKLSAgcHVibGljIHZvaWQgYWRkQ29ubmVjdGVkRmlndXJlKElDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSBmaWd1cmUpOwotICBwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0ZWRGaWd1cmUoSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGZpZ3VyZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUNvbm5lY3RlZEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUNvbm5lY3RlZEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTZkN2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0lDb25uZWN0ZWRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3RlZEZpZ3VyZSBleHRlbmRzIElGaWd1cmUKLXsgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUNvbm5lY3Rpb25SZW5kZXJpbmdWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0lDb25uZWN0aW9uUmVuZGVyaW5nVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDYxMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUNvbm5lY3Rpb25SZW5kZXJpbmdWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb25uZWN0aW9uUmVuZGVyaW5nVmlld2VyCi17ICAgICAgICAKLSAgcHVibGljIENvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUgZ2V0Q29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0lFeHBhbmRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9JRXhwYW5kYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjE1ODFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0lFeHBhbmRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlczsgIAotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4cGFuZGFibGUgZXh0ZW5kcyBJRmlndXJlCi17Ci0gIGJvb2xlYW4gaXNFeHBhbmRlZCgpOyAKLSAgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGlzRXhwYW5kZWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL1NwYWNpbmdGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL1NwYWNpbmdGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0NWQ2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9TcGFjaW5nRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlczsKLSAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLSAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgU3BhY2luZ0ZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZQoteyAgCi0gIHB1YmxpYyBTcGFjaW5nRmlndXJlKCkKLSAgewotICAgIHNldEZpbGwoZmFsc2UpOwotICAgIHNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbigwLCAwKSk7Ci0gIH0KLSAgCi0gIC8vcHJvdGVjdGVkIHZvaWQgb3V0bGluZVNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKQotICAvL3sgCi0gIC8vfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvQmFzZUdyYXBoaWNhbFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL0Jhc2VHcmFwaGljYWxWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0YjVlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvQmFzZUdyYXBoaWNhbFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5LZXlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlNjYWxhYmxlUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5TZWxlY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLklDb25uZWN0aW9uUmVuZGVyaW5nVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5DZW50ZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi0KLS8qKgotICogQGF1dGhvciBlcm5lc3QKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUdyYXBoaWNhbFZpZXdlciBleHRlbmRzIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBpbXBsZW1lbnRzIElDb25uZWN0aW9uUmVuZGVyaW5nVmlld2VyCi17Ci0gIHByb3RlY3RlZCBGaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIgZmlndXJlQ2FudmFzS2V5Ym9hcmRIYW5kbGVyOwotCi0gIHByb3RlY3RlZCBFZGl0RG9tYWluIGVkaXREb21haW47Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnB1dEVuYWJsZWQgPSB0cnVlOwotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uRW5hYmxlZCA9IHRydWU7Ci0KLSAgcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBtZW51U2VsZWN0aW9uUHJvdmlkZXI7Ci0KLSAgcHJvdGVjdGVkIEdyYXBoQ29udGV4dE1lbnVQcm92aWRlciBtZW51UHJvdmlkZXI7Ci0KLSAgcHJvdGVjdGVkIFhTREVkaXRvciBlZGl0b3I7Ci0KLSAgcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0OwotCi0gIHByb3RlY3RlZCBDb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlIGNvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmU7Ci0KLSAgcHVibGljIEJhc2VHcmFwaGljYWxWaWV3ZXIoWFNERWRpdG9yIGVkaXRvciwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsKLSAgICBtZW51U2VsZWN0aW9uUHJvdmlkZXIgPSBzZWxlY3Rpb25Qcm92aWRlcjsKLSAgfQotICAKLSAgcHVibGljIENvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUgZ2V0Q29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gY29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gIHsKLSAgICBpc0lucHV0RW5hYmxlZCA9IGVuYWJsZWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25FbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotICAgIGlzU2VsZWN0aW9uRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gIH0KLQotICBwdWJsaWMgWFNETWVudUxpc3RlbmVyIGdldE1lbnVMaXN0ZW5lcigpCi0gIHsKLSAgICByZXR1cm4gbWVudVByb3ZpZGVyLmdldE1lbnVMaXN0ZW5lcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBDb2xvciB3aGl0ZSA9IG51bGw7Ci0gIHByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIHN1cGVyLmhvb2tDb250cm9sKCk7Ci0gIAotICAgIGlmICh3aGl0ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHdoaXRlID0gbmV3IENvbG9yKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIDI1NSwgMjU1LCAyNTUpOwotICAgIH0KLSAgICBnZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZCh3aGl0ZSk7IAotICAKLSAgICBlZGl0RG9tYWluID0gbmV3IERlZmF1bHRFZGl0RG9tYWluKG51bGwpOwotICAgICgoRGVmYXVsdEVkaXREb21haW4pZWRpdERvbWFpbikuc2V0RGVmYXVsdFRvb2wobmV3IFNlbGVjdGlvblRvb2woKSk7Ci0gICAgZWRpdERvbWFpbi5sb2FkRGVmYXVsdFRvb2woKTsKLSAgICBlZGl0RG9tYWluLmFkZFZpZXdlcih0aGlzKTsKLSAgCi0gICAgLy9qdmggLSBnZWYgcG9ydCAtIG1vdmVkIHRoaXMgZnJvbSBiZWxvdyBzbyBpdCBpcyBhdmFpbGFibGUgd2hlbiBhZGRpbmcgY29udGV4dCBtZW51IGJlbG93Ci0gICAgbWVudVByb3ZpZGVyID0gbmV3IEdyYXBoQ29udGV4dE1lbnVQcm92aWRlcih0aGlzLCBtZW51U2VsZWN0aW9uUHJvdmlkZXIsIGVkaXRvci5nZXRYU0RUZXh0RWRpdG9yKCkpOwotICAgIHNldENvbnRleHRNZW51KG1lbnVQcm92aWRlcik7Ci0gIAotICAgIC8vIGFkZCBjb250ZXh0IG1lbnUgdG8gdGhlIGdyYXBoCi0gICAgTWVudU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOwotICAgIG1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKGdldE1lbnVMaXN0ZW5lcigpKTsgIC8vanZoIC0gZ2VmIHBvcnQKLSAgICBtYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLSAgICBNZW51IG1lbnUgPSBtYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KGdldENvbnRyb2woKSk7Ci0gICAgZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0gICAgCi0gICAgLy8gZW5hYmxlIHBvcHVwTWVudXMgZXh0ZW5zaW9uCi0gICAgZWRpdG9yLmdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KCJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnBvcHVwLmdyYXBoIiwgbWFuYWdlciwgbWVudVNlbGVjdGlvblByb3ZpZGVyKTsKLSAgICAKLSAgICBLZXlBZGFwdGVyIGtleUxpc3RlbmVyID0gbmV3IEtleUFkYXB0ZXIoKQotICAgIHsKLSAgICAgIC8qKgotICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXIja2V5UmVsZWFzZWQoS2V5RXZlbnQpCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIGlmIChlLmNoYXJhY3RlciA9PSBTV1QuREVMKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0TWVudUxpc3RlbmVyKCkuZ2V0RGVsZXRlQWN0aW9uKCkucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAKLSAgICBzZXRLZXlIYW5kbGVyKG5ldyBYU0RHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyKHRoaXMpLnNldFBhcmVudChuZXcgS2V5SGFuZGxlcigpKSk7Ci0gICAgCi0vLyAgICBnZXRDb250cm9sKCkuYWRkS2V5TGlzdGVuZXIoa2V5TGlzdGVuZXIpOwotCi0gICAgZmlndXJlQ2FudmFzS2V5Ym9hcmRIYW5kbGVyID0gbmV3IEZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlcih0aGlzKTsKLSAgICBnZXRGaWd1cmVDYW52YXMoKS5hZGRLZXlMaXN0ZW5lcihmaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIpOwotICAgIAotICAJZ2V0Um9vdEVkaXRQYXJ0KCkuYWN0aXZhdGUoKTsJCQotICAgICAgICAgICAgICAgICAgICAgICAKLSAgCVNjYWxhYmxlUm9vdEVkaXRQYXJ0IGdyYXBoaWNhbFJvb3RFZGl0UGFydCA9IChTY2FsYWJsZVJvb3RFZGl0UGFydClnZXRSb290RWRpdFBhcnQoKTsKLSAgICAgCi0gICAgLy8gc2V0IHRoZSBsYXlvdXQgZm9yIHRoZSBwcmltYXJ5IGxheWVyIHNvIHRoYXQgdGhlIGNoaWxkcmVuIGFyZSBhbHdheXMgY2VudGVyZWQKLSAgICAvLwotICAgIGdyYXBoaWNhbFJvb3RFZGl0UGFydC5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBDZW50ZXJMYXlvdXQoKSk7Ci0gIAotICAgIC8vIGFkZCB0aGUgQ29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZSB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgZHJhd2luZyBhbGwgb2YgdGhlIGxpbmVzIGluIHRoZSB2aWV3Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIAotICAgIElGaWd1cmUgZmlndXJlID0gZ3JhcGhpY2FsUm9vdEVkaXRQYXJ0LmdldExheWVyKExheWVyQ29uc3RhbnRzLkhBTkRMRV9MQVlFUik7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOyAgICAgICAgICAKLSAgICBjb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlID0gbmV3IENvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUoZ3JhcGhpY2FsUm9vdEVkaXRQYXJ0LmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpKTsgICAgICAKLSAgICBmaWd1cmUuYWRkKGNvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUpOwotICAKLSAgICBmaWd1cmUudmFsaWRhdGUoKTsgICAgICAKLSAgfQotCi0gIHB1YmxpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZ2V0RWRpdFBhcnQoRWRpdFBhcnQgcGFyZW50LCBPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgPT0gb2JqZWN0KQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9IGVkaXRQYXJ0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgIAotICAKLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgeyAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBhcmVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQoKEVkaXRQYXJ0KWkubmV4dCgpLCBvYmplY3QpOwotICAgICAgICBpZiAoZWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGVkaXRQYXJ0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgfQotICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnB1dChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wKTsKLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNlbGVjdGlvbihYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wKTsKLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL0ZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL0ZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTJlMTVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9GaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SYW5nZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5DYXRlZ29yeUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLlRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBGaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIgZXh0ZW5kcyBLZXlBZGFwdGVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhfU0NST0xMX0lOQ1JFTUVOVCA9IDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZfU0NST0xMX0lOQ1JFTUVOVCA9IDMwOwotCi0gIEJhc2VHcmFwaGljYWxWaWV3ZXIgdmlld2VyOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBGaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgRmlndXJlQ2FudmFzS2V5Ym9hcmRIYW5kbGVyKEJhc2VHcmFwaGljYWxWaWV3ZXIgdmlld2VyKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLSAgewotICAgIFdpZGdldCB3ID0gZS53aWRnZXQ7Ci0gICAgaWYgKHcgaW5zdGFuY2VvZiBGaWd1cmVDYW52YXMpCi0gICAgewotICAgICAgcHJvY2Vzc0tleShlLmtleUNvZGUsIChGaWd1cmVDYW52YXMpdyk7Ci0gICAgICB1cGRhdGUoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc0tleShpbnQga2V5Q29kZSwgRmlndXJlQ2FudmFzIGZpZ3VyZUNhbnZhcykKLSAgewotICAgIHN3aXRjaCAoa2V5Q29kZSkKLSAgICB7Ci0gICAgICBjYXNlIFNXVC5BUlJPV19ET1dOIDoKLSAgICAgICAgc2Nyb2xsVmVydGljYWwoZmlndXJlQ2FudmFzLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTV1QuQVJST1dfVVAgOgotICAgICAgICBzY3JvbGxWZXJ0aWNhbChmaWd1cmVDYW52YXMsIHRydWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1dULkFSUk9XX0xFRlQgOgotICAgICAgICBzY3JvbGxIb3Jpem9udGFsKGZpZ3VyZUNhbnZhcywgdHJ1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTV1QuQVJST1dfUklHSFQgOgotICAgICAgICBzY3JvbGxIb3Jpem9udGFsKGZpZ3VyZUNhbnZhcywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1dULlBBR0VfVVAgOgotICAgICAgICBzY3JvbGxQYWdlKGZpZ3VyZUNhbnZhcywgdHJ1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTV1QuUEFHRV9ET1dOIDoKLSAgICAgICAgc2Nyb2xsUGFnZShmaWd1cmVDYW52YXMsIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KFJhbmdlTW9kZWwgbW9kZWwsIGludCB2YWx1ZSkKLSAgewotICAgIHZhbHVlID0gTWF0aC5tYXgobW9kZWwuZ2V0TWluaW11bSgpLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIE1hdGgubWluKG1vZGVsLmdldE1heGltdW0oKSAtIG1vZGVsLmdldEV4dGVudCgpLCB2YWx1ZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2Nyb2xsVmVydGljYWwoRmlndXJlQ2FudmFzIGZpZ3VyZUNhbnZhcywgYm9vbGVhbiB1cCkKLSAgewotICAgIFBvaW50IGxvY2F0aW9uID0gZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0Vmlld0xvY2F0aW9uKCk7Ci0gICAgaW50IHZPZmZzZXQgPSB1cCA/IC1WX1NDUk9MTF9JTkNSRU1FTlQgOiBWX1NDUk9MTF9JTkNSRU1FTlQ7Ci0gICAgaW50IHggPSB2ZXJpZnlTY3JvbGxCYXJPZmZzZXQoZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0SG9yaXpvbnRhbFJhbmdlTW9kZWwoKSwgbG9jYXRpb24ueCk7Ci0gICAgaW50IHkgPSB2ZXJpZnlTY3JvbGxCYXJPZmZzZXQoZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0VmVydGljYWxSYW5nZU1vZGVsKCksIGxvY2F0aW9uLnkgKyB2T2Zmc2V0KTsKLSAgICBmaWd1cmVDYW52YXMuc2Nyb2xsU21vb3RoVG8oeCwgeSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2Nyb2xsSG9yaXpvbnRhbChGaWd1cmVDYW52YXMgZmlndXJlQ2FudmFzLCBib29sZWFuIGxlZnQpCi0gIHsKLSAgICBQb2ludCBsb2NhdGlvbiA9IGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgIGludCBoT2Zmc2V0ID0gbGVmdCA/IC1IX1NDUk9MTF9JTkNSRU1FTlQgOiBIX1NDUk9MTF9JTkNSRU1FTlQ7Ci0gICAgaW50IHggPSB2ZXJpZnlTY3JvbGxCYXJPZmZzZXQoZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0SG9yaXpvbnRhbFJhbmdlTW9kZWwoKSwgbG9jYXRpb24ueCArIGhPZmZzZXQpOwotICAgIGludCB5ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZlcnRpY2FsUmFuZ2VNb2RlbCgpLCBsb2NhdGlvbi55KTsKLSAgICBmaWd1cmVDYW52YXMuc2Nyb2xsU21vb3RoVG8oeCwgeSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2Nyb2xsUGFnZShGaWd1cmVDYW52YXMgZmlndXJlQ2FudmFzLCBib29sZWFuIHVwKQotICB7Ci0gICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBmaWd1cmVDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotICAgIGludCBpbmNyZW1lbnQgPSB1cCA/IC1jbGllbnRBcmVhLmhlaWdodCA6IGNsaWVudEFyZWEuaGVpZ2h0OwotICAgIFBvaW50IGxvY2F0aW9uID0gZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0Vmlld0xvY2F0aW9uKCk7Ci0gICAgaW50IHggPSB2ZXJpZnlTY3JvbGxCYXJPZmZzZXQoZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0SG9yaXpvbnRhbFJhbmdlTW9kZWwoKSwgbG9jYXRpb24ueCk7Ci0gICAgaW50IHkgPSB2ZXJpZnlTY3JvbGxCYXJPZmZzZXQoZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0VmVydGljYWxSYW5nZU1vZGVsKCksIGxvY2F0aW9uLnkgKyBpbmNyZW1lbnQpOwotICAgIGZpZ3VyZUNhbnZhcy5zY3JvbGxTbW9vdGhUbyh4LCB5KTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpCi0gIHsKLSAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMgPSAoU3RydWN0dXJlZFNlbGVjdGlvbil2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgT2JqZWN0IG5ld1NlbGVjdGVkRWRpdFBhcnQgPSBzLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKG5ld1NlbGVjdGVkRWRpdFBhcnQgaW5zdGFuY2VvZiBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQgdG9wTGV2ZWwgPSAoVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCkgbmV3U2VsZWN0ZWRFZGl0UGFydDsKLSAgICAgIENhdGVnb3J5RWRpdFBhcnQgY2F0ZWdvcnlFUCA9IChDYXRlZ29yeUVkaXRQYXJ0KSB0b3BMZXZlbC5nZXRQYXJlbnQoKTsKLSAgICAgIGNhdGVnb3J5RVAuc2Nyb2xsVG8odG9wTGV2ZWwpOwotICAgICAgdmlld2VyLnJldmVhbCgoVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCluZXdTZWxlY3RlZEVkaXRQYXJ0KTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvR3JhcGhDb250ZXh0TWVudVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvR3JhcGhDb250ZXh0TWVudVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMTU0MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoQ29udGV4dE1lbnVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RUZXh0RWRpdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBHcmFwaENvbnRleHRNZW51UHJvdmlkZXIgZXh0ZW5kcyBDb250ZXh0TWVudVByb3ZpZGVyCi17Ci0KLSAgWFNETWVudUxpc3RlbmVyIHhzZE1lbnVMaXN0ZW5lcjsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgR3JhcGhDb250ZXh0TWVudVByb3ZpZGVyLgotICAgKiBAcGFyYW0gc2VsZWN0aW9uUHJvdmlkZXIKLSAgICogQHBhcmFtIGVkaXRvcgotICAgKi8KLSAgcHVibGljIEdyYXBoQ29udGV4dE1lbnVQcm92aWRlcigKLSAgICBFZGl0UGFydFZpZXdlciB2aWV3ZXIsCi0gICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyLAotICAgIFhTRFRleHRFZGl0b3IgZWRpdG9yKQotICB7Ci0gICAgc3VwZXIodmlld2VyKTsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB4c2RNZW51TGlzdGVuZXIgPSBuZXcgWFNETWVudUxpc3RlbmVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLSAgICB4c2RNZW51TGlzdGVuZXIuc2V0U291cmNlQ29udGV4dCh2aWV3ZXIpOwotICB9Ci0KLSAgcHVibGljIFhTRE1lbnVMaXN0ZW5lciBnZXRNZW51TGlzdGVuZXIoKQotICB7Ci0gICAgICByZXR1cm4geHNkTWVudUxpc3RlbmVyOwotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5Db250ZXh0TWVudVByb3ZpZGVyI2J1aWxkQ29udGV4dE1lbnUob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlciwgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyKQotICAgKi8KLSAgcHVibGljIHZvaWQgYnVpbGRDb250ZXh0TWVudShJTWVudU1hbmFnZXIgYXJnMCkKLSAgewotICAgIHhzZE1lbnVMaXN0ZW5lci5tZW51QWJvdXRUb1Nob3coYXJnMCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFZGl0UGFydFZpZXdlciB2aWV3ZXI7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9HcmFwaGljc0NvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoaWNzQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTk5NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoaWNzQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBIGNvbGxlY3Rpb24gb2YgY29sb3ItcmVsYXRlZCBjb25zdGFudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhpY3NDb25zdGFudHMgCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBjYXRlZ29yeUJvcmRlckNvbG9yICAgICA9IG5ldyBDb2xvcihudWxsLCAxMTgsIDEzNCwgMTY0KTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBlbGVtZW50Qm9yZGVyQ29sb3IgICAgICA9IG5ldyBDb2xvcihudWxsLCAxMzgsIDE1NCwgMTg0KTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBlbGVtZW50QmFja2dyb3VuZENvbG9yICA9IG5ldyBDb2xvcihudWxsLCAyMzYsIDI0MiwgMjUyKTsgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGVsZW1lbnRMYWJlbENvbG9yICAgICAgID0gbmV3IENvbG9yKG51bGwsICA4MCwgIDk2LCAxNDQpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIHJlYWRPbmx5Qm9yZGVyQ29sb3IgICAgID0gbmV3IENvbG9yKG51bGwsIDE2NCwgMTY0LCAxNjQpOyAKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIHJlYWRPbmx5QmFja2dyb3VuZENvbG9yID0gQ29sb3JDb25zdGFudHMud2hpdGU7Ci0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBGb250ICBzbWFsbEZvbnQgICAgICAgICAgICAgICA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAiU21hbGwgRm9udHMiLCA2LCBTV1QuTk9ORSk7IAotICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbnQgIG1lZGl1bSAgICAgICAgICAgICAgICAgID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJUYWhvbWEiLCA4LCBTV1QuTk9ORSk7IAotICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbnQgIG1lZGl1bUJvbGRGb250ICAgICAgICAgID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJUYWhvbWEiLCA4LCBTV1QuQk9MRCk7IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9MaW5rZWRHcmFwaFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL0xpbmtlZEdyYXBoVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjQ1YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL0xpbmtlZEdyYXBoVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTGlua2VkR3JhcGhWaWV3ZXIKLXsKLSAgCi0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgbWVudVNlbGVjdGlvblByb3ZpZGVyOwotICBwcm90ZWN0ZWQgWFNERWRpdG9yIGVkaXRvcjsKLSAgcHJvdGVjdGVkIEJhc2VHcmFwaGljYWxWaWV3ZXIgbWFqb3JWaWV3ZXIsIG1pbm9yVmlld2VyOwotICAKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIExpbmtlZEdyYXBoVmlld2VyKFhTREVkaXRvciBlZGl0b3IsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIG1lbnVTZWxlY3Rpb25Qcm92aWRlciA9IHNlbGVjdGlvblByb3ZpZGVyOwotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWFqb3JWaWV3ZXIoQmFzZUdyYXBoaWNhbFZpZXdlciBtYWpvclZpZXdlcikKLSAgewotICAgIHRoaXMubWFqb3JWaWV3ZXIgPSBtYWpvclZpZXdlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1pbm9yVmlld2VyKEJhc2VHcmFwaGljYWxWaWV3ZXIgbWlub3JWaWV3ZXIpCi0gIHsKLSAgICB0aGlzLm1pbm9yVmlld2VyID0gbWlub3JWaWV3ZXI7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLSAgcHJvdGVjdGVkIFNhc2hGb3JtIHNhc2hGb3JtOwotICAKLSAgcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy9jb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5ERUZBVUxUKTsKLSAgIAotICAgIGNvbnRyb2wgPSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5WRVJUSUNBTCB8IFNXVC5CT1JERVIpOwotICAgIHNhc2hGb3JtLnNldExheW91dERhdGEoVmlld1V0aWxpdHkuY3JlYXRlRmlsbCgpKTsKLSAgICAKLSAgICBtYWpvclZpZXdlci5jcmVhdGVDb250cm9sKHNhc2hGb3JtKTsKLSAgICBtaW5vclZpZXdlci5jcmVhdGVDb250cm9sKHNhc2hGb3JtKTsKLS8vICAgIGNvbnRyb2wuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotLy8gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKFZpZXdVdGlsaXR5LmNyZWF0ZUZpbGwoKSk7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKQotICB7Ci0gICAgaWYgKG1ham9yVmlld2VyICE9IG51bGwpCi0gICAgewotICAgICAgbWFqb3JWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgICAgIG1ham9yVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihtYWpvclZpZXdlckxpc3RlbmVyKTsKLSAgICB9Ci0gICAgaWYgKG1pbm9yVmlld2VyICE9IG51bGwpCi0gICAgewotICAgICAgbWlub3JWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIENvbXBvc2l0ZQotICAgKi8KLSAgcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkKLSAgewotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldElucHV0KCkKLSAgewotICAgIHJldHVybiBtYWpvclZpZXdlci5nZXRJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldElucHV0KFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0KQotICB7Ci0gICAgbWFqb3JWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgIG1pbm9yVmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gY29tcG9uZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgbWFqb3JWaWV3ZXIuc2V0U2VsZWN0aW9uKGNvbXBvbmVudCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTWFqb3JWaWV3ZXJTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbWFqb3JWaWV3ZXJMaXN0ZW5lciA9IG5ldyBNYWpvclZpZXdlclNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpOwotICAKLSAgcHJpdmF0ZSBjbGFzcyBNYWpvclZpZXdlclNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gZWRpdFBhcnRTZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIExpc3Qgbm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBpZiAoZWRpdFBhcnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbillZGl0UGFydFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtb2RlbCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gICAgICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgIC8vIHRoaXMgdGVzdCBlbnN1cmVzIHRoYXQgd2UgZG9uJ3QgYXR0ZW1wdCB0byBzZWxlY3QgYW4gZWxlbWVudCBmb3IgYW4gZXh0ZXJuYWwgc2NoZW1hCi0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWE1MTm9kZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vdyB1cGRhdGUgdGhlIG1pbm9yIHZpZXdlciBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgY29tcG9uZW50IGluIHRoZSBtYWpvciB2aWV3ZXIKLSAgICAgICAgICAgICAgICBtaW5vclZpZXdlci5zZXRJbnB1dCgoWFNEQ29uY3JldGVDb21wb25lbnQpbW9kZWwpOwotICAgICAgICAgICAgICAgIG1pbm9yVmlld2VyLnNldFNlbGVjdGlvbigoWFNEQ29uY3JldGVDb21wb25lbnQpbW9kZWwpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgIAotICAgIH0KLQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL1ByaW50R3JhcGhBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9QcmludEdyYXBoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZGY5MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL1ByaW50R3JhcGhBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaDsKLSAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi1wdWJsaWMgY2xhc3MgUHJpbnRHcmFwaEFjdGlvbiBleHRlbmRzIEFjdGlvbgoteyAKLSAgcHJvdGVjdGVkIFhTRENvbXBvbmVudFZpZXdlciBjb21wb25lbnRWaWV3ZXI7Ci0KLSAgcHVibGljIFByaW50R3JhcGhBY3Rpb24oWFNEQ29tcG9uZW50Vmlld2VyIGNvbXBvbmVudFZpZXdlcikKLSAgewotICAgIHN1cGVyKCJQcmludCIpOwotICAgIHRoaXMuY29tcG9uZW50Vmlld2VyID0gY29tcG9uZW50Vmlld2VyOwotICB9IAotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBQcmludERpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbnREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0gICAgICBQcmludGVyRGF0YSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgIFByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDb250cm9sIGNvbnRyb2wgPSBjb21wb25lbnRWaWV3ZXIuZ2V0Q29udHJvbCgpOwotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICBJbWFnZSBncmFwaEltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGNvbnRyb2wuZ2V0U2l6ZSgpLngsIGNvbnRyb2wuZ2V0U2l6ZSgpLnkpOwotICAgICAgR0MgZ3JhcGhHQyA9IG5ldyBHQyhjb250cm9sKTsKLSAgICAgIGdyYXBoR0MuY29weUFyZWEoZ3JhcGhJbWFnZSwgMCwgMCk7Ci0gICAgICAgIAotICAgICAgSW1hZ2VEYXRhIGdyYXBoSW1hZ2VEYXRhID0gZ3JhcGhJbWFnZS5nZXRJbWFnZURhdGEoKTsKLSAgICAgIGdyYXBoSW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAtMTsKLSAgICAgICAgCi0gICAgICBQb2ludCBzY3JlZW5EUEkgPSBkaXNwbGF5LmdldERQSSgpOwotICAgICAgUG9pbnQgcHJpbnRlckRQSSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0gICAgICBpbnQgc2NhbGVGYWN0b3IgPSBwcmludGVyRFBJLnggLyBzY3JlZW5EUEkueDsKLSAgICAgIFJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLSAgICAgIGlmIChwcmludGVyLnN0YXJ0Sm9iKCJQcmludCBYTUwgU2NoZW1hIEdyYXBoIikpIAotICAgICAgewotICAgICAgICBHQyBnYyA9IG5ldyBHQyhwcmludGVyKTsKLSAgICAgICAgaWYgKHByaW50ZXIuc3RhcnRQYWdlKCkpIAotICAgICAgICB7Ci0gICAgICAgICAgZ2MuZHJhd0ltYWdlKAotICAgICAgICAgICAgZ3JhcGhJbWFnZSwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgZ3JhcGhJbWFnZURhdGEud2lkdGgsCi0gICAgICAgICAgICBncmFwaEltYWdlRGF0YS5oZWlnaHQsCi0gICAgICAgICAgICAtdHJpbS54LAotICAgICAgICAgICAgLXRyaW0ueSwKLSAgICAgICAgICAgIHNjYWxlRmFjdG9yICogZ3JhcGhJbWFnZURhdGEud2lkdGgsCi0gICAgICAgICAgICBzY2FsZUZhY3RvciAqIGdyYXBoSW1hZ2VEYXRhLmhlaWdodCk7Ci0gICAgICAgICAgcHJpbnRlci5lbmRQYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRlci5lbmRKb2IoKTsKLSAgICAgIH0KLSAgICAgIHByaW50ZXIuZGlzcG9zZSgpOwotICAgICAgZ3JhcGhHQy5kaXNwb3NlKCk7Ci0gICAgfSAgICAKLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RDaGlsZFV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RDaGlsZFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3ODg5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvWFNEQ2hpbGRVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci0gICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgWFNEQ2hpbGRVdGlsaXR5Ci17ICAgICAgICAgICAgICAKLSAgc3RhdGljIHB1YmxpYyBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oT2JqZWN0IG1vZGVsKQotICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgWFNEQ2hpbGRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgWFNEQ2hpbGRWaXNpdG9yKG1vZGVsKTsKLSAgICB2aXNpdG9yLnZpc2l0WFNET2JqZWN0KG1vZGVsKTsgCi0gICAgcmV0dXJuIHZpc2l0b3IubGlzdDsKLSAgfSAgICAKLSAgIAotICBzdGF0aWMgcHVibGljIExpc3QgZ2V0SW1tZWRpYXRlRGVyaXZlZFR5cGVzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSkKLSAgewotICAgIEFycmF5TGlzdCB0eXBlc0Rlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLy8gQSBoYW5keSBjb252ZW5pZW5jZSBtZXRob2QgcXVpY2tseSBnZXRzIGFsbCAKLSAgICAvLyB0eXBlRGVmaW5pdGlvbnMgd2l0aGluIG91ciBzY2hlbWE7IG5vdGUgdGhhdCAKLSAgICAvLyB3aGV0aGVyIG9yIG5vdCB0aGlzIHJldHVybnMgdHlwZXMgaW4gaW5jbHVkZWQsIAotICAgIC8vIGltcG9ydGVkLCBvciByZWRlZmluZWQgc2NoZW1hcyBpcyBzdWJqZWN0IHRvIGNoYW5nZQotICAgIExpc3QgdHlwZWRlZnMgPSBjb21wbGV4VHlwZS5nZXRTY2hlbWEoKS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkZWZzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZWRlZiA9IChYU0RUeXBlRGVmaW5pdGlvbilpdGVyLm5leHQoKTsKLSAgICAgIC8vIFdhbGsgdGhlIGJhc2VUeXBlcyBmcm9tIHRoaXMgdHlwZWRlZiBzZWVpbmcgaWYgYW55IAotICAgICAgLy8gb2YgdGhlbSBtYXRjaCB0aGUgcmVxdWVzdGVkIG9uZQotICAgICAgaWYgKGNvbXBsZXhUeXBlLmVxdWFscyh0eXBlZGVmLmdldEJhc2VUeXBlKCkpKQotICAgICAgewotICAgICAgICAvLyBXZSBmb3VuZCBpdCwgcmV0dXJuIHRoZSBvcmlnaW5hbCBvbmUgYW5kIGNvbnRpbnVlCi0gICAgICAgIHR5cGVzRGVyaXZlZEZyb20uYWRkKHR5cGVkZWYpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHlwZXNEZXJpdmVkRnJvbTsKLSAgfQotICAvLyBUT0RPLi4uIHVzZSB0aGUgWFNEVmlzaXRvciBkZWZpbmVkIGluIHhzZGVkaXRvci51dGlsIGluc3RlYWQKLSAgLy8gICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEQ2hpbGRWaXNpdG9yIGV4dGVuZHMgWFNEVmlzaXRvcgotICB7Ci0gICAgT2JqZWN0IHJvb3Q7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIFhTRENoaWxkVmlzaXRvcihPYmplY3Qgcm9vdCkKLSAgICB7Ci0gICAgICB0aGlzLnJvb3QgPSByb290OwotICAgIH0gICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApCi0gICAgewotICAgICAgaWYgKHhzZE1vZGVsR3JvdXAgIT0gcm9vdCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoeHNkTW9kZWxHcm91cCk7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTRE1vZGVsR3JvdXAoeHNkTW9kZWxHcm91cCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpZiAoeHNkTW9kZWxHcm91cERlZmluaXRpb24gIT0gcm9vdCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbih4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uICE9IHJvb3QpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHhzZEVsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTREVsZW1lbnREZWNsYXJhdGlvbih4c2RFbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiAhPSByb290KQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSAhPSBudWxsIHx8IGdldE1vZGVsQ2hpbGRyZW4oeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKS5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RXaWxkY2FyZChYU0RXaWxkY2FyZCB4c2RXaWxkQ2FyZCkKLSAgICB7Ci0gICAgICBpZiAoeHNkV2lsZENhcmQgIT0gcm9vdCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgbGlzdC5hZGQoeHNkV2lsZENhcmQpOyAgICAgICAgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTRFdpbGRjYXJkKHhzZFdpbGRDYXJkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEVmlzaXRvcgotICB7IAotICAgIGludCBpbmRlbnQgPSAwOwotICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRE9iamVjdChPYmplY3Qgb2JqZWN0KQotICAgIHsgICAgICAgICAgIAotICAgICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIFhTRFN3aXRjaCB0aGVTd2l0Y2ggPSBuZXcgWFNEU3dpdGNoKCkKLSAgICAgIHsgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihvYmplY3QpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IAotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RBdHRyaWJ1dGVVc2Uob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24ob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNETW9kZWxHcm91cERlZmluaXRpb24ob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gc3VwZXIuY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RNb2RlbEdyb3VwKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHN1cGVyLmNhc2VYU0RNb2RlbEdyb3VwKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RQYXJ0aWNsZShYU0RQYXJ0aWNsZSBvYmplY3QpCi0gICAgICAgIHsgCi0gICAgICAgICAgdmlzaXRYU0RQYXJ0aWNsZShvYmplY3QpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IAotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYShYU0RTY2hlbWEgb2JqZWN0KQotICAgICAgICB7IAotICAgICAgICAgIHZpc2l0WFNEU2NoZW1hKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgb2JqZWN0KQotICAgICAgICB7IAotICAgICAgICAgIHZpc2l0WFNEV2lsZGNhcmQob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAKLSAgICAgIH07Ci0gICAgICB0aGVTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3Qpb2JqZWN0KTsKLSAgICB9Ci0gICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlKQotICAgIHsgIAotLy8gICAgICBwcmludEluZGVudGVkKCJAIiArIHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgICB7ICAgICAgICAgCi0vLyAgICAgIHByaW50SW5kZW50ZWQoIlhTRFNjaGVtYSIpOwotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0geHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgeyAgICAgIAotLy8gICAgICBwcmludEluZGVudGVkKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgaW5kZW50ICs9IDI7ICAgICAgICAgCi0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgaWYgKHRkID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRkID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHZpc2l0WFNET2JqZWN0KHRkKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotLy8gICAgICBwcmludEluZGVudGVkKCJYU0RDb21wbGV4VHlwZURlZmluaXRpb24gOiAiICsgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldENvbnRlbnQoKSk7Ci0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVVc2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgICAgICAgIAotICAgICAgICB2aXNpdFhTRE9iamVjdCgoWFNEQXR0cmlidXRlVXNlKWkubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIHZpc2l0WFNET2JqZWN0KHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRDb250ZW50KCkpOwotICAgICAgaW5kZW50IC09IDI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkKLSAgICB7Ci0vLyAgICAgIHByaW50SW5kZW50ZWQoIlhTRE1vZGVsR3JvdXAiKTsKLSAgICAgIGluZGVudCArPSAyOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgIH0gCi0gICAgICBpbmRlbnQgLT0gMjsKLSAgICB9ICAgICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNETW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotLy8gICAgICBwcmludEluZGVudGVkKCJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpOwotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICB2aXNpdFhTRE9iamVjdCh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEUGFydGljbGUoWFNEUGFydGljbGUgeHNkUGFydGljbGUpCi0gICAgewotLy8gICAgICBwcmludEluZGVudGVkKCJYU0RQYXJ0aWNsZSIpOwotICAgICAgaW5kZW50ICs9IDI7ICAgICAgICAgICAgICAgICAKLSAgICAgIGlmICh4c2RQYXJ0aWNsZS5nZXRDb250ZW50KCkgIT0gbnVsbCkKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoeHNkUGFydGljbGUuZ2V0Q29udGVudCgpKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0gCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRFdpbGRjYXJkKFhTRFdpbGRjYXJkIG9iamVjdCkKLSAgICB7IAotLy8gICAgICBwcmludEluZGVudGVkKCJYU0RXaWxkY2FyZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50SW5kZW50ZWQoU3RyaW5nIHN0cmluZykKLSAgICB7IAotICAgICAgLy9TdHJpbmcgc3BhY2VzID0gIiI7Ci0gICAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0gICAgICAvL3sKLSAgICAgIC8vICBzcGFjZXMgKz0gIiAiOwotICAgICAgLy99ICAgICAgICAgICAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihzcGFjZXMgKyBzdHJpbmcpOyAgICAgIAotICAgIH0KLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RDb21wb25lbnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RDb21wb25lbnRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhYTBiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvWFNEQ29tcG9uZW50Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoOwotICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RDb21wb25lbnRWaWV3ZXIgZXh0ZW5kcyBCYXNlR3JhcGhpY2FsVmlld2VyCi17ICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgY29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0OwotICBwdWJsaWMgWFNEQ29tcG9uZW50Vmlld2VyKFhTREVkaXRvciBlZGl0b3IsIElTZWxlY3Rpb25Qcm92aWRlciBtZW51U2VsZWN0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICBzdXBlcihlZGl0b3IsIG1lbnVTZWxlY3Rpb25Qcm92aWRlcik7ICAgICAgIAotICB9ICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBpZiAoaXNJbnB1dEVuYWJsZWQpCi0gICAgewotICAgICAgaW5wdXQgPSBudWxsOyAgICAgICAgIAotCi0gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IAotICAgICAgICAgIGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fAotICAgICAgICAgIGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXAgfHwgICAKLSAgICAgICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB8fAotICAgICAgICAgIGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgaW5wdXQgPSBjb21wb25lbnQ7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydC5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkpCi0gICAgICB7Ci0gICAgICAgIGVkaXRvci5nZXRHcmFwaFZpZXdlcigpLmJhY2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChpc1NlbGVjdGlvbkVuYWJsZWQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJYU0RDb21wb25lbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKCIgKyBjb21wb25lbnQgKyAiKSIpOwotICAgICAgTGlzdCBlZGl0UGFydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIAotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCAKLSAgICAgICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwKLSAgICAgICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwIHx8ICAgICAgICAKLSAgICAgICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB8fAotICAgICAgICAgIGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRFZGl0UGFydChjb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQsIGNvbXBvbmVudCk7ICAgIAotICAgICAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgICAgIHsgCi0gICAgICAgICAgICAvLyBUT0RPIC4uLiB0YWtlIGEgbG9vayBhdCB0aGlzIHRvIGZpZ3VyZSBvdXIgd2h5IGEgbmV3bHkgYWRkZWQgY29tcG9uZW50Ci0gICAgICAgICAgICAvLyBzZWVtcyB0byBoYXZlIHRoZSB3cm9uZyBib3VuZHMgYXQgdGhpcyBwb2ludC4uLiBpcyB0aGlzIGEgbGF5b3V0IGlzc3VlPyAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBcyBhIHRlbXAgaGFjayBJJ20gaWdub3JpbmcgdGhlIHNlbGVjdGlvbiBvZiBjb21wb25lbnQgd2l0aCBib3VuZHMgKHgsIHkpID09ICgwLCAwKQotICAgICAgICAgICAgLy8gUGVyaGFwcyBhIGRlbGF5ZWQgc2VsZWN0aW9uIGlzIHJlcXVpcmVkPwotICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnQpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotICAgICAgICAgICAgaWYgKGJvdW5kcy54ID4gMCB8fCBib3VuZHMueSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVkaXRQYXJ0TGlzdC5hZGQoZWRpdFBhcnQpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IAotICAgICAgICB9ICAgIAotICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICBzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdFBhcnRMaXN0KSk7Ci0gICAgfQotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQWJzdHJhY3RFZGl0UGFydFZpZXdlciNob29rQ29udHJvbCgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBob29rQ29udHJvbCgpCi0gIHsKLSAgICBzdXBlci5ob29rQ29udHJvbCgpOwotICAgIGNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCA9IG5ldyBDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQoKTsKLSAgICBzZXRDb250ZW50cyhjb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RHcmFwaFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RHcmFwaFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5ZjIwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvWFNER3JhcGhVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBYU0RHcmFwaFV0aWwKLXsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWRpdGFibGUoT2JqZWN0IG1vZGVsKQotICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpbW9kZWwpLmdldEVsZW1lbnQoKTsKLSAgICAgIC8vIHRoaXMgdGVzdCBlbnN1cmVzIHRoYXQgd2UgZG9uJ3QgYXR0ZW1wdCB0byBzZWxlY3QgYW4gZWxlbWVudCBmb3IgYW4gZXh0ZXJuYWwgc2NoZW1hCi0gICAgICAvLwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYTUxOb2RlKQotICAgICAgewotICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RHcmFwaFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL1hTREdyYXBoVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNWNmYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL1hTREdyYXBoVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTRFNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3ZpZGVyLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETm90YXRpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotcHVibGljIGNsYXNzIFhTREdyYXBoVmlld2VyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0gIHByb3RlY3RlZCBDb250cm9sIGNvbXBvbmVudFZpZXdlckNvbnRyb2w7Ci0gIHByb3RlY3RlZCBDb250cm9sIGluaGVyaXRhbmNlVmlld2VyQ29udHJvbDsKLSAgcHJvdGVjdGVkIENvbnRyb2wgc3ViR3JvdXBzVmlld2VyQ29udHJvbDsKLSAgcHJvdGVjdGVkIFhTRENvbXBvbmVudFZpZXdlciBjb21wb25lbnRWaWV3ZXI7Ci0gIHByb3RlY3RlZCBYU0RJbmhlcml0YW5jZVZpZXdlciBpbmhlcml0YW5jZVZpZXdlcjsKLSAgcHJvdGVjdGVkIFhTRFN1YnN0aXR1dGlvbkdyb3Vwc1ZpZXdlciBzdWJHcm91cHNWaWV3ZXI7Ci0gIHByb3RlY3RlZCBYU0RTZWxlY3Rpb25NYW5hZ2VyIHhzZFNlbGVjdGlvbk1hbmFnZXI7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICBwcm90ZWN0ZWQgSW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyID0gbmV3IEludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIoKTsKLSAgcHJvdGVjdGVkIFhTREVkaXRvciBlZGl0b3I7Ci0gIHByb3RlY3RlZCBQcmludEdyYXBoQWN0aW9uIHByaW50R3JhcGhBY3Rpb247Ci0gIHByb3RlY3RlZCBTYXNoRm9ybSBzYXNoRm9ybTsKLSAgcHJvdGVjdGVkIFRvb2xJdGVtIGJhY2tCdXR0b247Ci0KLSAgcHVibGljIFhTREdyYXBoVmlld2VyKFhTREVkaXRvciBlZGl0b3IpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICBUb29sQmFyIGdyYXBoVG9vbEJhcjsgLy8gdGhlIHRvb2xiYXIgYXQgdGhlIHRvcCBvZiB0aGUgZ3JhcGggdmlldwotICBUb29sSXRlbSB0b29sSXRlbTsgLy8gdGhlIHZpZXcgdG9vbCBpdGVtCi0gIFZpZXdGb3JtIGZvcm07IC8vIHZpZXcgZm9ybSBmb3IgaG9sZGluZyBhbGwgdGhlIHZpZXdzCi0gIENvbXBvc2l0ZSBmcmFtZUJhcjsgLy8gVGhlIGNvbXBvc2l0ZSB0aGF0IGNvbnRhaW5zIHRoZSB0b29sYmFyCi0gIENvbXBvc2l0ZSBjOyAvLyB0ZW1wb3JhcnkgYmxhbmsgcGFnZS4gQ2xlYW4gdGhpcyB1cCB3aGVuIGFsbCB2aWV3cyBjb21wbGV0ZWQKLSAgTGlua2VkR3JhcGhWaWV3ZXIgbGlua0luaGVyaXRhbmNlVmlld2VyOwotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUluaGVyaXRhbmNlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBsaW5rSW5oZXJpdGFuY2VWaWV3ZXIgPSBuZXcgTGlua2VkR3JhcGhWaWV3ZXIoZWRpdG9yLCBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyKTsKLSAgICBCYXNlR3JhcGhpY2FsVmlld2VyIGdyYXBoVmlld2VyID0gbmV3IFhTREluaGVyaXRhbmNlVmlld2VyKGVkaXRvciwgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgbGlua0luaGVyaXRhbmNlVmlld2VyLnNldE1ham9yVmlld2VyKGdyYXBoVmlld2VyKTsKLSAgICBncmFwaFZpZXdlciA9IG5ldyBYU0RDb21wb25lbnRWaWV3ZXIoZWRpdG9yLCBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBsaW5rSW5oZXJpdGFuY2VWaWV3ZXIuc2V0TWlub3JWaWV3ZXIoZ3JhcGhWaWV3ZXIpOwotICAgIGxpbmtJbmhlcml0YW5jZVZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gIH0KLSAgTGlua2VkR3JhcGhWaWV3ZXIgbGlua1N1YnN0aXR1dGlvbkdyb3VwVmlld2VyOwotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVN1YnN0aXR1dGlvbkdyb3VwVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBsaW5rU3Vic3RpdHV0aW9uR3JvdXBWaWV3ZXIgPSBuZXcgTGlua2VkR3JhcGhWaWV3ZXIoZWRpdG9yLCBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyKTsKLSAgICBCYXNlR3JhcGhpY2FsVmlld2VyIGdyYXBoVmlld2VyID0gbmV3IFhTRFN1YnN0aXR1dGlvbkdyb3Vwc1ZpZXdlcihlZGl0b3IsIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpOwotICAgIGxpbmtTdWJzdGl0dXRpb25Hcm91cFZpZXdlci5zZXRNYWpvclZpZXdlcihncmFwaFZpZXdlcik7Ci0gICAgZ3JhcGhWaWV3ZXIgPSBuZXcgWFNEQ29tcG9uZW50Vmlld2VyKGVkaXRvciwgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgbGlua1N1YnN0aXR1dGlvbkdyb3VwVmlld2VyLnNldE1pbm9yVmlld2VyKGdyYXBoVmlld2VyKTsKLSAgICBsaW5rU3Vic3RpdHV0aW9uR3JvdXBWaWV3ZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICB9Ci0gIHN0YXRpYyBwcml2YXRlIENvbG9yIGRpdmlkZXJDb2xvcjsKLQotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIDApOwotICAgIAotICAgIC8vY29tcG9uZW50Vmlld2VyID0gbmV3IFhTRENvbXBvbmVudFZpZXdlcihlZGl0b3IsIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpOwotICAgIGNvbXBvbmVudFZpZXdlciA9IG5ldyBYU0RDb21wb25lbnRWaWV3ZXIoZWRpdG9yLCBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBWaWV3VXRpbGl0eSB1dGlsID0gbmV3IFZpZXdVdGlsaXR5KCk7Ci0gICAgZmluYWwgQ29tcG9zaXRlIGNsaWVudDsKLSAgICBTdHJpbmcgZGVzaWduTGF5b3V0UG9zaXRpb24gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0RGVzaWduTGF5b3V0UG9zaXRpb24oKTsKLSAgICBmb3JtID0gbmV3IFZpZXdGb3JtKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0gICAgZnJhbWVCYXIgPSBuZXcgQ29tcG9zaXRlKGZvcm0sIFNXVC5OT05FKTsKLSAgICBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQgZnJhbWVMYXlvdXQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0KCk7Ci0gICAgZnJhbWVMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGZyYW1lTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZnJhbWVCYXIuc2V0TGF5b3V0KGZyYW1lTGF5b3V0KTsKLSAgICBncmFwaFRvb2xCYXIgPSBuZXcgVG9vbEJhcihmcmFtZUJhciwgU1dULkZMQVQpOwotICAgIGdyYXBoVG9vbEJhci5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKQotICAgICAgewotICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX01ORU1PTklDKQotICAgICAgICAgIGUuZG9pdCA9IGZhbHNlOwotICAgICAgfQotICAgIH0pOwotICAgIGJhY2tCdXR0b24gPSBuZXcgVG9vbEl0ZW0oZ3JhcGhUb29sQmFyLCBTV1QuUFVTSCk7Ci0gICAgYmFja0J1dHRvbi5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2JhY2suZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgYmFja0J1dHRvbi5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfSE9WRVJfQkFDS19UT19TQ0hFTUFfVklFVyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGJhY2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgYmFja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsKLSAgICAgICAgZWRpdG9yLmdldEdyYXBoVmlld2VyKCkuc2V0SW5wdXQoZWRpdG9yLmdldFhTRFNjaGVtYSgpKTsKLSAgICAgICAgLy8gaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdG9yLmdldFhTRFNjaGVtYSgpKSk7Ci0gICAgICAgIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRvci5nZXRYU0RTY2hlbWEoKSkpOwotICAgICAgfQotICAgIH0pOwotICAgIC8vIFRFTVBPUkFSSUxZIFJFTU9WRSBESUZGRVJFTlQgVklFV1MKLSAgICAvLyAgICB0b29sSXRlbSA9IG5ldyBUb29sSXRlbShncmFwaFRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotICAgIC8vCi0gICAgLy8gICAgLy8gc2V0IGRlZmF1bHQgdG8gY29udGFpbm1lbnQKLSAgICAvLy8vIHRvb2xJdGVtLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTlRBSU5NRU5UIikpOwotICAgIC8vICAgIHRvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAvLyAgICB7Ci0gICAgLy8gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIC8vICAgICAgewotICAgIC8vICAgICAgICBNZW51IG1lbnUgPSBuZXcgTWVudShncmFwaFRvb2xCYXIpOwotICAgIC8vICAgICAgICBpZiAobWVudSAhPSBudWxsKQotICAgIC8vICAgICAgICB7Ci0gICAgLy8gICAgICAgICAgaWYgKCFzaG93R3JhcGhNZW51KG1lbnUpKQotICAgIC8vICAgICAgICAgIHsKLSAgICAvLyAgICAgICAgICAgIGZyYW1lQmFyLnNldFZpc2libGUoZmFsc2UpOwotICAgIC8vICAgICAgICAgICAgcmV0dXJuOwotICAgIC8vICAgICAgICAgIH0KLSAgICAvLyAgICAgICAgICBSZWN0YW5nbGUgYiA9IHRvb2xJdGVtLmdldEJvdW5kcygpOwotICAgIC8vICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCBwID0gdG9vbEl0ZW0uZ2V0UGFyZW50KCkudG9EaXNwbGF5KG5ldwotICAgIC8vIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludChiLngsIGIueSArIGIuaGVpZ2h0KSk7Ci0gICAgLy8gICAgICAgICAgbWVudS5zZXRMb2NhdGlvbihwLngsIHAueSk7Ci0gICAgLy8gICAgICAgICAgbWVudS5zZXRWaXNpYmxlKHRydWUpOwotICAgIC8vICAgICAgICB9Ci0gICAgLy8gICAgICB9Ci0gICAgLy8gICAgfSk7Ci0gICAgZm9ybS5zZXRUb3BMZWZ0KGZyYW1lQmFyKTsKLSAgICAvLyAgICBjcmVhdGVJbmhlcml0YW5jZVZpZXdlcihmb3JtKTsKLSAgICAvLyAgICBjcmVhdGVTdWJzdGl0dXRpb25Hcm91cFZpZXdlcihmb3JtKTsKLSAgICBjb21wb25lbnRWaWV3ZXJDb250cm9sID0gY29tcG9uZW50Vmlld2VyLmNyZWF0ZUNvbnRyb2woZm9ybSk7Ci0gICAgLy9pbmhlcml0YW5jZVZpZXdlckNvbnRyb2wgPSBpbmhlcml0YW5jZVZpZXdlci5jcmVhdGVDb250cm9sKGZvcm0pOwotICAgIC8vc3ViR3JvdXBzVmlld2VyQ29udHJvbCA9IHN1Ykdyb3Vwc1ZpZXdlci5jcmVhdGVDb250cm9sKGZvcm0pOwotICAgIGMgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoZm9ybSwgMSk7Ci0gICAgZm9ybS5zZXRDb250ZW50KGNvbXBvbmVudFZpZXdlckNvbnRyb2wpOwotICAgIC8vIGNvbXBvbmVudFZpZXdlckNvbnRyb2wuc2V0RGF0YSgibGF5b3V0IHJhdGlvIiwgbmV3IEZsb2F0KDAuNjUpKTsKLSAgICBmb3JtLnNldERhdGEoImxheW91dCByYXRpbyIsIG5ldyBGbG9hdCgwLjY1KSk7Ci0gICAgaWYgKGRpdmlkZXJDb2xvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGRpdmlkZXJDb2xvciA9IG5ldyBDb2xvcihjb21wb25lbnRWaWV3ZXJDb250cm9sLmdldERpc3BsYXkoKSwgMTQzLCAxNDEsIDEzOCk7Ci0gICAgfQotICAgIC8vS0NQb3J0Ci0gICAgLy8gICAgY2xpZW50LmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKQotICAgIC8vICAgIHsKLSAgICAvLyAgICAgIC8qKgotICAgIC8vICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXIjcGFpbnRDb250cm9sKFBhaW50RXZlbnQpCi0gICAgLy8gICAgICAgKi8KLSAgICAvLyAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpCi0gICAgLy8gICAgICB7Ci0gICAgLy8gICAgICAgIE9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotICAgIC8vICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQ29tcG9zaXRlKQotICAgIC8vICAgICAgICB7Ci0gICAgLy8gICAgICAgICAgQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKXNvdXJjZTsKLSAgICAvLyAgICAgICAgICBSZWN0YW5nbGUgYm91bmRhcnkgPSBjb21wLmdldENsaWVudEFyZWEoKTsKLSAgICAvLyAgICAgICAgICBlLmdjLnNldEZvcmVncm91bmQoZGl2aWRlckNvbG9yKTsKLSAgICAvLyAgICAgICAgICBlLmdjLmRyYXdMaW5lKGJvdW5kYXJ5LngsIGJvdW5kYXJ5LnksIGJvdW5kYXJ5LnggKyBib3VuZGFyeS53aWR0aCwKLSAgICAvLyBib3VuZGFyeS55KTsKLSAgICAvLyAgICAgICAgICBlZGl0b3Iuc2V0RGVzaWduV2VpZ2h0cyhzYXNoRm9ybS5nZXRXZWlnaHRzKCksIHRydWUpOwotICAgIC8vICAgICAgICB9Ci0gICAgLy8gICAgICB9Ci0gICAgLy8gICAgfSk7Ci0gICAgLy8gS0NQb3J0Ci0gICAgLy8gICAgZGVzaWduVmlldyA9IG5ldyBEZXNpZ25WaWV3ZXIoZWRpdG9yKTsKLSAgICAvLyAgICBmaW5hbCBDb250cm9sIGRlc2lnbiA9IGRlc2lnblZpZXcuY3JlYXRlQ29udHJvbChjbGllbnQpOwotICAgIC8vICAgIGRlc2lnbi5zZXRMYXlvdXREYXRhKFZpZXdVdGlsaXR5LmNyZWF0ZUZpbGwoKSk7Ci0gICAgLy8gICAgY2xpZW50LnNldERhdGEoImxheW91dCByYXRpbyIsIG5ldyBGbG9hdCgwLjM1KSk7Ci0gICAgLy8gICAgZW5hYmxlRGVzaWduVmlldyhlZGl0b3IuaXNDb21iaW5lZERlc2lnbkFuZFNvdXJjZVZpZXcoKSk7Ci0gICAgLy8gICAgcGFnZUJvb2suc2hvd1BhZ2Uoc2FzaEZvcm0pOwotICAgIHBhZ2VCb29rLnNob3dQYWdlKGZvcm0pOwotICAgIGNvbXBvbmVudFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgLy9pbmhlcml0YW5jZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgLy8gVGVtcG9yYXJpbHkgcmVtb3ZlIGdyYXBoIHRvb2wgYmFyCi0gICAgLy8gICAgbGlua0luaGVyaXRhbmNlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICAvLyAgICBsaW5rU3Vic3RpdHV0aW9uR3JvdXBWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgIHByaW50R3JhcGhBY3Rpb24gPSBuZXcgUHJpbnRHcmFwaEFjdGlvbihjb21wb25lbnRWaWV3ZXIpOwotICAgIHJldHVybiBwYWdlQm9vazsKLSAgICAvLyAgICByZXR1cm4gZm9ybTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBzaG93R3JhcGhNZW51KE1lbnUgbWVudSkKLSAgewotICAgIE1lbnVJdGVtIGNvbnRhaW5tZW50TWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlJBRElPKTsKLSAgICBjb250YWlubWVudE1lbnVJdGVtLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTlRBSU5NRU5UIikpOwotICAgIGNvbnRhaW5tZW50TWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIHRvb2xJdGVtLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTlRBSU5NRU5UIikpOwotICAgICAgICBmcmFtZUJhci5sYXlvdXQodHJ1ZSk7Ci0gICAgICAgIGdyYXBoVG9vbEJhci5sYXlvdXQodHJ1ZSk7Ci0gICAgICAgIGZvcm0uc2V0Q29udGVudChjb21wb25lbnRWaWV3ZXJDb250cm9sKTsKLSAgICAgICAgLy8gcmV0cmlldmUgbGF0ZXN0IGlucHV0IHdoaWNoIGNvdWxkIGhhdmUgY2hhbmdlZC4uLmZyb20gZGVzaWduVmlldyA/PwotICAgICAgICAvLyBnZXQgaXQgZGlyZWN0bHk/Ci0gICAgICAgIC8vIEtDUG9ydAotICAgICAgICAvLyAgICAgICAgc2V0SW5wdXQoZGVzaWduVmlldy5nZXRJbnB1dCgpKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBNZW51SXRlbSBpbmhlcml0YW5jZU1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5SQURJTyk7Ci0gICAgaW5oZXJpdGFuY2VNZW51SXRlbS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9JTkhFUklUQU5DRSIpKTsKLSAgICBpbmhlcml0YW5jZU1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgewotICAgICAgICB0b29sSXRlbS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9JTkhFUklUQU5DRSIpKTsKLSAgICAgICAgZnJhbWVCYXIubGF5b3V0KHRydWUpOwotICAgICAgICBncmFwaFRvb2xCYXIubGF5b3V0KHRydWUpOwotICAgICAgICAvLyAgICAgICAgZm9ybS5zZXRDb250ZW50KGluaGVyaXRhbmNlVmlld2VyQ29udHJvbCk7Ci0gICAgICAgIGZvcm0uc2V0Q29udGVudChsaW5rSW5oZXJpdGFuY2VWaWV3ZXIuZ2V0Q29udHJvbCgpKTsKLSAgICAgICAgaWYgKGxpbmtJbmhlcml0YW5jZVZpZXdlci5nZXRJbnB1dCgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBsaW5rSW5oZXJpdGFuY2VWaWV3ZXIuc2V0SW5wdXQoc2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIE1lbnVJdGVtIHN1Ykdyb3Vwc01lbnVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5SQURJTyk7Ci0gICAgc3ViR3JvdXBzTWVudUl0ZW0uc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU1VCU1RJVFVUSU9OX0dST1VQUyIpKTsKLSAgICBzdWJHcm91cHNNZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsKLSAgICAgICAgdG9vbEl0ZW0uc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU1VCU1RJVFVUSU9OX0dST1VQUyIpKTsKLSAgICAgICAgZnJhbWVCYXIubGF5b3V0KHRydWUpOwotICAgICAgICBncmFwaFRvb2xCYXIubGF5b3V0KHRydWUpOwotICAgICAgICBmb3JtLnNldENvbnRlbnQobGlua1N1YnN0aXR1dGlvbkdyb3VwVmlld2VyLmdldENvbnRyb2woKSk7Ci0gICAgICAgIC8vIHJldHJpZXZlIGxhdGVzdCBpbnB1dCB3aGljaCBjb3VsZCBoYXZlIGNoYW5nZWQuLi5mcm9tIGRlc2lnblZpZXcgPz8KLSAgICAgICAgLy8gZ2V0IGl0IGRpcmVjdGx5PwotICAgICAgICAvLyAgICAgICAgc2V0SW5wdXQoZGVzaWduVmlldy5nZXRJbnB1dCgpKTsKLSAgICAgICAgaWYgKGxpbmtTdWJzdGl0dXRpb25Hcm91cFZpZXdlci5nZXRJbnB1dCgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBsaW5rU3Vic3RpdHV0aW9uR3JvdXBWaWV3ZXIuc2V0SW5wdXQoc2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGlmICh0b29sSXRlbS5nZXRUZXh0KCkuZXF1YWxzKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9DT05UQUlOTUVOVCIpKSkKLSAgICB7Ci0gICAgICBjb250YWlubWVudE1lbnVJdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodG9vbEl0ZW0uZ2V0VGV4dCgpLmVxdWFscyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfSU5IRVJJVEFOQ0UiKSkpCi0gICAgewotICAgICAgaW5oZXJpdGFuY2VNZW51SXRlbS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHRvb2xJdGVtLmdldFRleHQoKS5lcXVhbHMoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NVQlNUSVRVVElPTl9HUk9VUFMiKSkpCi0gICAgewotICAgICAgc3ViR3JvdXBzTWVudUl0ZW0uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBBY3Rpb24gZ2V0UHJpbnRHcmFwaEFjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gcHJpbnRHcmFwaEFjdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZURlc2lnbkxheW91dChpbnQgbmV3TGF5b3V0KQotICB7Ci0gICAgc2FzaEZvcm0uc2V0T3JpZW50YXRpb24obmV3TGF5b3V0KTsKLSAgICBzYXNoRm9ybS5sYXlvdXQoKTsKLSAgfQotCi0gIHB1YmxpYyBTYXNoRm9ybSBnZXRTYXNoRm9ybSgpCi0gIHsKLSAgICByZXR1cm4gc2FzaEZvcm07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmFibGVEZXNpZ25WaWV3KGJvb2xlYW4gZW5hYmxlKQotICB7Ci0gIH0KLQotICBwdWJsaWMgWFNEQ29tcG9uZW50Vmlld2VyIGdldENvbXBvbmVudFZpZXdlcigpCi0gIHsKLSAgICByZXR1cm4gY29tcG9uZW50Vmlld2VyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRCYWNrQnV0dG9uRW5hYmxlZChib29sZWFuIHN0YXRlKQotICB7Ci0gICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKHN0YXRlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgb2JqZWN0OwotICAgICAgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBjb21wb25lbnRWaWV3ZXIuc2V0SW5wdXQoeHNkQ29tcCk7Ci0gICAgICBjb21wb25lbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKHhzZENvbXApOwotICAgIH0gICAKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzRGVsZXRlZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCAmJiBjb21wb25lbnQuZ2V0RWxlbWVudCgpICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gY29tcG9uZW50LmdldEVsZW1lbnQoKS5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbk1hbmFnZXIoWFNEU2VsZWN0aW9uTWFuYWdlciBuZXdTZWxlY3Rpb25NYW5hZ2VyKQotICB7Ci0gICAgLy8gZGlzY29ubmVjdCBmcm9tIG9sZCBvbmUKLSAgICBpZiAoeHNkU2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHhzZFNlbGVjdGlvbk1hbmFnZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgICAgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoeHNkU2VsZWN0aW9uTWFuYWdlcik7Ci0gICAgfQotICAgIHhzZFNlbGVjdGlvbk1hbmFnZXIgPSBuZXdTZWxlY3Rpb25NYW5hZ2VyOwotICAgIC8vIGNvbm5lY3QgdG8gbmV3IG9uZQotICAgIGlmICh4c2RTZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgeHNkU2VsZWN0aW9uTWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgICBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih4c2RTZWxlY3Rpb25NYW5hZ2VyKTsKLSAgICB9Ci0gIH0KLQotICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFNlbGVjdGlvbk1hbmFnZXIgdG8gbm90aWZ5IHRoZSBncmFwaCB2aWV3Ci0gIC8vIHRoYXQgdGhlIGVkaXRvciBzZWxlY3Rpb24gaGFzIGNoYW5nZWQKLSAgLy8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBoZXJlIHdlIGNoZWNrIHRoZSBzZWxlY3Rpb24gc291cmNlIHRvIGVuc3VyZSB0aGF0IHRoaXMgc2VsZWN0aW9uIGNhbWUKLSAgICAvLyBmcm9tIGEgZGlmZmVyZW50IHZpZXcgKG5vdCBmcm9tIHRoZSBncmFwaCB2aWV3KQotICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSAhPSBnZXRDb21wb25lbnRWaWV3ZXIoKSkKLSAgICB7IAotICAgICAgaGFuZGxlU2VsZWN0aW9uKGV2ZW50LCB0cnVlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0VG9wTGV2ZWxDb21wb25lbnQoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcHJldiA9IGNvbXBvbmVudDsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb250YWluZXIgPSBjb21wb25lbnQ7Ci0gICAgd2hpbGUgKCBjb250YWluZXIgIT0gbnVsbCAmJiAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIFhTRFNjaGVtYSkpCi0gICAgewotICAgICAgcHJldiA9IGNvbnRhaW5lcjsgICAgIAotICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLmdldENvbnRhaW5lcigpOwotICAgIH0KLSAgICByZXR1cm4gY29udGFpbmVyICE9IG51bGwgPyBwcmV2IDogbnVsbDsKLSAgfQotICAKLSAgLy8gVE9ETy4uIHdlIG5lZWQgdG8gY2xlYW4gdGhpcyBtZXRob2QgdXAgYW5kIGFkZCBjb21tZW50cyB0byBjbGFyaWZ5IHdoYXQncyBnb2luZyBvbgotICAvLwotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb24oU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50LCBib29sZWFuIGlzU2VsZWN0aW9uUmVxdWlyZWQpCi0gIHsKLSAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMgPSAoU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICBPYmplY3Qgb2JqID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWRDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqOwotICAgICAgT2JqZWN0IGN1cnJlbnRJbnB1dCA9IGdldENvbXBvbmVudFZpZXdlcigpLmdldElucHV0KCk7Ci0gICAgICAKLSAgICAgIC8vIGluIHRoaXMgY2FzZSB3ZSdyZSBsb29raW5nIGF0IGEgdG9wIGxldmVsIHZpZXcKLSAgICAgIC8vIHNvIGlmIHRoZSBzZWxlY3Rpb24gaXMgYSAnbm9uLXRvcC1sZXZlbCcgY29tcG9uZW50IHdlIG5lZWQgdG8gZG8gYSBzZXQgaW5wdXQKLSAgICAgIFhTRFNjaGVtYSB0b3BMZXZlbFNjaGVtYSA9IG51bGw7Ci0gICAgICBpZiAoY3VycmVudElucHV0IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgewotICAgICAgICBpZiAoc2VsZWN0ZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwgCi0gICAgICAgICAgICBzZWxlY3RlZENvbXBvbmVudC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIHRvcExldmVsU2NoZW1hID0gKFhTRFNjaGVtYSljdXJyZW50SW5wdXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzZWxlY3RlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSB8fCAKLSAgICAgICAgICBzZWxlY3RlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE5vdGF0aW9uRGVjbGFyYXRpb24pICAgICAgCi0gICAgICB7Ci0gICAgICAgIHRvcExldmVsU2NoZW1hID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCB8fAotICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkQ29tcG9uZW50LmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgdG9wTGV2ZWxTY2hlbWEgPSBzZWxlY3RlZENvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pc2VsZWN0ZWRDb21wb25lbnQ7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gY29tcG9uZW50Vmlld2VyLmdldEVkaXRQYXJ0KGNvbXBvbmVudFZpZXdlci5nZXRSb290RWRpdFBhcnQoKSwgc3QpOwotICAgICAgICBpZiAoZWRpdFBhcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChzdC5nZXRDb250YWluZXIoKSA9PSBlZGl0b3IuZ2V0WFNEU2NoZW1hKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdG9wTGV2ZWxTY2hlbWEgPSBzZWxlY3RlZENvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHRvcExldmVsU2NoZW1hICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldElucHV0KHRvcExldmVsU2NoZW1hKTsKLSAgICAgICAgLy8gVE9ETy4uLiB0aGlzIGlzIG5vdCAncXVpdGUnIHJpZ2h0Ci0gICAgICAgIC8vIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byB2aWV3IGluCi0gICAgICB9ICAKLSAgICAgIGVsc2UKLSAgICAgIHsgCi0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0Q29tcG9uZW50Vmlld2VyKCkuZ2V0RWRpdFBhcnQoZ2V0Q29tcG9uZW50Vmlld2VyKCkuZ2V0Um9vdEVkaXRQYXJ0KCksIG9iaik7Ci0gICAgICAgIGlmIChlZGl0UGFydCA9PSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0b3BMZXZlbENvbXBvbmVudCA9IGdldFRvcExldmVsQ29tcG9uZW50KHNlbGVjdGVkQ29tcG9uZW50KTsKLSAgICAgICAgICBpZiAodG9wTGV2ZWxDb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXRJbnB1dCh0b3BMZXZlbENvbXBvbmVudCk7ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgICAvLyBub3cgd2UgaGFuZGxlIHRoZSBzZWxlY3Rpb24KLSAgICAgIC8vCi0gICAgICBpZiAoaXNTZWxlY3Rpb25SZXF1aXJlZCkKLSAgICAgIHsgIAotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldENvbXBvbmVudFZpZXdlcigpLmdldFJvb3RFZGl0UGFydCgpOyAgICAgICAgCi0gICAgICAgIEVkaXRQYXJ0IG5ld1NlbGVjdGVkRWRpdFBhcnQgPSBnZXRDb21wb25lbnRWaWV3ZXIoKS5nZXRFZGl0UGFydChlZGl0UGFydCwgb2JqKTsKLSAgICAgICAgaWYgKG5ld1NlbGVjdGVkRWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChuZXdTZWxlY3RlZEVkaXRQYXJ0IGluc3RhbmNlb2YgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAoKFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpbmV3U2VsZWN0ZWRFZGl0UGFydCkuc2V0U2Nyb2xsKHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBnZXRDb21wb25lbnRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0ZWRFZGl0UGFydCkpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICB7Ci0gICAgICBzZXRJbnB1dCgoKENhdGVnb3J5QWRhcHRlcilvYmopLmdldFhTRFNjaGVtYSgpKTsgIAotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldEVsZW1lbnROb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHdoaWxlICghKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkKLSAgICB7Ci0gICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHIpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFRleHQpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgc2libGluZyA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgaWYgKHNpYmxpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBzaWJsaW5nOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgRWxlbWVudCA/IChFbGVtZW50KSBub2RlIDogbnVsbDsKLSAgfQotCi0KLQotICAvLyBUaGlzIGNsYXNzIGxpc3RlbnMgdG8gdGhlIGdyYXBoIHZpZXcgYW5kIGNvbnZlcnRzIGVkaXQgcGFydCBzZWxlY3Rpb24KLSAgLy8gZXZlbnRzCi0gIC8vIGludG8gWFNEIGNvbXBvbmVudCBzZWxlY3Rpb24gZXZlbnRzIHRoYXQgY2FuIGJlICdmaXJlZCcgdG8gdGhlCi0gIC8vIHNlbGVjdGlvbk1hbmFnZXIKLSAgLy8KLSAgY2xhc3MgSW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGkubmV4dCgpOwotICAgICAgICBsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RydWN0dXJlZFNlbGVjdGlvbiBjb252ZXJ0U2VsZWN0aW9uRnJvbUVkaXRQYXJ0VG9Nb2RlbChJU2VsZWN0aW9uIGVkaXRQYXJ0U2VsZWN0aW9uKQotICAgIHsKLSAgICAgIExpc3Qgc2VsZWN0ZWRNb2RlbE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBpZiAoZWRpdFBhcnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZWRpdFBhcnRTZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgICAgICBPYmplY3QgbW9kZWwgPSBudWxsOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgb2JqOwotICAgICAgICAgICAgbW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgICAgICAgLy8gQ29udmVydCBjYXRlZ29yeSB0byBYU0RTY2hlbWEKLSAgICAgICAgICAgIC8vIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhdGVnb3J5RWRpdFBhcnQpCi0gICAgICAgICAgICAvLyB7Ci0gICAgICAgICAgICAvLyAgIG1vZGVsID0gKChDYXRlZ29yeSkoKENhdGVnb3J5RWRpdFBhcnQpZWRpdFBhcnQpLmdldE1vZGVsKCkpLmdldFhTRFNjaGVtYSgpOwotICAgICAgICAgICAgLy8gfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL2NzIC4uIG5vdCBzdXJlIHdoeSB3b3VsZCB3ZSdkIGV2ZXIgaGl0IHRoaXMgY2FzZT8KLSAgICAgICAgICAgIG1vZGVsID0gb2JqOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCkvLyYmIG1vZGVsIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWRNb2RlbE9iamVjdExpc3QuYWRkKG1vZGVsKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZE1vZGVsT2JqZWN0TGlzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICAgIHsKLSAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIC8vIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYW4gZWRpdCBwYXJ0IGluIHRoZSBncmFwaCB2aWV3IGlzIHNlbGVjdGVkCi0gICAgLy8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBJU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiA9IGNvbnZlcnRTZWxlY3Rpb25Gcm9tRWRpdFBhcnRUb01vZGVsKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotICAgICAgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IG5ld0V2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChnZXRDb21wb25lbnRWaWV3ZXIoKSwgbmV3U2VsZWN0aW9uKTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhuZXdFdmVudCk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL1hTREdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YzgwMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL1hTREdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGg7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5LZXlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5FeHBhbmRhYmxlR3JhcGhOb2RlRWRpdFBhcnQ7Ci0KLQotcHVibGljIGNsYXNzIFhTREdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIgZXh0ZW5kcyBLZXlIYW5kbGVyCi17Ci0gICAgcHVibGljIFhTREdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIGNhY2hlZE5vZGU7Ci0gICAgaW50IGNvdW50ZXI7Ci0gICAgcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgdmlld2VyOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGFjY2VwdENvbm5lY3Rpb24oS2V5RXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgcmV0dXJuIGV2ZW50LmNoYXJhY3RlciA9PSAnLycKLSAgICAgICAgfHwgZXZlbnQuY2hhcmFjdGVyID09ICc/JwotICAgICAgICB8fCBldmVudC5jaGFyYWN0ZXIgPT0gJ1xcJwotICAgICAgICB8fCBldmVudC5jaGFyYWN0ZXIgPT0gJ3wnOwotICAgIH0KLSAgICBwcml2YXRlIGJvb2xlYW4gYWNjZXB0SW50b0NvbnRhaW5lcihLZXlFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gKCgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMCkKLSAgICAgICAgJiYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1JJR0hUKSkgfHwgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1JJR0hUKTsKLS8vICAgICAgcmV0dXJuIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19SSUdIVCk7Ci0gICAgfQotICAgIHByaXZhdGUgYm9vbGVhbiBhY2NlcHRMZWF2ZUNvbm5lY3Rpb24oS2V5RXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgaW50IGtleSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBpZiAoZ2V0Rm9jdXMoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25FZGl0UGFydCkKLSAgICAgICAgaWYgKChrZXkgPT0gU1dULkFSUk9XX1VQKQotICAgICAgICAgIHx8IChrZXkgPT0gU1dULkFSUk9XX1JJR0hUKQotICAgICAgICAgIHx8IChrZXkgPT0gU1dULkFSUk9XX0RPV04pCi0gICAgICAgICAgfHwgKGtleSA9PSBTV1QuQVJST1dfTEVGVCkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHByaXZhdGUgYm9vbGVhbiBhY2NlcHRMZWF2ZUNvbnRlbnRzKEtleUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIGludCBrZXkgPSBldmVudC5rZXlDb2RlOwotICAgICAgcmV0dXJuIGdldEZvY3VzKCkgPT0gZ2V0Vmlld2VyKCkuZ2V0Q29udGVudHMoKQotICAgICAgICAmJiAoKGtleSA9PSBTV1QuQVJST1dfVVApCi0gICAgICAgICAgfHwgKGtleSA9PSBTV1QuQVJST1dfUklHSFQpCi0gICAgICAgICAgfHwgKGtleSA9PSBTV1QuQVJST1dfRE9XTikKLSAgICAgICAgICB8fCAoa2V5ID09IFNXVC5BUlJPV19MRUZUKSk7Ci0gICAgfQotICAgIHByaXZhdGUgYm9vbGVhbiBhY2NlcHRPdXRPZihLZXlFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gKCgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMCkgJiYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX0xFRlQpKSB8fCAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfTEVGVCk7Ci0vLyAgICAgIHJldHVybiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfTEVGVCk7Ci0gICAgfQotICAgIHByaXZhdGUgQ29ubmVjdGlvbkVkaXRQYXJ0IGZpbmRDb25uZWN0aW9uKAotICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgbm9kZSwKLSAgICAgIENvbm5lY3Rpb25FZGl0UGFydCBjdXJyZW50LAotICAgICAgYm9vbGVhbiBmb3J3YXJkKQotICAgIHsKLSAgICAgIExpc3QgY29ubmVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KG5vZGUuZ2V0U291cmNlQ29ubmVjdGlvbnMoKSk7Ci0gICAgICBjb25uZWN0aW9ucy5hZGRBbGwobm9kZS5nZXRUYXJnZXRDb25uZWN0aW9ucygpKTsKLSAgICAgIGlmIChjb25uZWN0aW9ucy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgaWYgKGZvcndhcmQpCi0gICAgICAgIGNvdW50ZXIrKzsKLSAgICAgIGVsc2UKLSAgICAgICAgY291bnRlci0tOwotICAgICAgd2hpbGUgKGNvdW50ZXIgPCAwKQotICAgICAgICBjb3VudGVyICs9IGNvbm5lY3Rpb25zLnNpemUoKTsKLSAgICAgIGNvdW50ZXIgJT0gY29ubmVjdGlvbnMuc2l6ZSgpOwotICAgICAgcmV0dXJuIChDb25uZWN0aW9uRWRpdFBhcnQpIGNvbm5lY3Rpb25zLmdldChjb3VudGVyICUgY29ubmVjdGlvbnMuc2l6ZSgpKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBwU3RhcnQgaXMgYSBwb2ludCBpbiBhYnNvbHV0ZSBjb29yZGluYXRlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEdyYXBoaWNhbEVkaXRQYXJ0IGZpbmRTaWJsaW5nKAotICAgICAgTGlzdCBzaWJsaW5ncywKLSAgICAgIFBvaW50IHBTdGFydCwKLSAgICAgIGludCBkaXJlY3Rpb24sCi0gICAgICBFZGl0UGFydCBleGNsdWRlKQotICAgIHsKLSAgICAgIEdyYXBoaWNhbEVkaXRQYXJ0IGVwQ3VycmVudDsKLSAgICAgIEdyYXBoaWNhbEVkaXRQYXJ0IGVwRmluYWwgPSBudWxsOwotICAgICAgSUZpZ3VyZSBmaWd1cmU7Ci0gICAgICBQb2ludCBwQ3VycmVudDsKLSAgICAgIGludCBkaXN0YW5jZSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgSXRlcmF0b3IgaXRlciA9IHNpYmxpbmdzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIGVwQ3VycmVudCA9IChHcmFwaGljYWxFZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmIChlcEN1cnJlbnQgPT0gZXhjbHVkZSkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZmlndXJlID0gZXBDdXJyZW50LmdldEZpZ3VyZSgpOwotICAgICAgICBwQ3VycmVudCA9IGdldEludGVyZXN0aW5nUG9pbnQoZmlndXJlKTsKLSAgICAgICAgZmlndXJlLnRyYW5zbGF0ZVRvQWJzb2x1dGUocEN1cnJlbnQpOwotICAgICAgICBpZiAocFN0YXJ0LmdldFBvc2l0aW9uKHBDdXJyZW50KSAhPSBkaXJlY3Rpb24pCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGludCBkID0gcEN1cnJlbnQuZ2V0RGlzdGFuY2VPcnRob2dvbmFsKHBTdGFydCk7Ci0gICAgICAgIGlmIChkIDwgZGlzdGFuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICBkaXN0YW5jZSA9IGQ7Ci0gICAgICAgICAgZXBGaW5hbCA9IGVwQ3VycmVudDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGVwRmluYWw7Ci0gICAgfQotICAgIFBvaW50IGdldEludGVyZXN0aW5nUG9pbnQoSUZpZ3VyZSBmaWd1cmUpCi0gICAgewotLy8gICAgICByZXR1cm4gZmlndXJlLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotICAgICAgcmV0dXJuIGZpZ3VyZS5nZXRCb3VuZHMoKS5nZXRUb3BMZWZ0KCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCBub2RlLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgbm9kZSBpcyBub3QgbG9uZ2VyIGluIHRoZSB2aWV3ZXIgYnV0IGhhcwotICAgICAqIG5vdCBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkIHlldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEdyYXBoaWNhbEVkaXRQYXJ0IGdldENhY2hlZE5vZGUoKQotICAgIHsKLSAgICAgIGlmIChjYWNoZWROb2RlID09IG51bGwpCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgaWYgKGNhY2hlZE5vZGUuaXNFbnF1ZXVlZCgpKQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIHJldHVybiAoR3JhcGhpY2FsRWRpdFBhcnQpIGNhY2hlZE5vZGUuZ2V0KCk7Ci0gICAgfQotICAgIEdyYXBoaWNhbEVkaXRQYXJ0IGdldEZvY3VzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRWaWV3ZXIoKS5nZXRGb2N1c0VkaXRQYXJ0KCk7Ci0gICAgfQotICAgIExpc3QgZ2V0TmF2aWdhdGlvblNpYmxpbmdzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0Rm9jdXMoKS5nZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgR3JhcGhpY2FsVmlld2VyIGdldFZpZXdlcigpCi0gICAgewotICAgICAgcmV0dXJuIHZpZXdlcjsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4ga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBpZiAoZXZlbnQuY2hhcmFjdGVyID09ICcgJykKLSAgICAgIHsKLSAgICAgICAgcHJvY2Vzc1NlbGVjdChldmVudCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYWNjZXB0SW50b0NvbnRhaW5lcihldmVudCkpCi0gICAgICB7Ci0gICAgICAgIG5hdmlnYXRlSW50b0NvbnRhaW5lcihldmVudCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYWNjZXB0T3V0T2YoZXZlbnQpKQotICAgICAgewotICAgICAgICBuYXZpZ2F0ZU91dChldmVudCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYWNjZXB0Q29ubmVjdGlvbihldmVudCkpCi0gICAgICB7Ci0gICAgICAgIG5hdmlnYXRlQ29ubmVjdGlvbnMoZXZlbnQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFjY2VwdExlYXZlQ29ubmVjdGlvbihldmVudCkpCi0gICAgICB7Ci0gICAgICAgIG5hdmlnYXRlT3V0T2ZDb25uZWN0aW9uKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhY2NlcHRMZWF2ZUNvbnRlbnRzKGV2ZW50KSkKLSAgICAgIHsKLSAgICAgICAgbmF2aWdhdGVJbnRvQ29udGFpbmVyKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgU1dULkFSUk9XX0xFRlQgOgotICAgICAgICAgIHJldHVybiBuYXZpZ2F0ZU5leHRTaWJsaW5nKGV2ZW50LCBQb3NpdGlvbkNvbnN0YW50cy5XRVNUKTsKLSAgICAgICAgY2FzZSBTV1QuQVJST1dfUklHSFQgOgotICAgICAgICAgIHJldHVybiBuYXZpZ2F0ZU5leHRTaWJsaW5nKGV2ZW50LCBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKTsKLSAgICAgICAgY2FzZSBTV1QuQVJST1dfVVAgOgotICAgICAgICAgIHJldHVybiBuYXZpZ2F0ZU5leHRTaWJsaW5nKGV2ZW50LCBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7Ci0gICAgICAgIGNhc2UgU1dULkFSUk9XX0RPV04gOgotICAgICAgICAgIHJldHVybiBuYXZpZ2F0ZU5leHRTaWJsaW5nKGV2ZW50LCBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7Ci0gICAgICAgIGNhc2UgU1dULkhPTUUgOgotICAgICAgICAgIHJldHVybiBuYXZpZ2F0ZUp1bXBTaWJsaW5nKGV2ZW50LCBQb3NpdGlvbkNvbnN0YW50cy5XRVNUKTsKLSAgICAgICAgY2FzZSBTV1QuRU5EIDoKLSAgICAgICAgICByZXR1cm4gbmF2aWdhdGVKdW1wU2libGluZyhldmVudCwgUG9zaXRpb25Db25zdGFudHMuRUFTVCk7Ci0gICAgICAgIGNhc2UgU1dULlBBR0VfRE9XTiA6Ci0gICAgICAgICAgcmV0dXJuIG5hdmlnYXRlSnVtcFNpYmxpbmcoZXZlbnQsIFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLSAgICAgICAgY2FzZSBTV1QuUEFHRV9VUCA6Ci0gICAgICAgICAgcmV0dXJuIG5hdmlnYXRlSnVtcFNpYmxpbmcoZXZlbnQsIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdXBlci5rZXlQcmVzc2VkKGV2ZW50KTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIG5hdmlnYXRlQ29ubmVjdGlvbnMoS2V5RXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgZm9jdXMgPSBnZXRGb2N1cygpOwotICAgICAgQ29ubmVjdGlvbkVkaXRQYXJ0IGN1cnJlbnQgPSBudWxsOwotICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgbm9kZSA9IGdldENhY2hlZE5vZGUoKTsKLSAgICAgIGlmIChmb2N1cyBpbnN0YW5jZW9mIENvbm5lY3Rpb25FZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgY3VycmVudCA9IChDb25uZWN0aW9uRWRpdFBhcnQpIGZvY3VzOwotICAgICAgICBpZiAobm9kZSA9PSBudWxsCi0gICAgICAgICAgfHwgKG5vZGUgIT0gY3VycmVudC5nZXRTb3VyY2UoKSAmJiBub2RlICE9IGN1cnJlbnQuZ2V0VGFyZ2V0KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZSA9IChHcmFwaGljYWxFZGl0UGFydCkgY3VycmVudC5nZXRTb3VyY2UoKTsKLSAgICAgICAgICBjb3VudGVyID0gMDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBub2RlID0gZm9jdXM7Ci0gICAgICB9Ci0gICAgICBzZXRDYWNoZWROb2RlKG5vZGUpOwotICAgICAgYm9vbGVhbiBmb3J3YXJkID0gZXZlbnQuY2hhcmFjdGVyID09ICcvJyB8fCBldmVudC5jaGFyYWN0ZXIgPT0gJz8nOwotICAgICAgQ29ubmVjdGlvbkVkaXRQYXJ0IG5leHQgPSBmaW5kQ29ubmVjdGlvbihub2RlLCBjdXJyZW50LCBmb3J3YXJkKTsKLSAgICAgIG5hdmlnYXRlVG8obmV4dCwgZXZlbnQpOwotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgbmF2aWdhdGVJbnRvQ29udGFpbmVyKEtleUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIEdyYXBoaWNhbEVkaXRQYXJ0IGZvY3VzID0gZ2V0Rm9jdXMoKTsKLSAgICAgIExpc3QgY2hpbGRMaXN0ID0gZm9jdXMuZ2V0Q2hpbGRyZW4oKTsKLQotICAgICAgaWYgKGZvY3VzIGluc3RhbmNlb2YgRXhwYW5kYWJsZUdyYXBoTm9kZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBpZiAoISgoRXhwYW5kYWJsZUdyYXBoTm9kZUVkaXRQYXJ0KWZvY3VzKS5pc0V4cGFuZGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAoKEV4cGFuZGFibGVHcmFwaE5vZGVFZGl0UGFydClmb2N1cykuZG9QZXJmb3JtRXhwYW5kT3JDb2xsYXBzZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIFBvaW50IHRsID0gZm9jdXMuZ2V0Q29udGVudFBhbmUoKS5nZXRCb3VuZHMoKS5nZXRUb3BMZWZ0KCk7Ci0gICAgICBpbnQgbWluaW11bSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgaW50IGN1cnJlbnQ7Ci0gICAgICBHcmFwaGljYWxFZGl0UGFydCBjbG9zZXN0UGFydCA9IG51bGw7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTGlzdC5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgZ2VkID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZExpc3QuZ2V0KGkpOwotICAgICAgICBSZWN0YW5nbGUgY2hpbGRCb3VuZHMgPSBnZWQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIGN1cnJlbnQgPSAoY2hpbGRCb3VuZHMueCAtIHRsLngpICsgKGNoaWxkQm91bmRzLnkgLSB0bC55KTsKLSAgICAgICAgaWYgKGN1cnJlbnQgPCBtaW5pbXVtKQotICAgICAgICB7Ci0gICAgICAgICAgbWluaW11bSA9IGN1cnJlbnQ7Ci0gICAgICAgICAgY2xvc2VzdFBhcnQgPSBnZWQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChjbG9zZXN0UGFydCAhPSBudWxsKQotICAgICAgICBuYXZpZ2F0ZVRvKGNsb3Nlc3RQYXJ0LCBldmVudCk7Ci0gICAgfQotICAgIHByaXZhdGUgYm9vbGVhbiBuYXZpZ2F0ZUp1bXBTaWJsaW5nKEtleUV2ZW50IGV2ZW50LCBpbnQgZGlyZWN0aW9uKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBib29sZWFuIG5hdmlnYXRlTmV4dFNpYmxpbmcoS2V5RXZlbnQgZXZlbnQsIGludCBkaXJlY3Rpb24pCi0gICAgewotICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgZXBTdGFydCA9IGdldEZvY3VzKCk7Ci0gICAgICBJRmlndXJlIGZpZ3VyZSA9IGVwU3RhcnQuZ2V0RmlndXJlKCk7Ci0gICAgICBQb2ludCBwU3RhcnQgPSBnZXRJbnRlcmVzdGluZ1BvaW50KGZpZ3VyZSk7Ci0gICAgICBmaWd1cmUudHJhbnNsYXRlVG9BYnNvbHV0ZShwU3RhcnQpOwotICAgICAgRWRpdFBhcnQgbmV4dCA9Ci0gICAgICAgIGZpbmRTaWJsaW5nKGdldE5hdmlnYXRpb25TaWJsaW5ncygpLCBwU3RhcnQsIGRpcmVjdGlvbiwgZXBTdGFydCk7Ci0gICAgICBpZiAobmV4dCA9PSBudWxsKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBuYXZpZ2F0ZVRvKG5leHQsIGV2ZW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgbmF2aWdhdGVPdXQoS2V5RXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgaWYgKGdldEZvY3VzKCkgPT0gbnVsbAotICAgICAgICB8fCBnZXRGb2N1cygpID09IGdldFZpZXdlcigpLmdldENvbnRlbnRzKCkKLSAgICAgICAgfHwgZ2V0Rm9jdXMoKS5nZXRQYXJlbnQoKSA9PSBnZXRWaWV3ZXIoKS5nZXRDb250ZW50cygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIEVkaXRQYXJ0IHBhcmVudCA9IGdldEZvY3VzKCkuZ2V0UGFyZW50KCk7Ci0gICAgICBpZiAoKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQUxUKSAhPSAwKSAmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfTEVGVCkpCi0gICAgICB7Ci0gICAgICAgIGlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBFeHBhbmRhYmxlR3JhcGhOb2RlRWRpdFBhcnQpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgoRXhwYW5kYWJsZUdyYXBoTm9kZUVkaXRQYXJ0KXBhcmVudCkuaXNFeHBhbmRlZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoRXhwYW5kYWJsZUdyYXBoTm9kZUVkaXRQYXJ0KXBhcmVudCkuZG9QZXJmb3JtRXhwYW5kT3JDb2xsYXBzZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgbmF2aWdhdGVUbyhwYXJlbnQsIGV2ZW50KTsKLS8vICAgICAgbmF2aWdhdGVUbyhnZXRGb2N1cygpLmdldFBhcmVudCgpLCBldmVudCk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBuYXZpZ2F0ZU91dE9mQ29ubmVjdGlvbihLZXlFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBHcmFwaGljYWxFZGl0UGFydCBjYWNoZWQgPSBnZXRDYWNoZWROb2RlKCk7Ci0gICAgICBDb25uZWN0aW9uRWRpdFBhcnQgY29ubiA9IChDb25uZWN0aW9uRWRpdFBhcnQpIGdldEZvY3VzKCk7Ci0gICAgICBpZiAoY2FjaGVkICE9IG51bGwKLSAgICAgICAgJiYgKGNhY2hlZCA9PSBjb25uLmdldFNvdXJjZSgpIHx8IGNhY2hlZCA9PSBjb25uLmdldFRhcmdldCgpKSkKLSAgICAgICAgbmF2aWdhdGVUbyhjYWNoZWQsIGV2ZW50KTsKLSAgICAgIGVsc2UKLSAgICAgICAgbmF2aWdhdGVUbyhjb25uLmdldFNvdXJjZSgpLCBldmVudCk7Ci0gICAgfQotICAgIHZvaWQgbmF2aWdhdGVUbyhFZGl0UGFydCBwYXJ0LCBLZXlFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBpZiAocGFydCA9PSBudWxsKQotICAgICAgICByZXR1cm47Ci0gICAgICBpZiAoKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgZ2V0Vmlld2VyKCkuYXBwZW5kU2VsZWN0aW9uKHBhcnQpOwotICAgICAgICBnZXRWaWV3ZXIoKS5zZXRGb2N1cyhwYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLSAgICAgICAgZ2V0Vmlld2VyKCkuc2V0Rm9jdXMocGFydCk7Ci0gICAgICBlbHNlCi0gICAgICAgIGdldFZpZXdlcigpLnNlbGVjdChwYXJ0KTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTZWxlY3QoS2V5RXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgRWRpdFBhcnQgcGFydCA9IGdldFZpZXdlcigpLmdldEZvY3VzRWRpdFBhcnQoKTsKLSAgICAgIGlmICgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDAKLSAgICAgICAgJiYgcGFydC5nZXRTZWxlY3RlZCgpICE9IEVkaXRQYXJ0LlNFTEVDVEVEX05PTkUpCi0gICAgICB7Ci0gICAgICAgIGdldFZpZXdlcigpLmRlc2VsZWN0KHBhcnQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnZXRWaWV3ZXIoKS5hcHBlbmRTZWxlY3Rpb24ocGFydCk7Ci0gICAgICB9Ci0gICAgICBnZXRWaWV3ZXIoKS5zZXRGb2N1cyhwYXJ0KTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHNldENhY2hlZE5vZGUoR3JhcGhpY2FsRWRpdFBhcnQgbm9kZSkKLSAgICB7Ci0gICAgICBpZiAobm9kZSA9PSBudWxsKQotICAgICAgICBjYWNoZWROb2RlID0gbnVsbDsKLSAgICAgIGVsc2UKLSAgICAgICAgY2FjaGVkTm9kZSA9IG5ldyBXZWFrUmVmZXJlbmNlKG5vZGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RJbmhlcml0YW5jZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL1hTREluaGVyaXRhbmNlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTgyMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL1hTREluaGVyaXRhbmNlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGg7Ci0gICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuU3Vic3RpdHV0aW9uR3JvdXBWaWV3ZXJSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi1wdWJsaWMgY2xhc3MgWFNESW5oZXJpdGFuY2VWaWV3ZXIgZXh0ZW5kcyBCYXNlR3JhcGhpY2FsVmlld2VyCi17ICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdWJzdGl0dXRpb25Hcm91cFZpZXdlclJvb3RFZGl0UGFydCBpbmhlcml0YW5jZVZpZXdlclJvb3RFZGl0UGFydDsKLSAgcHVibGljIFhTREluaGVyaXRhbmNlVmlld2VyKFhTREVkaXRvciBlZGl0b3IsIElTZWxlY3Rpb25Qcm92aWRlciBtZW51U2VsZWN0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICBzdXBlcihlZGl0b3IsIG1lbnVTZWxlY3Rpb25Qcm92aWRlcik7ICAgICAgIAotICB9ICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBpZiAoaXNJbnB1dEVuYWJsZWQpCi0gICAgewotICAgICAgaW5wdXQgPSBudWxsOyAgICAgICAgIAotCi0gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hIHx8Ci0gICAgICAgICAgY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBpbnB1dCA9IGNvbXBvbmVudDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaW5oZXJpdGFuY2VWaWV3ZXJSb290RWRpdFBhcnQuc2V0SW5wdXQoaW5wdXQpOyAgICAgICAKLSAgICB9Ci0gIH0gICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChpc1NlbGVjdGlvbkVuYWJsZWQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJYU0RDb21wb25lbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKCIgKyBjb21wb25lbnQgKyAiKSIpOwotICAgICAgTGlzdCBlZGl0UGFydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIAotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCAKLSAgICAgICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwKLSAgICAgICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwIHx8ICAgICAgICAKLSAgICAgICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB8fAotICAgICAgICAgIGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRFZGl0UGFydChpbmhlcml0YW5jZVZpZXdlclJvb3RFZGl0UGFydCwgY29tcG9uZW50KTsgICAgCi0gICAgICAgICAgaWYgKGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIC8vIFRPRE8gLi4uIHRha2UgYSBsb29rIGF0IHRoaXMgdG8gZmlndXJlIG91ciB3aHkgYSBuZXdseSBhZGRlZCBjb21wb25lbnQKLSAgICAgICAgICAgIC8vIHNlZW1zIHRvIGhhdmUgdGhlIHdyb25nIGJvdW5kcyBhdCB0aGlzIHBvaW50Li4uIGlzIHRoaXMgYSBsYXlvdXQgaXNzdWU/ICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFzIGEgdGVtcCBoYWNrIEknbSBpZ25vcmluZyB0aGUgc2VsZWN0aW9uIG9mIGNvbXBvbmVudCB3aXRoIGJvdW5kcyAoeCwgeSkgPT0gKDAsIDApCi0gICAgICAgICAgICAvLyBQZXJoYXBzIGEgZGVsYXllZCBzZWxlY3Rpb24gaXMgcmVxdWlyZWQ/Ci0gICAgICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gKChHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICBpZiAoYm91bmRzLnggPiAwIHx8IGJvdW5kcy55ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWRpdFBhcnRMaXN0LmFkZChlZGl0UGFydCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgIH0gCi0gICAgICAgIH0gICAgCi0gICAgICB9ICAgICAgICAgICAgICAKLSAgICAgIHNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0UGFydExpc3QpKTsKLSAgICB9Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0Vmlld2VyI2hvb2tDb250cm9sKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKCkKLSAgewotICAgIHN1cGVyLmhvb2tDb250cm9sKCk7Ci0gICAgaW5oZXJpdGFuY2VWaWV3ZXJSb290RWRpdFBhcnQgPSBuZXcgU3Vic3RpdHV0aW9uR3JvdXBWaWV3ZXJSb290RWRpdFBhcnQoKTsKLSAgICBzZXRDb250ZW50cyhpbmhlcml0YW5jZVZpZXdlclJvb3RFZGl0UGFydCk7Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RTdWJzdGl0dXRpb25Hcm91cENoaWxkVXRpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL1hTRFN1YnN0aXR1dGlvbkdyb3VwQ2hpbGRVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYTg0YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL1hTRFN1YnN0aXR1dGlvbkdyb3VwQ2hpbGRVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGVybmVzdAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RTdWJzdGl0dXRpb25Hcm91cENoaWxkVXRpbGl0eQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gZGVjbGFyYXRpb24KLSAgICogQHJldHVybiBMaXN0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0TW9kZWxDaGlsZHJlbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZGVjbGFyYXRpb24pCi0gIHsKLSAgICBBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBzdWJzdGl0dXRpb25Hcm91cCA9IGRlY2xhcmF0aW9uLmdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0gICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBzdWJzdGl0dXRpb25Hcm91cC5zaXplKCk7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBzdWJzdGl0dXRpb25Hcm91cC5nZXQoaSk7Ci0gICAgICBpZiAoZGVjbGFyYXRpb24uZXF1YWxzKGVsZW1lbnQuZ2V0U3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbigpKSkKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2hpbGRyZW47Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RTdWJzdGl0dXRpb25Hcm91cHNWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9YU0RTdWJzdGl0dXRpb25Hcm91cHNWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5OGZkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvWFNEU3Vic3RpdHV0aW9uR3JvdXBzVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGg7Ci0gICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuU3Vic3RpdHV0aW9uR3JvdXBWaWV3ZXJSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi1wdWJsaWMgY2xhc3MgWFNEU3Vic3RpdHV0aW9uR3JvdXBzVmlld2VyIGV4dGVuZHMgQmFzZUdyYXBoaWNhbFZpZXdlcgoteyAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3Vic3RpdHV0aW9uR3JvdXBWaWV3ZXJSb290RWRpdFBhcnQgc3ViR3JvdXBWaWV3ZXJSb290RWRpdFBhcnQ7Ci0gIHB1YmxpYyBYU0RTdWJzdGl0dXRpb25Hcm91cHNWaWV3ZXIoWFNERWRpdG9yIGVkaXRvciwgSVNlbGVjdGlvblByb3ZpZGVyIG1lbnVTZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHN1cGVyKGVkaXRvciwgbWVudVNlbGVjdGlvblByb3ZpZGVyKTsgICAgICAgCi0gIH0gICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgeyAgICAgICAgICAgICAgIAotICAgIGlmIChpc0lucHV0RW5hYmxlZCkKLSAgICB7Ci0gICAgICBpbnB1dCA9IG51bGw7ICAgICAgICAgCi0KLSAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgCi0gICAgICAgICAgY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBpbnB1dCA9IGNvbXBvbmVudDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgc3ViR3JvdXBWaWV3ZXJSb290RWRpdFBhcnQuc2V0SW5wdXQoaW5wdXQpOyAgICAgICAKLSAgICB9Ci0gIH0gICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChpc1NlbGVjdGlvbkVuYWJsZWQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJYU0RDb21wb25lbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKCIgKyBjb21wb25lbnQgKyAiKSIpOwotICAgICAgTGlzdCBlZGl0UGFydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIAotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCAKLSAgICAgICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwKLSAgICAgICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwIHx8ICAgICAgICAKLSAgICAgICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB8fAotICAgICAgICAgIGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRFZGl0UGFydChzdWJHcm91cFZpZXdlclJvb3RFZGl0UGFydCwgY29tcG9uZW50KTsgICAgCi0gICAgICAgICAgaWYgKGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIC8vIFRPRE8gLi4uIHRha2UgYSBsb29rIGF0IHRoaXMgdG8gZmlndXJlIG91ciB3aHkgYSBuZXdseSBhZGRlZCBjb21wb25lbnQKLSAgICAgICAgICAgIC8vIHNlZW1zIHRvIGhhdmUgdGhlIHdyb25nIGJvdW5kcyBhdCB0aGlzIHBvaW50Li4uIGlzIHRoaXMgYSBsYXlvdXQgaXNzdWU/ICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFzIGEgdGVtcCBoYWNrIEknbSBpZ25vcmluZyB0aGUgc2VsZWN0aW9uIG9mIGNvbXBvbmVudCB3aXRoIGJvdW5kcyAoeCwgeSkgPT0gKDAsIDApCi0gICAgICAgICAgICAvLyBQZXJoYXBzIGEgZGVsYXllZCBzZWxlY3Rpb24gaXMgcmVxdWlyZWQ/Ci0gICAgICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gKChHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICBpZiAoYm91bmRzLnggPiAwIHx8IGJvdW5kcy55ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWRpdFBhcnRMaXN0LmFkZChlZGl0UGFydCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgIH0gCi0gICAgICAgIH0gICAgCi0gICAgICB9ICAgICAgICAgICAgICAKLSAgICAgIHNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0UGFydExpc3QpKTsKLSAgICB9Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0Vmlld2VyI2hvb2tDb250cm9sKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKCkKLSAgewotICAgIHN1cGVyLmhvb2tDb250cm9sKCk7Ci0gICAgc3ViR3JvdXBWaWV3ZXJSb290RWRpdFBhcnQgPSBuZXcgU3Vic3RpdHV0aW9uR3JvdXBWaWV3ZXJSb290RWRpdFBhcnQoKTsKLSAgICBzZXRDb250ZW50cyhzdWJHcm91cFZpZXdlclJvb3RFZGl0UGFydCk7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0Jhc2VFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9CYXNlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4ZGExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0Jhc2VFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5HcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLm1vZGVsLk1vZGVsQWRhcHRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuWFNETW9kZWxBZGFwdGVyRmFjdG9yeTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyLCBHcmFwaGljc0NvbnN0YW50cywgSUZlZWRiYWNrSGFuZGxlcgotewotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLQkvKioKLQkgKiBBY3RpdmF0ZXMgdGhlIDxjb2RlPkVkaXRQYXJ0PC9jb2RlPiBieSBzZXR0aW5nIHRoZQotCSAqIGFwcHJvcHJpYXRlIGZsYWdzLCBhbmQgYWN0aXZhdGluZyBpdHMgY2hpbGRyZW4uCi0JICogYWN0aXZhdGlvbiBzaWduYWxzIHRvIHRoZSBFZGl0UGFydCB0aGF0IGlzIHNob3VsZCBzdGFydCBvYnNlcnZpbmcKLQkgKiBpdCdzIG1vZGVsLCBhbmQgdGhhdCBpcyBzaG91bGQgc3VwcG9ydCBlZGl0aW5nIGF0IHRoaXMgdGltZS4KLQkgKiBBbiBFZGl0UGFydCB3aWxsIGhhdmUgYSBwYXJlbnQgcHJpb3IgdG8gYWN0aXZpYXRpb24uCi0JICogQHNlZSAjZGVhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSAKLSAgewotCQlzdXBlci5hY3RpdmF0ZSgpOyAgICAgICAgIAotICAgIFhTRE1vZGVsQWRhcHRlckZhY3RvcnkuYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoZ2V0TW9kZWwoKSwgdGhpcyk7ICAKLQl9Ci0JLyoqIAotCSAqIEFwYXJ0IGZyb20gdGhlIGRlYWN0aXZhdGlvbiBkb25lIGluIHN1cGVyLCB0aGUgc291cmNlCi0JICogYW5kIHRhcmdldCBjb25uZWN0aW9ucyBhcmUgZGVhY3RpdmF0ZWQsIGFuZCB0aGUgdmlzdWFsCi0JICogcGFydCBvZiB0aGUgdGhpcyBpcyByZW1vdmVkLgotCSAqCi0JICogQHNlZSAjYWN0aXZhdGUoKSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgCi0gIHsKLSAgICBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5LnJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGdldE1vZGVsKCksIHRoaXMpOyAgCi0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9ICAgCi0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIAotICB7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVDaGlsZChPYmplY3QgbW9kZWwpIAotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRQYXJ0RmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVkaXRQYXJ0KHRoaXMsIG1vZGVsKTsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZWZyZXNoKCk7IAotICB9ICAgIAotCi0gIC8vcHVibGljIEJhc2VHcmFwaGljYWxWaWV3ZXIgZ2V0QmFzZUdyYXBoaWNhbFZpZXdlcigpCi0gIC8vewotICAvLyAgcmV0dXJuIChCYXNlR3JhcGhpY2FsVmlld2VyKWdldFZpZXdlcigpOwotICAvL30KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRTZWxlY3Rpb25GaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGdldEZpZ3VyZSgpOwotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgaXNTZWxlY3RlZCA9IHRydWU7Ci0gICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLSAgICByZWZyZXNoVmlzdWFscygpOwotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0NhdGVnb3J5RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQ2F0ZWdvcnlFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmZmYWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQ2F0ZWdvcnlFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TY3JvbGxQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5WaWV3cG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVmlld3BvcnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5HcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkNvbnRhaW5lckZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuQ29udGFpbmVyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5Sb3VuZGVkTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLm1vZGVsLkNhdGVnb3J5OwotCi0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBTY3JvbGxQYW5lIHNjcm9sbHBhbmU7Ci0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBvdXRlclBhbmUsIHI7Ci0gIHByb3RlY3RlZCBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci0KLSAgcHVibGljIGludCBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiAoKENhdGVnb3J5KWdldE1vZGVsKCkpLmdldEdyb3VwVHlwZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgeyAgICAgICAgICAgCi0gICAgb3V0ZXJQYW5lID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOyAgICAKLSAgICBvdXRlclBhbmUuc2V0Qm9yZGVyKG5ldyBSb3VuZGVkTGluZUJvcmRlcigxLCA2KSk7Ci0gICAgb3V0ZXJQYW5lLnNldEZvcmVncm91bmRDb2xvcihjYXRlZ29yeUJvcmRlckNvbG9yKTsKLQotICAgIHIgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7ICAKLSAgICByLnNldE91dGxpbmUoZmFsc2UpOwotICAgIHIuc2V0TWluaW11bVNpemUobmV3IERpbWVuc2lvbigwLCAwKSk7Ci0gICAgci5zZXRGaWxsKHRydWUpOwotICAgIHIuc2V0QmFja2dyb3VuZENvbG9yKEdyYXBoaWNzQ29uc3RhbnRzLmVsZW1lbnRCYWNrZ3JvdW5kQ29sb3IpOwotICAgIG91dGVyUGFuZS5hZGQocik7Ci0gICAgCi0gICAgaW50IG1pbkhlaWdodCA9IDI1MDsKLSAgICBzd2l0Y2ggKGdldFR5cGUoKSkKLSAgICB7Ci0gICAgCWNhc2UgQ2F0ZWdvcnkuRElSRUNUSVZFUyA6Ci0JCWNhc2UgQ2F0ZWdvcnkuTk9UQVRJT05TIDoKLQkJewotCQkJbWluSGVpZ2h0ID0gNTA7Ci0JCQlicmVhazsJCi0JCX0KLQkJY2FzZSBDYXRlZ29yeS5BVFRSSUJVVEVTIDoKLQkJY2FzZSBDYXRlZ29yeS5HUk9VUFMgOgkJICAKLQkJewotCQkJbWluSGVpZ2h0ID0gMTAwOwotCQkJYnJlYWs7Ci0JCX0KLSAgICB9Ci0gICAgCi0JZmluYWwgaW50IHRoZU1pbkhlaWdodCA9IG1pbkhlaWdodDsKLSAgICBGaWxsTGF5b3V0IG91dGVyTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgICAgewotICAgICAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmNhbGN1bGF0ZVByZWZlcnJlZFNpemUocGFyZW50LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgZC51bmlvbihuZXcgRGltZW5zaW9uKDEwMCwgdGhlTWluSGVpZ2h0KSk7Ci0gICAgICAgIHJldHVybiBkOwotICAgICAgfQotICAgIH07Ci0gICAgLy9vdXRlckxheW91dC5zZXRIb3Jpem9udGFsKGZhbHNlKTsKLSAgICBvdXRlclBhbmUuc2V0TGF5b3V0TWFuYWdlcihvdXRlckxheW91dCk7Ci0gICAgCi0gICAKLSAgICBsYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMiwgNCwgMiwgNCkpOwotICAgIHIuYWRkKGxhYmVsKTsgLy9Ib2xkZXIpOwotCi0gICAgUmVjdGFuZ2xlRmlndXJlIGxpbmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0gICAgbGluZS5zZXRQcmVmZXJyZWRTaXplKDIwLCAxKTsKLSAgICBvdXRlclBhbmUuYWRkKGxpbmUpOwotCi0KLSAgICBzY3JvbGxwYW5lID0gbmV3IFNjcm9sbFBhbmUoKTsKLSAgICBzY3JvbGxwYW5lLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgc2Nyb2xscGFuZS5zZXRWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkoU2Nyb2xsUGFuZS5BVVRPTUFUSUMpOyAvL1Njcm9sbFBhbmUuQUxXQVlTKTsKLSAgICBvdXRlclBhbmUuYWRkKHNjcm9sbHBhbmUpOwotCi0gICAgQ29udGFpbmVyRmlndXJlIHBhbmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgcGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig1LCA4LCA1LCA4KSk7Ci0gICAgQ29udGFpbmVyTGF5b3V0IGxheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKTsKLSAgICBsYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgbGF5b3V0LnNldFNwYWNpbmcoMCk7Ci0gICAgcGFuZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0KLSAgICBWaWV3cG9ydCB2aWV3cG9ydCA9IG5ldyBWaWV3cG9ydCgpOwotICAgIHZpZXdwb3J0LnNldENvbnRlbnRzVHJhY2tzSGVpZ2h0KHRydWUpOwotICAgIFZpZXdwb3J0TGF5b3V0IHZpZXdwb3J0TGF5b3V0ID0gbmV3IFZpZXdwb3J0TGF5b3V0KCkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICAgIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5jYWxjdWxhdGVQcmVmZXJyZWRTaXplKHBhcmVudCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGQuaGVpZ2h0ID0gTWF0aC5taW4oZC5oZWlnaHQsIHRoZU1pbkhlaWdodCAtIDI1KTsgLy9nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICB9Ci0gICAgfTsKLSAgICB2aWV3cG9ydC5zZXRMYXlvdXRNYW5hZ2VyKHZpZXdwb3J0TGF5b3V0KTsKLQotICAgIHNjcm9sbHBhbmUuc2V0Vmlld3BvcnQodmlld3BvcnQpOwotICAgIHNjcm9sbHBhbmUuc2V0Q29udGVudHMocGFuZSk7Ci0KLSAgICByZXR1cm4gb3V0ZXJQYW5lOwotICB9ICAKLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgCi0gIHsgICAgICAgICAgICAKLSAgICByZXR1cm4gKChDYXRlZ29yeSlnZXRNb2RlbCgpKS5nZXRDaGlsZHJlbigpOwotICB9ICAKLSAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIG91dGVyUGFuZS5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKGlzU2VsZWN0ZWQgPyBDb2xvckNvbnN0YW50cy5ibGFjayA6IGNhdGVnb3J5Qm9yZGVyQ29sb3IsIGlzU2VsZWN0ZWQgPyAxIDogMSwgNikpOwotICAgIG91dGVyUGFuZS5yZXBhaW50KCk7Ci0vLyBVbmNvbW1lbnQgdGhpcyBmb3IgY29sb3VyZWQgdGl0bGVzCi0vLyAgICByLnNldEJhY2tncm91bmRDb2xvcihpc1NlbGVjdGVkID8gQ29sb3JDb25zdGFudHMuYmx1ZSA6IEdyYXBoaWNzQ29uc3RhbnRzLmVsZW1lbnRCYWNrZ3JvdW5kQ29sb3IpOwotLy8gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGlzU2VsZWN0ZWQgPyBDb2xvckNvbnN0YW50cy53aGl0ZSA6IENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLS8vICAgIHIucmVwYWludCgpOwotLy8gICAgb3V0ZXJQYW5lLnNldEZvcmVncm91bmRDb2xvcihpc1NlbGVjdGVkID8gQ29sb3JDb25zdGFudHMuYmxhY2sgOiBlbGVtZW50Qm9yZGVyQ29sb3IpOwotICAgIAotICAgIENhdGVnb3J5IGNhdGVnb3J5ID0gKENhdGVnb3J5KWdldE1vZGVsKCk7Ci0gICAgLy8gdGVtcCBoYWNrIC0tLSBhZGRlZCBlbXB0eSBzcGFjZSB0byBtYWtlIHRoZSBtaW4gd2lkdGggb2YgZ3JvdXBzIGJpZ2dlciAgCi0gICAgbGFiZWwuc2V0VGV4dCgiICAiICsgY2F0ZWdvcnkuZ2V0TmFtZSgpICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKLSAgfSAKLSAgCi0gIHB1YmxpYyBTY3JvbGxQYW5lIGdldFNjcm9sbFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIHNjcm9sbHBhbmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBzY3JvbGxwYW5lLmdldENvbnRlbnRzKCk7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNjcm9sbFRvKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgdG9wTGV2ZWwpCi0gIHsKLSAgICBSZWN0YW5nbGUgdG9wTGV2ZWxCb3VuZHMgPSB0b3BMZXZlbC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLSAgICBSZWN0YW5nbGUgY2F0ZWdvcnlCb3VuZHMgPSBnZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLSAgICBpbnQgc2Nyb2xsVmFsdWUgPSBzY3JvbGxwYW5lLmdldFZlcnRpY2FsU2Nyb2xsQmFyKCkuZ2V0VmFsdWUoKTsKLSAgICBpbnQgbG9jYXRpb24gPSB0b3BMZXZlbEJvdW5kcy55ICsgc2Nyb2xsVmFsdWUgLSBjYXRlZ29yeUJvdW5kcy55OwotICAgIHNjcm9sbHBhbmUuc2Nyb2xsVmVydGljYWxUbyhsb2NhdGlvbiAtIGNhdGVnb3J5Qm91bmRzLmhlaWdodC8yKTsKLSAgfQotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVDaGlsZChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG5ldyBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KCk7Ci0gICAgZWRpdFBhcnQuc2V0TW9kZWwobW9kZWwpOwotICAgIGVkaXRQYXJ0LnNldFBhcmVudCh0aGlzKTsKLSAgICByZXR1cm4gZWRpdFBhcnQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsgCi0gICAgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBuZXcgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpOyAgIAotICB9ICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Db21wbGV4VHlwZURlZmluaXRpb25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Db21wbGV4VHlwZURlZmluaXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWFjODhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5YU0RDaGlsZFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5YU0RHcmFwaFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXMuQ29tcG9uZW50TmFtZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLlNpbXBsZURpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkNlbnRlcmVkSWNvbkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5HcmFwaE5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLlJvdW5kZWRMaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci0KLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBDb21wbGV4VHlwZURlZmluaXRpb25FZGl0UGFydCBleHRlbmRzIEdyYXBoTm9kZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBDb250YWluZXJGaWd1cmUgY29udGVudEZpZ3VyZTsgICAKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOyAgICAgCi0gIHByb3RlY3RlZCBTaW1wbGVEaXJlY3RFZGl0UG9saWN5IHNpbXBsZURpcmVjdEVkaXRQb2xpY3kgPSBuZXcgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSgpOwotICBwcm90ZWN0ZWQgQ2VudGVyZWRJY29uRmlndXJlIGNlbnRlcmVkSWNvbkZpZ3VyZTsgIAotICBwcm90ZWN0ZWQgUmVjdGFuZ2xlRmlndXJlIHByZWNlZWRpbmdTcGFjZTsgIAotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIGNvbnRlbnRQYW5lOwotCi0gIHB1YmxpYyBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkKLSAgeyAgICAgICAgIAotICAgIHJldHVybiAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldE1vZGVsKCk7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGVkRWRpdFBhcnQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IAotCi0gIHByb3RlY3RlZCBHcmFwaE5vZGVGaWd1cmUgY3JlYXRlR3JhcGhOb2RlRmlndXJlKCkgIAotICB7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ZCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pZ2V0TW9kZWwoKTsKLSAgICBHcmFwaE5vZGVGaWd1cmUgZmlndXJlID0gbmV3IEdyYXBoTm9kZUZpZ3VyZSgpOwotCi0gICAgZmlndXJlLmdldE91dGxpbmVkQXJlYSgpLnNldEJvcmRlcihuZXcgUm91bmRlZExpbmVCb3JkZXIoMSwgNikpOwotICAgIGZpZ3VyZS5nZXRPdXRsaW5lZEFyZWEoKS5zZXRGaWxsKHRydWUpOwotICAgIGZpZ3VyZS5nZXRPdXRsaW5lZEFyZWEoKS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGaWxsTGF5b3V0KHRydWUpKTsKLQotICAgIGZpZ3VyZS5nZXRJbm5lckNvbnRlbnRBcmVhKCkuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0SG9yaXpvbnRhbCh0cnVlKTsKLQotICAgIHByZWNlZWRpbmdTcGFjZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLSAgICBwcmVjZWVkaW5nU3BhY2Uuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgZmlndXJlLmdldElubmVyQ29udGVudEFyZWEoKS5hZGQocHJlY2VlZGluZ1NwYWNlLCAwKTsKLQotICAgIGNvbnRlbnRQYW5lID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIGNvbnRlbnRQYW5lLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOyAKLSAgICBjb250ZW50UGFuZS5nZXRDb250YWluZXJMYXlvdXQoKS5zZXRTcGFjaW5nKDUpOyAgIAotICAgIGNvbnRlbnRQYW5lLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDUsIDUsIDUsIDUpKTsKLSAgICBmaWd1cmUuZ2V0SW5uZXJDb250ZW50QXJlYSgpLmFkZChjb250ZW50UGFuZSk7Ci0gICAgCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoKTsgICAgCi0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgNSwgNSwgNSkpOwotICAgIGZpZ3VyZS5nZXRJY29uQXJlYSgpLmFkZChsYWJlbCk7ICAgICAKLSAgICBsYWJlbC5zZXRGb250KG1lZGl1bUJvbGRGb250KTsKLSAKLSAgICBmaWd1cmUuZ2V0SW5uZXJDb250ZW50QXJlYSgpLmdldENvbnRhaW5lckxheW91dCgpLnNldFNwYWNpbmcoNSk7ICAgCi0gICAgZmlndXJlLmdldElubmVyQ29udGVudEFyZWEoKS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig1LCA1LCA1LCA1KSk7Ci0gICAgCi0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfSAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkgCi0gIHsgICAKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChtb2RlbCA9PSBnZXRNb2RlbCgpKQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IENvbXBsZXhUeXBlSW5oZXJpdGVkQ29udGVudEVkaXRQYXJ0KCk7Ci0gICAgICBlZGl0UGFydC5zZXRNb2RlbChtb2RlbCk7Ci0gICAgICBlZGl0UGFydC5zZXRQYXJlbnQodGhpcyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IHN1cGVyLmNyZWF0ZUNoaWxkKG1vZGVsKTsKLSAgICB9ICAgICAgICAgICAgCi0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9IAotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pZ2V0TW9kZWwoKTsKLQotICAgIGlmIChjdC5nZXREZXJpdmF0aW9uTWV0aG9kKCkuZ2V0TmFtZSgpLmVxdWFscygiZXh0ZW5zaW9uIikpCi0gICAgewotICAgICAgbGlzdC5hZGQoZ2V0TW9kZWwoKSk7Ci0gICAgfSAgCi0KLSAgICBsaXN0LmFkZEFsbChYU0RDaGlsZFV0aWxpdHkuZ2V0TW9kZWxDaGlsZHJlbihnZXRNb2RlbCgpKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpICAKLSAgewotICAgIHJldHVybiBjb250ZW50UGFuZTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgeyAKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3RkID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilnZXRNb2RlbCgpOyAgICAgICAgICAgICAgICAgICAKLQotICAgIFN0cmluZyBuYW1lID0gY3RkLmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdyYXBoTm9kZUZpZ3VyZS5nZXRJY29uQXJlYSgpLnJlbW92ZShsYWJlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgbGFiZWwgPSBudWxsOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGxhYmVsID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKCk7ICAgIAotICAgICAgICBsYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCA1LCA1LCA1KSk7Ci0gICAgICAgICgoR3JhcGhOb2RlRmlndXJlKWdldEZpZ3VyZSgpKS5nZXRJY29uQXJlYSgpLmFkZChsYWJlbCk7ICAgICAKLSAgICAgICAgbGFiZWwuc2V0Rm9udChtZWRpdW1Cb2xkRm9udCk7Ci0gICAgICB9Ci0gICAgICBncmFwaE5vZGVGaWd1cmUuZ2V0SWNvbkFyZWEoKS5hZGQobGFiZWwpOwotICAgICAgbGFiZWwuc2V0VGV4dChuYW1lKTsKLSAgICB9Ci0KLSAgICAvLyBwcm92aWRlcyBzb21lIHJvb20gaWYgd2UgbmVlZCB0byBkcmF3IGxpbmVzIGZvciB0aGUgaW5oZXJpdGVkCi0gICAgYm9vbGVhbiBpbmNsdWRlc0luaGVyaXRlZENvbnRlbnQgPSBnZXRNb2RlbENoaWxkcmVuKCkuY29udGFpbnMoZ2V0TW9kZWwoKSk7Ci0gICAgcHJlY2VlZGluZ1NwYWNlLnNldFByZWZlcnJlZFNpemUoaW5jbHVkZXNJbmhlcml0ZWRDb250ZW50ID8gbmV3IERpbWVuc2lvbigxMCwgMSkgOiBuZXcgRGltZW5zaW9uKDAsIDApKTsKLQotICAgIGlmIChYU0RHcmFwaFV0aWwuaXNFZGl0YWJsZShnZXRNb2RlbCgpKSkKLSAgICB7IAotICAgICAgZ3JhcGhOb2RlRmlndXJlLnNldEZvcmVncm91bmRDb2xvcihpc1NlbGVjdGVkID8gQ29sb3JDb25zdGFudHMuYmxhY2sgOiBlbGVtZW50Qm9yZGVyQ29sb3IpOwotICAgICAgaWYgKGxhYmVsICE9IG51bGwpCi0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoZWxlbWVudEJvcmRlckNvbG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGdyYXBoTm9kZUZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoaXNTZWxlY3RlZCA/IENvbG9yQ29uc3RhbnRzLmJsYWNrIDogcmVhZE9ubHlCb3JkZXJDb2xvcik7Ci0gICAgICBpZiAobGFiZWwgIT0gbnVsbCkKLSAgICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihyZWFkT25seUJvcmRlckNvbG9yKTsKLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKQotICB7ICAKLSAgICBDb21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBDb21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgbGFiZWwsIChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pZ2V0TW9kZWwoKSk7ICAgCi0gICAgc2ltcGxlRGlyZWN0RWRpdFBvbGljeS5zZXREZWxlZ2F0ZShtYW5hZ2VyKTsKLSAgICBtYW5hZ2VyLnNob3coKTsKLSAgfSAgICAKLSAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsgIAotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBzaW1wbGVEaXJlY3RFZGl0UG9saWN5KTsKLSAgfSAKLSAgICAgICAKLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgCWlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCB8fAotICAgICAgICByZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsgICAgIAotICAgICAgaWYgKFhTREdyYXBoVXRpbC5pc0VkaXRhYmxlKGdldE1vZGVsKCkpKQotICAgICAgeyAgICAgICAgICAgICAgICAgCi0gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChsYWJlbCAhPSBudWxsICYmIGhpdFRlc3QobGFiZWwsIHApKQotICAgICAgICB7Ci0gIAkJICAgIHBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvRWRpdE5hbWUoKQotICB7Ci0gICAgcGVyZm9ybURpcmVjdEVkaXQoKTsKLSAgfQotfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0NvbXBsZXhUeXBlSW5oZXJpdGVkQ29udGVudEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0NvbXBsZXhUeXBlSW5oZXJpdGVkQ29udGVudEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTg4MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Db21wbGV4VHlwZUluaGVyaXRlZENvbnRlbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNEQ2hpbGRVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNER3JhcGhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLkNvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5TaW1wbGVEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLlJvdW5kZWRMaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0KLS8vIFRoaXMgaXMgYSBkYXNoZWQgYm94IHRoYXQgZGlzcGxheXMgdGhlIGluaGVyaXRlZCBjb250ZW50IG9mIGEgY29tcGxleCB0eXBlCi0vLwotcHVibGljIGNsYXNzIENvbXBsZXhUeXBlSW5oZXJpdGVkQ29udGVudEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsgICAgIAotICBwcm90ZWN0ZWQgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSBzaW1wbGVEaXJlY3RFZGl0UG9saWN5ID0gbmV3IFNpbXBsZURpcmVjdEVkaXRQb2xpY3koKTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJlbnRFeHBhbmRlZDsKLSAgICAgICAgICAgICAgIAotICBwdWJsaWMgQ29tcGxleFR5cGVJbmhlcml0ZWRDb250ZW50RWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfSAgIAotICAgICAgICAgICAgICAgICAKLSAgcHVibGljIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKQotICB7ICAgICAgICAgCi0gICAgcmV0dXJuIChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pZ2V0TW9kZWwoKTsKLSAgfQotICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ29udGFpbmVyRmlndXJlIGZpZ3VyZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBmaWd1cmUuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgZmlndXJlLmdldENvbnRhaW5lckxheW91dCgpLnNldEJvcmRlcig1KTsKLSAgICBmaWd1cmUuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0U3BhY2luZyg1KTsKLSAgICBmaWd1cmUuc2V0Qm9yZGVyKG5ldyBSb3VuZGVkTGluZUJvcmRlcihDb2xvckNvbnN0YW50cy5ncmF5LCAxLCA2LCBHcmFwaGljcy5MSU5FX0RBU0gpKTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAgIAotICAgICAgICAgICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pZ2V0TW9kZWwoKTsKLQotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmIChjdC5nZXREZXJpdmF0aW9uTWV0aG9kKCkuZ2V0TmFtZSgpLmVxdWFscygiZXh0ZW5zaW9uIikgJiYgIWlzUGFyZW50RXhwYW5kZWQpCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGN0LmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgSXRlcmF0b3IgaXRlciA9IFhTRENoaWxkVXRpbGl0eS5nZXRNb2RlbENoaWxkcmVuKHR5cGUpLml0ZXJhdG9yKCk7Ci0gICAgICBib29sZWFuIGNvbnQgPSB0cnVlOwotICAgICAgd2hpbGUgKGNvbnQpCi0gICAgICB7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKDAsIGl0ZXIubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3RkID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlOwotICAgICAgICAgIHR5cGUgPSBjdGQuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotCQkJCQkvLyBkZWZlY3QgMjY0OTU3IC0gd29ya2JlbmNoIGhhbmdzIHdoZW4gbW9kaWZ5aW5nIGNvbXBsZXggY29udGVudAotCQkJCQkvLyBTaW5jZSB3ZSBkb24ndCBmaWx0ZXIgb3V0IHRoZSBjdXJyZW50IGNvbXBsZXhUeXBlIGZyb20KLQkJCQkJLy8gdGhlIGNvbWJvYm94LCB3ZSBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhbiBlbmRsZXNzIGxvb3AKLQkJCQkJaWYgKGN0ZCA9PSB0eXBlKQotCQkJCQl7Ci0JCQkJCQljb250ID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0gICAgICAgICAgaWYgKGN0ZC5nZXREZXJpdmF0aW9uTWV0aG9kKCkuZ2V0TmFtZSgpLmVxdWFscygiZXh0ZW5zaW9uIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlciA9IFhTRENoaWxkVXRpbGl0eS5nZXRNb2RlbENoaWxkcmVuKHR5cGUpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb250ID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbnQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgeyAKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3RkID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilnZXRNb2RlbCgpOwotICAgIExpc3QgY2hpbGRyZW4gPSBnZXRNb2RlbENoaWxkcmVuKCk7Ci0gICAgZmlndXJlLnNldFZpc2libGUoY2hpbGRyZW4uc2l6ZSgpID4gMCk7ICAgCi0gICAgLy8gdG9kbyBzZXQgcHJlZmVycmVkU2l6ZSB0byAwID8KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkKLSAgewotICAgIC8vIFdoeSBhcmUgd2UgYWxsb3dpbmcgZGlyZWN0IGVkaXRpbmcgd2hlbiB0aGUgbGFiZWwgaXMgbnVsbD8KLSAgICAvLyBTaG91bGQgcmVtb3ZlIHRoZSBwb2xpY3kKLSAgICBpZiAobGFiZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBDb21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgbGFiZWwsIChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pZ2V0TW9kZWwoKSk7ICAgCi0gICAgICBzaW1wbGVEaXJlY3RFZGl0UG9saWN5LnNldERlbGVnYXRlKG1hbmFnZXIpOwotICAgICAgbWFuYWdlci5zaG93KCk7Ci0gICAgfQotICB9ICAgIAotICAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAgCi0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBzaW1wbGVEaXJlY3RFZGl0UG9saWN5KTsKLSAgfSAKLSAgICAgICAKLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQpCi0gICAgeyAgICAgCi0gICAgICBpZiAoWFNER3JhcGhVdGlsLmlzRWRpdGFibGUoZ2V0TW9kZWwoKSkpCi0gICAgICB7Ci0gICAgICAgIHBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Db21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQ29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOGQxOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Db21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5Db250YWluZXJMYXlvdXQ7Ci0KLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9QTEFDRV9IT0xERVIgPSAiTUVTU0FHRV9QTEFDRV9IT0xERVIiOwotICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OyAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIHJlZnJlc2hDaGlsZHJlbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIFBhbmVsIHBhbmVsID0gbmV3IFBhbmVsKCk7Ci0gICAgQ29udGFpbmVyTGF5b3V0IGxheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKTsKLSAgICBsYXlvdXQuc2V0Qm9yZGVyKDYwKTsKLSAgICBwYW5lbC5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0gICAgcmV0dXJuIHBhbmVsOwotICB9ICAgCi0gICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSAKLSAgeyAgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChpbnB1dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChNRVNTQUdFX1BMQUNFX0hPTERFUik7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9ICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkgCi0gIHsgCi0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBudWxsOwotICAgIGlmIChtb2RlbCA9PSBNRVNTQUdFX1BMQUNFX0hPTERFUikKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IG5ldyBNZXNzYWdlRWRpdFBhcnQoKTsKLSAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gc3VwZXIuY3JlYXRlQ2hpbGQobW9kZWwpOwotICAgIH0KLSAgICByZXR1cm4gZWRpdFBhcnQ7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAgCi0gIH0gICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0VsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0VsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NDY3NzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9FbGVtZW50RGVjbGFyYXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54c2QuWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54c2QuWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhzZC5YU0RTZXRUeXBlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5TcGFjaW5nRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNEQ2hpbGRVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNER3JhcGhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNEU3Vic3RpdHV0aW9uR3JvdXBDaGlsZFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5YU0RTdWJzdGl0dXRpb25Hcm91cHNWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXMuQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5Db21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXMuU2ltcGxlRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5FeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5HcmFwaE5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5YU0RNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0gICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQgZXh0ZW5kcyBFeHBhbmRhYmxlR3JhcGhOb2RlRWRpdFBhcnQKLXsKLSAgcHVibGljIExhYmVsIGxhYmVsOyAgCi0gIHByb3RlY3RlZCBMYWJlbCBjb250ZW50SWNvbkxhYmVsOwotICBwcm90ZWN0ZWQgTGFiZWwgdHlwZVZhbHVlTGFiZWw7Ci0gIHByb3RlY3RlZCBTaW1wbGVEaXJlY3RFZGl0UG9saWN5IHNpbXBsZURpcmVjdEVkaXRQb2xpY3kgPSBuZXcgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSgpOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbnRlbnRJY29uTGFiZWxTZWxlY3RlZCA9IGZhbHNlOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEVMRU1FTlRfVFlQRV9QTEFDRV9IT0xERVIgPSAiRUxFTUVOVF9UWVBFX1BMQUNFX0hPTERFUiI7Ci0KLSAgcHVibGljIFhTRFBhcnRpY2xlIGdldFhTRFBhcnRpY2xlKCkKLSAgewotICAgIE9iamVjdCBvID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0Q29udGFpbmVyKCk7IAotICAgIHJldHVybiAobyBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKSA/IChYU0RQYXJ0aWNsZSlvIDogbnVsbDsKLSAgfSAgICAgICAgCi0KLSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICB7ICAgICAgICAgCi0gICAgcmV0dXJuIChYU0RFbGVtZW50RGVjbGFyYXRpb24pZ2V0TW9kZWwoKTsKLSAgfQotICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0RXhwYW5kZWQoKQotICB7Ci0gICAgLy8gaGFjayB0byBleHBhbmQgdXAgdG8gaXRzIGNvbnRlbnQuICBUaGUgcHJldmlvdXMgdGVzdCBkaWRuJ3QgYXBwZWFyIHRvIHdvcmsKLSAgICBpbnQgZGVwdGggPSAwOwotICAgIGZvciAoRWRpdFBhcnQgcGFydCA9IHRoaXM7IHBhcnQgIT0gbnVsbDsgcGFydCA9IHBhcnQuZ2V0UGFyZW50KCkpCi0gICAgewotICAgICAgZGVwdGgrKzsKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIGRlcHRoIDw9IDM7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgR3JhcGhOb2RlRmlndXJlIGNyZWF0ZUdyYXBoTm9kZUZpZ3VyZSgpCi0gIHsKLSAgICBFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKCk7Ci0KLSAgICBmaWd1cmUuZ2V0T3V0bGluZWRBcmVhKCkuc2V0RmlsbCh0cnVlKTsKLSAgICBmaWd1cmUuZ2V0T3V0bGluZWRBcmVhKCkuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLQotICAgIGxhYmVsID0gbmV3IExhYmVsKCk7ICAgIAotICAgIGZpZ3VyZS5nZXRJY29uQXJlYSgpLmFkZChsYWJlbCk7ICAgICAKLSAgICBsYWJlbC5zZXRGb250KG1lZGl1bUJvbGRGb250KTsKLSAgICAKLSAgICBTcGFjaW5nRmlndXJlIHNwYWNpbmdGaWd1cmUgPSBuZXcgU3BhY2luZ0ZpZ3VyZSgpOwotICAgIGZpZ3VyZS5nZXRJY29uQXJlYSgpLmFkZChzcGFjaW5nRmlndXJlKTsKLSAgICAKLSAgICBjb250ZW50SWNvbkxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgLy9jb250ZW50SWNvbi5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigyLCAyLCAyLCAxMCkpOwotICAgIGZpZ3VyZS5nZXRJY29uQXJlYSgpLmFkZChjb250ZW50SWNvbkxhYmVsKTsKLQotICAgIC8vIEEgc25lYWt5IG51bGwgY2hlY2suLi4uIGdldFZpZXdlcigpIGRvZXMgYSBnZXRSb290KCksIGJ1dCBnZXRSb290KCkgbWlnaHQgYmUgbnVsbAotICAgIC8vIHNhbWUgd2l0aCBnZXRQYXJlbnQoKQotICAgIGlmIChnZXRQYXJlbnQoKSAhPSBudWxsICYmIGdldFJvb3QoKSAhPSBudWxsICYmIGdldFZpZXdlcigpIGluc3RhbmNlb2YgWFNEU3Vic3RpdHV0aW9uR3JvdXBzVmlld2VyKQotICAgIHsKLSAgICAgIGZpZ3VyZS5nZXRPdXRlckNvbnRlbnRBcmVhKCkuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0U3BhY2luZyg1KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgIAotICAgICAgUmVjdGFuZ2xlRmlndXJlIGxpbmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0gICAgICBsaW5lLnNldFByZWZlcnJlZFNpemUoMjAsIDEpOyAgIAotICAgICAgZmlndXJlLmdldE91dGxpbmVkQXJlYSgpLmFkZChsaW5lLCAxKTsKLQotICAgICAgZmlndXJlLmdldElubmVyQ29udGVudEFyZWEoKS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGaWxsTGF5b3V0KDIpKTsKLSAgICAgIGZpZ3VyZS5nZXRJbm5lckNvbnRlbnRBcmVhKCkuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMiwyLDIsMSkpOwotCi0gICAgICBDb250YWluZXJGaWd1cmUgbGFiZWxHcm91cCA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsgICAKLSAgICAgIExhYmVsIHR5cGVMYWJlbCA9IG5ldyBMYWJlbCgidHlwZSIpOwotICAgICAgbGFiZWxHcm91cC5hZGQodHlwZUxhYmVsKTsKLSAgICAgIGxhYmVsR3JvdXAuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgNCwgMCwgNCkpOyAgICAgIAotCi0gICAgICBMYWJlbCBlcXVhbHNMYWJlbCA9IG5ldyBMYWJlbCgiID0gIik7Ci0gICAgICBsYWJlbEdyb3VwLmFkZChlcXVhbHNMYWJlbCk7Ci0KLSAgICAgIHR5cGVWYWx1ZUxhYmVsID0gbmV3IExhYmVsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgbGFiZWxHcm91cC5hZGQodHlwZVZhbHVlTGFiZWwpOwotICAgICAgZmlndXJlLmdldE91dGxpbmVkQXJlYSgpLmFkZChsYWJlbEdyb3VwLCAyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfSAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgRXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSBnZXRFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKCkKLSAgewotICAgIHJldHVybiAoRXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSlncmFwaE5vZGVGaWd1cmU7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgCi0gICAgLy8gU3BlY2lhbCBjYXNlIHNpbXBsZSB0eXBlLiAgIE5lZWQgdG8gYWRkIGl0IHRvIHRoZSBsaXN0IGFzIHdlbGwKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHR5cGVEZWYgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pdHlwZURlZik7Ci0gICAgICBpZiAoZ2V0RXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSgpLmlzRXhwYW5kZWQoKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGRBbGwoZ2V0TW9kZWxDaGlsZHJlbkhlbHBlcigpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICByZXR1cm4gZ2V0RXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSgpLmlzRXhwYW5kZWQoKSA/IGdldE1vZGVsQ2hpbGRyZW5IZWxwZXIoKSA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbkhlbHBlcigpCi0gIHsKLSAgICBpZiAoZ2V0Vmlld2VyKCkgaW5zdGFuY2VvZiBYU0RTdWJzdGl0dXRpb25Hcm91cHNWaWV3ZXIpCi0gICAgewotICAgICAgcmV0dXJuIFhTRFN1YnN0aXR1dGlvbkdyb3VwQ2hpbGRVdGlsaXR5LmdldE1vZGVsQ2hpbGRyZW4oZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gWFNEQ2hpbGRVdGlsaXR5LmdldE1vZGVsQ2hpbGRyZW4oZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgfQotICB9ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENvbnRlbnRJY29uKCkKLSAgewotICAgIFN0cmluZyBpY29uTmFtZSA9IG51bGw7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0KLSAgICBpZiAodGQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdGQ7Ci0gICAgICBpZiAoY29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZVVzZXMoKS5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBpY29uTmFtZSA9ICJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIjsgIAotICAgICAgfSAgCi0gICAgfSAgCi0gICAgSW1hZ2UgaW1hZ2UgPSBpY29uTmFtZSAhPSBudWxsID8gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKGljb25OYW1lKSA6IG51bGw7Ci0gICAgY29udGVudEljb25MYWJlbC5zZXRJY29uKGltYWdlKTsgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsgCi0gICAgU3RyaW5nIHRleHQgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpID8KLSAgICAgICAgICAgICAgICAgIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0UU5hbWUoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkpIDoKLSAgICAgICAgICAgICAgICAgIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLQotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgCi0gICAgQ29udGFpbmVyRmlndXJlIHJlY3RhbmdsZSA9IGdyYXBoTm9kZUZpZ3VyZS5nZXRPdXRsaW5lZEFyZWEoKTsKLSAgICBpZiAoWFNER3JhcGhVdGlsLmlzRWRpdGFibGUoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpKQotICAgIHsKLSAgICAgIHJlY3RhbmdsZS5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoaXNTZWxlY3RlZCA/IENvbG9yQ29uc3RhbnRzLmJsYWNrIDogZWxlbWVudEJvcmRlckNvbG9yLCAyKSk7Ci0gICAgICByZWN0YW5nbGUuc2V0QmFja2dyb3VuZENvbG9yKGVsZW1lbnRCYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgcmVjdGFuZ2xlLnNldEZvcmVncm91bmRDb2xvcihlbGVtZW50Qm9yZGVyQ29sb3IpOwotICAgICAgCi0gICAgICBncmFwaE5vZGVGaWd1cmUuZ2V0SW5uZXJDb250ZW50QXJlYSgpLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgICBpZiAoWFNER3JhcGhVdGlsLmlzRWRpdGFibGUoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSkpCi0gICAgICB7IAotICAgICAgICAvLyBnaXZlIGxhYmVsICdlZGl0YWJsZScgY29sb3VyCi0gICAgICAgIGdyYXBoTm9kZUZpZ3VyZS5nZXRJbm5lckNvbnRlbnRBcmVhKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGVsZW1lbnRMYWJlbENvbG9yKTsgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAgCi0gICAgICAgIC8vIGdpdmUgbGFiZWwgJ3JlYWQgb25seScgY29sb3VyCi0gICAgICAgIGdyYXBoTm9kZUZpZ3VyZS5nZXRJbm5lckNvbnRlbnRBcmVhKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGVsZW1lbnRCb3JkZXJDb2xvcik7Ci0gICAgICB9Ci0gICAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudEJhY2tncm91bmRDb2xvcik7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoZWxlbWVudExhYmVsQ29sb3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVjdGFuZ2xlLnNldEJvcmRlcihuZXcgTGluZUJvcmRlcihpc1NlbGVjdGVkID8gQ29sb3JDb25zdGFudHMuYmxhY2sgOiByZWFkT25seUJvcmRlckNvbG9yLCAyKSk7Ci0gICAgICByZWN0YW5nbGUuc2V0QmFja2dyb3VuZENvbG9yKHJlYWRPbmx5QmFja2dyb3VuZENvbG9yKTsKLSAgICAgIHJlY3RhbmdsZS5zZXRGb3JlZ3JvdW5kQ29sb3IocmVhZE9ubHlCb3JkZXJDb2xvcik7Ci0gICAgICBncmFwaE5vZGVGaWd1cmUuZ2V0SW5uZXJDb250ZW50QXJlYSgpLnNldEZvcmVncm91bmRDb2xvcihyZWFkT25seUJvcmRlckNvbG9yKTsgICAgIAotICAgICAgbGFiZWwuc2V0QmFja2dyb3VuZENvbG9yKHJlYWRPbmx5QmFja2dyb3VuZENvbG9yKTsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIGxhYmVsLnNldEljb24oWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9HcmFwaFZpZXdFbGVtZW50UmVmLmdpZiIpKTsKLSAgICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsIDAsIDAsIDQpKTsgCi0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBsYWJlbC5zZXRJY29uKG51bGwpOwotICAgICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgNiwgMCwgNCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZ2V0WFNEUGFydGljbGUoKSAhPSBudWxsKQotICAgIHsgCi0gICAgICByZWZyZXNoT2NjdXJlbmNlTGFiZWwoZ2V0WFNEUGFydGljbGUoKS5nZXRNaW5PY2N1cnMoKSwgZ2V0WFNEUGFydGljbGUoKS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgCi0gICAKLSAgICBpZiAodHlwZVZhbHVlTGFiZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgIGlmIChlZC5nZXRFbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBlZC5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotCQkJCXsgICAKLSAgICAgICAgICB0eXBlVmFsdWVMYWJlbC5zZXRUZXh0KHR5cGUuZXF1YWxzKCIiKSA/ICI8YW5vbnltb3VzPiIgOiB0eXBlKTsKLQkJCQl9Ci0gICAgICAgIGVsc2UgLy8gaWYgaXQgaXMgYSByZWYsIHdlIHNob3cgdGhlIHJlc29sdmVkIHR5cGUKLSAgICAgICAgewotICAgICAgICAJU3RyaW5nIHJlc29sdmVkVHlwZSA9ICIiOwotICAgICAgICAJaWYgKGVkLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgCXsKLSAgICAgICAgCQlpZiAoZWQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICAgIAkgIHsKLSAgICAgICAgCSAgICByZXNvbHZlZFR5cGUgPSBlZC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0UU5hbWUoZWQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gaWYgbnVsbCwgaXQgaGFzIGFuIGFub255bW91cyB0eXBlIHRoYXQgaGFzIG5vIHJlc29sdmVkIHR5cGUKLSAgICAgICAgICAgICAgaWYgKHJlc29sdmVkVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gIjxhbm9ueW1vdXM+IjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAJICB9Ci0gICAgICAgIAl9Ci0gICAgICAgICAgdHlwZVZhbHVlTGFiZWwuc2V0VGV4dChyZXNvbHZlZFR5cGUpOwotCQkJCX0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmVmcmVzaENvbnRlbnRJY29uKCk7Ci0gIH0gCi0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gIAlpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQgfHwKLSAgICAgICAgcmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfT1BFTikKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKFhTREdyYXBoVXRpbC5pc0VkaXRhYmxlKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICAgIHsKLSAgICAgICAgICBMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0ID0gKExvY2F0aW9uUmVxdWVzdClyZXF1ZXN0OwotICAgICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICBpc0NvbnRlbnRJY29uTGFiZWxTZWxlY3RlZCA9IGZhbHNlOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChoaXRUZXN0KGxhYmVsLCBwKSkKLSAgICAgICAgICB7Ci0gIAkJICAgICAgcGVyZm9ybURpcmVjdEVkaXRGb3JMYWJlbCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChoaXRUZXN0KHR5cGVWYWx1ZUxhYmVsLCBwKSkKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIAkJICAgICAgcGVyZm9ybURpcmVjdEVkaXRGb3JUeXBlVmFsdWVMYWJlbCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAKLSAgICAgICAgIAotICBwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRGb3JUeXBlVmFsdWVMYWJlbCgpCi0gIHsKLQkJaWYgKCFnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotCQl7ICAgIAotLy8gICAgICBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCksIHR5cGVWYWx1ZUxhYmVsKTsgICAKLS8vICAgICAgc2ltcGxlRGlyZWN0RWRpdFBvbGljeS5zZXREZWxlZ2F0ZShtYW5hZ2VyKTsKLS8vICAgICAgbWFuYWdlci5zaG93KCk7Ci0vL1RPRE8gcmVtb3ZlIFR5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBzaW5jZSBpdCBpcyBub3QgdXNlZCBhbnkgbG9uZ2VyCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIElGaWxlIGN1cnJlbnRJRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCllZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIoY3VycmVudElGaWxlLCBzY2hlbWEpOwotICAgICAgICAgICAgWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBYU0RDb21wb25lbnRTZWxlY3Rpb25EaWFsb2coc2hlbGwsICJTZXQgVHlwZSIsIHByb3ZpZGVyKTsgIC8vIFRPRE86IEV4dGVybmFsaXplIFRoaXMKLSAgICAgICAgICAgIHByb3ZpZGVyLnNldERpYWxvZyhkaWFsb2cpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0KLSAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBYU0RTZXRUeXBlSGVscGVyIGhlbHBlciA9IG5ldyBYU0RTZXRUeXBlSGVscGVyKGN1cnJlbnRJRmlsZSwgc2NoZW1hKTsKLSAgICAgICAgICAgICAgICBoZWxwZXIuc2V0VHlwZShlbGVtZW50LCAidHlwZSIsIGRpYWxvZy5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9ICAgICAgICAKLQotICAgICAgICAgICAgCi0JCX0KLQkJLy8ganVzdCBpZ25vcmUgdHlwZSBlZGl0IGZvciBlbGVtZW50IHJlZidzCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0Rm9yTGFiZWwoKQotICB7ICAgIAotICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKSAgIAotICAgIHsKLSAgICAgIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIgbWFuYWdlciA9IG5ldyBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyKHRoaXMsIGxhYmVsKQotICAgICAgewotICAgICAgICAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZUNvbWJvQ29udGVudCgpCi0gICAgICAgICB7ICAgICAgICAgICAgIAotICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgIExpc3QgZ2xvYmFsRWxlbWVudE5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBUeXBlc0hlbHBlciB0eXBlc0hlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihzY2hlbWEpOwotICAgICAgICAgICAgIGdsb2JhbEVsZW1lbnROYW1lTGlzdCA9IHR5cGVzSGVscGVyLmdldEdsb2JhbEVsZW1lbnRzKCk7Ci0gICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgIHJldHVybiBnbG9iYWxFbGVtZW50TmFtZUxpc3Q7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1Nb2RpZnkoU3RyaW5nIHZhbHVlKQotICAgICAgICAgeyAKLSAgICAgICAgICAgZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZSgicmVmIiwgdmFsdWUpOwotICAgICAgICAgfQotICAgICAgfTsKLSAgICAgIHNpbXBsZURpcmVjdEVkaXRQb2xpY3kuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0gICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBsYWJlbCwgZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOyAgIAotICAgICAgc2ltcGxlRGlyZWN0RWRpdFBvbGljeS5zZXREZWxlZ2F0ZShtYW5hZ2VyKTsKLSAgICAgIG1hbmFnZXIuc2hvdygpOwotICAgIH0KLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsgIAotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBzaW1wbGVEaXJlY3RFZGl0UG9saWN5KTsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgCi0gIHsKLSAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgIGlmIChnZXRYU0RQYXJ0aWNsZSgpICE9IG51bGwpCi0gICAgewotICAgICAgWFNETW9kZWxBZGFwdGVyRmFjdG9yeS5hZGRNb2RlbEFkYXB0ZXJMaXN0ZW5lcihnZXRYU0RQYXJ0aWNsZSgpLCB0aGlzKTsKLSAgICB9Ci0gIH0KLSAgLyoqIAotICAgKiBBcGFydCBmcm9tIHRoZSBkZWFjdGl2YXRpb24gZG9uZSBpbiBzdXBlciwgdGhlIHNvdXJjZQotICAgKiBhbmQgdGFyZ2V0IGNvbm5lY3Rpb25zIGFyZSBkZWFjdGl2YXRlZCwgYW5kIHRoZSB2aXN1YWwKLSAgICogcGFydCBvZiB0aGUgdGhpcyBpcyByZW1vdmVkLgotICAgKgotICAgKiBAc2VlICNhY3RpdmF0ZSgpIAotICAgKi8KLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIAotICB7Ci0gICAgaWYgKGdldFhTRFBhcnRpY2xlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5LnJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGdldFhTRFBhcnRpY2xlKCksIHRoaXMpOwotICAgIH0KLSAgICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gIH0gICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRJY29uTGFiZWxTZWxlY3RlZCgpCi0gIHsKLSAgICByZXR1cm4gaXNDb250ZW50SWNvbkxhYmVsU2VsZWN0ZWQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpCi0gIHsKLSAgICBJRmlndXJlIGNoaWxkID0gKChHcmFwaGljYWxFZGl0UGFydCljaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKTsKLSAgICBpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbXBsZVR5cGVEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgewotICAgICAgZ3JhcGhOb2RlRmlndXJlLmdldEljb25BcmVhKCkuYWRkKGNoaWxkLCBpbmRleCsgMSk7Ci0gICAgICBTcGFjaW5nRmlndXJlIHNwYWNpbmdGaWd1cmUgPSBuZXcgU3BhY2luZ0ZpZ3VyZSgpOwotICAgICAgZ3JhcGhOb2RlRmlndXJlLmdldEljb25BcmVhKCkuYWRkKHNwYWNpbmdGaWd1cmUsIGluZGV4KzEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoY2hpbGQsIGluZGV4KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpCi0gIHsKLSAgICBJRmlndXJlIGNoaWxkID0gKChHcmFwaGljYWxFZGl0UGFydCljaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKTsKLSAgICBpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbXBsZVR5cGVEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgewotICAgICAgZ3JhcGhOb2RlRmlndXJlLmdldEljb25BcmVhKCkucmVtb3ZlKGNoaWxkKTsKLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0VkaXROYW1lKCkKLSAgewotICAgIENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBsYWJlbCwgZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIHNpbXBsZURpcmVjdEVkaXRQb2xpY3kuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0gICAgbWFuYWdlci5zaG93KCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9FeHBhbmRhYmxlR3JhcGhOb2RlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvRXhwYW5kYWJsZUdyYXBoTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDQwNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9FeHBhbmRhYmxlR3JhcGhOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkV4cGFuZGFibGVHcmFwaE5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkdyYXBoTm9kZUZpZ3VyZTsKLQotICAgICAgICAgICAgICAgICAgCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHBhbmRhYmxlR3JhcGhOb2RlRWRpdFBhcnQgZXh0ZW5kcyBSZXBlYXRhYmxlR3JhcGhOb2RlRWRpdFBhcnQgaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyLCBBY3Rpb25MaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkVG9QZXJmb3JtRGVmYXVsdEV4cGFuc2lvbiA9IHRydWU7Ci0gICAKLSAgcHJvdGVjdGVkIEdyYXBoTm9kZUZpZ3VyZSBjcmVhdGVHcmFwaE5vZGVGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKCk7ICAgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEdyYXBoTm9kZUZpZ3VyZUxpc3RlbmVycygpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGdldEV4cGFuZGFibGVHcmFwaE5vZGVGaWd1cmUoKS5nZXRJbnRlcmFjdG9yKCkuYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsgCi0gIH0gIAotICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlIGdldEV4cGFuZGFibGVHcmFwaE5vZGVGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIChFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKWdyYXBoTm9kZUZpZ3VyZTsKLSAgfSAKLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpICAKLSAgewotICAgIHJldHVybiBnZXRFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKCkuZ2V0T3V0ZXJDb250ZW50QXJlYSgpOwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdEV4cGFuZGVkKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGhhc0NoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiBnZXRNb2RlbENoaWxkcmVuSGVscGVyKCkuc2l6ZSgpID4gMDsKLSAgfSAgICAgICAgIAotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0IGdldE1vZGVsQ2hpbGRyZW5IZWxwZXIoKTsKLSAgICAgIAotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGdldEV4cGFuZGFibGVHcmFwaE5vZGVGaWd1cmUoKS5pc0V4cGFuZGVkKCkgPyBnZXRNb2RlbENoaWxkcmVuSGVscGVyKCkgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKQotICB7ICAgIAotICAgIGlmIChuZWVkVG9QZXJmb3JtRGVmYXVsdEV4cGFuc2lvbiAmJiBpc0RlZmF1bHRFeHBhbmRlZCgpKQotICAgIHsKLSAgICAgIG5lZWRUb1BlcmZvcm1EZWZhdWx0RXhwYW5zaW9uID0gZmFsc2U7ICAgCi0gICAgICBwZXJmb3JtRXhwYW5kT3JDb2xsYXBzZUhlbHBlcigpOwotCi0gICAgICBzdXBlci5yZWZyZXNoQ2hpbGRyZW4oKTsKLQotICAgICAgRWRpdFBhcnQgcm9vdCA9IGdldFJvb3QoKTsKLSAgICAgIGlmIChyb290IGluc3RhbmNlb2YgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkKLSAgICAgIHsgICAgICAgICAKLSAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5zZXRWaXNpYmxlKHRydWUpOyAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIElGaWd1cmUgcm9vdEZpZ3VyZSA9ICgoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClyb290KS5nZXRGaWd1cmUoKTsKLSAgICAgICAgaW52YWxpZGF0ZUFsbChyb290RmlndXJlKTsKLSAgICAgICAgcm9vdEZpZ3VyZS52YWxpZGF0ZSgpOwotICAgICAgICByb290RmlndXJlLnJlcGFpbnQoKTsKLSAgICAgIH0gICAgIAotICAgICAgZ2V0RXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSgpLmdldEludGVyYWN0b3IoKS5yZXBhaW50KCk7Ci0gICAgfSAKLSAgICBlbHNlCi0gICAgewotICAgICAgc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7IAotICAgIH0gICAKLSAgICBnZXRFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKCkuZ2V0SW50ZXJhY3RvcigpLnNldFZpc2libGUoaGFzQ2hpbGRyZW4oKSk7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1FeHBhbmRPckNvbGxhcHNlSGVscGVyKCkKLSAgewotICAgIGJvb2xlYW4gaXNCdXR0b25FeHBhbmRlZCA9ICFnZXRFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKCkuaXNFeHBhbmRlZCgpOwotICAgIGdldEV4cGFuZGFibGVHcmFwaE5vZGVGaWd1cmUoKS5zZXRFeHBhbmRlZChpc0J1dHRvbkV4cGFuZGVkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvUGVyZm9ybUV4cGFuZE9yQ29sbGFwc2UoKQotICB7Ci0gICAgcGVyZm9ybUV4cGFuZE9yQ29sbGFwc2UoKTsKLSAgfSAgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGVkKCkKLSAgewotICAgIHJldHVybiBnZXRFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKCkuaXNFeHBhbmRlZCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUV4cGFuZE9yQ29sbGFwc2UoKQotICB7Ci0gICAgcGVyZm9ybUV4cGFuZE9yQ29sbGFwc2VIZWxwZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIGJvb2xlYW4gaXNCdXR0b25FeHBhbmRlZCA9IGdldEV4cGFuZGFibGVHcmFwaE5vZGVGaWd1cmUoKS5pc0V4cGFuZGVkKCk7Ci0KLSAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLQotICAgIEVkaXRQYXJ0IHJvb3QgPSBnZXRSb290KCk7Ci0gICAgaWYgKHJvb3QgaW5zdGFuY2VvZiBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KQotICAgIHsgICAgICAgICAKLSAgICAgIGdldENvbnRlbnRQYW5lKCkuc2V0VmlzaWJsZShpc0J1dHRvbkV4cGFuZGVkKTsgCi0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgSUZpZ3VyZSByb290RmlndXJlID0gKChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KXJvb3QpLmdldEZpZ3VyZSgpOwotICAgICAgaW52YWxpZGF0ZUFsbChyb290RmlndXJlKTsKLSAgICAgIHJvb3RGaWd1cmUudmFsaWRhdGUoKTsKLSAgICAgIHJvb3RGaWd1cmUucmVwYWludCgpOwotICAgIH0gICAgICAKLSAgICBnZXRFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKCkuZ2V0SW50ZXJhY3RvcigpLnJlcGFpbnQoKTsKLSAgfQotCi0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoT2NjdXJlbmNlTGFiZWwoaW50IG1pbiwgaW50IG1heCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hPY2N1cmVuY2VMYWJlbChtaW4sIG1heCk7Ci0KLSAgICAvLyBUT0RPOiByZXZpc2l0IHRoZSAnaGFjaycgdG8gdW5kZXJzdGFuZCB3aHkgd2UgbmVlZCB0byBkbyB0aGlzIAotICAgIC8vIGluIG9yZGVyIHRvIGdldCB0aGUgdmlldyB0byBsYXlvdXQgcHJvcGV0bHkKLSAgICAvLwotICAgIElGaWd1cmUgdGhpc0ZpZ3VyZSA9IGdldEZpZ3VyZSgpOwotICAgIGludmFsaWRhdGVBbGwodGhpc0ZpZ3VyZSk7Ci0gICAgdGhpc0ZpZ3VyZS52YWxpZGF0ZSgpOwotICAgIHRoaXNGaWd1cmUucmVwYWludCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW52YWxpZGF0ZUFsbChJRmlndXJlIGZpZ3VyZSkKLSAgewotICAgIGZpZ3VyZS5pbnZhbGlkYXRlKCk7ICAgCi0gICAgTGF5b3V0TWFuYWdlciBtYW5hZ2VyID0gZmlndXJlLmdldExheW91dE1hbmFnZXIoKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIG1hbmFnZXIuaW52YWxpZGF0ZSgpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIGludmFsaWRhdGVBbGwoY2hpbGQpOwotICAgIH0KLSAgfSAKLQotICAKLSAgLy8gaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyCi0gIC8vIAotICBwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrZWQoTW91c2VFdmVudCBtZSkgCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IG1lKSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgbWUuY29uc3VtZSgpOwotICAgIG5lZWRUb1BlcmZvcm1EZWZhdWx0RXhwYW5zaW9uID0gZmFsc2U7Ci0gICAgcGVyZm9ybUV4cGFuZE9yQ29sbGFwc2UoKTsgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IG1lKSAKLSAgewotICB9IAotCi0gIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcGVyZm9ybUV4cGFuZE9yQ29sbGFwc2UoKTsKLSAgfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9HcmFwaE5vZGVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9HcmFwaE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTZhZDBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvR3JhcGhOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EcmFnVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXMuR3JhcGhOb2RlRHJhZ1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5HcmFwaE5vZGVGaWd1cmU7Ci0KLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaE5vZGVFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgR3JhcGhOb2RlRmlndXJlIGdyYXBoTm9kZUZpZ3VyZTsKLSAgcHJvdGVjdGVkIFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RlZEVkaXRQYXJ0KCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIElGaWd1cmUgcmVzdWx0ID0gZ3JhcGhOb2RlRmlndXJlID0gY3JlYXRlR3JhcGhOb2RlRmlndXJlKCk7ICAgIAotICAgIGFkZEdyYXBoTm9kZUZpZ3VyZUxpc3RlbmVycygpOwotCi0gICAgaWYgKGlzQ29ubmVjdGVkRWRpdFBhcnQoKSkKLSAgICB7Ci0gICAgICBDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSBjb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSA9IGNyZWF0ZUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBjb25uZWN0ZWRFZGl0UGFydEZpZ3VyZS5hZGQoZ3JhcGhOb2RlRmlndXJlKTsKLSAgICAgIHJlc3VsdCA9IGNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgIAotICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGNyZWF0ZUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlKCkKLSAgewotICAgIENvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlID0gbmV3IENvbm5lY3RlZEVkaXRQYXJ0RmlndXJlKHRoaXMpCi0gICAgewotICAgICAgcHVibGljIElGaWd1cmUgZ2V0U2VsZWN0aW9uRmlndXJlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdyYXBoTm9kZUZpZ3VyZS5nZXRPdXRsaW5lZEFyZWEoKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIElGaWd1cmUgZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBncmFwaE5vZGVGaWd1cmUuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpOwotICAgICAgfQotICAgIH07Ci0gICAgcmV0dXJuIGNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgR3JhcGhOb2RlRmlndXJlIGNyZWF0ZUdyYXBoTm9kZUZpZ3VyZSgpOyAgICAgICAgICAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRHcmFwaE5vZGVGaWd1cmVMaXN0ZW5lcnMoKQotICB7Ci0gIH0KLSAKLSAgcHVibGljIElGaWd1cmUgZ2V0U2VsZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBncmFwaE5vZGVGaWd1cmUuZ2V0T3V0bGluZWRBcmVhKCk7Ci0gIH0KLQotICBwdWJsaWMgUmVjdGFuZ2xlIGdldENvbm5lY3Rpb25SZWN0YW5nbGUoKQotICB7Ci0gICAgcmV0dXJuIGdyYXBoTm9kZUZpZ3VyZS5nZXRDb25uZWN0aW9uUmVjdGFuZ2xlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7IAotICAgIC8vaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSk7ICAgIAotICAgIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KTsgICAKLSAgfSAgCi0KLSAgcHVibGljIERyYWdUcmFja2VyIGdldERyYWdUcmFja2VyKFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiBuZXcgR3JhcGhOb2RlRHJhZ1RyYWNrZXIoKEVkaXRQYXJ0KXRoaXMpOwotICB9ICAgCi0KLSBwcm90ZWN0ZWQgRWRpdFBhcnQgZ2V0QXBwbGljYWJsZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBQb2ludCBwKQotICB7ICAgICAgICAKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7ICAgIAotICAgICAgRWRpdFBhcnQgcGFyZW50ID0gbnVsbDsKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEdyYXBoTm9kZUVkaXRQYXJ0KQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSUZpZ3VyZSBmID0gKChHcmFwaE5vZGVFZGl0UGFydCllZGl0UGFydCkuZ2V0U2VsZWN0aW9uRmlndXJlKCk7Ci0gICAgICAgIGlmICghaGl0VGVzdChmLCBwKSkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOyAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgCi0gICAgICB9ICAgCi0KLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZWRpdFBhcnQgPSBwYXJlbnQ7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgCi0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci0KLSAgcHVibGljIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KFJlcXVlc3QgcmVxdWVzdCkgICAKLSAgeyAKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG51bGw7Ci0gICAgaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJFUV9TRUxFQ1RJT04pCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLSAgICAgIHsKLSAgICAgICAgTG9jYXRpb25SZXF1ZXN0IGxvY2F0aW9uUmVxdWVzdCA9IChMb2NhdGlvblJlcXVlc3QpcmVxdWVzdDsKLSAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotICAgICAgICBlZGl0UGFydCA9IGdldEFwcGxpY2FibGVFZGl0UGFydCh0aGlzLCBwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChlZGl0UGFydCAhPSBudWxsKSA/IGVkaXRQYXJ0IDogc3VwZXIuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0gIH0gICAKLQotICBwdWJsaWMgYm9vbGVhbiBoaXRUZXN0KElGaWd1cmUgdGFyZ2V0LCBQb2ludCBsb2NhdGlvbikKLSAgewotICAgIFJlY3RhbmdsZSBiID0gdGFyZ2V0LmdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICB0YXJnZXQudHJhbnNsYXRlVG9BYnNvbHV0ZShiKTsgIAotICAgIHJldHVybiBiLmNvbnRhaW5zKGxvY2F0aW9uKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9JRmVlZGJhY2tIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0lGZWVkYmFja0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhMDUzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0lGZWVkYmFja0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZlZWRiYWNrSGFuZGxlcgotewotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpOwotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpOwotfSAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9NZXNzYWdlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTWVzc2FnZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjdmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9NZXNzYWdlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLQotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwdWJsaWMgTWVzc2FnZUVkaXRQYXJ0KCkKLSAgewotICB9ICAgCi0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9HUkFQSF9WSUVXX05PVF9BVkFJTEFCTEUiKSk7ICAgICAgICAgCi0gICAgcmV0dXJuIGxhYmVsOwotICB9ICAgIAotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSAKLSAgeyAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL01vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjU4MDRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLlhTRENoaWxkVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLlhTREdyYXBoVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLkNvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5TaW1wbGVEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5HcmFwaE5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLlJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLlJvdW5kZWRMaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLSAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydCBleHRlbmRzIFJlcGVhdGFibGVHcmFwaE5vZGVFZGl0UGFydAotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7ICAgICAKLSAgcHJvdGVjdGVkIFNpbXBsZURpcmVjdEVkaXRQb2xpY3kgc2ltcGxlRGlyZWN0RWRpdFBvbGljeSA9IG5ldyBTaW1wbGVEaXJlY3RFZGl0UG9saWN5KCk7Ci0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNETW9kZWxHcm91cERlZmluaXRpb24pZ2V0TW9kZWwoKTsKLSAgfSAKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RlZEVkaXRQYXJ0KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgICAgICAgICAKLQotICBwdWJsaWMgWFNEUGFydGljbGUgZ2V0WFNEUGFydGljbGUoKQotICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICBPYmplY3QgbyA9IGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgcmV0dXJuIChvIGluc3RhbmNlb2YgWFNEUGFydGljbGUpID8gKFhTRFBhcnRpY2xlKW8gOiBudWxsOwotICB9Ci0gICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBHcmFwaE5vZGVGaWd1cmUgY3JlYXRlR3JhcGhOb2RlRmlndXJlKCkKLSAgewotICAgIFJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZpZ3VyZS5nZXRPdXRsaW5lZEFyZWEoKS5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKDEsIDYpKTsKLSAgICBmaWd1cmUuZ2V0SW5uZXJDb250ZW50QXJlYSgpLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDEwLCAwLCAxMCwgMCkpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoKTsgICAgCi0gICAgbGFiZWwuc2V0Rm9udChtZWRpdW1Cb2xkRm9udCk7IAotICAgIGZpZ3VyZS5nZXRJY29uQXJlYSgpLmFkZChsYWJlbCk7ICAgICAKLQotCi0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfSAgCi0gCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgIAotICB7Ci0gICAgcmV0dXJuIGdyYXBoTm9kZUZpZ3VyZS5nZXRJbm5lckNvbnRlbnRBcmVhKCk7Ci0gIH0KLSAgICAgICAgICAgCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBYU0RDaGlsZFV0aWxpdHkuZ2V0TW9kZWxDaGlsZHJlbihnZXRNb2RlbCgpKTsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAgICAgCi0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gIAlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIHNpbXBsZURpcmVjdEVkaXRQb2xpY3kpOwotICB9ICAgICAgICAgICAgIAotICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsgCi0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotICAgIGlmIChnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBsYWJlbC5zZXRUZXh0KGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldFFOYW1lKCkpOwotICAgICAgbGFiZWwuc2V0SWNvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL0dyYXBoVmlld0VsZW1lbnRSZWYuZ2lmIikpOwotICAgICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgMCwgMCwgNCkpOyAKLQotICAgICAgLy8gdG9kbyB1cGRhdGUgb2NjdXJlbmNlIGxhYmVsCi0gICAgICAvLwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgIAotICAgICAgbGFiZWwuc2V0VGV4dChnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7ICAgICAgCi0gICAgICBsYWJlbC5zZXRJY29uKG51bGwpOwotICAgICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgNiwgMCwgNCkpOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKFhTREdyYXBoVXRpbC5pc0VkaXRhYmxlKGdldE1vZGVsKCkpKQotICAgIHsgCi0gICAgICBncmFwaE5vZGVGaWd1cmUuZ2V0T3V0bGluZWRBcmVhKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGlzU2VsZWN0ZWQgPyBDb2xvckNvbnN0YW50cy5ibGFjayA6IGVsZW1lbnRCb3JkZXJDb2xvcik7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoZWxlbWVudExhYmVsQ29sb3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZ3JhcGhOb2RlRmlndXJlLmdldE91dGxpbmVkQXJlYSgpLnNldEZvcmVncm91bmRDb2xvcihyZWFkT25seUJhY2tncm91bmRDb2xvcik7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IocmVhZE9ubHlCYWNrZ3JvdW5kQ29sb3IpOwotICAgIH0gICAKLQotICAgIHJlZnJlc2hPY2N1cmVuY2VMYWJlbChnZXRYU0RQYXJ0aWNsZSgpKTsKLSAgfQotIAotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkKLSAgeyAgICAgICAgICAgICAgCi0gICAgaWYgKGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIgbWFuYWdlciA9IG5ldyBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyKHRoaXMsIGxhYmVsKQotICAgICAgewotICAgICAgICAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZUNvbWJvQ29udGVudCgpCi0gICAgICAgICB7ICAgICAgICAgICAgIAotICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgTGlzdCBuYW1lTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgVHlwZXNIZWxwZXIgdHlwZXNIZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoc2NoZW1hKTsKLSAgICAgICAgICAgICBuYW1lTGlzdCA9IHR5cGVzSGVscGVyLmdldE1vZGVsR3JvdXBzKCk7Ci0gICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgIHJldHVybiBuYW1lTGlzdDsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybU1vZGlmeShTdHJpbmcgdmFsdWUpCi0gICAgICAgICB7ICAKLSAgICAgICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBEZWxheWVkTW9kZWxHcm91cFJlbmFtZUFjdGlvbihnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpLCB2YWx1ZSkpOwotICAgICAgICAgfQotICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHNpbXBsZURpcmVjdEVkaXRQb2xpY3kuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0gICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBDb21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBDb21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgbGFiZWwsIGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkpOyAgICAgICAgICAgCi0gICAgICBzaW1wbGVEaXJlY3RFZGl0UG9saWN5LnNldERlbGVnYXRlKG1hbmFnZXIpOwotICAgICAgbWFuYWdlci5zaG93KCk7Ci0gICAgfQotICB9ICAKLSAgICAgICAKLQotICBwcm90ZWN0ZWQgY2xhc3MgRGVsYXllZE1vZGVsR3JvdXBSZW5hbWVBY3Rpb24gaW1wbGVtZW50cyBSdW5uYWJsZQotICB7Ci0gICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWZpbml0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgU3RyaW5nIHZhbHVlOwotCi0gICAgIERlbGF5ZWRNb2RlbEdyb3VwUmVuYW1lQWN0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWZpbml0aW9uLCBTdHJpbmcgdmFsdWUpCi0gICAgIHsKLSAgICAgICB0aGlzLm1vZGVsR3JvdXBEZWZpbml0aW9uID0gbW9kZWxHcm91cERlZmluaXRpb247Ci0gICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgewotICAgICAgIG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoInJlZiIsIHZhbHVlKTsKLSAgICAgfQotICB9Ci0gICAgCi0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gIAlpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQpCi0gICAgeyAgICAgCi0gICAgICBpZiAoWFNER3JhcGhVdGlsLmlzRWRpdGFibGUoZ2V0TW9kZWwoKSkpCi0gICAgICB7Ci0gIAkJICBwZXJmb3JtRGlyZWN0RWRpdCgpOwotICAgICAgfQotICAgIH0KLSAgfSAgICAKLSAKLSAgLy8gVE9ETy4uLiBJIGFkZGVkIHRoaXMgYXMgYSBxdWljayBmaXggdG8gbWFrZXN1cmUgdGhlIHRpdGxlIGdldHMgcmVkcmF3biB3aGVuIHRoZSBncm91cFJlZiBpcyBjaGFuZ2VkCi0gIC8vIHdlIHNob3VsZCBwcm9iYWJseSBmaXggdGhlIE1vZGVsTGlzdGVuZXJVdGlsIHRvIGZpcmUgYm90aCBjYWxsIGJvdGggJ2NoYW5nZScgbWV0aG9kcyBmb3IgdGhlIHJlZiBwcm9wZXJ0eQotICAvL3B1YmxpYyB2b2lkIG1vZGVsQ2hpbGRyZW5DaGFuZ2VkKCkKLSAgLy97ICAgCi0gIC8vICBzdXBlci5tb2RlbENoaWxkcmVuQ2hhbmdlZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLy8gIHJlZnJlc2hWaXN1YWxzKCk7IAotICAvL30gCi0KLSAgcHVibGljIHZvaWQgZG9FZGl0TmFtZSgpCi0gIHsKLSAgICBDb21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBDb21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgbGFiZWwsIGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkpOyAgICAgICAgICAgCi0gICAgc2ltcGxlRGlyZWN0RWRpdFBvbGljeS5zZXREZWxlZ2F0ZShtYW5hZ2VyKTsKLSAgICBtYW5hZ2VyLnNob3coKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL01vZGVsR3JvdXBFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Nb2RlbEdyb3VwRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5M2ViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL01vZGVsR3JvdXBFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNEQ2hpbGRVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNER3JhcGhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLkRyYWdBbmREcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuQ2VudGVyZWRJY29uRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkV4cGFuZGFibGVHcmFwaE5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkdyYXBoTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuUm91bmRlZExpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5YU0RNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLQotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIE1vZGVsR3JvdXBFZGl0UGFydCBleHRlbmRzIEV4cGFuZGFibGVHcmFwaE5vZGVFZGl0UGFydAotewotICBwcm90ZWN0ZWQgQ2VudGVyZWRJY29uRmlndXJlIGNlbnRlcmVkSWNvbkZpZ3VyZTsKLSAKLSAgcHJvdGVjdGVkIHN0YXRpYyBDb2xvciBlZGl0YWJsZUJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0gIHByb3RlY3RlZCBzdGF0aWMgQ29sb3IgZWRpdGFibGVGb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotICBwcm90ZWN0ZWQgc3RhdGljIENvbG9yIG5vbkVkaXRhYmxlRm9yZWdyb3VuZENvbG9yID0gbnVsbDsKLQotICBwdWJsaWMgWFNEUGFydGljbGUgZ2V0WFNEUGFydGljbGUoKQotICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICBPYmplY3QgbyA9IGdldFhTRE1vZGVsR3JvdXAoKS5nZXRDb250YWluZXIoKTsKLSAgICByZXR1cm4gKG8gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkgPyAoWFNEUGFydGljbGUpbyA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgWFNETW9kZWxHcm91cCBnZXRYU0RNb2RlbEdyb3VwKCkKLSAgewotICAgIHJldHVybiAoWFNETW9kZWxHcm91cClnZXRNb2RlbCgpOwotICB9ICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgR3JhcGhOb2RlRmlndXJlIGNyZWF0ZUdyYXBoTm9kZUZpZ3VyZSgpCi0gIHsKLSAgICBFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKCk7ICAgICAgCi0KLSAgICBjZW50ZXJlZEljb25GaWd1cmUgPSBuZXcgQ2VudGVyZWRJY29uRmlndXJlKCk7Ci0gICAgY2VudGVyZWRJY29uRmlndXJlLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbigzMiwgMjApKTsgCi0gICAgLy9jZW50ZXJlZEljb25GaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LCAwLCAwKSk7IAotICAgIGZpZ3VyZS5nZXRJY29uQXJlYSgpLmFkZChjZW50ZXJlZEljb25GaWd1cmUpOyAgIAotICAgIC8vZmlndXJlLmdldEljb25BcmVhKCkuc2V0TGF5b3V0KG5ldyBDZW50ZXJMYXlvdXQoKSk7Ci0KLSAgICBDb250YWluZXJGaWd1cmUgb3V0bGluZWRBcmVhID0gZmlndXJlLmdldE91dGxpbmVkQXJlYSgpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIG91dGxpbmVkQXJlYS5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKDEsIDEwKSk7ICAgCi0gICAgLy9vdXRsaW5lZEFyZWEuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDMyLCAyMCkpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyBzZXQgbGF5b3V0IHNvIHRoYXQgY2hpbGRyZW4gYXJlIGFsaWduZWQgdmVydGljYWxseSB3aXRoIHNvbWUgc3BhY2luZwotICAgIC8vCi0gICAgZmlndXJlLmdldE91dGVyQ29udGVudEFyZWEoKS5nZXRDb250YWluZXJMYXlvdXQoKS5zZXRIb3Jpem9udGFsKGZhbHNlKTsgIAotICAgIGZpZ3VyZS5nZXRPdXRlckNvbnRlbnRBcmVhKCkuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0U3BhY2luZygxMCk7Ci0KLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAgIAotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW5IZWxwZXIoKQotICB7Ci0gICAgcmV0dXJuIFhTRENoaWxkVXRpbGl0eS5nZXRNb2RlbENoaWxkcmVuKGdldFhTRE1vZGVsR3JvdXAoKSk7Ci0gIH0gIAotIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsgICAgICAgICAKLSAgICBTdHJpbmcgaWNvbk5hbWUgPSAiaWNvbnMvWFNEU2VxdWVuY2UuZ2lmIjsgICAgCi0gICAgc3dpdGNoIChnZXRYU0RNb2RlbEdyb3VwKCkuZ2V0Q29tcG9zaXRvcigpLmdldFZhbHVlKCkpCi0gICAgewotICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLkFMTCAgIDogeyBpY29uTmFtZSA9ICJpY29ucy9YU0RBbGwuZ2lmIjsgYnJlYWs7IH0KLSAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5DSE9JQ0UgICA6IHsgaWNvbk5hbWUgPSAiaWNvbnMvWFNEQ2hvaWNlLmdpZiI7IGJyZWFrOyB9Ci0gICAgICBjYXNlIFhTRENvbXBvc2l0b3IuU0VRVUVOQ0UgOiB7IGljb25OYW1lID0gImljb25zL1hTRFNlcXVlbmNlLmdpZiI7IGJyZWFrOyB9Ci0gICAgfQotICAgIGNlbnRlcmVkSWNvbkZpZ3VyZS5pbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZShpY29uTmFtZSk7Ci0gICAgY2VudGVyZWRJY29uRmlndXJlLnJlcGFpbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIENvbnRhaW5lckZpZ3VyZSBvdXRsaW5lZEFyZWEgPSBncmFwaE5vZGVGaWd1cmUuZ2V0T3V0bGluZWRBcmVhKCkgOyAgICAKLSAgICBpZiAoWFNER3JhcGhVdGlsLmlzRWRpdGFibGUoZ2V0WFNETW9kZWxHcm91cCgpKSkKLSAgICB7Ci0gICAgICBpZiAoZWRpdGFibGVGb3JlZ3JvdW5kQ29sb3IgPT0gbnVsbCkgCi0gICAgICAgIGVkaXRhYmxlRm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAxMjAsIDE1MiwgMTg0KTsKLQotICAgICAgaWYgKGVkaXRhYmxlQmFja2dyb3VuZENvbG9yID09IG51bGwpIAotICAgICAgICBlZGl0YWJsZUJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjMyLCAyNDAsIDI0OCk7Ci0gICAgICAgCi0gICAgICBvdXRsaW5lZEFyZWEuc2V0Rm9yZWdyb3VuZENvbG9yKGlzU2VsZWN0ZWQgPyBDb2xvckNvbnN0YW50cy5ibGFjayA6IGVkaXRhYmxlRm9yZWdyb3VuZENvbG9yKTsKLSAgICAgIG91dGxpbmVkQXJlYS5zZXRCYWNrZ3JvdW5kQ29sb3IoZWRpdGFibGVCYWNrZ3JvdW5kQ29sb3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKG5vbkVkaXRhYmxlRm9yZWdyb3VuZENvbG9yID09IG51bGwpIAotICAgICAgICBub25FZGl0YWJsZUZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMTY0LCAxNjQsIDE2NCk7ICAgIAotICAgICAgICAKLSAgICAgIG91dGxpbmVkQXJlYS5zZXRGb3JlZ3JvdW5kQ29sb3IoaXNTZWxlY3RlZCA/IENvbG9yQ29uc3RhbnRzLmJsYWNrIDogbm9uRWRpdGFibGVGb3JlZ3JvdW5kQ29sb3IpOwotICAgICAgb3V0bGluZWRBcmVhLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgfSAgCi0KLSAgICByZWZyZXNoT2NjdXJlbmNlTGFiZWwoZ2V0WFNEUGFydGljbGUoKSk7Ci0gIH0gICAgICAgIAotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQ2hpbGRMYXlvdXRIb3Jpem9udGFsKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSAKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRFeHBhbmRlZCgpCi0gIHsgICAgICAgIAotICAgIHJldHVybiBpc1Bvc3NpYmxlQ3ljbGUoKSA/IGZhbHNlIDogdHJ1ZTsKLSAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvLyBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IHdlIGRvbid0IGVuZCB1cCB3aXRoIGFuIGluZmluaXRlIGRlZmF1bHQgZXhwYW5zaW9uIChlLmcuIHdoZW4gYSBncm91cCBjb250YWlucyBhIGN5Y2xpYyBncm91cCByZWYpCi0gIC8vIFRPRE8uLi4gd2UgcHJvYmFibHkgbmVlZCBzb21lIG1vcmUgZXh0ZW5zaWJsZSAnT08nIHdheSBvZiBjb21wdXRpbmcgdGhpcyBpbmZvcm1hdGlvbgotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bvc3NpYmxlQ3ljbGUoKQotICB7ICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydCBncm91cCA9IChNb2RlbEdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KWdldFBhcmVudCgpOwotICAgICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBncm91cC5nZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAgICAgICAKLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIGlmIChwYXJlbnQuZ2V0TW9kZWwoKSA9PSBncm91cC5nZXRNb2RlbCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLSAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLCBuZXcgRHJhZ0FuZERyb3BFZGl0UG9saWN5KGdldFZpZXdlcigpLCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSkpOyAgICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIAotICB7Ci0gICAgc3VwZXIuYWN0aXZhdGUoKTsKLSAgICBpZiAoZ2V0WFNEUGFydGljbGUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRE1vZGVsQWRhcHRlckZhY3RvcnkuYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoZ2V0WFNEUGFydGljbGUoKSwgdGhpcyk7Ci0gICAgfQotICB9Ci0gIC8qKiAKLSAgICogQXBhcnQgZnJvbSB0aGUgZGVhY3RpdmF0aW9uIGRvbmUgaW4gc3VwZXIsIHRoZSBzb3VyY2UKLSAgICogYW5kIHRhcmdldCBjb25uZWN0aW9ucyBhcmUgZGVhY3RpdmF0ZWQsIGFuZCB0aGUgdmlzdWFsCi0gICAqIHBhcnQgb2YgdGhlIHRoaXMgaXMgcmVtb3ZlZC4KLSAgICoKLSAgICogQHNlZSAjYWN0aXZhdGUoKSAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSAKLSAgewotICAgIGlmIChnZXRYU0RQYXJ0aWNsZSgpICE9IG51bGwpCi0gICAgewotICAgICAgWFNETW9kZWxBZGFwdGVyRmFjdG9yeS5yZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihnZXRYU0RQYXJ0aWNsZSgpLCB0aGlzKTsKLSAgICB9Ci0gICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9ICAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvUmVwZWF0YWJsZUdyYXBoTm9kZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1JlcGVhdGFibGVHcmFwaE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRmN2Q2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvUmVwZWF0YWJsZUdyYXBoTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLkRyYWdBbmREcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuR3JhcGhOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5SZXBlYXRhYmxlR3JhcGhOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLSAgICAgICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgUmVwZWF0YWJsZUdyYXBoTm9kZUVkaXRQYXJ0IGV4dGVuZHMgR3JhcGhOb2RlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIFJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUgZ2V0UmVwZWF0YWJsZUdyYXBoTm9kZUZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gKFJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUpZ3JhcGhOb2RlRmlndXJlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgR3JhcGhOb2RlRmlndXJlIGNyZWF0ZUdyYXBoTm9kZUZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgCi0gICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE9jY3VyZW5jZUxhYmVsKFhTRFBhcnRpY2xlIHBhcnRpY2xlKQotICB7ICAKLSAgICBpZiAocGFydGljbGUgIT0gbnVsbCkKLSAgICB7IAotICAgICAgcmVmcmVzaE9jY3VyZW5jZUxhYmVsKHBhcnRpY2xlLmdldE1pbk9jY3VycygpLCBwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE9jY3VyZW5jZUxhYmVsKGludCBtaW4sIGludCBtYXgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAobWluID09IDEgJiYgbWF4ID09IDEpCi0gICAgewotICAgICAgZ2V0UmVwZWF0YWJsZUdyYXBoTm9kZUZpZ3VyZSgpLmdldE9jY3VyZW5jZUxhYmVsKCkuc2V0VGV4dCgiIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgbWF4U3RyaW5nID0gbWF4ID09IC0xID8gIioiIDogIiIgKyBtYXg7Ci0gICAgICBnZXRSZXBlYXRhYmxlR3JhcGhOb2RlRmlndXJlKCkuZ2V0T2NjdXJlbmNlTGFiZWwoKS5zZXRUZXh0KG1pbiArICIuLiIgKyBtYXhTdHJpbmcpOwotICAgIH0KLSAgICBnZXRSZXBlYXRhYmxlR3JhcGhOb2RlRmlndXJlKCkuZ2V0T2NjdXJlbmNlTGFiZWwoKS5yZXBhaW50KCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7IAotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIAotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0gICAgCU9iamVjdCBwYXJlbnQgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZ2V0TW9kZWwoKSkuZUNvbnRhaW5lcigpOwotICAgIAkKLSAgICAJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKSkgewotICAgIAkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwgbmV3IERyYWdBbmREcm9wRWRpdFBvbGljeShnZXRWaWV3ZXIoKSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpKTsgICAgICAKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwgbmV3IERyYWdBbmREcm9wRWRpdFBvbGljeShnZXRWaWV3ZXIoKSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpKTsKLSAgICB9Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Sb290Q29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvUm9vdENvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2EyZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Sb290Q29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNEQ2hpbGRVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNER3JhcGhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNESW5oZXJpdGFuY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXMuQ29tcG9uZW50TmFtZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5TaW1wbGVEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5FeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5HcmFwaE5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLlJvdW5kZWRMaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci0KLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBSb290Q29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQgZXh0ZW5kcyBFeHBhbmRhYmxlR3JhcGhOb2RlRWRpdFBhcnQKLXsgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBMYWJlbCBsYWJlbDsgIAotICBwcm90ZWN0ZWQgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSBzaW1wbGVEaXJlY3RFZGl0UG9saWN5ID0gbmV3IFNpbXBsZURpcmVjdEVkaXRQb2xpY3koKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0KLSAgcHJvdGVjdGVkIEdyYXBoTm9kZUZpZ3VyZSBjcmVhdGVHcmFwaE5vZGVGaWd1cmUoKQotICB7Ci0gICAgRXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgRXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSgpOwotICAgIGZpZ3VyZS5nZXRPdXRsaW5lZEFyZWEoKS5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKDEsIDYpKTsKLSAgICBmaWd1cmUuZ2V0T3V0bGluZWRBcmVhKCkuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBmaWd1cmUuZ2V0T3V0bGluZWRBcmVhKCkuc2V0RmlsbCh0cnVlKTsKLSAgICAKLSAgICBpZiAoZ2V0Vmlld2VyKCkgaW5zdGFuY2VvZiBYU0RJbmhlcml0YW5jZVZpZXdlcikKLSAgICB7Ci0gICAgICBmaWd1cmUuZ2V0T3V0ZXJDb250ZW50QXJlYSgpLmdldENvbnRhaW5lckxheW91dCgpLnNldFNwYWNpbmcoMTApOwotICAgIH0KLQotICAgIGxhYmVsID0gbmV3IExhYmVsKCk7ICAgICAgIAotICAgIGxhYmVsLnNldEZvbnQobWVkaXVtQm9sZEZvbnQpOwotICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDUsIDgsIDUsIDgpKTsgIAotICAgIGZpZ3VyZS5nZXRJY29uQXJlYSgpLmFkZChsYWJlbCk7ICAKLQotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0gICAgICAgICAgCi0gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgeyAKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdGQgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldE1vZGVsKCk7ICAgICAgICAgICAgICAgICAgIAotICAgIGxhYmVsLnNldFRleHQoY3RkLmdldE5hbWUoKSAhPSBudWxsID8gY3RkLmdldE5hbWUoKTogIiIpOwotCi0gICAgaWYgKFhTREdyYXBoVXRpbC5pc0VkaXRhYmxlKGN0ZCkpCi0gICAgeyAKLSAgICAgIGZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoZWxlbWVudEJvcmRlckNvbG9yKTsKLSAgICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihlbGVtZW50Qm9yZGVyQ29sb3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmlndXJlLnNldEZvcmVncm91bmRDb2xvcihyZWFkT25seUJvcmRlckNvbG9yKTsKLSAgICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihyZWFkT25seUJvcmRlckNvbG9yKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW5IZWxwZXIoKQotICB7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilnZXRNb2RlbCgpOwotICAgIGlmIChnZXRWaWV3ZXIoKSBpbnN0YW5jZW9mIFhTREluaGVyaXRhbmNlVmlld2VyKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RDaGlsZFV0aWxpdHkuZ2V0SW1tZWRpYXRlRGVyaXZlZFR5cGVzKGN0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBYU0RDaGlsZFV0aWxpdHkuZ2V0TW9kZWxDaGlsZHJlbihnZXRNb2RlbCgpKTsKLSAgICB9Ci0gIH0gICAgIAotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAgCi0gICAgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHBvbGljeSA9IG5ldyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBwb2xpY3kpOyAgICAgCi0gIAlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIHNpbXBsZURpcmVjdEVkaXRQb2xpY3kpOwotICB9ICAKLSAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBsYWJlbCwgKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilnZXRNb2RlbCgpKTsgICAgIAotICAgIHNpbXBsZURpcmVjdEVkaXRQb2xpY3kuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0gICAgbWFuYWdlci5zaG93KCk7Ci0gIH0gICAgCi0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgCWlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCkKLSAgICB7Ci0gICAgICBpZiAoWFNER3JhcGhVdGlsLmlzRWRpdGFibGUoZ2V0TW9kZWwoKSkpCi0gICAgICB7Ci0gIAkJICBwZXJmb3JtRGlyZWN0RWRpdCgpOwotICAgICAgfQotICAgIH0KLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvUm9vdE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvUm9vdE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmNDQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1Jvb3RNb2RlbEdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLlhTRENoaWxkVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLlhTREdyYXBoVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5Db21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLlNpbXBsZURpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkV4cGFuZGFibGVHcmFwaE5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkdyYXBoTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuUm91bmRlZExpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi0gICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIFJvb3RNb2RlbEdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0IGV4dGVuZHMgRXhwYW5kYWJsZUdyYXBoTm9kZUVkaXRQYXJ0Ci17ICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgTGFiZWwgbGFiZWw7ICAKLSAgcHJvdGVjdGVkIFNpbXBsZURpcmVjdEVkaXRQb2xpY3kgc2ltcGxlRGlyZWN0RWRpdFBvbGljeSA9IG5ldyBTaW1wbGVEaXJlY3RFZGl0UG9saWN5KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgR3JhcGhOb2RlRmlndXJlIGNyZWF0ZUdyYXBoTm9kZUZpZ3VyZSgpCi0gIHsKLSAgICBFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlKCk7Ci0gICAgZmlndXJlLmdldE91dGxpbmVkQXJlYSgpLnNldEJvcmRlcihuZXcgUm91bmRlZExpbmVCb3JkZXIoMSwgNikpOwotICAgIGZpZ3VyZS5nZXRPdXRsaW5lZEFyZWEoKS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIGZpZ3VyZS5nZXRPdXRsaW5lZEFyZWEoKS5zZXRGaWxsKHRydWUpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoKTsgICAgICAgCi0gICAgbGFiZWwuc2V0Rm9udChtZWRpdW1Cb2xkRm9udCk7Ci0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoNSwgOCwgNSwgOCkpOyAgCi0gICAgZmlndXJlLmdldEljb25BcmVhKCkuYWRkKGxhYmVsKTsgIAotCi0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsgCi0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtZ2QgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pZ2V0TW9kZWwoKTsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIG5hbWUgPSBtZ2QuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE5hbWUoKTsgICAgICAgICAgICAgICAgICAKLSAgICBsYWJlbC5zZXRUZXh0KG5hbWUpOwotCi0gICAgaWYgKFhTREdyYXBoVXRpbC5pc0VkaXRhYmxlKGdldE1vZGVsKCkpKQotICAgIHsgCi0gICAgICBmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKGVsZW1lbnRCb3JkZXJDb2xvcik7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoZWxlbWVudEJvcmRlckNvbG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IocmVhZE9ubHlCb3JkZXJDb2xvcik7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IocmVhZE9ubHlCb3JkZXJDb2xvcik7Ci0gICAgfQotICB9ICAKLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuSGVscGVyKCkKLSAgewotICAgIHJldHVybiBYU0RDaGlsZFV0aWxpdHkuZ2V0TW9kZWxDaGlsZHJlbihnZXRNb2RlbCgpKTsKLSAgfSAgIAotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAgCi0gICAgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHBvbGljeSA9IG5ldyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBwb2xpY3kpOyAgICAgCi0gIAlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIHNpbXBsZURpcmVjdEVkaXRQb2xpY3kpOwotICB9ICAKLSAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBsYWJlbCwgKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbilnZXRNb2RlbCgpKS5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkpOyAgICAgICAgICAgCi0gICAgc2ltcGxlRGlyZWN0RWRpdFBvbGljeS5zZXREZWxlZ2F0ZShtYW5hZ2VyKTsKLSAgICBtYW5hZ2VyLnNob3coKTsKLSAgfSAgICAKLQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAJaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUKQotICAgIHsKLSAgICAgIGlmIChYU0RHcmFwaFV0aWwuaXNFZGl0YWJsZShnZXRNb2RlbCgpKSkKLSAgICAgIHsKLSAgCQkgIHBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9TY2hlbWFEaXJlY3RpdmVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9TY2hlbWFEaXJlY3RpdmVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDY5N2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvU2NoZW1hRGlyZWN0aXZlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuQ2VudGVyZWRJY29uRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLlJvdW5kZWRMaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci0KLQotcHVibGljIGNsYXNzIFNjaGVtYURpcmVjdGl2ZUVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBDZW50ZXJlZEljb25GaWd1cmUgY2VudGVyZWRJY29uRmlndXJlOwotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCNjcmVhdGVGaWd1cmUoKQotICAgKi8KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotIAotICAgIENvbnRhaW5lckZpZ3VyZSBmaWd1cmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0KLSAgICBmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBmaWd1cmUuc2V0Qm9yZGVyKG5ldyBSb3VuZGVkTGluZUJvcmRlcigxLCA4KSk7Ci0KLSAgICBDb250YWluZXJGaWd1cmUgZmlnID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIGZpZy5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIGZpZy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigxMCwgMCwgMTAsIDApKTsKLSAgICBmaWd1cmUuYWRkKGZpZyk7Ci0KLQotICAgIGxhYmVsID0gbmV3IExhYmVsKCk7ICAgIAotICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDQsIDIsIDIsIDEwKSk7Ci0gICAgZmlnLmFkZChsYWJlbCk7ICAgICAgICAKLQotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0gIAotIAotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSlnZXRNb2RlbCgpOwotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IGRpcmVjdGl2ZS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIGlmIChzY2hlbWFMb2NhdGlvbiA9PSBudWxsKSBzY2hlbWFMb2NhdGlvbiA9ICIoIiArIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9OT19MT0NBVElPTl9TUEVDSUZJRUQiKSArICIpIjsKLSAgICBpZiAoc2NoZW1hTG9jYXRpb24uZXF1YWxzKCIiKSkgc2NoZW1hTG9jYXRpb24gPSAiKCIgKyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfTk9fTE9DQVRJT05fU1BFQ0lGSUVEIikgKyAiKSI7Ci0gICAgbGFiZWwuc2V0VGV4dCgiICAiICsgZGlyZWN0aXZlLmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKSArICIgIiArIHNjaGVtYUxvY2F0aW9uKTsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvU2NoZW1hRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvU2NoZW1hRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzODIxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1NjaGVtYUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5HcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5Sb3VuZGVkTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLm1vZGVsLkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuWFNETW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBjb250YWluZXJGaWd1cmU7Ci0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLQotICAvL3Byb3RlY3RlZCBDb250YWluZXJGaWd1cmUgY2hpbGRFeHBhbnNpb25Db250YWluZXI7Ci0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBjb250YWluZXJGaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgQ29udGFpbmVyRmlndXJlIG91dGVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIG91dGVyLnNldEJvcmRlcihuZXcgUm91bmRlZExpbmVCb3JkZXIoMSwgNikpOwotICAgIG91dGVyLnNldEZvcmVncm91bmRDb2xvcihjYXRlZ29yeUJvcmRlckNvbG9yKTsKLSAgICBGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCg0KTsKLSAgICBvdXRlci5zZXRMYXlvdXRNYW5hZ2VyKGZpbGxMYXlvdXQpOyAKLSAgICAvL291dGVyLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIAotICAgIENvbnRhaW5lckZpZ3VyZSByID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOyAgCi0gICAgci5zZXRPdXRsaW5lKGZhbHNlKTsKLSAgICByLnNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24oMCwgMCkpOwotICAgIHIuc2V0RmlsbCh0cnVlKTsKLSAgICByLnNldEJhY2tncm91bmRDb2xvcihHcmFwaGljc0NvbnN0YW50cy5lbGVtZW50QmFja2dyb3VuZENvbG9yKTsKLSAgICBvdXRlci5hZGQocik7Ci0gICAgCi0JZmluYWwgaW50IHRoZU1pbkhlaWdodCA9IDIwMDsKLSAgICBGaWxsTGF5b3V0IG91dGVyTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgICAgewotICAgICAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmNhbGN1bGF0ZVByZWZlcnJlZFNpemUocGFyZW50LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgZC51bmlvbihuZXcgRGltZW5zaW9uKDEwMCwgdGhlTWluSGVpZ2h0KSk7Ci0gICAgICAgIHJldHVybiBkOwotICAgICAgfQotICAgIH07Ci0gICAgb3V0ZXJMYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgb3V0ZXIuc2V0TGF5b3V0TWFuYWdlcihvdXRlckxheW91dCk7Ci0gICAgCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDIsIDQsIDIsIDQpKTsgICAgCi0gICAgci5hZGQobGFiZWwpOwotICAgIAotICAgIFJlY3RhbmdsZUZpZ3VyZSBsaW5lID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotICAgIGxpbmUuc2V0UHJlZmVycmVkU2l6ZSgyMCwgMSk7Ci0gICAgb3V0ZXIuYWRkKGxpbmUpOwotICAgIAotICAgIGNvbnRhaW5lckZpZ3VyZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICAvL2NvbnRhaW5lckZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMucmVkKTsKLSAgICBjb250YWluZXJGaWd1cmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoNCwgNCwgNCwgNCkpOwotICAgIGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCg0KTsKLSAgICBjb250YWluZXJGaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihmaWxsTGF5b3V0KTsKLSAgICAvL2NvbnRhaW5lckZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGaWxsTGF5b3V0KGZhbHNlKSk7Ci0gICAgLyoKLSAgICAgKiBGbG93TGF5b3V0IGxheW91dDEgPSBuZXcgRmxvd0xheW91dChmYWxzZSk7IGxheW91dDEuc2V0TWFqb3JTcGFjaW5nKDApOwotICAgICAqIGxheW91dDEuc2V0TWlub3JTcGFjaW5nKDApOyBsYXlvdXQxLnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgICogY29udGFpbmVyRmlndXJlLnNldExheW91dE1hbmFnZXIobGF5b3V0MSk7Ci0gICAgICovCi0gICAgb3V0ZXIuYWRkKGNvbnRhaW5lckZpZ3VyZSk7Ci0gICAgLy9jaGlsZEV4cGFuc2lvbkNvbnRhaW5lciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICAvL2NoaWxkRXhwYW5zaW9uQ29udGFpbmVyLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIC8vY2hpbGRFeHBhbnNpb25Db250YWluZXIuc2V0T3V0bGluZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIG91dGVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgZ2V0TW9kZWwoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoQ2F0ZWdvcnlSb3dFZGl0UGFydC5ESVJFQ1RJVkVTX0FORF9OT1RBVElPTlMpOwotICAgIGxpc3QuYWRkKENhdGVnb3J5Um93RWRpdFBhcnQuRUxFTUVOVFNfQU5EX1RZUEVTKTsKLSAgICBsaXN0LmFkZChDYXRlZ29yeVJvd0VkaXRQYXJ0Lk1PREVMX0dST1VQU19BTkRfQVRUUklCVVRFUyk7ICAgICAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgQ2F0ZWdvcnlSb3dFZGl0UGFydCByZXN1bHQgPSBuZXcgQ2F0ZWdvcnlSb3dFZGl0UGFydCgpOwotICAgIHJlc3VsdC5zZXRNb2RlbChtb2RlbCk7Ci0gICAgcmVzdWx0LnNldFBhcmVudCh0aGlzKTsKLSAgICByZXN1bHQuc2V0U2NoZW1hKChYU0RTY2hlbWEpZ2V0TW9kZWwoKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2VWYWx1ZSA9ICgoWFNEU2NoZW1hKWdldE1vZGVsKCkpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIGlmICh0YXJnZXROYW1lc3BhY2VWYWx1ZSA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZVZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgdGFyZ2V0TmFtZXNwYWNlVmFsdWUgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfR1JBUEhfWFNEU0NIRU1BX05PX05BTUVTUEFDRSIpOwotICAgIH0gICAgIAotICAgIGxhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0dSQVBIX1hTRFNDSEVNQSIpICsgIiA6ICIgKyB0YXJnZXROYW1lc3BhY2VWYWx1ZSk7Ci0gIH0KLX0KLQotY2xhc3MgQ2F0ZWdvcnlSb3dFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAoteyAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRUxFTUVOVFNfQU5EX1RZUEVTID0ge0NhdGVnb3J5LkVMRU1FTlRTLCBDYXRlZ29yeS5UWVBFUyB9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIERJUkVDVElWRVNfQU5EX05PVEFUSU9OUyA9ICB7Q2F0ZWdvcnkuRElSRUNUSVZFUywgQ2F0ZWdvcnkuTk9UQVRJT05TIH07Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTU9ERUxfR1JPVVBTX0FORF9BVFRSSUJVVEVTID0ge0NhdGVnb3J5LkdST1VQUywgQ2F0ZWdvcnkuQVRUUklCVVRFU307Ly8sIENhdGVnb3J5LkNPTVBMRVhfVFlQRVMgfTsKLSAgCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICBwcm90ZWN0ZWQgRmlndXJlIGNvbnRlbnRQYW5lOwotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIENvbnRhaW5lckZpZ3VyZSBjb250YWluZXJGaWd1cmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgLy9jb250YWluZXJGaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnJlZCk7Ci0gICAgY29udGFpbmVyRmlndXJlLnNldEZpbGwodHJ1ZSk7Ci0gICAgY29udGFpbmVyRmlndXJlLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDQsIDQsIDQsIDQpKTsKLSAgICBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuRmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5GaWxsTGF5b3V0KDQpOwotICAgIGZpbGxMYXlvdXQuc2V0SG9yaXpvbnRhbCh0cnVlKTsKLSAgICBjb250YWluZXJGaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihmaWxsTGF5b3V0KTsKLSAgICAvL2NvbnRhaW5lckZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGaWxsTGF5b3V0KDQpKTsKLSAgICByZXR1cm4gY29udGFpbmVyRmlndXJlOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0I2dldENvbnRlbnRQYW5lKCkKLSAgICovCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLSAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGNhdGVnb3J5TGlzdCA9IChMaXN0KSBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIoc2NoZW1hKS5nZXRQcm9wZXJ0eShzY2hlbWEsICJncm91cHMiKTsKLSAgICByZXR1cm4gZmlsdGVyQ2F0ZWdvcnlMaXN0KGNhdGVnb3J5TGlzdCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGZpbHRlckNhdGVnb3J5TGlzdChMaXN0IGxpc3QpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpbnRbXSBjYXRlZ29yeVR5cGVzID0gKGludFtdKWdldE1vZGVsKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENhdGVnb3J5IGNhdGVnb3J5ID0gKENhdGVnb3J5KWkubmV4dCgpOwotICAgICAgaWYgKGlzTWF0Y2hpbmcoY2F0ZWdvcnlUeXBlcywgY2F0ZWdvcnkpKQotICAgICAgewotICAgICAgICByZXN1bHQuYWRkKGNhdGVnb3J5KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGlzTWF0Y2hpbmcoaW50W10gY2F0ZWdvcnlUeXBlcywgQ2F0ZWdvcnkgY2F0ZWdvcnkpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlUeXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoY2F0ZWdvcnlUeXBlc1tpXSA9PSBjYXRlZ29yeS5nZXRHcm91cFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1NpbXBsZVR5cGVEZWZpbml0aW9uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvU2ltcGxlVHlwZURlZmluaXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjFhZmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvU2ltcGxlVHlwZURlZmluaXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JbWFnZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVEZWZpbml0aW9uRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotCi0gIEltYWdlRmlndXJlIGZpZ3VyZTsKLSAgSW1hZ2UgaW1hZ2U7Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgU3RyaW5nIGljb25OYW1lID0gImljb25zL1hTRFNpbXBsZVR5cGVGb3JFZGl0UGFydC5naWYiOwotICAgIGltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKGljb25OYW1lKTsKLSAgCi0gICAgZmlndXJlID0gbmV3IEltYWdlRmlndXJlKGltYWdlKTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgaWYgKGlzU2VsZWN0ZWQpCi0gICAgewotICAgICAgaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGVGb3JFZGl0UGFydC5naWYiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpOwotICAgIH0KLSAgICBmaWd1cmUuc2V0SW1hZ2UoaW1hZ2UpOwotICAgIGZpZ3VyZS5yZXBhaW50KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGVkRWRpdFBhcnQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgICBpbWFnZSA9IG51bGw7ICAvLyB3aGVyZSBkbyB3ZSBkaXNwb3NlIHRoZSBpbWFnZT8KLSAgfQotICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7IAotICAgIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KTsgICAKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1N1YnN0aXR1dGlvbkdyb3VwVmlld2VyUm9vdEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1N1YnN0aXR1dGlvbkdyb3VwVmlld2VyUm9vdEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTllOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9TdWJzdGl0dXRpb25Hcm91cFZpZXdlclJvb3RFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkNvbnRhaW5lckxheW91dDsKLQotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIFN1YnN0aXR1dGlvbkdyb3VwVmlld2VyUm9vdEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfUExBQ0VfSE9MREVSID0gIk1FU1NBR0VfUExBQ0VfSE9MREVSIjsKLSAgcHJvdGVjdGVkIE9iamVjdCBpbnB1dDsgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkKLSAgewotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBQYW5lbCBwYW5lbCA9IG5ldyBQYW5lbCgpOwotICAgIENvbnRhaW5lckxheW91dCBsYXlvdXQgPSBuZXcgQ29udGFpbmVyTGF5b3V0KCk7Ci0gICAgbGF5b3V0LnNldEJvcmRlcig2MCk7Ci0gICAgcGFuZWwuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotICAgIHJldHVybiBwYW5lbDsKLSAgfSAgIAotICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgCi0gIHsgICAgICAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoaW5wdXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoTUVTU0FHRV9QTEFDRV9IT0xERVIpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfSAgICAgICAgIAotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVDaGlsZChPYmplY3QgbW9kZWwpIAotICB7IAotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gbnVsbDsKLSAgICBpZiAobW9kZWwgPT0gTUVTU0FHRV9QTEFDRV9IT0xERVIpCi0gICAgewotICAgICAgZWRpdFBhcnQgPSBuZXcgTWVzc2FnZUVkaXRQYXJ0KCk7Ci0gICAgICBlZGl0UGFydC5zZXRNb2RlbChtb2RlbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IHN1cGVyLmNyZWF0ZUNoaWxkKG1vZGVsKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9IAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsgIAotICB9ICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Ub3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1RvcExldmVsQ29tcG9uZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5NjcxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1RvcExldmVsQ29tcG9uZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkFic3RyYWN0RWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZWRpdHBhcnRzLkFic3RyYWN0Q29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguR3JhcGhpY3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5YU0RDb21wb25lbnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5YU0RHcmFwaFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXMuQ29tcG9uZW50TmFtZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5TaW1wbGVEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5YU0RNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLQotCi1wdWJsaWMgY2xhc3MgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotICAvL3Byb3RlY3RlZCBMYWJlbCBhcnJvd0xhYmVsOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIGxhYmVsSG9sZGVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotICBwcm90ZWN0ZWQgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSBzaW1wbGVEaXJlY3RFZGl0UG9saWN5ID0gbmV3IFNpbXBsZURpcmVjdEVkaXRQb2xpY3koKTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3RlZDsKLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBDb250YWluZXJGaWd1cmUgdHlwZUdyb3VwID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIHR5cGVHcm91cC5nZXRDb250YWluZXJMYXlvdXQoKS5zZXRIb3Jpem9udGFsKHRydWUpOwotCi0gICAgLy9hcnJvd0xhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgLy9hcnJvd0xhYmVsLnNldEljb24oWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJpY29ucy9mb3J3YXJkLmdpZiIpKTsKLSAgICAvL3R5cGVHcm91cC5hZGQoYXJyb3dMYWJlbCk7Ci0KLSAgICBsYWJlbEhvbGRlciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotICAgIGxhYmVsSG9sZGVyLnNldExheW91dE1hbmFnZXIoZmlsbExheW91dCk7Ci0gICAgbGFiZWxIb2xkZXIuc2V0RmlsbCh0cnVlKTsKLSAgICB0eXBlR3JvdXAuYWRkKGxhYmVsSG9sZGVyKTsKLQotICAgIGxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgMiwgMiwgMSkpOwotICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgbGFiZWxIb2xkZXIuYWRkKGxhYmVsKTsKLSAgICAKLSAgICB0cnkKLQkgIHsKLSAgICAgIC8vIGV2aWwgaGFjayB0byBwcm92aWRlIHVuZGVybGluZXMKLSAgICAgIE9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgICAKLSAgICAgIGJvb2xlYW4gaXNMaW51eCA9IGphdmEuaW8uRmlsZS5zZXBhcmF0b3IuZXF1YWxzKCIvIik7Ci0gICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gfHwKLSAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fAotICAgICAgICAgIG1vZGVsIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNMaW51eCkKLSAgICAgICAgewotICAgICAgICAgIEZvbnREYXRhIG9sZERhdGEgPSBHcmFwaGljc0NvbnN0YW50cy5tZWRpdW0uZ2V0Rm9udERhdGEoKVswXTsKLSAgICAgICAgICBGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShvbGREYXRhLmdldE5hbWUoKSwgb2xkRGF0YS5nZXRIZWlnaHQoKSwgU1dULk5PTkUpOwotCi0gICAgICAgICAgICAvLyBUT0RPLi4uIGNsZWFuIHRoaXMgYXdmdWwgY29kZSB1cC4uLiB3ZSBzZWVtIHRvIGJlIGxlYWtpbmcgaGVyZSB0b28KLSAgICAgICAgICAgIC8vIHdlIGNhbid0IGNhbGwgdGhpcyBkaXJlY3RseSBzaW5jZSB0aGUgbWV0aG9kcyBhcmUgT1MgZGVwZW5kYW50Ci0gICAgICAgICAgICAvLyBmb250RGF0YS5kYXRhLmxmVW5kZXJsaW5lID0gMQotICAgICAgICAgICAgLy8gc28gaW5zdGVhZCB3ZSB1c2UgcmVmbGVjdGlvbgotICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBmb250RGF0YS5nZXRDbGFzcygpLmdldEZpZWxkKCJkYXRhIikuZ2V0KGZvbnREYXRhKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkYXRhIiArIGRhdGEuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICBkYXRhLmdldENsYXNzKCkuZ2V0RmllbGQoImxmVW5kZXJsaW5lIikuc2V0Qnl0ZShkYXRhLCAoYnl0ZSkxKTsKLSAgICAgICAgICAgIEZvbnQgZm9udCA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCBmb250RGF0YSk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOyAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgfQotCSAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHsKLQotCSAgfQotICAgIC8vRm9udERhdGEgZGF0YSA9IGxhYmVsLmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotICAgIC8vZGF0YS5kYXRhLmxmVW5kZXJsaW5lID0gMTsKLSAgICAKLSAgICAvL1JlY3RhbmdsZUZpZ3VyZSBsaW5lID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOyAgICAKLSAgICAvL2xpbmUuc2V0UHJlZmVycmVkU2l6ZSgyLCAxKTsgICAKLSAgICAvL2xhYmVsSG9sZGVyLmFkZChsaW5lLCAxKTsgICAgCi0gICAgCi0gICAgLy9sYWJlbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXS5zZXRTdHlsZSgpCi0gICAgCi0gICAgcmV0dXJuIHR5cGVHcm91cDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIoZ2V0TW9kZWwoKSk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBpc1JlYWRPbmx5ID0gQm9vbGVhbi5UUlVFLmVxdWFscyhhZGFwdGVyLmdldFByb3BlcnR5KGdldE1vZGVsKCksICJpc1JlYWRPbmx5IikpOwotICAgICAgaXNSZWFkT25seSA9ICFYU0RHcmFwaFV0aWwuaXNFZGl0YWJsZShnZXRNb2RlbCgpKTsKLSAgICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihjb21wdXRlTGFiZWxDb2xvcigpKTsKLSAgICAgIGxhYmVsLnNldFRleHQoKFN0cmluZylhZGFwdGVyLmdldFByb3BlcnR5KGdldE1vZGVsKCksIE1vZGVsQWRhcHRlci5MQUJFTF9QUk9QRVJUWSkpOwotICAgICAgSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpYWRhcHRlci5nZXRQcm9wZXJ0eShnZXRNb2RlbCgpLCBNb2RlbEFkYXB0ZXIuSU1BR0VfUFJPUEVSVFkpOwotICAgICAgaWYgKGltYWdlICE9IG51bGwpIGxhYmVsLnNldEljb24oaW1hZ2UpOwotICAgICAgLy9hcnJvd0xhYmVsLnNldFZpc2libGUoQm9vbGVhbi5UUlVFLmVxdWFscyhhZGFwdGVyLmdldFByb3BlcnR5KGdldE1vZGVsKCksICJkcmlsbERvd24iKSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGFiZWwuc2V0VGV4dCgidW5rbm93biBvYmplY3QiICsgZ2V0TW9kZWwoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAvL2Fycm93TGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgfQotCi0gICAgaWYgKHJlc2VsZWN0KQotICAgIHsKLSAgICAgIGdldFZpZXdlcigpLnNlbGVjdCh0aGlzKTsKLSAgICAgIHNldFJlc2VsZWN0KGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyBYU0ROYW1lZENvbXBvbmVudCBnZXRYU0ROYW1lZENvbXBvbmVudCgpCi0gIHsKLSAgICByZXR1cm4gKFhTRE5hbWVkQ29tcG9uZW50KSBnZXRNb2RlbCgpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAKLSAgICAvL2luc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkpOyAgICAKLSAgICAvL3NlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIC8vaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpOyAgCi0gIAkKLSAgICBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgcG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHBvbGljeSk7Ci0KLSAgICBTZWxlY3Rpb25FZGl0UG9saWN5IGZlZWRCYWNrU2VsZWN0aW9uRWRpdFBvbGljeSA9IG5ldyBTZWxlY3Rpb25FZGl0UG9saWN5KCkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRIb3N0KCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAoKElGZWVkYmFja0hhbmRsZXIpZWRpdFBhcnQpLnJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKWVkaXRQYXJ0KS5hZGRGZWVkYmFjaygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBmZWVkQmFja1NlbGVjdGlvbkVkaXRQb2xpY3kpOwotCi0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBzaW1wbGVEaXJlY3RFZGl0UG9saWN5KTsKLSAgfSAgCi0gIAotICBwdWJsaWMgQ29sb3IgY29tcHV0ZUxhYmVsQ29sb3IoKQotICB7Ci0gICAgQ29sb3IgY29sb3IgPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLSAgICBpZiAoaXNTZWxlY3RlZCkKLSAgICB7Ci0gICAgICBjb2xvciA9IENvbG9yQ29uc3RhbnRzLndoaXRlOwotICAgIH0KLSAgICBlbHNlIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbG9yID0gQ29sb3JDb25zdGFudHMuZ3JheTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbG9yOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBpc1NlbGVjdGVkID0gdHJ1ZTsKLQotICAgIGxhYmVsSG9sZGVyLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbXB1dGVMYWJlbENvbG9yKCkpOwotICAgIGxhYmVsSG9sZGVyLnNldEZpbGwodHJ1ZSk7Ci0gICAgCi0gICAgaWYgKGRvU2Nyb2xsKQotICAgIHsKLSAgICAgIENhdGVnb3J5RWRpdFBhcnQgY2F0ZWdvcnlFUCA9IChDYXRlZ29yeUVkaXRQYXJ0KWdldFBhcmVudCgpOwotICAgICAgY2F0ZWdvcnlFUC5zY3JvbGxUbyh0aGlzKTsKLSAgICAgIHNldFNjcm9sbChmYWxzZSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gZG9TY3JvbGwgPSBmYWxzZTsKLSAgcHVibGljIHZvaWQgc2V0U2Nyb2xsKGJvb2xlYW4gZG9TY3JvbGwpCi0gIHsKLSAgICB0aGlzLmRvU2Nyb2xsID0gZG9TY3JvbGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gICAgbGFiZWxIb2xkZXIuc2V0QmFja2dyb3VuZENvbG9yKG51bGwpOwotICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihjb21wdXRlTGFiZWxDb2xvcigpKTsKLSAgICBsYWJlbEhvbGRlci5zZXRGaWxsKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgCi0gICAgaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUIHx8Ci0gICAgICAgIHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotICAgICAgCi0gICAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHx8Ci0gICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwKLSAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLSAgICAgICAgewotICAgICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgICBpZiAoaGl0VGVzdChsYWJlbEhvbGRlciwgcCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGVyZm9ybURyaWxsRG93bkFjdGlvbigpOwotICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAKLQotICBwdWJsaWMgYm9vbGVhbiBoaXRUZXN0KElGaWd1cmUgdGFyZ2V0LCBQb2ludCBsb2NhdGlvbikKLSAgewotICAgIFJlY3RhbmdsZSBiID0gdGFyZ2V0LmdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICB0YXJnZXQudHJhbnNsYXRlVG9BYnNvbHV0ZShiKTsgIAotICAgIHJldHVybiBiLmNvbnRhaW5zKGxvY2F0aW9uKTsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURyaWxsRG93bkFjdGlvbigpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgLy8oKFhTRENvbXBvbmVudFZpZXdlcilnZXRWaWV3ZXIoKSkuc2V0SW5wdXQoKFhTRENvbmNyZXRlQ29tcG9uZW50KWdldE1vZGVsKCkpOwotICAgICAgICAKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoKEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpZ2V0Vmlld2VyKCkpLmdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0Q29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgcm9vdEVkaXRQYXJ0ID0gKEFic3RyYWN0Q29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICAgIHJvb3RFZGl0UGFydC5zZXRJbnB1dCgoWFNEQ29uY3JldGVDb21wb25lbnQpZ2V0TW9kZWwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBCYXNlRWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFhTRENvbXBvbmVudFZpZXdlcilnZXRWaWV3ZXIoKSkuc2V0SW5wdXQoKFhTRENvbmNyZXRlQ29tcG9uZW50KWdldE1vZGVsKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb0VkaXROYW1lKCkKLSAgewotICAgIHJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgT2JqZWN0IG9iamVjdCA9IGdldE1vZGVsKCk7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgIHsKLSAgICAgIENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBsYWJlbCwgKFhTRE5hbWVkQ29tcG9uZW50KW9iamVjdCk7Ci0gICAgICBzaW1wbGVEaXJlY3RFZGl0UG9saWN5LnNldERlbGVnYXRlKG1hbmFnZXIpOwotICAgICAgbWFuYWdlci5zaG93KCk7Ci0gICAgfQotICB9Ci0KLSAgCi0gIHN0YXRpYyBib29sZWFuIHJlc2VsZWN0ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXNlbGVjdChib29sZWFuIHN0YXRlKQotICB7Ci0gICAgcmVzZWxlY3QgPSBzdGF0ZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvVHlwZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1R5cGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2E4M2UxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvVHlwZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLlNpbXBsZURpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkNvbnRhaW5lckZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIFR5cGVFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSBzaW1wbGVEaXJlY3RFZGl0UG9saWN5ID0gbmV3IFNpbXBsZURpcmVjdEVkaXRQb2xpY3koKTsKLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgQ29udGFpbmVyRmlndXJlIHR5cGVHcm91cCA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLS8vICAgIHR5cGVHcm91cC5zZXRCb3JkZXIobmV3IFNpbXBsZVJhaXNlZEJvcmRlcigxKSk7Ci0vLyAgICB0eXBlR3JvdXAuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKDEpKTsKLS8vICAgIHR5cGVHcm91cC5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKDEsNSkpOwotCi0gICAgTGFiZWwgdHlwZUxhYmVsID0gbmV3IExhYmVsKCJ0eXBlIik7Ci0gICAgdHlwZUxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsMiwyLDEpKTsKLSAgICB0eXBlR3JvdXAuYWRkKHR5cGVMYWJlbCk7Ci0KLSAgICByZXR1cm4gdHlwZUdyb3VwOwotICB9ICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHB1YmxpYyBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlRGVmaW5pdGlvbigpCi0gIHsgICAgICAgICAKLSAgICByZXR1cm4gKFhTRFR5cGVEZWZpbml0aW9uKWdldE1vZGVsKCk7Ci0gIH0KLQotICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7ICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7ICAgICAgICAKLSAgICBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgcG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHBvbGljeSk7ICAgICAgCi0gIH0gCi0gIAotICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1SZXF1ZXN0KHJlcXVlc3QpOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvV2lsZGNhcmRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XaWxkY2FyZEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYTg2YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XaWxkY2FyZEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5YU0RHcmFwaFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkNvbnRhaW5lckZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuR3JhcGhOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5SZXBlYXRhYmxlR3JhcGhOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0gICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgV2lsZGNhcmRFZGl0UGFydCBleHRlbmRzIFJlcGVhdGFibGVHcmFwaE5vZGVFZGl0UGFydAotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBYU0RQYXJ0aWNsZSBnZXRYU0RQYXJ0aWNsZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIE9iamVjdCBvID0gZ2V0WFNEV2lsZGNhcmQoKS5nZXRDb250YWluZXIoKTsKLSAgICByZXR1cm4gKG8gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkgPyAoWFNEUGFydGljbGUpbyA6IG51bGw7Ci0gIH0KLQotCi0gIHB1YmxpYyBYU0RXaWxkY2FyZCBnZXRYU0RXaWxkY2FyZCgpCi0gIHsKLSAgICByZXR1cm4gKFhTRFdpbGRjYXJkKWdldE1vZGVsKCk7Ci0gIH0KLQotICAgCi0gIHByb3RlY3RlZCBHcmFwaE5vZGVGaWd1cmUgY3JlYXRlR3JhcGhOb2RlRmlndXJlKCkKLSAgewotICAgIFJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZpZ3VyZS5zZXRDb25uZWN0ZWQodHJ1ZSk7Ci0gICAgZmlndXJlLmdldE91dGxpbmVkQXJlYSgpLnNldEZpbGwodHJ1ZSk7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbCgpOyAgICAKLSAgICBsYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BTllfRUxFTUVOVCIpKTsgCi0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgNiwgMCwgNCkpOwotICAgIGxhYmVsLnNldEZvbnQobWVkaXVtQm9sZEZvbnQpOyAgICAgICAgCi0KLSAgICBmaWd1cmUuZ2V0SWNvbkFyZWEoKS5hZGQobGFiZWwpOyAgICAgCi0KLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAKLSAKLSAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsgICAgIAotICAgIENvbnRhaW5lckZpZ3VyZSByZWN0YW5nbGUgPSBncmFwaE5vZGVGaWd1cmUuZ2V0T3V0bGluZWRBcmVhKCk7Ci0gICAgaWYgKFhTREdyYXBoVXRpbC5pc0VkaXRhYmxlKGdldE1vZGVsKCkpKQotICAgIHsKLSAgICAgIHJlY3RhbmdsZS5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoMikpOwotICAgICAgcmVjdGFuZ2xlLnNldEJhY2tncm91bmRDb2xvcihlbGVtZW50QmFja2dyb3VuZENvbG9yKTsKLSAgICAgIHJlY3RhbmdsZS5zZXRGb3JlZ3JvdW5kQ29sb3IoaXNTZWxlY3RlZCA/IENvbG9yQ29uc3RhbnRzLmJsYWNrIDogZWxlbWVudEJvcmRlckNvbG9yKTsKLQotICAgICAgbGFiZWwuc2V0QmFja2dyb3VuZENvbG9yKGVsZW1lbnRCYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGVsZW1lbnRMYWJlbENvbG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAgICAgICAgICAKLSAgICAgIHJlY3RhbmdsZS5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIocmVhZE9ubHlCb3JkZXJDb2xvciwgMikpOwotICAgICAgcmVjdGFuZ2xlLnNldEJhY2tncm91bmRDb2xvcihyZWFkT25seUJhY2tncm91bmRDb2xvcik7Ci0gICAgICByZWN0YW5nbGUuc2V0Rm9yZWdyb3VuZENvbG9yKGlzU2VsZWN0ZWQgPyBDb2xvckNvbnN0YW50cy5ibGFjayA6IHJlYWRPbmx5Qm9yZGVyQ29sb3IpOwotICAgCi0gICAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kQ29sb3IocmVhZE9ubHlCYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKHJlYWRPbmx5Qm9yZGVyQ29sb3IpOwotICAgIH0gCi0KLSAgICByZWZyZXNoT2NjdXJlbmNlTGFiZWwoZ2V0WFNEUGFydGljbGUoKSk7Ci0gIH0gICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvWFNERWRpdFBhcnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1hTREVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDZlZDFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvWFNERWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNESW5oZXJpdGFuY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotCi0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkKLXsgICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBYU0RFZGl0UGFydEZhY3RvcnkgaW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgWFNERWRpdFBhcnRGYWN0b3J5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAKLSAgICAgIGluc3RhbmNlID0gbmV3IFhTREVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBwYXJlbnQsIE9iamVjdCBtb2RlbCkKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgQ2F0ZWdvcnkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IENhdGVnb3J5RWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgeyAgICAgICAKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IEVsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0KCk7Ci0gICAgfSAgICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpZiAocGFyZW50LmdldFZpZXdlcigpIGluc3RhbmNlb2YgWFNESW5oZXJpdGFuY2VWaWV3ZXIpCi0gICAgICB7Ci0gICAgICAgIGVkaXRQYXJ0ID0gbmV3IFJvb3RDb21wbGV4VHlwZURlZmluaXRpb25FZGl0UGFydCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcnlFZGl0UGFydCkKLSAgICAgICAgICBlZGl0UGFydCA9IG5ldyBSb290Q29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGVkaXRQYXJ0ID0gbmV3IENvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0KCk7ICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0gICAgICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgeyAgICAgICAKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IE1vZGVsR3JvdXBFZGl0UGFydCgpOwotICAgIH0gICAgICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsgICAgICAgCi0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcnlFZGl0UGFydCkKLSAgICAgICAgZWRpdFBhcnQgPSBuZXcgUm9vdE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZWRpdFBhcnQgPSBuZXcgTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydCgpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlZGl0UGFydCA9IG5ldyBTY2hlbWFFZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlZGl0UGFydCA9IG5ldyBXaWxkY2FyZEVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgZWRpdFBhcnQgPSBuZXcgU2ltcGxlVHlwZURlZmluaXRpb25FZGl0UGFydCgpOwotICAgIH0KLQotICAgIGlmIChlZGl0UGFydCAhPSBudWxsKSAgIAotICAgIHsKLSAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIGVkaXRQYXJ0LnNldFBhcmVudChwYXJlbnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgIAotLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbid0IGNyZWF0ZSBlZGl0UGFydCBmb3IgIiArIG1vZGVsKTsKLS8vICAgICAgVGhyZWFkLmR1bXBTdGFjaygpOwotICAgIH0KLSAgICByZXR1cm4gZWRpdFBhcnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNThmMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgaW1wbGVtZW50cyBEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUKLXsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwJTGFiZWwgbGFiZWwpCi0gIHsKLQkgIHN1cGVyKHNvdXJjZSwgQ29tYm9Cb3hDZWxsRWRpdG9yLmNsYXNzLCBuZXcgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihsYWJlbCkpOwotICAgIHRoaXMubGFiZWwgPSBsYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gbGFiZWwuZ2V0VGV4dCgpOyAgIAotCi0gICAgQ0NvbWJvIGNvbWJvID0gKENDb21ibylnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotICAgCWNvbWJvLnNldEZvbnQobGFiZWwuZ2V0Rm9udCgpKTsKLSAgICBjb21iby5zZXRGb3JlZ3JvdW5kKGxhYmVsLmdldEZvcmVncm91bmRDb2xvcigpKTsKLSAgICBjb21iby5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldEJhY2tncm91bmRDb2xvcigpKTsKLSAgICAvKgotCWNvbWJvLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJLy8gaG9vayBrZXkgcHJlc3NlZCAtIHNlZSBQUiAxNDIwMSAgCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGtleUV2ZW50KSB7Ci0JCQkJaWYgKGtleUV2ZW50LmNoYXJhY3RlciA9PSAneicpIHsgCi0JCQkJCWdldENlbGxFZGl0b3IoKS5hcHBseUVkaXRvclZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLSovCi0gIElDZWxsRWRpdG9yTGlzdGVuZXIgY2VsbEVkaXRvckxpc3RlbmVyID0gbmV3IElDZWxsRWRpdG9yTGlzdGVuZXIoKQotICB7Ci0gICAgcHVibGljIHZvaWQgY2FuY2VsRWRpdG9yKCkKLSAgICB7Ci0vLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FuY2VsRWRpdG9yIik7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGFwcGx5RWRpdG9yVmFsdWUoKQotICAgIHsKLS8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhcHBseUVkaXRvclZhbHVlIik7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGVkaXRvclZhbHVlQ2hhbmdlZChib29sZWFuIG9sZCwgYm9vbGVhbiBuZXdTdGF0ZSkKLSAgICB7Ci0vLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZWRpdG9yVmFsdWVDaGFuZ2VkIik7Ci0gICAgfQotICB9OwotICBnZXRDZWxsRWRpdG9yKCkuYWRkTGlzdGVuZXIoY2VsbEVkaXRvckxpc3RlbmVyKTsKLQotICAgIFN0cmluZ1tdIGl0ZW0gPSBjb21iby5nZXRJdGVtcygpOwotICAgIGludCBpbmRleCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpdGVtW2ldLmVxdWFscyhpbml0aWFsTGFiZWxUZXh0KSkKLSAgICAgIHsKLQkgICAgICBnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUobmV3IEludGVnZXIoaSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IAkKLSAgfQkgCi0gICAgICAgICAKLSAgLy8gaGFjay4uLiBmb3Igc29tZSByZWFzb24gdGhlIENvbWJvQm94Q2VsbEVkaXRvciBkb2VzJ3QgZmlyZSBhbiBlZGl0b3JWYWx1ZUNoYW5nZWQgdG8gc2V0IHRoZSBkaXJ0eSBmbGFnCi0gIC8vIHVubGVzcyB3ZSBvdmVyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0cnVlLCB0aGUgbWFuYWdlciBpcyBub3Qgbm90aWZpZWQgb2YgY2hhbmdlcyBtYWRlIGluIHRoZSBjZWxsIGVkaXRvcgotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RpcnR5KCkKLSAgewotCSAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgeyAKLSAgICBib29sZWFuIGlzTGFiZWxUZXh0SW5MaXN0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCBsaXN0ID0gY29tcHV0ZUNvbWJvQ29udGVudCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyaW5nID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgIGlmIChzdHJpbmcuZXF1YWxzKGxhYmVsLmdldFRleHQoKSkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgaXNMYWJlbFRleHRJbkxpc3QgPSB0cnVlOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAKLSAgICAgICAgIAotICAgIGlmICghaXNMYWJlbFRleHRJbkxpc3QpCi0gICAgewotICAgICAgbGlzdC5hZGQobGFiZWwuZ2V0VGV4dCgpKTsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3Qgc29ydGVkTGlzdCA9IGNvbXB1dGVTb3J0ZWRMaXN0KGxpc3QpOwotICAgIFN0cmluZ1tdIHN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1tzb3J0ZWRMaXN0LnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBzdHJpbmdBcnJheVtpXSA9IChTdHJpbmcpc29ydGVkTGlzdC5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgc3RyaW5nQXJyYXkpOwotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBMaXN0IGNvbXB1dGVTb3J0ZWRMaXN0KExpc3QgbGlzdCkKLSAgewotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3QgY29tcHV0ZUNvbWJvQ29udGVudCgpOyAKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtTW9kaWZ5KFN0cmluZyB2YWx1ZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IKLSAgewotICAgIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLQotICAgIHB1YmxpYyBJbnRlcm5hbENlbGxFZGl0b3JMb2NhdG9yKExhYmVsIGxhYmVsKQotICAgIHsKLSAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICB9ICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSAKLSAgICB7Ci0gICAgICBDQ29tYm8gY29tYm8gPSAoQ0NvbWJvKWNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOyAgCi0JICAgIFBvaW50IHByZWYgPSBjb21iby5jb21wdXRlU2l6ZSgtMSwgLTEpOwotCSAgICBSZWN0YW5nbGUgcmVjdCA9IGxhYmVsLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JICAgIGxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JICAgIGNvbWJvLnNldEJvdW5kcyhyZWN0LngtNCwgcmVjdC55LTEsIHByZWYueCsxLCBwcmVmLnkrMSk7Ci0gICAgfQotICB9IAotICAgCi0gIC8vIGltcGxlbWVudHMgRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlCi0gIC8vIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdChDZWxsRWRpdG9yIGNlbGxFZGl0b3IpCi0gIHsgICAKLSAgICBDQ29tYm8gY29tYm8gPSAoQ0NvbWJvKWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0gICAgaW50IGluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsgICAgICAgICAgICAgIAotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7ICAgICAgCi0gICAgICBTdHJpbmcgdmFsdWUgPSBjb21iby5nZXRJdGVtKGluZGV4KTsKLSAgICAgIHBlcmZvcm1Nb2RpZnkoY29tYm8uZ2V0SXRlbShpbmRleCkpOwotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgdHlwZWRWYWx1ZSA9IGNvbWJvLmdldFRleHQoKTsJCi0gICAgICBpZiAoY29tYm8uaW5kZXhPZih0eXBlZFZhbHVlKSAhPSAtMSkKLSAgICAgIHsJICAgICAgCi0JICAgIHBlcmZvcm1Nb2RpZnkodHlwZWRWYWx1ZSk7Ci0gICAgICB9ICAgICAgCQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCVN0cmluZyBjbG9zZU1hdGNoID0gZ2V0Q2xvc2VNYXRjaCh0eXBlZFZhbHVlLCBjb21iby5nZXRJdGVtcygpKTsKLSAgICAgIAlpZiAoY2xvc2VNYXRjaCAhPSBudWxsKQotICAgICAgCXsKLQkJICBwZXJmb3JtTW9kaWZ5KGNsb3NlTWF0Y2gpOyAgICAgIAkKLSAgICAgIAl9Ci0gICAgICAJZWxzZQotICAgICAgCXsgICAgICAJCi0gICAgICAJICBEaXNwbGF5LmdldEN1cnJlbnQoKS5iZWVwKCk7Ci0gICAgICAJfQotICAgICAgfQotICAgIH0gICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsb3NlTWF0Y2goU3RyaW5nIHZhbHVlLCBTdHJpbmdbXSBpdGVtcykKLSAgewotICAgIGludCBtYXRjaEluZGV4ID0gLTE7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAJU3RyaW5nIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAJU3RyaW5nIGEgPSBnZXRMb2NhbE5hbWUodmFsdWUpOwotICAgIAlTdHJpbmcgYiA9IGdldExvY2FsTmFtZShpdGVtKTsKLQkJICBpZiAoYS5lcXVhbHNJZ25vcmVDYXNlKGIpKQotCQkgIHsgCi0JCQkgIG1hdGNoSW5kZXggPSBpOwotCQkJICBicmVhazsJCQkJCi0JCSAgfQkgICAgCSAgICAgCi0gICAgfSAgCi0gICAgcmV0dXJuIG1hdGNoSW5kZXggIT0gLTEgPyBpdGVtc1ttYXRjaEluZGV4XSA6IG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TG9jYWxOYW1lKFN0cmluZyBzdHJpbmcpCi0gIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoIjoiKTsKLQkgIHJldHVybiAoaW5kZXggIT0gLTEpID8gc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIDEpIDogc3RyaW5nOyAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvQ29tcG9uZW50TmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0NvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2E5MzI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvQ29tcG9uZW50TmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLlRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuR2xvYmFsRWxlbWVudFJlbmFtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuR2xvYmFsR3JvdXBSZW5hbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLkdsb2JhbFNpbXBsZU9yQ29tcGxleFR5cGVSZW5hbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotCi0KLQotcHVibGljIGNsYXNzIENvbXBvbmVudE5hbWVEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIFRleHRDZWxsRWRpdG9yTWFuYWdlcgotewotICBwcm90ZWN0ZWQgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50OwotICBwcm90ZWN0ZWQgc3RhdGljIEdyYXBoaWNhbEVkaXRQYXJ0IG15U291cmNlOwotCi0gIHB1YmxpYyBDb21wb25lbnROYW1lRGlyZWN0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLAlMYWJlbCBsYWJlbCwgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIoc291cmNlLCBsYWJlbCk7ICAKLSAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICBteVNvdXJjZSA9IHNvdXJjZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1Nb2RpZnkoZmluYWwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBEZWxheWVkUmVuYW1lUnVubmFibGUgcnVubmFibGUgPSBuZXcgRGVsYXllZFJlbmFtZVJ1bm5hYmxlKGNvbXBvbmVudCwgdmFsdWUpOwotICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgICB9Ci0gIH0gICAgICAKLQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERlbGF5ZWRSZW5hbWVSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlCi0gIHsKLSAgICBwcm90ZWN0ZWQgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50OwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICAgIHB1YmxpYyBEZWxheWVkUmVuYW1lUnVubmFibGUoWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgbmFtZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgWFNEU3dpdGNoIHhzZFN3aXRjaCA9IG5ldyBYU0RTd2l0Y2goKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEVHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgbmV3IEdsb2JhbFNpbXBsZU9yQ29tcGxleFR5cGVSZW5hbWVyKG9iamVjdCwgbmFtZSkudmlzaXRTY2hlbWEob2JqZWN0LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAKLSAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgaWYgKG9iamVjdC5pc0dsb2JhbCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5ldyBHbG9iYWxFbGVtZW50UmVuYW1lcihvYmplY3QsIG5hbWUpLnZpc2l0U2NoZW1hKG9iamVjdC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgbmV3IEdsb2JhbEdyb3VwUmVuYW1lcihvYmplY3QsIG5hbWUpLnZpc2l0U2NoZW1hKG9iamVjdC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICB4c2RTd2l0Y2guZG9Td2l0Y2goY29tcG9uZW50KTsgCi0gICAgICBjb21wb25lbnQuc2V0TmFtZShuYW1lKTsKLSAgICAgIGlmIChteVNvdXJjZSBpbnN0YW5jZW9mIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgICgoVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydClteVNvdXJjZSkuc2V0UmVzZWxlY3QodHJ1ZSk7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpCi0gIHsKLSAgICBpZiAobXlTb3VyY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAobXlTb3VyY2UgaW5zdGFuY2VvZiBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICAoKFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpbXlTb3VyY2UpLnNldFJlc2VsZWN0KHRydWUpOyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0RpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9EaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjY2U4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0RpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLSAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLQotcHVibGljIGludGVyZmFjZSBEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUKLXsgICAgICAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1FZGl0KENlbGxFZGl0b3IgY2VsbEVkaXRvcik7ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9EcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3YTYwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLk1vdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLklDb25uZWN0aW9uUmVuZGVyaW5nVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkNvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkdyYXBoTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLk1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuTW9kZWxHcm91cEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotCi1wdWJsaWMgY2xhc3MgRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCAvL0Fic3RyYWN0Q29tbWFuZAoteyAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcjsgICAgCi0gIHByb3RlY3RlZCBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3Q7Ci0gIHByb3RlY3RlZCBHcmFwaE5vZGVFZGl0UGFydCBjaGlsZFJlZkVkaXRQYXJ0OyAgICAKLSAgcHVibGljIEdyYXBoTm9kZUVkaXRQYXJ0IHBhcmVudEVkaXRQYXJ0OyAKLSAgcHVibGljIFBvaW50IGxvY2F0aW9uOwotICBwcm90ZWN0ZWQgTW92ZUFjdGlvbiBhY3Rpb247ICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FeGVjdXRlOwotCi0gIHB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0KLSAgICBsb2NhdGlvbiA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsgICAKLSAgICBFZGl0UGFydCB0YXJnZXQgPSB2aWV3ZXIuZmluZE9iamVjdEF0KGxvY2F0aW9uKTsgCi0gICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcikKLSAgICB7ICAKLSAgICAgIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBzZ3YgPSAoU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKXZpZXdlcjsKLSAgICAgIFBvaW50IHAgPSAoKEZpZ3VyZUNhbnZhcylzZ3YuZ2V0Q29udHJvbCgpKS5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgICAgbG9jYXRpb24ueSArPSBwLnk7Ci0gICAgICBsb2NhdGlvbi54ICs9IHAueDsKLSAgICB9Ci0gICAgIAotICAgIExpc3QgbGlzdCA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0gICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIHBhcmVudEVkaXRQYXJ0ID0gZ2V0UGFyZW50RWRpdFBhcnQodGFyZ2V0KTsKLSAgICAgIGlmIChwYXJlbnRFZGl0UGFydCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJlbnRFZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaE5vZGVFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBHcmFwaE5vZGVFZGl0UGFydCBjaGlsZEdyYXBoTm9kZUVkaXRQYXJ0ID0gKEdyYXBoTm9kZUVkaXRQYXJ0KWNoaWxkOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IGNoaWxkR3JhcGhOb2RlRWRpdFBhcnQuZ2V0U2VsZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgIAotICAgICAgICAgICAgaWYgKGxvY2F0aW9uLnkgPCByZWN0YW5nbGUuZ2V0Q2VudGVyKCkueSkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgY2hpbGRSZWZFZGl0UGFydCA9IGNoaWxkR3JhcGhOb2RlRWRpdFBhcnQ7ICAgCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgICAgIAotICAgICAgICBMaXN0IGVkaXRQYXJ0c0xpc3QgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotICAgICAgICBMaXN0IGNvbmNyZXRlQ29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoZWRpdFBhcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlZGl0UGFydHNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZCgoWFNEQ29uY3JldGVDb21wb25lbnQpZWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAgIH0gCi0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHJlZkNvbXBvbmVudCA9IGNoaWxkUmVmRWRpdFBhcnQgIT0gbnVsbCA/IChYU0RDb25jcmV0ZUNvbXBvbmVudCljaGlsZFJlZkVkaXRQYXJ0LmdldE1vZGVsKCkgOiBudWxsOwotCi0gICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlQWN0aW9uKChYU0RDb25jcmV0ZUNvbXBvbmVudClwYXJlbnRFZGl0UGFydC5nZXRNb2RlbCgpLCBjb25jcmV0ZUNvbXBvbmVudExpc3QsIHJlZkNvbXBvbmVudCk7Ci0gICAgICAgIGNhbkV4ZWN1dGUgPSBhY3Rpb24uY2FuTW92ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAgICAgICAgCi0gICAgfSAgICAgCi0gIH0KLSAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIEdyYXBoTm9kZUVkaXRQYXJ0IGdldFBhcmVudEVkaXRQYXJ0KEVkaXRQYXJ0IHRhcmdldCkKLSAgewotICAgIEdyYXBoTm9kZUVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7ICAgIAotICAgIHdoaWxlICh0YXJnZXQgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoR3JhcGhOb2RlRWRpdFBhcnQpdGFyZ2V0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0IHx8Ci0gICAgICAgICAgICAgICB0YXJnZXQgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSB0YXJnZXQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IGNoaWxkID0gaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChHcmFwaE5vZGVFZGl0UGFydCljaGlsZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgIAotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdGFyZ2V0ID0gdGFyZ2V0LmdldFBhcmVudCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsgICAgICAgICAgIAotICAgIGlmIChjYW5FeGVjdXRlKQotICAgIHsgCi0gICAgICBhY3Rpb24ucnVuKCk7IAotICAgIH0KLSAgfSAgICAgCi0gIAotICBwdWJsaWMgdm9pZCByZWRvKCkKLSAgewotCi0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgfSAgICAgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLSAgeyAKLSAgICByZXR1cm4gY2FuRXhlY3V0ZTsKLSAgfSAKLQotICBwdWJsaWMgUG9pbnRMaXN0IGdldENvbm5lY3Rpb25Qb2ludHMoUmVjdGFuZ2xlIGRyYWdnZWRGaWd1cmVCb3VuZHMpCi0gIHsgICAgICAgICAgICAgCi0gICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IG51bGw7ICAgICAgCi0gICAgaWYgKHBhcmVudEVkaXRQYXJ0ICE9IG51bGwgJiYgY2hpbGRSZWZFZGl0UGFydCAhPSBudWxsICYmIHZpZXdlciBpbnN0YW5jZW9mIElDb25uZWN0aW9uUmVuZGVyaW5nVmlld2VyKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcG9pbnRMaXN0ID0gKChJQ29ubmVjdGlvblJlbmRlcmluZ1ZpZXdlcil2aWV3ZXIpLmdldENvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUoKS5nZXRDb25uZWN0aW9uUG9pbnRzKHBhcmVudEVkaXRQYXJ0LCBjaGlsZFJlZkVkaXRQYXJ0LCBkcmFnZ2VkRmlndXJlQm91bmRzKTsgICAgICAKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHBvaW50TGlzdCAhPSBudWxsID8gcG9pbnRMaXN0IDogbmV3IFBvaW50TGlzdCgpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0RyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9EcmFnQW5kRHJvcEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0NjhjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0RyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLQotcHVibGljIGNsYXNzIERyYWdBbmREcm9wRWRpdFBvbGljeSBleHRlbmRzIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuR3JhcGhpY2FsRWRpdFBvbGljeQoteyAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcjsgICAgCi0gIHByb3RlY3RlZCBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci0KLSAgcHVibGljIERyYWdBbmREcm9wRWRpdFBvbGljeShFZGl0UGFydFZpZXdlciB2aWV3ZXIsIFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSkKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgIHRoaXMuc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkKLSAgewotCSAgcmV0dXJuIHRydWU7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAKLSAgc3RhdGljIGludCBjb3VudDIgPSAwOwotICBib29sZWFuIHRoZUNvbW1hbmRSZXN1bHQgPSB0cnVlOyAgIAotICAKLSAgcHVibGljIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAgICAgICAgICAgIAotICAgIC8vIHRoaXMgYmxvY2sgaXMgY29tbWVudGVkIG91dCB0byBkaXNhYmxlIG1vdmUgZm9yIG5vdwotICAgIERyYWdBbmREcm9wQ29tbWFuZCBjb21tYW5kID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDaGFuZ2VCb3VuZHNSZXF1ZXN0KQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgRHJhZ0FuZERyb3BDb21tYW5kKHZpZXdlciwgKENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdCk7ICAKLSAgICAgIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5LnNldERyYWdBbmREcm9wQ29tbWFuZChjb21tYW5kKTsKLSAgICB9IAotICAgIHJldHVybiBjb21tYW5kOyAgICAgICAgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0dyYXBoTm9kZURyYWdUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0dyYXBoTm9kZURyYWdUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZmJhYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9HcmFwaE5vZGVEcmFnVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRHJhZ0VkaXRQYXJ0c1RyYWNrZXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlRHJhZ1RyYWNrZXIgZXh0ZW5kcyBEcmFnRWRpdFBhcnRzVHJhY2tlciAKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBFZGl0UGFydCBlZGl0UGFydDsgCi0gICAgICAgICAgIAotICBwdWJsaWMgR3JhcGhOb2RlRHJhZ1RyYWNrZXIoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICBzdXBlcihlZGl0UGFydCk7Ci0gICAgdGhpcy5lZGl0UGFydCA9IGVkaXRQYXJ0OwotICB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgCi0gIHsgCi0JICBSZXF1ZXN0IHJlcXVlc3QgPSBnZXRUYXJnZXRSZXF1ZXN0KCk7Ci0gICAgcmV0dXJuIGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7IAotICB9Ci19IApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOWI1M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuSUZlZWRiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuQm9ndXNMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLkNvbnRhaW5lckZpZ3VyZTsKLQotCi0KLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsCWV4dGVuZHMgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kKLXsKLSAgcHJvdGVjdGVkIElGaWd1cmUgZmVlZGJhY2s7Ci0gIHByb3RlY3RlZCBSZWN0YW5nbGUgb3JpZ2luYWxMb2NhdGlvbjsKLSAgcHJvdGVjdGVkIERyYWdBbmREcm9wQ29tbWFuZCBkcmFnQW5kRHJvcENvbW1hbmQ7Ci0KLSAgcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpCi0gIHsgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsKLSAgICAgCi0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpCi0gICAgewotICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgZ3JhcGhpY2FsRWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnQ7Ci0gICAgICBJRmlndXJlIGZpZ3VyZSA9IChncmFwaGljYWxFZGl0UGFydCBpbnN0YW5jZW9mIEJhc2VFZGl0UGFydCkgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChCYXNlRWRpdFBhcnQpZ3JhcGhpY2FsRWRpdFBhcnQpLmdldFNlbGVjdGlvbkZpZ3VyZSgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY2FsRWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0gICAKLSAgICAgIEN1cnNvciBjdXJzb3JGaWd1cmUgPSBmaWd1cmUuZ2V0Q3Vyc29yKCk7Ci0gICAgICBNb3ZlSGFuZGxlTG9jYXRvciBsb2MgPSBuZXcgTW92ZUhhbmRsZUxvY2F0b3IoZmlndXJlKTsgICAgCi0gICAgICBNb3ZlSGFuZGxlIG1vdmVIYW5kbGUgPSBuZXcgTW92ZUhhbmRsZShncmFwaGljYWxFZGl0UGFydCwgbG9jKTsgICAgIAotICAgICAgbW92ZUhhbmRsZS5zZXRDdXJzb3IoY3Vyc29yRmlndXJlKTsKLSAgICAgIGxpc3QuYWRkKG1vdmVIYW5kbGUpOwotICAgIH0KLQotICAgIHJldHVybiBsaXN0OwotICB9ICAgCi0gIAotCi0gIHB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCSAgaWYgKFJFUV9NT1ZFLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpCi0gICAgeyAgCi0JCSAgcmVzdWx0ID0gZmFsc2U7IC8vIHJldHVybiBmYWxzZSB0byBkaXNhYmxlIG1vdmUgZm9yIG5vdyAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkgICAgcmVzdWx0ID0gc3VwZXIudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcXVlc3QpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotCi0gIHB1YmxpYyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbnVsbDsgIAotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgc2V0RHJhZ0FuZERyb3BDb21tYW5kKERyYWdBbmREcm9wQ29tbWFuZCBkcmFnQW5kRHJvcENvbW1hbmQpCi0gIHsKLSAgICB0aGlzLmRyYWdBbmREcm9wQ29tbWFuZCA9IGRyYWdBbmREcm9wQ29tbWFuZDsKLSAgfQotCi0gIHByb3RlY3RlZCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBnZXRNb3ZlQ29tbWFuZChDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIAotICB7Ci0JICBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcSA9IG5ldyBDaGFuZ2VCb3VuZHNSZXF1ZXN0KFJFUV9NT1ZFX0NISUxEUkVOKTsKLQkgIHJlcS5zZXRFZGl0UGFydHMoZ2V0SG9zdCgpKTsKLQkKLQkgIHJlcS5zZXRNb3ZlRGVsdGEocmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JICByZXEuc2V0U2l6ZURlbHRhKHJlcXVlc3QuZ2V0U2l6ZURlbHRhKCkpOwotCSAgcmVxLnNldExvY2F0aW9uKHJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0KLQkgIHJldHVybiBnZXRIb3N0KCkuZ2V0UGFyZW50KCkuZ2V0Q29tbWFuZChyZXEpOwotICB9IAotCi0gIHB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgIAkKLQkgIGlmIChSRVFfTU9WRS5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpIHx8Ci0JCSAgUkVRX0FERC5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKQotCQkgIHNob3dDaGFuZ2VCb3VuZHNGZWVkYmFjaygoQ2hhbmdlQm91bmRzUmVxdWVzdClyZXF1ZXN0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNob3dDaGFuZ2VCb3VuZHNGZWVkYmFjayhDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgCUlGaWd1cmUgcCA9IGdldERyYWdTb3VyY2VGZWVkYmFja0ZpZ3VyZSgpOwotICAJUmVjdGFuZ2xlIHIgPSBvcmlnaW5hbExvY2F0aW9uLmdldFRyYW5zbGF0ZWQocmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0gIAlEaW1lbnNpb24gcmVzaXplID0gcmVxdWVzdC5nZXRTaXplRGVsdGEoKTsKLSAgCXIud2lkdGggKz0gcmVzaXplLndpZHRoOwotICAJci5oZWlnaHQrPSByZXNpemUuaGVpZ2h0OwotICAKLSAgCSgoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotICAJcC50cmFuc2xhdGVUb1JlbGF0aXZlKHIpOwotICAgICAgICAgICAgICAgIAotICAgIFJlY3RhbmdsZSBwQm91bmRzID0gci5nZXRDb3B5KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgaWYgKGRyYWdBbmREcm9wQ29tbWFuZCAhPSBudWxsICYmIGRyYWdBbmREcm9wQ29tbWFuZC5jYW5FeGVjdXRlKCkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaW50IHNpemUgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLnNpemUoKTsKLSAgICAgIGlmIChzaXplID4gMCAmJiByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLmdldChzaXplIC0gMSkgPT0gZ2V0SG9zdCgpKQotICAgICAgeyAgICAgICAgIAotICAgICAgICBQb2ludExpc3QgcG9pbnRMaXN0ID0gZHJhZ0FuZERyb3BDb21tYW5kLmdldENvbm5lY3Rpb25Qb2ludHMocik7Ci0gICAgICAgIGlmIChwb2ludExpc3QgIT0gbnVsbCAmJiBwb2ludExpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHBvbHlMaW5lLnNldFBvaW50cyhwb2ludExpc3QpOwotICAgICAgICAgIAotICAgICAgICAgIFBvaW50IGZpcnN0UG9pbnQgPSBwb2ludExpc3QuZ2V0Rmlyc3RQb2ludCgpOwotICAgICAgICAgIGlmIChmaXJzdFBvaW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcEJvdW5kcyA9IHBCb3VuZHMuZ2V0VW5pb24obmV3IFJlY3RhbmdsZShmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSwgMSwgMSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBwLnNldEJvdW5kcyhwQm91bmRzKTsKLSAgICBnaG9zdFNoYXBlLnNldEJvdW5kcyhyKTsKLSAgCXAudmFsaWRhdGUoKTsKLSAgfSAgICAgICAgCi0KLQotCi0KLSAgcHJvdGVjdGVkIElGaWd1cmUgZ2V0RHJhZ1NvdXJjZUZlZWRiYWNrRmlndXJlKCkgCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsgCi0gICAgaWYgKGZlZWRiYWNrID09IG51bGwgJiYgZWRpdFBhcnQgaW5zdGFuY2VvZiBCYXNlRWRpdFBhcnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgQmFzZUVkaXRQYXJ0IGJhc2VFZGl0UGFydCA9IChCYXNlRWRpdFBhcnQpZWRpdFBhcnQ7Ci0JCSAgb3JpZ2luYWxMb2NhdGlvbiA9IG5ldyBSZWN0YW5nbGUoYmFzZUVkaXRQYXJ0LmdldFNlbGVjdGlvbkZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLQkJICBmZWVkYmFjayA9IGNyZWF0ZURyYWdTb3VyY2VGZWVkYmFja0ZpZ3VyZShiYXNlRWRpdFBhcnQuZ2V0U2VsZWN0aW9uRmlndXJlKCkpOwotCSAgfQotCSAgcmV0dXJuIGZlZWRiYWNrOwotICB9ICAKLSAgICAKLSAgUG9seWxpbmUgcG9seUxpbmU7Ci0gIFJlY3RhbmdsZUZpZ3VyZSBnaG9zdFNoYXBlOwotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZURyYWdTb3VyY2VGZWVkYmFja0ZpZ3VyZShJRmlndXJlIGRyYWdnZWRGaWd1cmUpCi0gIHsKLQkJLy8gVXNlIGEgZ2hvc3QgcmVjdGFuZ2xlIGZvciBmZWVkYmFjayAgCi0gICAgQ29udGFpbmVyRmlndXJlIHBhbmVsID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOyAKLSAgICBwYW5lbC5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBCb2d1c0xheW91dCgpKTsvL25ldyBGcmVlZm9ybUxheW91dCgpKTsKLQotCQlnaG9zdFNoYXBlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQlGaWd1cmVVdGlsaXRpZXMubWFrZUdob3N0U2hhcGUoZ2hvc3RTaGFwZSk7Ci0JCWdob3N0U2hhcGUuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfREFTSERPVCk7Ci0JCWdob3N0U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICAKLSAgICBSZWN0YW5nbGUgciA9IGRyYWdnZWRGaWd1cmUuZ2V0Qm91bmRzKCk7Ci0gICAgcGFuZWwuc2V0T3BhcXVlKGZhbHNlKTsKLSAgICBwYW5lbC5hZGQoZ2hvc3RTaGFwZSk7ICAgICAgICAgICAgICAgICAKLQotICAgIHBvbHlMaW5lID0gbmV3IFBvbHlsaW5lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vcG9seUxpbmUuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfREFTSERPVCk7ICAgICAgCi0gICAgcG9seUxpbmUuc2V0TGluZVdpZHRoKDMpOwotICAgIHBhbmVsLmFkZChwb2x5TGluZSk7Ci0KLSAgICBwYW5lbC5zZXRCb3VuZHMocik7Ci0JCWdob3N0U2hhcGUuc2V0Qm91bmRzKHIpOwotCi0JCWFkZEZlZWRiYWNrKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfSAKLQotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotCSAgaWYgKGZlZWRiYWNrICE9IG51bGwpCi0gICAgewotCQkgIHJlbW92ZUZlZWRiYWNrKGZlZWRiYWNrKTsKLQkJICBmZWVkYmFjayA9IG51bGw7Ci0JICB9Ci0JICBoaWRlRm9jdXMoKTsKLQkgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBFcmFzZSBmZWVkYmFjayBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlY2VpdmVyIG9iamVjdCBpcyAKLSAgICogYmVpbmcgZHJhZ2dlZC4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgZHJhZyBpcwotICAgKiBjb21wbGV0ZWQgb3IgY2FuY2VsbGVkIG9uIHRoZSByZWNlaXZlciBvYmplY3QuCi0gICAqIEBwYXJhbSBkcmFnVHJhY2tlciBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRHJhZ1RyYWNrZXIgVGhlIGRyYWcgdHJhY2tlciBvZiB0aGUgdG9vbCBwZXJmb3JtaW5nIHRoZSBkcmFnLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZXJhc2VDaGFuZ2VCb3VuZHNGZWVkYmFjayhDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIAotICB7Ci0JICBpZiAoZmVlZGJhY2sgIT0gbnVsbCkgCi0gICAgewkJICAgICAgCi0JCSAgcmVtb3ZlRmVlZGJhY2soZmVlZGJhY2spOwotCSAgfQotCSAgZmVlZGJhY2sgPSBudWxsOwotCSAgb3JpZ2luYWxMb2NhdGlvbiA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogRXJhc2UgZmVlZGJhY2sgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNlaXZlciBvYmplY3QgaXMgCi0gICAqIGJlaW5nIGRyYWdnZWQuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGRyYWcgaXMKLSAgICogY29tcGxldGVkIG9yIGNhbmNlbGxlZCBvbiB0aGUgcmVjZWl2ZXIgb2JqZWN0LgotICAgKiBAcGFyYW0gZHJhZ1RyYWNrZXIgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRyYWdUcmFja2VyIFRoZSBkcmFnIHRyYWNrZXIgb2YgdGhlIHRvb2wgcGVyZm9ybWluZyB0aGUgZHJhZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVyYXNlU291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSAKLSAgewotICAgIGlmIChSRVFfTU9WRS5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpIHx8ICBSRVFfQURELmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpCi0gICAgewotCQkgIGVyYXNlQ2hhbmdlQm91bmRzRmVlZGJhY2soKENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOwotICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpCi0gICAgewotICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKWVkaXRQYXJ0KS5yZW1vdmVGZWVkYmFjaygpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRIb3N0KCk7Ci0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikKLSAgICB7Ci0gICAgICAoKElGZWVkYmFja0hhbmRsZXIpZWRpdFBhcnQpLmFkZEZlZWRiYWNrKCk7Ci0gICAgfQotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1NpbXBsZURpcmVjdEVkaXRQb2xpY3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvU2ltcGxlRGlyZWN0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFlZWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvU2ltcGxlRGlyZWN0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIFNpbXBsZURpcmVjdEVkaXRQb2xpY3kgZXh0ZW5kcyBEaXJlY3RFZGl0UG9saWN5IAotewotICBwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlIGRlbGVnYXRlOwotCi0gIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlKERpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZSBkZWxlZ2F0ZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoZmluYWwgRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsgCi0gIAlyZXR1cm4gbmV3IENvbW1hbmQoKSAvL0Fic3RyYWN0Q29tbWFuZCgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGRlbGVnYXRlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBkZWxlZ2F0ZS5wZXJmb3JtRWRpdChyZXF1ZXN0LmdldENlbGxFZGl0b3IoKSk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgCi0gIAotICAgICAgcHVibGljIHZvaWQgcmVkbygpCi0gICAgICB7Ci0gICAgICB9ICAKLSAgCi0gICAgICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgICAgIHsKLSAgICAgIH0gICAgIAotICAKLSAgICAgIHB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSAKLSAgeyAgICAgIAotICAJLy9oYWNrIHRvIHByZXZlbnQgYXN5bmMgbGF5b3V0IGZyb20gcGxhY2luZyB0aGUgY2VsbCBlZGl0b3IgdHdpY2UuCi0gIAlnZXRIb3N0RmlndXJlKCkuZ2V0VXBkYXRlTWFuYWdlcigpLnBlcmZvcm1VcGRhdGUoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvVGV4dENlbGxFZGl0b3JNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1RleHRDZWxsRWRpdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDA5OTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvVGV4dENlbGxFZGl0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRleHRDZWxsRWRpdG9yTWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIGltcGxlbWVudHMgRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlCi17Ci0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgVGV4dENlbGxFZGl0b3JNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwJTGFiZWwgbGFiZWwpCi0gIHsKLQkgIHN1cGVyKHNvdXJjZSwgVGV4dENlbGxFZGl0b3IuY2xhc3MsIG5ldyBJbnRlcm5hbENlbGxFZGl0b3JMb2NhdG9yKGxhYmVsKSk7Ci0gICAgdGhpcy5sYWJlbCA9IGxhYmVsOyAgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGxhYmVsLmdldFRleHQoKTsKLSAgCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLSAgCVRleHQgdGV4dCA9IChUZXh0KWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0gIAl0ZXh0LnNldEZvbnQobGFiZWwuZ2V0Rm9udCgpKTsKLSAgICB0ZXh0LnNldEZvcmVncm91bmQobGFiZWwuZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotICAgIHRleHQuc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gIAl0ZXh0LnNlbGVjdEFsbCgpOwotICB9CSAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtTW9kaWZ5KFN0cmluZyB2YWx1ZSk7Ci0gICAgCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgICBwdWJsaWMgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihMYWJlbCBsYWJlbCkKLSAgICB7Ci0gICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgCi0gICAgewotICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpY2VsbGVkaXRvci5nZXRDb250cm9sKCk7ICAKLQkgICAgUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkgICAgUG9pbnQgcHJlZiA9IHRleHQuY29tcHV0ZVNpemUoLTEsIC0xKTsKLQkgICAgUmVjdGFuZ2xlIHJlY3QgPSBsYWJlbC5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCSAgICBsYWJlbC50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCSAgICB0ZXh0LnNldEJvdW5kcyhyZWN0LngtNCwgcmVjdC55LTEsIHByZWYueCsxLCBwcmVmLnkrMSk7CQotCSAgICB0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQkgICAgdGV4dC5zZXRTZWxlY3Rpb24oc2VsKTsgCi0gICAgfQotICB9ICAgIAotCi0gIC8vIGltcGxlbWVudHMgRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlCi0gIC8vIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdChDZWxsRWRpdG9yIGNlbGxFZGl0b3IpCi0gIHsKLSAgICBwZXJmb3JtTW9kaWZ5KChTdHJpbmcpY2VsbEVkaXRvci5nZXRWYWx1ZSgpKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1R5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjJkMWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi0KLXB1YmxpYyBjbGFzcyBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBCYXNlRWRpdFBhcnQgZWRpdFBhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWQ7Ci0KLSAgCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoQmFzZUVkaXRQYXJ0IHNvdXJjZSwJWFNERWxlbWVudERlY2xhcmF0aW9uIGVkLCBMYWJlbCBsYWJlbCkKLSAgewotICAgIHN1cGVyKHNvdXJjZSwgbGFiZWwpOyAgCi0gICAgZWRpdFBhcnQgPSBzb3VyY2U7ICAgICAgICAgICAgICAgCi0gICAgdGhpcy5lZCA9IGVkOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZUNvbWJvQ29udGVudCgpCi0gIHsgICAgICAgICAgICAgCi0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IGVkLmdldFNjaGVtYSgpOwotICAgIExpc3QgdHlwZU5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgCi0gICAgICBUeXBlc0hlbHBlciB0eXBlc0hlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihzY2hlbWEpOwotICAgICAgdHlwZU5hbWVMaXN0LmFkZEFsbCh0eXBlc0hlbHBlci5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgIHR5cGVOYW1lTGlzdC5hZGRBbGwodHlwZXNIZWxwZXIuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCkpOyAgICAgICAgICAgICAgIAotICAgICAgdHlwZU5hbWVMaXN0LmFkZEFsbCh0eXBlc0hlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHR5cGVOYW1lTGlzdDsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtTW9kaWZ5KFN0cmluZyB2YWx1ZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gd2UgbmVlZCB0byBwZXJmb3JtIGFuIGFzeW5jRXhlYyBoZXJlIHNpbmNlIHRoZSAnaG9zdCcgZWRpdHBhcnQgbWF5IGJlIHJlbW92ZWQKLSAgICAvLyBhcyBhIHNpZGUgZWZmZWN0IG9mIHBlcmZvcm1pbmcgdGhlIGFjdGlvbgotICAgIERlbGF5ZWRSZW5hbWVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBEZWxheWVkUmVuYW1lUnVubmFibGUoZWRpdFBhcnQsIGVkLCB2YWx1ZSk7Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsgICAKLSAgfSAgCi0gICAKLQotICBwcm90ZWN0ZWQgTGlzdCBjb21wdXRlU29ydGVkTGlzdChMaXN0IGxpc3QpCi0gIHsKLSAgICByZXR1cm4gVHlwZXNIZWxwZXIuc29ydExpc3QobGlzdCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERlbGF5ZWRSZW5hbWVSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlCi0gIHsKLSAgICBwcm90ZWN0ZWQgQmFzZUVkaXRQYXJ0IGVkaXRQYXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBFZGl0UGFydCBlZGl0UGFydFBhcmVudDsKLSAgICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICAgIHB1YmxpYyBEZWxheWVkUmVuYW1lUnVubmFibGUoQmFzZUVkaXRQYXJ0IGVkaXRQYXJ0LCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWQsIFN0cmluZyBuYW1lKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMuZWRpdFBhcnQgPSBlZGl0UGFydDsKLSAgICAgIGVkaXRQYXJ0UGFyZW50ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0gICAgICB0aGlzLmVkID0gZWQ7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vQmFzZUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBlZGl0UGFydC5nZXRCYXNlR3JhcGhpY2FsVmlld2VyKCk7Ci0gICAgICAvL3ZpZXdlci5zZXRJbnB1dEVuYWJsZWQoZmFsc2UpOwotICAgICAgLy92aWV3ZXIuc2V0U2VsZWN0aW9uRW5hYmxlZChmYWxzZSk7ICAgICAgCi0gICAgICBpZiAobmFtZS5lcXVhbHMoIjxhbm9ueW1vdXM+IikpCi0gICAgICB7ICAgICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGVkLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0RWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChlZC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkgLy8gaXNTZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCEobmFtZS5lcXVhbHMoIjxhbm9ueW1vdXM+IikpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVkLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZSgidHlwZSIsIG5hbWUpOwotICAgICAgICAgICAgWFNERE9NSGVscGVyLnVwZGF0ZUVsZW1lbnRUb05vdEFub255bW91cyhlZC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldEVsZW1lbnQoKSk7Ci0vLyAgICAgICAgICAgIGVkLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24obnVsbCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVkLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZSgidHlwZSIsIG5hbWUpOwotICAgICAgfQotICAgICAgLy92aWV3ZXIuc2V0SW5wdXRFbmFibGVkKHRydWUpOwotICAgICAgLy92aWV3ZXIuc2V0U2VsZWN0aW9uRW5hYmxlZCh0cnVlKTsKLSAgICAgIC8vdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0UGFydFBhcmVudCkpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9Cb2d1c0xheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQm9ndXNMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhOGM3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9Cb2d1c0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLQotCi0vKioKLSAqIEZpZ3VyZXMgdXNpbmcgdGhlIFN0YWNrTGF5b3V0IGFzIHRoZWlyIGxheW91dCBtYW5hZ2VyIGhhdmUKLSAqIHRoZWlyIGNoaWxkcmVuIHBsYWNlZCBvbiB0b3Agb2Ygb25lIGFub3RoZXIuIE9yZGVyIG9mIAotICogcGxhY2VtZW50IGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjaGlsZHJlbgotICogd2VyZSBhZGRlZCwgZmlyc3QgY2hpbGQgYWRkZWQgcGxhY2VkIG9uIHRoZSBib3R0b20uCi0gKi8KLXB1YmxpYyBjbGFzcyBCb2d1c0xheW91dAotCWV4dGVuZHMgQWJzdHJhY3RMYXlvdXQKLXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wcm90ZWN0ZWQgaW50IHNwYWNpbmc7Ci0KLXB1YmxpYyBCb2d1c0xheW91dCgpe30KLQotcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgZmlndXJlLCBpbnQgdywgaW50IGgpCi17CSAgICAgICAgICAgICAgICAgCi0gIERpbWVuc2lvbiBkID0gbmV3IERpbWVuc2lvbigpOwotICByZXR1cm4gZDsKLX0gCi0KLS8qCi0gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHNpemUgcmVxdWlyZWQgYnkgdGhlIGlucHV0IGNvbnRhaW5lci4KLSAqIFRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQgb2YgdGhlIGNvbnRhaW5lciwgYXMgYWxsCi0gKiBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzIHNpemUuCi0gKi8KLS8qanZoIC0gZmluYWwKLXB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoSUZpZ3VyZSBmaWd1cmUpewotCXJldHVybiBuZXcgRGltZW5zaW9uKCk7Ci19Ci0KLXB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShJRmlndXJlIGZpZ3VyZSl7Ci0JcmV0dXJuIG5ldyBEaW1lbnNpb24oKTsKLX0gICAgICAgICAgICAqLwotCi0vKgotICogTGF5cyBvdXQgdGhlIGNoaWxkcmVuIG9uIHRvcCBvZiBlYWNoIG90aGVyIHdpdGgKLSAqIHRoZWlyIHNpemVzIGVxdWFsIHRvIHRoYXQgb2YgdGhlIGF2YWlsYWJsZQotICogcGFpbnRhYmxlIGFyZWEgb2YgdGhlIGlucHV0IGNvbnRhaW5lciBmaWd1cmUuCi0gKi8KLXB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGZpZ3VyZSl7ICAgCi0gCi19IAotIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0NlbnRlckxheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQ2VudGVyTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzJlNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQ2VudGVyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0KLS8qKgotICogRmlndXJlcyB1c2luZyB0aGUgU3RhY2tMYXlvdXQgYXMgdGhlaXIgbGF5b3V0IG1hbmFnZXIgaGF2ZQotICogdGhlaXIgY2hpbGRyZW4gcGxhY2VkIG9uIHRvcCBvZiBvbmUgYW5vdGhlci4gT3JkZXIgb2YgCi0gKiBwbGFjZW1lbnQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNoaWxkcmVuCi0gKiB3ZXJlIGFkZGVkLCBmaXJzdCBjaGlsZCBhZGRlZCBwbGFjZWQgb24gdGhlIGJvdHRvbS4KLSAqLwotcHVibGljIGNsYXNzIENlbnRlckxheW91dAotCWV4dGVuZHMgQWJzdHJhY3RMYXlvdXQKLXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wcm90ZWN0ZWQgaW50IHNwYWNpbmc7Ci0KLXB1YmxpYyBDZW50ZXJMYXlvdXQoKXt9Ci1wdWJsaWMgQ2VudGVyTGF5b3V0KGludCBzcGFjaW5nKXsgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsgfQotCi0vKioKLSAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBpbnB1dCBjb250YWluZXIuCi0gKiBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbAotICogb3RoZXIgY2hpbGRyZW4gZml0IGludG8gdGhpcyBzaXplLgotICoKLSAqIEBwYXJhbSBmaWd1cmUgIENvbnRhaW5lciBmaWd1cmUgZm9yIHdoaWNoIHByZWZlcnJlZCBzaXplIGlzIHJlcXVpcmVkLgotICogQHJldHVybiAgVGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBpbnB1dCBmaWd1cmUuCi0gKiBAc2luY2UgMi4wCi0gKi8KLXByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIGZpZ3VyZSwgaW50IHcsIGludCBoKXsKLQlEaW1lbnNpb24gZCA9IGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKGZpZ3VyZSk7Ci0JLypkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwKLQkgICAgICAgICBmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0SGVpZ2h0KCkpOyAqLwotICAgICAgICBkLmV4cGFuZCh3LAotCSAgICAgICAgIGgpOwotCWQudW5pb24oZ2V0Qm9yZGVyUHJlZmVycmVkU2l6ZShmaWd1cmUpKTsKLQlyZXR1cm4gZDsKLX0KLQotcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRDbGllbnRBcmVhU2l6ZShJRmlndXJlIGZpZ3VyZSl7Ci0JRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKCk7Ci0JTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gIHsKLQkJSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWkubmV4dCgpOwotICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0gICAgZC5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICBkLndpZHRoID0gTWF0aC5tYXgoY2hpbGRTaXplLndpZHRoLCBkLndpZHRoKTsKLQl9CSAgICAgICAgICAgICAgICAgICAgCi0gIGludCBjaGlsZHJlblNpemUgPSBjaGlsZHJlbi5zaXplKCk7ICAgICAgIAotICBpZiAoY2hpbGRyZW5TaXplID4gMCkKLSAgewotICAgIGQuaGVpZ2h0ICs9IHNwYWNpbmcgKiBjaGlsZHJlbi5zaXplKCkgLSAxOwotICB9Ci0JcmV0dXJuIGQ7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHNpemUgcmVxdWlyZWQgYnkgdGhlIGlucHV0IGNvbnRhaW5lci4KLSAqIFRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQgb2YgdGhlIGNvbnRhaW5lciwgYXMgYWxsCi0gKiBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzIHNpemUuCi0gKi8KLXB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3SGludCwgaW50IGhIaW50KXsKLQlEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oKTsKLQlMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0JSUZpZ3VyZSBjaGlsZDsKLQlmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKyl7Ci0JCWNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotCQlkLnVuaW9uKGNoaWxkLmdldE1pbmltdW1TaXplKCkpOwotCX0KLQlkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwKLQkgICAgICAgICBmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0SGVpZ2h0KCkpOwotCXJldHVybiBkOwotfQotCi1wdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3SGludCwgaW50IGhIaW50KXsKLQlyZXR1cm4gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShmaWd1cmUsIHdIaW50LCBoSGludCk7Ci19Ci0KLQotLyoKLSAqIExheXMgb3V0IHRoZSBjaGlsZHJlbiBvbiB0b3Agb2YgZWFjaCBvdGhlciB3aXRoCi0gKiB0aGVpciBzaXplcyBlcXVhbCB0byB0aGF0IG9mIHRoZSBhdmFpbGFibGUKLSAqIHBhaW50YWJsZSBhcmVhIG9mIHRoZSBpbnB1dCBjb250YWluZXIgZmlndXJlLgotICovCi1wdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBmaWd1cmUpewotCVJlY3RhbmdsZSByID0gZmlndXJlLmdldENsaWVudEFyZWEoKTsKLQlMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gIAotICBEaW1lbnNpb24gcHJlZmVycmVkQ2xpZW50QXJlYVNpemUgPSBjYWxjdWxhdGVQcmVmZXJyZWRDbGllbnRBcmVhU2l6ZShmaWd1cmUpOwotICBpbnQgeCA9IHIueCArIChyLndpZHRoIC0gcHJlZmVycmVkQ2xpZW50QXJlYVNpemUud2lkdGgpIC8gMjsKLSAgaW50IHkgPSByLnkgKyAoci5oZWlnaHQgLSBwcmVmZXJyZWRDbGllbnRBcmVhU2l6ZS5oZWlnaHQpIC8gMjsKLQotCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gIHsKLQkJSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWkubmV4dCgpOwotICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JCWNoaWxkLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKHgsIHksIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCkpOwotICAgIHkgKz0gY2hpbGRTaXplLmhlaWdodCArIHNwYWNpbmc7Ci0JfQotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0NlbnRlcmVkSWNvbkZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQ2VudGVyZWRJY29uRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MjZiYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQ2VudGVyZWRJY29uRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLSAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIENlbnRlcmVkSWNvbkZpZ3VyZSBleHRlbmRzIENvbnRhaW5lckZpZ3VyZQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgSW1hZ2UgaW1hZ2U7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIENlbnRlcmVkSWNvbkZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldEZpbGwodHJ1ZSk7ICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZykKLSAgeyAgICAKLSAgICBzdXBlci5maWxsU2hhcGUoZyk7ICAgIAotICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRGltZW5zaW9uIGltYWdlU2l6ZSA9IG5ldyBEaW1lbnNpb24oMTYsIDE2KTsKLSAgICAgIGcuZHJhd0ltYWdlKGltYWdlLCByLnggKyAoci53aWR0aCAtIGltYWdlU2l6ZS53aWR0aCkvMiwgci55ICsgKHIuaGVpZ2h0IC0gaW1hZ2VTaXplLmhlaWdodCkvMik7Ci0gICAgfQotICB9ICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQ29ubmVjdGlvbkZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQ29ubmVjdGlvbkZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWEwNWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0Nvbm5lY3Rpb25GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLSAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5HcmFwaE5vZGVFZGl0UGFydDsKLQotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIENvbm5lY3Rpb25GaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUKLXsgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPdXRsaW5lZCA9IHRydWU7Ci0gIHByb3RlY3RlZCBJRmlndXJlIHhzZEZpZ3VyZTsKLQotICBwdWJsaWMgQ29ubmVjdGlvbkZpZ3VyZShJRmlndXJlIHhzZEZpZ3VyZSkKLSAgewotICAgIHNldE9wYXF1ZShmYWxzZSk7ICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMueHNkRmlndXJlID0geHNkRmlndXJlOwotICAgIC8vc2V0Rm9jdXNUcmF2ZXJzYWJsZShmYWxzZSk7IAotICAgIC8vc2V0RW5hYmxlZChmYWxzZSk7IAotICB9Ci0gICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01vdXNlRXZlbnRUYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAgICAgICAKLQotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1BvaW50KGludCB4LCBpbnQgeSl7cmV0dXJuIGZhbHNlO30KLQotICBwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsgCi0gICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBkcmF3TGluZXMoZ3JhcGhpY3MsIHhzZEZpZ3VyZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkcmF3TGluZXMoR3JhcGhpY3MgZ3JhcGhpY3MsIElGaWd1cmUgZmlndXJlKQotICB7Ci0gICAgaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIEdyYXBoTm9kZUZpZ3VyZSkKLSAgICB7Ci0gICAgICBHcmFwaE5vZGVGaWd1cmUgZ3JhcGhOb2RlRmlndXJlID0gKEdyYXBoTm9kZUZpZ3VyZSlmaWd1cmU7ICAgICAgICAgCi0gICAgICBpZiAoZ3JhcGhOb2RlRmlndXJlLmlzQ29ubmVjdGVkKCkgJiYgZ3JhcGhOb2RlRmlndXJlLmlzRXhwYW5kZWQoKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBjaGlsZExpc3QgPSBncmFwaE5vZGVGaWd1cmUuZ2V0Q2hpbGRHcmFwaE5vZGVGaWd1cmVzKCk7Ci0gICAgICAgIGlmIChjaGlsZExpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgUmVjdGFuZ2xlIHIgPSBncmFwaE5vZGVGaWd1cmUuZ2V0Q29ubmVjdGlvblJlY3RhbmdsZSgpOyAgICAKLSAgICAgICAgICAKLSAgICAgICAgICBpbnQgeDEgPSByLnggKyByLndpZHRoOwotICAgICAgICAgIGludCB5MSA9IHIueSArIHIuaGVpZ2h0LzI7Ci0gICAgICAgICAgCi0gICAgICAgICAgaW50IHN0YXJ0T2ZDaGlsZEJveCA9ICgoR3JhcGhOb2RlRmlndXJlKWNoaWxkTGlzdC5nZXQoMCkpLmdldENvbm5lY3Rpb25SZWN0YW5nbGUoKS54OwotCi0gICAgICAgICAgaW50IHgyID0geDEgKyAoc3RhcnRPZkNoaWxkQm94IC0geDEpIC8gMzsKLSAgICAgICAgICBpbnQgeTIgPSB5MTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgaWYgKGNoaWxkTGlzdC5zaXplKCkgPiAxKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHgxLCB5MSwgeDIsIHkyKTsKLSAgICAgICAgICAKLSAgICAgICAgICAgIGludCBtaW5ZID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgICAgICBpbnQgbWF4WSA9IC0xOwotICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEdyYXBoTm9kZUZpZ3VyZSBjaGlsZEdyYXBoTm9kZUZpZ3VyZSA9IChHcmFwaE5vZGVGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgIFJlY3RhbmdsZSBjaGlsZENvbm5lY3Rpb25SZWN0YW5nbGUgPSBjaGlsZEdyYXBoTm9kZUZpZ3VyZS5nZXRDb25uZWN0aW9uUmVjdGFuZ2xlKCk7Ci0gICAgICAgICAgICAgIGludCB5ID0gY2hpbGRDb25uZWN0aW9uUmVjdGFuZ2xlLnkgKyBjaGlsZENvbm5lY3Rpb25SZWN0YW5nbGUuaGVpZ2h0IC8gMjsKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpOwotICAgICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7ICAgICAgICAgICAgIAotICAgICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MiwgeSwgY2hpbGRDb25uZWN0aW9uUmVjdGFuZ2xlLngsIHkpOyAgICAgICAgICAgIAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHgyLCBtaW5ZLCB4MiwgbWF4WSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIHN0YXJ0T2ZDaGlsZEJveCwgeTIpOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLQotICAgIC8vYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdHJ1ZTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICBkcmF3TGluZXMoZ3JhcGhpY3MsIGNoaWxkKTsKLSAgICB9Ci0gIH0gICAgCi0KLQotICAvLyBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgcHJldmlldyBjb25uZWN0aW9uIGxpbmUgZnVuY3Rpb24gcmVsYXRlZCB0byBkcmFnIGFuZCBkcm9wCi0gIC8vICAgICAKLSAgcHVibGljIFBvaW50TGlzdCBnZXRDb25uZWN0aW9uUG9pbnRzKEdyYXBoTm9kZUVkaXRQYXJ0IHBhcmVudEVkaXRQYXJ0LCBHcmFwaE5vZGVFZGl0UGFydCBjaGlsZFJlZkVkaXRQYXJ0LCBSZWN0YW5nbGUgZHJhZ2dlZEZpZ3VyZUJvdW5kcykKLSAgeyAgICAgICAgICAgCi0gICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IG5ldyBQb2ludExpc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50W10gZGF0YSA9IG5ldyBpbnRbMV07Ci0gICAgUG9pbnQgYSA9IGdldENvbm5lY3Rpb25Qb2ludChwYXJlbnRFZGl0UGFydCwgY2hpbGRSZWZFZGl0UGFydCwgZGF0YSk7Ci0gICAgaWYgKGEgIT0gbnVsbCkKLSAgICB7ICAgCi0gICAgICBpbnQgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kgPSBkcmFnZ2VkRmlndXJlQm91bmRzLnkgKyBkcmFnZ2VkRmlndXJlQm91bmRzLmhlaWdodC8yOwotCi0gICAgICBwb2ludExpc3QuYWRkUG9pbnQoYSk7IAotICAgICAgLy9wb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KGRyYWdnZWRGaWd1cmVCb3VuZHMueCwgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kpKTsKLSAgICAgIAotICAgICAgaWYgKGRhdGFbMF0gPT0gMCkgLy8gaW5zZXJ0IGJldHdlZW4gMiBpdGVtcwotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCB4ID0gYS54ICsgKGRyYWdnZWRGaWd1cmVCb3VuZHMueCAtIGEueCkvMjsKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludCh4LCBhLnkpKTsKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludCh4LCBkcmFnZ2VkRmlndXJlQm91bmRzWSkpOyAgICAgICAgCi0gICAgICAgIHBvaW50TGlzdC5hZGRQb2ludChuZXcgUG9pbnQoZHJhZ2dlZEZpZ3VyZUJvdW5kcy54LCBkcmFnZ2VkRmlndXJlQm91bmRzWSkpOwotICAgICAgfQotICAgICAgZWxzZSAvLyBpbnNlcnQgYXQgZmlyc3Qgb3IgbGFzdCBwb3NpdGlvbgotICAgICAgewotICAgICAgICBwb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KGEueCwgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kpKTsgICAKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludChkcmFnZ2VkRmlndXJlQm91bmRzLngsIGRyYWdnZWRGaWd1cmVCb3VuZHNZKSk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAKLSAgICByZXR1cm4gcG9pbnRMaXN0OwotICB9Ci0KLSAgICAgICAgIAotICAvLyBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgcHJldmlldyBjb25uZWN0aW9uIGxpbmUgZnVuY3Rpb24gcmVsYXRlZCB0byBkcmFnIGFuZCBkcm9wCi0gIC8vICAgICAKLSAgcHJvdGVjdGVkIFBvaW50IGdldENvbm5lY3Rpb25Qb2ludChHcmFwaE5vZGVFZGl0UGFydCBwYXJlbnRFZGl0UGFydCwgR3JhcGhOb2RlRWRpdFBhcnQgY2hpbGRSZWZFZGl0UGFydCwgaW50W10gZGF0YSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBQb2ludCBwb2ludCA9IG51bGw7ICAgICAKLSAgICBMaXN0IGNoaWxkTGlzdCA9IHBhcmVudEVkaXRQYXJ0LmdldENoaWxkcmVuKCk7ICAgICAgICAgCi0KLSAgICAvL1RyZWVOb2RlSWNvbkZpZ3VyZSBpY29uID0gKChUcmVlTm9kZUZpZ3VyZSlwYXJlbnQuZ2V0RmlndXJlKCkpLnRyZWVOb2RlSWNvbkZpZ3VyZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGNoaWxkTGlzdC5zaXplKCkgPiAwKQotICAgIHsgICAKLSAgICAgIHBvaW50ID0gbmV3IFBvaW50KCk7Ci0KLSAgICAgIEdyYXBoTm9kZUVkaXRQYXJ0IHByZXYgPSBudWxsOyAgICAKLSAgICAgIEdyYXBoTm9kZUVkaXRQYXJ0IG5leHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOyAgICAKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBHcmFwaE5vZGVFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIEdyYXBoTm9kZUVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQgPSAoR3JhcGhOb2RlRWRpdFBhcnQpbzsgICAgICAgIAotICAgICAgICAgIGlmIChjaGlsZEVkaXRQYXJ0ID09IGNoaWxkUmVmRWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmV4dCA9IGNoaWxkRWRpdFBhcnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHByZXYgPSBjaGlsZEVkaXRQYXJ0OwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICBpZiAobmV4dCAhPSBudWxsICYmIHByZXYgIT0gbnVsbCkKLSAgICAgIHsgCi0gICAgICAgIGludCB5YSA9IHByZXYuZ2V0Q29ubmVjdGlvblJlY3RhbmdsZSgpLmdldENlbnRlcigpLnk7Ci0gICAgICAgIGludCB5YiA9IG5leHQuZ2V0Q29ubmVjdGlvblJlY3RhbmdsZSgpLmdldENlbnRlcigpLnk7Ci0gICAgICAgIHBvaW50LnkgPSB5YSArICh5YiAtIHlhKS8yOyAgIAotICAgICAgICBkYXRhWzBdID0gMDsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlIGlmIChwcmV2ICE9IG51bGwpIC8vIGFkZCBpdCBsYXN0Ci0gICAgICB7Ci0gICAgICAgIHBvaW50LnkgPSBwcmV2LmdldENvbm5lY3Rpb25SZWN0YW5nbGUoKS5nZXRDZW50ZXIoKS55OwotICAgICAgICBkYXRhWzBdID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5leHQgIT0gbnVsbCkgLy8gYWRkIGl0IGZpcnN0IQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBwb2ludC55ID0gbmV4dC5nZXRDb25uZWN0aW9uUmVjdGFuZ2xlKCkuZ2V0Q2VudGVyKCkueTsKLSAgICAgICAgZGF0YVswXSA9IC0xOwotICAgICAgfQotICAgICAgICAgIAotICAgICAgaWYgKG5leHQgIT0gbnVsbCB8fCBwcmV2ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEdyYXBoTm9kZUVkaXRQYXJ0IGNoaWxkID0gcHJldiAhPSBudWxsID8gcHJldiA6IG5leHQ7Ci0gICAgICAgIGludCBzdGFydE9mQ2hpbGRCb3ggPSBjaGlsZC5nZXRDb25uZWN0aW9uUmVjdGFuZ2xlKCkueDsKLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBwYXJlbnRFZGl0UGFydC5nZXRDb25uZWN0aW9uUmVjdGFuZ2xlKCk7ICAKLSAgICAgICAgaW50IHgxID0gci54ICsgci53aWR0aDsKLSAgICAgICAgcG9pbnQueCA9IHgxICsgKHN0YXJ0T2ZDaGlsZEJveCAtIHgxKSAvIDM7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICByZXR1cm4gcG9pbnQ7Ci0gIH0KLSAgICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIG91dGxpbmVTaGFwZShHcmFwaGljcyBncmFwaGljcykKLSAgeyAKLSAgICBpZiAoaXNPdXRsaW5lZCkKLSAgICB7Ci0gICAgICBzdXBlci5vdXRsaW5lU2hhcGUoZ3JhcGhpY3MpOwotICAgIH0KLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0NvbnRhaW5lckZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQ29udGFpbmVyRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTQwMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQ29udGFpbmVyRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLSAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotICAgICAgICAgICAgICAKLXB1YmxpYyBjbGFzcyBDb250YWluZXJGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUKLXsgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPdXRsaW5lZCA9IGZhbHNlOwotCi0gIHB1YmxpYyBDb250YWluZXJGaWd1cmUoKQotICB7Ci0gICAgc2V0TGF5b3V0TWFuYWdlcihuZXcgQ29udGFpbmVyTGF5b3V0KCkpOwotICAgIHNldEZpbGwoZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9MYXlvdXQoKQotICB7Ci0JICBsYXlvdXQoKTsKLQkgIHNldFZhbGlkKHRydWUpOwotICB9ICAKLSAgICAgICAgICAKLSAgcHVibGljIENvbnRhaW5lckxheW91dCBnZXRDb250YWluZXJMYXlvdXQoKQotICB7Ci0gICAgcmV0dXJuIChDb250YWluZXJMYXlvdXQpZ2V0TGF5b3V0TWFuYWdlcigpOwotICB9ICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRPdXRsaW5lZChib29sZWFuIGlzT3V0bGluZWQpCi0gIHsKLSAgICB0aGlzLmlzT3V0bGluZWQgPSBpc091dGxpbmVkOwotICB9ICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBvdXRsaW5lU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsgCi0gICAgaWYgKGlzT3V0bGluZWQpCi0gICAgewotICAgICAgc3VwZXIub3V0bGluZVNoYXBlKGdyYXBoaWNzKTsKLSAgICB9Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIAotICB7Ci0gICAgaWYgKGlzVmFsaWQoKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN1cGVyLnZhbGlkYXRlKCk7CQotICAgIHBvc3RMYXlvdXQoKTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgcG9zdExheW91dCgpCi0gIHsKLSAgICBMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIgPSBnZXRMYXlvdXRNYW5hZ2VyKCk7Ci0gICAgaWYgKGxheW91dE1hbmFnZXIgaW5zdGFuY2VvZiBQb3N0TGF5b3V0TWFuYWdlcikKLSAgICB7Ci0gICAgICAoKFBvc3RMYXlvdXRNYW5hZ2VyKWxheW91dE1hbmFnZXIpLnBvc3RMYXlvdXQodGhpcyk7ICAgIAotICAgIH0gIAotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0NvbnRhaW5lckxheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQ29udGFpbmVyTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMTNmMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvQ29udGFpbmVyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5TcGFjaW5nRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RMYXlvdXQgaW1wbGVtZW50cyBQb3N0TGF5b3V0TWFuYWdlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbDsKLSAgcHJvdGVjdGVkIGludCBzcGFjaW5nID0gMDsKLSAgcHJvdGVjdGVkIGludCBib3JkZXIgPSAwOwotIAotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0KCkKLSAgeyAKLSAgICB0aGlzKHRydWUsIDApOyAKLSAgfSAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0KGJvb2xlYW4gaXNIb3Jpem9udGFsLCBpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsOyAgIAotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWwoYm9vbGVhbiBpc0hvcml6b250YWwpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgc2V0U3BhY2luZyhpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEJvcmRlcihpbnQgYm9yZGVyKQotICB7Ci0gICAgdGhpcy5ib3JkZXIgPSBib3JkZXI7Ci0gIH0gICAKLQotICAvKioKLSAgICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGNvbnRhaW5lciAKLSAgICogZ2l2ZW4gYXMgaW5wdXQuCi0gICAqIAotICAgKiBAcGFyYW0gZmlndXJlICBGaWd1cmUgd2hvc2UgcHJlZmVycmVkIHNpemUgaXMgcmVxdWlyZWQuCi0gICAqIEByZXR1cm4gIFRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgcGFzc2VkIEZpZ3VyZS4KLSAgICogQHNpbmNlIDIuMAotICAgKi8KLSAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgcGFyZW50LCBpbnQgdywgaW50IGgpCi0gIHsgCi0gICAgRGltZW5zaW9uIHByZWZlcnJlZCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vIEhlcmUgd2UgZW5zdXJlIHRoYXQgYW4gdW5leHBhbmRlZCBjb250YWluZXIgaXMgZ2l2ZW4gYSBzaXplIG9mICgwLDApCi0gICAgLy8KLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgR3JhcGhOb2RlQ29udGFpbmVyRmlndXJlKQotICAgIHsKLSAgICAgIEdyYXBoTm9kZUNvbnRhaW5lckZpZ3VyZSBncmFwaE5vZGVDb250YWluZXJGaWd1cmUgPSAoR3JhcGhOb2RlQ29udGFpbmVyRmlndXJlKXBhcmVudDsKLSAgICAgIGlmICghZ3JhcGhOb2RlQ29udGFpbmVyRmlndXJlLmlzRXhwYW5kZWQoKSkKLSAgICAgIHsKLSAgICAgICAgcHJlZmVycmVkID0gbmV3IERpbWVuc2lvbigpOyAKLSAgICAgIH0KLSAgICB9ICAgCi0gICAgCi0gICAgaWYgKHByZWZlcnJlZCA9PSBudWxsKQotICAgIHsKLSAgICAgIHByZWZlcnJlZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWNoaWxkcmVuLmdldChpKTsgICAgICAKLSAgICAKLSAgICAgICAgRGltZW5zaW9uIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgICAgICAgLyoKLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSW50ZXJhY3RvcikKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBjaGlsZFNpemUud2lkdGggPSA5OwotICAgICAgICAgIGNoaWxkU2l6ZS5oZWlnaHQgPSA5OwotICAgICAgICB9Ki8gIAotICAgIAotICAgICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgICB7Ci0gICAgICAgICAgcHJlZmVycmVkLndpZHRoICs9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgICAgICBwcmVmZXJyZWQuaGVpZ2h0ID0gTWF0aC5tYXgocHJlZmVycmVkLmhlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICBwcmVmZXJyZWQuaGVpZ2h0ICs9IGNoaWxkU2l6ZS5oZWlnaHQ7Ci0gICAgICAgICAgcHJlZmVycmVkLndpZHRoID0gTWF0aC5tYXgocHJlZmVycmVkLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICBpbnQgY2hpbGRyZW5TaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDEpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSAgICAKLSAgICAgICAgewotICAgICAgICAgIHByZWZlcnJlZC53aWR0aCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gc3BhY2luZyAqIChjaGlsZHJlblNpemUgLSAxKTsKLSAgICAgICAgfSAKLSAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHByZWZlcnJlZC53aWR0aCArPSBib3JkZXIgKiAyOwotICAgICAgcHJlZmVycmVkLmhlaWdodCArPSBib3JkZXIgKiAyOwotICAgICAgcHJlZmVycmVkLndpZHRoICs9IHBhcmVudC5nZXRJbnNldHMoKS5nZXRXaWR0aCgpOwotICAgICAgcHJlZmVycmVkLmhlaWdodCArPSBwYXJlbnQuZ2V0SW5zZXRzKCkuZ2V0SGVpZ2h0KCk7ICAgICAgCi0gICAgfQotICAgIHJldHVybiBwcmVmZXJyZWQ7Ci0gIH0KLQotICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgaW50IGFsaWduRmlndXJlKElGaWd1cmUgcGFyZW50LCBJRmlndXJlIGNoaWxkKQotICB7ICAgICAgICAgCi0gICAgaW50IHkgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4geTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIHBhcmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICBEaW1lbnNpb24gcHJlZmVycmVkID0gbmV3IERpbWVuc2lvbigpOwotCi0gICAgaW50IHJ4ID0gMDsKLSAgICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgRGltZW5zaW9uIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7ICAgCi0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgPSBNYXRoLm1heChwcmVmZXJyZWQuaGVpZ2h0LCBjaGlsZFNpemUuaGVpZ2h0KTsKLSAgICAgICAgcnggKz0gY2hpbGRTaXplLndpZHRoOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmVmZXJyZWQud2lkdGggPSBNYXRoLm1heChwcmVmZXJyZWQud2lkdGgsIGNoaWxkU2l6ZS53aWR0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICB7Ci0gICAgICBwcmVmZXJyZWQuaGVpZ2h0ICs9IGJvcmRlcioyOwotICAgICAgcHJlZmVycmVkLndpZHRoICs9IGJvcmRlcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHByZWZlcnJlZC53aWR0aCArPSBib3JkZXIqMjsKLSAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gYm9yZGVyOwotICAgIH0KLQotICAgIGludCBjaGlsZHJlblNpemUgPSBjaGlsZHJlbi5zaXplKCk7IAotICAgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSljaGlsZHJlbi5nZXQoaSk7Ci0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotICAgICAgCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgeyAgIAotICAgICAgICBpbnQgeSA9IGFsaWduRmlndXJlKHBhcmVudCwgY2hpbGQpOyAgICAgICAgICAgICAKLQotICAgICAgCi0gICAgICAgIGlmICh5ID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgIHkgPSAocHJlZmVycmVkLmhlaWdodCAtIGNoaWxkU2l6ZS5oZWlnaHQpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgCi0KLSAgICAgICAgUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IG5ldyBSZWN0YW5nbGUocHJlZmVycmVkLndpZHRoLCB5LCBjaGlsZFNpemUud2lkdGgsIGNoaWxkU2l6ZS5oZWlnaHQpOyAgIAotICAgICAgICByZWN0YW5nbGUudHJhbnNsYXRlKHBhcmVudC5nZXRDbGllbnRBcmVhKCkuZ2V0TG9jYXRpb24oKSk7Ci0KLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKHJlY3RhbmdsZSk7ICAgICAgICAgCi0gICAgICAgIHByZWZlcnJlZC53aWR0aCArPSBjaGlsZFNpemUud2lkdGg7IAotICAgICAgICBwcmVmZXJyZWQud2lkdGggKz0gc3BhY2luZzsgICAKLSAgICAgICAgCi0gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFNwYWNpbmdGaWd1cmUpCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgaW50IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCkud2lkdGggLSByeDsKLSAgICAgICAgICBwcmVmZXJyZWQud2lkdGggKz0gYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlOwotICAgICAgICB9IAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgwLCBwcmVmZXJyZWQuaGVpZ2h0LCBjaGlsZFNpemUud2lkdGgsIGNoaWxkU2l6ZS5oZWlnaHQpOwotICAgICAgICByZWN0YW5nbGUudHJhbnNsYXRlKHBhcmVudC5nZXRDbGllbnRBcmVhKCkuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhyZWN0YW5nbGUpOyAgCi0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgcHJlZmVycmVkLmhlaWdodCArPSBzcGFjaW5nOwotICAgICAgfQotICAgIH0gICAgIAotICB9ICAgICAgCi0gIAotICBwdWJsaWMgdm9pZCBwb3N0TGF5b3V0KElGaWd1cmUgZmlndXJlKQotICB7ICAgICAgIAotICAgIC8vIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGFsaWduIGEgJ0Zsb2F0YWJsZUZpZ3VyZScgKGUuZy4gYW4gRWxlbWVudCBub2RlKSAKLSAgICAvLyB3aXRoIGFueSBjb250ZW50IHRoYXQgaXQgaXMgY29ubmVjdGVkIHRvLiAgVGhpcyB3YXkgYSBjaGFpbiBvZiBjb25uZWN0ZWQgZmlndXJlcwotICAgIC8vIHdpbGwgYmUgdmVydGljYWxseSBhbGlnbmVkIChlLmcuIGVsZW1lbnQgLT4gbW9kZWxncm91cCAtPiBlbGVtZW50KS4gIEFueSB2aXNpYmxlIGNsaXBwaW5nIG9mIHRoZQotICAgIC8vIGZpZ3VyZXMgaW4gdGhlIGdyYXBoIGlzIHByb2JhYmx5IGEgcmVzdWx0IG9mIGEgYnVnIGluIHRoaXMgY29kZSB0aGF0IHJlc3VsdHMgaW4gYSAnRmxvYXRhYmxlRmlndXJlJyBiZWluZwotICAgIC8vIHJlcG9zaXRpb25lZCBiZXlvbmQgdGhlIGJvdW5kcyBvZiBpdHMgcGFyZW50LgotICAgIC8vICAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWkubmV4dCgpOwotICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRmxvYXRhYmxlRmlndXJlKSAgICAgICAKLSAgICAgIHsgICAgICAgIAotICAgICAgICBGbG9hdGFibGVGaWd1cmUgZmxvYXRhYmxlRmlndXJlID0gKEZsb2F0YWJsZUZpZ3VyZSljaGlsZDsKLSAgICAgICAgR3JhcGhOb2RlRmlndXJlIGdyYXBoTm9kZUZpZ3VyZSA9IGZsb2F0YWJsZUZpZ3VyZS5nZXRHcmFwaE5vZGVGaWd1cmUoKTsgCi0gICAgICAgIGlmIChncmFwaE5vZGVGaWd1cmUuaXNFeHBhbmRlZCgpICYmIGdyYXBoTm9kZUZpZ3VyZS5nZXRDaGlsZEdyYXBoTm9kZUZpZ3VyZXMoKS5zaXplKCkgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIEdyYXBoTm9kZUZpZ3VyZSBhbGlnbmVkQ2hpbGQgPSAoR3JhcGhOb2RlRmlndXJlKWdyYXBoTm9kZUZpZ3VyZS5nZXRDaGlsZEdyYXBoTm9kZUZpZ3VyZXMoKS5nZXQoMCk7ICAgICAgCi0gICAgICAgICAgUmVjdGFuZ2xlIGFsaWduZWRDaGlsZEJvdW5kcyA9IGFsaWduZWRDaGlsZC5nZXRDb25uZWN0aW9uUmVjdGFuZ2xlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIFJlY3RhbmdsZSBjaGlsZEJvdW5kcyA9IGNoaWxkLmdldEJvdW5kcygpOwotICAgICAgICAKLSAgICAgICAgICBpbnQgbCA9IGNoaWxkQm91bmRzLnkgKyBjaGlsZEJvdW5kcy5oZWlnaHQvMjsKLSAgICAgICAgICBpbnQgciA9IGFsaWduZWRDaGlsZEJvdW5kcy55ICsgYWxpZ25lZENoaWxkQm91bmRzLmhlaWdodC8yOyAgICAgICAKLSAgICAgICAgICBpbnQgZGVsdGEgPSByIC0gbDsKLQotICAgICAgICAgIGZpeFVwKGNoaWxkLCBkZWx0YSk7Ci0gICAgICAgIH0gICAgICAgICAgCi0gICAgICB9Ci0gICAgfSAgICAgIAotICB9ICAgICAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBmaXhVcChJRmlndXJlIGZpZ3VyZSwgaW50IGRlbHRhKQotICB7IAotICAgIFJlY3RhbmdsZSBib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0gICAgYm91bmRzLnkgKz0gZGVsdGE7Ci0gICAgZmlndXJlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gZmlndXJlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICBmaXhVcChjaGlsZCwgZGVsdGEpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9FeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9FeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzkxMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvRXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzOwotICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotICAgICAgICAgICAgICAKLQotLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgRXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tICAgfAotLy8gIHwgICB8IHZlcnRpY2FsR3JvdXAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8IHwgaG9yaXpvbnRhbEdyb3VwICAgICAgICAgICB8ICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICB8ICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8IHwgfCBvdXRsaW5lZEFyZWEgICAgICB8ICAgICB8ICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8ICAgICB8ICB8ICAgfCAgb3V0ZXIgICAgICB8ICAgfAotLy8gIHwgICB8IHwgfCB8IGljb25BcmVhICAgICAgfCB8ICAgICB8ICB8ICAgfCAgQ29udGVudCAgICB8ICAgfAotLy8gIHwgICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IFsrXSB8ICB8ICAgfCAgQXJlYSAgICAgICB8ICAgfAotLy8gIHwgICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8ICAgICB8ICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8IHwgfCB8IGlubmVyQ29udGVudCAgfCB8ICAgICB8ICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8ICAgICB8ICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICB8ICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8ICAgfCBvY2N1cmVuY2VBcmVhICB8ICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICB8ICAgfAotLy8gIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tICAgfAotLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSBleHRlbmRzIFJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUKLXsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBob3Jpem9udGFsR3JvdXA7Ci0gIHByb3RlY3RlZCBJbnRlcmFjdG9yIGludGVyYWN0b3I7IAotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIG91dGVyQ29udGVudEFyZWE7Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNFeHBhbmRlZCgpCi0gIHsKLSAgICByZXR1cm4gaW50ZXJhY3Rvci5pc0V4cGFuZGVkKCk7Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGlzRXhwYW5kZWQpCi0gIHsKLSAgICBpbnRlcmFjdG9yLnNldEV4cGFuZGVkKGlzRXhwYW5kZWQpOwotICB9Ci0gIAotICBwdWJsaWMgRXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigpOyAgICAKLSAgICBpc0Nvbm5lY3RlZCA9IHRydWU7Ci0gIH0gICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWd1cmUoKQotICB7ICAgCi0gICAgY3JlYXRlUHJlY2VlZGluZ1NwYWNlKHRoaXMpOyAgICAgICAgICAgCi0gICAgY3JlYXRlVmVydGljYWxHcm91cCh0aGlzKTsKLSAgICBjcmVhdGVIb3Jpem9udGFsR3JvdXAodmVydGljYWxHcm91cCk7Ci0gICAgY3JlYXRlT3V0bGluZWRBcmVhKGhvcml6b250YWxHcm91cCk7ICAgCi0gICAgY3JlYXRlSW50ZXJhY3Rvcihob3Jpem9udGFsR3JvdXApOwotICAgIGNyZWF0ZU9jY3VyZW5jZUFyZWEodmVydGljYWxHcm91cCk7ICAgCi0gICAgY3JlYXRlT3V0ZXJDb250ZW50QXJlYSh0aGlzKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVydGljYWxHcm91cChJRmlndXJlIHBhcmVudCkKLSAgewotICAgIHZlcnRpY2FsR3JvdXAgPSBuZXcgRmxvYXRhYmxlRmlndXJlKHRoaXMpOwotICAgIHZlcnRpY2FsR3JvdXAuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgcGFyZW50LmFkZCh2ZXJ0aWNhbEdyb3VwKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUhvcml6b250YWxHcm91cChJRmlndXJlIHBhcmVudCkKLSAgewotICAgIGhvcml6b250YWxHcm91cCA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBwYXJlbnQuYWRkKGhvcml6b250YWxHcm91cCk7Ci0gIH0gICAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUludGVyYWN0b3IoSUZpZ3VyZSBwYXJlbnQpCi0gIHsKLSAgICBpbnRlcmFjdG9yID0gbmV3IEludGVyYWN0b3IoKTsKLSAgICBpbnRlcmFjdG9yLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgaW50ZXJhY3Rvci5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOyAKLSAgICBwYXJlbnQuYWRkKGludGVyYWN0b3IpOwotICB9IAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU91dGVyQ29udGVudEFyZWEoSUZpZ3VyZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgYSBzbWFsbCBzcGFjZSBiZXR3ZWVuIHRoZSBpbnRlcmFjdG9yIGFuZCB0aGUgY29udGVudEFyZWEKLSAgICAvLwotICAgIFJlY3RhbmdsZUZpZ3VyZSBzcGFjZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLSAgICBzcGFjZS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICBzcGFjZS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oNSwgMTApKTsKLSAgICBwYXJlbnQuYWRkKHNwYWNlKTsgICAKLSAgICAgIAotICAgIG91dGVyQ29udGVudEFyZWEgPSBuZXcgR3JhcGhOb2RlQ29udGFpbmVyRmlndXJlKHRoaXMpOwotICAgIG91dGVyQ29udGVudEFyZWEuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgcGFyZW50LmFkZChvdXRlckNvbnRlbnRBcmVhKTsKLSAgfQotCi0gIHB1YmxpYyBJbnRlcmFjdG9yIGdldEludGVyYWN0b3IoKQotICB7Ci0gICAgcmV0dXJuIGludGVyYWN0b3I7Ci0gIH0gCi0KLSAgcHVibGljIENvbnRhaW5lckZpZ3VyZSBnZXRPdXRlckNvbnRlbnRBcmVhKCkKLSAgewotICAgIHJldHVybiBvdXRlckNvbnRlbnRBcmVhOwotICB9Ci0gICAgIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBob3Jpem9udGFsR3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgUmVjdGFuZ2xlIGdldENvbm5lY3Rpb25SZWN0YW5nbGUoKQotICB7Ci0gICAgcmV0dXJuIGhvcml6b250YWxHcm91cC5nZXRCb3VuZHMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvRmlsbExheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvRmlsbExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzU4YzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0ZpbGxMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLQotLyoqCi0gKiBGaWd1cmVzIHVzaW5nIHRoZSBTdGFja0xheW91dCBhcyB0aGVpciBsYXlvdXQgbWFuYWdlciBoYXZlCi0gKiB0aGVpciBjaGlsZHJlbiBwbGFjZWQgb24gdG9wIG9mIG9uZSBhbm90aGVyLiBPcmRlciBvZiAKLSAqIHBsYWNlbWVudCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2hpbGRyZW4KLSAqIHdlcmUgYWRkZWQsIGZpcnN0IGNoaWxkIGFkZGVkIHBsYWNlZCBvbiB0aGUgYm90dG9tLgotICovCi1wdWJsaWMgY2xhc3MgRmlsbExheW91dCBleHRlbmRzIEFic3RyYWN0TGF5b3V0Ci17Ci0gICAgICAgICAKLXByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgCi1wcm90ZWN0ZWQgaW50IHNwYWNpbmcgPSAwOwotcHVibGljIERpbWVuc2lvbiBtaW47ICAKLQotcHVibGljIEZpbGxMYXlvdXQoKXt9ICAgICAKLXB1YmxpYyBGaWxsTGF5b3V0KGJvb2xlYW4gZHVtbXkpe30gCi0KLXB1YmxpYyBGaWxsTGF5b3V0KGludCBzcGFjaW5nKQoteyAKLSAgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsgCi19Ci0KLXB1YmxpYyB2b2lkIHNldEhvcml6b250YWwoYm9vbGVhbiBpc0hvcml6b250YWwpCi17Ci0gdGhpcy5pc0hvcml6b250YWwgPSBpc0hvcml6b250YWw7Ci19Ci0KLS8qKgotICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGlucHV0IGNvbnRhaW5lci4KLSAqIFRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQgb2YgdGhlIGNvbnRhaW5lciwgYXMgYWxsCi0gKiBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzIHNpemUuCi0gKgotICogQHBhcmFtIGZpZ3VyZSAgQ29udGFpbmVyIGZpZ3VyZSBmb3Igd2hpY2ggcHJlZmVycmVkIHNpemUgaXMgcmVxdWlyZWQuCi0gKiBAcmV0dXJuICBUaGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGlucHV0IGZpZ3VyZS4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgZmlndXJlLCBpbnQgdywgaW50IGgpCi17CSAgICAgICAgICAgICAgICAgCi0gIERpbWVuc2lvbiBkID0gY2FsY3VsYXRlUHJlZmVycmVkQ2xpZW50QXJlYVNpemUoZmlndXJlKTsKLQlkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwKLQkgICAgICAgICBmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0SGVpZ2h0KCkpOwotCS8vZC51bmlvbihnZXRCb3JkZXJQcmVmZXJyZWRTaXplKGZpZ3VyZSkpOwotCXJldHVybiBkOwotfSAKLQotcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRDbGllbnRBcmVhU2l6ZShJRmlndXJlIGZpZ3VyZSkKLXsKLSAgRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKCk7Ci0JTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOyAKLQotCi0JZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgewotCQlJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpaS5uZXh0KCk7Ci0gICAgRGltZW5zaW9uIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLQotICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgewotICAgICAgZC53aWR0aCArPSBjaGlsZFNpemUud2lkdGg7Ci0gICAgICBkLmhlaWdodCA9IE1hdGgubWF4KGNoaWxkU2l6ZS5oZWlnaHQsIGQuaGVpZ2h0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGQuaGVpZ2h0ICs9IGNoaWxkU2l6ZS5oZWlnaHQ7Ci0gICAgICBkLndpZHRoID0gTWF0aC5tYXgoY2hpbGRTaXplLndpZHRoLCBkLndpZHRoKTsKLSAgICB9Ci0JfQkgCi0KLSAgICAgICAgICAgICAgICAgICAKLSAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsgICAgICAgCi0gIGlmIChjaGlsZHJlblNpemUgPiAwKQotICB7Ci0gICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIGQud2lkdGggKz0gc3BhY2luZyAqIChjaGlsZHJlblNpemUgLSAxKTsgCi0gICAgZWxzZQotICAgICAgZC5oZWlnaHQgKz0gc3BhY2luZyAqIChjaGlsZHJlblNpemUgLSAxKTsKLSAgfSAgICAgICAKLSAgICAKLSAgaWYgKG1pbiAhPSBudWxsKQotICB7Ci0gICAgZC53aWR0aCA9IE1hdGgubWF4KGQud2lkdGgsIG1pbi53aWR0aCk7Ci0gICAgZC5oZWlnaHQgPSBNYXRoLm1heChkLmhlaWdodCwgbWluLmhlaWdodCk7Ci0gIH0KLSAgcmV0dXJuIGQ7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHNpemUgcmVxdWlyZWQgYnkgdGhlIGlucHV0IGNvbnRhaW5lci4KLSAqIFRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQgb2YgdGhlIGNvbnRhaW5lciwgYXMgYWxsCi0gKiBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzIHNpemUuCi0gKi8KLXB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3LCBpbnQgaCkKLXsKLQlEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oKTsKLQlMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0JSUZpZ3VyZSBjaGlsZDsKLQlmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKyl7Ci0JCWNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotCQlkLnVuaW9uKGNoaWxkLmdldE1pbmltdW1TaXplKCkpOwotCX0KLQlkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwKLQkgICAgICAgICBmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0SGVpZ2h0KCkpOwotCXJldHVybiBkOwotfQotCi1wdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3LCBpbnQgaCkKLXsKLQlyZXR1cm4gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShmaWd1cmUsIHcsIGgpOwotfQotCi0vKgotICogTGF5cyBvdXQgdGhlIGNoaWxkcmVuIG9uIHRvcCBvZiBlYWNoIG90aGVyIHdpdGgKLSAqIHRoZWlyIHNpemVzIGVxdWFsIHRvIHRoYXQgb2YgdGhlIGF2YWlsYWJsZQotICogcGFpbnRhYmxlIGFyZWEgb2YgdGhlIGlucHV0IGNvbnRhaW5lciBmaWd1cmUuCi0gKi8KLXB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGZpZ3VyZSl7ICAgCi0gICAgICAgICAgICAgICAgICAgICAKLSAgRGltZW5zaW9uCXByZWZlcnJlZFNpemUgPSBjYWxjdWxhdGVQcmVmZXJyZWRDbGllbnRBcmVhU2l6ZShmaWd1cmUpOwotCVJlY3RhbmdsZSByID0gZmlndXJlLmdldENsaWVudEFyZWEoKS5nZXRDb3B5KCk7IAotCi0JTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gIHsKLQkJSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWkubmV4dCgpOwotICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0KLSAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgIHsKLQkJICBjaGlsZC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZShyLngsIHIueSwgY2hpbGRTaXplLndpZHRoLCBNYXRoLm1heChwcmVmZXJyZWRTaXplLmhlaWdodCwgci5oZWlnaHQpKSk7Ci0gICAgICByLnggKz0gY2hpbGRTaXplLndpZHRoICsgc3BhY2luZzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAgICAgICAgICAKLQkJICBjaGlsZC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZShyLngsIHIueSwgTWF0aC5tYXgocHJlZmVycmVkU2l6ZS53aWR0aCwgci53aWR0aCksIGNoaWxkU2l6ZS5oZWlnaHQpKTsKLSAgICAgIHIueSArPSBjaGlsZFNpemUuaGVpZ2h0ICsgc3BhY2luZzsKLSAgICB9Ci0JfQotfQotfSAKLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9GbG9hdGFibGVGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0Zsb2F0YWJsZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjI0MTQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0Zsb2F0YWJsZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBGbG9hdGFibGVGaWd1cmUgZXh0ZW5kcyBDb250YWluZXJGaWd1cmUKLXsgICAgICAgICAgICAgICAKLSAgcHVibGljIEdyYXBoTm9kZUZpZ3VyZSBncmFwaE5vZGVGaWd1cmU7ICAKLQotICBwdWJsaWMgRmxvYXRhYmxlRmlndXJlKEdyYXBoTm9kZUZpZ3VyZSBncmFwaE5vZGVGaWd1cmUpCi0gIHsgICAgICAgICAgICAgICAgICAKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZ3JhcGhOb2RlRmlndXJlID0gZ3JhcGhOb2RlRmlndXJlOwotICB9ICAgCi0KLSAgcHVibGljIEdyYXBoTm9kZUZpZ3VyZSBnZXRHcmFwaE5vZGVGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGdyYXBoTm9kZUZpZ3VyZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvR3JhcGhOb2RlQ29udGFpbmVyRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9HcmFwaE5vZGVDb250YWluZXJGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2YTY1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9HcmFwaE5vZGVDb250YWluZXJGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlQ29udGFpbmVyRmlndXJlIGV4dGVuZHMgQ29udGFpbmVyRmlndXJlCi17ICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBFeHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlIGV4cGFuZGFibGVHcmFwaE5vZGVGaWd1cmU7ICAKLQotICBwdWJsaWMgR3JhcGhOb2RlQ29udGFpbmVyRmlndXJlKEV4cGFuZGFibGVHcmFwaE5vZGVGaWd1cmUgZXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZSkKLSAgeyAgICAgICAgICAgICAgICAgIAotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5leHBhbmRhYmxlR3JhcGhOb2RlRmlndXJlID0gZXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZTsKLSAgfSAgICAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNFeHBhbmRlZCgpCi0gIHsKLSAgICByZXR1cm4gZXhwYW5kYWJsZUdyYXBoTm9kZUZpZ3VyZS5pc0V4cGFuZGVkKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0dyYXBoTm9kZUZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvR3JhcGhOb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOTcwNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvR3JhcGhOb2RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXM7Ci0gICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLSAgICAgICAgICAgICAgCi0KLS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IEdyYXBoTm9kZUZpZ3VyZSAgICAgICAgICAgIHwKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIHwKLS8vICB8IHwgdmVydGljYWwgZ3JvdXAgICAgICAgIHwgIHwKLS8vICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgIHwKLS8vICB8IHwgfCBvdXRsaW5lZCBhcmVhICAgICB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgfCB8IGljb24gYXJlYSAgICAgfCB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgfCB8IGlubmVyIGNvbnRlbnQgfCB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgIHwKLS8vICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIHwKLS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGNsYXNzIEdyYXBoTm9kZUZpZ3VyZSBleHRlbmRzIENvbnRhaW5lckZpZ3VyZQoteyAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIHZlcnRpY2FsR3JvdXA7IAotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIG91dGxpbmVkQXJlYTsKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBpY29uQXJlYTsKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBpbm5lckNvbnRlbnRBcmVhOyAKLSAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RlZDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJc29sYXRlZDsKLQotICBwcm90ZWN0ZWQgTGlzdCBjaGlsZEdyYXBoTm9kZUZpZ3VyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBHcmFwaE5vZGVGaWd1cmUgcGFyZW50R3JhcGhOb2RlRmlndXJlOyAKLQotICBwdWJsaWMgR3JhcGhOb2RlRmlndXJlKCkKLSAgeyAKLSAgICBpc0lzb2xhdGVkID0gZmFsc2U7Ci0gICAgY3JlYXRlRmlndXJlKCk7Ci0gIH0gICAgICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGVkKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9ICAgIAotCi0gIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkKLSAgewotICAgIHJldHVybiBpc0Nvbm5lY3RlZDsKLSAgfSAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGVkKGJvb2xlYW4gaXNDb25uZWN0ZWQpCi0gIHsKLSAgICB0aGlzLmlzQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJc0lzb2xhdGVkKGJvb2xlYW4gaXNJc29sYXRlZCkKLSAgewotICAgIHRoaXMuaXNJc29sYXRlZCA9IGlzSXNvbGF0ZWQ7IAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0SXNJc29sYXRlZCgpCi0gIHsKLSAgICByZXR1cm4gaXNJc29sYXRlZDsgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgY3JlYXRlVmVydGljYWxHcm91cCh0aGlzKTsKLSAgICBjcmVhdGVPdXRsaW5lZEFyZWEodmVydGljYWxHcm91cCk7IAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVydGljYWxHcm91cChJRmlndXJlIHBhcmVudCkKLSAgewotICAgIHZlcnRpY2FsR3JvdXAgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgdmVydGljYWxHcm91cC5nZXRDb250YWluZXJMYXlvdXQoKS5zZXRIb3Jpem9udGFsKGZhbHNlKTsKLSAgICBwYXJlbnQuYWRkKHZlcnRpY2FsR3JvdXApOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3V0bGluZWRBcmVhKElGaWd1cmUgcGFyZW50KQotICB7IAotICAgIG91dGxpbmVkQXJlYSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBvdXRsaW5lZEFyZWEuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgcGFyZW50LmFkZChvdXRsaW5lZEFyZWEpOyAgICAgIAotICAgICAKLSAgICBpY29uQXJlYSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBvdXRsaW5lZEFyZWEuYWRkKGljb25BcmVhKTsKLQotICAgIGlubmVyQ29udGVudEFyZWEgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgaW5uZXJDb250ZW50QXJlYS5nZXRDb250YWluZXJMYXlvdXQoKS5zZXRIb3Jpem9udGFsKGZhbHNlKTsKLSAgICBvdXRsaW5lZEFyZWEuYWRkKGlubmVyQ29udGVudEFyZWEpOyAgCi0gIH0gICAKLQotICBwdWJsaWMgQ29udGFpbmVyRmlndXJlIGdldEljb25BcmVhKCkKLSAgewotICAgIHJldHVybiBpY29uQXJlYTsKLSAgfQotCi0gIHB1YmxpYyBDb250YWluZXJGaWd1cmUgZ2V0T3V0bGluZWRBcmVhKCkKLSAgewotICAgIHJldHVybiBvdXRsaW5lZEFyZWE7Ci0gIH0KLQotICBwdWJsaWMgQ29udGFpbmVyRmlndXJlIGdldElubmVyQ29udGVudEFyZWEoKQotICB7Ci0gICAgcmV0dXJuIGlubmVyQ29udGVudEFyZWE7Ci0gIH0gCi0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gb3V0bGluZWRBcmVhOwotICB9Ci0KLSAgcHVibGljIFJlY3RhbmdsZSBnZXRDb25uZWN0aW9uUmVjdGFuZ2xlKCkKLSAgewotICAgIHJldHVybiBvdXRsaW5lZEFyZWEuZ2V0Qm91bmRzKCk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDaGlsZEdyYXBoTm9kZUZpZ3VyZXMoKQotICB7Ci0gICAgcmV0dXJuIGNoaWxkR3JhcGhOb2RlRmlndXJlczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZE5vdGlmeSgpICAgICAgICAgICAgICAgICAgICAgCi0gIHsKLSAgICBzdXBlci5hZGROb3RpZnkoKTsgICAgICAgICAgICAgICAgIAotICAgIGlmIChpc0Nvbm5lY3RlZCgpKQotICAgIHsKLSAgICAgIHBhcmVudEdyYXBoTm9kZUZpZ3VyZSA9IGNvbXB1dGVQYXJlbnRHcmFwaE5vZGVGaWd1cmUodGhpcyk7Ci0gICAgICBpZiAocGFyZW50R3JhcGhOb2RlRmlndXJlICE9IG51bGwpCi0gICAgICB7ICAgCi0gICAgICAgIHBhcmVudEdyYXBoTm9kZUZpZ3VyZS5nZXRDaGlsZEdyYXBoTm9kZUZpZ3VyZXMoKS5hZGQodGhpcyk7Ci0gICAgICB9ICAgCi0gICAgfQotICB9IAotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmeSgpCi0gIHsgICAgIAotICAgIHN1cGVyLnJlbW92ZU5vdGlmeSgpOwotICAgIGlmIChwYXJlbnRHcmFwaE5vZGVGaWd1cmUgIT0gbnVsbCkKLSAgICB7ICAgCi0gICAgICBwYXJlbnRHcmFwaE5vZGVGaWd1cmUuZ2V0Q2hpbGRHcmFwaE5vZGVGaWd1cmVzKCkucmVtb3ZlKHRoaXMpOwotICAgIH0gIAotICB9Ci0KLSAgcHVibGljIEdyYXBoTm9kZUZpZ3VyZSBnZXRQYXJlbnRHcmFwaE5vZGVGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudEdyYXBoTm9kZUZpZ3VyZTsKLSAgfSAgCi0KLSAgcHVibGljIEdyYXBoTm9kZUZpZ3VyZSBjb21wdXRlUGFyZW50R3JhcGhOb2RlRmlndXJlKElGaWd1cmUgZmlndXJlKQotICB7ICAgICAgICAgICAgICAgICAgIAotICAgIEdyYXBoTm9kZUZpZ3VyZSByZXN1bHQgPSBudWxsOwotICAgIElGaWd1cmUgcGFyZW50ID0gZmlndXJlICE9IG51bGwgPyBmaWd1cmUuZ2V0UGFyZW50KCkgOiBudWxsOwotICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgR3JhcGhOb2RlRmlndXJlKQotICAgICAgeyAgICAKLSAgICAgICAgR3JhcGhOb2RlRmlndXJlIHBhcmVudEdyYXBoTm9kZUZpZ3VyZSA9IChHcmFwaE5vZGVGaWd1cmUpcGFyZW50OwotICAgICAgICBpZiAocGFyZW50R3JhcGhOb2RlRmlndXJlLmlzQ29ubmVjdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoR3JhcGhOb2RlRmlndXJlKXBhcmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotICAgIH0gICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9JbnRlcmFjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9JbnRlcmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjRiOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvSW50ZXJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXM7Ci0gICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogSW50ZXJhY3RvciB0aGUgKy8tIGNvbnRyb2wgY29tbW9ubHkgZm91bmQgaW4gdHJlZXMKLSAqLwotcHVibGljIGNsYXNzIEludGVyYWN0b3IgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHBhbmRlZDsKLQotICBwdWJsaWMgSW50ZXJhY3RvcigpCi0gIHsKLSAgICBzdXBlcigpOyAKLSAgICBzZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oOSwgOSkpOyAgICAgICAgICAgICAgIAotICB9ICAKLQotICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGlzRXhwYW5kZWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuaXNFeHBhbmRlZCA9IGlzRXhwYW5kZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGVkKCkKLSAgewotICAgIHJldHVybiBpc0V4cGFuZGVkOwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBnKQotICB7Ci0gICAgc3VwZXIuZmlsbFNoYXBlKGcpOwotICAgIFJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgbXggPSByLnggKyByLndpZHRoIC8gMjsKLSAgICBpbnQgbXkgPSByLnkgKyByLmhlaWdodCAvIDI7ICAgIAotICAgIGludCBzID0gMjsgICAgICAgCi0gICAgZy5kcmF3TGluZShyLnggKyBzLCBteSwgci54ICsgci53aWR0aCAtIHMgLSAxLCBteSk7IAotICAgIGlmICghaXNFeHBhbmRlZCkKLSAgICB7Ci0gICAgICBnLmRyYXdMaW5lKG14LCByLnkgKyBzLCBteCwgci55ICsgci5oZWlnaHQgLSBzIC0xKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0xhYmVsRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9MYWJlbEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGM4MmI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0xhYmVsRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLSAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIExhYmVsRmlndXJlIGV4dGVuZHMgRmlndXJlCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgdGV4dCA9ICIiOyAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzU2hvd0VtcHR5TGFiZWwgPSB0cnVlOwotICBwcm90ZWN0ZWQgaW50IGxlZnQgPSA0OyAKLSAgcHJvdGVjdGVkIGludCByaWdodCA9IDQ7IAotICBwcm90ZWN0ZWQgaW50IHRleHRIZWlnaHQ7Ci0gIHByb3RlY3RlZCBpbnQgdGV4dFdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIExhYmVsRmlndXJlKCkKLSAgewotICAgIHNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbigpKTsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TGVmdChpbnQgbGVmdCkKLSAgewotICAgIHRoaXMubGVmdCA9IGxlZnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRSaWdodChpbnQgcmlnaHQpCi0gIHsKLSAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTaG93RW1wdHlMYWJlbChib29sZWFuIGlzU2hvd0VtcHR5TGFiZWwpCi0gIHsKLSAgICB0aGlzLmlzU2hvd0VtcHR5TGFiZWwgPSBpc1Nob3dFbXB0eUxhYmVsOwotICB9ICAgICAKLSAgICAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzKQotICB7IAotCSAgaWYgKHMgPT0gbnVsbCkKLQkJICBzID0gIiI7Ci0KLSAgICBpZiAoIXRleHQuZXF1YWxzKHMpKQotICAgIHsKLQkgICAgdGV4dCA9IHM7Ci0gICAgICBpZiAodGV4dC5sZW5ndGgoKSA+IDAgfHwgaXNTaG93RW1wdHlMYWJlbCkKLSAgICAgIHsKLSAgICAgICAgdGV4dEhlaWdodCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhnZXRGb250KCkpLmdldEhlaWdodCgpOwotICAgICAgICB0ZXh0V2lkdGggPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dFdpZHRoKHRleHQsIGdldEZvbnQoKSk7Ci0gICAgICAgIHRleHRXaWR0aCA9IE1hdGgubWF4KHRleHRXaWR0aCwgRmlndXJlVXRpbGl0aWVzLmdldFRleHRXaWR0aCgiYWJjZGVmZyIsIGdldEZvbnQoKSkpOwotICAgICAgICBzZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24odGV4dFdpZHRoICsgbGVmdCArIHJpZ2h0LCB0ZXh0SGVpZ2h0KSk7Ci0gICAgICB9IAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oKSk7Ci0gICAgICB9IAotICAgIH0gICAKLSAgICAvL3JldmFsaWRhdGUoKTsgCi0gICAgLy9yZXBhaW50KCk7Ci0gIH0KLQotCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykKLSAgLy9wcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsgIAotICAgIHN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLSAgICAvL3N1cGVyLmZpbGxTaGFwZShncmFwaGljcyk7Ci0gICAgaWYgKHRleHQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCk7Ci0JCSAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGdldEZvcmVncm91bmRDb2xvcigpKTsKLSAgICAgIGdyYXBoaWNzLmRyYXdTdHJpbmcodGV4dCwgbGVmdCArIHIueCwgci55KTsvLyArIChyLndpZHRoIC0gdGV4dFdpZHRoKS8yLCByLnkgKyAoci5oZWlnaHQgLSB0ZXh0SGVpZ2h0KS8yKTsgICAgICAgICAgIAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvUG9zdExheW91dE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL1Bvc3RMYXlvdXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTFmNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvUG9zdExheW91dE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci0KLQotcHVibGljIGludGVyZmFjZSBQb3N0TGF5b3V0TWFuYWdlcgotewotICBwdWJsaWMgdm9pZCBwb3N0TGF5b3V0KElGaWd1cmUgZmlndXJlKTsgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvUmVwZWF0YWJsZUdyYXBoTm9kZUZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvUmVwZWF0YWJsZUdyYXBoTm9kZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDhkMjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL1JlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLkdyYXBoaWNzQ29uc3RhbnRzOwotCi0KLSAgICAgICAgICAgICAgCi0KLS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IFJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUgIHwKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIHwKLS8vICB8IHwgdmVydGljYWwgZ3JvdXAgICAgICAgIHwgIHwKLS8vICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgIHwKLS8vICB8IHwgfCBvdXRsaW5lZCBhcmVhICAgICB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgfCB8IGljb24gYXJlYSAgICAgfCB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgfCB8IGlubmVyIGNvbnRlbnQgfCB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgIHwKLS8vICB8IHwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwKLS8vICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tICAgIHwgIHwKLS8vICB8IHwgfCBvY2N1cmVuY2UgYXJlYSB8ICAgIHwgIHwKLS8vICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tICAgIHwgIHwKLS8vICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIHwKLS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGNsYXNzIFJlcGVhdGFibGVHcmFwaE5vZGVGaWd1cmUgZXh0ZW5kcyBHcmFwaE5vZGVGaWd1cmUKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDb250YWluZXJGaWd1cmUgb2NjdXJlbmNlQXJlYTsgIAotICBwcm90ZWN0ZWQgTGFiZWxGaWd1cmUgb2NjdXJlbmNlTGFiZWw7IAotCi0gIHB1YmxpYyBSZXBlYXRhYmxlR3JhcGhOb2RlRmlndXJlKCkKLSAgeyAgICAKLSAgICBzdXBlcigpOyAgICAgICAgICAKLSAgfSAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlndXJlKCkKLSAgeyAgICAgICAgICAgICAgICAgIAotICAgIGNyZWF0ZVByZWNlZWRpbmdTcGFjZSh0aGlzKTsKLSAgICBjcmVhdGVWZXJ0aWNhbEdyb3VwKHRoaXMpOwotICAgIGNyZWF0ZU91dGxpbmVkQXJlYSh2ZXJ0aWNhbEdyb3VwKTsgCi0gICAgY3JlYXRlT2NjdXJlbmNlQXJlYSh2ZXJ0aWNhbEdyb3VwKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU9jY3VyZW5jZUFyZWEoSUZpZ3VyZSBwYXJlbnQpCi0gIHsKLSAgICBvY2N1cmVuY2VBcmVhID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOyAgIAotICAgIG9jY3VyZW5jZUxhYmVsID0gbmV3IExhYmVsRmlndXJlKCk7Ci0gICAgb2NjdXJlbmNlTGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBvY2N1cmVuY2VMYWJlbC5zZXRTaG93RW1wdHlMYWJlbChmYWxzZSk7Ci0gICAgb2NjdXJlbmNlTGFiZWwuc2V0Rm9udChHcmFwaGljc0NvbnN0YW50cy5tZWRpdW0pOyAKLSAgICBvY2N1cmVuY2VBcmVhLmFkZChvY2N1cmVuY2VMYWJlbCk7ICAgICAgICAgICAgICAgCi0gICAgcGFyZW50LmFkZChvY2N1cmVuY2VBcmVhKTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByZWNlZWRpbmdTcGFjZShJRmlndXJlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBhIHNtYWxsIHNwYWNlCi0gICAgUmVjdGFuZ2xlRmlndXJlIHNwYWNlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotICAgIHNwYWNlLnNldFZpc2libGUoZmFsc2UpOwotICAgIHNwYWNlLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbigxMCwgMTApKTsKLSAgICBwYXJlbnQuYWRkKHNwYWNlKTsgIAotICB9IAotCi0gIHB1YmxpYyBMYWJlbEZpZ3VyZSBnZXRPY2N1cmVuY2VMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gb2NjdXJlbmNlTGFiZWw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9Sb3VuZGVkTGluZUJvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWRiZmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLSAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuSW5zZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBSb3VuZGVkTGluZUJvcmRlciBleHRlbmRzIExpbmVCb3JkZXIKLXsgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGludCBhcmNMZW5ndGg7ICAgCi0gIHByb3RlY3RlZCBpbnQgbGluZVN0eWxlID0gR3JhcGhpY3MuTElORV9TT0xJRDsKLQotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoQ29sb3IgYywgaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoKQotICB7Ci0JICBzdXBlcihjLCB3aWR0aCk7ICAgICAKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgfQotCi0gIHB1YmxpYyBSb3VuZGVkTGluZUJvcmRlcihpbnQgd2lkdGgsIGludCBhcmNMZW5ndGgpCi0gIHsKLQkgIHN1cGVyKHdpZHRoKTsgICAgIAotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICB9Ci0gIAotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoQ29sb3IgYywgaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoLCBpbnQgbGluZVN0eWxlKQotICB7Ci0gICAgc3VwZXIoYywgd2lkdGgpOwotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICAgIHRoaXMubGluZVN0eWxlID0gbGluZVN0eWxlOwotICB9Ci0KLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCwgaW50IGxpbmVTdHlsZSkKLSAgewotICAgIHN1cGVyKHdpZHRoKTsKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgICB0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBncmFwaGljcywgSW5zZXRzIGluc2V0cykKLSAgewotICAgICAgaW50IHJsYldpZHRoID0gZ2V0V2lkdGgoKTsKLQkgIHRlbXBSZWN0LnNldEJvdW5kcyhnZXRQYWludFJlY3RhbmdsZShmaWd1cmUsIGluc2V0cykpOwotICAJaWYgKHJsYldpZHRoJTIgPT0gMSkKLSAgICB7Ci0JCSAgdGVtcFJlY3Qud2lkdGgtLTsKLQkJICB0ZW1wUmVjdC5oZWlnaHQtLTsKLQkgIH0KLQkgIHRlbXBSZWN0LnNocmluayhybGJXaWR0aC8yLHJsYldpZHRoLzIpOwotCSAgZ3JhcGhpY3Muc2V0TGluZVdpZHRoKHJsYldpZHRoKTsKLSAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUobGluZVN0eWxlKTsKLQkgIGlmIChnZXRDb2xvcigpICE9IG51bGwpCi0JCSAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGdldENvbG9yKCkpOwotCSAgZ3JhcGhpY3MuZHJhd1JvdW5kUmVjdGFuZ2xlKHRlbXBSZWN0LCBhcmNMZW5ndGgsIGFyY0xlbmd0aCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9tb2RlbC9DYXRlZ29yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL0NhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOTkxNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL0NhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLm1vZGVsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETm90YXRpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnkgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXIKLXsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVRUUklCVVRFUyA9IDE7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVMRU1FTlRTID0gMjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFlQRVMgPSAzOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBHUk9VUFMgPSA1OwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVJFQ1RJVkVTID0gNjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9UQVRJT05TID0gNzsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVRUUklCVVRFX0dST1VQUyA9IDg7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElERU5USVRZX0NPTlNUUkFJTlRTID0gOTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQU5OT1RBVElPTlMgPSAxMDsKLQotICAKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByb3RlY3RlZCBpbnQgZ3JvdXBUeXBlOwotCi0gIC8vcHVibGljIHZvaWQgbW9kZWxOYW1lQ2hhbmdlZCgpOwotICBwdWJsaWMgQ2F0ZWdvcnkoWFNEU2NoZW1hIHNjaGVtYSwgaW50IGdyb3VwVHlwZSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIHRoaXMuZ3JvdXBUeXBlID0gZ3JvdXBUeXBlOwotICB9ICAgICAgIAotCi0gIHB1YmxpYyBpbnQgZ2V0R3JvdXBUeXBlKCkKLSAgewotICAgIHJldHVybiBncm91cFR5cGU7Ci0gIH0gICAKLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFhTRFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgc3dpdGNoIChncm91cFR5cGUpCi0gICAgewotICAgICAgY2FzZSBBVFRSSUJVVEVTICAgICAgIDogeyBuYW1lID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0dSQVBIX0FUVFJJQlVURVMiKTsgYnJlYWs7IH0KLSAgICAgIGNhc2UgTk9UQVRJT05TICAgICAgICA6IHsgbmFtZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9HUkFQSF9OT1RBVElPTlMiKTsgYnJlYWs7IH0KLSAgICAgIGNhc2UgRUxFTUVOVFMgICAgICAgICA6IHsgbmFtZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9HUkFQSF9FTEVNRU5UUyIpOyBicmVhazsgfQotICAgICAgY2FzZSBUWVBFUyAgICAgICAgICAgICA6IHsgbmFtZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9HUkFQSF9UWVBFUyIpOyBicmVhazsgfSAgICAKLSAgICAgIGNhc2UgR1JPVVBTICAgICAgICAgICA6IHsgbmFtZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9HUkFQSF9HUk9VUFMiKTsgYnJlYWs7IH0gICAgICAKLSAgICAgIGNhc2UgRElSRUNUSVZFUyAgICAgICA6IHsgbmFtZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9HUkFQSF9ESVJFQ1RJVkVTIik7IGJyZWFrOyB9Ci0gICAgfSAgICAgIAotICAgIHJldHVybiBuYW1lOwotICB9Ci0gICAgICAgICAgICAgIAotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCBsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICBzd2l0Y2ggKGdyb3VwVHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIEFUVFJJQlVURVMgICAgICAgOiB7IGxpc3QgPSBnZXRBdHRyaWJ1dGVMaXN0KCk7IGJyZWFrOyB9Ci0gICAgICBjYXNlIE5PVEFUSU9OUyAgICAgICAgOiB7IGxpc3QgPSBnZXROb3RhdGlvbnMoKTsgYnJlYWs7IH0KLSAgICAgIGNhc2UgRUxFTUVOVFMgICAgICAgICA6IHsgbGlzdCA9IGdldEdsb2JhbEVsZW1lbnRzKCk7IGJyZWFrOyB9Ci0gICAgICBjYXNlIFRZUEVTICAgICAgICAgICAgOiB7IGxpc3QgPSBnZXRUeXBlcygpOyAgYnJlYWs7IH0KLSAgICAgIGNhc2UgR1JPVVBTICAgICAgICAgICA6IHsgbGlzdCA9IGdldEdyb3VwcygpOyBicmVhazsgfQotICAgICAgY2FzZSBESVJFQ1RJVkVTICAgICAgIDogeyBsaXN0ID0gZ2V0RGlyZWN0aXZlcygpOyBicmVhazsgfQotICAgIH0gICAgICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGlzU2FtZU5hbWVzcGFjZShTdHJpbmcgbnMxLCBTdHJpbmcgbnMyKQotICB7Ci0gICAgaWYgKG5zMSA9PSBudWxsKSBuczEgPSAiIjsKLSAgICBpZiAobnMyID09IG51bGwpIG5zMiA9ICIiOwotICAgIAotICAgIGlmIChuczEuZXF1YWxzKG5zMikpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0R2xvYmFsRWxlbWVudHMoKQotICB7Ci0gICAgTGlzdCBlbGVtZW50cyA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW0gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGVsZW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBpZiAoaXNTYW1lTmFtZXNwYWNlKGVsZW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZWxlbSk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldFR5cGVzKCkKLSAgewotICAgIExpc3QgYWxsVHlwZXMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGFsbFR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSAoWFNEVHlwZURlZmluaXRpb24paS5uZXh0KCk7Ci0gICAgICBpZiAodGQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdGQ7Ci0gICAgICAgIGlmIChpc1NhbWVOYW1lc3BhY2UoY3QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgCi0KLS8vICAgIExpc3Qgc2ltcGxlVHlwZXMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gYWxsVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IChYU0RUeXBlRGVmaW5pdGlvbilpLm5leHQoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil0ZDsKLSAgICAgICAgaWYgKGlzU2FtZU5hbWVzcGFjZShzdC5nZXRUYXJnZXROYW1lc3BhY2UoKSxzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0R3JvdXBzKCkKLSAgewotICAgIExpc3QgZ3JvdXBzID0gc2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncm91cHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBncm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbilpLm5leHQoKTsKLSAgICAgIGlmIChpc1NhbWVOYW1lc3BhY2UoZ3JvdXAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZ3JvdXApOwotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldERpcmVjdGl2ZXMoKQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKG8pOwotICAgICAgfQotICAgIH0gCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRBdHRyaWJ1dGVMaXN0KCkKLSAgewotICAgIExpc3QgYXR0cmlidXRlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pbzsKLSAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhdHRyLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoYXR0ci5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoaXNTYW1lTmFtZXNwYWNlKGF0dHIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzTGlzdC5hZGQoYXR0cik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc1NhbWVOYW1lc3BhY2UoYXR0ci5nZXRUYXJnZXROYW1lc3BhY2UoKSxzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhdHRyaWJ1dGVzTGlzdC5hZGQoYXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhdHRyaWJ1dGVzTGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE5vdGF0aW9ucygpCi0gIHsKLSAgICBMaXN0IG5vdGF0aW9ucyA9IHNjaGVtYS5nZXROb3RhdGlvbkRlY2xhcmF0aW9ucygpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub3RhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIG5vdGF0aW9uID0gKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24paS5uZXh0KCk7Ci0gICAgICBpZiAoaXNTYW1lTmFtZXNwYWNlKG5vdGF0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKG5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICAvLwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKE1vZGVsQWRhcHRlckxpc3RlbmVyIGwpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QuYWRkKGwpOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsKTsKLSAgfSAKLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICBMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbmV3TGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuZXdMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbCA9IChNb2RlbEFkYXB0ZXJMaXN0ZW5lcilpLm5leHQoKTsgICAgICAgICAgICAgICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBsLnByb3BlcnR5Q2hhbmdlZChtb2RlbE9iamVjdCwgcHJvcGVydHlOYW1lKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL01vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL01vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDY2OTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9tb2RlbC9Nb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxBZGFwdGVyCi17ICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENISUxEUkVOX1BST1BFUlRZID0gIkNISUxEUkVOX1BST1BFUlRZIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfUFJPUEVSVFkgPSAiTEFCRUxfUFJPUEVSVFkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9QUk9QRVJUWSA9ICJJTUFHRV9QUk9QRVJUWSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9QUk9QRVJUWSA9ICJERVRBSUxfUFJPUEVSVFkiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKE1vZGVsQWRhcHRlckxpc3RlbmVyIGwpOwotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsKTsKLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUpOyAKLSAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZ3JhcGgvbW9kZWwvTW9kZWxBZGFwdGVyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9tb2RlbC9Nb2RlbEFkYXB0ZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZlNGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9tb2RlbC9Nb2RlbEFkYXB0ZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLm1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL1hTRE1vZGVsQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9ncmFwaC9tb2RlbC9YU0RNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MWFlYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL1hTRE1vZGVsQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNEQ2hpbGRVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNEQWJzdHJhY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaDsKLQotCi0KLQotcHVibGljIGNsYXNzIFhTRE1vZGVsQWRhcHRlckZhY3RvcnkKLXsgIAotICBwcm90ZWN0ZWQgc3RhdGljIFhTRE1vZGVsQWRhcHRlckZhY3RvcnkgaW5zdGFuY2U7Ci0gIHByb3RlY3RlZCBzdGF0aWMgWFNEQWRhcHRlckZhY3RvcnlJbXBsIHhzZEFkYXB0ZXJGYWN0b3J5SW1wbCA9IG5ldyBYU0RBZGFwdGVyRmFjdG9yeUltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IFhTRE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgTW9kZWxBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IG8pCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE1vZGVsQWRhcHRlciByZXN1bHQgPSBudWxsOwotICAgIGlmIChvIGluc3RhbmNlb2YgTm90aWZpZXIpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBOb3RpZmllciB0YXJnZXQgPSAoTm90aWZpZXIpbzsKLQkJICBBZGFwdGVyIGFkYXB0ZXIgPSB4c2RBZGFwdGVyRmFjdG9yeUltcGwuYWRhcHQodGFyZ2V0KTsKLSAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgWFNET2JqZWN0QWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKFhTRE9iamVjdEFkYXB0ZXIpYWRhcHRlcjsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIE1vZGVsQWRhcHRlcikKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoTW9kZWxBZGFwdGVyKW87Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAgCi0gICAgCi0KLSAgcHVibGljIHN0YXRpYyBYU0RPYmplY3RBZGFwdGVyIGdldEV4aXNpdGluZ0FkYXB0ZXIoT2JqZWN0IHhzZE9iamVjdCkKLSAgeyAgCi0gICAgWFNET2JqZWN0QWRhcHRlciByZXN1bHQgPSBudWxsOwotICAgIGlmICh4c2RPYmplY3QgaW5zdGFuY2VvZiBOb3RpZmllcikKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIE5vdGlmaWVyIHRhcmdldCA9IChOb3RpZmllcil4c2RPYmplY3Q7Ci0JCSAgQWRhcHRlciBhZGFwdGVyID0gRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcih0YXJnZXQseHNkQWRhcHRlckZhY3RvcnlJbXBsKTsKLSAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgWFNET2JqZWN0QWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKFhTRE9iamVjdEFkYXB0ZXIpYWRhcHRlcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEQWRhcHRlckZhY3RvcnlJbXBsIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi0gIHsKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkKLSAgICB7Ci0gICAgICBYU0RTd2l0Y2ggeHNkU3dpdGNoID0gbmV3IFhTRFN3aXRjaCgpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hKFhTRFNjaGVtYSBvYmplY3QpIAotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RTY2hlbWFBZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSAKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNET2JqZWN0QWRhcHRlcigpOwotICAgICAgICB9ICAgICAgICAgCi0gICAgICB9OwotICAgICAgT2JqZWN0IG8gPSB4c2RTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQotICAgICAgQWRhcHRlciByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgICAgewotICAgICAgICByZXN1bHQgID0gKEFkYXB0ZXIpbzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkaWQgbm90IGNyZWF0ZSBhZGFwdGVyIGZvciB0YXJnZXQgOiAiICsgdGFyZ2V0KTsKLS8vICAgICAgICBUaHJlYWQuZHVtcFN0YWNrKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCkKLSAgICB7Ci0gICAgICByZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLSAgICB9Ci0gIH0KLSAgICAKLQotIAotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFhTRE9iamVjdEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlcgotICB7ICAgCi0gICAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IHhzZEFkYXB0ZXJGYWN0b3J5SW1wbDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTW9kZWxBZGFwdGVyTGlzdGVuZXIgbCkKLSAgICB7Ci0gICAgICBsaXN0ZW5lckxpc3QuYWRkKGwpOwotICAgIH0gIAotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTW9kZWxBZGFwdGVyTGlzdGVuZXIgbCkKLSAgICB7Ci0gICAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGwpOwotICAgIH0gCi0gICAgICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoTW9kZWxBZGFwdGVyLkxBQkVMX1BST1BFUlRZLmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotICAgICAgewotICAgICAgCXJlc3VsdCA9ICIiOwotICAgICAgCS8vIFRPRE8uLi4gbW92ZSB0aGlzIGxvZ2ljIGludG8gZWFjaCBhZGFwdGVyCi0gICAgICAJLy8KLSAgICAgICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgIAkgIHJlc3VsdCA9ICgoWFNETmFtZWRDb21wb25lbnQpbW9kZWxPYmplY3QpLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgICAgewotICAgICAgIAkgIHJlc3VsdCA9ICgoWFNEU2NoZW1hRGlyZWN0aXZlKW1vZGVsT2JqZWN0KS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gIigiICsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX05PX0xPQ0FUSU9OX1NQRUNJRklFRCIpICsgIikiOwotICAgICAgICAgIGlmIChyZXN1bHQuZXF1YWxzKCIiKSkgcmVzdWx0ID0gIigiICsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX05PX0xPQ0FUSU9OX1NQRUNJRklFRCIpICsgIikiOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCJkcmlsbERvd24iLmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotICAgICAgewotICAgICAgCS8vIFRPRE8uLi4gbW92ZSB0aGlzIGxvZ2ljIGludG8gZWFjaCBhZGFwdGVyCi0gICAgICAJLy8gICAKLSAgICAgIAlMaXN0IGxpc3QgPSBYU0RDaGlsZFV0aWxpdHkuZ2V0TW9kZWxDaGlsZHJlbihtb2RlbE9iamVjdCk7CQotICAgICAgCXJlc3VsdCA9IGxpc3Quc2l6ZSgpID4gMCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7ICAgICAgCSAgIAotICAgICAgfSAgICAgIAotICAgICAgZWxzZSBpZiAoTW9kZWxBZGFwdGVyLklNQUdFX1BST1BFUlRZLmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotICAgICAgewotICAgICAgCS8vIHJlc3VsdCA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIik7Ci0gICAgICAgIFhTRE1vZGVsQWRhcHRlckZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwoKTsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gZmFjdG9yeS5jcmVhdGVBZGFwdGVyKChOb3RpZmllciltb2RlbE9iamVjdCk7Ci0gICAgICAgIHJlc3VsdCA9ICgoWFNEQWJzdHJhY3RBZGFwdGVyKWFkYXB0ZXIpLmdldEltYWdlKG1vZGVsT2JqZWN0KTsKLSAgICAgIH0JCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIExpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIG5ld0xpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuZXdMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE1vZGVsQWRhcHRlckxpc3RlbmVyIGwgPSAoTW9kZWxBZGFwdGVyTGlzdGVuZXIpaS5uZXh0KCk7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgbC5wcm9wZXJ0eUNoYW5nZWQobW9kZWxPYmplY3QsIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7ICAgICAgICAKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQobXNnLmdldE5vdGlmaWVyKCksIG51bGwpOwotICAgIH0gICAgIAotICB9Ci0gICAgICAgCi0KLSAgICAgCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIFhTRE9iamVjdEFkYXB0ZXIgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotICB7Ci0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZDsKLSAgICBwcm90ZWN0ZWQgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb247ICAgICAgICAgIAotCi0gICAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoWFNERWxlbWVudERlY2xhcmF0aW9uIGVkKQotICAgIHsKLSAgICAgIHRoaXMuZWQgPSBlZDsKLSAgICAgIHVwZGF0ZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfSAKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUeXBlRGVmaW5pdGlvbigpCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSBlZC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgdGQgPSAodGQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pID8gdGQgOiBudWxsOwotICAgICAgaWYgKHRkICE9IHR5cGVEZWZpbml0aW9uKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRE9iamVjdEFkYXB0ZXIgYWRhcHRlciA9IChYU0RPYmplY3RBZGFwdGVyKXhzZEFkYXB0ZXJGYWN0b3J5SW1wbC5hZGFwdCh0eXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgYWRhcHRlci5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICB0eXBlRGVmaW5pdGlvbiA9IHRkOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRE9iamVjdEFkYXB0ZXIgYWRhcHRlciA9IChYU0RPYmplY3RBZGFwdGVyKXhzZEFkYXB0ZXJGYWN0b3J5SW1wbC5hZGFwdCh0eXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgYWRhcHRlci5hZGRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gCi0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7Ci0gICAgICB1cGRhdGVUeXBlRGVmaW5pdGlvbigpOyAgICAKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQobXNnLmdldE5vdGlmaWVyKCksIG51bGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfSAKLQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy8gaGVyZSB3ZSBwcm9wYWdhdGUgdHlwZURlZmluaXRpb24gY2hhbmdlcyB0byBvdXIgbGlzdGVuZXJzCi0gICAgICBmaXJlUHJvcGVydHlDaGFuZ2VkKG9iamVjdCwgcHJvcGVydHkpOwotICAgIH0KLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBYU0RTY2hlbWFBZGFwdGVyIGV4dGVuZHMgWFNET2JqZWN0QWRhcHRlcgotICB7IAotICAgIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICAgIHByb3RlY3RlZCBMaXN0IGdyb3VwczsgICAgICAgICAgICAKLQotICAgIHB1YmxpYyBYU0RTY2hlbWFBZGFwdGVyKFhTRFNjaGVtYSBzY2hlbWEpCi0gICAgewotICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBzID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBzLmFkZChuZXcgQ2F0ZWdvcnkoc2NoZW1hLCBDYXRlZ29yeS5ESVJFQ1RJVkVTKSk7Ci0gICAgICBncm91cHMuYWRkKG5ldyBDYXRlZ29yeShzY2hlbWEsIENhdGVnb3J5LkFUVFJJQlVURVMpKTsgCi0gICAgICAvL2dyb3Vwcy5hZGQobmV3IENhdGVnb3J5KHNjaGVtYSwgQ2F0ZWdvcnkuQVRUUklCVVRFX0dST1VQUykpOwotICAgICAgZ3JvdXBzLmFkZChuZXcgQ2F0ZWdvcnkoc2NoZW1hLCBDYXRlZ29yeS5FTEVNRU5UUykpOwotICAgICAgZ3JvdXBzLmFkZChuZXcgQ2F0ZWdvcnkoc2NoZW1hLCBDYXRlZ29yeS5UWVBFUykpOwotICAgICAgLy9ncm91cHMuYWRkKG5ldyBDYXRlZ29yeShzY2hlbWEsIENhdGVnb3J5LlNJTVBMRV9UWVBFUykpOwotICAgICAgZ3JvdXBzLmFkZChuZXcgQ2F0ZWdvcnkoc2NoZW1hLCBDYXRlZ29yeS5HUk9VUFMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gICAgewotICAgICAgc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ3JvdXBzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE1vZGVsQWRhcHRlciBncm91cCA9IChNb2RlbEFkYXB0ZXIpaS5uZXh0KCk7Ci0gICAgICAgIGdyb3VwLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZ3JvdXAsIG51bGwpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKCJncm91cHMiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotICAgICAgeyAKLSAgICAgICAgLyoKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncm91cHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIENhdGVnb3J5IGdyb3VwID0gKENhdGVnb3J5KWkubmV4dCgpOwotICAgICAgICAgIGlmIChncm91cC5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgbGlzdC5hZGQoZ3JvdXApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSBsaXN0OyovCi0gICAgICAgIHJlc3VsdCA9IGdyb3VwczsKLSAgICAgIH0gICAgICAKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkobW9kZWxPYmplY3QsIHByb3BlcnR5TmFtZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gZ2V0TW9kZWxBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgbW9kZWxBZGFwdGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0gICAgCi0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gZ2V0TW9kZWxBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgbW9kZWxBZGFwdGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0gICAKLQotICBwcm90ZWN0ZWQgc3RhdGljIE1vZGVsQWRhcHRlciBnZXRNb2RlbEFkYXB0ZXIoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE5vdGlmaWVyKQotICAgIHsKLSAgICAgIG1vZGVsQWRhcHRlciA9IChNb2RlbEFkYXB0ZXIpeHNkQWRhcHRlckZhY3RvcnlJbXBsLmFkYXB0KChOb3RpZmllciltb2RlbE9iamVjdCk7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE1vZGVsQWRhcHRlcikKLSAgICB7Ci0gICAgICBtb2RlbEFkYXB0ZXIgPSAoTW9kZWxBZGFwdGVyKW1vZGVsT2JqZWN0OwotICAgIH0gCi0gICAgcmV0dXJuIG1vZGVsQWRhcHRlcjsKLSAgfSAgICAgIAotfQotICAgIAotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB0b2RvLi4uIHJldmlzdCB0aGlzIHN0dWZmCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlVHlwZUNoYW5nZShYU0RUeXBlRGVmaW5pdGlvbiB0ZCwgWFNEU2NoZW1hIHNjaGVtYSwgaW50IGNoYW5nZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIFR5cGVGaW5kaW5nU2NoZW1hVmlzaXRvciB2aXNpdG9yID0gbmV3IFR5cGVGaW5kaW5nU2NoZW1hVmlzaXRvcihzY2hlbWEsIHRkLCBjaGFuZ2UgPT0gTm90aWZpY2F0aW9uLkFERCk7Ci0gICAgICBMaXN0IGxpc3QgPSB2aXNpdG9yLmZpbmRFbGVtZW50c1VzaW5nVHlwZShzY2hlbWEpOyAgICAgICAgICAKLSAgICAgIAotICAgICAgaWYgKGNoYW5nZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKSAgICAgICAgICAKLSAgICAgIHsKLSAgICAgICAgdmlzaXRvci5yZW1vdmVNYXRjaGluZ1JlZmVyZW5jZXMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoYW5nZSA9PSBOb3RpZmljYXRpb24uQUREKSAgICAgICAgICAKLSAgICAgIHsKLSAgICAgICAgdmlzaXRvci5zZXRNYXRjaGluZ1JlZmVyZW5jZXMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdmlzaXRvci5jbGVhblVwVHlwZU1pc21hdGNoZXMoKTsgICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7ICAKLSAgICAgICAgWFNET2JqZWN0QWRhcHRlciBhZGFwdGVyID0gZ2V0RXhpc2l0aW5nQWRhcHRlcihvKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgeyAKLSAgICAgICAgICBhZGFwdGVyLmZpcmVDaGlsZHJlbkNoYW5nZWROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0gICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUeXBlRmluZGluZ1NjaGVtYVZpc2l0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueHNkLnV0aWxpdHkuWFNEVmlzaXRvcgotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIHRkOwotICAgIHByb3RlY3RlZCBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgCi0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIG1hdGNoQnlOYW1lOwotCi0gICAgcHVibGljIFR5cGVGaW5kaW5nU2NoZW1hVmlzaXRvcihYU0RTY2hlbWEgc2NoZW1hLCBYU0RUeXBlRGVmaW5pdGlvbiB0ZCwgYm9vbGVhbiBtYXRjaEJ5TmFtZSkKLSAgICB7Ci0gICAgICB0aGlzLnRkID0gdGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICAgIHRoaXMubWF0Y2hCeU5hbWUgPSBtYXRjaEJ5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChlZC5nZXRUeXBlRGVmaW5pdGlvbigpID09IHRkKQotICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgbGlzdC5hZGQoZWQpOyAgICAgICAgCi0gICAgICB9ICAKLSAgICAgIGVsc2UgaWYgKG1hdGNoQnlOYW1lKQotICAgICAgeyAgICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gbmFtZSA9IGdldERPTU5hbWUoZWQpOwotICAgICAgICBpZiAobmFtZVswXS5lcXVhbHModGQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIG5hbWVbMV0uZXF1YWxzKHRkLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChlZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IAotCi0gICAgcHVibGljIExpc3QgZmluZEVsZW1lbnRzVXNpbmdUeXBlKFhTRFNjaGVtYSBzY2hlbWEpCi0gICAgewotICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0U2NoZW1hKHNjaGVtYSk7Ci0gICAgICB9ICAgIAotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIExpc3QgZ2V0TWF0Y2hpbmdUeXBlTGlzdCgpCi0gICAgewotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAKLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRET01OYW1lKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7ICAgICAgCi0gICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBkb21FbGVtZW50ID0gZWQuZ2V0RWxlbWVudCgpOwotICAgICAgU3RyaW5nIHR5cGVOYW1lID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLSAgICAgIGlmICh0eXBlTmFtZSAhPSBudWxsICYmICF0eXBlTmFtZS5lbmRzV2l0aCh0ZC5nZXROYW1lKCkpKQotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgaW50IGluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZigiOiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSBpbmRleCA9PSAtMSA/ICIiIDogdHlwZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsgICAKLSAgICAgICAgcmVzdWx0WzBdID0gKFN0cmluZylzY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpLmdldChwcmVmaXgpOwotICAgICAgICBpZiAocmVzdWx0WzBdID09IG51bGwpIHJlc3VsdFswXSA9ICIiOwotICAgICAgICBpZiAocmVzdWx0WzFdID09IG51bGwpIHJlc3VsdFsxXSA9ICIiOwotICAgICAgICByZXN1bHRbMV0gPSBpbmRleCA9PSAtMSA/IHR5cGVOYW1lIDogdHlwZU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0WzBdID0gIiI7Ci0gICAgICAgIHJlc3VsdFsxXSA9ICIiOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgY2xlYW5VcFR5cGVNaXNtYXRjaGVzKCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24paS5uZXh0KCk7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGNhbmRpZGF0ZVRkID0gZWQuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZVRkICE9IG51bGwgJiYgY2FuZGlkYXRlVGQuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBnZXRET01OYW1lKGVkKTsKLSAgICAgICAgICBlZC5zZXRUeXBlRGVmaW5pdGlvbigoWFNEVHlwZURlZmluaXRpb24pc2NoZW1hLnJlc29sdmVDb21wbGV4VHlwZURlZmluaXRpb24ocmVzdWx0WzBdLCByZXN1bHRbMV0pKTsgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVNYXRjaGluZ1JlZmVyZW5jZXMoKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gZ2V0RE9NTmFtZShlZCk7ICAgICAgICAgIAotICAgICAgICBpZiAoZWQuZ2V0RWxlbWVudCgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBOT1RFIC4uLiB0aGlzIGZvcmNlcyB0aGUgbW9kZWwgdG8gcmVzZXQgdGhlIGVkJ3MgWFNEVHlwZURlZmluaXRpb24gd2l0aG91dCBjYXVzaW5nIHRoZQotICAgICAgICAgIC8vIERPTSBlbGVtZW50J3MgJ3R5cGUnIGF0dHJpYnV0ZSB0byBiZSBzZXQgdG8gbnVsbAotICAgICAgICAgIGVkLmVsZW1lbnRBdHRyaWJ1dGVzQ2hhbmdlZChlZC5nZXRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE1hdGNoaW5nUmVmZXJlbmNlcygpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgICBlZC5zZXRUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfSAqLyAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL0dlbmVyYXRlRHRkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9HZW5lcmF0ZUR0ZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNThjMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL0dlbmVyYXRlRHRkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9HZW5lcmF0ZUphdmEuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL0dlbmVyYXRlSmF2YS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNzVjNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL0dlbmVyYXRlSmF2YS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvR3JhcGhWaWV3RWxlbWVudFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvR3JhcGhWaWV3RWxlbWVudFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MzVkYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL0dyYXBoVmlld0VsZW1lbnRSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL05ld1hTRC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvTmV3WFNELmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmNjczMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvTmV3WFNELmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9SZWdleFdpemFyZEFycm93LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9SZWdleFdpemFyZEFycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1NTBhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvUmVnZXhXaXphcmRBcnJvdy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvVmFsaWRhdGVYU0QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1ZhbGlkYXRlWFNELmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNDdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvVmFsaWRhdGVYU0QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREFsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3NGU4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBbm5vdGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQW5ub3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEwOGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBbm5vdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQW55LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzlmOTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREFueUF0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4MGNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBcHBJbmZvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBcHBJbmZvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhMDAxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQXBwSW5mby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ0OWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODQ2MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlmYThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQXR0cmlidXRlUmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzY1YWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRENob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQ2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliYTgyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQ2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RDb21wbGV4Q29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQ29tcGxleENvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWM2OGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RDb21wbGV4Q29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRENvbXBsZXhUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3Zjg1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRERvYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNERG9jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0OWEwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNERG9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RFbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNERWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNERWxlbWVudFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNERWxlbWVudFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWFjZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREVsZW1lbnRSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREV4dGVuc2lvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNERXh0ZW5zaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmYjgwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNERXh0ZW5zaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RGaWVsZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNERmllbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzhlNDNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RGaWVsZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDBmMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNER2xvYmFsQXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNDlkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNER2xvYmFsQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RHbG9iYWxFbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RHbG9iYWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNER2xvYmFsRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNER3JvdXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1ZWY1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNER3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREdyb3VwUmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MjEzNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREdyb3VwUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RJbXBvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREltcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDRjZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREltcG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNESW5jbHVkZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNESW5jbHVkZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmM1MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREluY2x1ZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREtleS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNES2V5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwMzJhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNES2V5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RLZXlSZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREtleVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNTgyOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTREtleVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNETm90YXRpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRE5vdGF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5ZGY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNETm90YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRFJlZGVmaW5lLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RSZWRlZmluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTY0YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRFJlZGVmaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RTZWxlY3Rvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2VsZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzk5YTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RTZWxlY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRFNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmM2Y5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRFNpbXBsZUNvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRFNpbXBsZUNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWYzOGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RTaW1wbGVDb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RTaW1wbGVFbnVtLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RTaW1wbGVFbnVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNzk1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2ltcGxlRW51bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2ltcGxlTGlzdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2ltcGxlTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOGU3OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRFNpbXBsZUxpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRFNpbXBsZVBhdHRlcm4uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRFNpbXBsZVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTEzY2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RTaW1wbGVQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RTaW1wbGVSZXN0cmljdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2ltcGxlUmVzdHJpY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGJjMTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RTaW1wbGVSZXN0cmljdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjMzYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRFNpbXBsZVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL1hTRFNpbXBsZVR5cGVGb3JFZGl0UGFydC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2ltcGxlVHlwZUZvckVkaXRQYXJ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlZmViMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2ltcGxlVHlwZUZvckVkaXRQYXJ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RTaW1wbGVVbmlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEU2ltcGxlVW5pb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTJhZGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RTaW1wbGVVbmlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvWFNEVW5pcXVlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RVbmlxdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YThhNjUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9YU0RVbmlxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL2JhY2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL2JhY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQxYTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9icm93c2VidXR0b24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGFlNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvZm9yd2FyZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjY5OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL2ZvcndhcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL2dlbmVyYXRlX3htbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvZ2VuZXJhdGVfeG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlMzYzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvZ2VuZXJhdGVfeG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9yZWd4X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvcmVneF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODlkMTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9yZWd4X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDVkYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL3JlbG9hZGdyYW1tYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2ljb25zL3NvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzY1ZGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9pY29ucy9zb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDY3OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci0KLXB1YmxpYyBjbGFzcyBYU0RQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBMaXN0ZW5lciAKLXsKLSAgVGV4dCBpbmRlbnRUZXh0RmllbGQ7Ci0gIFN0cmluZyBpbmRlbnRTdHJpbmc7Ci0gIFRleHQgc2NoZW1hTnNQcmVmaXhGaWVsZDsKLSAgVGV4dCBkZWZhdWx0VGFyZ2V0TmFtZXNwYWNlVGV4dDsKLSAgQnV0dG9uIHF1YWxpZnlYU0RMYW5ndWFnZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAocGFyZW50LCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTRFBfUFJFRkVSRU5DRV9QQUdFKTsKLQotICAgIEdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsgICAKLSAgICBncm91cC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9URVhUX1hTRF9OQU1FU1BBQ0VfUFJFRklYIikpOwotCi0gICAgcXVhbGlmeVhTRExhbmd1YWdlID0gVmlld1V0aWxpdHkuY3JlYXRlQ2hlY2tCb3goZ3JvdXAsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9RVUFMSUZZX1hTRCIpKTsKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChncm91cCwgIiAiKTsKLQotICAgIGNyZWF0ZUxhYmVsKGdyb3VwLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVEVYVF9YU0RfREVGQVVMVF9QUkVGSVgiKSk7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZCA9IGNyZWF0ZVRleHRGaWVsZChncm91cCk7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgICAgewotICAgICAgICBzZXRWYWxpZCh0cnVlKTsKLSAgICAgIH0gICAgICAKLSAgICB9KTsKLSAgICAKLSAgICBjcmVhdGVMYWJlbChncm91cCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RFWFRfWFNEX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSIpKTsKLSAgICBkZWZhdWx0VGFyZ2V0TmFtZXNwYWNlVGV4dCA9IGNyZWF0ZVRleHRGaWVsZChncm91cCk7Ci0KLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0KLSAgICByZXR1cm4gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgfQotCi0gIHByaXZhdGUgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIAotICB7Ci0gICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIHJldHVybiBncm91cDsKLSAgfQotCi0gIHByaXZhdGUgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICByZXR1cm4gdGV4dDsKLSAgfQotCi0gIHByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIAotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICAKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0gIAotICAvKioKLSAgICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIAotICB7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0gICAgY2hlY2tWYWx1ZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSAKLSAgewotICAgIGlmIChjaGVja1ZhbHVlcygpKQotICAgIHsKLSAgICAgIHN0b3JlVmFsdWVzKCk7ICAgIAotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpCi0gIHsKLSAgICBpZiAoY2hlY2tWYWx1ZXMoKSkKLSAgICB7Ci0gICAgICBzdG9yZVZhbHVlcygpOyAgICAKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSGFuZGxlcyBldmVudHMgZ2VuZXJhdGVkIGJ5IGNvbnRyb2xzIG9uIHRoaXMgcGFnZS4KLSAgICogICBAcGFyYW0gZSAgdGhlIGV2ZW50IHRvIGhhbmRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgCi0gIHsKLSAgICBXaWRnZXQgc291cmNlID0gZS53aWRnZXQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0gIHsgCi0gIH0KLQotICAvKiogCi0gICAqIFRoZSBpbmRlbnQgaXMgc3RvcmVkIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFzc29jaWF0ZWQgd2l0aCB0aGUgWE1MIFNjaGVtYSBNb2RlbAotICAgKi8KLSAgcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLSAgewotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyB1c2luZyBkZWZhdWx0IHZhbHVlcwotICAgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKSAKLSAgewotICAgIHNjaGVtYU5zUHJlZml4RmllbGQuc2V0VGV4dChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0U3RyaW5nKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCkpOwotICAgIHF1YWxpZnlYU0RMYW5ndWFnZS5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWFNERWRpdG9yUGx1Z2luLkNPTlNUX1hTRF9MQU5HVUFHRV9RVUFMSUZZKSk7Ci0gICAgZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWFNERWRpdG9yUGx1Z2luLkNPTlNUX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgCi0gIHsKLSAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZC5zZXRUZXh0KHN0b3JlLmdldFN0cmluZyhYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0RFRkFVTFRfUFJFRklYX1RFWFQpKTsKLSAgICBxdWFsaWZ5WFNETGFuZ3VhZ2Uuc2V0U2VsZWN0aW9uKHN0b3JlLmdldEJvb2xlYW4oWFNERWRpdG9yUGx1Z2luLkNPTlNUX1hTRF9MQU5HVUFHRV9RVUFMSUZZKSk7Ci0gICAgZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dChzdG9yZS5nZXRTdHJpbmcoWFNERWRpdG9yUGx1Z2luLkNPTlNUX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgCi0gIHsKLSAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICBzdG9yZS5zZXRWYWx1ZShYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0RFRkFVTFRfUFJFRklYX1RFWFQsIGdldFhNTFNjaGVtYVByZWZpeCgpKTsKLSAgICBzdG9yZS5zZXRWYWx1ZShYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlksIGdldFF1YWxpZnkoKSk7Ci0gICAgc3RvcmUuc2V0VmFsdWUoWFNERWRpdG9yUGx1Z2luLkNPTlNUX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSwgZ2V0WE1MU2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCkpOwotCi0gICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRYTUxTY2hlbWFQcmVmaXgoKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IHNjaGVtYU5zUHJlZml4RmllbGQuZ2V0VGV4dCgpOwotICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXguZXF1YWxzKCIiKSkgCi0gICAgewotICAgICAgcmV0dXJuICJ4c2QiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0UXVhbGlmeSgpCi0gIHsKLSAgICByZXR1cm4gcXVhbGlmeVhTRExhbmd1YWdlLmdldFNlbGVjdGlvbigpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSB4bWwgc2NoZW1hIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRYTUxTY2hlbWFUYXJnZXROYW1lc3BhY2UoKQotICB7Ci0gIAlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpOwotICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCB8fCB0YXJnZXROYW1lc3BhY2UuZXF1YWxzKCIiKSkgCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0U7Ci0gICAgfQotICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNoZWNrVmFsdWVzKCkKLSAgewotLy8gS0NQb3J0IFRPRE8gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IFZhbGlkYXRlSGVscGVyLmNoZWNrWE1MTmFtZShzY2hlbWFOc1ByZWZpeEZpZWxkLmdldFRleHQoKSk7Ci0JIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCi0gICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIHNldFZhbGlkKHRydWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX0xBQkVMX0lOVkFMSURfUFJFRklYIikpOwotICAgICAgc2V0VmFsaWQoZmFsc2UpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQW55QXR0cmlidXRlUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0FueUF0dHJpYnV0ZVByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNGU3ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQW55QXR0cmlidXRlUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgQW55QXR0cmlidXRlUHJvcGVydHlTb3VyY2UgZXh0ZW5kcyBCYXNlUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UKLXsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBuYW1lc3BhY2VDb21ib1ZhbHVlcyA9IHsKLSAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICIjI2FueSIsCi0gICAgICAgICAgICAgICIjI290aGVyIiwKLSAgICAgICAgICAgICAgIiMjdGFyZ2V0TmFtZXNwYWNlIiwKLSAgICAgICAgICAgICAgIiMjbG9jYWwiCi0gIH07Ci0gIAotICBwcml2YXRlIFN0cmluZ1tdIHByb2Nlc3NDb250ZW50c0NvbWJvVmFsdWVzID0gewotICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTUJPX0xBWCIpLAotICAgICAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ09NQk9fU0tJUCIpLAotICAgICAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ09NQk9fU1RSSUNUIikKLSAgfTsKLSAgcHVibGljIEFueUF0dHJpYnV0ZVByb3BlcnR5U291cmNlKCkKLSAgewotICB9Ci0KLSAgcHVibGljIEFueUF0dHJpYnV0ZVByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBBbnlBdHRyaWJ1dGVQcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIodmlld2VyLCB4c2RTY2hlbWEpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZSgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgbmFtZXNwYWNlRGVzY3JpcHRvciA9IG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFLAotICAgICAgICBuYW1lc3BhY2VDb21ib1ZhbHVlcyk7Ci0gICAgbGlzdC5hZGQobmFtZXNwYWNlRGVzY3JpcHRvcik7Ci0gICAgCi0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgcHJvY2Vzc0NvbnRlbnRzRGVzY3JpcHRvciA9IG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLlBST0NFU1NDT05URU5UU19BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5QUk9DRVNTQ09OVEVOVFNfQVRUUklCVVRFLAotICAgICAgICBwcm9jZXNzQ29udGVudHNDb21ib1ZhbHVlcyk7Ci0gICAgbGlzdC5hZGQocHJvY2Vzc0NvbnRlbnRzRGVzY3JpcHRvcik7Ci0gICAgCi0gICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAiIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0KGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgdmFsdWUgPSAiIjsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKXZhbHVlOwotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTkFNRVNQQUNFX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsICYmIG5hbWVzcGFjZS5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSwgbmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlBST0NFU1NDT05URU5UU19BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcHJvY2Vzc0NvbnRlbnRzID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1BST0NFU1NDT05URU5UU19DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmIChwcm9jZXNzQ29udGVudHMgIT0gbnVsbCAmJiBwcm9jZXNzQ29udGVudHMubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlBST0NFU1NDT05URU5UU19BVFRSSUJVVEUsIHByb2Nlc3NDb250ZW50cyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlBST0NFU1NDT05URU5UU19BVFRSSUJVVEUpOwotICAgICAgICB9Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0KLSAgfQotCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQW55Q29udGVudFByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQW55Q29udGVudFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTFlZjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0FueUNvbnRlbnRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRpYWxvZ0NlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvckNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQW55Q29udGVudFByb3BlcnR5RGVzY3JpcHRvciBleHRlbmRzIFByb3BlcnR5RGVzY3JpcHRvcgotewotICBFbGVtZW50IGVsZW1lbnQ7Ci0gIC8qKgotICAgKiBAcGFyYW0gaWQKLSAgICogQHBhcmFtIGRpc3BsYXlOYW1lCi0gICAqLwotICBwdWJsaWMgQW55Q29udGVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgc3VwZXIoaWQsIGRpc3BsYXlOYW1lKTsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci0gIAotICBwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgQW55Q29udGVudERpYWxvZ0NlbGxFZGl0b3IocGFyZW50KTsKLSAgICBpZiAoZ2V0VmFsaWRhdG9yKCkgIT0gbnVsbCkKLSAgICAgIGVkaXRvci5zZXRWYWxpZGF0b3IoZ2V0VmFsaWRhdG9yKCkpOwotICAgIHJldHVybiBlZGl0b3I7Ci0gIH0KLQotICBwdWJsaWMgY2xhc3MgQW55Q29udGVudERpYWxvZ0NlbGxFZGl0b3IgZXh0ZW5kcyBEaWFsb2dDZWxsRWRpdG9yIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgRm9udCBkaWFsb2cgY2VsbCBlZGl0b3IgcGFyZW50ZWQgdW5kZXIgdGhlIGdpdmVuIGNvbnRyb2wuCi0gICAgICogVGhlIGNlbGwgZWRpdG9yIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGluaXRpYWxseSwgYW5kIGhhcyBubyAKLSAgICAgKiB2YWxpZGF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBBbnlDb250ZW50RGlhbG9nQ2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICBzdXBlcihwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EaWFsb2dDZWxsRWRpdG9yI29wZW5EaWFsb2dCb3goQ29udHJvbCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9wZW5EaWFsb2dCb3goQ29udHJvbCBjZWxsRWRpdG9yV2luZG93KQotICAgIHsKLSAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgIAotICAgICAgQW55Q29udGVudERpYWxvZyBkaWFsb2cgPSBuZXcgQW55Q29udGVudERpYWxvZyhzaGVsbCk7Ci0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpZ2V0VmFsdWUoKTsKLQotICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICByZXR1cm4gZGlhbG9nLmdldENvbW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyBjbGFzcyBBbnlDb250ZW50RGlhbG9nIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cKLSAgewotICAgIHByb3RlY3RlZCBUZXh0IGNvbW1lbnRGaWVsZDsKLSAgICBwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uLCBjYW5jZWxCdXR0b247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudDsKLSAgICAKLSAgICBwdWJsaWMgQW55Q29udGVudERpYWxvZyhTaGVsbCBzaGVsbCkKLSAgICB7Ci0gICAgICBzdXBlcihzaGVsbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpCi0gICAgewotICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKQotICAgIHsKLSAgICAgIGlmIChidXR0b25JZCA9PSBEaWFsb2cuT0spCi0gICAgICB7Ci0gICAgICAgIGNvbW1lbnQgPSBjb21tZW50RmllbGQuZ2V0VGV4dCgpOwotICAgICAgfQotICAgICAgc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeyByZXR1cm4gY29tbWVudDsgfQotCi0gICAgLy8KLSAgICAvLyBDcmVhdGUgdGhlIGNvbnRyb2xzCi0gICAgLy8KLSAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgaW50IHRhYkluZGV4ID0gMDsKLSAgICAgIENvbXBvc2l0ZSBjbGllbnQgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgIGdldFNoZWxsKCkuc2V0VGV4dCgiQ29udGVudCBmb3IgIiArIGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgCi0gICAgICBjb21tZW50RmllbGQgPSBWaWV3VXRpbGl0eS5jcmVhdGVNdWx0aVRleHRGaWVsZChjbGllbnQsIDQwMCwgMjAwLCB0cnVlKTsKLSAgICAgIAotICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbW1lbnRGaWVsZCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0FOTk9UQVRJT05fQ09NTUVOVCk7Ci0gICAgICBjb21tZW50RmllbGQuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfQ09NTUVOVCIpKTsKLQotICAgICAgU3RyaW5nIGluaXRpYWxTdHJpbmcgPSAoU3RyaW5nKWdldEluaXRpYWxDb250ZW50KCk7Ci0gICAgICBjb21tZW50RmllbGQuc2V0VGV4dChpbml0aWFsU3RyaW5nKTsKLSAgICAgIHJldHVybiBjbGllbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0SW5pdGlhbENvbnRlbnQoKQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKGVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKQotICAgICAgIHsKLSAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgVGV4dAotICAgICAgICBOb2RlIG5vZGUgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKQotICAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICgoQ2hhcmFjdGVyRGF0YSlub2RlKS5nZXREYXRhKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0FueUVsZW1lbnRQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQW55RWxlbWVudFByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDM2MzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQW55RWxlbWVudFByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLQotcHVibGljIGNsYXNzIEFueUVsZW1lbnRQcm9wZXJ0eVNvdXJjZQotICBleHRlbmRzIEJhc2VQcm9wZXJ0eVNvdXJjZQotICBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotCi0gIHByaXZhdGUgU3RyaW5nW10gbmFtZXNwYWNlQ29tYm9WYWx1ZXMgPSB7Ci0gICAgICAgICIiLAotICAgICAgICAiIyNhbnkiLAotICAgICAgICAiIyNvdGhlciIsCi0gICAgICAgICIjI3RhcmdldE5hbWVzcGFjZSIsCi0gICAgICAgICIjI2xvY2FsIgotICB9OwotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBwcm9jZXNzQ29udGVudHNDb21ib1ZhbHVlcyA9IHsKLSAgICAgIiIsCi0gICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9DT01CT19MQVgiKSwKLSAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTUJPX1NLSVAiKSwKLSAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTUJPX1NUUklDVCIpCi0gIH07Ci0gIAotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQW55RWxlbWVudFByb3BlcnR5U291cmNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB2aWV3ZXIKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIEFueUVsZW1lbnRQcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIodmlld2VyLCB4c2RTY2hlbWEpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgQW55RWxlbWVudFByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgbmFtZXNwYWNlRGVzY3JpcHRvciA9IG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFLAotICAgICAgICBuYW1lc3BhY2VDb21ib1ZhbHVlcyk7Ci0gICAgbGlzdC5hZGQobmFtZXNwYWNlRGVzY3JpcHRvcik7Ci0gICAgCi0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgcHJvY2Vzc0NvbnRlbnRzRGVzY3JpcHRvciA9IG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLlBST0NFU1NDT05URU5UU19BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5QUk9DRVNTQ09OVEVOVFNfQVRUUklCVVRFLAotICAgICAgICBwcm9jZXNzQ29udGVudHNDb21ib1ZhbHVlcyk7Ci0gICAgbGlzdC5hZGQocHJvY2Vzc0NvbnRlbnRzRGVzY3JpcHRvcik7Ci0KLS8vIFRoZXNlIGFyZSBtb3ZlZCB0byB0aGUgdGFiYmVkIHByb3BlcnRpZXMgZ2VuZXJhbCBzZWN0aW9uICAgICAKLS8vICAgIFByb3BlcnR5RGVzY3JpcHRvciBtaW5PY2N1cnNEZXNjcmlwdG9yID0KLS8vICAgIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotLy8gICAgICAgIFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFLAotLy8gICAgICAgIFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLS8vICAgIGxpc3QuYWRkKG1pbk9jY3Vyc0Rlc2NyaXB0b3IpOwotLy8gICAgUHJvcGVydHlEZXNjcmlwdG9yIG1heE9jY3Vyc0Rlc2NyaXB0b3IgPQotLy8gICAgbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoCi0vLyAgICAgICAgWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUsCi0vLyAgICAgICAgWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpOwotLy8gICAgbGlzdC5hZGQobWF4T2NjdXJzRGVzY3JpcHRvcik7Ci0gICAgCi0gICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotCi0vLyAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpCi0vLyAgICAgICB7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlBST0NFU1NDT05URU5UU19BVFRSSUJVVEUpKQotLy8gICAgICAgewotLy8gICAgICB9ICAgICAgCi0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgIHsKLSAgICAgIHZhbHVlID0gIiI7Ci0gICAgfQotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbWF4ID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgICAgU3RyaW5nIG1pbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX01BWE9DQ1VSU19DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmIChtYXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUsIG1heCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgICB9Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG1pbiA9IChTdHJpbmcpdmFsdWU7Ci0gICAgICAgIFN0cmluZyBtYXggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9NSU5PQ0NVUlNfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICBpZiAobWluLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFLCBtaW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgICAgfQotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKXZhbHVlOwotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTkFNRVNQQUNFX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZS5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSwgbmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlBST0NFU1NDT05URU5UU19BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcHJvY2Vzc0NvbnRlbnRzID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1BST0NFU1NDT05URU5UU19DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmIChwcm9jZXNzQ29udGVudHMubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlBST0NFU1NDT05URU5UU19BVFRSSUJVVEUsIHByb2Nlc3NDb250ZW50cyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlBST0NFU1NDT05URU5UU19BVFRSSUJVVEUpOwotICAgICAgICB9Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BcHBJbmZvUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0FwcEluZm9Qcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTljNzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0FwcEluZm9Qcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBBcHBJbmZvUHJvcGVydHlTb3VyY2UKLSAgZXh0ZW5kcyBCYXNlUHJvcGVydHlTb3VyY2UKLSAgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UKLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVEVOVCA9ICJDb250ZW50IjsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQXBwSW5mb1Byb3BlcnR5U291cmNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB2aWV3ZXIKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIEFwcEluZm9Qcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIodmlld2VyLCB4c2RTY2hlbWEpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgQXBwSW5mb1Byb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgYW5kIHNldCBhIGNhdGVnb3J5Ci0gICAgUHJvcGVydHlEZXNjcmlwdG9yIHNvdXJjZURlc2NyaXB0b3IgPQotICAgICAgbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuU09VUkNFX0FUVFJJQlVURSk7Ci0gICAgbGlzdC5hZGQoc291cmNlRGVzY3JpcHRvcik7Ci0gICAgQW55Q29udGVudFByb3BlcnR5RGVzY3JpcHRvciBjb250ZW50RGVzY3JpcHRvciA9Ci0gICAgICBuZXcgQW55Q29udGVudFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgQ09OVEVOVCwKLSAgICAgICAgQ09OVEVOVCwKLSAgICAgICAgZWxlbWVudCk7Ci0gICAgbGlzdC5hZGQoY29udGVudERlc2NyaXB0b3IpOwotCi0gICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhDT05URU5UKSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgVGV4dAotICAgICAgICAgICAgTm9kZSBub2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiAoKENoYXJhY3RlckRhdGEpbm9kZSkuZ2V0RGF0YSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gIiI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoU3RyaW5nKWlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NPVVJDRV9BVFRSSUJVVEVfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICAgIGlmICgoKFN0cmluZyl2YWx1ZSkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFLCAoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCgoU3RyaW5nKWlkKS5lcXVhbHMoQ09OVEVOVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ09NTUVOVF9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyBUZXh0Ci0gICAgICAgICAgICAgIE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKENoYXJhY3RlckRhdGEpbm9kZSkuc2V0RGF0YSgoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoKChTdHJpbmcpdmFsdWUpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoKFN0cmluZyl2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZE5vZGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgLy8gc2hvdWxkbid0IGJlIGhlcmUKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKChTdHJpbmcpIGlkLCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICB9Ci0gICAgUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0F0dHJpYnV0ZUdyb3VwUmVmUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0F0dHJpYnV0ZUdyb3VwUmVmUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRjYTcwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BdHRyaWJ1dGVHcm91cFJlZlByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUdyb3VwUmVmUHJvcGVydHlTb3VyY2UKLSAgZXh0ZW5kcyBCYXNlUHJvcGVydHlTb3VyY2UKLSAgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UKLXsKLSAgcHJpdmF0ZSBTdHJpbmdbXSByZWZDb21ib1ZhbHVlcyA9IHsgIiIgfTsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEF0dHJpYnV0ZUdyb3VwUmVmUHJvcGVydHlTb3VyY2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHZpZXdlcgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgQXR0cmlidXRlR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIodmlld2VyLCB4c2RTY2hlbWEpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgQXR0cmlidXRlR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIoeHNkU2NoZW1hKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICBqYXZhLnV0aWwuTGlzdCBpdGVtcyA9IGhlbHBlci5nZXRHbG9iYWxBdHRyaWJ1dGVzKCk7Ci0gICAgICAKLSAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgIHsKLSAgICAgIGl0ZW1zID0gaGVscGVyLmdldEdsb2JhbEF0dHJpYnV0ZXMoKTsKLS8vICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGNsaWVudCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0FUVFJJQlVURV9SRUZfREVTSUdOX1ZJRVcpOwotLy8gICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmVmQ29tYm8sIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9BVFRSSUJVVEVfUkVGX05BTUUpOyAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICB7Ci0gICAgICBpdGVtcyA9IGhlbHBlci5nZXRHbG9iYWxBdHRyaWJ1dGVHcm91cHMoKTsKLS8vICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGNsaWVudCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0FUVFJJQlVURV9HUk9VUF9SRUZfREVTSUdOX1ZJRVcpOwotLy8gICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmVmQ29tYm8sIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9BVFRSSUJVVEVfR1JPVVBfUkVGX05BTUUpOwotICAgIH0KLSAgICBpbnQgc2l6ZSA9IGl0ZW1zLnNpemUoKSArIDE7Ci0gICAgcmVmQ29tYm9WYWx1ZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgIHJlZkNvbWJvVmFsdWVzWzBdID0gIiI7Ci0gICAgaWYgKGl0ZW1zICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVmQ29tYm9WYWx1ZXNbaSArIDFdID0gKFN0cmluZykgaXRlbXMuZ2V0KGkpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldEVkaXRhYmxlVmFsdWUoKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgICovCi0gIHB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gQ3JlYXRlIGEgZGVzY3JpcHRvciBhbmQgc2V0IGEgY2F0ZWdvcnkKLSAgICBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvciByZWZEZXNjcmlwdG9yID0KLSAgICBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSwKLSAgICAgICAgcmVmQ29tYm9WYWx1ZXMpOwotICAgIGxpc3QuYWRkKHJlZkRlc2NyaXB0b3IpOwotCi0gICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0gICAgICB9Ci0vLyAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkpCi0vLyAgICAgIHsKLS8vICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0KGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjcmVzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3NldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkLCBPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgewotICAgICAgdmFsdWUgPSAiIjsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BVFRSSUJVVEVHUk9VUF9SRUZfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSwgKFN0cmluZykgdmFsdWUpOwotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BdHRyaWJ1dGVQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQXR0cmlidXRlUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5YjJmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BdHRyaWJ1dGVQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5HbG9iYWxBdHRyaWJ1dGVSZW5hbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVQcm9wZXJ0eVNvdXJjZQotICBleHRlbmRzIEJhc2VQcm9wZXJ0eVNvdXJjZQotICBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICBwcml2YXRlIFN0cmluZ1tdIHVzZUNvbWJvVmFsdWVzID0KLSAgewotICAgICAgICAiIiwKLSAgICAgICAgInByb2hpYml0ZWQiLCAgIC8vIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9DT01CT19CT1hfUFJPSElCSVRFRCIpLAotICAgICAgICAib3B0aW9uYWwiLCAgIC8vIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9DT01CT19CT1hfT1BUSU9OQUwiKSwKLSAgICAgICAgInJlcXVpcmVkIiAgLy8gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTUJPX0JPWF9SRVFVSVJFRCIpCi0gIH07Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBmb3JtQ29tYm9WYWx1ZXNbXSA9Ci0gIHsKLSAgICAgICAgIiIsCi0gICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9DT01CT19VTlFVQUxJRklFRCIpLAotICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ09NQk9fUVVBTElGSUVEIikKLSAgfTsKLSAgCi0gIAotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQXR0cmlidXRlUHJvcGVydHlTb3VyY2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHZpZXdlcgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgQXR0cmlidXRlUHJvcGVydHlTb3VyY2UoVmlld2VyIHZpZXdlciwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHZpZXdlciwgeHNkU2NoZW1hKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIEF0dHJpYnV0ZVByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgYW5kIHNldCBhIGNhdGVnb3J5Ci0gICAgUHJvcGVydHlEZXNjcmlwdG9yIG5hbWVEZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotICAgIGxpc3QuYWRkKG5hbWVEZXNjcmlwdG9yKTsKLS8vICAgIG5hbWVEZXNjcmlwdG9yLnNldENhdGVnb3J5KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9HRU5FUkFMIikpOwotICAgIFR5cGVzUHJvcGVydHlEZXNjcmlwdG9yIHR5cGVEZXNjcmlwdG9yID0gbmV3IFR5cGVzUHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLAotICAgICAgWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLAotICAgICAgZWxlbWVudCwgeHNkU2NoZW1hKTsKLSAgICBsaXN0LmFkZCh0eXBlRGVzY3JpcHRvcik7Ci0vLyAgICB0eXBlRGVzY3JpcHRvci5zZXRDYXRlZ29yeShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfR0VORVJBTCIpKTsKLQotICAgIEF0dHIgZml4ZWRBdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotICAgIEF0dHIgZGVmYXVsdEF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKTsKLSAgICBTdHJpbmcgc3RyOwotICAgIGlmIChmaXhlZEF0dHIgIT0gbnVsbCkKLSAgICAgewotICAgICAgc3RyID0gWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVmYXVsdEF0dHIgIT0gbnVsbCkKLSAgICAgewotICAgICAgc3RyID0gWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFOwotICAgIH0KLSAgICBlbHNlCi0gICAgIHsKLSAgICAgIHN0ciA9IFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUgKyAiLyIgKyBYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEU7Ci0gICAgfQotICAgIAotICAgIEZpeGVkT3JEZWZhdWx0VGV4dFByb3BlcnR5RGVzY3JpcHRvciBmaXhlZE9yRGVmYXVsdERlc2NyaXB0b3IgPQotICAgIG5ldyBGaXhlZE9yRGVmYXVsdFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIHN0ciwgCi0gICAgICAgIHN0ciwKLSAgICAgICAgZWxlbWVudCk7Ci0gICAgbGlzdC5hZGQoZml4ZWRPckRlZmF1bHREZXNjcmlwdG9yKTsKLS8vICAgIGZpeGVkT3JEZWZhdWx0RGVzY3JpcHRvci5zZXRDYXRlZ29yeShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfT1RIRVIiKSk7Ci0gICAgCi0gICAgT2JqZWN0IHBhcmVudE5vZGUgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudE5vZGUsIFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvciB1c2VEZXNjcmlwdG9yID0KLSAgICAgIG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgICBYU0RDb25zdGFudHMuVVNFX0FUVFJJQlVURSwKLSAgICAgICAgICBYU0RDb25zdGFudHMuVVNFX0FUVFJJQlVURSwKLSAgICAgICAgICB1c2VDb21ib1ZhbHVlcyk7Ci0gICAgICBsaXN0LmFkZCh1c2VEZXNjcmlwdG9yKTsKLS8vICAgICAgdXNlRGVzY3JpcHRvci5zZXRDYXRlZ29yeShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfT1RIRVIiKSk7Ci0gICAgICBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvciBmb3JtRGVzY3JpcHRvciA9Ci0gICAgICBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgICAgWFNEQ29uc3RhbnRzLkZPUk1fQVRUUklCVVRFLAotICAgICAgICAgIFhTRENvbnN0YW50cy5GT1JNX0FUVFJJQlVURSwKLSAgICAgICAgICBmb3JtQ29tYm9WYWx1ZXMpOwotICAgICAgbGlzdC5hZGQoZm9ybURlc2NyaXB0b3IpOwotLy8gICAgICBmb3JtRGVzY3JpcHRvci5zZXRDYXRlZ29yeShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfT1RIRVIiKSk7Ci0gICAgfQotICAgIAotICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChpZCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgoU3RyaW5nKSBpZCk7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotICAgICAgfQotICAgICAgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXN1bHQuZXF1YWxzKCIiKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjaGVja0ZvckFub255bW91c1R5cGUoZWxlbWVudCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICIqKmFub255bW91cyoqIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTk9fVFlQRSIpOyAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgdmFsdWUgPSAiIjsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKQotICAgICAgewotLy8gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UWVBFX0NIQU5HRSIpLCBlbGVtZW50KTsKLS8vICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIChTdHJpbmcpdmFsdWUpOwotLy8gICAgICAgIHVwZGF0ZUVsZW1lbnRUb05vdEFub255bW91cyhlbGVtZW50KTsKLS8vICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpKQotICAgICAgeyAKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FUVFJJQlVURV9OQU1FX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgICAgLy8gbm93IHJlbmFtZSBhbnkgcmVmZXJlbmNlcyB0byB0aGlzIGVsZW1lbnQKLSAgICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgewotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsKLSAgICAgICAgICBpZiAoY29tcCAhPSBudWxsICYmIGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiAmJiBjb21wLmdldFJvb3RDb250YWluZXIoKS5lcXVhbHMoeHNkU2NoZW1hKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiljb21wOwotICAgICAgICAgICAgeHNkQXR0cmlidXRlRGVjbGFyYXRpb24uc2V0TmFtZSgoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICAgIEdsb2JhbEF0dHJpYnV0ZVJlbmFtZXIgcmVuYW1lciA9IG5ldyBHbG9iYWxBdHRyaWJ1dGVSZW5hbWVyKHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLCAoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICAgIHJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCAoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSkgfHwgKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKSkKLSAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FUVFJJQlVURV9WQUxVRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmICgoKFN0cmluZyl2YWx1ZSkuZXF1YWxzKCIiKSkKLSAgICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgoU3RyaW5nKWlkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgIAotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKChTdHJpbmcpIGlkLCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQVRUUklCVVRFX1VTRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmICgoKFN0cmluZyl2YWx1ZSkuZXF1YWxzKCIiKSkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5VU0VfQVRUUklCVVRFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgIAotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKChTdHJpbmcpIGlkLCAoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuRk9STV9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQVRUUklCVVRFX0ZPUk1fQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICBpZiAoKChTdHJpbmcpdmFsdWUpLmVxdWFscygiIikpCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRk9STV9BVFRSSUJVVEUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GT1JNX0FUVFJJQlVURSwgKFN0cmluZyl2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgICAKLSAgfQotICAKLSAgYm9vbGVhbiBjaGVja0ZvckFub255bW91c1R5cGUoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICBpZiAobGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQXR0cmlidXRlc1RhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BdHRyaWJ1dGVzVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwZTcyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BdHRyaWJ1dGVzVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotLy9pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotLy9pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0vL2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLS8vCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblBpeGVsRGF0YTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Db21ib0JveFByb3BlcnR5RGVzY3JpcHRvcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotLy9pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZXNUYWJsZSAvLyBleHRlbmRzIFRhYmxlVmlld2VyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllcgotewotLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0vLwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLS8vCXByb3RlY3RlZCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzID0ge1BST1BFUlRZLCBWQUxVRX07Ci0vLwlwcm90ZWN0ZWQgUHJvcGVydHlUYWJsZVByb3ZpZGVyIHRhYmxlUHJvdmlkZXIgPSBuZXcgUHJvcGVydHlUYWJsZVByb3ZpZGVyKHRoaXMpOwotLy8JcHJvdGVjdGVkIENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLS8vCS8vcHJvdGVjdGVkIFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvciBjb21ib0NlbGxFZGl0b3I7Ci0vLwlwcm90ZWN0ZWQgSVByb3BlcnR5U291cmNlIHByb3BlcnR5U291cmNlOwotLy8KLS8vCXB1YmxpYyBBdHRyaWJ1dGVzVGFibGUoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgQ29tcG9zaXRlIHBhcmVudCkKLS8vCXsKLS8vCQlzdXBlcihuZXcgVGFibGUocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkgfCBTV1QuRkxBVCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCkpOyAgIAotLy8JCQkJIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7ICAgICAgICAgICAgICAgCi0vLwkJZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0vLwkJZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOyAgCi0vLyAgICAKLS8vCQlzZXRDb250ZW50UHJvdmlkZXIodGFibGVQcm92aWRlcik7Ci0vLwkJc2V0TGFiZWxQcm92aWRlcih0YWJsZVByb3ZpZGVyKTsKLS8vCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotLy8KLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0vLwkJewotLy8JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZ2V0VGFibGUoKSwgU1dULk5PTkUsIGkpOwotLy8JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLS8vCQkJY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0vLwkJfSAgICAgIAotLy8KLS8vLy8JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOyAKLS8vLy8JCUNvbHVtbldlaWdodERhdGEgZGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDQwLCA0MCwgdHJ1ZSk7Ci0vLy8vCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhKTsKLS8vLy8gICAgCi0vLy8vCQlDb2x1bW5XZWlnaHREYXRhIGRhdGEyID0gbmV3IENvbHVtbldlaWdodERhdGEoODAsIDgwLCB0cnVlKTsKLS8vLy8JCWxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEyKTsgICAgICAgICAgICAgICAgICAgICAgIAotLy8KLS8vCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLS8vCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uUGl4ZWxEYXRhKDEzMCx0cnVlKSk7Ci0vLwkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtblBpeGVsRGF0YSgxMzAsdHJ1ZSkpOwotLy8JCWdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJCi0vLyAgICAgICAgIAotLy8JCWNlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IoZ2V0VGFibGUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8JCXJlc2V0Q2VsbEVkaXRvcnMoKTsgICAgICAgICAgIAotLy8KLS8vCQlzZXRDZWxsTW9kaWZpZXIodGhpcyk7ICAgIAotLy8JfSAgCi0vLwotLy8JcHVibGljIHZvaWQgc2V0UHJvcGVydHlTb3VyY2UoSVByb3BlcnR5U291cmNlIHByb3BlcnR5U291cmNlKQotLy8JewotLy8JCXRoaXMucHJvcGVydHlTb3VyY2UgPSBwcm9wZXJ0eVNvdXJjZTsKLS8vCX0KLS8vCi0vLyAgLyogKG5vbi1KYXZhZG9jKQotLy8gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI2Nhbk1vZGlmeShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotLy8gICAqLwotLy8gIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotLy8gIHsKLS8vCQlyZXR1cm4gcHJvcGVydHkuZXF1YWxzKFZBTFVFKTsKLS8vICB9Ci0vLyAgCi0vLyAgLyogKG5vbi1KYXZhZG9jKQotLy8gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0vLyAgICovCi0vLyAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotLy8gIHsKLS8vCQlpbnQgY29sdW1uID0gMDsKLS8vCQlpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMF0pKQotLy8JCXsKLS8vCQkJY29sdW1uID0gMDsKLS8vCQl9Ci0vLwkJZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMV0pKQotLy8JCXsKLS8vCQkJY29sdW1uID0gMTsKLS8vCQl9ICAgIAotLy8JCXJldHVybiB0YWJsZVByb3ZpZGVyLmdldENvbHVtblZhbHVlKGVsZW1lbnQsIGNvbHVtbik7Ci0vLyB9Ci0vLwotLy8gIC8qIChub24tSmF2YWRvYykKLS8vICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllciNtb2RpZnkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLS8vICAgKi8KLS8vICBwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotLy8gIHsKLS8vCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZWxlbWVudDsKLS8vICAJSVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSAoSVByb3BlcnR5RGVzY3JpcHRvcilpdGVtLmdldERhdGEoKTsKLS8vICAgICAgICAgICAgICAKLS8vCS8vIGlmIHRoZSBuZXcgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZCB2YWx1ZSwgdGhlIHVzZXIgaGFzIG9ubHkgY2xpY2tlZAotLy8JLy8gb24gdGhlIGNlbGwgaW4gdGhlIGNvdXJzZSBvZiAnYnJvd3NpbmcnIC4uLiBzbyBkb24ndCBlZGl0IHRoZSB2YWx1ZQotLy8JICBPYmplY3Qgb2xkVmFsdWUgPSBnZXRWYWx1ZShwcm9wZXJ0eURlc2NyaXB0b3IsIHByb3BlcnR5KTsgICAgICAgCi0vLwkgIGlmICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKSAKLS8vCSAgeyAgICAgIAotLy8JCQkJIC8vIHdlIGFzc3VtZSB0aGUgdmFsdWUgaXMgZW1wdHkgdGhhdCB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSByZW1vdmVkCi0vLwkJCQkgLy8gdG9kby4uLiB3ZSBwcm9iYWJseSBuZWVkIHRvIGxvb2sgYXQgdGhpcyBpbiBtb3JlIGRldGFpbAotLy8JCQkJIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZyl2YWx1ZSkubGVuZ3RoKCkgPT0gMCkKLS8vCQkJCSB7Ci0vLwkJCQkJCQkJdmFsdWUgPSBudWxsOwotLy8JCQkJIH0KLS8vCQkJCSBwcm9wZXJ0eVNvdXJjZS5zZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5RGVzY3JpcHRvci5nZXRJZCgpLCB2YWx1ZSk7ICAgIAotLy8JICB9ICAgICAgICAgICAgICAgICAgICAgICAKLS8vICB9Ci0vLwotLy8gICAgICAKLS8vCXByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotLy8JICAvLyB3ZSBuZWVkIHRvIGhvb2sgdXAgb3VyIG93biBtb3VzZSBsaXN0ZW5lciBmaXJzdAotLy8JCQkJIC8vIHNvIHRoYXQgd2UgY2FuIHVwZGF0ZSB0aGUgY2VsbEVkaXRvcnMgYmVmb3JlCi0vLwkJCQkgLy8gdGhlICdpbnRlcm5hbCcgbGlzdGVuZXIgdHJpZXMgdG8gZ2V0IGhvbGQgb2YgdGhlbQotLy8JCQkgVGFibGUgdGFibGVDb250cm9sID0gKFRhYmxlKWNvbnRyb2w7Ci0vLwkJCQkgdGFibGVDb250cm9sLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLS8vCQkJCQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0vLwkJCQkJCQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlIGRvd24iKTsKLS8vCQkJCQkJCQkJCSAgIHVwZGF0ZUNlbGxFZGl0b3JzKCk7Ci0vLwkJCQkJCQkJfQotLy8JCQkJIH0pOwotLy8JCSAgc3VwZXIuaG9va0NvbnRyb2woY29udHJvbCk7Ci0vLwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vCi0vLwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDZWxsRWRpdG9ycygpCi0vLwl7Ci0vLwkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbMl07Ci0vLwkJY2VsbEVkaXRvcnNbMF0gPSBjZWxsRWRpdG9yOwotLy8JCWNlbGxFZGl0b3JzWzFdID0gY2VsbEVkaXRvcjsKLS8vCi0vLwkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpZ2V0SW5wdXQoKTsKLS8vICAgICAgICAgICAgICAKLS8vCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IHByb3BlcnR5U291cmNlLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLS8vCQlpbnQgaW5kZXggPSBnZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0vLwkJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aCkKLS8vCQl7Ci0vLwkJCUNlbGxFZGl0b3JbXSBvbGRDZWxsRWRpdG9ycyA9IGdldENlbGxFZGl0b3JzKCk7Ci0vLwkJCUNlbGxFZGl0b3Igb2xkQ2VsbEVkaXRvciA9IChvbGRDZWxsRWRpdG9ycy5sZW5ndGggPiAxKSA/IG9sZENlbGxFZGl0b3JzWzFdIDogbnVsbDsKLS8vCQkJaWYgKG9sZENlbGxFZGl0b3IgIT0gbnVsbCAmJiBvbGRDZWxsRWRpdG9yICE9IGNlbGxFZGl0b3IpCi0vLwkJCXsKLS8vCQkJIG9sZENlbGxFZGl0b3IuZGVhY3RpdmF0ZSgpOwotLy8JCQkgb2xkQ2VsbEVkaXRvci5kaXNwb3NlKCk7Ci0vLwkJCX0KLS8vCQkJY2VsbEVkaXRvcnNbMV0gPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2luZGV4XS5jcmVhdGVQcm9wZXJ0eUVkaXRvcihnZXRUYWJsZSgpKTsgICAgIAotLy8JCX0gIAotLy8JCXNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsgICAgIAotLy8KLS8vLy8JCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzID0gcHJvcGVydHlTb3VyY2UuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotLy8vLwotLy8vLyAJCWludCBpbmRleCA9IGdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLS8vLy8gCQkvL2NlbGxFZGl0b3IuZGlzcG9zZSgpOwotLy8vLwotLy8vLwkJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aCkKLS8vLy8JCXsKLS8vLy8gICAgICBjZWxsRWRpdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yc1tpbmRleF0uY3JlYXRlUHJvcGVydHlFZGl0b3IoZ2V0VGFibGUoKSk7Ci0vLy8vCQkJQ29udHJvbCBjb250cm9sID0gY2VsbEVkaXRvci5nZXRDb250cm9sKCk7Ci0vLy8vCQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkgewotLy8vLwkJCQljZWxsRWRpdG9yLmRlYWN0aXZhdGUoKTsKLS8vLy8JCQkJY2VsbEVkaXRvciA9IG51bGw7Ci0vLy8vCQkJCXJldHVybjsKLS8vLy8JCQl9Ci0vLy8vCQkJc2V0Q2VsbEVkaXRvcnMobmV3IENlbGxFZGl0b3JbXSB7bnVsbCwgY2VsbEVkaXRvcn0pOwotLy8vLwkJCWNlbGxFZGl0b3IuYWN0aXZhdGUoKTsKLS8vLy8JCQljZWxsRWRpdG9yLnNldEZvY3VzKCk7Ci0vLy8vCQl9Ci0vLwl9Ci0vLyAgICAgICAgICAgICAgICAgCi0vLwotLy8JcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KExpc3QgbGlzdCkKLS8vCXsKLS8vCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLS8vCQl7Ci0vLwkJCXJlc3VsdFtpXSA9IChTdHJpbmcpbGlzdC5nZXQoaSk7Ci0vLwkJfQotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLwlwcm90ZWN0ZWQgdm9pZCByZXNldENlbGxFZGl0b3JzKCkKLS8vCXsKLS8vCQkJIENlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzJdOwotLy8JCQkgY2VsbEVkaXRvcnNbMF0gPSBudWxsOwotLy8JCQkgY2VsbEVkaXRvcnNbMV0gPSBjZWxsRWRpdG9yOwotLy8JCQkgc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOyAgCi0vLwl9Ci0vLwotLy8KLS8vCWNsYXNzIFByb3BlcnR5VGFibGVQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotLy8JeyAgICAgICAgICAgICAgICAgIAotLy8JCXByb3RlY3RlZCBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0vLwotLy8JCVByb3BlcnR5VGFibGVQcm92aWRlcihUYWJsZVZpZXdlciB2aWV3ZXIpCi0vLwkJewotLy8JCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLS8vCQl9Ci0vLwkJCi0vLwkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSAgCi0vLwkJewotLy8vLwkJIHJlc2V0Q2VsbEVkaXRvcnMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLy8vCQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgWE1MRWxlbWVudCkKLS8vLy8JCQl7ICAgICAgCi0vLy8vCQkJCQkgcHJvcGVydHlTb3VyY2UgPSBuZXcgRXh0ZW5zaWJsZVByb3BlcnR5U291cmNlKGVkaXRvclBhcnQsIChYTUxFbGVtZW50KW5ld0lucHV0KTsKLS8vLy8JCQl9IAotLy8vLwkJCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0vLy8vCQkJewotLy8vLwkJCQlpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKG5ld0lucHV0LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8vLwkJCQl7ICAKLS8vLy8JCQkJICBwcm9wZXJ0eVNvdXJjZSA9IG5ldyBFbGVtZW50UHJvcGVydHlTb3VyY2UoKEVsZW1lbnQpbmV3SW5wdXQsIHZpZXdlcik7Ci0vLy8vCQkJCX0KLS8vLy8JCQkJZWxzZQotLy8vLwkJCQl7ICAKLS8vLy8gIAkJCQkgcHJvcGVydHlTb3VyY2UgPSBuZXcgUmVhZE9ubHlQcm9wZXJ0eVNvdXJjZShlZGl0b3JQYXJ0LCAoRWxlbWVudCluZXdJbnB1dCk7Ci0vLy8vCQkJCX0KLS8vLy8JCQl9Ci0vLy8vCQkJZWxzZQotLy8vLwkJCXsKLS8vLy8JCQkJCQkgcHJvcGVydHlTb3VyY2UgPSBudWxsOwotLy8vLwkJCX0gICAgICAgICAgCi0vLwkJfQotLy8KLS8vCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLS8vCQl7ICAKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfSAgICAgIAotLy8KLS8vCQlwdWJsaWMgT2JqZWN0IGdldENvbHVtblZhbHVlKE9iamVjdCBvLCBpbnQgY29sdW1uSW5kZXgpICAKLS8vCQl7IAotLy8JCQlJUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IChJUHJvcGVydHlEZXNjcmlwdG9yKW87Ci0vLwkJCWlmIChjb2x1bW5JbmRleCA9PSAwKQotLy8JCQl7Ci0vLwkJCSAgcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvci5nZXRJZCgpOwotLy8JCQl9Ci0vLwkJCWVsc2UKLS8vCQkJeyAgCi0vLwkJCSAgcmV0dXJuIHByb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHlEZXNjcmlwdG9yLmdldElkKCkpOwotLy8JCQl9Ci0vLwkJfQotLy8JCSAgCi0vLwkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvLCBpbnQgY29sdW1uSW5kZXgpICAKLS8vCQl7IAotLy8JCQlJUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IChJUHJvcGVydHlEZXNjcmlwdG9yKW87Ci0vLwkJCS8vIChjb2x1bW5JbmRleCA9PSAxICYmIHByb3BlcnR5RGVzY3JpcHRvciBpbnN0YW5jZW9mIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKQotLy8JCQlpZiAoKGNvbHVtbkluZGV4ID09IDEgJiYgcHJvcGVydHlEZXNjcmlwdG9yIGluc3RhbmNlb2YgT3B0aW9uc0NvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKSB8fAotLy8JCQkgICAoY29sdW1uSW5kZXggPT0gMSAmJiBwcm9wZXJ0eURlc2NyaXB0b3IgaW5zdGFuY2VvZiBDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcikpCi0vLwkJCXsKLS8vCQkJICBJTGFiZWxQcm92aWRlciBscCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0vLwkJCSAgaWYgKGxwICE9IG51bGwpCi0vLwkJICAJewotLy8JCQkgICAgcmV0dXJuIGxwLmdldFRleHQocHJvcGVydHlEZXNjcmlwdG9yLmdldElkKCkpOwotLy8JCSAgCX0KLS8vCQkJfQotLy8JCQkKLS8vCQkJT2JqZWN0IGlkID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldElkKCk7Ci0vLyAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSAiIjsKLS8vCQkgIGlmIChpZCAhPSBudWxsICYmIGF0dHJpYnV0ZSBpbnN0YW5jZW9mIFN0cmluZykKLS8vICAgICAgewotLy8gICAgICAgIGF0dHJpYnV0ZSA9IChTdHJpbmcpaWQ7Ci0vLyAgICAgIH0KLS8vICAgICAgT2JqZWN0IHZhbHVlID0gcHJvcGVydHlTb3VyY2UuZ2V0UHJvcGVydHlWYWx1ZShhdHRyaWJ1dGUpOwotLy8gICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSAiIjsKLS8vICAgICAgaWYgKHZhbHVlICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IChTdHJpbmcpdmFsdWU7Ci0vLyAgICAgIH0KLS8vCi0vLyAgICAgIHJldHVybiAoY29sdW1uSW5kZXggPT0gMCkgPyBhdHRyaWJ1dGUgOiBhdHRyaWJ1dGVWYWx1ZTsKLS8vCQkJCi0vLy8vCQkJICByZXR1cm4gKGNvbHVtbkluZGV4ID09IDApID8gcHJvcGVydHlEZXNjcmlwdG9yLmdldElkKCkudG9TdHJpbmcoKSA6IHByb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHlEZXNjcmlwdG9yLmdldElkKCkpLnRvU3RyaW5nKCk7Ci0vLwkJfSAgCi0vLwotLy8JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgbykKLS8vCQl7ICAgICAgICAgCi0vLwkJCQkJCU9iamVjdFtdIHJlc3VsdCA9IHByb3BlcnR5U291cmNlLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLS8vCQkJCQkJLy8gRm9yIHNvbWUgc3RyYW5nZSByZXNvbiB0aGUgVmlld2VyU29ydGVyIGRvZXNuJ3Qgc2VlbSB0byBiZSB3b3JraW5nIGZvciB0aGlzIHRhYmxlCi0vLwkJCQkJCS8vIEFzIGEgd29ya2Fyb3VuZCB3ZSBzb3J0IHRoZW0gaW4gdGhpcyBtZXRob2QgYmVmb3JlIHJldHVybmluZyB0aGVtIHRvIHRoZSB2aWV3ZXIKLS8vLy8JCQkJCQlpZiAocmVzdWx0Lmxlbmd0aCA+IDApCi0vLy8vCQkJCQkJewotLy8vLwkJCQkJCQkJCSBBcnJheXMuc29ydChyZXN1bHQsIG5ldyBJbnRlcm5hbENvbXBhcmF0b3IoKSk7Ci0vLy8vCQkJCQkJfQotLy8JCQkJCQlyZXR1cm4gcmVzdWx0OwotLy8JCX0KLS8vCX0KLS8vCi0vLwljbGFzcyBJbnRlcm5hbENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yCi0vLwl7Ci0vLwkJCSBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGUxLCBPYmplY3QgZTIpIAotLy8JCQkgewotLy8JCQkJCQkJSVByb3BlcnR5RGVzY3JpcHRvciBwMSA9IChJUHJvcGVydHlEZXNjcmlwdG9yKWUxOwotLy8JCQkJCQkJSVByb3BlcnR5RGVzY3JpcHRvciBwMiA9IChJUHJvcGVydHlEZXNjcmlwdG9yKWUyOwotLy8JCQkJCQkJU3RyaW5nIHAxTmFtZSA9IHAxLmdldERpc3BsYXlOYW1lKCk7Ci0vLwkJCQkJCQlTdHJpbmcgcDJOYW1lID0gcDIuZ2V0RGlzcGxheU5hbWUoKTsKLS8vCQkJCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUocDEuZ2V0RGlzcGxheU5hbWUoKSwgcDIuZ2V0RGlzcGxheU5hbWUoKSk7Ci0vLwkJCSB9ICAgICAgICAgCi0vLwl9Ci0vLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQmFzZVByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9CYXNlUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5MmQxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9CYXNlUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotCXByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXI7Ci0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzOwotCXByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCXByb3RlY3RlZCBTdHJpbmcgW10gdHJ1ZUZhbHNlQ29tYm9WYWx1ZXMgPSB7Ci0JCSIiLAotCQkiZmFsc2UiLAotCQkidHJ1ZSIKLQl9OwotCi0gIHB1YmxpYyBCYXNlUHJvcGVydHlTb3VyY2UoKQotICB7Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgRG9jdW1lbnRJbXBsIGdldERvY3VtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJldHVybiAoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoU3RyaW5nIGRlc2NyaXB0aW9uLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBnZXREb2N1bWVudChlbGVtZW50KS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGRlc2NyaXB0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIERvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSBnZXREb2N1bWVudChlbGVtZW50KTsKLSAgICAKLSAgICBkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7ICAgIAotICB9Ci0gIAotICAKLSAgcHVibGljIEJhc2VQcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCYXNlUHJvcGVydHlTb3VyY2UoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRWaWV3ZXIoVmlld2VyIHZpZXdlcikKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAvKioKLSAgICogR2V0cyB0aGUgZG9tSGVscGVyLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBYU0REb21IZWxwZXIKLSAgICovCi0gIHB1YmxpYyBYU0RET01IZWxwZXIgZ2V0RG9tSGVscGVyKCkKLSAgewotICAgIHJldHVybiBkb21IZWxwZXI7Ci0gIH0KLSAgCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRWxlbWVudENoaWxkcmVuKE5vZGUgcGFyZW50Tm9kZSkKLQl7Ci0JCWJvb2xlYW4gaGFzQ2hpbGRyZW5FbGVtZW50cyA9IGZhbHNlOwotCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuaGFzQ2hpbGROb2RlcygpKQotCQl7Ci0JCQlOb2RlTGlzdCBub2RlcyA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotCQkJewotCQkJCWlmIChub2Rlcy5pdGVtKGkpIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQl7Ci0JCQkJCWhhc0NoaWxkcmVuRWxlbWVudHMgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhhc0NoaWxkcmVuRWxlbWVudHM7Ci0JfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIE5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLSAgfQotCi0gIC8vIFRPRE8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVMYW5ndWFnZShTdHJpbmcgbGFuZykKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvLyBUT0RPICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ29tcGxleFR5cGVQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ29tcGxleFR5cGVQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2IwOWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NvbXBsZXhUeXBlUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuU2V0QmFzZVR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZVJlbmFtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIENvbXBsZXhUeXBlUHJvcGVydHlTb3VyY2UKLSAgZXh0ZW5kcyBCYXNlUHJvcGVydHlTb3VyY2UKLSAgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgREVSSVZFRF9CWV9JRCA9ICJkZXJpdmVkIGJ5IjsgLy8gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0RFUklWRURfQlkiKTsgCi0gIHByaXZhdGUgU3RyaW5nIEJBU0VfVFlQRV9JRCA9ICJiYXNlIHR5cGUiOyAvLyAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0JBU0VfVFlQRSIpOwotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBibG9ja09yRmluYWxDb21ib1ZhbHVlcyA9IAotICB7Ci0gICAgIiIsCi0gICAgIiNhbGwiLAotICAgICJleHRlbnNpb24iLAotICAgICJyZXN0cmljdGlvbiIKLSAgfTsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGRlcml2ZWRCeUNob2ljZXNDb21ib1ZhbHVlc1tdID0KLSAgewotICAgICAgICAiIiwKLSAgICAgICAgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLAotICAgICAgICBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHCi0gIH07Ci0gIAotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQ29tcGxleFR5cGVQcm9wZXJ0eVNvdXJjZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gdmlld2VyCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBDb21wbGV4VHlwZVByb3BlcnR5U291cmNlKFZpZXdlciB2aWV3ZXIsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHhzZFNjaGVtYSk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBDb21wbGV4VHlwZVByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgYW5kIHNldCBhIGNhdGVnb3J5Ci0gICAgYm9vbGVhbiBpc0Fub255bW91c1R5cGUgPSBjaGVja0ZvckFub255bW91c1R5cGUoZWxlbWVudCk7Ci0vLyBUaGUgdGhyZWUgcHJvcGVydGllcyBuYW1lLCBiYXNlIHR5cGUgYW5kIGRlcml2ZWQgYnkgaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSBnZW5lcmFsIHRhYgotLy8gICAgaWYgKGlzQW5vbnltb3VzVHlwZSkKLS8vICAgIHsKLS8vICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIG5hbWVEZXNjcmlwdG9yID0KLS8vICAgICAgbmV3IFByb3BlcnR5RGVzY3JpcHRvcigKLS8vICAgICAgICAgIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwKLS8vICAgICAgICAgIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0vLyAgICAgIGxpc3QuYWRkKG5hbWVEZXNjcmlwdG9yKTsKLS8vICAgIH0KLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIG5hbWVEZXNjcmlwdG9yID0KLS8vICAgICAgbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoCi0vLyAgICAgICAgICBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsCi0vLyAgICAgICAgICBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotLy8gICAgICBsaXN0LmFkZChuYW1lRGVzY3JpcHRvcik7Ci0vLyAgICB9Ci0KLSAgICBFbGVtZW50IGNvbnRlbnRNb2RlbEVsZW1lbnQgPSBnZXREb21IZWxwZXIoKS5nZXRDb250ZW50TW9kZWxGcm9tUGFyZW50KGVsZW1lbnQpOwotLy8gICAgU2ltcGxlQ29udGVudFByb3BlcnR5RGVzY3JpcHRvciB0eXBlRGVzY3JpcHRvciA9IG5ldyBTaW1wbGVDb250ZW50UHJvcGVydHlEZXNjcmlwdG9yKAotLy8gICAgICAgIEJBU0VfVFlQRV9JRCwKLS8vICAgICAgICBCQVNFX1RZUEVfSUQsCi0vLyAgICAgICAgY29udGVudE1vZGVsRWxlbWVudCwgeHNkU2NoZW1hKTsKLS8vICAgIGxpc3QuYWRkKHR5cGVEZXNjcmlwdG9yKTsKLS8vICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIGRlcml2ZWRCeURlc2NyaXB0b3IgPQotLy8gICAgbmV3IFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKAotLy8gICAgICAgIERFUklWRURfQllfSUQsCi0vLyAgICAgICAgREVSSVZFRF9CWV9JRCwKLS8vICAgICAgICBkZXJpdmVkQnlDaG9pY2VzQ29tYm9WYWx1ZXMpOwotLy8gICAgbGlzdC5hZGQoZGVyaXZlZEJ5RGVzY3JpcHRvcik7Ci0gICAgCi0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgYWJzdHJhY3REZXNjcmlwdG9yID0KLSAgICBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUsCi0gICAgICAgIHRydWVGYWxzZUNvbWJvVmFsdWVzKTsKLSAgICBsaXN0LmFkZChhYnN0cmFjdERlc2NyaXB0b3IpOwotCi0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgbWl4ZWREZXNjcmlwdG9yID0KLSAgICBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIFhTRENvbnN0YW50cy5NSVhFRF9BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5NSVhFRF9BVFRSSUJVVEUsCi0gICAgICAgIHRydWVGYWxzZUNvbWJvVmFsdWVzKTsKLSAgICBsaXN0LmFkZChtaXhlZERlc2NyaXB0b3IpOwotICAgICAgICAKLSAgICBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvciBibG9ja0Rlc2NyaXB0b3IgPQotICAgIG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSwKLSAgICAgICAgWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSwKLSAgICAgICAgYmxvY2tPckZpbmFsQ29tYm9WYWx1ZXMpOwotICAgIGxpc3QuYWRkKGJsb2NrRGVzY3JpcHRvcik7Ci0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgZmluYWxEZXNjcmlwdG9yID0KLSAgICBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUsCi0gICAgICAgIGJsb2NrT3JGaW5hbENvbWJvVmFsdWVzKTsKLSAgICBsaXN0LmFkZChmaW5hbERlc2NyaXB0b3IpOwotICAgIAotICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gKFN0cmluZylpZDsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICAgIEVsZW1lbnQgY29udGVudE1vZGVsRWxlbWVudCA9IGdldERvbUhlbHBlcigpLmdldENvbnRlbnRNb2RlbEZyb21QYXJlbnQoZWxlbWVudCk7ICAgIAotICAgICAgU3RyaW5nIGJhc2VUeXBlID0gZ2V0RG9tSGVscGVyKCkuZ2V0QmFzZVR5cGUoY29udGVudE1vZGVsRWxlbWVudCk7Ci0gICAgICAKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhERVJJVkVEX0JZX0lEKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldERvbUhlbHBlcigpLmdldERlcml2ZWRCeU5hbWUoY29udGVudE1vZGVsRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhCQVNFX1RZUEVfSUQpKQotICAgICAgewotICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBiYXNlVHlwZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaXNBbm9ueW1vdXNUeXBlID0gY2hlY2tGb3JBbm9ueW1vdXNUeXBlKGVsZW1lbnQpOwotICAgICAgICBpZiAoaXNBbm9ueW1vdXNUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuICIqKmFub255bW91cyoqIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgICAKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0vLyAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuQUJTVFJBQ1RfQVRUUklCVVRFKQotLy8gICAgICAgICAgfHwgKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1JWEVEX0FUVFJJQlVURSkpCi0vLyAgICAgIHsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuQkxPQ0tfQVRUUklCVVRFKSkKLS8vICAgICAgIHsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFKSkKLS8vICAgICAgewotLy8gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgdmFsdWUgPSAiIjsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IChTdHJpbmcpdmFsdWU7Ci0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IChTdHJpbmcpaWQ7Ci0gICAgICAKLSAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBpZiAodmFsaWRhdGVOYW1lKG5ld1ZhbHVlKSkKLSAgICAgICAgewotICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9DT01QTEVYVFlQRV9OQU1FX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIG5vdyByZW5hbWUgYW55IHJlZmVyZW5jZXMgdG8gdGhpcyB0eXBlCi0gICAgICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsKLSAgICAgICAgICAgICAgaWYgKGNvbXAgIT0gbnVsbCAmJiBjb21wIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uICYmIGNvbXAuZ2V0Q29udGFpbmVyKCkuZXF1YWxzKHhzZFNjaGVtYSkpCi0gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pY29tcDsKLS8vICAgICAgICAgICAgICAgIGN0LnNldE5hbWUobmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIEdsb2JhbFNpbXBsZU9yQ29tcGxleFR5cGVSZW5hbWVyIHJlbmFtZXIgPSBuZXcgR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZVJlbmFtZXIoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXAsIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZW5hbWVyLnZpc2l0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhERVJJVkVEX0JZX0lEKSkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBjb250ZW50TW9kZWxFbGVtZW50ID0gZ2V0RG9tSGVscGVyKCkuZ2V0Q29udGVudE1vZGVsRnJvbVBhcmVudChlbGVtZW50KTsKLSAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0gZ2V0RG9tSGVscGVyKCkuZ2V0QmFzZVR5cGUoY29udGVudE1vZGVsRWxlbWVudCk7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ERVJJVkVEQllfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW0gPSBnZXREb21IZWxwZXIoKS5nZXREZXJpdmVkQnlFbGVtZW50KGVsZW1lbnQpOwotICAgICAgICBnZXREb21IZWxwZXIoKS5jaGFuZ2VEZXJpdmVkQnlUeXBlKGNvbnRlbnRNb2RlbEVsZW1lbnQsIG5ld1ZhbHVlLCBiYXNlVHlwZSk7Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEJBU0VfVFlQRV9JRCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBkZXJpdmVkQnkgPSBnZXREb21IZWxwZXIoKS5nZXREZXJpdmVkQnlOYW1lKGVsZW1lbnQpOwotICAgICAgICAKLSAgICAgICAgU2V0QmFzZVR5cGVBY3Rpb24gc2V0QmFzZVR5cGVBY3Rpb24gPSBuZXcgU2V0QmFzZVR5cGVBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1NFVF9CQVNFX1RZUEUiKSk7Ci0gICAgICAgIHNldEJhc2VUeXBlQWN0aW9uLnNldFhTRFNjaGVtYSh4c2RTY2hlbWEpOwotICAgICAgICBzZXRCYXNlVHlwZUFjdGlvbi5zZXRDb21wbGV4VHlwZUVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgIHNldEJhc2VUeXBlQWN0aW9uLnNldFR5cGUobmV3VmFsdWUpOwotICAgICAgICBzZXRCYXNlVHlwZUFjdGlvbi5zZXREZXJpdmVkQnkoZGVyaXZlZEJ5KTsKLSAgICAgICAgc2V0QmFzZVR5cGVBY3Rpb24ucGVyZm9ybUFjdGlvbigpOwotCi0vLyAgICAgICAgaGFuZGxlQmFzZVR5cGVDb21ib0NoYW5nZShuZXdWYWx1ZSk7Ci0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkFCU1RSQUNUX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ09NUExFWFRZUEVfQUJTVFJBQ1RfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5NSVhFRF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTVBMRVhUWVBFX01JWEVEX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhYU0RDb25zdGFudHMuQkxPQ0tfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9DT01QTEVYVFlQRV9CTE9DS19DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkZJTkFMX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ09NUExFWFRZUEVfRklOQUxfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQsICAoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgoU3RyaW5nKSBpZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgICAKLSAgfQotCi0gIGJvb2xlYW4gY2hlY2tGb3JBbm9ueW1vdXNUeXBlKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE9iamVjdCBwYXJlbnRFbGVtZW50ID0gKE9iamVjdCllbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICBib29sZWFuIGlzQW5vbnltb3VzID0gZmFsc2U7Ci0gICAgaWYgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGlzQW5vbnltb3VzID0gdHJ1ZTsgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpc0Fub255bW91czsKLSAgfQotICAKLSAgCi0vLyAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJhc2VUeXBlQ29tYm9DaGFuZ2UoU3RyaW5nIG5ld1R5cGUpCi0vLyAgewotLy8gICAgU3RyaW5nIHRlbXBDaG9pY2UgPSBuZXdUeXBlOwotLy8gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0vLyAgICBpZiAoaGVscGVyLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCkuY29udGFpbnModGVtcENob2ljZSkgfHwKLS8vICAgICAgICBoZWxwZXIuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKS5jb250YWlucyh0ZW1wQ2hvaWNlKSkKLS8vICAgIHsKLS8vICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0VGV4dChYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKTsKLS8vICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChoZWxwZXIuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCkuY29udGFpbnModGVtcENob2ljZSkpCi0vLyAgICAgewotLy8gICAgICBFbGVtZW50IGNvbnRlbnRNb2RlbEVsZW1lbnQgPSBnZXREb21IZWxwZXIoKS5nZXRDb250ZW50TW9kZWxGcm9tUGFyZW50KGVsZW1lbnQpOyAgICAKLS8vICAgICAgU3RyaW5nIGRlcml2ZWRCeVN0cmluZyA9IGdldERvbUhlbHBlcigpLmdldERlcml2ZWRCeU5hbWUoY29udGVudE1vZGVsRWxlbWVudCk7Ci0vLyAgICAgIGRlcml2ZWRCeUNvbWJvLnNldFRleHQoZGVyaXZlZEJ5U3RyaW5nKTsKLS8vICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0RW5hYmxlZCh0cnVlKTsgCi0vLyAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICAgewotLy8gICAgICBkZXJpdmVkQnlDb21iby5zZXRUZXh0KCIiKTsKLS8vICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7IAotLy8gICAgfQotLy8gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9Eb2N1bWVudGF0aW9uUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0RvY3VtZW50YXRpb25Qcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU5ZWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0RvY3VtZW50YXRpb25Qcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERvY3VtZW50YXRpb25Qcm9wZXJ0eVNvdXJjZQotICBleHRlbmRzIEJhc2VQcm9wZXJ0eVNvdXJjZQotICBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBDT05URU5UID0gIkNvbnRlbnQiOwotICAKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIERvY3VtZW50YXRpb25Qcm9wZXJ0eVNvdXJjZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gdmlld2VyCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudGF0aW9uUHJvcGVydHlTb3VyY2UoVmlld2VyIHZpZXdlciwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHZpZXdlciwgeHNkU2NoZW1hKTsKLQotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRhdGlvblByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgYW5kIHNldCBhIGNhdGVnb3J5Ci0gICAgUHJvcGVydHlEZXNjcmlwdG9yIGxhbmd1YWdlRGVzY3JpcHRvciA9Ci0gICAgbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgICJ4bWw6bGFuZyIsCi0gICAgICAgICJ4bWw6bGFuZyIKLSAgICAgICAgKTsKLSAgICBsaXN0LmFkZChsYW5ndWFnZURlc2NyaXB0b3IpOwotICAgIFByb3BlcnR5RGVzY3JpcHRvciBzb3VyY2VEZXNjcmlwdG9yID0KLSAgICBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKTsKLSAgICBsaXN0LmFkZChzb3VyY2VEZXNjcmlwdG9yKTsKLSAgICBBbnlDb250ZW50UHJvcGVydHlEZXNjcmlwdG9yIGNvbnRlbnREZXNjcmlwdG9yID0KLSAgICBuZXcgQW55Q29udGVudFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgQ09OVEVOVCwKLSAgICAgICAgQ09OVEVOVCwKLSAgICAgICAgZWxlbWVudCk7Ci0gICAgbGlzdC5hZGQoY29udGVudERlc2NyaXB0b3IpOwotCi0gICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICB7Ci0gICAgICBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoQ09OVEVOVCkpCi0gICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgVGV4dAotICAgICAgICAgICAgTm9kZSBub2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gKChDaGFyYWN0ZXJEYXRhKW5vZGUpLmdldERhdGEoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICB7Ci0gICAgICByZXN1bHQgPSAiIjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSAoU3RyaW5nKXZhbHVlOwotICAgICAgICBpZiAoKChTdHJpbmcpaWQpLmVxdWFscygieG1sOmxhbmciKSkKLSAgICAgICAgewotICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ET0NVTUVOVEFUSU9OX0xBTkdfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbGlkYXRlTGFuZ3VhZ2UobmV3VmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sOmxhbmciLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjbGVhckVycm9yTWVzc2FnZSgpOwotICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbDpsYW5nIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoKFN0cmluZylpZCkuZXF1YWxzKFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ET0NVTUVOVEFUSU9OX1NPVVJDRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuU09VUkNFX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKChTdHJpbmcpaWQpLmVxdWFscyhDT05URU5UKSkKLSAgICAgICAgewotICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ET0NVTUVOVEFUSU9OX0NPTU1FTlRfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgVGV4dAotICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChDaGFyYWN0ZXJEYXRhKW5vZGUpLnNldERhdGEobmV3VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOb2RlIGNoaWxkTm9kZSA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlICAvLyBzaG91bGRuJ3QgYmUgaGVyZQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotICAgIH0KLSAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRHluYW1pY0NlbGxFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0R5bmFtaWNDZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTUyNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRHluYW1pY0NlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZVRleHRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHlwZWRMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIER5bmFtaWNDZWxsRWRpdG9yIGV4dGVuZHMgQ29tcG9zaXRlCi17Ci0JVGV4dCB0ZXh0OwotCUxpc3QgbGlzdDsKLQlpbnQgbWF4SXRlbUNvdW50ID0gNTsKLQlTaGVsbCBwb3B1cDsKLQlCdXR0b24gYXJyb3c7Ci0JYm9vbGVhbiBoYXNGb2N1czsKLQkKLSAgcHVibGljIER5bmFtaWNDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCXN1cGVyIChwYXJlbnQsIGNoZWNrU3R5bGUgKHN0eWxlKSk7Ci0JCi0Jc3R5bGUgPSBnZXRTdHlsZSgpOwotCQotCWludCB0ZXh0U3R5bGUgPSBTV1QuU0lOR0xFOwotCWlmICgoc3R5bGUgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKSB0ZXh0U3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQlpZiAoKHN0eWxlICYgU1dULkZMQVQpICE9IDApIHRleHRTdHlsZSB8PSBTV1QuRkxBVDsKLQl0ZXh0ID0gbmV3IFRleHQgKHRoaXMsIHRleHRTdHlsZSk7Ci0JCi0JcG9wdXAgPSBuZXcgU2hlbGwgKGdldFNoZWxsICgpLCBTV1QuTk9fVFJJTSk7Ci0JCi0JaW50IGxpc3RTdHlsZSA9IFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEw7Ci0JaWYgKChzdHlsZSAmIFNXVC5GTEFUKSAhPSAwKSBsaXN0U3R5bGUgfD0gU1dULkZMQVQ7Ci0JaWYgKChzdHlsZSAmIFNXVC5SSUdIVF9UT19MRUZUKSAhPSAwKSBsaXN0U3R5bGUgfD0gU1dULlJJR0hUX1RPX0xFRlQ7Ci0JaWYgKChzdHlsZSAmIFNXVC5MRUZUX1RPX1JJR0hUKSAhPSAwKSBsaXN0U3R5bGUgfD0gU1dULkxFRlRfVE9fUklHSFQ7Ci0JbGlzdCA9IG5ldyBMaXN0IChwb3B1cCwgbGlzdFN0eWxlKTsKLQkKLQlpbnQgYXJyb3dTdHlsZSA9IFNXVC5BUlJPVyB8IFNXVC5ET1dOOwotCWlmICgoc3R5bGUgJiBTV1QuRkxBVCkgIT0gMCkgYXJyb3dTdHlsZSB8PSBTV1QuRkxBVDsKLQlhcnJvdyA9IG5ldyBCdXR0b24gKHRoaXMsIGFycm93U3R5bGUpOwotCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChwb3B1cCA9PSBldmVudC53aWRnZXQpIHsKLQkJCQlwb3B1cEV2ZW50IChldmVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKHRleHQgPT0gZXZlbnQud2lkZ2V0KSB7Ci0JCQkJdGV4dEV2ZW50IChldmVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGxpc3QgPT0gZXZlbnQud2lkZ2V0KSB7Ci0JCQkJbGlzdEV2ZW50IChldmVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGFycm93ID09IGV2ZW50LndpZGdldCkgewotCQkJCWFycm93RXZlbnQgKGV2ZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoRHluYW1pY0NlbGxFZGl0b3IudGhpcyA9PSBldmVudC53aWRnZXQpIHsKLQkJCQljb21ib0V2ZW50IChldmVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCX0KLQl9OwotCQotCWludCBbXSBjb21ib0V2ZW50cyA9IHtTV1QuRGlzcG9zZSwgU1dULk1vdmUsIFNXVC5SZXNpemV9OwotCWZvciAoaW50IGk9MDsgaTxjb21ib0V2ZW50cy5sZW5ndGg7IGkrKykgdGhpcy5hZGRMaXN0ZW5lciAoY29tYm9FdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0JCi0JaW50IFtdIHBvcHVwRXZlbnRzID0ge1NXVC5DbG9zZSwgU1dULlBhaW50LCBTV1QuRGVhY3RpdmF0ZX07Ci0JZm9yIChpbnQgaT0wOyBpPHBvcHVwRXZlbnRzLmxlbmd0aDsgaSsrKSBwb3B1cC5hZGRMaXN0ZW5lciAocG9wdXBFdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0JCi0JaW50IFtdIHRleHRFdmVudHMgPSB7U1dULktleURvd24sIFNXVC5LZXlVcCwgU1dULk1vZGlmeSwgU1dULk1vdXNlRG93biwgU1dULk1vdXNlVXAsIFNXVC5UcmF2ZXJzZSwgU1dULkZvY3VzSW4sIFNXVC5Gb2N1c091dH07Ci0JZm9yIChpbnQgaT0wOyBpPHRleHRFdmVudHMubGVuZ3RoOyBpKyspIHRleHQuYWRkTGlzdGVuZXIgKHRleHRFdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0JCi0JaW50IFtdIGxpc3RFdmVudHMgPSB7U1dULk1vdXNlVXAsIFNXVC5TZWxlY3Rpb24sIFNXVC5UcmF2ZXJzZSwgU1dULktleURvd24sIFNXVC5LZXlVcCwgU1dULkZvY3VzSW4sIFNXVC5Gb2N1c091dH07Ci0JZm9yIChpbnQgaT0wOyBpPGxpc3RFdmVudHMubGVuZ3RoOyBpKyspIGxpc3QuYWRkTGlzdGVuZXIgKGxpc3RFdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0JCi0JaW50IFtdIGFycm93RXZlbnRzID0ge1NXVC5TZWxlY3Rpb24sIFNXVC5Gb2N1c0luLCBTV1QuRm9jdXNPdXR9OwotCWZvciAoaW50IGk9MDsgaTxhcnJvd0V2ZW50cy5sZW5ndGg7IGkrKykgYXJyb3cuYWRkTGlzdGVuZXIgKGFycm93RXZlbnRzIFtpXSwgbGlzdGVuZXIpOwotCQotCWluaXRBY2Nlc3NpYmxlKCk7Ci19Ci1zdGF0aWMgaW50IGNoZWNrU3R5bGUgKGludCBzdHlsZSkgewotCWludCBtYXNrID0gU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVCB8IFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULlJJR0hUX1RPX0xFRlQ7Ci0JcmV0dXJuIHN0eWxlICYgbWFzazsKLX0KLS8qKgotKiBBZGRzIGFuIGl0ZW0uCi0qIDxwPgotKiBUaGUgaXRlbSBpcyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSogSW5kZXhpbmcgaXMgemVybyBiYXNlZC4KLSoKLSogQHBhcmFtIHN0cmluZyB0aGUgbmV3IGl0ZW0KLSoKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTKQotKgl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfV0lER0VUX0RJU1BPU0VEKQotKgl3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfTlVMTF9BUkdVTUVOVCkKLSoJd2hlbiB0aGUgc3RyaW5nIGlzIG51bGwKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfSVRFTV9OT1RfQURERUQpCi0qCXdoZW4gdGhlIGl0ZW0gY2Fubm90IGJlIGFkZGVkCi0qLwotcHVibGljIHZvaWQgYWRkIChTdHJpbmcgc3RyaW5nKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWxpc3QuYWRkIChzdHJpbmcpOwotfQotLyoqCi0qIEFkZHMgYW4gaXRlbSBhdCBhbiBpbmRleC4KLSogPHA+Ci0qIFRoZSBpdGVtIGlzIHBsYWNlZCBhdCBhbiBpbmRleCBpbiB0aGUgbGlzdC4KLSogSW5kZXhpbmcgaXMgemVybyBiYXNlZC4KLSoKLSogVGhpcyBvcGVyYXRpb24gd2lsbCBmYWlsIHdoZW4gdGhlIGluZGV4IGlzCi0qIG91dCBvZiByYW5nZS4KLSoKLSogQHBhcmFtIHN0cmluZyB0aGUgbmV3IGl0ZW0KLSogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBmb3IgdGhlIGl0ZW0KLSoKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTKQotKgl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfV0lER0VUX0RJU1BPU0VEKQotKgl3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfTlVMTF9BUkdVTUVOVCkKLSoJd2hlbiB0aGUgc3RyaW5nIGlzIG51bGwKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfSVRFTV9OT1RfQURERUQpCi0qCXdoZW4gdGhlIGl0ZW0gY2Fubm90IGJlIGFkZGVkCi0qLwotcHVibGljIHZvaWQgYWRkIChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JbGlzdC5hZGQgKHN0cmluZywgaW5kZXgpOwotfQotLyoqCSAKLSogQWRkcyB0aGUgbGlzdGVuZXIgdG8gcmVjZWl2ZSBldmVudHMuCi0qIDxwPgotKgotKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0qCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSoJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSoJd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX05VTExfQVJHVU1FTlQpCi0qCXdoZW4gbGlzdGVuZXIgaXMgbnVsbAotKi8KLXB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyIChNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgezsKLQljaGVja1dpZGdldCgpOwotCWlmIChsaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlUeXBlZExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgVHlwZWRMaXN0ZW5lciAobGlzdGVuZXIpOwotCWFkZExpc3RlbmVyIChTV1QuTW9kaWZ5LCB0eXBlZExpc3RlbmVyKTsKLX0KLS8qKgkgCi0qIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHJlY2VpdmUgZXZlbnRzLgotKiA8cD4KLSoKLSogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotKgotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9OVUxMX0FSR1VNRU5UKQotKgl3aGVuIGxpc3RlbmVyIGlzIG51bGwKLSovCi1wdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCVR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBUeXBlZExpc3RlbmVyIChsaXN0ZW5lcik7Ci0JYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sdHlwZWRMaXN0ZW5lcik7Ci0JYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLHR5cGVkTGlzdGVuZXIpOwotfQotdm9pZCBhcnJvd0V2ZW50IChFdmVudCBldmVudCkgewotCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQljYXNlIFNXVC5Gb2N1c0luOiB7Ci0JCQlpZiAoaGFzRm9jdXMpIHJldHVybjsKLQkJCWhhc0ZvY3VzID0gdHJ1ZTsKLQkJCWlmIChnZXRFZGl0YWJsZSAoKSkgdGV4dC5zZWxlY3RBbGwgKCk7Ci0JCQlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0JCQllLnRpbWUgPSBldmVudC50aW1lOwotCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c0luLCBlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU1dULkZvY3VzT3V0OiB7Ci0JCQlldmVudC5kaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoRHluYW1pY0NlbGxFZGl0b3IudGhpcy5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBnZXREaXNwbGF5KCkuZ2V0Rm9jdXNDb250cm9sKCk7Ci0JCQkJCWlmIChmb2N1c0NvbnRyb2wgPT0gbGlzdCB8fCBmb2N1c0NvbnRyb2wgPT0gdGV4dCkgcmV0dXJuOwotCQkJCQloYXNGb2N1cyA9IGZhbHNlOwotCQkJCQlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNPdXQsIGUpOwotCQkJCX0KLQkJCX0pOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTV1QuU2VsZWN0aW9uOiB7Ci0JCQlkcm9wRG93biAoIWlzRHJvcHBlZCAoKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLS8qKgotKiBDbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotKiA8cD4KLSoKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTKQotKgl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfV0lER0VUX0RJU1BPU0VEKQotKgl3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQKLSovCi1wdWJsaWMgdm9pZCBjbGVhclNlbGVjdGlvbiAoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQl0ZXh0LmNsZWFyU2VsZWN0aW9uICgpOwotCWxpc3QuZGVzZWxlY3RBbGwgKCk7Ci19Ci12b2lkIGNvbWJvRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0Jc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCWNhc2UgU1dULkRpc3Bvc2U6Ci0JCQlpZiAocG9wdXAgIT0gbnVsbCAmJiAhcG9wdXAuaXNEaXNwb3NlZCAoKSkgcG9wdXAuZGlzcG9zZSAoKTsKLQkJCXBvcHVwID0gbnVsbDsgIAotCQkJdGV4dCA9IG51bGw7ICAKLQkJCWxpc3QgPSBudWxsOyAgCi0JCQlhcnJvdyA9IG51bGw7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1QuTW92ZToKLQkJCWRyb3BEb3duKGZhbHNlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNXVC5SZXNpemU6Ci0JCQlpbnRlcm5hbExheW91dCgpOwotCQkJYnJlYWs7Ci0JfQotfQotCi1wdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUgKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQljaGVja1dpZGdldCgpOwotCWludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0JUG9pbnQgdGV4dFNpemUgPSB0ZXh0LmNvbXB1dGVTaXplICh3SGludCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpOwotCVBvaW50IGFycm93U2l6ZSA9IGFycm93LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7Ci0JUG9pbnQgbGlzdFNpemUgPSBsaXN0LmNvbXB1dGVTaXplICh3SGludCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpOwotCWludCBib3JkZXJXaWR0aCA9IGdldEJvcmRlcldpZHRoKCk7Ci0JCi0JaGVpZ2h0ID0gTWF0aC5tYXggKGhIaW50LCBNYXRoLm1heCh0ZXh0U2l6ZS55LCBhcnJvd1NpemUueSkgICsgMipib3JkZXJXaWR0aCk7Ci0Jd2lkdGggPSBNYXRoLm1heCAod0hpbnQsIE1hdGgubWF4KHRleHRTaXplLnggKyBhcnJvd1NpemUueCArIDIqYm9yZGVyV2lkdGgsIGxpc3RTaXplLnggKyAyKSAgKTsKLQlyZXR1cm4gbmV3IFBvaW50ICh3aWR0aCwgaGVpZ2h0KTsKLX0KLS8qKgotKiBEZXNlbGVjdHMgYW4gaXRlbS4KLSogPHA+Ci0qIElmIHRoZSBpdGVtIGF0IGFuIGluZGV4IGlzIHNlbGVjdGVkLCBpdCBpcwotKiBkZXNlbGVjdGVkLiAgSWYgdGhlIGl0ZW0gYXQgYW4gaW5kZXggaXMgbm90Ci0qIHNlbGVjdGVkLCBpdCByZW1haW5zIGRlc2VsZWN0ZWQuICBJbmRpY2VzCi0qIHRoYXQgYXJlIG91dCBvZiByYW5nZSBhcmUgaWdub3JlZC4gIEluZGV4aW5nCi0qIGlzIHplcm8gYmFzZWQuCi0qCi0qIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0KLSoKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTKQotKgl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfV0lER0VUX0RJU1BPU0VEKQotKgl3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQKLSovCi1wdWJsaWMgdm9pZCBkZXNlbGVjdCAoaW50IGluZGV4KSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlsaXN0LmRlc2VsZWN0IChpbmRleCk7Ci19Ci0vKioKLSogRGVzZWxlY3RzIGFsbCBpdGVtcy4KLSogPHA+Ci0qCi0qIElmIGFuIGl0ZW0gaXMgc2VsZWN0ZWQsIGl0IGlzIGRlc2VsZWN0ZWQuCi0qIElmIGFuIGl0ZW0gaXMgbm90IHNlbGVjdGVkLCBpdCByZW1haW5zIHVuc2VsZWN0ZWQuCi0qCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSoJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSoJd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkCi0qLwotcHVibGljIHZvaWQgZGVzZWxlY3RBbGwgKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JbGlzdC5kZXNlbGVjdEFsbCAoKTsKLX0KLXZvaWQgZHJvcERvd24gKGJvb2xlYW4gZHJvcCkgewotCWlmIChkcm9wID09IGlzRHJvcHBlZCAoKSkgcmV0dXJuOwotCWlmICghZHJvcCkgewotCQlwb3B1cC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0JCXRleHQuc2V0Rm9jdXMoKTsKLQkJcmV0dXJuOwotCX0KLQotCWludCBpbmRleCA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JaWYgKGluZGV4ICE9IC0xKSBsaXN0LnNldFRvcEluZGV4IChpbmRleCk7Ci0JRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLQlSZWN0YW5nbGUgbGlzdFJlY3QgPSBsaXN0LmdldEJvdW5kcyAoKTsKLQlSZWN0YW5nbGUgcGFyZW50UmVjdCA9IGRpc3BsYXkubWFwIChnZXRQYXJlbnQgKCksIG51bGwsIGdldEJvdW5kcygpKTsKLQlQb2ludCBjb21ib1NpemUgPSBnZXRTaXplICgpOwotCVJlY3RhbmdsZSBkaXNwbGF5UmVjdCA9IGdldE1vbml0b3IoKS5nZXRDbGllbnRBcmVhKCk7Ci0JaW50IHdpZHRoID0gTWF0aC5tYXggKGNvbWJvU2l6ZS54LCBsaXN0UmVjdC53aWR0aCArIDIpOwotCWludCBoZWlnaHQgPSBsaXN0UmVjdC5oZWlnaHQgKyAyOwotCWludCB4ID0gcGFyZW50UmVjdC54OwotCWludCB5ID0gcGFyZW50UmVjdC55ICsgY29tYm9TaXplLnk7Ci0JaWYgKHkgKyBoZWlnaHQgPiBkaXNwbGF5UmVjdC55ICsgZGlzcGxheVJlY3QuaGVpZ2h0KSB5ID0gcGFyZW50UmVjdC55IC0gaGVpZ2h0OwotCXBvcHVwLnNldEJvdW5kcyAoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0JcG9wdXAuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JbGlzdC5zZXRGb2N1cygpOwotfQotcHVibGljIENvbnRyb2wgW10gZ2V0Q2hpbGRyZW4gKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIG5ldyBDb250cm9sIFswXTsKLX0KLWJvb2xlYW4gZ2V0RWRpdGFibGUgKCkgewotCXJldHVybiB0ZXh0LmdldEVkaXRhYmxlICgpOwotfQotLyoqCi0qIEdldHMgYW4gaXRlbSBhdCBhbiBpbmRleC4KLSogPHA+Ci0qIEluZGV4aW5nIGlzIHplcm8gYmFzZWQuCi0qCi0qIFRoaXMgb3BlcmF0aW9uIHdpbGwgZmFpbCB3aGVuIHRoZSBpbmRleCBpcyBvdXQKLSogb2YgcmFuZ2Ugb3IgYW4gaXRlbSBjb3VsZCBub3QgYmUgcXVlcmllZCBmcm9tCi0qIHRoZSBPUy4KLSoKLSogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbQotKiBAcmV0dXJuIHRoZSBpdGVtCi0qCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSoJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSoJd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX0NBTk5PVF9HRVRfSVRFTSkKLSoJd2hlbiB0aGUgb3BlcmF0aW9uIGZhaWxzCi0qLwotcHVibGljIFN0cmluZyBnZXRJdGVtIChpbnQgaW5kZXgpIHsKLQljaGVja1dpZGdldCgpOwotCXJldHVybiBsaXN0LmdldEl0ZW0gKGluZGV4KTsKLX0KLS8qKgotKiBHZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMuCi0qIDxwPgotKiBUaGlzIG9wZXJhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIG51bWJlciBvZgotKiBpdGVtcyBjb3VsZCBub3QgYmUgcXVlcmllZCBmcm9tIHRoZSBPUy4KLSoKLSogQHJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB3aWRnZXQKLSoKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTKQotKgl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfV0lER0VUX0RJU1BPU0VEKQotKgl3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfQ0FOTk9UX0dFVF9DT1VOVCkKLSoJd2hlbiB0aGUgb3BlcmF0aW9uIGZhaWxzCi0qLwotcHVibGljIGludCBnZXRJdGVtQ291bnQgKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIGxpc3QuZ2V0SXRlbUNvdW50ICgpOwotfQotLyoqCi0qIEdldHMgdGhlIGhlaWdodCBvZiBvbmUgaXRlbS4KLSogPHA+Ci0qIFRoaXMgb3BlcmF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgaGVpZ2h0IG9mCi0qIG9uZSBpdGVtIGNvdWxkIG5vdCBiZSBxdWVyaWVkIGZyb20gdGhlIE9TLgotKgotKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2Ygb25lIGl0ZW0gaW4gdGhlIHdpZGdldAotKgotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9DQU5OT1RfR0VUX0lURU1fSEVJR0hUKQotKgl3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMKLSovCi1wdWJsaWMgaW50IGdldEl0ZW1IZWlnaHQgKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIGxpc3QuZ2V0SXRlbUhlaWdodCAoKTsKLX0KLS8qKgotKiBHZXRzIHRoZSBpdGVtcy4KLSogPHA+Ci0qIFRoaXMgb3BlcmF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgaXRlbXMgY2Fubm90Ci0qIGJlIHF1ZXJpZWQgZnJvbSB0aGUgT1MuCi0qCi0qIEByZXR1cm4gdGhlIGl0ZW1zIGluIHRoZSB3aWRnZXQKLSoKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTKQotKgl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfV0lER0VUX0RJU1BPU0VEKQotKgl3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfQ0FOTk9UX0dFVF9JVEVNKQotKgl3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMKLSovCi1wdWJsaWMgU3RyaW5nIFtdIGdldEl0ZW1zICgpIHsKLQljaGVja1dpZGdldCgpOwotCXJldHVybiBsaXN0LmdldEl0ZW1zICgpOwotfQotLyoqCi0qIEdldHMgdGhlIHNlbGVjdGlvbi4KLSogPHA+Ci0qIEByZXR1cm4gYSBwb2ludCByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCi0qCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSoJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSoJd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkCi0qLwotcHVibGljIFBvaW50IGdldFNlbGVjdGlvbiAoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gdGV4dC5nZXRTZWxlY3Rpb24gKCk7Ci19Ci0vKioKLSogR2V0cyB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0uCi0qIDxwPgotKiBJbmRleGluZyBpcyB6ZXJvIGJhc2VkLgotKiBJZiBubyBpdGVtIGlzIHNlbGVjdGVkIC0xIGlzIHJldHVybmVkLgotKgotKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbS4KLSoKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTKQotKgl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfV0lER0VUX0RJU1BPU0VEKQotKgl3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQKLSovCi1wdWJsaWMgaW50IGdldFNlbGVjdGlvbkluZGV4ICgpIHsKLQljaGVja1dpZGdldCgpOwotCXJldHVybiBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotfQotLyoqCi0qIEdldHMgdGhlIHdpZGdldCB0ZXh0LgotKiA8cD4KLSogSWYgdGhlIHdpZGdldCBoYXMgbm8gdGV4dCwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgotKgotKiBAcmV0dXJuIHRoZSB3aWRnZXQgdGV4dAotKgotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKi8KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCAoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gdGV4dC5nZXRUZXh0ICgpOwotfQotLyoqCi0qIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgY29tYm8ncyB0ZXh0IGZpZWxkLgotKiA8cD4KLSogVGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIGhlaWdodCBjYW5ub3QgCi0qIGJlIHF1ZXJpZWQgZnJvbSB0aGUgT1MuCi0KLSogQHJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSBjb21ibydzIHRleHQgZmllbGQuCi0qIAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9FUlJPUl9DQU5OT1RfR0VUX0lURU1fSEVJR0hUKQotKgl3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMKLSovCi1wdWJsaWMgaW50IGdldFRleHRIZWlnaHQgKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIHRleHQuZ2V0TGluZUhlaWdodCgpOwotfQotLyoqCi0qIEdldHMgdGhlIHRleHQgbGltaXQuCi0qIDxwPgotKiBAcmV0dXJuIHRoZSB0ZXh0IGxpbWl0Ci0qIAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKi8KLXB1YmxpYyBpbnQgZ2V0VGV4dExpbWl0ICgpIHsKLQljaGVja1dpZGdldCgpOwotCXJldHVybiB0ZXh0LmdldFRleHRMaW1pdCAoKTsKLX0KLS8qKgotKiBHZXRzIHRoZSBpbmRleCBvZiBhbiBpdGVtLgotKiA8cD4KLSogVGhlIGxpc3QgaXMgc2VhcmNoZWQgc3RhcnRpbmcgYXQgMCB1bnRpbCBhbgotKiBpdGVtIGlzIGZvdW5kIHRoYXQgaXMgZXF1YWwgdG8gdGhlIHNlYXJjaCBpdGVtLgotKiBJZiBubyBpdGVtIGlzIGZvdW5kLCAtMSBpcyByZXR1cm5lZC4gIEluZGV4aW5nCi0qIGlzIHplcm8gYmFzZWQuCi0qCi0qIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0qIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBpdGVtCi0qCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSoJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSoJd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX05VTExfQVJHVU1FTlQpCi0qCXdoZW4gc3RyaW5nIGlzIG51bGwKLSovCi1wdWJsaWMgaW50IGluZGV4T2YgKFN0cmluZyBzdHJpbmcpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JcmV0dXJuIGxpc3QuaW5kZXhPZiAoc3RyaW5nKTsKLX0KLS8qKgotKiBHZXRzIHRoZSBpbmRleCBvZiBhbiBpdGVtLgotKiA8cD4KLSogVGhlIHdpZGdldCBpcyBzZWFyY2hlZCBzdGFydGluZyBhdCBzdGFydCBpbmNsdWRpbmcKLSogdGhlIGVuZCBwb3NpdGlvbiB1bnRpbCBhbiBpdGVtIGlzIGZvdW5kIHRoYXQKLSogaXMgZXF1YWwgdG8gdGhlIHNlYXJjaCBpdGVubS4gIElmIG5vIGl0ZW0gaXMKLSogZm91bmQsIC0xIGlzIHJldHVybmVkLiAgSW5kZXhpbmcgaXMgemVybyBiYXNlZC4KLSoKLSogQHBhcmFtIHN0cmluZyB0aGUgc2VhcmNoIGl0ZW0KLSogQHBhcmFtIGluZGV4IHRoZSBzdGFydGluZyBwb3NpdGlvbgotKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgaXRlbQotKgotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9OVUxMX0FSR1VNRU5UKQotKgl3aGVuIHN0cmluZyBpcyBudWxsCi0qLwotcHVibGljIGludCBpbmRleE9mIChTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnQpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JcmV0dXJuIGxpc3QuaW5kZXhPZiAoc3RyaW5nLCBzdGFydCk7Ci19Ci0KLXZvaWQgaW5pdEFjY2Vzc2libGUoKSB7Ci0JZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCWUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQoKTsKLQkJfQotCX0pOwotCQotCWdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlVGV4dEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldENhcmV0T2Zmc2V0KEFjY2Vzc2libGVUZXh0RXZlbnQgZSkgewotCQkJZS5vZmZzZXQgPSB0ZXh0LmdldENhcmV0UG9zaXRpb24oKTsKLQkJfQotCX0pOwotCQotCWdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCVBvaW50IHRlc3RQb2ludCA9IHRvQ29udHJvbChuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQkJCWlmIChnZXRCb3VuZHMoKS5jb250YWlucyh0ZXN0UG9pbnQpKSB7Ci0JCQkJZS5jaGlsZElEID0gQUNDLkNISUxESURfU0VMRjsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZ2V0TG9jYXRpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgbG9jYXRpb24gPSBnZXRCb3VuZHMoKTsKLQkJCVBvaW50IHB0ID0gdG9EaXNwbGF5KG5ldyBQb2ludChsb2NhdGlvbi54LCBsb2NhdGlvbi55KSk7Ci0JCQllLnggPSBwdC54OwotCQkJZS55ID0gcHQueTsKLQkJCWUud2lkdGggPSBsb2NhdGlvbi53aWR0aDsKLQkJCWUuaGVpZ2h0ID0gbG9jYXRpb24uaGVpZ2h0OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJZS5kZXRhaWwgPSAwOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBnZXRSb2xlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJZS5kZXRhaWwgPSBBQ0MuUk9MRV9DT01CT0JPWDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQllLmRldGFpbCA9IEFDQy5TVEFURV9OT1JNQUw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBnZXRWYWx1ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCWUucmVzdWx0ID0gZ2V0VGV4dCgpOwotCQl9Ci0JfSk7Ci19Ci1ib29sZWFuIGlzRHJvcHBlZCAoKSB7Ci0JcmV0dXJuIHBvcHVwLmdldFZpc2libGUgKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQ29udHJvbCAoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAodGV4dC5pc0ZvY3VzQ29udHJvbCgpIHx8IGFycm93LmlzRm9jdXNDb250cm9sKCkgfHwgbGlzdC5pc0ZvY3VzQ29udHJvbCgpIHx8IHBvcHVwLmlzRm9jdXNDb250cm9sKCkpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHN1cGVyLmlzRm9jdXNDb250cm9sKCk7Ci0JfQotfQotCi0vL3B1YmxpYyBib29sZWFuIGlzTGlzdFZpc2libGUoKQotLy97Ci0vLyAgY2hlY2tXaWRnZXQoKTsKLS8vICByZXR1cm4gbGlzdC5pc1Zpc2libGUoKTsKLS8vfQotCi12b2lkIGludGVybmFsTGF5b3V0ICgpIHsKLQlpZiAoaXNEcm9wcGVkICgpKSBkcm9wRG93biAoZmFsc2UpOwotCQotCVJlY3RhbmdsZSByZWN0ID0gZ2V0Q2xpZW50QXJlYSgpOwotCWludCB3aWR0aCA9IHJlY3Qud2lkdGg7Ci0JaW50IGhlaWdodCA9IHJlY3QuaGVpZ2h0OwotCVBvaW50IGFycm93U2l6ZSA9IGFycm93LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBoZWlnaHQpOwotCXRleHQuc2V0Qm91bmRzICgwLCAwLCB3aWR0aCAtIGFycm93U2l6ZS54LCBoZWlnaHQpOwotCWFycm93LnNldEJvdW5kcyAod2lkdGggLSBhcnJvd1NpemUueCwgMCwgYXJyb3dTaXplLngsIGFycm93U2l6ZS55KTsKLQkKLQlQb2ludCBzaXplID0gZ2V0U2l6ZSgpOwotCWludCBpdGVtQ291bnQgPSBsaXN0LmdldEl0ZW1Db3VudCgpOwotCWl0ZW1Db3VudCA9IChpdGVtQ291bnQgPT0gMCkgPyBtYXhJdGVtQ291bnQgOiBNYXRoLm1pbihtYXhJdGVtQ291bnQsIGl0ZW1Db3VudCk7Ci0JaW50IGl0ZW1IZWlnaHQgPSBsaXN0LmdldEl0ZW1IZWlnaHQgKCkgKiBpdGVtQ291bnQ7Ci0JUG9pbnQgbGlzdFNpemUgPSBsaXN0LmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgaXRlbUhlaWdodCk7Ci0JbGlzdC5zZXRCb3VuZHMgKDEsIDEsIE1hdGgubWF4IChzaXplLnggLSAyLCBsaXN0U2l6ZS54KSwgbGlzdFNpemUueSk7Ci19Ci12b2lkIGxpc3RFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJY2FzZSBTV1QuRm9jdXNJbjogewotCQkJaWYgKGhhc0ZvY3VzKSByZXR1cm47Ci0JCQloYXNGb2N1cyA9IHRydWU7Ci0JCQlpZiAoZ2V0RWRpdGFibGUgKCkpIHRleHQuc2VsZWN0QWxsICgpOwotCQkJRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotCQkJZS50aW1lID0gZXZlbnQudGltZTsKLQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNJbiwgZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5Gb2N1c091dDogewotCQkJZXZlbnQuZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKER5bmFtaWNDZWxsRWRpdG9yLnRoaXMuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCUNvbnRyb2wgZm9jdXNDb250cm9sID0gZ2V0RGlzcGxheSgpLmdldEZvY3VzQ29udHJvbCgpOwotCQkJCQlpZiAoZm9jdXNDb250cm9sID09IHRleHQgfHwgZm9jdXNDb250cm9sID09IGFycm93IHx8IGZvY3VzQ29udHJvbCA9PSBsaXN0KSByZXR1cm47Ci0JCQkJCWhhc0ZvY3VzID0gZmFsc2U7Ci0JCQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c091dCwgZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5Nb3VzZVVwOiB7Ci0JCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCWRyb3BEb3duIChmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5TZWxlY3Rpb246IHsKLQkJCWludCBpbmRleCA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQlpZiAoaW5kZXggPT0gLTEpIHJldHVybjsKLQkJCXRleHQuc2V0VGV4dCAobGlzdC5nZXRJdGVtIChpbmRleCkpOwotCQkJdGV4dC5zZWxlY3RBbGwgKCk7Ci0JCQlsaXN0LnNldFNlbGVjdGlvbihpbmRleCk7Ci0JCQlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0JCQllLnRpbWUgPSBldmVudC50aW1lOwotCQkJZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0JCQllLmRvaXQgPSBldmVudC5kb2l0OwotCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIGUpOwotCQkJZXZlbnQuZG9pdCA9IGUuZG9pdDsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU1dULlRyYXZlcnNlOiB7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9ORVhUOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVM6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVDoKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJCWUudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQllLmRldGFpbCA9IGV2ZW50LmRldGFpbDsKLQkJCWUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0JCQllLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5UcmF2ZXJzZSwgZSk7Ci0JCQlldmVudC5kb2l0ID0gZS5kb2l0OwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTV1QuS2V5VXA6IHsJCQotCQkJRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotCQkJZS50aW1lID0gZXZlbnQudGltZTsKLQkJCWUuY2hhcmFjdGVyID0gZXZlbnQuY2hhcmFjdGVyOwotCQkJZS5rZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLQkJCWUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlVcCwgZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5LZXlEb3duOiB7Ci0JCQlpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5FU0MpIHsgCi0JCQkJLy8gZXNjYXBlIGtleSBjYW5jZWxzIHBvcHVwIGxpc3QKLQkJCQlkcm9wRG93biAoZmFsc2UpOwotCQkJfQotCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IgfHwgZXZlbnQuY2hhcmFjdGVyID09ICdcdCcpIHsKLQkJCQkvLyBFbnRlciBhbmQgVGFiIGNhdXNlIGRlZmF1bHQgc2VsZWN0aW9uCi0JCQkJZHJvcERvd24gKGZhbHNlKTsKLQkJCQlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0JCQkJZS50aW1lID0gZXZlbnQudGltZTsKLQkJCQllLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULkRlZmF1bHRTZWxlY3Rpb24sIGUpOwotCQkJfQotCQkJLy9BdCB0aGlzIHBvaW50IHRoZSB3aWRnZXQgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZC4KLQkJCS8vIElmIHNvLCBkbyBub3QgY29udGludWUuCi0JCQlpZiAoaXNEaXNwb3NlZCgpKSBicmVhazsKLQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJCWUudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQllLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLQkJCWUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0JCQllLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuS2V5RG93biwgZSk7Ci0JCQlicmVhazsKLQkJCQotCQl9Ci0JfQotfQotdm9pZCBwb3B1cEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0Jc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCWNhc2UgU1dULlBhaW50OgotCQkJLy8gZHJhdyBibGFjayByZWN0YW5nbGUgYXJvdW5kIGxpc3QKLQkJCVJlY3RhbmdsZSBsaXN0UmVjdCA9IGxpc3QuZ2V0Qm91bmRzKCk7Ci0JCQlDb2xvciBibGFjayA9IGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spOwotCQkJZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChibGFjayk7Ci0JCQlldmVudC5nYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIGxpc3RSZWN0LndpZHRoICsgMSwgbGlzdFJlY3QuaGVpZ2h0ICsgMSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1QuQ2xvc2U6Ci0JCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQlkcm9wRG93biAoZmFsc2UpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1dULkRlYWN0aXZhdGU6Ci0JCQlkcm9wRG93biAoZmFsc2UpOwotCQkJYnJlYWs7Ci0JfQotfQotcHVibGljIHZvaWQgcmVkcmF3ICgpIHsKLQlzdXBlci5yZWRyYXcoKTsKLQl0ZXh0LnJlZHJhdygpOwotCWFycm93LnJlZHJhdygpOwotCWlmIChwb3B1cC5pc1Zpc2libGUoKSkgbGlzdC5yZWRyYXcoKTsKLX0KLXB1YmxpYyB2b2lkIHJlZHJhdyAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gYWxsKSB7Ci0Jc3VwZXIucmVkcmF3KHgsIHksIHdpZHRoLCBoZWlnaHQsIHRydWUpOwotfQotCi0vKioKLSogUmVtb3ZlcyBhbiBpdGVtIGF0IGFuIGluZGV4LgotKiA8cD4KLSogSW5kZXhpbmcgaXMgemVybyBiYXNlZC4KLSoKLSogVGhpcyBvcGVyYXRpb24gd2lsbCBmYWlsIHdoZW4gdGhlIGluZGV4IGlzIG91dAotKiBvZiByYW5nZSBvciBhbiBpdGVtIGNvdWxkIG5vdCBiZSByZW1vdmVkIGZyb20KLSogdGhlIE9TLgotKgotKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtCi0qIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBzdGF0ZQotKgotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9JVEVNX05PVF9SRU1PVkVEKQotKgl3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMKLSovCi1wdWJsaWMgdm9pZCByZW1vdmUgKGludCBpbmRleCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JbGlzdC5yZW1vdmUgKGluZGV4KTsKLX0KLS8qKgotKiBSZW1vdmVzIGEgcmFuZ2Ugb2YgaXRlbXMuCi0qIDxwPgotKiBJbmRleGluZyBpcyB6ZXJvIGJhc2VkLiAgVGhlIHJhbmdlIG9mIGl0ZW1zCi0qIGlzIGZyb20gdGhlIHN0YXJ0IGluZGV4IHVwIHRvIGFuZCBpbmNsdWRpbmcKLSogdGhlIGVuZCBpbmRleC4KLSoKLSogVGhpcyBvcGVyYXRpb24gd2lsbCBmYWlsIHdoZW4gdGhlIGluZGV4IGlzIG91dAotKiBvZiByYW5nZSBvciBhbiBpdGVtIGNvdWxkIG5vdCBiZSByZW1vdmVkIGZyb20KLSogdGhlIE9TLgotKgotKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHJhbmdlCi0qCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSoJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSoJd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX0lURU1fTk9UX1JFTU9WRUQpCi0qCXdoZW4gdGhlIG9wZXJhdGlvbiBmYWlscwotKi8KLXB1YmxpYyB2b2lkIHJlbW92ZSAoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlsaXN0LnJlbW92ZSAoc3RhcnQsIGVuZCk7Ci19Ci0vKioKLSogUmVtb3ZlcyBhbiBpdGVtLgotKiA8cD4KLSogVGhpcyBvcGVyYXRpb24gd2lsbCBmYWlsIHdoZW4gdGhlIGl0ZW0KLSogY291bGQgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgT1MuCi0qCi0qIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0qCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSoJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSoJd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX05VTExfQVJHVU1FTlQpCi0qCXdoZW4gc3RyaW5nIGlzIG51bGwKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfSVRFTV9OT1RfUkVNT1ZFRCkKLSoJd2hlbiB0aGUgb3BlcmF0aW9uIGZhaWxzCi0qLwotcHVibGljIHZvaWQgcmVtb3ZlIChTdHJpbmcgc3RyaW5nKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWxpc3QucmVtb3ZlIChzdHJpbmcpOwotfQotLyoqCi0qIFJlbW92ZXMgYWxsIGl0ZW1zLgotKiA8cD4KLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTKQotKgl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfV0lER0VUX0RJU1BPU0VEKQotKgl3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQKLSovCi1wdWJsaWMgdm9pZCByZW1vdmVBbGwgKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JdGV4dC5zZXRUZXh0ICgiIik7IC8vJE5PTi1OTFMtMSQKLQlsaXN0LnJlbW92ZUFsbCAoKTsKLX0KLS8qKgkgCi0qIFJlbW92ZXMgdGhlIGxpc3RlbmVyLgotKiA8cD4KLSoKLSogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotKgotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9OVUxMX0FSR1VNRU5UKQotKgl3aGVuIGxpc3RlbmVyIGlzIG51bGwKLSovCi1wdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lciAoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChsaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlyZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCBsaXN0ZW5lcik7CQotfQotLyoqCSAKLSogUmVtb3ZlcyB0aGUgbGlzdGVuZXIuCi0qIDxwPgotKgotKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0qCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSoJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSoJd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX05VTExfQVJHVU1FTlQpCi0qCXdoZW4gbGlzdGVuZXIgaXMgbnVsbAotKi8KLXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyIChTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXJlbW92ZUxpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQlyZW1vdmVMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbixsaXN0ZW5lcik7CQotfQotLyoqCi0qIFNlbGVjdHMgYW4gaXRlbS4KLSogPHA+Ci0qIElmIHRoZSBpdGVtIGF0IGFuIGluZGV4IGlzIG5vdCBzZWxlY3RlZCwgaXQgaXMKLSogc2VsZWN0ZWQuIEluZGljZXMgdGhhdCBhcmUgb3V0IG9mCi0qIHJhbmdlIGFyZSBpZ25vcmVkLiAgSW5kZXhpbmcgaXMgemVybyBiYXNlZC4KLSoKLSogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbQotKgotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKi8KLXB1YmxpYyB2b2lkIHNlbGVjdCAoaW50IGluZGV4KSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJbGlzdC5kZXNlbGVjdEFsbCAoKTsKLQkJdGV4dC5zZXRUZXh0ICgiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuOwotCX0KLQlpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IGxpc3QuZ2V0SXRlbUNvdW50KCkpIHsKLQkJaWYgKGluZGV4ICE9IGdldFNlbGVjdGlvbkluZGV4KCkpIHsKLQkJCXRleHQuc2V0VGV4dCAobGlzdC5nZXRJdGVtIChpbmRleCkpOwotCQkJdGV4dC5zZWxlY3RBbGwgKCk7Ci0JCQlsaXN0LnNlbGVjdCAoaW5kZXgpOwotCQkJbGlzdC5zaG93U2VsZWN0aW9uICgpOwotCQl9Ci0JfQotfQotcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZCAoQ29sb3IgY29sb3IpIHsKLQlzdXBlci5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlpZiAodGV4dCAhPSBudWxsKSB0ZXh0LnNldEJhY2tncm91bmQoY29sb3IpOwotCWlmIChsaXN0ICE9IG51bGwpIGxpc3Quc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JaWYgKGFycm93ICE9IG51bGwpIGFycm93LnNldEJhY2tncm91bmQoY29sb3IpOwotfQotcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMgKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIHRleHQuc2V0Rm9jdXMgKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRGb250IChGb250IGZvbnQpIHsKLQlzdXBlci5zZXRGb250IChmb250KTsKLQl0ZXh0LnNldEZvbnQgKGZvbnQpOwotCWxpc3Quc2V0Rm9udCAoZm9udCk7Ci0JaW50ZXJuYWxMYXlvdXQgKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kIChDb2xvciBjb2xvcikgewotCXN1cGVyLnNldEZvcmVncm91bmQoY29sb3IpOwotCWlmICh0ZXh0ICE9IG51bGwpIHRleHQuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JaWYgKGxpc3QgIT0gbnVsbCkgbGlzdC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlpZiAoYXJyb3cgIT0gbnVsbCkgYXJyb3cuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci19Ci0vKioKLSogU2V0cyB0aGUgdGV4dCBvZiBhbiBpdGVtOyBpbmRleGluZyBpcyB6ZXJvIGJhc2VkLgotKgotKiBUaGlzIG9wZXJhdGlvbiB3aWxsIGZhaWwgd2hlbiB0aGUgaW5kZXggaXMgb3V0Ci0qIG9mIHJhbmdlIG9yIGFuIGl0ZW0gY291bGQgbm90IGJlIGNoYW5nZWQgaW4KLSogdGhlIE9TLgotKgotKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGZvciB0aGUgaXRlbQotKiBAcGFyYW0gc3RyaW5nIHRoZSBpdGVtCi0qCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSoJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSoJd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX05VTExfQVJHVU1FTlQpCi0qCXdoZW4gaXRlbXMgaXMgbnVsbAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9JVEVNX05PVF9NT0RJRklFRCkKLSoJd2hlbiB0aGUgb3BlcmF0aW9uIGZhaWxzCi0qLwotcHVibGljIHZvaWQgc2V0SXRlbSAoaW50IGluZGV4LCBTdHJpbmcgc3RyaW5nKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWxpc3Quc2V0SXRlbSAoaW5kZXgsIHN0cmluZyk7Ci19Ci0vKioKLSogU2V0cyBhbGwgaXRlbXMuCi0qCi0qIEBwYXJhbSBpdGVtcyB0aGUgYXJyYXkgb2YgaXRlbXMKLSoKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTKQotKgl3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfV0lER0VUX0RJU1BPU0VEKQotKgl3aGVuIHRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQKLSogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IoRVJST1JfTlVMTF9BUkdVTUVOVCkKLSoJd2hlbiBpdGVtcyBpcyBudWxsCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX0lURU1fTk9UX0FEREVEKQotKgl3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMKLSovCi1wdWJsaWMgdm9pZCBzZXRJdGVtcyAoU3RyaW5nIFtdIGl0ZW1zKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoaXRlbXMgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaW50IHN0eWxlID0gZ2V0U3R5bGUoKTsKLQlpZiAoKHN0eWxlICYgU1dULlJFQURfT05MWSkgIT0gMCkgdGV4dC5zZXRUZXh0ICgiIik7IC8vJE5PTi1OTFMtMSQKLQlsaXN0LnNldEl0ZW1zIChpdGVtcyk7Ci19Ci0vKioKLSogU2V0cyB0aGUgbmV3IHNlbGVjdGlvbi4KLSoKLSogQHBhcmFtIHNlbGVjdGlvbiBwb2ludCByZXByZXNlbnRpbmcgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBuZXcgc2VsZWN0aW9uCi0qCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUykKLSoJd2hlbiBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX1dJREdFVF9ESVNQT1NFRCkKLSoJd2hlbiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGRpc3Bvc2VkCi0qIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yKEVSUk9SX05VTExfQVJHVU1FTlQpCi0qCXdoZW4gc2VsZWN0aW9uIGlzIG51bGwKLSovCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24gKFBvaW50IHNlbGVjdGlvbikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKHNlbGVjdGlvbiA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl0ZXh0LnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi55KTsKLX0KLQotLyoqCi0qIFNldHMgdGhlIHdpZGdldCB0ZXh0LgotKgotKiBAcGFyYW0gc3RyaW5nIHRoZSB3aWRnZXQgdGV4dAotKgotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9OVUxMX0FSR1VNRU5UKQotKgl3aGVuIHN0cmluZyBpcyBudWxsCi0qLwotcHVibGljIHZvaWQgc2V0VGV4dCAoU3RyaW5nIHN0cmluZykgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKHN0cmluZyA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YgKHN0cmluZyk7Ci0JaWYgKGluZGV4ID09IC0xKSB7Ci0JCWxpc3QuZGVzZWxlY3RBbGwgKCk7Ci0JCXRleHQuc2V0VGV4dCAoc3RyaW5nKTsKLQkJcmV0dXJuOwotCX0KLQl0ZXh0LnNldFRleHQgKHN0cmluZyk7Ci0JdGV4dC5zZWxlY3RBbGwgKCk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24gKGluZGV4KTsKLQlsaXN0LnNob3dTZWxlY3Rpb24gKCk7Ci19Ci0vKioKLSogU2V0cyB0aGUgdGV4dCBsaW1pdC4KLSogCi0qIEBwYXJhbSBsaW1pdCBuZXcgdGV4dCBsaW1pdAotKgotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MpCi0qCXdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9XSURHRVRfRElTUE9TRUQpCi0qCXdoZW4gdGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZAotKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcihFUlJPUl9DQU5OT1RfQkVfWkVSTykKLSoJd2hlbiBsaW1pdCBpcyAwCi0qLwotcHVibGljIHZvaWQgc2V0VGV4dExpbWl0IChpbnQgbGltaXQpIHsKLQljaGVja1dpZGdldCgpOwotCXRleHQuc2V0VGV4dExpbWl0IChsaW1pdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0IChTdHJpbmcgc3RyaW5nKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlzdXBlci5zZXRUb29sVGlwVGV4dChzdHJpbmcpOwotCWFycm93LnNldFRvb2xUaXBUZXh0IChzdHJpbmcpOwotCXRleHQuc2V0VG9vbFRpcFRleHQgKHN0cmluZyk7CQkKLX0KLQotcHVibGljIHZvaWQgc2V0VmlzaWJsZSAoYm9vbGVhbiB2aXNpYmxlKSB7Ci0Jc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQlpZiAoIXZpc2libGUpIHBvcHVwLnNldFZpc2libGUoZmFsc2UpOwotfQotCi12b2lkIHRleHRFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJY2FzZSBTV1QuRm9jdXNJbjogewotCQkJaWYgKGhhc0ZvY3VzKSByZXR1cm47Ci0JCQloYXNGb2N1cyA9IHRydWU7Ci0JCQlpZiAoZ2V0RWRpdGFibGUgKCkpIHRleHQuc2VsZWN0QWxsICgpOwotCQkJRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotCQkJZS50aW1lID0gZXZlbnQudGltZTsKLQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNJbiwgZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5Gb2N1c091dDogewotCQkJZXZlbnQuZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKER5bmFtaWNDZWxsRWRpdG9yLnRoaXMuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCUNvbnRyb2wgZm9jdXNDb250cm9sID0gZ2V0RGlzcGxheSgpLmdldEZvY3VzQ29udHJvbCgpOwotCQkJCQlpZiAoZm9jdXNDb250cm9sID09IGxpc3QgfHwgZm9jdXNDb250cm9sID09IGFycm93KSByZXR1cm47Ci0JCQkJCWhhc0ZvY3VzID0gZmFsc2U7Ci0JCQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c091dCwgZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5LZXlEb3duOiB7Ci0JCQkKLQkJCWlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkVTQykgeyAvLyBlc2NhcGUga2V5IGNhbmNlbHMgcG9wdXAgbGlzdAotCQkJCWRyb3BEb3duIChmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5DUikgewotCQkJCWRyb3BEb3duIChmYWxzZSk7Ci0JCQkJRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotCQkJCWUudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQkJZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0JCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBlKTsKLQkJCX0KLQkJCS8vQXQgdGhpcyBwb2ludCB0aGUgd2lkZ2V0IG1heSBoYXZlIGJlZW4gZGlzcG9zZWQuCi0JCQkvLyBJZiBzbywgZG8gbm90IGNvbnRpbnVlLgotCQkJaWYgKGlzRGlzcG9zZWQoKSkgYnJlYWs7Ci0JCQkKLQkJCWlmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCB8fCBldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSB7Ci0JCQkJaW50IG9sZEluZGV4ID0gZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQkJaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1VQKSB7Ci0JCQkJCXNlbGVjdCAoTWF0aC5tYXggKG9sZEluZGV4IC0gMSwgMCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlbGVjdCAoTWF0aC5taW4gKG9sZEluZGV4ICsgMSwgZ2V0SXRlbUNvdW50ICgpIC0gMSkpOwotCQkJCX0KLQkJCi0JCQkJaWYgKG9sZEluZGV4ICE9IGdldFNlbGVjdGlvbkluZGV4ICgpKSB7Ci0JCQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJCQkJZS50aW1lID0gZXZlbnQudGltZTsKLQkJCQkJZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBlKTsKLQkJCQl9Ci0JCQkJLy9BdCB0aGlzIHBvaW50IHRoZSB3aWRnZXQgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZC4KLQkJCQkvLyBJZiBzbywgZG8gbm90IGNvbnRpbnVlLgotCQkJCWlmIChpc0Rpc3Bvc2VkKCkpIGJyZWFrOwotCQkJfQotCQkJCi0JCQkvLyBGdXJ0aGVyIHdvcmsgOiBOZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBpbmNyZW1lbnRhbCBzZWFyY2ggaW4gCi0JCQkvLyBwb3AgdXAgbGlzdCBhcyBjaGFyYWN0ZXJzIHR5cGVkIGluIHRleHQgd2lkZ2V0Ci0JCQkJCQkKLQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJCWUudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQllLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLQkJCWUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0JCQllLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuS2V5RG93biwgZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5LZXlVcDogewotCQkJRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotCQkJZS50aW1lID0gZXZlbnQudGltZTsKLQkJCWUuY2hhcmFjdGVyID0gZXZlbnQuY2hhcmFjdGVyOwotCQkJZS5rZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLQkJCWUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlVcCwgZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5Nb2RpZnk6IHsKLQkJCWxpc3QuZGVzZWxlY3RBbGwgKCk7Ci0JCQlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0JCQllLnRpbWUgPSBldmVudC50aW1lOwotCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5Nb2RpZnksIGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTV1QuTW91c2VEb3duOiB7Ci0JCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCWlmICh0ZXh0LmdldEVkaXRhYmxlICgpKSByZXR1cm47Ci0JCQlib29sZWFuIGRyb3BwZWQgPSBpc0Ryb3BwZWQgKCk7Ci0JCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCWlmICghZHJvcHBlZCkgc2V0Rm9jdXMgKCk7Ci0JCQlkcm9wRG93biAoIWRyb3BwZWQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTV1QuTW91c2VVcDogewotCQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCQlpZiAodGV4dC5nZXRFZGl0YWJsZSAoKSkgcmV0dXJuOwotCQkJdGV4dC5zZWxlY3RBbGwgKCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5UcmF2ZXJzZTogewkJCi0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUzoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUOgotCQkJCQkvLyBUaGUgZW50ZXIgY2F1c2VzIGRlZmF1bHQgc2VsZWN0aW9uIGFuZAotCQkJCQkvLyB0aGUgYXJyb3cga2V5cyBhcmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBsaXN0IGNvbnRlbnRzIHNvCi0JCQkJCS8vIGRvIG5vdCB1c2UgdGhlbSBmb3IgdHJhdmVyc2FsLgotCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0JCQllLnRpbWUgPSBldmVudC50aW1lOwotCQkJZS5kZXRhaWwgPSBldmVudC5kZXRhaWw7Ci0JCQllLmRvaXQgPSBldmVudC5kb2l0OwotCQkJZS5rZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuVHJhdmVyc2UsIGUpOwotCQkJZXZlbnQuZG9pdCA9IGUuZG9pdDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRWxlbWVudFByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9FbGVtZW50UHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViYTVkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9FbGVtZW50UHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlRleHRQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuR2xvYmFsRWxlbWVudFJlbmFtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFbGVtZW50UHJvcGVydHlTb3VyY2UgZXh0ZW5kcyBCYXNlUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uYW1lIjsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBibG9ja0NvbWJvVmFsdWVzID0KLSAgICB7ICIiLCAiI2FsbCIsICJleHRlbnNpb24iLCAicmVzdHJpY3Rpb24iLCAic3Vic3RpdHV0aW9uIiB9OwotICBwcml2YXRlIFN0cmluZ1tdIGZpbmFsQ29tYm9WYWx1ZXMgPQotICAgIHsgIiIsICIjYWxsIiwgImV4dGVuc2lvbiIsICJyZXN0cmljdGlvbiIgfTsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBzdWJzdGl0dXRpb25Hcm91cENvbWJvVmFsdWVzID0geyAiIiB9OwotICBwcml2YXRlIFN0cmluZ1tdIGZvcm1Db21ib1ZhbHVlcyA9Ci0gIHsKLSAgICAgICIiLAotICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTUJPX1VOUVVBTElGSUVEIiksCi0gICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ09NQk9fUVVBTElGSUVEIikKLSAgfTsKLQotICBwdWJsaWMgRWxlbWVudFByb3BlcnR5U291cmNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudFByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotICB9Ci0gIAotICBwdWJsaWMgRWxlbWVudFByb3BlcnR5U291cmNlKFZpZXdlciB2aWV3ZXIsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHhzZFNjaGVtYSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgIExpc3QgZ2xvYmFscyA9IGhlbHBlci5nZXRHbG9iYWxFbGVtZW50cygpOwotICAgIGludCBzaXplID0gZ2xvYmFscy5zaXplKCkgKyAxOwotICAgIHN1YnN0aXR1dGlvbkdyb3VwQ29tYm9WYWx1ZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgIHN1YnN0aXR1dGlvbkdyb3VwQ29tYm9WYWx1ZXNbMF0gPSAiIjsKLSAgICBpZiAoZ2xvYmFscyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZ2xvYmFscy5zaXplKCk7IGsrKykKLSAgICAgIHsKLSAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXBDb21ib1ZhbHVlc1trICsgMV0gPSAoU3RyaW5nKSBnbG9iYWxzLmdldChrKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldEVkaXRhYmxlVmFsdWUoKQotCSAqLwotICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotICB7Ci0vLyAgICByZXR1cm4gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLQkgKi8KLSAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgewotICAgIE9iamVjdCBwYXJlbnROb2RlID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgYm9vbGVhbiBpc0dsb2JhbEVsZW1lbnQgPSBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50Tm9kZSwgWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBDcmVhdGUgYSBkZXNjcmlwdG9yIGFuZCBzZXQgYSBjYXRlZ29yeQotLy8gIFRoZXNlIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgZ2VuZXJhbCB0YWIKLS8vICAgIFByb3BlcnR5RGVzY3JpcHRvciBuYW1lRGVzY3JpcHRvciA9Ci0vLyAgICAgIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotLy8gICAgICAgIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwKLS8vICAgICAgICBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotLy8gICAgbGlzdC5hZGQobmFtZURlc2NyaXB0b3IpOwotLy8gICAgVHlwZXNQcm9wZXJ0eURlc2NyaXB0b3IgdHlwZURlc2NyaXB0b3IgPSBuZXcgVHlwZXNQcm9wZXJ0eURlc2NyaXB0b3IoCi0vLyAgICAgICAgWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLAotLy8gICAgICAgIFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwKLS8vICAgICAgICBlbGVtZW50LCB4c2RTY2hlbWEpOwotLy8gICAgbGlzdC5hZGQodHlwZURlc2NyaXB0b3IpOwotICAgIGlmIChpc0dsb2JhbEVsZW1lbnQpCi0gICAgewotICAgICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgYWJzdHJhY3REZXNjcmlwdG9yID0KLSAgICAgICAgbmV3IFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAgIFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUsCi0gICAgICAgICAgWFNEQ29uc3RhbnRzLkFCU1RSQUNUX0FUVFJJQlVURSwKLSAgICAgICAgICB0cnVlRmFsc2VDb21ib1ZhbHVlcyk7Ci0gICAgICBsaXN0LmFkZChhYnN0cmFjdERlc2NyaXB0b3IpOwotICAgIH0KLSAgICBpZiAoIWlzR2xvYmFsRWxlbWVudCkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgbWluT2NjdXJzRGVzY3JpcHRvciA9Ci0gICAgICAgIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAgIFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFLAotICAgICAgICAgIFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgIGxpc3QuYWRkKG1pbk9jY3Vyc0Rlc2NyaXB0b3IpOwotICAgIAotICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIG1heE9jY3Vyc0Rlc2NyaXB0b3IgPQotICAgICAgICBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgICBYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSwKLSAgICAgICAgICBYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICBsaXN0LmFkZChtYXhPY2N1cnNEZXNjcmlwdG9yKTsKLSAgICB9Ci0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgbmlsbGFibGVEZXNjcmlwdG9yID0KLSAgICAgIG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLk5JTExBQkxFX0FUVFJJQlVURSwKLSAgICAgICAgWFNEQ29uc3RhbnRzLk5JTExBQkxFX0FUVFJJQlVURSwKLSAgICAgICAgdHJ1ZUZhbHNlQ29tYm9WYWx1ZXMpOwotICAgIGxpc3QuYWRkKG5pbGxhYmxlRGVzY3JpcHRvcik7Ci0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgYmxvY2tEZXNjcmlwdG9yID0KLSAgICAgIG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSwKLSAgICAgICAgWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSwKLSAgICAgICAgYmxvY2tDb21ib1ZhbHVlcyk7Ci0gICAgbGlzdC5hZGQoYmxvY2tEZXNjcmlwdG9yKTsKLSAgICBpZiAoaXNHbG9iYWxFbGVtZW50KQotICAgIHsgICAgICAKLSAgICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIGZpbmFsRGVzY3JpcHRvciA9Ci0gICAgICAgIG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgICBYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFLAotICAgICAgICAgIFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUsCi0gICAgICAgICAgZmluYWxDb21ib1ZhbHVlcyk7Ci0gICAgICBsaXN0LmFkZChmaW5hbERlc2NyaXB0b3IpOwotICAgICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3Igc3Vic3RpdHV0aW9uR3JvdXBEZXNjcmlwdG9yID0KLSAgICAgICAgbmV3IFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAgIFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUsCi0gICAgICAgICAgWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSwKLSAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cENvbWJvVmFsdWVzKTsKLSAgICAgIGxpc3QuYWRkKHN1YnN0aXR1dGlvbkdyb3VwRGVzY3JpcHRvcik7Ci0gICAgfQotICAgIGlmICghaXNHbG9iYWxFbGVtZW50KQotICAgIHsKLSAgICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIGZvcm1EZXNjcmlwdG9yID0KLSAgICAgICAgbmV3IFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAgIFhTRENvbnN0YW50cy5GT1JNX0FUVFJJQlVURSwKLSAgICAgICAgICBYU0RDb25zdGFudHMuRk9STV9BVFRSSUJVVEUsCi0gICAgICAgICAgZm9ybUNvbWJvVmFsdWVzKTsKLSAgICAgIGxpc3QuYWRkKGZvcm1EZXNjcmlwdG9yKTsKLSAgICB9Ci0KLSAgICBBdHRyIGZpeGVkQXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICBBdHRyIGRlZmF1bHRBdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSk7Ci0gICAgU3RyaW5nIHN0cjsKLSAgICBpZiAoZml4ZWRBdHRyICE9IG51bGwpCi0gICAgewotICAgICAgc3RyID0gWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVmYXVsdEF0dHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdHIgPSBYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdHIgPSBYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFICsgIi8iICsgWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFOwotICAgIH0KLSAgICAKLSAgICBGaXhlZE9yRGVmYXVsdFRleHRQcm9wZXJ0eURlc2NyaXB0b3IgZml4ZWRPckRlZmF1bHREZXNjcmlwdG9yID0KLSAgICAgIG5ldyBGaXhlZE9yRGVmYXVsdFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIHN0ciwgCi0gICAgICAgIHN0ciwKLSAgICAgICAgZWxlbWVudCk7Ci0gICAgbGlzdC5hZGQoZml4ZWRPckRlZmF1bHREZXNjcmlwdG9yKTsKLQotICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgICAvLyAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yczsKLSAgfQotCi0gIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gKFN0cmluZylpZDsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAiIjsKLSAgICAgIH0KLSAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzQW5vbnltb3VzID0gY2hlY2tGb3JBbm9ueW1vdXNUeXBlKGVsZW1lbnQpOwotICAgICAgICBpZiAoaXNBbm9ueW1vdXMpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gIioqYW5vbnltb3VzKioiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQuZXF1YWxzKCIiKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9OT19UWVBFIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKSAKLSAgICAgICAgfHwgYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpCi0gICAgICAgIHx8IGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpCi0gICAgICAgIHx8IGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5GT1JNX0FUVFJJQlVURSkKLSAgICAgICAgfHwgYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkFCU1RSQUNUX0FUVFJJQlVURSkKLSAgICAgICAgfHwgYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLk5JTExBQkxFX0FUVFJJQlVURSkKLSAgICAgICAgfHwgYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSkKLSAgICAgICAgfHwgYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkZJTkFMX0FUVFJJQlVURSkKLSAgICAgICAgfHwgYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSkgCi0gICAgICAgIHx8IGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSkKLSAgICAgICAgfHwgYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICB9Ci0KLSAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgdmFsdWUgPSAiIjsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IChTdHJpbmcpdmFsdWU7Ci0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IChTdHJpbmcpaWQ7Ci0gICAgICAKLSAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9NQVhPQ0NVUlNfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTUlOT0NDVVJTX0NIQU5HRSIpLCBlbGVtZW50KTsgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRUxFTUVOVF9TVUJTVElUVVRJT05HUk9VUF9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhYU0RDb25zdGFudHMuRk9STV9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRUxFTUVOVF9GT1JNX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRUxFTUVOVF9BQlNUUkFDVF9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhYU0RDb25zdGFudHMuTklMTEFCTEVfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VMRU1FTlRfTklMTEFCTEVfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9FTEVNRU5UX0JMT0NLX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRUxFTUVOVF9GSU5BTF9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKSB8fCBhdHRyaWJ1dGVOYW1lLmVxdWFscyhYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpKQotICAgICAgeyAgCi0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9FTEVNRU5UX1ZBTFVFX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIGlmICh2YWxpZGF0ZU5hbWUobmV3VmFsdWUpKQotICAgICAgICB7Ci0gICAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VMRU1FTlRfTkFNRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgICAgLy8gbm93IHJlbmFtZSBhbnkgcmVmZXJlbmNlcyB0byB0aGlzIGVsZW1lbnQKLSAgICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KGVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKGNvbXAgIT0gbnVsbCAmJiBjb21wIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uICYmIGNvbXAuZ2V0Q29udGFpbmVyKCkuZXF1YWxzKHhzZFNjaGVtYSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEdsb2JhbEVsZW1lbnRSZW5hbWVyIHJlbmFtZXIgPSBuZXcgR2xvYmFsRWxlbWVudFJlbmFtZXIoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXAsIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgcmVuYW1lci52aXNpdFNjaGVtYSh4c2RTY2hlbWEpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgLy8gcHV0IGxvZ2ljIGluIGRlc2NyaXB0b3IvY2VsbCBlZGl0b3IKLS8vICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9FTEVNRU5UX1RZUEVfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgfQotICAgIAotICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQsIChTdHJpbmcpIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCFhdHRyaWJ1dGVOYW1lLmVxdWFscyhYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgfQotICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotCi0gIH0KLQotICBib29sZWFuIGNoZWNrRm9yQW5vbnltb3VzVHlwZShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICAvKiBVc2luZyBFZCdzIG1vZGVsIHRvIGNoZWNrCi0gICAgIGJvb2xlYW4gaXNBbm9ueW1vdXMgPSBmYWxzZTsKLQotICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSBnZXRYU0RTY2hlbWEoKS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KGVsZW1lbnQpOwotICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICB7Ci0gICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbiljb21wb25lbnQ7Ci0gICAgIGlzQW5vbnltb3VzID0geHNkRWxlbS5pc1NldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgIH0KLSAgICAgcmV0dXJuIGlzQW5vbnltb3VzOwotICAgICAqLwotCi0gICAgYm9vbGVhbiBpc0Fub255bW91cyA9IGZhbHNlOwotCi0gICAgTm9kZSBhTm9kZSA9IGdldERvbUhlbHBlcigpLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgaWYgKGFOb2RlICE9IG51bGwpCi0gICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBhTm9kZSA9IGdldERvbUhlbHBlcigpLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgIGlmIChhTm9kZSAhPSBudWxsKQotICAgICB7Ci0gICAgICBpc0Fub255bW91cyA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBpc0Fub255bW91czsKLSAgfQotICAKLSAgCi0vLyAgdm9pZCB1cGRhdGVFbGVtZW50VG9Bbm9ueW1vdXMoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgeHNkVHlwZSkKLS8vICB7Ci0vLyAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLS8vICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOwotLy8KLS8vICAgIHVwZGF0ZUVsZW1lbnRUb05vdEFub255bW91cyhlbGVtZW50KTsKLS8vICAgIGJvb2xlYW4gaGFzQ2hpbGRyZW5FbGVtZW50cyA9IGhhc0VsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLS8vCi0vLyAgICBFbGVtZW50IGNoaWxkTm9kZSA9IG51bGw7Ci0vLyAgICBpZiAoeHNkVHlwZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKSkKLS8vICAgICB7Ci0vLyAgICAgIGNoaWxkTm9kZSA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIHByZWZpeCArIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRyk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmICh4c2RUeXBlLmVxdWFscyhYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRykpCi0vLyAgICAgewotLy8gICAgICBjaGlsZE5vZGUgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBwcmVmaXggKyBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0vLyAgICB9Ci0vLwotLy8gICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZE5vZGUpOwotLy8gICAgZm9ybWF0Q2hpbGQoY2hpbGROb2RlLCBoYXNDaGlsZHJlbkVsZW1lbnRzKTsgICAgCi0vLwotLy8KLS8vICAgIC8qIFVzaW5nIEVkJ3MgbW9kZWwgdG8gZG8gdGhlIGFib3ZlCi0vLyAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0WFNEU2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsKLS8vICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotLy8gICAgIHsKLS8vICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbSA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29tcG9uZW50OwotLy8gICAgIFhTREZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgWFNERmFjdG9yeUltcGwoKTsKLS8vICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleCA9IGZhY3RvcnkuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0vLyAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlID0gZmFjdG9yeS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotLy8KLS8vICAgICBOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0vLyAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjaGlsZCwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotLy8gICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjaGlsZCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgewotLy8gICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotLy8gICAgIH0KLS8vICAgICAKLS8vICAgICBGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvcigpOwotLy8gICAgIGlmICh4c2RUeXBlLmVxdWFscyhYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpKQotLy8gICAgIHsKLS8vICAgICB4c2RFbGVtLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKGNvbXBsZXgpOwotLy8gICAgIEVsZW1lbnQgZWxlbSA9IGNvbXBsZXguZ2V0RWxlbWVudCgpOwotLy8gICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXRXaXRoU2libGluZ0luZGVudCgoWE1MTm9kZSllbGVtKTsKLS8vICAgICB9Ci0vLyAgICAgZWxzZSBpZiAoeHNkVHlwZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpKQotLy8gICAgIHsKLS8vICAgICB4c2RFbGVtLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHNpbXBsZSk7Ci0vLyAgICAgRWxlbWVudCBlbGVtID0gc2ltcGxlLmdldEVsZW1lbnQoKTsgIAotLy8gICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXRXaXRoU2libGluZ0luZGVudCgoWE1MTm9kZSllbGVtKTsKLS8vICAgICB9Ci0vLyAgICAgfQotLy8gICAgIGNvbXBvbmVudC51cGRhdGVFbGVtZW50KCk7Ci0vLyAgICAgKi8KLS8vICB9Ci0vLwotLy8gIGJvb2xlYW4gaXNTVEFub255bW91cyhFbGVtZW50IGVsZW1lbnQpCi0vLyAgewotLy8gICAgTm9kZSBhTm9kZSA9IGdldERvbUhlbHBlcigpLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0vLyAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLS8vICAgICB7Ci0vLyAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgICB7Ci0vLyAgICAgICAgcmV0dXJuIHRydWU7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIHJldHVybiBmYWxzZTsKLS8vICB9ICAKLS8vCi0vLyAgYm9vbGVhbiBpc0NUQW5vbnltb3VzKEVsZW1lbnQgZWxlbWVudCkKLS8vICB7Ci0vLyAgICBOb2RlIGFOb2RlID0gZ2V0RG9tSGVscGVyKCkuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRyk7Ci0vLyAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLS8vICAgICB7Ci0vLyAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICAgewotLy8gICAgICAgIHJldHVybiB0cnVlOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gZmFsc2U7Ci0vLyAgfSAgCi0vLwotLy8gIFhTRFR5cGVEZWZpbml0aW9uIGdldEFub255bW91c1R5cGVEZWZpbml0aW9uKEVsZW1lbnQgZWxlbWVudCkKLS8vICB7Ci0vLyAgICBOb2RlIHR5cGVEZWZpbml0aW9uTm9kZSA9IGdldERvbUhlbHBlcigpLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0vLyAgICBpZiAodHlwZURlZmluaXRpb25Ob2RlID09IG51bGwpCi0vLyAgICAgewotLy8gICAgICB0eXBlRGVmaW5pdGlvbk5vZGUgPSBnZXREb21IZWxwZXIoKS5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKTsKLS8vICAgIH0KLS8vICAgIGlmICh0eXBlRGVmaW5pdGlvbk5vZGUgIT0gbnVsbCkKLS8vICAgICB7Ci0vLyAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQodHlwZURlZmluaXRpb25Ob2RlKTsKLS8vICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotLy8gICAgICAgewotLy8gICAgICAgIHJldHVybiAoWFNEVHlwZURlZmluaXRpb24pY29tcG9uZW50OwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gbnVsbDsgICAgCi0vLwotLy8gICAgLyogICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0WFNEU2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsKLS8vICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotLy8gICAgIHsKLS8vICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbSA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29tcG9uZW50OwotLy8KLS8vICAgICByZXR1cm4geHNkRWxlbS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotLy8gICAgIH0KLS8vICAgICByZXR1cm4gbnVsbDsKLS8vICAgICAqLwotLy8gIH0KLS8vCi0vLyAgdm9pZCB1cGRhdGVFbGVtZW50VG9Ob3RBbm9ueW1vdXMoRWxlbWVudCBlbGVtZW50KQotLy8gIHsKLS8vICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0vLyAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLS8vICAgICB7Ci0vLyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLS8vICAgICAgIHsKLS8vICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSljaGlsZHJlbi5pdGVtKGkpOwotLy8gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLS8vICAgICAgICAgewotLy8gICAgICAgICAgaWYgKG5vZGUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKSB8fAotLy8gICAgICAgICAgICAgIG5vZGUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRykpCi0vLyAgICAgICAgICAgewotLy8gICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2Uobm9kZSk7Ci0vLyAgICAgICAgICAgIGk9MDsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIC8qICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZWxlbWVudCk7Ci0vLyAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLS8vICAgICB7Ci0vLyAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW0gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWNvbXBvbmVudDsKLS8vICAgICBpZiAoeHNkRWxlbS5pc1NldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkpCi0vLyAgICAgewotLy8gICAgIHhzZEVsZW0udW5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotLy8gICAgIHhzZEVsZW0uc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24obnVsbCk7Ci0vLyAgICAgfQotLy8gICAgIH0KLS8vICAgICBjb21wb25lbnQudXBkYXRlRWxlbWVudCgpOwotLy8gICAgICovCi0vLyAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0VudW1lcmF0aW9uUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0VudW1lcmF0aW9uUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxMjRmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9FbnVtZXJhdGlvblByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvblByb3BlcnR5U291cmNlCi0gIGV4dGVuZHMgQmFzZVByb3BlcnR5U291cmNlCi0gIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvblByb3BlcnR5U291cmNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB2aWV3ZXIKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uUHJvcGVydHlTb3VyY2UoVmlld2VyIHZpZXdlciwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHZpZXdlciwgeHNkU2NoZW1hKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uUHJvcGVydHlTb3VyY2UoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHhzZFNjaGVtYSk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldEVkaXRhYmxlVmFsdWUoKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgICovCi0gIHB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gQ3JlYXRlIGEgZGVzY3JpcHRvciBhbmQgc2V0IGEgY2F0ZWdvcnkKLSAgICBQcm9wZXJ0eURlc2NyaXB0b3IgbmFtZURlc2NyaXB0b3IgPQotICAgIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICBYU0RDb25zdGFudHMuVkFMVUVfQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuVkFMVUVfQVRUUklCVVRFKTsKLSAgICBsaXN0LmFkZChuYW1lRGVzY3JpcHRvcik7Ci0KLSAgICBJUHJvcGVydHlEZXNjcmlwdG9yW10gcmVzdWx0ID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgIHsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICB7Ci0gICAgICByZXN1bHQgPSAiIjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRU5VTV9WQUxVRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUsIChTdHJpbmcpdmFsdWUpOwotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9GaXhlZE9yRGVmYXVsdFRleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0ZpeGVkT3JEZWZhdWx0VGV4dFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWUwOWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0ZpeGVkT3JEZWZhdWx0VGV4dFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGlhbG9nQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvckNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEZpeGVkT3JEZWZhdWx0VGV4dFByb3BlcnR5RGVzY3JpcHRvciBleHRlbmRzIFByb3BlcnR5RGVzY3JpcHRvcgotewotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjaG9pY2UgPSAiIjsKLSAgRWxlbWVudCBlbGVtZW50OwotICAvKioKLSAgICogQHBhcmFtIGlkCi0gICAqIEBwYXJhbSBkaXNwbGF5TmFtZQotICAgKi8KLSAgcHVibGljIEZpeGVkT3JEZWZhdWx0VGV4dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgc3VwZXIoaWQsIGRpc3BsYXlOYW1lKTsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci0gIAotICBwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgRml4ZWRPckRlZmF1bHRUZXh0Q2VsbEVkaXRvcihwYXJlbnQpOwotICAgIGlmIChnZXRWYWxpZGF0b3IoKSAhPSBudWxsKQotICAgICAgZWRpdG9yLnNldFZhbGlkYXRvcihnZXRWYWxpZGF0b3IoKSk7Ci0gICAgcmV0dXJuIGVkaXRvcjsKLSAgfQotCi0vLyAgICBwdWJsaWMgdm9pZCBzZXRDaG9pY2UoU3RyaW5nIG5ld0Nob2ljZSkKLS8vICAgIHsKLS8vICAgICAgY2hvaWNlID0gbmV3Q2hvaWNlOwotLy8gICAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0SWQoKQotICB7Ci0gICAgQXR0ciBmaXhlZEF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0gICAgQXR0ciBkZWZhdWx0QXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgIGlmIChmaXhlZEF0dHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjaG9pY2UgPSAiZml4ZWQiOwotICAgIH0KLSAgICBlbHNlIGlmIChkZWZhdWx0QXR0ciAhPSBudWxsKSAvLyB3aGF0IGlmIGJvdGggYXR0cmlidXRlcyB3ZXJlIHNwZWNpZmllZD8gIFVzZSBkZWZhdWx0Li4uCi0gICAgewotICAgICAgY2hvaWNlID0gImRlZmF1bHQiOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY2hvaWNlID0gIiI7Ci0gICAgfQotCi0gICAgaWYgKGNob2ljZS5lcXVhbHMoImZpeGVkIikpCi0gICAgIHsKLSAgICAgIHJldHVybiAiZml4ZWQiOwotICAgIH0KLSAgICBlbHNlIGlmIChjaG9pY2UuZXF1YWxzKCJkZWZhdWx0IikpCi0gICAgIHsKLSAgICAgIHJldHVybiAiZGVmYXVsdCI7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgewotICAgICAgcmV0dXJuIHN1cGVyLmdldElkKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLSAgewotICAgIEF0dHIgZml4ZWRBdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotICAgIEF0dHIgZGVmYXVsdEF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKTsKLSAgICBpZiAoZml4ZWRBdHRyICE9IG51bGwpCi0gICAgewotICAgICAgY2hvaWNlID0gImZpeGVkIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVmYXVsdEF0dHIgIT0gbnVsbCkgLy8gd2hhdCBpZiBib3RoIGF0dHJpYnV0ZXMgd2VyZSBzcGVjaWZpZWQ/ICBVc2UgZGVmYXVsdC4uLgotICAgICB7Ci0gICAgICBjaG9pY2UgPSAiZGVmYXVsdCI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjaG9pY2UgPSAiZml4ZWQvZGVmYXVsdCI7Ci0gICAgfQotCi0gICAgaWYgKGNob2ljZS5lcXVhbHMoImZpeGVkIikpCi0gICAgIHsKLSAgICAgIHJldHVybiAiZml4ZWQiOwotICAgIH0KLSAgICBlbHNlIGlmIChjaG9pY2UuZXF1YWxzKCJkZWZhdWx0IikpCi0gICAgIHsKLSAgICAgIHJldHVybiAiZGVmYXVsdCI7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgewotICAgICAgcmV0dXJuIHN1cGVyLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgRml4ZWRPckRlZmF1bHRUZXh0Q2VsbEVkaXRvciBleHRlbmRzIERpYWxvZ0NlbGxFZGl0b3IKLSAgewotICAgIHB1YmxpYyBGaXhlZE9yRGVmYXVsdFRleHRDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgc3VwZXIocGFyZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9wZW5EaWFsb2dCb3goQ29udHJvbCBjZWxsRWRpdG9yV2luZG93KQotICAgIHsKLQkgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCSAgICAKLQkgICAgRml4ZWRPckRlZmF1bHREaWFsb2cgZGlhbG9nID0gbmV3IEZpeGVkT3JEZWZhdWx0RGlhbG9nKHNoZWxsKTsKLQotCSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JICAgIGRpYWxvZy5jcmVhdGUoKTsKLQkgICAgCi0JICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpZ2V0VmFsdWUoKTsKLQkKLQkgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0JICAgIAotCSAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLQkgICAgewotCSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRWYWx1ZSgpOwotICAgICAgICBmaXJlQXBwbHlFZGl0b3JWYWx1ZSgpOwotCSAgICB9Ci0JICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgIHJldHVybiBudWxsOwotCSAgfQotICB9Ci0gIAotICBjbGFzcyBGaXhlZE9yRGVmYXVsdERpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwcml2YXRlIGludCBGSVhFRCA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgREVGQVVMVCA9IDE7Ci0gICAgcHJpdmF0ZSBpbnQgdHlwZTsKLSAgICBwcml2YXRlIGludCB2YWx1ZTsKLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGZpeGVkQnV0dG9uLCBkZWZhdWx0QnV0dG9uOwotICAgIHByb3RlY3RlZCBUZXh0IHZhbHVlRmllbGQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZVN0cmluZyA9ICIiOwotICAgIAotICAgIHB1YmxpYyBGaXhlZE9yRGVmYXVsdERpYWxvZyhTaGVsbCBzaGVsbCkKLSAgICB7Ci0gICAgICBzdXBlcihzaGVsbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpCi0gICAgewotICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKQotICAgIHsKLSAgICAgIGlmIChidXR0b25JZCA9PSBEaWFsb2cuT0spCi0gICAgICB7Ci0gICAgICAgIHZhbHVlU3RyaW5nID0gdmFsdWVGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICAgICB9Ci0gICAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeyByZXR1cm4gdmFsdWVTdHJpbmc7IH0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7IHJldHVybiB0eXBlID09IEZJWEVEPyAiZml4ZWQiIDogImRlZmF1bHQiOyB9Ci0KLSAgICAvLwotICAgIC8vIENyZWF0ZSB0aGUgY29udHJvbHMKLSAgICAvLwotICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICBDb21wb3NpdGUgY2xpZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICBnZXRTaGVsbCgpLnNldFRleHQoIkZpeGVkL0RlZmF1bHQgVmFsdWUiKTsKLQotICAgICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotLy8gICAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotLy8gICAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0vLyAgICAgIGdsLmhvcml6b250YWxTcGFjaW5nID0gMDsKLS8vICAgICAgZ2wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICAgIGNsaWVudC5zZXRMYXlvdXQoZ2wpOwotCi0gICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGdkLmhvcml6b250YWxJbmRlbnQgPSAwOwotICAgICAgY2xpZW50LnNldExheW91dERhdGEoZ2QpOwotICAgICAgCi0vLyAgICAgIGlzVGV4dFJlYWRPbmx5ID0gZmFsc2U7Ci0KLSAgICAgIGZpeGVkQnV0dG9uID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRklYRUQiKSk7Ci0vLyAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZml4ZWRCdXR0b24sIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9FTEVNRU5UX0ZJWEVEKTsKLSAgICAgIAotICAgICAgZGVmYXVsdEJ1dHRvbiA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0RFRkFVTFQiKSk7Ci0vLyAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGVmYXVsdEJ1dHRvbiwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0VMRU1FTlRfREVGQVVMVCk7Ci0KLSAgICAgIHZhbHVlRmllbGQgPSBWaWV3VXRpbGl0eS5jcmVhdGVUZXh0RmllbGQoY2xpZW50LCAzMCk7Ci0gICAgICAKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh2YWx1ZUZpZWxkLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfRUxFTUVOVF9WQUxVRSk7Ci0vLyAgICB2YWx1ZUZpZWxkLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX0VMRU1FTlRfVkFMVUUiKSk7Ci0KLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChmaXhlZEJ1dHRvbiwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0FUVFJJQlVURV9GSVhFRCk7Ci0gICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGVmYXVsdEJ1dHRvbiwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0FUVFJJQlVURV9ERUZBVUxUKTsKLSAgICAgIC8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh2YWx1ZUZpZWxkLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgIAotICAgICAgQXR0ciBmaXhlZEF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0gICAgICBBdHRyIGRlZmF1bHRBdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSk7Ci0KLSAgICAgIGlmIChmaXhlZEF0dHIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZml4ZWRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICBkZWZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIGNob2ljZSA9ICJmaXhlZCI7Ci0gICAgICAgIHR5cGUgPSBGSVhFRDsKLSAgICAgICAgdmFsdWVGaWVsZC5zZXRUZXh0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJmaXhlZCIpKTsKLSAgICAgICAgdmFsdWVGaWVsZC5zZXRGb2N1cygpOwotICAgICAgICB2YWx1ZUZpZWxkLnNlbGVjdEFsbCgpOwotICAgICAgfQotICAgICAgaWYgKGRlZmF1bHRBdHRyICE9IG51bGwpIC8vIHdoYXQgaWYgYm90aCBhdHRyaWJ1dGVzIHdlcmUgc3BlY2lmaWVkPyAgVXNlIGRlZmF1bHQuLi4KLSAgICAgICB7Ci0gICAgICAgIGZpeGVkQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIGRlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICBjaG9pY2UgPSAiZGVmYXVsdCI7Ci0gICAgICAgIHR5cGUgPSBERUZBVUxUOwotICAgICAgICB2YWx1ZUZpZWxkLnNldFRleHQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRlZmF1bHQiKSk7Ci0gICAgICAgIHZhbHVlRmllbGQuc2V0Rm9jdXMoKTsKLSAgICAgICAgdmFsdWVGaWVsZC5zZWxlY3RBbGwoKTsKLSAgICAgIH0KLQotICAgICAgZml4ZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICBkZWZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgcmV0dXJuIGNsaWVudDsKLSAgICB9Ci0KLSAgICB2b2lkIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSB2YWx1ZUZpZWxkLmdldFRleHQoKTsKLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgY2hvaWNlID0gdHlwZSA9PSBGSVhFRD8gImZpeGVkIiA6ICJkZWZhdWx0IjsKLSAgICAgIH0KLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNob2ljZS5lcXVhbHMoImZpeGVkIikpCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaG9pY2UuZXF1YWxzKCJkZWZhdWx0IikpCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHZhbHVlLmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIGNob2ljZSA9ICIiOwotICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChlLndpZGdldCA9PSBmaXhlZEJ1dHRvbiAmJiBmaXhlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgIHsKLSAgICAgICAgdHlwZSA9IEZJWEVEOwotICAgICAgICBjaG9pY2UgPSAiZml4ZWQiOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVmYXVsdEJ1dHRvbiAmJiBkZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgewotICAgICAgICB0eXBlID0gREVGQVVMVDsKLSAgICAgICAgY2hvaWNlID0gImRlZmF1bHQiOwotICAgICAgfQotICAgIH0KLQotICAJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0dyb3VwUmVmUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0dyb3VwUmVmUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxMGY2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9Hcm91cFJlZlByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBHcm91cFJlZlByb3BlcnR5U291cmNlCi0gIGV4dGVuZHMgQmFzZVByb3BlcnR5U291cmNlCi0gIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0gIHByaXZhdGUgU3RyaW5nW10gcmVmQ29tYm9WYWx1ZXMgPSB7ICIiIH07Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBHcm91cFJlZlByb3BlcnR5U291cmNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0vLyAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlQ29tYm9Db250ZXh0SGVscChTdHJpbmcgY29udGV4dElkKQotLy8gIHsKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChyZWZDb21ibywgY29udGV4dElkKTsKLS8vICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIHZpZXdlcgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIodmlld2VyLCB4c2RTY2hlbWEpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIoeHNkU2NoZW1hKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICBqYXZhLnV0aWwuTGlzdCBpdGVtcyA9IGhlbHBlci5nZXRHbG9iYWxFbGVtZW50cygpOwotICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICB7Ci0gICAgICBpdGVtcyA9IGhlbHBlci5nZXRNb2RlbEdyb3VwcygpOwotICAgICAgLy8gTmVlZCB0b29sdGlwIGZvciBHcm91cCBSZWYKLS8vICAgICAgICBtaW5pbXVtRmllbGQuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfRUxFTUVOVF9NSU5JTVVNIikpOwotLy8gICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChtaW5pbXVtRmllbGQsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9HUk9VUF9SRUZfTUlOSU1VTSk7Ci0vLyAgICAgICAgbWF4aW11bUZpZWxkLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX0VMRU1FTlRfTUFYSU1VTSIpKTsKLS8vICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAobWF4aW11bUZpZWxkLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfR1JPVVBfUkVGX01BWElNVU0pOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgIHsKLSAgICAgIGl0ZW1zID0gaGVscGVyLmdldEdsb2JhbEVsZW1lbnRzKCk7Ci0vLyAgICAgICAgbWluaW11bUZpZWxkLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX0VMRU1FTlRfTUlOSU1VTSIpKTsKLS8vICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAobWluaW11bUZpZWxkLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfRUxFTUVOVF9SRUZfTUlOSU1VTSk7Ci0vLyAgICAgICAgbWF4aW11bUZpZWxkLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX0VMRU1FTlRfTUFYSU1VTSIpKTsKLS8vICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAobWF4aW11bUZpZWxkLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfRUxFTUVOVF9SRUZfTUFYSU1VTSk7Ci0gICAgfQotICAgIAotICAgIGludCBzaXplID0gaXRlbXMuc2l6ZSgpICsgMTsKLSAgICByZWZDb21ib1ZhbHVlcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgcmVmQ29tYm9WYWx1ZXNbMF0gPSAiIjsKLSAgICBpZiAoaXRlbXMgIT0gbnVsbCkKLSAgICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgICB7Ci0gICAgICAgIHJlZkNvbWJvVmFsdWVzW2kgKyAxXSA9IChTdHJpbmcpIGl0ZW1zLmdldChpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIHJlZkRlc2NyaXB0b3IgPQotICAgIG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLAotICAgICAgICByZWZDb21ib1ZhbHVlcyk7Ci0gICAgbGlzdC5hZGQocmVmRGVzY3JpcHRvcik7Ci0gICAgCi0gICAgUHJvcGVydHlEZXNjcmlwdG9yIG1pbk9jY3Vyc0Rlc2NyaXB0b3IgPQotICAgIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICBYU0RDb25zdGFudHMuTUlOT0NDVVJTX0FUVFJJQlVURSwKLSAgICAgICAgWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgIGxpc3QuYWRkKG1pbk9jY3Vyc0Rlc2NyaXB0b3IpOwotICAgIFByb3BlcnR5RGVzY3JpcHRvciBtYXhPY2N1cnNEZXNjcmlwdG9yID0KLSAgICBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLSAgICBsaXN0LmFkZChtYXhPY2N1cnNEZXNjcmlwdG9yKTsKLSAgICBJUHJvcGVydHlEZXNjcmlwdG9yW10gcmVzdWx0ID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAiIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAKLS8vICAgICAgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKSkKLS8vICAgICAgewotLy8gICAgICAgIHJldHVybiByZXN1bHQ7Ci0vLyAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0KGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjcmVzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3NldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkLCBPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICIiOwotICAgIH0KLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gKFN0cmluZylpZDsKLSAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBtYXggPSAoU3RyaW5nKXZhbHVlOwotICAgICAgICBTdHJpbmcgbWluID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTUFYT0NDVVJTX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgICAgaWYgKG1heC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSwgbWF4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbWluID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgICAgU3RyaW5nIG1heCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX01JTk9DQ1VSU19DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmIChtaW4ubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUsIG1pbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgICB9Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0dST1VQX1JFRl9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKChTdHJpbmcpIGlkLCBuZXdWYWx1ZSk7Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0vLyAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLS8vICAgIHsKLS8vICAgICAgcHVibGljIHZvaWQgcnVuKCkKLS8vICAgICAgewotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLS8vICAgICAgfQotLy8gICAgfTsKLS8vICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgICAKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9JbXBvcnRQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSW1wb3J0UHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2YzkyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9JbXBvcnRQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmRlbGV0ZS5YU0RFeHRlcm5hbEZpbGVDbGVhbnVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNEU2NoZW1hSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgSW1wb3J0UHJvcGVydHlTb3VyY2UKLSAgZXh0ZW5kcyBTY2hlbWFEaXJlY3RpdmVIZWxwZXJQcm9wZXJ0eVNvdXJjZQotICBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICBib29sZWFuIGlzU2V0TmFtZXNwYWNlID0gZmFsc2U7Ci0gIC8qKgotICAgKiBAcGFyYW0gdmlld2VyCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBJbXBvcnRQcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hLCBJRmlsZSBjdXJyZW50SUZpbGUpCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHhzZFNjaGVtYSwgZmFsc2UpOwotICAgIHRoaXMuY3VycmVudElGaWxlID0gY3VycmVudElGaWxlOwotLy8gICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChjb250cm9sc0NvbnRhaW5lciwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0lNUE9SVF9ERVNJR05fVklFVyk7Ci0vL1dvcmtiZW5jaEhlbHAuc2V0SGVscChzZWxlY3RCdXR0b24sIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9JTkNMVURFX0hFTFBFUl9TRUxFQ1QpOwotLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAocHJlZml4RmllbGQsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9JTVBPUlRfUFJFRklYKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIEltcG9ydFByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEsIElGaWxlIGN1cnJlbnRJRmlsZSkKLSAgewotICAgIHN1cGVyKHhzZFNjaGVtYSwgZmFsc2UpOwotICAgIHRoaXMuY3VycmVudElGaWxlID0gY3VycmVudElGaWxlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgYW5kIHNldCBhIGNhdGVnb3J5Ci0gICAgCi0gICAgU2NoZW1hTG9jYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Igc2NoZW1hTG9jYXRpb25EZXNjcmlwdG9yID0KLSAgICBuZXcgU2NoZW1hTG9jYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICBYU0RDb25zdGFudHMuU0NIRU1BTE9DQVRJT05fQVRUUklCVVRFLAotICAgICAgWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURQotICAgICAgKTsKLSAgICBzY2hlbWFMb2NhdGlvbkRlc2NyaXB0b3Iuc2V0SGVscENvbnRleHRJZHMoWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0lOQ0xVREVfSEVMUEVSX1NFTEVDVCk7Ci0gICAgbGlzdC5hZGQoc2NoZW1hTG9jYXRpb25EZXNjcmlwdG9yKTsKLSAgICAKLSAgICBpZiAoaXNTZXROYW1lc3BhY2UpCi0gICAgewotICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByZWZpeERlc2NyaXB0b3IgPSAKLSAgICAgIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAiUHJlZml4IiwKLSAgICAgICAgIlByZWZpeCIpOwotICAgICAgcHJlZml4RGVzY3JpcHRvci5zZXRIZWxwQ29udGV4dElkcyhYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfSU1QT1JUX1BSRUZJWCk7Ci0gICAgICBsaXN0LmFkZChwcmVmaXhEZXNjcmlwdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcmVmaXhEZXNjcmlwdG9yID0gCi0gICAgICBuZXcgUHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAiUHJlZml4IiwKLSAgICAgICAgIlByZWZpeCIpOwotICAgICAgcHJlZml4RGVzY3JpcHRvci5zZXRIZWxwQ29udGV4dElkcyhYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfSU1QT1JUX1BSRUZJWCk7Ci0gICAgICBsaXN0LmFkZChwcmVmaXhEZXNjcmlwdG9yKTsKLSAgICB9Ci0KLSAgICBQcm9wZXJ0eURlc2NyaXB0b3IgbmFtZXNwYWNlRGVzY3JpcHRvciA9IAotICAgIG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgbGlzdC5hZGQobmFtZXNwYWNlRGVzY3JpcHRvcik7ICAKLQotICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChpZCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgoU3RyaW5nKSBpZCk7Ci0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IChTdHJpbmcpaWQ7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgewotICAgICAgICByZXN1bHQgPSAiIjsKLSAgICAgIH0KLQotICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJQcmVmaXgiKSkKLSAgICAgICB7Ci0gICAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgICBTdHJpbmcgYVByZWZpeCA9IGhlbHBlci5nZXRQcmVmaXgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpLCBmYWxzZSk7Ci0gICAgICAgIGlmIChhUHJlZml4ICE9IG51bGwgJiYgYVByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gYVByZWZpeDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgICAKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgIHsKLSAgICAgIHZhbHVlID0gIiI7Ci0gICAgfQotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSAoU3RyaW5nKXZhbHVlOwotICAgICAgVHlwZXNIZWxwZXIgdHlwZXNIZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgICBTdHJpbmcgb2xkUHJlZml4VmFsdWUgPSB0eXBlc0hlbHBlci5nZXRQcmVmaXgobmFtZXNwYWNlLCBmYWxzZSk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5TQ0hFTUFMT0NBVElPTl9BVFRSSUJVVEUpOwotICAgICAgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKCJQcmVmaXgiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHZhbGlkYXRlUHJlZml4KG5ld1ZhbHVlKSAmJiAgc2NoZW1hTG9jYXRpb24ubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0KLSAgICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KG5ld1ZhbHVlKSkKLSAgICAgICAgICB7Ci0vLyAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX0xBQkVMX1BSRUZJWF9FWElTVFMiKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUFJFRklYX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgIG1hcC5yZW1vdmUob2xkUHJlZml4VmFsdWUpOwotICAgICAgICAgICAgbWFwLnB1dChuZXdWYWx1ZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIFhTRFNjaGVtYUhlbHBlci51cGRhdGVFbGVtZW50KHhzZFNjaGVtYSk7Ci0KLSAgICAgICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSkpCi0gICAgICB7IAotICAgICAgICB1cGRhdGVFeHRlcm5hbE1vZGVsKChTdHJpbmcpdmFsdWUsIHNlbGVjdGVkSUZpbGUsIHNlbGVjdGVkTmFtZXNwYWNlLCBzZWxlY3RlZFhTRFNjaGVtYSk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsICYmIG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGlzU2V0TmFtZXNwYWNlID0gdHJ1ZTsKLSAgICB9ICAgIAotICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXh0ZXJuYWxNb2RlbChTdHJpbmcgbmV3TG9jYXRpb24sIElGaWxlIG5ld0ZpbGUsIFN0cmluZyBuYW1lc3BhY2UsIFhTRFNjaGVtYSBleHRlcm5hbFNjaGVtYSkKLSAgewotICAgIGlmICh4c2RTY2hlbWEgPT0gbnVsbCkgLy8gaW4gY2FzZSB3ZSBoYXZlIGEgYmFkIHNjaGVtYQotICAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9ICIiOwotICAgIH0gICAgICAgIAotICAgIAotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsKLSAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfSU1QT1JUX0NIQU5HRSIpLCBpbXBvcnRFbGVtZW50KTsKLSAgICAgIGphdmEudXRpbC5NYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgIAotICAgICAgLy8gUmVmZXJlbnRpYWwgaW50ZWdyaXR5IG9uIG9sZCBpbXBvcnQKLSAgICAgIC8vIEhvdyBjYW4gd2UgYmUgc3VyZSB0aGF0IGlmIHRoZSBuZXdsb2NhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkbG9jYXRpb24KLSAgICAgIC8vIHRoZSBmaWxlIGhhc24ndCBjaGFuZ2VkCi0gICAgICAKLSAgICAgIFhTRFNjaGVtYSByZWZlcmVuY2VkU2NoZW1hID0gKChYU0RTY2hlbWFEaXJlY3RpdmUpY29tcCkuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgIGlmIChyZWZlcmVuY2VkU2NoZW1hICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTREV4dGVybmFsRmlsZUNsZWFudXAgY2xlYW5IZWxwZXIgPSBuZXcgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cChyZWZlcmVuY2VkU2NoZW1hKTsKLSAgICAgICAgY2xlYW5IZWxwZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgIH0KLQotICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgCi0vLyAgICAgIFN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXhGaWVsZC5nZXRUZXh0KCk7Ci0vLwotLy8gICAgICAvLyBVc2UgdGhlIGV4aXN0aW5nIHhtbG5zIGlmIGF2YWlsYWJsZQotLy8gICAgICBpZiAoIW1hcC5jb250YWluc1ZhbHVlKG5hbWVzcGFjZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICBpZiAob2xkUHJlZml4Lmxlbmd0aCgpID4gMCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBzY2hlbWFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnM6IitvbGRQcmVmaXgpOwotLy8gICAgICAgICAgbWFwLnJlbW92ZShvbGRQcmVmaXgpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotCi0gICAgICBYU0RJbXBvcnQgeHNkSW1wb3J0ID0gKFhTREltcG9ydCljb21wOwotLy8gICAgICB4c2RJbXBvcnQuc2V0U2NoZW1hTG9jYXRpb24obnVsbCk7Ci0vLyAgICAgIHhzZEltcG9ydC5zZXRSZXNvbHZlZFNjaGVtYShleHRlcm5hbFNjaGVtYSk7Ci0KLSAgICAgIC8vIHVwZGF0ZSB0aGUgeG1sbnMgaW4gdGhlIHNjaGVtYSBlbGVtZW50IGZpcnN0LCBhbmQgdGhlbiB1cGRhdGUgdGhlIGltcG9ydCBlbGVtZW50IG5leHQKLSAgICAgIC8vIHNvIHRoYXQgdGhlIGxhc3QgY2hhbmdlIHdpbGwgYmUgaW4gdGhlIGltcG9ydCBlbGVtZW50LiAgVGhpcyBrZWVwcyB0aGUgc2VsZWN0aW9uCi0gICAgICAvLyBvbiB0aGUgaW1wb3J0IGVsZW1lbnQKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihleHRlcm5hbFNjaGVtYSk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gaGVscGVyLmdldFByZWZpeChuYW1lc3BhY2UsIGZhbHNlKTsKLSAgICAgIAotICAgICAgYm9vbGVhbiBwcmVmaXhBbHJlYWR5RXhpc3RzID0gZmFsc2U7Ci0gICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KHByZWZpeCkpCi0gICAgICB7Ci0gICAgICAgIHByZWZpeEFscmVhZHlFeGlzdHMgPSB0cnVlOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAocHJlZml4ID09IG51bGwgfHwgKHByZWZpeCAhPW51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID09IDApIHx8IHByZWZpeEFscmVhZHlFeGlzdHMpCi0gICAgICB7Ci0gICAgICAgIHByZWZpeCA9ICJwcmVmIjsKLQotICAgICAgICBpbnQgcHJlZml4RXh0ZW5zaW9uID0gMTsKLSAgICAgICAgd2hpbGUgKG1hcC5jb250YWluc0tleShwcmVmaXgpICYmIHByZWZpeEV4dGVuc2lvbiA8IDEwMCkKLSAgICAgICAgIHsKLSAgICAgICAgICBwcmVmaXggPSBwcmVmaXggKyBTdHJpbmcudmFsdWVPZihwcmVmaXhFeHRlbnNpb24pOwotICAgICAgICAgIHByZWZpeEV4dGVuc2lvbisrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoKCkgPiAwKQotICAgICAgIHsKLSAgICAgICAgLy8gaWYgbnMgYWxyZWFkeSBpbiBtYXAsIHVzZSBpdHMgY29ycmVzcG9uZGluZyBwcmVmaXgKLSAgICAgICAgaWYgKG1hcC5jb250YWluc1ZhbHVlKG5hbWVzcGFjZSkpCi0gICAgICAgICB7Ci0gICAgICAgICAgVHlwZXNIZWxwZXIgdHlwZXNIZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgICAgICBwcmVmaXggPSB0eXBlc0hlbHBlci5nZXRQcmVmaXgobmFtZXNwYWNlLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvLyBvdGhlcndpc2UgYWRkIHRvIHRoZSBtYXAKLSAgICAgICAgewotLy8gICAgICAgICAgcHJlZml4TWFwLnB1dChwcmVmaXgsIG5ld0xvY2F0aW9uKTsKLSAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IitwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gTm93IHVwZGF0ZSB0aGUgaW1wb3J0IGVsZW1lbnQncyBhdHRyaWJ1dGVzCi0gICAgICBpbXBvcnRFbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuU0NIRU1BTE9DQVRJT05fQVRUUklCVVRFLCBuZXdMb2NhdGlvbik7Ci0gICAgICAKLSAgICAgIGlmICghbmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgewotICAgICAgICBpbXBvcnRFbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSwgbmFtZXNwYWNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgIGltcG9ydEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKTsKLSAgICAgIH0KLSAgICAgIAotLy8gICAgICBpZiAoZ2V0RWRpdG9yKCkgIT0gbnVsbCkKLS8vICAgICAgIHsKLS8vICAgICAgICBnZXRFZGl0b3IoKS5yZXBhcnNlU2NoZW1hKCk7Ci0vLyAgICAgICAgZ2V0RWRpdG9yKCkuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRTY2hlbWEoZ2V0WFNEU2NoZW1hKCkpOwotLy8gICAgICB9Ci0KLSAgICAgIGVuZFJlY29yZGluZyhpbXBvcnRFbGVtZW50KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0luY2x1ZGVQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSW5jbHVkZVByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzE1ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSW5jbHVkZVByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5kZWxldGUuWFNERXh0ZXJuYWxGaWxlQ2xlYW51cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEluY2x1ZGVQcm9wZXJ0eVNvdXJjZQotICBleHRlbmRzIFNjaGVtYURpcmVjdGl2ZUhlbHBlclByb3BlcnR5U291cmNlCi0gIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBJbmNsdWRlUHJvcGVydHlTb3VyY2UoSUZpbGUgY3VycmVudElGaWxlKQotICB7Ci0gICAgc3VwZXIodHJ1ZSk7Ci0gICAgdGhpcy5jdXJyZW50SUZpbGUgPSBjdXJyZW50SUZpbGU7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB2aWV3ZXIKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIEluY2x1ZGVQcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hLCBJRmlsZSBjdXJyZW50SUZpbGUpCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHhzZFNjaGVtYSwgdHJ1ZSk7Ci0gICAgdGhpcy5jdXJyZW50SUZpbGUgPSBjdXJyZW50SUZpbGU7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBJbmNsdWRlUHJvcGVydHlTb3VyY2UoWFNEU2NoZW1hIHhzZFNjaGVtYSwgSUZpbGUgY3VycmVudElGaWxlKQotICB7Ci0gICAgc3VwZXIoeHNkU2NoZW1hLCB0cnVlKTsKLSAgICB0aGlzLmN1cnJlbnRJRmlsZSA9IGN1cnJlbnRJRmlsZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZSgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICAgKi8KLSAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBDcmVhdGUgYSBkZXNjcmlwdG9yIGFuZCBzZXQgYSBjYXRlZ29yeQotICAgIAotICAgIFNjaGVtYUxvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yIHNjaGVtYUxvY2F0aW9uRGVzY3JpcHRvciA9Ci0gICAgbmV3IFNjaGVtYUxvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICBYU0RDb25zdGFudHMuU0NIRU1BTE9DQVRJT05fQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuU0NIRU1BTE9DQVRJT05fQVRUUklCVVRFKTsKLSAgCi0gICAgbGlzdC5hZGQoc2NoZW1hTG9jYXRpb25EZXNjcmlwdG9yKTsKLSAgICAKLQotICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChpZCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAoU3RyaW5nKWlkOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZhbHVlID0gIiI7Ci0gICAgfQotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSkpCi0gICAgICB7IAotICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5TQ0hFTUFMT0NBVElPTl9BVFRSSUJVVEUsIChTdHJpbmcpdmFsdWUpOwotICAgICAgICB1cGRhdGVFeHRlcm5hbE1vZGVsKChTdHJpbmcpdmFsdWUsIHNlbGVjdGVkSUZpbGUsIHNlbGVjdGVkTmFtZXNwYWNlLCBzZWxlY3RlZFhTRFNjaGVtYSk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXh0ZXJuYWxNb2RlbChTdHJpbmcgbmV3TG9jYXRpb24sIElGaWxlIG5ld0ZpbGUsIFN0cmluZyBuYW1lc3BhY2UsIFhTRFNjaGVtYSBleHRlcm5hbFNjaGVtYSkKLSAgewotICAgIEVsZW1lbnQgaW5jbHVkZUVsZW1lbnQgPSBlbGVtZW50OwotCi0gICAgU3RyaW5nIGV4aXN0aW5nU2NoZW1hTG9jYXRpb24gPSBpbmNsdWRlRWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSk7Ci0KLS8vICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfSU5DTFVERV9DSEFOR0UiKSwgaW5jbHVkZUVsZW1lbnQpOwotICAgIGJlZ2luUmVjb3JkaW5nKCJJbmNsdWRlIENoYW5nZSIsIGluY2x1ZGVFbGVtZW50KTsKLSAgICBpbmNsdWRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSwgbmV3TG9jYXRpb24pOwotICAgIAotICAgIC8vIElmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIHNjaGVtYUxvY2F0aW9uLCB0aGVuIGp1c3Qgc2V0IGl0Ci0gICAgaWYgKGV4aXN0aW5nU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgaW5jbHVkZUNvbXBvbmVudCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KGluY2x1ZGVFbGVtZW50KTsKLSAgICBpZiAoaW5jbHVkZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREluY2x1ZGUpCi0gICAgIHsKLSAgICAgIFhTREluY2x1ZGUgaW5jbHVkZSA9IChYU0RJbmNsdWRlKSBpbmNsdWRlQ29tcG9uZW50OwotCi0gICAgICBYU0RTY2hlbWEgcmVmZXJlbmNlZFNjaGVtYSA9IGluY2x1ZGUuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgIGlmIChyZWZlcmVuY2VkU2NoZW1hICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTREV4dGVybmFsRmlsZUNsZWFudXAgY2xlYW5IZWxwZXIgPSBuZXcgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cChyZWZlcmVuY2VkU2NoZW1hKTsKLSAgICAgICAgY2xlYW5IZWxwZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgICAgCi0gICAgICAgIHhzZFNjaGVtYS51cGRhdGUoKTsKLSAgICAgICAgaW5jbHVkZS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgZW5kUmVjb3JkaW5nKGluY2x1ZGVFbGVtZW50KTsgICAgCi0gIH0KLQotICAKLS8vIFJlZGVmaW5lJ3MgdmVyc2lvbgotLy8gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUV4dGVybmFsTW9kZWwoSUZpbGUgbmV3RmlsZSwgU3RyaW5nIG5hbWVzcGFjZSwgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hKQotLy8gIHsKLS8vICAgIEVsZW1lbnQgcmVkZWZpbmVFbGVtZW50ID0gKEVsZW1lbnQpIGdldE5vZGUoKTsKLS8vCi0vLyAgICByZWRlZmluZUVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5TQ0hFTUFMT0NBVElPTl9BVFRSSUJVVEUsIGxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpKTsKLS8vCi0vLyAgICBTdHJpbmcgZXhpc3RpbmdTY2hlbWFMb2NhdGlvbiA9IHJlZGVmaW5lRWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSk7Ci0vLwotLy8gICAgLy8gSWYgdGhlcmUgaXMgbm8gZXhpc3Rpbmcgc2NoZW1hTG9jYXRpb24sIHRoZW4ganVzdCBzZXQgaXQgYW5kIHJldHVybgotLy8gICAgaWYgKGV4aXN0aW5nU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkKLS8vICAgICB7Ci0vLyAgICAgIHJldHVybjsKLS8vICAgIH0KLS8vCi0vLyAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCByZWRlZmluZUNvbXBvbmVudCA9IGdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocmVkZWZpbmVFbGVtZW50KTsKLS8vICAgIGlmIChyZWRlZmluZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotLy8gICAgIHsKLS8vICAgICAgWFNEUmVkZWZpbmUgcmVkZWZpbmUgPSAoWFNEUmVkZWZpbmUpIHJlZGVmaW5lQ29tcG9uZW50OwotLy8gICAgICBYU0RFeHRlcm5hbEZpbGVDbGVhbnVwIGNsZWFudXAgPSBuZXcgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cChyZWRlZmluZS5nZXRJbmNvcnBvcmF0ZWRTY2hlbWEoKSk7Ci0vLyAgICAgIAotLy8gICAgICBjbGVhbnVwLnZpc2l0U2NoZW1hKGdldFhTRFNjaGVtYSgpKTsKLS8vICAgICAgaWYgKGdldEVkaXRvcigpICE9IG51bGwpCi0vLyAgICAgICB7Ci0vLy8vIERpc3BsYXlFcnJvckluVGFza0xpc3QgdGFzayA9IG5ldyBEaXNwbGF5RXJyb3JJblRhc2tMaXN0KGdldEVkaXRvcigpLmdldEVkaXRvcklEb2N1bWVudCgpLCBnZXRFZGl0b3IoKS5nZXRGaWxlUmVzb3VyY2UoKSwgY2xlYW51cC5nZXRNZXNzYWdlcygpKTsKLS8vLy8gdGFzay5ydW4oKTsKLS8vICAgICAgICAKLS8vICAgICAgICAvLyBXb3JrYXJvdW5kIHRvIHJlc2V0IGluY2x1ZGVkIGVsZW1lbnRzIGluIFhTRCBtb2RlbAotLy8gICAgICAgIGdldEVkaXRvcigpLnJlcGFyc2VTY2hlbWEoKTsKLS8vICAgICAgICBnZXRFZGl0b3IoKS5nZXRHcmFwaFZpZXdlcigpLnNldFNjaGVtYShnZXRYU0RTY2hlbWEoKSk7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vCi0vLyAgICAvKiBzaW5jZSB3ZSBhcmUgcmVwYXJzaW5nLCB3ZSBkb24ndCBuZWVkIHRoaXMKLS8vCi0vLyAgICAgSXRlcmF0b3IgY29udGVudHMgPSBnZXRYU0RTY2hlbWEoKS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0vLyAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkKLS8vICAgICB7Ci0vLyAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpY29udGVudHMubmV4dCgpOwotLy8gICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotLy8gICAgIHsKLS8vICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSljb250ZW50OwotLy8KLS8vICAgICBpZiAoZGlyZWN0aXZlLmdldFNjaGVtYUxvY2F0aW9uKCkuZXF1YWxzKG9sZFNjaGVtYUxvY2F0aW9uKSAmJiBkaXJlY3RpdmUgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLS8vICAgICB7Ci0vLyAgICAgZGlyZWN0aXZlLnVuc2V0U2NoZW1hTG9jYXRpb24oKTsKLS8vICAgICBkaXJlY3RpdmUuc2V0U2NoZW1hTG9jYXRpb24obG9jYXRpb25GaWVsZC5nZXRUZXh0KCkpOwotLy8gICAgIGRpcmVjdGl2ZS51bnNldFJlc29sdmVkU2NoZW1hKCk7Ci0vLyAgICAgcmVkZWZpbmVFbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuU0NIRU1BTE9DQVRJT05fQVRUUklCVVRFLCBsb2NhdGlvbkZpZWxkLmdldFRleHQoKSk7Ci0vLyAgICAgZ2V0WFNEU2NoZW1hKCkudXBkYXRlRG9jdW1lbnQoKTsKLS8vICAgICBYU0RTY2hlbWFIZWxwZXIudXBkYXRlRWxlbWVudChkaXJlY3RpdmUpOwotLy8vLyAgICAgICAgICBkaXJlY3RpdmUudXBkYXRlRWxlbWVudCgpOwotLy8gICAgIGJyZWFrOwotLy8gICAgIH0KLS8vICAgICB9Ci0vLyAgICAgfQotLy8gICAgICovCi0vLyAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0tleXJlZlByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9LZXlyZWZQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2I0YTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0tleXJlZlByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBLZXlyZWZQcm9wZXJ0eVNvdXJjZQotICBleHRlbmRzIEJhc2VQcm9wZXJ0eVNvdXJjZQotICBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICBwcml2YXRlIFN0cmluZ1tdIHJlZkNvbWJvVmFsdWVzID0geyAiIiB9OwotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgS2V5cmVmUHJvcGVydHlTb3VyY2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHZpZXdlcgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgS2V5cmVmUHJvcGVydHlTb3VyY2UoVmlld2VyIHZpZXdlciwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHZpZXdlciwgeHNkU2NoZW1hKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIEtleXJlZlByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgIGphdmEudXRpbC5MaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgCi0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB4c2RTY2hlbWEuZ2V0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGNvbnN0cmFpbnQgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbilpdGVyLm5leHQoKTsKLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmFtZS5lcXVhbHMoIiIpKQotICAgICAgICAgewotICAgICAgICAgIGlmIChjb25zdHJhaW50LmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKGNvbnN0cmFpbnQuZ2V0UU5hbWUoeHNkU2NoZW1hKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGl0ZW1zLmFkZChjb25zdHJhaW50LmdldFFOYW1lKHhzZFNjaGVtYSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNvbnN0cmFpbnQuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbXMuYWRkKGNvbnN0cmFpbnQuZ2V0UU5hbWUoeHNkU2NoZW1hKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgIAotICAgIAotICAgIGludCBzaXplID0gaXRlbXMuc2l6ZSgpICsgMTsKLSAgICByZWZDb21ib1ZhbHVlcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgcmVmQ29tYm9WYWx1ZXNbMF0gPSAiIjsKLSAgICBpZiAoaXRlbXMgIT0gbnVsbCkKLSAgICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgICB7Ci0gICAgICAgIHJlZkNvbWJvVmFsdWVzW2kgKyAxXSA9IChTdHJpbmcpIGl0ZW1zLmdldChpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgYW5kIHNldCBhIGNhdGVnb3J5Ci0vLyBUaGlzIHByb3BlcnR5IGlzIG1vdmVkIHRvIHRoZSBHZW5lcmFsIFRhYgotLy8gICAgUHJvcGVydHlEZXNjcmlwdG9yIG5hbWVEZXNjcmlwdG9yID0KLS8vICAgIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotLy8gICAgICAgIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwKLS8vICAgICAgICBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotLy8gICAgbGlzdC5hZGQobmFtZURlc2NyaXB0b3IpOwotICAgIAotICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIHJlZkRlc2NyaXB0b3IgPQotICAgIG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLlJFRkVSX0FUVFJJQlVURSwKLSAgICAgICAgWFNEQ29uc3RhbnRzLlJFRkVSX0FUVFJJQlVURSwKLSAgICAgICAgcmVmQ29tYm9WYWx1ZXMpOwotICAgIGxpc3QuYWRkKHJlZkRlc2NyaXB0b3IpOwotICAgIAotCi0gICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICBpZiAoaWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgIHsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLS8vICAgICAgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKFhTRENvbnN0YW50cy5SRUZFUl9BVFRSSUJVVEUpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmV0dXJuIHJlc3VsdDsKLS8vICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZhbHVlID0gIiI7Ci0gICAgfQotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSAoU3RyaW5nKXZhbHVlOwotICAgICAgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSkpCi0gICAgICB7ICAKLSAgICAgICAgaWYgKHZhbGlkYXRlTmFtZShuZXdWYWx1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfS0VZUkVGX05BTUVfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgfSAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFRkVSX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9LRVlSRUZfUkVGRVJfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgoU3RyaW5nKSBpZCwgbmV3VmFsdWUpOwotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9Nb2RlbEdyb3VwUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL01vZGVsR3JvdXBQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTBiODFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL01vZGVsR3JvdXBQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxHcm91cFByb3BlcnR5U291cmNlICAvLyBhbGwgb3Igc2VxdWVuY2Ugb3IgY2hvaWNlCi0gIGV4dGVuZHMgQmFzZVByb3BlcnR5U291cmNlCi0gIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0gIHByaXZhdGUgU3RyaW5nW10gbW9kZWxHcm91cENvbWJvVmFsdWVzID0geyAic2VxdWVuY2UiLCAiY2hvaWNlIiwgImFsbCIgfTsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIE1vZGVsR3JvdXBQcm9wZXJ0eVNvdXJjZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gdmlld2VyCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBNb2RlbEdyb3VwUHJvcGVydHlTb3VyY2UoVmlld2VyIHZpZXdlciwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHZpZXdlciwgeHNkU2NoZW1hKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIE1vZGVsR3JvdXBQcm9wZXJ0eVNvdXJjZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIoeHNkU2NoZW1hKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZSgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICAgKi8KLSAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIG1vZGVsR3JvdXBEZXNjcmlwdG9yID0KLSAgICBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgICJtb2RlbCBncm91cCIsCi0gICAgICAgICJtb2RlbCBncm91cCIsCi0gICAgICAgIG1vZGVsR3JvdXBDb21ib1ZhbHVlcyk7Ci0gICAgbGlzdC5hZGQobW9kZWxHcm91cERlc2NyaXB0b3IpOwotICAgIAotICAgIFByb3BlcnR5RGVzY3JpcHRvciBtaW5PY2N1cnNEZXNjcmlwdG9yID0KLSAgICBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICBsaXN0LmFkZChtaW5PY2N1cnNEZXNjcmlwdG9yKTsKLSAgICBQcm9wZXJ0eURlc2NyaXB0b3IgbWF4T2NjdXJzRGVzY3JpcHRvciA9Ci0gICAgbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgbGlzdC5hZGQobWF4T2NjdXJzRGVzY3JpcHRvcik7Ci0gICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gKFN0cmluZylpZDsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotICAgICAgfQotICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJtb2RlbCBncm91cCIpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIFN0cmluZyBwcm9wZXJ0eSA9IChTdHJpbmcpaWQ7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgdmFsdWUgPSAiIjsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IChTdHJpbmcpdmFsdWU7Ci0gICAgICBpZiAocHJvcGVydHkuZXF1YWxzKCJtb2RlbCBncm91cCIpKQotICAgICAgIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcGFyZW50ID0gKEVsZW1lbnQpZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotICAgICAgICBwcmVmaXggPSBwcmVmaXggPT0gbnVsbCA/ICIiIDogcHJlZml4ICsgIjoiOwotICAgICAgICBFbGVtZW50IG5ld05vZGUgPSBudWxsOwotICAgICAgICAvLyBpbnQgY29tcG9zaXRvciA9IFhTRENvbXBvc2l0b3IuU0VRVUVOQ0U7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9HUk9VUF9TQ09QRV9DSEFOR0UiKSwgcGFyZW50KTsKLSAgICAgICAgY2hhbmdlQ29udGVudE1vZGVsKHBhcmVudCwgbmV3VmFsdWUpOwotICAgICAgICBlbmRSZWNvcmRpbmcocGFyZW50KTsKLSAgICAgICAgWFNERE9NSGVscGVyIGRvbUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgc2V0SW5wdXQoZG9tSGVscGVyLmdldENvbnRlbnRNb2RlbEZyb21QYXJlbnQocGFyZW50KSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbWF4ID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgICAgU3RyaW5nIG1pbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX01BWE9DQ1VSU19DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmIChtYXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUsIG1heCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgICAgfQotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuTUlOT0NDVVJTX0FUVFJJQlVURSkpCi0gICAgICAgewotICAgICAgICBTdHJpbmcgbWluID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgICAgU3RyaW5nIG1heCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX01JTk9DQ1VSU19DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmIChtaW4ubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUsIG1pbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgICB9Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHN1cGVyLnNldElucHV0KGVsZW1lbnQpOwotICAgIAotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgYm9vbGVhbiBwYXJlbnRJc1NlcXVlbmNlID0gZmFsc2U7Ci0gICAgICBib29sZWFuIHBhcmVudElzQ2hvaWNlID0gZmFsc2U7Ci0gICAgIAotICAgICAgT2JqZWN0IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgCi0gICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgewotICAgICAgICBwYXJlbnRJc1NlcXVlbmNlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5DSE9JQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICB7Ci0gICAgICAgIHBhcmVudElzQ2hvaWNlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHBhcmVudElzQ2hvaWNlIHx8IHBhcmVudElzU2VxdWVuY2UpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsR3JvdXBDb21ib1ZhbHVlcyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICAgIG1vZGVsR3JvdXBDb21ib1ZhbHVlc1swXSA9IFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRzsKLSAgICAgICAgbW9kZWxHcm91cENvbWJvVmFsdWVzWzFdID0gWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbW9kZWxHcm91cENvbWJvVmFsdWVzID0gbmV3IFN0cmluZ1szXTsKLSAgICAgICAgbW9kZWxHcm91cENvbWJvVmFsdWVzWzBdID0gWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHOwotICAgICAgICBtb2RlbEdyb3VwQ29tYm9WYWx1ZXNbMV0gPSBYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHOwotICAgICAgICBtb2RlbEdyb3VwQ29tYm9WYWx1ZXNbMl0gPSBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHOwotICAgICAgfQotICAgIH0gICAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNoYW5nZUNvbnRlbnRNb2RlbChFbGVtZW50IHBhcmVudCwgU3RyaW5nIGNvbnRlbnRNb2RlbCkKLSAgewotICAgIERvY3VtZW50IGRvYyA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgWFNERE9NSGVscGVyIGRvbUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgCi0gICAgU3RyaW5nIHByZWZpeCA9IHBhcmVudC5nZXRQcmVmaXgoKTsKLSAgICBwcmVmaXggPSBwcmVmaXggPT0gbnVsbCA/ICIiIDogcHJlZml4ICsgIjoiOwotICAgIAotICAgIEVsZW1lbnQgY29udGVudE1vZGVsRWxlbWVudCA9IGRvbUhlbHBlci5nZXRDb250ZW50TW9kZWxGcm9tUGFyZW50KHBhcmVudCk7Ci0gIAotICAgIGlmIChjb250ZW50TW9kZWxFbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhjb250ZW50TW9kZWwpKQotICAgIHsKLSAgICAgIHJldHVybjsgLy8gaXQncyBhbHJlYWR5IHRoZSBjb250ZW50IG1vZGVsIAotICAgIH0KLSAgCi0gICAgRWxlbWVudCBuZXdOb2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBjb250ZW50TW9kZWwpOwotICAKLSAgICBpZiAoY29udGVudE1vZGVsRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgeyAgICAgICAgCi0gICAgICBOb2RlTGlzdCBub2RlcyA9IGNvbnRlbnRNb2RlbEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgLy8gdXNlIGNsb25lcyBzbyB3ZSBkb24ndCBoYXZlIGEgcmVmcmVzaCBwcm9ibGVtCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0gICAgICAgIG5ld05vZGUuYXBwZW5kQ2hpbGQobm9kZS5jbG9uZU5vZGUodHJ1ZSkpOyAKLSAgICAgIH0KLSAgICB9Ci0gICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBjb250ZW50TW9kZWxFbGVtZW50KTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9OYW1lUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL05hbWVQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmZiNzg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL05hbWVQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5HbG9iYWxBdHRyaWJ1dGVHcm91cFJlbmFtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuR2xvYmFsR3JvdXBSZW5hbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIE5hbWVQcm9wZXJ0eVNvdXJjZQotICBleHRlbmRzIEJhc2VQcm9wZXJ0eVNvdXJjZQotICBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgTmFtZVByb3BlcnR5U291cmNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB2aWV3ZXIKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIE5hbWVQcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIodmlld2VyLCB4c2RTY2hlbWEpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgTmFtZVByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotCi0vLyBGcm9tIGF0dHJpYnV0ZSBncm91cCAgICAKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChjbGllbnQsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9BVFRSSUJVVEVfR1JPVVBfREVTSUdOX1ZJRVcpOwotLy8gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKG5hbWVGaWVsZCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0FUVFJJQlVURV9HUk9VUF9OQU1FKTsKLQotLy8gRnJvbSB1bmlxdWUKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChuYW1lRmllbGQsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9VTklRVUVfQkFTRV9OQU1FKTsKLQotLy8gRnJvbSBrZXkKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChuYW1lRmllbGQsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9VTklRVUVfQkFTRV9OQU1FKTsKLSAgICAKLS8vIEZyb20gZ3JvdXAKLS8vICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29udHJvbHNDb250YWluZXIsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9HUk9VUF9ERVNJR05fVklFVyk7Ci0vLyAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKG5hbWVGaWVsZCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0dST1VQX05BTUUpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgYW5kIHNldCBhIGNhdGVnb3J5Ci0gICAgUHJvcGVydHlEZXNjcmlwdG9yIG5hbWVEZXNjcmlwdG9yID0KLSAgICBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotICAgIGxpc3QuYWRkKG5hbWVEZXNjcmlwdG9yKTsKLQotICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChpZCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgoU3RyaW5nKSBpZCk7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAiIjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0KGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjcmVzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50LCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FUVFJJQlVURUdST1VQX05BTUVfQ0hBTkdFIiksIGVsZW1lbnQpOwotCi0gICAgICAgICAgLy8gbm93IHJlbmFtZSBhbnkgcmVmZXJlbmNlcyB0byB0aGlzIGVsZW1lbnQKLSAgICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KGVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKGNvbXAgIT0gbnVsbCAmJiBjb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uICYmIGNvbXAuZ2V0Q29udGFpbmVyKCkuZXF1YWxzKHhzZFNjaGVtYSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEdsb2JhbEF0dHJpYnV0ZUdyb3VwUmVuYW1lciByZW5hbWVyID0gbmV3IEdsb2JhbEF0dHJpYnV0ZUdyb3VwUmVuYW1lcigoWFNETmFtZWRDb21wb25lbnQpY29tcCwgKFN0cmluZyl2YWx1ZSk7Ci0gICAgICAgICAgICAgIHJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCAoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5VTklRVUVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICh2YWxpZGF0ZU5hbWUobmV3VmFsdWUpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVU5JUVVFX05BTUVfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLktFWV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHZhbGlkYXRlTmFtZShuZXdWYWx1ZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0tFWV9OQU1FX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHZhbGlkYXRlTmFtZShuZXdWYWx1ZSkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9HUk9VUF9OQU1FX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgICAgICAgIC8vIG5vdyByZW5hbWUgYW55IHJlZmVyZW5jZXMgdG8gdGhpcyBlbGVtZW50Ci0gICAgICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZWxlbWVudCk7Ci0gICAgICAgICAgICAgIGlmIChjb21wICE9IG51bGwgJiYgY29tcCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uICYmIGNvbXAuZ2V0Q29udGFpbmVyKCkuZXF1YWxzKHhzZFNjaGVtYSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHbG9iYWxHcm91cFJlbmFtZXIgcmVuYW1lciA9IG5ldyBHbG9iYWxHcm91cFJlbmFtZXIoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXAsIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZW5hbWVyLnZpc2l0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvTm90YXRpb25Qcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvTm90YXRpb25Qcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzNkODNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL05vdGF0aW9uUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlRleHRQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLQotcHVibGljIGNsYXNzIE5vdGF0aW9uUHJvcGVydHlTb3VyY2UKLSAgZXh0ZW5kcyBCYXNlUHJvcGVydHlTb3VyY2UKLSAgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIE5vdGF0aW9uUHJvcGVydHlTb3VyY2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHZpZXdlcgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgTm90YXRpb25Qcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIodmlld2VyLCB4c2RTY2hlbWEpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgTm90YXRpb25Qcm9wZXJ0eVNvdXJjZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIoeHNkU2NoZW1hKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZSgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICAgKi8KLSAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBDcmVhdGUgYSBkZXNjcmlwdG9yIGFuZCBzZXQgYSBjYXRlZ29yeQotLy8gUmVtb3ZlZCBmb3IgdGFiYmVkIHByb3BlcnRpZXMKLS8vICAgIFByb3BlcnR5RGVzY3JpcHRvciBuYW1lRGVzY3JpcHRvciA9Ci0vLyAgICBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLS8vICAgICAgICBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsCi0vLyAgICAgICAgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLS8vICAgIGxpc3QuYWRkKG5hbWVEZXNjcmlwdG9yKTsKLQotICAgIFByb3BlcnR5RGVzY3JpcHRvciBwdWJsaWNEZXNjcmlwdG9yID0KLSAgICBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLlBVQkxJQ19BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5QVUJMSUNfQVRUUklCVVRFKTsKLSAgICBsaXN0LmFkZChwdWJsaWNEZXNjcmlwdG9yKTsKLSAgICAKLSAgICBQcm9wZXJ0eURlc2NyaXB0b3Igc3lzdGVtRGVzY3JpcHRvciA9Ci0gICAgbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIFhTRENvbnN0YW50cy5TWVNURU1fQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuU1lTVEVNX0FUVFJJQlVURSk7Ci0gICAgbGlzdC5hZGQoc3lzdGVtRGVzY3JpcHRvcik7Ci0KLSAgICBJUHJvcGVydHlEZXNjcmlwdG9yW10gcmVzdWx0ID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gICAgCi0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotICAgIH0KLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gIiI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZhbHVlID0gIiI7Ci0gICAgfQotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSAoU3RyaW5nKXZhbHVlOwotICAgICAgaWYgKCgoU3RyaW5nKWlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHZhbGlkYXRlTmFtZShuZXdWYWx1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTk9UQVRJT05fTkFNRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCgoU3RyaW5nKWlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlBVQkxJQ19BVFRSSUJVVEUpKQotICAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX05PVEFUSU9OX1BVQkxJQ19DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuUFVCTElDX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5QVUJMSUNfQVRUUklCVVRFLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoKChTdHJpbmcpaWQpLmVxdWFscyhYU0RDb25zdGFudHMuU1lTVEVNX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9OT1RBVElPTl9TWVNURU1fQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNZU1RFTV9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuU1lTVEVNX0FUVFJJQlVURSk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvT3B0aW9uc1RleHRDZWxsRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9PcHRpb25zVGV4dENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwZTU5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9PcHRpb25zVGV4dENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcHRpb25zVGV4dENlbGxFZGl0b3IgZXh0ZW5kcyBDZWxsRWRpdG9yIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIEtleUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZkVkaXRvcjsKLQlwcm90ZWN0ZWQgVGV4dCBmVGV4dDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUZXh0UmVhZE9ubHk7Ci0JQnV0dG9uIG1vcmVCdXR0b247Ci0JU2hlbGwgZGlhbG9nOwotCi0JcHJpdmF0ZSBTdHJpbmcgZlNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgT2JqZWN0IGZWYWx1ZTsKLQlpbnQgc2VsZWN0aW9uOwotCU9iamVjdCB0eXBlT2JqZWN0OwotCQkKLQlwcml2YXRlIGNsYXNzIENvbWJvQ2VsbExheW91dCBleHRlbmRzIExheW91dCAKLQl7Ci0JCXB1YmxpYyB2b2lkIGxheW91dChDb21wb3NpdGUgZWRpdG9yLCBib29sZWFuIGZvcmNlKQotCQl7Ci0JCQlSZWN0YW5nbGUgYm91bmRzPSBlZGl0b3IuZ2V0Q2xpZW50QXJlYSgpOwotCQkJUG9pbnQgc2l6ZT0gbW9yZUJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgYm91bmRzLmhlaWdodCwgZm9yY2UpOwotCQkJZlRleHQuc2V0Qm91bmRzKDAsIDAsIGJvdW5kcy53aWR0aCAtIHNpemUueCwgYm91bmRzLmhlaWdodCk7Ci0JCQltb3JlQnV0dG9uLnNldEJvdW5kcyhib3VuZHMud2lkdGggLSBzaXplLngsIDAsIHNpemUueCwgc2l6ZS55KTsKLQkJfQotCQkKLQkJcHVibGljIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBlZGl0b3IsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZvcmNlKQotCQl7Ci0JCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQl7Ci0JCQkJcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOwotCQkJfQotCQkJUG9pbnQgc2l6ZT0gZlRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmb3JjZSk7Ci0vLwkJCXNpemUueCArPSBtb3JlQnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZm9yY2UpLng7Ci0JCQlyZXR1cm4gc2l6ZTsKLQkJfQotCX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IGNvbWJvIGJveCBjZWxsIGVkaXRvciB3aXRoIHRoZSBnaXZlbiBjaG9pY2VzLgotICovCi0JIHB1YmxpYyBPcHRpb25zVGV4dENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkKLQkgewotCQkgc3VwZXIocGFyZW50KTsKLQkJIGZTZWxlY3Rpb24gPSAiIjsKLQkgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCWZFZGl0b3IgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAyKTsKLQkJZkVkaXRvci5zZXRMYXlvdXQobmV3IENvbWJvQ2VsbExheW91dCgpKTsKLSAKLSAgICBpZiAoaXNUZXh0UmVhZE9ubHkpCi0gICAgewotCQkgIGZUZXh0ID0gbmV3IFRleHQoZkVkaXRvciwgU1dULkxFRlQgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZUZXh0ID0gbmV3IFRleHQoZkVkaXRvciwgU1dULkxFRlQpOwotICAgIH0KLS8vICAgIGZUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZUZXh0LnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0JCWZUZXh0LnNldFRleHQoIiIpOwotICAgIGZUZXh0LmFkZEtleUxpc3RlbmVyKHRoaXMpOwotCQlmVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKQotICAgIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpCi0gICAgICB7Ci0JCQkJaWYgKCFtb3JlQnV0dG9uLmlzRm9jdXNDb250cm9sKCkpCi0JCQkJewotCQkJCQlPcHRpb25zVGV4dENlbGxFZGl0b3IudGhpcy5mb2N1c0xvc3QoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkJCi0JCW1vcmVCdXR0b24gPSBWaWV3VXRpbGl0eS5jcmVhdGVQdXNoQnV0dG9uKGZFZGl0b3IsICIuLi4iKTsKLQkJbW9yZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJNb3JlIEJ1dHRvbiBDbGlja2VkIik7Ci0JCQkJb3BlbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLSAgICBtb3JlQnV0dG9uLmFkZEtleUxpc3RlbmVyKHRoaXMpOwotCQltb3JlQnV0dG9uLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlpZiAoIWZUZXh0LmlzRm9jdXNDb250cm9sKCkgJiYgKGRpYWxvZz09bnVsbCB8fCAKLQkJCQkJCQkJZGlhbG9nLmlzRGlzcG9zZWQoKSB8fCAKLQkJCQkJCQkJKGRpYWxvZyE9bnVsbCAmJiAhZGlhbG9nLmlzRm9jdXNDb250cm9sKCkpKSkKLQkJCQl7Ci0gICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJNb3JlQnV0dG9uIGZvY3VzTG9zdCIpOwotCQkJCQlPcHRpb25zVGV4dENlbGxFZGl0b3IudGhpcy5mb2N1c0xvc3QoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0KLQkJc2V0VmFsdWVWYWxpZCh0cnVlKTsKLQotCQlyZXR1cm4gZkVkaXRvcjsKLQl9Ci0gIAotICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpCi0gIHsKLSAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNlbGwgZWRpdG9yIGFjdGl2YXRlZCIpOwotICAgIGZUZXh0LnNldFRleHQoZlZhbHVlID09IG51bGwgPyAiIiA6IGZWYWx1ZS50b1N0cmluZygpKTsKLSAgfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9jdXNMb3N0KCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNFTExFRElUT1IgRk9DVVMgTE9TVCIpOwotCQlpZiAoaXNBY3RpdmF0ZWQoKSkgewotCQkJYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCXZvaWQgYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKSB7Ci0JCS8vCW11c3Qgc2V0IHRoZSBzZWxlY3Rpb24gYmVmb3JlIGdldHRpbmcgdmFsdWUKLS8vCQlpZiAoZGlhbG9nICE9IG51bGwgICYmICFkaWFsb2cuaXNEaXNwb3NlZCgpKQotLy8JCXsKLS8vCQkJZGlhbG9nLmNsb3NlKCk7Ci0vLwkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0vLwkJfQotCQlmaXJlQXBwbHlFZGl0b3JWYWx1ZSgpOwotCQlkZWFjdGl2YXRlKCk7Ci0JfQotCi0gIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLSAgewotICAgIGlmIChlLmNoYXJhY3RlciA9PSBTV1QuRVNDKQotICAgICB7IC8vIEVzY2FwZSBjaGFyYWN0ZXIKLSAgICAgIGZpcmVDYW5jZWxFZGl0b3IoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKGUuY2hhcmFjdGVyID09IFNXVC5DUikgfHwgKGUuY2hhcmFjdGVyID09IFNXVC5MRikpCi0gICAgIHsgLy8gUmV0dXJuIGtleQotICAgICAgYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gIHsKLSAgICAKLSAgfQotICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IjZG9HZXRWYWx1ZSgpCi0gICAqIFJldHVybnMgdGhlIGNlbGwgZWRpdG9yJ3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb0dldFZhbHVlKCkgCi0JewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvciNkb1NldEZvY3VzKCkKLSAgICogU2V0IHRoZSBmb2N1cyB0byB0aGUgY2VsbCBlZGl0b3IncyBVSSByZXByZXNlbnRhdGlvbi4KLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TZXRGb2N1cygpCi0JewotLy8JCWZCdXR0b24uc2V0Rm9jdXMoKTsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oImRvU2V0Rm9jdXMoKSAiICsgbW9yZUJ1dHRvbi5zZXRGb2N1cygpKTsKLQkJZlRleHQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IjZG9TZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIGVkaXRvciB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotCXsKLQkJZlZhbHVlID0gdmFsdWU7Ci0JfQotCi0gIHByb3RlY3RlZCBQb2ludCBnZXRCdXR0b25BYnNvbHV0ZUxvY2F0aW9uKCkKLSAgewotICAgIFJlY3RhbmdsZSBidXR0b25Cb3VuZHMgPSBtb3JlQnV0dG9uLmdldEJvdW5kcygpOwotICAgIGludCB4ID0gYnV0dG9uQm91bmRzLng7Ci0gICAgaW50IHkgPSBidXR0b25Cb3VuZHMueTsKLSAgICBDb250cm9sIGMgPSBtb3JlQnV0dG9uOwotICAgIHdoaWxlIChjICE9IG51bGwpCi0gICAgIHsKLSAgICAgIGMgPSBjLmdldFBhcmVudCgpOwotICAgICAgaWYgKGMgPT0gbnVsbCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICB4ICs9IGMuZ2V0Qm91bmRzKCkueDsKLSAgICAgIHkgKz0gYy5nZXRCb3VuZHMoKS55OwotICAgIH0KLSAgICB4ICs9IGJ1dHRvbkJvdW5kcy53aWR0aCArIDU7Ci0gICAgeSArPSBidXR0b25Cb3VuZHMuaGVpZ2h0OwotICAgIFBvaW50IHAgPSBuZXcgUG9pbnQoeCx5KTsKLSAgICByZXR1cm4gcDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY2FuY2VsKCkKLSAgewotICAgIGRpYWxvZy5jbG9zZSgpOwotICAgIGRpYWxvZy5kaXNwb3NlKCk7Ci0gIH0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9wZW5EaWFsb2coKTsJCi0gIAotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCX0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9QYXR0ZXJuUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1BhdHRlcm5Qcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGYxNjZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1BhdHRlcm5Qcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRpYWxvZ0NlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5SZWdleFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgUGF0dGVyblByb3BlcnR5U291cmNlCi0gIGV4dGVuZHMgQmFzZVByb3BlcnR5U291cmNlCi0gIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBQYXR0ZXJuUHJvcGVydHlTb3VyY2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLS8vICAgIGV4cHJlc3Npb25GaWVsZC5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9QQVRURVJOIikpOyAgICAKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChleHByZXNzaW9uRmllbGQsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9QQVRURVJOX1ZBTFVFKTsKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChhY3RpdmF0ZVdpemFyZEJ1dHRvbiwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX1BBVFRFUk5fUkVHVUxBUik7Ci0vLyAgICBhY3RpdmF0ZVdpemFyZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQlVUVE9OIikpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gdmlld2VyCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBQYXR0ZXJuUHJvcGVydHlTb3VyY2UoVmlld2VyIHZpZXdlciwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHZpZXdlciwgeHNkU2NoZW1hKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIFBhdHRlcm5Qcm9wZXJ0eVNvdXJjZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIoeHNkU2NoZW1hKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZSgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICAgKi8KLSAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBDcmVhdGUgYSBkZXNjcmlwdG9yIGFuZCBzZXQgYSBjYXRlZ29yeQotCi0gICAgUGF0dGVyblRleHRQcm9wZXJ0eURlc2NyaXB0b3IgcGF0dGVybkRlc2NyaXB0b3IgPQotICAgIG5ldyBQYXR0ZXJuVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLlZBTFVFX0FUVFJJQlVURSwgCi0gICAgICAgIFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUpOwotICAgIGxpc3QuYWRkKHBhdHRlcm5EZXNjcmlwdG9yKTsKLSAgICAKLSAgICBJUHJvcGVydHlEZXNjcmlwdG9yW10gcmVzdWx0ID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotICAgIH0KLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gIiI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZhbHVlID0gIiI7Ci0gICAgfQotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlZBTFVFX0FUVFJJQlVURSkpCi0gICAgICB7IAotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUEFUVEVSTl9WQUxVRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUsIChTdHJpbmcpdmFsdWUpOwotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotICAgIAotICB9Ci0KLSAgcHVibGljIGNsYXNzIFBhdHRlcm5UZXh0UHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgUHJvcGVydHlEZXNjcmlwdG9yCi0gIHsKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiBAcGFyYW0gZGlzcGxheU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0dGVyblRleHRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IGlkLCBTdHJpbmcgZGlzcGxheU5hbWUpCi0gICAgewotICAgICAgc3VwZXIoaWQsIGRpc3BsYXlOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENlbGxFZGl0b3IgY3JlYXRlUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICAvLyBDZWxsRWRpdG9yIGVkaXRvciA9IG5ldyBQYXR0ZXJuVGV4dENlbGxFZGl0b3IocGFyZW50KTsKLSAgICAgIENlbGxFZGl0b3IgZWRpdG9yID0gbmV3IFBhdHRlcm5EaWFsb2dDZWxsRWRpdG9yKHBhcmVudCk7Ci0gICAgICBpZiAoZ2V0VmFsaWRhdG9yKCkgIT0gbnVsbCkKLSAgICAgICAgZWRpdG9yLnNldFZhbGlkYXRvcihnZXRWYWxpZGF0b3IoKSk7Ci0gICAgICByZXR1cm4gZWRpdG9yOwotICAgIH0KLSAgfSAgIAotCi0gIHB1YmxpYyBjbGFzcyBQYXR0ZXJuRGlhbG9nQ2VsbEVkaXRvciBleHRlbmRzIERpYWxvZ0NlbGxFZGl0b3IgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBGb250IGRpYWxvZyBjZWxsIGVkaXRvciBwYXJlbnRlZCB1bmRlciB0aGUgZ2l2ZW4gY29udHJvbC4KLSAgICAgKiBUaGUgY2VsbCBlZGl0b3IgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gaW5pdGlhbGx5LCBhbmQgaGFzIG5vIAotICAgICAqIHZhbGlkYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBhdHRlcm5EaWFsb2dDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRpYWxvZ0NlbGxFZGl0b3Ijb3BlbkRpYWxvZ0JveChDb250cm9sKQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlbkRpYWxvZ0JveChDb250cm9sIGNlbGxFZGl0b3JXaW5kb3cpCi0gICAgewotICAgICAgU3RyaW5nIGluaXRpYWxWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUpOwotICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBpbml0aWFsVmFsdWUgPSAiIjsKLSAgICAgIH0KLSAgICAgIFJlZ2V4V2l6YXJkIHdpemFyZCA9IG5ldyBSZWdleFdpemFyZChpbml0aWFsVmFsdWUpOwotICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0gICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpZ2V0VmFsdWUoKTsKLQotICAgICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICByZXR1cm4gd2l6YXJkLmdldFBhdHRlcm4oKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgfQotICAKLS8vICBjbGFzcyBQYXR0ZXJuVGV4dENlbGxFZGl0b3IgZXh0ZW5kcyBPcHRpb25zVGV4dENlbGxFZGl0b3IKLS8vICB7Ci0vLyAgICBwcm90ZWN0ZWQgQnV0dG9uIGZpeGVkQnV0dG9uLCBkZWZhdWx0QnV0dG9uOwotLy8gICAgCi0vLyAgICBwdWJsaWMgUGF0dGVyblRleHRDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpCi0vLyAgICB7Ci0vLyAgICAgIHN1cGVyKHBhcmVudCk7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotLy8gICAgewotLy8gICAgICBpc1RleHRSZWFkT25seSA9IGZhbHNlOwotLy8gICAgICByZXR1cm4gc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotLy8gICAgfQotLy8KLS8vICAgIHByb3RlY3RlZCB2b2lkIG9wZW5EaWFsb2coKQotLy8gICAgewotLy8gICAgICBSZWdleFdpemFyZCB3aXphcmQgPSBuZXcgUmVnZXhXaXphcmQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlZBTFVFX0FUVFJJQlVURSkpOwotLy8gICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0vLyAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotLy8gICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0vLyAgICAgIAotLy8gICAgICBkaWFsb2cgPSB3aXphcmREaWFsb2cuZ2V0U2hlbGwoKTsKLS8vICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZGlhbG9nLmdldERpc3BsYXkoKTsKLS8vICAgICAgZGlhbG9nLmFkZFNoZWxsTGlzdGVuZXIobmV3IFNoZWxsQWRhcHRlcigpCi0vLyAgICAgIHsKLS8vICAgICAgICBwdWJsaWMgdm9pZCBzaGVsbERlYWN0aXZhdGVkKFNoZWxsRXZlbnQgZSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBjYW5jZWwoKTsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0pOwotLy8KLS8vICAgICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0vLwotLy8gICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLS8vICAgICAgewotLy8gICAgICAgIGZUZXh0LnNldFRleHQod2l6YXJkLmdldFBhdHRlcm4oKSk7Ci0vLyAgICAgICAgYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKTsKLS8vICAgICAgfQotLy8gICAgICAKLS8vICAgIH0KLS8vCi0vLyAgICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWwoKQotLy8gICAgewotLy8gICAgICBzdXBlci5jYW5jZWwoKTsKLS8vICAgIH0KLS8vCi0vLyAgICB2b2lkIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCkKLS8vICAgIHsKLS8vICAgICAgU3RyaW5nIHZhbHVlID0gZlRleHQuZ2V0VGV4dCgpOwotLy8gICAgICBkb1NldFZhbHVlKHZhbHVlKTsKLS8vICAgICAgZmlyZUFwcGx5RWRpdG9yVmFsdWUoKTsKLS8vICAgICAgZGVhY3RpdmF0ZSgpOwotLy8gICAgfQotLy8gICAgCi0vLyAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0VmFsdWUoKQotLy8gICAgeyAKLS8vICAgICAgZlZhbHVlID0gZlRleHQuZ2V0VGV4dCgpOwotLy8gICAgICByZXR1cm4gZlRleHQuZ2V0VGV4dCgpOwotLy8gICAgfQotLy8KLS8vICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9SZWFkT25seVByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9SZWFkT25seVByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNWNiN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvUmVhZE9ubHlQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBSZWFkT25seVByb3BlcnR5U291cmNlIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0JcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLQotCXB1YmxpYyBSZWFkT25seVByb3BlcnR5U291cmNlKElFZGl0b3JQYXJ0IGVkaXRQYXJ0LCBFbGVtZW50IGVsZW1lbnQpCi0JewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotCXsKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0JewotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTmFtZWROb2RlTWFwIG1hcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJCUF0dHIgYXR0ciA9IChBdHRyKSBtYXAuaXRlbShpKTsKLQkJCQkJbGlzdC5hZGQobmV3IFByb3BlcnR5RGVzY3JpcHRvcihhdHRyLmdldE5hbWUoKSwgYXR0ci5nZXROYW1lKCkpKTsKLQkJCX0KLQkJCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLQl7Ci0JCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChpZCBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXsKLQkJCQkJcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpCi0JewotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkLCBPYmplY3QgdmFsdWUpCi0JewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU2NoZW1hRGlyZWN0aXZlSGVscGVyUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NjaGVtYURpcmVjdGl2ZUhlbHBlclByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTFlZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU2NoZW1hRGlyZWN0aXZlSGVscGVyUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRpYWxvZ0NlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkudmlld2Vycy5SZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5YU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2NoZW1hRGlyZWN0aXZlSGVscGVyUHJvcGVydHlTb3VyY2UKLSAgZXh0ZW5kcyBCYXNlUHJvcGVydHlTb3VyY2UKLXsKLSAgcHJvdGVjdGVkIElGaWxlIGN1cnJlbnRJRmlsZTsKLQotICBJRmlsZSBzZWxlY3RlZElGaWxlOwotICBTdHJpbmcgc2VsZWN0ZWROYW1lc3BhY2U7Ci0gIFhTRFNjaGVtYSBzZWxlY3RlZFhTRFNjaGVtYTsKLSAgYm9vbGVhbiBpc0luY2x1ZGU7Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBTY2hlbWFEaXJlY3RpdmVIZWxwZXJQcm9wZXJ0eVNvdXJjZShib29sZWFuIGlzSW5jbHVkZSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5pc0luY2x1ZGUgPSBpc0luY2x1ZGU7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB2aWV3ZXIKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIFNjaGVtYURpcmVjdGl2ZUhlbHBlclByb3BlcnR5U291cmNlKAotICAgIFZpZXdlciB2aWV3ZXIsCi0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSwKLSAgICBib29sZWFuIGlzSW5jbHVkZSkKLSAgewotICAgIHN1cGVyKHZpZXdlciwgeHNkU2NoZW1hKTsKLSAgICB0aGlzLmlzSW5jbHVkZSA9IGlzSW5jbHVkZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIFNjaGVtYURpcmVjdGl2ZUhlbHBlclByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEsIGJvb2xlYW4gaXNJbmNsdWRlKQotICB7Ci0gICAgc3VwZXIoeHNkU2NoZW1hKTsKLSAgICB0aGlzLmlzSW5jbHVkZSA9IGlzSW5jbHVkZTsKLSAgfQotCi0gIAotICBwdWJsaWMgY2xhc3MgU2NoZW1hTG9jYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IgZXh0ZW5kcyBQcm9wZXJ0eURlc2NyaXB0b3IKLSAgewotICAgIC8qKgotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSkKLSAgICB7Ci0gICAgICBzdXBlcihpZCwgZGlzcGxheU5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIENlbGxFZGl0b3IgZWRpdG9yID0gbmV3IFNjaGVtYUxvY2F0aW9uRGlhbG9nQ2VsbEVkaXRvcihwYXJlbnQpOwotICAgICAgaWYgKGdldFZhbGlkYXRvcigpICE9IG51bGwpCi0gICAgICAgIGVkaXRvci5zZXRWYWxpZGF0b3IoZ2V0VmFsaWRhdG9yKCkpOwotICAgICAgcmV0dXJuIGVkaXRvcjsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgY2xhc3MgU2NoZW1hTG9jYXRpb25EaWFsb2dDZWxsRWRpdG9yIGV4dGVuZHMgRGlhbG9nQ2VsbEVkaXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbnQgZGlhbG9nIGNlbGwgZWRpdG9yIHBhcmVudGVkIHVuZGVyIHRoZSBnaXZlbiBjb250cm9sLgotICAgICAqIFRoZSBjZWxsIGVkaXRvciB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBpbml0aWFsbHksIGFuZCBoYXMgbm8gCi0gICAgICogdmFsaWRhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2NoZW1hTG9jYXRpb25EaWFsb2dDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRpYWxvZ0NlbGxFZGl0b3Ijb3BlbkRpYWxvZ0JveChDb250cm9sKQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlbkRpYWxvZ0JveChDb250cm9sIGNlbGxFZGl0b3JXaW5kb3cpCi0gICAgewotICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgCi0vLyAgICAgIG9sZFNjaGVtYUxvY2F0aW9uID0gbG9jYXRpb25GaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotLy8gICAgICBJRmlsZSBjdXJyZW50SUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZ2V0SUVkaXRvclBhcnQoKS5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0gICAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKG5ldyBTdHJpbmdbXSB7ICIueHNkIiB9LCAKLSAgICAgIG5ldyBJRmlsZVtdIHsgY3VycmVudElGaWxlIH0sCi0gICAgICBudWxsKTsKLS8vCi0KLSAgICAgIElWaWV3UGFydCB2aWV3UGFydHNbXSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldFZpZXdzKCk7Ci0gICAgICBSZXNvdXJjZU5hdmlnYXRvciByZXNvdXJjZU5hdiA9IG51bGw7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZpZXdQYXJ0cy5sZW5ndGg7IGkrKykgCi0gICAgICAgewotICAgICAgICBpZiAodmlld1BhcnRzW2ldIGluc3RhbmNlb2YgUmVzb3VyY2VOYXZpZ2F0b3IpIAotICAgICAgICAgewotICAgICAgICAgIHJlc291cmNlTmF2ID0gKFJlc291cmNlTmF2aWdhdG9yKSB2aWV3UGFydHNbaV07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gICAgICBpZiAocmVzb3VyY2VOYXYgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilyZXNvdXJjZU5hdi5nZXRWaWV3U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFhTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkIGZpbGVTZWxlY3RXaXphcmQgPSAKLSAgICAgIG5ldyBYU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZCh4c2RTY2hlbWEsIGlzSW5jbHVkZSwKLSAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRklMRURJQUxPR19TRUxFQ1RfWE1MX1NDSEVNQSIpLAotICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfREVTQyIpLAotICAgICAgICAgIGZpbHRlciwKLSAgICAgICAgICBzZWxlY3Rpb24pOwotCi0gICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgZmlsZVNlbGVjdFdpemFyZCk7Ci0gICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0gICAgICB3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQotICAgICAgCi0gICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWdldFZhbHVlKCk7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZBTFVFIElTICoqKiA9ICIgKyB2YWx1ZSk7Ci0gICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0ZWRJRmlsZSA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0UmVzdWx0RmlsZSgpOwotICAgICAgICBTdHJpbmcgc2NoZW1hRmlsZVN0cmluZyA9IHZhbHVlOwotICAgICAgICBpZiAoc2VsZWN0ZWRJRmlsZSAhPSBudWxsKSAKLSAgICAgICAgIHsKLSAgICAgICAgICBzY2hlbWFGaWxlU3RyaW5nID0gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKHNlbGVjdGVkSUZpbGUuZ2V0TG9jYXRpb24oKSwgY3VycmVudElGaWxlLmdldExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICBzY2hlbWFGaWxlU3RyaW5nID0gZmlsZVNlbGVjdFdpemFyZC5nZXRVUkwoKTsKLSAgICAgICAgfQotCi0vLyAgICAgICAgdXBkYXRlRXh0ZXJuYWxNb2RlbChzZWxlY3RlZElGaWxlLCBmaWxlU2VsZWN0V2l6YXJkLmdldE5hbWVzcGFjZSgpLCBmaWxlU2VsZWN0V2l6YXJkLmdldEV4dGVybmFsU2NoZW1hKCkpOwotICAgICAgICBzZWxlY3RlZE5hbWVzcGFjZSA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIHNlbGVjdGVkWFNEU2NoZW1hID0gZmlsZVNlbGVjdFdpemFyZC5nZXRFeHRlcm5hbFNjaGVtYSgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNjaGVtYUZpbGVTdHJpbmc7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElGaWxlIGdldFNlbGVjdGVkSUZpbGUoKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGVkSUZpbGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWROYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGVkTmFtZXNwYWNlOwotICB9Ci0gIAotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNlbGVjdGVkWFNEU2NoZW1hKCkKLSAgewotICAgIHJldHVybiBzZWxlY3RlZFhTRFNjaGVtYTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NjaGVtYVByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TY2hlbWFQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTFjM2M4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NjaGVtYVByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RTY2hlbWFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hUHJvcGVydHlTb3VyY2UKLSAgZXh0ZW5kcyBCYXNlUHJvcGVydHlTb3VyY2UKLSAgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgb2xkUHJlZml4ID0gIiI7Ci0gIHByaXZhdGUgU3RyaW5nIG9sZE5hbWVzcGFjZSA9ICIiOwotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBhdHRyaWJ1dGVGb3JtRGVmYXVsdENvbWJvVmFsdWVzID0KLSAgeyAKLSAgICAiIiwKLSAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ09NQk9fVU5RVUFMSUZJRUQiKSwKLSAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ09NQk9fUVVBTElGSUVEIikKLSAgfTsKLSAgCi0gIHByaXZhdGUgU3RyaW5nW10gZWxlbWVudEZvcm1EZWZhdWx0Q29tYm9WYWx1ZXMgPQotICB7Ci0gICAgIiIsCi0gICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTUJPX1VOUVVBTElGSUVEIiksCi0gICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTUJPX1FVQUxJRklFRCIpCi0gIH07Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBibG9ja0RlZmF1bHRDb21ib1ZhbHVlcyA9Ci0gIHsKLSAgICAiIiwKLSAgICAiI2FsbCIsCi0gICAgImV4dGVuc2lvbiIsCi0gICAgInJlc3RyaWN0aW9uIiwKLSAgICAic3Vic3RpdHV0aW9uIgotICB9OwotCi0gIHByaXZhdGUgU3RyaW5nW10gZmluYWxEZWZhdWx0Q29tYm9WYWx1ZXMgPQotICB7Ci0gICAgIiIsCi0gICAgIiNhbGwiLAotICAgICJleHRlbnNpb24iLAotICAgICJyZXN0cmljdGlvbiIKLSAgfTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eVNvdXJjZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gdmlld2VyCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eVNvdXJjZShWaWV3ZXIgdmlld2VyLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIodmlld2VyLCB4c2RTY2hlbWEpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgU2NoZW1hUHJvcGVydHlTb3VyY2UoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHhzZFNjaGVtYSk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldEVkaXRhYmxlVmFsdWUoKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgICovCi0gIHB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gQ3JlYXRlIGEgZGVzY3JpcHRvciBhbmQgc2V0IGEgY2F0ZWdvcnkKLS8vIFRoZXNlIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgR2VuZXJhbCB0YWIgICAgCi0vLyAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJlZml4RGVzY3JpcHRvciA9IAotLy8gICAgbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoCi0vLyAgICAgICAgInByZWZpeCIsCi0vLyAgICAgICAgInByZWZpeCIpOwotLy8gICAgbGlzdC5hZGQocHJlZml4RGVzY3JpcHRvcik7Ci0vLyAgICBwcmVmaXhEZXNjcmlwdG9yLnNldENhdGVnb3J5KCJOYW1lc3BhY2UiKTsKLS8vCi0vLyAgICBQcm9wZXJ0eURlc2NyaXB0b3IgdGFyZ2V0TmFtZXNwYWNlRGVzY3JpcHRvciA9IAotLy8gICAgbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoCi0vLyAgICAgICAgWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUsCi0vLyAgICAgICAgWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpOwotLy8gICAgbGlzdC5hZGQodGFyZ2V0TmFtZXNwYWNlRGVzY3JpcHRvcik7Ci0vLyAgICB0YXJnZXROYW1lc3BhY2VEZXNjcmlwdG9yLnNldENhdGVnb3J5KCJOYW1lc3BhY2UiKTsKLSAgICAKLSAgICBQcm9wZXJ0eURlc2NyaXB0b3IgdmVyc2lvbkRlc2NyaXB0b3IgPSAKLSAgICBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUpOwotLy8gICAgdmVyc2lvbkRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRpb24oIlZlcnNpb24gYXR0cmlidXRlIik7IC8vIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1ZFUlNJT04iKSk7Ci0gICAgbGlzdC5hZGQodmVyc2lvbkRlc2NyaXB0b3IpOwotICAgIFByb3BlcnR5RGVzY3JpcHRvciB4bWxMYW5nRGVzY3JpcHRvciA9IAotICAgIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAieG1sOmxhbmciLAotICAgICAgICAieG1sOmxhbmciKTsKLSAgICBsaXN0LmFkZCh4bWxMYW5nRGVzY3JpcHRvcik7Ci0gICAgCi0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgYXR0cmlidXRlRm9ybURlZmF1bHREZXNjcmlwdG9yID0KLSAgICBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIFhTRENvbnN0YW50cy5BVFRSSUJVVEVGT1JNREVGQVVMVF9BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5BVFRSSUJVVEVGT1JNREVGQVVMVF9BVFRSSUJVVEUsCi0gICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0Q29tYm9WYWx1ZXMpOwotICAgIGxpc3QuYWRkKGF0dHJpYnV0ZUZvcm1EZWZhdWx0RGVzY3JpcHRvcik7Ci0gICAgCi0gICAgCi0gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgZWxlbWVudEZvcm1EZWZhdWx0RGVzY3JpcHRvciA9Ci0gICAgbmV3IFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICBYU0RDb25zdGFudHMuRUxFTUVOVEZPUk1ERUZBVUxUX0FUVFJJQlVURSwKLSAgICAgICAgWFNEQ29uc3RhbnRzLkVMRU1FTlRGT1JNREVGQVVMVF9BVFRSSUJVVEUsCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdENvbWJvVmFsdWVzKTsKLSAgICBsaXN0LmFkZChlbGVtZW50Rm9ybURlZmF1bHREZXNjcmlwdG9yKTsKLSAgICAKLSAgICBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvciBibG9ja0RlZmF1bHREZXNjcmlwdG9yID0KLSAgICBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIFhTRENvbnN0YW50cy5CTE9DS0RFRkFVTFRfQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuQkxPQ0tERUZBVUxUX0FUVFJJQlVURSwKLSAgICAgICAgYmxvY2tEZWZhdWx0Q29tYm9WYWx1ZXMpOwotICAgIGxpc3QuYWRkKGJsb2NrRGVmYXVsdERlc2NyaXB0b3IpOwotICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIGZpbmFsRGVmYXVsdERlc2NyaXB0b3IgPQotICAgIG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLkZJTkFMREVGQVVMVF9BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5GSU5BTERFRkFVTFRfQVRUUklCVVRFLAotICAgICAgICBmaW5hbERlZmF1bHRDb21ib1ZhbHVlcyk7Ci0gICAgbGlzdC5hZGQoZmluYWxEZWZhdWx0RGVzY3JpcHRvcik7Ci0KLSAgICBJUHJvcGVydHlEZXNjcmlwdG9yW10gcmVzdWx0ID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gICAgLy8gICAgcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnM7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAoU3RyaW5nKWlkOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAiIjsKLSAgICAgIH0KLQotICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJwcmVmaXgiKSkKLSAgICAgIHsKLSAgICAgICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgICAgIFN0cmluZyBhUHJlZml4ID0gaGVscGVyLmdldFByZWZpeChlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSksIGZhbHNlKTsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2hlbWEgdGFyZ2V0TlMgaXMgIiArIHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGlmIChhUHJlZml4ICE9IG51bGwgJiYgYVByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gYVByZWZpeDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0KGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjcmVzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3NldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkLCBPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICIiOwotICAgIH0KLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gKFN0cmluZylpZDsKLSAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygicHJlZml4IikpCi0gICAgICB7Ci0gICAgICAgIHVwZGF0ZVByZWZpeChuZXdWYWx1ZSk7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICB1cGRhdGVUYXJnZXROYW1lc3BhY2UobmV3VmFsdWUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoInhtbDpsYW5nIikpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlTGFuZ3VhZ2UobmV3VmFsdWUpOwotICAgICAgICAvLyByZXR1cm47ICAvLyB3ZSB3aWxsIGFjY2VwdCB0aGUgdmFsdWUgZXZlbiB0aG91Z2ggaXQgZG9lcyBub3QgY29uZm9ybQotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU0NIRU1BX0xBTkdfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NDSEVNQV9WRVJTSU9OX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5BVFRSSUJVVEVGT1JNREVGQVVMVF9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU0NIRU1BX0FUVFJJQlVURUZPUk1ERUZBVUxUX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5FTEVNRU5URk9STURFRkFVTFRfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NDSEVNQV9FTEVNRU5URk9STURFRkFVTFRfQ0hBTkdFIiksIGVsZW1lbnQpOyAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5CTE9DS0RFRkFVTFRfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NDSEVNQV9CTE9DS0RFRkFVTFRfQ0hBTkdFIiksIGVsZW1lbnQpOyAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5GSU5BTERFRkFVTFRfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NDSEVNQV9GSU5BTERFRkFVTFRfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgfQotCi0gICAgICBpZiAoIWF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJwcmVmaXgiKSAmJiAhYXR0cmlidXRlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIGlmIChuZXdWYWx1ZS5lcXVhbHMoIiIpKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7IAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHN1cGVyLnNldElucHV0KGVsZW1lbnQpOwotICAgIAotICAgIG9sZE5hbWVzcGFjZSA9ICIiOwotICAgIG9sZFByZWZpeCA9ICIiOwotICAgIAotICAgIGlmIChlbGVtZW50IT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpOwotICAgICAgb2xkTmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCi0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIFN0cmluZyBhUHJlZml4ID0gaGVscGVyLmdldFByZWZpeCh0YXJnZXROYW1lc3BhY2UsIGZhbHNlKTsKLSAgICAgIGlmIChhUHJlZml4ICE9IG51bGwgJiYgYVByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIG9sZFByZWZpeCA9IGFQcmVmaXg7Ci0gICAgICB9Ci0gICAgfQotCi0vLyAgRm9yIGRlYnVnZ2luZwotLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJvbGQgUHJlZml4IGlzICIgKyBvbGRQcmVmaXgpOwotLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJvbGQgTlMgaXMgIiArIG9sZE5hbWVzcGFjZSk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIE1hcCBtYXAgPSB4c2RTY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldElucHV0OiBQcmVmaXhlczogIiArIG1hcC52YWx1ZXMoKSk7Ci0vLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0SW5wdXQ6IE5TOiIgKyBtYXAua2V5U2V0KCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVQcmVmaXgoU3RyaW5nIG5ld1ByZWZpeCkKLSAgewotICAgIHVwZGF0ZU5hbWVzcGFjZUluZm8obmV3UHJlZml4LCBvbGROYW1lc3BhY2UpOyAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkKLSAgewotICAgIHVwZGF0ZU5hbWVzcGFjZUluZm8ob2xkUHJlZml4LCBuZXdUYXJnZXROYW1lc3BhY2UpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdXBkYXRlTmFtZXNwYWNlSW5mbyhTdHJpbmcgbmV3UHJlZml4LCBTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0vLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxub2xkIFByZWZpeCBpcyAiICsgb2xkUHJlZml4KTsKLS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigib2xkIE5TIGlzICIgKyBvbGROYW1lc3BhY2UpOwotLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJuZXcgUHJlZml4IGlzICIgKyBuZXdQcmVmaXgpOwotLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJuZXcgTlMgaXMgIiArIG5ld1RhcmdldE5hbWVzcGFjZSk7Ci0gICAgCi0gICAgRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0KLSAgICBTdHJpbmcgbW9kZWxUYXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0vLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGVsIFRhcmdldE5TIGlzICIgKyBtb2RlbFRhcmdldE5hbWVzcGFjZSk7Ci0gICAgaWYgKG1vZGVsVGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbW9kZWxUYXJnZXROYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0gICAgICAgIAotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBuZXdUYXJnZXROYW1lc3BhY2UudHJpbSgpOyAKLSAgICBTdHJpbmcgcHJlZml4ID0gbmV3UHJlZml4LnRyaW0oKTsKLQotICAgIGlmICghdmFsaWRhdGVQcmVmaXgocHJlZml4KSB8fCAhdmFsaWRhdGVUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAKLSAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCAmJiB0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICAgLy8gY2FuJ3QgaGF2ZSBibGFuayB0YXJnZXRuYW1lc3BhY2UgYW5kIHlldCBzcGVjaWZ5IGEgcHJlZml4Ci0gICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsICJUYXJnZXQgTmFtZXNwYWNlIENoYW5nZSIpOwotICAgIFN0cmluZyB4c2RGb3JYU0RQcmVmaXggPSB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKTsKLSAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLQotLy8gRm9yIGRlYnVnZ2luZwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiMS4gU1cgTWFwIGlzICIgKyBtYXAudmFsdWVzKCkpOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiMS4gU1cgTWFwIGtleXMgYXJlICIgKyBtYXAua2V5U2V0KCkpOwotCi0gICAgLy8gQ2hlY2sgaWYgcHJlZml4IGlzIGJsYW5rCi0gICAgLy8gaWYgaXQgaXMsIHRoZW4gbWFrZSBzdXJlIHdlIGhhdmUgYSBwcmVmaXggCi0gICAgLy8gZm9yIHNjaGVtYSBmb3Igc2NoZW1hCi0gICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIC8vIGlmIHByZWZpeCBmb3Igc2NoZW1hIGZvciBzY2hlbWEgaXMgYmxhbmsKLSAgICAgIC8vIHRoZW4gc2V0IGl0IHRvIHZhbHVlIHNwZWNpZmllZCBpbiBwcmVmZXJlbmNlCi0gICAgICAvLyBhbmQgdXBkYXRlIEFMTCBub2RlcyB3aXRoIHRoaXMgcHJlZml4Ci0gICAgICBpZiAoeHNkRm9yWFNEUHJlZml4ID09IG51bGwgfHwgKHhzZEZvclhTRFByZWZpeCAhPSBudWxsICYmIHhzZEZvclhTRFByZWZpeC50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGdldCBwcmVmZXJlbmNlIHByZWZpeAotICAgICAgICB4c2RGb3JYU0RQcmVmaXggPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hUHJlZml4KCk7Ci0gICAgICAgIC8vIGdldCBhIHVuaXF1ZSBwcmVmaXggYnkgY2hlY2tpbmcgd2hhdCdzIGluIHRoZSBtYXAKLQotICAgICAgICB4c2RGb3JYU0RQcmVmaXggPSBnZXRVbmlxdWVTY2hlbWFGb3JTY2hlbWFQcmVmaXgoeHNkRm9yWFNEUHJlZml4LCBtYXApOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHhzZEZvclhTRFByZWZpeCwgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLQotICAgICAgICB1cGRhdGVBbGxOb2RlcyhlbGVtZW50LCB4c2RGb3JYU0RQcmVmaXgpOwotICAgICAgICAgICAgCi0gICAgICAgIC8vIHJlbW92ZSB0aGUgb2xkIHhtbG5zIGF0dHJpYnV0ZSBmb3IgdGhlIHNjaGVtYSBmb3Igc2NoZW1hCi0gICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgieG1sbnMiKSAhPSBudWxsICYmCi0gICAgICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZSgieG1sbnMiKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxucyIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHRhcmdldE5hbWVzcGFjZS5sZW5ndGgoKSA+IDAgfHwKLSAgICAgICAodGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID09IDAgJiYgcHJlZml4Lmxlbmd0aCgpID09IDApKQotICAgIHsKLSAgICAgIC8vIGNsZWFuIHVwIHRoZSBvbGQgcHJlZml4IGZvciB0aGlzIHNjaGVtYQotICAgICAgaWYgKG9sZFByZWZpeCAhPSBudWxsICYmIG9sZFByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiK29sZFByZWZpeCk7Ci0vLyAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LCB0YXJnZXROYW1lc3BhY2UpOwotLy8gICAgICAgICAgICBqYXZhLnV0aWwuTWFwIHByZWZpeFRvTmFtZVNwYWNlTWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLS8vICAgICAgICAgICAgcHJlZml4VG9OYW1lU3BhY2VNYXAucmVtb3ZlKG9sZFByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vIGlmIG5vIHByZWZpeAotICAgICAgewotICAgICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInhtbG5zIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghZWxlbWVudC5nZXRBdHRyaWJ1dGUoInhtbG5zIikuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxucyIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICh0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGlmICghbW9kZWxUYXJnZXROYW1lc3BhY2UuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgfQotICAgICAgLy8gbm93IHNldCB0aGUgbmV3IHhtbG5zOnByZWZpeCBhdHRyaWJ1dGUKLSAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zIiwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIH0KLSAgICAgIC8vIHNldCB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZQotICAgIH0KLSAgICBlbHNlIC8vIGVsc2UgdGFyZ2V0TmFtZXNwYWNlIGlzIGJsYW5rCi0gICAgewotICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgICB9Ci0gICAgfQotCi0vLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjEuNSBTVyBNYXAgaXMgIiArIG1hcC52YWx1ZXMoKSk7Ci0vLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjEuNSBTVyBNYXAga2V5cyBhcmUgIiArIG1hcC5rZXlTZXQoKSk7Ci0gICAgCi0gICAgLy8gZG8gb3VyIG93biByZWZlcmVudGlhbCBpbnRlZ3JpdHkKLSAgICBUYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyIHRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIgPSBuZXcgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcih4c2RTY2hlbWEsIG9sZE5hbWVzcGFjZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICB0YXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyLnJlc29sdmUoKTsKLQotICAgIG9sZFByZWZpeCA9IHByZWZpeDsKLSAgICBvbGROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgCi0gICAgWFNEU2NoZW1hSGVscGVyLnVwZGF0ZUVsZW1lbnQoeHNkU2NoZW1hKTsKLSAgICAKLSAgICBkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0KLS8vIEZvciBkZWJ1Z2dpbmcKLSAgICAgICAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjIuIFNXIE1hcCBpcyAiICsgbWFwLnZhbHVlcygpKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjIuIFNXIE1hcCBrZXlzIGFyZSAiICsgbWFwLmtleVNldCgpKTsKLSAgfQotCi0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlU2NoZW1hRm9yU2NoZW1hUHJlZml4KFN0cmluZyB4c2RGb3JYU0RQcmVmaXgsIE1hcCBtYXApCi0gIHsKLSAgICBpZiAoeHNkRm9yWFNEUHJlZml4ID09IG51bGwgfHwgKHhzZEZvclhTRFByZWZpeCAhPSBudWxsICYmIHhzZEZvclhTRFByZWZpeC50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0gICAgIHsgICAgICAgCi0gICAgICB4c2RGb3JYU0RQcmVmaXggPSAieHNkIjsKLSAgICB9Ci0gICAgLy8gZW5zdXJlIHByZWZpeCBpcyB1bmlxdWUKLSAgICBpbnQgcHJlZml4RXh0ZW5zaW9uID0gMTsKLSAgICB3aGlsZSAobWFwLmNvbnRhaW5zS2V5KHhzZEZvclhTRFByZWZpeCkgJiYgcHJlZml4RXh0ZW5zaW9uIDwgMTAwKQotICAgICB7Ci0gICAgICB4c2RGb3JYU0RQcmVmaXggPSB4c2RGb3JYU0RQcmVmaXggKyBTdHJpbmcudmFsdWVPZihwcmVmaXhFeHRlbnNpb24pOwotICAgICAgcHJlZml4RXh0ZW5zaW9uKys7Ci0gICAgfQotICAgIHJldHVybiB4c2RGb3JYU0RQcmVmaXg7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlQWxsTm9kZXMoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgZWxlbWVudC5zZXRQcmVmaXgocHJlZml4KTsKLSAgICBOb2RlTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgY2hpbGQgPSBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgIGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkLnNldFByZWZpeChwcmVmaXgpOwotICAgICAgICAgIGlmIChjaGlsZC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQWxsTm9kZXMoKEVsZW1lbnQpY2hpbGQsIHByZWZpeCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5zKQotICB7Ci0gICAgLy8gd2lsbCBhbGxvdyBibGFuayBuYW1lc3BhY2UgISEKLSAgICBpZiAobnMuZXF1YWxzKCIiKSkKLSAgICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVSSSB0ZXN0VVJJID0gbmV3IFVSSShucyk7Ci0gICAgfQotICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfV0FSTl9JTlZBTElEX1RBUkdFVF9OQU1FU1BBQ0UiKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKQotICAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TaW1wbGVDb250ZW50UHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TaW1wbGVDb250ZW50UHJvcGVydHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDgxNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU2ltcGxlQ29udGVudFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5TaW1wbGVDb250ZW50QmFzZVR5cGVPcHRpb25zRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbnRlbnRQcm9wZXJ0eURlc2NyaXB0b3IgZXh0ZW5kcyBUeXBlc1Byb3BlcnR5RGVzY3JpcHRvcgotewotICBwdWJsaWMgU2ltcGxlQ29udGVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgRWxlbWVudCBlbGVtZW50LCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIoaWQsIGRpc3BsYXlOYW1lLCBlbGVtZW50LCB4c2RTY2hlbWEpOwotICB9Ci0gIAotICBwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gQ2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgU2ltcGxlQ29udGVudEJhc2VUeXBlT3B0aW9uc1RleHRDZWxsRWRpdG9yKHBhcmVudCk7Ci0gICAgQ2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgU2ltcGxlQ29udGVudEJhc2VUeXBlRGlhbG9nQ2VsbEVkaXRvcihwYXJlbnQpOwotICAgIGlmIChnZXRWYWxpZGF0b3IoKSAhPSBudWxsKQotICAgICAgZWRpdG9yLnNldFZhbGlkYXRvcihnZXRWYWxpZGF0b3IoKSk7Ci0gICAgcmV0dXJuIGVkaXRvcjsKLSAgfQotICAKLSAgcHVibGljIGNsYXNzIFNpbXBsZUNvbnRlbnRCYXNlVHlwZURpYWxvZ0NlbGxFZGl0b3IgZXh0ZW5kcyBUeXBlc0RpYWxvZ0NlbGxFZGl0b3IKLSAgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBGb250IGRpYWxvZyBjZWxsIGVkaXRvciBwYXJlbnRlZCB1bmRlciB0aGUgZ2l2ZW4gY29udHJvbC4KLSAgICAgKiBUaGUgY2VsbCBlZGl0b3IgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gaW5pdGlhbGx5LCBhbmQgaGFzIG5vIAotICAgICAqIHZhbGlkYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNpbXBsZUNvbnRlbnRCYXNlVHlwZURpYWxvZ0NlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICBzdXBlcihwYXJlbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlbkRpYWxvZ0JveChDb250cm9sIGNlbGxFZGl0b3JXaW5kb3cpCi0gICAgewotCSAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JICAgIAotCSAgICAvLyBTaW1wbGVDb250ZW50QmFzZVR5cGVPcHRpb25zRGlhbG9nIGRpYWxvZyA9IG5ldyBTaW1wbGVDb250ZW50QmFzZVR5cGVPcHRpb25zRGlhbG9nKHNoZWxsKTsKLQkgICAgU2ltcGxlQ29udGVudEJhc2VUeXBlT3B0aW9uc0RpYWxvZyBkaWFsb2cgPSBuZXcgU2ltcGxlQ29udGVudEJhc2VUeXBlT3B0aW9uc0RpYWxvZyhzaGVsbCwgZWxlbWVudCwgcHJvcGVydHksIHhzZFNjaGVtYSk7Ci0KLQkgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0JICAgIAotCSAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWdldFZhbHVlKCk7Ci0JCi0JICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQotCSAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLQkgICAgewotCSAgICAgIHZhbHVlID0gZGlhbG9nLmdldFR5cGUoKTsKLQkgICAgICByZXR1cm4gdmFsdWU7Ci0JICAgIH0KLQkgICAgZGVhY3RpdmF0ZSgpOwotCSAgICByZXR1cm4gdmFsdWU7Ci0JICB9Ci0gIH0KLQotLy8gIGNsYXNzIFNpbXBsZUNvbnRlbnRCYXNlVHlwZU9wdGlvbnNEaWFsb2cgZXh0ZW5kcyBUeXBlc0RpYWxvZwotLy8gIHsKLS8vICAgIHB1YmxpYyBTaW1wbGVDb250ZW50QmFzZVR5cGVPcHRpb25zRGlhbG9nKFNoZWxsIHNoZWxsKQotLy8gICAgewotLy8gICAgICBzdXBlcihzaGVsbCk7Ci0vLyAgICAgIHNob3dBbm9ueW1vdXMgPSBmYWxzZTsKLS8vICAgIH0KLS8vCi0vLy8vICAgIHByb3RlY3RlZCB2b2lkIG9rKCkKLS8vLy8gICAgewotLy8vLyAgICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLS8vLy8gICAgICBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotLy8vLyAgICAgIGlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uID49IDApCi0vLy8vICAgICAgIHsKLS8vLy8gICAgICAgIHR5cGVPYmplY3QgPSBpdGVtc1tzZWxlY3Rpb25dLmdldERhdGEoKTsKLS8vLy8gICAgICB9Ci0vLy8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0eXBlT2JqZWN0IGlzICIgKyB0eXBlT2JqZWN0KTsKLS8vLy8KLS8vLy8gICAgICBkb1NldFZhbHVlKHR5cGVPYmplY3QpOwotLy8vLyAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0vLy8vICAgICAgZGlhbG9nLmNsb3NlKCk7Ci0vLy8vICAgIH0KLS8vICAgIAotLy8gICAgcHVibGljIHZvaWQgaGFuZGxlU2V0SW5wdXQoKQotLy8gICAgewotLy8gICAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotLy8gICAgICB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLS8vICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotLy8gICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGUoKS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotLy8gICAgICBzaG93QW5vbnltb3VzID0gZmFsc2U7Ci0vLyAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBTdHJpbmcgZGVyaXZlZEJ5ID0gZG9tSGVscGVyLmdldERlcml2ZWRCeU5hbWUoZWxlbWVudCk7Ci0vLyAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0gZG9tSGVscGVyLmdldEJhc2VUeXBlKGVsZW1lbnQpOwotLy8gICAgICAgIGJvb2xlYW4gZGVyaXZlZEJ5UmVzdHJpY3Rpb24gPSB0cnVlOwotLy8gICAgICAgIAotLy8gICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotLy8gICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLS8vCi0vLyAgICAgICAgICBwcmV2aW91c1R5cGUgPSAzOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0vLyAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotLy8KLS8vICAgICAgICAgIGlmIChkZXJpdmVkQnkuZXF1YWxzKCJyZXN0cmljdGlvbiIpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0vLyAgICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0vLyAgICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZSgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBlbHNlIGlmIChkZXJpdmVkQnkuZXF1YWxzKCJleHRlbnNpb24iKSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgZGVyaXZlZEJ5UmVzdHJpY3Rpb24gPSBmYWxzZTsKLS8vICAgICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLyAgICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vICAgICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgICAKLS8vICAgICAgICBpZiAoZGVyaXZlZEJ5ICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhYmFzZVR5cGUuZXF1YWxzKCIiKSkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIEVsZW1lbnQgcGFyZW50ID0gKEVsZW1lbnQpZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0vLyAgICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLS8vICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgY29tcG9uZW50ID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocGFyZW50KTsKLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGVEZWZpbml0aW9uID0gbnVsbDsKLS8vICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pY29tcG9uZW50OwotLy8gICAgICAgICAgICAgICAgYmFzZVR5cGVEZWZpbml0aW9uID0gY29tcGxleFR5cGUuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0vLyAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAotLy8KLS8vICAgICAgICAgICAgICBpZiAodHlwZVNlY3Rpb24uZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKS5jb250YWlucyhiYXNlVHlwZSkgJiYgIWRlcml2ZWRCeVJlc3RyaWN0aW9uKQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0vLyAgICAgICAgICAgICAgICBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCk7Ci0vLyAgICAgICAgICAgICAgICBpbnQgaSA9IHR5cGVTZWN0aW9uLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSkuaW5kZXhPZihiYXNlVHlwZSk7Ci0vLyAgICAgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0vLyAgICAgICAgICAgICAgICBwcmV2aW91c1R5cGUgPSAxOwotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICBlbHNlIGlmIChiYXNlVHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiAmJiAhZGVyaXZlZEJ5UmVzdHJpY3Rpb24pCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0vLyAgICAgICAgICAgICAgICBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKCk7Ci0vLyAgICAgICAgICAgICAgICBpbnQgaSA9IHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSkuaW5kZXhPZihiYXNlVHlwZSk7Ci0vLyAgICAgICAgICAgICAgICBpZiAoc2hvd0Fub255bW91cykKLS8vICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihpICsgMSk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBwcmV2aW91c1R5cGUgPSAyOwotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICBlbHNlIGlmIChiYXNlVHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkuc2V0U2VsZWN0aW9uKHRydWUpOwotLy8gICAgICAgICAgICAgICAgcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUoKTsKLS8vICAgICAgICAgICAgICAgIGludCBpID0gdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSkuaW5kZXhPZihiYXNlVHlwZSk7Ci0vLyAgICAgICAgICAgICAgICBpZiAoc2hvd0Fub255bW91cykKLS8vICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihpICsgMSk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBwcmV2aW91c1R5cGUgPSAzOwotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0vLyAgICAgICAgICAgICAgcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUoKTsKLS8vICAgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH0KLS8vCi0vLyAgICAgIH0KLS8vICAgIH0KLS8vICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NpbXBsZUNvbnRlbnRQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDIzM2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NpbXBsZUNvbnRlbnRQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29udGVudFByb3BlcnR5U291cmNlCi0gIGV4dGVuZHMgQmFzZVByb3BlcnR5U291cmNlCi0gIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0gIHByaXZhdGUgU3RyaW5nIERFUklWRURfQllfSUQgPSAiZGVyaXZlZCBieSI7ICAvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfREVSSVZFRF9CWSIpOyAKLSAgcHJpdmF0ZSBTdHJpbmcgQkFTRV9UWVBFX0lEID0gImJhc2UiOyAgLy8gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0JBU0VfVFlQRSIpOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZGVyaXZlZEJ5Q2hvaWNlc0NvbWJvVmFsdWVzW10gPQotICB7Ci0gICAgICIiLAotICAgICBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsCi0gICAgIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcKLSAgfTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHZpZXdlcgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgU2ltcGxlQ29udGVudFByb3BlcnR5U291cmNlKFZpZXdlciB2aWV3ZXIsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHhzZFNjaGVtYSk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHhzZFNjaGVtYSk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldEVkaXRhYmxlVmFsdWUoKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgICovCi0gIHB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gQ3JlYXRlIGEgZGVzY3JpcHRvciBhbmQgc2V0IGEgY2F0ZWdvcnkKLSAgICAKLSAgICBTaW1wbGVDb250ZW50UHJvcGVydHlEZXNjcmlwdG9yIHR5cGVEZXNjcmlwdG9yID0gbmV3IFNpbXBsZUNvbnRlbnRQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIEJBU0VfVFlQRV9JRCwKLSAgICAgICAgQkFTRV9UWVBFX0lELAotICAgICAgICBlbGVtZW50LCB4c2RTY2hlbWEpOwotICAgIGxpc3QuYWRkKHR5cGVEZXNjcmlwdG9yKTsKLSAgICBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvciBkZXJpdmVkQnlEZXNjcmlwdG9yID0KLSAgICBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgIERFUklWRURfQllfSUQsCi0gICAgICAgIERFUklWRURfQllfSUQsCi0gICAgICAgIGRlcml2ZWRCeUNob2ljZXNDb21ib1ZhbHVlcyk7Ci0gICAgbGlzdC5hZGQoZGVyaXZlZEJ5RGVzY3JpcHRvcik7Ci0gICAgCi0gICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICB7Ci0gICAgICBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoREVSSVZFRF9CWV9JRCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBkZXJpdmVkQnkgPSBnZXREb21IZWxwZXIoKS5nZXREZXJpdmVkQnlOYW1lKGVsZW1lbnQpOwotICAgICAgICBpZiAoZGVyaXZlZEJ5ID09IG51bGwpCi0gICAgICAgICB7Ci0gICAgICAgICAgZGVyaXZlZEJ5ID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlcml2ZWRCeTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKEJBU0VfVFlQRV9JRCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGdldERvbUhlbHBlcigpLmdldEJhc2VUeXBlKGVsZW1lbnQpOwotICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJhc2VUeXBlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VUeXBlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG9yaWdCYXNlVHlwZSA9IGdldERvbUhlbHBlcigpLmdldEJhc2VUeXBlKGVsZW1lbnQpOwotICAgICAgICBTdHJpbmcgZGVyaXZlZEJ5ID0gZ2V0RG9tSGVscGVyKCkuZ2V0RGVyaXZlZEJ5TmFtZShlbGVtZW50KTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhCQVNFX1RZUEVfSUQpKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgRG9jdW1lbnQgZG9jID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UWVBFX0NIQU5HRSIpLCBlbGVtZW50KTsgICAgICAgIAotICAgICAgICAgIGdldERvbUhlbHBlcigpLnNldERlcml2ZWRCeUJhc2VUeXBlKGVsZW1lbnQsIGRlcml2ZWRCeSwgKFN0cmluZyl2YWx1ZSk7Ci0gICAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKERFUklWRURfQllfSUQpKQotICAgICAgICB7Ci0gICAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0RFUklWRURCWV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgICAgU3RyaW5nIG5ld0Rlcml2ZWRCeSA9IChTdHJpbmcpdmFsdWU7Ci0gICAgICAgICAgaWYgKG5ld0Rlcml2ZWRCeS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgIFN0cmluZyBhbnlUeXBlID0gcHJlZml4ID09IG51bGw/ICJhbnlUeXBlIiA6IHByZWZpeCArICI6YW55VHlwZSI7IAotICAgICAgICAgICAgZ2V0RG9tSGVscGVyKCkuY2hhbmdlRGVyaXZlZEJ5VHlwZShlbGVtZW50LCAoU3RyaW5nKXZhbHVlLCBhbnlUeXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5RWxlbSA9IGdldERvbUhlbHBlcigpLmdldERlcml2ZWRCeUVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoY2hlY2tGb3JBbm9ueW1vdXNUeXBlKGRlcml2ZWRCeUVsZW0pKQotICAgICAgICAgICAgeyAgICAgICAgICAgIAotLy8gS0NQb3J0Ci0vLyAgICAgICAgICAgIEFycmF5TGlzdCBtZXNzYWdlID0gbmV3IEFycmF5TGlzdCgpOwotLy8gICAgICAgICAgICBFcnJvck1lc3NhZ2UgYVRhc2sgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0vLyAgICAgICAgICAgIE5vZGUgYU5vZGUgPSBnZXREb21IZWxwZXIoKS5nZXRDaGlsZE5vZGUoZGVyaXZlZEJ5RWxlbSwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpOwotLy8vLy8vLy8vLy8vLy8gc2hhbGwgd2UgcmVtb3ZlIHRoZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4/PwotLy8vLyAgICAgICAgICAgIGdldERvbUhlbHBlcigpLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKGFOb2RlKTsKLS8vLy8vLy8vLy8vLy8vCi0vLy8vICAgICAgICAgICAgaWYgKGFOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLS8vLy8gICAgICAgICAgICB7Ci0vLy8vICAgICAgICAgICAgICBFbGVtZW50IHN0ID0gKEVsZW1lbnQpYU5vZGU7Ci0vLy8vICAgICAgICAgICAgIGlmIChzdCBpbnN0YW5jZW9mIE5vZGVJbXBsKQotLy8vLyAgICAgICAgICAgICAgewotLy8vLyAgICAgICAgICAgICAgICBhVGFzay5zZXROb2RlKChOb2RlSW1wbClzdCk7Ci0vLy8vICAgICAgICAgICAgICB9Ci0vLy8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBpZiAoZGVyaXZlZEJ5RWxlbSBpbnN0YW5jZW9mIE5vZGVJbXBsKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgYVRhc2suc2V0TW9kZWxPYmplY3QoZGVyaXZlZEJ5RWxlbSk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgYVRhc2suc2V0TG9jYWxpemVkTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfRVJST1JfUkVNT1ZFX0xPQ0FMX1NJTVBMRVRZUEUiKSk7Ci0vLyAgICAgICAgICAgIG1lc3NhZ2UuYWRkKGFUYXNrKTsKLS8vICAgICAgICAgICAgaWYgKGdldEVkaXRvcigpICE9IG51bGwpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBnZXRFZGl0b3IoKS5jcmVhdGVUYXNrc0luVGFza0xpc3QobWVzc2FnZSk7Ci0vLyAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAKLSAgICAgICAgICAgIGdldERvbUhlbHBlcigpLmNoYW5nZURlcml2ZWRCeVR5cGUoZWxlbWVudCwgKFN0cmluZyl2YWx1ZSwgb3JpZ0Jhc2VUeXBlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAKLSAgICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0vLyAgICAgICAgc2V0SW5wdXQoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0gIH0KLQotICBib29sZWFuIGNoZWNrRm9yQW5vbnltb3VzVHlwZShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBib29sZWFuIGlzQW5vbnltb3VzID0gZmFsc2U7Ci0KLSAgICBOb2RlIGFOb2RlID0gZ2V0RG9tSGVscGVyKCkuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLSAgICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBpc0Fub255bW91czsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NpbXBsZVJlc3RyaWN0UHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NpbXBsZVJlc3RyaWN0UHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhODgxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TaW1wbGVSZXN0cmljdFByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuRE9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVSZXN0cmljdFByb3BlcnR5U291cmNlCi0gIGV4dGVuZHMgQmFzZVByb3BlcnR5U291cmNlCi0gIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0gIHByaXZhdGUgU3RyaW5nIEJBU0VfVFlQRV9JRCA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEUiKTsKLSAgcHJpdmF0ZSBTdHJpbmcgW10gd2hpdGVTcGFjZUNvbWJvQ2hvaWNlcyA9IHsgIiIsICJwcmVzZXJ2ZSIsICJyZXBsYWNlIiwgImNvbGxhcHNlIiB9OwotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgU2ltcGxlUmVzdHJpY3RQcm9wZXJ0eVNvdXJjZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gdmlld2VyCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVSZXN0cmljdFByb3BlcnR5U291cmNlKFZpZXdlciB2aWV3ZXIsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHhzZFNjaGVtYSk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVSZXN0cmljdFByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgYW5kIHNldCBhIGNhdGVnb3J5Ci0gICAgCi0gICAgU2ltcGxlQ29udGVudFByb3BlcnR5RGVzY3JpcHRvciB0eXBlRGVzY3JpcHRvciA9IG5ldyBTaW1wbGVDb250ZW50UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICBYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsCi0gICAgICAgIFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSwKLSAgICAgICAgKEVsZW1lbnQpZWxlbWVudC5nZXRQYXJlbnROb2RlKCksIHhzZFNjaGVtYSk7ICAvLyBnZXQgdGhlIHBhcmVudCBub2RlIQotICAgIGxpc3QuYWRkKHR5cGVEZXNjcmlwdG9yKTsKLSAgICAKLSAgICBJdGVyYXRvciBmYWNldHMgPSB4c2RTaW1wbGVUeXBlLmdldFZhbGlkRmFjZXRzKCkuaXRlcmF0b3IoKTsKLSAgICAKLSAgICB3aGlsZShmYWNldHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBhVmFsaWRGYWNldCA9IChTdHJpbmcpZmFjZXRzLm5leHQoKTsKLSAgICAgIGlmICghKGFWYWxpZEZhY2V0LmVxdWFscyhYU0RDb25zdGFudHMuUEFUVEVSTl9FTEVNRU5UX1RBRykgfHwgYVZhbGlkRmFjZXQuZXF1YWxzKFhTRENvbnN0YW50cy5FTlVNRVJBVElPTl9FTEVNRU5UX1RBRykpKQotICAgICAgewotICAgICAgICBpZiAoYVZhbGlkRmFjZXQuZXF1YWxzKFhTRENvbnN0YW50cy5XSElURVNQQUNFX0VMRU1FTlRfVEFHKSkKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIHdoaXRlc3BhY2VEZXNjcmlwdG9yID0gbmV3IFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAgICAgICBhVmFsaWRGYWNldCwgYVZhbGlkRmFjZXQsIHdoaXRlU3BhY2VDb21ib0Nob2ljZXMpOwotICAgICAgICAgIGxpc3QuYWRkKHdoaXRlc3BhY2VEZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgIAotICAgICAgICAgIGxpc3QuYWRkKG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGFWYWxpZEZhY2V0LCBhVmFsaWRGYWNldCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChpZCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBiYXNlVHlwZSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlVHlwZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGFGYWNldCA9IChTdHJpbmcpaWQ7Ci0gICAgICAgIEl0ZXJhdG9yIGZhY2V0cyA9IHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlKGZhY2V0cy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RGYWNldCBhVmFsaWRGYWNldCA9IChYU0RGYWNldClmYWNldHMubmV4dCgpOwotICAgICAgICAgIGlmIChhVmFsaWRGYWNldC5nZXRGYWNldE5hbWUoKS5lcXVhbHMoYUZhY2V0KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhVmFsaWRGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICB7Ci0gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IChTdHJpbmcpdmFsdWU7Ci0gICAgICAgIFN0cmluZyBvcmlnQmFzZVR5cGUgPSBnZXREb21IZWxwZXIoKS5nZXRCYXNlVHlwZShlbGVtZW50KTsKLSAgICAgICAgCi0gICAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgRG9jdW1lbnQgZG9jID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UWVBFX0NIQU5HRSIpLCBlbGVtZW50KTsgICAgICAgIAotCi0gICAgICAgICAgRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCllbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHVwZGF0ZUVsZW1lbnRUb05vdEFub255bW91cyhlbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZ2V0RG9tSGVscGVyKCkuc2V0U2ltcGxlQ29udGVudFR5cGUoZWxlbWVudCwgbmV3VmFsdWUpOwotICAgICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IHNpbXBsZVR5cGVFbGVtZW50ID0geHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgWFNERE9NSGVscGVyIHhzZERPTUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW1lbnQgPSB4c2RET01IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChzaW1wbGVUeXBlRWxlbWVudCk7Ci0gICAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZBQ0VUX0NIQU5HRSIpLCBzaW1wbGVUeXBlRWxlbWVudCk7Ci0gICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHNpbXBsZVR5cGVFbGVtZW50LmdldFByZWZpeCgpOwotICAgICAgICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOwotCi0gICAgICAgICAgU3RyaW5nIGFGYWNldCA9IChTdHJpbmcpaWQ7Ci0gICAgICAgICAgWFNERmFjdG9yeUltcGwgZmFjdG9yeSA9IG5ldyBYU0RGYWN0b3J5SW1wbCgpOwotCi0gICAgICAgICAgRWxlbWVudCBjaGlsZE5vZGVFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICBET01BdHRyaWJ1dGUgdmFsdWVBdHRyID0gbnVsbDsKLSAgICAgICAgICBYU0RGYWNldCBmYWNldCA9IG51bGw7Ci0gICAgICAgICAgaWYgKGFGYWNldC5lcXVhbHMoWFNEQ29uc3RhbnRzLlRPVEFMRElHSVRTX0VMRU1FTlRfVEFHKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0VG90YWxEaWdpdHNGYWNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChhRmFjZXQuZXF1YWxzKFhTRENvbnN0YW50cy5GUkFDVElPTkRJR0lUU19FTEVNRU5UX1RBRykpCi0gICAgICAgICAgewotICAgICAgICAgICAgZmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldEZyYWN0aW9uRGlnaXRzRmFjZXQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYUZhY2V0LmVxdWFscyhYU0RDb25zdGFudHMuV0hJVEVTUEFDRV9FTEVNRU5UX1RBRykpCi0gICAgICAgICAgewotICAgICAgICAgICAgZmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldFdoaXRlU3BhY2VGYWNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChhRmFjZXQuZXF1YWxzKFhTRENvbnN0YW50cy5NQVhFWENMVVNJVkVfRUxFTUVOVF9UQUcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNYXhFeGNsdXNpdmVGYWNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChhRmFjZXQuZXF1YWxzKFhTRENvbnN0YW50cy5NQVhJTkNMVVNJVkVfRUxFTUVOVF9UQUcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNYXhJbmNsdXNpdmVGYWNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChhRmFjZXQuZXF1YWxzKFhTRENvbnN0YW50cy5NSU5FWENMVVNJVkVfRUxFTUVOVF9UQUcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNaW5FeGNsdXNpdmVGYWNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChhRmFjZXQuZXF1YWxzKFhTRENvbnN0YW50cy5NSU5JTkNMVVNJVkVfRUxFTUVOVF9UQUcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNaW5JbmNsdXNpdmVGYWNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChhRmFjZXQuZXF1YWxzKFhTRENvbnN0YW50cy5MRU5HVEhfRUxFTUVOVF9UQUcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRMZW5ndGhGYWNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChhRmFjZXQuZXF1YWxzKFhTRENvbnN0YW50cy5NQVhMRU5HVEhfRUxFTUVOVF9UQUcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNYXhMZW5ndGhGYWNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChhRmFjZXQuZXF1YWxzKFhTRENvbnN0YW50cy5NSU5MRU5HVEhfRUxFTUVOVF9UQUcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNaW5MZW5ndGhGYWNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoZmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYWNldC5zZXRMZXhpY2FsVmFsdWUobmV3VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZmFjZXQgPSAoWFNERmFjZXQpZmFjdG9yeS5jcmVhdGVYU0RUb3RhbERpZ2l0c0ZhY2V0KCk7Ci0gICAgICAgICAgICBjaGlsZE5vZGVFbGVtZW50ID0gKGRlcml2ZWRCeUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5jcmVhdGVFbGVtZW50TlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBwcmVmaXggKyBhRmFjZXQpOwotICAgICAgICAgICAgdmFsdWVBdHRyID0gbmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVkFMVUVfQVRUUklCVVRFLCAiIik7Ci0gICAgICAgICAgICBjaGlsZE5vZGVFbGVtZW50LnNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIuZ2V0TmFtZSgpLCB2YWx1ZUF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB2YWx1ZUF0dHIuc2V0VmFsdWUobmV3VmFsdWUpOwotICAgICAgICAgICAgY2hpbGROb2RlRWxlbWVudC5zZXRBdHRyaWJ1dGUodmFsdWVBdHRyLmdldE5hbWUoKSwgdmFsdWVBdHRyLmdldFZhbHVlKCkpOyAgCi0gICAgICAgICAgICBib29sZWFuIGhhc0NoaWxkcmVuRWxlbWVudHMgPSBoYXNFbGVtZW50Q2hpbGRyZW4oZGVyaXZlZEJ5RWxlbWVudCk7Ci0gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkTm9kZUVsZW1lbnQpOwotICAgICAgICAgIC8vZm9ybWF0Q2hpbGQoY2hpbGROb2RlRWxlbWVudCwgaGFzQ2hpbGRyZW5FbGVtZW50cyk7ICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICBYU0RTY2hlbWFIZWxwZXIudXBkYXRlRWxlbWVudCh4c2RTaW1wbGVUeXBlKTsKLSAgICAgICAgICBpZiAoZmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTY2hlbWFIZWxwZXIudXBkYXRlRWxlbWVudChmYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotCi0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fub255bW91czsKLSAgcHJvdGVjdGVkIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGU7Ci0gIHB1YmxpYyB2b2lkIHNldElucHV0KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgaWYgKHhzZFNjaGVtYSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCi0gICAgaXNBbm9ueW1vdXMgPSBjaGVja0ZvckFub255bW91c1R5cGUoZWxlbWVudCk7Ci0gICAgCi0gICAgaW50IHJlc3RyaWN0aW9uVHlwZSA9IDA7ICAvLyAwID0gU2ltcGxlVHlwZSByZXN0cmljdGlvbgotICAgIC8vIDEgPSBTaW1wbGVDb250ZW50IHJlc3RyaWN0aW9uCi0gICAgLy8gQ29tcGxleENvbnRlbnQgcmVzdHJpY3Rpb24gZGlmZmVyZW50IHdpbmRvdwotICAgIAotICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgU3RyaW5nIGJhc2VUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLQotICAgICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGVEZWZpbml0aW9uID0gbnVsbDsKLQotICAgICAgRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCllbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICByZXN0cmljdGlvblR5cGUgPSAxOwotICAgICAgICBFbGVtZW50IGdyYW5kcGFyZW50ID0gKEVsZW1lbnQpcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGdyYW5kcGFyZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21wb25lbnQgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChncmFuZHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pY29tcG9uZW50OwotICAgICAgICAgIGJhc2VUeXBlRGVmaW5pdGlvbiA9IGNvbXBsZXhUeXBlLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICByZXN0cmljdGlvblR5cGUgPSAwOwotICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgICB7Ci0gICAgICAgICAgY29tcG9uZW50ID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICAgICB7Ci0gICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb21wb25lbnQ7Ci0gICAgICAgICAgYmFzZVR5cGVEZWZpbml0aW9uID0gc2ltcGxlVHlwZS5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IG51bGw7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQ29uY3JldGVDb21wb25lbnQgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50LmdldFBhcmVudE5vZGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh4c2RDb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB4c2RTaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXhzZENvbmNyZXRlQ29tcG9uZW50OwotICAgICAgfQotICAgICAgLy9mYWNldFZpZXdlci5zZXRJbnB1dCh4c2RTaW1wbGVUeXBlKTsKLSAgICB9Ci0gIH0KLQotICBib29sZWFuIGNoZWNrRm9yQW5vbnltb3VzVHlwZShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBib29sZWFuIGlzQW5vbnltb3VzID0gZmFsc2U7Ci0KLSAgICBOb2RlIGFOb2RlID0gZ2V0RG9tSGVscGVyKCkuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGlzQW5vbnltb3VzOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NpbXBsZVR5cGVMaXN0UHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NpbXBsZVR5cGVMaXN0UHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxMDRjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TaW1wbGVUeXBlTGlzdFByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZUxpc3RQcm9wZXJ0eVNvdXJjZQotICBleHRlbmRzIEJhc2VQcm9wZXJ0eVNvdXJjZQotICBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgU2ltcGxlVHlwZUxpc3RQcm9wZXJ0eVNvdXJjZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gdmlld2VyCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVUeXBlTGlzdFByb3BlcnR5U291cmNlKFZpZXdlciB2aWV3ZXIsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHhzZFNjaGVtYSk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVUeXBlTGlzdFByb3BlcnR5U291cmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih4c2RTY2hlbWEpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgYW5kIHNldCBhIGNhdGVnb3J5Ci0gICAgVHlwZXNQcm9wZXJ0eURlc2NyaXB0b3IgdHlwZURlc2NyaXB0b3IgPSBuZXcgVHlwZXNQcm9wZXJ0eURlc2NyaXB0b3IoCi0gICAgICAgICAgWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSwKLSAgICAgICAgICBYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLAotICAgICAgICAgIGVsZW1lbnQsIHhzZFNjaGVtYSk7Ci0gICAgICAgIAotICAgIHR5cGVEZXNjcmlwdG9yLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGVsZW1lbnQ7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgbGlzdC5hZGQodHlwZURlc2NyaXB0b3IpOwotICAgIAotICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChpZCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICBpZiAoKChTdHJpbmcpIGlkKS5lcXVhbHMoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gIioqYW5vbnltb3VzKioiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgIHsKLSAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpKQotICAgICAgICB7IAotICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKCJJdGVtVHlwZSBDaGFuZ2UiLCBlbGVtZW50KTsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLCAoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NpbXBsZVR5cGVQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU2ltcGxlVHlwZVByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODg1ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU2ltcGxlVHlwZVByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLkdsb2JhbFNpbXBsZU9yQ29tcGxleFR5cGVSZW5hbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVQcm9wZXJ0eVNvdXJjZQotICBleHRlbmRzIEJhc2VQcm9wZXJ0eVNvdXJjZQotICBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICBwcml2YXRlIGJvb2xlYW4gaXNBbm9ueW1vdXMgPSBmYWxzZTsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFNpbXBsZVR5cGVQcm9wZXJ0eVNvdXJjZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gdmlld2VyCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVUeXBlUHJvcGVydHlTb3VyY2UoVmlld2VyIHZpZXdlciwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHZpZXdlciwgeHNkU2NoZW1hKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIFNpbXBsZVR5cGVQcm9wZXJ0eVNvdXJjZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIoeHNkU2NoZW1hKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldEVkaXRhYmxlVmFsdWUoKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgICovCi0gIHB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpCi0gIHsKLSAgICBOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlzQW5vbnltb3VzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKCFpc0Fub255bW91cykKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgYSBkZXNjcmlwdG9yIGFuZCBzZXQgYSBjYXRlZ29yeQotICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIG5hbWVEZXNjcmlwdG9yID0KLSAgICAgIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICAgIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwKLSAgICAgICAgICBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotICAgICAgbGlzdC5hZGQobmFtZURlc2NyaXB0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHJlYWRPbmx5ID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcihYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0gICAgICBsaXN0LmFkZChyZWFkT25seSk7Ci0gICAgfQotCi0gICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICAgIGlmIChpc0Fub255bW91cykKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIioqYW5vbnltb3VzKioiOwotICAgICAgfQotICAgIH0KLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgIHsKLSAgICAgIHJlc3VsdCA9ICIiOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0KGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjcmVzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3NldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkLCBPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICIiOwotICAgIH0KLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXZhbHVlOwotICAgICAgaWYgKHZhbGlkYXRlTmFtZShuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NJTVBMRVRZUEVfTkFNRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBub3cgcmVuYW1lIGFueSByZWZlcmVuY2VzIHRvIHRoaXMgdHlwZQotICAgICAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoY29tcCAhPSBudWxsICYmIGNvbXAgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiAmJiBjb21wLmdldENvbnRhaW5lcigpLmVxdWFscyh4c2RTY2hlbWEpKQotICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgKChYU0ROYW1lZENvbXBvbmVudCljb21wKS5zZXROYW1lKG5hbWUpOwotICAgICAgICAgICAgICBHbG9iYWxTaW1wbGVPckNvbXBsZXhUeXBlUmVuYW1lciByZW5hbWVyID0gbmV3IEdsb2JhbFNpbXBsZU9yQ29tcGxleFR5cGVSZW5hbWVyKChYU0ROYW1lZENvbXBvbmVudCljb21wLCBuYW1lKTsKLSAgICAgICAgICAgICAgcmVuYW1lci52aXNpdFNjaGVtYSh4c2RTY2hlbWEpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgIiIpOwotICAgICAgICB9Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU2ltcGxlVHlwZVVuaW9uUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1NpbXBsZVR5cGVVbmlvblByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMGFkZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU2ltcGxlVHlwZVVuaW9uUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRpYWxvZ0NlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0cy5UeXBlU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZVVuaW9uUHJvcGVydHlTb3VyY2UKLSAgZXh0ZW5kcyBCYXNlUHJvcGVydHlTb3VyY2UKLSAgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFNpbXBsZVR5cGVVbmlvblByb3BlcnR5U291cmNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB2aWV3ZXIKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIFNpbXBsZVR5cGVVbmlvblByb3BlcnR5U291cmNlKFZpZXdlciB2aWV3ZXIsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHhzZFNjaGVtYSk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVUeXBlVW5pb25Qcm9wZXJ0eVNvdXJjZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIoeHNkU2NoZW1hKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZSgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICAgKi8KLSAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBDcmVhdGUgYSBkZXNjcmlwdG9yIGFuZCBzZXQgYSBjYXRlZ29yeQotICAgIFNpbXBsZVVuaW9uTWVtYmVyVHlwZXNQcm9wZXJ0eURlc2NyaXB0b3IgdHlwZURlc2NyaXB0b3IgPSBuZXcgU2ltcGxlVW5pb25NZW1iZXJUeXBlc1Byb3BlcnR5RGVzY3JpcHRvcigKLSAgICAgICAgWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSwKLSAgICAgICAgWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7Ci0gICAgCi0gICAgdHlwZURlc2NyaXB0b3Iuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpCi0gICAgICAgIHsKLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGVsZW1lbnQ7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgbGlzdC5hZGQodHlwZURlc2NyaXB0b3IpOwotICAgIAotICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChpZCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgewotICAgICAgaWYgKCgoU3RyaW5nKSBpZCkuZXF1YWxzKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpKQotICAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoKFN0cmluZykgaWQpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsgCi0gICAgICAgICAgcmVzdWx0ID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0KGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjcmVzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3NldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkLCBPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICIiOwotICAgIH0KLSAgICAKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgIGlmICgoKFN0cmluZykgaWQpLmVxdWFscyhYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKSkKLSAgICAgIHsgCi0gICAgICAgIGJlZ2luUmVjb3JkaW5nKCJNZW1iZXJUeXBlcyBDaGFuZ2UiLCBlbGVtZW50KTsKLSAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUsIChTdHJpbmcpdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpOyAgCi0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgICAKLSAgfQotCi0gIAotICBwdWJsaWMgY2xhc3MgU2ltcGxlVW5pb25NZW1iZXJUeXBlc1Byb3BlcnR5RGVzY3JpcHRvciBleHRlbmRzIFByb3BlcnR5RGVzY3JpcHRvcgotICB7Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogQHBhcmFtIGRpc3BsYXlOYW1lCi0gICAgICovCi0gICAgcHVibGljIFNpbXBsZVVuaW9uTWVtYmVyVHlwZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IGlkLCBTdHJpbmcgZGlzcGxheU5hbWUpCi0gICAgewotICAgICAgc3VwZXIoaWQsIGRpc3BsYXlOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENlbGxFZGl0b3IgY3JlYXRlUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICBDZWxsRWRpdG9yIGVkaXRvciA9IG5ldyBTaW1wbGVUeXBlVW5pb25NZW1iZXJUeXBlc0RpYWxvZ0NlbGxFZGl0b3IocGFyZW50KTsKLSAgICAgIGlmIChnZXRWYWxpZGF0b3IoKSAhPSBudWxsKQotICAgICAgICBlZGl0b3Iuc2V0VmFsaWRhdG9yKGdldFZhbGlkYXRvcigpKTsKLSAgICAgIHJldHVybiBlZGl0b3I7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgY2xhc3MgU2ltcGxlVHlwZVVuaW9uTWVtYmVyVHlwZXNEaWFsb2dDZWxsRWRpdG9yIGV4dGVuZHMgRGlhbG9nQ2VsbEVkaXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbnQgZGlhbG9nIGNlbGwgZWRpdG9yIHBhcmVudGVkIHVuZGVyIHRoZSBnaXZlbiBjb250cm9sLgotICAgICAqIFRoZSBjZWxsIGVkaXRvciB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBpbml0aWFsbHksIGFuZCBoYXMgbm8gCi0gICAgICogdmFsaWRhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2ltcGxlVHlwZVVuaW9uTWVtYmVyVHlwZXNEaWFsb2dDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRpYWxvZ0NlbGxFZGl0b3Ijb3BlbkRpYWxvZ0JveChDb250cm9sKQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlbkRpYWxvZ0JveChDb250cm9sIGNlbGxFZGl0b3JXaW5kb3cpCi0gICAgewotICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgCi0gICAgICBTaW1wbGVDb250ZW50VW5pb250TWVtYmVyVHlwZXNEaWFsb2cgZGlhbG9nID0gbmV3IFNpbXBsZUNvbnRlbnRVbmlvbnRNZW1iZXJUeXBlc0RpYWxvZyhzaGVsbCk7Ci0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpZ2V0VmFsdWUoKTsKLQotICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgIHsKLSAgICAgICAgcmV0dXJuIGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyBjbGFzcyBTaW1wbGVDb250ZW50VW5pb250TWVtYmVyVHlwZXNEaWFsb2cgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBUYWJsZSB0YWJsZTsKLSAgICBUeXBlU2VjdGlvbiB0eXBlU2VjdGlvbjsKLSAgICBCdXR0b24gYWRkQnV0dG9uLCByZW1vdmVCdXR0b247Ci0gICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBtZW1iZXJUeXBlc0xpc3Q7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzdWx0OwotICAgIAotICAgIHB1YmxpYyBTaW1wbGVDb250ZW50VW5pb250TWVtYmVyVHlwZXNEaWFsb2coU2hlbGwgc2hlbGwpCi0gICAgewotICAgICAgc3VwZXIoc2hlbGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICAgIHsKLSAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkKLSAgICB7Ci0gICAgICBpZiAoYnV0dG9uSWQgPT0gRGlhbG9nLk9LKQotICAgICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSBtZW1iZXJUeXBlc0xpc3QuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHNiLmFwcGVuZChtZW1iZXJUeXBlc0xpc3QuZ2V0SXRlbShpKSk7Ci0gICAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAxKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSBzYi50b1N0cmluZygpOwotICAgICAgfQotICAgICAgc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKSB7IHJldHVybiByZXN1bHQ7IH0KLQotICAgIC8vCi0gICAgLy8gQ3JlYXRlIHRoZSBjb250cm9scwotICAgIC8vCi0gICAgcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIGludCB0YWJJbmRleCA9IDA7Ci0gICAgICBDb21wb3NpdGUgY2xpZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICBnZXRTaGVsbCgpLnNldFRleHQoIlVuaW9uICIgKyBYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsgCi0gICAgICAKLSAgICAgIExhYmVsIGluc3RydWN0aW9ucyA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5MRUZUIHwgU1dULldSQVApOwotICAgICAgaW5zdHJ1Y3Rpb25zLnNldFRleHQoIlNlbGVjdCBmcm9tIHRoZSBhdmFpbGFibGUgdHlwZXMgYW5kIGFkZCB0byB0aGUgbWVtYmVyVHlwZXMgbGlzdCIpOwotICAgICAgCi0gICAgICBDb21wb3NpdGUgY29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTk9ORSk7Ci0gICAgICBHcmlkTGF5b3V0IGNjR0wgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgY2NHTC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgICAgY2NHTC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgICBjY0dMLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICBjY0dMLm1hcmdpbldpZHRoID0gMDsKLSAgICAgIGNjR0wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICAgIGNjR0wubnVtQ29sdW1ucyA9IDM7Ci0gICAgICBjb2x1bW5zQ29tcG9zaXRlLnNldExheW91dChjY0dMKTsKLSAgICAgIAotICAgICAgR3JpZERhdGEgY2NHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgY2NHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGNjR0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBjb2x1bW5zQ29tcG9zaXRlLnNldExheW91dERhdGEoY2NHRCk7ICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0eXBlU2VjdGlvbiA9IG5ldyBUeXBlU2VjdGlvbihjb2x1bW5zQ29tcG9zaXRlKTsKLSAgICAgIHR5cGVTZWN0aW9uLnNldFNob3dVc2VyQ29tcGxleFR5cGUoZmFsc2UpOwotCi0gICAgICB0eXBlU2VjdGlvbi5jcmVhdGVDbGllbnQoY29sdW1uc0NvbXBvc2l0ZSk7Ci0gICAgICB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAKLSAgICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsZXIoY29sdW1uc0NvbXBvc2l0ZSwgMSk7Ci0gICAgICAKLSAgICAgIExhYmVsIG1lbWJlckxpc3RMYWJlbCA9IG5ldyBMYWJlbChjb2x1bW5zQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgICBtZW1iZXJMaXN0TGFiZWwuc2V0VGV4dCgibWVtYmVyVHlwZXMgdmFsdWU6Iik7Ci0gICAgICAKLSAgICAgIENvbXBvc2l0ZSBkYXRhQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OT05FKTsKLSAgICAgIEdyaWRMYXlvdXQgZGNHTCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICBkY0dMLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgICBkY0dMLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICBkY0dMLm1hcmdpbldpZHRoID0gMDsKLSAgICAgIGRjR0wubnVtQ29sdW1ucyA9IDM7Ci0gICAgICBkYXRhQ29tcG9zaXRlLnNldExheW91dChkY0dMKTsKLSAgICAgIAotICAgICAgR3JpZERhdGEgZGNHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGNHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRjR0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRjR0QpOwotICAgICAgCi0gICAgICB0YWJsZSA9IG5ldyBUYWJsZShkYXRhQ29tcG9zaXRlLAotICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsgCi0gICAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLSAgICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgIEdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZ2QyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZ2QyLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGdkMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGdkMi52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBnZDIuaGVpZ2h0SGludCA9IDIwMDsKLSAgICAgIGdkMi53aWR0aEhpbnQgPSAyMDA7Ci0gICAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLSAgICAgIC8vIEZpbGwgdGFibGUKLSAgICAgIGhhbmRsZVNldElucHV0KCk7Ci0gICAgICBpbnQgdGFibGVJdGVtQ291bnQgPSB0YWJsZS5nZXRJdGVtQ291bnQoKTsKLQotICAgICAgVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLS8vICAgICAgdGMuc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpKTsKLSAgICAgIC8vdGMuc2V0VGV4dCgiQXZhaWxhYmxlIHR5cGVzOiIpOwotICAgICAgdGMuc2V0V2lkdGgoMjAwKTsKLSAgICAgIHRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICAgIAotICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGF0YUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgR3JpZExheW91dCBiY0dMID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgIGJjR0wubnVtQ29sdW1ucyA9IDE7Ci0gICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJjR0wpOwotICAgICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgIGFkZEJ1dHRvbi5zZXRUZXh0KCI+Iik7Ci0gICAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoIjwiKTsKLSAgICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIAotICAgICAgQ29tcG9zaXRlIGxpc3RDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRhdGFDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgIEdyaWRMYXlvdXQgbXRHTCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICBtdEdMLm51bUNvbHVtbnMgPSAxOwotICAgICAgbXRHTC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgbXRHTC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICBtdEdMLmhvcml6b250YWxTcGFjaW5nID0gMDsKLSAgICAgIG10R0wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICAgIGxpc3RDb21wb3NpdGUuc2V0TGF5b3V0KG10R0wpOwotCi0gICAgICBHcmlkRGF0YSBtdEdEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBtdEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgbXRHRC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgICBtdEdELnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIG10R0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBsaXN0Q29tcG9zaXRlLnNldExheW91dERhdGEobXRHRCk7Ci0gICAgICAKLSAgICAgIG1lbWJlclR5cGVzTGlzdCA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0KGxpc3RDb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotICAgICAgR3JpZERhdGEgbXRsR0QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIG10bEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgbXRsR0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgICAgbXRsR0QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgbXRsR0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBtdGxHRC5oZWlnaHRIaW50ID0gMjAwOwotICAgICAgbXRsR0Qud2lkdGhIaW50ID0gMjAwOwotICAgICAgbWVtYmVyVHlwZXNMaXN0LnNldExheW91dERhdGEobXRsR0QpOwotICAgICAgCi0gICAgICBpbml0aWFsaXplTWVtYmVyTGlzdENvbnRlbnQoKTsKLSAgICAgIHJldHVybiBjbGllbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVNZW1iZXJMaXN0Q29udGVudCgpCi0gICAgewotICAgICAgU3RyaW5nIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW4gPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc3VsdCk7Ci0gICAgICB3aGlsZSAodG9rZW4uaGFzTW9yZVRva2VucygpKQotICAgICAgewotICAgICAgICBtZW1iZXJUeXBlc0xpc3QuYWRkKHRva2VuLm5leHRUb2tlbigpKTsKLSAgICAgIH0KLSAgICB9Ci0gIAotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGUud2lkZ2V0ID09IHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKSAmJiB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgewotICAgICAgICBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpICYmIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgewotICAgICAgICBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbikKLSAgICAgIHsKLSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgICBpbnQgc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMubGVuZ3RoID4gMCAmJiBzZWxlY3Rpb24gPj0gMCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0eXBlVG9BZGQgPSBpdGVtc1tzZWxlY3Rpb25dLmdldERhdGEoKS50b1N0cmluZygpOwotICAgICAgICAgIGlmIChtZW1iZXJUeXBlc0xpc3QuaW5kZXhPZih0eXBlVG9BZGQpIDwgMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW1iZXJUeXBlc0xpc3QuYWRkKGl0ZW1zW3NlbGVjdGlvbl0uZ2V0RGF0YSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gcmVtb3ZlQnV0dG9uKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSB0eXBlc1RvUmVtb3ZlID0gbWVtYmVyVHlwZXNMaXN0LmdldFNlbGVjdGlvbigpOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB0eXBlc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgbWVtYmVyVHlwZXNMaXN0LnJlbW92ZSh0eXBlc1RvUmVtb3ZlW2ldKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVNldElucHV0KCkKLSAgICB7Ci0gICAgICBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQnVpbHRJblR5cGUoKQotICAgIHsKLSAgICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgTGlzdCBpdGVtcyA9IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgICAgIHsKLSAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGl0ZW0uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpKTsKLSAgICAgICAgaXRlbS5zZXREYXRhKGl0ZW1zLmdldChpKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZShib29sZWFuIHNob3dBbm9ueW1vdXMpCi0gICAgewotICAgICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICAgICB7Ci0gICAgICAgIFRhYmxlSXRlbSBhbm9ueW1vdXNJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgICBhbm9ueW1vdXNJdGVtLnNldFRleHQoIioqYW5vbnltb3VzKioiKTsKLSAgICAgICAgYW5vbnltb3VzSXRlbS5zZXREYXRhKCIqKmFub255bW91cyoqIik7Ci0gICAgICB9Ci0gICAgICBMaXN0IGl0ZW1zID0gZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgICAgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICAgICAgaXRlbS5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIikpOwotICAgICAgICBpdGVtLnNldERhdGEoaXRlbXMuZ2V0KGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCkKLSAgICB7Ci0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIHJldHVybiBoZWxwZXIuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKQotICAgIHsKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgcmV0dXJuIGhlbHBlci5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpOwotICAgIH0KLSAgfQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9UeXBlc1Byb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvVHlwZXNQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3ZTUzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9UeXBlc1Byb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGlhbG9nQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzLlR5cGVTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFR5cGVzUHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgUHJvcGVydHlEZXNjcmlwdG9yCi17Ci0gIEVsZW1lbnQgZWxlbWVudDsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgU3RyaW5nIHByb3BlcnR5OwotICAvKioKLSAgICogQHBhcmFtIGlkCi0gICAqIEBwYXJhbSBkaXNwbGF5TmFtZQotICAgKi8KLSAgcHVibGljIFR5cGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lLCBFbGVtZW50IGVsZW1lbnQsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcihpZCwgZGlzcGxheU5hbWUpOwotICAgIHRoaXMucHJvcGVydHkgPSAoU3RyaW5nKWlkOwotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLSAgCi0gIGJvb2xlYW4gc2hvd0NvbXBsZXhUeXBlcyA9IHRydWU7Ci0KLSAgcHVibGljIENlbGxFZGl0b3IgY3JlYXRlUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBzaG93Q29tcGxleFR5cGVzID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50LCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBzaG93Q29tcGxleFR5cGVzID0gZmFsc2U7Ci0gICAgfQotICAgIC8vIENlbGxFZGl0b3IgZWRpdG9yID0gbmV3IFR5cGVzT3B0aW9uc1RleHRDZWxsRWRpdG9yKHBhcmVudCk7Ci0gICAgQ2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgVHlwZXNEaWFsb2dDZWxsRWRpdG9yKHBhcmVudCk7Ci0gICAgaWYgKGdldFZhbGlkYXRvcigpICE9IG51bGwpCi0gICAgICBlZGl0b3Iuc2V0VmFsaWRhdG9yKGdldFZhbGlkYXRvcigpKTsKLSAgICByZXR1cm4gZWRpdG9yOwotICB9Ci0KLSAgCi0gIHB1YmxpYyBjbGFzcyBUeXBlc0RpYWxvZ0NlbGxFZGl0b3IgZXh0ZW5kcyBEaWFsb2dDZWxsRWRpdG9yCi0gIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgRm9udCBkaWFsb2cgY2VsbCBlZGl0b3IgcGFyZW50ZWQgdW5kZXIgdGhlIGdpdmVuIGNvbnRyb2wuCi0gICAgICogVGhlIGNlbGwgZWRpdG9yIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGluaXRpYWxseSwgYW5kIGhhcyBubyAKLSAgICAgKiB2YWxpZGF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqLwotICAgIHByb3RlY3RlZCBUeXBlc0RpYWxvZ0NlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICBzdXBlcihwYXJlbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlbkRpYWxvZ0JveChDb250cm9sIGNlbGxFZGl0b3JXaW5kb3cpCi0gICAgewotCSAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JICAgIAotCSAgICBUeXBlc0RpYWxvZyBkaWFsb2cgPSBuZXcgVHlwZXNEaWFsb2coc2hlbGwpOwotCi0JICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkgICAgZGlhbG9nLmNyZWF0ZSgpOwotCSAgICAKLQkgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZylnZXRWYWx1ZSgpOwotCQotCSAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkgICAgCi0JICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSBkaWFsb2cuZ2V0VHlwZSgpOwotICAgICAgICBkb1NldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgZmlyZUFwcGx5RWRpdG9yVmFsdWUoKTsKLQkgICAgfQotCSAgICBkZWFjdGl2YXRlKCk7Ci0JICAgIHJldHVybiBudWxsOwotCSAgfQotICB9Ci0KLSAgcHVibGljIGNsYXNzIFR5cGVzRGlhbG9nIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgU3RyaW5nIHR5cGU7Ci0gICAgT2JqZWN0IHR5cGVPYmplY3Q7Ci0gICAgVGFibGUgdGFibGU7Ci0KLSAgICBUeXBlU2VjdGlvbiB0eXBlU2VjdGlvbjsKLSAgICBib29sZWFuIHNob3dBbm9ueW1vdXMgPSB0cnVlOwotICAgIFN0cmluZyBwcmV2aW91c1N0cmluZ1R5cGUgPSAiIjsKLSAgICBib29sZWFuIGlzQW5vbnltb3VzOwotICAgIGludCBwcmV2aW91c1R5cGU7Ci0KLSAgICAKLSAgICBwdWJsaWMgVHlwZXNEaWFsb2coU2hlbGwgc2hlbGwpCi0gICAgewotICAgICAgc3VwZXIoc2hlbGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICAgIHsKLSAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkKLSAgICB7Ci0gICAgICBpZiAoYnV0dG9uSWQgPT0gRGlhbG9nLk9LKQotICAgICAgewotICAgICAgICB0eXBlID0gdGFibGUuZ2V0SXRlbSh0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgIG9rKCk7Ci0gICAgICB9Ci0gICAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFR5cGVPYmplY3QoKSB7IHJldHVybiB0eXBlT2JqZWN0OyB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeyByZXR1cm4gdHlwZTsgfQotCi0gICAgLy8KLSAgICAvLyBDcmVhdGUgdGhlIGNvbnRyb2xzCi0gICAgLy8KLSAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgaW50IHRhYkluZGV4ID0gMDsKLSAgICAgIENvbXBvc2l0ZSBjbGllbnQgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgIGdldFNoZWxsKCkuc2V0VGV4dCgiQXZhaWxhYmxlIFR5cGVzIik7Ci0KLSAgICAgIHR5cGVPYmplY3QgPSBudWxsOwotICAgICAgCi0gICAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0vLyAgICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0vLyAgICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLS8vICAgICAgZ2wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotLy8gICAgICBnbC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgICAgY2xpZW50LnNldExheW91dChnbCk7Ci0KLSAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZ2QuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0gICAgICBjbGllbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAKLSAgICAgIHR5cGVTZWN0aW9uID0gbmV3IFR5cGVTZWN0aW9uKGNsaWVudCk7Ci0gICAgICB0eXBlU2VjdGlvbi5zZXRTaG93VXNlckNvbXBsZXhUeXBlKHNob3dDb21wbGV4VHlwZXMpOwotCi0gICAgICB0eXBlU2VjdGlvbi5jcmVhdGVDbGllbnQoY2xpZW50KTsKLSAgICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIGlmIChzaG93Q29tcGxleFR5cGVzKQotICAgICAgewotICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGUoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIH0KLQotICAgICAgdGFibGUgPSBuZXcgVGFibGUoY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7IAotICAgICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0gICAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAKLSAgICAgIEdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZ2QyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZ2QyLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGdkMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGdkMi5oZWlnaHRIaW50ID0gMjAwOwotICAgICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZDIpOwotCi0gICAgICBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotLy8gICAgICB0YWJsZUNvbHVtbi5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIikpOwotICAgICAgdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotICAgICAgdGFibGVDb2x1bW4uc2V0V2lkdGgoMjAwKTsKLSAgICAgIAotCi0gICAgICAvLyBGaWxsIHRhYmxlIGFuZCBzZWxlY3QgaW5wdXQgdHlwZQotICAgICAgaGFuZGxlU2V0SW5wdXQoKTsKLQotICAgICAgcmV0dXJuIGNsaWVudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBpZiAoZS53aWRnZXQgPT0gdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpICYmIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5nZXRTZWxlY3Rpb24oKSkKLSAgICAgIHsKLSAgICAgICAgcG9wdWxhdGVCdWlsdEluVHlwZSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkgJiYgdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIHBvcHVsYXRlVXNlckNvbXBsZXhUeXBlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpICYmIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvaygpCi0gICAgewotICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgaW50IHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5sZW5ndGggPiAwICYmIHNlbGVjdGlvbiA+PSAwKQotICAgICAgewotICAgICAgICB0eXBlT2JqZWN0ID0gaXRlbXNbc2VsZWN0aW9uXS5nZXREYXRhKCk7Ci0gICAgICB9Ci0vLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidHlwZU9iamVjdCBpcyAiICsgdHlwZU9iamVjdCk7Ci0KLS8vICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VMRU1FTlRfVFlQRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0vLyAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UWVBFX0NIQU5HRSIpLCBlbGVtZW50KTsKLS8vICAgICAgZG9TZXRWYWx1ZSh0eXBlT2JqZWN0KTsKLS8vICAgICAgYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKTsKLS8vICAgICAgZGlhbG9nLmNsb3NlKCk7Ci0KLSAgICAgIGlmICghWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgaWYgKHR5cGVPYmplY3QuZXF1YWxzKCIqKmFub255bW91cyoqIikpCi0gICAgICB7Ci0gICAgICAgIGlmICh0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLmdldFNlbGVjdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFwcmV2aW91c1N0cmluZ1R5cGUuZXF1YWxzKCIqKmFub255bW91cyoqIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlRWxlbWVudFRvQW5vbnltb3VzKAotICAgICAgICAgICAgICBlbGVtZW50LAotICAgICAgICAgICAgICBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICghcHJldmlvdXNTdHJpbmdUeXBlLmVxdWFscygiKiphbm9ueW1vdXMqKiIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUVsZW1lbnRUb0Fub255bW91cyhlbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShwcm9wZXJ0eSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHVwZGF0ZUVsZW1lbnRUb05vdEFub255bW91cyhlbGVtZW50KTsKLSAgICAgICAgLy9lbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIHR5cGVPYmplY3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHByb3BlcnR5LCB0eXBlT2JqZWN0LnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgICAgfQotLy8gICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0KLSAgICAgIC8vaW1wbGVtZW50IGRpc3Bvc2UoKTsKLS8vICAgICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0vLyAgICAgIHRhYmxlLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgCQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVNldElucHV0KCkKLSAgICB7Ci0gICAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgIGlzQW5vbnltb3VzID0gY2hlY2tGb3JBbm9ueW1vdXNUeXBlKGVsZW1lbnQpOwotICAgICAgLy8gQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSk7Ci0gICAgICBBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUocHJvcGVydHkpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAodHlwZVNlY3Rpb24uZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKS5jb250YWlucyh2YWx1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIHBvcHVsYXRlQnVpbHRJblR5cGUoKTsKLSAgICAgICAgICBpbnQgaSA9IHR5cGVTZWN0aW9uLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSkuaW5kZXhPZih2YWx1ZSk7Ci0gICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uKGkpOwotICAgICAgICAgIHByZXZpb3VzVHlwZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKS5jb250YWlucyh2YWx1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKCk7Ci0gICAgICAgICAgaW50IGkgPSB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpLmluZGV4T2YodmFsdWUpOwotICAgICAgICAgIGlmIChzaG93QW5vbnltb3VzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihpICsgMSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByZXZpb3VzVHlwZSA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSkuY29udGFpbnModmFsdWUpKQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIHBvcHVsYXRlVXNlckNvbXBsZXhUeXBlKCk7Ci0gICAgICAgICAgaW50IGkgPSB0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKS5pbmRleE9mKHZhbHVlKTsKLSAgICAgICAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICAgICAgICAgewotICAgICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uKGkgKyAxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByZXZpb3VzVHlwZSA9IDM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvLyBpZiBpdCBpcyB0eXBlPSIiIGZvciBhbiBlbXB0eSBsaXN0IG9mIHNpbXBsZSB0eXBlcwotICAgICAgICAgIHsKLSAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKCk7Ci0gICAgICAgICAgcHJldmlvdXNUeXBlID0gMjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoaXNBbm9ueW1vdXMpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNTVEFub255bW91cyhlbGVtZW50KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoKTsKLSAgICAgICAgICAgIHByZXZpb3VzVHlwZSA9IDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICBwb3B1bGF0ZVVzZXJDb21wbGV4VHlwZSgpOwotICAgICAgICAgICAgcHJldmlvdXNUeXBlID0gMzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uKDApOyAvLyBhbm9ueW1vdXMKLSAgICAgICAgICAvLyAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VHlwZUxpc3QoKS5zZXRUZXh0KCIqKmFub255bW91cyoqIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCk7Ci0gICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uKDApOwotICAgICAgICAgIAotICAgICAgICAgIC8vICAgICAgICB0eXBlU2VjdGlvbi5nZXRUeXBlTGlzdCgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgLy8gICAgICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgLy8gICAgICAgIHR5cGVTZWN0aW9uLnBvcHVsYXRlQnVpbHRJblR5cGUoeHNkU2NoZW1hKTsKLSAgICAgICAgICAvLyAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VHlwZUxpc3QoKS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9OT19UWVBFIikpOwotICAgICAgICAgIHByZXZpb3VzVHlwZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICh0YWJsZS5nZXRTZWxlY3Rpb24oKSAhPSBudWxsICYmIHRhYmxlLmdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIHByZXZpb3VzU3RyaW5nVHlwZSA9ICh0YWJsZS5nZXRTZWxlY3Rpb24oKVswXSkuZ2V0VGV4dCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCkKLSAgICB7Ci0gICAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgIExpc3QgaXRlbXMgPSBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGl0ZW0uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpKTsKLSAgICAgICAgaXRlbS5zZXREYXRhKGl0ZW1zLmdldChpKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUoKQotICAgIHsKLSAgICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgaWYgKHNob3dBbm9ueW1vdXMpCi0gICAgICB7Ci0gICAgICAgIFRhYmxlSXRlbSBhbm9ueW1vdXNJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgICBhbm9ueW1vdXNJdGVtLnNldFRleHQoIioqYW5vbnltb3VzKioiKTsKLSAgICAgICAgYW5vbnltb3VzSXRlbS5zZXREYXRhKCIqKmFub255bW91cyoqIik7Ci0gICAgICB9Ci0gICAgICBMaXN0IGl0ZW1zID0gZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIml0ZW0gIiArIGkgKyAiIGlzICIgKyBpdGVtKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICAgICAgaXRlbS5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRENvbXBsZXhUeXBlLmdpZiIpKTsKLSAgICAgICAgaXRlbS5zZXREYXRhKGl0ZW1zLmdldChpKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZSgpCi0gICAgewotICAgICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICAgICB7Ci0gICAgICAgIFRhYmxlSXRlbSBhbm9ueW1vdXNJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgICBhbm9ueW1vdXNJdGVtLnNldFRleHQoIioqYW5vbnltb3VzKioiKTsKLSAgICAgICAgYW5vbnltb3VzSXRlbS5zZXREYXRhKCIqKmFub255bW91cyoqIik7Ci0gICAgICB9Ci0gICAgICBMaXN0IGl0ZW1zID0gZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgICAgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICAgICAgaXRlbS5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIikpOwotICAgICAgICBpdGVtLnNldERhdGEoaXRlbXMuZ2V0KGkpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGNoZWNrRm9yQW5vbnltb3VzVHlwZShFbGVtZW50IGVsZW1lbnQpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFVzaW5nIEVkJ3MgbW9kZWwgdG8gY2hlY2sgYm9vbGVhbiBpc0Fub255bW91cyA9IGZhbHNlOwotICAgICAgICogCi0gICAgICAgKiBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPQotICAgICAgICogZ2V0WFNEU2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsgaWYgKGNvbXBvbmVudAotICAgICAgICogaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW0gPQotICAgICAgICogKFhTREVsZW1lbnREZWNsYXJhdGlvbiljb21wb25lbnQ7IGlzQW5vbnltb3VzID0KLSAgICAgICAqIHhzZEVsZW0uaXNTZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOyB9IHJldHVybiBpc0Fub255bW91czsKLSAgICAgICAqLwotICAgICAgWFNERE9NSGVscGVyIGhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgIGJvb2xlYW4gaXNBbm9ueW1vdXMgPSBmYWxzZTsKLSAgICAgIE5vZGUgYU5vZGUgPQotICAgICAgaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYU5vZGUgPSBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIGlzQW5vbnltb3VzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBpc0Fub255bW91czsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUVsZW1lbnRUb0Fub255bW91cyhFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB4c2RUeXBlKQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotICAgICAgcHJlZml4ID0gKHByZWZpeCA9PSBudWxsKSA/ICIiIDogKHByZWZpeCArICI6Iik7Ci0gICAgICB1cGRhdGVFbGVtZW50VG9Ob3RBbm9ueW1vdXMoZWxlbWVudCk7Ci0gICAgICBib29sZWFuIGhhc0NoaWxkcmVuRWxlbWVudHMgPSBoYXNFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgICBFbGVtZW50IGNoaWxkTm9kZSA9IG51bGw7Ci0gICAgICBpZiAoeHNkVHlwZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKSkKLSAgICAgICB7Ci0gICAgICAgIGNoaWxkTm9kZSA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUygKLSAgICAgICAgICAgIFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwKLSAgICAgICAgICAgIHByZWZpeCArIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh4c2RUeXBlLmVxdWFscyhYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRykpCi0gICAgICAgewotICAgICAgICBjaGlsZE5vZGUgPQotICAgICAgICBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoCi0gICAgICAgICAgICBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsCi0gICAgICAgICAgICBwcmVmaXggKyBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICB9Ci0gICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7Ci0gICAgICAvL2Zvcm1hdENoaWxkKGNoaWxkTm9kZSwgaGFzQ2hpbGRyZW5FbGVtZW50cyk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1NUQW5vbnltb3VzKEVsZW1lbnQgZWxlbWVudCkKLSAgICB7Ci0gICAgICBYU0RET01IZWxwZXIgaGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgTm9kZSBhTm9kZSA9Ci0gICAgICBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICAgIGlmIChhTm9kZSAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICAgaWYgKFhTRERPTUhlbHBlcgotICAgICAgICAgICAgLmlucHV0RXF1YWxzKGFOb2RlLCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc0NUQW5vbnltb3VzKEVsZW1lbnQgZWxlbWVudCkKLSAgICB7Ci0gICAgICBYU0RET01IZWxwZXIgaGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgTm9kZSBhTm9kZSA9IGhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICAgIGlmIChhTm9kZSAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBnZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gICAgewotICAgICAgWFNERE9NSGVscGVyIGhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgIE5vZGUgdHlwZURlZmluaXRpb25Ob2RlID0KLSAgICAgIGhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgaWYgKHR5cGVEZWZpbml0aW9uTm9kZSA9PSBudWxsKQotICAgICAgIHsKLSAgICAgICAgdHlwZURlZmluaXRpb25Ob2RlID0KLSAgICAgICAgaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgfQotICAgICAgaWYgKHR5cGVEZWZpbml0aW9uTm9kZSAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0KLSAgICAgICAgeHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQodHlwZURlZmluaXRpb25Ob2RlKTsKLSAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgewotICAgICAgICAgIHJldHVybiAoWFNEVHlwZURlZmluaXRpb24pIGNvbXBvbmVudDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVFbGVtZW50VG9Ob3RBbm9ueW1vdXMoRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0JICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLQkgICAgICAgewotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotCSAgICAgICAgIHsKLQkgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGNoaWxkcmVuLml0ZW0oaSk7Ci0JICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLQkgICAgICAgICAgIHsKLQkgICAgICAgICAgICBpZiAobm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpCi0JICAgICAgICAgICAgICAgIHx8IG5vZGUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRykpCi0JICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShub2RlKTsKLQkgICAgICAgICAgICAgIGkgPSAwOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKQotICAgIHsKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgcmV0dXJuIGhlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpCi0gICAgewotICAgICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgICByZXR1cm4gaGVscGVyLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKQotICAgIHsKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgcmV0dXJuIGhlbHBlci5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKTsKLSAgICB9Ci0gICAgCi0JICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNFbGVtZW50Q2hpbGRyZW4oTm9kZSBwYXJlbnROb2RlKQotCSAgewotCSAgICBib29sZWFuIGhhc0NoaWxkcmVuRWxlbWVudHMgPSBmYWxzZTsKLQkgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSkKLQkgICAgewotCSAgICAgIE5vZGVMaXN0IG5vZGVzID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotCSAgICAgIHsKLQkgICAgICAgIGlmIChub2Rlcy5pdGVtKGkpIGluc3RhbmNlb2YgRWxlbWVudCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgaGFzQ2hpbGRyZW5FbGVtZW50cyA9IHRydWU7Ci0JICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCSAgICByZXR1cm4gaGFzQ2hpbGRyZW5FbGVtZW50czsKLQkgIH0KLQotICB9Ci0KLSAgCi0gIAotICAKLSAgCi0gIAotICAKLSAgCi0gIGNsYXNzIFR5cGVzT3B0aW9uc1RleHRDZWxsRWRpdG9yIGV4dGVuZHMgT3B0aW9uc1RleHRDZWxsRWRpdG9yCi0gIHsKLSAgICBib29sZWFuIHNob3dBbm9ueW1vdXMgPSB0cnVlOwotICAgIAotICAgIHB1YmxpYyBUeXBlc09wdGlvbnNUZXh0Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIGlzVGV4dFJlYWRPbmx5ID0gdHJ1ZTsKLSAgICAgIHJldHVybiBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgfQotCi0gICAgVGFibGUgdGFibGU7Ci0gICAgVHlwZVNlY3Rpb24gdHlwZVNlY3Rpb247Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvcGVuRGlhbG9nKCkKLSAgICB7Ci0gICAgICB0eXBlT2JqZWN0ID0gbnVsbDsKLSAgICAgIGRpYWxvZyA9IG5ldyBTaGVsbChYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgU1dULk1PREVMRVNTKTsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IGRpYWxvZy5nZXREaXNwbGF5KCk7Ci0gICAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgICAgZ2wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgICAgZ2wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICAgIGRpYWxvZy5zZXRMYXlvdXQoZ2wpOwotICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBnZC5ob3Jpem9udGFsSW5kZW50ID0gMDsKLSAgICAgIGRpYWxvZy5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgICAgCi0gICAgICAKLSAgICAgIHR5cGVTZWN0aW9uID0gbmV3IFR5cGVTZWN0aW9uKGRpYWxvZyk7Ci0gICAgICB0eXBlU2VjdGlvbi5zZXRTaG93VXNlckNvbXBsZXhUeXBlKHNob3dDb21wbGV4VHlwZXMpOwotCi0gICAgICB0eXBlU2VjdGlvbi5jcmVhdGVDbGllbnQoZGlhbG9nKTsKLSAgICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIGlmIChzaG93Q29tcGxleFR5cGVzKQotICAgICAgewotICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGUoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIH0KLQotICAgICAgdGFibGUgPSBuZXcgVGFibGUoZGlhbG9nLAotICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7IAotICAgICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0gICAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICBHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGdkMi5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGdkMi5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgICBnZDIuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBnZDIudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZDIpOwotCi0gICAgICAvLyBGaWxsIHRhYmxlIGFuZCBzZWxlY3QgaW5wdXQgdHlwZQotICAgICAgaGFuZGxlU2V0SW5wdXQoKTsKLSAgICAgIGludCB0YWJsZUl0ZW1Db3VudCA9IHRhYmxlLmdldEl0ZW1Db3VudCgpOwotCi0gICAgICBUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotICAgICAgdGMuc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpKTsKLSAgICAgIC8vdGMuc2V0VGV4dCgiQXZhaWxhYmxlIHR5cGVzOiIpOwotICAgICAgdGMuc2V0UmVzaXphYmxlKGZhbHNlKTsKLQotICAgICAgaW50IE1BWF9JVEVNUyA9IDIzOwotLy8gICAgICB0Yy5wYWNrKCk7Ci0vLyAgICAgIHRhYmxlLnBhY2soKTsKLSAgICAgIFJlY3RhbmdsZSB0YWJsZUJvdW5kcyA9IHRhYmxlLmdldEJvdW5kcygpOwotICAgICAgdGFibGVCb3VuZHMuaGVpZ2h0ID0gTWF0aC5taW4odGFibGVCb3VuZHMuaGVpZ2h0LCB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkqTUFYX0lURU1TKTsKLSAgICAgIHRhYmxlLnNldEJvdW5kcyh0YWJsZUJvdW5kcyk7Ci0gICAgICBkaWFsb2cucGFjaygpOwotICAgICAgCi0gICAgICBkaWFsb2cuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2hlbGxEZWFjdGl2YXRlZChTaGVsbEV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYW5jZWwoKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIFJlY3RhbmdsZSBkaWFsb2dCb3VuZHMgPSBkaWFsb2cuZ2V0Qm91bmRzKCk7Ci0gICAgICBQb2ludCBidXR0b25Mb2NhdGlvbiA9IGdldEJ1dHRvbkFic29sdXRlTG9jYXRpb24oKTsKLSAgICAgIGRpYWxvZ0JvdW5kcy54ID0gYnV0dG9uTG9jYXRpb24ueDsKLSAgICAgIGRpYWxvZ0JvdW5kcy55ID0gYnV0dG9uTG9jYXRpb24ueTsKLQotICAgICAgaWYgKGRpYWxvZ0JvdW5kcy5oZWlnaHQgPiAyMDApCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgZGlhbG9nQm91bmRzLmhlaWdodCA9IDIwMDsKLSAgICAgIH0KLSAgICAgIGlmIChkaWFsb2dCb3VuZHMuaGVpZ2h0IDwgMTAwKQotICAgICAgewotICAgICAgICBkaWFsb2dCb3VuZHMuaGVpZ2h0ID0gMjAwOwotICAgICAgfQotICAgICAgaWYgKGRpYWxvZ0JvdW5kcy53aWR0aCA+IDIwMCkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nQm91bmRzLndpZHRoID0gdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkuZ2V0Qm91bmRzKCkud2lkdGggKyAzMDsKLSAgICAgIH0KLSAgICAgIGRpYWxvZy5zZXRCb3VuZHMoZGlhbG9nQm91bmRzKTsKLSAgICAgIHRjLnNldFdpZHRoKGRpYWxvZ0JvdW5kcy53aWR0aCk7Ci0KLSAgICAgIHRhYmxlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGtleUNvZGUgPSBlLmtleUNvZGU7Ci0gICAgICAgICAgaW50IHN0YXRlTWFzayA9IGUuc3RhdGVNYXNrOwotICAgICAgICAgIGNoYXIgY2hhcmFjdGVyID0gZS5jaGFyYWN0ZXI7Ci0gICAgICAgICAgaWYgKGNoYXJhY3RlciA9PSBTV1QuQ1IgfHwgY2hhcmFjdGVyID09IFNXVC5MRikKLSAgICAgICAgICAgIG9rKCk7Ci0gICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyID09IFNXVC5FU0MpCi0gICAgICAgICAgICBjYW5jZWwoKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIHRhYmxlLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgb2soKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgb2soKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICB0YWJsZS5zZXRGb2N1cygpOwotICAgICAgICB0YWJsZS5zaG93U2VsZWN0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoIWRpYWxvZy5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZGlzcGxheS5zbGVlcCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBpZiAoIWRpYWxvZy5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgY2FuY2VsKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGUud2lkZ2V0ID09IHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKSAmJiB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIHBvcHVsYXRlQnVpbHRJblR5cGUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZSgpICYmIHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZSgpLmdldFNlbGVjdGlvbigpKQotICAgICAgewotICAgICAgICBwb3B1bGF0ZVVzZXJDb21wbGV4VHlwZSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKSAmJiB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLmdldFNlbGVjdGlvbigpKQotICAgICAgewotICAgICAgICBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNhbmNlbCgpCi0gICAgewotICAgICAgc3VwZXIuY2FuY2VsKCk7Ci0gICAgICB0YWJsZS5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb2soKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgIHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5sZW5ndGggPiAwICYmIHNlbGVjdGlvbiA+PSAwKQotICAgICAgewotICAgICAgICB0eXBlT2JqZWN0ID0gaXRlbXNbc2VsZWN0aW9uXS5nZXREYXRhKCk7Ci0gICAgICB9Ci0vLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidHlwZU9iamVjdCBpcyAiICsgdHlwZU9iamVjdCk7Ci0KLS8vICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VMRU1FTlRfVFlQRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0vLyAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UWVBFX0NIQU5HRSIpLCBlbGVtZW50KTsKLSAgICAgIGRvU2V0VmFsdWUodHlwZU9iamVjdCk7Ci0gICAgICBhcHBseUVkaXRvclZhbHVlQW5kRGVhY3RpdmF0ZSgpOwotICAgICAgZGlhbG9nLmNsb3NlKCk7Ci0KLSAgICAgIGlmICghWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgaWYgKHR5cGVPYmplY3QuZXF1YWxzKCIqKmFub255bW91cyoqIikpCi0gICAgICB7Ci0gICAgICAgIGlmICh0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLmdldFNlbGVjdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFwcmV2aW91c1N0cmluZ1R5cGUuZXF1YWxzKCIqKmFub255bW91cyoqIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlRWxlbWVudFRvQW5vbnltb3VzKAotICAgICAgICAgICAgICBlbGVtZW50LAotICAgICAgICAgICAgICBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICghcHJldmlvdXNTdHJpbmdUeXBlLmVxdWFscygiKiphbm9ueW1vdXMqKiIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUVsZW1lbnRUb0Fub255bW91cyhlbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShwcm9wZXJ0eSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHVwZGF0ZUVsZW1lbnRUb05vdEFub255bW91cyhlbGVtZW50KTsKLSAgICAgICAgLy9lbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIHR5cGVPYmplY3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHByb3BlcnR5LCB0eXBlT2JqZWN0LnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgICAgfQotLy8gICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0KLSAgICAgIC8vaW1wbGVtZW50IGRpc3Bvc2UoKTsKLSAgICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgdGFibGUuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIFN0cmluZyBwcmV2aW91c1N0cmluZ1R5cGUgPSAiIjsKLSAgICBib29sZWFuIGlzQW5vbnltb3VzOwotICAgIGludCBwcmV2aW91c1R5cGU7Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVTZXRJbnB1dCgpCi0gICAgewotICAgICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgICBpc0Fub255bW91cyA9IGNoZWNrRm9yQW5vbnltb3VzVHlwZShlbGVtZW50KTsKLSAgICAgIC8vIEF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgICAgQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKHByb3BlcnR5KTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKHR5cGVTZWN0aW9uLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSkuY29udGFpbnModmFsdWUpKQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCk7Ci0gICAgICAgICAgaW50IGkgPSB0eXBlU2VjdGlvbi5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpLmluZGV4T2YodmFsdWUpOwotICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihpKTsKLSAgICAgICAgICBwcmV2aW91c1R5cGUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSkuY29udGFpbnModmFsdWUpKQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZSgpOwotICAgICAgICAgIGludCBpID0gdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKS5pbmRleE9mKHZhbHVlKTsKLSAgICAgICAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSArIDEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uKGkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwcmV2aW91c1R5cGUgPSAyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpLmNvbnRhaW5zKHZhbHVlKSkKLSAgICAgICAgewotICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICBwb3B1bGF0ZVVzZXJDb21wbGV4VHlwZSgpOwotICAgICAgICAgIGludCBpID0gdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSkuaW5kZXhPZih2YWx1ZSk7Ci0gICAgICAgICAgaWYgKHNob3dBbm9ueW1vdXMpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihpICsgMSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uKGkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwcmV2aW91c1R5cGUgPSAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLy8gaWYgaXQgaXMgdHlwZT0iIiBmb3IgYW4gZW1wdHkgbGlzdCBvZiBzaW1wbGUgdHlwZXMKLSAgICAgICAgICB7Ci0gICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZSgpOwotICAgICAgICAgIHByZXZpb3VzVHlwZSA9IDI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzQW5vbnltb3VzKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzU1RBbm9ueW1vdXMoZWxlbWVudCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKCk7Ci0gICAgICAgICAgICBwcmV2aW91c1R5cGUgPSAyOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUoKTsKLSAgICAgICAgICAgIHByZXZpb3VzVHlwZSA9IDM7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbigwKTsgLy8gYW5vbnltb3VzCi0gICAgICAgICAgLy8gICAgICAgIHR5cGVTZWN0aW9uLmdldFR5cGVMaXN0KCkuc2V0VGV4dCgiKiphbm9ueW1vdXMqKiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgcG9wdWxhdGVCdWlsdEluVHlwZSgpOwotICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbigwKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VHlwZUxpc3QoKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIC8vICAgICAgICB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIC8vICAgICAgICB0eXBlU2VjdGlvbi5wb3B1bGF0ZUJ1aWx0SW5UeXBlKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgLy8gICAgICAgIHR5cGVTZWN0aW9uLmdldFR5cGVMaXN0KCkuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTk9fVFlQRSIpKTsKLSAgICAgICAgICBwcmV2aW91c1R5cGUgPSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAodGFibGUuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCAmJiB0YWJsZS5nZXRTZWxlY3Rpb24oKS5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBwcmV2aW91c1N0cmluZ1R5cGUgPSAodGFibGUuZ2V0U2VsZWN0aW9uKClbMF0pLmdldFRleHQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVCdWlsdEluVHlwZSgpCi0gICAgewotICAgICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgICBMaXN0IGl0ZW1zID0gZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgICBpdGVtLnNldFRleHQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgICBpdGVtLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKSk7Ci0gICAgICAgIGl0ZW0uc2V0RGF0YShpdGVtcy5nZXQoaSkpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlVXNlckNvbXBsZXhUeXBlKCkKLSAgICB7Ci0gICAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgIGlmIChzaG93QW5vbnltb3VzKQotICAgICAgewotICAgICAgICBUYWJsZUl0ZW0gYW5vbnltb3VzSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgYW5vbnltb3VzSXRlbS5zZXRUZXh0KCIqKmFub255bW91cyoqIik7Ci0gICAgICAgIGFub255bW91c0l0ZW0uc2V0RGF0YSgiKiphbm9ueW1vdXMqKiIpOwotICAgICAgfQotICAgICAgTGlzdCBpdGVtcyA9IGdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpdGVtICIgKyBpICsgIiBpcyAiICsgaXRlbSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGl0ZW0uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RDb21wbGV4VHlwZS5naWYiKSk7Ci0gICAgICAgIGl0ZW0uc2V0RGF0YShpdGVtcy5nZXQoaSkpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoKQotICAgIHsKLSAgICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgaWYgKHNob3dBbm9ueW1vdXMpCi0gICAgICAgewotICAgICAgICBUYWJsZUl0ZW0gYW5vbnltb3VzSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgYW5vbnltb3VzSXRlbS5zZXRUZXh0KCIqKmFub255bW91cyoqIik7Ci0gICAgICAgIGFub255bW91c0l0ZW0uc2V0RGF0YSgiKiphbm9ueW1vdXMqKiIpOwotICAgICAgfQotICAgICAgTGlzdCBpdGVtcyA9IGdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgICAgIHsKLSAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGl0ZW0uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpKTsKLSAgICAgICAgaXRlbS5zZXREYXRhKGl0ZW1zLmdldChpKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBjaGVja0ZvckFub255bW91c1R5cGUoRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBVc2luZyBFZCdzIG1vZGVsIHRvIGNoZWNrIGJvb2xlYW4gaXNBbm9ueW1vdXMgPSBmYWxzZTsKLSAgICAgICAqIAotICAgICAgICogWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0KLSAgICAgICAqIGdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZWxlbWVudCk7IGlmIChjb21wb25lbnQKLSAgICAgICAqIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7IFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtID0KLSAgICAgICAqIChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29tcG9uZW50OyBpc0Fub255bW91cyA9Ci0gICAgICAgKiB4c2RFbGVtLmlzU2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsgfSByZXR1cm4gaXNBbm9ueW1vdXM7Ci0gICAgICAgKi8KLSAgICAgIFhTRERPTUhlbHBlciBoZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICBib29sZWFuIGlzQW5vbnltb3VzID0gZmFsc2U7Ci0gICAgICBOb2RlIGFOb2RlID0KLSAgICAgIGhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgaWYgKGFOb2RlICE9IG51bGwpCi0gICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGFOb2RlID0gaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgaWYgKGFOb2RlICE9IG51bGwpCi0gICAgICAgewotICAgICAgICBpc0Fub255bW91cyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gaXNBbm9ueW1vdXM7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVFbGVtZW50VG9Bbm9ueW1vdXMoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgeHNkVHlwZSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOwotICAgICAgdXBkYXRlRWxlbWVudFRvTm90QW5vbnltb3VzKGVsZW1lbnQpOwotICAgICAgYm9vbGVhbiBoYXNDaGlsZHJlbkVsZW1lbnRzID0gaGFzRWxlbWVudENoaWxkcmVuKGVsZW1lbnQpOwotICAgICAgRWxlbWVudCBjaGlsZE5vZGUgPSBudWxsOwotICAgICAgaWYgKHhzZFR5cGUuZXF1YWxzKFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRykpCi0gICAgICAgewotICAgICAgICBjaGlsZE5vZGUgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoCi0gICAgICAgICAgICBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsCi0gICAgICAgICAgICBwcmVmaXggKyBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoeHNkVHlwZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpKQotICAgICAgIHsKLSAgICAgICAgY2hpbGROb2RlID0KLSAgICAgICAgZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKAotICAgICAgICAgICAgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLAotICAgICAgICAgICAgcHJlZml4ICsgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpOwotICAgICAgfQotICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZE5vZGUpOwotICAgICAgLy9mb3JtYXRDaGlsZChjaGlsZE5vZGUsIGhhc0NoaWxkcmVuRWxlbWVudHMpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNTVEFub255bW91cyhFbGVtZW50IGVsZW1lbnQpCi0gICAgewotICAgICAgWFNERE9NSGVscGVyIGhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgIE5vZGUgYU5vZGUgPQotICAgICAgaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIGlmIChYU0RET01IZWxwZXIKLSAgICAgICAgICAgIC5pbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNDVEFub255bW91cyhFbGVtZW50IGVsZW1lbnQpCi0gICAgewotICAgICAgWFNERE9NSGVscGVyIGhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgIE5vZGUgYU5vZGUgPSBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgWFNEVHlwZURlZmluaXRpb24gZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgIFhTRERPTUhlbHBlciBoZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICBOb2RlIHR5cGVEZWZpbml0aW9uTm9kZSA9Ci0gICAgICBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICAgIGlmICh0eXBlRGVmaW5pdGlvbk5vZGUgPT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIHR5cGVEZWZpbml0aW9uTm9kZSA9Ci0gICAgICAgIGhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICAgIH0KLSAgICAgIGlmICh0eXBlRGVmaW5pdGlvbk5vZGUgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9Ci0gICAgICAgIHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KHR5cGVEZWZpbml0aW9uTm9kZSk7Ci0gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKFhTRFR5cGVEZWZpbml0aW9uKSBjb21wb25lbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlRWxlbWVudFRvTm90QW5vbnltb3VzKEVsZW1lbnQgZWxlbWVudCkKLSAgICB7Ci0gICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpCi0gICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpCi0gICAgICAgICAgICAgICAgfHwgbm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShub2RlKTsKLSAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCkKLSAgICB7Ci0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIHJldHVybiBoZWxwZXIuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKQotICAgIHsKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgcmV0dXJuIGhlbHBlci5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCkKLSAgICB7Ci0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIHJldHVybiBoZWxwZXIuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCk7Ci0gICAgfQotICAgIAotCSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRWxlbWVudENoaWxkcmVuKE5vZGUgcGFyZW50Tm9kZSkKLQkgIHsKLQkgICAgYm9vbGVhbiBoYXNDaGlsZHJlbkVsZW1lbnRzID0gZmFsc2U7Ci0JICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5oYXNDaGlsZE5vZGVzKCkpCi0JICAgIHsKLQkgICAgICBOb2RlTGlzdCBub2RlcyA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLQkgICAgICB7Ci0JICAgICAgICBpZiAobm9kZXMuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGhhc0NoaWxkcmVuRWxlbWVudHMgPSB0cnVlOwotCSAgICAgICAgICBicmVhazsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgICAgcmV0dXJuIGhhc0NoaWxkcmVuRWxlbWVudHM7Ci0JICB9Ci0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YUGF0aFByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YUGF0aFByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNWQ4OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvWFBhdGhQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBYUGF0aFByb3BlcnR5U291cmNlCi0gIGV4dGVuZHMgQmFzZVByb3BlcnR5U291cmNlCi0gIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBYUGF0aFByb3BlcnR5U291cmNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB2aWV3ZXIKLSAgICogQHBhcmFtIHhzZFNjaGVtYQotICAgKi8KLSAgcHVibGljIFhQYXRoUHJvcGVydHlTb3VyY2UoVmlld2VyIHZpZXdlciwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKHZpZXdlciwgeHNkU2NoZW1hKTsKLS8vIEZyb20gRmllbGQgICAgIAotLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXAsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9VTklRVUVfQkFTRV9GSUVMRFNfR1JPVVApOwotLy8gICAgZmllbGRGaWVsZC5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9GSUVMRF9URVhUIikpOwotLy8gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGZpZWxkRmllbGQsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9VTklRVUVfQkFTRV9TT1VSQ0UpOwotCi0vLyBGcm9tIFNlbGVjdG9yCi0vLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX1VOSVFVRV9CQVNFX1NFTEVDVE9SX0dST1VQKTsKLS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChzZWxlY3RvckZpZWxkLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfVU5JUVVFX0JBU0VfU0VMRUNUT1IpOwotLy8gc2VsZWN0b3JGaWVsZC5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9TRUxFQ1RPUl9URVhUIikpOwotICAgIAotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgWFBhdGhQcm9wZXJ0eVNvdXJjZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIoeHNkU2NoZW1hKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZSgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICAgKi8KLSAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBDcmVhdGUgYSBkZXNjcmlwdG9yIGFuZCBzZXQgYSBjYXRlZ29yeQotICAgIFByb3BlcnR5RGVzY3JpcHRvciB4cGF0aERlc2NyaXB0b3IgPQotICAgIG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgICBYU0RDb25zdGFudHMuWFBBVEhfQVRUUklCVVRFLAotICAgICAgICBYU0RDb25zdGFudHMuWFBBVEhfQVRUUklCVVRFKTsKLSAgICBsaXN0LmFkZCh4cGF0aERlc2NyaXB0b3IpOwotCi0gICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgoU3RyaW5nKSBpZCk7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgewotICAgICAgcmVzdWx0ID0gIiI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICB7Ci0gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkZJRUxEX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRklFTERfWFBBVEhfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50LCBYU0RDb25zdGFudHMuU0VMRUNUT1JfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgewotICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9TRUxFQ1RPUl9YUEFUSF9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5YUEFUSF9BVFRSSUJVVEUsIChTdHJpbmcpdmFsdWUpOwotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkOWNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlBvcHVwTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLQotcHVibGljIGNsYXNzIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgUHJvcGVydHlEZXNjcmlwdG9yCi17Ci0JcHJpdmF0ZSBTdHJpbmdbXSB2YWx1ZXM7Ci0JCi0JcHVibGljIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lLCBTdHJpbmdbXSB2YWx1ZXNBcnJheSkgewotCQlzdXBlcihpZCwgZGlzcGxheU5hbWUpOwotCQl2YWx1ZXMgPSB2YWx1ZXNBcnJheTsKLQl9Ci0JLyoqCi0JICogVGhlIDxjb2RlPkNvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotCSAqIDxjb2RlPklQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+IG1ldGhvZCBjcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3Ci0JICogPGNvZGU+Q29tYm9Cb3hDZWxsRWRpdG9yPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGUgZWRpdG9yIGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgY3VycmVudCB2YWxpZGF0b3IgaWYgdGhlcmUgaXMgb25lLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgQ2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgWFNEQ29tYm9Cb3hDZWxsRWRpdG9yKHBhcmVudCwgdmFsdWVzKTsKLSAgICAvL0NlbGxFZGl0b3IgZWRpdG9yID0gbmV3IFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvcihwYXJlbnQsIHZhbHVlcyk7Ci0JCWlmIChnZXRWYWxpZGF0b3IoKSAhPSBudWxsKQotCQkJZWRpdG9yLnNldFZhbGlkYXRvcihnZXRWYWxpZGF0b3IoKSk7Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBYU0RDb21ib0JveENlbGxFZGl0b3IgZXh0ZW5kcyBDZWxsRWRpdG9yCi0JewotCQlEeW5hbWljQ2VsbEVkaXRvciBjb21ib0JveDsKLQotCQlwcml2YXRlIFN0cmluZyBmU2VsZWN0aW9uOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gZkl0ZW1zOwotCQlwcm90ZWN0ZWQgT2JqZWN0IGZWYWx1ZTsKLQkJaW50IHNlbGVjdGlvbjsKLQkJT2JqZWN0IHR5cGVPYmplY3Q7Ci0JCQotCQlwdWJsaWMgdm9pZCBjcmVhdGVJdGVtcyhTdHJpbmdbXSBpdGVtcykKLQkJewotCQkJZkl0ZW1zID0gaXRlbXM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29tYm9Cb3hJdGVtcygpCi0JCXsKLQkJCXJldHVybiBmSXRlbXM7Ci0JCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29tYm8gYm94IGNlbGwgZWRpdG9yIHdpdGggdGhlIGdpdmVuIGNob2ljZXMuCi0JICovCi0JCSBwdWJsaWMgWFNEQ29tYm9Cb3hDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGl0ZW1zKQotCQkgewotCQkJIHN1cGVyKHBhcmVudCk7Ci0JCQkgZlNlbGVjdGlvbiA9ICIiOwotCQkJIHNldEl0ZW1zKGl0ZW1zKTsKLS8vCQkJIGZUZXh0LnNldFRleHQoIiIpOwotCQkgfQotCi0JCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotICAgICAgaWYgKGRvR2V0VmFsdWUoKSAhPSBudWxsKQotICAgICAgewotLy8JCQkgIGludCBpID0gKChJbnRlZ2VyKWRvR2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLS8vCQkJICBpZiAoaSA+PSAwKQotLy8JCSAgCXsKLS8vCQkgIAkgIGNvbWJvQm94LnNldFRleHQoZkl0ZW1zW2ldKTsKLS8vCQkgIAl9Ci0gICAgICAgIGNvbWJvQm94LnNldFRleHQoKFN0cmluZylmVmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgewotCQkJQXNzZXJ0LmlzTm90TnVsbChpdGVtcyk7Ci0JCQl0aGlzLmZJdGVtcyA9IGl0ZW1zOwotCQkJcG9wdWxhdGVDb21ib0JveEl0ZW1zKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ib0JveEl0ZW1zKCkgewotCQkJaWYgKGNvbWJvQm94ICE9IG51bGwgJiYgZkl0ZW1zICE9IG51bGwpIHsKLQkJCQljb21ib0JveC5yZW1vdmVBbGwoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZJdGVtcy5sZW5ndGg7IGkrKykKLQkJCQkJY29tYm9Cb3guYWRkKGZJdGVtc1tpXSwgaSk7Ci0KLQkJCQlzZXRWYWx1ZVZhbGlkKHRydWUpOwotCQkJCXNlbGVjdGlvbiA9IDA7Ci0JCQl9Ci0JCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGFjdHVhbCBVSSByZXByZXNlbnRhdGlvbi4KLQkgKi8KLQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JCXsKLQkJCWNvbWJvQm94ID0gbmV3IER5bmFtaWNDZWxsRWRpdG9yKHBhcmVudCwgU1dULlJFQURfT05MWSB8U1dULk5PTkUgfCBTV1QuTk9fVFJJTSk7Ci0JCQljb21ib0JveC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQkvLyBob29rIGtleSBwcmVzc2VkIC0gc2VlIFBSIDE0MjAxICAKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIktleSBlICIgKyBlKTsKLQkJCQkJa2V5UmVsZWFzZU9jY3VyZWQoZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWNvbWJvQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCX0KLQkJCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLS8vCQkJCSAgU3lzdGVtLm91dC5wcmludGxuKCJjb21ibyBzZWxlY3RlZCIpOwotCQkJCQlzZWxlY3Rpb24gPSBjb21ib0JveC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQlpZiAoIWNvbWJvQm94LmlzRHJvcHBlZCgpKSAvLyBhbGxvd3MgdXNlciB0byB0cmF2ZXJzZSBsaXN0IHVzaW5nIGtleWJvYXJkIHdpdGhvdXQgYXBwbHlpbmcgdmFsdWUKLQkJCQkJYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY29tYm9Cb3guYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0vLwkJCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiVFJBVkVSU0UgZSAiICsgZSk7Ci0JCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLSAgICAgIAotCQkJY29tYm9Cb3guYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJWFNEQ29tYm9Cb3hDZWxsRWRpdG9yLnRoaXMuZm9jdXNMb3N0KCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotLy8JCQkJICBTeXN0ZW0ub3V0LnByaW50bG4oImZvY3VzR2FpbmVkIik7Ci0JCQkJfQotCQkJfSk7Ci0JCSAgc2V0VmFsdWVWYWxpZCh0cnVlKTsKLQkJCXJldHVybiBjb21ib0JveDsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGZvY3VzTG9zdCgpIHsKLS8vCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiQ0VMTEVESVRPUiBGT0NVUyBMT1NUIik7Ci0JCQlpZiAoaXNBY3RpdmF0ZWQoKSkgewotCQkJCWFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIGtleVJlbGVhc2VPY2N1cmVkKEtleUV2ZW50IGtleUV2ZW50KSB7Ci0JCQlpZiAoa2V5RXZlbnQuY2hhcmFjdGVyID09ICdcdTAwMWInKSB7IC8vIEVzY2FwZSBjaGFyYWN0ZXIKLQkJCSAgY29tYm9Cb3guc2V0VGV4dCgiIik7IC8vIGNsZWFyIHRleHQKLQkJCQlmaXJlQ2FuY2VsRWRpdG9yKCk7Ci0JCQl9IGVsc2UgaWYgKGtleUV2ZW50LmNoYXJhY3RlciA9PSAnXHInKSB7IC8vIFJldHVybiBrZXkKLQkJCQkvL2ZpcmVBcHBseUVkaXRvclZhbHVlKCk7Ci0JCQkJYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKTsKLQkJCQlkZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCkgewotCQkJLy8JbXVzdCBzZXQgdGhlIHNlbGVjdGlvbiBiZWZvcmUgZ2V0dGluZyB2YWx1ZQotCQkJc2VsZWN0aW9uID0gY29tYm9Cb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCWlmIChzZWxlY3Rpb24gPCAwKQotCQkJewotCQkJICBkZWFjdGl2YXRlKCk7Ci0JCQkgIHJldHVybjsKLQkJCX0KLQkJCS8vIE9iamVjdCBuZXdWYWx1ZSA9IG5ldyBJbnRlZ2VyKHNlbGVjdGlvbik7Ci0gICAgICBPYmplY3QgbmV3VmFsdWUgPSBmSXRlbXNbc2VsZWN0aW9uXTsKLQkJCW1hcmtEaXJ0eSgpOwotCQkJYm9vbGVhbiBpc1ZhbGlkID0gaXNDb3JyZWN0KG5ld1ZhbHVlKTsKLQkJCXNldFZhbHVlVmFsaWQoaXNWYWxpZCk7Ci0JCQlpZiAoIWlzVmFsaWQpIHsKLQkJCQkvLyB0cnkgdG8gaW5zZXJ0IHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIGVycm9yIG1lc3NhZ2UuCi0JCQkJc2V0RXJyb3JNZXNzYWdlKAotCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRFcnJvck1lc3NhZ2UoKSwgbmV3IE9iamVjdFtdIHtmSXRlbXNbc2VsZWN0aW9uXX0pKTsgCi0JCQl9Ci0JCQlkb1NldFZhbHVlKG5ld1ZhbHVlKTsKLQkJCWZpcmVBcHBseUVkaXRvclZhbHVlKCk7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCX0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZG9HZXRWYWx1ZSgpIHsKLSAgICAgIHJldHVybiBmVmFsdWU7Ci0gICAgICAvLyBvdGhlcndpc2UgbGltaXRzIHRvIHNldCBvZiB2YWxpZCB2YWx1ZXMKLS8vICAgICAgT2JqZWN0IGluZGV4ID0gc3VwZXIuZG9HZXRWYWx1ZSgpOwotLy8gICAgICBpbnQgc2VsZWN0aW9uID0gLTE7Ci0vLyAgICAgIGlmIChpbmRleCBpbnN0YW5jZW9mIEludGVnZXIpCi0vLyAgICAgICAgc2VsZWN0aW9uID0gKChJbnRlZ2VyKSBpbmRleCkuaW50VmFsdWUoKTsKLS8vICAgICAgaWYgKHNlbGVjdGlvbiA+PSAwKQotLy8gICAgICAgIHJldHVybiBmSXRlbXNbc2VsZWN0aW9uXTsKLS8vICAgICAgZWxzZSBpZiAoZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgQ0NvbWJvKSB7Ci0vLyAgICAgICAgLy8gcmV0cmlldmUgdGhlIGFjdHVhbCB0ZXh0IGFzIHRoZSBsaXN0IG9mIHZhbGlkIGl0ZW1zIGRvZXNuJ3QgY29udGFpbiB0aGUgdmFsdWUKLS8vICAgICAgICByZXR1cm4gKChDQ29tYm8pIGdldENvbnRyb2woKSkuZ2V0VGV4dCgpOwotLy8gICAgICB9Ci0vLyAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBwcml2YXRlIGJvb2xlYW4gZlNldHRpbmdWYWx1ZSA9IGZhbHNlOwotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBpZiAoZlNldHRpbmdWYWx1ZSkKLSAgICAgICAgcmV0dXJuOwotICAgICAgZlNldHRpbmdWYWx1ZSA9IHRydWU7Ci0gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgIC8vc3VwZXIuZG9TZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIGZWYWx1ZSA9IHZhbHVlOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgIGludCBzZWxlY3Rpb24gPSAtMTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmSXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgaWYgKGZJdGVtc1tpXS5lcXVhbHMoc3RyaW5nVmFsdWUpKQotICAgICAgICAgICAgc2VsZWN0aW9uID0gaTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiA+PSAwKQotICAgICAgICAgIC8vc3VwZXIuZG9TZXRWYWx1ZShuZXcgSW50ZWdlcihzZWxlY3Rpb24pKTsKLSAgICAgICAgICBmVmFsdWUgPSBzdHJpbmdWYWx1ZTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgLy8gc3VwZXIuZG9TZXRWYWx1ZShuZXcgSW50ZWdlcigtMSkpOwotICAgICAgICAgIC8vIGZWYWx1ZSA9IG5ldyBJbnRlZ2VyKC0xKTsKLSAgICAgICAgICBmVmFsdWUgPSBzdHJpbmdWYWx1ZTsKLSAgICAgICAgICBpZiAoZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgQ0NvbWJvICYmICFzdHJpbmdWYWx1ZS5lcXVhbHMoKChDQ29tYm8pIGdldENvbnRyb2woKSkuZ2V0VGV4dCgpKSkgewotICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBUZXh0IHdpZGdldAotICAgICAgICAgICAgKChDQ29tYm8pIGdldENvbnRyb2woKSkuc2V0VGV4dChzdHJpbmdWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmU2V0dGluZ1ZhbHVlID0gZmFsc2U7Ci0gICAgfQkJCi0JCQotCS8qKgotCQkqIFJldHVybnMgdGhlIGNlbGwgZWRpdG9yJ3MgdmFsdWUuCi0JCSovCi0vLwkJcHJvdGVjdGVkIE9iamVjdCBkb0dldFZhbHVlKCkgCi0vLwkJewotLy8JCQlyZXR1cm4gZlZhbHVlOwotLy8JCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZm9jdXMgdG8gdGhlIGNlbGwgZWRpdG9yJ3MgVUkgcmVwcmVzZW50YXRpb24uCi0JICovCi0JCXByb3RlY3RlZCB2b2lkIGRvU2V0Rm9jdXMoKQotCQl7Ci0vLwkJCWZCdXR0b24uc2V0Rm9jdXMoKTsKLS8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb1NldEZvY3VzKCkgIiArIG1vcmVCdXR0b24uc2V0Rm9jdXMoKSk7Ci0gICAgICBjb21ib0JveC5zZXRGb2N1cygpOwotCQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY2VsbCBlZGl0b3IgdG8gdGhlIGdpdmVuIHZhbHVlLgotCSAqLwotLy8JCXByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotLy8JCXsKLS8vCQkJZlZhbHVlID0gdmFsdWU7Ci0vLwkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGZpbGxQb3B1cExpc3QoUG9wdXBMaXN0IGxpc3QpIAotCQl7Ci0JCQlTdHJpbmdbXSBsYWJlbHM9IG5ldyBTdHJpbmdbZkl0ZW1zLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKQotCQkJewotCQkJCVN0cmluZyBpdGVtPSBmSXRlbXNbaV07Ci0JCQkJbGFiZWxzW2ldPSBpdGVtOwotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKGZJdGVtc1tpXSk7Ci0JCQkJaWYgKGZTZWxlY3Rpb24gPT0gbnVsbCAmJiBmVmFsdWUgIT0gbnVsbCAmJiBmVmFsdWUuZXF1YWxzKGl0ZW0pKSAKLQkJCQl7Ci0JCQkJCWZTZWxlY3Rpb24gPSBpdGVtOwotCQkJCX0KLQkJCX0KLQotCQkJbGlzdC5zZXRJdGVtcyhsYWJlbHMpOwotCQkJaWYgKGZTZWxlY3Rpb24gIT0gbnVsbCkgCi0JCQl7Ci0vLwkJCQlmVGV4dC5zZXRUZXh0KGZTZWxlY3Rpb24pOwotCQkJCWxpc3Quc2VsZWN0KGZTZWxlY3Rpb24pOwotCQkJfQkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1hTRFByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YU0RQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQ2YTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1hTRFByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5WaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllcy5SZW1vdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3LmV2ZW50cy5JTm9kZVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlldy5ldmVudHMuTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RQcm9wZXJ0eVNoZWV0UGFnZSBleHRlbmRzIFByb3BlcnR5U2hlZXRQYWdlIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSU5vZGVTZWxlY3Rpb25MaXN0ZW5lcgotewotICAvKioKLSAgICogQHBhcmFtIG1vZGVsCi0gICAqLwotCi0gIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0JcHJpdmF0ZSBWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyIGZWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyOwotICBJU3RydWN0dXJlZE1vZGVsIG1vZGVsOwotICBwcm90ZWN0ZWQgUmVtb3ZlQWN0aW9uIGZSZW1vdmVBY3Rpb247Ci0gIENvbnRyb2wgZGVzaWduQ29udHJvbDsKLQotICBwdWJsaWMgWFNEUHJvcGVydHlTaGVldFBhZ2UoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKG51bGwsIGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgfQotICAKLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyKFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgdmlld2VyU2VsZWN0aW9uTWFuYWdlcikgewotCQkvLyBkaXNjb25uZWN0IGZyb20gb2xkIG9uZQotCQlpZiAoZlZpZXdlclNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlZpZXdlclNlbGVjdGlvbk1hbmFnZXIucmVtb3ZlTm9kZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJZlZpZXdlclNlbGVjdGlvbk1hbmFnZXIgPSB2aWV3ZXJTZWxlY3Rpb25NYW5hZ2VyOwotCi0JCS8vIGNvbm5lY3QgdG8gbmV3IG9uZQotCQlpZiAoZlZpZXdlclNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlZpZXdlclNlbGVjdGlvbk1hbmFnZXIuYWRkTm9kZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZGlzY29ubmVjdCBmcm9tIHRoZSBWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyCi0JCWlmIChmVmlld2VyU2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uTWFuYWdlci5yZW1vdmVOb2RlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVTZWxlY3Rpb25DaGFuZ2VkKE5vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gbXVsdGlwbGUgc2VsZWN0aW9uIGlzIHVuc3VwcG9ydGVkCi0JCWlmIChldmVudC5nZXRTZWxlY3RlZE5vZGVzKCkuc2l6ZSgpID4gMSkKLQkJewotCQkJc2VsZWN0aW9uQ2hhbmdlZChudWxsLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJfQotCQllbHNlIGlmIChldmVudC5nZXRTZWxlY3RlZE5vZGVzKCkuc2l6ZSgpID09IDApCi0JCXsKLQkJICAKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgIE9iamVjdCBpdGVtID0gZXZlbnQuZ2V0U2VsZWN0ZWROb2RlcygpLmdldCgwKTsKLSAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVGV4dCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSAoKFRleHQpaXRlbSkuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkKG51bGwsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHBhcmVudCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAJCQlzZWxlY3Rpb25DaGFuZ2VkKG51bGwsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGVkTm9kZXMoKSkpOwotICAgICAgfQotCQl9Ci0JfQotCi0gIHByaXZhdGUgdm9pZCBzZXRQcm9wZXJ0aWVzVGl0bGUoUHJvcGVydHlTaGVldCB0aGVQYXJ0LCBTdHJpbmcgdGl0bGUpCi0JewotCQlDb250cm9sIGNvbnRyb2wgPSB0aGVQYXJ0LmdldERlZmF1bHRQYWdlKCkuZ2V0Q29udHJvbCgpOwotCQlmb3IgKENvbXBvc2l0ZSBwYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotCQl7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVmlld0Zvcm0pCi0JCQl7Ci0JCQkJQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBDTGFiZWwpCi0JCQkJewotCQkJCQlDTGFiZWwgY2xhYmVsID0gKENMYWJlbCljaGlsZHJlblswXTsKLSAgCQkJCWNsYWJlbC5zZXRUZXh0KHRpdGxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1hTRFByb3BlcnR5U291cmNlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1hTRFByb3BlcnR5U291cmNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlNzkwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YU0RQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIKLXsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgLyoqCi0gICAqIAotICAgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotICAgKi8KLSAgcHVibGljIFhTRFByb3BlcnR5U291cmNlUHJvdmlkZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyI2dldFByb3BlcnR5U291cmNlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiBudWxsOwotICAgIAotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqZWN0OwotICAgICAgCi0gICAgICB4c2RTY2hlbWEgPSBjb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICAKLSAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWNvbXBvbmVudDsKLSAgICAgICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tcG9uZW50ID0gZWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgRWxlbWVudCBpbnB1dCA9IGNvbXBvbmVudC5nZXRFbGVtZW50KCk7IAotICAgICAgCi0gICAgICBCYXNlUHJvcGVydHlTb3VyY2UgYnBzID0gKEJhc2VQcm9wZXJ0eVNvdXJjZSlnZXRYU0RQcm9wZXJ0eVNvdXJjZShpbnB1dCk7Ci0gICAgICBpZiAoYnBzID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgCi0gICAgICBicHMuc2V0SW5wdXQoaW5wdXQpOwotICAgICAgcmV0dXJuIGJwczsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIGJvb2xlYW4gc2hvd1BhcmVudCA9IGZhbHNlOwotICAKLSAgcHVibGljIElQcm9wZXJ0eVNvdXJjZSBnZXRYU0RQcm9wZXJ0eVNvdXJjZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgRWxlbWVudCBpbnB1dCA9IChFbGVtZW50KW9iamVjdDsKLQotICAgIHNob3dQYXJlbnQgPSBmYWxzZTsKLSAgCi0gICAgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRWxlbWVudFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBHcm91cFJlZlByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICBpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgIGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBNb2RlbEdyb3VwUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZUdyb3VwUmVmUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTmFtZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBOb3RhdGlvblByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlVHlwZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IE5hbWVQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyb3VwUmVmUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNjaGVtYVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudGF0aW9uUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BUFBJTkZPX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBBcHBJbmZvUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IHBhcmVudCA9IChFbGVtZW50KWlucHV0OwotICAgICAgICBYU0RET01IZWxwZXIgeHNkRE9NSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSB4c2RET01IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChwYXJlbnQpOwotICAgICAgICBpZiAoZGVyaXZlZEJ5Tm9kZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlucHV0RXF1YWxzKGRlcml2ZWRCeU5vZGUsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IAotICAgICAgICAgICAgICBpbnB1dEVxdWFscyhkZXJpdmVkQnlOb2RlLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudClpbnB1dDsKLSAgICAgICAgWFNERE9NSGVscGVyIHhzZERPTUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgRWxlbWVudCBkZXJpdmVkQnlOb2RlID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnQocGFyZW50KTsKLSAgICAgICAgaWYgKGRlcml2ZWRCeU5vZGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQ29udGVudFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUeXBlTGlzdFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVR5cGVVbmlvblByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gY3JlYXRlUmVzdHJpY3RXaW5kb3coaW5wdXQsIHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pc0ZhY2V0KGlucHV0KSkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgcGFyZW50ID0gKChFbGVtZW50KWlucHV0KS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChpbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3RyaWN0V2luZG93KGlucHV0LCB4c2RTY2hlbWEpOwotICAgICAgICB9IAotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSAoKEVsZW1lbnQpaW5wdXQpLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKGlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkKLSAgICAgICAgICAgIHx8IGlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgewotICAgICAgICAgIHNob3dQYXJlbnQgPSB0cnVlOwotICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQ29udGVudFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5QQVRURVJOX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBQYXR0ZXJuUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5FTlVNRVJBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRW51bWVyYXRpb25Qcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFOWV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQW55RWxlbWVudFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBBbnlBdHRyaWJ1dGVQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlVOSVFVRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTmFtZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuS0VZUkVGX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBLZXlyZWZQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlNFTEVDVE9SX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBYUGF0aFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRklFTERfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFhQYXRoUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5LRVlfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IE5hbWVQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIElQcm9wZXJ0eVNvdXJjZSBjcmVhdGVSZXN0cmljdFdpbmRvdyhPYmplY3QgaW5wdXQsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgU2ltcGxlVHlwZSByZXN0cmljdGlvbiBpcyBkaWZmZXJlbnQgdGhhbiBTaW1wbGVDb250ZW50IHJlc3RyaWN0aW9uCi0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgTm9kZSBwYXJlbnQgPSAoKEVsZW1lbnQpaW5wdXQpLmdldFBhcmVudE5vZGUoKTsKLSAgICAgIGlmIChpbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlUmVzdHJpY3RQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVJlc3RyaWN0UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIHNob3dQYXJlbnQgPSB0cnVlOwotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbnRlbnRQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaW5wdXRFcXVhbHMoT2JqZWN0IGlucHV0LCBTdHJpbmcgdGFnbmFtZSwgYm9vbGVhbiBpc1JlZikKLSAgewotICAgIHJldHVybiBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoaW5wdXQsIHRhZ25hbWUsIGlzUmVmKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMGJmNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFNlY3Rpb24gaW1wbGVtZW50cyBJU2VjdGlvbiwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIExpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lcgotewotCXByaXZhdGUgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeTsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgcGFydDsKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJvdGVjdGVkIE9iamVjdCBpbnB1dDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZG9SZWZyZXNoID0gdHJ1ZTsKLQlYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gIHByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmU7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotICBwcm90ZWN0ZWQgaW50IHJpZ2h0TWFyZ2luU3BhY2U7Ci0gIHByb3RlY3RlZCBpbnQgdGFibGVNaW5pbXVtV2lkdGggPSA1MDsKLSAKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEFic3RyYWN0U2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLSAgewotICAgIGNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBhRmFjdG9yeSkKLSAgewotCQl0aGlzLmZhY3RvcnkgPSBhRmFjdG9yeTsKLSAgICBHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotICAgIFBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQoIiAgLi4uICAiKTsKLSAgICByaWdodE1hcmdpblNwYWNlID0gZXh0ZW50Lng7Ci0gICAgZ2MuZGlzcG9zZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbiNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCXRoaXMucGFydCA9IHBhcnQ7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIAotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIHhzZFNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpaW5wdXQpLmdldFNjaGVtYSgpOwotICAgICAgCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWlucHV0KS5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhNTE5vZGUpCi0gICAgICB7Ci0gICAgICAgIGlzUmVhZE9ubHkgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaXNSZWFkT25seSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHN0YXR1c0xpbmUgPSBnZXRTdGF0dXNMaW5lKCk7Ci0gICAgY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQotLy8JCXJlZnJlc2goKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb24jYWJvdXRUb0JlU2hvd24oKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWJvdXRUb0JlU2hvd24oKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uI2Fib3V0VG9CZUhpZGRlbigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhYm91dFRvQmVIaWRkZW4oKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uI2Rpc3Bvc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb24jZ2V0TWluaW11bUhlaWdodCgpCi0gICAqLwotICBwdWJsaWMgaW50IGdldE1pbmltdW1IZWlnaHQoKQotICB7Ci0gICAgcmV0dXJuIFNXVC5ERUZBVUxUOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgaW5wdXQgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudCgoRWxlbWVudClpbnB1dCk7Ci0gICAgfQotICAgIHJldHVybiBpbnB1dDsKLSAgfQotICAKLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotICAKLQkvKioKLQkgKiBHZXQgdGhlIHdpZGdldCBmYWN0b3J5LgotCSAqIEByZXR1cm4gdGhlIHdpZGdldCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KQotCXsKLSAgICByZWZyZXNoKCk7Ci0JfQotCi0JCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0gIAotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYKLSAgICAgICAgZ2V0SW5wdXQoKSAhPSBudWxsICYmCi0gICAgICAgICFpc0luRG9IYW5kbGUgJiYKLSAgICAgICAgIWlzUmVhZE9ubHkpIAotICAgIHsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChlKTsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYKLSAgICAgICAgZ2V0SW5wdXQoKSAhPSBudWxsICYmCi0gICAgICAgICFpc0luRG9IYW5kbGUgJiYKLSAgICAgICAgIWlzUmVhZE9ubHkpIAotICAgIHsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICBkb1dpZGdldFNlbGVjdGVkKGUpOwotICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBib29sZWFuIGxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLSAgICogQHJldHVybiB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyRW5hYmxlZCgpIAotICB7Ci0gICAgcmV0dXJuIGxpc3RlbmVyRW5hYmxlZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIGxpc3RlbmVyRW5hYmxlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyRW5hYmxlZChib29sZWFuICB2KSAKLSAgewotICAgIHRoaXMubGlzdGVuZXJFbmFibGVkID0gdjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgIWlzSW5Eb0hhbmRsZSAmJiAhaXNSZWFkT25seSkgCi0gICAgewotICAgICAgaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLSAgICAgIHN0YXJ0RGVsYXllZEV2ZW50KGV2ZW50KTsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgIH0gLy8gZW5kIG9mIGlmICgpCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIERlbGF5ZWRFdmVudCBkZWxheWVkVGFzazsKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHN0YXJ0RGVsYXllZEV2ZW50KEV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZGVsYXllZFRhc2sgPT0gbnVsbCB8fAotICAgICAgZGVsYXllZFRhc2suZ2V0RXZlbnQoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIGRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLGRlbGF5ZWRUYXNrKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEV2ZW50IGRlbGF5ZWRFdmVudCA9IGRlbGF5ZWRUYXNrLmdldEV2ZW50KCk7Ci0gICAgICAKLSAgICAgIGlmIChlLndpZGdldCA9PSBkZWxheWVkRXZlbnQud2lkZ2V0ICYmCi0gICAgICAgIGUudHlwZSA9PSBkZWxheWVkRXZlbnQudHlwZSkKLSAgICAgIHsKLSAgICAgICAgLy8gc2FtZSBldmVudCwganVzdCBkaWZmZXJlbnQgZGF0YSwgZGVsYXkgbmV3IGV2ZW50Ci0gICAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KG51bGwpOwotICAgICAgfQotICAgICAgZGVsYXllZFRhc2sgPSBuZXcgRGVsYXllZEV2ZW50KCk7Ci0gICAgICBkZWxheWVkVGFzay5zZXRFdmVudChlKTsKLSAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnRpbWVyRXhlYyg1MDAsZGVsYXllZFRhc2spOwotICAgIH0KLSAgfQotICAKLSAgY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUKLSAgewotICAgIHByb3RlY3RlZCBFdmVudCBldmVudDsKLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgUnVubmFibGUjcnVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGlmIChldmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpc0luRG9IYW5kbGUgPSB0cnVlOwotICAgICAgICBkb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgICAgIGV2ZW50ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZXZlbnQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgRXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRXZlbnQgZ2V0RXZlbnQoKQotICAgIHsKLSAgICAgIHJldHVybiBldmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBldmVudC4KLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50KEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIHRoaXMuZXZlbnQgPSBldmVudDsKLSAgICB9Ci0KLSAgfQotCi0gIGJvb2xlYW4gaXNJbkRvSGFuZGxlOwotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBvZiBpc0luRG9IYW5kbGUuCi0gICAqIEByZXR1cm4gdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJbkRvSGFuZGxlKCkgCi0gIHsKLSAgICByZXR1cm4gaXNJbkRvSGFuZGxlOwotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKQotICB7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0vLyAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFydC5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCi0gICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0gIH0KLQotICBzdGF0aWMgcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7IAotICAgIElTdGF0dXNMaW5lTWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpZWRpdG9yUGFydC5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLSAgICAgIHJlc3VsdCA9IGNvbnRyaWJ1dG9yLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNERE9NSGVscGVyIGRvbUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgLyoqCi0gICAqIEdldHMgdGhlIGRvbUhlbHBlci4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgWFNERG9tSGVscGVyCi0gICAqLwotICBwdWJsaWMgWFNERE9NSGVscGVyIGdldERvbUhlbHBlcigpCi0gIHsKLSAgICByZXR1cm4gZG9tSGVscGVyOwotICB9Ci0gIAotICBwdWJsaWMgRG9jdW1lbnRJbXBsIGdldERvY3VtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJldHVybiAoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKFN0cmluZyBkZXNjcmlwdGlvbiwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgZ2V0RG9jdW1lbnQoZWxlbWVudCkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBkZXNjcmlwdGlvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0gICAgCi0gICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBOYW1lVmFsaWRhdG9yLmlzVmFsaWQobmFtZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gVE9ETwotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUxhbmd1YWdlKFN0cmluZyBsYW5nKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBUT0RPCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIAotICBwcm90ZWN0ZWQgQWN0aW9uIGdldE5ld0VsZW1lbnRBY3Rpb24oU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBsYWJlbCwgTGlzdCBhdHRyaWJ1dGVzLCBFbGVtZW50IHBhcmVudCwgTm9kZSByZWxhdGl2ZU5vZGUpCi0gIHsKLSAgICBDcmVhdGVFbGVtZW50QWN0aW9uIGFjdGlvbiA9IG5ldyBDcmVhdGVFbGVtZW50QWN0aW9uKGxhYmVsKTsKLSAgICBhY3Rpb24uc2V0RWxlbWVudFRhZyhlbGVtZW50VGFnKTsKLSAgICBhY3Rpb24uc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICBhY3Rpb24uc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotICAgIGFjdGlvbi5zZXRSZWxhdGl2ZU5vZGUocmVsYXRpdmVOb2RlKTsKLSAgICBhY3Rpb24uc2V0WFNEU2NoZW1hKGdldFNjaGVtYSgpKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIobnVsbCk7Ci0gICAgcmV0dXJuIGFjdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIGlmIChzdGF0dXNMaW5lICE9IG51bGwpCi0gICAgewotICAgICAgc3RhdHVzTGluZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICBzdGF0dXNMaW5lLnVwZGF0ZSh0cnVlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbGVhckVycm9yTWVzc2FnZSgpCi0gIHsKLSAgICBpZiAoc3RhdHVzTGluZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHN0YXR1c0xpbmUuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgc3RhdHVzTGluZS51cGRhdGUoZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yOwotICBwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGdldFN0YXR1c0xpbmUoKQotICB7Ci0vLyAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRXb3JrYmVuY2goKTsKLS8vICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgCi0gICAgaWYgKHN0YXR1c0xpbmUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjb250cmlidXRvciA9IChFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcillZGl0b3JQYXJ0LmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotICAgICAgICBzdGF0dXNMaW5lID0gY29udHJpYnV0b3IuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1c0xpbmU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0YW5kYXJkIGxhYmVsIHdpZHRoIHdoZW4gbGFiZWxzIGZvciBzZWN0aW9ucyBsaW5lIHVwIG9uIHRoZSBsZWZ0Ci0gICAqIGhhbmQgc2lkZSBvZiB0aGUgY29tcG9zaXRlLiBXZSBsaW5lIHVwIHRvIGEgZml4ZWQgcG9zaXRpb24sIGJ1dCBpZiBhCi0gICAqIHN0cmluZyBpcyB3aWRlciB0aGFuIHRoZSBmaXhlZCBwb3NpdGlvbiwgdGhlbiB3ZSB1c2UgdGhhdCB3aWRlc3Qgc3RyaW5nLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudAotICAgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlIHVzZWQgdG8gY3JlYXRlIGEgR0MuCi0gICAqIEBwYXJhbSBsYWJlbHMKLSAgICogICAgICAgICAgICBUaGUgbGlzdCBvZiBsYWJlbHMuCi0gICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIGxhYmVsIHdpZHRoLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBnZXRTdGFuZGFyZExhYmVsV2lkdGgoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gbGFiZWxzKSB7Ci0gICAgaW50IHN0YW5kYXJkTGFiZWxXaWR0aCA9IDEwMDsgICAvLyBTVEFOREFSRF9MQUJFTF9XSURUSDsKLSAgICBHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotICAgIGludCBpbmRlbnQgPSBnYy50ZXh0RXh0ZW50KCJYWFgiKS54OyAvLyROT04tTkxTLTEkCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGludCB3aWR0aCA9IGdjLnRleHRFeHRlbnQobGFiZWxzW2ldKS54OwotICAgICAgaWYgKHdpZHRoICsgaW5kZW50ID4gc3RhbmRhcmRMYWJlbFdpZHRoKSB7Ci0gICAgICAgIHN0YW5kYXJkTGFiZWxXaWR0aCA9IHdpZHRoICsgaW5kZW50OwotICAgICAgfQotICAgIH0KLSAgICBnYy5kaXNwb3NlKCk7Ci0gICAgcmV0dXJuIHN0YW5kYXJkTGFiZWxXaWR0aDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJjNmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0RmlsdGVyKCkKLSAgICovCi0gIHB1YmxpYyBJVHlwZU1hcHBlciBnZXRGaWx0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTRENvbmNyZXRlQ29tcG9uZW50LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50IHx8IG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRBZnRlclNlY3Rpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBZnRlclNlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaW5wdXRFcXVhbHMoT2JqZWN0IGlucHV0LCBTdHJpbmcgdGFnbmFtZSwgYm9vbGVhbiBpc1JlZikKLSAgewotICAgIHJldHVybiBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoaW5wdXQsIHRhZ25hbWUsIGlzUmVmKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Bbm5vdGF0aW9uU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Bbm5vdGF0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWRhNzIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQW5ub3RhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROb3RhdGlvbkRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFhQYXRoRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBEb2N1bWVudGF0aW9uV29ya2Jvb2tQYWdlIGRvY3VtZW50YXRpb25QYWdlOwotICBBcHBJbmZvV29ya2Jvb2tQYWdlIGFwcEluZm9QYWdlOwotICBYU0RXb3JrYm9vayB3b3JrYm9vazsKLSAgWFNERmFjdG9yeSBmYWN0b3J5OwotICAKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEFubm90YXRpb25TZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgZmFjdG9yeSA9IG5ldyBYU0RGYWN0b3J5SW1wbCgpOwotICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotLy8JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLS8vICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBkYXRhOwotCi0gICAgd29ya2Jvb2sgPSBuZXcgWFNEV29ya2Jvb2socGFyZW50LCBTV1QuQk9UVE9NIHwgU1dULkZMQVQpOwotICAgIAotICAgIGRvY3VtZW50YXRpb25QYWdlID0gbmV3IERvY3VtZW50YXRpb25Xb3JrYm9va1BhZ2Uod29ya2Jvb2spOwotICAgIGFwcEluZm9QYWdlID0gbmV3IEFwcEluZm9Xb3JrYm9va1BhZ2Uod29ya2Jvb2spOwotCi0gICAgZG9jdW1lbnRhdGlvblBhZ2UuYWN0aXZhdGUoKTsKLSAgICBhcHBJbmZvUGFnZS5hY3RpdmF0ZSgpOwotICAgIHdvcmtib29rLnNldFNlbGVjdGVkUGFnZShkb2N1bWVudGF0aW9uUGFnZSk7Ci0gIH0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLSAgICBpZiAoZG9SZWZyZXNoKQotICAgIHsKLSAgICAgIGlmIChkb2N1bWVudGF0aW9uUGFnZS5nZXREb2N1bWVudGF0aW9uVGV4dCgpLmlzRm9jdXNDb250cm9sKCkgfHwgYXBwSW5mb1BhZ2UuZ2V0QXBwSW5mb1RleHQoKS5pc0ZvY3VzQ29udHJvbCgpKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChpc1JlYWRPbmx5KQotICAgICAgewotICAgICAgICBkb2N1bWVudGF0aW9uUGFnZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgYXBwSW5mb1BhZ2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRvY3VtZW50YXRpb25QYWdlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGFwcEluZm9QYWdlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCSAgICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IGdldElucHV0WFNEQW5ub3RhdGlvbihmYWxzZSk7Ci0gICAgICAgIHNldEluaXRpYWxUZXh0KHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCSAgfQotCX0KLQotICAKLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIE9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKHRydWUpOwotICAKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gZG9jdW1lbnRhdGlvblBhZ2UuZ2V0RG9jdW1lbnRhdGlvblRleHQoKSkKLSAgICAgIHsKLSAgICAgICAgZG9jdW1lbnRhdGlvblBhZ2UuZG9IYW5kbGVFdmVudCh4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBhcHBJbmZvUGFnZS5nZXRBcHBJbmZvVGV4dCgpKQotICAgICAgewotICAgICAgICBhcHBJbmZvUGFnZS5kb0hhbmRsZUV2ZW50KHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTREFubm90YXRpb24gZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKGJvb2xlYW4gY3JlYXRlSWZOb3RFeGlzdCkKLSAgewotICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IG51bGw7Ci0gICAgCi0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQ29tcCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilpbnB1dDsgCi0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQ29tcCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24paW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkQ29tcCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24paW5wdXQ7IAotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTRE5vdGF0aW9uRGVjbGFyYXRpb24geHNkQ29tcCA9KFhTRE5vdGF0aW9uRGVjbGFyYXRpb24paW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFhQYXRoRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RYUGF0aERlZmluaXRpb24geHNkQ29tcCA9IChYU0RYUGF0aERlZmluaXRpb24paW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cCB4c2RDb21wID0gKFhTRE1vZGVsR3JvdXApaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZENvbXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24paW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiB4c2RDb21wID0gKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24paW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIFhTRFdpbGRjYXJkIHhzZENvbXAgPSAoWFNEV2lsZGNhcmQpaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgeHNkQ29tcCA9IChYU0RTY2hlbWEpaW5wdXQ7Ci0gICAgICBMaXN0IGxpc3QgPSB4c2RDb21wLmdldEFubm90YXRpb25zKCk7Ci0gICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gKFhTREFubm90YXRpb24pbGlzdC5nZXQoMCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgICBpZiAoeHNkQ29tcC5nZXRDb250ZW50cygpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkQ29tcC5nZXRDb250ZW50cygpLmFkZCgwLCB4c2RBbm5vdGF0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB4c2RBbm5vdGF0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREZhY2V0KQotICAgIHsKLSAgICAgIFhTREZhY2V0IHhzZENvbXAgPSAoWFNERmFjZXQpaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHhzZENvbXAgPSAoWFNEVHlwZURlZmluaXRpb24paW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREluY2x1ZGUpCi0gICAgewotICAgICAgWFNESW5jbHVkZSB4c2RDb21wID0gKFhTREluY2x1ZGUpaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICBYU0RJbXBvcnQgeHNkQ29tcCA9IChYU0RJbXBvcnQpaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIHsKLSAgICAgIFhTRFJlZGVmaW5lIHhzZENvbXAgPSAoWFNEUmVkZWZpbmUpaW5wdXQ7Ci0gICAgICBMaXN0IGxpc3QgPSB4c2RDb21wLmdldEFubm90YXRpb25zKCk7Ci0gICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gKFhTREFubm90YXRpb24pbGlzdC5nZXQoMCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgICAgewotLy8gPwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4geHNkQW5ub3RhdGlvbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgIHhzZEFubm90YXRpb24gPSAoWFNEQW5ub3RhdGlvbilpbnB1dDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QpCi0gICAgewotICAgICAgZm9ybWF0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICByZXR1cm4geHNkQW5ub3RhdGlvbjsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZvcm1hdEFubm90YXRpb24oWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gYW5ub3RhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgWFNERE9NSGVscGVyLmZvcm1hdENoaWxkKGVsZW1lbnQpOwotICB9Ci0gIAotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGZhY3RvcnkgPSBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0SW5pdGlhbFRleHQoWFNEQW5ub3RhdGlvbiBhbikKLSAgewotICAgIGlmIChkb2N1bWVudGF0aW9uUGFnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGRvY3VtZW50YXRpb25QYWdlLnNldFRleHQoIiIpOwotICAgIH0KLSAgICBpZiAoYXBwSW5mb1BhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhcHBJbmZvUGFnZS5zZXRUZXh0KCIiKTsKLSAgICB9Ci0KLSAgICBpZiAoYW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBhbi5nZXRFbGVtZW50KCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKQotICAgICAgICAgewotICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IGlzIFRleHQKLSAgICAgICAgICBFbGVtZW50IGRvY0VsZW1lbnQgPSAoRWxlbWVudClkb21IZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgICBpZiAoZG9jRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IGRvY0VsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uUGFnZS5zZXRUZXh0KCAoKENoYXJhY3RlckRhdGEpbm9kZSkuZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgRWxlbWVudCBhcHBJbmZvRWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkFQUElORk9fRUxFTUVOVF9UQUcpOwotICAgICAgICAgIGlmIChhcHBJbmZvRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IGFwcEluZm9FbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXBwSW5mb1BhZ2Uuc2V0VGV4dCggKChDaGFyYWN0ZXJEYXRhKW5vZGUpLmdldERhdGEoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotIAotICBjbGFzcyBEb2N1bWVudGF0aW9uV29ya2Jvb2tQYWdlIGV4dGVuZHMgWFNEV29ya2Jvb2tQYWdlCi0gIHsKLSAgICBUZXh0IGRvY3VtZW50YXRpb25UZXh0OwotICAgIENvbXBvc2l0ZSBwYWdlMTsKLSAgICAKLSAgICBwdWJsaWMgRG9jdW1lbnRhdGlvbldvcmtib29rUGFnZShYU0RXb3JrYm9vayB3b3JrYm9vaykKLSAgICB7Ci0gICAgICBzdXBlcih3b3JrYm9vayk7Ci0gICAgICB0aGlzLmdldFRhYkl0ZW0oKS5zZXRUZXh0KCJEb2N1bWVudGF0aW9uIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgZG9jdW1lbnRhdGlvblRleHQuc2V0VGV4dCh2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkKLSAgICB7Ci0gICAgICBwYWdlMS5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRhdGlvblRleHQuZ2V0VGV4dCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVGV4dCBnZXREb2N1bWVudGF0aW9uVGV4dCgpCi0gICAgewotICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb25UZXh0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sIChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIHBhZ2UxID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgICBkb2N1bWVudGF0aW9uVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KHBhZ2UxLCAiIiwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLSAgICAgIGRvY3VtZW50YXRpb25UZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIEFubm90YXRpb25TZWN0aW9uLnRoaXMpOwotCi0gICAgICBGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICBkb2N1bWVudGF0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAgICAgICAgICAgCi0gICAgICByZXR1cm4gcGFnZTE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgIGlmICh4c2RBbm5vdGF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZEFubm90YXRpb24uZ2V0RWxlbWVudCgpOwotICAgICAgICBMaXN0IGRvY3VtZW50YXRpb25MaXN0ID0geHNkQW5ub3RhdGlvbi5nZXRVc2VySW5mb3JtYXRpb24oKTsKLSAgICAgICAgRWxlbWVudCBkb2N1bWVudGF0aW9uRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChkb2N1bWVudGF0aW9uTGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZG9jdW1lbnRhdGlvbkVsZW1lbnQgPSAoRWxlbWVudClkb2N1bWVudGF0aW9uTGlzdC5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ET0NVTUVOVEFUSU9OX0NPTU1FTlRfQ0hBTkdFIiksIGVsZW1lbnQpOwotICAgICAgICAKLSAgICAgICAgaWYgKGRvY3VtZW50YXRpb25FbGVtZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBkb2N1bWVudGF0aW9uRWxlbWVudCA9IHhzZEFubm90YXRpb24uY3JlYXRlVXNlckluZm9ybWF0aW9uKG51bGwpOwotICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgICAgIFhTRERPTUhlbHBlci5mb3JtYXRDaGlsZChkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICAgICAgLy8gRGVmZWN0IGluIG1vZGVsLi4uLkkgY3JlYXRlIGl0IGJ1dCB0aGUgbW9kZWwgb2JqZWN0IGRvZXNuJ3QgYXBwZWFyIHRvIGJlIHVwZGF0ZWQKLSAgICAgICAgICAvLyBOb3RpY2UgdGhhdCBpdCBpcyBmaW5lIGZvciBhcHBpbmZvCi0gICAgICAgICAgeHNkQW5ub3RhdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgICAgeHNkQW5ub3RhdGlvbi5zZXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSBkb2N1bWVudGF0aW9uVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIGlmIChkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRvY3VtZW50YXRpb25FbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IGlzIFRleHQKLSAgICAgICAgICAgICAgTm9kZSBub2RlID0gZG9jdW1lbnRhdGlvbkVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKENoYXJhY3RlckRhdGEpbm9kZSkuc2V0RGF0YShuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gZG9jdW1lbnRhdGlvbkVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZE5vZGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0gICAgCi0gICAgfQotICB9Ci0gIAotICBjbGFzcyBBcHBJbmZvV29ya2Jvb2tQYWdlIGV4dGVuZHMgWFNEV29ya2Jvb2tQYWdlCi0gIHsKLSAgICBUZXh0IGFwcEluZm9UZXh0OwotICAgIENvbXBvc2l0ZSBwYWdlMjsKLSAgICAKLSAgICBwdWJsaWMgQXBwSW5mb1dvcmtib29rUGFnZShYU0RXb3JrYm9vayB3b3JrYm9vaykKLSAgICB7Ci0gICAgICBzdXBlcih3b3JrYm9vayk7Ci0gICAgICB0aGlzLmdldFRhYkl0ZW0oKS5zZXRUZXh0KCJBcHAgSW5mbyIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBhcHBJbmZvVGV4dC5zZXRUZXh0KHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICAgIHsKLSAgICAgIHJldHVybiBhcHBJbmZvVGV4dC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFRleHQgZ2V0QXBwSW5mb1RleHQoKQotICAgIHsKLSAgICAgIHJldHVybiBhcHBJbmZvVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gc3RhdGUpCi0gICAgewotICAgICAgcGFnZTIuc2V0RW5hYmxlZChzdGF0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbCAoQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICBwYWdlMiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotICAgICAgYXBwSW5mb1RleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChwYWdlMiwgIiIsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgICBhcHBJbmZvVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBBbm5vdGF0aW9uU2VjdGlvbi50aGlzKTsKLSAgICAgIAotICAgICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgLy9kYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkb2N1bWVudGF0aW9uVGV4dCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgYXBwSW5mb1RleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgcmV0dXJuIHBhZ2UyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICBpZiAoeHNkQW5ub3RhdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RBbm5vdGF0aW9uLmdldEVsZW1lbnQoKTsKLSAgICAgICAgTGlzdCBhcHBJbmZvTGlzdCA9IHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpOwotICAgICAgICAKLSAgICAgICAgRWxlbWVudCBhcHBJbmZvRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChhcHBJbmZvTGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgYXBwSW5mb0VsZW1lbnQgPSAoRWxlbWVudClhcHBJbmZvTGlzdC5nZXQoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ09NTUVOVF9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgIGlmIChhcHBJbmZvRWxlbWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYXBwSW5mb0VsZW1lbnQgPSB4c2RBbm5vdGF0aW9uLmNyZWF0ZUFwcGxpY2F0aW9uSW5mb3JtYXRpb24obnVsbCk7Ci0gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChhcHBJbmZvRWxlbWVudCk7Ci0gICAgICAgICAgWFNERE9NSGVscGVyLmZvcm1hdENoaWxkKGFwcEluZm9FbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gYXBwSW5mb1RleHQuZ2V0VGV4dCgpOwotICAgICAgICBpZiAoYXBwSW5mb0VsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcHBJbmZvRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IGlzIFRleHQKLSAgICAgICAgICAgICAgTm9kZSBub2RlID0gYXBwSW5mb0VsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKENoYXJhY3RlckRhdGEpbm9kZSkuc2V0RGF0YShuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gYXBwSW5mb0VsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICBhcHBJbmZvRWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZE5vZGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfSAgICAKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Bbm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQW5ub3RhdGlvblNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YmY3YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Bbm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETm90YXRpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEWFBhdGhEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQW5ub3RhdGlvblNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54c2RlZGl0b3Iuc2VjdGlvbi5hbm5vdGF0aW9uIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoWFNEQW5ub3RhdGlvbi5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFubm90YXRpb25TZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmRvY3VtZW50YXRpb24iOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHx8Ci0gICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHx8Ci0gICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8Ci0gICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgWFNETm90YXRpb25EZWNsYXJhdGlvbiB8fAotICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTRFhQYXRoRGVmaW5pdGlvbiB8fAotICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXAgfHwKLSAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB8fAotICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gfHwKLSAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCB8fAotICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fAotICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTREZhY2V0IHx8IAotICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uIHx8Ci0gICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgWFNEQW5ub3RhdGlvbiB8fAotICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BdHRyaWJ1dGVzVmlld0NvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BdHRyaWJ1dGVzVmlld0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjUyNmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQXR0cmlidXRlc1ZpZXdDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNEQWJzdHJhY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzVmlld0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyLCBJTGFiZWxQcm92aWRlciwgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcgotewotICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCi0gIHN0YXRpYyBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbCB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5ID0gbmV3IFhTRE1vZGVsQWRhcHRlckZhY3RvcnlJbXBsKCk7IC8vIFhTRFRleHRFZGl0b3IuZ2V0WFNETW9kZWxBZGFwdGVyRmFjdG9yeSgpOwotICBzdGF0aWMgWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciA9IG5ldyBYU0RBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSk7ICAvLyBYU0RUZXh0RWRpdG9yLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgCi0gIFhTREFic3RyYWN0QWRhcHRlciBlbGVtZW50QWRhcHRlcjsKLSAgWFNEQWJzdHJhY3RBZGFwdGVyIGN0QWRhcHRlcjsKLSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0OwotICAKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEF0dHJpYnV0ZXNWaWV3Q29udGVudFByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0vLyAgICBpZiAoeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDaGFuZ2VOb3RpZmllcikKLS8vICAgIHsKLS8vICAgICAgKChJQ2hhbmdlTm90aWZpZXIpeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSkuYWRkTGlzdGVuZXIodGhpcyk7Ci0vLyAgICB9Ci0KLSAgfQotICAKLSAgVmlld2VyIGF0dHJpYnV0ZXNWaWV3ZXI7Ci0gIHB1YmxpYyBBdHRyaWJ1dGVzVmlld0NvbnRlbnRQcm92aWRlcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBWaWV3ZXIgdmlld2VyKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotICAgIHRoaXMuYXR0cmlidXRlc1ZpZXdlciA9IHZpZXdlcjsKLSAgfQotICAKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBjdCA9IG51bGw7Ci0gICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24paW5wdXRFbGVtZW50OwotICAgICAgCi0gICAgICBpZiAoZWxlbWVudEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZWxlbWVudEFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIoKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpdGhpcyk7Ci0gICAgICB9Ci0gICAgICBlbGVtZW50QWRhcHRlciA9IChYU0RBYnN0cmFjdEFkYXB0ZXIpeHNkTW9kZWxBZGFwdGVyRmFjdG9yeS5hZGFwdCh4c2RFbGVtZW50LCB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsKLSAgICAgIGVsZW1lbnRBZGFwdGVyLmFkZExpc3RlbmVyKChJTm90aWZ5Q2hhbmdlZExpc3RlbmVyKXRoaXMpOwotCi0gICAgICBpZiAoeHNkRWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24peHNkRWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0geHNkRWxlbWVudC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBpZiAoeHNkVHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil4c2RUeXBlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24paW5wdXRFbGVtZW50OwotICAgIH0KLQotICAgIGlmIChjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChjdEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY3RBZGFwdGVyLnJlbW92ZUxpc3RlbmVyKChJTm90aWZ5Q2hhbmdlZExpc3RlbmVyKXRoaXMpOwotICAgICAgfQotICAgICAgY3RBZGFwdGVyID0gKFhTREFic3RyYWN0QWRhcHRlcil4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5LmFkYXB0KGN0LCB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsKLSAgICAgIGN0QWRhcHRlci5hZGRMaXN0ZW5lcigoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcil0aGlzKTsKLSAgICAgIAotICAgICAgWFNEV2lsZGNhcmQgd2lsZGNhcmQgPSBjdC5nZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQoKTsKLSAgICAgIGlmICh3aWxkY2FyZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZCh3aWxkY2FyZCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIGkgPSBjdC5nZXRBdHRyaWJ1dGVDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyaWJ1dGVHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KWkubmV4dCgpOwotICAgICAgICBpZiAoYXR0cmlidXRlR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pYXR0cmlidXRlR3JvdXBDb250ZW50OwotICAgICAgICAgIFhTREFic3RyYWN0QWRhcHRlciBhID0gKFhTREFic3RyYWN0QWRhcHRlcil4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5LmFkYXB0KGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiwgeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSk7Ci0gICAgICAgICAgYS5yZW1vdmVMaXN0ZW5lcigoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcil0aGlzKTsKLSAJICAgICAgICBhLmFkZExpc3RlbmVyKChJTm90aWZ5Q2hhbmdlZExpc3RlbmVyKXRoaXMpOwotIAkgICAgICAgIGxpc3QuYWRkKGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpYXR0cmlidXRlR3JvdXBDb250ZW50OwotICAgICAgICAgIAotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICAgIAotICAgICAgICAgIGJvb2xlYW4gaXNSZWYgPSBYU0RET01IZWxwZXIuaXNBdHRyaWJ1dGVSZWYoY3QuZ2V0RWxlbWVudCgpLCBhdHRyaWJ1dGUuZ2V0UU5hbWUoKSwgYXR0cmlidXRlLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgIAotICAgICAgICAgIGlmIChpc1JlZikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBYnN0cmFjdEFkYXB0ZXIgYSA9IChYU0RBYnN0cmFjdEFkYXB0ZXIpeHNkTW9kZWxBZGFwdGVyRmFjdG9yeS5hZGFwdChhdHRyaWJ1dGVVc2UsIHhzZE1vZGVsQWRhcHRlckZhY3RvcnkpOyAgICAgICAgICAgIAotICAgICAgICAgICAgYS5yZW1vdmVMaXN0ZW5lcigoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcil0aGlzKTsKLSAgIAkgICAgICAgIGEuYWRkTGlzdGVuZXIoKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpdGhpcyk7Ci0gICAgICAgICAgICBsaXN0LmFkZChhdHRyaWJ1dGVVc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQWJzdHJhY3RBZGFwdGVyIGEgPSAoWFNEQWJzdHJhY3RBZGFwdGVyKXhzZE1vZGVsQWRhcHRlckZhY3RvcnkuYWRhcHQoYXR0cmlidXRlLCB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsgICAgICAgICAgICAKLSAgICAgICAgICAgIGEucmVtb3ZlTGlzdGVuZXIoKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpdGhpcyk7Ci0gICAJICAgICAgICBhLmFkZExpc3RlbmVyKChJTm90aWZ5Q2hhbmdlZExpc3RlbmVyKXRoaXMpOwotICAgICAgICAgICAgbGlzdC5hZGQoYXR0cmlidXRlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLSAgICovCi0gIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0JICAgIHJldHVybiBhZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoKFhTRENvbmNyZXRlQ29tcG9uZW50KWVsZW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gIHsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLQkgICAgWFNEQWJzdHJhY3RBZGFwdGVyIGEgPSAoWFNEQWJzdHJhY3RBZGFwdGVyKXhzZE1vZGVsQWRhcHRlckZhY3RvcnkuYWRhcHQoKFhTRENvbmNyZXRlQ29tcG9uZW50KWVsZW1lbnQsIHhzZE1vZGVsQWRhcHRlckZhY3RvcnkpOwotCSAgICByZXR1cm4gYS5nZXRUZXh0KChYU0RDb25jcmV0ZUNvbXBvbmVudCllbGVtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOyAKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLQkgICAgcmV0dXJuIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5nZXRJbWFnZSgoWFNEQ29uY3JldGVDb21wb25lbnQpZWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotCSAgICBYU0RBYnN0cmFjdEFkYXB0ZXIgYSA9IChYU0RBYnN0cmFjdEFkYXB0ZXIpeHNkTW9kZWxBZGFwdGVyRmFjdG9yeS5hZGFwdCgoWFNEQ29uY3JldGVDb21wb25lbnQpZWxlbWVudCwgeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSk7Ci0JICAgIHJldHVybiBhLmdldFRleHQoKFhTRENvbmNyZXRlQ29tcG9uZW50KWVsZW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gIiI7IAotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgewotICAgIHJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChlbGVtZW50QWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGVsZW1lbnRBZGFwdGVyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICBpZiAoY3RBZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgY3RBZGFwdGVyLnJlbW92ZUxpc3RlbmVyKChJTm90aWZ5Q2hhbmdlZExpc3RlbmVyKXRoaXMpOwotICAgIH0KLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIFZpZXdlciB2aWV3ZXI7Ci0gIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgewotLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJpbnB1dCBjaGFuZ2VkICIgKyBvbGRJbnB1dCArICJcbiIgKyBuZXdJbnB1dCk7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKQotICB7Ci0gICAgaWYgKGF0dHJpYnV0ZXNWaWV3ZXIgIT0gbnVsbCAmJiAhYXR0cmlidXRlc1ZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIGlmIChhdHRyaWJ1dGVzVmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikKLSAgICAgIHsKLSAgICAgICAgYXR0cmlidXRlc1ZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQXR0cmlidXRlc1ZpZXdTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0F0dHJpYnV0ZXNWaWV3U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjc5MjQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQXR0cmlidXRlc1ZpZXdTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTRE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuQWRkQXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVBdHRyaWJ1dGVBbmRSZXF1aXJlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuRE9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlhTRFByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlc1ZpZXdTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotewotICBBdHRyaWJ1dGVUYWJsZVRyZWVWaWV3ZXIgdmlld2VyOwotICBBdHRyaWJ1dGVzUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEF0dHJpYnV0ZXNWaWV3U2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCVRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJCi0JCWNvbXBvc2l0ZSA9CWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotICAgIFNhc2hGb3JtIHNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotCi0gICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICBzYXNoRm9ybS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIHZpZXdlciA9IG5ldyBBdHRyaWJ1dGVUYWJsZVRyZWVWaWV3ZXIoc2FzaEZvcm0pOwotICAgIHByb3BlcnR5U2hlZXRQYWdlID0gbmV3IEF0dHJpYnV0ZXNQcm9wZXJ0eVNoZWV0UGFnZSgpOwotICAgIHByb3BlcnR5U2hlZXRQYWdlLmNyZWF0ZUNvbnRyb2woc2FzaEZvcm0pOwotCi0JCUF0dHJpYnV0ZXNWaWV3Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEF0dHJpYnV0ZXNWaWV3Q29udGVudFByb3ZpZGVyKGdldEFjdGl2ZUVkaXRvcigpLCB2aWV3ZXIpOyAKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0KLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0gICAgcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgWFNEUHJvcGVydHlTb3VyY2VQcm92aWRlcigpKTsKLQl9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilpbnB1dDsKLSAgICAgIGlmIChlbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXQgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlzUmVhZE9ubHkgPSAoIShlbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCXsKLQkgIHByb3BlcnR5U2hlZXRQYWdlLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQl9Ci0KLSAgcHVibGljIHZvaWQgYWJvdXRUb0JlU2hvd24oKQotICB7Ci0JCXJlZnJlc2goKTsKLSAgfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLQkgIHsKLSAgICAgIHZpZXdlci5zZXRJbnB1dChnZXRJbnB1dCgpKTsKLSAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0JICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQkKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLS8vICAgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7Ci0vLyAgICAgIHByb3BlcnR5U2hlZXRQYWdlID0gbnVsbDsKLS8vICAgIH0KLS8vICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgdmlld2VyID0gbnVsbDsKLS8vICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotCQotCWNsYXNzIEF0dHJpYnV0ZVRhYmxlVHJlZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgLy8gRXh0ZW5kZWRUYWJsZVRyZWVWaWV3ZXIKLQl7Ci0JICBwdWJsaWMgQXR0cmlidXRlVGFibGVUcmVlVmlld2VyKENvbXBvc2l0ZSBjKQotCSAgewotCSAgICBzdXBlcihjKTsKLQkgICAgCi0JICAgIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCIjcG9wdXAiKTsvLyROT04tTkxTLTEkCi0JICAgIG1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkgICAgTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoZ2V0VHJlZSgpKTsKLQkgICAgZ2V0VHJlZSgpLnNldE1lbnUobWVudSk7Ci0KLQkgICAgWFNEQXR0cmlidXRlTWVudUxpc3RlbmVyIG1lbnVMaXN0ZW5lciA9IG5ldyBYU0RBdHRyaWJ1dGVNZW51TGlzdGVuZXIodGhpcyk7Ci0JICAgIG1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCi0JICB9Ci0JICAKLQkgIHB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVNZW51TGlzdGVuZXIgZXh0ZW5kcyBYU0RNZW51TGlzdGVuZXIKLQkgIHsKLQkgICAgcHVibGljIFhTREF0dHJpYnV0ZU1lbnVMaXN0ZW5lcihUcmVlVmlld2VyIHZpZXdlcikKLQkgICAgewotCSAgICAgIHN1cGVyKHZpZXdlcik7Ci0gICAgICAgIHNlbGVjdGlvblByb3ZpZGVyID0gdmlld2VyOwotICAgICAgIAotCSAgICAgIGRlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSwgQXR0cmlidXRlc1ZpZXdTZWN0aW9uLnRoaXMuZ2V0QWN0aXZlRWRpdG9yKCksIGdldFhTRFNjaGVtYSgpKTsKLSAgICAgICAgZGVsZXRlQWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLSAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGRlbGV0ZUFjdGlvbik7Ci0JICAgIH0KLQkgICAgCi0JICAgIHByb3RlY3RlZCBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKCkKLQkgICAgewotICAgICAgICByZXR1cm4geHNkU2NoZW1hOwotLy8gICAgICAgIHJldHVybiBnZXRTY2hlbWEoKTsKLS8vCSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZElucHV0ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KUF0dHJpYnV0ZXNWaWV3U2VjdGlvbi50aGlzLmdldElucHV0KCk7Ci0vLwkgICAgICByZXR1cm4geHNkSW5wdXQuZ2V0U2NoZW1hKCk7Ci0JICAgIH0KLQkgICAgCi0JICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0ZWRFbGVtZW50KCkKLQkgICAgewotICAgICAgICBYU0RDb21wb25lbnQgeHNkSW5wdXQgPSAoWFNEQ29tcG9uZW50KUF0dHJpYnV0ZXNWaWV3U2VjdGlvbi50aGlzLmdldElucHV0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoeHNkSW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24peHNkSW5wdXQ7Ci0gICAgICAgICAgWFNEVHlwZURlZmluaXRpb24geHNkVHlwZSA9IHhzZEVsZW1lbnQuZ2V0VHlwZSgpOwotICAgICAgICAgIGlmICh4c2RUeXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24peHNkVHlwZTsKLSAgICAgICAgICAgIHJldHVybiBjdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHhzZEVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoeHNkSW5wdXQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4geHNkSW5wdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpCi0gICAgICB7Ci0gICAgICAgIHVwZGF0ZVhTRFNjaGVtYSgpOwotICAgICAgICBpZiAoeHNkU2NoZW1hID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3Qgc2VsZWN0ZWRFbGVtZW50T2JqID0gZ2V0U2VsZWN0ZWRFbGVtZW50KCk7Ci0gICAgICAgIAotICAgICAgICBFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudE9iaiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGVkRWxlbWVudCA9ICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXNlbGVjdGVkRWxlbWVudE9iaikuZ2V0RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhZGRDb250ZXh0SXRlbXMobWFuYWdlciwgc2VsZWN0ZWRFbGVtZW50LCBudWxsKTsKLQotICAgICAgICBpZiAoIXNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEFkZCBjb250ZXh0IG1lbnUgaXRlbXMgZm9yIHNlbGVjdGVkIGVsZW1lbnQKLS8vICAgICAgICAgIGFkZENvbnRleHRJdGVtcyhtYW5hZ2VyLCBzZWxlY3RlZEVsZW1lbnQsIG51bGwpOwotICAgICAgICAgIAotICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgaWYgKGRlbGV0ZUFjdGlvbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0ZUFjdGlvbi5zZXRYU0RTY2hlbWEoZ2V0WFNEU2NoZW1hKCkpOwotICAgICAgICAgICAgbWFuYWdlci5hZGQoZGVsZXRlQWN0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQkgICAgCi0JICAgIHByb3RlY3RlZCB2b2lkIGFkZENvbnRleHRJdGVtcyhJTWVudU1hbmFnZXIgbWFuYWdlciwgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotCSAgICB7Ci0JICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSBudWxsOwotCSAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLQkgICAgICB7IC8vCi0JICAgICAgICBib29sZWFuIGFubm90YXRpb25FeGlzdHMgPSBmYWxzZTsKLQkgICAgICAgIGJvb2xlYW4gY29udGVudEV4aXN0cyA9IGZhbHNlOwotCSAgICAgICAgYm9vbGVhbiBjb21wbGV4T3JTaW1wbGVDb250ZW50RXhpc3RzID0gZmFsc2U7Ci0JICAgICAgICBib29sZWFuIGFueUF0dHJpYnV0ZUV4aXN0cyA9IGZhbHNlOwotCSAgICAgICAgTm9kZSBhbm5vdGF0aW9uTm9kZSA9IG51bGw7Ci0JICAgICAgICBFbGVtZW50IGNvbnRlbnROb2RlID0gbnVsbDsKLQkgICAgICAgIE5vZGUgYW55QXR0cmlidXRlTm9kZSA9IG51bGw7Ci0JICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JICAgICAgICAKLQkgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0JICAgICAgICB7Ci0JICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCSAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JICAgICAgICAgIHsKLQkgICAgICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KWNoaWxkLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgIGFubm90YXRpb25Ob2RlID0gY2hpbGQ7Ci0JICAgICAgICAgICAgICBhbm5vdGF0aW9uRXhpc3RzID0gdHJ1ZTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KWNoaWxkLCBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotCSAgICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCljaGlsZCwgWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0JICAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KWNoaWxkLCBYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLQkgICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpY2hpbGQsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgdHJ1ZSkgfHwKLQkgICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpY2hpbGQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLQkgICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpY2hpbGQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgIGNvbnRlbnRFeGlzdHMgPSB0cnVlOwotCSAgICAgICAgICAgICAgY29udGVudE5vZGUgPSAoRWxlbWVudCljaGlsZDsKLQotCSAgICAgICAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCljaGlsZCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotCSAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCljaGlsZCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0JICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIGNvbXBsZXhPclNpbXBsZUNvbnRlbnRFeGlzdHMgPSB0cnVlOwotCSAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0gCi0JICAgICAgICAgICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KWNoaWxkLCBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgYW55QXR0cmlidXRlRXhpc3RzID0gdHJ1ZTsKLQkgICAgICAgICAgICAgIGFueUF0dHJpYnV0ZU5vZGUgPSBjaGlsZDsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLS8vCSAgICAgICAgYWRkQ3JlYXRlQW5ub3RhdGlvbkFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLS8vCSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLS8vCSAgICAgICAgYWRkU2V0QmFzZVR5cGVBY3Rpb24obWFuYWdlciwgcGFyZW50KTsKLS8vCSAgICAgICAgaWYgKGFubm90YXRpb25FeGlzdHMpCi0vLwkgICAgICAgIHsKLS8vCSAgICAgICAgICBpZiAoIWNvbnRlbnRFeGlzdHMpCi0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NPTlRFTlRfTU9ERUwiKSwgYXR0cmlidXRlcywgcGFyZW50LCBhbm5vdGF0aW9uTm9kZS5nZXROZXh0U2libGluZygpKTsKLS8vCSAgICAgICAgICAgIGFkZENyZWF0ZVNpbXBsZUNvbnRlbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NJTVBMRV9DT05URU5UIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0vLwkgICAgICAgICAgICBhZGRDcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ09NUExFWF9DT05URU5UIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgYW5ub3RhdGlvbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0vLwkgICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50UmVmQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FERF9HUk9VUF9SRUYiKSwgcGFyZW50LCBhbm5vdGF0aW9uTm9kZS5nZXROZXh0U2libGluZygpKTsKLS8vCSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgfQotLy8JICAgICAgICBlbHNlCi0vLwkgICAgICAgIHsKLS8vCSAgICAgICAgICBpZiAoIWNvbnRlbnRFeGlzdHMpCi0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NPTlRFTlRfTU9ERUwiKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLS8vCSAgICAgICAgICAgIGFkZENyZWF0ZVNpbXBsZUNvbnRlbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NJTVBMRV9DT05URU5UIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0vLwkgICAgICAgICAgICBhZGRDcmVhdGVTaW1wbGVDb250ZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ09NUExFWF9DT05URU5UIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0vLwkgICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50UmVmQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FERF9HUk9VUF9SRUYiKSwgcGFyZW50LCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLS8vCSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgfQotLy8KLS8vCSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCSAgICAgICAgaWYgKGFueUF0dHJpYnV0ZUV4aXN0cykKLQkgICAgICAgIHsKLQkgICAgICAgICAgaWYgKCFjb21wbGV4T3JTaW1wbGVDb250ZW50RXhpc3RzKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld05hbWUocGFyZW50LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCAiQXR0cmlidXRlIiwgZmFsc2UpKSk7Ci0JICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpKSk7Ci0JICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCBhbnlBdHRyaWJ1dGVOb2RlKTsKLQkgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLS8vCSAgIEFSRSBBVFRSSUJVVEUgR1JPVVBTIEFMTE9XRUQgPwotLy8JICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsICJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVAiLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIGFueUF0dHJpYnV0ZU5vZGUpOwotCSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRkVSRU5DRSIpLCBwYXJlbnQsIGFueUF0dHJpYnV0ZU5vZGUpOwotCSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGIiksIHBhcmVudCwgYW55QXR0cmlidXRlTm9kZSk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UKLQkgICAgICAgIHsKLQkgICAgICAgICAgaWYgKCFjb21wbGV4T3JTaW1wbGVDb250ZW50RXhpc3RzKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld05hbWUocGFyZW50LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCAiQXR0cmlidXRlIiwgZmFsc2UpKSk7Ci0JICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpKSk7Ci0JICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotCSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotCSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRSZWZBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRkVSRU5DRSIpLCBwYXJlbnQsIHBhcmVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0JICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUYiKSwgcGFyZW50LCBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotCSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOwotCSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KG1hbmFnZXIsIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCBwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotCSAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIG5ldyBtb2RlbCBiYXNlZCBhZGQgYXR0cmlidXRlIGFjdGlvbgotICAgICAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ1QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldFhTRFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQocGFyZW50KTsKLSAgICAgICAgICAgICAgbWFuYWdlci5hZGQobmV3IEFkZEF0dHJpYnV0ZUFjdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUiKSwgeHNkQ1QpKTsKLQotICAgICAgICAgICAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW1lbnQgPSBkb21IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChjb250ZW50Tm9kZSk7Ci0gICAgICAgICAgICAgIGlmIChkZXJpdmVkQnlFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50UmVmQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9SRUZFUkVOQ0UiKSwgZGVyaXZlZEJ5RWxlbWVudCwgZGVyaXZlZEJ5RWxlbWVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudFJlZkFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUYiKSwgZGVyaXZlZEJ5RWxlbWVudCwgZGVyaXZlZEJ5RWxlbWVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QobWFuYWdlciwgWFNEQ29uc3RhbnRzLkFOWUFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSIpLCBhdHRyaWJ1dGVzLCBkZXJpdmVkQnlFbGVtZW50LCBkZXJpdmVkQnlFbGVtZW50LmdldExhc3RDaGlsZCgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgICBlbHNlIGlmIChwYXJlbnQgPT0gbnVsbCkgewkgICAgICAKLQkgICAgICAJWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilpbnB1dDsgICAgICAKLQkgICAgICAJaWYgKGVkLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkgCi0JICAgICAgCXsKLQkgICAgICAJCVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0ZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotCSAgICAgIAl9Ci0JICAgICAgCi0JICAgICAgCS8vIEFkZCBBdHRyaWJ1dGUKLQkgICAgICAJYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgICAJYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdOYW1lKHBhcmVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgIkF0dHJpYnV0ZSIsIGZhbHNlKSkpOwotCSAgICAgIAlhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkpKTsKLQkgICAgICAJbWFuYWdlci5hZGQobmV3IENyZWF0ZUF0dHJpYnV0ZUFuZFJlcXVpcmVkKFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsCi0JCQkJCSAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSIpLAotCQkJCQkgICBhdHRyaWJ1dGVzLAotCQkJCQkgICBnZXRYU0RTY2hlbWEoKSwKLQkJCQkJICAgc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCSAgIGVkKSk7Ci0JICAgICAgCQotCSAgICAgIAkvLyBBZGQgQXR0cmlidXRlIFJlZmVyZW5jZQotCSAgICAgIAlhdHRyaWJ1dGVzID0gbnVsbDsKLQkgICAgICAJYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgICAgIFN0cmluZyByZWYgPSBnZXRGaXJzdEdsb2JhbEVsZW1lbnRUYWdOYW1lKFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcpOwotCSAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSwgcmVmKSk7Ci0JICAgICAgCi0JICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IENyZWF0ZUF0dHJpYnV0ZUFuZFJlcXVpcmVkKFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsCi0JCQkJCSAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9SRUZFUkVOQ0UiKSwKLQkJCQkJICAgYXR0cmlidXRlcywKLQkJCQkJICAgZ2V0WFNEU2NoZW1hKCksCi0JCQkJCSAgIHNlbGVjdGlvblByb3ZpZGVyLAotCQkJCQkgICBlZCk7Ci0JICAgICAgICBtYW5hZ2VyLmFkZChhY3Rpb24pOwotCSAgICAgICAgYWN0aW9uLnNldEVuYWJsZWQocmVmICE9IG51bGwpOwotCi0JICAgICAgICAvLyBBZGQgQXR0cmlidXRlIEdyb3VwIFJlZmVyZW5jZQotCSAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0JICAgICAgCWF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgICAgICByZWYgPSBnZXRGaXJzdEdsb2JhbEVsZW1lbnRUYWdOYW1lKFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRyk7Ci0JICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCByZWYpKTsKLQkgICAgICAgIAotCSAgICAgICAgYWN0aW9uID0gbmV3IENyZWF0ZUF0dHJpYnV0ZUFuZFJlcXVpcmVkKFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywKLQkJCQkJICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRiIpLAotCQkJCQkgICBhdHRyaWJ1dGVzLAotCQkJCQkgICBnZXRYU0RTY2hlbWEoKSwKLQkJCQkJICAgc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCSAgIGVkKTsKLQotCSAgICAgIAltYW5hZ2VyLmFkZChhY3Rpb24pOwotCSAgICAgIAlhY3Rpb24uc2V0RW5hYmxlZChyZWYgIT0gbnVsbCk7Ci0JICAgICAgCQotCSAgICAgIAkvLyBBZGQgQW55IEF0dHJpYnV0ZQotCSAgICAgIAlhdHRyaWJ1dGVzID0gbnVsbDsKLQkgICAgICAJaWYgKGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkgPT0gbnVsbCkKLQkgICAgICAgIHsKLQkgICAgICAJCWFjdGlvbiA9IG5ldyBDcmVhdGVBdHRyaWJ1dGVBbmRSZXF1aXJlZChYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLAotCQkJCQkJICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSIpLAotCQkJCQkJICAgYXR0cmlidXRlcywKLQkJCQkJCSAgIGdldFhTRFNjaGVtYSgpLAotCQkJCQkJICAgc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQkgICBlZCk7Ci0JICAgICAgCQltYW5hZ2VyLmFkZChhY3Rpb24pOwotCSAgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQl9Ci0JCi0JY2xhc3MgQXR0cmlidXRlc1Byb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgUHJvcGVydHlTaGVldFBhZ2UgaW1wbGVtZW50cyBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyCi0JewotCSAgcHVibGljIEF0dHJpYnV0ZXNQcm9wZXJ0eVNoZWV0UGFnZSgpCi0JICB7Ci0JICAgIHN1cGVyKCk7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikKLQkgIHsKLQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmljYXRpb24iKTsKLQkgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0F0dHJpYnV0ZXNWaWV3U2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQXR0cmlidXRlc1ZpZXdTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWYyMzNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQXR0cmlidXRlc1ZpZXdTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlc1ZpZXdTZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEF0dHJpYnV0ZXNWaWV3U2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhzZGVkaXRvci5zZWN0aW9uLmF0dHJpYnV0ZXMiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChYU0RFbGVtZW50RGVjbGFyYXRpb24uY2xhc3MpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbiBnZXRTZWN0aW9uQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVzVmlld1NlY3Rpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotLy8gUmVtb3ZlIHRoaXMgdG8gZml4IGJ1ZyAzODcwIEVsZW1lbnQgcmVmZXJlbmNlcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIGVsZW1lbnRzIAotLy8gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKW9iamVjdDsKLS8vICAgICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgcmV0dXJuIGZhbHNlOwotLy8gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5hdHRyaWJ1dGVzIjsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbW1vbkRpcmVjdGl2ZXNTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbW1vbkRpcmVjdGl2ZXNTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTFkNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db21tb25EaXJlY3RpdmVzU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFBhcnNlcjsKLQotcHVibGljIGNsYXNzIENvbW1vbkRpcmVjdGl2ZXNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIFRleHQgc2NoZW1hTG9jYXRpb25UZXh0OwotICBCdXR0b24gd2l6YXJkQnV0dG9uOwotICBTdHlsZWRUZXh0IGVycm9yVGV4dDsKLSAgQ29sb3IgcmVkOwotCi0gIC8vIFRPRE86IGNvbW1vbiB1cCBjb2RlIHdpdGggWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQKLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5KQotICAgIHsKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gc2NoZW1hTG9jYXRpb25UZXh0KQotICAgICAgewotICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gIiI7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gdHJ1ZTsKLSAgICAgICAgU3RyaW5nIHhzZE1vZGVsRmlsZSA9IHNjaGVtYUxvY2F0aW9uVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICh4c2RNb2RlbEZpbGUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKHhzZE1vZGVsRmlsZSwgIiIsIG51bGwpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgSUZpbGUgY3VycmVudElGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLQotICAgICAgICAgIFVSSSBuZXdVUkkgPSBVUkkuY3JlYXRlVVJJKHhzZE1vZGVsRmlsZSk7Ci0gICAgICAgICAgU3RyaW5nIHhzZEZpbGUgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkobmV3VVJJLnRvU3RyaW5nKCksIGN1cnJlbnRJRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGZpbmFsIFN0cmluZyBub3JtYWxpemVkWFNERmlsZSA9IFVSSUhlbHBlci5ub3JtYWxpemUoeHNkRmlsZSwgY3VycmVudElGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgIiIpOwotICAgICAgICAgIAotICAgICAgICAgIFhTRFBhcnNlciBwYXJzZXIgPSBuZXcgWFNEUGFyc2VyKCk7Ci0gICAgICAgICAgcGFyc2VyLnBhcnNlKG5vcm1hbGl6ZWRYU0RGaWxlKTsKLSAgICAgICAgICAKLSAgICAgICAgICBleHRlcm5hbFNjaGVtYSA9IHBhcnNlci5nZXRTY2hlbWEoKTsKLQotICAgICAgICAgIGlmIChleHRlcm5hbFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBleHROYW1lc3BhY2UgPSBleHRlcm5hbFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGlmIChleHROYW1lc3BhY2UgPT0gbnVsbCkgZXh0TmFtZXNwYWNlID0gIiI7Ci0gICAgICAgICAgICBuYW1lc3BhY2UgPSBleHROYW1lc3BhY2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpLnNpemUoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfSU5DT1JSRUNUX1hNTF9TQ0hFTUEiLCB4c2RNb2RlbEZpbGUpOwotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50TmFtZVNwYWNlID0gZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREluY2x1ZGUgfHwgaW5wdXQgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIG5hbWVzcGFjZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgdGhlIHNhbWUgYXMgY3VycmVudCBmaWxlCi0gICAgICAgICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgIWV4dE5hbWVzcGFjZS5lcXVhbHMoY3VycmVudE5hbWVTcGFjZSkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9ESUZGRVJFTlRfTkFNRV9TUEFDRSIsIHhzZE1vZGVsRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBuYW1lc3BhY2UgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IGZpbGUKLSAgICAgICAgICAgICAgICBpZiAoZXh0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROYW1lU3BhY2UgIT0gbnVsbCAmJiBleHROYW1lc3BhY2UuZXF1YWxzKGN1cnJlbnROYW1lU3BhY2UpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfU0FNRV9OQU1FX1NQQUNFIiwgeHNkTW9kZWxGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiSW52YWxpZCBmaWxlIjsKLSAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJJbnZhbGlkIGZpbGUiOwotICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNWYWxpZFNjaGVtYUxvY2F0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yVGV4dC5zZXRUZXh0KGVycm9yTWVzc2FnZSk7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gZXJyb3JUZXh0LmdldFRleHQoKS5sZW5ndGgoKTsKLSAgICAgICAgICAgIHJlZCA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOwotICAgICAgICAgICAgU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKDAsIGxlbmd0aCwgcmVkLCBzY2hlbWFMb2NhdGlvblRleHQuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgICAgIGVycm9yVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKHhzZE1vZGVsRmlsZSwgbmFtZXNwYWNlLCBleHRlcm5hbFNjaGVtYSk7ICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2NoZW1hTG9jYXRpb25DaGFuZ2UoU3RyaW5nIHNjaGVtYUZpbGVTdHJpbmcsIFN0cmluZyBuYW1lc3BhY2UsIFhTRFNjaGVtYSBleHRlcm5hbFNjaGVtYSkKLSAgewotICAgIAotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIGlmIChyZWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWQuZGlzcG9zZSgpOwotICAgICAgcmVkID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db21wbGV4VHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29tcGxleFR5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NmY5ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db21wbGV4VHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuU2V0QmFzZVR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54c2QuWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54c2QuWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhzZC5YU0RTZXRUeXBlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGV4VHlwZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJpdmF0ZSBTdHJpbmcgREVSSVZFRF9CWV9JRCA9ICJkZXJpdmVkIGJ5IjsgLy8gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0RFUklWRURfQlkiKTsgLy8kTk9OLU5MUy0xJCAKLSAgcHJpdmF0ZSBTdHJpbmcgQkFTRV9UWVBFX0lEID0gImJhc2UgdHlwZSI7IC8vICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfQkFTRV9UWVBFIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBTdHJpbmcgZGVyaXZlZEJ5Q2hvaWNlc0NvbWJvVmFsdWVzW10gPQotICB7Ci0gICAgICAgICIiLAotICAgICAgICBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsCi0gICAgICAgIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcKLSAgfTsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQ29tcGxleFR5cGVTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotCVRleHQgYmFzZVR5cGVDb21ibzsKLQlDQ29tYm8gZGVyaXZlZEJ5Q29tYm87Ci0JQnV0dG9uIGJ1dHRvbjsKLQotCS8qKgotCSAqIEEgaGVscGVyIHRvIGxpc3RlbiBmb3IgZXZlbnRzIHRoYXQgaW5kaWNhdGUgdGhhdCBhIHRleHQKLQkgKiBmaWVsZCBoYXMgYmVlbiBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgVGV4dENoYW5nZUhlbHBlciBsaXN0ZW5lciA9IG5ldyBUZXh0Q2hhbmdlSGVscGVyKCkKLQl7Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2VkKENvbnRyb2wgY29udHJvbCkKLQkJewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLQotCQliYXNlVHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQ0xhYmVsIGJhc2VUeXBlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0JBU0VfVFlQRV9XSVRIX0NPTE9OIikpOyAvLyROT04tTkxTLTEkIAotCi0gICAgYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICIiLCBTV1QuUFVTSCk7Ci0gICAgYnV0dG9uLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGJhc2VUeXBlQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIGJhc2VUeXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCk7Ci0JCWJhc2VUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChiYXNlVHlwZUNvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCwgU1dULkNFTlRFUik7Ci0JCWJhc2VUeXBlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlICsgMik7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLDApOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGJhc2VUeXBlQ29tYm8sIDAsIFNXVC5DRU5URVIpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWRlcml2ZWRCeUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGJhc2VUeXBlQ29tYm8sICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJZGVyaXZlZEJ5Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGVyaXZlZEJ5Q29tYm8uc2V0SXRlbXMoZGVyaXZlZEJ5Q2hvaWNlc0NvbWJvVmFsdWVzKTsKLQkJZGVyaXZlZEJ5Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJQ0xhYmVsIGRlcml2ZWRCeUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9ERVJJVkVEX0JZIikpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGRlcml2ZWRCeUNvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRlcml2ZWRCeUNvbWJvLCAwLCBTV1QuQ0VOVEVSKTsKLQkJZGVyaXZlZEJ5TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0JICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIAotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQotCSAgT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkgIGJhc2VUeXBlQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkgIAotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWlucHV0OwotICAgICAgRWxlbWVudCBlbGVtZW50ID0gY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpOwotICAgICAgRWxlbWVudCBjb250ZW50TW9kZWxFbGVtZW50ID0gZ2V0RG9tSGVscGVyKCkuZ2V0Q29udGVudE1vZGVsRnJvbVBhcmVudChlbGVtZW50KTsgICAgCi0gICAgICBTdHJpbmcgYmFzZVR5cGUgPSBnZXREb21IZWxwZXIoKS5nZXRCYXNlVHlwZShjb250ZW50TW9kZWxFbGVtZW50KTsKLSAgICAKLSAgICAgIGRlcml2ZWRCeUNvbWJvLnNldFRleHQoZ2V0RG9tSGVscGVyKCkuZ2V0RGVyaXZlZEJ5TmFtZShjb250ZW50TW9kZWxFbGVtZW50KSk7Ci0KLSAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBiYXNlVHlwZUNvbWJvLnNldFRleHQoYmFzZVR5cGUpOwotICAgICAgfQotICAgIH0JICAKLQkgIAotCSAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQkKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldElucHV0KCk7Ci0gICAgRWxlbWVudCBjdEVsZW1lbnQgPSB4c2RDb21wbGV4VHlwZS5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJ1dHRvbikKLSAgICB7Ci0JICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkgICAgaWYgKHhzZENvbXBsZXhUeXBlLmdldENvbnRlbnQoKSAhPSBudWxsKQotCSAgICB7Ci0gIAkgICAgZWxlbWVudCA9ICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldElucHV0KCkpLmdldENvbnRlbnQoKS5nZXRFbGVtZW50KCk7Ci0JICAgIH0KLQkgICAgCi0vLwkgICAgU2ltcGxlQ29udGVudEJhc2VUeXBlT3B0aW9uc0RpYWxvZyBkaWFsb2cgPSBuZXcgU2ltcGxlQ29udGVudEJhc2VUeXBlT3B0aW9uc0RpYWxvZyhzaGVsbCwgZWxlbWVudCwgQkFTRV9UWVBFX0lELCAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWdldElucHV0KCkpLmdldFNjaGVtYSgpKTsKLS8vCSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0vLwkgICAgZGlhbG9nLmNyZWF0ZSgpOwotLy8JICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotICAgICAgICAKLSAgICAgICAgSUZpbGUgY3VycmVudElGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotICAgICAgICAgICAgc2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQpLmdldFNjaGVtYSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBYU0RDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG5ldyBYU0RDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihjdXJyZW50SUZpbGUsIHNjaGVtYSk7Ci0gICAgICAgIFhTRENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCAiU2V0IFR5cGUiLCBwcm92aWRlcik7ICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBUaGlzCi0gICAgICAgIHByb3ZpZGVyLnNldERpYWxvZyhkaWFsb2cpOwotICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0gICAKLQkgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0JICAgIHsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IGRpYWxvZy5nZXRTZWxlY3Rpb24oKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIFhTRFNldFR5cGVIZWxwZXIgaGVscGVyID0gbmV3IFhTRFNldFR5cGVIZWxwZXIoY3VycmVudElGaWxlLCBzY2hlbWEpOwotICAgICAgICAgICAgaGVscGVyLmFkZEltcG9ydElmTmVjZXNzYXJ5KGVsZW1lbnQsIHNwZWMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgdHlwZVN0cmluZyA9IGhlbHBlci5nZXRQcmVmaXhlZFR5cGVOYW1lKHNwZWMpOwotICAgICAgICAgICAgU3RyaW5nIGRlcml2ZWRCeSA9IGdldERvbUhlbHBlcigpLmdldERlcml2ZWRCeU5hbWUoZWxlbWVudCk7Ci0gICAgICAgICAgICBTZXRCYXNlVHlwZUFjdGlvbiBzZXRCYXNlVHlwZUFjdGlvbiA9IG5ldyBTZXRCYXNlVHlwZUFjdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfU0VUX0JBU0VfVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc2V0QmFzZVR5cGVBY3Rpb24uc2V0WFNEU2NoZW1hKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgICBzZXRCYXNlVHlwZUFjdGlvbi5zZXRDb21wbGV4VHlwZUVsZW1lbnQoY3RFbGVtZW50KTsKLSAgICAgICAgICAgIHNldEJhc2VUeXBlQWN0aW9uLnNldFR5cGUodHlwZVN0cmluZyk7Ci0gICAgICAgICAgICBzZXRCYXNlVHlwZUFjdGlvbi5zZXREZXJpdmVkQnkoZGVyaXZlZEJ5KTsKLSAgICAgICAgICAgIHNldEJhc2VUeXBlQWN0aW9uLnBlcmZvcm1BY3Rpb24oKTsKLQotCSAgICB9Ci0KLS8vICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBkZXJpdmVkQnlDb21ibykKLSAgICB7Ci0gICAgICBFbGVtZW50IGNvbnRlbnRNb2RlbEVsZW1lbnQgPSBnZXREb21IZWxwZXIoKS5nZXRDb250ZW50TW9kZWxGcm9tUGFyZW50KGN0RWxlbWVudCk7Ci0gICAgICBTdHJpbmcgYmFzZVR5cGUgPSBnZXREb21IZWxwZXIoKS5nZXRCYXNlVHlwZShjb250ZW50TW9kZWxFbGVtZW50KTsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ERVJJVkVEQllfQ0hBTkdFIiksIGN0RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5RWxlbSA9IGdldERvbUhlbHBlcigpLmdldERlcml2ZWRCeUVsZW1lbnQoY3RFbGVtZW50KTsKLSAgICAgIGlmIChjb250ZW50TW9kZWxFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdldERvbUhlbHBlcigpLmNoYW5nZURlcml2ZWRCeVR5cGUoY29udGVudE1vZGVsRWxlbWVudCwgZGVyaXZlZEJ5Q29tYm8uZ2V0VGV4dCgpLCBiYXNlVHlwZSk7Ci0gICAgICB9Ci0gICAgICBlbmRSZWNvcmRpbmcoY3RFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbXBsZXhUeXBlU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29tcGxleFR5cGVTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFkNzcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29tcGxleFR5cGVTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGV4VHlwZVNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQ29tcGxleFR5cGVTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlU2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54c2RlZGl0b3Iuc2VjdGlvbi5uYW1lIjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudW1lcmF0aW9uc1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW51bWVyYXRpb25zU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmRkMmRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW51bWVyYXRpb25zU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS52aWV3ZXJzLk5hdmlnYWJsZVRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRFbnVtc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuRE9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RWYXJpZXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uc1NlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJpdmF0ZSBFbnVtZXJhdGlvbnNUYWJsZVZpZXdlciBlbnVtZXJhdGlvbnNUYWJsZTsKLSAgcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotICBwcml2YXRlIEJ1dHRvbiBhZGRNYW55QnV0dG9uOwotICBwcml2YXRlIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0gIAotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgRW51bWVyYXRpb25zU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZ2V0SW5wdXQoKTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBzdC5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbiB8fCBlLndpZGdldCA9PSBhZGRNYW55QnV0dG9uKQotICAgIHsKLSAgICAgIFhTRERPTUhlbHBlciBoZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICAKLSAgICAgIGludCB2YXJpZXR5ID0gc3QuZ2V0VmFyaWV0eSgpLmdldFZhbHVlKCk7Ci0gICAgICBOb2RlIHZhcmlldHlFbGVtZW50ID0gbnVsbDsKLSAgICAgIGlmICh2YXJpZXR5ID09IFhTRFZhcmlldHkuQVRPTUlDKQotICAgICAgewotICAgICAgICB2YXJpZXR5RWxlbWVudCA9IGhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHZhcmlldHkgPT0gWFNEVmFyaWV0eS5VTklPTikKLSAgICAgIHsKLSAgICAgICAgdmFyaWV0eUVsZW1lbnQgPSBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh2YXJpZXR5ID09IFhTRFZhcmlldHkuTElTVCkKLSAgICAgIHsKLSAgICAgICAgdmFyaWV0eUVsZW1lbnQgPSBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHKTsKLSAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgaWYgKHZhcmlldHlFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChlLndpZGdldCA9PSBhZGRCdXR0b24pCi0gICAgICAgIHsKLSAgICAgICAgICBqYXZhLnV0aWwuTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIAotICAgICAgICAgIExpc3QgZW51bUxpc3QgPSBzdC5nZXRFbnVtZXJhdGlvbkZhY2V0cygpOwotICAgICAgICAgIFN0cmluZ0J1ZmZlciBuZXdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigidmFsdWUxIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpbnQgc3VmZml4ID0gMTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbnVtTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVudW1lcmF0aW9uRmFjZXQgZW51bUZhY2V0ID0gKFhTREVudW1lcmF0aW9uRmFjZXQpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhuZXdOYW1lLnRvU3RyaW5nKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VmZml4Kys7Ci0gICAgICAgICAgICAgICAgbmV3TmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoInZhbHVlIiArIFN0cmluZy52YWx1ZU9mKHN1ZmZpeCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVkFMVUVfQVRUUklCVVRFLCBuZXdOYW1lLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9FTlVNIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGdldE5ld0VsZW1lbnRBY3Rpb24oWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9FTlVNIiksIGF0dHJpYnV0ZXMsIChFbGVtZW50KXZhcmlldHlFbGVtZW50LCBudWxsKTsKLSAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgc3Quc2V0RWxlbWVudChlbGVtZW50KTsKLQotICAgICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgICBlbnVtZXJhdGlvbnNUYWJsZS5yZWZyZXNoKCk7Ci0gICAgICAgICAgaW50IG5ld0l0ZW1JbmRleCA9IGVudW1lcmF0aW9uc1RhYmxlLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxOwotICAgICAgICAgIGVudW1lcmF0aW9uc1RhYmxlLmVkaXRFbGVtZW50KGVudW1lcmF0aW9uc1RhYmxlLmdldEVsZW1lbnRBdChuZXdJdGVtSW5kZXgpLCAwKTsKLSAgICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBhZGRNYW55QnV0dG9uKQotICAgICAgICB7Ci0gICAgICAgICAgQWRkRW51bXNBY3Rpb24gYWN0aW9uID0gbmV3IEFkZEVudW1zQWN0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0VOVU1TIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYWN0aW9uLnNldEVsZW1lbnRUYWcoWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgICBhY3Rpb24uc2V0QXR0cmlidXRlcyhudWxsKTsKLSAgICAgICAgICBhY3Rpb24uc2V0UGFyZW50Tm9kZSgoRWxlbWVudCl2YXJpZXR5RWxlbWVudCk7Ci0gICAgICAgICAgYWN0aW9uLnNldFJlbGF0aXZlTm9kZShudWxsKTsKLSAgICAgICAgICBhY3Rpb24uc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VOVU1FUkFUSU9OU19ESUFMT0dfVElUTEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgc3Quc2V0RWxlbWVudChlbGVtZW50KTsKLSAgICAgICAgICBlbnVtZXJhdGlvbnNUYWJsZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVsZXRlQnV0dG9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pZW51bWVyYXRpb25zVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT04iKSwgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldClvYmo7Ci0gICAgCi0gICAgICAgICAgICAgIC8vIEkgaGF2ZSB0byB1cGRhdGUgdXNpbmcgRE9NCi0gICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShlbnVtRmFjZXQuZ2V0RWxlbWVudCgpKTsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVudW1lcmF0aW9uc1RhYmxlLnJlZnJlc2goKTsKLSAgICAgICAgc3Quc2V0RWxlbWVudChlbGVtZW50KTsKLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBlbnVtZXJhdGlvbnNUYWJsZS5nZXRUYWJsZSgpKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pZW51bWVyYXRpb25zVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIAotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCi0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgRm9ybURhdGEgZGF0YTsKLSAgICAKLSAgICBHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotICAgIFBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQoIiAgIiArIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFX0lOQ0xVREUiKSArICIgICIpOyAvLyROT04tTkxTLTEkCi0gICAgZ2MuZGlzcG9zZSgpOwotCi0gICAgZW51bWVyYXRpb25zVGFibGUgPSBuZXcgRW51bWVyYXRpb25zVGFibGVWaWV3ZXIoZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKSk7Ci0gICAgZW51bWVyYXRpb25zVGFibGUuc2V0SW5wdXQoZ2V0SW5wdXQoKSk7Ci0gICAgVGFibGUgdGFibGUgPSBlbnVtZXJhdGlvbnNUYWJsZS5nZXRUYWJsZSgpOwotICAgIHRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIGFkZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwiKSwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0gICAgYWRkTWFueUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwiKSArICIuLi4iLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLSAgICBkZWxldGVCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEVfSU5DTFVERSIpLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQotICAgIEZvcm1EYXRhIGRhdGEyID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YTIudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGEyLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTAwKTsKLSAgICBkYXRhMi5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotLy8gICAgZGF0YTIud2lkdGggPSA1MDsKLSAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChhZGRCdXR0b24sIDAsIFNXVC5MRUZUKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwKTsKLSAgICBhZGRNYW55QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYWRkTWFueUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwLCBTV1QuTEVGVCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZE1hbnlCdXR0b24sIDApOwotICAgIGRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwKTsKLSAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIGRhdGEud2lkdGggPSB0YWJsZU1pbmltdW1XaWR0aDsKLSAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHRhYmxlLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHRoaXMpOwotICB9Ci0gIAotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIE9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0gICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWlucHV0OwotICAgIEVsZW1lbnQgZWxlbWVudCA9IHN0LmdldEVsZW1lbnQoKTsKLSAgICBYU0RET01IZWxwZXIgaGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgIE5vZGUgcmVzdHJpY3Rpb25FbGVtZW50ID0gaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpOwotICAgIAotICAgIEl0ZXJhdG9yIHZhbGlkRmFjZXRzID0gc3QuZ2V0VmFsaWRGYWNldHMoKS5pdGVyYXRvcigpOwotICAgIAotICAgIGJvb2xlYW4gaXNBcHBsaWNhYmxlID0gZmFsc2U7Ci0gICAgd2hpbGUgKHZhbGlkRmFjZXRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYVZhbGlkRmFjZXQgPSAoU3RyaW5nKXZhbGlkRmFjZXRzLm5leHQoKTsKLSAgICAgIGlmIChhVmFsaWRGYWNldC5lcXVhbHMoWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgIHsKLSAgICAgICAgaXNBcHBsaWNhYmxlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGlzQXBwbGljYWJsZSkgIAotLy8gICAgaWYgKHJlc3RyaWN0aW9uRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgYWRkTWFueUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgYWRkTWFueUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZW51bWVyYXRpb25zVGFibGUuc2V0SW5wdXQoaW5wdXQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBUYWJsZSB0YWJsZSA9IGVudW1lcmF0aW9uc1RhYmxlLmdldFRhYmxlKCk7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULlJlc2l6ZSAmJiBldmVudC53aWRnZXQgPT0gdGFibGUpCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRXaWR0aCh0YWJsZS5nZXRTaXplKCkueCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAKLSAgY2xhc3MgRW51bWVyYXRpb25zVGFibGVWaWV3ZXIgZXh0ZW5kcyBOYXZpZ2FibGVUYWJsZVZpZXdlciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIKLSAgewotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzID0ge1hTRENvbnN0YW50cy5FTlVNRVJBVElPTl9FTEVNRU5UX1RBR307Ci0KLSAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzOwotCi0gICAgVGFibGUgdGFibGU7Ci0gICAgCi0gICAgcHVibGljIEVudW1lcmF0aW9uc1RhYmxlVmlld2VyKFRhYmxlIHRhYmxlKQotICAgIHsKLSAgICAgIHN1cGVyKHRhYmxlKTsKLSAgICAgIHRhYmxlID0gZ2V0VGFibGUoKTsKLQotICAgICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgCi0gICAgICBzZXRDb250ZW50UHJvdmlkZXIobmV3IEVudW1lcmF0aW9uc1RhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgc2V0TGFiZWxQcm92aWRlcihuZXcgRW51bWVyYXRpb25zVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotICAgICAgc2V0Q2VsbE1vZGlmaWVyKHRoaXMpOwotCi0gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCAwKTsKLSAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNbMF0pOwotICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICBjb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotIAotICAgICAgY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclsxXTsKLQotICAgICAgVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICBDb2x1bW5XZWlnaHREYXRhIGRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDApOwotCi0gICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhKTsKLSAgICAgIGNlbGxFZGl0b3JzWzBdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQotICAgICAgZ2V0VGFibGUoKS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgIHNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlSXRlbSAmJiAodmFsdWUgIT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSllbGVtZW50OwotICAgICAgICAKLSAgICAgICAgRWxlbWVudCBzaW1wbGVUeXBlRWxlbWVudCA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZ2V0SW5wdXQoKSkuZ2V0RWxlbWVudCgpOwotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRU5VTV9WQUxVRV9DSEFOR0UiKSwgc2ltcGxlVHlwZUVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KWl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICBlbnVtRmFjZXQuc2V0TGV4aWNhbFZhbHVlKChTdHJpbmcpdmFsdWUpOwotICAgICAgICBpdGVtLnNldERhdGEoZW51bUZhY2V0KTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KChTdHJpbmcpdmFsdWUpOwotICAgICAgICBlbmRSZWNvcmRpbmcoc2ltcGxlVHlwZUVsZW1lbnQpOwotICAgICAgfQotICAgIH0gICAgCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KWVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGVudW1GYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gIH0KLSAgICAKLSAgY2xhc3MgRW51bWVyYXRpb25zVGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsKLSAgICAgIGphdmEudXRpbC5MaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWlucHV0RWxlbWVudDsKLSAgICAgICAgcmV0dXJuIHN0LmdldEVudW1lcmF0aW9uRmFjZXRzKCkudG9BcnJheSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBFbnVtZXJhdGlvbnNUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHVibGljIEVudW1lcmF0aW9uc1RhYmxlTGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZUVudW0uZ2lmIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCllbGVtZW50OwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB2YWx1ZSA9ICIiOwotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnVtZXJhdGlvbnNTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnVtZXJhdGlvbnNTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjhhYTY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW51bWVyYXRpb25zU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbnNTZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IKLXsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgRW51bWVyYXRpb25zU2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhzZGVkaXRvci5zZWN0aW9uLmVudW1lcmF0aW9ucyI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uLmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBuZXcgRW51bWVyYXRpb25zU2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5lbnVtZXJhdGlvbnMiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgLy8gcmV0dXJuIGZhbHNlOyAgLy8gdHVybiBvZmYgdGhpcyB0YWIKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9GYWNldFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9GYWNldFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWM2NTRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRmFjZXRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLldpbmRvd1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS52aWV3ZXJzLk5hdmlnYWJsZVRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5ET01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbnN0cmFpbmluZ0ZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhFeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heEluY2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5FeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkluY2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRmFjZXRWaWV3ZXIgZXh0ZW5kcyBOYXZpZ2FibGVUYWJsZVZpZXdlciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfTkFNRSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9GQUNFVF9OQU1FIik7ICAvLyAiTmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1ZBTFVFID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZBQ0VUX1ZBTFVFIik7IC8vICJWYWx1ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX09USEVSID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZBQ0VUX0ZJWEVEIik7IC8vICJGaXhlZCI7Ci0KLSAgcHJvdGVjdGVkIEZhY2V0c1RhYmxlTGFiZWxQcm92aWRlciBmYWNldHNUYWJsZUxhYmVsUHJvdmlkZXIgPSBuZXcgRmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0gIHByb3RlY3RlZCBGYWNldHNUYWJsZUNvbnRlbnRQcm92aWRlciBmYWNldHNUYWJsZUNvbnRlbnRQcm92aWRlciA9IG5ldyBGYWNldHNUYWJsZUNvbnRlbnRQcm92aWRlcigpOwotICBwcm90ZWN0ZWQgU3RyaW5nW10gY29sdW1uUHJvcGVydGllcyA9IHtGQUNFVF9OQU1FLCBGQUNFVF9WQUxVRSwgRkFDRVRfT1RIRVJ9OwotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzOyAgICAvLyB0aGVzZSBjZWxsRWRpdG9ycyBhcmUgdXNlZCB3aGVuIG5vbi13aGl0ZXNwYWNlIGZhY2V0IGlzIHNlbGVjdGVkCi0gIHByb3RlY3RlZCBDZWxsRWRpdG9yW10gYWx0Q2VsbEVkaXRvcnM7IC8vIHRoZXNlIGNlbGxFZGl0b3JzIGFyZSB1c2VkIHdoZW4gd2hpdGVzcGFjZSBmYWNldCBpcyBzZWxlY3RlZAotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBbXSB3aGl0ZVNwYWNlVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsiIiwgInByZXNlcnZlIiwgInJlcGxhY2UiLCAiY29sbGFwc2UiIH07Ci0gIHByb3RlY3RlZCBTdHJpbmcgW10gdHJ1ZUZhbHNlVmFsdWVzID0gbmV3IFN0cmluZyBbXSB7IiIsICJmYWxzZSIsICJ0cnVlIiB9OyAKLSAgcHJvdGVjdGVkIEZhY2V0c1NlY3Rpb24gZmFjZXRzU2VjdGlvbjsKLSAgLyoqCi0gICAqIEBwYXJhbSBwYXJlbnQKLSAgICovCi0gIHB1YmxpYyBGYWNldFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBGYWNldHNTZWN0aW9uIGZhY2V0c1NlY3Rpb24pCi0gIHsKLSAgICBzdXBlcihuZXcgVGFibGUocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuU0lOR0xFKSk7Ci0gICAgdGhpcy5mYWNldHNTZWN0aW9uID0gZmFjZXRzU2VjdGlvbjsKLSAgICAKLSAgICBnZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICBnZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLSAgICBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLSAgICBnZXRUYWJsZSgpLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTXlNb3VzZVRyYWNrTGlzdGVuZXIoKSk7Ci0gICAgCi0gICAgc2V0Q29udGVudFByb3ZpZGVyKGZhY2V0c1RhYmxlQ29udGVudFByb3ZpZGVyKTsKLSAgICBzZXRMYWJlbFByb3ZpZGVyKGZhY2V0c1RhYmxlTGFiZWxQcm92aWRlcik7Ci0gICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotICAgIHNldENlbGxNb2RpZmllcih0aGlzKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihnZXRUYWJsZSgpLCBTV1QuTk9ORSwgaSk7Ci0gICAgICBjb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLSAgICAgIGNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotICAgICAgY29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclszXTsKLSAgICBhbHRDZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzNdOwotCi0gICAgVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNjAsIDEyMCwgdHJ1ZSk7Ci0gICAgbGF5b3V0LmFkZENvbHVtbkRhdGEoZGF0YSk7Ci0gICAgY2VsbEVkaXRvcnNbMF0gPSBudWxsOwotCi0gICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhMiA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEyMCwgMTAwLCB0cnVlKTsKLSAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhMik7Ci0KLSAgICBjZWxsRWRpdG9yc1sxXSA9IG5ldyBUZXh0Q2VsbEVkaXRvcihnZXRUYWJsZSgpKTsKLSAgICBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvciBwZCA9IG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigiY29tYm8iLCAid2hpdGVzcGFjZSIsIHdoaXRlU3BhY2VWYWx1ZXMpOwotICAgIGFsdENlbGxFZGl0b3JzWzFdID0gcGQuY3JlYXRlUHJvcGVydHlFZGl0b3IoZ2V0VGFibGUoKSk7Ci0KLSAgICBDb2x1bW5XZWlnaHREYXRhIGRhdGEzID0gbmV3IENvbHVtbldlaWdodERhdGEoNjAsIDgwLCB0cnVlKTsKLSAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhMyk7Ci0KLSAgICBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvciBwZDIgPSBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoImNvbWJvIiwgIm90aGVyIiwgdHJ1ZUZhbHNlVmFsdWVzKTsKLSAgICBjZWxsRWRpdG9yc1syXSA9IHBkMi5jcmVhdGVQcm9wZXJ0eUVkaXRvcihnZXRUYWJsZSgpKTsKLSAgICBhbHRDZWxsRWRpdG9yc1syXSA9IHBkMi5jcmVhdGVQcm9wZXJ0eUVkaXRvcihnZXRUYWJsZSgpKTsKLQotICAgIGdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjY2FuTW9kaWZ5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJldHVybiBwcm9wZXJ0eS5lcXVhbHMoRkFDRVRfVkFMVUUpIHx8IHByb3BlcnR5LmVxdWFscyhGQUNFVF9PVEhFUik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpbnQgY29sdW1uID0gMDsKLSAgICBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMF0pKQotICAgIHsKLSAgICAgIGNvbHVtbiA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzFdKSkKLSAgICB7Ci0gICAgICBjb2x1bW4gPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoY29sdW1uUHJvcGVydGllc1syXSkpCi0gICAgewotICAgICAgY29sdW1uID0gMjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoZWxlbWVudCwgY29sdW1uKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjbW9kaWZ5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilnZXRJbnB1dCgpOwotICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSllbGVtZW50OwotICAgIGlmIChpdGVtICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpdGVtLmdldERhdGEoKTsKLSAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGZhY2V0ID0gKFN0cmluZylvOwotICAgICAgICAgCi0gICAgICAgICAgRWxlbWVudCBzaW1wbGVUeXBlRWxlbWVudCA9IHhzZFNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIFhTRERPTUhlbHBlciB4c2RET01IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICAgICAgRWxlbWVudCBkZXJpdmVkQnlFbGVtZW50ID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnQoc2ltcGxlVHlwZUVsZW1lbnQpOwotCi0gICAgICAgICAgZmFjZXRzU2VjdGlvbi5iZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRkFDRVRfQ0hBTkdFIiksIHNpbXBsZVR5cGVFbGVtZW50KTsKLQotICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBzaW1wbGVUeXBlRWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgICAgICBwcmVmaXggPSAocHJlZml4ID09IG51bGwpID8gIiIgOiAocHJlZml4ICsgIjoiKTsKLSAgICAgICAgICAKLSAgICAgICAgICBFbGVtZW50IGNoaWxkTm9kZUVsZW1lbnQgPSBudWxsOwotICAgICAgICAgIERPTUF0dHJpYnV0ZSB2YWx1ZUF0dHIgPSBudWxsOwotCi0gICAgICAgICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgdGFyZ2V0RmFjZXQgPSBnZXRYU0RDb25zdHJhaW5pbmdGYWNldChmYWNldCk7Ci0KLSAgICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSAiIjsKLSAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXdWYWx1ZSA9IChTdHJpbmcpdmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoY29sdW1uUHJvcGVydGllc1sxXSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHRhcmdldEZhY2V0ID09IG51bGwgJiYgbmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0YXJnZXRGYWNldCA9IGNyZWF0ZUZhY2V0KGZhY2V0KTsKLSAgICAgICAgICAgICAgY2hpbGROb2RlRWxlbWVudCA9IChkZXJpdmVkQnlFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgcHJlZml4ICsgZmFjZXQpOwotICAgICAgICAgICAgICB2YWx1ZUF0dHIgPSBuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgY2hpbGROb2RlRWxlbWVudC5zZXRBdHRyaWJ1dGUodmFsdWVBdHRyLmdldE5hbWUoKSwgdmFsdWVBdHRyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAvLyBhZGQgYW5kIGZvcm1hdCBjaGlsZAotICAgICAgICAgICAgICBkZXJpdmVkQnlFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkTm9kZUVsZW1lbnQpOwotICAgICAgICAgICAgICB0YXJnZXRGYWNldC5zZXRFbGVtZW50KGNoaWxkTm9kZUVsZW1lbnQpOwotICAgICAgICAgICAgICBYU0RET01IZWxwZXIuZm9ybWF0Q2hpbGQoY2hpbGROb2RlRWxlbWVudCk7Ci0KLS8vICAgICAgICAgICAgICBYU0RTY2hlbWFIZWxwZXIudXBkYXRlRWxlbWVudCh4c2RTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmYWNldHNTZWN0aW9uLmVuZFJlY29yZGluZyhzaW1wbGVUeXBlRWxlbWVudCk7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQuc2V0TGV4aWNhbFZhbHVlKG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1heEZhY2V0IHx8IHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWluRmFjZXQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnRGYWNldCA9IHRhcmdldEZhY2V0LmdldEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1heEZhY2V0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1heEV4Y2x1c2l2ZUZhY2V0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYU0RNYXhJbmNsdXNpdmVGYWNldCB4c2RNYXhJbmNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhzZE1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHhzZE1heEluY2x1c2l2ZUZhY2V0RWxlbWVudCA9IHhzZE1heEluY2x1c2l2ZUZhY2V0LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoeHNkTWF4SW5jbHVzaXZlRmFjZXRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNYXhJbmNsdXNpdmVGYWNldCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWFNETWF4RXhjbHVzaXZlRmFjZXQgeHNkTWF4RXhjbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1heEV4Y2x1c2l2ZUZhY2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4c2RNYXhFeGNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB4c2RNYXhFeGNsdXNpdmVGYWNldEVsZW1lbnQgPSB4c2RNYXhFeGNsdXNpdmVGYWNldC5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHhzZE1heEV4Y2x1c2l2ZUZhY2V0RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNaW5GYWNldCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNaW5FeGNsdXNpdmVGYWNldCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWFNETWluSW5jbHVzaXZlRmFjZXQgeHNkTWluSW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4c2RNaW5JbmNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB4c2RNaW5JbmNsdXNpdmVGYWNldEVsZW1lbnQgPSB4c2RNaW5JbmNsdXNpdmVGYWNldC5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHhzZE1pbkluY2x1c2l2ZUZhY2V0RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWluSW5jbHVzaXZlRmFjZXQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhTRE1pbkV4Y2x1c2l2ZUZhY2V0IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNaW5FeGNsdXNpdmVGYWNldCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoeHNkTWluRXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgeHNkTWluRXhjbHVzaXZlRmFjZXRFbGVtZW50ID0geHNkTWluRXhjbHVzaXZlRmFjZXQuZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh4c2RNaW5FeGNsdXNpdmVGYWNldEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8vIG5ld1ZhbHVlLmxlbmd0aCA9PSAwCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVsZW1lbnQgdGFyZ2V0RmFjZXRFbGVtZW50ID0gdGFyZ2V0RmFjZXQuZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UodGFyZ2V0RmFjZXRFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMl0pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQuZ2V0RWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB4c2RTaW1wbGVUeXBlLnNldEVsZW1lbnQoc2ltcGxlVHlwZUVsZW1lbnQpOwotICAgICAgICAgIC8veHNkU2ltcGxlVHlwZS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgICAgZmFjZXRzU2VjdGlvbi5lbmRSZWNvcmRpbmcoc2ltcGxlVHlwZUVsZW1lbnQpOwotICAgICAgICAgIHJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIAotICBwcml2YXRlIFhTRENvbnN0cmFpbmluZ0ZhY2V0IGdldFhTRENvbnN0cmFpbmluZ0ZhY2V0KFN0cmluZyBmYWNldFN0cmluZykKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZ2V0SW5wdXQoKTsKLSAgICBMaXN0IGxpc3QgPSB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKTsKLSAgICBpZiAobGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOwotICAgIFhTRENvbnN0cmFpbmluZ0ZhY2V0IHRhcmdldEZhY2V0ID0gbnVsbDsKLSAgICAKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgeHNkQ29uc3RyYWluaW5nRmFjZXQgPSAoWFNEQ29uc3RyYWluaW5nRmFjZXQpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAoeHNkQ29uc3RyYWluaW5nRmFjZXQuZ2V0RmFjZXROYW1lKCkuZXF1YWxzKGZhY2V0U3RyaW5nKSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0RmFjZXQgPSB4c2RDb25zdHJhaW5pbmdGYWNldDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0YXJnZXRGYWNldDsKLSAgfQotCi0gIHByaXZhdGUgWFNEQ29uc3RyYWluaW5nRmFjZXQgY3JlYXRlRmFjZXQoU3RyaW5nIGZhY2V0KQotICB7Ci0gICAgWFNERmFjdG9yeUltcGwgZmFjdG9yeSA9IG5ldyBYU0RGYWN0b3J5SW1wbCgpOwotICAgIFhTRENvbnN0cmFpbmluZ0ZhY2V0IHhzZEZhY2V0ID0gbnVsbDsKLSAgICBpZiAoZmFjZXQuZXF1YWxzKCJsZW5ndGgiKSkgeyB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETGVuZ3RoRmFjZXQoKTsgfQotICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWluTGVuZ3RoIikpIHsgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1pbkxlbmd0aEZhY2V0KCk7IH0KLSAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heExlbmd0aCIpKSB7IHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RNYXhMZW5ndGhGYWNldCgpOyB9Ci0KLSAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1pbkluY2x1c2l2ZSIpKSB7IHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RNaW5JbmNsdXNpdmVGYWNldCgpOyB9Ci0gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5FeGNsdXNpdmUiKSkgeyB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETWluRXhjbHVzaXZlRmFjZXQoKTsgfQotCi0gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtYXhJbmNsdXNpdmUiKSkgeyB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETWF4SW5jbHVzaXZlRmFjZXQoKTsgfQotICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4RXhjbHVzaXZlIikpIHsgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1heEV4Y2x1c2l2ZUZhY2V0KCk7IH0KLQotICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygidG90YWxEaWdpdHMiKSkgeyB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNEVG90YWxEaWdpdHNGYWNldCgpOyB9Ci0gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJmcmFjdGlvbkRpZ2l0cyIpKSB7IHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0KCk7IH0KLQotICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygid2hpdGVTcGFjZSIpKSAgIHsgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRFdoaXRlU3BhY2VGYWNldCgpOyB9Ci0KLSAgICByZXR1cm4geHNkRmFjZXQ7Ci0gIH0KLQotIC8qKgotICAqIEdldCB0aGUgdG9vbHRpcCBmb3IgdGhlIGZhY2V0Ci0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcChTdHJpbmcgZmFjZXQpCi0gIHsKLSAgICBTdHJpbmcga2V5ID0gIiI7Ci0gICAgaWYgKGZhY2V0LmVxdWFscygibGVuZ3RoIikpIHsga2V5ID0gIl9VSV9UT09MVElQX0xFTkdUSCI7IH0KLSAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1pbkxlbmd0aCIpKSB7IGtleSA9ICJfVUlfVE9PTFRJUF9NSU5fTEVOIjsgfQotICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4TGVuZ3RoIikpIHsga2V5ID0gIl9VSV9UT09MVElQX01BWF9MRU4iOyB9Ci0KLSAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1pbkluY2x1c2l2ZSIpKSB7IGtleSA9ICJfVUlfVE9PTFRJUF9NSU5fSU5DTFVTSVZFIjsgfQotICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWluRXhjbHVzaXZlIikpIHsga2V5ID0gIl9VSV9UT09MVElQX01JTl9FWENMVVNJVkUiOyB9Ci0KLSAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heEluY2x1c2l2ZSIpKSB7IGtleSA9ICJfVUlfVE9PTFRJUF9NQVhfSU5DTFVTSVZFIjsgfQotICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4RXhjbHVzaXZlIikpIHsga2V5ID0gIl9VSV9UT09MVElQX01BWF9FWENMVVNJVkUiOyB9Ci0KLSAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoInRvdGFsRGlnaXRzIikpICAgeyBrZXkgPSAiX1VJX1RPT0xUSVBfVE9UQUxfRElHSVRTIjsgfQotICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkgeyBrZXkgPSAiX1VJX1RPT0xUSVBfRlJBQ1RJT05fRElHSVRTIjsgfQotCi0gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpICAgeyBrZXkgPSAiX1VJX1RPT0xUSVBfV0hJVEVfU1BBQ0UiOyB9Ci0KLSAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoa2V5KSA6ICIiOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBsaXN0ZW5lciBkZXRlY3RzIHdoaWNoIHJvdyBpcyBzZWxlY3RlZCBhbmQgYWRkIGEgdG9vbCB0aXAgZm9yIHRoYXQgcm93Ci0gICAqLwotICBwdWJsaWMgY2xhc3MgTXlNb3VzZVRyYWNrTGlzdGVuZXIgZXh0ZW5kcyBNb3VzZVRyYWNrQWRhcHRlcgotICB7Ci0gICAgcHVibGljIHZvaWQgbW91c2VIb3ZlcihNb3VzZUV2ZW50IGUpCi0gICAgewotICAgICAgVGFibGVJdGVtIGl0ZW0gPSBnZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0gICAgICBpZiAoaXRlbSAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICBpZiAobyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGZhY2V0TmFtZSA9IChTdHJpbmcpbzsKLSAgICAgICAgICBnZXRUYWJsZSgpLnNldFRvb2xUaXBUZXh0KGdldFRvb2xUaXAoZmFjZXROYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQmFzZWQgb24gdGhlIHNlbGVjdGlvbiwgZGV0ZWN0cyBpZiBpdCBpcyBhIHdoaXRlIHNwYWNlIG9yIG5vdCwgYW5kIGFkZCB0aGUKLSAgICogY29ycmVzcG9uZGluZyBjZWxsIGVkaXRvcnMKLSAgICovCi0gIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IFdpbmRvd1V0aWxpdHkuZ2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBmYWNldCA9IChTdHJpbmcpbzsKLSAgICAgICAgaWYgKGZhY2V0LmVxdWFscygid2hpdGVTcGFjZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0Q2VsbEVkaXRvcnMoYWx0Q2VsbEVkaXRvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIAotICBjbGFzcyBGYWNldHNUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZhY2V0OwotICAgIAotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBYU0RET01IZWxwZXIgeHNkRG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotCi0gICAgICBTdHJpbmcgZmFjZXQgPSAiIjsKLSAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaW5wdXRYU0RTaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWlucHV0RWxlbWVudDsKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGJhc2UgPSBpbnB1dFhTRFNpbXBsZVR5cGUuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAKLSAgICAgIGlmIChiYXNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIHZhbGlkRmFjZXRzID0gYmFzZS5nZXRWYWxpZEZhY2V0cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlICh2YWxpZEZhY2V0cy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYVZhbGlkRmFjZXQgPSAoU3RyaW5nKXZhbGlkRmFjZXRzLm5leHQoKTsKLSAgICAgICAgICBpZiAoIShhVmFsaWRGYWNldC5lcXVhbHMoInBhdHRlcm4iKSB8fCBhVmFsaWRGYWNldC5lcXVhbHMoImVudW1lcmF0aW9uIikpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHYuYWRkKGFWYWxpZEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB2LnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgRmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgdGFyZ2V0RmFjZXQgPSBnZXRYU0RDb25zdHJhaW5pbmdGYWNldCgoU3RyaW5nKWVsZW1lbnQpOwotICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlID0gKFN0cmluZyllbGVtZW50OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmFsdWUgPSB0YXJnZXRGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRWxlbWVudCBlbGVtID0gdGFyZ2V0RmFjZXQuZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOyAKLSAgICAgIH0KLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRmFjZXRzU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9GYWNldHNTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTgwYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9GYWNldHNTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnZpZXdlcnMuTmF2aWdhYmxlVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkRPTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5SZWdleFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGF0dGVybkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBGYWNldHNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0gIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotICBGYWNldFZpZXdlciBmYWNldFZpZXdlcjsKLSAgCi0gIFhTRFdvcmtib29rIHdvcmtib29rOwotICBGYWNldHNXb3JrYm9va1BhZ2UgZmFjZXRzV29ya2Jvb2tQYWdlOwotLy8gSWYgeW91IHdhbnQgdG8gYWRkIHRoZSBlbnVtZXJhdGlvbnMgdGFiIHRvIHRoaXMgZmFjZXRzIHRhYgotLy8gIEVudW1zV29ya2Jvb2tQYWdlIGVudW1zV29ya2Jvb2tQYWdlOwotICBQYXR0ZXJuc1dvcmtib29rUGFnZSBwYXR0ZXJuc1dvcmtib29rUGFnZTsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgRmFjZXRzU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCi0gICAgd29ya2Jvb2sgPSBuZXcgWFNEV29ya2Jvb2socGFyZW50LCBTV1QuQk9UVE9NIHwgU1dULkZMQVQpOwotICAgIAotICAgIGZhY2V0c1dvcmtib29rUGFnZSA9IG5ldyBGYWNldHNXb3JrYm9va1BhZ2Uod29ya2Jvb2ssIHRoaXMpOwotLy8gICAgZW51bXNXb3JrYm9va1BhZ2UgPSBuZXcgRW51bXNXb3JrYm9va1BhZ2Uod29ya2Jvb2spOwotICAgIHBhdHRlcm5zV29ya2Jvb2tQYWdlID0gbmV3IFBhdHRlcm5zV29ya2Jvb2tQYWdlKHdvcmtib29rKTsKLSAgICBmYWNldHNXb3JrYm9va1BhZ2UuYWN0aXZhdGUoKTsKLS8vICAgIGVudW1zV29ya2Jvb2tQYWdlLmFjdGl2YXRlKCk7Ci0gICAgcGF0dGVybnNXb3JrYm9va1BhZ2UuYWN0aXZhdGUoKTsKLSAgICB3b3JrYm9vay5zZXRTZWxlY3RlZFBhZ2UoZmFjZXRzV29ya2Jvb2tQYWdlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHRoaXMucGFydCA9IHBhcnQ7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLSAgCi0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotICAgIAotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGZhY2V0Vmlld2VyLmdldENvbnRyb2woKS5nZXRQYXJlbnQoKS5zZXRFbmFibGVkKGZhbHNlKTsgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZhY2V0Vmlld2VyLmdldENvbnRyb2woKS5nZXRQYXJlbnQoKS5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIGlmIChmYWNldFZpZXdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGZhY2V0Vmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICB9Ci0gICAgCi0vLyAgICBpZiAoZW51bXNXb3JrYm9va1BhZ2UgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgZW51bXNXb3JrYm9va1BhZ2Uuc2V0SW5wdXQoaW5wdXQpOwotLy8gICAgfQotICAgIAotICAgIGlmIChwYXR0ZXJuc1dvcmtib29rUGFnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhdHRlcm5zV29ya2Jvb2tQYWdlLnNldElucHV0KGlucHV0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0KLSAgLyogR2VuZXJhbCBGYWNldHMgUGFnZSAqLwotICAKLSAgY2xhc3MgRmFjZXRzV29ya2Jvb2tQYWdlIGV4dGVuZHMgWFNEV29ya2Jvb2tQYWdlCi0gIHsKLSAgICBGYWNldHNTZWN0aW9uIGZhY2V0c1NlY3Rpb247Ci0gICAgQ29tcG9zaXRlIHBhZ2UxOwotICAgIAotICAgIHB1YmxpYyBGYWNldHNXb3JrYm9va1BhZ2UoWFNEV29ya2Jvb2sgd29ya2Jvb2ssIEZhY2V0c1NlY3Rpb24gZmFjZXRzU2VjdGlvbikKLSAgICB7Ci0gICAgICBzdXBlcih3b3JrYm9vayk7Ci0gICAgICB0aGlzLmdldFRhYkl0ZW0oKS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9GQUNFVFMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRoaXMuZmFjZXRzU2VjdGlvbiA9IGZhY2V0c1NlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbCAoQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICBwYWdlMSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgICBGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICAKLSAgICAgIGZhY2V0Vmlld2VyID0gbmV3IEZhY2V0Vmlld2VyKHBhZ2UxLCBmYWNldHNTZWN0aW9uKTsKLSAgICAgIGZhY2V0Vmlld2VyLnNldElucHV0KGdldElucHV0KCkpOwotICAgICAgZmFjZXRWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgIHJldHVybiBwYWdlMTsKLSAgICB9Ci0gIH0KLQotICAvKiBFbnVtZXJhdGlvbnMgUGFnZSAqLwotICAKLS8vICBjbGFzcyBFbnVtc1dvcmtib29rUGFnZSBleHRlbmRzIFhTRFdvcmtib29rUGFnZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0vLyAgewotLy8gICAgRW51bWVyYXRpb25zVGFibGVWaWV3ZXIgZW51bWVyYXRpb25zVGFibGU7Ci0vLyAgICBCdXR0b24gYWRkQnV0dG9uOwotLy8gICAgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLS8vICAgIAotLy8gICAgcHVibGljIEVudW1zV29ya2Jvb2tQYWdlKFhTRFdvcmtib29rIHdvcmtib29rKQotLy8gICAgewotLy8gICAgICBzdXBlcih3b3JrYm9vayk7Ci0vLyAgICAgIHRoaXMuZ2V0VGFiSXRlbSgpLnNldFRleHQoIkVudW1lcmF0aW9ucyIpOwotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2wgKENvbXBvc2l0ZSBwYXJlbnQpCi0vLyAgICB7Ci0vLyAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLS8vICAgICAgRm9ybURhdGEgZGF0YTsKLS8vICAgICAgCi0vLyAgICAgIGFkZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCAiQWRkIiwgU1dULlBVU0gpOwotLy8gICAgICBkZWxldGVCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIkRlbGV0ZSIsIFNXVC5QVVNIKTsKLS8vICAgICAgZW51bWVyYXRpb25zVGFibGUgPSBuZXcgRW51bWVyYXRpb25zVGFibGVWaWV3ZXIoZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKSk7Ci0vLyAgICAgIAotLy8gICAgICBlbnVtZXJhdGlvbnNUYWJsZS5zZXRJbnB1dChnZXRJbnB1dCgpKTsKLS8vICAgICAgVGFibGUgdGFibGUgPSBlbnVtZXJhdGlvbnNUYWJsZS5nZXRUYWJsZSgpOwotLy8gICAgICB0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLS8vCi0vLyAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLS8vICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGRlbGV0ZUJ1dHRvbiwgMCwgU1dULkxFRlQpOwotLy8gICAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0vLyAgICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotLy8gICAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChkZWxldGVCdXR0b24sIDApOyAvLy1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLS8vICAgICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0vLyAgICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLS8vICAgICAgCi0vLyAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLS8vICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRhYmxlLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0vLyAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLS8vICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwKTsKLS8vLy8gICAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChkZWxldGVCdXR0b24sICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLS8vICAgICAgZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0vLyAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLS8vICAgICAgZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotLy8gICAgICAKLS8vICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotLy8gICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0vLyAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoODUsIDApOwotLy8gICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLS8vICAgICAgZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLS8vICAgICAgdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLS8vICAgICAgCi0vLyAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0vLyAgICB9Ci0vLyAgICAKLS8vICAgIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkKLS8vICAgIHsKLS8vICAgICAgZW51bWVyYXRpb25zVGFibGUuc2V0SW5wdXQoaW5wdXQpOwotLy8gICAgfQotLy8gICAgCi0vLyAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotLy8gICAgewotLy8gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilnZXRJbnB1dCgpOwotLy8gICAgICBFbGVtZW50IGVsZW1lbnQgPSBzdC5nZXRFbGVtZW50KCk7Ci0vLyAgICAgIGlmIChlLndpZGdldCA9PSBhZGRCdXR0b24pCi0vLyAgICAgIHsKLS8vICAgICAgICBYU0RET01IZWxwZXIgaGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotLy8KLS8vICAgICAgICBpbnQgdmFyaWV0eSA9IHN0LmdldFZhcmlldHkoKS5nZXRWYWx1ZSgpOwotLy8gICAgICAgIE5vZGUgdmFyaWV0eUVsZW1lbnQgPSBudWxsOwotLy8gICAgICAgIGlmICh2YXJpZXR5ID09IFhTRFZhcmlldHkuQVRPTUlDKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHZhcmlldHlFbGVtZW50ID0gaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlIGlmICh2YXJpZXR5ID09IFhTRFZhcmlldHkuVU5JT04pCi0vLyAgICAgICAgewotLy8gICAgICAgICAgdmFyaWV0eUVsZW1lbnQgPSBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRyk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UgaWYgKHZhcmlldHkgPT0gWFNEVmFyaWV0eS5MSVNUKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHZhcmlldHlFbGVtZW50ID0gaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRyk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgICAgICAgIAotLy8gICAgICAgIGlmICh2YXJpZXR5RWxlbWVudCAhPSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGphdmEudXRpbC5MaXN0IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUsICIiKSk7Ci0vLyAgICAgICAgICBiZWdpblJlY29yZGluZygiQWRkIEVudW1lcmF0aW9uIiwgZWxlbWVudCk7Ci0vLyAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gZ2V0TmV3RWxlbWVudEFjdGlvbihYU0RDb25zdGFudHMuRU5VTUVSQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0VOVU0iKSwgYXR0cmlidXRlcywgKEVsZW1lbnQpdmFyaWV0eUVsZW1lbnQsIG51bGwpOwotLy8gICAgICAgICAgYWN0aW9uLnJ1bigpOwotLy8gICAgICAgICAgc3Quc2V0RWxlbWVudChlbGVtZW50KTsKLS8vCi0vLyAgICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0vLyAgICAgICAgICBlbnVtZXJhdGlvbnNUYWJsZS5yZWZyZXNoKCk7Ci0vLyAgICAgICAgICBhdHRyaWJ1dGVzID0gbnVsbDsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVsZXRlQnV0dG9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbillbnVtZXJhdGlvbnNUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLS8vICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgSXRlcmF0b3IgaSA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotLy8gICAgICAgICAgYmVnaW5SZWNvcmRpbmcoIkRlbGV0ZSBFbnVtZXJhdGlvbiIsIGVsZW1lbnQpOwotLy8gICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0vLyAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIFhTREVudW1lcmF0aW9uRmFjZXQgZW51bUZhY2V0ID0gKFhTREVudW1lcmF0aW9uRmFjZXQpb2JqOwotLy8gICAgICAKLS8vICAgICAgICAgICAgICAgIC8vIEkgaGF2ZSB0byB1cGRhdGUgdXNpbmcgRE9NCi0vLyAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoZW51bUZhY2V0LmdldEVsZW1lbnQoKSk7ICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVudW1lcmF0aW9uc1RhYmxlLnJlZnJlc2goKTsKLS8vICAgICAgICAgIHN0LnNldEVsZW1lbnQoZWxlbWVudCk7Ci0vLyAgICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGVudW1lcmF0aW9uc1RhYmxlLmdldFRhYmxlKCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKWVudW1lcmF0aW9uc1RhYmxlLmdldFNlbGVjdGlvbigpOwotLy8gICAgICAgIGlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbnVsbCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgCi0vLyAgICB9Ci0vLwotLy8gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0vLyAgICB7Ci0vLyAgICAgIAotLy8gICAgfQotLy8gIH0KLS8vICAKLS8vICBjbGFzcyBFbnVtZXJhdGlvbnNUYWJsZVZpZXdlciBleHRlbmRzIE5hdmlnYWJsZVRhYmxlVmlld2VyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllcgotLy8gIHsKLS8vICAgIHByb3RlY3RlZCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzID0geyJFbnVtZXJhdGlvbiJ9OwotLy8KLS8vICAgIHByb3RlY3RlZCBDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnM7Ci0vLwotLy8gICAgVGFibGUgdGFibGU7Ci0vLyAgICAKLS8vICAgIHB1YmxpYyBFbnVtZXJhdGlvbnNUYWJsZVZpZXdlcihUYWJsZSB0YWJsZSkKLS8vICAgIHsKLS8vICAgICAgc3VwZXIodGFibGUpOwotLy8gICAgICB0YWJsZSA9IGdldFRhYmxlKCk7Ci0vLyAgICAgIAotLy8gICAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0vLyAgICAgIAotLy8gICAgICBzZXRDb250ZW50UHJvdmlkZXIobmV3IEVudW1lcmF0aW9uc1RhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotLy8gICAgICBzZXRMYWJlbFByb3ZpZGVyKG5ldyBFbnVtZXJhdGlvbnNUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0vLyAgICAgIHNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0vLwotLy8gICAgICBzZXRDZWxsTW9kaWZpZXIodGhpcyk7Ci0vLwotLy8gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCAwKTsKLS8vICAgICAgY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1swXSk7Ci0vLyAgICAgIGNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotLy8gCi0vLyAgICAgIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbMV07Ci0vLwotLy8gICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLS8vICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwKTsKLS8vICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEoZGF0YSk7Ci0vLyAgICAgIGNlbGxFZGl0b3JzWzBdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLS8vCi0vLyAgICAgIGdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0vLyAgICAgIHNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLS8vICAgIH0KLS8vICAgIAotLy8gICAgcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0vLyAgICB7Ci0vLyAgICAgIHJldHVybiB0cnVlOwotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0vLyAgICB7Ci0vLyAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGVJdGVtICYmICh2YWx1ZSAhPSBudWxsKSkKLS8vICAgICAgewotLy8gICAgICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSllbGVtZW50OwotLy8gICAgICAgIAotLy8gICAgICAgIEVsZW1lbnQgc2ltcGxlVHlwZUVsZW1lbnQgPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWdldElucHV0KCkpLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICBGYWNldHNTZWN0aW9uLnRoaXMuYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VOVU1fVkFMVUVfQ0hBTkdFIiksIHNpbXBsZVR5cGVFbGVtZW50KTsKLS8vICAgICAgICAKLS8vICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KWl0ZW0uZ2V0RGF0YSgpOwotLy8gICAgICAgIGVudW1GYWNldC5zZXRMZXhpY2FsVmFsdWUoKFN0cmluZyl2YWx1ZSk7Ci0vLyAgICAgICAgaXRlbS5zZXREYXRhKGVudW1GYWNldCk7Ci0vLyAgICAgICAgaXRlbS5zZXRUZXh0KChTdHJpbmcpdmFsdWUpOwotLy8gICAgICAgIEZhY2V0c1NlY3Rpb24udGhpcy5lbmRSZWNvcmRpbmcoc2ltcGxlVHlwZUVsZW1lbnQpOwotLy8gICAgICB9Ci0vLyAgICB9ICAgIAotLy8KLS8vICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLS8vICAgIHsKLS8vICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotLy8gICAgICB7Ci0vLyAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCllbGVtZW50OwotLy8gICAgICAgIFN0cmluZyB2YWx1ZSA9IGVudW1GYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLS8vICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSAiIjsKLS8vICAgICAgICByZXR1cm4gdmFsdWU7Ci0vLyAgICAgIH0KLS8vICAgICAgcmV0dXJuICIiOwotLy8gICAgfQotLy8KLS8vICB9Ci0vLyAgICAKLS8vICBjbGFzcyBFbnVtZXJhdGlvbnNUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0vLyAgewotLy8gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotLy8gICAgewotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCBpbnB1dEVsZW1lbnQpCi0vLyAgICB7Ci0vLyAgICAgIGphdmEudXRpbC5MaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLS8vICAgICAgewotLy8gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWlucHV0RWxlbWVudDsKLS8vICAgICAgICByZXR1cm4gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKS50b0FycmF5KCk7Ci0vLyAgICAgIH0KLS8vICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotLy8gICAgewotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgY2xhc3MgRW51bWVyYXRpb25zVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLS8vICB7Ci0vLyAgICBwdWJsaWMgRW51bWVyYXRpb25zVGFibGVMYWJlbFByb3ZpZGVyKCkKLS8vICAgIHsKLS8vICAgICAgCi0vLyAgICB9Ci0vLyAgICAKLS8vICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotLy8gICAgewotLy8gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVFbnVtLmdpZiIpOwotLy8gICAgfQotLy8gICAgCi0vLyAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLS8vICAgIHsKLS8vICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotLy8gICAgICB7Ci0vLyAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtID0gKFhTREVudW1lcmF0aW9uRmFjZXQpZWxlbWVudDsKLS8vICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtLmdldExleGljYWxWYWx1ZSgpOwotLy8gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB2YWx1ZSA9ICIiOwotLy8gICAgICAgIHJldHVybiB2YWx1ZTsKLS8vICAgICAgfQotLy8gICAgICByZXR1cm4gIiI7Ci0vLyAgICB9Ci0vLwotLy8gIH0KLQotICAvKiBQYXR0ZXJucyBQYWdlICovCi0gIAotICBjbGFzcyBQYXR0ZXJuc1dvcmtib29rUGFnZSBleHRlbmRzIFhTRFdvcmtib29rUGFnZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyLCBMaXN0ZW5lcgotICB7Ci0gICAgUGF0dGVybnNUYWJsZVZpZXdlciBwYXR0ZXJuc1RhYmxlOwotICAgIEJ1dHRvbiBhZGRCdXR0b247Ci0gICAgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLSAgICBCdXR0b24gZWRpdEJ1dHRvbjsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlOwotICAgIAotICAgIHB1YmxpYyBQYXR0ZXJuc1dvcmtib29rUGFnZShYU0RXb3JrYm9vayB3b3JrYm9vaykKLSAgICB7Ci0gICAgICBzdXBlcih3b3JrYm9vayk7Ci0gICAgICB0aGlzLmdldFRhYkl0ZW0oKS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9QQVRURVJOUyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2wgKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgICBGb3JtRGF0YSBkYXRhOwotCi0gICAgICBwYXR0ZXJuc1RhYmxlID0gbmV3IFBhdHRlcm5zVGFibGVWaWV3ZXIoZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKSk7Ci0gICAgICBwYXR0ZXJuc1RhYmxlLnNldElucHV0KGdldElucHV0KCkpOwotICAgICAgVGFibGUgdGFibGUgPSBwYXR0ZXJuc1RhYmxlLmdldFRhYmxlKCk7Ci0gICAgICB0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgICAgYWRkQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9BREQiKSwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0gICAgICBlZGl0QnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9FRElUIiksIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotICAgICAgZGVsZXRlQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFX0lOQ0xVREUiKSwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMDApOwotICAgICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbiwgMCwgU1dULkxFRlQpOwotICAgICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwKTsKLSAgICAgIGVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBlZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgCi0gICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwLCBTV1QuTEVGVCk7Ci0gICAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChlZGl0QnV0dG9uLCAwKTsKLSAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgCi0gICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwKTsKLSAgICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICBkYXRhLndpZHRoID0gdGFibGVNaW5pbXVtV2lkdGg7Ci0gICAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgdGFibGUuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgdGhpcyk7Ci0gICAgICAKLSAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIFRhYmxlIHRhYmxlID0gcGF0dGVybnNUYWJsZS5nZXRUYWJsZSgpOwotICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULlJlc2l6ZSAmJiBldmVudC53aWRnZXQgPT0gdGFibGUpCi0gICAgICB7Ci0gICAgICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKDApOwotICAgICAgICB0YWJsZUNvbHVtbi5zZXRXaWR0aCh0YWJsZS5nZXRTaXplKCkueCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICAgIHsKLSAgICAgIHBhdHRlcm5zVGFibGUuc2V0SW5wdXQoaW5wdXQpOwotICAgICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZ2V0SW5wdXQoKTsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHN0LmdldEVsZW1lbnQoKTsKLQotICAgICAgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbikKLSAgICAgIHsKLSAgICAgICAgWFNERE9NSGVscGVyIGhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGludCB2YXJpZXR5ID0gc3QuZ2V0VmFyaWV0eSgpLmdldFZhbHVlKCk7Ci0gICAgICAgIE5vZGUgdmFyaWV0eUVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAodmFyaWV0eSA9PSBYU0RWYXJpZXR5LkFUT01JQykKLSAgICAgICAgewotICAgICAgICAgIHZhcmlldHlFbGVtZW50ID0gaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHZhcmlldHkgPT0gWFNEVmFyaWV0eS5VTklPTikKLSAgICAgICAgewotICAgICAgICAgIHZhcmlldHlFbGVtZW50ID0gaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHZhcmlldHkgPT0gWFNEVmFyaWV0eS5MSVNUKQotICAgICAgICB7Ci0gICAgICAgICAgdmFyaWV0eUVsZW1lbnQgPSBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKHZhcmlldHlFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLSAgICAgICAgICBTdHJpbmcgaW5pdGlhbFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBSZWdleFdpemFyZCB3aXphcmQgPSBuZXcgUmVnZXhXaXphcmQoaW5pdGlhbFZhbHVlKTsKLQotICAgICAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotICAgICAgICAgIHdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3UGF0dGVybiA9IHdpemFyZC5nZXRQYXR0ZXJuKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUsIG5ld1BhdHRlcm4pKTsKLSAgICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1BBVFRFUk4iKSwgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBnZXROZXdFbGVtZW50QWN0aW9uKFhTRENvbnN0YW50cy5QQVRURVJOX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9QQVRURVJOIiksIGF0dHJpYnV0ZXMsIChFbGVtZW50KXZhcmlldHlFbGVtZW50LCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgc3Quc2V0RWxlbWVudChlbGVtZW50KTsKLSAgICAgICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgICAgIHBhdHRlcm5zVGFibGUucmVmcmVzaCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBkZWxldGVCdXR0b24pCi0gICAgICB7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pcGF0dGVybnNUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSXRlcmF0b3IgaSA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFX0lOQ0xVREUiKSwgZWxlbWVudCk7IC8vIFJld29yZCA/Ci0gICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRFBhdHRlcm5GYWNldCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuRmFjZXQgPSAoWFNEUGF0dGVybkZhY2V0KW9iajsKLSAgICAgIAotICAgICAgICAgICAgICAgIC8vIEkgaGF2ZSB0byB1cGRhdGUgdXNpbmcgRE9NCi0gICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHBhdHRlcm5GYWNldC5nZXRFbGVtZW50KCkpOyAgICAgICAgICAgIAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHN0LnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgICAgIHBhdHRlcm5zVGFibGUucmVmcmVzaCgpOwotICAgICAgICAgIGlmIChwYXR0ZXJuc1RhYmxlLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgPT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikKLSAgICAgIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilwYXR0ZXJuc1RhYmxlLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4gPSAoWFNEUGF0dGVybkZhY2V0KW9iajsKLSAgICAgICAgICAgIFN0cmluZyBpbml0aWFsVmFsdWUgPSBwYXR0ZXJuLmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLSAgICAgICAgICAgIFJlZ2V4V2l6YXJkIHdpemFyZCA9IG5ldyBSZWdleFdpemFyZChpbml0aWFsVmFsdWUpOwotCi0gICAgICAgICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAgICAgICAgICAgIHdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgICAgICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgbmV3UGF0dGVybiA9IHdpemFyZC5nZXRQYXR0ZXJuKCk7Ci0gICAgICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9QQVRURVJOX1ZBTFVFX0NIQU5HRSIpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVkFMVUVfQVRUUklCVVRFLCBuZXdQYXR0ZXJuKTsKLSAgICAgICAgICAgICAgcGF0dGVybi5zZXRMZXhpY2FsVmFsdWUobmV3UGF0dGVybik7Ci0gICAgICAgICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgICAgICAgcGF0dGVybnNUYWJsZS5yZWZyZXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBwYXR0ZXJuc1RhYmxlLmdldFRhYmxlKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pcGF0dGVybnNUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0gIH0KLQotICAKLSAgY2xhc3MgUGF0dGVybnNUYWJsZVZpZXdlciBleHRlbmRzIE5hdmlnYWJsZVRhYmxlVmlld2VyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllcgotICB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMgPSB7IlBhdHRlcm4ifTsKLQotICAgIHByb3RlY3RlZCBDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnM7Ci0KLSAgICBUYWJsZSB0YWJsZTsKLSAgICAKLSAgICBwdWJsaWMgUGF0dGVybnNUYWJsZVZpZXdlcihUYWJsZSB0YWJsZSkKLSAgICB7Ci0gICAgICBzdXBlcih0YWJsZSk7Ci0gICAgICB0YWJsZSA9IGdldFRhYmxlKCk7Ci0gICAgICAKLSAgICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgIAotICAgICAgc2V0Q29udGVudFByb3ZpZGVyKG5ldyBQYXR0ZXJuc1RhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgc2V0TGFiZWxQcm92aWRlcihuZXcgUGF0dGVybnNUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICBzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0gICAgICBzZXRDZWxsTW9kaWZpZXIodGhpcyk7Ci0KLSAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDApOwotICAgICAgY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1swXSk7Ci0gICAgICBjb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgIGNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0gCi0gICAgICBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzFdOwotCi0gICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgIENvbHVtbldlaWdodERhdGEgZGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCk7Ci0gICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhKTsKLSAgICAgIGNlbGxFZGl0b3JzWzBdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQotICAgICAgZ2V0VGFibGUoKS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgIHNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlSXRlbSAmJiAodmFsdWUgIT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSllbGVtZW50OwotICAgICAgICAKLSAgICAgICAgRWxlbWVudCBzaW1wbGVUeXBlRWxlbWVudCA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZ2V0SW5wdXQoKSkuZ2V0RWxlbWVudCgpOwotICAgICAgICBGYWNldHNTZWN0aW9uLnRoaXMuYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1BBVFRFUk5fVkFMVUVfQ0hBTkdFIiksIHNpbXBsZVR5cGVFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm5GYWNldCA9IChYU0RQYXR0ZXJuRmFjZXQpaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIHBhdHRlcm5GYWNldC5zZXRMZXhpY2FsVmFsdWUoKFN0cmluZyl2YWx1ZSk7Ci0KLSAgICAgICAgaXRlbS5zZXREYXRhKHBhdHRlcm5GYWNldCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgRmFjZXRzU2VjdGlvbi50aGlzLmVuZFJlY29yZGluZyhzaW1wbGVUeXBlRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSAgICAKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTRFBhdHRlcm5GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm5GYWNldCA9IChYU0RQYXR0ZXJuRmFjZXQpZWxlbWVudDsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcGF0dGVybkZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgfQotICAgIAotICBjbGFzcyBQYXR0ZXJuc1RhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilpbnB1dEVsZW1lbnQ7Ci0gICAgICAgIHJldHVybiBzdC5nZXRQYXR0ZXJuRmFjZXRzKCkudG9BcnJheSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBQYXR0ZXJuc1RhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgUGF0dGVybnNUYWJsZUxhYmVsUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVQYXR0ZXJuLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNEUGF0dGVybkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RQYXR0ZXJuRmFjZXQgcGF0dGVybiA9IChYU0RQYXR0ZXJuRmFjZXQpZWxlbWVudDsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcGF0dGVybi5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRmFjZXRzU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRmFjZXRzU2VjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmOWQxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0ZhY2V0c1NlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRmFjZXRzU2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yCi17Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEZhY2V0c1NlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhzZGVkaXRvci5zZWN0aW9uLmZhY2V0cyI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uLmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBuZXcgRmFjZXRzU2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5mYWNldHMiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9NaW5NYXhTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL01pbk1heFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5NjI4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL01pbk1heFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTWluTWF4U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBDQ29tYm8gbWluQ29tYm87Ci0gIENDb21ibyBtYXhDb21ibzsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgTWluTWF4U2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotCXsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG1pbkNvbWJvKQotICAgIHsKLSAgICAgIHVwZGF0ZU1pbkF0dHJpYnV0ZSgpOwotCSAgfQotCSAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IG1heENvbWJvKQotCSAgewotICAgICAgdXBkYXRlTWF4QXR0cmlidXRlKCk7Ci0JICB9Ci0JfQotICAKLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IG1pbkNvbWJvKQotICAgIHsKLSAgICAgIHVwZGF0ZU1pbkF0dHJpYnV0ZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBtYXhDb21ibykKLSAgICB7Ci0gICAgICB1cGRhdGVNYXhBdHRyaWJ1dGUoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTWluQXR0cmlidXRlKCkKLSAgewotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gbnVsbDsKLSAgICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEUGFydGljbGVDb250ZW50KQotICAgIHsKLSAgICAgIHBhcnRpY2xlID0gZ2V0QXNzb2NpYXRlZFBhcnRpY2xlKChYU0RQYXJ0aWNsZUNvbnRlbnQpaW5wdXQpOwotICAgIH0KLSAgICBpZiAocGFydGljbGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBwYXJ0aWNsZS5nZXRFbGVtZW50KCk7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgU3RyaW5nIGlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgbmV3VmFsdWUgPSBtaW5Db21iby5nZXRUZXh0KCk7Ci0gICAgICBpZCA9IFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFOwotICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX01JTk9DQ1VSU19DSEFOR0UiKSwgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgICAgICAgIAotICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpPT0wKQotICAgICAgewotICAgICAgICBwYXJ0aWNsZS51bnNldE1pbk9jY3VycygpOwotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5lcXVhbHMoInVuYm91bmRlZCIpIHx8IG5ld1ZhbHVlLmVxdWFscygiKiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJ0aWNsZS5zZXRNaW5PY2N1cnMoWFNEUGFydGljbGUuVU5CT1VOREVEKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgdmFsID0gSW50ZWdlci5wYXJzZUludChuZXdWYWx1ZSk7Ci0gICAgICAgICAgcGFydGljbGUuc2V0TWluT2NjdXJzKHZhbCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIAotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgeyAKLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1heEF0dHJpYnV0ZSgpCi0gIHsKLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IG51bGw7Ci0gICAgT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgICB7Ci0gICAgICBwYXJ0aWNsZSA9IGdldEFzc29jaWF0ZWRQYXJ0aWNsZSgoWFNEUGFydGljbGVDb250ZW50KWlucHV0KTsKLSAgICB9Ci0gICAgaWYgKHBhcnRpY2xlICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gcGFydGljbGUuZ2V0RWxlbWVudCgpOwotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gIiI7Ci0gICAgICBTdHJpbmcgaWQgPSAiIjsKLSAgICAgIG5ld1ZhbHVlID0gbWF4Q29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWQgPSBYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURTsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9NQVhPQ0NVUlNfQ0hBTkdFIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCk9PTApCi0gICAgICB7Ci0gICAgICAgIHBhcnRpY2xlLnVuc2V0TWF4T2NjdXJzKCk7Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKG5ld1ZhbHVlLmVxdWFscygidW5ib3VuZGVkIikgfHwgbmV3VmFsdWUuZXF1YWxzKCIqIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHBhcnRpY2xlLnNldE1heE9jY3VycyhYU0RQYXJ0aWNsZS5VTkJPVU5ERUQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGludCB2YWwgPSBJbnRlZ2VyLnBhcnNlSW50KG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIHBhcnRpY2xlLnNldE1heE9jY3Vycyh2YWwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotICAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCxUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tcG9zaXRlID0JZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0KLSAgICBtaW5Db21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIG1pbkNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWluQ29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtaW5Db21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1pbkNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIG1pbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotCQlDTGFiZWwgbWluTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUgKyAiOiIpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChtaW5Db21ibywgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChtaW5Db21ibywgMCwgU1dULkNFTlRFUik7Ci0JCW1pbkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBtYXhDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG1pbkNvbWJvLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0gICAgbWF4Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtYXhDb21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1heENvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgbWF4Q29tYm8uYWRkKCJ1bmJvdW5kZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1heENvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIG1heENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotCQlDTGFiZWwgbWF4TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUgKyAiOiIpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChtYXhDb21ibywgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChtYXhDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCW1heExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotICAgIGlmIChkb1JlZnJlc2gpCi0gICAgewotICAgICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0KLSAgCSAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICAgIGJvb2xlYW4gcmVmcmVzaE1pblRleHQgPSB0cnVlOwotICAgICAgYm9vbGVhbiByZWZyZXNoTWF4VGV4dCA9IHRydWU7Ci0gICAgICBpZiAobWluQ29tYm8uaXNGb2N1c0NvbnRyb2woKSkKLSAgICAgIHsKLSAgICAgICAgcmVmcmVzaE1pblRleHQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChtYXhDb21iby5pc0ZvY3VzQ29udHJvbCgpKQotICAgICAgewotICAgICAgICByZWZyZXNoTWF4VGV4dCA9IGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKHJlZnJlc2hNaW5UZXh0KQotICAgICAgewotICAgICAgICBtaW5Db21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgaWYgKHJlZnJlc2hNYXhUZXh0KQotICAgICAgewotICAgICAgICBtYXhDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAJICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotICAJICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgCSAgewotICAJICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgCSAgICB7Ci0gIAkJICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gZ2V0QXNzb2NpYXRlZFBhcnRpY2xlKChYU0RQYXJ0aWNsZUNvbnRlbnQpaW5wdXQpOwotICAJCSAgICBpZiAocGFydGljbGUgIT0gbnVsbCkKLSAgCQkgICAgewotICAvLyAgCSAgICAgIG1pblRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihwYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKSkpOwotICAvLwkgICAgICAgIG1heFRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSkpOwotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gcGFydGljbGUuZ2V0RWxlbWVudCgpOwotICAJCSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gIAkJICAgICAgewotICAJCSAgICAgICAgU3RyaW5nIG1pbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgCQkgICAgICAgIFN0cmluZyBtYXggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0gIAkJICAgICAgICBpZiAobWluICE9IG51bGwgJiYgcmVmcmVzaE1pblRleHQpCi0gIAkJICAgICAgICB7Ci0gIAkJICAgICAgICAgIG1pbkNvbWJvLnNldFRleHQobWluKTsKLSAgCQkgICAgICAgIH0KLSAgCQkgICAgICAgIGlmIChtYXggIT0gbnVsbCAmJiByZWZyZXNoTWF4VGV4dCkKLSAgCQkgICAgICAgIHsKLSAgCQkgICAgICAgICAgbWF4Q29tYm8uc2V0VGV4dChtYXgpOwotICAJCSAgICAgICAgfQotICAJCSAgICAgIH0KLSAgCQkgICAgfQotICAJICAgIH0KLSAgCSAgfQotICAJICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCX0KLQkKLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIFhTRFBhcnRpY2xlIGdldEFzc29jaWF0ZWRQYXJ0aWNsZShYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50KQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcCA9IHBhcnRpY2xlQ29udGVudC5nZXRDb250YWluZXIoKTsKLSAgICBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgIHsKLSAgICAgIHJldHVybiAoWFNEUGFydGljbGUpeHNkQ29tcDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL01pbk1heFNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL01pbk1heFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjVmNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9NaW5NYXhTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgTWluTWF4U2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBNaW5NYXhTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueHNkZWRpdG9yLnNlY3Rpb24ubWlubWF4IjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoWFNERWxlbWVudERlY2xhcmF0aW9uLmNsYXNzKTsKLSAgICBsaXN0LmFkZChYU0RNb2RlbEdyb3VwLmNsYXNzKTsKLSAgICBsaXN0LmFkZChYU0RXaWxkY2FyZC5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IE1pbk1heFNlY3Rpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNhcHBsaWVzVG8ob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0vLyAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbilvYmplY3QpLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICBPYmplY3QgcGFyZW50Tm9kZSA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotLy8gICAgICAgIC8vIG1pbk9jY3VycyBhbmQgbWF4T2NjdXJzIGFwcGx5IHRvIG5vbi1nbG9iYWwgZWxlbWVudHMKLS8vICAgICAgICBib29sZWFuIGlzR2xvYmFsRWxlbWVudCA9IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnROb2RlLCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0vLyAgICAgICAgcmV0dXJuICFpc0dsb2JhbEVsZW1lbnQ7Ci0vLyAgICAgIH0KLS8vICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotLy8gICAgICB7Ci0vLyAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpb2JqZWN0OwotLy8gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHBhcnRpY2xlLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICBpZiAoaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICByZXR1cm4gdHJ1ZTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIHRydWUpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHJldHVybiBmYWxzZTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHJldHVybiB0cnVlOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilvYmplY3Q7Ci0gICAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNHbG9iYWwoKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgICB7Ci0gICAgICAgIFhTRFdpbGRjYXJkIHdpbGRjYXJkID0gKFhTRFdpbGRjYXJkKW9iamVjdDsKLSAgICAgICAgaWYgKHdpbGRjYXJkLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHx8Ci0gICAgICAgICAgICB3aWxkY2FyZC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGxlZGl0b3Iuc2VjdGlvbi5yZWZlcmVuY2UiOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTW9kZWxHcm91cFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTW9kZWxHcm91cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlNjJkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL01vZGVsR3JvdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEdyb3VwU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBDQ29tYm8gbW9kZWxHcm91cENvbWJvOwotICBwcml2YXRlIFN0cmluZ1tdIG1vZGVsR3JvdXBDb21ib1ZhbHVlcyA9IHsgInNlcXVlbmNlIiwgImNob2ljZSIsICJhbGwiIH07IC8vJE5PTi1OTFMtMSQKLSAgCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBNb2RlbEdyb3VwU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLQotCQltb2RlbEdyb3VwQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCW1vZGVsR3JvdXBDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQltb2RlbEdyb3VwQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCW1vZGVsR3JvdXBDb21iby5zZXRJdGVtcyhtb2RlbEdyb3VwQ29tYm9WYWx1ZXMpOwotCi0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0tJTkQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobW9kZWxHcm91cENvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG1vZGVsR3JvdXBDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JfQotIAkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0JICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQkgIE9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JICBpZiAoaW5wdXQgIT0gbnVsbCkKLQkgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0JICAgIHsKLQkgICAgICBYU0RNb2RlbEdyb3VwIHBhcnRpY2xlID0gKFhTRE1vZGVsR3JvdXApaW5wdXQ7Ci0JICAgICAgU3RyaW5nIG1vZGVsVHlwZSA9IHBhcnRpY2xlLmdldENvbXBvc2l0b3IoKS5nZXROYW1lKCk7Ci0JICAgICAgbW9kZWxHcm91cENvbWJvLnNldFRleHQobW9kZWxUeXBlKTsKLQkgICAgfQotCSAgfQotCSAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IG1vZGVsR3JvdXBDb21ibykKLSAgICB7Ci0gICAgICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotCSAgICB7Ci0JICAgICAgWFNETW9kZWxHcm91cCBwYXJ0aWNsZSA9IChYU0RNb2RlbEdyb3VwKWlucHV0OwotCi0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHBhcnRpY2xlLmdldEVsZW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCllbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0dST1VQX1NDT1BFX0NIQU5HRSIpLCBwYXJlbnQpOyAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgY2hhbmdlQ29udGVudE1vZGVsKHBhcmVudCwgbW9kZWxHcm91cENvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgIHBhcnRpY2xlLnNldENvbXBvc2l0b3IoWFNEQ29tcG9zaXRvci5nZXQobW9kZWxHcm91cENvbWJvLmdldFRleHQoKSkpOyAgICAgIAotICAgICAgICBlbmRSZWNvcmRpbmcocGFyZW50KTsKLSAgICAgICAgcmVmcmVzaCgpOwotCSAgICB9Ci0gICAgfQotICB9Ci0KLS8vICBwcml2YXRlIHZvaWQgY2hhbmdlQ29udGVudE1vZGVsKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgY29udGVudE1vZGVsKQotLy8gIHsKLS8vICAgIERvY3VtZW50IGRvYyA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0vLyAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gZ2V0RG9tSGVscGVyKCk7Ci0vLyAgCi0vLyAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50LmdldFByZWZpeCgpOwotLy8gICAgcHJlZml4ID0gcHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCArICI6IjsKLS8vICAgIAotLy8gICAgRWxlbWVudCBjb250ZW50TW9kZWxFbGVtZW50ID0gZG9tSGVscGVyLmdldENvbnRlbnRNb2RlbEZyb21QYXJlbnQocGFyZW50KTsKLS8vICAKLS8vICAgIGlmIChjb250ZW50TW9kZWxFbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhjb250ZW50TW9kZWwpKQotLy8gICAgewotLy8gICAgICByZXR1cm47IC8vIGl0J3MgYWxyZWFkeSB0aGUgY29udGVudCBtb2RlbCAKLS8vICAgIH0KLS8vICAKLS8vICAgIEVsZW1lbnQgbmV3Tm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoWFNERE9NSGVscGVyLlhNTFNjaGVtYVVSSSwgcHJlZml4ICsgY29udGVudE1vZGVsKTsKLS8vICAKLS8vICAgIGlmIChjb250ZW50TW9kZWxFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLS8vICAgIHsgICAgICAgIAotLy8gICAgICBOb2RlTGlzdCBub2RlcyA9IGNvbnRlbnRNb2RlbEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotLy8gICAgICAvLyB1c2UgY2xvbmVzIHNvIHdlIGRvbid0IGhhdmUgYSByZWZyZXNoIHByb2JsZW0KLS8vICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotLy8gICAgICB7Ci0vLyAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLS8vICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsgCi0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgY29udGVudE1vZGVsRWxlbWVudCk7Ci0vLyAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL01vZGVsR3JvdXBTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Nb2RlbEdyb3VwU2VjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYTA5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL01vZGVsR3JvdXBTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEdyb3VwU2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBNb2RlbEdyb3VwU2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueHNkZWRpdG9yLnNlY3Rpb24ubW9kZWxncm91cCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTRE1vZGVsR3JvdXAuY2xhc3MpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbiBnZXRTZWN0aW9uQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBNb2RlbEdyb3VwU2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLS8vICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotLy8gICAgICB7Ci0vLyAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpb2JqZWN0OwotLy8gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHBhcnRpY2xlLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICBpZiAoaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLS8vICAgICAgICAgICAgaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0vLyAgICAgICAgICAgIGlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICByZXR1cm4gdHJ1ZTsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwIHBhcnRpY2xlID0gKFhTRE1vZGVsR3JvdXApb2JqZWN0OwotLy8gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHBhcnRpY2xlLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICBpZiAoaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLS8vICAgICAgICAgICAgaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0vLyAgICAgICAgICAgIGlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0vLyAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZmM2MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5HbG9iYWxBdHRyaWJ1dGVHcm91cFJlbmFtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuR2xvYmFsQXR0cmlidXRlUmVuYW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5HbG9iYWxFbGVtZW50UmVuYW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5HbG9iYWxHcm91cFJlbmFtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZVJlbmFtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgTmFtZVNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLQlUZXh0IG5hbWVUZXh0OwotCi0JCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIAotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkKLQkgIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0JICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotCSAgICB7Ci0JICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpaW5wdXQ7Ci0JICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLQkgICAgICB7Ci0JICAgICAgICBuYW1lZENvbXBvbmVudC5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgICBkb1JlZmVyZW50aWFsSW50ZWdyaXR5Q2hlY2sobmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLQkgICAgICB9Ci0JICAgICAgZWxzZQotCSAgICAgIHsKLSAgICAgICAgICAvLyBUT0RPOiBTaG93IGVycm9yIG1lc3NhZ2UKLQkgICAgICB9Ci0JICAgIH0KLS8vCSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotLy8JICAgIHsKLS8vCSAgICAgIFhTRFBhcnRpY2xlIHhzZFBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKWlucHV0OwotLy8JICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLS8vCSAgICAgIHsKLS8vCSAgICAgICAgZG9SZWZlcmVudGlhbEludGVncml0eUNoZWNrKHhzZFBhcnRpY2xlLCBuZXdWYWx1ZSk7Ci0vLwkgICAgICB9Ci0vLwkgICAgICBlbHNlCi0vLwkgICAgICB7Ci0vLwkgICAgICAgIC8vIFRPRE86IFNob3cgZXJyb3IgbWVzc2FnZQotLy8JICAgICAgfQotLy8JICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilpbnB1dDsKLQkgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotCSAgICAgIHsKLQkgICAgICAgIGRvUmVmZXJlbnRpYWxJbnRlZ3JpdHlDaGVjayhhdHRyaWJ1dGUsIG5ld1ZhbHVlKTsKLQkgICAgICAgIGF0dHJpYnV0ZS5zZXROYW1lKG5ld1ZhbHVlKTsKLQkgICAgICB9Ci0JICAgICAgZWxzZQotCSAgICAgIHsKLQkgICAgICAgIC8vIFRPRE86IFNob3cgZXJyb3IgbWVzc2FnZQotCSAgICAgIH0KLSAgICAgIH0KLQkgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWlucHV0OwotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQkgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotCSAgICAgIHsKLQkgICAgICAgIGRvUmVmZXJlbnRpYWxJbnRlZ3JpdHlDaGVjayhhdHRyaWJ1dGUsIG5ld1ZhbHVlKTsKLQkgICAgICAgIGF0dHJpYnV0ZS5zZXROYW1lKG5ld1ZhbHVlKTsKLQkgICAgICAgIGF0dHJpYnV0ZVVzZS5zZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyaWJ1dGUpOwotCSAgICAgIH0KLQkgICAgICBlbHNlCi0JICAgICAgewotICAgICAgICAgIC8vIFRPRE86IFNob3cgZXJyb3IgbWVzc2FnZQotCSAgICAgIH0KLSAgICAgIH0KLQkgIH0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLQotCQluYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0JCS8vIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoOTUsIDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQlDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9OQU1FIikpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVUZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotICAgIGlmIChuYW1lVGV4dC5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBuYW1lVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0JICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCSAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkgIGlmIChpbnB1dCAhPSBudWxsKQotCSAgewotCSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gfHwgaW5wdXQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLQkgICAgewotCSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24paW5wdXQ7Ci0JICAgICAgCi0JICAgICAgRWxlbWVudCBlbGVtZW50ID0gdHlwZS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgbmFtZSA9ICIiOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0Fub255bW91c1R5cGUgPSBjaGVja0ZvckFub255bW91c1R5cGUoZWxlbWVudCk7Ci0gICAgICAgIGlmIChpc0Fub255bW91c1R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KCIqKmFub255bW91cyoqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBuYW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLSAgICAgICAgICBuYW1lVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICAgICAgfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0JICAgIHsKLQkgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudClpbnB1dDsKLQkgICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotCSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLQkgICAgICB9Ci0JICAgIH0KLS8vCSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotLy8JICAgIHsKLS8vCSAgICAgIFhTRFBhcnRpY2xlIHhzZFBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKWlucHV0OwotLy8JICAgICAgU3RyaW5nIG5hbWUgPSB4c2RQYXJ0aWNsZS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0vLwkgICAgICBpZiAobmFtZSAhPSBudWxsKQotLy8JICAgICAgewotLy8JICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotLy8JICAgICAgfQotLy8JICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilpbnB1dDsKLSAgICAgICAgLy9TdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGF0dHJpYnV0ZS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotCSAgICAgIH0KLSAgICAgIH0KLQkgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWlucHV0OwotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIG5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0JICAgICAgfQotICAgICAgfQotLy8JICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLS8vCSAgICB7Ci0vLwkgICAgICBTdHJpbmcgbmFtZSA9ICgoRWxlbWVudClpbnB1dCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0vLwkgICAgICBpZiAobmFtZSA9PSBudWxsKSBuYW1lID0gIiI7Ci0vLwkgICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotLy8JICAgIH0KLQkgIH0KLQkgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQlwcml2YXRlIHZvaWQgZG9SZWZlcmVudGlhbEludGVncml0eUNoZWNrKFhTRENvbXBvbmVudCB4c2RDb21wb25lbnQsIFN0cmluZyBuZXdWYWx1ZSkKLQl7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0geHNkQ29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgaWYgKHZhbGlkYXRlTmFtZShuZXdWYWx1ZSkpCi0gICAgICB7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9FTEVNRU5UX05BTUVfQ0hBTkdFIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICBpZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFhTRE5hbWVkQ29tcG9uZW50KXhzZENvbXBvbmVudCkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIG5vdyByZW5hbWUgYW55IHJlZmVyZW5jZXMgdG8gdGhpcyBlbGVtZW50Ci0gICAgICAgCi0gICAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsKLSAgICAgICAgICBpZiAoY29tcCAhPSBudWxsICYmIGNvbXAgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gJiYgY29tcC5nZXRDb250YWluZXIoKS5lcXVhbHMoeHNkU2NoZW1hKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBHbG9iYWxFbGVtZW50UmVuYW1lciByZW5hbWVyID0gbmV3IEdsb2JhbEVsZW1lbnRSZW5hbWVyKChYU0ROYW1lZENvbXBvbmVudCljb21wLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICByZW5hbWVyLnZpc2l0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgaWYgKHZhbGlkYXRlTmFtZShuZXdWYWx1ZSkpCi0gICAgICB7Ci0JICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NPTVBMRVhUWVBFX05BTUVfQ0hBTkdFIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLQkgICAgICB7Ci0JICAgICAgICAvLyBub3cgcmVuYW1lIGFueSByZWZlcmVuY2VzIHRvIHRoaXMgdHlwZQotCSAgICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotCSAgICAgICAgewotCSAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZWxlbWVudCk7Ci0JICAgICAgICAgIGlmIChjb21wICE9IG51bGwgJiYgY29tcCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiBjb21wLmdldENvbnRhaW5lcigpLmVxdWFscyh4c2RTY2hlbWEpKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZVJlbmFtZXIgcmVuYW1lciA9IG5ldyBHbG9iYWxTaW1wbGVPckNvbXBsZXhUeXBlUmVuYW1lcigoWFNETmFtZWRDb21wb25lbnQpY29tcCwgbmV3VmFsdWUpOwotCSAgICAgICAgICAgIHJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0JICAgICAgICAoKFhTRE5hbWVkQ29tcG9uZW50KXhzZENvbXBvbmVudCkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0JICAgICAgfQotCSAgICAgIGVsc2UKLQkgICAgICB7Ci0JICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotCSAgICAgIH0KLSAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NJTVBMRVRZUEVfTkFNRV9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICBpZiAodmFsaWRhdGVOYW1lKG5ld1ZhbHVlKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbm93IHJlbmFtZSBhbnkgcmVmZXJlbmNlcyB0byB0aGlzIHR5cGUKLSAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoY29tcCAhPSBudWxsICYmIGNvbXAgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiAmJiBjb21wLmdldENvbnRhaW5lcigpLmVxdWFscyh4c2RTY2hlbWEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBHbG9iYWxTaW1wbGVPckNvbXBsZXhUeXBlUmVuYW1lciByZW5hbWVyID0gbmV3IEdsb2JhbFNpbXBsZU9yQ29tcGxleFR5cGVSZW5hbWVyKChYU0ROYW1lZENvbXBvbmVudCljb21wLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgIHJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0vLyAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsICIiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotCi0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgeyAgCi0gICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQVRUUklCVVRFX05BTUVfQ0hBTkdFIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAvLyBub3cgcmVuYW1lIGFueSByZWZlcmVuY2VzIHRvIHRoaXMgZWxlbWVudAotICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KGVsZW1lbnQpOwotICAgICAgICBpZiAoY29tcCAhPSBudWxsICYmIGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiAmJiBjb21wLmdldENvbnRhaW5lcigpLmVxdWFscyh4c2RTY2hlbWEpKQotICAgICAgICB7Ci0gICAgICAgICAgR2xvYmFsQXR0cmlidXRlUmVuYW1lciByZW5hbWVyID0gbmV3IEdsb2JhbEF0dHJpYnV0ZVJlbmFtZXIoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXAsIG5ld1ZhbHVlKTsKLSAgICAgICAgICByZW5hbWVyLnZpc2l0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgeyAgCi0gICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQVRUUklCVVRFR1JPVVBfTkFNRV9DSEFOR0UiKSwgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICgoWFNETmFtZWRDb21wb25lbnQpeHNkQ29tcG9uZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgIC8vIG5vdyByZW5hbWUgYW55IHJlZmVyZW5jZXMgdG8gdGhpcyBlbGVtZW50Ci0gICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsKLSAgICAgICAgaWYgKGNvbXAgIT0gbnVsbCAmJiBjb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uICYmIGNvbXAuZ2V0Q29udGFpbmVyKCkuZXF1YWxzKHhzZFNjaGVtYSkpCi0gICAgICAgIHsKLSAgICAgICAgICBHbG9iYWxBdHRyaWJ1dGVHcm91cFJlbmFtZXIgcmVuYW1lciA9IG5ldyBHbG9iYWxBdHRyaWJ1dGVHcm91cFJlbmFtZXIoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXAsIG5ld1ZhbHVlKTsKLSAgICAgICAgICByZW5hbWVyLnZpc2l0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5VTklRVUVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBpZiAodmFsaWRhdGVOYW1lKG5ld1ZhbHVlKSkKLSAgICAgICB7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9VTklRVUVfTkFNRV9DSEFOR0UiKSwgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLktFWV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlmICh2YWxpZGF0ZU5hbWUobmV3VmFsdWUpKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfS0VZX05BTUVfQ0hBTkdFIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlmICh2YWxpZGF0ZU5hbWUobmV3VmFsdWUpKQotICAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0dST1VQX05BTUVfQ0hBTkdFIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vIG5vdyByZW5hbWUgYW55IHJlZmVyZW5jZXMgdG8gdGhpcyBlbGVtZW50Ci0gICAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgIHsKLSAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZWxlbWVudCk7Ci0gICAgICAgICAgaWYgKGNvbXAgIT0gbnVsbCAmJiBjb21wIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24gJiYgY29tcC5nZXRDb250YWluZXIoKS5lcXVhbHMoeHNkU2NoZW1hKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBHbG9iYWxHcm91cFJlbmFtZXIgcmVuYW1lciA9IG5ldyBHbG9iYWxHcm91cFJlbmFtZXIoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXAsIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIHJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICAKLQotCi0JfQotCi0gIGJvb2xlYW4gY2hlY2tGb3JBbm9ueW1vdXNUeXBlKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE9iamVjdCBwYXJlbnRFbGVtZW50ID0gKE9iamVjdCllbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICBib29sZWFuIGlzQW5vbnltb3VzID0gZmFsc2U7Ci0gICAgaWYgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpc0Fub255bW91cyA9IHRydWU7IAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhwYXJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpc0Fub255bW91cyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlzQW5vbnltb3VzOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmY3MTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTmFtZVNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgTmFtZVNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhzZGVkaXRvci5zZWN0aW9uLm5hbWUiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChYU0ROYW1lZENvbXBvbmVudC5jbGFzcyk7Ci0gICAgbGlzdC5hZGQoWFNEQXR0cmlidXRlVXNlLmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBuZXcgTmFtZVNlY3Rpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNhcHBsaWVzVG8ob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KW9iamVjdDsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmFtZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgIGlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBkb24ndCB3YW50IHRvIHNob3cgZWRpdGFibGUgbmFtZSBzZWN0aW9uIGZvciByZWYncwotICAgICAgICAvLyBuZWVkIHRvIHNob3cgcmVmIHNlY3Rpb24gd2l0aCBhIGNvbWJvYm94Ci0gICAgICAgIAotICAgICAgICBpZiAobmFtZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChYU0RFbGVtZW50RGVjbGFyYXRpb24pbmFtZWRDb21wb25lbnQpLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5hbWVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiluYW1lZENvbXBvbmVudCkuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW5wdXRFcXVhbHMoZWxlbWVudCwgZWxlbWVudC5nZXRMb2NhbE5hbWUoKSwgdHJ1ZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotLy8gICAgICB7Ci0vLyAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpb2JqZWN0OwotLy8gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHBhcnRpY2xlLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICBpZiAoaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICByZXR1cm4gdHJ1ZTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIHRydWUpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHJldHVybiBmYWxzZTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHJldHVybiBmYWxzZTsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSA9IChYU0RBdHRyaWJ1dGVVc2Upb2JqZWN0OwotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gYXR0cmlidXRlVXNlLmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlQW5kU2NoZW1hTG9jYXRpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVzcGFjZUFuZFNjaGVtYUxvY2F0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTQ3ZmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlQW5kU2NoZW1hTG9jYXRpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlQW5kU2NoZW1hTG9jYXRpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvcgotewotCSAgTmFtZXNwYWNlQW5kU2NoZW1hTG9jYXRpb25TZWN0aW9uIG5hbWVzcGFjZUFuZFNjaGVtYUxvY2F0aW9uU2VjdGlvbjsKLQkgIC8qKgotCSAgICogCi0JICAgKi8KLQkgIHB1YmxpYyBOYW1lc3BhY2VBbmRTY2hlbWFMb2NhdGlvbkRlc2NyaXB0b3IoKQotCSAgewotCSAgICBzdXBlcigpOwotCSAgICBuYW1lc3BhY2VBbmRTY2hlbWFMb2NhdGlvblNlY3Rpb24gPSBuZXcgTmFtZXNwYWNlQW5kU2NoZW1hTG9jYXRpb25TZWN0aW9uKCk7Ci0JICB9Ci0KLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0JICAgKi8KLQkgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotCSAgewotCSAgICByZXR1cm4gImNvbS5pYm0ueHNkZWRpdG9yLnNlY3Rpb24ubmFtZXNwYWNlQW5kU2NoZW1hTG9jYXRpb25TZWN0aW9uIjsKLQkgIH0KLQotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotCSAgICovCi0JICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLQkgIHsKLQkgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICBsaXN0LmFkZChYU0RDb25jcmV0ZUNvbXBvbmVudC5jbGFzcyk7Ci0JICAgIHJldHVybiBsaXN0OwotCSAgfQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLQkgICAqLwotCSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0JICB7Ci0JICAgIHJldHVybiBuYW1lc3BhY2VBbmRTY2hlbWFMb2NhdGlvblNlY3Rpb247Ci0JICB9Ci0KLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotCSAgICovCi0JICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0JICB7Ci0JICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLQkgIH0KLQotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAgICovCi0JICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JICB7Ci0JICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwkgICAgCi0JICAgIAotCSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgICAgewotCSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkgICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RJbXBvcnQpIHsKLQkJICAgIHJldHVybiB0cnVlOwotCSAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlQW5kU2NoZW1hTG9jYXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVzcGFjZUFuZFNjaGVtYUxvY2F0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGI3ODJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlQW5kU2NoZW1hTG9jYXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS52aWV3ZXJzLlJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5kZWxldGUuWFNERXh0ZXJuYWxGaWxlQ2xlYW51cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlQW5kU2NoZW1hTG9jYXRpb25TZWN0aW9uIGV4dGVuZHMgQ29tbW9uRGlyZWN0aXZlc1NlY3Rpb24KLXsKLQlUZXh0IG5hbWVzcGFjZVRleHQsIHByZWZpeFRleHQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgb2xkUHJlZml4VmFsdWU7Ci0JICAKLQlwdWJsaWMgTmFtZXNwYWNlQW5kU2NoZW1hTG9jYXRpb25TZWN0aW9uKCkKLSAgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJQ0xhYmVsIG5hbWVzcGFjZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9OQU1FU1BBQ0UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCW5hbWVzcGFjZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVzcGFjZVRleHQsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lc3BhY2VUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLSAgICBuYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTEwKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICBuYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0JCUNMYWJlbCBwcmVmaXhMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfUFJFRklYIikpOyAvLyROT04tTkxTLTEkCQkJCQotCQlwcmVmaXhUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCXByZWZpeFRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgcHJlZml4VGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCAwKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLSAgICBwcmVmaXhMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOyAgCi0gICAgCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDExMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lc3BhY2VUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgIAotCQkvLyBDcmVhdGUgU2NoZW1hIExvY2F0aW9uIExhYmVsCi0JCUNMYWJlbCBzY2hlbWFMb2NhdGlvbkxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TQ0hFTUFfTE9DQVRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBzY2hlbWFMb2NhdGlvblRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgV2l6YXJkIEJ1dHRvbgotCQl3aXphcmRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotICAgIHdpemFyZEJ1dHRvbi5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJRm9ybURhdGEgYnV0dG9uRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJYnV0dG9uRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlICsgMik7Ci0JCWJ1dHRvbkZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWJ1dHRvbkZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzY2hlbWFMb2NhdGlvblRleHQsIDAsIFNXVC5DRU5URVIpOwotCQl3aXphcmRCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25Gb3JtRGF0YSk7Ci0JCXdpemFyZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCi0JCS8vIENyZWF0ZSBTY2hlbWEgTG9jYXRpb24gVGV4dAotCQlzY2hlbWFMb2NhdGlvblRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCUZvcm1EYXRhIHNjaGVtYUxvY2F0aW9uRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlzY2hlbWFMb2NhdGlvbkRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMTApOwotCQlzY2hlbWFMb2NhdGlvbkRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQod2l6YXJkQnV0dG9uLCAwKTsKLQkJc2NoZW1hTG9jYXRpb25EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXNjaGVtYUxvY2F0aW9uVGV4dC5zZXRMYXlvdXREYXRhKHNjaGVtYUxvY2F0aW9uRGF0YSk7Ci0JCXNjaGVtYUxvY2F0aW9uVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLSAgICAKLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2NoZW1hTG9jYXRpb25UZXh0LCAwKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzY2hlbWFMb2NhdGlvblRleHQsIDAsIFNXVC5DRU5URVIpOwotICAgIHNjaGVtYUxvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICAvLyBlcnJvciB0ZXh0Ci0gICAgZXJyb3JUZXh0ID0gbmV3IFN0eWxlZFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZXJyb3JUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBlcnJvclRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOwotICAgIAotICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2NoZW1hTG9jYXRpb25UZXh0LCAwLCBTV1QuTEVGVCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHNjaGVtYUxvY2F0aW9uVGV4dCwgMCk7Ci0gICAgZXJyb3JUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gIH0KLQkKLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHdpemFyZEJ1dHRvbikKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQkgICAgCi0JCQlJRmlsZSBjdXJyZW50SUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotCQkJVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihuZXcgU3RyaW5nW10geyAiLnhzZCIgfSwgLy8kTk9OLU5MUy0xJCAKLQkJICAgICAgICAgICAgbmV3IElGaWxlW10geyBjdXJyZW50SUZpbGUgfSwKLQkJICAgICAgICAgICAgbnVsbCk7Ci0JCSAgICAgIAotCQkJWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZmlsZVNlbGVjdFdpemFyZCA9IAotCQkJICAgbmV3IFhTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkKHhzZFNjaGVtYSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9TQ0hFTUEiKSwgLy8kTk9OLU5MUy0xJAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfREVTQyIpLCAvLyROT04tTkxTLTEkCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQotCQkJV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIGZpbGVTZWxlY3RXaXphcmQpOwotCQkJd2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotCQkJd2l6YXJkRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0JCQkgIAotCQkgIFN0cmluZyB2YWx1ZSA9IHNjaGVtYUxvY2F0aW9uVGV4dC5nZXRUZXh0KCk7Ci0gICAgICBwcmVmaXhUZXh0LnJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQkgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotCQkgIHsKLSAgICAgICAgSUZpbGUgc2VsZWN0ZWRJRmlsZSA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0UmVzdWx0RmlsZSgpOwotICAgICAgICBTdHJpbmcgc2NoZW1hRmlsZVN0cmluZyA9IHZhbHVlOwotICAgICAgICBpZiAoc2VsZWN0ZWRJRmlsZSAhPSBudWxsKSAKLSAgICAgICAgewotICAgICAgICAgIHNjaGVtYUZpbGVTdHJpbmcgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoc2VsZWN0ZWRJRmlsZS5nZXRMb2NhdGlvbigpLCBjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc2NoZW1hRmlsZVN0cmluZyA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0VVJMKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZmlsZVNlbGVjdFdpemFyZC5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSBuYW1lc3BhY2UgPSAiIjsKLQotICAgICAgICBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEgPSBmaWxlU2VsZWN0V2l6YXJkLmdldEV4dGVybmFsU2NoZW1hKCk7Ci0gICAgICAgIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKHNjaGVtYUZpbGVTdHJpbmcsIG5hbWVzcGFjZSwgZXh0ZXJuYWxTY2hlbWEpOwotCQkgIH0KLSAgICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgICAgIHByZWZpeFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JCX0KLQl9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2NoZW1hTG9jYXRpb25DaGFuZ2UoU3RyaW5nIHNjaGVtYUZpbGVTdHJpbmcsIFN0cmluZyBuYW1lc3BhY2UsIFhTRFNjaGVtYSBleHRlcm5hbFNjaGVtYSkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpZ2V0SW5wdXQoKTsKLSAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICBYU0RJbXBvcnQgeHNkSW1wb3J0ID0gKFhTREltcG9ydCljb21wOwotICAgICAgRWxlbWVudCBpbXBvcnRFbGVtZW50ID0gY29tcC5nZXRFbGVtZW50KCk7Ci0gICAgICAKLSAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9JTVBPUlRfQ0hBTkdFIiksIGltcG9ydEVsZW1lbnQpOwotCi0gICAgICB4c2RJbXBvcnQuc2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICB4c2RJbXBvcnQuc2V0U2NoZW1hTG9jYXRpb24oc2NoZW1hRmlsZVN0cmluZyk7Ci0gICAgICB4c2RJbXBvcnQuc2V0UmVzb2x2ZWRTY2hlbWEoZXh0ZXJuYWxTY2hlbWEpOwotICAgICAgCi0gICAgICBqYXZhLnV0aWwuTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAKLS8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkIEltcG9ydCBNYXAgaXMgIiArIG1hcC52YWx1ZXMoKSk7Ci0vLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlZCBpbXBvcnQgTWFwIGtleXMgYXJlICIgKyBtYXAua2V5U2V0KCkpOwotCi0gICAgICAvLyBSZWZlcmVudGlhbCBpbnRlZ3JpdHkgb24gb2xkIGltcG9ydAotICAgICAgLy8gSG93IGNhbiB3ZSBiZSBzdXJlIHRoYXQgaWYgdGhlIG5ld2xvY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGRsb2NhdGlvbgotICAgICAgLy8gdGhlIGZpbGUgaGFzbid0IGNoYW5nZWQKLSAgICAgIAotICAgICAgWFNEU2NoZW1hIHJlZmVyZW5jZWRTY2hlbWEgPSB4c2RJbXBvcnQuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgIGlmIChyZWZlcmVuY2VkU2NoZW1hICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTREV4dGVybmFsRmlsZUNsZWFudXAgY2xlYW5IZWxwZXIgPSBuZXcgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cChyZWZlcmVuY2VkU2NoZW1hKTsKLSAgICAgICAgY2xlYW5IZWxwZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgIH0KLQotICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gZ2V0U2NoZW1hKCkuZ2V0RWxlbWVudCgpOwotCi0gICAgICAvLyB1cGRhdGUgdGhlIHhtbG5zIGluIHRoZSBzY2hlbWEgZWxlbWVudCBmaXJzdCwgYW5kIHRoZW4gdXBkYXRlIHRoZSBpbXBvcnQgZWxlbWVudCBuZXh0Ci0gICAgICAvLyBzbyB0aGF0IHRoZSBsYXN0IGNoYW5nZSB3aWxsIGJlIGluIHRoZSBpbXBvcnQgZWxlbWVudC4gIFRoaXMga2VlcHMgdGhlIHNlbGVjdGlvbgotICAgICAgLy8gb24gdGhlIGltcG9ydCBlbGVtZW50Ci0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoZXh0ZXJuYWxTY2hlbWEpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGhlbHBlci5nZXRQcmVmaXgobmFtZXNwYWNlLCBmYWxzZSk7Ci0gICAgICAKLSAgICAgIGlmIChtYXAuY29udGFpbnNLZXkocHJlZml4KSkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKHByZWZpeCA9PSBudWxsIHx8IChwcmVmaXggIT1udWxsICYmIHByZWZpeC5sZW5ndGgoKSA9PSAwKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIG5ld1ByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIoInByZWYiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IHByZWZpeEV4dGVuc2lvbiA9IDE7Ci0gICAgICAgIHdoaWxlIChtYXAuY29udGFpbnNLZXkobmV3UHJlZml4LnRvU3RyaW5nKCkpICYmIHByZWZpeEV4dGVuc2lvbiA8IDEwMCkKLSAgICAgICAgewotICAgICAgICAgIG5ld1ByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIoInByZWYiICsgU3RyaW5nLnZhbHVlT2YocHJlZml4RXh0ZW5zaW9uKSk7Ci0gICAgICAgICAgcHJlZml4RXh0ZW5zaW9uKys7Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZml4ID0gbmV3UHJlZml4LnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICAvLyBpZiBucyBhbHJlYWR5IGluIG1hcCwgdXNlIGl0cyBjb3JyZXNwb25kaW5nIHByZWZpeAotICAgICAgICBpZiAobWFwLmNvbnRhaW5zVmFsdWUobmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAgIFR5cGVzSGVscGVyIHR5cGVzSGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgcHJlZml4ID0gdHlwZXNIZWxwZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLy8gb3RoZXJ3aXNlIGFkZCB0byB0aGUgbWFwCi0gICAgICAgIHsKLSAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IitwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZml4VGV4dC5zZXRUZXh0KHByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZpeFRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICB9Ci0gICAgICAgIAotICAgICAgZW5kUmVjb3JkaW5nKGltcG9ydEVsZW1lbnQpOwotICAgICAgCi0vLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlZCBJbXBvcnQgTWFwIGlzICIgKyBtYXAudmFsdWVzKCkpOwotLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZWQgaW1wb3J0IE1hcCBrZXlzIGFyZSAiICsgbWFwLmtleVNldCgpKTsKLQotICAgIH0gICAgICAgIAotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0JCWlmIChkb1JlZnJlc2gpCi0JCXsKLSAgICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsKLQkJCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpIHsgCi0JCQkJZWxlbWVudCA9ICgoWFNESW1wb3J0SW1wbCkgaW5wdXQpLmdldEVsZW1lbnQoKTsKLQkJCQkKLQkJCQlTdHJpbmcgbmFtZXNwYWNlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQlUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLQkJICAgICAgICBTdHJpbmcgcHJlZml4ID0gaGVscGVyLmdldFByZWZpeChlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSksIGZhbHNlKTsKLQotCQkJCWlmIChuYW1lc3BhY2UgPT0gbnVsbCkgewotCQkJCQluYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCQkJcHJlZml4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkJc2NoZW1hTG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkKLQkJCQluYW1lc3BhY2VUZXh0LnNldFRleHQobmFtZXNwYWNlKTsKLQkJCQlwcmVmaXhUZXh0LnNldFRleHQocHJlZml4KTsKLQkJCQlzY2hlbWFMb2NhdGlvblRleHQuc2V0VGV4dChzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgIG9sZFByZWZpeFZhbHVlID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0JCQl9Ci0KLQkJCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5KQotICAgIHsKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gcHJlZml4VGV4dCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHZhbGlkYXRlUHJlZml4KHByZWZpeFRleHQuZ2V0VGV4dCgpKSAmJiBzY2hlbWFMb2NhdGlvblRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWdldElucHV0KCkpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICBNYXAgbWFwID0gZ2V0U2NoZW1hKCkuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotCi0gICAgICAgICAgaWYgKG1hcC5jb250YWluc0tleShwcmVmaXhUZXh0LmdldFRleHQoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9FUlJPUl9MQUJFTF9QUkVGSVhfRVhJU1RTIikpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1BSRUZJWF9DSEFOR0UiKSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IGdldFNjaGVtYSgpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiK29sZFByZWZpeFZhbHVlKTsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4VGV4dC5nZXRUZXh0KCksIG5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIFhTRFNjaGVtYUhlbHBlci51cGRhdGVFbGVtZW50KGdldFNjaGVtYSgpKTsKLQotICAgICAgICAgICAgY2xlYXJFcnJvck1lc3NhZ2UoKTsKLSAgICAgICAgICAgIG9sZFByZWZpeFZhbHVlID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7ICAKLQotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1hcCBpcyAiICsgbWFwLnZhbHVlcygpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNYXAga2V5cyBhcmUgIiArIG1hcC5rZXlTZXQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVzcGFjZVByb2Nlc3NDb250ZW50c1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlUHJvY2Vzc0NvbnRlbnRzU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGVhY2E5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlUHJvY2Vzc0NvbnRlbnRzU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFByb2Nlc3NDb250ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VQcm9jZXNzQ29udGVudHNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIENDb21ibyBuYW1lc3BhY2VDb21ibzsKLSAgQ0NvbWJvIHByb2Nlc3NDb250ZW50c0NvbWJvOwotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBuYW1lc3BhY2VDb21ib1ZhbHVlcyA9IHsKLSAgICAgICIiLCAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICIjI2FueSIsICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICIjI290aGVyIiwgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICIjI2xvY2FsIiAvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIE5hbWVzcGFjZVByb2Nlc3NDb250ZW50c1NlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0JZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0JCQotCi0JCW5hbWVzcGFjZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQluYW1lc3BhY2VDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotLy8JCUl0ZXJhdG9yIGxpc3QgPSBYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkuVkFMVUVTLml0ZXJhdG9yKCk7Ci0vLwkJd2hpbGUgKGxpc3QuaGFzTmV4dCgpKQotLy8JCXsKLS8vCQkgIG5hbWVzcGFjZUNvbWJvLmFkZCgoKFhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSlsaXN0Lm5leHQoKSkuZ2V0TmFtZSgpKTsKLS8vCQl9Ci0JCW5hbWVzcGFjZUNvbWJvLnNldEl0ZW1zKG5hbWVzcGFjZUNvbWJvVmFsdWVzKTsKLQkJbmFtZXNwYWNlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJQ0xhYmVsIG5hbWVzcGFjZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZXNwYWNlQ29tYm8sIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZXNwYWNlQ29tYm8sIDAsIFNXVC5DRU5URVIpOwotCQluYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXByb2Nlc3NDb250ZW50c0NvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVzcGFjZUNvbWJvLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXByb2Nlc3NDb250ZW50c0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCUl0ZXJhdG9yIGxpc3QgPSBYU0RQcm9jZXNzQ29udGVudHMuVkFMVUVTLml0ZXJhdG9yKCk7Ci0JCXByb2Nlc3NDb250ZW50c0NvbWJvLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGxpc3QuaGFzTmV4dCgpKQotCQl7Ci0JCSAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uYWRkKCgoWFNEUHJvY2Vzc0NvbnRlbnRzKWxpc3QubmV4dCgpKS5nZXROYW1lKCkpOwotCQl9Ci0JCXByb2Nlc3NDb250ZW50c0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCUNMYWJlbCBwcm9jZXNzQ29udGVudHNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RDb25zdGFudHMuUFJPQ0VTU0NPTlRFTlRTX0FUVFJJQlVURSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHByb2Nlc3NDb250ZW50c0NvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByb2Nlc3NDb250ZW50c0NvbWJvLCAwLCBTV1QuQ0VOVEVSKTsKLQkJcHJvY2Vzc0NvbnRlbnRzTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0vLwkgIG5hbWVzcGFjZUNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotLy8JICBwcm9jZXNzQ29udGVudHNDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkgIG5hbWVzcGFjZUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JICBwcm9jZXNzQ29udGVudHNDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCSAgT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkgIGlmIChpbnB1dCAhPSBudWxsKQotCSAgewotCSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLQkgICAgewotCSAgICAgIFhTRFdpbGRjYXJkIHdpbGRjYXJkID0gKFhTRFdpbGRjYXJkKWlucHV0OwotCSAgICAgIExpc3QgbGlzdE5TID0gd2lsZGNhcmQuZ2V0TmFtZXNwYWNlQ29uc3RyYWludCgpOwotCSAgICAgIGlmICh3aWxkY2FyZC5pc1NldExleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KCkpCi0JICAgICAgewotCSAgICAgICAgbmFtZXNwYWNlQ29tYm8uc2V0VGV4dCh3aWxkY2FyZC5nZXRTdHJpbmdMZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCgpKTsKLQkgICAgICB9Ci0JICAgICAgZWxzZQotCSAgICAgIHsKLQkgICAgICAgIG5hbWVzcGFjZUNvbWJvLnNldFRleHQoIiIpOwotCSAgICAgIH0KLQkgICAgICBpZiAod2lsZGNhcmQuaXNTZXRQcm9jZXNzQ29udGVudHMoKSkKLQkgICAgICB7Ci0JICAgICAgICBYU0RQcm9jZXNzQ29udGVudHMgcGMgPSB3aWxkY2FyZC5nZXRQcm9jZXNzQ29udGVudHMoKTsKLQkgICAgICAgIHByb2Nlc3NDb250ZW50c0NvbWJvLnNldFRleHQocGMuZ2V0TmFtZSgpKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLS8vCSAgbmFtZXNwYWNlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0vLwkgIHByb2Nlc3NDb250ZW50c0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCX0KLQkKLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpZ2V0SW5wdXQoKTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgewotICAgICAgWFNEV2lsZGNhcmQgd2lsZGNhcmQgPSAgKFhTRFdpbGRjYXJkKWNvbmNyZXRlQ29tcG9uZW50OwotICAgICAgaWYgKGUud2lkZ2V0ID09IG5hbWVzcGFjZUNvbWJvKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lc3BhY2VDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlQXR0cmlidXRlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9OQU1FU1BBQ0VfQ0hBTkdFIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChyZW1vdmVBdHRyaWJ1dGUpCi0gICAgICAgIHsKLSAgICAgICAgICB3aWxkY2FyZC51bnNldExleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgd2lsZGNhcmQuc2V0U3RyaW5nTGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQobmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHByb2Nlc3NDb250ZW50c0NvbWJvKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSBwcm9jZXNzQ29udGVudHNDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlQXR0cmlidXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUFJPQ0VTU0NPTlRFTlRTX0NIQU5HRSIpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAocmVtb3ZlQXR0cmlidXRlKQotICAgICAgICB7Ci0gICAgICAgICAgd2lsZGNhcmQudW5zZXRQcm9jZXNzQ29udGVudHMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB3aWxkY2FyZC5zZXRQcm9jZXNzQ29udGVudHMoWFNEUHJvY2Vzc0NvbnRlbnRzLmdldChwcm9jZXNzQ29udGVudHNDb21iby5nZXRJdGVtKHByb2Nlc3NDb250ZW50c0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VQcm9jZXNzQ29udGVudHNTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VQcm9jZXNzQ29udGVudHNTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk4ZjJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlUHJvY2Vzc0NvbnRlbnRzU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlUHJvY2Vzc0NvbnRlbnRzU2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBOYW1lc3BhY2VQcm9jZXNzQ29udGVudHNTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueHNkZWRpdG9yLnNlY3Rpb24ubmFtZXNwYWNlcHJvY2Vzc2NvbnRlbnRzIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoWFNEV2lsZGNhcmQuY2xhc3MpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbiBnZXRTZWN0aW9uQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBOYW1lc3BhY2VQcm9jZXNzQ29udGVudHNTZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2QwMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLlhTREVkaXROYW1lc3BhY2VzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RTY2hlbWFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLQkgIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0JICBUZXh0IHByZWZpeFRleHQ7Ci0JICBUZXh0IHRhcmdldE5hbWVzcGFjZVRleHQ7Ci0gICAgQnV0dG9uIGVkaXRCdXR0b247Ci0gICAgU3R5bGVkVGV4dCBlcnJvclRleHQ7Ci0gICAgQ29sb3IgcmVkOwotCSAgCi0JICAvKioKLQkgICAqIAotCSAgICovCi0JICBwdWJsaWMgTmFtZXNwYWNlU2VjdGlvbigpCi0JICB7Ci0JICAgIHN1cGVyKCk7Ci0JICB9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCQl7Ci0JCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotICAgICAgCi0JCQkvLyBDcmVhdGUgUHJlZml4IExhYmVsCi0JCQlDTGFiZWwgcHJlZml4TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1NDSEVNQV9QUkVGSVgiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgaW50IGxlZnRDb29yZGluYXRlID0gZ2V0U3RhbmRhcmRMYWJlbFdpZHRoKGNvbXBvc2l0ZSwgCi0gICAgICAgICAgbmV3IFN0cmluZ1tdIHtYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfVEFSR0VUX05BTUVfU1BBQ0UiKSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1NDSEVNQV9QUkVGSVgiKX0pOwotICAgICAgCi0JCQkvLyBDcmVhdGUgUHJlZml4IFRleHQKLQkJCXByZWZpeFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJCUZvcm1EYXRhIHByZWZpeFRleHREYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQkvLyBwcmVmaXhUZXh0RGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDExNSk7Ci0gICAgICBwcmVmaXhUZXh0RGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIGxlZnRDb29yZGluYXRlKTsKLQkJCXByZWZpeFRleHREYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJCXByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShwcmVmaXhUZXh0RGF0YSk7Ci0JCQlwcmVmaXhUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwkJICAgIAotCQkgICAgCi0JCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLSAgICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsIDAsIFNXVC5DRU5URVIpOwotCQkJcHJlZml4TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkJLy8gQ3JlYXRlIFRhcmdldE5hbWVzcGFjZSBMYWJlbAotCQkJQ0xhYmVsIHRhcmdldE5hbWVzcGFjZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9UQVJHRVRfTkFNRV9TUEFDRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgCi0gICAgICAvLyBDcmVhdGUgVGFyZ2V0TmFtZXNwYWNlIFRleHQKLSAgICAgIHRhcmdldE5hbWVzcGFjZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIAotCQkJRm9ybURhdGEgdG5zTGFiZWxEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQl0bnNMYWJlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgIHRuc0xhYmVsRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXJnZXROYW1lc3BhY2VUZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7IAotCQkJdG5zTGFiZWxEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXJnZXROYW1lc3BhY2VUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLQkJCXRhcmdldE5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEodG5zTGFiZWxEYXRhKTsKLQotICAgICAgRm9ybURhdGEgdG5zVGV4dERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgIC8vIHRuc1RleHREYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTE1KTsKLSAgICAgIHRuc1RleHREYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgbGVmdENvb3JkaW5hdGUpOwotICAgICAgdG5zVGV4dERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotICAgICAgdG5zVGV4dERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLSAgICAgIHRhcmdldE5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YSh0bnNUZXh0RGF0YSk7Ci0gICAgICB0YXJnZXROYW1lc3BhY2VUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgICAgCi0gICAgICAvLyBBZHZhbmNlZCBCdXR0b24KLSAgICAgIGVkaXRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NFQ1RJT05fQURWQU5DRURfQVRUUklCVVRFUyIpICsgIi4uLiIsIFNXVC5QVVNIKTsKLQotICAgICAgRm9ybURhdGEgYnV0dG9uRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgIGJ1dHRvbkZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLSAgICAgIGJ1dHRvbkZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXJnZXROYW1lc3BhY2VUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0gICAgICBlZGl0QnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uRm9ybURhdGEpOwotICAgICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgICAgLy8gZXJyb3IgdGV4dAotICAgICAgZXJyb3JUZXh0ID0gbmV3IFN0eWxlZFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICBlcnJvclRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgZXJyb3JUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOwotICAgICAgCi0gICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFyZ2V0TmFtZXNwYWNlVGV4dCwgMCwgU1dULkxFRlQpOwotICAgICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZWRpdEJ1dHRvbiwgMCk7Ci0gICAgICBlcnJvclRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICB9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JCXsKLSAgICAgIGlmIChkb1JlZnJlc2gpCi0gICAgICB7Ci0gICAgICAgIC8vIGhhY2suLi5vcGVuIGJ1ZyBhZ2FpbnN0IHByb3BlcnRpZXMKLSAgICAgICAgaWYgKHByZWZpeFRleHQuaXNEaXNwb3NlZCgpIHx8IHRhcmdldE5hbWVzcGFjZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVmaXhUZXh0LmlzRm9jdXNDb250cm9sKCkgfHwgdGFyZ2V0TmFtZXNwYWNlVGV4dC5pc0ZvY3VzQ29udHJvbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkgICAgCSAKLQkJCSAgRWxlbWVudCBlbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLQkgICAgCQotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gIAkJICAgIC8vIEhhbmRsZSBwcmVmaXhUZXh0Ci0gIAkJCSAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgCQkgIFN0cmluZyBhUHJlZml4ID0gaGVscGVyLmdldFByZWZpeChlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSksIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgICAgaWYgKGFQcmVmaXggIT0gbnVsbCAmJiBhUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgCSAgICAgIHsKLSAgCSAgCSAgCXByZWZpeFRleHQuc2V0VGV4dChhUHJlZml4KTsKLSAgCSAgCSAgfQotICAJICAJICBlbHNlCi0gICAgICAgICAgewotICAJCQkgIAlwcmVmaXhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gIAkJCSAgfQotICAJICAgIAkgCi0gIAkJCQkvLyBIYW5kbGUgVGFyZ2V0TmFtZXNwYWNlVGV4dAotICAJCQkJU3RyaW5nIHRucyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKTsKLSAgCQkJICBpZiAodG5zICE9IG51bGwgJiYgdG5zLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB7Ci0gICAJICAgICAgICB0YXJnZXROYW1lc3BhY2VUZXh0LnNldFRleHQodG5zKTsKLSAgIAkgICAgICB9Ci0gIAkJCSAgZWxzZQotICAgICAgICAgIHsKLSAgCQkJCSAgdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAJCQkgIH0KLSAgICAgICAgICBlcnJvclRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIH0KLQkJCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0JCXsKLSAgICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIFN0cmluZyBwcmVmaXhWYWx1ZSA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOwotICAgICAgU3RyaW5nIHRuc1ZhbHVlID0gdGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0gICAgICBpZiAodG5zVmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChwcmVmaXhWYWx1ZS50cmltKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3JUZXh0LnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX1RBUkdFVF9OQU1FU1BBQ0VfQU5EX1BSRUZJWCIpKTsKLSAgICAgICAgICBpbnQgbGVuZ3RoID0gZXJyb3JUZXh0LmdldFRleHQoKS5sZW5ndGgoKTsKLSAgICAgICAgICByZWQgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAwLCAwKTsKLSAgICAgICAgICBTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoMCwgbGVuZ3RoLCByZWQsIHRhcmdldE5hbWVzcGFjZVRleHQuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgICBlcnJvclRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0KLQkJICBpZiAoZXZlbnQud2lkZ2V0ID09IHByZWZpeFRleHQpCi0JCSAgewotICAgICAgICB1cGRhdGVOYW1lc3BhY2VJbmZvKHByZWZpeFZhbHVlLCB0bnNWYWx1ZSk7Ci0JCSAgfQotCQkgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSB0YXJnZXROYW1lc3BhY2VUZXh0KQotICAgICAgewotCQkgIAlUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLQkJCSAgU3RyaW5nIGFQcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKSwgZmFsc2UpOwotCQkgIAkvLyB1cGRhdGVOYW1lc3BhY2VJbmZvKGFQcmVmaXgsIHRuc1ZhbHVlKTsKLSAgICAgICAgdXBkYXRlTmFtZXNwYWNlSW5mbyhwcmVmaXhWYWx1ZSwgdG5zVmFsdWUpOwotCQkgIH0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikgewotCQkJCVhTREVkaXROYW1lc3BhY2VzQWN0aW9uIG5zQWN0aW9uID0gbmV3IFhTREVkaXROYW1lc3BhY2VzQWN0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fRURJVF9OQU1FU1BBQ0VTIiksIHhzZFNjaGVtYS5nZXRFbGVtZW50KCksIG51bGwsIHhzZFNjaGVtYSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJbnNBY3Rpb24ucnVuKCk7Ci0JCQkJcmVmcmVzaCgpOwkJCQkKLQkJCX0JCQkKLQkJfQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgICAqLwotCSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICB7Ci0JICAgIHJldHVybiB0cnVlOwotCSAgfQotCi0JICBwcml2YXRlIHZvaWQgdXBkYXRlTmFtZXNwYWNlSW5mbyhTdHJpbmcgbmV3UHJlZml4LCBTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKQotCSAgewotCSAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotCSAgICBEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCllbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotCSAgICBTdHJpbmcgbW9kZWxUYXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JICAgIFN0cmluZyBvbGROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JICAgIAotCSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgIAkJU3RyaW5nIG9sZFByZWZpeCA9IGhlbHBlci5nZXRQcmVmaXgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpLCBmYWxzZSk7Ci0JICAgIAotCSAgICBpZiAobW9kZWxUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIG1vZGVsVGFyZ2V0TmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkgICAgfQotCSAgICAgICAgCi0JICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBuZXdUYXJnZXROYW1lc3BhY2UudHJpbSgpOyAKLQkgICAgU3RyaW5nIHByZWZpeCA9IG5ld1ByZWZpeC50cmltKCk7Ci0KLQkgICAgaWYgKCF2YWxpZGF0ZVByZWZpeChwcmVmaXgpIHx8ICF2YWxpZGF0ZVRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpKQotCSAgICB7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAgICAgICAKLQkgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgdGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID09IDApCi0JICAgIHsKLQkgICAgICAgLy8gY2FuJ3QgaGF2ZSBibGFuayB0YXJnZXRuYW1lc3BhY2UgYW5kIHlldCBzcGVjaWZ5IGEgcHJlZml4Ci0JICAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICAgIGRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UQVJHRVROQU1FU1BBQ0VfQ0hBTkdFIikpOyAvLyROT04tTkxTLTEkCi0JICAgIFN0cmluZyB4c2RGb3JYU0RQcmVmaXggPSB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKTsKLQkgICAgTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0KLS8vCSBGb3IgZGVidWdnaW5nCi0vLwkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiMS4gU1cgTWFwIGlzICIgKyBtYXAudmFsdWVzKCkpOwotLy8JICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjEuIFNXIE1hcCBrZXlzIGFyZSAiICsgbWFwLmtleVNldCgpKTsKLQotCSAgICAvLyBDaGVjayBpZiBwcmVmaXggaXMgYmxhbmsKLQkgICAgLy8gaWYgaXQgaXMsIHRoZW4gbWFrZSBzdXJlIHdlIGhhdmUgYSBwcmVmaXggCi0JICAgIC8vIGZvciBzY2hlbWEgZm9yIHNjaGVtYQotCSAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCi0JICAgIHsKLQkgICAgICAvLyBpZiBwcmVmaXggZm9yIHNjaGVtYSBmb3Igc2NoZW1hIGlzIGJsYW5rCi0JICAgICAgLy8gdGhlbiBzZXQgaXQgdG8gdmFsdWUgc3BlY2lmaWVkIGluIHByZWZlcmVuY2UKLQkgICAgICAvLyBhbmQgdXBkYXRlIEFMTCBub2RlcyB3aXRoIHRoaXMgcHJlZml4Ci0JICAgICAgaWYgKHhzZEZvclhTRFByZWZpeCA9PSBudWxsIHx8ICh4c2RGb3JYU0RQcmVmaXggIT0gbnVsbCAmJiB4c2RGb3JYU0RQcmVmaXgudHJpbSgpLmxlbmd0aCgpID09IDApKQotCSAgICAgIHsKLQkgICAgICAgIC8vIGdldCBwcmVmZXJlbmNlIHByZWZpeAotCSAgICAgICAgeHNkRm9yWFNEUHJlZml4ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhNTFNjaGVtYVByZWZpeCgpOwotCSAgICAgICAgLy8gZ2V0IGEgdW5pcXVlIHByZWZpeCBieSBjaGVja2luZyB3aGF0J3MgaW4gdGhlIG1hcAotCi0JICAgICAgICB4c2RGb3JYU0RQcmVmaXggPSBnZXRVbmlxdWVTY2hlbWFGb3JTY2hlbWFQcmVmaXgoeHNkRm9yWFNEUHJlZml4LCBtYXApOwotCSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyB4c2RGb3JYU0RQcmVmaXgsIFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7IC8vJE5PTi1OTFMtMSQKLQotCSAgICAgICAgdXBkYXRlQWxsTm9kZXMoZWxlbWVudCwgeHNkRm9yWFNEUHJlZml4KTsKLQkgICAgICAgICAgICAKLQkgICAgICAgIC8vIHJlbW92ZSB0aGUgb2xkIHhtbG5zIGF0dHJpYnV0ZSBmb3IgdGhlIHNjaGVtYSBmb3Igc2NoZW1hCi0JICAgICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInhtbG5zIikgIT0gbnVsbCAmJiAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoInhtbG5zIikuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpIC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIHsKLQkgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQotCSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID4gMCB8fAotCSAgICAgICAodGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID09IDAgJiYgcHJlZml4Lmxlbmd0aCgpID09IDApKQotCSAgICB7Ci0JICAgICAgLy8gY2xlYW4gdXAgdGhlIG9sZCBwcmVmaXggZm9yIHRoaXMgc2NoZW1hCi0JICAgICAgaWYgKG9sZFByZWZpeCAhPSBudWxsICYmIG9sZFByZWZpeC5sZW5ndGgoKSA+IDApCi0JICAgICAgewotCSAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zOiIrb2xkUHJlZml4KTsgLy8kTk9OLU5MUy0xJAotLy8JICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIHRhcmdldE5hbWVzcGFjZSk7Ci0vLwkgICAgICAgICAgICBqYXZhLnV0aWwuTWFwIHByZWZpeFRvTmFtZVNwYWNlTWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLS8vCSAgICAgICAgICAgIHByZWZpeFRvTmFtZVNwYWNlTWFwLnJlbW92ZShvbGRQcmVmaXgpOwotCSAgICAgIH0KLQkgICAgICBlbHNlIC8vIGlmIG5vIHByZWZpeAotCSAgICAgIHsKLQkgICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgieG1sbnMiKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JICAgICAgICB7Ci0JICAgICAgICAgIGlmICghZWxlbWVudC5nZXRBdHRyaWJ1dGUoInhtbG5zIikuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpIC8vJE5PTi1OTFMtMSQKLQkgICAgICAgICAgIHsKLQkgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnMiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0KLQkgICAgaWYgKHRhcmdldE5hbWVzcGFjZS5sZW5ndGgoKSA+IDApCi0JICAgIHsKLQkgICAgICBpZiAoIW1vZGVsVGFyZ2V0TmFtZXNwYWNlLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKQotCSAgICAgIHsKLQkgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFLCB0YXJnZXROYW1lc3BhY2UpOwotCSAgICAgIH0KLQkgICAgICAvLyBub3cgc2V0IHRoZSBuZXcgeG1sbnM6cHJlZml4IGF0dHJpYnV0ZQotCSAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotCSAgICAgIHsKLQkgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LCB0YXJnZXROYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0JICAgICAgfQotCSAgICAgIGVsc2UKLQkgICAgICB7Ci0JICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnMiLCB0YXJnZXROYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0JICAgICAgfQotCSAgICAgIC8vIHNldCB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZQotCSAgICB9Ci0JICAgIGVsc2UgLy8gZWxzZSB0YXJnZXROYW1lc3BhY2UgaXMgYmxhbmsKLQkgICAgewotCSAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLQkgICAgICB7Ci0JICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0JICAgICAgfQotCSAgICB9Ci0KLS8vCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjEuNSBTVyBNYXAgaXMgIiArIG1hcC52YWx1ZXMoKSk7Ci0vLwkgICAgU3lzdGVtLm91dC5wcmludGxuKCIxLjUgU1cgTWFwIGtleXMgYXJlICIgKyBtYXAua2V5U2V0KCkpOwotCSAgICAKLQkgICAgLy8gZG8gb3VyIG93biByZWZlcmVudGlhbCBpbnRlZ3JpdHkKLQkgICAgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciB0YXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIoeHNkU2NoZW1hLCBvbGROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSk7Ci0JICAgIHRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIucmVzb2x2ZSgpOwotCSAgICAKLQkgICAgWFNEU2NoZW1hSGVscGVyLnVwZGF0ZUVsZW1lbnQoeHNkU2NoZW1hKTsKLQkgICAgCi0JICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQotLy8JIEZvciBkZWJ1Z2dpbmcKLS8vCSAgICAgICAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLS8vCSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIyLiBTVyBNYXAgaXMgIiArIG1hcC52YWx1ZXMoKSk7Ci0vLwkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiMi4gU1cgTWFwIGtleXMgYXJlICIgKyBtYXAua2V5U2V0KCkpOwotCSAgfQotCi0JICBwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVTY2hlbWFGb3JTY2hlbWFQcmVmaXgoU3RyaW5nIHhzZEZvclhTRFByZWZpeCwgTWFwIG1hcCkKLQkgIHsKLQkgICAgaWYgKHhzZEZvclhTRFByZWZpeCA9PSBudWxsIHx8ICh4c2RGb3JYU0RQcmVmaXggIT0gbnVsbCAmJiB4c2RGb3JYU0RQcmVmaXgudHJpbSgpLmxlbmd0aCgpID09IDApKQotCSAgICAgeyAgICAgICAKLQkgICAgICB4c2RGb3JYU0RQcmVmaXggPSAieHNkIjsgLy8kTk9OLU5MUy0xJAotCSAgICB9Ci0JICAgIC8vIGVuc3VyZSBwcmVmaXggaXMgdW5pcXVlCi0JICAgIGludCBwcmVmaXhFeHRlbnNpb24gPSAxOwotCSAgICB3aGlsZSAobWFwLmNvbnRhaW5zS2V5KHhzZEZvclhTRFByZWZpeCkgJiYgcHJlZml4RXh0ZW5zaW9uIDwgMTAwKQotCSAgICAgewotCSAgICAgIHhzZEZvclhTRFByZWZpeCA9IHhzZEZvclhTRFByZWZpeCArIFN0cmluZy52YWx1ZU9mKHByZWZpeEV4dGVuc2lvbik7Ci0JICAgICAgcHJlZml4RXh0ZW5zaW9uKys7Ci0JICAgIH0KLQkgICAgcmV0dXJuIHhzZEZvclhTRFByZWZpeDsKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUFsbE5vZGVzKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHByZWZpeCkKLQkgIHsKLQkgICAgZWxlbWVudC5zZXRQcmVmaXgocHJlZml4KTsKLQkgICAgTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCSAgICBpZiAobGlzdCAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCSAgICAgIHsKLQkgICAgICAgIE5vZGUgY2hpbGQgPSBsaXN0Lml0ZW0oaSk7Ci0JICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGNoaWxkLnNldFByZWZpeChwcmVmaXgpOwotCSAgICAgICAgICBpZiAoY2hpbGQuaGFzQ2hpbGROb2RlcygpKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgdXBkYXRlQWxsTm9kZXMoKEVsZW1lbnQpY2hpbGQsIHByZWZpeCk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0gICAKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlVGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBucykKLQkgIHsKLQkgICAgLy8gd2lsbCBhbGxvdyBibGFuayBuYW1lc3BhY2UgISEKLQkgICAgaWYgKG5zLmVxdWFscygiIikpCi0JICAgICB7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQkgICAgCi0JICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFVSSSB0ZXN0VVJJID0gbmV3IFVSSShucyk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0JICAgICAgZXJyb3JNZXNzYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1dBUk5fSU5WQUxJRF9UQVJHRVRfTkFNRVNQQUNFIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgfQotCSAgICAKLQkgICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKQotCSAgICAgewotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICBpZiAocmVkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlZC5kaXNwb3NlKCk7Ci0gICAgICAgIHJlZCA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTU2ZWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IKLXsKLQkgIE5hbWVzcGFjZVNlY3Rpb24gbmFtZXNwYWNlU2VjdGlvbjsKLQkgIC8qKgotCSAgICogCi0JICAgKi8KLQkgIHB1YmxpYyBOYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvcigpCi0JICB7Ci0JICAgIHN1cGVyKCk7Ci0JICAgIG5hbWVzcGFjZVNlY3Rpb24gPSBuZXcgTmFtZXNwYWNlU2VjdGlvbigpOwotCSAgfQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotCSAgICovCi0JICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLQkgIHsKLQkgICAgcmV0dXJuICJjb20uaWJtLnhzZGVkaXRvci5zZWN0aW9uLm5hbWVzcGFjZVNlY3Rpb24iOwotCSAgfQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0JICAgKi8KLQkgIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotCSAgewotCSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgIGxpc3QuYWRkKFhTRENvbmNyZXRlQ29tcG9uZW50LmNsYXNzKTsKLQkgICAgcmV0dXJuIGxpc3Q7Ci0JICB9Ci0KLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotCSAgICovCi0JICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLQkgIHsKLQkgICAgcmV0dXJuIG5hbWVzcGFjZVNlY3Rpb247Ci0JICB9Ci0KLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotCSAgICovCi0JICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0JICB7Ci0JICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLQkgIH0KLQotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAgICovCi0JICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JICB7Ci0JICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotCSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgICAgewotCSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkgICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFJbXBsKSB7Ci0JICAgICAgCXJldHVybiB0cnVlOwotCSAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PdGhlckF0dHJpYnV0ZXNTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL090aGVyQXR0cmlidXRlc1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwOWNlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL090aGVyQXR0cmlidXRlc1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlhTRFByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIE90aGVyQXR0cmlidXRlc1NlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7Ci0gIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0gIAotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgT3RoZXJBdHRyaWJ1dGVzU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAKLS8vICAgIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuRkxBVCk7Ci0vLyAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0vLyAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLS8vICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLS8vICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0vLyAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsgCi0vLyAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBwcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQlwcm9wZXJ0eVNoZWV0UGFnZS5jcmVhdGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0gICAgcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgWFNEUHJvcGVydHlTb3VyY2VQcm92aWRlcigpKTsKLSAgICBwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JICB0aGlzLnBhcnQgPSBwYXJ0OwotCSAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JICBpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkKLQkgIHsKLQkgICAgcHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgUHJvcGVydHlTaGVldFBhZ2UoKTsKLQkgIH0KLQkgIHByb3BlcnR5U2hlZXRQYWdlLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLQl9Ci0gIAotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLSAgICBpZiAoZG9SZWZyZXNoKQotICAgIHsKLSAgICAgIGlmIChpc1JlYWRPbmx5KQotICAgICAgewotICAgICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotCi0JICAgIE9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0gICAgICBpZiAoIXByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0gIAkgICAgcHJvcGVydHlTaGVldFBhZ2Uuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotICAgIH0KLQl9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLS8vICAgIHByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKLS8vICAgIHByb3BlcnR5U2hlZXRQYWdlID0gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWlucHV0OwotICAgICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgewotICAgICAgICBpbnB1dCA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgaXNSZWFkT25seSA9ICghKGVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PdGhlckF0dHJpYnV0ZXNTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PdGhlckF0dHJpYnV0ZXNTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTRkNmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT3RoZXJBdHRyaWJ1dGVzU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGF0dGVybkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIE90aGVyQXR0cmlidXRlc1NlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvcgotewotICBPdGhlckF0dHJpYnV0ZXNTZWN0aW9uIG90aGVyQXR0cmlidXRlc1NlY3Rpb247Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBPdGhlckF0dHJpYnV0ZXNTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIG90aGVyQXR0cmlidXRlc1NlY3Rpb24gPSBuZXcgT3RoZXJBdHRyaWJ1dGVzU2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueHNkZWRpdG9yLnNlY3Rpb24ub3RoZXJhdHRyaWJ1dGVzIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoWFNEQ29uY3JldGVDb21wb25lbnQuY2xhc3MpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbiBnZXRTZWN0aW9uQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIG90aGVyQXR0cmlidXRlc1NlY3Rpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLm90aGVyIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgIAlpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHx8Ci0gICAgICAJICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSB8fAotICAgICAgCSAgICBvYmplY3QgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB8fAotICAgICAgCSAgICBvYmplY3QgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0IHx8Ci0gICAgICAJICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTRFBhdHRlcm5GYWNldCB8fAotICAgICAgCSAgICBvYmplY3QgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB8fAotICAgICAgCSAgICBvYmplY3QgaW5zdGFuY2VvZiBYU0RBbm5vdGF0aW9uIHx8Ci0gICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCB8fAotICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgCXsKLSAgICAgCSAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAJfQotICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgewotLy8gICAgICAgIFJlbW92ZSB0aGlzIHRvIGZpeCBidWcgMzg3MCBFbGVtZW50IHJlZmVyZW5jZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgcHJvcGVydGllcyBhcyBlbGVtZW50cyAKLS8vICAgICAgICAgIGlmICgoKFhTREVsZW1lbnREZWNsYXJhdGlvbilvYmplY3QpLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLS8vICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGlmICgoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKW9iamVjdCkuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGNvbnN0cmFpbnQgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbilvYmplY3Q7Ci0gICAgICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSBjb25zdHJhaW50LmdldElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5KCk7Ci0gICAgICAgICAgaWYgKGNhdGVnb3J5LmdldFZhbHVlKCkgPT0gWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkuS0VZUkVGKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhdHRlcm5TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhdHRlcm5TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZmMzNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9QYXR0ZXJuU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuUmVnZXhXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhdHRlcm5GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFBhdHRlcm5TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBQYXR0ZXJuU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBUZXh0IHBhdHRlcm5UZXh0OwotICBCdXR0b24gYnV0dG9uOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0KLQkJcGF0dGVyblRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9WQUxVRSIpICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgIGJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0gICAgYnV0dG9uLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHBhdHRlcm5UZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHBhdHRlcm5UZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCwgU1dULkNFTlRFUik7Ci0JCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlICsgMik7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwYXR0ZXJuVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYnV0dG9uLCAwKTsKLSAgICBwYXR0ZXJuVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLQkgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCSAgcGF0dGVyblRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkgIGlmIChpbnB1dCAhPSBudWxsKQotCSAgewotCSAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0JICAgIHsKLQkgICAgICBlbGVtZW50ID0gKChYU0RQYXR0ZXJuRmFjZXQpaW5wdXQpLmdldEVsZW1lbnQoKTsKLQkgICAgfQotCSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotCSAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVkFMVUVfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcGF0dGVyblRleHQuc2V0VGV4dChyZXN1bHQpOwotICAgICAgICB9Ci0JICAgIH0KLQkgIH0KLQkgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYnV0dG9uKQotICAgIHsKLQkgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCSAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRFBhdHRlcm5GYWNldClnZXRJbnB1dCgpKS5nZXRFbGVtZW50KCk7Ci0KLSAgICAgIFN0cmluZyBpbml0aWFsVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVkFMVUVfQVRUUklCVVRFKTsKLSAgICAgIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW5pdGlhbFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIFJlZ2V4V2l6YXJkIHdpemFyZCA9IG5ldyBSZWdleFdpemFyZChpbml0aWFsVmFsdWUpOwotCi0gICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAgICAgIHdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLSAgICAgIAotICAgICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3UGF0dGVybiA9IHdpemFyZC5nZXRQYXR0ZXJuKCk7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9QQVRURVJOX1ZBTFVFX0NIQU5HRSIpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVkFMVUVfQVRUUklCVVRFLCBuZXdQYXR0ZXJuKTsKLSAgICAgICAgKChYU0RQYXR0ZXJuRmFjZXQpZ2V0SW5wdXQoKSkuc2V0TGV4aWNhbFZhbHVlKG5ld1BhdHRlcm4pOwotICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLQkgIGlmIChldmVudC53aWRnZXQgPT0gcGF0dGVyblRleHQpCi0JICB7Ci0JCSAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4gPSAoWFNEUGF0dGVybkZhY2V0KWdldElucHV0KCk7Ci0JCSAgCi0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBwYXR0ZXJuVGV4dC5nZXRUZXh0KCk7Ci0gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBwYXR0ZXJuLnNldExleGljYWxWYWx1ZShuZXdWYWx1ZSk7Ci0gICAgICB9Ci0JICB9Ci0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhdHRlcm5TZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9QYXR0ZXJuU2VjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MzJlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhdHRlcm5TZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGF0dGVybkZhY2V0OwotCi1wdWJsaWMgY2xhc3MgUGF0dGVyblNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgUGF0dGVyblNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54c2RlZGl0b3Iuc2VjdGlvbi5wYXR0ZXJuIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoWFNEUGF0dGVybkZhY2V0LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBuZXcgUGF0dGVyblNlY3Rpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNhcHBsaWVzVG8ob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEUGF0dGVybkZhY2V0KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vUmVmZXJlbmNlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9SZWZlcmVuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmJkMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9SZWZlcmVuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcm90ZWN0ZWQgQ0NvbWJvIGNvbXBvbmVudE5hbWVDb21ibzsgCi0gIEJ1dHRvbiBidXR0b247Ci0gIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIENMYWJlbCByZWZMYWJlbDsKLSAgCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0KLSAgICBjb21wb25lbnROYW1lQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEpOwotCQljb21wb25lbnROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZWZMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSArICI6Iik7ICAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvbmVudE5hbWVDb21ibywgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21wb25lbnROYW1lQ29tYm8sIDAsIFNXVC5DRU5URVIpOwotCQlyZWZMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgCi0gICAgT2JqZWN0IG9iaiA9IGdldElucHV0KCk7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKW9iajsKLSAgICAgIGlmIChlbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgIHsKLSAgICAgICAgaXRlbXMgPSBoZWxwZXIuZ2V0R2xvYmFsRWxlbWVudHMoKTsKLS8vICAgICAgICAgICAgbWluaW11bUZpZWxkLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX0VMRU1FTlRfTUlOSU1VTSIpKTsKLS8vICAgICAgICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKG1pbmltdW1GaWVsZCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0VMRU1FTlRfUkVGX01JTklNVU0pOwotLy8gICAgICAgICAgICBtYXhpbXVtRmllbGQuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfRUxFTUVOVF9NQVhJTVVNIikpOwotLy8gICAgICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAobWF4aW11bUZpZWxkLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfRUxFTUVOVF9SRUZfTUFYSU1VTSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIGl0ZW1zID0gaGVscGVyLmdldEdsb2JhbEF0dHJpYnV0ZXMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pb2JqOwotICAgICAgaWYgKGdyb3VwLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgIHsKLSAgICAgICAgaXRlbXMgPSBoZWxwZXIuZ2V0TW9kZWxHcm91cHMoKTsKLSAgICAgICAgICAvLyBOZWVkIHRvb2x0aXAgZm9yIEdyb3VwIFJlZgotLy8gICAgICAgICAgICBtaW5pbXVtRmllbGQuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfRUxFTUVOVF9NSU5JTVVNIikpOwotLy8gICAgICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAobWluaW11bUZpZWxkLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfR1JPVVBfUkVGX01JTklNVU0pOwotLy8gICAgICAgICAgICBtYXhpbXVtRmllbGQuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfRUxFTUVOVF9NQVhJTVVNIikpOwotLy8gICAgICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAobWF4aW11bUZpZWxkLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfR1JPVVBfUkVGX01BWElNVU0pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICB7Ci0gICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudClvYmo7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0gICAgICB7Ci0gICAgICAgIGl0ZW1zID0gaGVscGVyLmdldEdsb2JhbEF0dHJpYnV0ZUdyb3VwcygpOwotLy8gICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2xpZW50LCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfQVRUUklCVVRFX0dST1VQX1JFRl9ERVNJR05fVklFVyk7Ci0vLyAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChyZWZDb21ibywgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0FUVFJJQlVURV9HUk9VUF9SRUZfTkFNRSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgICAgewotICAgICAgICBpdGVtcyA9IGhlbHBlci5nZXRHbG9iYWxFbGVtZW50cygpOwotLy8gICAgICAgICAgbWluaW11bUZpZWxkLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX0VMRU1FTlRfTUlOSU1VTSIpKTsKLS8vICAgICAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChtaW5pbXVtRmllbGQsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9FTEVNRU5UX1JFRl9NSU5JTVVNKTsKLS8vICAgICAgICAgIG1heGltdW1GaWVsZC5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9FTEVNRU5UX01BWElNVU0iKSk7Ci0vLyAgICAgICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAobWF4aW11bUZpZWxkLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfRUxFTUVOVF9SRUZfTUFYSU1VTSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZSlvYmo7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyaWJ1dGVVc2UuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICAgIHsKLSAgICAgICAgaXRlbXMgPSBoZWxwZXIuZ2V0R2xvYmFsQXR0cmlidXRlcygpOwotLy8gICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2xpZW50LCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfQVRUUklCVVRFX1JFRl9ERVNJR05fVklFVyk7Ci0vLyAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChyZWZDb21ibywgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX0FUVFJJQlVURV9SRUZfTkFNRSk7ICAgICAgCi0gICAgICB9Ci0gICAgfSAgICAgIAotICAgIGl0ZW1zLmFkZCgwLCAiIik7Ci0gICAgaW50IHNpemUgPSBpdGVtcy5zaXplKCk7Ci0gICAgU3RyaW5nIFtdIHN0ID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLnRvQXJyYXkoKSwgMCwgc3QsIDAsIHNpemUpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRJdGVtcyhzdCk7Ci0gICAgICAKLSAgICBzdCA9IG51bGw7Ci0gIH0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0gICAgaWYgKGRvUmVmcmVzaCkKLSAgICB7Ci0gIAkgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7ICAKLSAgLy8JICBjb21wb25lbnROYW1lQ29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gIAkgIE9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0gICAgICBpZiAoaXNSZWFkT25seSkKLSAgICAgIHsKLSAgICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0KLQotICAJICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgCSAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudClnZXRJbnB1dCgpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpOwotICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyVmFsdWUgPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQoYXR0clZhbHVlKTsKLSAgICAgICAgfQotICAJICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlQ29udGVudClpbnB1dDsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gcGFydGljbGUuZ2V0RWxlbWVudCgpOwotICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpOwotICAgICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyVmFsdWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dChhdHRyVmFsdWUpOwotICAgICAgfQotICAJICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgCSAgewotICAJICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWdldElucHV0KCk7Ci0gIAkgICAgRWxlbWVudCBlbGVtZW50ID0gYXR0cmlidXRlVXNlLmdldEVsZW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYXR0clZhbHVlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQoYXR0clZhbHVlKTsKLSAgCSAgfQotICAJICAKLSAgICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgLy8gICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIH0KLQl9Ci0KLQkKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotCSAgT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLSAgICBpZiAoZS53aWRnZXQgPT0gY29tcG9uZW50TmFtZUNvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCSAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0JCSAgewotCSAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KWdldElucHV0KCk7Ci0JICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmFtZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotCSAgICAgIAotCSAgICAgIGlmIChuYW1lZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLQkgICAgICB7Ci0JICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfR1JPVVBfUkVGX0NIQU5HRSIpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLQkgICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLQkgICAgICB9Ci0JCQkgIGVsc2UgaWYgKG5hbWVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0JCQkgIHsKLQkJCSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKW5hbWVkQ29tcG9uZW50OwotCSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FUVFJJQlVURUdST1VQX1JFRl9DSEFOR0UiKSwgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0JICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0KLQkJCSAgfQotCSAgCSAgZWxzZSBpZiAobmFtZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0JICAJICB7Ci0JICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQVRUUklCVVRFR1JPVVBfUkVGX0NIQU5HRSIpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgLy8gZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIChTdHJpbmcpIHZhbHVlKTsKLQkgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKW5hbWVkQ29tcG9uZW50OwotCSAgICAgICAgSXRlcmF0b3IgaXRlciA9IHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLQkgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGRlZiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24paXRlci5uZXh0KCk7Ci0JICAgICAgICAgIGlmIChkZWYuZ2V0UU5hbWUoeHNkU2NoZW1hKS5lcXVhbHMoY29tcG9uZW50TmFtZUNvbWJvLmdldFRleHQoKSkpCi0JICAgICAgICAgIHsKLQkgICAgICAgICAgICBhdHRyR3JvdXAuc2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oZGVmKTsKLQkgICAgICAgICAgICBhdHRyR3JvdXAuc2V0TmFtZShjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkgICAgICAgICAgICBicmVhazsKLQkgICAgICAgICAgfQotCSAgICAgICAgfSAgCi0JICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0JICAJICB9Ci0gICAgICAgIGVsc2UgaWYgKG5hbWVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfR1JPVVBfUkVGX0NIQU5HRSIpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pbmFtZWRDb21wb25lbnQ7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICAgIH0KLQkJICB9Ci0JCSAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0JCSAgewotCQkgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpZ2V0SW5wdXQoKTsKLQkJICAgIEVsZW1lbnQgZWxlbWVudCA9IGF0dHJpYnV0ZVVzZS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BVFRSSUJVVEVfVVNFX0NIQU5HRSIpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBJdGVyYXRvciBpdGVyID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24paXRlci5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGF0dHIuZ2V0UU5hbWUoeHNkU2NoZW1hKS5lcXVhbHMobmV3VmFsdWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVVzZS5zZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotCi0gICAgICAgIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLQkJICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY4ODViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1JlZmVyZW5jZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZVNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICBSZWZlcmVuY2VTZWN0aW9uIHJlZmVyZW5jZVNlY3Rpb247Ci0gIAotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLnJlZmVyZW5jZVNlY3Rpb24gPSBuZXcgUmVmZXJlbmNlU2VjdGlvbigpOwotICB9Ci0KLQotICAvKioKLSAgICogCi0gICAqLwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbGVkaXRvci5zZWN0aW9uLnJlZmVyZW5jZSI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTRE5hbWVkQ29tcG9uZW50LmNsYXNzKTsKLSAgICBsaXN0LmFkZChYU0RFbGVtZW50RGVjbGFyYXRpb24uY2xhc3MpOwotICAgIGxpc3QuYWRkKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uLmNsYXNzKTsKLSAgICBsaXN0LmFkZChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbi5jbGFzcyk7Ci0gICAgbGlzdC5hZGQoWFNEQXR0cmlidXRlVXNlLmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiByZWZlcmVuY2VTZWN0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWZlcmVuY2VTZWN0aW9uLnNldEVkaXRvclBhcnQocGFydC5nZXRTaXRlKCkKLSAgICAgICAgICAgIC5nZXRXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAuZ2V0QWN0aXZlUGFnZSgpCi0gICAgICAgICAgICAgICAgLmdldEFjdGl2ZUVkaXRvcigpKTsKLSAgICB9Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpb2JqZWN0OwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0RXF1YWxzKGVsZW1lbnQsIGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCksIHRydWUpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKW9iamVjdDsKLSAgICAgICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilvYmplY3Q7Ci0gICAgICAgIGlmIChhdHRyLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKW9iamVjdDsKLSAgICAgICAgaWYgKGdyb3VwLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZSlvYmplY3Q7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyaWJ1dGVVc2UuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TY2hlbWFMb2NhdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vU2NoZW1hTG9jYXRpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YjQ3ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TY2hlbWFMb2NhdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLQotcHVibGljIGNsYXNzIFNjaGVtYUxvY2F0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IKLXsKLQkgIFNjaGVtYUxvY2F0aW9uU2VjdGlvbiBzY2hlbWFMb2NhdGlvblNlY3Rpb247Ci0JICAvKioKLQkgICAqIAotCSAgICovCi0JICBwdWJsaWMgU2NoZW1hTG9jYXRpb25EZXNjcmlwdG9yKCkKLQkgIHsKLQkgICAgc3VwZXIoKTsKLQkgIH0KLQotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLQkgICAqLwotCSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0JICB7Ci0JICAgIHJldHVybiAiY29tLmlibS54c2RlZGl0b3Iuc2VjdGlvbi5zY2hlbWFMb2NhdGlvblNlY3Rpb24iOwotCSAgfQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0JICAgKi8KLQkgIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotCSAgewotCSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgIGxpc3QuYWRkKFhTRENvbmNyZXRlQ29tcG9uZW50LmNsYXNzKTsKLQkgICAgcmV0dXJuIGxpc3Q7Ci0JICB9Ci0KLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotCSAgICovCi0JICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLQkgIHsKLQkgICAgcmV0dXJuIHNjaGVtYUxvY2F0aW9uU2VjdGlvbjsKLQkgIH0KLQotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0JICAgKi8KLQkgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLQkgIHsKLQkgICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiOwotCSAgfQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICAgKi8KLQkgIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLQkgIHsKLQkgICAgT2JqZWN0IG9iamVjdCA9IG51bGw7CSAgICAKLQkgICAgCi0JICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAgICB7Ci0JICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREluY2x1ZGUgfHwgb2JqZWN0IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpIHsKLQkJICAgIHNjaGVtYUxvY2F0aW9uU2VjdGlvbiA9IG5ldyBTY2hlbWFMb2NhdGlvblNlY3Rpb24oKTsKLQkgICAgICAJcmV0dXJuIHRydWU7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1NjaGVtYUxvY2F0aW9uU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TY2hlbWFMb2NhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhM2I3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1NjaGVtYUxvY2F0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkudmlld2Vycy5SZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5YU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbmNsdWRlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RSZWRlZmluZUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNjaGVtYUxvY2F0aW9uU2VjdGlvbiBleHRlbmRzIENvbW1vbkRpcmVjdGl2ZXNTZWN0aW9uCi17Ci0JICBJV29ya2JlbmNoUGFydCBwYXJ0OwotCSAgCi0JICAvKioKLQkgICAqIAotCSAgICovCi0JICBwdWJsaWMgU2NoZW1hTG9jYXRpb25TZWN0aW9uKCkKLQkgIHsKLQkgICAgc3VwZXIoKTsKLQkgIH0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JCXsKLQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICAgIGludCBsZWZ0Q29vcmRpbmF0ZSA9IGdldFN0YW5kYXJkTGFiZWxXaWR0aChjb21wb3NpdGUsIAotICAgICAgICAgIG5ldyBTdHJpbmdbXSB7WFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1NDSEVNQV9MT0NBVElPTiIpfSk7Ci0gICAgICAKLQkJCS8vIENyZWF0ZSBTY2hlbWEgTG9jYXRpb24gTGFiZWwKLQkJCUNMYWJlbCBzY2hlbWFMb2NhdGlvbkxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TQ0hFTUFfTE9DQVRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotICAgICAgLy8gQ3JlYXRlIFNjaGVtYSBMb2NhdGlvbiBUZXh0Ci0gICAgICBzY2hlbWFMb2NhdGlvblRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIAotCQkJLy8gQ3JlYXRlIFdpemFyZCBCdXR0b24KLQkJCXdpemFyZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgICAKLSAgICAgIHdpemFyZEJ1dHRvbi5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUZvcm1EYXRhIGJ1dHRvbkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlidXR0b25Gb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgKyAyKTsKLQkJCWJ1dHRvbkZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwwKTsKLQkJCWJ1dHRvbkZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzY2hlbWFMb2NhdGlvblRleHQsIDAsIFNXVC5DRU5URVIpOwotCQkJd2l6YXJkQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uRm9ybURhdGEpOwotCQkJd2l6YXJkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJCi0JCQlzY2hlbWFMb2NhdGlvblRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQlGb3JtRGF0YSBzY2hlbWFMb2NhdGlvbkRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgIHNjaGVtYUxvY2F0aW9uRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIGxlZnRDb29yZGluYXRlKTsKLSAgICAgIHNjaGVtYUxvY2F0aW9uRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh3aXphcmRCdXR0b24sIDApOwotCQkJc2NoZW1hTG9jYXRpb25UZXh0LnNldExheW91dERhdGEoc2NoZW1hTG9jYXRpb25EYXRhKTsKLQkJCXNjaGVtYUxvY2F0aW9uVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsJCSAgICAKLQotCQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChzY2hlbWFMb2NhdGlvblRleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHNjaGVtYUxvY2F0aW9uVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCQlzY2hlbWFMb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLSAgICAgIC8vIGVycm9yIHRleHQKLSAgICAgIGVycm9yVGV4dCA9IG5ldyBTdHlsZWRUZXh0KGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgICAgZXJyb3JUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgIGVycm9yVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIAotICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHNjaGVtYUxvY2F0aW9uVGV4dCwgMCwgU1dULkxFRlQpOwotICAgICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2NoZW1hTG9jYXRpb25UZXh0LCAwKTsKLSAgICAgIGVycm9yVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICB7Ci0JCQlpZiAoZXZlbnQud2lkZ2V0ID09IHdpemFyZEJ1dHRvbikKLSAgICAgIHsKLQkJCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQkgICAgCi0JCQkJSUZpbGUgY3VycmVudElGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLQkJCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKG5ldyBTdHJpbmdbXSB7ICIueHNkIiB9LCAgLy8kTk9OLU5MUy0xJAotCQkJICAgICAgICAgICAgbmV3IElGaWxlW10geyBjdXJyZW50SUZpbGUgfSwKLQkJCSAgICAgICAgICAgIG51bGwpOwotCQkJICAgICAgCi0JCQkgIFhTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkIGZpbGVTZWxlY3RXaXphcmQgPSAKLQkJCSAgICAgIG5ldyBYU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZCh4c2RTY2hlbWEsIHRydWUsCi0JCQkgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9TQ0hFTUEiKSwgLy8kTk9OLU5MUy0xJAotCQkJICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfREVTQyIpLCAvLyROT04tTkxTLTEkCi0JCQkgICAgICAgICAgZmlsdGVyLAotCQkJICAgICAgICAgIChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQotCQkJICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgZmlsZVNlbGVjdFdpemFyZCk7Ci0JCQkgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQkJCSAgd2l6YXJkRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJICBpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQkJCQkgIAotCSAgICAgIFN0cmluZyB2YWx1ZSA9IHNjaGVtYUxvY2F0aW9uVGV4dC5nZXRUZXh0KCk7Ci0JICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0JICAgICAgewotCSAgICAgICAgSUZpbGUgc2VsZWN0ZWRJRmlsZSA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0UmVzdWx0RmlsZSgpOwotCSAgICAgICAgU3RyaW5nIHNjaGVtYUZpbGVTdHJpbmcgPSB2YWx1ZTsKLQkgICAgICAgIGlmIChzZWxlY3RlZElGaWxlICE9IG51bGwpIAotCSAgICAgICAgewotCSAgICAgICAgICBzY2hlbWFGaWxlU3RyaW5nID0gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKHNlbGVjdGVkSUZpbGUuZ2V0TG9jYXRpb24oKSwgY3VycmVudElGaWxlLmdldExvY2F0aW9uKCkpOwotCSAgICAgICAgfQotCSAgICAgICAgZWxzZQotCSAgICAgICAgewotCSAgICAgICAgICBzY2hlbWFGaWxlU3RyaW5nID0gZmlsZVNlbGVjdFdpemFyZC5nZXRVUkwoKTsKLQkgICAgICAgIH0KLQotICAgICAgICAgIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKHNjaGVtYUZpbGVTdHJpbmcsIGZpbGVTZWxlY3RXaXphcmQuZ2V0TmFtZXNwYWNlKCksIG51bGwpOwotCSAgICAgICAgcmVmcmVzaCgpOwotCQkJICB9IAotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JCXsKLQkJCWlmIChkb1JlZnJlc2gpCi0JCQl7Ci0JCQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotCQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICAgICAgeyAKLQkJCQkJZWxlbWVudCA9ICgoWFNESW5jbHVkZUltcGwpIGlucHV0KS5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICAgIHsKLQkJCQkJZWxlbWVudCA9ICgoWFNEUmVkZWZpbmVJbXBsKSBpbnB1dCkuZ2V0RWxlbWVudCgpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0JCQkJCVN0cmluZyBsb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2F0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsb2NhdGlvbiA9ICIiOwotICAgICAgICAgIH0KLQkJCQkJc2NoZW1hTG9jYXRpb25UZXh0LnNldFRleHQobG9jYXRpb24pOwotCQkJCX0KLQotICAgICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICAgKi8KLQkgIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAgewotCSAgICByZXR1cm4gdHJ1ZTsKLQkgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTY2hlbWFMb2NhdGlvbkNoYW5nZShTdHJpbmcgc2NoZW1hRmlsZVN0cmluZywgU3RyaW5nIG5hbWVzcGFjZSwgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREluY2x1ZGUpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoWFNESW5jbHVkZUltcGwpIGlucHV0KS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJzY2hlbWFMb2NhdGlvbiIsIHNjaGVtYUZpbGVTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRFJlZGVmaW5lSW1wbCkgaW5wdXQpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIiwgc2NoZW1hRmlsZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1NpbXBsZUNvbnRlbnRCYXNlVHlwZU9wdGlvbnNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vU2ltcGxlQ29udGVudEJhc2VUeXBlT3B0aW9uc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWExYTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vU2ltcGxlQ29udGVudEJhc2VUeXBlT3B0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbnRlbnRCYXNlVHlwZU9wdGlvbnNEaWFsb2cgZXh0ZW5kcyBUeXBlc0RpYWxvZwotewotICAvKioKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqIEBwYXJhbSBlbGVtZW50Ci0gICAqIEBwYXJhbSBpZAotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwdWJsaWMgU2ltcGxlQ29udGVudEJhc2VUeXBlT3B0aW9uc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRWxlbWVudCBlbGVtZW50LCBPYmplY3QgaWQsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZWxlbWVudCwgaWQsIHhzZFNjaGVtYSk7Ci0gICAgc2hvd0Fub255bW91cyA9IGZhbHNlOwotICB9Ci0gIAotCXByb3RlY3RlZCB2b2lkIG9rKCkKLQl7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJaW50IHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uID49IDApCi0JCSB7Ci0JCSAgdHlwZU9iamVjdCA9IGl0ZW1zW3NlbGVjdGlvbl0uZ2V0RGF0YSgpOwotCQl9Ci0JfQotCi0gIAotICBwdWJsaWMgdm9pZCBoYW5kbGVTZXRJbnB1dCgpCi0gIHsKLSAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICB0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGUoKS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgIHNob3dBbm9ueW1vdXMgPSBmYWxzZTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBkZXJpdmVkQnkgPSBkb21IZWxwZXIuZ2V0RGVyaXZlZEJ5TmFtZShlbGVtZW50KTsKLSAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGRvbUhlbHBlci5nZXRCYXNlVHlwZShlbGVtZW50KTsKLSAgICAgIGJvb2xlYW4gZGVyaXZlZEJ5UmVzdHJpY3Rpb24gPSB0cnVlOwotICAgICAgCi0gICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLQotICAgICAgICBwcmV2aW91c1R5cGUgPSAzOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBpZiAoZGVyaXZlZEJ5LmVxdWFscygicmVzdHJpY3Rpb24iKSkKLSAgICAgICAgewotICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZSgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZGVyaXZlZEJ5LmVxdWFscygiZXh0ZW5zaW9uIikpCi0gICAgICAgIHsKLSAgICAgICAgICBkZXJpdmVkQnlSZXN0cmljdGlvbiA9IGZhbHNlOwotICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGUoKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgICAgaWYgKGRlcml2ZWRCeSAhPSBudWxsKQotICAgICAgewotICAgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmICFiYXNlVHlwZS5lcXVhbHMoIiIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgcGFyZW50ID0gKEVsZW1lbnQpZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb21wb25lbnQgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGVEZWZpbml0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pY29tcG9uZW50OwotICAgICAgICAgICAgICBiYXNlVHlwZURlZmluaXRpb24gPSBjb21wbGV4VHlwZS5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgaWYgKHR5cGVTZWN0aW9uLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSkuY29udGFpbnMoYmFzZVR5cGUpICYmICFkZXJpdmVkQnlSZXN0cmljdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgICAgcG9wdWxhdGVCdWlsdEluVHlwZSgpOwotICAgICAgICAgICAgICBpbnQgaSA9IHR5cGVTZWN0aW9uLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSkuaW5kZXhPZihiYXNlVHlwZSk7Ci0gICAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihpKTsKLSAgICAgICAgICAgICAgcHJldmlvdXNUeXBlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uICYmICFkZXJpdmVkQnlSZXN0cmljdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICAgIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoKTsKLSAgICAgICAgICAgICAgaW50IGkgPSB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpLmluZGV4T2YoYmFzZVR5cGUpOwotICAgICAgICAgICAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSArIDEpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcHJldmlvdXNUeXBlID0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgICBwb3B1bGF0ZVVzZXJDb21wbGV4VHlwZSgpOwotICAgICAgICAgICAgICBpbnQgaSA9IHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpLmluZGV4T2YoYmFzZVR5cGUpOwotICAgICAgICAgICAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSArIDEpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcHJldmlvdXNUeXBlID0gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIHBvcHVsYXRlVXNlckNvbXBsZXhUeXBlKCk7Ci0gICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TaW1wbGVDb250ZW50VW5pb25NZW1iZXJUeXBlc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TaW1wbGVDb250ZW50VW5pb25NZW1iZXJUeXBlc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDM0YTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0cy5UeXBlU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZTsKLSAgLyoqCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKi8KLSAgcHVibGljIFNpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHRoaXMuc2ltcGxlVHlwZSA9IHNpbXBsZVR5cGU7Ci0gIH0KLSAgCi0gIFRhYmxlIHRhYmxlOwotICBUeXBlU2VjdGlvbiB0eXBlU2VjdGlvbjsKLSAgQnV0dG9uIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uOwotICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0IG1lbWJlclR5cGVzTGlzdDsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHJlc3VsdDsKLQotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKQotICB7Ci0gICAgaWYgKGJ1dHRvbklkID09IERpYWxvZy5PSykKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBpbnQgbGVuZ3RoID0gbWVtYmVyVHlwZXNMaXN0LmdldEl0ZW1Db3VudCgpOwotICAgICAgZm9yIChpbnQgaT0wIDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBzYi5hcHBlbmQobWVtYmVyVHlwZXNMaXN0LmdldEl0ZW0oaSkpOwotICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpCi0gICAgICAgIHsKLSAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdCgpIHsgcmV0dXJuIHJlc3VsdDsgfQotCi0gIC8vCi0gIC8vIENyZWF0ZSB0aGUgY29udHJvbHMKLSAgLy8KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgaW50IHRhYkluZGV4ID0gMDsKLSAgICBDb21wb3NpdGUgY2xpZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgZ2V0U2hlbGwoKS5zZXRUZXh0KCJVbmlvbiAiICsgWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7IAotICAgIAotICAgIExhYmVsIGluc3RydWN0aW9ucyA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5MRUZUIHwgU1dULldSQVApOwotICAgIGluc3RydWN0aW9ucy5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TRUxFQ1RfTUVNQkVSVFlQRVMiKSk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGNvbHVtbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNsaWVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgY2NHTCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgY2NHTC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgIGNjR0wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgIGNjR0wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBjY0dMLm1hcmdpbldpZHRoID0gMDsKLSAgICBjY0dMLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgY2NHTC5udW1Db2x1bW5zID0gMzsKLSAgICBjb2x1bW5zQ29tcG9zaXRlLnNldExheW91dChjY0dMKTsKLSAgICAKLSAgICBHcmlkRGF0YSBjY0dEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgY2NHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjY0dELmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbHVtbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShjY0dEKTsgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdHlwZVNlY3Rpb24gPSBuZXcgVHlwZVNlY3Rpb24oY29sdW1uc0NvbXBvc2l0ZSk7Ci0gICAgdHlwZVNlY3Rpb24uc2V0U2hvd1VzZXJDb21wbGV4VHlwZShmYWxzZSk7Ci0KLSAgICB0eXBlU2VjdGlvbi5jcmVhdGVDbGllbnQoY29sdW1uc0NvbXBvc2l0ZSk7Ci0gICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihjb2x1bW5zQ29tcG9zaXRlLCAxKTsKLSAgICAKLSAgICBMYWJlbCBtZW1iZXJMaXN0TGFiZWwgPSBuZXcgTGFiZWwoY29sdW1uc0NvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgIG1lbWJlckxpc3RMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9NRU1CRVJUWVBFU19WQUxVRSIpKTsKLSAgICAKLSAgICBDb21wb3NpdGUgZGF0YUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBkY0dMID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBkY0dMLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgZGNHTC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGRjR0wubWFyZ2luV2lkdGggPSAwOwotICAgIGRjR0wubnVtQ29sdW1ucyA9IDM7Ci0gICAgZGF0YUNvbXBvc2l0ZS5zZXRMYXlvdXQoZGNHTCk7Ci0gICAgCi0gICAgR3JpZERhdGEgZGNHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRjR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGNHRC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRjR0QpOwotICAgIAotICAgIHRhYmxlID0gbmV3IFRhYmxlKGRhdGFDb21wb3NpdGUsCi0gICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsgCi0gICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0gICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgIEdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkMi5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZDIuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdkMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBnZDIudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkMi5oZWlnaHRIaW50ID0gMjAwOwotICAgIGdkMi53aWR0aEhpbnQgPSAyMDA7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZDIpOwotCi0gICAgLy8gRmlsbCB0YWJsZQotICAgIGhhbmRsZVNldElucHV0KCk7Ci0gICAgaW50IHRhYmxlSXRlbUNvdW50ID0gdGFibGUuZ2V0SXRlbUNvdW50KCk7Ci0KLSAgICBUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotLy8gICAgdGMuc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpKTsKLSAgICAvL3RjLnNldFRleHQoIkF2YWlsYWJsZSB0eXBlczoiKTsKLSAgICB0Yy5zZXRXaWR0aCgyMDApOwotICAgIHRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICAKLSAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkYXRhQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBiY0dMID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBiY0dMLm51bUNvbHVtbnMgPSAxOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYmNHTCk7Ci0gICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICBhZGRCdXR0b24uc2V0VGV4dCgiPiIpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KCI8Iik7Ci0gICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIENvbXBvc2l0ZSBsaXN0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkYXRhQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBtdEdMID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBtdEdMLm51bUNvbHVtbnMgPSAxOwotICAgIG10R0wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBtdEdMLm1hcmdpbldpZHRoID0gMDsKLSAgICBtdEdMLmhvcml6b250YWxTcGFjaW5nID0gMDsKLSAgICBtdEdMLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgbGlzdENvbXBvc2l0ZS5zZXRMYXlvdXQobXRHTCk7Ci0KLSAgICBHcmlkRGF0YSBtdEdEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgbXRHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBtdEdELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBtdEdELnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBtdEdELmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxpc3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShtdEdEKTsKLSAgICAKLSAgICBtZW1iZXJUeXBlc0xpc3QgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdChsaXN0Q29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSBtdGxHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIG10bEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIG10bEdELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBtdGxHRC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbXRsR0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbXRsR0QuaGVpZ2h0SGludCA9IDIwMDsKLSAgICBtdGxHRC53aWR0aEhpbnQgPSAyMDA7Ci0gICAgbWVtYmVyVHlwZXNMaXN0LnNldExheW91dERhdGEobXRsR0QpOwotICAgIAotICAgIGluaXRpYWxpemVNZW1iZXJMaXN0Q29udGVudCgpOwotICAgIHJldHVybiBjbGllbnQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZU1lbWJlckxpc3RDb250ZW50KCkKLSAgewotLy8gICAgU3RyaW5nIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpOwotLy8gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotLy8gICAgewotLy8gICAgICByZXR1cm47Ci0vLyAgICB9Ci0vLyAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW4gPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc3VsdCk7Ci0vLyAgICB3aGlsZSAodG9rZW4uaGFzTW9yZVRva2VucygpKQotLy8gICAgewotLy8gICAgICBtZW1iZXJUeXBlc0xpc3QuYWRkKHRva2VuLm5leHRUb2tlbigpKTsKLS8vICAgIH0KLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gc2ltcGxlVHlwZS5nZXRTY2hlbWEoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzaW1wbGVUeXBlLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgU3RyaW5nIG5hbWUgPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWkubmV4dCgpKS5nZXRRTmFtZShzY2hlbWEpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIG1lbWJlclR5cGVzTGlzdC5hZGQobmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpICYmIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5nZXRTZWxlY3Rpb24oKSkKLSAgICAgewotICAgICAgcG9wdWxhdGVCdWlsdEluVHlwZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpICYmIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gICAgIHsKLSAgICAgIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBhZGRCdXR0b24pCi0gICAgewotICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgaW50IHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5sZW5ndGggPiAwICYmIHNlbGVjdGlvbiA+PSAwKQotICAgICAgewotICAgICAgICBTdHJpbmcgdHlwZVRvQWRkID0gaXRlbXNbc2VsZWN0aW9uXS5nZXREYXRhKCkudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKG1lbWJlclR5cGVzTGlzdC5pbmRleE9mKHR5cGVUb0FkZCkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgbWVtYmVyVHlwZXNMaXN0LmFkZChpdGVtc1tzZWxlY3Rpb25dLmdldERhdGEoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSByZW1vdmVCdXR0b24pCi0gICAgewotICAgICAgU3RyaW5nW10gdHlwZXNUb1JlbW92ZSA9IG1lbWJlclR5cGVzTGlzdC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IHR5cGVzVG9SZW1vdmUubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIG1lbWJlclR5cGVzTGlzdC5yZW1vdmUodHlwZXNUb1JlbW92ZVtpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBoYW5kbGVTZXRJbnB1dCgpCi0gIHsKLSAgICBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlQnVpbHRJblR5cGUoKQotICB7Ci0gICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgTGlzdCBpdGVtcyA9IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgewotICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICBpdGVtLnNldFRleHQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgaXRlbS5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIikpOwotICAgICAgaXRlbS5zZXREYXRhKGl0ZW1zLmdldChpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZShib29sZWFuIHNob3dBbm9ueW1vdXMpCi0gIHsKLSAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICAgewotICAgICAgVGFibGVJdGVtIGFub255bW91c0l0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICBhbm9ueW1vdXNJdGVtLnNldFRleHQoIioqYW5vbnltb3VzKioiKTsKLSAgICAgIGFub255bW91c0l0ZW0uc2V0RGF0YSgiKiphbm9ueW1vdXMqKiIpOwotICAgIH0KLSAgICBMaXN0IGl0ZW1zID0gZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgICB7Ci0gICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgIGl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICBpdGVtLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKSk7Ci0gICAgICBpdGVtLnNldERhdGEoaXRlbXMuZ2V0KGkpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoc2ltcGxlVHlwZS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIGhlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkKLSAgewotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihzaW1wbGVUeXBlLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gaGVscGVyLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TaW1wbGVUeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TaW1wbGVUeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTM4ODcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vU2ltcGxlVHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkNyZWF0ZUVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkRPTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueHNkLlhTRENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueHNkLlhTRENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54c2QuWFNEU2V0VHlwZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgQ0NvbWJvIHZhcmlldHlDb21ibzsKLSAgVGV4dCB0eXBlc1RleHQ7Ci0gIENMYWJlbCB0eXBlc0xhYmVsOwotICBCdXR0b24gYnV0dG9uOwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVUeXBlU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLQotCQl2YXJpZXR5Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlDTGFiZWwgbGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1ZBUklFVFkiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLQkJTGlzdCBsaXN0ID0gWFNEVmFyaWV0eS5WQUxVRVM7CQotCQlJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0JCXsKLQkJICB2YXJpZXR5Q29tYm8uYWRkKCgoWFNEVmFyaWV0eSlpdGVyLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJfQotICAgIHZhcmlldHlDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXZhcmlldHlDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZhcmlldHlDb21ibywgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh2YXJpZXR5Q29tYm8sIDAsIFNXVC5DRU5URVIpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIHR5cGVzVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgdHlwZXNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfTUVNQkVSVFlQRVMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotICAgIGJ1dHRvbi5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICB0eXBlc1RleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYnV0dG9uLCAwLCBTV1QuQ0VOVEVSKTsKLSAgICB0eXBlc1RleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh0eXBlc1RleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChidXR0b24sIDAsIFNXVC5DRU5URVIpOwotICAgIHR5cGVzTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHR5cGVzVGV4dCwgMCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsMCk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodmFyaWV0eUNvbWJvLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0gICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotCSAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0JICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCSAgdmFyaWV0eUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgdHlwZXNUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgdHlwZXNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEVfV0lUSF9DT0xPTiIpKTsgLy8kTk9OLU5MUy0xJAotCSAgaWYgKGlucHV0ICE9IG51bGwpCi0JICB7Ci0JICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotCSAgICB7Ci0JICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24paW5wdXQ7Ci0gICAgICAgIAotICAgICAgICBFbGVtZW50IHNpbXBsZVR5cGVFbGVtZW50ID0gc3QuZ2V0RWxlbWVudCgpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCSAgICAgIFN0cmluZyB2YXJpZXR5ID0gc3QuZ2V0VmFyaWV0eSgpLmdldE5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIGludCBpbnRWYXJpZXR5ID0gc3QuZ2V0VmFyaWV0eSgpLmdldFZhbHVlKCk7Ci0gICAgICAgIAotCSAgICAgIGlmICh2YXJpZXR5ICE9IG51bGwpCi0JICAgICAgewotICAgICAgICAgIHZhcmlldHlDb21iby5zZXRUZXh0KHZhcmlldHkpOwotICAgICAgICAgIGlmIChpbnRWYXJpZXR5ID09IFhTRFZhcmlldHkuQVRPTUlDKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudClkb21IZWxwZXIuZ2V0Q2hpbGROb2RlKHNpbXBsZVR5cGVFbGVtZW50LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpOwotLy8gICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZUVsZW1lbnQsIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcpOwotLy8gICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybjsKLS8vICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2YXJpZXR5Q29tYm8uc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTk9fVFlQRSIpKTsgLy8gIlNlbGVjdCBhIHNpbXBsZSB0eXBlIHZhcmlldHkiKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZXNUZXh0LnNldFRleHQoIioqYW5vbnltb3VzKioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGVzVGV4dC5zZXRUZXh0KHJlc3VsdCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfQkFTRV9UWVBFX1dJVEhfQ09MT04iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoaW50VmFyaWV0eSA9PSBYU0RWYXJpZXR5LkxJU1QpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZUVsZW1lbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZXNUZXh0LnNldFRleHQoIioqYW5vbnltb3VzKioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGVzVGV4dC5zZXRUZXh0KHJlc3VsdCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfSVRFTV9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGludFZhcmlldHkgPT0gWFNEVmFyaWV0eS5VTklPTikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IHVuaW9uRWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZUVsZW1lbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRyk7Ci0gICAgICAgICAgICBpZiAodW5pb25FbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBtZW1iZXJUeXBlcyA9IHVuaW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIGlmIChtZW1iZXJUeXBlcyAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZXNUZXh0LnNldFRleHQobWVtYmVyVHlwZXMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCSAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotCSAgT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLSAgICBpZiAoZS53aWRnZXQgPT0gdmFyaWV0eUNvbWJvKQotICAgIHsKLSAgCSAgaWYgKGlucHV0ICE9IG51bGwpCi0gIAkgIHsKLSAgCSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgCSAgICB7Ci0gIAkgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilpbnB1dDsKLSAgICAgICAgICBFbGVtZW50IHBhcmVudCA9IHN0LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAKLSAgCSAgICAgIFN0cmluZyB2YXJpZXR5ID0gdmFyaWV0eUNvbWJvLmdldFRleHQoKTsKLSAgCSAgICAgIGlmICh2YXJpZXR5LmVxdWFscyhYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMLmdldE5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZXNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEVfV0lUSF9DT0xPTiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3Quc2V0VmFyaWV0eShYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMKTsKLSAgICAgICAgICAgIExpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfUkVTVFJJQ1RJT04iKSwgcGFyZW50LCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgCSAgICAgIGVsc2UgaWYgKHZhcmlldHkuZXF1YWxzKFhTRFZhcmlldHkuVU5JT05fTElURVJBTC5nZXROYW1lKCkpKQotICAJICAgICAgewotICAgICAgICAgICAgdHlwZXNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9NRU1CRVJUWVBFUyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3Quc2V0VmFyaWV0eShYU0RWYXJpZXR5LlVOSU9OX0xJVEVSQUwpOwotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QoWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9VTklPTiIpLCBwYXJlbnQsIG51bGwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAJICAgICAgZWxzZSBpZiAodmFyaWV0eS5lcXVhbHMoWFNEVmFyaWV0eS5MSVNUX0xJVEVSQUwuZ2V0TmFtZSgpKSkKLSAgCSAgICAgIHsKLSAgICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfSVRFTV9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzdC5zZXRWYXJpZXR5KFhTRFZhcmlldHkuTElTVF9MSVRFUkFMKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9MSVNUIiksIHBhcmVudCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gIAkgICAgfQotICAJICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGJ1dHRvbikKLSAgICB7Ci0gICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWlucHV0KS5nZXRFbGVtZW50KCk7Ci0gICAgICBEaWFsb2cgZGlhbG9nID0gbnVsbDsKLSAgICAgIFN0cmluZyBwcm9wZXJ0eSA9ICIiOwotICAgICAgRWxlbWVudCBzZWNvbmRhcnlFbGVtZW50ID0gbnVsbDsKLSAgICAgIAotICAgICAgSUZpbGUgY3VycmVudElGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLQotICAgICAgWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIoY3VycmVudElGaWxlLCB4c2RTY2hlbWEpOwotICAgICAgZGlhbG9nID0gbmV3IFhTRENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgIlNldCBUeXBlIiwgcHJvdmlkZXIpOyAgLy8gVE9ETzogRXh0ZXJuYWxpemUgVGhpcwotICAgICAgcHJvdmlkZXIuc2V0RGlhbG9nKChYU0RDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cpIGRpYWxvZyk7Ci0gICAgICAKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilpbnB1dDsKLSAgICAgICAgRWxlbWVudCBzaW1wbGVUeXBlRWxlbWVudCA9IHN0LmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHN0LmdldFZhcmlldHkoKSA9PSBYU0RWYXJpZXR5LkxJU1RfTElURVJBTCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoRWxlbWVudClkb21IZWxwZXIuZ2V0Q2hpbGROb2RlKHNpbXBsZVR5cGVFbGVtZW50LCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRyk7Ci0vLyAgICAgICAgICBkaWFsb2cgPSBuZXcgVHlwZXNEaWFsb2coc2hlbGwsIGxpc3RFbGVtZW50LCBYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLCB4c2RTY2hlbWEpOwotLy8gICAgICAgICAgZGlhbG9nLnNob3dDb21wbGV4VHlwZXMgPSBmYWxzZTsKLSAgICAgICAgICBwcm92aWRlci5zaG93Q29tcGxleFR5cGVzKGZhbHNlKTsKLSAgICAgICAgICAKLSAgICAgICAgICBzZWNvbmRhcnlFbGVtZW50ID0gbGlzdEVsZW1lbnQ7Ci0gICAgICAgICAgcHJvcGVydHkgPSBYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0LmdldFZhcmlldHkoKSA9PSBYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBkZXJpdmVkQnlFbGVtZW50ID0gKEVsZW1lbnQpZG9tSGVscGVyLmdldENoaWxkTm9kZShzaW1wbGVUeXBlRWxlbWVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgICBpZiAoZGVyaXZlZEJ5RWxlbWVudCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRlcml2ZWRCeUVsZW1lbnQgPSAoRWxlbWVudClkb21IZWxwZXIuZ2V0Q2hpbGROb2RlKHNpbXBsZVR5cGVFbGVtZW50LCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgICAgIGlmIChkZXJpdmVkQnlFbGVtZW50ID09IG51bGwpIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRlcml2ZWRCeUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIGRpYWxvZyA9IG5ldyBUeXBlc0RpYWxvZyhzaGVsbCwgZGVyaXZlZEJ5RWxlbWVudCwgWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFLCB4c2RTY2hlbWEpOwotLy8gICAgICAgICAgICBkaWFsb2cuc2hvd0NvbXBsZXhUeXBlcyA9IGZhbHNlOwotICAgICAgICAgICAgICBwcm92aWRlci5zaG93Q29tcGxleFR5cGVzKGZhbHNlKTsKLQotICAgICAgICAgICAgICBzZWNvbmRhcnlFbGVtZW50ID0gZGVyaXZlZEJ5RWxlbWVudDsKLSAgICAgICAgICAgICAgcHJvcGVydHkgPSBYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0LmdldFZhcmlldHkoKSA9PSBYU0RWYXJpZXR5LlVOSU9OX0xJVEVSQUwpCi0gICAgICAgIHsKLSAgICAgICAgICBTaW1wbGVDb250ZW50VW5pb25NZW1iZXJUeXBlc0RpYWxvZyB1bmlvbkRpYWxvZyA9IG5ldyBTaW1wbGVDb250ZW50VW5pb25NZW1iZXJUeXBlc0RpYWxvZyhzaGVsbCwgc3QpOwotICAgICAgICAgIHVuaW9uRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgICAgIHVuaW9uRGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgIAotICAgICAgICAgIGludCByZXN1bHQgPSB1bmlvbkRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gdW5pb25EaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfTUVNQkVSVFlQRVNfQ0hBTkdFIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBFbGVtZW50IHVuaW9uRWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgICAgIHVuaW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotCi0gICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bmlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5pb25FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5kUmVjb3JkaW5nKHVuaW9uRWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoZG9SZWZyZXNoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLS8vICAgICAgICAgIGRpYWxvZyA9IG5ldyBUeXBlc0RpYWxvZyhzaGVsbCwgZWxlbWVudCwgInR5cGUiLCB4c2RTY2hlbWEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwcm9wZXJ0eSA9ICJ0eXBlIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotLy8gICAgICAgIGRpYWxvZyA9IG5ldyBUeXBlc0RpYWxvZyhzaGVsbCwgZWxlbWVudCwgInR5cGUiLCB4c2RTY2hlbWEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgcHJvcGVydHkgPSAidHlwZSI7Ci0gICAgICB9Ci0gICAgICBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVFlQRV9DSEFOR0UiKSwgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotICAgICAgCi0gICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICAgIHsKLSAgICAgICAgICBpZiAoc2Vjb25kYXJ5RWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHNlY29uZGFyeUVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgIH0KLSAgICAgICAgICBYU0RTZXRUeXBlSGVscGVyIGhlbHBlciA9IG5ldyBYU0RTZXRUeXBlSGVscGVyKGN1cnJlbnRJRmlsZSwgeHNkU2NoZW1hKTsKLSAgICAgICAgICBoZWxwZXIuc2V0VHlwZShzZWNvbmRhcnlFbGVtZW50LCBwcm9wZXJ0eSwgKChYU0RDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cpIGRpYWxvZykuZ2V0U2VsZWN0aW9uKCkpOyAgICAgICAgICAKLQotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilnZXRJbnB1dCgpOwotICAgICAgICBzdC5zZXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgICB1cGRhdGVTaW1wbGVUeXBlRmFjZXRzKCk7Ci0gICAgICB9Ci0gICAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgfQotICAgIGlmIChkb1JlZnJlc2gpCi0gICAgewotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIEVsZW1lbnQgcGFyZW50LCBOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWdldElucHV0KCk7Ci0gICAgTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyByZXVzZVR5cGUgPSBudWxsOwotICAgIAotICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9WQVJJRVRZX0NIQU5HRSIpLCBwYXJlbnQpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGVsZW1lbnRUYWcuZXF1YWxzKFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgRWxlbWVudCBsaXN0Tm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgaWYgKGxpc3ROb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IGxpc3ROb2RlLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFKTsKLSAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKGxpc3ROb2RlKTsKLSAgICAgIH0KLQotICAgICAgRWxlbWVudCB1bmlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAodW5pb25Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBtZW1iZXJBdHRyID0gdW5pb25Ob2RlLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKG1lbWJlckF0dHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1lbWJlckF0dHIpOwotICAgICAgICAgIHJldXNlVHlwZSA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UodW5pb25Ob2RlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHJldXNlVHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXVzZVR5cGUgPSBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKTsgICAgICAgIAotICAgICAgfQotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIHJldXNlVHlwZSkpOwotICAgICAgc3Quc2V0SXRlbVR5cGVEZWZpbml0aW9uKG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50VGFnLmVxdWFscyhYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgRWxlbWVudCByZXN0cmljdGlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAocmVzdHJpY3Rpb25Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IHJlc3RyaWN0aW9uTm9kZS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLSAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHJlc3RyaWN0aW9uTm9kZSk7Ci0gICAgICB9Ci0gICAgICBFbGVtZW50IHVuaW9uTm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgIGlmICh1bmlvbk5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG1lbWJlckF0dHIgPSB1bmlvbk5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpOwotICAgICAgICBpZiAobWVtYmVyQXR0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVtYmVyQXR0cik7Ci0gICAgICAgICAgcmV1c2VUeXBlID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICB9Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh1bmlvbk5vZGUpOwotICAgICAgfQotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLCByZXVzZVR5cGUpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudFRhZy5lcXVhbHMoWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGxpc3ROb2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAobGlzdE5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV1c2VUeXBlID0gbGlzdE5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UobGlzdE5vZGUpOwotICAgICAgfQotICAgICAgRWxlbWVudCByZXN0cmljdGlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAocmVzdHJpY3Rpb25Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IHJlc3RyaWN0aW9uTm9kZS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLSAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHJlc3RyaWN0aW9uTm9kZSk7Ci0gICAgICB9Ci0gICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUsIHJldXNlVHlwZSkpOwotICAgICAgc3Quc2V0SXRlbVR5cGVEZWZpbml0aW9uKG51bGwpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIGVsZW1lbnRUYWcsIGZhbHNlKSA9PSBudWxsKQotICAgIHsKLSAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKGVsZW1lbnRUYWcsbGFiZWwsYXR0cmlidXRlcyxwYXJlbnQscmVsYXRpdmVOb2RlKTsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICB9Ci0KLSAgICBzdC5zZXRFbGVtZW50KHBhcmVudCk7Ci0vLyAgICBzdC51cGRhdGVFbGVtZW50KCk7Ci0gICAgZW5kUmVjb3JkaW5nKHBhcmVudCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQWN0aW9uIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24oU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBsYWJlbCwgTGlzdCBhdHRyaWJ1dGVzLCBFbGVtZW50IHBhcmVudCwgTm9kZSByZWxhdGl2ZU5vZGUpCi0gIHsKLSAgICBDcmVhdGVFbGVtZW50QWN0aW9uIGFjdGlvbiA9IG5ldyBDcmVhdGVFbGVtZW50QWN0aW9uKGxhYmVsKTsKLSAgICBhY3Rpb24uc2V0RWxlbWVudFRhZyhlbGVtZW50VGFnKTsKLSAgICBhY3Rpb24uc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICBhY3Rpb24uc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotICAgIGFjdGlvbi5zZXRSZWxhdGl2ZU5vZGUocmVsYXRpdmVOb2RlKTsKLSAgICByZXR1cm4gYWN0aW9uOwotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMoTm9kZSBwYXJlbnQsIFN0cmluZyBlbGVtZW50VGFnLCBib29sZWFuIGlzUmVmKQotICB7Ci0gICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIEVsZW1lbnQgdGFyZ2V0Tm9kZSA9IG51bGw7Ci0gICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLSAgICAgIGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCljaGlsZCwgZWxlbWVudFRhZywgaXNSZWYpKQotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0Tm9kZSA9IChFbGVtZW50KWNoaWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0YXJnZXROb2RlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKQotICB7Ci0gICAgU3RyaW5nIHN0cmluZ05hbWUgPSAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIGlmIChnZXRTY2hlbWEoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBzY2hlbWFGb3JTY2hlbWFQcmVmaXggPSBnZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpOwotICAgICAgaWYgKHNjaGVtYUZvclNjaGVtYVByZWZpeCAhPSBudWxsICYmIHNjaGVtYUZvclNjaGVtYVByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpOwotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ05hbWUgPSBwcmVmaXggKyAiOiIgKyBzdHJpbmdOYW1lOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZ05hbWU7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlU2ltcGxlVHlwZUZhY2V0cygpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilnZXRJbnB1dCgpOwotICAgIEVsZW1lbnQgc2ltcGxlVHlwZUVsZW1lbnQgPSBzdC5nZXRFbGVtZW50KCk7Ci0gICAgRWxlbWVudCBkZXJpdmVkQnlFbGVtZW50ID0gZ2V0RG9tSGVscGVyKCkuZ2V0RGVyaXZlZEJ5RWxlbWVudChzaW1wbGVUeXBlRWxlbWVudCk7Ci0gICAgaWYgKGRlcml2ZWRCeUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IG5vZGVzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBOb2RlTGlzdCBjaGlsZExpc3QgPSBkZXJpdmVkQnlFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGludCBsZW5ndGggPSBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRMaXN0Lml0ZW0oaSk7Ci0gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGVsZW1lbnRDaGlsZCA9IChFbGVtZW50KWNoaWxkOwotICAgICAgICAgIGlmICghKGVsZW1lbnRDaGlsZC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoInBhdHRlcm4iKSB8fCBlbGVtZW50Q2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJlbnVtZXJhdGlvbiIpIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50Q2hpbGQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50Q2hpbGQsIFhTRENvbnN0YW50cy5BTk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50Q2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnRDaGlsZCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgdHJ1ZSkgfHwKLSAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50Q2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudENoaWxkLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIHRydWUpIHx8Ci0gICAgICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudENoaWxkLCBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkKLSAgICAgICAgICAgICAgICkpCi0gICAgICAgICAgewotICAgICAgICAgICAgbm9kZXNUb1JlbW92ZS5hZGQoY2hpbGQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgSXRlcmF0b3IgaXRlciA9IG5vZGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBmYWNldFRvUmVtb3ZlID0gKEVsZW1lbnQpaXRlci5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBmYWNldE5hbWUgPSBmYWNldFRvUmVtb3ZlLmdldExvY2FsTmFtZSgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IHN0LmdldFZhbGlkRmFjZXRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgYm9vbGVhbiBkb1JlbW92ZSA9IHRydWU7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYVZhbGlkRmFjZXQgPSAoU3RyaW5nKWl0Lm5leHQoKTsKLSAgICAgICAgICBpZiAoYVZhbGlkRmFjZXQuZXF1YWxzKGZhY2V0TmFtZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9SZW1vdmUgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZG9SZW1vdmUpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoZmFjZXRUb1JlbW92ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TaW1wbGVUeXBlU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vU2ltcGxlVHlwZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODcxZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TaW1wbGVUeXBlU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlU2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yCi17Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFNpbXBsZVR5cGVTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueHNkZWRpdG9yLnNlY3Rpb24uc2ltcGxldHlwZSI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uLmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlVHlwZVNlY3Rpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54c2RlZGl0b3Iuc2VjdGlvbi5uYW1lIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1NpbXBsZVR5cGVVbmlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vU2ltcGxlVHlwZVVuaW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzU0ZWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vU2ltcGxlVHlwZVVuaW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZVVuaW9uU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBUZXh0IG1lbWJlclR5cGVzVGV4dDsKLSAgQnV0dG9uIGJ1dHRvbjsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgU2ltcGxlVHlwZVVuaW9uU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLQotCQltZW1iZXJUeXBlc1RleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlDTGFiZWwgbGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTIikpOyAvLyROT04tTkxTLTEkCi0gICAgYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICIuLi4iLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBtZW1iZXJUeXBlc1RleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0vLyAgICBtZW1iZXJUeXBlc1RleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg5NSwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCwgU1dULkNFTlRFUik7Ci0JCW1lbWJlclR5cGVzVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0KLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWVtYmVyVHlwZXNUZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCwgU1dULkNFTlRFUik7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1lbWJlclR5cGVzVGV4dCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwwKTsKLQkJLy8gZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodHlwZUNvbWJvLCAwLCBTV1QuQ0VOVEVSKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwwKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLQkgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQkgIG1lbWJlclR5cGVzVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCSAgaWYgKGlucHV0ICE9IG51bGwpCi0JICB7Ci0JICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotCSAgICB7Ci0JICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24paW5wdXQ7Ci0JICAgICAgZWxlbWVudCA9IHN0LmdldEVsZW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCB1bmlvbkVsZW1lbnQgPSAoRWxlbWVudClkb21IZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRyk7Ci0gICAgICAgIFN0cmluZyBtZW1iZXJUeXBlcyA9IHVuaW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7Ci0gICAgICAgIGlmIChtZW1iZXJUeXBlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbWVtYmVyVHlwZXNUZXh0LnNldFRleHQobWVtYmVyVHlwZXMpOwotICAgICAgICB9Ci0JICAgICAgCi0vLyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsJICAgICAgCi0vLwkgICAgICBpZiAoc3QuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCkuc2l6ZSgpID4gMCkKLS8vCSAgICAgIHsKLS8vCSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3QuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLS8vCSAgICAgICAgewotLy8JICAgICAgICAgIFN0cmluZyBuYW1lID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilpLm5leHQoKSkuZ2V0UU5hbWUoZ2V0U2NoZW1hKCkpOwotLy8JICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lKTsKLS8vCSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAiKTsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgIH0KLS8vCSAgICAgIH0KLS8vCSAgICAgIG1lbWJlclR5cGVzVGV4dC5zZXRUZXh0KGJ1Zi50b1N0cmluZygpKTsKLQkgICAgfQotCSAgfQotCSAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBidXR0b24pCi0gICAgewotCSAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAKLQkgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZ2V0SW5wdXQoKTsKLQkgICAgRWxlbWVudCBlbGVtZW50ID0gc3QuZ2V0RWxlbWVudCgpOwotICAgICAgU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2cgZGlhbG9nID0gbmV3IFNpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nKHNoZWxsLCBzdCk7Ci0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAKLSAgICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTX0NIQU5HRSIpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBFbGVtZW50IHVuaW9uRWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgdW5pb25FbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0KLSAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHVuaW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVuaW9uRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7ICAKLSAgICAgICAgfQotICAgICAgICBlbmRSZWNvcmRpbmcodW5pb25FbGVtZW50KTsKLQotICAgICAgfQotCi0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0JICBpZiAoZXZlbnQud2lkZ2V0ID09IG1lbWJlclR5cGVzVGV4dCkKLQkgIHsKLQkgIH0KLQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TaW1wbGVUeXBlVW5pb25TZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9TaW1wbGVUeXBlVW5pb25TZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFiYWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vU2ltcGxlVHlwZVVuaW9uU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlVW5pb25TZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFNpbXBsZVR5cGVVbmlvblNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhzZGVkaXRvci5zZWN0aW9uLnNpbXBsZXR5cGV1bmlvbiI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uLmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlVHlwZVVuaW9uU2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0vLyAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLS8vICAgIHsKLS8vICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotLy8gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotLy8gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilvYmplY3Q7Ci0vLyAgICAgICAgaWYgKHN0LmdldFZhcmlldHkoKS5nZXRWYWx1ZSgpID09IFhTRFZhcmlldHkuVU5JT04pCi0vLyAgICAgICAgewotLy8gICAgICAgICAgcmV0dXJuIHRydWU7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVGV4dENoYW5nZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UZXh0Q2hhbmdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjZmZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UZXh0Q2hhbmdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRleHRDaGFuZ2VIZWxwZXIgaW1wbGVtZW50cyBMaXN0ZW5lcgotewotCXByaXZhdGUgYm9vbGVhbiBub25Vc2VyQ2hhbmdlOwotCi0JLyoqCi0JICogTWFya3MgdGhlIHN0YXJ0IG9mIGEgcHJvZ3JhbW1hdGljIGNoYW5nZSB0byB0aGUgd2lkZ2V0IGNvbnRlbnRzLgotCSAqIENsaWVudHMgbXVzdCBjYWxsIHN0YXJ0Tm9uVXNlckNoYW5nZSgpIGJlZm9yZSBkaXJlY3RseSBzZXR0aW5nIAotCSAqIHRoZSB3aWRnZXQgY29udGVudHMgdG8gYXZvaWQgdW53YW50ZWQgbGlmZWN5Y2xlIGV2ZW50cy4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhIHByb2dyYW1tYXRpYyBjaGFuZ2UgaXMgCi0JICogYWxyZWFkeSBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE5vblVzZXJDaGFuZ2UoKSB7Ci0JCWlmIChub25Vc2VyQ2hhbmdlKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigid2UgYWxyZWFkeSBzdGFydGVkIGEgbm9uIHVzZXIgY2hhbmdlIik7Ly8kTk9OLU5MUy0xJAotCQlub25Vc2VyQ2hhbmdlID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGllbnRzIHdobyBjYWxsIHN0YXJ0Tm9uVXNlckNoYW5nZSgpIHNob3VsZCBjYWxsIAotCSAqIGZpbmlzaE5vblVzZXJDaGFuZ2UoKSBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHRoZSBjaGFuZ2UgaXMgZG9uZS4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBubyBjaGFuZ2UgaXMgaW4gcHJvZ3Jlc3MuCi0JICovCi0JcHVibGljIHZvaWQgZmluaXNoTm9uVXNlckNoYW5nZSgpIHsKLQkJaWYgKCFub25Vc2VyQ2hhbmdlKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigid2UgYXJlIG5vdCBpbiBhIG5vbiB1c2VyIGNoYW5nZSIpOy8vJE5PTi1OTFMtMSQKLQkJbm9uVXNlckNoYW5nZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhIHByb2dyYW1tYXRpYyBjaGFuZ2UgaXMgaW4gcHJvZ3Jlc3MuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb25Vc2VyQ2hhbmdlKCkgewotCQlyZXR1cm4gbm9uVXNlckNoYW5nZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuS2V5RG93biA6Ci0JCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpCi0JCQkJCXRleHRDaGFuZ2VkKChDb250cm9sKWV2ZW50LndpZGdldCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5Gb2N1c091dCA6Ci0JCQkJdGV4dENoYW5nZWQoKENvbnRyb2wpZXZlbnQud2lkZ2V0KTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFic3RyYWN0IG1ldGhvZCBub3RpZmllZCB3aGVuIGEgdGV4dCBmaWVsZCBoYXMgYmVlbiBjaGFuZ2VkLgotCSAqIEBwYXJhbSBjb250cm9sCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdGV4dENoYW5nZWQoQ29udHJvbCBjb250cm9sKTsKLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGlzIGhlbHBlciB3aXRoIHRoZSBnaXZlbiBjb250cm9sIHRvIGxpc3RlbiBmb3IgZXZlbnRzCi0JICogd2hpY2ggaW5kaWNhdGUgdGhhdCBhIGNoYW5nZSBpcyBpbiBwcm9ncmVzcyAob3IgZG9uZSkuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdUbyhDb250cm9sIGNvbnRyb2wpIHsKLQkJY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHRoaXMpOwotCQljb250cm9sLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGlzIGhlbHBlciB3aXRoIHRoZSBnaXZlbiBjb250cm9sIHRvIGxpc3RlbiBmb3IgdGhlCi0JICogRW50ZXIga2V5LiAgV2hlbiBFbnRlciBpcyBwcmVzc2VkLCB0aGUgY2hhbmdlIGlzIGNvbnNpZGVyZWQgZG9uZSAKLQkgKiAodGhpcyBpcyBvbmx5IGFwcHJvcHJpYXRlIGZvciBzaW5nbGUtbGluZSBUZXh0IHdpZGdldHMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nRm9yRW50ZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCS8vIE5PVEU6IEtleURvd24gcmF0aGVyIHRoYW4gS2V5VXAsIGJlY2F1c2Ugb2Ygc2ltaWxhciB1c2FnZSBpbiBDQ29tYm8uIAotCQljb250cm9sLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBVbnJlZ2lzdGVycyB0aGlzIGhlbHBlciBmcm9tIGEgY29udHJvbCBwcmV2aW91c2x5IHBhc3NlZCB0bwotCSAqIHN0YXJ0TGlzdGVuaW5nVG8oKSBhbmQvb3Igc3RhcnRMaXN0ZW5pbmdGb3JFbnRlcigpLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb250cm9sIGNvbnRyb2wpIHsKLQkJY29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHRoaXMpOwotCQljb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQljb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5LZXlEb3duLCB0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVzRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NzFlYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHMuVHlwZVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgVHlwZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciwgTGlzdGVuZXIKLXsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgU3RyaW5nIHByb3BlcnR5OwotCi0gIC8qKgotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICovCi0gIHB1YmxpYyBUeXBlc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRWxlbWVudCBlbGVtZW50LCBPYmplY3QgaWQsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIHRoaXMucHJvcGVydHkgPSAoU3RyaW5nKWlkOwotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0KLSAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgc2hvd0NvbXBsZXhUeXBlcyA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50LCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgc2hvd0NvbXBsZXhUeXBlcyA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIFN0cmluZyB0eXBlOwotICBPYmplY3QgdHlwZU9iamVjdDsKLSAgVGV4dCB0ZXh0RmllbGQ7Ci0gIFRhYmxlIHRhYmxlOwotICBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbjsKLSAgRWxlbWVudCBlbGVtZW50OwotICAKLSAgYm9vbGVhbiBzaG93Q29tcGxleFR5cGVzID0gdHJ1ZTsKLSAgVHlwZVNlY3Rpb24gdHlwZVNlY3Rpb247Ci0gIGJvb2xlYW4gc2hvd0Fub255bW91cyA9IHRydWU7Ci0gIFN0cmluZyBwcmV2aW91c1N0cmluZ1R5cGUgPSAiIjsKLSAgYm9vbGVhbiBpc0Fub255bW91czsKLSAgaW50IHByZXZpb3VzVHlwZTsKLQotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKQotICB7Ci0gICAgaWYgKGJ1dHRvbklkID09IERpYWxvZy5PSykKLSAgICB7Ci0gICAgICB0eXBlID0gdGFibGUuZ2V0SXRlbSh0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKS5nZXRUZXh0KCk7Ci0gICAgICBvaygpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0VHlwZU9iamVjdCgpIHsgcmV0dXJuIHR5cGVPYmplY3Q7IH0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeyByZXR1cm4gdHlwZTsgfQotCi0gIC8vCi0gIC8vIENyZWF0ZSB0aGUgY29udHJvbHMKLSAgLy8KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgaW50IHRhYkluZGV4ID0gMDsKLSAgICBDb21wb3NpdGUgY2xpZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgZ2V0U2hlbGwoKS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9BVkFJTEFCTEVfVFlQRVMiKSk7Ci0KLSAgICB0eXBlT2JqZWN0ID0gbnVsbDsKLSAgICAKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0vLyAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotLy8gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotLy8gICAgZ2wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotLy8gICAgZ2wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICBjbGllbnQuc2V0TGF5b3V0KGdsKTsKLQotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ob3Jpem9udGFsSW5kZW50ID0gMDsKLSAgICBjbGllbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgCi0gICAgdHlwZVNlY3Rpb24gPSBuZXcgVHlwZVNlY3Rpb24oY2xpZW50KTsKLSAgICB0eXBlU2VjdGlvbi5zZXRTaG93VXNlckNvbXBsZXhUeXBlKHNob3dDb21wbGV4VHlwZXMpOwotCi0gICAgdHlwZVNlY3Rpb24uY3JlYXRlQ2xpZW50KGNsaWVudCk7Ci0gICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgaWYgKHNob3dDb21wbGV4VHlwZXMpCi0gICAgewotICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgdGV4dEZpZWxkID0gVmlld1V0aWxpdHkuY3JlYXRlVGV4dEZpZWxkKGNsaWVudCwgNTApOwotICAgIHRleHRGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVWZXJ0aWNhbEZpbGxlcihjbGllbnQsIDApOwotCi0gICAgdGFibGUgPSBuZXcgVGFibGUoY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOyAKLSAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLSAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdkMi5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QyLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkMi52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QyLmhlaWdodEhpbnQgPSAyMDA7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZDIpOwotICAgIHRhYmxlLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHRoaXMpOwotICAgIAotICAgIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0vLyAgICB0YWJsZUNvbHVtbi5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIikpOwotICAgIHRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICB0YWJsZUNvbHVtbi5zZXRXaWR0aCgyMDApOwotCi0gICAgLy8gRmlsbCB0YWJsZSBhbmQgc2VsZWN0IGlucHV0IHR5cGUKLSAgICBoYW5kbGVTZXRJbnB1dCgpOwotCi0gICAgcmV0dXJuIGNsaWVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgCWlmIChldmVudC50eXBlID09IFNXVC5SZXNpemUgJiYgZXZlbnQud2lkZ2V0ID09IHRhYmxlKSB7Ci0gIAkJdGFibGVDb2x1bW4uc2V0V2lkdGgodGFibGUuZ2V0U2l6ZSgpLngpOwotICAJfQotICAJZWxzZSBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5ICYmIGV2ZW50LndpZGdldCA9PSB0ZXh0RmllbGQpIHsKLSAgCQlMaXN0IGl0ZW1zID0gbnVsbDsKLSAgCQlib29sZWFuIHNob3dBbGwgPSBmYWxzZTsKLSAgCQlTdHJpbmcgaW5wdXRTdHJpbmcgPSB0ZXh0RmllbGQuZ2V0VGV4dCgpOwotICAJCQotICAJCWlmIChpbnB1dFN0cmluZy5lcXVhbHMoIiIpKSB7Ci0gIAkJCXNob3dBbGwgPSB0cnVlOwotICAJCX0KLSAgCQllbHNlIHsKLSAgCQkJaW5wdXRTdHJpbmcgPSBpbnNlcnRTdHJpbmcoIioiLCAiLiIsIGlucHV0U3RyaW5nKTsKLSAgCQkJaW5wdXRTdHJpbmcgPSBpbnNlcnRTdHJpbmcoIj8iLCAiLiIsIGlucHV0U3RyaW5nKTsKLSAgCQkJaW5wdXRTdHJpbmcgPSBpbnB1dFN0cmluZyArICIuKiI7Ci0gIAkJfQotICAJCQotICAJCXRyeSB7Ci0gIAkJCWlmICh0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gIAkJCXsKLSAgCQkJCWlmIChzaG93QWxsKSB7Ci0gIAkJCQkJcG9wdWxhdGVCdWlsdEluVHlwZSgpOwotICAJCQkJfQotICAJCQkJZWxzZSB7Ci0gIAkJCQkJcG9wdWxhdGVCdWlsdEluVHlwZShpbnB1dFN0cmluZyk7Ci0gIAkJCQl9Ci0gIAkJCX0KLSAgCQkJZWxzZSBpZiAodHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gIAkJCXsKLSAgCQkJCWlmIChzaG93QWxsKSB7Ci0gIAkJCQkJcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUoKTsKLSAgCQkJCX0KLSAgCQkJCWVsc2UgewotICAJCQkJCXBvcHVsYXRlVXNlckNvbXBsZXhUeXBlKGlucHV0U3RyaW5nKTsKLSAgCQkJCX0KLSAgCQkJfQotICAJCQllbHNlIGlmICh0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLmdldFNlbGVjdGlvbigpKQotICAJCQl7Ci0gIAkJCQlpZiAoc2hvd0FsbCkgewotICAJCQkJCXBvcHVsYXRlVXNlclNpbXBsZVR5cGUoKTsKLSAgCQkJCX0KLSAgCQkJCWVsc2UgewotICAJCQkJCXBvcHVsYXRlVXNlclNpbXBsZVR5cGUoaW5wdXRTdHJpbmcpOwotICAJCQkJfQotICAJCQl9Ci0gIAkJfQotICAJCWNhdGNoIChFeGNlcHRpb24gZSkgewotICAJCQkvLyBEbyBub3RoaW5nCi0gIAkJfQotICAJfQotICAJCi0gIAlzZXRFbmFibGVkU3RhdGUoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWRTdGF0ZSgpIHsKLSAgCWlmICh0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKSB7Ci0gIAkJdGhpcy5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgCX0KLSAgCWVsc2UgewotICAJCXRoaXMuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAJfQotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBpbnNlcnRTdHJpbmcoU3RyaW5nIHRhcmdldCwgU3RyaW5nIG5ld1N0cmluZywgU3RyaW5nIHN0cmluZykgewotICAJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAlTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzdHJpbmcpOwotICAJCi0gIAlpbnQgaW5kZXggPSBzdHJpbmdCdWZmZXIuaW5kZXhPZih0YXJnZXQpOwotICAJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0gIAkJc3RyaW5nQnVmZmVyID0gc3RyaW5nQnVmZmVyLmluc2VydChpbmRleCwgbmV3U3RyaW5nKTsKLSAgCQlpbmRleCA9IHN0cmluZ0J1ZmZlci5pbmRleE9mKHRhcmdldCwgaW5kZXggKyBuZXdTdHJpbmcubGVuZ3RoKCkgKyB0YXJnZXQubGVuZ3RoKCkpOwotICAJfQotICAJCi0gIAlyZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpICYmIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5nZXRTZWxlY3Rpb24oKSkKLSAgICB7Ci0gICAgCWlmICh0ZXh0RmllbGQuZ2V0VGV4dCgpLmVxdWFscygiIikpIHsKLSAgICAJCXBvcHVsYXRlQnVpbHRJblR5cGUoKTsKLSAgICAJfQotICAgIAllbHNlIHsKLSAgICAJCXBvcHVsYXRlQnVpbHRJblR5cGUodGV4dEZpZWxkLmdldFRleHQoKSk7Ci0gICAgCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkgJiYgdHlwZVNlY3Rpb24uZ2V0VXNlckNvbXBsZXhUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gICAgewotICAgIAlpZiAodGV4dEZpZWxkLmdldFRleHQoKS5lcXVhbHMoIiIpKSB7Ci0gICAgCQlwb3B1bGF0ZVVzZXJDb21wbGV4VHlwZSgpOwotICAgIAl9Ci0gICAgCWVsc2UgewotICAgIAkJcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUodGV4dEZpZWxkLmdldFRleHQoKSk7Ci0gICAgCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKSAmJiB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAJaWYgKHRleHRGaWVsZC5nZXRUZXh0KCkuZXF1YWxzKCIiKSkgewotICAgIAkJcG9wdWxhdGVVc2VyU2ltcGxlVHlwZSgpOwotICAgIAl9Ci0gICAgCWVsc2UgewotICAgIAkJcG9wdWxhdGVVc2VyU2ltcGxlVHlwZSh0ZXh0RmllbGQuZ2V0VGV4dCgpKTsKLSAgICAJfQotICAgIH0KLSAgICBzZXRFbmFibGVkU3RhdGUoKTsKLSAgfQotICAKLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgb2soKQotICB7Ci0gICAgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgIGludCBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIGlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uID49IDApCi0gICAgewotICAgICAgdHlwZU9iamVjdCA9IGl0ZW1zW3NlbGVjdGlvbl0uZ2V0RGF0YSgpOwotICAgIH0KLS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigidHlwZU9iamVjdCBpcyAiICsgdHlwZU9iamVjdCk7Ci0KLS8vICAgIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9FTEVNRU5UX1RZUEVfQ0hBTkdFIiksIGVsZW1lbnQpOwotLy8gICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RZUEVfQ0hBTkdFIiksIGVsZW1lbnQpOwotLy8gICAgZG9TZXRWYWx1ZSh0eXBlT2JqZWN0KTsKLS8vICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0vLyAgICBkaWFsb2cuY2xvc2UoKTsKLQotICAgIGlmICghWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLQkgICAgaWYgKHR5cGVPYmplY3QuZXF1YWxzKCIqKmFub255bW91cyoqIikpCi0JICAgIHsKLQkgICAgICBpZiAodHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5nZXRTZWxlY3Rpb24oKSkKLQkgICAgICB7Ci0vLwkgICAgICAgIGlmICghcHJldmlvdXNTdHJpbmdUeXBlLmVxdWFscygiKiphbm9ueW1vdXMqKiIpKQotCSAgICAgICAgewotCSAgICAgICAgICB1cGRhdGVFbGVtZW50VG9Bbm9ueW1vdXMoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgICBlbHNlCi0JICAgICAgewotLy8JICAgICAgICBpZiAoIXByZXZpb3VzU3RyaW5nVHlwZS5lcXVhbHMoIioqYW5vbnltb3VzKioiKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgdXBkYXRlRWxlbWVudFRvQW5vbnltb3VzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRyk7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICAgIC8vIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSk7Ci0JICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocHJvcGVydHkpOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAgIFhTRERPTUhlbHBlci51cGRhdGVFbGVtZW50VG9Ob3RBbm9ueW1vdXMoZWxlbWVudCk7Ci0JICAgICAgLy9lbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIHR5cGVPYmplY3QudG9TdHJpbmcoKSk7Ci0JICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUocHJvcGVydHksIHR5cGVPYmplY3QudG9TdHJpbmcoKSk7Ci0JICAgIH0KLSAgICB9Ci0vLyAgICBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0KLSAgICAvL2ltcGxlbWVudCBkaXNwb3NlKCk7Ci0vLyAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLS8vICAgIHRhYmxlLmRpc3Bvc2UoKTsKLSAgfQotCi0JCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVNldElucHV0KCkKLSAgewotICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgIGlzQW5vbnltb3VzID0gY2hlY2tGb3JBbm9ueW1vdXNUeXBlKGVsZW1lbnQpOwotICAgIC8vIEF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgIEF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShwcm9wZXJ0eSk7Ci0gICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICBpZiAodHlwZVNlY3Rpb24uZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKS5jb250YWlucyh2YWx1ZSkpCi0gICAgICB7Ci0gICAgICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHBvcHVsYXRlQnVpbHRJblR5cGUoKTsKLSAgICAgICAgaW50IGkgPSB0eXBlU2VjdGlvbi5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpLmluZGV4T2YodmFsdWUpOwotICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0gICAgICAgIHByZXZpb3VzVHlwZSA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpLmNvbnRhaW5zKHZhbHVlKSkKLSAgICAgIHsKLSAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoKTsKLSAgICAgICAgaW50IGkgPSB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpLmluZGV4T2YodmFsdWUpOwotICAgICAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICAgICAgewotICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihpICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uKGkpOwotICAgICAgICB9Ci0gICAgICAgIHByZXZpb3VzVHlwZSA9IDI7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKS5jb250YWlucyh2YWx1ZSkpCi0gICAgICB7Ci0gICAgICAgIHR5cGVTZWN0aW9uLmdldFVzZXJDb21wbGV4VHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUoKTsKLSAgICAgICAgaW50IGkgPSB0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKS5pbmRleE9mKHZhbHVlKTsKLSAgICAgICAgaWYgKHNob3dBbm9ueW1vdXMpCi0gICAgICAgICB7Ci0gICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uKGkgKyAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uKGkpOwotICAgICAgICB9Ci0gICAgICAgIHByZXZpb3VzVHlwZSA9IDM7Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vIGlmIGl0IGlzIHR5cGU9IiIgZm9yIGFuIGVtcHR5IGxpc3Qgb2Ygc2ltcGxlIHR5cGVzCi0gICAgICAgIHsKLSAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoKTsKLSAgICAgICAgcHJldmlvdXNUeXBlID0gMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc0Fub255bW91cykKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzU1RBbm9ueW1vdXMoZWxlbWVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKCk7Ci0gICAgICAgICAgcHJldmlvdXNUeXBlID0gMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlU2VjdGlvbi5nZXRVc2VyQ29tcGxleFR5cGUoKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUoKTsKLSAgICAgICAgICBwcmV2aW91c1R5cGUgPSAzOwotICAgICAgICB9Ci0gICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbigwKTsgLy8gYW5vbnltb3VzCi0gICAgICAgIC8vICAgICAgICB0eXBlU2VjdGlvbi5nZXRUeXBlTGlzdCgpLnNldFRleHQoIioqYW5vbnltb3VzKioiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgcG9wdWxhdGVCdWlsdEluVHlwZSgpOwotICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0gICAgICAgIAotICAgICAgICAvLyAgICAgICAgdHlwZVNlY3Rpb24uZ2V0VHlwZUxpc3QoKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAvLyAgICAgICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgLy8gICAgICAgIHR5cGVTZWN0aW9uLnBvcHVsYXRlQnVpbHRJblR5cGUoeHNkU2NoZW1hKTsKLSAgICAgICAgLy8gICAgICAgIHR5cGVTZWN0aW9uLmdldFR5cGVMaXN0KCkuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTk9fVFlQRSIpKTsKLSAgICAgICAgcHJldmlvdXNUeXBlID0gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRhYmxlLmdldFNlbGVjdGlvbigpICE9IG51bGwgJiYgdGFibGUuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBwcmV2aW91c1N0cmluZ1R5cGUgPSAodGFibGUuZ2V0U2VsZWN0aW9uKClbMF0pLmdldFRleHQoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlQnVpbHRJblR5cGUoKQotICB7Ci0gICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgTGlzdCBpdGVtcyA9IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgIGl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICBpdGVtLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKSk7Ci0gICAgICBpdGVtLnNldERhdGEoaXRlbXMuZ2V0KGkpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUJ1aWx0SW5UeXBlKFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgIExpc3QgaXRlbXMgPSBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgIGZyYWdtZW50ID0gZnJhZ21lbnQudG9Mb3dlckNhc2UoKTsKLQlQYXR0ZXJuIHJlZ2V4ID0gUGF0dGVybi5jb21waWxlKGZyYWdtZW50KTsKLQkKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAJU3RyaW5nIGl0ZW1TdHJpbmcgPSBpdGVtcy5nZXQoaSkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOwotICAgIAlNYXRjaGVyIG0gPSByZWdleC5tYXRjaGVyKGl0ZW1TdHJpbmcpOwotCi0gICAgCWlmIChpdGVtU3RyaW5nLnN0YXJ0c1dpdGgoZnJhZ21lbnQpIHx8IG0ubWF0Y2hlcygpKSB7Ci0gICAgCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAJCWl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgCQlpdGVtLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKSk7Ci0gICAgCQlpdGVtLnNldERhdGEoaXRlbXMuZ2V0KGkpKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICB0YWJsZS5zZWxlY3QoMCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVVzZXJDb21wbGV4VHlwZSgpCi0gIHsKLSAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW0gYW5vbnltb3VzSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgIGFub255bW91c0l0ZW0uc2V0VGV4dCgiKiphbm9ueW1vdXMqKiIpOwotICAgICAgYW5vbnltb3VzSXRlbS5zZXREYXRhKCIqKmFub255bW91cyoqIik7Ci0gICAgfQotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIml0ZW0gIiArIGkgKyAiIGlzICIgKyBpdGVtKTsKLSAgICAgIGl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICBpdGVtLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmIikpOwotICAgICAgaXRlbS5zZXREYXRhKGl0ZW1zLmdldChpKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVVzZXJDb21wbGV4VHlwZShTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICBmcmFnbWVudCA9IGZyYWdtZW50LnRvTG93ZXJDYXNlKCk7Ci0gICAgUGF0dGVybiByZWdleCA9IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoZnJhZ21lbnQpOwotICAgIAotICAgIGlmIChzaG93QW5vbnltb3VzKQotICAgIHsKLSAgICAJTWF0Y2hlciBtID0gcmVnZXgubWF0Y2hlcigiKiphbm9ueW1vdXMqKiIpOwotICAgIAlpZiAoIioqYW5vbnltb3VzKioiLnN0YXJ0c1dpdGgoZnJhZ21lbnQpIHx8IG0ubWF0Y2hlcygpKSB7Ci0gICAgCQlUYWJsZUl0ZW0gYW5vbnltb3VzSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAJCWFub255bW91c0l0ZW0uc2V0VGV4dCgiKiphbm9ueW1vdXMqKiIpOwotICAgIAkJYW5vbnltb3VzSXRlbS5zZXREYXRhKCIqKmFub255bW91cyoqIik7Ci0gICAgCX0KLSAgICB9Ci0gICAgTGlzdCBpdGVtcyA9IGdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgIAlTdHJpbmcgaXRlbVN0cmluZyA9IGl0ZW1zLmdldChpKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7Ci0gICAgCU1hdGNoZXIgbSA9IHJlZ2V4Lm1hdGNoZXIoaXRlbVN0cmluZyk7Ci0gICAgCQotICAgIAlpZiAoaXRlbVN0cmluZy5zdGFydHNXaXRoKGZyYWdtZW50KSB8fCBtLm1hdGNoZXMoKSkgewotICAgIAkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgCQlpdGVtLnNldFRleHQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgIAkJaXRlbS5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRENvbXBsZXhUeXBlLmdpZiIpKTsKLSAgICAJCWl0ZW0uc2V0RGF0YShpdGVtcy5nZXQoaSkpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHRhYmxlLnNlbGVjdCgwKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoKQotICB7Ci0gICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgaWYgKHNob3dBbm9ueW1vdXMpCi0gICAgIHsKLSAgICAgIFRhYmxlSXRlbSBhbm9ueW1vdXNJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgYW5vbnltb3VzSXRlbS5zZXRUZXh0KCIqKmFub255bW91cyoqIik7Ci0gICAgICBhbm9ueW1vdXNJdGVtLnNldERhdGEoIioqYW5vbnltb3VzKioiKTsKLSAgICB9Ci0gICAgTGlzdCBpdGVtcyA9IGdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgewotICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICBpdGVtLnNldFRleHQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgaXRlbS5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIikpOwotICAgICAgaXRlbS5zZXREYXRhKGl0ZW1zLmdldChpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZShTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICBmcmFnbWVudCA9IGZyYWdtZW50LnRvTG93ZXJDYXNlKCk7Ci0gICAgUGF0dGVybiByZWdleCA9IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoZnJhZ21lbnQpOwotICAgIAotICAgIGlmIChzaG93QW5vbnltb3VzKQotICAgICB7Ci0gICAgCU1hdGNoZXIgbSA9IHJlZ2V4Lm1hdGNoZXIoIioqYW5vbnltb3VzKioiKTsKLSAgICAJaWYgKCIqKmFub255bW91cyoqIi5zdGFydHNXaXRoKGZyYWdtZW50KSB8fCBtLm1hdGNoZXMoKSkgIHsKLSAgICAJCVRhYmxlSXRlbSBhbm9ueW1vdXNJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgIAkJYW5vbnltb3VzSXRlbS5zZXRUZXh0KCIqKmFub255bW91cyoqIik7Ci0gICAgCQlhbm9ueW1vdXNJdGVtLnNldERhdGEoIioqYW5vbnltb3VzKioiKTsKLSAgICAJfQotICAgIH0KLSAgICBMaXN0IGl0ZW1zID0gZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgICB7Ci0gICAgCVN0cmluZyBpdGVtU3RyaW5nID0gaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKLSAgICAJTWF0Y2hlciBtID0gcmVnZXgubWF0Y2hlcihpdGVtU3RyaW5nKTsKLSAgICAJCi0gICAgCWlmIChpdGVtU3RyaW5nLnN0YXJ0c1dpdGgoZnJhZ21lbnQpIHx8IG0ubWF0Y2hlcygpKSB7Ci0gICAgCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAJCWl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgCQlpdGVtLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKSk7Ci0gICAgCQlpdGVtLnNldERhdGEoaXRlbXMuZ2V0KGkpKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICB0YWJsZS5zZWxlY3QoMCk7Ci0gIH0KLSAgCi0gIGJvb2xlYW4gY2hlY2tGb3JBbm9ueW1vdXNUeXBlKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIC8qCi0gICAgICogVXNpbmcgRWQncyBtb2RlbCB0byBjaGVjayBib29sZWFuIGlzQW5vbnltb3VzID0gZmFsc2U7Ci0gICAgICogCi0gICAgICogWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0KLSAgICAgKiBnZXRYU0RTY2hlbWEoKS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KGVsZW1lbnQpOyBpZiAoY29tcG9uZW50Ci0gICAgICogaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW0gPQotICAgICAqIChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29tcG9uZW50OyBpc0Fub255bW91cyA9Ci0gICAgICogeHNkRWxlbS5pc1NldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7IH0gcmV0dXJuIGlzQW5vbnltb3VzOwotICAgICAqLwotICAgIFhTRERPTUhlbHBlciBoZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgYm9vbGVhbiBpc0Fub255bW91cyA9IGZhbHNlOwotICAgIE5vZGUgYU5vZGUgPQotICAgIGhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpOwotICAgIGlmIChhTm9kZSAhPSBudWxsKQotICAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgYU5vZGUgPSBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgaWYgKGFOb2RlICE9IG51bGwpCi0gICAgIHsKLSAgICAgIGlzQW5vbnltb3VzID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGlzQW5vbnltb3VzOwotICB9Ci0KLSAgdm9pZCB1cGRhdGVFbGVtZW50VG9Bbm9ueW1vdXMoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgeHNkVHlwZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOwotICAgIFhTRERPTUhlbHBlci51cGRhdGVFbGVtZW50VG9Ob3RBbm9ueW1vdXMoZWxlbWVudCk7Ci0gICAgYm9vbGVhbiBoYXNDaGlsZHJlbkVsZW1lbnRzID0gaGFzRWxlbWVudENoaWxkcmVuKGVsZW1lbnQpOwotICAgIEVsZW1lbnQgY2hpbGROb2RlID0gbnVsbDsKLSAgICBpZiAoeHNkVHlwZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKSkKLSAgICB7Ci0gICAgICBjaGlsZE5vZGUgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoCi0gICAgICAgICAgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLAotICAgICAgICAgIHByZWZpeCArIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHhzZFR5cGUuZXF1YWxzKFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKSkKLSAgICB7Ci0gICAgICBjaGlsZE5vZGUgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBwcmVmaXggKyBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgICAKLSAgICAgIEVsZW1lbnQgcmVzdHJpY3Rpb25Ob2RlID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgcHJlZml4ICsgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgIHJlc3RyaWN0aW9uTm9kZS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFLCBwcmVmaXggKyAic3RyaW5nIik7Ci0gICAgICBjaGlsZE5vZGUuYXBwZW5kQ2hpbGQocmVzdHJpY3Rpb25Ob2RlKTsgICAgICAKLSAgICB9Ci0gICAgaWYgKGNoaWxkTm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRERPTUhlbHBlciBoZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICBOb2RlIGFubm90YXRpb25Ob2RlID0gaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRyk7Ci0gICAgICBpZiAoYW5ub3RhdGlvbk5vZGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgZmlyc3RDaGlsZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbmV4dFNpYmxpbmcgPSBhbm5vdGF0aW9uTm9kZS5nZXROZXh0U2libGluZygpOwotICAgICAgICBlbGVtZW50Lmluc2VydEJlZm9yZShjaGlsZE5vZGUsIG5leHRTaWJsaW5nKTsKLSAgICAgIH0KLSAgICAgIFhTRERPTUhlbHBlci5mb3JtYXRDaGlsZChjaGlsZE5vZGUpOwotICAgIH0KLSAgfQotCi0gIGJvb2xlYW4gaXNTVEFub255bW91cyhFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBYU0RET01IZWxwZXIgaGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgIE5vZGUgYU5vZGUgPSBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGFOb2RlLCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbGVhbiBpc0NUQW5vbnltb3VzKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFhTRERPTUhlbHBlciBoZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgTm9kZSBhTm9kZSA9IGhlbHBlci5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLSAgICAgewotICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgWFNEVHlwZURlZmluaXRpb24gZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgWFNERE9NSGVscGVyIGhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICBOb2RlIHR5cGVEZWZpbml0aW9uTm9kZSA9Ci0gICAgaGVscGVyLmdldENoaWxkTm9kZShlbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgaWYgKHR5cGVEZWZpbml0aW9uTm9kZSA9PSBudWxsKQotICAgICB7Ci0gICAgICB0eXBlRGVmaW5pdGlvbk5vZGUgPSBoZWxwZXIuZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRyk7Ci0gICAgfQotICAgIGlmICh0eXBlRGVmaW5pdGlvbk5vZGUgIT0gbnVsbCkKLSAgICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0KLSAgICAgIHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KHR5cGVEZWZpbml0aW9uTm9kZSk7Ci0gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICAgewotICAgICAgICByZXR1cm4gKFhTRFR5cGVEZWZpbml0aW9uKSBjb21wb25lbnQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgcmV0dXJuIGhlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkKLSAgewotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgIHJldHVybiBoZWxwZXIuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKTsKLSAgfQotICAKLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICByZXR1cm4gaGVscGVyLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNFbGVtZW50Q2hpbGRyZW4oTm9kZSBwYXJlbnROb2RlKQotICB7Ci0gICAgYm9vbGVhbiBoYXNDaGlsZHJlbkVsZW1lbnRzID0gZmFsc2U7Ci0gICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSkKLSAgICB7Ci0gICAgICBOb2RlTGlzdCBub2RlcyA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBpZiAobm9kZXMuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYXNDaGlsZHJlbkVsZW1lbnRzID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaGFzQ2hpbGRyZW5FbGVtZW50czsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVzU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlc1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiNjVmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVzU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhzZC5YU0RDb21wb25lbnRTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhzZC5YU0RDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueHNkLlhTRFNldFR5cGVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzLlR5cGVTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlc1NlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgVGV4dCB0eXBlQ29tYm87Ci0gIEJ1dHRvbiBidXR0b247Ci0KLSAgU3RyaW5nIHR5cGU7Ci0gIE9iamVjdCB0eXBlT2JqZWN0OwotICBDTGFiZWwgdHlwZUxhYmVsOwotICBUYWJsZSB0YWJsZTsKLSAgVHlwZVNlY3Rpb24gdHlwZVNlY3Rpb247Ci0gIGJvb2xlYW4gc2hvd0Fub255bW91cyA9IHRydWU7Ci0gIFN0cmluZyBwcmV2aW91c1N0cmluZ1R5cGUgPSAiIjsKLSAgYm9vbGVhbiBpc0Fub255bW91czsKLSAgaW50IHByZXZpb3VzVHlwZTsKLSAgYm9vbGVhbiBzaG93Q29tcGxleFR5cGVzID0gdHJ1ZTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBUeXBlc1NlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgCi0JCUZvcm1EYXRhIGRhdGE7Ci0KLQkJdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB0eXBlQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCQl0eXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgCi0gICAgYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICIiLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLSAgICBidXR0b24uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9icm93c2VidXR0b24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICB0eXBlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1RZUEUiKSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJRm9ybURhdGEgZGF0YTIgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YTIubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlICsgMik7Ci0JCWRhdGEyLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwwKTsKLQkJZGF0YTIudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHR5cGVDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEyKTsKLQotICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCk7Ci0gICAgdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotCSAgT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0JICB0eXBlQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkgIGlmIChpbnB1dCAhPSBudWxsKQotCSAgewotCSAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0JICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW0gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWlucHV0OwotCSAgICAgIGVsZW1lbnQgPSB4c2RFbGVtLmdldEVsZW1lbnQoKTsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IHhzZEVsZW0uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgYm9vbGVhbiBpc0Fub255bW91cyA9IHhzZEVsZW0uaXNBYnN0cmFjdCgpOwotCi0gICAgICAgIGlmIChpc0Fub255bW91cykKLSAgICAgICAgewotICAgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KCIqKmFub255bW91cyoqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmICh0eXBlRGVmICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlRGVmLmdldFFOYW1lKGdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIGlmICh0eXBlTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0eXBlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dCh0eXBlTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTk9fVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0JICAgIHsKLQkgICAgICBlbGVtZW50ID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilpbnB1dCkuZ2V0RWxlbWVudCgpOwotCSAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpaW5wdXQ7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICBlbGVtZW50ID0gYXR0cmlidXRlLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLQkgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotCSAgICB7Ci0JICAgICAgZWxlbWVudCA9IChFbGVtZW50KWlucHV0OwotCSAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0vLyAgICAgIHsKLS8vCSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWlucHV0OwotLy8JICAgICAgRWxlbWVudCBzaW1wbGVUeXBlRWxlbWVudCA9IHN0LmdldEVsZW1lbnQoKTsKLS8vICAgICAgICBpZiAoc3QuZ2V0VmFyaWV0eSgpID09IFhTRFZhcmlldHkuTElTVF9MSVRFUkFMKQotLy8gICAgICAgIHsKLS8vCSAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZUVsZW1lbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHKTsKLS8vICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFKTsKLS8vICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgdHlwZUNvbWJvLnNldFRleHQoIioqYW5vbnltb3VzKioiKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgdHlwZUNvbWJvLnNldFRleHQocmVzdWx0KTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIHR5cGVMYWJlbC5zZXRUZXh0KCJJdGVtIFR5cGU6Iik7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UgaWYgKHN0LmdldFZhcmlldHkoKSA9PSBYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHR5cGVMYWJlbC5zZXRUZXh0KCJCYXNlIFR5cGU6Iik7Ci0vLwkgICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudClkb21IZWxwZXIuZ2V0Q2hpbGROb2RlKHNpbXBsZVR5cGVFbGVtZW50LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpOwotLy8JICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotLy8JICAgICAgICB7Ci0vLwkgICAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZUVsZW1lbnQsIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcpOwotLy8JICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybjsKLS8vCSAgICAgICAgfQotLy8KLS8vICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpOwotLy8gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dCgiIik7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KHJlc3VsdCk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIHJldHVybjsKLS8vICAgICAgfQotICAgICAgCi0gICAgICB0eXBlTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotCSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotCSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNBbm9ueW1vdXMgPSBjaGVja0ZvckFub255bW91c1R5cGUoZWxlbWVudCk7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotCSAgICAgIGlmIChpc0Fub255bW91cykKLQkgICAgICB7Ci0JICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dCgiKiphbm9ueW1vdXMqKiIpOyAvLyROT04tTkxTLTEkCi0JICAgICAgfQotCSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCSAgICAgIHsKLQkgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9OT19UWVBFIikpOyAvLyROT04tTkxTLTEkCi0JICAgICAgfQotCSAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KHJlc3VsdCk7Ci0JICAgICAgfQotCi0JICAgIH0KLQkgIH0KLQl9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYnV0dG9uKQotICAgIHsKLS8qICAgICAgICAKLQkgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCSAgICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCSAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWdldElucHV0KCkpLmdldEVsZW1lbnQoKTsKLQkgICAgVHlwZXNEaWFsb2cgZGlhbG9nOwotCi0vLwkgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0vLwkgICAgewotLy8JICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24paW5wdXQ7Ci0vLwkgICAgICBFbGVtZW50IHNpbXBsZVR5cGVFbGVtZW50ID0gc3QuZ2V0RWxlbWVudCgpOwotLy8JICAgICAgaWYgKHN0LmdldFZhcmlldHkoKSA9PSBYU0RWYXJpZXR5LkxJU1RfTElURVJBTCkKLS8vCSAgICAgIHsKLS8vCSAgICAgICAgRWxlbWVudCBsaXN0RWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZUVsZW1lbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHKTsKLS8vCSAgICAgICAgZGlhbG9nID0gbmV3IFR5cGVzRGlhbG9nKHNoZWxsLCBsaXN0RWxlbWVudCwgWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSwgeHNkU2NoZW1hKTsKLS8vICAgICAgICAgIGRpYWxvZy5zaG93Q29tcGxleFR5cGVzID0gZmFsc2U7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UgaWYgKHN0LmdldFZhcmlldHkoKSA9PSBYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5RWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZUVsZW1lbnQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRyk7Ci0vLyAgICAgICAgICBpZiAoZGVyaXZlZEJ5RWxlbWVudCA9PSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBkZXJpdmVkQnlFbGVtZW50ID0gKEVsZW1lbnQpZG9tSGVscGVyLmdldENoaWxkTm9kZShzaW1wbGVUeXBlRWxlbWVudCwgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRyk7Ci0vLyAgICAgICAgICAgIGlmIChkZXJpdmVkQnlFbGVtZW50ID09IG51bGwpIHJldHVybjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGlmIChkZXJpdmVkQnlFbGVtZW50ICE9IG51bGwpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIGRpYWxvZyA9IG5ldyBUeXBlc0RpYWxvZyhzaGVsbCwgZGVyaXZlZEJ5RWxlbWVudCwgWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFLCB4c2RTY2hlbWEpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICByZXR1cm47Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBkaWFsb2cgPSBuZXcgVHlwZXNEaWFsb2coc2hlbGwsIGVsZW1lbnQsICJ0eXBlIiwgeHNkU2NoZW1hKTsKLS8vICAgICAgICB9Ci0vLwkgICAgfQotLy8JICAgIGVsc2UKLS8vCSAgICB7Ci0JICAgICAgZGlhbG9nID0gbmV3IFR5cGVzRGlhbG9nKHNoZWxsLCBlbGVtZW50LCAidHlwZSIsIHhzZFNjaGVtYSk7IC8vJE5PTi1OTFMtMSQKLS8vCSAgICB9Ci0KLQkgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0JICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCSAgICAKLQkgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0JICAgIHsKLQkgICAgICBPYmplY3QgdHlwZU9iamVjdCA9IGRpYWxvZy5nZXRUeXBlKCk7Ci0vLwkJICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotLy8JCSAgICB7Ci0vLwkJICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24paW5wdXQ7Ci0vLwkJICAgICAgRWxlbWVudCBzaW1wbGVUeXBlRWxlbWVudCA9IHN0LmdldEVsZW1lbnQoKTsKLS8vCSAgICAgICAgRWxlbWVudCBsaXN0RWxlbWVudCA9IChFbGVtZW50KWRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZUVsZW1lbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHKTsKLS8vCi0vLyAgCSAgICAgIGJlZ2luUmVjb3JkaW5nKCJJdGVtVHlwZSBDaGFuZ2UiLCBlbGVtZW50KTsKLS8vICAgICAgICAgIGxpc3RFbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLCAoU3RyaW5nKXR5cGVPYmplY3QpOwotLy8gICAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotLy8JCSAgICB9Ci0JICAgIH0KLSovICAgICAgICAKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgICBJRmlsZSBjdXJyZW50SUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotICAgICAgICAKLSAgICAgICAgT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLSAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSB7Ci0gICAgICAgICAgICBzY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpbnB1dCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFhTRENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFhTRENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyKGN1cnJlbnRJRmlsZSwgc2NoZW1hKTsKLSAgICAgICAgWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBYU0RDb21wb25lbnRTZWxlY3Rpb25EaWFsb2coc2hlbGwsICJTZXQgVHlwZSIsIHByb3ZpZGVyKTsgIC8vIFRPRE86IEV4dGVybmFsaXplIFRoaXMKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBwcm92aWRlci5zaG93Q29tcGxleFR5cGVzKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBwcm92aWRlci5zZXREaWFsb2coZGlhbG9nKTsKLSAgICAgICAgCi0gICAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotCi0gICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClnZXRJbnB1dCgpKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICBYU0RTZXRUeXBlSGVscGVyIGhlbHBlciA9IG5ldyBYU0RTZXRUeXBlSGVscGVyKGN1cnJlbnRJRmlsZSwgc2NoZW1hKTsKLSAgICAgICAgICAgIGhlbHBlci5zZXRUeXBlKGVsZW1lbnQsICJ0eXBlIiwgZGlhbG9nLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfSAgICAgICAgCi0KLS8vICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgfQotCi0gIAotICAKLSAgYm9vbGVhbiBjaGVja0ZvckFub255bW91c1R5cGUoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgLyogVXNpbmcgRWQncyBtb2RlbCB0byBjaGVjawotICAgICBib29sZWFuIGlzQW5vbnltb3VzID0gZmFsc2U7Ci0KLSAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0WFNEU2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsKLSAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgewotICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbSA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29tcG9uZW50OwotICAgICBpc0Fub255bW91cyA9IHhzZEVsZW0uaXNTZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgICB9Ci0gICAgIHJldHVybiBpc0Fub255bW91czsKLSAgICAgKi8KLQotICAgIGJvb2xlYW4gaXNBbm9ueW1vdXMgPSBmYWxzZTsKLQotICAgIE5vZGUgYU5vZGUgPSBnZXREb21IZWxwZXIoKS5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpOwotICAgIGlmIChhTm9kZSAhPSBudWxsKQotICAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgYU5vZGUgPSBnZXREb21IZWxwZXIoKS5nZXRDaGlsZE5vZGUoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKTsKLSAgICBpZiAoYU5vZGUgIT0gbnVsbCkKLSAgICAgewotICAgICAgaXNBbm9ueW1vdXMgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gaXNBbm9ueW1vdXM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVHlwZXNTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlc1NlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMGU1NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlc1NlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFR5cGVzU2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBUeXBlc1NlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueHNkZWRpdG9yLnNlY3Rpb24udHlwZXMiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChYU0RFbGVtZW50RGVjbGFyYXRpb24uY2xhc3MpOwotICAgIGxpc3QuYWRkKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uLmNsYXNzKTsKLSAgICBsaXN0LmFkZChYU0RBdHRyaWJ1dGVVc2UuY2xhc3MpOwotICAgIGxpc3QuYWRkKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uLmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBuZXcgVHlwZXNTZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pb2JqZWN0OwotICAgICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilvYmplY3Q7Ci0gICAgICAgIGlmIChhdHRyLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSA9IChYU0RBdHRyaWJ1dGVVc2Upb2JqZWN0OwotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gYXR0cmlidXRlVXNlLmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGlucHV0RXF1YWxzKGVsZW1lbnQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pb2JqZWN0OwotLy8gICAgICAgIGlmIChzdC5nZXRWYXJpZXR5KCkgPT0gWFNEVmFyaWV0eS5MSVNUX0xJVEVSQUwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgcmV0dXJuIHRydWU7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UgaWYgKHN0LmdldFZhcmlldHkoKSA9PSBYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHJldHVybiB0cnVlOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9WYWx1ZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVmFsdWVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNGY3OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9WYWx1ZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBWYWx1ZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgVGV4dCB2YWx1ZVRleHQ7Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBWYWx1ZVNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9CWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhOwotCi0JCXZhbHVlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl2YWx1ZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJQ0xhYmVsIHZhbHVlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1ZBTFVFIikgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZhbHVlVGV4dCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh2YWx1ZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotLy8JCWxpc3RlbmVyLnN0YXJ0TGlzdGVuaW5nRm9yRW50ZXIodmFsdWVUZXh0KTsKLS8vCQlsaXN0ZW5lci5zdGFydExpc3RlbmluZ1RvKHZhbHVlVGV4dCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotCSAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkgIE9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JICB2YWx1ZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkgIGlmIChpbnB1dCAhPSBudWxsKQotCSAgewotCSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotCSAgICB7Ci0JICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldClpbnB1dDsKLQkgICAgICBFbGVtZW50IGVsZW1lbnQgPSBlbnVtRmFjZXQuZ2V0RWxlbWVudCgpOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVkFMVUVfQVRUUklCVVRFKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVUZXh0LnNldFRleHQodmFsdWUpOwotICAgICAgICB9Ci0JICAgIH0KLQkgIH0KLQkgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0JCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHZhbHVlVGV4dCkKLSAgICB7Ci0gICAgICBPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotCSAgICB7Ci0JICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldClpbnB1dDsKLQkgICAgICBFbGVtZW50IGVsZW1lbnQgPSBlbnVtRmFjZXQuZ2V0RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VOVU1fVkFMVUVfQ0hBTkdFIiksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHZhbHVlVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUsIHZhbHVlKTsKLSAgICAgICAgZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotCSAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9WYWx1ZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1ZhbHVlU2VjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkNTUxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1ZhbHVlU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci0KLXB1YmxpYyBjbGFzcyBWYWx1ZVNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgVmFsdWVTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTREVudW1lcmF0aW9uRmFjZXQuY2xhc3MpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbiBnZXRTZWN0aW9uQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBWYWx1ZVNlY3Rpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvciNhcHBsaWVzVG8ob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRBZnRlclNlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhzZGVkaXRvci5zZWN0aW9uLm5hbWUiOwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9YU0RTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1hTRFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5ZTQzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1hTRFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5JU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBYU0RTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyI2dldFNlY3Rpb25EZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb25EZXNjcmlwdG9yW10gZ2V0U2VjdGlvbkRlc2NyaXB0b3JzKCkKLSAgewotICAgIElTZWN0aW9uRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IElTZWN0aW9uRGVzY3JpcHRvclsxOF07Ci0gICAgZGVzY3JpcHRvcnNbMF0gPSBuZXcgTmFtZVNlY3Rpb25EZXNjcmlwdG9yKCk7Ci0gICAgZGVzY3JpcHRvcnNbMV0gPSBuZXcgVHlwZXNTZWN0aW9uRGVzY3JpcHRvcigpOwotICAgIGRlc2NyaXB0b3JzWzJdID0gbmV3IE90aGVyQXR0cmlidXRlc1NlY3Rpb25EZXNjcmlwdG9yKCk7Ci0gICAgZGVzY3JpcHRvcnNbM10gPSBuZXcgQXR0cmlidXRlc1ZpZXdTZWN0aW9uRGVzY3JpcHRvcigpOwotICAgIGRlc2NyaXB0b3JzWzRdID0gbmV3IE1vZGVsR3JvdXBTZWN0aW9uRGVzY3JpcHRvcigpOwotICAgIGRlc2NyaXB0b3JzWzVdID0gbmV3IE5hbWVzcGFjZVByb2Nlc3NDb250ZW50c1NlY3Rpb25EZXNjcmlwdG9yKCk7Ci0gICAgZGVzY3JpcHRvcnNbNl0gPSBuZXcgUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IoKTsKLSAgICBkZXNjcmlwdG9yc1s3XSA9IG5ldyBDb21wbGV4VHlwZVNlY3Rpb25EZXNjcmlwdG9yKCk7Ci0gICAgZGVzY3JpcHRvcnNbOF0gPSBuZXcgVmFsdWVTZWN0aW9uRGVzY3JpcHRvcigpOwotICAgIGRlc2NyaXB0b3JzWzldID0gbmV3IFBhdHRlcm5TZWN0aW9uRGVzY3JpcHRvcigpOwotICAgIGRlc2NyaXB0b3JzWzEwXSA9IG5ldyBBbm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0b3IoKTsKLSAgICBkZXNjcmlwdG9yc1sxMV0gPSBuZXcgU2ltcGxlVHlwZVNlY3Rpb25EZXNjcmlwdG9yKCk7Ci0gICAgZGVzY3JpcHRvcnNbMTJdID0gbmV3IEZhY2V0c1NlY3Rpb25EZXNjcmlwdG9yKCk7Ci0gICAgZGVzY3JpcHRvcnNbMTNdID0gbmV3IEVudW1lcmF0aW9uc1NlY3Rpb25EZXNjcmlwdG9yKCk7Ci0gICAgZGVzY3JpcHRvcnNbMTRdID0gbmV3IE5hbWVzcGFjZVNlY3Rpb25EZXNjcmlwdG9yKCk7Ci0gICAgZGVzY3JpcHRvcnNbMTVdID0gbmV3IFNjaGVtYUxvY2F0aW9uRGVzY3JpcHRvcigpOwotICAgIGRlc2NyaXB0b3JzWzE2XSA9IG5ldyBOYW1lc3BhY2VBbmRTY2hlbWFMb2NhdGlvbkRlc2NyaXB0b3IoKTsKLSAgICBkZXNjcmlwdG9yc1sxN10gPSBuZXcgTWluTWF4U2VjdGlvbkRlc2NyaXB0b3IoKTsKLSAgICAKLS8vICBkZXNjcmlwdG9yc1sxOF0gPSBuZXcgU2ltcGxlVHlwZVVuaW9uU2VjdGlvbkRlc2NyaXB0b3IoKTsKLS8vICBkZXNjcmlwdG9yc1sxOV0gPSBuZXcgRml4ZWREZWZhdWx0U2VjdGlvbkRlc2NyaXB0b3IoKTsgICAgCi0gICAgcmV0dXJuIGRlc2NyaXB0b3JzOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjNjU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1hTRFNlY3Rpb25MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTRFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBYU0RTZWN0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFhTRFNlY3Rpb25MYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KQotCXsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0gICAgSW1hZ2UgcmVzdWx0ID0gbnVsbDsgICAgICAgICAgIAotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3RlZCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbilvYmplY3QpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgCi0gICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTRFRleHRFZGl0b3IuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZCk7Ci0gICAgICB9Ci0gICAgICAKLS8vICAgICAgc2VsZWN0ZWQgID0gdHlwZU1hcHBlci5yZW1hcE9iamVjdChzZWxlY3RlZCk7Ci0vLyAgICAgIE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHNlbGVjdGVkKTsKLS8vICAgICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gKEltYWdlKW1vZGVsQWRhcHRlci5nZXRQcm9wZXJ0eShzZWxlY3RlZCwgTW9kZWxBZGFwdGVyLklNQUdFX1BST1BFUlRZKTsgICAgIAotLy8gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkKLQl7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKQotICAgIHsKLQkJCXJldHVybiAiTm8gaXRlbXMgc2VsZWN0ZWQiOwotCQl9Ci0gICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBib29sZWFuIGlzUmVmZXJlbmNlID0gZmFsc2U7Ci0gICAgT2JqZWN0IHNlbGVjdGVkID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBzZWxlY3RlZCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbilvYmplY3QpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgCi0gICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pc2VsZWN0ZWQ7Ci0gICAgICAgICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzUmVmZXJlbmNlID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGlmICgoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKXNlbGVjdGVkKS5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNSZWZlcmVuY2UgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgoWFNETW9kZWxHcm91cERlZmluaXRpb24pc2VsZWN0ZWQpLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1JlZmVyZW5jZSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZCkuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWQpLmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9QQUdFX0hFQURJTkdfUkVGRVJFTkNFIikpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgWE1MTm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIgKCIgKyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfUkVBRF9PTkxZIikgKyAiKSIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuICIoIiArIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9SRUFEX09OTFkiKSArICIpIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotCi0vLyAgICAgIHNlbGVjdGVkICA9IHR5cGVNYXBwZXIucmVtYXBPYmplY3Qoc2VsZWN0ZWQpOwotLy8gICAgICAKLS8vICAgICAgIE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHNlbGVjdGVkKTsKLS8vICAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLS8vICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgICAgICAvLyByZXN1bHQgPSAoU3RyaW5nKW1vZGVsQWRhcHRlci5nZXRQcm9wZXJ0eShzZWxlY3RlZCwgTW9kZWxBZGFwdGVyLkxBQkVMX1BST1BFUlRZKTsKLS8vICAgICAgICAgcmVzdWx0ID0gKChXU0RMRWxlbWVudClzZWxlY3RlZCkuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpOwotLy8gICAgICAgfQotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKEVsZW1lbnQpb2JqZWN0KS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikKLSAgICB7Ci0gICAgfQotICAgIAotCi0gICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgYSBtdWx0aXBsZSBvYmplY3Qgc2VsZWN0aW9uIGhhcyBiZWVuIHBhc3NlZCB0byB0aGUgCi0JICogbGFiZWwgcHJvdmlkZXIuIElmIHRoZSBvYmplY3RzIGlzIGEgSVN0cnVjdHVyZWRTZWxlY3Rpb24sIHNlZSBpZiAKLQkgKiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHNlbGVjdGlvbiBhcmUgdGhlIHNhbWUgYW5kIGlmIHNvLCB3ZSB3YW50Ci0JICogdG8gcHJvdmlkZSBsYWJlbHMgZm9yIHRoZSBjb21tb24gc2VsZWN0ZWQgZWxlbWVudC4KLQkgKiBAcGFyYW0gb2JqZWN0cyBhIHNpbmdsZSBvYmplY3Qgb3IgYSBJU3RydWN0dXJlZFNlbGVjdGlvbi4KLQkgKiBAcGFyYW0gbXVsdGlwbGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgdHJ1ZSBpZiB0aGVyZSBpcyBtdWx0aXBsZQotCSAqIHVuZXF1YWwgc2VsZWN0ZWQgZWxlbWVudHMgaW4gYSBJU3RydWN0dXJlZFNlbGVjdGlvbi4KLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgdG8gZ2V0IGxhYmVscyBmb3IuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0T2JqZWN0KE9iamVjdCBvYmplY3RzLCBib29sZWFuIG11bHRpcGxlW10pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChvYmplY3RzKTsKLQkJT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1hTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1hTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MzVlZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9YU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlZpZXdlclNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5YU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZQotICBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgCi17Ci0gIHByaXZhdGUgVmlld2VyU2VsZWN0aW9uTWFuYWdlciBmVmlld2VyU2VsZWN0aW9uTWFuYWdlcjsKLSAgcHJpdmF0ZSBYU0RTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXI7Ci0gIHByaXZhdGUgWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwgYWRhcHRlckZhY3Rvcnk7Ci0gIC8qKgotICAgKiBAcGFyYW0gdGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcgotICAgKi8KLSAgcHVibGljIFhTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpCi0gIHsKLSAgICBzdXBlcih0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKTsKLSAgfQotICAKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgcHVibGljIHZvaWQgc2V0WFNEU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0WFNETW9kZWxBZGFwdGVyRmFjdG9yeShYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbCBhZGFwdGVyRmFjdG9yeSkgewotICAgIC8vIGRpc2Nvbm5lY3QgZnJvbSBvbGQgb25lCi0gICAgaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgIGFkYXB0ZXJGYWN0b3J5LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIHRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQotICAgIC8vIGNvbm5lY3QgdG8gbmV3IG9uZQotICAgIGlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICBhZGFwdGVyRmFjdG9yeS5hZGRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbk1hbmFnZXIoWFNEU2VsZWN0aW9uTWFuYWdlciBuZXdTZWxlY3Rpb25NYW5hZ2VyKQotICB7IAotICAgIC8vIGRpc2Nvbm5lY3QgZnJvbSBvbGQgb25lCi0gICAgaWYgKHNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHNlbGVjdGlvbk1hbmFnZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOyAgCi0gICAgfQotCi0gICAgc2VsZWN0aW9uTWFuYWdlciA9IG5ld1NlbGVjdGlvbk1hbmFnZXI7Ci0KLSAgICAvLyBjb25uZWN0IHRvIG5ldyBvbmUKLSAgICBpZiAoc2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbk1hbmFnZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOyAgCi0gICAgfQotICB9ICAgIAotCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICAvLyBvdmVycmlkZSBmb3IgY2F0ZWdvcnkKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICAgaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCBvYmogPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOyAgICAgICAgCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yeUFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigoKENhdGVnb3J5QWRhcHRlcilvYmopLmdldFhTRFNjaGVtYSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yeSkKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCgoQ2F0ZWdvcnkpb2JqKS5nZXRYU0RTY2hlbWEoKSk7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0gIH0KLQkKLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25DaGFuZ2VkKGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpLCBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAvL3N1cGVyLnNlbGVjdGlvbkNoYW5nZWQoZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCksIGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25NYW5hZ2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKQotICB7Ci0gICAgaWYgKGdldEN1cnJlbnRUYWIoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vWFNEV29ya2Jvb2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vWFNEV29ya2Jvb2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0MzcwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1hTRFdvcmtib29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgWFNEV29ya2Jvb2sgewotICBwcml2YXRlIENUYWJGb2xkZXIgdGFiRm9sZGVyOwotICBwcml2YXRlIENUYWJJdGVtIHNlbGVjdGVkVGFiOwotLyoqCi0gKiBXb3JrYm9vayBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgWFNEV29ya2Jvb2soQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gIHRhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHBhcmVudCwgc3R5bGUpOwotCi0gIHRhYkZvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgQ1RhYkl0ZW0gbmV3U2VsZWN0ZWRUYWIgPSAoQ1RhYkl0ZW0pIGV2ZW50Lml0ZW07Ci0gICAgICBpZiAoc2VsZWN0ZWRUYWIgPT0gbmV3U2VsZWN0ZWRUYWIpIC8vIERvIG5vdGhpbmcgaWYgdGhlIHNlbGVjdGlvbiBkaWQgbm90IGNoYW5nZS4KLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBpZiAoc2VsZWN0ZWRUYWIgIT0gbnVsbCAmJiAoIXNlbGVjdGVkVGFiLmlzRGlzcG9zZWQoKSkpIHsKLSAgICAgICAgWFNEV29ya2Jvb2tQYWdlIHNlbGVjdGVkUGFnZSA9IGdldFdvcmtib29rUGFnZShzZWxlY3RlZFRhYik7Ci0gICAgICAgIGlmICghc2VsZWN0ZWRQYWdlLmRlYWN0aXZhdGUoKSkgewotICAgICAgICAgIC8vIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IENUYWJJdGVtW10ge3NlbGVjdGVkVGFifSk7Ci0gICAgICAgICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbihzZWxlY3RlZFRhYik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHNlbGVjdGVkVGFiID0gbmV3U2VsZWN0ZWRUYWI7Ci0gICAgICBYU0RXb3JrYm9va1BhZ2UgbmV3U2VsZWN0ZWRQYWdlID0gZ2V0V29ya2Jvb2tQYWdlKG5ld1NlbGVjdGVkVGFiKTsKLSAgICAgIGlmIChuZXdTZWxlY3RlZFBhZ2UgIT0gbnVsbCkKLSAgICAgIG5ld1NlbGVjdGVkUGFnZS5hY3RpdmF0ZSgpOwotCi0gICAgfQotICB9KTsKLQotfQotcHVibGljIFhTRFdvcmtib29rUGFnZSBnZXRTZWxlY3RlZFBhZ2UoKSB7Ci0KLSAgaW50IGluZGV4ID0gdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gIGlmIChpbmRleCA9PSAtMSkgLy8gV2hlbiBjYW4gdGhpcyBiZSAtMQotICAgIHJldHVybiBudWxsOwotCi0gIENUYWJJdGVtIHNlbGVjdGVkSXRlbSA9IHRhYkZvbGRlci5nZXRJdGVtKGluZGV4KTsKLQotICByZXR1cm4gKFhTRFdvcmtib29rUGFnZSlzZWxlY3RlZEl0ZW0uZ2V0RGF0YSgpOwotfQotcHVibGljIENUYWJGb2xkZXIgZ2V0VGFiRm9sZGVyKCkgewotCi0gIHJldHVybiB0YWJGb2xkZXI7Ci0KLX0KLXByb3RlY3RlZCBYU0RXb3JrYm9va1BhZ2UgZ2V0V29ya2Jvb2tQYWdlKENUYWJJdGVtIGl0ZW0pIHsKLQotICB0cnkgewotICAgIHJldHVybiAoWFNEV29ya2Jvb2tQYWdlKSBpdGVtLmdldERhdGEoKTsKLSAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQotcHVibGljIFhTRFdvcmtib29rUGFnZVtdIGdldFdvcmtib29rUGFnZXMoKSB7Ci0KLSAgQ1RhYkl0ZW1bXSB0YWJJdGVtcyA9IHRhYkZvbGRlci5nZXRJdGVtcygpOwotICBpbnQgbkl0ZW1zID0gdGFiSXRlbXMubGVuZ3RoOwotICBYU0RXb3JrYm9va1BhZ2VbXSB3b3JrYm9va1BhZ2VzID0gbmV3IFhTRFdvcmtib29rUGFnZVtuSXRlbXNdOwotICBmb3IgKGludCBpID0gMDsgaSA8IG5JdGVtczsgaSsrKQotICAgIHdvcmtib29rUGFnZXNbaV0gPSBnZXRXb3JrYm9va1BhZ2UodGFiSXRlbXNbaV0pOwotICByZXR1cm4gd29ya2Jvb2tQYWdlczsKLX0KLXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUGFnZSAoWFNEV29ya2Jvb2tQYWdlIHdvcmtib29rUGFnZSkKLXsKLSAgQ1RhYkl0ZW0gbmV3U2VsZWN0ZWRUYWIgPSB3b3JrYm9va1BhZ2UuZ2V0VGFiSXRlbSgpOwotCi0gIGlmIChzZWxlY3RlZFRhYiA9PSBuZXdTZWxlY3RlZFRhYikKLSAgICByZXR1cm47Ci0KLSAgc2VsZWN0ZWRUYWIgPSBuZXdTZWxlY3RlZFRhYjsKLSAgd29ya2Jvb2tQYWdlLmFjdGl2YXRlKCk7Ci0gIC8vIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IENUYWJJdGVtW10ge25ld1NlbGVjdGVkVGFifSk7Ci0gIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3U2VsZWN0ZWRUYWIpOwotCi19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1hTRFdvcmtib29rUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9YU0RXb3JrYm9va1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2NWFmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1hTRFdvcmtib29rUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RXb3JrYm9va1BhZ2UgewotICBwdWJsaWMgQ1RhYkl0ZW0gdGFiSXRlbTsKLS8qKgotICogV29ya2Jvb2tQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBYU0RXb3JrYm9va1BhZ2UoWFNEV29ya2Jvb2sgcGFyZW50KSB7Ci0gIENUYWJGb2xkZXIgZm9sZGVyID0gcGFyZW50LmdldFRhYkZvbGRlcigpOwotICB0YWJJdGVtID0gbmV3IENUYWJJdGVtKGZvbGRlcixTV1QuTk9ORSk7Ci0gIHRhYkl0ZW0uc2V0RGF0YSh0aGlzKTsKLX0KLXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCi0gIGlmICh0YWJJdGVtLmdldENvbnRyb2woKSA9PSBudWxsKQotICAgIHRhYkl0ZW0uc2V0Q29udHJvbChjcmVhdGVDb250cm9sKHRhYkl0ZW0uZ2V0UGFyZW50KCkpKTsKLSAgICAgIAotfQotcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbCAoQ29tcG9zaXRlIHBhcmVudCk7Ci1wdWJsaWMgYm9vbGVhbiBkZWFjdGl2YXRlKCkgewotICByZXR1cm4gdHJ1ZTsKLX0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLSAgaWYgKHRhYkl0ZW0gPT0gbnVsbCkKLSAgICByZXR1cm47Ci0KLSAgQ1RhYkl0ZW0gb2xkSXRlbSA9IHRhYkl0ZW07Ci0gIHRhYkl0ZW0gPSBudWxsOwotICBvbGRJdGVtLmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyBDVGFiSXRlbSBnZXRUYWJJdGVtKCkgewotICByZXR1cm4gdGFiSXRlbTsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9DYXRlZ29yeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9DYXRlZ29yeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4MmU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvQ2F0ZWdvcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlBZGFwdGVyIC8vIGV4dGVuZHMgSXRlbVByb3ZpZGVyCi0gIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIsIElDaGFuZ2VOb3RpZmllciwgSVRyZWVDb250ZW50UHJvdmlkZXIKLXsKLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgaW1hZ2UgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRJbWFnZSBnZXRJbWFnZShPYmplY3QpfS4KLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZSBpbWFnZTsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgcGFyZW50IHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UGFyZW50IGdldFBhcmVudChPYmplY3QpfS4KLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotCi0gIHB1YmxpYyBDYXRlZ29yeUFkYXB0ZXIoU3RyaW5nIGxhYmVsLCBJbWFnZSBpbWFnZSwgQ29sbGVjdGlvbiBjaGlsZHJlbiwgWFNEU2NoZW1hIHhzZFNjaGVtYSwgaW50IGdyb3VwVHlwZSkKLSAgewotLy8gICAgc3VwZXIobGFiZWwsIGltYWdlLCB4c2RTY2hlbWEpOwotICAgIHRoaXMudGV4dCA9IGxhYmVsOwotICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKLSAgICB0aGlzLnBhcmVudCA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0gICAgdGhpcy5ncm91cFR5cGUgPSBncm91cFR5cGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURVMgPSAxOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTEVNRU5UUyA9IDI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRZUEVTID0gMzsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgR1JPVVBTID0gNTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRElSRUNUSVZFUyA9IDY7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5PVEFUSU9OUyA9IDc7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURV9HUk9VUFMgPSA4OwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJREVOVElUWV9DT05TVFJBSU5UUyA9IDk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFOTk9UQVRJT05TID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGludCBncm91cFR5cGU7Ci0gIENvbGxlY3Rpb24gY2hpbGRyZW47Ci0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIAotICBwdWJsaWMgWFNEU2NoZW1hIGdldFhTRFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldEdyb3VwVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ3JvdXBUeXBlOwotICB9ICAgCi0KLS8vICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgbykKLS8vICB7Ci0vLyAgICByZXR1cm4gIWNoaWxkcmVuLmlzRW1wdHkoKTsKLS8vICB9Ci0KLS8vICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3QgbykKLS8vICB7Ci0vLyAgICByZXR1cm4gY2hpbGRyZW47Ci0vLyAgfQotICAKLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIGltYWdlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIC8vIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLSAgICByZXR1cm4gdGV4dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pCi0gIHsKLSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGFkZHMgYW5vdGhlciBsaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotICB7Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKLSAgewotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICAKLSAgfQotICAKLSAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkKLSAgewotICAgIHJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENoaWxkcmVuKENvbGxlY3Rpb24gbGlzdCkKLSAgewotICAgIGNoaWxkcmVuID0gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgewotICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQWJzdHJhY3RBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQWJzdHJhY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzNjNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTREFic3RyYWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgWFNEQWJzdHJhY3RBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwKLSAgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIsIElDaGFuZ2VOb3RpZmllcgotewotCi0gIHByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFhTREFic3RyYWN0QWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotICB9Ci0gIAotICAvKioKLSAgICogVGhlIGFkYXB0ZXIgZmFjdG9yeSBpcyB1c2VkIGFzIHRoZSB0eXBlIGtleS4KLSAgICogVGhpcyByZXR1cm5zIHRydWUsIG9ubHkgaWYgdGhpcyBhZGFwdGVyIHdhcyBjcmVhdGVkIGJ5IHRoZSBnaXZlbiBmYWN0b3J5LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IGFkYXB0ZXJGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgewotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIElDaGFuZ2VOb3RpZmllcn0uCi0gICAqLwotICBwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyOwotCi0gIAotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAobXNnLmdldEV2ZW50VHlwZSgpICE9IE5vdGlmaWNhdGlvbi5SRVNPTFZFKQotICAgIHsgICAgICAgIAotICAgICAgZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLSAgICB9Ci0gIH0gIAotCi0gIC8qKgotICAgKiBUaGlzIGNhbGxzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyI25vdGlmeUNoYW5nZWQgbm90aWZ5Q2hhbmdlZH0gZm9yIGVhY2ggbGlzdGVuZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKQotICB7Ci0gICAgaWYgKGNoYW5nZU5vdGlmaWVyICE9IG51bGwpCi0gICAgewotICAgICAgY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ2hhbmdlTm90aWZpZXIpCi0gICAgewotICAgICAgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gKElDaGFuZ2VOb3RpZmllcilhZGFwdGVyRmFjdG9yeTsKLSAgICAgIGNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogVGhpcyBhZGRzIGFub3RoZXIgbGlzdGVuZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKLSAgewotICAgIGlmIChjaGFuZ2VOb3RpZmllciA9PSBudWxsKQotICAgIHsKLSAgICAgIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0gICAgfQotICAgIGNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0gICAKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotICB7Ci0gICAgaWYgKGNoYW5nZU5vdGlmaWVyICE9IG51bGwpCi0gICAgewotICAgICAgY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLSAgICB9Ci0gICAKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZjUxMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTREFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFhTREFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyLCBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyLCBJVGFibGVMYWJlbFByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbCBhZGFwdGVyRmFjdG9yeTsKLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gbGFiZWxQcm92aWRlckxpc3RlbmVyczsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElMYWJlbFByb3ZpZGVyQ2xhc3MgPSBJTGFiZWxQcm92aWRlci5jbGFzczsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVRhYmxlTGFiZWxQcm92aWRlckNsYXNzID0gSVRhYmxlTGFiZWxQcm92aWRlci5jbGFzczsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKFhTRE1vZGVsQWRhcHRlckZhY3RvcnlJbXBsIGFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotLy8gICAgaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNoYW5nZU5vdGlmaWVyKQotLy8gICAgewotLy8gICAgICAoKElDaGFuZ2VOb3RpZmllcilhZGFwdGVyRmFjdG9yeSkuYWRkTGlzdGVuZXIodGhpcyk7Ci0vLyAgICB9Ci0KLSAgICBsYWJlbFByb3ZpZGVyTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgd3JhcHBlZCBBZGFwdGVyRmFjdG9yeS4KLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSB3cmFwcGVkIEFkYXB0ZXJGYWN0b3J5LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwgYWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICBpZiAodGhpcy5hZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDaGFuZ2VOb3RpZmllcikKLSAgICB7Ci0gICAgICAoKElDaGFuZ2VOb3RpZmllcil0aGlzLmFkYXB0ZXJGYWN0b3J5KS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ2hhbmdlTm90aWZpZXIpCi0gICAgewotICAgICAgKChJQ2hhbmdlTm90aWZpZXIpYWRhcHRlckZhY3RvcnkpLmFkZExpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIHRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLSAgfQotCi0gIC8qKgotICAgKiBTaW5jZSB3ZSB3b24ndCBldmVyIGdlbmVyYXRlIHRoZXNlIG5vdGlmaWNhdGlvbnMsIHdlIGNhbiBqdXN0IGlnbm9yZSB0aGlzLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgICBsYWJlbFByb3ZpZGVyTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICAvKioKLSAgICogU2luY2Ugd2Ugd29uJ3QgZXZlciBhZGQgbGlzdGVuZXJzLCB3ZSBjYW4ganVzdCBpZ25vcmUgdGhpcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsYWJlbFByb3ZpZGVyTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBkaXNjYXJkcyB0aGUgY29udGVudCBwcm92aWRlciBhbmQgcmVtb3ZlcyB0aGlzIGFzIGEgbGlzdGVuZXIgdG8gdGhlIHtAbGluayAjYWRhcHRlckZhY3Rvcnl9LgotICAgKi8KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAodGhpcy5hZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDaGFuZ2VOb3RpZmllcikKLSAgICB7Ci0gICAgICAoKElDaGFuZ2VOb3RpZmllcilhZGFwdGVyRmFjdG9yeSkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZSByaWdodCBub3cuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGlkKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gKElMYWJlbFByb3ZpZGVyKWFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSUxhYmVsUHJvdmlkZXJDbGFzcyk7Ci0KLSAgICByZXR1cm4gCi0gICAgICBsYWJlbFByb3ZpZGVyICE9IG51bGwgPwotICAgICAgICBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iamVjdCkgOiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAvLyBHZXQgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgZmFjdG9yeS4KLSAgICAvLwotICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUxhYmVsUHJvdmlkZXIpYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJTGFiZWxQcm92aWRlckNsYXNzKTsKLQotICAgIHJldHVybgotICAgICAgbGFiZWxQcm92aWRlciAhPSBudWxsID8KLSAgICAgICAgbGFiZWxQcm92aWRlci5nZXRUZXh0KG9iamVjdCkgOgotICAgICAgICBvYmplY3QgPT0gbnVsbCA/IAotICAgICAgICAgICIiIDoKLSAgICAgICAgICBvYmplY3QudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLSAgICovCi0gIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICB7Ci0gICAgcmV0dXJuIGdldEltYWdlKGVsZW1lbnQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICB7Ci0gICAgcmV0dXJuIGdldFRleHQoZWxlbWVudCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTREFubm90YXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3YTRjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQW5ub3RhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RBYnN0cmFjdEFkYXB0ZXIKLXsKLSAgcHVibGljIFhTREFubm90YXRpb25BZGFwdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiaWNvbnMvWFNEQW5ub3RhdGUuZ2lmIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gKChYU0RBbm5vdGF0aW9uKW9iamVjdCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIExpc3QgdXNlckluZm9ybWF0aW9uID0geHNkQW5ub3RhdGlvbi5nZXRVc2VySW5mb3JtYXRpb24oKTsKLSAgICBpZiAoIXVzZXJJbmZvcm1hdGlvbi5pc0VtcHR5KCkpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpdXNlckluZm9ybWF0aW9uLmdldCgwKTsKLSAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuU09VUkNFX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3JnLnczYy5kb20uTm9kZSB0ZXh0ID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IAotICAgICAgICB3aGlsZSAodGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXh0ID0gKChFbGVtZW50KXRleHQpLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGV4dCAhPSBudWxsICYmIHRleHQuZ2V0Tm9kZVZhbHVlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHRleHQuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRyaW0oKTsKLSAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID4gNTApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZygwLCA1MCkgKyAiLi4uIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNEQW5ub3RhdGlvbiBlbGVtZW50ID0gKFhTREFubm90YXRpb24pb2JqZWN0OwotICAgIHJldHVybiBlbGVtZW50LmdldENvbnRhaW5lcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDkyNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIFhTREFic3RyYWN0QWRhcHRlcgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLSAgICovCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICBzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilvYmplY3QpOwotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24gPSB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgCi0gICAgaWYgKHJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIik7Ci0gICAgfQotICAgIC8vIGlmICh4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkgPT0geHNkQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgaWYgKHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIik7Ci0gICAgfQotICAgIAotLy8gICAgcmV0dXJuIAotLy8gICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb25JbWFnZQotLy8gICAgIChyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldENvbnRhaW5lcigpID09IG51bGwgPwotLy8gICAgICAgICJmdWxsL29iajE2L1hTREF0dHJpYnV0ZVVucmVzb2x2ZWQiIDoKLS8vICAgICAgICAgIHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKSA9PSB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiA/Ci0vLyAgICAgICAgICAiZnVsbC9vYmoxNi9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgOgotLy8gICAgICAgICAgImZ1bGwvb2JqMTYvWFNEQXR0cmlidXRlVXNlIik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilvYmplY3QpOwotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24gPSB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgU3RyaW5nIG5hbWUgPQotICAgICAgeHNkQXR0cmlidXRlRGVjbGFyYXRpb24gIT0gcmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiA/Ci0gICAgICAgIHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFFOYW1lKCkgOgotICAgICAgICB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZCgiJ2Fic2VudCciKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKHJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsICYmIHJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoIiA6ICIpOwotICAgICAgcmVzdWx0LmFwcGVuZChyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0UU5hbWUoeHNkQXR0cmlidXRlRGVjbGFyYXRpb24pKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilwYXJlbnRFbGVtZW50OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0geHNkQXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKHR5cGUpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKW9iamVjdDsKLSAgICByZXR1cm4gZWxlbWVudC5nZXRDb250YWluZXIoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiNmM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0vL2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTREFic3RyYWN0QWRhcHRlcgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLSAgICovCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pb2JqZWN0KTsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gcmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLQotICAgIGlmICh4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZUdyb3VwLmdpZiIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9ICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKW9iamVjdCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICAKLSAgICAgIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpID8KLSAgICAgICAgeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFFOYW1lKCkgOgotICAgICAgICB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICInYWJzZW50JyIgOiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKXBhcmVudEVsZW1lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKHhzZEF0dHJpYnV0ZUdyb3VwLmdldENvbnRlbnRzKCkpOyAgIAotLy8gICAgSXRlcmF0b3IgaSA9IHhzZEF0dHJpYnV0ZUdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLS8vICAgIHdoaWxlIChpLmhhc05leHQoKSkKLS8vICAgIHsKLS8vICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KWkubmV4dCgpOwotLy8gICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLS8vICAgICAgewotLy8gICAgICAgIGxpc3QuYWRkKCgoWFNEQXR0cmlidXRlVXNlKWF0dHJHcm91cENvbnRlbnQpLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UKLS8vICAgICAgewotLy8gICAgICAgIGxpc3QuYWRkKGF0dHJHcm91cENvbnRlbnQpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgCi0gICAgWFNEV2lsZGNhcmQgd2lsZGNhcmQgPSB4c2RBdHRyaWJ1dGVHcm91cC5nZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQoKTsKLSAgICBpZiAod2lsZGNhcmQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCh3aWxkY2FyZCk7Ci0gICAgfQotICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBlbGVtZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilvYmplY3Q7Ci0gICAgcmV0dXJuIGVsZW1lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTREF0dHJpYnV0ZVVzZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RBdHRyaWJ1dGVVc2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOGMxMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTREF0dHJpYnV0ZVVzZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIgZXh0ZW5kcyBYU0RBYnN0cmFjdEFkYXB0ZXIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0gICAqLwotICBwdWJsaWMgWFNEQXR0cmlidXRlVXNlQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLSAgewotICAgIHN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldERlbGVnYXRlKFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGVVc2UpCi0gIHsKLSAgICByZXR1cm4geHNkQXR0cmlidXRlVXNlLmdldENvbnRlbnQoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgcmV0dXJucyBYU0RBdHRyaWJ1dGVVc2UuZ2lmLgotICAgKi8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlID0gKChYU0RBdHRyaWJ1dGVVc2Upb2JqZWN0KTsKLSAgICAKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IGdldERlbGVnYXRlKHhzZEF0dHJpYnV0ZVVzZSk7Ci0gICAgaWYgKHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIik7Ci0gICAgfQotICAgIC8vcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uSW1hZ2UoImZ1bGwvb2JqMTYvWFNEQXR0cmlidXRlVXNlIik7ICAKLSAgICAKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIGdldFRleHQob2JqZWN0LCB0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0LCBib29sZWFuIHNob3dUeXBlKQotICB7Ci0gICAgWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZVVzZSA9ICgoWFNEQXR0cmlidXRlVXNlKW9iamVjdCk7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlRGVjbGFyYXRpb24gPSBnZXREZWxlZ2F0ZSh4c2RBdHRyaWJ1dGVVc2UpOwotICAgIGlmICh4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbi5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgfQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmICh4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoeHNkQXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmlzU2V0Q29uc3RyYWludCgpKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdC5hcHBlbmQoJzwnKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoeHNkQXR0cmlidXRlVXNlLmdldENvbnN0cmFpbnQoKSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKCI9XCIiKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoeHNkQXR0cmlidXRlVXNlLmdldExleGljYWxWYWx1ZSgpKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoIlwiPiIpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmNzM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguWFNEQ2hpbGRVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RBYnN0cmFjdEFkYXB0ZXIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0gICAqLwotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLSAgewotICAgIHN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmIik7Ci0vLyAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pb2JqZWN0KTsKLS8vICAgIHJldHVybiAKLS8vICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb25JbWFnZQotLy8gICAgICAgICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0Q29udGFpbmVyKCkgPT0gbnVsbCA/Ci0vLyAgICAgICAgICAiZnVsbC9vYmoxNi9YU0RDb21wbGV4VHlwZURlZmluaXRpb25VbnJlc29sdmVkIiA6Ci0vLyAgICAgICAgICAiZnVsbC9vYmoxNi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24iKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gZ2V0VGV4dChvYmplY3QsIHRydWUpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCwgYm9vbGVhbiBzaG93VHlwZSkKLSAgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilvYmplY3QpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAKLSAgICByZXN1bHQuYXBwZW5kCi0gICAgICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0TmFtZSgpID09IG51bGwgPyAKLSAgICAgICAgLy8geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEFsaWFzTmFtZSgpIDoKLSAgICAgICAgImxvY2FsIHR5cGUiIDoKLSAgICAgICAgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICBpZiAoc2hvd1R5cGUpCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGVEZWZpbml0aW9uID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIAotICAgICAgICAgICAgYmFzZVR5cGVEZWZpbml0aW9uICE9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRDb250ZW50KCkgJiYKLSAgICAgICAgICAgIGJhc2VUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgIVhTRENvbnN0YW50cy5pc1VSVHlwZShiYXNlVHlwZURlZmluaXRpb24pKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChiYXNlVHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KQotICB7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pcGFyZW50RWxlbWVudDsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRDb250ZW50KCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgeHNkQ29tcGxleFR5cGVDb250ZW50ID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldENvbnRlbnQoKTsKLSAgICAgIGlmICh4c2RDb21wbGV4VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoKChYU0RQYXJ0aWNsZSl4c2RDb21wbGV4VHlwZUNvbnRlbnQpLmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotLy8gICAgaWYgKCgoWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwpYWRhcHRlckZhY3RvcnkpLmdldFNob3dJbmhlcml0ZWQoKSkKLS8vICAgIHsKLS8vICAgICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRTeW50aGV0aWNQYXJ0aWNsZSgpICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotLy8gICAgICAgIGxpc3QuYWRkQWxsKFhTRENoaWxkVXRpbGl0eS5nZXRNb2RlbENoaWxkcmVuKHR5cGUpKTsKLS8vICAgICAgfQotLy8gICAgICBpZiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldFN5bnRoZXRpY1dpbGRjYXJkKCkgIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAgIGxpc3QuYWRkKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRTeW50aGV0aWNXaWxkY2FyZCgpKTsKLS8vICAgICAgfQotLy8gICAgfQotICAgIAotLy8gICAgTGlzdCBhdHRyaWJ1dGVzID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCk7Ci0vLyAgICBpZiAoYXR0cmlidXRlcy5zaXplKCkgPiAwKQotLy8gICAgewotLy8gICAgICBsaXN0LmFkZEFsbChhdHRyaWJ1dGVzKTsKLS8vICAgIH0KLQotLy8gIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKCgoWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwpYWRhcHRlckZhY3RvcnkpLmdldFNob3dJbmhlcml0ZWQoKSkKLSAgICB7Ci0gICAgICBpZiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldERlcml2YXRpb25NZXRob2QoKS5nZXROYW1lKCkuZXF1YWxzKCJleHRlbnNpb24iKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IFhTRENoaWxkVXRpbGl0eS5nZXRNb2RlbENoaWxkcmVuKHR5cGUpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGJvb2xlYW4gY29udCA9IHRydWU7Ci0gICAgICAgIHdoaWxlIChjb250KQotICAgICAgICB7Ci0gICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKDAsIGl0ZXIubmV4dCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ZCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdHlwZTsKLSAgICAgICAgICAgIHR5cGUgPSBjdGQuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBkZWZlY3QgMjY0OTU3IC0gd29ya2JlbmNoIGhhbmdzIHdoZW4gbW9kaWZ5aW5nIGNvbXBsZXggY29udGVudAotICAgICAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgZmlsdGVyIG91dCB0aGUgY3VycmVudCBjb21wbGV4VHlwZSBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgY29tYm9ib3gsIHdlIGNhbiBwb3RlbnRpYWxseSBoYXZlIGFuIGVuZGxlc3MgbG9vcAotICAgICAgICAgICAgaWYgKGN0ZCA9PSB0eXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb250ID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3RkLmdldERlcml2YXRpb25NZXRob2QoKS5nZXROYW1lKCkuZXF1YWxzKCJleHRlbnNpb24iKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXRlciA9IFhTRENoaWxkVXRpbGl0eS5nZXRNb2RlbENoaWxkcmVuKHR5cGUpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgfQotCi0gICAgICAgICAgCi0vLyAgICAgICAgICBsaXN0LmFkZEFsbChYU0RDaGlsZFV0aWxpdHkuZ2V0TW9kZWxDaGlsZHJlbihiYXNlVHlwZSkpOwotICAgICAgfQotCi0vLyAgICBsaXN0LmFkZEFsbChYU0RDaGlsZFV0aWxpdHkuZ2V0TW9kZWxDaGlsZHJlbih4c2RDb21wbGV4VHlwZURlZmluaXRpb24pKTsKLQotICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKLSAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBlbGVtZW50ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilvYmplY3Q7Ci0gICAgcmV0dXJuIGVsZW1lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRENvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTczMjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcgotewotLy8gIHByb3RlY3RlZCBzdGF0aWMgWFNESXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnkgc3ludGFjdGljQWRhcHRlckZhY3RvcnkgPSBuZXcgWFNESXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLS8vICBwcm90ZWN0ZWQgc3RhdGljIFhTRFNlbWFudGljSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnkgc2VtYW50aWNBZGFwdGVyRmFjdG9yeSA9IG5ldyBYU0RTZW1hbnRpY0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0gIAotICBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbCB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5OwotCi0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIHB1YmxpYyBYU0RDb250ZW50UHJvdmlkZXIoWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwgeHNkTW9kZWxBZGFwdGVyRmFjdG9yeUltcGwpCi0gIHsKLSAgICB0aGlzLnhzZE1vZGVsQWRhcHRlckZhY3RvcnkgPSB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbDsKLSAgICAKLSAgICBpZiAoeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDaGFuZ2VOb3RpZmllcikKLSAgICB7Ci0gICAgICAoKElDaGFuZ2VOb3RpZmllcil4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KS5hZGRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFhTRFNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KQotICB7Ci0vLyAgcmV0dXJuIGFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXAgPSBudWxsOwotICAgIExpc3QgbGlzdCA9IG51bGw7Ci0gICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudCkKLSAgICB7Ci0gICAgICB4c2RDb21wID0geHNkU2NoZW1hOwotIAkgICAgLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpc3ludGFjdGljQWRhcHRlckZhY3RvcnkuYWRhcHQoeHNkQ29tcCwgc3ludGFjdGljQWRhcHRlckZhY3RvcnkpOwotICAgICAgLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpc2VtYW50aWNBZGFwdGVyRmFjdG9yeS5hZGFwdCh4c2RDb21wLCBzZW1hbnRpY0FkYXB0ZXJGYWN0b3J5KTsKLSAJICAgIAotIAkgICAgWFNEQWJzdHJhY3RBZGFwdGVyIGEgPSAoWFNEQWJzdHJhY3RBZGFwdGVyKXhzZE1vZGVsQWRhcHRlckZhY3RvcnkuYWRhcHQoeHNkQ29tcCwgeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSk7Ci0gCSAgICAKLS8vICAgICAgYS5yZW1vdmVMaXN0ZW5lcigoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcil0aGlzKTsKLS8vIAkgICAgYS5hZGRMaXN0ZW5lcigoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcil0aGlzKTsKLQotICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGxpc3QuYWRkKHhzZENvbXApOwotICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgeHNkQ29tcCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudClwYXJlbnRFbGVtZW50OwotICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikKLSAgICB7Ci0gICAgICAvLyByZXR1cm4gYWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0gICAgICByZXR1cm4gKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkudG9BcnJheSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRyZWVDb250ZW50UHJvdmlkZXIpCi0gICAgewotICAgICAgcmV0dXJuICgoSVRyZWVDb250ZW50UHJvdmlkZXIpcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0gICAgfQotICAgIAotICAgIGlmICh4c2RDb21wICE9IG51bGwpCi0gICAgewotIAkgICAgLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpc3ludGFjdGljQWRhcHRlckZhY3RvcnkuYWRhcHQoeHNkQ29tcCwgc3ludGFjdGljQWRhcHRlckZhY3RvcnkpOwotICAgICAgLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpc2VtYW50aWNBZGFwdGVyRmFjdG9yeS5hZGFwdCh4c2RDb21wLCBzZW1hbnRpY0FkYXB0ZXJGYWN0b3J5KTsKLSAJICAgIAotICAgICAgWFNEQWJzdHJhY3RBZGFwdGVyIGEgPSAoWFNEQWJzdHJhY3RBZGFwdGVyKXhzZE1vZGVsQWRhcHRlckZhY3RvcnkuYWRhcHQoeHNkQ29tcCwgeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSk7Ci0gICAgICAKLSAgICAgIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IHhzZENvbXAgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwIHx8IHhzZENvbXAgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICAgIHsKLSAgICAgICAgWFNEQWJzdHJhY3RBZGFwdGVyIHBhcnRpY2xlQWRhcHRlciA9IChYU0RBYnN0cmFjdEFkYXB0ZXIpeHNkTW9kZWxBZGFwdGVyRmFjdG9yeS5hZGFwdCgoKFhTRFBhcnRpY2xlQ29udGVudCl4c2RDb21wKS5nZXRDb250YWluZXIoKSwgeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSk7Ci0gICAgICB9Ci0KLSAJICAgIGlmIChhICE9IG51bGwpCi0gCSAgICB7Ci0vLyAJICAgICAgYS5yZW1vdmVMaXN0ZW5lcigoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcil0aGlzKTsKLS8vIAkgICAgICBhLmFkZExpc3RlbmVyKChJTm90aWZ5Q2hhbmdlZExpc3RlbmVyKXRoaXMpOwotIAkgICAgCi0gCSAgICAgIE9iamVjdCBbXSBvYmogPSBhLmdldENoaWxkcmVuKHhzZENvbXApOwotIAkgICAgICBpZiAob2JqICE9IG51bGwpCi0gCSAgICAgIHsKLSAJICAgICAgICBsaXN0ID0gQXJyYXlzLmFzTGlzdChvYmopOwotIAkgICAgICB9Ci0gCSAgICB9Ci0vLwkgICAgIGxpc3QgPSAoTGlzdClhLmdldENoaWxkcmVuKHhzZENvbXApOwotICAgIH0KLSAgICAKLSAgICBsaXN0ID0gIGxpc3QgIT0gbnVsbCA/IGxpc3QgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKQotICAgIHsKLSAgICAgIHJldHVybiAoKE5vZGUpZWxlbWVudCkuZ2V0UGFyZW50Tm9kZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuICgoWFNEQ29uY3JldGVDb21wb25lbnQpZWxlbWVudCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkKLSAgewotICAgIE9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMDsgICAKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikKLSAgewotICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikKLSAgICAgIHsKLSAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgaW5zdGFuY2VvZiBFQXR0cmlidXRlKQotICAgICAgICB7Ci0gICAgICAgICAgKChTdHJ1Y3R1cmVkVmlld2VyKXZpZXdlcikudXBkYXRlKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAoKFN0cnVjdHVyZWRWaWV3ZXIpdmlld2VyKS5yZWZyZXNoKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICB2aWV3ZXIgPSBudWxsOwotICAgIHhzZE1vZGVsQWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotICAvKgotICAgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gIHsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgfQotICAKLS8vICBwcm90ZWN0ZWQgVmlld2VyTm90aWZ5aW5nQWRhcHRlckZhY3Rvcnkgdmlld2VyTm90aWZ5aW5nQWRhcHRlckZhY3RvcnkgPSBuZXcgVmlld2VyTm90aWZ5aW5nQWRhcHRlckZhY3RvcnkoKTsKLS8vCi0vLyAgCi0vLyAgICAvLyBUaGVyZSBpcyBvbmx5IDEgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBmYWN0b3J5LiAgVGhpcyBzaW5nbGUgYWRhcHRlciBnZXRzIGFkZGVkCi0vLyAgLy8gdG8gdGhlIGFkYXB0ZXIgbGlzdHMgb2YgbWFueSBub2Rlcy4KLS8vICBwdWJsaWMgY2xhc3MgVmlld2VyTm90aWZ5aW5nQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyAvLyBLQ1BvcnQgY29tLmlibS5zZWQubW9kZWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeQotLy8gICAgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeQotLy8gIHsKLS8vICAgIHByb3RlY3RlZCBWaWV3ZXJOb3RpZnlpbmdBZGFwdGVyIHZpZXdlck5vdGlmeWluZ0FkYXB0ZXIgPSBuZXcgVmlld2VyTm90aWZ5aW5nQWRhcHRlcigpOwotLy8KLS8vICAgIHByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuIHZpZXdlck5vdGlmeWluZ0FkYXB0ZXI7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHJvdGVjdGVkIFZpZXdlck5vdGlmeWluZ0FkYXB0ZXIgZG9BZGFwdChPYmplY3Qgb2JqZWN0KQotLy8gICAgewotLy8gICAgICBWaWV3ZXJOb3RpZnlpbmdBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0vLyAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gKFZpZXdlck5vdGlmeWluZ0FkYXB0ZXIpYWRhcHQoKElOb2RlTm90aWZpZXIpb2JqZWN0KTsKLS8vICAgICAgfQotLy8gICAgICByZXR1cm4gcmVzdWx0OwotLy8gICAgfQotLy8gIH0KLS8vICAgICAgICAgICAgICAgICAgICAKLS8vCi0vLyAgcHVibGljIGNsYXNzIFZpZXdlck5vdGlmeWluZ0FkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLS8vICB7Ci0vLyAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotLy8gICAgewotLy8gICAgICByZXR1cm4gdHlwZSA9PSB2aWV3ZXJOb3RpZnlpbmdBZGFwdGVyRmFjdG9yeTsKLS8vICAgIH0KLS8vICAgIAotLy8gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwJT2JqZWN0IG5ld1ZhbHVlLAlpbnQgcG9zKQotLy8gICAgeyAKLS8vICAgICAgaWYgKHZpZXdlciA9PSBudWxsIHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgVGV4dCB8fCBvbGRWYWx1ZSBpbnN0YW5jZW9mIFRleHQpCi0vLyAgICAgICAgcmV0dXJuOwotLy8gICAgICAKLS8vICAgICAgaWYgKGV2ZW50VHlwZSAhPSBJTm9kZU5vdGlmaWVyLkFERCAmJiBldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5SRU1PVkUpCi0vLyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICAgICAgICBpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBFbGVtZW50KQotLy8gICAgICAgIHsgICAgICAgIAotLy8gICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpbm90aWZpZXI7ICAgICAgICAgICAgICAgICAgIAotLy8gICAgICAgICAgTm9kZSBwYXJlbnQgPSBub2RlIGluc3RhbmNlb2YgQXR0ciA/ICgoQXR0cilub2RlKS5nZXRPd25lckVsZW1lbnQoKSA6IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotLy8gICAgICAgICAgLy8gd2UgdXNlIHRvIHJlZnJlc2ggdGhlIHBhcmVudCwgYnV0IGl0IHNlZW1zIHRoYXQgdGhlIG5vdGlmaWVyIGlzIHN1ZmZpY2llbnQgbm93Ci0vLyAgICAgICAgICAKLS8vICAgICAgICAgIE9iamVjdCBvYmpUb1JlZnJlc2ggPSBub3RpZmllcjsgICAgICAKLS8vICAgICAgICAgIGlmIChub3RpZmllciBpbnN0YW5jZW9mIERvY3VtZW50SW1wbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgb2JqVG9SZWZyZXNoID0gKChEb2N1bWVudEltcGwpbm90aWZpZXIpLmdldE1vZGVsKCk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKQotLy8gICAgICAgICAgewotLy8vLyAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgWE1MTm9kZSkKLS8vLy8gICAgICAgICAgICB7Ci0vLy8vICAgICAgICAgICAgICBYTUxOb2RlIHhtbE5vZGUgPSAoWE1MTm9kZSlub2RlOwotLy8vLyAgICAgICAgICAgICAgaW50IGNhcmV0UG9zaXRpb24gPSAgeG1sTm9kZS5nZXRTdGFydE9mZnNldCgpOwotLy8vLyAgICAgICAgICAgICAgKChYU0RFZGl0b3JUcmVlVmlld2VyKXZpZXdlcikuc2V0Q2FyZXRQb3NpdGlvbihjYXJldFBvc2l0aW9uKTsKLS8vLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICgoQWJzdHJhY3RUcmVlVmlld2VyKXZpZXdlcikucmVmcmVzaChvYmpUb1JlZnJlc2gpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgICAKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKQotLy8gICAgICB7Ci0vLyAgICAgICAgaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgRG9jdW1lbnRJbXBsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIE9iamVjdCBvYmpUb1JlZnJlc2ggPSAoKERvY3VtZW50SW1wbClub3RpZmllcikuZ2V0TW9kZWwoKTsKLS8vICAgICAgICAgIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICgoQWJzdHJhY3RUcmVlVmlld2VyKXZpZXdlcikucmVmcmVzaChvYmpUb1JlZnJlc2gpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8vLyAgICAgICAgaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgRWxlbWVudCkKLS8vLy8gICAgICAgIHsgIAotLy8vLyBwZXJmb3JtYW5jZSBwcm9ibGVtIC0gdXBkYXRlcyBhbGwgZWxlbWVudHMgd2hlbiB0aGUgY2hpbGRyZW4gYXJlIHJlcGFyZW50ZWQKLS8vLy8gICAgICAgICAgT2JqZWN0IG9ialRvUmVmcmVzaCA9IG5vdGlmaWVyOyAgICAgIAotLy8vLyAgICAgICAgICBpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBEb2N1bWVudEltcGwpCi0vLy8vICAgICAgICAgIHsKLS8vLy8gICAgICAgICAgICBvYmpUb1JlZnJlc2ggPSAoKERvY3VtZW50SW1wbClub3RpZmllcikuZ2V0TW9kZWwoKTsKLS8vLy8gICAgICAgICAgfQotLy8vLyAgICAgICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKQotLy8vLyAgICAgICAgICB7Ci0vLy8vICAgICAgICAgICAgKChBYnN0cmFjdFRyZWVWaWV3ZXIpdmlld2VyKS5yZWZyZXNoKG9ialRvUmVmcmVzaCk7Ci0vLy8vICAgICAgICAgIH0KLS8vLy8gICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBOb3RpZmllci5BREQgJiYgbmV3VmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50KQotLy8vLyAgICAgICAgICB7Ci0vLy8vICAgICAgICAgICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIFhTREVkaXRvclRyZWVWaWV3ZXIpCi0vLy8vICAgICAgICAgICAgewotLy8vLyAgICAgICAgICAgICAgLy8gZGVmYXVsdCBzZWxlY3QgdGhlIG5ldyBhZGRlZCBlbGVtZW50Ci0vLy8vICAgICAgICAgICAgICAoKFhTREVkaXRvclRyZWVWaWV3ZXIpdmlld2VyKS5nZXRPdXRsaW5lUGFnZSgpLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdWYWx1ZSkpOwotLy8vLyAgICAgICAgICAgIH0KLS8vLy8gICAgICAgICAgfQotLy8vLyAgICAgICAgfSAgICAgICAgICAKLS8vLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NGU0YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEQWJzdHJhY3RBZGFwdGVyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotICAgKi8KLSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICBzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pZWxlbWVudCk7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgCi0gICAgaWYgKCF4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERWxlbWVudFJlZi5naWYiKTsKLSAgICB9Ci0gICAgCi0vLyAgICByZXR1cm4gCi0vLyAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uSW1hZ2UKLS8vICAgICAgICAocmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkgPT0gbnVsbCA/Ci0vLyAgICAgICAgICAgImZ1bGwvb2JqMTYvWFNERWxlbWVudFVucmVzb2x2ZWQiIDoKLS8vICAgICAgICAgICB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSA9PSB4c2RFbGVtZW50RGVjbGFyYXRpb24gPwotLy8gICAgICAgICAgICAgImZ1bGwvb2JqMTYvWFNERWxlbWVudERlY2xhcmF0aW9uIiA6Ci0vLyAgICAgICAgICAgICAiZnVsbC9vYmoxNi9YU0RFbGVtZW50VXNlIik7Ci0KLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pb2JqZWN0KTsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICBTdHJpbmcgbmFtZSA9IAotICAgICAgeHNkRWxlbWVudERlY2xhcmF0aW9uICE9IHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uID8KLSAgICAgICAgeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFFOYW1lKCkgOgotICAgICAgICB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoIidhYnNlbnQnIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBpZiAoIXhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgICBib29sZWFuIGhhc01pbk9jY3VycyA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgIGJvb2xlYW4gaGFzTWF4T2NjdXJzID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpOwotCi0gICAgICBpZiAoaGFzTWluT2NjdXJzIHx8IGhhc01heE9jY3VycykKLSAgICAgIHsKLQkgICAgICByZXN1bHQuYXBwZW5kKCIgWyIpOyAKLQkJICAgIGlmIChoYXNNaW5PY2N1cnMpCi0JICAgICAgewotCSAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLQkgIAkgICAgaWYgKG1pbiA9PSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQpCi0JICAJICAgIHsKLQkgIAkgICAgICByZXN1bHQuYXBwZW5kKCIqIik7Ci0JICAJICAgIH0KLQkgIAkgICAgZWxzZQotCSAgCSAgICB7Ci0JICAJICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtaW4pKTsKLQkgIAkgICAgfQotCSAgICAgIH0KLSAgICAgICAgZWxzZSAvLyBwcmludCBkZWZhdWx0Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWluID0gKChYU0RQYXJ0aWNsZSl4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkpLmdldE1pbk9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWluKSk7Ci0gICAgICAgIH0KLQkgICAgICBpZiAoaGFzTWF4T2NjdXJzKQotCSAgICAgIHsKLQkgICAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKXhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0JICAJICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7Ci0JICAJICAgIGlmIChtYXggPT0gWFNEUGFydGljbGUuVU5CT1VOREVEKQotCSAgCSAgICB7Ci0JICAJICAgICAgcmVzdWx0LmFwcGVuZCgiKiIpOwotCSAgCSAgICB9Ci0JICAJICAgIGVsc2UKLQkgIAkgICAgewotCSAgCSAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0JICAJICAgIH0KLQkgICAgICB9Ci0gICAgICAgIGVsc2UgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSl4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgICAKLSAgICAgICAgfQotCSAgICAgIHJlc3VsdC5hcHBlbmQoIl0iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCAmJiByZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0UU5hbWUoeHNkRWxlbWVudERlY2xhcmF0aW9uKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJlbnRFbGVtZW50OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gbnVsbDsKLSAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKCgoWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwpYWRhcHRlckZhY3RvcnkpLmdldFNob3dSZWZlcmVuY2VzKCkpCi0gICAgICB7Ci0gICAgICAgIHR5cGUgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdHlwZSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwpYWRhcHRlckZhY3RvcnkpLmdldFNob3dSZWZlcmVuY2VzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdHlwZTsKLSAgICAgIGlmIChjdFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoY3RUeXBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLS8vICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKSAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBsaXN0LmFkZEFsbCh4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKSk7Ci0vLyAgICB9Ci0gICAgCi0vLyAgICByZXR1cm4gWFNEQ2hpbGRVdGlsaXR5LmdldE1vZGVsQ2hpbGRyZW4oeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkpLnRvQXJyYXkoKTsKLSAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0gIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKW9iamVjdDsKLSAgICByZXR1cm4gZWxlbWVudC5nZXRDb250YWluZXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRE1vZGVsQWRhcHRlckZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmNDQzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcyBYU0RBZGFwdGVyRmFjdG9yeQotICBpbXBsZW1lbnRzIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUKLXsKLSAgCi0gIHByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLSAgCi0gIHByb3RlY3RlZCBEaXNwb3NhYmxlIGRpc3Bvc2FibGUgPSBuZXcgRGlzcG9zYWJsZSgpOwotICAKLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UmVmZXJlbmNlcyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93SW5oZXJpdGVkID0gZmFsc2U7Ci0gIAotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzdXBwb3J0ZWRUeXBlcy5hZGQoSUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2hvd1JlZmVyZW5jZXMoYm9vbGVhbiBiKQotICB7Ci0gICAgc2hvd1JlZmVyZW5jZXMgPSBiOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93UmVmZXJlbmNlcygpCi0gIHsKLSAgICByZXR1cm4gc2hvd1JlZmVyZW5jZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNob3dJbmhlcml0ZWQoYm9vbGVhbiBiKQotICB7Ci0gICAgc2hvd0luaGVyaXRlZD0gYjsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd0luaGVyaXRlZCgpCi0gIHsKLSAgICByZXR1cm4gc2hvd0luaGVyaXRlZDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRFN3aXRjaCBtb2RlbFN3aXRjaCA9IG5ldyBYU0RTd2l0Y2goKQotICB7Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBbm5vdGF0aW9uKFhTREFubm90YXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlWFNEQW5ub3RhdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlWFNETW9kZWxHcm91cEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETm90YXRpb25EZWNsYXJhdGlvbihYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhTRE5vdGF0aW9uRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RQYXJ0aWNsZShYU0RQYXJ0aWNsZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVYU0RQYXJ0aWNsZUFkYXB0ZXIoKTsKLSAgICAgIH0KLS8vICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEUGFydGljbGVDb250ZW50KFhTRFBhcnRpY2xlQ29udGVudCBvYmplY3QpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXR1cm4gY3JlYXRlWFNEUGFydGljbGVDb250ZW50QWRhcHRlcigpOwotLy8gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTY2hlbWEoWFNEU2NoZW1hIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhTRFNjaGVtYUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREltcG9ydChYU0RJbXBvcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICAvLyByZXR1cm4gY3JlYXRlWFNESW1wb3J0QWRhcHRlcigpOwotICAgICAgICByZXR1cm4gY3JlYXRlWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNESW5jbHVkZShYU0RJbmNsdWRlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgLy8gcmV0dXJuIGNyZWF0ZVhTREluY2x1ZGVBZGFwdGVyKCk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RSZWRlZmluZShYU0RSZWRlZmluZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIC8vIHJldHVybiBjcmVhdGVYU0RSZWRlZmluZUFkYXB0ZXIoKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcigpOwotICAgICAgCi0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RXaWxkY2FyZChYU0RXaWxkY2FyZCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVYU0RXaWxkY2FyZEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotICAgICAgfQotICB9OwotCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLSAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICB7Ci0gICAgICBhZGFwdGVyID0gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGFkYXB0ZXI7Ci0gIH0KLQotLyogY3JlYXRlIGFkYXB0ZXJzICovCi0gIAotICBwcm90ZWN0ZWQgWFNEQW5ub3RhdGlvbkFkYXB0ZXIgeHNkQW5ub3RhdGlvbkFkYXB0ZXI7Ci0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVhTREFubm90YXRpb25BZGFwdGVyKCkKLSAgewotICAgIGlmICh4c2RBbm5vdGF0aW9uQWRhcHRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHhzZEFubm90YXRpb25BZGFwdGVyID0gbmV3IFhTREFubm90YXRpb25BZGFwdGVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4geHNkQW5ub3RhdGlvbkFkYXB0ZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyIHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcjsKLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyKCkKLSAgewotICAgIGlmICh4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBuZXcgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4geHNkQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcigpCi0gIHsKLSAgICBpZiAoeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgPSBuZXcgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlVXNlQWRhcHRlciB4c2RBdHRyaWJ1dGVVc2VBZGFwdGVyOwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKCkKLSAgewotICAgIGlmICh4c2RBdHRyaWJ1dGVVc2VBZGFwdGVyID09IG51bGwpCi0gICAgewotICAgICAgeHNkQXR0cmlidXRlVXNlQWRhcHRlciA9IG5ldyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiB4c2RBdHRyaWJ1dGVVc2VBZGFwdGVyOwotICB9Ci0KLSAgCi0gIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcigpCi0gIHsKLSAgICBpZiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgPSBuZXcgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci0gIH0KLQotICBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIHhzZEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXI7Ci0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB4c2RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyID0gbmV3IFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyOwotICB9Ci0KLSAgWFNETW9kZWxHcm91cEFkYXB0ZXIgeHNkTW9kZWxHcm91cEFkYXB0ZXI7Ci0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVhTRE1vZGVsR3JvdXBBZGFwdGVyKCkKLSAgewotICAgIGlmICh4c2RNb2RlbEdyb3VwQWRhcHRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHhzZE1vZGVsR3JvdXBBZGFwdGVyID0gbmV3IFhTRE1vZGVsR3JvdXBBZGFwdGVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4geHNkTW9kZWxHcm91cEFkYXB0ZXI7Ci0gIH0KLQotICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgeHNkTW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyOwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgaWYgKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlciA9IG5ldyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci0gIH0KLQotICBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uQWRhcHRlciB4c2ROb3RhdGlvbkRlY2xhcmF0aW9uQWRhcHRlcjsKLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlWFNETm90YXRpb25EZWNsYXJhdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgaWYgKHhzZE5vdGF0aW9uRGVjbGFyYXRpb25BZGFwdGVyID09IG51bGwpCi0gICAgewotICAgICAgeHNkTm90YXRpb25EZWNsYXJhdGlvbkFkYXB0ZXIgPSBuZXcgWFNETm90YXRpb25EZWNsYXJhdGlvbkFkYXB0ZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB4c2ROb3RhdGlvbkRlY2xhcmF0aW9uQWRhcHRlcjsKLSAgfQotCi0gIFhTRFdpbGRjYXJkQWRhcHRlciB4c2RXaWxkY2FyZEFkYXB0ZXI7Ci0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVhTRFdpbGRjYXJkQWRhcHRlcigpCi0gIHsKLSAgICBpZiAoeHNkV2lsZGNhcmRBZGFwdGVyID09IG51bGwpCi0gICAgewotICAgICAgeHNkV2lsZGNhcmRBZGFwdGVyID0gbmV3IFhTRFdpbGRjYXJkQWRhcHRlcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHhzZFdpbGRjYXJkQWRhcHRlcjsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRFBhcnRpY2xlQWRhcHRlciB4c2RQYXJ0aWNsZUFkYXB0ZXI7Ci0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVhTRFBhcnRpY2xlQWRhcHRlcigpCi0gIHsKLSAgICBpZiAoeHNkUGFydGljbGVBZGFwdGVyID09IG51bGwpCi0gICAgewotICAgICAgeHNkUGFydGljbGVBZGFwdGVyID0gbmV3IFhTRFBhcnRpY2xlQWRhcHRlcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHhzZFBhcnRpY2xlQWRhcHRlcjsKLSAgfQotLy8KLS8vICBwcm90ZWN0ZWQgWFNEUGFydGljbGVDb250ZW50QWRhcHRlciB4c2RQYXJ0aWNsZUNvbnRlbnRBZGFwdGVyOwotLy8gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVhTRFBhcnRpY2xlQ29udGVudEFkYXB0ZXIoKQotLy8gIHsKLS8vICAgIGlmICh4c2RQYXJ0aWNsZUNvbnRlbnRBZGFwdGVyID09IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIHhzZFBhcnRpY2xlQ29udGVudEFkYXB0ZXIgPSBuZXcgWFNEUGFydGljbGVDb250ZW50QWRhcHRlcih0aGlzKTsKLS8vICAgIH0KLS8vICAgIHJldHVybiB4c2RQYXJ0aWNsZUNvbnRlbnRBZGFwdGVyOwotLy8gIH0KLQotICBwcm90ZWN0ZWQgWFNEU2NoZW1hQWRhcHRlciB4c2RTY2hlbWFBZGFwdGVyOwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVYU0RTY2hlbWFBZGFwdGVyKCkKLSAgewotICAgIGlmICh4c2RTY2hlbWFBZGFwdGVyID09IG51bGwpCi0gICAgewotICAgICAgeHNkU2NoZW1hQWRhcHRlciA9IG5ldyBYU0RTY2hlbWFBZGFwdGVyKHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiB4c2RTY2hlbWFBZGFwdGVyOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlciB4c2RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyOwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKCkKLSAgewotICAgIGlmICh4c2RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyID09IG51bGwpCi0gICAgewotICAgICAgeHNkU2NoZW1hRGlyZWN0aXZlQWRhcHRlciA9IG5ldyBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiB4c2RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyOwotICB9Ci0KLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKCkKLSAgewotICAgIGlmICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgPSBuZXcgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4geHNkU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSB8fCBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKQotICB7Ci0gICAgLy8gVGhpcyBpcyBhIGtsdWRnZSB0byBkZWFsIHdpdGggZW51bWVyYXRvcnMsIHdoaWNoIGNyYXNoIHRoZSBkb1N3aXRjaC4KLSAgICAvLwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0ICYmICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpCi0gICAgewotICAgICAgT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcyl0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGFkYXB0ZXI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciBvYmplY3QsIE9iamVjdCB0eXBlKQotICB7Ci0gICAgQWRhcHRlciByZXN1bHQgPSBzdXBlci5hZGFwdE5ldyhvYmplY3QsIHR5cGUpOwotICAgIGRpc3Bvc2FibGUuYWRkKHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotICB7Ci0gICAgY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotICB7Ci0gICAgY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKQotICB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0gICAgaWYgKGRpc3BsYXkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZGlzcGxheS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCAoKSkKLSAgICAgIHsKLSAgICAgICAgY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLS8vICAgIGlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotLy8gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBkaXNwb3NhYmxlLmRpc3Bvc2UoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNETW9kZWxHcm91cEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RNb2RlbEdyb3VwQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmMxNzE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RNb2RlbEdyb3VwQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5YU0RDaGlsZFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEdyb3VwQWRhcHRlciBleHRlbmRzIFhTREFic3RyYWN0QWRhcHRlcgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLSAgICovCi0gIHB1YmxpYyBYU0RNb2RlbEdyb3VwQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLSAgewotICAgIHN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9ICgoWFNETW9kZWxHcm91cCllbGVtZW50KTsKLSAgICBpZiAoWFNEQ29tcG9zaXRvci5DSE9JQ0VfTElURVJBTCA9PSB4c2RNb2RlbEdyb3VwLmdldENvbXBvc2l0b3IoKSkKLSAgICB7Ci0gICAgICAvLyByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb25JbWFnZSgiZnVsbC9vYmoxNi9YU0RNb2RlbEdyb3VwQ2hvaWNlIik7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RDaG9pY2UuZ2lmIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRENvbXBvc2l0b3IuQUxMX0xJVEVSQUwgPT0geHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCkpCi0gICAgewotICAgICAgLy8gcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uSW1hZ2UoImZ1bGwvb2JqMTYvWFNETW9kZWxHcm91cEFsbCIpOwotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQWxsLmdpZiIpOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIC8vIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbkltYWdlKCJmdWxsL29iajE2L1hTRE1vZGVsR3JvdXBTZXF1ZW5jZSIpOwotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2VxdWVuY2UuZ2lmIik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9ICgoWFNETW9kZWxHcm91cClvYmplY3QpOwotICAgIAotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSB4c2RNb2RlbEdyb3VwLmdldENvbXBvc2l0b3IoKS5nZXROYW1lKCk7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RNb2RlbEdyb3VwLmdldEVsZW1lbnQoKTsKLSAgICAKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGJvb2xlYW4gaGFzTWluT2NjdXJzID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgYm9vbGVhbiBoYXNNYXhPY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICAKLSAgICAgIGlmIChoYXNNaW5PY2N1cnMgfHwgaGFzTWF4T2NjdXJzKQotICAgICAgewotICAJICAgIHJlc3VsdC5hcHBlbmQoIiBbIik7ICAKLSAgCSAgICBpZiAoaGFzTWluT2NjdXJzKQotICAJICAgIHsKLSAgCSAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKXhzZE1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpLmdldE1pbk9jY3VycygpOwotICAJCSAgICBpZiAobWluID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgCQkgICAgewotICAJCSAgICAgIHJlc3VsdC5hcHBlbmQoIioiKTsKLSAgCQkgICAgfQotICAJCSAgICBlbHNlCi0gIAkJICAgIHsKLSAgCQkgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAJCSAgICB9Ci0gIAkgICAgfQotICAgICAgICBlbHNlIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKXhzZE1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpLmdldE1pbk9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWluKSk7Ci0gICAgICAgIH0KLSAgCSAgICBpZiAoaGFzTWF4T2NjdXJzKQotICAJICAgIHsKLSAgCSAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKXhzZE1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAJCSAgICByZXN1bHQuYXBwZW5kKCIuLiIpOwotICAJCSAgICBpZiAobWF4ID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgCQkgICAgewotICAJCSAgICAgIHJlc3VsdC5hcHBlbmQoIioiKTsKLSAgCQkgICAgfQotICAJCSAgICBlbHNlCi0gIAkJICAgIHsKLSAgCQkgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1heCkpOwotICAJCSAgICB9Ci0gIAkgICAgfQotICAgICAgICBlbHNlIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7Ci0gICAgICAgICAgaW50IG1heCA9ICgoWFNEUGFydGljbGUpeHNkTW9kZWxHcm91cC5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtYXgpKTsKLSAgICAgICAgfQotICAJICAgIHJlc3VsdC5hcHBlbmQoIl0iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cClwYXJlbnRFbGVtZW50OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBsaXN0LmFkZEFsbCh4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkpOwotICAgIGxpc3QuYWRkQWxsKFhTRENoaWxkVXRpbGl0eS5nZXRNb2RlbENoaWxkcmVuKHhzZE1vZGVsR3JvdXApKTsKLSAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwIGVsZW1lbnQgPSAoWFNETW9kZWxHcm91cClvYmplY3Q7Ci0gICAgcmV0dXJuIGVsZW1lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjIyNDY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RBYnN0cmFjdEFkYXB0ZXIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0gICAqLwotICBwdWJsaWMgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pb2JqZWN0KTsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiByZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uID0geHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotCi0gICAgaWYgKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RHcm91cFJlZi5naWYiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREdyb3VwLmdpZiIpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pb2JqZWN0KTsKLSAgICBTdHJpbmcgcmVzdWx0ID0gCi0gICAgICB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkgPwotICAgICAgICB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRRTmFtZSgpIDoKLSAgICAgICAgeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICInYWJzZW50JyIgOiByZXN1bHQ7Ci0gIH0KLSAgCi0gIGJvb2xlYW4gaGFzQ2hpbGRyZW4gPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKXBhcmVudEVsZW1lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmICh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKCgoWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwpYWRhcHRlckZhY3RvcnkpLmdldFNob3dSZWZlcmVuY2VzKCkpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCkpOwotICAgICAgICBoYXNDaGlsZHJlbiA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0TW9kZWxHcm91cCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldE1vZGVsR3JvdXAoKSk7Ci0gICAgICAgIGhhc0NoaWxkcmVuID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIGhhc0NoaWxkcmVuOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGVsZW1lbnQgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pb2JqZWN0OwotICAgIHJldHVybiBlbGVtZW50LmdldENvbnRhaW5lcigpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0ROb3RhdGlvbkRlY2xhcmF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRE5vdGF0aW9uRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjODkyNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRE5vdGF0aW9uRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIFhTRE5vdGF0aW9uRGVjbGFyYXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEQWJzdHJhY3RBZGFwdGVyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotICAgKi8KLSAgcHVibGljIFhTRE5vdGF0aW9uRGVjbGFyYXRpb25BZGFwdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIC8vIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbkltYWdlKCJmdWxsL29iajE2L1hTRE5vdGF0aW9uRGVjbGFyYXRpb24iKTsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0ROb3RhdGlvbi5naWYiKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNETm90YXRpb25EZWNsYXJhdGlvbiB4c2ROb3RhdGlvbkRlY2xhcmF0aW9uID0gKChYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKW9iamVjdCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHhzZE5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICIiIDogcmVzdWx0OwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRFBhcnRpY2xlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRFBhcnRpY2xlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzdlOGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RQYXJ0aWNsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuWFNETW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotCi1wdWJsaWMgY2xhc3MgWFNEUGFydGljbGVBZGFwdGVyIGV4dGVuZHMgWFNEQWJzdHJhY3RBZGFwdGVyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotICAgKi8KLSAgcHVibGljIFhTRFBhcnRpY2xlQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLSAgewotICAgIHN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLSAgfQotCi0gIC8vIGhhY2sgdG8gbm90aWZ5IG91dGxpbmUgYW5kIGdyYXBoIHZpZXcgb2YgbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMgY2hhbmdlcwotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIAotICB7Ci0gICAgWFNEUGFydGljbGUgeHNkUGFydGljbGUgPSAoWFNEUGFydGljbGUpbXNnLmdldE5vdGlmaWVyKCk7Ci0gICAgWFNEUGFydGljbGVDb250ZW50IHhzZFBhcnRpY2xlQ29udGVudCA9IHhzZFBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICBpZiAoeHNkUGFydGljbGVDb250ZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHhzZFBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgZmlyZU5vdGlmeUNoYW5nZWQobmV3IE5vdGlmaWNhdGlvbldyYXBwZXIoKFhTREVsZW1lbnREZWNsYXJhdGlvbil4c2RQYXJ0aWNsZUNvbnRlbnQsIG1zZykpOwotICAgICAgICBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIoeHNkUGFydGljbGVDb250ZW50KS5maXJlUHJvcGVydHlDaGFuZ2VkKHhzZFBhcnRpY2xlQ29udGVudCwgbnVsbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh4c2RQYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgewotICAgICAgICBmaXJlTm90aWZ5Q2hhbmdlZChuZXcgTm90aWZpY2F0aW9uV3JhcHBlcigoWFNETW9kZWxHcm91cCl4c2RQYXJ0aWNsZUNvbnRlbnQsIG1zZykpOwotICAgICAgICBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIoeHNkUGFydGljbGVDb250ZW50KS5maXJlUHJvcGVydHlDaGFuZ2VkKHhzZFBhcnRpY2xlQ29udGVudCwgbnVsbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh4c2RQYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICAgIHsKLSAgICAgICAgZmlyZU5vdGlmeUNoYW5nZWQobmV3IE5vdGlmaWNhdGlvbldyYXBwZXIoKFhTRFdpbGRjYXJkKXhzZFBhcnRpY2xlQ29udGVudCwgbXNnKSk7Ci0gICAgICAgIFhTRE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcih4c2RQYXJ0aWNsZUNvbnRlbnQpLmZpcmVQcm9wZXJ0eUNoYW5nZWQoeHNkUGFydGljbGVDb250ZW50LCBudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RTY2hlbWFBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEU2NoZW1hQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmY0ZmIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RTY2hlbWFBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUFkYXB0ZXIgZXh0ZW5kcyBYU0RBYnN0cmFjdEFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIFhTRFBhY2thZ2UgeHNkUGFja2FnZTsKLSAgLyoqCi0gICAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYUFkYXB0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICBzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0gICAgeHNkUGFja2FnZSA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERmlsZS5naWYiKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpZWxlbWVudDsKLSAgICBTdHJpbmcgcmVzdWx0ID0geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9IAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gVVJJLmNyZWF0ZVVSSShyZXN1bHQpLmxhc3RTZWdtZW50KCk7Ci0gICAgfQotICB9Ci0gIExpc3QgY2hpbGRyZW47Ci0gIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkKLSAgewotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoKFhTRFNjaGVtYSlwYXJlbnRFbGVtZW50KTsKLQotICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIExpc3QgZGlyZWN0aXZlc0xpc3QgPSBnZXREaXJlY3RpdmVzKHhzZFNjaGVtYSk7Ci0gICAgCi0gICAgTGlzdCBlbGVtZW50c0xpc3QgPSBnZXRHbG9iYWxFbGVtZW50cyh4c2RTY2hlbWEpOwotICAgIAotICAgIExpc3QgYXR0cmlidXRlR3JvdXBMaXN0ID0gZ2V0QXR0cmlidXRlR3JvdXBMaXN0KHhzZFNjaGVtYSk7Ci0gICAgCi0gICAgTGlzdCBhdHRyaWJ1dGVzTGlzdCA9IGdldEF0dHJpYnV0ZUxpc3QoeHNkU2NoZW1hKTsKLSAgICAKLSAgICBMaXN0IGdyb3VwcyA9IGdldEdyb3Vwcyh4c2RTY2hlbWEpOwotICAgIAotICAgIExpc3Qgbm90YXRpb25zID0gZ2V0Tm90YXRpb25zKHhzZFNjaGVtYSk7Ci0KLSAgICBMaXN0IHR5cGVzID0gZ2V0Q29tcGxleFR5cGVzKHhzZFNjaGVtYSk7Ci0gICAgdHlwZXMuYWRkQWxsKGdldFNpbXBsZVR5cGVzKHhzZFNjaGVtYSkpOwotICAgIAotICAgIGNoaWxkcmVuLmFkZAotICAgIChuZXcgQ2F0ZWdvcnlBZGFwdGVyCi0gICAgICAoIC8vWFNERWRpdFBsdWdpbi5nZXRTdHJpbmcoIl9VSV9FbGVtZW50c19sYWJlbCIpLCAKLSAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0dSQVBIX0RJUkVDVElWRVMiKSwKLSAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb25JbWFnZSgib2JqMTYvZGlyZWN0aXZlc2hlYWRlciIpLAotICAgICAgICBkaXJlY3RpdmVzTGlzdCwgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuRElSRUNUSVZFUykpOwotICAgIGNoaWxkcmVuLmFkZAotICAgICAgICAobmV3IENhdGVnb3J5QWRhcHRlcgotICAgICAgICAgICggLy9YU0RFZGl0UGx1Z2luLmdldFN0cmluZygiX1VJX0VsZW1lbnRzX2xhYmVsIiksIAotICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0dSQVBIX0VMRU1FTlRTIiksCi0gICAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbkltYWdlKCJvYmoxNi9lbGVtZW50c2hlYWRlciIpLAotICAgICAgICAgICAgZWxlbWVudHNMaXN0LCB4c2RTY2hlbWEsIENhdGVnb3J5QWRhcHRlci5FTEVNRU5UUykpOwotICAgICAgY2hpbGRyZW4uYWRkCi0gICAgICAgIChuZXcgQ2F0ZWdvcnlBZGFwdGVyCi0gICAgICAgICAgKCAvL1hTREVkaXRQbHVnaW4uZ2V0U3RyaW5nKCJfVUlfQXR0cmlidXRlc19sYWJlbCIpLAotICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0dSQVBIX0FUVFJJQlVURVMiKSwKLSAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uSW1hZ2UoIm9iajE2L2F0dHJpYnV0ZXNoZWFkZXIiKSwKLSAgICAgICAgICAgIGF0dHJpYnV0ZXNMaXN0LCB4c2RTY2hlbWEsIENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKSk7Ci0gICAgICBjaGlsZHJlbi5hZGQKLSAgICAgICAgKG5ldyBDYXRlZ29yeUFkYXB0ZXIKLSAgICAgICAgICAoLy9YU0RFZGl0UGx1Z2luLmdldFN0cmluZygiX1VJX0F0dHJpYnV0ZUdyb3Vwc19sYWJlbCIpLAotICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0dSQVBIX0FUVFJJQlVURV9HUk9VUFMiKSwKLSAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uSW1hZ2UoIm9iajE2L2F0dHJpYnV0ZWdyb3Vwc2hlYWRlciIpLAotICAgICAgICAgICAgYXR0cmlidXRlR3JvdXBMaXN0LCB4c2RTY2hlbWEsIENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVfR1JPVVBTKSk7Ci0gICAgICBjaGlsZHJlbi5hZGQKLSAgICAgICAgKG5ldyBDYXRlZ29yeUFkYXB0ZXIKLSAgICAgICAgICAoIC8vWFNERWRpdFBsdWdpbi5nZXRTdHJpbmcoIl9VSV9UeXBlc19sYWJlbCIpLCAKLSAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9HUkFQSF9UWVBFUyIpLAotICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb25JbWFnZSgib2JqMTYvdHlwZXNoZWFkZXIiKSwKLSAgICAgICAgICAgIHR5cGVzLCB4c2RTY2hlbWEsIENhdGVnb3J5QWRhcHRlci5UWVBFUykpOwotICAgICAgY2hpbGRyZW4uYWRkCi0gICAgICAgIChuZXcgQ2F0ZWdvcnlBZGFwdGVyCi0gICAgICAgICAgKCAvLyBYU0RFZGl0UGx1Z2luLmdldFN0cmluZygiX1VJX01vZGVsR3JvdXBzX2xhYmVsIiksIAotICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0dSQVBIX0dST1VQUyIpLAotICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb25JbWFnZSgib2JqMTYvZ3JvdXBzaGVhZGVyIiksCi0gICAgICAgICAgICBncm91cHMsIHhzZFNjaGVtYSwgQ2F0ZWdvcnlBZGFwdGVyLkdST1VQUykpOwotICAgICAgY2hpbGRyZW4uYWRkCi0gICAgICAgIChuZXcgQ2F0ZWdvcnlBZGFwdGVyCi0gICAgICAgICAgKCAvLyBYU0RFZGl0UGx1Z2luLmdldFN0cmluZygiX1VJX05vdGF0aW9uc19sYWJlbCIpLCAKLSAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9HUkFQSF9OT1RBVElPTlMiKSwKLSAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uSW1hZ2UoIm9iajE2L25vdGF0aW9uc2hlYWRlciIpLAotICAgICAgICAgICAgbm90YXRpb25zLCB4c2RTY2hlbWEsIENhdGVnb3J5QWRhcHRlci5OT1RBVElPTlMpKTsKLS8vICAgICAgY2hpbGRyZW4uYWRkCi0vLyAgICAgICAgKG5ldyBDYXRlZ29yeUFkYXB0ZXIKLS8vICAgICAgICAgICggLy9YU0RFZGl0UGx1Z2luLmdldFN0cmluZygiX1VJX0lkZW50aXR5Q29uc3RyYWludHNfbGFiZWwiKSwgCi0vLyAgICAgICAgICAgICAgIklkZW50aXR5IENvbnN0cmFpbnRzIiwKLS8vICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb25JbWFnZSgiZnVsbC9vYmoxNi9YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uS2V5IiksCi0vLyAgICAgICAgICAgIHhzZFNjaGVtYS5nZXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucygpLCB4c2RTY2hlbWEsIENhdGVnb3J5QWRhcHRlci5JREVOVElUWV9DT05TVFJBSU5UUykpOwotLy8gICAgICBjaGlsZHJlbi5hZGQKLS8vICAgICAgICAobmV3IENhdGVnb3J5QWRhcHRlcgotLy8gICAgICAgICAgKCAvLyBYU0RFZGl0UGx1Z2luLmdldFN0cmluZygiX1VJX0Fubm90YXRpb25zX2xhYmVsIiksIAotLy8gICAgICAgICAgICAgICJBbm5vdGF0aW9ucyIsCi0vLyAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uSW1hZ2UoIm9iajE2L2Fubm90YXRpb25zaGVhZGVyIiksCi0vLyAgICAgICAgICAgIHhzZFNjaGVtYS5nZXRBbm5vdGF0aW9ucygpLCB4c2RTY2hlbWEsIENhdGVnb3J5QWRhcHRlci5BTk5PVEFUSU9OUykpOwotCi0gICAgcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKQotICB7Ci0gICAgY2xhc3MgQ2F0ZWdvcnlOb3RpZmljYXRpb24gZXh0ZW5kcyBOb3RpZmljYXRpb25JbXBsCi0gICAgewotICAgICAgcHJvdGVjdGVkIE9iamVjdCBjYXRlZ29yeTsKLSAgICAgIHB1YmxpYyBDYXRlZ29yeU5vdGlmaWNhdGlvbihPYmplY3QgY2F0ZWdvcnkpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyKG1zZy5nZXRFdmVudFR5cGUoKSwgbXNnLmdldE9sZFZhbHVlKCksIG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0UG9zaXRpb24oKSk7Ci0gICAgICAgIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjYXRlZ29yeTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBtc2cuZ2V0RmVhdHVyZSgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotICAgIAlnZXRDaGlsZHJlbih0YXJnZXQpOwotICAgIH0KLQotICAgIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IHhzZFBhY2thZ2UuZ2V0WFNEU2NoZW1hX0NvbnRlbnRzKCkpCi0gICAgewotICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKWNoaWxkcmVuLmdldCgwKTsKLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBhZGFwdGVyLmdldFhTRFNjaGVtYSgpOwotICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbihnZXREaXJlY3RpdmVzKHhzZFNjaGVtYSkpOwotICAgICAgdGhpcy5maXJlTm90aWZ5Q2hhbmdlZChuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlcikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IHhzZFBhY2thZ2UuZ2V0WFNEU2NoZW1hX0VsZW1lbnREZWNsYXJhdGlvbnMoKSkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IChDYXRlZ29yeUFkYXB0ZXIpY2hpbGRyZW4uZ2V0KDEpOwotICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGFkYXB0ZXIuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICBhZGFwdGVyLnNldENoaWxkcmVuKGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSkpOwotICAgICAgdGhpcy5maXJlTm90aWZ5Q2hhbmdlZChuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlcikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IHhzZFBhY2thZ2UuZ2V0WFNEU2NoZW1hX0F0dHJpYnV0ZURlY2xhcmF0aW9ucygpKQotICAgIHsKLSAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gKENhdGVnb3J5QWRhcHRlciljaGlsZHJlbi5nZXQoMik7Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYWRhcHRlci5nZXRYU0RTY2hlbWEoKTsKLSAgICAgIGFkYXB0ZXIuc2V0Q2hpbGRyZW4oZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEpKTsKLSAgICAgIHRoaXMuZmlyZU5vdGlmeUNoYW5nZWQobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSB4c2RQYWNrYWdlLmdldFhTRFNjaGVtYV9BdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkpCi0gICAgewotICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKWNoaWxkcmVuLmdldCgzKTsKLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBhZGFwdGVyLmdldFhTRFNjaGVtYSgpOwotICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbihnZXRBdHRyaWJ1dGVHcm91cExpc3QoeHNkU2NoZW1hKSk7Ci0gICAgICB0aGlzLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0geHNkUGFja2FnZS5nZXRYU0RTY2hlbWFfVHlwZURlZmluaXRpb25zKCkpCi0gICAgewotICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKWNoaWxkcmVuLmdldCg0KTsKLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBhZGFwdGVyLmdldFhTRFNjaGVtYSgpOwotICAgICAgTGlzdCB0eXBlcyA9IGdldENvbXBsZXhUeXBlcyh4c2RTY2hlbWEpOwotICAgICAgdHlwZXMuYWRkQWxsKGdldFNpbXBsZVR5cGVzKHhzZFNjaGVtYSkpOwotCi0gICAgICBhZGFwdGVyLnNldENoaWxkcmVuKHR5cGVzKTsKLSAgICAgIHRoaXMuZmlyZU5vdGlmeUNoYW5nZWQobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSB4c2RQYWNrYWdlLmdldFhTRFNjaGVtYV9Nb2RlbEdyb3VwRGVmaW5pdGlvbnMoKSkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IChDYXRlZ29yeUFkYXB0ZXIpY2hpbGRyZW4uZ2V0KDUpOwotICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGFkYXB0ZXIuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICBhZGFwdGVyLnNldENoaWxkcmVuKGdldEdyb3Vwcyh4c2RTY2hlbWEpKTsKLSAgICAgIHRoaXMuZmlyZU5vdGlmeUNoYW5nZWQobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSB4c2RQYWNrYWdlLmdldFhTRFNjaGVtYV9Ob3RhdGlvbkRlY2xhcmF0aW9ucygpKQotICAgIHsKLSAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gKENhdGVnb3J5QWRhcHRlciljaGlsZHJlbi5nZXQoNik7Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYWRhcHRlci5nZXRYU0RTY2hlbWEoKTsKLSAgICAgIGFkYXB0ZXIuc2V0Q2hpbGRyZW4oZ2V0Tm90YXRpb25zKHhzZFNjaGVtYSkpOwotICAgICAgdGhpcy5maXJlTm90aWZ5Q2hhbmdlZChuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlcikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLS8vICAgIGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0geHNkUGFja2FnZS5nZXRYU0RTY2hlbWFfSWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKSkKLS8vICAgIHsKLS8vICAgICAgdGhpcy5maXJlTm90aWZ5Q2hhbmdlZChuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oY2hpbGRyZW4uZ2V0KDcpKSk7Ci0vLyAgICAgIHJldHVybjsKLS8vICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IHhzZFBhY2thZ2UuZ2V0WFNEU2NoZW1hX0Fubm90YXRpb25zKCkpCi0gICAgewotLy8gICAgICB0aGlzLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihjaGlsZHJlbi5nZXQoNykpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSB4c2RQYWNrYWdlLmdldFhTRFNjaGVtYV9TY2hlbWFMb2NhdGlvbigpKQotICAgIHsKLSAgICAgIHRoaXMuZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXREaXJlY3RpdmVzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsgICAgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQobyk7Ci0gICAgICB9Ci0gICAgfSAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0QXR0cmlidXRlR3JvdXBMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZUdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24paS5uZXh0KCk7Ci0gICAgICBpZiAoYXR0ckdyb3VwLmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGF0dHJpYnV0ZUdyb3VwTGlzdC5hZGQoYXR0ckdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZUdyb3VwTGlzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0QXR0cmlidXRlTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgTGlzdCBhdHRyaWJ1dGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilvOwotICAgICAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGF0dHIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIShhdHRyLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChhdHRyLmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzTGlzdC5hZGQoYXR0cik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhdHRyLmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGF0dHJpYnV0ZXNMaXN0LmFkZChhdHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZXNMaXN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRHbG9iYWxFbGVtZW50cyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgTGlzdCBlbGVtZW50cyA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW0gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgaWYgKGVsZW0uZ2V0Um9vdENvbnRhaW5lcigpID09IHNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZWxlbSk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0Q29tcGxleFR5cGVzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBMaXN0IGFsbFR5cGVzID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhbGxUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gKFhTRFR5cGVEZWZpbml0aW9uKWkubmV4dCgpOwotICAgICAgaWYgKHRkIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXRkOwotICAgICAgICBpZiAoY3QuZ2V0Um9vdENvbnRhaW5lcigpID09IHNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRTaW1wbGVUeXBlcyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgTGlzdCBhbGxUeXBlcyA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gYWxsVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IChYU0RUeXBlRGVmaW5pdGlvbilpLm5leHQoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil0ZDsKLSAgICAgICAgaWYgKHN0LmdldFJvb3RDb250YWluZXIoKSA9PSBzY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBsaXN0OwotICB9ICAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0R3JvdXBzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBMaXN0IGdyb3VwcyA9IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ3JvdXBzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24paS5uZXh0KCk7Ci0gICAgICBpZiAoZ3JvdXAuZ2V0Um9vdENvbnRhaW5lcigpID09IHNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZ3JvdXApOwotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldE5vdGF0aW9ucyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgTGlzdCBub3RhdGlvbnMgPSBzY2hlbWEuZ2V0Tm90YXRpb25EZWNsYXJhdGlvbnMoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbm90YXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgWFNETm90YXRpb25EZWNsYXJhdGlvbiBub3RhdGlvbiA9IChYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgaWYgKG5vdGF0aW9uLmdldFJvb3RDb250YWluZXIoKSA9PSBzY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKG5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2NmOTEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlciBleHRlbmRzIFhTREFic3RyYWN0QWRhcHRlcgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotICB9Ci0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RJbXBvcnQuZ2lmIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREluY2x1ZGUpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNESW5jbHVkZS5naWYiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEUmVkZWZpbmUuZ2lmIik7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSlvYmplY3Q7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IGRpcmVjdGl2ZS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gIigiICsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX05PX0xPQ0FUSU9OX1NQRUNJRklFRCIpICsgIikiOwotICAgIGlmIChyZXN1bHQuZXF1YWxzKCIiKSkgcmVzdWx0ID0gIigiICsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX05PX0xPQ0FUSU9OX1NQRUNJRklFRCIpKyAiKSI7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgICAKLS8vICAgIFhTREltcG9ydCB4c2RJbXBvcnQgPSAoKFhTREltcG9ydClvYmplY3QpOwotLy8gICAgU3RyaW5nIHJlc3VsdCA9IHhzZEltcG9ydC5nZXRTY2hlbWFMb2NhdGlvbigpOwotLy8gICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gIiIgOiByZXN1bHQ7Ci0gICAgCi0vLyAgICBYU0RJbmNsdWRlIHhzZEluY2x1ZGUgPSAoKFhTREluY2x1ZGUpb2JqZWN0KTsKLS8vICAgIFN0cmluZyByZXN1bHQgPSB4c2RJbmNsdWRlLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0vLyAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAiIiA6IHJlc3VsdDsKLSAgICAKLS8vICAgIFhTRFJlZGVmaW5lIHhzZFJlZGVmaW5lID0gKChYU0RSZWRlZmluZSlvYmplY3QpOwotLy8gICAgU3RyaW5nIHJlc3VsdCA9IHhzZFJlZGVmaW5lLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0vLyAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAiIiA6IHJlc3VsdDsKLQotCi0gIH0KLQotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICB7Ci0gICAgICBYU0RSZWRlZmluZSByZWRlZmluZSA9IChYU0RSZWRlZmluZSlwYXJlbnRFbGVtZW50OwotICAgICAgbGlzdCA9IHJlZGVmaW5lLmdldENvbnRlbnRzKCk7Ci0gICAgICBpZiAobGlzdCA9PSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDQwMjZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcm92aWRlci9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEQWJzdHJhY3RBZGFwdGVyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotICAgKi8KLSAgcHVibGljIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLSAgewotICAgIHN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKW9iamVjdCk7Ci0gICAgCi0gICAgaWYgKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldENvbnRhaW5lcigpID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKFhTRFZhcmlldHkuTElTVF9MSVRFUkFMID09IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFZhcmlldHkoKSkKLSAgICB7Ci0gICAgICAvLyByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVMaXN0LmdpZiIpOwotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uSW1hZ2UoIm9iajE2L3NtcGxfbGlzdF9vYmoiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNEVmFyaWV0eS5VTklPTl9MSVRFUkFMID09IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFZhcmlldHkoKSkKLSAgICB7Ci0gICAgICAvL3JldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVVuaW9uLmdpZiIpOwotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uSW1hZ2UoIm9iajE2L3NtcGxfdW5pb25fb2JqIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRFZhcmlldHkuQVRPTUlDX0xJVEVSQUwgPT0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VmFyaWV0eSgpKQotICAgIHsKLSAgICAgIC8vIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVJlc3RyaWN0LmdpZiIpOwotICAgICAgRWxlbWVudCBzdEVsZW1lbnQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgaWYgKGRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc3RFbGVtZW50LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbkltYWdlKCJvYmoxNi9zbXBsX3Jlc3RyaWN0X29iaiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uaXNTZXRWYXJpZXR5KCkpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIik7Ci0gICAgfQotICAgIAotLy8gICAgcmV0dXJuIAotLy8gICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbkltYWdlCi0vLyAgICAgICAgKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldENvbnRhaW5lcigpID09IG51bGwgPwotLy8gICAgICAgICAgICJmdWxsL29iajE2L1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uVW5yZXNvbHZlZCIgOgotLy8gICAgICAgICAgIFhTRFZhcmlldHkuTElTVF9MSVRFUkFMID09IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFZhcmlldHkoKSA/IAotLy8gICAgICAgICAgICAgImZ1bGwvb2JqMTYvWFNEU2ltcGxlVHlwZURlZmluaXRpb25MaXN0IiA6ICAKLS8vICAgICAgICAgICAgICBYU0RWYXJpZXR5LlVOSU9OX0xJVEVSQUwgPT0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VmFyaWV0eSgpID8gCi0vLyAgICAgICAgICAgICAgICAiZnVsbC9vYmoxNi9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvblVuaW9uIiA6Ci0vLyAgICAgICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmlzU2V0VmFyaWV0eSgpID8KLS8vICAgICAgICAgICAgICAgICAgICAiZnVsbC9vYmoxNi9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkF0b21pYyIgIDoKLS8vICAgICAgICAgICAgICAgICAgICAiZnVsbC9vYmoxNi9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBnZXRUZXh0KG9iamVjdCwgdHJ1ZSk7Ci0gIH0KLSAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QsIGJvb2xlYW4gc2hvd1R5cGUpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pb2JqZWN0KTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICByZXN1bHQuYXBwZW5kCi0gICAgICAoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpID09IG51bGwgPyAKLSAgICAgICAgIC8vIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEFsaWFzTmFtZSgpIDoKLSAgICAgICAgICJsb2NhbCB0eXBlIiA6Ci0gICAgICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOwotCi0gICAgaWYgKHNob3dUeXBlKQotICAgIHsKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGJhc2VUeXBlRGVmaW5pdGlvbiA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIFhTRFZhcmlldHkuQVRPTUlDX0xJVEVSQUwgPT0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VmFyaWV0eSgpKQotICAgICAgewotICAgICAgICBpZiAoYmFzZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSAhPSBudWxsICYmIAotICAgICAgICAgICAgICAheHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0Q29udGVudHMoKS5jb250YWlucyhiYXNlVHlwZURlZmluaXRpb24pICYmCi0gICAgICAgICAgICAgICFYU0RDb25zdGFudHMuaXNBbnlTaW1wbGVUeXBlKGJhc2VUeXBlRGVmaW5pdGlvbikpIAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChiYXNlVHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkU2ltcGxlVHlwZURlZmluaXRpb24pKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpdGVtVHlwZURlZmluaXRpb24gPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRJdGVtVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGl0ZW1UeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGl0ZW1UeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCkgCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGl0ZW1UeXBlRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIAotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBtZW1iZXJUeXBlRGVmaW5pdGlvbnMgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgICBpZiAoIW1lbWJlclR5cGVEZWZpbml0aW9ucy5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG1lbWJlcnMgPSBtZW1iZXJUeXBlRGVmaW5pdGlvbnMuaXRlcmF0b3IoKTsgbWVtYmVycy5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gbWVtYmVyVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pbWVtYmVycy5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChtZW1iZXJUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCkgCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7Ci0gICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIHwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobWVtYmVyVHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkU2ltcGxlVHlwZURlZmluaXRpb24pKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJ2Fic2VudCciKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilwYXJlbnRFbGVtZW50OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgIGxpc3QuYWRkQWxsKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldENvbnRlbnRzKCkpOwotLy8gICAgbGlzdC5hZGRBbGwoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RmFjZXRDb250ZW50cygpKTsKLS8vICAgIGxpc3QuYWRkQWxsKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEZ1bmRhbWVudGFsRmFjZXRzKCkpOwotLy8gICAgbGlzdC5hZGRBbGwoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0U3ludGhldGljRmFjZXRzKCkpOwotICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKLSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBlbGVtZW50ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKW9iamVjdDsKLSAgICByZXR1cm4gZWxlbWVudC5nZXRDb250YWluZXIoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEV2lsZGNhcmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJvdmlkZXIvWFNEV2lsZGNhcmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTlmNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3Byb3ZpZGVyL1hTRFdpbGRjYXJkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBYU0RXaWxkY2FyZEFkYXB0ZXIgZXh0ZW5kcyBYU0RBYnN0cmFjdEFkYXB0ZXIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0gICAqLwotICBwdWJsaWMgWFNEV2lsZGNhcmRBZGFwdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZCA9IChYU0RXaWxkY2FyZClvYmplY3Q7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZQotICAgICAgKHhzZFdpbGRjYXJkLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlID8KLSAgICAgICAgImljb25zL1hTREFueS5naWYiIDoKLSAgICAgICAgImljb25zL1hTREFueUF0dHJpYnV0ZS5naWYiKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZCA9ICgoWFNEV2lsZGNhcmQpb2JqZWN0KTsKLSAgICAKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZFdpbGRjYXJkLmdldEVsZW1lbnQoKTsKLSAgICAKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoZWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLSAgICAgIGJvb2xlYW4gaGFzTWluT2NjdXJzID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgYm9vbGVhbiBoYXNNYXhPY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICAKLSAgICAgIGlmIChoYXNNaW5PY2N1cnMgfHwgaGFzTWF4T2NjdXJzKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgWyIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGhhc01pbk9jY3VycykKLSAgICAgICAgewotICAgICAgICAgIAotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKXhzZFdpbGRjYXJkLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICBpZiAobWluID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKXhzZFdpbGRjYXJkLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoYXNNYXhPY2N1cnMpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSl4c2RXaWxkY2FyZC5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsKLSAgICAgICAgICBpZiAobWF4ID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1heCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7Ci0gICAgICAgICAgaW50IG1heCA9ICgoWFNEUGFydGljbGUpeHNkV2lsZGNhcmQuZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXSIpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpb2JqZWN0OwotICAgIHJldHVybiB4c2RXaWxkY2FyZC5nZXRDb250YWluZXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yaW5nTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvcmluZ01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTZkOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yaW5nTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgUmVmYWN0b3JpbmdNZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQlVORExFPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZT0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFJFU09VUkNFX0JVTkRMRSk7Ci0KLQlwcml2YXRlIFJlZmFjdG9yaW5nTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFN0cmluZ3MoU3RyaW5nIGtleXNbXSkgewotCQlTdHJpbmdbXSByZXN1bHQ9IG5ldyBTdHJpbmdba2V5cy5sZW5ndGhdOwotCQlmb3IgKGludCBpPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldPSBnZXRTdHJpbmcoa2V5c1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcpIHsKLQkJcmV0dXJuIGdldEZvcm1hdHRlZFN0cmluZyhrZXksIG5ldyBPYmplY3RbXSB7IGFyZyB9KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsJCi0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvWFNEVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1hTRFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiZGEzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvWFNEVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTRFZpc2l0b3IKLXsKLSAgcHVibGljIFhTRFZpc2l0b3IoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCA9IChYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oaWRlbnRpdHlDb25zdHJhaW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0cmlidXRlR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE5vdGF0aW9uRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNETm90YXRpb25EZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0VHlwZURlZmluaXRpb24oZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbihYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWYpCi0gIHsKLSAgICBpZiAoIW1vZGVsR3JvdXBEZWYuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIGlmIChtb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2aXNpdE1vZGVsR3JvdXAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwKQotICB7Ci0gICAgaWYgKGF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZVVzZXMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZVVzZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpaXRlci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0clVzZS5nZXRDb250ZW50KCkpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24gbm90YXRpb24pCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4Q29udGVudCA9IChYU0RDb21wbGV4VHlwZUNvbnRlbnQpIHR5cGUuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb21wbGV4Q29udGVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICB2aXNpdFBhcnRpY2xlKChYU0RQYXJ0aWNsZSkgY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAodHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudClpdGVyLm5leHQoKTsKLSAgICAgICAgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpYXR0ckdyb3VwQ29udGVudDsKLSAgICAgICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHJVc2UuZ2V0Q29udGVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilhdHRyR3JvdXBDb250ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZShYU0RQYXJ0aWNsZSBwYXJ0aWNsZSkKLSAgewotICAgIHZpc2l0UGFydGljbGVDb250ZW50KHBhcnRpY2xlLmdldENvbnRlbnQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGVDb250ZW50KFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQpCi0gIHsKLSAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbigoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwKChYU0RNb2RlbEdyb3VwKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIHZpc2l0V2lsZGNhcmQoKFhTRFdpbGRjYXJkKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICB7Ci0gICAgaWYgKG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZShwYXJ0aWNsZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkKFhTRFdpbGRjYXJkIHdpbGRjYXJkKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9NYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODIzNDZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLk1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmUuTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIGZQYXJlbnROYW1lOwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXhUeXBlID0gdHJ1ZTsKLQlwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIGZTZWxlY3RlZENvbXBvbmVudDsKLQkKLQlwdWJsaWMgTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyLCBYU0RTY2hlbWEgc2NoZW1hKSB7Ci0JCXN1cGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLQkJc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX01BS0VfQU5PTllNT1VTX1RZUEVfR0xPQkFMIikpOyAvLyROT04tTkxTLTEkCi0JCXNldFNjaGVtYShzY2hlbWEpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW4oKSB7Ci0KLQkJcmV0dXJuIGZTZWxlY3RlZENvbXBvbmVudCAhPSBudWxsOwotCX0KLQkKLQotCXByaXZhdGUgU3RyaW5nIGdldE5ld0RlZmF1bHROYW1lKCl7Ci0JCWlmKGZQYXJlbnROYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhmUGFyZW50TmFtZSkpewotCQkJaWYoaXNDb21wbGV4VHlwZSl7Ci0JCQkJcmV0dXJuIGZQYXJlbnROYW1lICsgIkNvbXBsZXhUeXBlIjsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJcmV0dXJuIGZQYXJlbnROYW1lICsgIlNpbXBsZVR5cGUiOwotCQkJfQotCQl9Ci0JCWVsc2V7Ci0JCQlpZihpc0NvbXBsZXhUeXBlKXsKLQkJCQlyZXR1cm4gIk5ld0NvbXBsZXhUeXBlIjsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJcmV0dXJuICJOZXdTaW1wbGVUeXBlIjsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGNhbkVuYWJsZShYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpewotCQlpZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0JCQlmU2VsZWN0ZWRDb21wb25lbnQgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXhzZENvbXBvbmVudDsKLQkJCWlzQ29tcGxleFR5cGUgPSB0cnVlOwotCQkJWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB4c2RDb21wb25lbnQ7Ci0JCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSB0eXBlRGVmLmdldENvbnRhaW5lcigpOwotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKXsKLQkJCQlmUGFyZW50TmFtZSA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcmVudCkuZ2V0TmFtZSgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IAotCQllbHNlIGlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil7Ci0JCQlmU2VsZWN0ZWRDb21wb25lbnQgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24peHNkQ29tcG9uZW50OwotCQkJaXNDb21wbGV4VHlwZSA9IGZhbHNlOwotCQkJWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgeHNkQ29tcG9uZW50OwotCQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdHlwZURlZi5nZXRDb250YWluZXIoKTsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbil7Ci0JCQkJZlBhcmVudE5hbWUgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJlbnQpLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pewotCQkJCWZQYXJlbnROYW1lID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilwYXJlbnQpLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0JCQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotCQkJcmV0dXJuIGNhbkVuYWJsZSgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWRPYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHNlbGVjdGVkT2JqZWN0OwotCQkJWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSBnZXRTY2hlbWEoKQotCQkJCQkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChub2RlKTsKLQkJCXJldHVybiBjYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgcnVuMSgpIHsKLQkJCi0JCWlmKGZTZWxlY3RlZENvbXBvbmVudCA9PSBudWxsKXsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoZlNlbGVjdGVkQ29tcG9uZW50LmdldFNjaGVtYSgpID09IG51bGwpewotCQkJZ2V0U2NoZW1hKCkudXBkYXRlRWxlbWVudCh0cnVlKTsKLQkJfQotCQlNYWtlVHlwZUdsb2JhbFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IoZlNlbGVjdGVkQ29tcG9uZW50LCBnZXROZXdEZWZhdWx0TmFtZSgpKTsKLQkJUmVuYW1lUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLQkJdHJ5IHsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZ1dpemFyZCgKLQkJCQkJcmVmYWN0b3JpbmcsCi0JCQkJCVJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRXaXphcmQuZGVmYXVsdFBhZ2VUaXRsZSIpLCAvLyROT04tTkxTLTEkIFRPRE86IHByb3ZpZGUgY29ycmVjdCBzdHJpbmdzCi0JCQkJCVJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRXaXphcmQuaW5wdXRQYWdlLmRlc2NyaXB0aW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCk7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24gb3A9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24od2l6YXJkKTsKLQkJCWludCByZXN1bHQ9IG9wLnJ1bihYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgd2l6YXJkLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQlvcC5nZXRJbml0aWFsQ29uZGl0aW9uQ2hlY2tpbmdTdGF0dXMoKTsKLQkJCS8vdHJpZ2dlckJ1aWxkKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcuIFVzZXIgYWN0aW9uIGdvdCBjYW5jZWxsZWQKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCl7Ci0JCWlmKGZTZWxlY3RlZENvbXBvbmVudCA9PSBudWxsKXsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoZlNlbGVjdGVkQ29tcG9uZW50LmdldFNjaGVtYSgpID09IG51bGwpewotCQkJZ2V0U2NoZW1hKCkudXBkYXRlRWxlbWVudCh0cnVlKTsKLQkJfQotCQlEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgZlNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKAotCQkJCQkJdGhpcywKLQkJCQkJCVhTREVkaXRvclBsdWdpbgotCQkJCQkJCQkuZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX01BS0VfQU5PTllNT1VTX1RZUEVfR0xPQkFMIikpOwotCQlNYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQgY29tbWFuZCA9IG5ldyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQoCi0JCQkJZlNlbGVjdGVkQ29tcG9uZW50LCBnZXROZXdEZWZhdWx0TmFtZSgpKTsKLQkJY29tbWFuZC5ydW4oKTsKLQkJZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTBiMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLk1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gewotCi0JWFNERWxlbWVudERlY2xhcmF0aW9uIGZTZWxlY3RlZENvbXBvbmVudDsKLQotCXB1YmxpYyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uKElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciwgWFNEU2NoZW1hIHNjaGVtYSkgewotCQlzdXBlcihzZWxlY3Rpb25Qcm92aWRlcik7Ci0JCXNldFRleHQoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIk1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24udGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRTY2hlbWEoc2NoZW1hKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuKCkgewotCi0JCXJldHVybiBmU2VsZWN0ZWRDb21wb25lbnQgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWRPYmplY3QpIHsKLQotCQlmU2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlpZiAoIWVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSAmJiAhZWxlbWVudC5pc0dsb2JhbCgpKSB7Ci0JCQkJZlNlbGVjdGVkQ29tcG9uZW50ID0gZWxlbWVudDsKLQkJCX0KLQkJfSAKLQkJcmV0dXJuIGNhblJ1bigpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0JCQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotCQkJcmV0dXJuIGNhbkVuYWJsZSgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWRPYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHNlbGVjdGVkT2JqZWN0OwotCQkJWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSBnZXRTY2hlbWEoKQotCQkJCQkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChub2RlKTsKLQkJCXJldHVybiBjYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSBmU2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpCi0JCQkJLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VGV4dCgpKTsKLQkJTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQgY29tbWFuZCA9IG5ldyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZCgKLQkJCQlmU2VsZWN0ZWRDb21wb25lbnQpOwotCQljb21tYW5kLnJ1bigpOwotCQlkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZWZhY3RvckFjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZWZhY3RvckFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZmVmYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiBBY3Rpb24gZ3JvdXAgdGhhdCBhZGRzIHJlZmFjdG9yIGFjdGlvbnMgKGZvciBleGFtcGxlICdSZW5hbWUnLCAnTW92ZScpIHRvIGEKLSAqIGNvbnRleHQgbWVudSBhbmQgdGhlIGdsb2JhbCBtZW51IGJhci4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVmYWN0b3JBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvcmluZy5tZW51IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfUkVPUkcgPSAicmVvcmdHcm91cCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9FTEVNRU5UID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUtFX0VMRU1FTlRfR0xPQkFMID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFLRV9UWVBFX0dMT0JBTCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JpbmcuYWN0aW9ucy5SZW5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3AtdXAgbWVudTogbmFtZSBvZiBncm91cCBmb3IgcmVvcmdhbml6ZSBhY3Rpb25zICh2YWx1ZQotCSAqIDxjb2RlPiJncm91cC5yZW9yZ2FuaXplIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX1JFT1JHQU5JWkUgPSBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdST1VQX1JFT1JHQU5JWkU7Ci0KLQkvKioKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFNpdGUgZlNpdGU7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25Qcm92aWRlciBmU2VsZWN0aW9uUHJvdmlkZXI7Ci0KLQlwcml2YXRlIFhTRFNjaGVtYSBmU2NoZW1hOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkdyb3VwTmFtZSA9IEdST1VQX1JFT1JHQU5JWkU7Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGZSZW5hbWVBY3Rpb247Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGZNYWtlTG9jYWxFbGVtZW50R2xvYmFsOwotCQotCXByaXZhdGUgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gZk1ha2VMb2NhbFR5cGVHbG9iYWw7Ci0KLQlwcml2YXRlIExpc3QgZkVkaXRvckFjdGlvbnM7Ci0KLQlwcml2YXRlIElNZW51TWFuYWdlciBmUmVmYWN0b3JTdWJtZW51OwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9BY3Rpb25BdmFpbGFibGUgZXh0ZW5kcyBBY3Rpb24gewotCQlwdWJsaWMgTm9BY3Rpb25BdmFpbGFibGUoKSB7Ci0JCQlzZXRFbmFibGVkKHRydWUpOwotCQkJc2V0VGV4dChSZWZhY3RvcmluZ01lc3NhZ2VzCi0JCQkJCS5nZXRTdHJpbmcoIlJlZmFjdG9yQWN0aW9uR3JvdXAubm9fcmVmYWN0b3JpbmdfYXZhaWxhYmxlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBmTm9BY3Rpb25BdmFpbGFibGUgPSBuZXcgTm9BY3Rpb25BdmFpbGFibGUoKTsKLQkKLQlwdWJsaWMgUmVmYWN0b3JBY3Rpb25Hcm91cChJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQlYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCXRoaXMoc2VsZWN0aW9uUHJvdmlkZXIsIHNjaGVtYSk7Ci0JCWZHcm91cE5hbWUgPSBncm91cE5hbWU7Ci0JfQotCQotCXB1YmxpYyBSZWZhY3RvckFjdGlvbkdyb3VwKElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciwKLQkJCVhTRFNjaGVtYSBzY2hlbWEpIHsKLQkJZlNlbGVjdGlvblByb3ZpZGVyID0gc2VsZWN0aW9uUHJvdmlkZXI7Ci0JCWZTY2hlbWEgPSBzY2hlbWE7Ci0JCWZFZGl0b3JBY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmUmVuYW1lQWN0aW9uID0gbmV3IFJlbmFtZUFjdGlvbihzZWxlY3Rpb25Qcm92aWRlciwgc2NoZW1hKTsKLQkJZlJlbmFtZUFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoUkVOQU1FX0VMRU1FTlQpOwotCQlmRWRpdG9yQWN0aW9ucy5hZGQoZlJlbmFtZUFjdGlvbik7Ci0KLQkJZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwgPSBuZXcgTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbigKLQkJCQlzZWxlY3Rpb25Qcm92aWRlciwgc2NoZW1hKTsKLQkJZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwuc2V0QWN0aW9uRGVmaW5pdGlvbklkKE1BS0VfRUxFTUVOVF9HTE9CQUwpOwotCQlmRWRpdG9yQWN0aW9ucy5hZGQoZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwpOwotCQkKLQkJZk1ha2VMb2NhbFR5cGVHbG9iYWwgPSBuZXcgTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb24oCi0JCQkJc2VsZWN0aW9uUHJvdmlkZXIsIHNjaGVtYSk7Ci0JCWZNYWtlTG9jYWxUeXBlR2xvYmFsLnNldEFjdGlvbkRlZmluaXRpb25JZChNQUtFX1RZUEVfR0xPQkFMKTsKLQkJZkVkaXRvckFjdGlvbnMuYWRkKGZNYWtlTG9jYWxUeXBlR2xvYmFsKTsKLQotCQlpbml0QWN0aW9uKGZSZW5hbWVBY3Rpb24sIGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JCWluaXRBY3Rpb24oZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwsIGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JCWluaXRBY3Rpb24oZk1ha2VMb2NhbFR5cGVHbG9iYWwsIGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0QWN0aW9uKFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGFjdGlvbiwKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotCi0JCUFzc2VydC5pc05vdE51bGwocHJvdmlkZXIpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGFjdGlvbik7Ci0JCWFjdGlvbi51cGRhdGUocHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQlwcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIEFjdGlvbkdyb3VwCi0JICovCi0JcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKFJFTkFNRSwgZlJlbmFtZUFjdGlvbik7Ci0JCXJldGFyZ2V0RmlsZU1lbnVBY3Rpb25zKGFjdGlvbkJhcnMpOwotCX0KLQotCS8qKgotCSAqIFJldGFyZ2V0cyB0aGUgRmlsZSBhY3Rpb25zIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcmVmYWN0b3JpbmcgYWN0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uQmFycwotCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiBiYXIgdG8gcmVnaXN0ZXIgdGhlIG1vdmUgYW5kIHJlbmFtZSBhY3Rpb24gd2l0aAotCSAqLwotCXB1YmxpYyB2b2lkIHJldGFyZ2V0RmlsZU1lbnVBY3Rpb25zKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVOQU1FLmdldElkKCksCi0JCQkJZlJlbmFtZUFjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBBY3Rpb25Hcm91cAotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5maWxsQ29udGV4dE1lbnUobWVudSk7Ci0JCWFkZFJlZmFjdG9yU3VibWVudShtZW51KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWN0aW9uR3JvdXAjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9JU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBmU2l0ZS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlkaXNwb3NlQWN0aW9uKGZSZW5hbWVBY3Rpb24sIGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JCWRpc3Bvc2VBY3Rpb24oZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwsIGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZUFjdGlvbihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGFjdGlvbiwKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQlwcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUmVmYWN0b3JTdWJtZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0KLQkJU3RyaW5nIG1lbnVUZXh0ID0gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlZmFjdG9yTWVudS5sYWJlbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZlJlZmFjdG9yU3VibWVudSA9IG5ldyBNZW51TWFuYWdlcihtZW51VGV4dCwgTUVOVV9JRCk7Ci0JCS8vaWYgKGZFZGl0b3IgIT0gbnVsbCkgewotCQkJZlJlZmFjdG9yU3VibWVudS5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJCXJlZmFjdG9yTWVudVNob3duKG1hbmFnZXIpOwotCQkJCX0KLQkJCX0pOwotCQkJZlJlZmFjdG9yU3VibWVudS5hZGQoZk5vQWN0aW9uQXZhaWxhYmxlKTsKLQkJCWlmIChtZW51LmZpbmQoZlJlZmFjdG9yU3VibWVudS5nZXRJZCgpKSA9PSBudWxsKSB7Ci0JCQkJaWYgKG1lbnUuZmluZChmR3JvdXBOYW1lKSA9PSBudWxsKSB7Ci0JCQkJCW1lbnUuYWRkKGZSZWZhY3RvclN1Ym1lbnUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChmR3JvdXBOYW1lLCBmUmVmYWN0b3JTdWJtZW51KTsKLQkJCQl9Ci0JCQl9Ci0vLwkJfSBlbHNlIHsKLS8vCQkJaWYgKGZpbGxSZWZhY3Rvck1lbnUoZlJlZmFjdG9yU3VibWVudSkgPiAwKQotLy8JCQkJbWVudS5hcHBlbmRUb0dyb3VwKGZHcm91cE5hbWUsIGZSZWZhY3RvclN1Ym1lbnUpOwotLy8JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBmaWxsUmVmYWN0b3JNZW51KElNZW51TWFuYWdlciByZWZhY3RvclN1Ym1lbnUpIHsKLQkJaW50IGFkZGVkID0gMDsKLQkJcmVmYWN0b3JTdWJtZW51LmFkZChuZXcgU2VwYXJhdG9yKEdST1VQX1JFT1JHKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFZGl0b3JBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJYWRkZWQgKz0gYWRkQWN0aW9uKHJlZmFjdG9yU3VibWVudSwgYWN0aW9uKTsKLQkJfQotCQlyZXR1cm4gYWRkZWQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgYWRkQWN0aW9uKElNZW51TWFuYWdlciBtZW51LCBJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltZW51LmFkZChhY3Rpb24pOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIGludCBhZGRBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJZkVkaXRvckFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmYWN0b3JNZW51U2hvd24oZmluYWwgSU1lbnVNYW5hZ2VyIHJlZmFjdG9yU3VibWVudSkgewotCQkvLyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBhbiBNZW51TWFuYWdlciBzaW5jZSB3ZSBjcmVhdGVkIGl0IGluCi0JCS8vIGFkZFJlZmFjdG9yU3VibWVudS4KLQkJTWVudSBtZW51ID0gKChNZW51TWFuYWdlcikgcmVmYWN0b3JTdWJtZW51KS5nZXRNZW51KCk7Ci0JCW1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVIaWRkZW4oTWVudUV2ZW50IGUpIHsKLQkJCQlyZWZhY3Rvck1lbnVIaWRkZW4ocmVmYWN0b3JTdWJtZW51KTsKLQkJCX0KLQkJfSk7Ci0vLwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVNlbGVjdGlvbikgZkVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkKLS8vCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBmU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFZGl0b3JBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKSB7Ci0JCQkJU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gc2VsZWN0aW9uQWN0aW9uID0gKFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKSBhY3Rpb247Ci0JCQkJc2VsZWN0aW9uQWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXJlZmFjdG9yU3VibWVudS5yZW1vdmVBbGwoKTsKLQkJaWYgKGZpbGxSZWZhY3Rvck1lbnUocmVmYWN0b3JTdWJtZW51KSA9PSAwKQotCQkJcmVmYWN0b3JTdWJtZW51LmFkZChmTm9BY3Rpb25BdmFpbGFibGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZhY3Rvck1lbnVIaWRkZW4oSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLS8vCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU2VsZWN0aW9uKSBmRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKQotLy8JCQkJLmdldFNlbGVjdGlvbigpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGZTZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZkVkaXRvckFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpb24gYWN0aW9uID0gKEFjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIHsKLQkJCQlTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBzZWxlY3Rpb25BY3Rpb24gPSAoU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIGFjdGlvbjsKLQkJCQlzZWxlY3Rpb25BY3Rpb24udXBkYXRlKHNlbGVjdGlvbik7Ci0JCQl9Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxY2I4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0KLS8qKgotKiBSZW5hbWVzIGEgWE1MIFNjaGVtYSBlbGVtZW50IG9yIHdvcmtiZW5jaCByZXNvdXJjZS4KLSogPHA+Ci0qIEFjdGlvbiBpcyBhcHBsaWNhYmxlIHRvIHNlbGVjdGlvbnMgY29udGFpbmluZyBlbGVtZW50cyBvZiB0eXBlCi0qIDxjb2RlPjwvY29kZT4gb3IgPGNvZGU+SVJlc291cmNlPC9jb2RlPi4KLSogCi0qIDxwPgotKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotKiA8L3A+Ci0KLSovCi1wdWJsaWMgY2xhc3MgUmVuYW1lQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gIHsKLQotCXByaXZhdGUgUmVuYW1lQ29tcG9uZW50QWN0aW9uIGZSZW5hbWVYU0RFbGVtZW50OwotCXByaXZhdGUgUmVuYW1lUmVzb3VyY2VBY3Rpb24gZlJlbmFtZVJlc291cmNlOwotCQotCQotCXB1YmxpYyBSZW5hbWVBY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyLCBYU0RTY2hlbWEgc2NoZW1hKSB7Ci0JCXN1cGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLQkJc2V0VGV4dChSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQWN0aW9uLnRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZlJlbmFtZVhTREVsZW1lbnQ9IG5ldyBSZW5hbWVDb21wb25lbnRBY3Rpb24oc2VsZWN0aW9uUHJvdmlkZXIsIHNjaGVtYSk7Ci0JCWZSZW5hbWVYU0RFbGVtZW50LnNldFRleHQoZ2V0VGV4dCgpKTsKLQkJZlJlbmFtZVJlc291cmNlPSBuZXcgUmVuYW1lUmVzb3VyY2VBY3Rpb24oc2VsZWN0aW9uUHJvdmlkZXIpOwotCQlmUmVuYW1lUmVzb3VyY2Uuc2V0VGV4dChnZXRUZXh0KCkpOwotCQkKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJZlJlbmFtZVhTREVsZW1lbnQuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCWlmIChmUmVuYW1lUmVzb3VyY2UgIT0gbnVsbCkKLQkJCWZSZW5hbWVSZXNvdXJjZS5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJc2V0RW5hYmxlZChjb21wdXRlRW5hYmxlZFN0YXRlKCkpOwkJCi0JfQotCi0JLyoKLQkgKiBAc2VlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uI3VwZGF0ZShJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZihmUmVuYW1lWFNERWxlbWVudCAhPSBudWxsKXsKLQkJCWZSZW5hbWVYU0RFbGVtZW50LnVwZGF0ZShzZWxlY3Rpb24pOwotCQl9Ci0JCWlmIChmUmVuYW1lUmVzb3VyY2UgIT0gbnVsbCkKLQkJCWZSZW5hbWVSZXNvdXJjZS51cGRhdGUoc2VsZWN0aW9uKTsKLQkJc2V0RW5hYmxlZChjb21wdXRlRW5hYmxlZFN0YXRlKCkpOwkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjb21wdXRlRW5hYmxlZFN0YXRlKCl7Ci0JCWlmIChmUmVuYW1lUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZSZW5hbWVYU0RFbGVtZW50LmlzRW5hYmxlZCgpIHx8IGZSZW5hbWVSZXNvdXJjZS5pc0VuYWJsZWQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmUmVuYW1lWFNERWxlbWVudC5pc0VuYWJsZWQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChmUmVuYW1lWFNERWxlbWVudC5pc0VuYWJsZWQoKSkKLQkJCWZSZW5hbWVYU0RFbGVtZW50LnJ1bihzZWxlY3Rpb24pOwotCQlpZiAoZlJlbmFtZVJlc291cmNlICE9IG51bGwgJiYgZlJlbmFtZVJlc291cmNlLmlzRW5hYmxlZCgpKQotCQkJZlJlbmFtZVJlc291cmNlLnJ1bihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZSZW5hbWVYU0RFbGVtZW50LmNhblJ1bigpKQotCQkJZlJlbmFtZVhTREVsZW1lbnQucnVuKHNlbGVjdGlvbik7Ci0JCWVsc2UKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQWN0aW9uLnJlbmFtZSIpLCBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQWN0aW9uLnVuYXZhaWxhYmxlIikpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCSAgICBpZihzZWxlY3Rpb24gPT0gbnVsbCl7Ci0JICAgIAlzdXBlci5ydW4oKTsKLQkgICAgfQotCSAgICBlbHNlewotCSAgICAJc3VwZXIucnVuKHNlbGVjdGlvbik7Ci0JICAgIH0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQ29tcG9uZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwMWM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5HbG9iYWxCdWlsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFJlbmFtZUNvbXBvbmVudEFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHsKLQotCXByaXZhdGUgWFNETmFtZWRDb21wb25lbnQgZlNlbGVjdGVkQ29tcG9uZW50OwotCi0JcHVibGljIFJlbmFtZUNvbXBvbmVudEFjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQlYU0RTY2hlbWEgc2NoZW1hKSB7Ci0JCXN1cGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLQkJc2V0U2NoZW1hKHNjaGVtYSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJZlNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpIHsKLQkJCWZTZWxlY3RlZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0KLQkJCS8vIGlmIGl0J3MgZWxlbWVudCByZWZlcmVuY2UsIHRoZW4gdGhpcyBhY3Rpb24gaXMgbm90IGFwcHJvcHJpYXRlCi0JCQlpZiAoZlNlbGVjdGVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBmU2VsZWN0ZWRDb21wb25lbnQ7Ci0JCQkJaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkgewotCQkJCQlmU2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmKGZTZWxlY3RlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKXsKLQkJCQlYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBmU2VsZWN0ZWRDb21wb25lbnQ7Ci0JCQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdHlwZS5nZXRDb250YWluZXIoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50OwotCQkJCQlpZihlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkuZXF1YWxzKHR5cGUpKXsKLQkJCQkJCWZTZWxlY3RlZENvbXBvbmVudCA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgewotCQkJCQlYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBwYXJlbnQ7Ci0JCQkJCWlmKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKS5lcXVhbHModHlwZSkpewotCQkJCQkJZlNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjYW5SdW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIHsKLQkJCXJldHVybiBjYW5FbmFibGUoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3RlZE9iamVjdCk7Ci0JCX0gZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlpZiAoZ2V0U2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCVhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gZ2V0U2NoZW1hKCkKLQkJCQkJCS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotCQkJCXJldHVybiBjYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJ1bigpIHsKLQotCQlyZXR1cm4gZlNlbGVjdGVkQ29tcG9uZW50ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChmU2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCWZTZWxlY3RlZENvbXBvbmVudC5zZXROYW1lKG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKGZTZWxlY3RlZENvbXBvbmVudC5nZXRTY2hlbWEoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCWdldFNjaGVtYSgpLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0JCQl9Ci0KLQkJfQotCQlSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcigKLQkJCQlmU2VsZWN0ZWRDb21wb25lbnQsIGZTZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCkpOwotCQlSZW5hbWVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotCQl0cnkgewotCQkJUmVmYWN0b3JpbmdXaXphcmQgd2l6YXJkID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkKAotCQkJCQlyZWZhY3RvcmluZywKLQkJCQkJUmVmYWN0b3JpbmdNZXNzYWdlcwotCQkJCQkJCS5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFdpemFyZC5kZWZhdWx0UGFnZVRpdGxlIiksIC8vJE5PTi1OTFMtMSQgVE9ETzogcHJvdmlkZSBjb3JyZWN0IHN0cmluZ3MKLQkJCQkJUmVmYWN0b3JpbmdNZXNzYWdlcwotCQkJCQkJCS5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFdpemFyZC5pbnB1dFBhZ2UuZGVzY3JpcHRpb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsKTsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcCA9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24oCi0JCQkJCXdpemFyZCk7Ci0JCQlpbnQgcmVzdWx0ID0gb3AucnVuKFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB3aXphcmQKLQkJCQkJLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQlvcC5nZXRJbml0aWFsQ29uZGl0aW9uQ2hlY2tpbmdTdGF0dXMoKTsKLQkJCXRyaWdnZXJCdWlsZCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nLiBVc2VyIGFjdGlvbiBnb3QgY2FuY2VsbGVkCi0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmlnZ2VyQnVpbGQoKSB7Ci0JCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKS5pc0F1dG9CdWlsZGluZygpKSB7Ci0JCQluZXcgR2xvYmFsQnVpbGRBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwKLQkJCQkJSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCkucnVuKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDI1MTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVSZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3I7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiB7Ci0KLQotCXB1YmxpYyBSZW5hbWVSZXNvdXJjZUFjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJc3VwZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJUmVzb3VyY2UgZWxlbWVudD0gZ2V0UmVzb3VyY2Uoc2VsZWN0aW9uKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlSZW5hbWVSZXNvdXJjZVByb2Nlc3NvciBwcm9jZXNzb3I9IG5ldyBSZW5hbWVSZXNvdXJjZVByb2Nlc3NvcihlbGVtZW50KTsKLQkJCXNldEVuYWJsZWQocHJvY2Vzc29yLmlzQXBwbGljYWJsZSgpKTsKLQkJCQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShzZWxlY3Rpb24pOwotCQlSZW5hbWVSZXNvdXJjZVByb2Nlc3NvciBwcm9jZXNzb3I9IG5ldyBSZW5hbWVSZXNvdXJjZVByb2Nlc3NvcihyZXNvdXJjZSk7Ci0KLQkJCWlmKCFwcm9jZXNzb3IuaXNBcHBsaWNhYmxlKCkpCi0JCQkJcmV0dXJuOwotCQkJUmVuYW1lUmVmYWN0b3JpbmcgcmVmYWN0b3Jpbmc9IG5ldyBSZW5hbWVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotCQkJdHJ5IHsKLQkJCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0JCQkJCQlyZWZhY3RvcmluZywKLQkJCQkJCVJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRXaXphcmQuZGVmYXVsdFBhZ2VUaXRsZSIpLCAvLyROT04tTkxTLTEkIFRPRE86IHByb3ZpZGUgY29ycmVjdCBzdHJpbmdzCi0JCQkJCQlSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50V2l6YXJkLmlucHV0UGFnZS5kZXNjcmlwdGlvbiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQludWxsKTsKLQkJCQlSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24gb3A9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24od2l6YXJkKTsKLQkJCQlpbnQgcmVzdWx0PSBvcC5ydW4oWFNERWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHdpemFyZC5nZXREZWZhdWx0UGFnZVRpdGxlKCkpOwotCQkJCW9wLmdldEluaXRpYWxDb25kaXRpb25DaGVja2luZ1N0YXR1cygpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIGRvIG5vdGhpbmcuIFVzZXIgYWN0aW9uIGdvdCBjYW5jZWxsZWQKLQkJCX0KLQkJCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IGZpcnN0PSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmICghIChmaXJzdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJUmVzb3VyY2UpZmlyc3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyM2Y3MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhckBjYS5pYm0uY29tCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWVSZXNvdXJjZUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQkKLQlwcml2YXRlIElTZWxlY3Rpb24gZkN1cnJlbnRTZWxlY3Rpb247Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZQYXJ0OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJZlBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZkN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbj0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmQ3VycmVudFNlbGVjdGlvbjsKLQkJCU9iamVjdCBmaXJzdD0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChmaXJzdCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJUmVuYW1lUmVzb3VyY2VBY3Rpb24gcmVuYW1lQWN0aW9uID0gbmV3IFJlbmFtZVJlc291cmNlQWN0aW9uKGZQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLQkJCQlyZW5hbWVBY3Rpb24ucnVuKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmQ3VycmVudFNlbGVjdGlvbj0gc2VsZWN0aW9uOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1NlbGVjdGlvbkRpc3BhdGNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMmI3NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi0KLS8qKgotICogQWN0aW9uIHRoYXQgZGlzcGF0Y2hlcyB0aGUgPGNvZGU+SUFjdGlvbiNydW4oKTwvY29kZT4gYW5kIHRoZSAKLSAqIDxjb2RlPklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZDwvY29kZT4gCi0gKiBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgdGhlIHNlbGVjdGlvbi4gCi0gKiAKLSAqIDx1bD4KLSAqIAk8bGk+aWYgc2VsZWN0aW9uIGlzIG9mIHR5cGUgPGNvZGU+SVRleHRTZWxlY3Rpb248L2NvZGU+IHRoZW4KLSAqIAk8Y29kZT5ydW4oSVRleHRTZWxlY3Rpb24pPC9jb2RlPiBhbmQgPGNvZGU+c2VsZWN0aW9uQ2hhbmdlZChJVGV4dFNlbGVjdGlvbik8L2NvZGU+Ci0gKiAJaXMgY2FsbGVkLjwvbGk+IAotICogCTxsaT5pZiBzZWxlY3Rpb24gaXMgb2YgdHlwZSA8Y29kZT5JU3RydWN0dXJlZFNlbGVjdGlvbjwvY29kZT4gdGhlbgotICogCTxjb2RlPnJ1bihJU3RydWN0dXJlZFNlbGVjdGlvbik8L2NvZGU+IGFuZCA8Y29kZT4KLSAqIAlzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKTwvY29kZT4gaXMgY2FsbGVkLjwvbGk+Ci0gKiAJPGxpPmRlZmF1bHQgaXMgdG8gY2FsbCA8Y29kZT5ydW4oSVNlbGVjdGlvbik8L2NvZGU+IGFuZCA8Y29kZT4KLSAqIAlzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24pPC9jb2RlPi48L2xpPgotICogPC91bD4KLSAqIAotICogPHA+Ci0gKiBhZGFwdGVkIGZyb20gPGNvZGU+b3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb248L2NvZGU+Ci0gKiA8L3A+Ci0gKiAgIAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQotCXByaXZhdGUgSVNlbGVjdGlvblByb3ZpZGVyIGZTZWxlY3Rpb25Qcm92aWRlcjsKLQkKLQlwcml2YXRlIFhTRFNjaGVtYSBmU2NoZW1hOwotCQotCXByb3RlY3RlZCBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzZWxlY3Rpb25Qcm92aWRlcik7Ci0JCWZTZWxlY3Rpb25Qcm92aWRlciA9IHNlbGVjdGlvblByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBwcm92aWRlZCBieSB0aGUgc2l0ZSBvd25pbmcgdGhpcyBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l0ZSdzIHNlbGVjdGlvbgotCSAqLwkKLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRTZWxlY3Rpb25Qcm92aWRlcigpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIHByb3ZpZGVyIG1hbmFnZWQgYnkgdGhlIHNpdGUgb3duaW5nIHRoaXMgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpdGUncyBzZWxlY3Rpb24gcHJvdmlkZXIJCi0JICovCi0JcHVibGljIElTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb25Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBhY3Rpb24ncyBlbmFibGVtZW50IHN0YXRlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc2VsZWN0aW9uLiBUaGlzCi0JICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyBvbmUgb2YgdGhlIDxjb2RlPnNlbGVjdGlvbkNoYW5nZWQ8L2NvZGU+Ci0JICogbWV0aG9kcyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIHBhc3NlZCBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgc2VsZWN0aW9uIHRoaXMgYWN0aW9uIGlzIHdvcmtpbmcgb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZGlzcGF0Y2hTZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBhY3Rpb24gdGhhdCB0aGUgZ2l2ZW4gc3RydWN0dXJlZCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuIFRoaXMgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPnNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBuZXcgc2VsZWN0aW9uCi0gCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlzZXRFbmFibGVkKGNhbkVuYWJsZShvYmplY3QpKTsKLQkJfQotCQllbHNlewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKE9iamVjdCBzZWxlY3RlZE9iamVjdCl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGlzIGFjdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RydWN0dXJlZCBzZWxlY3Rpb24uIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCSAqIGNhbGxzIDxjb2RlPnJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbik8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcnVuKChJU2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JfQotCi0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBhY3Rpb24gdGhhdCB0aGUgZ2l2ZW4gdGV4dCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuICBUaGlzIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Y29kZT5zZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgbmV3IHNlbGVjdGlvbgotIAkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3Rpb25DaGFuZ2VkKChJU2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoaXMgYWN0aW9ucyB3aXRoIHRoZSBnaXZlbiB0ZXh0IHNlbGVjdGlvbi4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JICogY2FsbHMgPGNvZGU+cnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKTwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlydW4oKElTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBhY3Rpb24gdGhhdCB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLiAgVGhpcyBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gc2V0cyB0aGUgYWN0aW9uJ3MgZW5hYmxlbWVudCBzdGF0ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgbmV3IHNlbGVjdGlvbgotIAkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlcyB0aGlzIGFjdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc2VsZWN0aW9uLiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQkgKiBkb2VzIG5vdGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24ucnVuIik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZGlzcGF0Y2hSdW4oZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWRpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlZChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JCX0gZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElUZXh0U2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaFJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXJ1bigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQkJfSAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCXJ1bigoSVRleHRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCXJ1bihzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiBmU2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKSB7Ci0JCWZTY2hlbWEgPSBzY2hlbWE7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2RlbGV0ZS9CYXNlQ2xlYW51cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2RlbGV0ZS9CYXNlQ2xlYW51cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVhMWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9kZWxldGUvQmFzZUNsZWFudXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuZGVsZXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlhTRFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VDbGVhbnVwIGV4dGVuZHMgWFNEVmlzaXRvcgotewotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlhTRFZpc2l0b3IjdmlzaXRTY2hlbWEoWFNEU2NoZW1hKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHN1cGVyLnZpc2l0U2NoZW1hKHNjaGVtYSk7Ci0gICAgCi0gICAgLy8gbm93IHJlbW92ZSBhbGwgY2hpbGRyZW4gdGhhdCB3ZXJlIHF1ZXVlZCB1cCBmb3IgcmVtb3ZhbAotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSAoRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoZG9tRWxlbWVudCk7Ci0vLyAgICAgIGRvbUVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGRvbUVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIEFycmF5TGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICBwdWJsaWMgQXJyYXlMaXN0IGdldE1lc3NhZ2VzKCkKLSAgewotICAJcmV0dXJuIG1lc3NhZ2VzOwotICB9Ci0gIAotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE1lc3NhZ2UoU3RyaW5nIG1zZywgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0vLy8vICAgIEVycm9yTWVzc2FnZSBtZXNzYWdlID0gbmV3IEVycm9yTWVzc2FnZSgpOwotLy8gICAgCi0vLyAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjdXJyQ29tcCA9IGNvbXBvbmVudDsKLS8vICAgIHdoaWxlICghKGN1cnJDb21wIGluc3RhbmNlb2YgWFNEU2NoZW1hQ29udGVudCkgJiYgY3VyckNvbXAuZ2V0Q29udGFpbmVyKCkgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgY3VyckNvbXAgPSBjdXJyQ29tcC5nZXRDb250YWluZXIoKTsKLS8vICAgIH0KLS8vCi0vLyAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSBjdXJyQ29tcC5nZXRFbGVtZW50KCk7Ci0vLyAgICBOb2RlIHBhcmVudCA9IGRvbUVsZW1lbnQ7Ci0vLyAgICB3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBOb2RlSW1wbCkgJiYgcGFyZW50ICE9IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0vLyAgICB9Ci0vLyAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgTm9kZUltcGwpCi0vLyAgICB7Ci0vLyAgICAgIC8vIG1lc3NhZ2Uuc2V0TW9kZWxPYmplY3QoY3VyckNvbXAuZ2V0RWxlbWVudCgpKTsKLS8vCQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QoY3VyckNvbXAuZ2V0RWxlbWVudCgpKTsKLS8vICAgIH0KLS8vICAgIG1lc3NhZ2Uuc2V0TG9jYWxpemVkTWVzc2FnZShtc2cpOwotLy8gID8/PwotLy8gICAgYWRkTWVzc2FnZShtZXNzYWdlKTsKLSAgfQotICAgIAotCi0vLyAvLyBwcm90ZWN0ZWQgdm9pZCBhZGRNZXNzYWdlKEVycm9yTWVzc2FnZSBtZXNzYWdlKQotLy8JcHJvdGVjdGVkIHZvaWQgYWRkTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0vLyAgewotLy8gICAgbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotLy8gIH0KLSAgCi0KLSAgcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlblRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotICAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVkQ29tcG9uZW50TmFtZShYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZSkKLSAgewotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAoY29uY3JldGUgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICB7Ci0gICAgICBuYW1lID0gKChYU0ROYW1lZENvbXBvbmVudCljb25jcmV0ZSkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICAKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0gY29uY3JldGU7Ci0gICAgd2hpbGUgKGNvbXAgIT0gbnVsbCAmJiBuYW1lID09IG51bGwpCi0gICAgewotICAgICAgY29tcCA9IGNvbXAuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBuYW1lID0gKChYU0ROYW1lZENvbXBvbmVudCljb21wKS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuYW1lICE9IG51bGwgPyBuYW1lIDogIiI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9kZWxldGUvQmFzZUdsb2JhbENsZWFudXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9kZWxldGUvQmFzZUdsb2JhbENsZWFudXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwMzk3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvZGVsZXRlL0Jhc2VHbG9iYWxDbGVhbnVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuZGVsZXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEJhc2VHbG9iYWxDbGVhbnVwIGV4dGVuZHMgQmFzZUNsZWFudXAKLXsKLSAgcHVibGljIEJhc2VHbG9iYWxDbGVhbnVwKFhTRENvbmNyZXRlQ29tcG9uZW50IGRlbGV0ZWRJdGVtKQotICB7Ci0gICAgdGhpcy5kZWxldGVkSXRlbSA9IGRlbGV0ZWRJdGVtOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgZGVsZXRlZEl0ZW07Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlbGV0ZWRRTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gKChYU0ROYW1lZENvbXBvbmVudClkZWxldGVkSXRlbSkuZ2V0UU5hbWUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2RlbGV0ZS9HbG9iYWxBdHRyaWJ1dGVDbGVhbnVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvZGVsZXRlL0dsb2JhbEF0dHJpYnV0ZUNsZWFudXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNTc3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvZGVsZXRlL0dsb2JhbEF0dHJpYnV0ZUNsZWFudXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuZGVsZXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgR2xvYmFsQXR0cmlidXRlQ2xlYW51cCBleHRlbmRzIEJhc2VHbG9iYWxDbGVhbnVwCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgR2xvYmFsQXR0cmlidXRlQ2xlYW51cC4KLSAgICogQHBhcmFtIGRlbGV0ZWRJdGVtCi0gICAqLwotICBwdWJsaWMgR2xvYmFsQXR0cmlidXRlQ2xlYW51cChYU0RDb25jcmV0ZUNvbXBvbmVudCBkZWxldGVkSXRlbSkKLSAgewotICAgIHN1cGVyKGRlbGV0ZWRJdGVtKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyByZXBsYWNlbWVudE5hbWUgPSBudWxsOwotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXBsYWNlbWVudEVsZW1lbnROYW1lKCkKLSAgewotICAgIGlmIChyZXBsYWNlbWVudE5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoc2NoZW1hKTsKLSAgICAgIAotICAgICAgTGlzdCBlbGVtZW50cyA9IGhlbHBlci5nZXRHbG9iYWxBdHRyaWJ1dGVzKCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBkZWxldGVkTmFtZSA9IGdldERlbGV0ZWRRTmFtZSgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKGRlbGV0ZWROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlcGxhY2VtZW50TmFtZSA9IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcGxhY2VtZW50TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuWFNEVmlzaXRvciN2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIHN1cGVyLnZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgIGlmICh0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBhdHRyVXNlLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBub3cgaXMgdGhpcyBhIHJlZmVyZW5jZT8KLSAgICAgICAgICBpZiAoYXR0ckRlY2wgIT0gbnVsbCAmJiBhdHRyRGVjbC5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlbGV0ZWRJdGVtLmVxdWFscyhhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZ2V0UmVwbGFjZW1lbnRFbGVtZW50TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBTdHJpbmcgbXNnID0gWFNEUGx1Z2luLmdldFNjaGVtYVN0cmluZygiX0lORk9fUkVTRVRfQVRUUklCVVRFX1JFRkVSRU5DRSIpICsgIiA8IiArIGdldFJlcGxhY2VtZW50RWxlbWVudE5hbWUoKSArICI+IjsKLQkJCQkJCQkJU3RyaW5nIG1zZyA9ICJSZXNldCBhdHRyaWJ1dGUgcmVmZXJlbmNlICIgKyAiIDwiICsgZ2V0UmVwbGFjZW1lbnRFbGVtZW50TmFtZSgpICsgIj4iOwotICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UobXNnLCBhdHRyVXNlKTsKLSAgICAgICAgICAgICAgICBhdHRyVXNlLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIGdldFJlcGxhY2VtZW50RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXROYW1lZENvbXBvbmVudE5hbWUodHlwZSk7Ci0gICAgICAgICAgICAgICAgLy8gU3RyaW5nIG1zZyA9IFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9JTkZPX1JFTU9WRV9BVFRSSUJVVEVfUkVGRVJFTkNFIikgKwotCQkJCQkJCQlTdHJpbmcgbXNnID0gIlJlbW92ZSBhdHRyaWJ1dGUgcmVmZXJlbmNlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICIgPCIgKyBuYW1lICsgIj4iOwotICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UobXNnLCBhdHRyVXNlLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjaGlsZHJlblRvUmVtb3ZlLmFkZChhdHRyRGVjbC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9kZWxldGUvR2xvYmFsQXR0cmlidXRlR3JvdXBDbGVhbnVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvZGVsZXRlL0dsb2JhbEF0dHJpYnV0ZUdyb3VwQ2xlYW51cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDVlZDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9kZWxldGUvR2xvYmFsQXR0cmlidXRlR3JvdXBDbGVhbnVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmRlbGV0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgR2xvYmFsQXR0cmlidXRlR3JvdXBDbGVhbnVwIGV4dGVuZHMgQmFzZUdsb2JhbENsZWFudXAKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBHbG9iYWxBdHRyaWJ1dGVHcm91cENsZWFudXAuCi0gICAqIEBwYXJhbSBkZWxldGVkSXRlbQotICAgKi8KLSAgcHVibGljIEdsb2JhbEF0dHJpYnV0ZUdyb3VwQ2xlYW51cChYU0RDb25jcmV0ZUNvbXBvbmVudCBkZWxldGVkSXRlbSkKLSAgewotICAgIHN1cGVyKGRlbGV0ZWRJdGVtKTsKLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVwbGFjZW1lbnROYW1lID0gbnVsbDsKLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVwbGFjZW1lbnRFbGVtZW50TmFtZSgpCi0gIHsKLSAgICBpZiAocmVwbGFjZW1lbnROYW1lID09IG51bGwpCi0gICAgewotICAgICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHNjaGVtYSk7Ci0gICAgICAKLSAgICAgIExpc3QgZWxlbWVudHMgPSBoZWxwZXIuZ2V0R2xvYmFsQXR0cmlidXRlR3JvdXBzKCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBkZWxldGVkTmFtZSA9IGdldERlbGV0ZWRRTmFtZSgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKGRlbGV0ZWROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlcGxhY2VtZW50TmFtZSA9IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcGxhY2VtZW50TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuWFNEVmlzaXRvciN2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIHN1cGVyLnZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgIGlmICh0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyLm5leHQoKTsKLQotICAgICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXBEZWYgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBhdHRyR3JvdXBDb250ZW50OwotICAgICAgICAgIAotICAgICAgICAgIGlmIChkZWxldGVkSXRlbS5lcXVhbHMoYXR0ckdyb3VwRGVmLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChnZXRSZXBsYWNlbWVudEVsZW1lbnROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gU3RyaW5nIG1zZyA9IFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9JTkZPX1JFU0VUX0FUVFJJQlVURV9HUk9VUF9SRUZFUkVOQ0UiKSArICIgPCIgKyBnZXRSZXBsYWNlbWVudEVsZW1lbnROYW1lKCkgKyAiPiI7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9ICJSZXNldCBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlICIgKyAiIDwiICsgZ2V0UmVwbGFjZW1lbnRFbGVtZW50TmFtZSgpICsgIj4iOwotICAgICAgICAgICAgICBhZGRNZXNzYWdlKG1zZywgYXR0ckdyb3VwRGVmKTsKLSAgICAgICAgICAgICAgYXR0ckdyb3VwRGVmLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIGdldFJlcGxhY2VtZW50RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZQotICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWVkQ29tcG9uZW50TmFtZSh0eXBlKTsKLSAgICAgICAgICAgICAgLy8gU3RyaW5nIG1zZyA9IFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9JTkZPX1JFTU9WRV9BVFRSSUJVVEVfR1JPVVBfUkVGRVJFTkNFIikgKyAiIDwiICsgbmFtZSArICI+IjsKLQkJCQkJCQlTdHJpbmcgbXNnID0gIlJlbW92ZSBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlICIgKyAiIDwiICsgbmFtZSArICI+IjsKLSAgCi0gICAgICAgICAgICAgIGFkZE1lc3NhZ2UobXNnLCBhdHRyR3JvdXBEZWYuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgY2hpbGRyZW5Ub1JlbW92ZS5hZGQoYXR0ckdyb3VwRGVmLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9kZWxldGUvR2xvYmFsRWxlbWVudENsZWFudXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9kZWxldGUvR2xvYmFsRWxlbWVudENsZWFudXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxOWUzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvZGVsZXRlL0dsb2JhbEVsZW1lbnRDbGVhbnVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuZGVsZXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEdsb2JhbEVsZW1lbnRDbGVhbnVwIGV4dGVuZHMgQmFzZUdsb2JhbENsZWFudXAKLXsKLSAgICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBHbG9iYWxFbGVtZW50Q2xlYW51cC4KLSAgICogQHBhcmFtIGRlbGV0ZWRJdGVtCi0gICAqLwotICBwdWJsaWMgR2xvYmFsRWxlbWVudENsZWFudXAoWFNEQ29uY3JldGVDb21wb25lbnQgZGVsZXRlZEl0ZW0pCi0gIHsKLSAgICBzdXBlcihkZWxldGVkSXRlbSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHJlcGxhY2VtZW50TmFtZSA9IG51bGw7Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcGxhY2VtZW50RWxlbWVudE5hbWUoKQotICB7Ci0gICAgaWYgKHJlcGxhY2VtZW50TmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihzY2hlbWEpOwotICAgICAgCi0gICAgICBMaXN0IGVsZW1lbnRzID0gaGVscGVyLmdldEdsb2JhbEVsZW1lbnRzKCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBkZWxldGVkTmFtZSA9IGdldERlbGV0ZWRRTmFtZSgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKGRlbGV0ZWROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlcGxhY2VtZW50TmFtZSA9IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcGxhY2VtZW50TmFtZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YU0RWaXNpdG9yI3Zpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAoZGVsZXRlZEl0ZW0uZXF1YWxzKGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChnZXRSZXBsYWNlbWVudEVsZW1lbnROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIEtDUG9ydCBTdHJpbmcgbXNnID0gWFNEUGx1Z2luLmdldFNjaGVtYVN0cmluZygiX0lORk9fUkVTRVRfRUxFTUVOVF9SRUZFUkVOQ0UiKSArICIgPCIgKyBnZXRSZXBsYWNlbWVudEVsZW1lbnROYW1lKCkgKyAiPiI7Ci0JCQkJCVN0cmluZyBtc2cgPSAiX0lORk9fUkVTRVRfRUxFTUVOVF9SRUZFUkVOQ0UiICsgIiA8IiArIGdldFJlcGxhY2VtZW50RWxlbWVudE5hbWUoKSArICI+IjsKLSAgICAgICAgICBhZGRNZXNzYWdlKG1zZywgZWxlbWVudCk7Ci0gICAgICAgICAgZWxlbWVudC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCBnZXRSZXBsYWNlbWVudEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIEtDUG9ydCAgU3RyaW5nIG1zZyA9IFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9JTkZPX1JFTU9WRV9FTEVNRU5UX1JFRkVSRU5DRSIpICsgIiA8IiArIGdldE5hbWVkQ29tcG9uZW50TmFtZShlbGVtZW50LmdldENvbnRhaW5lcigpKSArICI+IjsKLQkJCQkJU3RyaW5nIG1zZyA9ICJfSU5GT19SRU1PVkVfRUxFTUVOVF9SRUZFUkVOQ0UiICsgIiA8IiArIGdldE5hbWVkQ29tcG9uZW50TmFtZShlbGVtZW50LmdldENvbnRhaW5lcigpKSArICI+IjsKLSAgICAgICAgICBhZGRNZXNzYWdlKG1zZywgZWxlbWVudC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgY2hpbGRyZW5Ub1JlbW92ZS5hZGQoZWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvZGVsZXRlL0dsb2JhbEdyb3VwQ2xlYW51cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2RlbGV0ZS9HbG9iYWxHcm91cENsZWFudXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4NmZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvZGVsZXRlL0dsb2JhbEdyb3VwQ2xlYW51cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmRlbGV0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEdsb2JhbEdyb3VwQ2xlYW51cCBleHRlbmRzIEJhc2VHbG9iYWxDbGVhbnVwCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgR2xvYmFsR3JvdXBDbGVhbnVwLgotICAgKiBAcGFyYW0gZGVsZXRlZEl0ZW0KLSAgICovCi0gIHB1YmxpYyBHbG9iYWxHcm91cENsZWFudXAoWFNEQ29uY3JldGVDb21wb25lbnQgZGVsZXRlZEl0ZW0pCi0gIHsKLSAgICBzdXBlcihkZWxldGVkSXRlbSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHJlcGxhY2VtZW50TmFtZSA9IG51bGw7Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcGxhY2VtZW50RWxlbWVudE5hbWUoKQotICB7Ci0gICAgaWYgKHJlcGxhY2VtZW50TmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihzY2hlbWEpOwotICAgICAgCi0gICAgICBMaXN0IGVsZW1lbnRzID0gaGVscGVyLmdldE1vZGVsR3JvdXBzKCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBkZWxldGVkTmFtZSA9IGdldERlbGV0ZWRRTmFtZSgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKGRlbGV0ZWROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlcGxhY2VtZW50TmFtZSA9IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcGxhY2VtZW50TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuWFNEVmlzaXRvciN2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwKQotICB7Ci0gICAgc3VwZXIudmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwKTsKLSAgICBpZiAobW9kZWxHcm91cC5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKGRlbGV0ZWRJdGVtLmVxdWFscyhtb2RlbEdyb3VwLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChnZXRSZXBsYWNlbWVudEVsZW1lbnROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIEtDUG9ydCBTdHJpbmcgbXNnID0gWFNEUGx1Z2luLmdldFNjaGVtYVN0cmluZygiX0lORk9fUkVTRVRfR1JPVVBfUkVGRVJFTkNFIikgKyAiIDwiICsgZ2V0UmVwbGFjZW1lbnRFbGVtZW50TmFtZSgpICsgIj4iOwotCQkJCQlTdHJpbmcgbXNnID0gIl9JTkZPX1JFU0VUX0dST1VQX1JFRkVSRU5DRSIgKyAiIDwiICsgZ2V0UmVwbGFjZW1lbnRFbGVtZW50TmFtZSgpICsgIj4iOwotICAgICAgICAgIGFkZE1lc3NhZ2UobXNnLCBtb2RlbEdyb3VwKTsKLSAgICAgICAgICBtb2RlbEdyb3VwLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIGdldFJlcGxhY2VtZW50RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXROYW1lZENvbXBvbmVudE5hbWUobW9kZWxHcm91cCk7Ci0gICAgICAgICAgLy8gS0NQb3J0IFN0cmluZyBtc2cgPSBYU0RQbHVnaW4uZ2V0U2NoZW1hU3RyaW5nKCJfSU5GT19SRU1PVkVfR1JPVVBfUkVGRVJFTkNFIikgKyAiIDwiICsgbmFtZSArICI+IjsKLQkJCQkJU3RyaW5nIG1zZyA9ICJfSU5GT19SRU1PVkVfR1JPVVBfUkVGRVJFTkNFIiArICIgPCIgKyBuYW1lICsgIj4iOwotICAgICAgICAgIGFkZE1lc3NhZ2UobXNnLCBtb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICBjaGlsZHJlblRvUmVtb3ZlLmFkZChtb2RlbEdyb3VwLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9kZWxldGUvR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZUNsZWFudXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9kZWxldGUvR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZUNsZWFudXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhMGNjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvZGVsZXRlL0dsb2JhbFNpbXBsZU9yQ29tcGxleFR5cGVDbGVhbnVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmRlbGV0ZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBHbG9iYWxTaW1wbGVPckNvbXBsZXhUeXBlQ2xlYW51cCBleHRlbmRzIEJhc2VHbG9iYWxDbGVhbnVwCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZUNsZWFudXAuCi0gICAqIEBwYXJhbSBkZWxldGVkSXRlbQotICAgKi8KLSAgcHVibGljIEdsb2JhbFNpbXBsZU9yQ29tcGxleFR5cGVDbGVhbnVwKFhTRENvbmNyZXRlQ29tcG9uZW50IGRlbGV0ZWRJdGVtKQotICB7Ci0gICAgc3VwZXIoZGVsZXRlZEl0ZW0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YU0RWaXNpdG9yI3Zpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgaWYgKCFlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkgJiYKLSAgICAgICAgZGVsZXRlZEl0ZW0uZXF1YWxzKGVsZW1lbnQuZ2V0VHlwZURlZmluaXRpb24oKSkpCi0gICAgewotICAgICAgcmVzZXRUeXBlVG9TdHJpbmcoZWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgCi0gICAgICBTdHJpbmcgbXNnID0gIiI7Ci0gICAgICBpZiAoZWxlbWVudC5pc0dsb2JhbCgpKQotICAgICAgewotICAgICAgICAvLyBLQ1BvcnQgU3RyaW5nIHBhdHRlcm4gPSBYU0RQbHVnaW4uZ2V0U2NoZW1hU3RyaW5nKCJfSU5GT19SRVNFVF9HTE9CQUxfRUxFTUVOVCIpOwotCQkJCVN0cmluZyBwYXR0ZXJuID0gIl9JTkZPX1JFU0VUX0dMT0JBTF9FTEVNRU5UIjsKLSAgICAgICAgT2JqZWN0IGFyZ3NbXSA9IHtlbGVtZW50LmdldE5hbWUoKX07Ci0gICAgICAgIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIGFyZ3MpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBLQ1BvcnQgbXNnID0gWFNEUGx1Z2luLmdldFNjaGVtYVN0cmluZygiX0lORk9fUkVTRVRfRUxFTUVOVCIpOwotCQkJCW1zZyA9ICJfSU5GT19SRVNFVF9FTEVNRU5UIjsKLSAgICAgICAgLy8gS0NQb3J0IG1zZyArPSAiPCIgKyBlbGVtZW50LmdldE5hbWUoKSArICI+ICIgKyBYU0RQbHVnaW4uZ2V0U2NoZW1hU3RyaW5nKCJfVUlfVE9fVFlQRV9TVFJJTkciKTsKLQkJCQltc2cgKz0gIjwiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiPiAiICsgIl9VSV9UT19UWVBFX1NUUklORyI7Ci0gICAgICB9Ci0gICAgICBhZGRNZXNzYWdlKG1zZywgZWxlbWVudCk7Ci0gICAgfQotCi0KLSAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuWFNEVmlzaXRvciN2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIHN1cGVyLnZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgIGlmICh0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBhdHRyVXNlLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBub3cgaXMgdGhpcyBhIHJlZmVyZW5jZT8KLSAgICAgICAgICBpZiAoYXR0ckRlY2wgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAhYXR0ckRlY2wuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpICYmCi0gICAgICAgICAgICAgIGRlbGV0ZWRJdGVtLmVxdWFscyhhdHRyRGVjbC5nZXRUeXBlRGVmaW5pdGlvbigpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc2V0VHlwZVRvU3RyaW5nKGF0dHJEZWNsLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgZGVjbCB0byBzdHJpbmcKLSAgICAgICAgICAgICAgLy8gS0NQb3J0IFN0cmluZyBtc2cgPSBYU0RQbHVnaW4uZ2V0U2NoZW1hU3RyaW5nKCJfSU5GT19SRVNFVF9BVFRSSUJVVEUiKSArCi0JCQkJCQkgIFN0cmluZyBtc2cgPSAiX0lORk9fUkVTRVRfQVRUUklCVVRFIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgPCIgKyBhdHRyRGVjbC5nZXROYW1lKCkgKyAiPiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS0NQb3J0IFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9VSV9UT19UWVBFX1NUUklORyIpOwotCQkJCQkJICAgICAgICAgICAgICAgIl9VSV9UT19UWVBFX1NUUklORyI7IAotICAgICAgICAgICAgICBhZGRNZXNzYWdlKG1zZywgYXR0ckRlY2wpOwotICAgICAgICAgICAgICByZXNldFR5cGVUb1N0cmluZyhhdHRyRGVjbC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlID0gdHlwZS5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICBpZiAoYmFzZSAhPSBudWxsICYmIGJhc2UgPT0gZGVsZXRlZEl0ZW0pCi0gICAgewotICAgICAgWFNERE9NSGVscGVyIGhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5Tm9kZSA9IGhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50KHR5cGUuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgLy8gS0NQb3J0IFN0cmluZyBtc2cgPSBYU0RQbHVnaW4uZ2V0U2NoZW1hU3RyaW5nKCJfSU5GT19SRVNFVF9DT01QTEVYX1RZUEUiKSArCi0JCQlTdHJpbmcgbXNnID0gIl9JTkZPX1JFU0VUX0NPTVBMRVhfVFlQRSIgKwotICAgICAgICAgICAgICAiIDwiICsgZ2V0TmFtZWRDb21wb25lbnROYW1lKHR5cGUpICsgIj4gIiArCi0gICAgICAgICAgICAgIC8vIEtDUG9ydCBYU0RQbHVnaW4uZ2V0U2NoZW1hU3RyaW5nKCJfVUlfREVSSVZBVElPTiIpOwotCQkJICAgICAgICAiX1VJX0RFUklWQVRJT04iOwotICAgICAgYWRkTWVzc2FnZShtc2csIHR5cGUpOwotICAgICAgCi0gICAgICB0eXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbihudWxsKTsKLQotICAgICAgamF2YS51dGlsLkxpc3QgbGlzdE9mQ1QgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICBpZiAobGlzdE9mQ1Quc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdE9mQ1QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIHR5cGVEZWZpbml0aW9uID0gKFhTRFR5cGVEZWZpbml0aW9uKWl0ZXIubmV4dCgpOwotICAgICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBkZWxldGVkSXRlbSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbih0eXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCkgPT0gZGVsZXRlZEl0ZW0pCi0gICAgewotICAgICAgdHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oc2NoZW1hLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVzZXRUeXBlVG9TdHJpbmcoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgcHJlZml4ID0gKHByZWZpeCA9PSBudWxsKSA/ICIiIDogKHByZWZpeCArICI6Iik7Ci0gICAgCi0gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBwcmVmaXggKyAic3RyaW5nIik7IAotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2RlbGV0ZS9YU0RFeHRlcm5hbEZpbGVDbGVhbnVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvZGVsZXRlL1hTREV4dGVybmFsRmlsZUNsZWFudXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0MDQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvZGVsZXRlL1hTREV4dGVybmFsRmlsZUNsZWFudXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuZGVsZXRlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cCBleHRlbmRzIEJhc2VDbGVhbnVwCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cC4KLSAgICovCi0gIHB1YmxpYyBYU0RFeHRlcm5hbEZpbGVDbGVhbnVwKFN0cmluZyBvbGRGaWxlbmFtZSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5vbGRGaWxlbmFtZSA9IG9sZEZpbGVuYW1lOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGRlbGV0ZWRTY2hlbWE7Ci0gIHB1YmxpYyBYU0RFeHRlcm5hbEZpbGVDbGVhbnVwKFhTRFNjaGVtYSBkZWxldGVkU2NoZW1hKQotICB7Ci0gICAgdGhpcy5kZWxldGVkU2NoZW1hID0gZGVsZXRlZFNjaGVtYTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgb2xkRmlsZW5hbWU7Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlhTRFZpc2l0b3IjdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBib29sZWFuIGFkZE1lc3NhZ2UgPSB0cnVlOwotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IGVsZW1lbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICBpZiAoc2NoZW1hTG9jYXRpb24hPSBudWxsKQotICAgIHsKLSAgICAgIGlmICghc2NoZW1hTG9jYXRpb24uZXF1YWxzKHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpKSkKLSAgICAgIHsKLSAgICAgICAgYWRkTWVzc2FnZSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIGlmIChpc0Zyb21EZWxldGVkU2NoZW1hKGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChhZGRNZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU3RyaW5nIG1zZyA9IFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9JTkZPX1JFTU9WRV9FTEVNRU5UX1JFRkVSRU5DRSIpICsgIiA8IiArIGdldE5hbWVkQ29tcG9uZW50TmFtZShlbGVtZW50LmdldENvbnRhaW5lcigpKSArICI+IjsKLQkJCQkJU3RyaW5nIG1zZyA9ICJfSU5GT19SRU1PVkVfRUxFTUVOVF9SRUZFUkVOQ0UiICsgIiA8IiArIGdldE5hbWVkQ29tcG9uZW50TmFtZShlbGVtZW50LmdldENvbnRhaW5lcigpKSArICI+IjsKLSAgICAgICAgICBhZGRNZXNzYWdlKG1zZywgZWxlbWVudC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRyZW5Ub1JlbW92ZS5hZGQoZWxlbWVudC5nZXRFbGVtZW50KCkpOwotLy8gICAgICAgIEVsZW1lbnQgZG9tRWxlbWVudCA9IGVsZW1lbnQuZ2V0RWxlbWVudCgpOwotLy8gICAgICAgIGRvbUVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGRvbUVsZW1lbnQpOyAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlbW92ZVR5cGUoZWxlbWVudCkpCi0gICAgewotICAgICAgU3RyaW5nIG1zZyA9ICIiOwotICAgICAgaWYgKGVsZW1lbnQuaXNHbG9iYWwoKSkKLSAgICAgIHsKLSAgICAgIAkvLyBTdHJpbmcgcGF0dGVybiA9IFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9JTkZPX1JFU0VUX0dMT0JBTF9FTEVNRU5UIik7Ci0JCQkJU3RyaW5nIHBhdHRlcm4gPSAiX0lORk9fUkVTRVRfR0xPQkFMX0VMRU1FTlQiOwotICAgICAgICBPYmplY3QgYXJnc1tdID0ge2VsZW1lbnQuZ2V0TmFtZSgpfTsKLSAgICAgICAgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgYXJncyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAJLy8gbXNnID0gWFNEUGx1Z2luLmdldFNjaGVtYVN0cmluZygiX0lORk9fUkVTRVRfRUxFTUVOVCIpOwotCQkJCW1zZyA9ICJfSU5GT19SRVNFVF9FTEVNRU5UIjsKLSAgICAgIAkvLyBtc2cgKz0gIjwiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiPiAiICsgWFNEUGx1Z2luLmdldFNjaGVtYVN0cmluZygiX1VJX1RPX1RZUEVfU1RSSU5HIik7Ci0JCQkJbXNnICs9ICI8IiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgIj4gIiArICJfVUlfVE9fVFlQRV9TVFJJTkciOwotICAgICAgfQotICAgICAgaWYgKGFkZE1lc3NhZ2UpCi0gICAgICB7Ci0gICAgICAgIGFkZE1lc3NhZ2UobXNnLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLQotICAgIHN1cGVyLnZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVzZXRUeXBlVG9TdHJpbmcoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgcHJlZml4ID0gKHByZWZpeCA9PSBudWxsKSA/ICIiIDogKHByZWZpeCArICI6Iik7Ci0gICAgCi0gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBwcmVmaXggKyAic3RyaW5nIik7IAotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVUeXBlKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gIAlpZiAocmVtb3ZlVHlwZShlbGVtZW50LmdldFR5cGVEZWZpbml0aW9uKCkpKQotICAJewotICAgICAgcmVzZXRUeXBlVG9TdHJpbmcoZWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAJICByZXR1cm4gdHJ1ZTsKLSAgCX0KLSAgCXJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGcm9tRGVsZXRlZFNjaGVtYShYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCByb290ID0gY29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKTsKLQotICAgIGJvb2xlYW4gaXNGcm9tRGVsZXRlZFNjaGVtYSA9IGZhbHNlOwotICAgIGlmIChkZWxldGVkU2NoZW1hLmdldENvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBjb250ZW50cyA9IGRlbGV0ZWRTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpY29udGVudHMubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSBhU2NoZW1hID0gKChYU0RTY2hlbWFEaXJlY3RpdmUpY29udGVudCkuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgICAgICBpZiAocm9vdCAhPSBudWxsICYmIHJvb3QuZXF1YWxzKGFTY2hlbWEpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzRnJvbURlbGV0ZWRTY2hlbWEgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAocm9vdCAhPSBudWxsICYmIHJvb3QuZXF1YWxzKGRlbGV0ZWRTY2hlbWEpKQotICAgIHsKLSAgICAgIGlzRnJvbURlbGV0ZWRTY2hlbWEgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gaXNGcm9tRGVsZXRlZFNjaGVtYTsKLSAgfQotICAgICAgCi0gIC8qKgotICAgKiBSZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgZWxlbWVudCBpZiBpdCBiZWxvbmdzIHRvIHRoZSBleHRlcm5hbCBmaWxlCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVUeXBlKFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYpCi0gIHsKLSAgICBpZiAodHlwZURlZiA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGlzRnJvbURlbGV0ZWRTY2hlbWEodHlwZURlZik7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnV0aWxpdHkuWFNEVmlzaXRvciN2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIHN1cGVyLnZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgIGlmICh0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBhdHRyVXNlLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBub3cgaXMgdGhpcyBhIHJlZmVyZW5jZT8KLSAgICAgICAgICBpZiAoYXR0ckRlY2wuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0Zyb21EZWxldGVkU2NoZW1hKGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0TmFtZWRDb21wb25lbnROYW1lKHR5cGUpOwotICAgICAgICAgICAgICAvLyBTdHJpbmcgbXNnID0gWFNEUGx1Z2luLmdldFNjaGVtYVN0cmluZygiX0lORk9fUkVNT1ZFX0FUVFJJQlVURV9SRUZFUkVOQ0UiKSArCi0JCQkJCQkJU3RyaW5nIG1zZyA9ICJfSU5GT19SRU1PVkVfQVRUUklCVVRFX1JFRkVSRU5DRSIgKwotICAgICAgICAgICAgICAgICAgICAgICAiIDwiICsgbmFtZSArICI+IjsKLSAgICAgICAgICAgICAgYWRkTWVzc2FnZShtc2csIGF0dHJEZWNsLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGNoaWxkcmVuVG9SZW1vdmUuYWRkKGF0dHJEZWNsLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIG90aGVyd2lzZSBjaGVjayB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlIGFuZCBzZWUgaWYgaXQgaXMgZnJvbSB0aGUgZGVsZXRlZCBzY2hlbWEKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlbW92ZVR5cGUoYXR0ckRlY2wuZ2V0VHlwZURlZmluaXRpb24oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgZGVjbCB0byBzdHJpbmcKLSAgICAgICAgICAgICAgLy8gU3RyaW5nIG1zZyA9IFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9JTkZPX1JFU0VUX0FUVFJJQlVURSIpICsKLQkJCQkJCQlTdHJpbmcgbXNnID0gIl9JTkZPX1JFU0VUX0FUVFJJQlVURSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiIDwiICsgYXR0ckRlY2wuZ2V0TmFtZSgpICsgIj4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9VSV9UT19UWVBFX1NUUklORyIpOwotCQkJCQkJCSAgICAgICAgICAgICJfVUlfVE9fVFlQRV9TVFJJTkciOwotICAgICAgICAgICAgICBhZGRNZXNzYWdlKG1zZywgYXR0ckRlY2wpOwotICAgICAgICAgICAgICByZXNldFR5cGVUb1N0cmluZyhhdHRyRGVjbC5nZXRFbGVtZW50KCkpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwRGVmID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgYXR0ckdyb3VwQ29udGVudDsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoaXNGcm9tRGVsZXRlZFNjaGVtYShhdHRyR3JvdXBEZWYuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKSkpCi0gICAgICAgICAgewotICAgICAgICAgIAkvLyByZW1vdmUgdGhlIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0TmFtZWRDb21wb25lbnROYW1lKHR5cGUpOwotICAgICAgICAgICAgLy8gU3RyaW5nIG1zZyA9IFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9JTkZPX1JFTU9WRV9BVFRSSUJVVEVfR1JPVVBfUkVGRVJFTkNFIikgKyAiIDwiICsgbmFtZSArICI+IjsKLQkJCQkJCVN0cmluZyBtc2cgPSAiX0lORk9fUkVNT1ZFX0FUVFJJQlVURV9HUk9VUF9SRUZFUkVOQ0UiICsgIiA8IiArIG5hbWUgKyAiPiI7Ci0KLSAgICAgICAgICAgIGFkZE1lc3NhZ2UobXNnLCBhdHRyR3JvdXBEZWYuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjaGlsZHJlblRvUmVtb3ZlLmFkZChhdHRyR3JvdXBEZWYuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGb3IgdGhlIGNvbXBsZXggdHlwZSB3aXRoIHNpbXBsZSBjb250ZW50IGNhc2UsIHNlZSB0aGUgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24gbWV0aG9kCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZSA9IHR5cGUuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKGJhc2UgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiliYXNlOwotICAgICAgaWYgKGlzRnJvbURlbGV0ZWRTY2hlbWEoYmFzZVR5cGUpKQotICAgICAgewotICAgICAgICAvLyBTdHJpbmcgbXNnID0gWFNEUGx1Z2luLmdldFNjaGVtYVN0cmluZygiX0lORk9fUkVTRVRfQ09NUExFWF9UWVBFIikgKwotCQkJCVN0cmluZyBtc2cgPSAiX0lORk9fUkVTRVRfQ09NUExFWF9UWVBFIiArCi0gICAgICAgICAgICAgICAgIiA8IiArIGdldE5hbWVkQ29tcG9uZW50TmFtZSh0eXBlKSArICI+ICIgKwotICAgICAgICAgICAgICAgIC8vIFhTRFBsdWdpbi5nZXRTY2hlbWFTdHJpbmcoIl9VSV9ERVJJVkFUSU9OIik7Ci0JCQkJICAgICAgICAiX1VJX0RFUklWQVRJT04iOwotICAgICAgICBhZGRNZXNzYWdlKG1zZywgdHlwZSk7Ci0gICAgICAKLSAgICAgICAgdHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oc2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIikpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudXRpbGl0eS5YU0RWaXNpdG9yI3Zpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXApCi0gIHsKLSAgICBzdXBlci52aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKG1vZGVsR3JvdXApOwotICAgIGlmIChtb2RlbEdyb3VwLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAoaXNGcm9tRGVsZXRlZFNjaGVtYShtb2RlbEdyb3VwLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZ2V0TmFtZWRDb21wb25lbnROYW1lKG1vZGVsR3JvdXApOwotICAgICAgICAvLyBTdHJpbmcgbXNnID0gWFNEUGx1Z2luLmdldFNjaGVtYVN0cmluZygiX0lORk9fUkVNT1ZFX0dST1VQX1JFRkVSRU5DRSIpICsgIiA8IiArIG5hbWUgKyAiPiI7Ci0JCQkJU3RyaW5nIG1zZyA9ICJfSU5GT19SRU1PVkVfR1JPVVBfUkVGRVJFTkNFIiArICIgPCIgKyBuYW1lICsgIj4iOwotICAgICAgICBhZGRNZXNzYWdlKG1zZywgbW9kZWxHcm91cC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgIGNoaWxkcmVuVG9SZW1vdmUuYWRkKG1vZGVsR3JvdXAuZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICB9ICAgICAgCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnV0aWxpdHkuWFNEVmlzaXRvciN2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgc3VwZXIudmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKGlzRnJvbURlbGV0ZWRTY2hlbWEoYmFzZVR5cGUpKQotICAgIHsKLSAgICAgIC8vIFN0cmluZyBtc2cgPSBYU0RQbHVnaW4uZ2V0U2NoZW1hU3RyaW5nKCJfSU5GT19SRVNFVF9TSU1QTEVfVFlQRSIpICsKLQkJCVN0cmluZyBtc2cgPSAiX0lORk9fUkVTRVRfU0lNUExFX1RZUEUiICsKLSAgICAgICAgICAgICAgIiA8IiArIGdldE5hbWVkQ29tcG9uZW50TmFtZSh0eXBlKSArICI+ICIgKwotICAgICAgICAgICAgICAvLyBYU0RQbHVnaW4uZ2V0U2NoZW1hU3RyaW5nKCJfVUlfREVSSVZBVElPTiIpOwotCQkJICAgICAgICAiX1VJX0RFUklWQVRJT04iOwotICAgICAgYWRkTWVzc2FnZShtc2csIHR5cGUpOwotICAgICAgCi0KLSAgICAvLyBUaGlzIHdpbGwgc2V0IHRoZSBzaW1wbGUgVHlwZSBiYXNlIHRvIHN0cmluZyAKLSAgICAvLyBGb3IgdGhlIGNvbXBsZXggdHlwZSB3aXRoIHNpbXBsZSBjb250ZW50IGNhc2UsIHNlZSB0aGUgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24gbWV0aG9kCi0KLSAgICAgIHR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmNsZWFyKCk7Ci0gICAgICB0eXBlLmdldEZhY2V0cygpLmNsZWFyKCk7Ci0gICAgICB0eXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbihzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJzdHJpbmciKSk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MzI4NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1SZWZhY3Rvck1lbnUubGFiZWw9UmVmYWN0b3IKLVJlZmFjdG9yQWN0aW9uR3JvdXAubm9fcmVmYWN0b3JpbmdfYXZhaWxhYmxlPTxubyByZWZhY3RvcmluZyBhdmFpbGFibGU+Ci0KLVJlbmFtZUFjdGlvbi5yZW5hbWU9UmVuYW1lCi1SZW5hbWVBY3Rpb24udW5hdmFpbGFibGU9T3BlcmF0aW9uIHVuYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cblNlbGVjdCBhIC4uLi4KLVJlbmFtZUFjdGlvbi50ZXh0PVJlJm5hbWUuLi4KLQotUmVuYW1lSW5wdXRXaXphcmRQYWdlLm5ld19uYW1lPSAmTmV3IG5hbWU6Ci1SZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5pbnRlcm5hbF9lcnJvcj0gSW50ZXJuYWwgZXJyb3IgZHVyaW5nIG5hbWUgY2hlY2tpbmc6IHswfQotCi0KLVJlbmFtZVhTREVsZW1lbnRBY3Rpb24uZXhjZXB0aW9uPVVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkLiBTZWUgbG9nIGZvciBkZXRhaWxzCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uLm5vdF9hdmFpbGFibGU9T3BlcmF0aW9uIHVuYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cblNlbGVjdCBhIFhTRCBwcm9qZWN0LCBmb2xkZXIsIHJlc291cmNlLCBmaWxlLCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLCAgYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb25zLCBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zLCBpZGVudGl0eSBjb25zdHJhaW50IGRlZmluaXRpb25zLCBtb2RlbCBncm91cHMgZGVmaW5pdGlvbnMsIG5vdGF0aW9uIGRlY2xhcmF0aW9ucywgb3Igc2ltcGxlIHR5cGUgZGVmaW5pdGlvbnMuCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uLm5hbWU9UmVuYW1lCi0KLQotUmVuYW1lU3VwcG9ydC5kaWFsb2cudGl0bGU9UmVuYW1lCi1SZW5hbWVTdXBwb3J0Lm5vdF9hdmFpbGFibGU9UmVuYW1lIHN1cHBvcnQgbm90IGF2YWlsYWJsZQotCi1SZW5hbWVDb21wb25lbnRXaXphcmQuZGVmYXVsdFBhZ2VUaXRsZT1SZW5hbWUgd2l6YXJkCi1SZW5hbWVDb21wb25lbnRXaXphcmQuaW5wdXRQYWdlLmRlc2NyaXB0aW9uPVJlbmFtZSBYTUwgU2NoZW1hIGNvbXBvbmVudAotCi1SZW5hbWVJbnB1dFdpemFyZFBhZ2UudXBkYXRlX3JlZmVyZW5jZXM9VXBkYXRlIHJlZmVyZW5jZXMKLVhTRENvbXBvbmVudFJlbmFtZUNoYW5nZS5uYW1lPVhNTCBTY2hlbWEgY29tcG9uZW50IHJlbmFtaW5nOiB7MH0gdG8gezF9Ci1YU0RDb21wb25lbnRSZW5hbWVDaGFuZ2UuUmVuYW1pbmc9UmVuYW1pbmcuLi4KLVhTRFJlc291cmNlUmVuYW1lUGFydGljaXBhbnQuY29tcG9zaXRlQ2hhbmdlTmFtZT1YU0QgZmlsZSByZW5hbWUgcmVmZXJlbmNlcyB1cGRhdGluZyBjaGFuZ2VzCi1YU0RSZW5hbWVSZXNvdXJjZUNoYW5nZS5yZW5hbWVfcmVzb3VyY2U9UmVuYW1pbmcgcmVzb3VyY2UgbmFtZSByZWZlcmVuY2VzCi1YU0RSZW5hbWVSZXNvdXJjZUNoYW5nZS5uYW1lPVJlc291cmNlIHJlbmFtZTogezB9IHRvIHsxfQotUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZy5JbnRlcm5hbF9FcnJvcj1JbnRlcm5hbCBlcnJvcgotUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZy5hbHJlYWRfZXhpc3RzPVJlc291cmNlIGFscmVhZHkgZXhpc3QKLVJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuaW52YWxpZE5hbWU9SW52YWxpZCByZXNvdXJjZSBuYW1lCi1SZW5hbWVSZXNvdXJjZVByb2Nlc3Nvci5uYW1lPVJlc291cmNlIHJlbmFtaW5nCi1NYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uLnRleHQ9TWFrZSBMb2NhbCBFbGVtZW50IEdsb2JhbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvQmFzZVJlbmFtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvQmFzZVJlbmFtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3ODllOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0Jhc2VSZW5hbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YU0RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciByZW5hbWUgaGVscGVycyBvZiB2YXJpb3VzIG5hbWVkIHJvb3QgY29tcG9uZW50cy4gIFRoaXMgaXMgdG8gYmUgdXNlZCB3aGVuCi0gKiB0aGUgdXNlciByZW5hbWVzIGEgZ2xvYmFsIGVsZW1lbnQsIGdyb3VwLCBhdHRyaWJ1dGUsIGF0dHJpYnV0ZSBncm91cCwgY29tcGxleC9zaW1wbGUgdHlwZSBldGMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZW5hbWVyIGV4dGVuZHMgWFNEVmlzaXRvcgotewotCi0gIAotICAvKioKLSAgICogTWV0aG9kIEJhc2VSZW5hbWVyLgotICAgKiBAcGFyYW0gZ2xvYmFsQ29tcG9uZW50IC0gdGhpcyBpcyB0aGUgY29tcG9uZW50ICh3aG8ncyBwYXJlbnQgaXMgdGhlIHNjaGVtYSkgdGhhdCBoYXMgYmVlbiByZW5hbWVkCi0gICAqLwotICBwdWJsaWMgQmFzZVJlbmFtZXIoWFNETmFtZWRDb21wb25lbnQgZ2xvYmFsQ29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIHRoaXMuZ2xvYmFsQ29tcG9uZW50ID0gZ2xvYmFsQ29tcG9uZW50OwotICAgIHRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmV3UU5hbWUoKQotICB7Ci0gICAgU3RyaW5nIHFOYW1lID0gbnVsbDsKLSAgICBpZiAobmV3TmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHFOYW1lID0gWFNEQ29uc3RhbnRzLmxvb2t1cFF1YWxpZmllcihnbG9iYWxDb21wb25lbnQuZ2V0RWxlbWVudCgpLCBnbG9iYWxDb21wb25lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgaWYgKHFOYW1lICE9IG51bGwgJiYgcU5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBxTmFtZSArPSAiOiIgKyBuZXdOYW1lOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBxTmFtZSA9IG5ld05hbWU7IAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcU5hbWUgPSBuZXdOYW1lOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbmV3TmFtZTsKLSAgcHJvdGVjdGVkIFhTRE5hbWVkQ29tcG9uZW50IGdsb2JhbENvbXBvbmVudDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvQ29tcG9uZW50UmVuYW1lQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0NvbXBvbmVudFJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjU0OWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvQ29tcG9uZW50UmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotCi0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhcgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0JCi0JcHJpdmF0ZSBNYXAgZkNoYW5nZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5ld05hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBmT2xkTmFtZTsKLQotCXByaXZhdGUgWFNETmFtZWRDb21wb25lbnQgZk5hbWVkQ29tcG9uZW50OwotCi0JcHVibGljIENvbXBvbmVudFJlbmFtZUNoYW5nZShYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUsICJuZXcgbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCUFzc2VydC5pc05vdE51bGwob2xkTmFtZSwgIm9sZCBuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmTmFtZWRDb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JCWZPbGROYW1lPSBvbGROYW1lOwotCQlmTmV3TmFtZT0gbmV3TmFtZTsKLQl9Ci0JCi0vLwlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkgewotLy8JCS8vIFRPRE86IFAxIGltcGxlbWVudCBzZWFyY2ggb2YgWFNEIGZpbGVzCQotLy8JCVhTRFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IFhTRFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLS8vCQlSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IoY29tcG9uZW50LCBuZXdOYW1lKTsKLS8vCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKGNvbXBvbmVudCwgSVhTRFNlYXJjaENvbnN0YW50cy5XT1JLU1BBQ0VfU0NPUEUsIHJlcXVlc3Rvcik7Ci0vLwotLy8JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotLy8KLS8vCX0KLQotCXByb3RlY3RlZCBDaGFuZ2UgY3JlYXRlVW5kb0NoYW5nZSgpIHsKLQkJcmV0dXJuIG5ldyBDb21wb25lbnRSZW5hbWVDaGFuZ2UoZk5hbWVkQ29tcG9uZW50LCBnZXROZXdOYW1lKCksIGdldE9sZE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvUmVuYW1lKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBQMSBjaGFuZ2UgdGVtcG9yYXJ5IHJlbmFtZSBvZiBYU0QgbW9kZWwgY29tcG9uZW50cyAKLQkJcGVyZm9ybU1vZGlmeShnZXROZXdOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwZXJmb3JtTW9kaWZ5KGZpbmFsIFN0cmluZyB2YWx1ZSkKLQkgIHsKLQkgICAgaWYgKHZhbHVlLmxlbmd0aCgpID4gMCkKLQkgICAgewotCSAgICAgIERlbGF5ZWRSZW5hbWVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBEZWxheWVkUmVuYW1lUnVubmFibGUoZk5hbWVkQ29tcG9uZW50LCB2YWx1ZSk7Ci0JICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkgICAgfQotCSAgfSAgICAgIAotCi0JICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERlbGF5ZWRSZW5hbWVSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlCi0JICB7Ci0JICAgIHByb3RlY3RlZCBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQ7Ci0JICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCSAgICBwdWJsaWMgRGVsYXllZFJlbmFtZVJ1bm5hYmxlKFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIG5hbWUpCi0JICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQkgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCSAgICBwdWJsaWMgdm9pZCBydW4oKQotCSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAgIGNvbXBvbmVudC51cGRhdGVFbGVtZW50KHRydWUpOwotCSAgICAgIFhTRFN3aXRjaCB4c2RTd2l0Y2ggPSBuZXcgWFNEU3dpdGNoKCkKLQkgICAgICB7ICAgICAgICAgICAgICAgICAgIAotCSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEVHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gb2JqZWN0KQotCSAgICAgICAgewotCSAgICAgICAgICBuZXcgR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZVJlbmFtZXIob2JqZWN0LCBuYW1lKS52aXNpdFNjaGVtYShvYmplY3QuZ2V0U2NoZW1hKCkpOwotCSAgICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgICAgIH0gCi0JICAgICAgCi0JICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG9iamVjdCkKLQkgICAgICAgIHsgICAgICAgICAgIAotCSAgICAgICAgICBpZiAob2JqZWN0LmlzR2xvYmFsKCkpCi0JICAgICAgICAgIHsKLQkgICAgICAgICAgICBuZXcgR2xvYmFsRWxlbWVudFJlbmFtZXIob2JqZWN0LCBuYW1lKS52aXNpdFNjaGVtYShvYmplY3QuZ2V0U2NoZW1hKCkpOwotCSAgICAgICAgICB9Ci0JICAgICAgICAgIHJldHVybiBudWxsOwotCSAgICAgICAgfQotCSAgICAgIAotCSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gb2JqZWN0KQotCSAgICAgICAgewotCSAgICAgICAgICBuZXcgR2xvYmFsR3JvdXBSZW5hbWVyKG9iamVjdCwgbmFtZSkudmlzaXRTY2hlbWEob2JqZWN0LmdldFNjaGVtYSgpKTsKLQkgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JICAgICAgICB9Ci0JICAgICAgfTsKLQkgICAgICB4c2RTd2l0Y2guZG9Td2l0Y2goY29tcG9uZW50KTsgCi0JICAgICAgY29tcG9uZW50LnNldE5hbWUobmFtZSk7Ci0JICAgICAKLQkgICAgfQotCSAgfQotCQotCXB1YmxpYyBUZXh0Q2hhbmdlIGdldENoYW5nZShJRmlsZSBmaWxlKSB7Ci0JCVRleHRDaGFuZ2UgcmVzdWx0PSAoVGV4dENoYW5nZSlmQ2hhbmdlcy5nZXQoZmlsZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0PSBuZXcgVGV4dEZpbGVDaGFuZ2UoZmlsZS5nZXROYW1lKCksIGZpbGUpOwotCQkJZkNoYW5nZXMucHV0KGZpbGUsIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIlhTRENvbXBvbmVudFJlbmFtZUNoYW5nZS5uYW1lIiwgbmV3IFN0cmluZ1tde2dldE9sZE5hbWUoKSwgZ2V0TmV3TmFtZSgpfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgZmluYWwgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcG0uYmVnaW5UYXNrKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0RDb21wb25lbnRSZW5hbWVDaGFuZ2UuUmVuYW1pbmciKSwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCUNoYW5nZSByZXN1bHQ9IGNyZWF0ZVVuZG9DaGFuZ2UoKTsKLQkJCWRvUmVuYW1lKG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXdOYW1lLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3TmFtZSgpIHsKLQkJcmV0dXJuIGZOZXdOYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9sZE5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE9sZE5hbWUoKSB7Ci0JCXJldHVybiBmT2xkTmFtZTsKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjZ2V0TW9kaWZpZWRFbGVtZW50KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZk5hbWVkQ29tcG9uZW50OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjaXNWYWxpZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgY2hhbmdlIHZhbGlkYXRpb24KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvR2xvYmFsQXR0cmlidXRlR3JvdXBSZW5hbWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0dsb2JhbEF0dHJpYnV0ZUdyb3VwUmVuYW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDFlYzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvR2xvYmFsQXR0cmlidXRlR3JvdXBSZW5hbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEdsb2JhbEF0dHJpYnV0ZUdyb3VwUmVuYW1lciBleHRlbmRzIEJhc2VSZW5hbWVyCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgR2xvYmFsQXR0cmlidXRlR3JvdXBSZW5hbWVyLgotICAgKiBAcGFyYW0gZ2xvYmFsQ29tcG9uZW50Ci0gICAqLwotICBwdWJsaWMgR2xvYmFsQXR0cmlidXRlR3JvdXBSZW5hbWVyKFhTRE5hbWVkQ29tcG9uZW50IGdsb2JhbENvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBzdXBlcihnbG9iYWxDb21wb25lbnQsIG5ld05hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YU0RWaXNpdG9yI3Zpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0ZXIubmV4dCgpOwotCi0gICAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cERlZiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMoYXR0ckdyb3VwRGVmLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJHcm91cERlZi5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCBnZXROZXdRTmFtZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvR2xvYmFsQXR0cmlidXRlUmVuYW1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9HbG9iYWxBdHRyaWJ1dGVSZW5hbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYjNlNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9HbG9iYWxBdHRyaWJ1dGVSZW5hbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBHbG9iYWxBdHRyaWJ1dGVSZW5hbWVyIGV4dGVuZHMgQmFzZVJlbmFtZXIKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBHbG9iYWxBdHRyaWJ1dGVSZW5hbWVyLgotICAgKiBAcGFyYW0gZ2xvYmFsQ29tcG9uZW50Ci0gICAqLwotICBwdWJsaWMgR2xvYmFsQXR0cmlidXRlUmVuYW1lcihYU0ROYW1lZENvbXBvbmVudCBnbG9iYWxDb21wb25lbnQsIFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgc3VwZXIoZ2xvYmFsQ29tcG9uZW50LCBuZXdOYW1lKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YU0RWaXNpdG9yI3Zpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgYXR0ckdyb3VwQ29udGVudDsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IGF0dHJVc2UuZ2V0Q29udGVudCgpOwotICAgICAgICAgIAotICAgICAgICAgIC8vIG5vdyBpcyB0aGlzIGEgcmVmZXJlbmNlPwotICAgICAgICAgIGlmIChhdHRyRGVjbCAhPSBudWxsICYmIGF0dHJEZWNsLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZ2xvYmFsQ29tcG9uZW50LmVxdWFscyhhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhdHRyRGVjbC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCBnZXROZXdRTmFtZSgpKTsgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgCi0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0dsb2JhbEVsZW1lbnRSZW5hbWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0dsb2JhbEVsZW1lbnRSZW5hbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OWQ3NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9HbG9iYWxFbGVtZW50UmVuYW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEdsb2JhbEVsZW1lbnRSZW5hbWVyIGV4dGVuZHMgQmFzZVJlbmFtZXIKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBHbG9iYWxFbGVtZW50UmVuYW1lci4KLSAgICogQHBhcmFtIGdsb2JhbENvbXBvbmVudAotICAgKi8KLSAgcHVibGljIEdsb2JhbEVsZW1lbnRSZW5hbWVyKFhTRE5hbWVkQ29tcG9uZW50IGdsb2JhbENvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBzdXBlcihnbG9iYWxDb21wb25lbnQsIG5ld05hbWUpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlhTRFZpc2l0b3IjdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpICYmCi0gICAgICAgIGdsb2JhbENvbXBvbmVudC5lcXVhbHMoZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKSkKLSAgICB7Ci0gICAgICBlbGVtZW50LmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKCkpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0dsb2JhbEdyb3VwUmVuYW1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9HbG9iYWxHcm91cFJlbmFtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5YjhlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0dsb2JhbEdyb3VwUmVuYW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgR2xvYmFsR3JvdXBSZW5hbWVyIGV4dGVuZHMgQmFzZVJlbmFtZXIKLXsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEdsb2JhbEdyb3VwUmVuYW1lci4KLSAgICogQHBhcmFtIGdsb2JhbENvbXBvbmVudAotICAgKi8KLSAgcHVibGljIEdsb2JhbEdyb3VwUmVuYW1lcihYU0ROYW1lZENvbXBvbmVudCBnbG9iYWxDb21wb25lbnQsIFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgc3VwZXIoZ2xvYmFsQ29tcG9uZW50LCBuZXdOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuWFNEVmlzaXRvciN2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwKQotICB7Ci0gICAgc3VwZXIudmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwKTsKLSAgICBpZiAobW9kZWxHcm91cC5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMobW9kZWxHcm91cC5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkpKQotICAgICAgewotICAgICAgICBtb2RlbEdyb3VwLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKCkpOwotICAgICAgfQotICAgIH0gICAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9HbG9iYWxTaW1wbGVPckNvbXBsZXhUeXBlUmVuYW1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9HbG9iYWxTaW1wbGVPckNvbXBsZXhUeXBlUmVuYW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjliNTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZVJlbmFtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEdsb2JhbFNpbXBsZU9yQ29tcGxleFR5cGVSZW5hbWVyIGV4dGVuZHMgQmFzZVJlbmFtZXIKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBHbG9iYWxTaW1wbGVPckNvbXBsZXhUeXBlUmVuYW1lci4KLSAgICogQHBhcmFtIGdsb2JhbENvbXBvbmVudAotICAgKi8KLSAgcHVibGljIEdsb2JhbFNpbXBsZU9yQ29tcGxleFR5cGVSZW5hbWVyKFhTRE5hbWVkQ29tcG9uZW50IGdsb2JhbENvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBzdXBlcihnbG9iYWxDb21wb25lbnQsIG5ld05hbWUpOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEBzZWUgWFNEVmlzaXRvciN2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIGlmICghZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpICYmCi0gICAgICAgIGdsb2JhbENvbXBvbmVudC5lcXVhbHMoZWxlbWVudC5nZXRUeXBlRGVmaW5pdGlvbigpKSkKLSAgICB7Ci0gICAgICBlbGVtZW50LmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXROZXdRTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YU0RWaXNpdG9yI3Zpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgYXR0ckdyb3VwQ29udGVudDsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IGF0dHJVc2UuZ2V0Q29udGVudCgpOwotICAgICAgICAgIAotICAgICAgICAgIC8vIG5vdyBpcyB0aGlzIGEgcmVmZXJlbmNlPwotICAgICAgICAgIGlmICghYXR0ckRlY2wuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpICYmCi0gICAgICAgICAgICAgIGdsb2JhbENvbXBvbmVudC5lcXVhbHMoYXR0ckRlY2wuZ2V0VHlwZURlZmluaXRpb24oKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYXR0ckRlY2wuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2UgPSB0eXBlLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmIChiYXNlLmVxdWFscyhnbG9iYWxDb21wb25lbnQpKQotICAgIHsKLSAgICAgIFhTRERPTUhlbHBlciBoZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSBoZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudEZyb21Db21wbGV4VHlwZSh0eXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgICBpZiAoZGVyaXZlZEJ5Tm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBkZXJpdmVkQnlOb2RlLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9JTmFtZVVwZGF0aW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0lOYW1lVXBkYXRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkOWYwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0lOYW1lVXBkYXRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNiwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLQotLyoqCi0gKiBAYXV0aG9yIGViZWxpc2FyCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lVXBkYXRpbmcgewotCS8vLS0tLSBJTmFtZVVwZGF0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmV3RWxlbWVudE5hbWUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnROYW1lKCk7Ci0KLQkvKiBub24gamF2YS1kb2MKLQkgKiBAc2VlIElSZW5hbWVSZWZhY3RvcmluZyNjaGVja05ld05hbWUoKQotCSAqL3B1YmxpYyBhYnN0cmFjdCBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5YjcyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlBhcnRpY2lwYW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlNoYXJhYmxlUGFydGljaXBhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IgZXh0ZW5kcyBSZW5hbWVQcm9jZXNzb3IgIGltcGxlbWVudHMgSU5hbWVVcGRhdGluZ3sKLQkKLQlwcml2YXRlIFhTRE5hbWVkQ29tcG9uZW50IGZOYW1lZENvbXBvbmVudDsKLQlwcml2YXRlIFN0cmluZyBmTmV3RWxlbWVudE5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSPSAib3JnLmVjbGlwc2Uud3N0LnVpLnhzZC5yZW5hbWVDb21wb25lbnRQcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCi0KLQkvL3ByaXZhdGUgUXVhbGlmaWVkTmFtZVNlYXJjaFJlc3VsdCBmTmFtZVNlYXJjaFJlc3VsdDsKLQkKLQlwdWJsaWMgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yKFhTRE5hbWVkQ29tcG9uZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWZOYW1lZENvbXBvbmVudD0gZWxlbWVudDsKLQkJZk5ld0VsZW1lbnROYW1lID0gbmV3TmFtZTsKLQkJCi0JfQotCQotCXB1YmxpYyBYU0ROYW1lZENvbXBvbmVudCBnZXROYW1lZENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIGZOYW1lZENvbXBvbmVudDsKLQl9Ci0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSVRleHRVcGRhdGluZyNjYW5FbmFibGVUZXh0VXBkYXRpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVuYWJsZVRleHRVcGRhdGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JVGV4dFVwZGF0aW5nI2dldEN1cnJlbnRFbGVtZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50RWxlbWVudE5hbWUoKSB7Ci0JCQotCQlyZXR1cm4gZk5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnhzZC5pbnRlcm5hbC5yZWZhY3RvcmluZy5yZW5hbWUuWFNEUmVuYW1lUHJvY2Vzc29yI2dldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvL1RPRE86IGZpbmQgcHJvamVjdCBuYXR1cmVzIG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBnb2luZyB0byBiZSByZWZhY3RvcmVkCi0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnhzZC5pbnRlcm5hbC5yZWZhY3RvcmluZy5yZW5hbWUuWFNEUmVuYW1lUHJvY2Vzc29yI2xvYWREZXJpdmVkUGFydGljaXBhbnRzKG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzLCBqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLlN0cmluZ1tdLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuU2hhcmFibGVQYXJ0aWNpcGFudHMpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLAotCQkJTGlzdCByZXN1bHQsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogcHJvdmlkZSBhIHdheSB0byBsb2FkIHJlbmFtZSBwYXJ0aWNpcGFudHMKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrRmluYWxDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tGaW5hbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwKLQkJCUNoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0JCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gYWRkIGNvZGUgdG8gY2hlY2sgZmluYWwgY29uZGl0aW9ucyBmb3IgY29tcG9uZW50IHJlbmFtZQotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjaGVja0luaXRpYWxDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0luaXRpYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0pCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotLy8JCSBUT0RPIGFkZCBjb2RlIHRvIGNoZWNrIGluaXRpYWwgY29uZGl0aW9ucyBmb3IgY29tcG9uZW50IHJlbmFtZQotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0JCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gUDEgYWRkIGNoYW5nZSBjcmVhdGlvbgotLy8JCUNoYW5nZVtdIGNoYW5nZXMgPSBYU0RDb21wb25lbnRSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0Zvcih0aGlzLmZOYW1lZENvbXBvbmVudCwgZ2V0TmV3RWxlbWVudE5hbWUoKSk7Ci0vLwkJQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsgCi0vLwkJCWlmKGNoYW5nZXMubGVuZ3RoID4gMCkKLS8vCQkJCW11bHRpQ2hhbmdlICA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoIlhTRCBjb21wb25lbnQgcmVuYW1lIHBhcnRpY2lwYW50IGNoYW5nZXMiLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJCBUT0RPOiBleHRlcm5hbGl6ZSBzdHJpbmcKLS8vCQlyZXR1cm4gbXVsdGlDaGFuZ2U7Ci0JCQotLy8JCWNvbXB1dGVOYW1lTWF0Y2hlcyhwbSk7CQotLy8JCUNoYW5nZVtdIGNoYW5nZXMgPSBmTmFtZVNlYXJjaFJlc3VsdC5nZXRBbGxDaGFuZ2VzKCk7Ci0vLwkJcmV0dXJuIG5ldyBDb21wb3NpdGVDaGFuZ2UoIlhTRCBmaWxlIHJlbmFtZSBwYXJ0aWNpcGFudCBjaGFuZ2VzIiwgY2hhbmdlcyk7IC8vVE9ETzogZXh0ZXJuYWxpemUgc3RyaW5nCi0JCXBtLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5ewotCQkJcmV0dXJuIG5ldyBDb21wb25lbnRSZW5hbWVDaGFuZ2UoZk5hbWVkQ29tcG9uZW50LCBmTmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpLCBnZXROZXdFbGVtZW50TmFtZSgpKTsKLQkJfSBmaW5hbGx5ewotCQkJcG0uZG9uZSgpOwotCQl9CSAKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtmTmFtZWRDb21wb25lbnR9OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0SWRlbnRpZmllcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gSURFTlRJRklFUjsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldFByb2Nlc3Nvck5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc29yTmFtZSgpIHsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKAotCQkJCSJSZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZy5uYW1lIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQluZXcgU3RyaW5nW117Zk5hbWVkQ29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpICsgIjoiICsgZk5hbWVkQ29tcG9uZW50LmdldE5hbWUoKSwgZ2V0TmV3RWxlbWVudE5hbWUoKX0pOwotCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNpc0FwcGxpY2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZOYW1lZENvbXBvbmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBUT0RPIGltcGxlbWVudCBpc0FwcGxpY2FibGUgbG9naWMgZm9yIHRoZSBuYW1lZCBjb21wb25lbnQsIAotCQkvLyB2ZXJpZnkgaG93IGl0IGlzIGRpZmZlcmVudCBmcm9tIG90aGVyIGNvbmRpdGlvbiBjaGVja3MKLS8vCQlpZiAoZk5hbWVkQ29tcG9uZW50LmlzQW5vbnltb3VzKCkpCi0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQlpZiAoISBDaGVja3MuaXNBdmFpbGFibGUoZlR5cGUpKQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJaWYgKGlzU3BlY2lhbENhc2UoZlR5cGUpKQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSU5hbWVVcGRhdGluZyNjaGVja05ld0VsZW1lbnROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrTmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUsICJuZXcgbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFRPRE86IGltcGxlbWVudCBuZXcgbmFtZSBjaGVja2luZwotLy8JCVJlZmFjdG9yaW5nU3RhdHVzIHJlc3VsdCA9IENoZWNrcy5jaGVja1R5cGVOYW1lKG5ld05hbWUpOwotLy8JCWlmIChDaGVja3MuaXNBbHJlYWR5TmFtZWQoZlR5cGUsIG5ld05hbWUpKQotLy8JCQlyZXN1bHQuYWRkRmF0YWxFcnJvcihSZWZhY3RvcmluZ0NvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVR5cGVSZWZhY3RvcmluZy5jaG9vc2VfYW5vdGhlcl9uYW1lIikpOwkgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JTmFtZVVwZGF0aW5nI2dldE5ld0VsZW1lbnQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV3RWxlbWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgdGhpcyBtZXRob2QsIGl0J3MgdXNlZCBmb3IgdXBkYXRpbmcgc2VsZWN0aW9uIG9uIG5ldyBlbGVtZW50Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLS8vCXByaXZhdGUgdm9pZCBjb21wdXRlTmFtZU1hdGNoZXMoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCi0vLwkgICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0vLwkgICAgdHJ5IHsKLS8vCQkJVVJMIGZpbGVVUkwgPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwoZk5hbWVkQ29tcG9uZW50LmdldFNjaGVtYSgpLmdldFNjaGVtYUxvY2F0aW9uKCkpKTsKLS8vCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVVUkwuZ2V0UGF0aCgpKSk7Ci0vLwkJCWlmIChmTmFtZVNlYXJjaFJlc3VsdCA9PSBudWxsKQotLy8JCQkJZk5hbWVTZWFyY2hSZXN1bHQ9IG5ldyBRdWFsaWZpZWROYW1lU2VhcmNoUmVzdWx0KCk7Ci0vLwkJCVF1YWxpZmllZE5hbWVGaW5kZXIucHJvY2VzcyhmTmFtZVNlYXJjaFJlc3VsdCwgZ2V0TmFtZWRDb21wb25lbnQoKS5nZXROYW1lKCksICAKLS8vCQkJCWdldE5ld0VsZW1lbnROYW1lKCksIAotLy8JCQkJIioueHNkIiwgZmlsZS5nZXRQcm9qZWN0KCksIHBtKTsKLS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLS8vCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIGZpbmFsIFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSBsb2FkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkUGFydGljaXBhbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHM9IG5ldyBSZW5hbWVBcmd1bWVudHMoZ2V0TmV3RWxlbWVudE5hbWUoKSwgdHJ1ZSk7Ci0JCVN0cmluZ1tdIG5hdHVyZXM9IGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKTsKLQkJTGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3QoKTsKLQkJbG9hZEVsZW1lbnRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIGFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkUGFydGljaXBhbnRzKTsKLQkJbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIG5hdHVyZXMsIHNoYXJlZFBhcnRpY2lwYW50cyk7Ci0JCXJldHVybiAoUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdKXJlc3VsdC50b0FycmF5KG5ldyBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEVsZW1lbnRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBMaXN0IHJlc3VsdCwgUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cywgU3RyaW5nW10gbmF0dXJlcywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzPSBnZXRFbGVtZW50cygpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChQYXJ0aWNpcGFudE1hbmFnZXIubG9hZFJlbmFtZVBhcnRpY2lwYW50cyhzdGF0dXMsIAotCQkJCXRoaXMsICBlbGVtZW50c1tpXSwKLQkJCQlhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZCkpKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXROZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkKLQkJZk5ld0VsZW1lbnROYW1lPSBuZXdOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBmTmV3RWxlbWVudE5hbWU7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVJbnB1dFdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lSW5wdXRXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDQ4OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVJbnB1dFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5Vc2VySW5wdXRXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhcgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZUlucHV0V2l6YXJkUGFnZSAgZXh0ZW5kcyBVc2VySW5wdXRXaXphcmRQYWdlewotCXByaXZhdGUgU3RyaW5nIGZJbml0aWFsVmFsdWU7Ci0JcHJpdmF0ZSBUZXh0IGZUZXh0RmllbGQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVwZGF0ZVJlZmVyZW5jZXM7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0ZXh0IGlucHV0IHBhZ2UuCi0JICogQHBhcmFtIGlzTGFzdFVzZXJQYWdlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFnZSBpcyB0aGUgd2l6YXJkJ3MgbGFzdAotCSAqICB1c2VyIGlucHV0IHBhZ2UuIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JcHVibGljIFJlbmFtZUlucHV0V2l6YXJkUGFnZShTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaXNMYXN0VXNlclBhZ2UpIHsKLQkJdGhpcyhkZXNjcmlwdGlvbiwgaXNMYXN0VXNlclBhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRleHQgaW5wdXQgcGFnZS4KLQkgKiBAcGFyYW0gaXNMYXN0VXNlclBhZ2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwYWdlIGlzIHRoZSB3aXphcmQncyBsYXN0Ci0JICogIHVzZXIgaW5wdXQgcGFnZS4gT3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIEBwYXJhbSBpbml0aWFsVmFsdWUgdGhlIGluaXRpYWwgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUmVuYW1lSW5wdXRXaXphcmRQYWdlKFN0cmluZyBkZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0xhc3RVc2VyUGFnZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCSAgICBzdXBlcigiUmVuYW1lSW5wdXRXaXphcmRQYWdlIik7Ci0JCUFzc2VydC5pc05vdE51bGwoaW5pdGlhbFZhbHVlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQlmSW5pdGlhbFZhbHVlPSBpbml0aWFsVmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgaW5pdGlhbCBpbnB1dCBpcyB2YWxpZC4gVHlwaWNhbGx5IGl0IGlzIG5vdCwgYmVjYXVzZSB0aGUgCi0JICogdXNlciBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gZS5nLiBhIG5ldyB0eXBlIG5hbWUgZXRjLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBpbnB1dCBwcm92aWRlZCBhdCBpbml0aWFsaXphdGlvbiBpcyB2YWxpZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5pdGlhbElucHV0VmFsaWQoKXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgYW4gZW1wdHkgc3RyaW5nIGlzIGEgdmFsaWQgaW5wdXQuIFR5cGljYWxseSBpdCBpcyBub3QsIGJlY2F1c2UgCi0JICogdGhlIHVzZXIgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGUuZy4gYSBuZXcgdHlwZSBuYW1lIGV0Yy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiBhbiBlbXB0eSBzdHJpbmcgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VtcHR5SW5wdXRWYWxpZCgpewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIHRleHQgaW5wdXQgZmllbGQuCi0JICogCi0JICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgdGV4dCBpbnB1dCBmaWVsZC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIG5vdCB0ZXh0IGlucHV0IGZpZWxkIGhhcyBiZWVuIGNyZWF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmIChmVGV4dEZpZWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZUZXh0RmllbGQuZ2V0VGV4dCgpOwkKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbmV3IHRleHQgZm9yIHRoZSB0ZXh0IGZpZWxkLiBEb2VzIG5vdGhpbmcgaWYgdGhlIHRleHQgZmllbGQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQuCi0JICogQHBhcmFtIHRleHQgdGhlIG5ldyB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZUZXh0RmllbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZlRleHRGaWVsZC5zZXRUZXh0KHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyBpbnB1dCB2YWxpZGF0aW9uLiBSZXR1cm5zIGEgPGNvZGU+UmVmYWN0b3JpbmdTdGF0dXM8L2NvZGU+IHdoaWNoCi0JICogZGVzY3JpYmVzIHRoZSByZXN1bHQgb2YgaW5wdXQgdmFsaWRhdGlvbi4gPGNvZGU+TnVsbDxjb2RlPiBpcyBpbnRlcnByZXRlZAotCSAqIGFzIG5vIGVycm9yLgotCSAqLwotCXByb3RlY3RlZCBSZWZhY3RvcmluZ1N0YXR1cyB2YWxpZGF0ZVRleHRGaWVsZChTdHJpbmcgdGV4dCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0SW5wdXRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0SW5wdXRGaWVsZChwYXJlbnQsIFNXVC5CT1JERVIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0SW5wdXRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJZlRleHRGaWVsZD0gbmV3IFRleHQocGFyZW50LCBzdHlsZSk7Ci0JCWZUZXh0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdGV4dE1vZGlmaWVkKGdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQlmVGV4dEZpZWxkLnNldFRleHQoZkluaXRpYWxWYWx1ZSk7Ci0JCXJldHVybiBmVGV4dEZpZWxkOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhlIHBhZ2UncyBzdGF0ZSBhbmQgaXNzdWVzIGEgY29ycmVzcG9uZGluZyBlcnJvciBtZXNzYWdlLiBUaGUgcGFnZSB2YWxpZGF0aW9uCi0JICogaXMgY29tcHV0ZWQgYnkgY2FsbGluZyA8Y29kZT52YWxpZGF0ZVBhZ2U8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRleHRNb2RpZmllZChTdHJpbmcgdGV4dCkgewkKLQkJaWYgKCEgaXNFbXB0eUlucHV0VmFsaWQoKSAmJiB0ZXh0LmVxdWFscygiIikpeyAvLyROT04tTkxTLTEkCi0JCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJcmVzdG9yZU1lc3NhZ2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKCEgaXNJbml0aWFsSW5wdXRWYWxpZCgpKSAmJiB0ZXh0LmVxdWFscyhmSW5pdGlhbFZhbHVlKSl7Ci0JCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJcmVzdG9yZU1lc3NhZ2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlVGV4dEZpZWxkKHRleHQpKTsKLQkJCi0vLwkJIFRPRE86IGVuYWJsZSBwcmV2aWV3IGluIE00Ci0JCWdldFJlZmFjdG9yaW5nV2l6YXJkKCkuc2V0Rm9yY2VQcmV2aWV3UmV2aWV3KGZhbHNlKTsKLQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQotCX0KLQkKLQkvKioKLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiB0aGV5IHdhbnQgdG8gcmVzdG9yZSB0aGUgbWVzc2FnZSBkaWZmZXJlbnRseS4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPnNldE1lc3NhZ2UobnVsbCk8L2NvZGU+LCB3aGljaCBjbGVhcnMgdGhlIG1lc3NhZ2UgCi0JICogdGh1cyBleHBvc2luZyB0aGUgZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZU1lc3NhZ2UoKXsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBJRGlhbG9nUGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZUZXh0RmllbGQ9IG51bGw7CQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIFdpemFyZFBhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlpZiAodmlzaWJsZSkgewotCQkJdGV4dE1vZGlmaWVkKGdldFRleHQoKSk7Ci0JCX0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUgJiYgZlRleHRGaWVsZCAhPSBudWxsKSB7Ci0JCQlmVGV4dEZpZWxkLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgc3VwZXJDb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNldENvbnRyb2woc3VwZXJDb21wb3NpdGUpOwotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoc3VwZXJDb21wb3NpdGUpOwotCQkKLQkJc3VwZXJDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlPSBuZXcgQ29tcG9zaXRlKHN1cGVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsJCi0JCQotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmc9IDg7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCQotCQlMYWJlbCBsYWJlbD0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGdldExhYmVsVGV4dCgpKTsKLQkJCi0JCVRleHQgdGV4dD0gY3JlYXRlVGV4dElucHV0RmllbGQoY29tcG9zaXRlKTsKLQkJdGV4dC5zZWxlY3RBbGwoKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQ9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyNSk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlhZGRPcHRpb25hbFVwZGF0ZVJlZmVyZW5jZXNDaGVja2JveChzdXBlckNvbXBvc2l0ZSk7Ci0JCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCS8vIFRPRE86IGVuYWJsZSBwcmV2aWV3IGluIE00Ci0JCWdldFJlZmFjdG9yaW5nV2l6YXJkKCkuc2V0Rm9yY2VQcmV2aWV3UmV2aWV3KGZhbHNlKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJDb21wb3NpdGUpOwotCQkvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksIGZIZWxwQ29udGV4dElEKTsKLQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBib29sZWFuIHZhbHVlKSB7Ci0JCUJ1dHRvbiBjaGVja0JveD0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQodGl0bGUpOwotCQljaGVja0JveC5zZXRTZWxlY3Rpb24odmFsdWUpOwotCQlyZXR1cm4gY2hlY2tCb3g7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE9wdGlvbmFsVXBkYXRlUmVmZXJlbmNlc0NoZWNrYm94KENvbXBvc2l0ZSByZXN1bHQpIHsKLS8vCQkgVE9ETzogZW5hYmxlIHVwZGF0ZSByZWZlcmVuY2Ugb3B0aW9pbiBpbiBNNAotLy8JCWZpbmFsIElSZWZlcmVuY2VVcGRhdGluZyByZWY9IChJUmVmZXJlbmNlVXBkYXRpbmcpZ2V0UmVmYWN0b3JpbmcoKS5nZXRBZGFwdGVyKElSZWZlcmVuY2VVcGRhdGluZy5jbGFzcyk7Ci0vLwkJaWYgKHJlZiA9PSBudWxsIHx8ICFyZWYuY2FuRW5hYmxlVXBkYXRlUmVmZXJlbmNlcygpKQkKLS8vCQkJcmV0dXJuOwotCQlTdHJpbmcgdGl0bGU9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVJbnB1dFdpemFyZFBhZ2UudXBkYXRlX3JlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIGRlZmF1bHRWYWx1ZT0gdHJ1ZTsgCi0JCWZVcGRhdGVSZWZlcmVuY2VzPSBjcmVhdGVDaGVja2JveChyZXN1bHQsIHRpdGxlLCBkZWZhdWx0VmFsdWUpOwotLy8JCXJlZi5zZXRVcGRhdGVSZWZlcmVuY2VzKGZVcGRhdGVSZWZlcmVuY2VzLmdldFNlbGVjdGlvbigpKTsKLQkJZlVwZGF0ZVJlZmVyZW5jZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLS8vCQlyZWYuc2V0VXBkYXRlUmVmZXJlbmNlcyhmVXBkYXRlUmVmZXJlbmNlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwkJCi0JCQotCQlmVXBkYXRlUmVmZXJlbmNlcy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUlucHV0V2l6YXJkUGFnZS5uZXdfbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVJlZmFjdG9yaW5nV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVJlZmFjdG9yaW5nV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzY5NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLQotcHVibGljIGNsYXNzIFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkIGV4dGVuZHMgUmVmYWN0b3JpbmdXaXphcmQgewotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZJbnB1dFBhZ2VEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGZJbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3I7Ci0JCi0JcHVibGljIFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkKFJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nLCBTdHJpbmcgZGVmYXVsdFBhZ2VUaXRsZSwgU3RyaW5nIGlucHV0UGFnZURlc2NyaXB0aW9uLCAKLQkJCUltYWdlRGVzY3JpcHRvciBpbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3IpIHsKLQkJc3VwZXIocmVmYWN0b3JpbmcsIERJQUxPR19CQVNFRF9VU0VSX0lOVEVSRkFDRSk7Ci0JCXNldERlZmF1bHRQYWdlVGl0bGUoZGVmYXVsdFBhZ2VUaXRsZSk7Ci0gICAgCWZJbnB1dFBhZ2VEZXNjcmlwdGlvbj0gaW5wdXRQYWdlRGVzY3JpcHRpb247Ci0JCWZJbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3I9IGlucHV0UGFnZUltYWdlRGVzY3JpcHRvcjsKLQotCX0KLQotCS8qIG5vbiBqYXZhLWRvYwotCSAqIEBzZWUgUmVmYWN0b3JpbmdXaXphcmQjYWRkVXNlcklucHV0UGFnZXMKLQkgKi8gCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNlcklucHV0UGFnZXMoKSB7Ci0JCVN0cmluZyBpbml0aWFsU2V0dGluZz0gZ2V0UHJvY2Vzc29yKCkuZ2V0Q3VycmVudEVsZW1lbnROYW1lKCk7Ci0JCVJlbmFtZUlucHV0V2l6YXJkUGFnZSBpbnB1dFBhZ2U9IGNyZWF0ZUlucHV0UGFnZShmSW5wdXRQYWdlRGVzY3JpcHRpb24sIGluaXRpYWxTZXR0aW5nKTsKLQkJaW5wdXRQYWdlLnNldEltYWdlRGVzY3JpcHRvcihmSW5wdXRQYWdlSW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShpbnB1dFBhZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJTmFtZVVwZGF0aW5nIGdldFByb2Nlc3NvcigpIHsKLQkJCi0JCXJldHVybiAoSU5hbWVVcGRhdGluZylnZXRSZWZhY3RvcmluZygpLmdldEFkYXB0ZXIoSU5hbWVVcGRhdGluZy5jbGFzcyk7CQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgUmVuYW1lSW5wdXRXaXphcmRQYWdlIGNyZWF0ZUlucHV0UGFnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGluaXRpYWxTZXR0aW5nKSB7Ci0JCXJldHVybiBuZXcgUmVuYW1lSW5wdXRXaXphcmRQYWdlKG1lc3NhZ2UsIHRydWUsIGluaXRpYWxTZXR0aW5nKSB7Ci0JCQlwcm90ZWN0ZWQgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWRhdGVUZXh0RmllbGQoU3RyaW5nIHRleHQpIHsKLQkJCQlyZXR1cm4gdmFsaWRhdGVOZXdOYW1lKHRleHQpOwotCQkJfQkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlZmFjdG9yaW5nU3RhdHVzIHZhbGlkYXRlTmV3TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlJTmFtZVVwZGF0aW5nIHJlZj0gZ2V0UHJvY2Vzc29yKCk7Ci0JCXJlZi5zZXROZXdFbGVtZW50TmFtZShuZXdOYW1lKTsKLS8vCQl0cnl7Ci0JCQlyZXR1cm4gcmVmLmNoZWNrTmV3RWxlbWVudE5hbWUobmV3TmFtZSk7Ci0vLwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLS8vCQkJLy9YWFg6IHNob3VsZCBsb2cgdGhlIGV4Y2VwdGlvbgotLy8JCQlTdHJpbmcgbXNnPSBlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiI6IGUuZ2V0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCi0vLwkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGVGYXRhbEVycm9yU3RhdHVzKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJSZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5pbnRlcm5hbF9lcnJvciIsIG1zZykpOy8vJE5PTi1OTFMtMSQKLS8vCQl9CQotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxNjI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVJlc291cmNlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSAgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUGFydGljaXBhbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuU2hhcmFibGVQYXJ0aWNpcGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IgZXh0ZW5kcyBSZW5hbWVQcm9jZXNzb3IgaW1wbGVtZW50cyBJTmFtZVVwZGF0aW5nIHsKLQotCXByaXZhdGUgSVJlc291cmNlIGZSZXNvdXJjZTsKLQlwcml2YXRlIFN0cmluZyBmTmV3RWxlbWVudE5hbWU7Ci0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVI9ICJvcmcuZWNsaXBzZS53c3QudWkueHNkLnJlbmFtZVJlc291cmNlUHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBSZW5hbWVSZXNvdXJjZVByb2Nlc3NvcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZlJlc291cmNlPSByZXNvdXJjZTsKLQkJaWYgKGZSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlzZXROZXdFbGVtZW50TmFtZShmUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCS8vLS0tLSBJTmFtZVVwZGF0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCXB1YmxpYyB2b2lkIHNldE5ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobmV3TmFtZSk7Ci0JCWZOZXdFbGVtZW50TmFtZT0gbmV3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5ld0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZk5ld0VsZW1lbnROYW1lOwotCX0KLQkKLQkvLy0tLS0gSVJlbmFtZVByb2Nlc3NvciBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkKLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBJREVOVElGSUVSOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoKSAgewotCQlpZiAoZlJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghIGZSZXNvdXJjZS5leGlzdHMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEgZlJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7CQkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc29yTmFtZSgpIHsKLQkJU3RyaW5nIG1lc3NhZ2U9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJSZW5hbWVSZXNvdXJjZVByb2Nlc3Nvci5uYW1lIiwgLy8kTk9OLU5MUy0xJAotCQkJCW5ldyBTdHJpbmdbXXtnZXRDdXJyZW50RWxlbWVudE5hbWUoKSwgZ2V0TmV3RWxlbWVudE5hbWUoKX0pOwotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtmUmVzb3VyY2V9OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGZSZXNvdXJjZS5nZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE5ld0VsZW1lbnQoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoY3JlYXRlTmV3UGF0aChnZXROZXdFbGVtZW50TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0VXBkYXRlUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10gbG9hZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3RbXSBlbGVtZW50cz0gZ2V0RWxlbWVudHMoKTsKLQkJU3RyaW5nW10gbmF0dXJlcz0gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpOwotCQlMaXN0IHJlc3VsdD0gbmV3IEFycmF5TGlzdCgpOwotCQlSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzPSBuZXcgUmVuYW1lQXJndW1lbnRzKGdldE5ld0VsZW1lbnROYW1lKCksIGdldFVwZGF0ZVJlZmVyZW5jZXMoKSk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KFBhcnRpY2lwYW50TWFuYWdlci5sb2FkUmVuYW1lUGFydGljaXBhbnRzKHN0YXR1cywgCi0JCQkJdGhpcywgZWxlbWVudHNbaV0sCi0JCQkJYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpKSk7Ci0JCX0KLQkJcmV0dXJuIChSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10pcmVzdWx0LnRvQXJyYXkobmV3IFJlZmFjdG9yaW5nUGFydGljaXBhbnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQkvLy0tLSBDb25kaXRpb24gY2hlY2tpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0luaXRpYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkKLQkvKiBub24gamF2YS1kb2MKLQkgKiBAc2VlIElSZW5hbWVSZWZhY3RvcmluZyNjaGVja05ld05hbWUoKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKSAgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUsICJuZXcgbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCUlDb250YWluZXIgYz0gZlJlc291cmNlLmdldFBhcmVudCgpOwotCQlpZiAoYyA9PSBudWxsKQotCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZUZhdGFsRXJyb3JTdGF0dXMoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuSW50ZXJuYWxfRXJyb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQotCQlpZiAoYy5maW5kTWVtYmVyKG5ld05hbWUpICE9IG51bGwpCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlRmF0YWxFcnJvclN0YXR1cyhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZy5hbHJlYWRfZXhpc3RzIikpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJaWYgKCFjLmdldEZ1bGxQYXRoKCkuaXNWYWxpZFNlZ21lbnQobmV3TmFtZSkpCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlRmF0YWxFcnJvclN0YXR1cyhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZy5pbnZhbGlkTmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQotCQlSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQ9IFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZShjLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShuZXdOYW1lLCBmUmVzb3VyY2UuZ2V0VHlwZSgpKSk7Ci0JCWlmICghIHJlc3VsdC5oYXNGYXRhbEVycm9yKCkpCi0JCQlyZXN1bHQubWVyZ2UoUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlKGMuZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVQYXRoKGNyZWF0ZU5ld1BhdGgobmV3TmFtZSksIGZSZXNvdXJjZS5nZXRUeXBlKCkpKSk7CQkKLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0KLQkKLQkvKiBub24gamF2YS1kb2MKLQkgKiBAc2VlIFJlZmFjdG9yaW5nI2NoZWNrSW5wdXQoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tGaW5hbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSAgewotCQlwbS5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCXRyeXsKLQkJCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJfSBmaW5hbGx5ewotCQkJcG0uZG9uZSgpOwotCQl9CQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZU5ld1BhdGgoU3RyaW5nIG5ld05hbWUpewotCQlyZXR1cm4gZlJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChuZXdOYW1lKS50b1N0cmluZygpOwotCX0KLQkJCi0JLy8tLS0gY2hhbmdlcyAKLQkKLQkvKiBub24gamF2YS1kb2MgCi0JICogQHNlZSBJUmVmYWN0b3JpbmcjY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQlwbS5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCXRyeXsKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VSZW5hbWVDaGFuZ2UoZlJlc291cmNlLCBnZXROZXdFbGVtZW50TmFtZSgpKTsKLQkJfSBmaW5hbGx5ewotCQkJcG0uZG9uZSgpOwotCQl9CQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiNzE5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1c0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVSZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkdsb2JhbEJ1aWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci0KLQotCi0vKioKLSAqIENlbnRyYWwgYWNjZXNzIHBvaW50IHRvIGV4ZWN1dGUgcmVuYW1lIHJlZmFjdG9yaW5ncy4KLSAqIDxwPgotICogTm90ZTogdGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZVN1cHBvcnQgewotCi0JcHJpdmF0ZSBSZW5hbWVSZWZhY3RvcmluZyBmUmVmYWN0b3Jpbmc7Ci0JcHJpdmF0ZSBSZWZhY3RvcmluZ1N0YXR1cyBmUHJlQ2hlY2tTdGF0dXM7Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgc29tZSBsaWdodCB3ZWlnaHQgcHJlY29uZGl0aW9uIGNoZWNraW5nLiBJZiB0aGUgcmV0dXJuZWQgc3RhdHVzCi0JICogaXMgYW4gZXJyb3IgdGhlbiB0aGUgcmVmYWN0b3JpbmcgY2FuJ3QgYmUgZXhlY3V0ZWQgYXQgYWxsLiBIb3dldmVyLAotCSAqIHJldHVybmluZyBhbiBPSyBzdGF0dXMgZG9lc24ndCBndWFyYW50ZWUgdGhhdCB0aGUgcmVmYWN0b3JpbmcgY2FuIGJlCi0JICogZXhlY3V0ZWQuIEl0IG1heSBzdGlsbCBmYWlsIHdoaWxlIHBlcmZvcm1pbmcgdGhlIGV4aGF1c3RpdmUgcHJlY29uZGl0aW9uCi0JICogY2hlY2tpbmcgZG9uZSBpbnNpZGUgdGhlIG1ldGhvZHMgPGNvZGU+b3BlbkRpYWxvZzwvY29kZT4gb3IKLQkgKiA8Y29kZT5wZXJmb3JtPC9jb2RlPi4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kIGlzIG1haW5seSB1c2VkIHRvIGRldGVybWluZSBlbmFibGUvZGlzYWJsZW1lbnQgb2YgYWN0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxpZ2h0IHdlaWdodCBwcmVjb25kaXRpb24gY2hlY2tpbmcuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBjaGVja2luZy4KLQkgKiAKLQkgKiBAc2VlICNvcGVuRGlhbG9nKFNoZWxsKQotCSAqIEBzZWUgI3BlcmZvcm0oU2hlbGwsIElSdW5uYWJsZUNvbnRleHQpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlQ2hlY2soKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWVuc3VyZUNoZWNrZWQoKTsKLQkJaWYgKGZQcmVDaGVja1N0YXR1cy5oYXNGYXRhbEVycm9yKCkpCi0JCQlyZXR1cm4gYXNTdGF0dXMoZlByZUNoZWNrU3RhdHVzLmdldEVudHJ5TWF0Y2hpbmdTZXZlcml0eShSZWZhY3RvcmluZ1N0YXR1cy5GQVRBTCkpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBYU0RFZGl0b3JQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgcmVmYWN0b3JpbmcgZGlhbG9nIGZvciB0aGlzIHJlbmFtZSBzdXBwb3J0LiAKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgc2hlbGwgdXNlZCBhcyBhIHBhcmVudCBmb3IgdGhlIHJlZmFjdG9yaW5nIGRpYWxvZy4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJzIHdoaWxlIG9wZW5pbmcgdGhlCi0JICogZGlhbG9nLgotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW5EaWFsb2coU2hlbGwgcGFyZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWVuc3VyZUNoZWNrZWQoKTsKLQkJaWYgKGZQcmVDaGVja1N0YXR1cy5oYXNGYXRhbEVycm9yKCkpIHsKLQkJCXNob3dJbmZvcm1hdGlvbihwYXJlbnQsIGZQcmVDaGVja1N0YXR1cyk7Ci0JCQlyZXR1cm47IAotCQl9Ci0JCXRyeSB7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0JCQkJCWZSZWZhY3RvcmluZywKLQkJCQkJUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFdpemFyZC5kZWZhdWx0UGFnZVRpdGxlIiksIC8vJE5PTi1OTFMtMSQgVE9ETzogcHJvdmlkZSBjb3JyZWN0IHN0cmluZ3MKLQkJCQkJUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFdpemFyZC5pbnB1dFBhZ2UuZGVzY3JpcHRpb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsKTsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcD0gbmV3IFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbih3aXphcmQpOwotCQkJaW50IHJlc3VsdD0gb3AucnVuKHBhcmVudCwgd2l6YXJkLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQlvcC5nZXRJbml0aWFsQ29uZGl0aW9uQ2hlY2tpbmdTdGF0dXMoKTsKLQkJCWlmIChyZXN1bHQgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQgfHwgcmVzdWx0ID09IFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbi5JTklUSUFMX0NPTkRJVElPTl9DSEVDS0lOR19GQUlMRUQpCi0JCQkJdHJpZ2dlckJ1aWxkKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcuIFVzZXIgYWN0aW9uIGdvdCBjYW5jZWxsZWQKLQkJfQotCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0cmlnZ2VyQnVpbGQoKSB7Ci0JCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKS5pc0F1dG9CdWlsZGluZygpKSB7Ci0JCQluZXcgR2xvYmFsQnVpbGRBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLCBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEKS5ydW4oKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgcmVuYW1lIHJlZmFjdG9yaW5nIHdpdGhvdXQgc2hvd2luZyBhIGRpYWxvZyB0byBnYXRoZXIKLQkgKiBhZGRpdGlvbmFsIHVzZXIgaW5wdXQgKGZvciBleGFtcGxlIHRoZSBuZXcgbmFtZSBvZiB0aGUgPHR0PklKYXZhRWxlbWVudDwvdHQ+KS4KLQkgKiBPbmx5IGFuIGVycm9yIGRpYWxvZyBpcyBzaG93biAoaWYgbmVjZXNzYXJ5KSB0byBwcmVzZW50IHRoZSByZXN1bHQKLQkgKiBvZiB0aGUgcmVmYWN0b3JpbmcncyBmdWxsIHByZWNvbmRpdGlvbiBjaGVja2luZy4KLQkgKiA8cD4KLQkgKiBUaGUgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIFVJIHRocmVhZC4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSBzaGVsbCB1c2VkIGFzIGEgcGFyZW50IGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBjb250ZXh0IGEge0BsaW5rIElSdW5uYWJsZUNvbnRleHR9IHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHRoZQotCSAqIHVzZXIuCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGV4ZWN1dGluZyB0aGUKLQkgKiBvcGVyYXRpb24uCi0JICogCi0JICogQHNlZSAjb3BlbkRpYWxvZyhTaGVsbCkKLQkgKiBAc2VlIElSdW5uYWJsZUNvbnRleHQjcnVuKGJvb2xlYW4sIGJvb2xlYW4sIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybShTaGVsbCBwYXJlbnQsIElSdW5uYWJsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWVuc3VyZUNoZWNrZWQoKTsKLQkJCWlmIChmUHJlQ2hlY2tTdGF0dXMuaGFzRmF0YWxFcnJvcigpKSB7Ci0JCQkJc2hvd0luZm9ybWF0aW9uKHBhcmVudCwgZlByZUNoZWNrU3RhdHVzKTsKLQkJCQlyZXR1cm47IAotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0KLQotCQotCXByaXZhdGUgUmVuYW1lU3VwcG9ydChSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IgcHJvY2Vzc29yLCBTdHJpbmcgbmV3TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmUmVmYWN0b3Jpbmc9IG5ldyBSZW5hbWVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotCQkKLQl9Ci0KLQlwcml2YXRlIFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvciBnZXRSZW5hbWVQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiAoUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yKSBmUmVmYWN0b3JpbmcuZ2V0UHJvY2Vzc29yKCk7Ci0JfQotCi0JCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyByZW5hbWUgc3VwcG9ydCBmb3IgdGhlIGdpdmVuIHtAbGluayBJUGFja2FnZUZyYWdtZW50fS4KLQkgKiAKLQkgKiBAcGFyYW0gZnJhZ21lbnQgdGhlIHtAbGluayBJUGFja2FnZUZyYWdtZW50fSB0byBiZSByZW5hbWVkLgotCSAqIEBwYXJhbSBuZXdOYW1lIHRoZSBwYWNrYWdlIGZyYWdtZW50J3MgbmV3IG5hbWUuIDxjb2RlPm51bGw8L2NvZGU+IGlzIGEKLQkgKiB2YWxpZCB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgbm8gbmV3IG5hbWUgaXMgcHJvdmlkZWQuCi0JICogQHBhcmFtIGZsYWdzIGZsYWdzIGNvbnRyb2xsaW5nIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gVmFsaWQgZmxhZ3MgYXJlCi0JICogPGNvZGU+VVBEQVRFX1JFRkVSRU5DRVM8L2NvZGU+LCBhbmQgPGNvZGU+VVBEQVRFX1RFWFRVQUxfTUFUQ0hFUzwvY29kZT4sCi0JICogb3IgdGhlaXIgYml0d2lzZSBPUiwgb3IgPGNvZGU+Tk9ORTwvY29kZT4uCi0JICogQHJldHVybiB0aGUge0BsaW5rIFJlbmFtZVN1cHBvcnR9LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nCi0JICogdGhlIHtAbGluayBSZW5hbWVTdXBwb3J0fS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlbmFtZVN1cHBvcnQgY3JlYXRlKFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIHByb2Nlc3Nvcj0gbmV3IFJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvcihjb21wb25lbnQsIG5ld05hbWUpOwotCQlyZXR1cm4gbmV3IFJlbmFtZVN1cHBvcnQocHJvY2Vzc29yLCBuZXdOYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZUNoZWNrZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmUHJlQ2hlY2tTdGF0dXMgPT0gbnVsbCkgewotCQkJaWYgKCFmUmVmYWN0b3JpbmcuaXNBcHBsaWNhYmxlKCkpIHsKLQkJCQlmUHJlQ2hlY2tTdGF0dXM9IFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZUZhdGFsRXJyb3JTdGF0dXMoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVN1cHBvcnQubm90X2F2YWlsYWJsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlmUHJlQ2hlY2tTdGF0dXM9IG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzaG93SW5mb3JtYXRpb24oU2hlbGwgcGFyZW50LCBSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIG1lc3NhZ2U9IHN0YXR1cy5nZXRNZXNzYWdlTWF0Y2hpbmdTZXZlcml0eShSZWZhY3RvcmluZ1N0YXR1cy5GQVRBTCk7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHBhcmVudCwgUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVN1cHBvcnQuZGlhbG9nLnRpdGxlIiksIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgYXNTdGF0dXMoUmVmYWN0b3JpbmdTdGF0dXNFbnRyeSBlbnRyeSkgewotCQlpbnQgc3RhdHVzU2V2ZXJpdHk9IElTdGF0dXMuRVJST1I7Ci0JCXN3aXRjaCAoZW50cnkuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBSZWZhY3RvcmluZ1N0YXR1cy5PSyA6Ci0JCQkJc3RhdHVzU2V2ZXJpdHk9IElTdGF0dXMuT0s7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJlZmFjdG9yaW5nU3RhdHVzLklORk8gOgotCQkJCXN0YXR1c1NldmVyaXR5PSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJlZmFjdG9yaW5nU3RhdHVzLldBUk5JTkcgOgotCQkJY2FzZSBSZWZhY3RvcmluZ1N0YXR1cy5FUlJPUiA6Ci0JCQkJc3RhdHVzU2V2ZXJpdHk9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJfQotCQlTdHJpbmcgcGx1Z2luSWQ9IGVudHJ5LmdldFBsdWdpbklkKCk7Ci0JCWludCBjb2RlPSBlbnRyeS5nZXRDb2RlKCk7Ci0JCWlmIChwbHVnaW5JZCA9PSBudWxsKSB7Ci0JCQlwbHVnaW5JZD0gWFNERWRpdG9yUGx1Z2luLlBMVUdJTl9JRDsKLQkJCWNvZGU9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoc3RhdHVzU2V2ZXJpdHksIHBsdWdpbklkLCBjb2RlLCBlbnRyeS5nZXRNZXNzYWdlKCksIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVzb3VyY2VSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVzb3VyY2VSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhZjAzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGNoYW5nZSB0aGF0IHJlbmFtZXMgYSBnaXZlbiByZXNvdXJjZQotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCi0JLyoKLQkgKiB3ZSBjYW5ub3QgdXNlIGhhbmRsZXMgYmVjYXVzZSB0aGV5IGJlY2FtZSBpbnZhbGlkIHdoZW4geW91IHJlbmFtZSB0aGUgcmVzb3VyY2UuCi0JICogcGF0aHMgZG8gbm90LgotCSAqLwotCXByaXZhdGUgSVBhdGggZlJlc291cmNlUGF0aDsKLQotCXByaXZhdGUgU3RyaW5nIGZOZXdOYW1lOwotCi0JLyoqCi0JICogQHBhcmFtIG5ld05hbWUgaW5jbHVkZXMgdGhlIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVJlbmFtZUNoYW5nZShJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZVJlbmFtZUNoYW5nZShJUGF0aCByZXNvdXJjZVBhdGgsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWZSZXNvdXJjZVBhdGg9IHJlc291cmNlUGF0aDsKLQkJZk5ld05hbWU9IG5ld05hbWU7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZlJlc291cmNlUGF0aCk7Ci0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJLy8gVE9ETzogaW1wbGVtZW50IGZpbGUgdmFsaWRhdGlvbiwgc2VlIEpEVENoYW5nZQotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCQotCS8qCi0JICogdG8gYXZvaWQgdGhlIGV4Y2VwdGlvbiBzZW5kZXJzIHNob3VsZCBjaGVjayBpZiBhIHJlc291cmNlIHdpdGggdGhlIG5ldyBuYW1lCi0JICogYWxyZWFkeSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGZhbHNlKQotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJcG0uYmVnaW5UYXNrKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0RSZW5hbWVSZXNvdXJjZUNoYW5nZS5yZW5hbWVfcmVzb3VyY2UiKSwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJZ2V0UmVzb3VyY2UoKS5tb3ZlKHJlbmFtZWRSZXNvdXJjZVBhdGgoZlJlc291cmNlUGF0aCwgZk5ld05hbWUpLCBnZXRDb3JlUmVuYW1lRmxhZ3MoKSwgcG0pOwotCi0JCQlTdHJpbmcgb2xkTmFtZT0gZlJlc291cmNlUGF0aC5sYXN0U2VnbWVudCgpOwotCQkJSVBhdGggbmV3UGF0aD0gcmVuYW1lZFJlc291cmNlUGF0aChmUmVzb3VyY2VQYXRoLCBmTmV3TmFtZSk7Ci0JCQlyZXR1cm4gbmV3IFJlc291cmNlUmVuYW1lQ2hhbmdlKG5ld1BhdGgsIG9sZE5hbWUpOwotCQl9IGZpbmFsbHkgewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q29yZVJlbmFtZUZsYWdzKCkgewotCQlpZiAoZ2V0UmVzb3VyY2UoKS5pc0xpbmtlZCgpKQotCQkJcmV0dXJuIElSZXNvdXJjZS5TSEFMTE9XOwotCQllbHNlCi0JCQlyZXR1cm4gSVJlc291cmNlLk5PTkU7Ci0JfQotCi0JLyoKLQkgKiBjaGFuZ2VzIHJlc291cmNlIG5hbWVzIC9zL3AvQS5qYXZhIHJlbmFtZWQgdG8gQi5qYXZhIGJlY29tZXMgL3MvcC9CLmphdmEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIHJlbmFtZWRSZXNvdXJjZVBhdGgoSVBhdGggcGF0aCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygKLQkJCSJYU0RSZW5hbWVSZXNvdXJjZUNoYW5nZS5uYW1lIiwgbmV3IFN0cmluZ1tde2ZSZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgLy8kTk9OLU5MUy0xJAotCQkJcmVuYW1lZFJlc291cmNlUGF0aChmUmVzb3VyY2VQYXRoLCBmTmV3TmFtZSkudG9TdHJpbmcoKX0pOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2luaXRpYWxpemVWYWxpZGF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBlZTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhcgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQkKLQlwcml2YXRlIElGaWxlIGZGaWxlID0gbnVsbDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdGhpcy5mRmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYodGhpcy5mRmlsZSAhPSBudWxsKSB7Ci0JCQluYW1lID0gZkZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLAotCQkJQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBUT0RPIGFkZCBjaGVjayBmb3IgZmlsZSBjb250ZW50IHR5cGUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvL2NvbXB1dGVRdWFsaWZpZWROYW1lTWF0Y2hlcyhwbSk7CQotCQkvL0NoYW5nZVtdIGNoYW5nZXMgPSBmUXVhbGlmaWVkTmFtZVNlYXJjaFJlc3VsdC5nZXRBbGxDaGFuZ2VzKCk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQ2hhbmdlKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0RSZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50LmNvbXBvc2l0ZUNoYW5nZU5hbWUiKSk7Ci0JCQotCX0KLQkKLS8vCXByaXZhdGUgdm9pZCBjb21wdXRlUXVhbGlmaWVkTmFtZU1hdGNoZXMoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUlQYXRoIGZyYWdtZW50PSBmRmlsZS5nZXRGdWxsUGF0aCgpOwotLy8JCWlmIChmUXVhbGlmaWVkTmFtZVNlYXJjaFJlc3VsdCA9PSBudWxsKQotLy8JCQlmUXVhbGlmaWVkTmFtZVNlYXJjaFJlc3VsdD0gbmV3IFF1YWxpZmllZE5hbWVTZWFyY2hSZXN1bHQoKTsKLS8vCQlRdWFsaWZpZWROYW1lRmluZGVyLnByb2Nlc3MoZlF1YWxpZmllZE5hbWVTZWFyY2hSZXN1bHQsIGZGaWxlLmdldE5hbWUoKSwgIAotLy8JCQlnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCksIAotLy8JCQkiKi54c2QiLCBmRmlsZS5nZXRQcm9qZWN0KCksIHBtKTsKLS8vCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9TY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1NjaGVtYVByZWZpeENoYW5nZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiMGViOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1NjaGVtYVByZWZpeENoYW5nZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LlhNTE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YU0RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcgotewotICBTdHJpbmcgbmV3UHJlZml4OwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIHB1YmxpYyBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuZXdQcmVmaXgpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLm5ld1ByZWZpeD0gbmV3UHJlZml4OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZXNvbHZlKCkKLSAgewotICAgIFhTRFNjaGVtYVByZWZpeFJlbmFtZXIgeHNkU2NoZW1hUHJlZml4UmVuYW1lciA9IG5ldyBYU0RTY2hlbWFQcmVmaXhSZW5hbWVyKCk7Ci0gICAgeHNkU2NoZW1hUHJlZml4UmVuYW1lci52aXNpdFNjaGVtYSh4c2RTY2hlbWEpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROZXdRTmFtZShYU0RUeXBlRGVmaW5pdGlvbiBjb21wLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBuZXdYU0RQcmVmaXgpCi0gIHsKLSAgICBTdHJpbmcgcU5hbWUgPSBudWxsOwotICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHFOYW1lID0gbmV3WFNEUHJlZml4OwotICAgICAgaWYgKHFOYW1lICE9IG51bGwgJiYgcU5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBxTmFtZSArPSAiOiIgKyB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcU5hbWUgPSB2YWx1ZTsgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBxTmFtZSA9IHZhbHVlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLQotICAKLSAgY2xhc3MgWFNEU2NoZW1hUHJlZml4UmVuYW1lciBleHRlbmRzIFhTRFZpc2l0b3IKLSAgewotICAgIHB1YmxpYyBYU0RTY2hlbWFQcmVmaXhSZW5hbWVyKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSBlbGVtZW50LmdldFR5cGUoKTsKLSAgICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IHR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChucyA9PSBudWxsKSBucyA9ICIiOwotLy8gICAgICAgIGlmIChucy5lcXVhbHMoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpKSkKLSAgICAgICAgaWYgKG5zLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKSAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSBlbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAoZG9tRWxlbWVudCAhPSBudWxsICYmIGRvbUVsZW1lbnQgaW5zdGFuY2VvZiBYTUxOb2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEF0dHIgdHlwZUF0dHIgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQXR0ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlbGVtZW50LmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXROZXdRTmFtZSh0eXBlLCB0eXBlLmdldE5hbWUoKSwgbmV3UHJlZml4KSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKHNpbXBsZVR5cGUpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSBzaW1wbGVUeXBlLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgCi0gICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gYmFzZVR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChucyA9PSBudWxsKSBucyA9ICIiOwotLy8gICAgICAgIGlmIChucy5lcXVhbHMoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpKSkKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpKTsKLSAgICAgICAgaWYgKG5zLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERE9NSGVscGVyIGRvbUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgICBFbGVtZW50IGRlcml2ZWRCeSA9IGRvbUhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50KHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICBpZiAoZGVyaXZlZEJ5ICE9IG51bGwgJiYgZGVyaXZlZEJ5IGluc3RhbmNlb2YgWE1MTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyIHR5cGVBdHRyID0gZGVyaXZlZEJ5LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQXR0ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkZXJpdmVkQnkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSwgZ2V0TmV3UU5hbWUoYmFzZVR5cGUsIGJhc2VUeXBlLmdldE5hbWUoKSwgbmV3UHJlZml4KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGl0ZW1UeXBlID0gc2ltcGxlVHlwZS5nZXRJdGVtVHlwZURlZmluaXRpb24oKTsKLSAgICAgIGlmIChpdGVtVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSBpdGVtVHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaWYgKG5zID09IG51bGwpIG5zID0gIiI7Ci0gICAgICAgIGlmIChucy5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkKLSAgICAgICAgewotICAgICAgICAgIFhTRERPTUhlbHBlciBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICAgICAgTm9kZSBsaXN0Tm9kZSA9IGRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZS5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgICBpZiAobGlzdE5vZGUgIT0gbnVsbCAmJiBsaXN0Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudCBsaXN0RWxlbWVudCA9IChFbGVtZW50KWxpc3ROb2RlOyAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsaXN0RWxlbWVudCBpbnN0YW5jZW9mIFhNTE5vZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEF0dHIgdHlwZUF0dHIgPSBsaXN0RWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBpZiAodHlwZUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RFbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLCBnZXROZXdRTmFtZShpdGVtVHlwZSwgaXRlbVR5cGUuZ2V0TmFtZSgpLCBuZXdQcmVmaXgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBMaXN0IG1lbWJlclR5cGVzID0gc2ltcGxlVHlwZS5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgIGlmIChtZW1iZXJUeXBlcy5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgICBOb2RlIHVuaW9uTm9kZSA9IGRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZS5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRyk7Ci0gICAgICAgIGlmICh1bmlvbk5vZGUgIT0gbnVsbCAmJiB1bmlvbk5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCB1bmlvbkVsZW1lbnQgPSAoRWxlbWVudCl1bmlvbk5vZGU7ICAgICAgICAgIAotICAgICAgICAgIGlmICh1bmlvbkVsZW1lbnQgaW5zdGFuY2VvZiBYTUxOb2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEF0dHIgdHlwZUF0dHIgPSB1bmlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWVtYmVyVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24paS5uZXh0KCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBucyA9IHN0LmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgICAgICAgaWYgKG5zLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGdldE5ld1FOYW1lKHN0LCBzdC5nZXROYW1lKCksIG5ld1ByZWZpeCkpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3QuZ2V0UU5hbWUoeHNkU2NoZW1hKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuaW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0gICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLS8vICAgICAgICBpZiAobnMuZXF1YWxzKHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UoKSkpCi0gICAgICAgIGlmIChucy5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgZG9tRWxlbWVudCA9IGF0dHIuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChkb21FbGVtZW50ICE9IG51bGwgJiYgZG9tRWxlbWVudCBpbnN0YW5jZW9mIFhNTE5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXR0ciB0eXBlQXR0ciA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgaWYgKHR5cGVBdHRyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGF0dHIuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKHR5cGUsIHR5cGUuZ2V0TmFtZSgpLCBuZXdQcmVmaXgpKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1RhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjk5NmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YU0RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcgotewotICBTdHJpbmcgbmV3TlM7Ci0gIFN0cmluZyBvbGROUzsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotICBwdWJsaWMgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcihYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgb2xkTlMsIFN0cmluZyBuZXdOUykKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICAgIHRoaXMub2xkTlM9IG9sZE5TOwotICAgIHRoaXMubmV3TlM9IG5ld05TOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZXNvbHZlKCkKLSAgewotICAgIEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyIGVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyID0gbmV3IEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyKCk7Ci0gICAgZWxlbWVudFJlZmVyZW5jZVJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICBBdHRyaWJ1dGVSZWZlcmVuY2VSZW5hbWVyIGF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIgPSBuZXcgQXR0cmlidXRlUmVmZXJlbmNlUmVuYW1lcigpOwotICAgIGF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgfQotCi0gIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyIGV4dGVuZHMgWFNEVmlzaXRvcgotICB7Ci0gICAgcHVibGljIEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICB7Ci0gICAgICAJaWYgKGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgCXsKLSAgICAgIAkgIGlmIChlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG9sZE5TKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzZXQgdGhlIHJlc29sdmVkIGVsZW1lbnQncyBkZWNsYXJhdGlvbiB0byBuZXcgbnMKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgZGVmZWN0IDIzNzUxOCAtIHRhcmdldCBuYW1lc3BhY2UgcmVuYW1lIGNyZWF0ZXMgYSBuZXcgbmFtZXNwYWNlCi0gICAgICAgICAgICBlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld05TKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlpZiAob2xkTlMgPT0gbnVsbCB8fCAob2xkTlMgIT0gbnVsbCAmJiBvbGROUy5lcXVhbHMoIiIpKSkKLSAgICAgICAgCXsKLQkJCQkJCWVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5zZXRUYXJnZXROYW1lc3BhY2UobmV3TlMpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBTaW1pbGFyIHRvIGRlZmVjdCAyMzc1MTggYnV0IGZvciBhdHRyaWJ1dGVzCi0gIGNsYXNzIEF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgQXR0cmlidXRlUmVmZXJlbmNlUmVuYW1lcigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgICBpZiAodHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IGF0dHJVc2UuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYXR0ckRlY2wgIT0gbnVsbCAmJiBhdHRyRGVjbC5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0JCQkJCQkJaWYgKGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotCQkJCQkJCXsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhvbGROUykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLnNldFRhcmdldE5hbWVzcGFjZShuZXdOUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotCQkJCQkJCQlpZiAob2xkTlMgPT0gbnVsbCB8fCAob2xkTlMgIT0gbnVsbCAmJiBvbGROUy5lcXVhbHMoIiIpKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLnNldFRhcmdldE5hbWVzcGFjZShuZXdOUyk7Ci0JCQkJCQkJCX0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwKQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAgIEVMaXN0IGxpc3QgPSBhdHRyaWJ1dGVHcm91cC5nZXRBdHRyaWJ1dGVVc2VzKCk7Ci0gICAgICBpZiAobGlzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBhdHRyVXNlLmdldENvbnRlbnQoKTsKLQotICAgICAgICAgIGlmIChhdHRyRGVjbCAhPSBudWxsICYmIGF0dHJEZWNsLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB7Ci0JCQkJCQlpZiAoYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0JCQkJCQl7Ci0gICAgICAgICAgICAgIGlmIChhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG9sZE5TKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5zZXRUYXJnZXROYW1lc3BhY2UobmV3TlMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0JCQkJCQkJaWYgKG9sZE5TID09IG51bGwgfHwgKG9sZE5TICE9IG51bGwgJiYgb2xkTlMuZXF1YWxzKCIiKSkpCi0JCQkJCQkJewotCQkJCQkJCQlhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld05TKTsKLQkJCQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbENoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbENoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjMDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZVR5cGVHbG9iYWxDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWtlVHlwZUdsb2JhbENoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwcml2YXRlIE1hcCBmQ2hhbmdlczsKLQotCXByaXZhdGUgU3RyaW5nIGZOZXdOYW1lOwotCi0JcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiBmVHlwZUNvbXBvbmVudDsKLQotCXB1YmxpYyBNYWtlVHlwZUdsb2JhbENoYW5nZShYU0RUeXBlRGVmaW5pdGlvbiBjb21wb25lbnQsIAotCQkJU3RyaW5nIG5ld05hbWUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuZXdOYW1lLCAibmV3IG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZUeXBlQ29tcG9uZW50ID0gY29tcG9uZW50OwotCQlmTmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCwKLQkvLyBTdHJpbmcgbmV3TmFtZSkgewotCS8vIC8vIFRPRE86IFAxIGltcGxlbWVudCBzZWFyY2ggb2YgWFNEIGZpbGVzCi0JLy8gWFNEU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gWFNEU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCS8vIFJlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldwotCS8vIFJlZmFjdG9yU2VhcmNoUmVxdWVzdG9yKGNvbXBvbmVudCwgbmV3TmFtZSk7Ci0JLy8gc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShjb21wb25lbnQsIElYU0RTZWFyY2hDb25zdGFudHMuV09SS1NQQUNFX1NDT1BFLAotCS8vIHJlcXVlc3Rvcik7Ci0JLy8KLQkvLyByZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQkvLwotCS8vIH0KLQotCXByb3RlY3RlZCBDaGFuZ2UgY3JlYXRlVW5kb0NoYW5nZSgpIHsKLQkJcmV0dXJuIG5ldyBNYWtlVHlwZUdsb2JhbENoYW5nZShmVHlwZUNvbXBvbmVudCwgZ2V0TmV3TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlbmFtZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gUDEgY2hhbmdlIHRlbXBvcmFyeSByZW5hbWUgb2YgWFNEIG1vZGVsIGNvbXBvbmVudHMKLQkJcGVyZm9ybU1vZGlmeShnZXROZXdOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1Nb2RpZnkoZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0JCQlEZWxheWVkUmVuYW1lUnVubmFibGUgcnVubmFibGUgPSBuZXcgRGVsYXllZFJlbmFtZVJ1bm5hYmxlKAotCQkJCQlmVHlwZUNvbXBvbmVudCwgdmFsdWUpOwotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERlbGF5ZWRSZW5hbWVSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGNvbXBvbmVudDsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQkJcHVibGljIERlbGF5ZWRSZW5hbWVSdW5uYWJsZShYU0RUeXBlRGVmaW5pdGlvbiBjb21wb25lbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgY29tcG9uZW50LmdldEVsZW1lbnQoKS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZygKLQkJCQkJCQl0aGlzLAotCQkJCQkJCVhTREVkaXRvclBsdWdpbgotCQkJCQkJCQkJLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9NQUtFX0FOT05ZTU9VU19UWVBFX0dMT0JBTCIpKTsKLQkJCU1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZCgKLQkJCQkJY29tcG9uZW50LCBuYW1lKTsKLQkJCWNvbW1hbmQucnVuKCk7Ci0JCQlkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dENoYW5nZSBnZXRDaGFuZ2UoSUZpbGUgZmlsZSkgewotCQlUZXh0Q2hhbmdlIHJlc3VsdCA9IChUZXh0Q2hhbmdlKSBmQ2hhbmdlcy5nZXQoZmlsZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3IFRleHRGaWxlQ2hhbmdlKGZpbGUuZ2V0TmFtZSgpLCBmaWxlKTsKLQkJCWZDaGFuZ2VzLnB1dChmaWxlLCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcwotCQkJCS5nZXRGb3JtYXR0ZWRTdHJpbmcoCi0JCQkJCQkiTWFrZVR5cGVHbG9iYWxDaGFuZ2UubmFtZSIsIG5ldyBTdHJpbmdbXSB7Z2V0TmV3TmFtZSgpIH0pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGZpbmFsIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXBtLmJlZ2luVGFzayhSZWZhY3RvcmluZ01lc3NhZ2VzCi0JCQkJCS5nZXRTdHJpbmcoIlhTRENvbXBvbmVudFJlbmFtZUNoYW5nZS5SZW5hbWluZyIpLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkJQ2hhbmdlIHJlc3VsdCA9IGNyZWF0ZVVuZG9DaGFuZ2UoKTsKLQkJCWRvUmVuYW1lKG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXdOYW1lLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3TmFtZSgpIHsKLQkJcmV0dXJuIGZOZXdOYW1lOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjZ2V0TW9kaWZpZWRFbGVtZW50KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZlR5cGVDb21wb25lbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2lzVmFsaWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0JCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGNoYW5nZSB2YWxpZGF0aW9uCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VUeXBlR2xvYmFsUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VUeXBlR2xvYmFsUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Njc0N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlBhcnRpY2lwYW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlNoYXJhYmxlUGFydGljaXBhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5JTmFtZVVwZGF0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIE1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yIGV4dGVuZHMgUmVuYW1lUHJvY2Vzc29yIGltcGxlbWVudHMgSU5hbWVVcGRhdGluZ3sKLQkKLQlwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIGZUeXBlQ29tcG9uZW50OwotCXByaXZhdGUgU3RyaW5nIGZOZXdFbGVtZW50TmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVI9ICJvcmcuZWNsaXBzZS53c3QudWkueHNkLm1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9wcml2YXRlIFF1YWxpZmllZE5hbWVTZWFyY2hSZXN1bHQgZk5hbWVTZWFyY2hSZXN1bHQ7Ci0JCi0JcHVibGljIE1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yKFhTRFR5cGVEZWZpbml0aW9uIGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWZUeXBlQ29tcG9uZW50PSBlbGVtZW50OwotCQlmTmV3RWxlbWVudE5hbWUgPSBuZXdOYW1lOwotCQkKLQl9Ci0JCi0JcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIGdldFR5cGVDb21wb25lbnQoKSB7Ci0JCXJldHVybiBmVHlwZUNvbXBvbmVudDsKLQl9Ci0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSVRleHRVcGRhdGluZyNjYW5FbmFibGVUZXh0VXBkYXRpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVuYWJsZVRleHRVcGRhdGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0ueHNkLmludGVybmFsLnJlZmFjdG9yaW5nLnJlbmFtZS5YU0RSZW5hbWVQcm9jZXNzb3IjZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vVE9ETzogZmluZCBwcm9qZWN0IG5hdHVyZXMgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHJlZmFjdG9yZWQKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0ueHNkLmludGVybmFsLnJlZmFjdG9yaW5nLnJlbmFtZS5YU0RSZW5hbWVQcm9jZXNzb3IjbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMob3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXMsIGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuU3RyaW5nW10sIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50cykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsCi0JCQlMaXN0IHJlc3VsdCwgU3RyaW5nW10gbmF0dXJlcywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPOiBwcm92aWRlIGEgd2F5IHRvIGxvYWQgcmVuYW1lIHBhcnRpY2lwYW50cwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY2hlY2tGaW5hbENvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0ZpbmFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLAotCQkJQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBhZGQgY29kZSB0byBjaGVjayBmaW5hbCBjb25kaXRpb25zIGZvciBjb21wb25lbnQgcmVuYW1lCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrSW5pdGlhbENvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrSW5pdGlhbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0vLwkJIFRPRE8gYWRkIGNvZGUgdG8gY2hlY2sgaW5pdGlhbCBjb25kaXRpb25zIGZvciBjb21wb25lbnQgcmVuYW1lCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBQMSBhZGQgY2hhbmdlIGNyZWF0aW9uCi0vLwkJQ2hhbmdlW10gY2hhbmdlcyA9IFhTRENvbXBvbmVudFJlbmFtZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKHRoaXMuZk5hbWVkQ29tcG9uZW50LCBnZXROZXdFbGVtZW50TmFtZSgpKTsKLS8vCQlDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOyAKLS8vCQkJaWYoY2hhbmdlcy5sZW5ndGggPiAwKQotLy8JCQkJbXVsdGlDaGFuZ2UgID0gbmV3IENvbXBvc2l0ZUNoYW5nZSgiWFNEIGNvbXBvbmVudCByZW5hbWUgcGFydGljaXBhbnQgY2hhbmdlcyIsIGNoYW5nZXMpOyAvLyROT04tTkxTLTEkIFRPRE86IGV4dGVybmFsaXplIHN0cmluZwotLy8JCXJldHVybiBtdWx0aUNoYW5nZTsKLQkJCi0vLwkJY29tcHV0ZU5hbWVNYXRjaGVzKHBtKTsJCi0vLwkJQ2hhbmdlW10gY2hhbmdlcyA9IGZOYW1lU2VhcmNoUmVzdWx0LmdldEFsbENoYW5nZXMoKTsKLS8vCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNoYW5nZSgiWFNEIGZpbGUgcmVuYW1lIHBhcnRpY2lwYW50IGNoYW5nZXMiLCBjaGFuZ2VzKTsgLy9UT0RPOiBleHRlcm5hbGl6ZSBzdHJpbmcKLQkJcG0uYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnl7Ci0JCQlyZXR1cm4gbmV3IE1ha2VUeXBlR2xvYmFsQ2hhbmdlKGZUeXBlQ29tcG9uZW50LCBnZXROZXdFbGVtZW50TmFtZSgpKTsKLQkJfSBmaW5hbGx5ewotCQkJcG0uZG9uZSgpOwotCQl9CSAKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtmVHlwZUNvbXBvbmVudH07Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRJZGVudGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBJREVOVElGSUVSOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0UHJvY2Vzc29yTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZXNzb3JOYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoCi0JCQkJIk1ha2VMb2NhbFR5cGVHbG9iYWxSZWZhY3RvcmluZy5uYW1lIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQluZXcgU3RyaW5nW117Z2V0TmV3RWxlbWVudE5hbWUoKX0pOwotCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNpc0FwcGxpY2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZUeXBlQ29tcG9uZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGlzQXBwbGljYWJsZSBsb2dpYyBmb3IgdGhlIG5hbWVkIGNvbXBvbmVudCwgCi0JCS8vIHZlcmlmeSBob3cgaXQgaXMgZGlmZmVyZW50IGZyb20gb3RoZXIgY29uZGl0aW9uIGNoZWNrcwotLy8JCWlmIChmTmFtZWRDb21wb25lbnQuaXNBbm9ueW1vdXMoKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCWlmICghIENoZWNrcy5pc0F2YWlsYWJsZShmVHlwZSkpCi0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQlpZiAoaXNTcGVjaWFsQ2FzZShmVHlwZSkpCi0vLwkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JTmFtZVVwZGF0aW5nI2NoZWNrTmV3RWxlbWVudE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tOZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSl7Ci0JCUFzc2VydC5pc05vdE51bGwobmV3TmFtZSwgIm5ldyBuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVE9ETzogaW1wbGVtZW50IG5ldyBuYW1lIGNoZWNraW5nCi0vLwkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0ID0gQ2hlY2tzLmNoZWNrVHlwZU5hbWUobmV3TmFtZSk7Ci0vLwkJaWYgKENoZWNrcy5pc0FscmVhZHlOYW1lZChmVHlwZSwgbmV3TmFtZSkpCi0vLwkJCXJlc3VsdC5hZGRGYXRhbEVycm9yKFJlZmFjdG9yaW5nQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lVHlwZVJlZmFjdG9yaW5nLmNob29zZV9hbm90aGVyX25hbWUiKSk7CSAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklOYW1lVXBkYXRpbmcjZ2V0TmV3RWxlbWVudCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXdFbGVtZW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIGltcGxlbWVudCB0aGlzIG1ldGhvZCwgaXQncyB1c2VkIGZvciB1cGRhdGluZyBzZWxlY3Rpb24gb24gbmV3IGVsZW1lbnQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotLy8JcHJpdmF0ZSB2b2lkIGNvbXB1dGVOYW1lTWF0Y2hlcyhJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkKLS8vCSAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLS8vCSAgICB0cnkgewotLy8JCQlVUkwgZmlsZVVSTCA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChmTmFtZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSkpOwotLy8JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZVVSTC5nZXRQYXRoKCkpKTsKLS8vCQkJaWYgKGZOYW1lU2VhcmNoUmVzdWx0ID09IG51bGwpCi0vLwkJCQlmTmFtZVNlYXJjaFJlc3VsdD0gbmV3IFF1YWxpZmllZE5hbWVTZWFyY2hSZXN1bHQoKTsKLS8vCQkJUXVhbGlmaWVkTmFtZUZpbmRlci5wcm9jZXNzKGZOYW1lU2VhcmNoUmVzdWx0LCBnZXROYW1lZENvbXBvbmVudCgpLmdldE5hbWUoKSwgIAotLy8JCQkJZ2V0TmV3RWxlbWVudE5hbWUoKSwgCi0vLwkJCQkiKi54c2QiLCBmaWxlLmdldFByb2plY3QoKSwgcG0pOwotLy8JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLS8vCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotLy8JCQllLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgZmluYWwgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdIGxvYWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWRQYXJ0aWNpcGFudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cz0gbmV3IFJlbmFtZUFyZ3VtZW50cyhnZXROZXdFbGVtZW50TmFtZSgpLCB0cnVlKTsKLQkJU3RyaW5nW10gbmF0dXJlcz0gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpOwotCQlMaXN0IHJlc3VsdD0gbmV3IEFycmF5TGlzdCgpOwotCQlsb2FkRWxlbWVudFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWRQYXJ0aWNpcGFudHMpOwotCQlsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgbmF0dXJlcywgc2hhcmVkUGFydGljaXBhbnRzKTsKLQkJcmV0dXJuIChSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10pcmVzdWx0LnRvQXJyYXkobmV3IFJlZmFjdG9yaW5nUGFydGljaXBhbnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRWxlbWVudFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIExpc3QgcmVzdWx0LCBSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzLCBTdHJpbmdbXSBuYXR1cmVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJT2JqZWN0W10gZWxlbWVudHM9IGdldEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KFBhcnRpY2lwYW50TWFuYWdlci5sb2FkUmVuYW1lUGFydGljaXBhbnRzKHN0YXR1cywgCi0JCQkJdGhpcywgIGVsZW1lbnRzW2ldLAotCQkJCWFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkKSkpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldE5ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCQotCQlmTmV3RWxlbWVudE5hbWU9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGZOZXdFbGVtZW50TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRFbGVtZW50TmFtZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZk5ld0VsZW1lbnROYW1lOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL09wZW5PblNlbGVjdGlvbkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZGUwN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNEVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIE9wZW5PblNlbGVjdGlvbkhlbHBlcgotewotICAKLSAgcHJvdGVjdGVkIFhTRFRleHRFZGl0b3IgdGV4dEVkaXRvcjsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgT3Blbk9uU2VsZWN0aW9uSGVscGVyLgotICAgKi8KLSAgcHVibGljIE9wZW5PblNlbGVjdGlvbkhlbHBlcihYU0RUZXh0RWRpdG9yIHRleHRFZGl0b3IpCi0gIHsKLSAgICB0aGlzLnRleHRFZGl0b3IgPSB0ZXh0RWRpdG9yOwotICB9Ci0KLSAgYm9vbGVhbiBsYXN0UmVzdWx0OwotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoU3RyaW5nIHNjaGVtYUxvY2F0aW9uKQotICB7Ci0JCUlQYXRoIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0JCQotCQlmaW5hbCBJRmlsZSBzY2hlbWFGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNjaGVtYVBhdGgpOwotCQotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKQotCQl7Ci0JCQkvKioKLQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpCi0JCQl7Ci0JCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotCQkJCXsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSksIFhTREVkaXRvclBsdWdpbi5YU0RfRURJVE9SX0lEKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gaW5pdEV4KQotCQkJCQl7Ci0JCQkJCSAgaW5pdEV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQkJCQlYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoaW5pdEV4KTsKLQkJCQkJfQotCQkJCQljYXRjaChFeGNlcHRpb24gZSkKLQkJCQkJewotCQkJCQkgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9ICAgICAgICAgIAotCQkJfQotCQl9KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmV2ZWFsT2JqZWN0KGZpbmFsIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGlmIChjb21wb25lbnQuZ2V0Um9vdENvbnRhaW5lcigpLmVxdWFscyh0ZXh0RWRpdG9yLmdldFhTRFNjaGVtYSgpKSkKLSAgICB7Ci0gICAgICBOb2RlIGVsZW1lbnQgPSBjb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKQotICAgICAgewotICAgICAgICBJbmRleGVkUmVnaW9uIGluZGV4Tm9kZSA9IChJbmRleGVkUmVnaW9uKSBlbGVtZW50OwotICAgICAgICB0ZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5zZXRSYW5nZUluZGljYXRpb24oaW5kZXhOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4Tm9kZS5nZXRFbmRPZmZzZXQoKSAtIGluZGV4Tm9kZS5nZXRTdGFydE9mZnNldCgpLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0UmVzdWx0ID0gZmFsc2U7Ci0gICAgICBpZiAoY29tcG9uZW50LmdldFNjaGVtYSgpICE9IG51bGwpCi0gICAgICB7Ci0JCQkJU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChjb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgIElQYXRoIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0JCQkJZmluYWwgSUZpbGUgc2NoZW1hRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShzY2hlbWFQYXRoKTsKLSAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCSAgICAgICAgICovCi0JICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotCSAgICAgICAgewotCQkgICAgICAgIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLQkJICAgICAgICB7Ci0JCQkJCQkJdHJ5Ci0JCQkJCQkJewotCQkJCQkJCSAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KHNjaGVtYUZpbGUpLCB0ZXh0RWRpdG9yLmdldFhTREVkaXRvcigpLmdldEVkaXRvclNpdGUoKS5nZXRJZCgpKTsKLQkJCQkJCQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBYU0RFZGl0b3IpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCSgoWFNERWRpdG9yKWVkaXRvclBhcnQpLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShjb21wb25lbnQpOwotCQkJCQkJCQkJbGFzdFJlc3VsdCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGluaXRFeCkKLQkJCQkJCQl7Ci0vLwkJCQkJCQkJWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKGluaXRFeCk7Ci0JCQkJCQkJfQotCQkJCQkJfSAgICAgICAgICAKLQkJCQkJfQotCQkJCX0pOwotICAgICAgfQotICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBvcGVuT25HbG9iYWxSZWZlcmVuY2UoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCkKLSAgewotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB0ZXh0RWRpdG9yLmdldFhTRFNjaGVtYSgpOwotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgIHsKLSAgICAgIG5hbWUgPSAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wKS5nZXROYW1lKCk7Ci0gICAgfQotICAgIAotICAgIGlmIChzY2hlbWEgPT0gbnVsbCB8fCBuYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExpc3Qgb2JqZWN0cyA9IG51bGw7ICAgIAotICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgIH0KLSAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgb2JqZWN0cyA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICB9Ci0KLSAgICBpZiAob2JqZWN0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXAgPSAoWFNETmFtZWRDb21wb25lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKG5hbWVkQ29tcC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV2ZWFsT2JqZWN0KG5hbWVkQ29tcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIG9wZW5PblNlbGVjdGlvbigpCi0gIHsKLSAgICBMaXN0IHNlbGVjdGVkTm9kZXMgPSB0ZXh0RWRpdG9yLmdldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGVzKCk7Ci0KLSAgICBpZiAoIXNlbGVjdGVkTm9kZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlbGVjdGVkTm9kZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSB0ZXh0RWRpdG9yLmdldFhTRFNjaGVtYSgpOwotICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoKE5vZGUpb2JqKTsKLSAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBvYmplY3RUb1JldmVhbCA9IG51bGw7Ci0KLSAgICAgICAgICBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB4c2RDb21wOwotICAgICAgICAgICAgaWYgKGVsZW1lbnREZWNsLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gZWxlbWVudERlY2wuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgdHlwZURlZiA9IG51bGw7Ci0gICAgICAgICAgICAgIGlmIChlbGVtZW50RGVjbC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVmID0gZWxlbWVudERlY2wuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgc3ViR3JvdXBBZmZpbGlhdGlvbiA9IGVsZW1lbnREZWNsLmdldFN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24oKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGlmICh0eXBlRGVmICE9IG51bGwgJiYgc3ViR3JvdXBBZmZpbGlhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSAyIHRoaW5ncyB3ZSBjYW4gbmF2aWdhdGUgdG8sIGlmIHRoZSBjdXJzb3IgaXMgYW55d2hlcmUgb24gdGhlIHN1YnN0aXR1dGlvbiBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAvLyB0aGVuIGp1bXAgdG8gdGhhdCwgb3RoZXJ3aXNlIGp1c3QgZ28gdG8gdGhlIHR5cGVEZWYuCi0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEF0dHIgJiYgKChBdHRyKW9iaikuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gc3ViR3JvdXBBZmZpbGlhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZXZlYWwgdGhlIHR5cGUgbm93LiAgT24gc3VjY2VzcywgdGhlbiB3ZSByZXR1cm4gdHJ1ZS4KLSAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGZhaWwsIHNldCB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGFzIHRoZSBvYmplY3QgdG8gcmV2ZWFsIGFzIGEgYmFja3VwIHBsYW4uCi0gICAgICAgICAgICAgICAgICBpZiAocmV2ZWFsT2JqZWN0KHR5cGVEZWYpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBzdWJHcm91cEFmZmlsaWF0aW9uOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBvbmUgb3IgbW9yZSBvZiB0aGVzZSBpcyBudWxsLiAgSWYgdGhlIHR5cGVEZWYgaXMgbm9uLW51bGwsIHVzZSBpdC4gIE90aGVyd2lzZQotICAgICAgICAgICAgICAgIC8vIHRyeSBhbmQgdXNlIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAKLSAgICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IHR5cGVEZWYgIT0gbnVsbCA/IHR5cGVEZWYgOiBzdWJHcm91cEFmZmlsaWF0aW9uOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBlbGVtZW50RGVjbCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChlbGVtZW50RGVjbC5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gZWxlbWVudERlY2wuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBpZiAoYXR0ckRlY2wuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGF0dHJEZWNsLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBhdHRyRGVjbC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cERlZiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBpZiAoYXR0ckdyb3VwRGVmLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gYXR0ckdyb3VwRGVmLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRDb25zdHJhaW50RGVmID0gKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBpZiAoaWRDb25zdHJhaW50RGVmLmdldFJlZmVyZW5jZWRLZXkoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IGlkQ29uc3RyYWludERlZi5nZXRSZWZlcmVuY2VkS2V5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB4c2RDb21wOwotICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSB0eXBlRGVmLmdldEl0ZW1UeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgaWYgKG9iamVjdFRvUmV2ZWFsID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGlmIGl0ZW1UeXBlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGVuIGNoZWNrIGZvciBtZW1iZXJUeXBlCi0gICAgICAgICAgICAgIExpc3QgbWVtYmVyVHlwZXMgPSB0eXBlRGVmLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpOwotICAgICAgICAgICAgICBpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCAmJiBtZW1iZXJUeXBlcy5zaXplKCkgPiAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpbWVtYmVyVHlwZXMuZ2V0KDApOwotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEVHlwZURlZmluaXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IHR5cGVEZWYuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgCVhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSB4c2RDb21wOwotLy8JCQkJCQlTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKGRpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotLy8JCQkJCQlvcGVuWFNERWRpdG9yKHNjaGVtYUxvY2F0aW9uKTsKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBkaXJlY3RpdmUuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsJCQkJCQkgICAgICAgICAgCSAgICAgICAgICAJCi0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gbm93IHJldmVhbCB0aGUgb2JqZWN0IGlmIHRoaXMgaXNuJ3QgbnVsbAotICAgICAgICAgIGlmIChvYmplY3RUb1JldmVhbCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXZlYWxPYmplY3Qob2JqZWN0VG9SZXZlYWwpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2QxMzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlcgotewotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgZXZlbnRTb3VyY2U7Ci0KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRTb3VyY2UoSVNlbGVjdGlvblByb3ZpZGVyIGV2ZW50U291cmNlKQotICB7Ci0gICAgdGhpcy5ldmVudFNvdXJjZSA9IGV2ZW50U291cmNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIAotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uOwotICB9ICAgIAotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzcGVjaWFsaXplZCB0byByZXR1cm4gdGhlIGNvcnJlY3Qgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlICdvdGhlcicgbW9kZWwKLSAgICovCi0gIGFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KTsKLQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBtb2RlbFNlbGVjdGlvbikgIAotICB7IAotICAgIExpc3Qgb3RoZXJNb2RlbE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKG1vZGVsU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbiltb2RlbFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gaS5uZXh0KCk7IAotICAgICAgICBPYmplY3Qgb3RoZXJNb2RlbE9iamVjdCA9IGdldE9iamVjdEZvck90aGVyTW9kZWwobW9kZWxPYmplY3QpOyAgICAgICAKLSAgICAgICAgaWYgKG90aGVyTW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgeyAKLSAgICAgICAgICBvdGhlck1vZGVsT2JqZWN0TGlzdC5hZGQob3RoZXJNb2RlbE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgCi0gICAgU3RydWN0dXJlZFNlbGVjdGlvbiBub2RlU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3RoZXJNb2RlbE9iamVjdExpc3QpOwotICAgIHNlbGVjdGlvbiA9IG5vZGVTZWxlY3Rpb247Ci0gICAgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChldmVudFNvdXJjZSAhPSBudWxsID8gZXZlbnRTb3VyY2UgOiB0aGlzLCBub2RlU2VsZWN0aW9uKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9UeXBlc0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvVHlwZXNIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxNDExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9UeXBlc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgVHlwZXNIZWxwZXIKLXsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgVmVjdG9yIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgcHVibGljIFR5cGVzSGVscGVyKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgY29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNESW1wb3J0SW1wbCBhbkltcG9ydCA9IChYU0RJbXBvcnRJbXBsKSBjb250ZW50OwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhbkltcG9ydC5nZXRTY2hlbWFMb2NhdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFuSW1wb3J0LmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBWZWN0b3IgYWRkRXh0ZXJuYWxJbXBvcnRlZFVzZXJTaW1wbGVUeXBlcyhWZWN0b3IgaXRlbXMpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgY29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNESW1wb3J0SW1wbCBhbkltcG9ydCA9IChYU0RJbXBvcnRJbXBsKSBjb250ZW50OwotCi0gICAgICAgICAgWFNEU2NoZW1hIGltcFNjaGVtYSA9IGFuSW1wb3J0LmdldFJlc29sdmVkU2NoZW1hKCk7Ci0KLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW1wU2NoZW1hID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGltcFNjaGVtYSA9IGFuSW1wb3J0LmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGltcFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBpbXBTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpdGVtcy5hZGRBbGwoZ2V0UHJlZml4ZWROYW1lcyh0eXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgdHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHByaXZhdGUgVmVjdG9yIGFkZEV4dGVybmFsSW1wb3J0ZWRHbG9iYWxFbGVtZW50cyhWZWN0b3IgaXRlbXMpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgY29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNESW1wb3J0SW1wbCBhbkltcG9ydCA9IChYU0RJbXBvcnRJbXBsKSBjb250ZW50OwotCi0gICAgICAgICAgWFNEU2NoZW1hIGltcFNjaGVtYSA9IGFuSW1wb3J0LmdldFJlc29sdmVkU2NoZW1hKCk7Ci0KLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW1wU2NoZW1hID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGltcFNjaGVtYSA9IGFuSW1wb3J0LmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGltcFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBpbXBTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBhbkVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKGFuRWxlbWVudC5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGl0ZW1zLmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKGFuRWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgYW5FbGVtZW50LmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHByaXZhdGUgVmVjdG9yIGFkZEV4dGVybmFsSW1wb3J0ZWRBdHRyaWJ1dGVzKFZlY3RvciBpdGVtcykKLSAgewotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBjb250ZW50cyA9IHhzZFNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoY29udGVudHMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgY29udGVudHMubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RJbXBvcnRJbXBsIGFuSW1wb3J0ID0gKFhTREltcG9ydEltcGwpIGNvbnRlbnQ7Ci0KLSAgICAgICAgICBYU0RTY2hlbWEgaW1wU2NoZW1hID0gYW5JbXBvcnQuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLQotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbXBTY2hlbWEgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW1wU2NoZW1hID0gYW5JbXBvcnQuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoaW1wU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGltcFNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgICAgICBpZiAoYXR0cmliLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXRlbXMuYWRkQWxsKGdldFByZWZpeGVkTmFtZXMoYXR0cmliLmdldFRhcmdldE5hbWVzcGFjZSgpLCBhdHRyaWIuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgcHJpdmF0ZSBWZWN0b3IgYWRkRXh0ZXJuYWxJbXBvcnRlZEF0dHJpYnV0ZUdyb3VwcyhWZWN0b3IgaXRlbXMpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgY29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNESW1wb3J0SW1wbCBhbkltcG9ydCA9IChYU0RJbXBvcnRJbXBsKSBjb250ZW50OwotCi0gICAgICAgICAgWFNEU2NoZW1hIGltcFNjaGVtYSA9IGFuSW1wb3J0LmdldFJlc29sdmVkU2NoZW1hKCk7Ci0KLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW1wU2NoZW1hID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGltcFNjaGVtYSA9IGFuSW1wb3J0LmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGltcFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBpbXBTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWIgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKGF0dHJpYi5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGl0ZW1zLmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKGF0dHJpYi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgYXR0cmliLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHByaXZhdGUgVmVjdG9yIGFkZEV4dGVybmFsSW1wb3J0ZWRVc2VyQ29tcGxleFR5cGVzKFZlY3RvciBpdGVtcykKLSAgewotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBjb250ZW50cyA9IHhzZFNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoY29udGVudHMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgY29udGVudHMubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RJbXBvcnRJbXBsIGFuSW1wb3J0ID0gKFhTREltcG9ydEltcGwpIGNvbnRlbnQ7Ci0KLSAgICAgICAgICBYU0RTY2hlbWEgaW1wU2NoZW1hID0gYW5JbXBvcnQuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLQotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbXBTY2hlbWEgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW1wU2NoZW1hID0gYW5JbXBvcnQuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoaW1wU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGltcFNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpdGVtcy5hZGRBbGwoZ2V0UHJlZml4ZWROYW1lcyh0eXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgdHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHByaXZhdGUgVmVjdG9yIGFkZEV4dGVybmFsSW1wb3J0ZWRHcm91cHMoVmVjdG9yIGl0ZW1zKQotICB7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0geHNkU2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChjb250ZW50cy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYUNvbnRlbnQgY29udGVudCA9IChYU0RTY2hlbWFDb250ZW50KSBjb250ZW50cy5uZXh0KCk7Ci0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIFhTREltcG9ydEltcGwgYW5JbXBvcnQgPSAoWFNESW1wb3J0SW1wbCkgY29udGVudDsKLQotICAgICAgICAgIFhTRFNjaGVtYSBpbXBTY2hlbWEgPSBhbkltcG9ydC5nZXRSZXNvbHZlZFNjaGVtYSgpOwotCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGltcFNjaGVtYSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbXBTY2hlbWEgPSBhbkltcG9ydC5pbXBvcnRTY2hlbWEoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoaW1wU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGltcFNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBhR3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICAgICAgICBpZiAoYUdyb3VwLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXRlbXMuYWRkQWxsKGdldFByZWZpeGVkTmFtZXMoYUdyb3VwLmdldFRhcmdldE5hbWVzcGFjZSgpLCBhR3JvdXAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCkKLSAgewotICAgIFZlY3RvciBpdGVtcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHhzZEZvclhTRFByZWZpeCA9IHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpOwotICAgICAgaWYgKHhzZEZvclhTRFByZWZpeCAhPSBudWxsICYmIHhzZEZvclhTRFByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHhzZEZvclhTRFByZWZpeCA9IHhzZEZvclhTRFByZWZpeCArICI6IjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgeHNkRm9yWFNEUHJlZml4ID0gIiI7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgWFNERE9NSGVscGVyLmRhdGFUeXBlLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpdGVtcy5hZGQoeHNkRm9yWFNEUHJlZml4ICsgWFNERE9NSGVscGVyLmRhdGFUeXBlW2ldWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0gIAotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QyKCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHByZWZpeGVzID0gZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgWFNERE9NSGVscGVyLmRhdGFUeXBlLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBwcmVmaXhlcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgai5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IFhTRERPTUhlbHBlci5kYXRhVHlwZVtpXVswXTsgCi0gICAgICAgICAgU3RyaW5nIHByZWZpeGVkTmFtZSA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSA/IHByZWZpeCArICI6IiArIGxvY2FsTmFtZSA6IGxvY2FsTmFtZTsgCi0gICAgICAgICAgcmVzdWx0LmFkZChwcmVmaXhlZE5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGl0ZW1zLmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKHR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCB0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpKTsKLSAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbih0eXBlRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTY2hlbWEpKTsKLSAgICAgICAgICAvL2l0ZW1zLmFkZCh0eXBlRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTY2hlbWEpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaXRlbXMuYWRkKGdldFByZWZpeCh4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hTmFtZXNwYWNlKCksIHRydWUpICsgImFueVR5cGUiKTsKLSAgICAgIAotICAgICAgLy8gICAgICBpdGVtcyA9IGFkZEV4dGVybmFsSW1wb3J0ZWRVc2VyU2ltcGxlVHlwZXMoaXRlbXMpOwotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLQkJCSAgICBpdGVtcy5hZGRBbGwoZ2V0UHJlZml4ZWROYW1lcyh0eXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgdHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKSk7ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIHJlbW92ZSBhbnlUeXBlIHNpbmNlIGl0J3Mgbm90IHVzZXItZGVmaW5lZAotICAgICAgLy8gaXRlbXMuYWRkKGdldFByZWZpeCh4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hTmFtZXNwYWNlKCksIHRydWUpICsgImFueVR5cGUiKTsKLSAgICAgIC8vICAgICAgaXRlbXMgPSBhZGRFeHRlcm5hbEltcG9ydGVkVXNlckNvbXBsZXhUeXBlcyhpdGVtcyk7Ci0gICAgICBpdGVtcyA9IChWZWN0b3IpIHNvcnRMaXN0KGl0ZW1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0gIAotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlclNpbXBsZVR5cGVzKCkKLSAgewotICAgIFZlY3RvciBpdGVtcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgdXBkYXRlRXh0ZXJuYWxJbXBvcnRHbG9iYWxzKCk7Ci0gICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpdGVtcy5hZGQodHlwZURlZmluaXRpb24pOwotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHR5cGVEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSkpOwotICAgICAgICAgIC8vaXRlbXMuYWRkKHR5cGVEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBXZSBuZWVkIHRvIGFkZCB0aGUgYW55VHlwZQotLy8gICAgICBpdGVtcy5hZGQoZ2V0UHJlZml4KHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UoKSwgdHJ1ZSkgKyAiYW55VHlwZSIpOwotICAgICAgCi0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZFVzZXJTaW1wbGVUeXBlcyhpdGVtcyk7Ci0gICAgICAvL2l0ZW1zID0gKFZlY3Rvcikgc29ydExpc3QoaXRlbXMpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbnMsIGJvb2xlYW4gd2l0aENvbG9uKQotICB7Ci0gICAgU3RyaW5nIGtleSA9ICIiOwotCi0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIE1hcCBtYXAgPSB4c2RTY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgICAgSXRlcmF0b3IgaXRlciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3Qga2V5T2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1hcC5nZXQoa2V5T2JqKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMobnMpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGtleU9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGtleSA9IGtleU9iai50b1N0cmluZygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAga2V5ID0gIiI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIWtleS5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBpZiAod2l0aENvbG9uKQotICAgICAgICB7Ci0gICAgICAgICAga2V5ID0ga2V5ICsgIjoiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBrZXk7Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlckNvbXBsZXhUeXBlcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotCQkJICAgIGl0ZW1zLmFkZCh0eXBlRGVmaW5pdGlvbik7ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIHJlbW92ZSBhbnlUeXBlIHNpbmNlIGl0J3Mgbm90IHVzZXItZGVmaW5lZAotICAgICAgLy8gaXRlbXMuYWRkKGdldFByZWZpeCh4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hTmFtZXNwYWNlKCksIHRydWUpICsgImFueVR5cGUiKTsKLSAgICAgIC8vICAgICAgaXRlbXMgPSBhZGRFeHRlcm5hbEltcG9ydGVkVXNlckNvbXBsZXhUeXBlcyhpdGVtcyk7Ci0gICAgIC8vIGl0ZW1zID0gKFZlY3Rvcikgc29ydExpc3QoaXRlbXMpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRHbG9iYWxFbGVtZW50cygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudERlY2xhcmF0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEdsb2JhbEVsZW1lbnRzKGl0ZW1zKTsKLSAgICAgIGl0ZW1zID0gKFZlY3Rvcikgc29ydExpc3QoaXRlbXMpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEdsb2JhbEVsZW1lbnQoWFNEU2NoZW1hIHJlbGF0aXZlQ29tcG9uZW50KQotICB7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSAvLyBqdXN0IGdldCB0aGUgZmlyc3Qgb25lCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbi5nZXRRTmFtZShyZWxhdGl2ZUNvbXBvbmVudCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudERlY2xhcmF0aW9uLmdldFFOYW1lKHJlbGF0aXZlQ29tcG9uZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgICAgaXRlbXMgPSBhZGRFeHRlcm5hbEltcG9ydGVkR2xvYmFsRWxlbWVudHMoaXRlbXMpOwotICAgICAgaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGl0ZW1zLmdldCgwKS50b1N0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgLy8gZm9yIGRpc2FibGluZyBtZW51Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0R2xvYmFsQXR0cmlidXRlcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZURlY2xhcmF0aW9uID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCB8fCAoYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiAhYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfSU5TVEFOQ0VfVVJJXzIwMDEpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEF0dHJpYnV0ZXMoaXRlbXMpOwotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0R2xvYmFsQXR0cmlidXRlKFhTRFNjaGVtYSByZWxhdGl2ZUNvbXBvbmVudCkKLSAgewotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIGlmICh4c2RTY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIC8vIGp1c3QgZ2V0IHRoZSBmaXJzdCBvbmUKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZURlY2xhcmF0aW9uID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2NoZW1hIG5hbWVzcGFjZQotICAgICAgICAgIGlmICghKGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0lOU1RBTkNFX1VSSV8yMDAxKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFFOYW1lKHJlbGF0aXZlQ29tcG9uZW50KSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0UU5hbWUocmVsYXRpdmVDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBpdGVtcyA9IGFkZEV4dGVybmFsSW1wb3J0ZWRBdHRyaWJ1dGVzKGl0ZW1zKTsKLSAgICAgIGlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBpdGVtcy5nZXQoMCkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7IC8vIGZvciBkaXNhYmxpbmcgbWVudQotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEdsb2JhbEF0dHJpYnV0ZUdyb3VwcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEF0dHJpYnV0ZUdyb3VwcyhpdGVtcyk7Ci0gICAgICBpdGVtcyA9IChWZWN0b3IpIHNvcnRMaXN0KGl0ZW1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRHbG9iYWxBdHRyaWJ1dGVHcm91cChYU0RTY2hlbWEgcmVsYXRpdmVDb21wb25lbnQpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgdXBkYXRlRXh0ZXJuYWxJbXBvcnRHbG9iYWxzKCk7Ci0gICAgICBpZiAoeHNkU2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIC8vIGp1c3QgZ2V0IHRoZSBmaXJzdCBvbmUKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFFOYW1lKHJlbGF0aXZlQ29tcG9uZW50KSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UU5hbWUocmVsYXRpdmVDb21wb25lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBpdGVtcyA9IGFkZEV4dGVybmFsSW1wb3J0ZWRBdHRyaWJ1dGVHcm91cHMoaXRlbXMpOwotICAgICAgaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGl0ZW1zLmdldCgwKS50b1N0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgLy8gZm9yIGRpc2FibGluZyBtZW51Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0TW9kZWxHcm91cHMoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIGlmICh4c2RTY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUgPSBtb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTY2hlbWEpOwotICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbXMuYWRkKG5hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gICAgICBpdGVtcyA9IGFkZEV4dGVybmFsSW1wb3J0ZWRHcm91cHMoaXRlbXMpOwotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxpc3Qgc29ydExpc3QoamF2YS51dGlsLkxpc3QgdHlwZXMpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc29ydCh0eXBlcyk7IC8vIHBlcmZvcm1hbmNlPyAgbipsb2cobikKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLS8vICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJTb3J0IGZhaWxlZCIpOwotICAgIH0KLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE1vZGVsR3JvdXAoWFNEU2NoZW1hIHJlbGF0aXZlQ29tcG9uZW50KQotICB7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgLy8ganVzdCBnZXQgdGhlIGZpcnN0IG9uZQotICAgICAgICB7Ci0gICAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZmluaXRpb24gPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIGlmIChtb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRRTmFtZShyZWxhdGl2ZUNvbXBvbmVudCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZWxHcm91cERlZmluaXRpb24uZ2V0UU5hbWUocmVsYXRpdmVDb21wb25lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBpdGVtcyA9IGFkZEV4dGVybmFsSW1wb3J0ZWRHcm91cHMoaXRlbXMpOwotICAgICAgaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGl0ZW1zLmdldCgwKS50b1N0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgLy8gZm9yIGRpc2FibGluZyBtZW51Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1cGRhdGVNYXBBZnRlckRlbGV0ZShYU0RJbXBvcnQgZGVsZXRlZE5vZGUpCi0gIHsKLSAgICBTdHJpbmcgbnMgPSBkZWxldGVkTm9kZS5nZXROYW1lc3BhY2UoKTsKLSAgICBpZiAobnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KG5zLCBmYWxzZSk7Ci0gICAgICBpZiAocHJlZml4ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByZWZpeCA9IHByZWZpeC50cmltKCk7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgeG1sbnNBdHRyID0gKHByZWZpeCA9PSAiIikgPyAieG1sbnMiIDogInhtbG5zOiIgKyBwcmVmaXg7Ci0KLSAgICAgIGlmIChwcmVmaXggPT0gIiIpCi0gICAgICB7Ci0gICAgICAgIHByZWZpeCA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgIG1hcC5yZW1vdmUocHJlZml4KTsKLSAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgICAgc2NoZW1hRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoeG1sbnNBdHRyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRQcmVmaXhlZE5hbWVzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9ICIiOyAgICAJCQkKLSAgICB9Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsICYmIGxvY2FsTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgcHJlZml4ZXMgPSBnZXRQcmVmaXhlc0Zvck5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJlZml4ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgIAlTdHJpbmcgcHJlZml4ID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgIAlpZiAocHJlZml4ID09IG51bGwpIHByZWZpeCA9ICIiOwotICAgICAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gcHJlZml4Lmxlbmd0aCgpID4gMCA/IHByZWZpeCArICI6IiArIGxvY2FsTmFtZSA6IGxvY2FsTmFtZTsKLSAgICAgICAgbGlzdC5hZGQocHJlZml4ZWROYW1lKTsgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGlmIChwcmVmaXhlcy5zaXplKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQobG9jYWxOYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldFByZWZpeGVzRm9yTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgYm9vbGVhbiBhdExlYXN0T25lUHJlZml4Rm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgIE9iamVjdCB2YWx1ZSA9IG1hcC5nZXQocHJlZml4KTsKLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgbGlzdC5hZGQocHJlZml4KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1ZpZXdVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9WaWV3VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTcxYThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1ZpZXdVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgVmlld1V0aWxpdHkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgRm9udCBmb250OwotCi0gIHB1YmxpYyBzdGF0aWMgRm9udCBnZXRGb250KCkKLSAgewotICAgIGlmIChmb250ID09IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgCi0gICAgICBmb250ID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJtcyBzYW5zIHNlcmlmIiwgOCwgU1dULk5PUk1BTCk7ICAKLSAgICB9Ci0gICAgcmV0dXJuIGZvbnQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9udChGb250IG5ld0ZvbnQpCi0gIHsKLSAgICBmb250ID0gbmV3Rm9udDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXApCi0gIHsKLSAgICAvLyBkZXByZWNhdGVkLiAgUmVtb3ZlIGxhdGVyCi0gIH0KLSAgcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICBjb21wb3NpdGUuc2V0Rm9udChnZXRGb250KCkpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zLCBib29sZWFuIGhvcml6b250YWxGaWxsKQotICB7Ci0gICAgaWYgKCFob3Jpem9udGFsRmlsbCkKLSAgICB7Ci0gICAgICBjcmVhdGVDb21wb3NpdGUocGFyZW50LCBudW1Db2x1bW5zKTsKLSAgICB9Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgIGNvbXBvc2l0ZS5zZXRGb250KGdldEZvbnQoKSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zLCBib29sZWFuIGhvcml6b250YWxGaWxsLCBib29sZWFuIHZlcnRpY2FsRmlsbCkKLSAgewotICAgIGlmICghaG9yaXpvbnRhbEZpbGwgJiYgIXZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBjcmVhdGVDb21wb3NpdGUocGFyZW50LCBudW1Db2x1bW5zKTsKLSAgICB9Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgIGNvbXBvc2l0ZS5zZXRGb250KGdldEZvbnQoKSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVIb3Jpem9udGFsRmlsbGVyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikgCi0gIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgbGFiZWxzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgCi0gIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotCXB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyB0ZXh0KQotCXsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBzdHlsZSk7Ci0vLwkJc2V0Q29sb3IobGFiZWwpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBhbGlnbm1lbnQpCi0gIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IGFsaWdubWVudDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBidXR0b25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIAotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUYWJsZSBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZXR1cm4gdGFibGU7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHJhZGlvIGJ1dHRvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBjaGVjayBib3gKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHJldHVybiBjcmVhdGVDb21ib0JveChwYXJlbnQsIHRydWUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGlzUmVhZE9ubHkpCi0gIHsKLSAgICBpbnQgc3R5bGUgPSBpc1JlYWRPbmx5ID09IHRydWUgPyBTV1QuUkVBRF9PTkxZIDogU1dULkRST1BfRE9XTjsKLQotICAgIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgc3R5bGUpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBjb21ibzsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBjcmVhdGVMaXN0Qm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgYm9vbGVhbiBpc011bHRpU2VsZWN0KQotICB7Ci0gICAgaW50IHN0eWxlID0gaXNNdWx0aVNlbGVjdCA/IFNXVC5NVUxUSSA6IFNXVC5TSU5HTEU7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBzdHlsZSB8IFNXVC5CT1JERVIpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIGxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZUxpc3RCb3goQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBzdHlsZSk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLQlwdWJsaWMgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0vLwkJdGV4dC5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIDxjb2RlPmNyZWF0ZVdyYXBwZWRNdWx0aVRleHRGaWVsZDwvY29kZT4gY3JlYXRlcyBhIHdyYXBwZWQgbXVsdGl0ZXh0IGZpZWxkCi0gICAqCi0gICAqIEBwYXJhbSBwYXJlbnQgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSB3aWR0aCBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSBudW1MaW5lcyBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHJlcHJlc2VudGluZyBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBoZWlnaHQKLSAgICogQHBhcmFtIHZlcnRpY2FsRmlsbCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0gICAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiB2YWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVdyYXBwZWRNdWx0aVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBudW1MaW5lcywgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGlmICh2ZXJ0aWNhbEZpbGwpCi0gICAgewotICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB9ICAgICAgCi0gICAgZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLSAgICBGb250RGF0YVtdIGZvbnREYXRhID0gZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0gICAgLy8gaGFjayBmb3Igbm93IHdoZXJlIG9uIFdpbmRvd3MsIG9ubHkgMSBmb250ZGF0YSBleGlzdHMKLSAgICBkYXRhLmhlaWdodEhpbnQgPSBudW1MaW5lcyAqIGZvbnREYXRhWzBdLmdldEhlaWdodCgpOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZU11bHRpVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBpZiAodmVydGljYWxGaWxsKQotICAgIHsKLSAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgfSAgICAgIAotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucywgU3RyaW5nIHRleHQsIGJvb2xlYW4gdmVydGljYWxGaWxsKSAKLSAgewotICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgIGdyb3VwLnNldFRleHQodGV4dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGlmICh2ZXJ0aWNhbEZpbGwpCi0gICAgewotICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB9ICAgICAgCi0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgcmV0dXJuIGdyb3VwOwotICB9Ci0KLSBwdWJsaWMgc3RhdGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zLCBTdHJpbmcgdGV4dCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwsIGludCBhbGlnbm1lbnQpIAotICB7Ci0gICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0gICAgZ3JvdXAuc2V0VGV4dCh0ZXh0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IGFsaWdubWVudDsKLSAgICBpZiAodmVydGljYWxGaWxsKQotICAgIHsKLSAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgfSAgICAgIAotICAgIGdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgIHJldHVybiBncm91cDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlVmVydGljYWxGaWxsZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZlcnRpY2FsU3BhbikgCi0gIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRGb250KGdldEZvbnQoKSk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbFNwYW4gPSB2ZXJ0aWNhbFNwYW47Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgZ3JpZCBkYXRhIG9iamVjdCB0aGF0IG9jY3VwaWVzIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsCi0gICAqIHNwYWNlLgotICAgKi8KLSAgc3RhdGljIHB1YmxpYyBHcmlkRGF0YSBjcmVhdGVGaWxsKCkKLSAgewotICAgIEdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgZ2QudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0gICAgcmV0dXJuIGdkOwotICB9Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgZ3JpZCBkYXRhIG9iamVjdCB0aGF0IG9jY3VwaWVzIGhvcml6b250YWwgc3BhY2UuCi0gICAqLwotICBzdGF0aWMgcHVibGljIEdyaWREYXRhIGNyZWF0ZUhvcml6b250YWxGaWxsKCkKLSAgewotICAgIEdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgcmV0dXJuIGdkOwotICB9Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgZ3JpZCBkYXRhIG9iamVjdCB0aGF0IG9jY3VwaWVzIHZlcnRpY2FsIHNwYWNlLgotICAgKi8KLSAgc3RhdGljIHB1YmxpYyBHcmlkRGF0YSBjcmVhdGVWZXJ0aWNhbEZpbGwoKQotICB7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotICAgIHJldHVybiBnZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNERE9NSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RET01IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4NGMzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RET01IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5YTUxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuWE1MTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RET01IZWxwZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0ZBQ0VUICAgICAgICA9ICAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fTEVOR1RIX0ZBQ0VUICAgID0gIDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9MRU5HVEhfRkFDRVQgICAgPSAgMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFUVEVSTl9GQUNFVCAgICAgICA9ICA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlVNX0ZBQ0VUICAgICAgICAgID0gIDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFX1NQQUNFX0ZBQ0VUICAgPSAgNjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfSU5DTFVTSVZFX0ZBQ0VUID0gIDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9FWENMVVNJVkVfRkFDRVQgPSAgODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0lOQ0xVU0lWRV9GQUNFVCA9ICA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVhDTFVTSVZFX0ZBQ0VUID0gIDEwOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPVEFMX0RJR0lUU19GQUNFVCAgICAgPSAxMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJBQ1RJT05fRElHSVRTX0ZBQ0VUICA9IDEyOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5fRkFDRVRTICAgICAgICAgICAgPSAxMzsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdW10gZGF0YVR5cGUgPQotICB7Ci0gICAgLy8KLSAgICAvLyBUYWJsZSBmb3JtYXQ6Ci0gICAgLy8gVHlwZQotICAgIC8vICBMZW5ndGgsIE1pbkxlbmd0aCwgTWF4TGVuZ3RoLCBQYXR0ZXJuLCBFbnVtZXJhdGlvbix3aGl0ZVNwYWNlCi0gICAgLy8gIE1heEluY2x1c2l2ZSwgTWF4RXhjbHVzaXZlLCBNaW5JbmNsdXNpdmUsIE1pbkV4Y2x1c2l2ZSwgVG90YWxEaWdpdHMsIEZyYWN0aW9uRGlnaXRzCi0gICAgLy8KLQotICAgIC8vIDAKLSAgICB7ICJhbnlTaW1wbGVUeXBlIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICB9LAotCi0gICAgLy8gMQotICAgIHsgImFueVR5cGUiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgIH0sCi0KLQotICAgIC8vIDIKLSAgICB7ICJhbnlVUkkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLAotICAgIH0sCi0KLSAgICAvLyAzCi0gICAgeyAiYmFzZTY0QmluYXJ5IiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gNAotICAgIHsgImJvb2xlYW4iLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiWSIsICJOIiwgIlkiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLAotICAgIH0sCi0KLSAgICAvLyA1Ci0gICAgeyAiYnl0ZSIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsCi0gICAgfSwKLQotICAgIC8vIDYKLSAgICB7ICJkYXRlIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gNwotICAgIHsgImRhdGVUaW1lIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gOAotICAgIHsgImRlY2ltYWwiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgIH0sCi0KLQotICAgIC8vIDkKLSAgICB7ICJkb3VibGUiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJOIiwgIk4iLAotICAgIH0sCi0KLSAgICAvLyAxMAotICAgIHsgImR1cmF0aW9uIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gMTEKLSAgICB7ICJFTlRJVFkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLAotICAgIH0sCi0KLSAgICAvLyAxMgotICAgIHsgIkVOVElUSUVTIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIk4iLCAiWSIsICJZIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gMTMKLSAgICB7ICJmbG9hdCIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJZIiwgIk4iLCAiTiIsCi0gICAgfSwKLQotICAgIC8vIDE0Ci0gICAgeyAiZ0RheSIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJZIiwgIk4iLCAiTiIsCi0gICAgfSwKLQotICAgIC8vIDE1Ci0gICAgeyAiZ01vbnRoIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gMTYKLSAgICB7ICJnTW9udGhEYXkiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJOIiwgIk4iLAotICAgIH0sCi0KLSAgICAvLyAxNwotICAgIHsgImdZZWFyIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gMTgKLSAgICB7ICJnWWVhck1vbnRoIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gMTkKLSAgICB7ICJoZXhCaW5hcnkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLAotICAgIH0sCi0KLSAgICAvLyAyMAotICAgIHsgIklEIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gMjEKLSAgICB7ICJJRFJFRiIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsCi0gICAgfSwKLQotICAgIC8vIDIyCi0gICAgeyAiSURSRUZTIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIk4iLCAiWSIsICJZIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gMjMKLSAgICB7ICJpbnQiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgIH0sCi0KLSAgICAvLyAyNAotICAgIHsgImludGVnZXIiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgIH0sCi0KLSAgICAvLyAyNQotICAgIHsgImxhbmd1YWdlIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gMjYKLSAgICB7ICJsb25nIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICB9LAotCi0gICAgLy8gMjcKLSAgICB7ICJOYW1lIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwKLSAgICB9LAotCi0KLSAgICAvLyAyOAotICAgIHsgIk5DTmFtZSIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsCi0gICAgfSwKLQotICAgIC8vIDI5Ci0gICAgeyAibmVnYXRpdmVJbnRlZ2VyIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICB9LAotCi0gICAgLy8gMzAKLSAgICB7ICJOTVRPS0VOIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwKLSAgICB9LAotCi0gICAgLy8gMzEKLSAgICB7ICJOTVRPS0VOUyIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJOIiwgIlkiLCAiWSIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsCi0gICAgfSwKLQotICAgIC8vIDMyCi0gICAgeyAibm9uTmVnYXRpdmVJbnRlZ2VyIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICB9LAotCi0gICAgLy8gMzMKLSAgICB7ICJub25Qb3NpdGl2ZUludGVnZXIiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgIH0sCi0KLSAgICAvLyAzNAotICAgIHsgIm5vcm1hbGl6ZWRTdHJpbmciLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLAotCi0gICAgfSwKLQotICAgIC8vIDM1Ci0gICAgeyAiTk9UQVRJT04iLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLAotCi0gICAgfSwKLQotICAgIC8vIDM2Ci0gICAgeyAicG9zaXRpdmVJbnRlZ2VyIiwKLSAgICAgICAgIk4iLCAiTiIsICJOIiwgIlkiLCAiWSIsICJZIiwKLSAgICAgICAgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwKLSAgICB9LAotCi0gICAgLy8gMzcKLSAgICB7ICJRTmFtZSIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsCi0gICAgfSwKLQotICAgIC8vIDM4Ci0gICAgeyAic2hvcnQiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgIH0sCi0KLSAgICAvLyAzOQotICAgIHsgInN0cmluZyIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLCAiTiIsCi0gICAgfSwKLQotICAgIC8vIDQwCi0gICAgeyAidGltZSIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJZIiwgIk4iLCAiTiIsCi0gICAgfSwKLQotICAgIC8vIDQxCi0gICAgeyAidG9rZW4iLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiTiIsICJOIiwgIk4iLAotICAgIH0sCi0KLSAgICAvLyA0MgotICAgIHsgInVuc2lnbmVkQnl0ZSIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsCi0gICAgfSwKLQotICAgIC8vIDQzCi0gICAgeyAidW5zaWduZWRJbnQiLAotICAgICAgICAiTiIsICJOIiwgIk4iLCAiWSIsICJZIiwgIlkiLAotICAgICAgICAiWSIsICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLAotICAgIH0sCi0KLSAgICAvLyA0NAotICAgIHsgInVuc2lnbmVkTG9uZyIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsCi0gICAgfSwKLQotICAgIC8vIDQ1Ci0gICAgeyAidW5zaWduZWRTaG9ydCIsCi0gICAgICAgICJOIiwgIk4iLCAiTiIsICJZIiwgIlkiLCAiWSIsCi0gICAgICAgICJZIiwgIlkiLCAiWSIsICJZIiwgIlkiLCAiWSIsCi0gICAgfSwKLQotICB9OwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFNjaGVtYVVSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBYU0RET01IZWxwZXIuCi0gICAqLwotICBwdWJsaWMgWFNERE9NSGVscGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgTm9kZSBnZXRDaGlsZE5vZGUoRWxlbWVudCBwYXJlbnQsIFN0cmluZyBjaGlsZE5hbWUpCi0gIHsKLS8qICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWE1MU2NoZW1hVVJJLCBjaGlsZE5hbWUpOwotICAgIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICByZXR1cm4gbm9kZUxpc3QuaXRlbSgwKTsKLSAgICByZXR1cm4gbnVsbDsKLSovCi0gICAgTm9kZUxpc3QgbGlzdCA9IG51bGw7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIH0KLSAgIAotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIFBlcmZvcm1hbmNlIGlzc3VlIHBlcmhhcHM/Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobGlzdC5pdGVtKGkpLmdldExvY2FsTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0lNUExFX1RZUEUgPSAiU2ltcGxlIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVNFUl9TSU1QTEVfVFlQRSA9ICJzaW1wbGVUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVNFUl9DT01QTEVYX1RZUEUgPSAiY29tcGxleFR5cGUiOwotLyoKLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdHlwZSkKLSAgewotICAgIERvY3VtZW50IGRvYyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIGlmICh0eXBlLmVxdWFscyhTSU1QTEVfVFlQRSkpCi0gICAgewotICAgICAgcmVtb3ZlQ2hpbGQoZWxlbWVudCwgVVNFUl9TSU1QTEVfVFlQRSk7Ci0gICAgICByZW1vdmVDaGlsZChlbGVtZW50LCBVU0VSX0NPTVBMRVhfVFlQRSk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsInhzZDpzdHJpbmciKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoVVNFUl9TSU1QTEVfVFlQRSkpCi0gICAgewotICAgICAgcmVtb3ZlQ2hpbGQoZWxlbWVudCwgVVNFUl9DT01QTEVYX1RZUEUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlQ2hpbGQoZWxlbWVudCwgVVNFUl9TSU1QTEVfVFlQRSk7Ci0gICAgfQotICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIik7Ci0gICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlRWxlbWVudCgieHNkOiIrdHlwZSkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VHlwZShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICBpZiAodGFnTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcpIHx8Ci0gICAgICAgIHRhZ05hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcpKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgidHlwZSIpKQotICAgICAgewotICAgICAgICByZXR1cm4gU0lNUExFX1RZUEU7Ci0gICAgICB9Ci0gICAgICBOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxTY2hlbWFVUkksIFVTRVJfU0lNUExFX1RZUEUpOwotICAgICAgaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFVTRVJfU0lNUExFX1RZUEU7Ci0gICAgICB9Ci0gICAgICBub2RlcyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxTY2hlbWFVUkksIFVTRVJfQ09NUExFWF9UWVBFKTsKLSAgICAgIGlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBVU0VSX0NPTVBMRVhfVFlQRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0qLwotICBwdWJsaWMgdm9pZCByZW1vdmVEZXJpdmVkQnlFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJlbW92ZUNoaWxkKGVsZW1lbnQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRyk7Ci0gICAgcmVtb3ZlQ2hpbGQoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEJhc2VUeXBlKEVsZW1lbnQgZWxlbWVudCkgLy8gZm9yIFNpbXBsZUNvbnRlbnQgYW5kIENvbXBsZXhDb250ZW50Ci0gIHsKLSAgICBOb2RlIHJlc3RyaWN0aW9uQ2hpbGQgPSBnZXRDaGlsZE5vZGUoZWxlbWVudCwgInJlc3RyaWN0aW9uIik7Ci0gICAgTm9kZSBleHRlbnNpb25DaGlsZCA9IGdldENoaWxkTm9kZShlbGVtZW50LCAiZXh0ZW5zaW9uIik7Ci0gICAgU3RyaW5nIGJhc2VUeXBlID0gIiI7Ci0gICAgaWYgKHJlc3RyaWN0aW9uQ2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocmVzdHJpY3Rpb25DaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGJhc2VUeXBlID0gKChFbGVtZW50KXJlc3RyaWN0aW9uQ2hpbGQpLmdldEF0dHJpYnV0ZSgiYmFzZSIpOwotLy8gICAgICAgIFN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotLy8gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGJhc2VUeXBlID0gYmFzZVR5cGUuc3Vic3RyaW5nKGJhc2VUeXBlLmluZGV4T2YocHJlZml4KSArIHByZWZpeC5sZW5ndGgoKSArIDEpOwotLy8gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaW9uQ2hpbGQgIT0gbnVsbCkgLy8gc2hvdWxkIGJlIG9uZSBvciB0aGUgb3RoZXIKLSAgICB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uQ2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBiYXNlVHlwZSA9ICgoRWxlbWVudClleHRlbnNpb25DaGlsZCkuZ2V0QXR0cmlidXRlKCJiYXNlIik7Ci0vLyAgICAgICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0vLyAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApCi0vLyAgICAgICAgewotLy8gICAgICAgICAgYmFzZVR5cGUgPSBiYXNlVHlwZS5zdWJzdHJpbmcoYmFzZVR5cGUuaW5kZXhPZihwcmVmaXgpICsgcHJlZml4Lmxlbmd0aCgpICsgMSk7Ci0vLyAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYmFzZVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXJpdmVkQnlCYXNlVHlwZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBkZXJpdmVkQnlUeXBlLCBTdHJpbmcgdHlwZSkKLSAgewotICAgIERvY3VtZW50IGRvYyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgRWxlbWVudCBkZXJpdmVkQnlFbGVtZW50ID0gZ2V0RGVyaXZlZEJ5RWxlbWVudChlbGVtZW50KTsKLSAgICBpZiAoZGVyaXZlZEJ5RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGRlcml2ZWRCeUVsZW1lbnQuc2V0QXR0cmlidXRlKCJiYXNlIiwgdHlwZSk7Ci0gICAgfQotICAgIGVsc2UgIC8vIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgb25lIGFscmVhZHkuLi5iYXNlIGlzIHJlcXVpcmVkLgotICAgIHsKLSAgICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KGRlcml2ZWRCeVR5cGUpOwotICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoImJhc2UiLCB0eXBlKTsKLSAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgY2hhbmdlRGVyaXZlZEJ5VHlwZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBkZXJpdmVkQnlUeXBlLCBTdHJpbmcgdHlwZSkKLSAgewotICAgIERvY3VtZW50IGRvYyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgcHJlZml4ID0gcHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCArICI6IjsKLQotICAgIEVsZW1lbnQgZGVyaXZlZEJ5RWxlbWVudCA9IGdldERlcml2ZWRCeUVsZW1lbnQoZWxlbWVudCk7Ci0gICAgCi0gICAgaWYgKGRlcml2ZWRCeUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKGRlcml2ZWRCeVR5cGUpKQotICAgIHsKLSAgICAJcmV0dXJuOyAvLyBpdCdzIGFscmVhZHkgdGhlIGRlcml2ZWQgYnkgdHlwZQotICAgIH0KLSAgICBFbGVtZW50IG5ld05vZGU7Ci0gIAlpZiAoZGVyaXZlZEJ5VHlwZS5lcXVhbHMoInJlc3RyaWN0aW9uIikpCi0gIAl7Ci0gICAgCW5ld05vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFhTRERPTUhlbHBlci5YTUxTY2hlbWFVUkksIHByZWZpeCArIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgCW5ld05vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFhTRERPTUhlbHBlci5YTUxTY2hlbWFVUkksIHByZWZpeCArIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcpOwotICAgIH0KLQotICAgIGlmIChkZXJpdmVkQnlFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGRlcml2ZWRCeUVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIE5vZGVMaXN0IG5vZGVzID0gZGVyaXZlZEJ5RWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIC8vIHVzZSBjbG9uZXMgc28gd2UgZG9uJ3QgaGF2ZSBhIHJlZnJlc2ggcHJvYmxlbQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOyAgICAgICAKLSAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbmV3Tm9kZS5zZXRBdHRyaWJ1dGUoImJhc2UiLCB0eXBlKTsKLSAgICAgIGVsZW1lbnQucmVwbGFjZUNoaWxkKG5ld05vZGUsIGRlcml2ZWRCeUVsZW1lbnQpOwotCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2ltcGxlQ29udGVudFR5cGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdHlwZSkKLSAgewotICAgIFN0cmluZyBjb250ZW50VHlwZU5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCi0gICAgaWYgKGNvbnRlbnRUeXBlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHKSkKLSAgICB7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFLCB0eXBlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29udGVudFR5cGVOYW1lLmVxdWFscyhYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSwgdHlwZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKSkKLSAgICB7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIHR5cGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNpbXBsZVR5cGVDb250ZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFN0cmluZyBjb250ZW50VHlwZU5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgIGlmIChjb250ZW50VHlwZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcpKQotICAgIHsKLSAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpOwotICAgIH0KLSAgICBlbHNlIGlmIChjb250ZW50VHlwZU5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlcml2ZWRCeU5hbWUoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTm9kZSByZXN0cmljdGlvbkNoaWxkID0gZ2V0Q2hpbGROb2RlKGVsZW1lbnQsICJyZXN0cmljdGlvbiIpOwotICAgIE5vZGUgZXh0ZW5zaW9uQ2hpbGQgPSBnZXRDaGlsZE5vZGUoZWxlbWVudCwgImV4dGVuc2lvbiIpOwotICAgIGlmIChyZXN0cmljdGlvbkNoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuICJyZXN0cmljdGlvbiI7Ci0gICAgfQotICAgIGlmIChleHRlbnNpb25DaGlsZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiAiZXh0ZW5zaW9uIjsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZGVyaXZlZCBieSBub2RlIGdpdmVuIHRoZSBjb21wbGV4Q29udGVudCBvciBzaW1wbGVDb250ZW50IG5vZGUKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldERlcml2ZWRCeUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTm9kZSByZXN0cmljdGlvbkNoaWxkID0gZ2V0Q2hpbGROb2RlKGVsZW1lbnQsICJyZXN0cmljdGlvbiIpOwotICAgIE5vZGUgZXh0ZW5zaW9uQ2hpbGQgPSBnZXRDaGlsZE5vZGUoZWxlbWVudCwgImV4dGVuc2lvbiIpOwotICAgIGlmIChyZXN0cmljdGlvbkNoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHJlc3RyaWN0aW9uQ2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gKEVsZW1lbnQpcmVzdHJpY3Rpb25DaGlsZDsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGV4dGVuc2lvbkNoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbkNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50KWV4dGVuc2lvbkNoaWxkOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGRlcml2ZWQgYnkgbm9kZSBnaXZlbiB0aGUgQ29tcGxleFR5cGUgbm9kZQotICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBvbmUsIGlmIHNheSwgdGhlIElOVkFMSUQgc2NoZW1hIGhhcyBtb3JlIHRoYW4gb25lCi0gICAqLwotICBwdWJsaWMgRWxlbWVudCBnZXREZXJpdmVkQnlFbGVtZW50RnJvbUNvbXBsZXhUeXBlKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE5vZGVMaXN0IG5sID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IGNoaWxkTnVtYmVyID0gMDsKLSAgICBpbnQgaiA9IDA7Ci0gICAgZm9yIChqID0gMDsgaiA8IG5sLmdldExlbmd0aCgpOyBqKyspCi0gICAgewotICAgICAgTm9kZSBhTm9kZSA9IG5sLml0ZW0oaik7Ci0gICAgICBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBicmVhazsgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIEVsZW1lbnQgZGVyaXZlZEJ5Tm9kZSA9IGdldERlcml2ZWRCeUVsZW1lbnQoKEVsZW1lbnQpbmwuaXRlbShqKSk7Ci0gICAgcmV0dXJuIGRlcml2ZWRCeU5vZGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb250ZW50IG1vZGVsIGdpdmVuIHRoZSBDb21wbGV4VHlwZSBub2RlCi0gICAqIFJldHVybnMgdGhlIGZpcnN0IG9uZSwgaWYgc2F5LCB0aGUgSU5WQUxJRCBzY2hlbWEgaGFzIG1vcmUgdGhhbiBvbmUKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldENvbnRlbnRNb2RlbEZyb21QYXJlbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTm9kZUxpc3QgbmwgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgY2hpbGROdW1iZXIgPSAwOwotICAgIGludCBqID0gMDsKLSAgICBib29sZWFuIG1vZGVsRXhpc3RzID0gZmFsc2U7Ci0gICAgaW50IGxlbmd0aCA9IG5sLmdldExlbmd0aCgpOwotICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBOb2RlIGFOb2RlID0gbmwuaXRlbShqKTsKLSAgICAgIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBtb2RlbEV4aXN0cyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgbW9kZWxFeGlzdHMgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFtb2RlbEV4aXN0cykKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSAoRWxlbWVudClubC5pdGVtKGopOwotICAgIHJldHVybiBkZXJpdmVkQnlOb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2hhbmdlQ29udGVudE1vZGVsKEVsZW1lbnQgY29tcGxleFR5cGVFbGVtZW50LCBTdHJpbmcgY29udGVudE1vZGVsLCBFbGVtZW50IHNlcXVlbmNlQ2hvaWNlT3JBbGxFbGVtZW50KQotICB7Ci0gICAgRG9jdW1lbnQgZG9jID0gY29tcGxleFR5cGVFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBjb21wbGV4VHlwZUVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgcHJlZml4ID0gcHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCArICI6IjsKLSAgICAKLSAgICBFbGVtZW50IGNvbnRlbnRNb2RlbEVsZW1lbnQgPSBnZXRDb250ZW50TW9kZWxGcm9tUGFyZW50KGNvbXBsZXhUeXBlRWxlbWVudCk7Ci0KLSAgICBpZiAoY29udGVudE1vZGVsRWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoY29udGVudE1vZGVsKSkKLSAgICB7Ci0gICAgICByZXR1cm47IC8vIGl0J3MgYWxyZWFkeSB0aGUgY29udGVudCBtb2RlbCAKLSAgICB9Ci0gICAgRWxlbWVudCBuZXdOb2RlOwotICAgIG5ld05vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFhTRERPTUhlbHBlci5YTUxTY2hlbWFVUkksIHByZWZpeCArIGNvbnRlbnRNb2RlbCk7Ci0KLSAgICBpZiAoY29udGVudE1vZGVsRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgeyAgICAgICAgCi0gICAgICBOb2RlTGlzdCBub2RlcyA9IGNvbnRlbnRNb2RlbEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgLy8gdXNlIGNsb25lcyBzbyB3ZSBkb24ndCBoYXZlIGEgcmVmcmVzaCBwcm9ibGVtCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChub2RlLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRykpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5DSE9JQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjb250ZW50TW9kZWxFbGVtZW50LCBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBmYWxzZSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKSB8fAotICAgICAgICAgICAgICAgICAgICBub2RlLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgIGlmIChzZXF1ZW5jZUNob2ljZU9yQWxsRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHNlcXVlbmNlQ2hvaWNlT3JBbGxFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKG5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY29tcGxleFR5cGVFbGVtZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBjb250ZW50TW9kZWxFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNsb25lRWxlbWVudChFbGVtZW50IHBhcmVudCwgRWxlbWVudCBzb3VyY2VOb2RlKQotICB7Ci0gICAgRG9jdW1lbnQgZG9jID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50LmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXggKyAiOiI7Ci0gICAgCi0gICAgRWxlbWVudCBuZXdOb2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBzb3VyY2VOb2RlLmdldExvY2FsTmFtZSgpKTsKLQotICAgIGlmIChzb3VyY2VOb2RlLmhhc0NoaWxkTm9kZXMoKSkKLSAgICB7ICAgICAgICAKLSAgICAgIE5vZGVMaXN0IG5vZGVzID0gc291cmNlTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAvLyB1c2UgY2xvbmVzIHNvIHdlIGRvbid0IGhhdmUgYSByZWZyZXNoIHByb2JsZW0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLSAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXdOb2RlOwotLy8gICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBzb3VyY2VOb2RlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc0VsZW1lbnRDaGlsZHJlbihFbGVtZW50IHBhcmVudE5vZGUpCi0gIHsKLSAgICBib29sZWFuIGhhc0NoaWxkcmVuRWxlbWVudHMgPSBmYWxzZTsKLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuaGFzQ2hpbGROb2RlcygpKQotICAgIHsKLSAgICAgIE5vZGVMaXN0IG5vZGVzID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChub2Rlcy5pdGVtKGkpIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGhhc0NoaWxkcmVuRWxlbWVudHMgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBoYXNDaGlsZHJlbkVsZW1lbnRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoRWxlbWVudCBub2RlLCBTdHJpbmcgY2hpbGROYW1lKQotICB7Ci0gICAgTm9kZSBjaGlsZCA9IGdldENoaWxkTm9kZShub2RlLGNoaWxkTmFtZSk7Ci0gICAgaWYgKGNoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFjZXQoT2JqZWN0IG9iaikKLSAgewotICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMob2JqLCBYU0RDb25zdGFudHMuTEVOR1RIX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKG9iaiwgWFNEQ29uc3RhbnRzLk1JTkxFTkdUSF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhvYmosIFhTRENvbnN0YW50cy5NQVhMRU5HVEhfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMob2JqLCBYU0RDb25zdGFudHMuV0hJVEVTUEFDRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhvYmosIFhTRENvbnN0YW50cy5NQVhJTkNMVVNJVkVfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMob2JqLCBYU0RDb25zdGFudHMuTUFYRVhDTFVTSVZFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKG9iaiwgWFNEQ29uc3RhbnRzLk1JTklOQ0xVU0lWRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhvYmosIFhTRENvbnN0YW50cy5NSU5FWENMVVNJVkVfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMob2JqLCBYU0RDb25zdGFudHMuVE9UQUxESUdJVFNfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMob2JqLCBYU0RDb25zdGFudHMuRlJBQ1RJT05ESUdJVFNfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKE5vZGUgbm9kZSkKLSAgewotICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgIAotICAgIE5vZGUgbmV4dEVsZW1lbnQgPSBnZXROZXh0RWxlbWVudE5vZGUobm9kZSk7Ci0gICAgTm9kZSBwcmV2aW91c0VsZW1lbnQgPSBnZXRQcmV2aW91c0VsZW1lbnROb2RlKG5vZGUpOwotCi0gICAgTm9kZSBuZXh0U2libGluZyA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICBpZiAobmV4dFNpYmxpbmcgaW5zdGFuY2VvZiBUZXh0KQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobmV4dFNpYmxpbmcpOwotICAgIH0KLSAgICBOb2RlIHByZXZpb3VzU2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkJcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKLQotICAgIGlmIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLQkJCWZvcm1hdENoaWxkKG5leHRFbGVtZW50KTsKLSAgICB9Ci0KLQkJaWYgKHByZXZpb3VzRWxlbWVudCAhPSBudWxsKQotCQl7Ci0JCQlmb3JtYXRDaGlsZChwcmV2aW91c0VsZW1lbnQpOwotCQl9Ci0gIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXRDaGlsZChOb2RlIGNoaWxkKQotCXsKLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBYTUxOb2RlKQotICAgIHsKLSAgICAgIFhNTE1vZGVsIG1vZGVsID0gKChYTUxOb2RlKWNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgICAgICAKLQkgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCSAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIE5vZGUgZ2V0TGFzdEVsZW1lbnROb2RlKE5vZGUgcGFyZW50KQotICB7Ci0gICAgTm9kZSBsYXN0Q2hpbGQgPSBwYXJlbnQuZ2V0TGFzdENoaWxkKCk7Ci0gICAgCi0gICAgd2hpbGUgKCEobGFzdENoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkgJiYgbGFzdENoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgbGFzdENoaWxkID0gbGFzdENoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotICAgIH0KLSAgICByZXR1cm4gbGFzdENoaWxkOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBOb2RlIGdldE5leHRFbGVtZW50Tm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgCi0gICAgd2hpbGUgKCEobmV4dCBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIG5leHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBuZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgICBpZiAobmV4dCBpbnN0YW5jZW9mIFRleHQpCi0gICAgewotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIG5leHQ7Ci0gIH0KLQotCXB1YmxpYyBzdGF0aWMgTm9kZSBnZXRQcmV2aW91c0VsZW1lbnROb2RlKE5vZGUgbm9kZSkKLQl7Ci0JCU5vZGUgcHJldmlvdXMgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotICAgIAotCQl3aGlsZSAoIShwcmV2aW91cyBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIHByZXZpb3VzICE9IG51bGwpCi0JCXsKLQkJCXByZXZpb3VzID0gcHJldmlvdXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLSAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBUZXh0KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gcHJldmlvdXM7Ci0JfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtb3ZlTm9kZShOb2RlIHJlZmVyZW5jZU5vZGUsIE5vZGUgbm9kZVRvTW92ZSwgYm9vbGVhbiBpc0JlZm9yZSkKLSAgewotICAgIC8vIHRoaXMgYXNzdW1lcyB0aGF0IHRoZSByZWZlcmVuY2VOb2RlIGFuZCBub2RlIHRvIG1vdmUgaGF2ZSB0aGUgc2FtZSBwYXJlbnQKLSAgICBOb2RlIHBhcmVudCA9IHJlZmVyZW5jZU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0gICAgLy8gR2V0IHJlZmVyZW5jZSBub2RlcyBuZXh0IGFuZCBwcmV2aW91cyB0ZXh0IHN0cmluZ3MKLSAgICBTdHJpbmcgcmVmZXJlbmNlTm9kZU5leHRTdHJpbmcgPSAiIjsKLSAgICBTdHJpbmcgcmVmZXJlbmNlTm9kZVByZXZpb3VzU3RyaW5nID0gIiI7Ci0gICAgaWYgKHJlZmVyZW5jZU5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBOb2RlIHJlZmVyZW5jZU5vZGVOZXh0U2libGluZyA9IHJlZmVyZW5jZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgIE5vZGUgcmVmZXJlbmNlTm9kZVByZXZpb3VzU2libGluZyA9IHJlZmVyZW5jZU5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICBpZiAocmVmZXJlbmNlTm9kZU5leHRTaWJsaW5nIGluc3RhbmNlb2YgVGV4dCkKLSAgICAgIHsKLSAgICAgICAgcmVmZXJlbmNlTm9kZU5leHRTdHJpbmcgPSAoKFRleHQpcmVmZXJlbmNlTm9kZU5leHRTaWJsaW5nKS5nZXREYXRhKCk7Ci0gICAgICB9Ci0gICAgICBpZiAocmVmZXJlbmNlTm9kZVByZXZpb3VzU2libGluZyBpbnN0YW5jZW9mIFRleHQpCi0gICAgICB7Ci0gICAgICAgIHJlZmVyZW5jZU5vZGVQcmV2aW91c1N0cmluZyA9ICgoVGV4dClyZWZlcmVuY2VOb2RlUHJldmlvdXNTaWJsaW5nKS5nZXREYXRhKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIEdldCB0aGUgZHJhZ2dlZCBub2RlJ3MgbmV4dCBhbmQgcHJldmlvdXMgdGV4dCBzdHJpbmdzCi0gICAgTm9kZSBub2RlVG9Nb3ZlTmV4dFNpYmxpbmcgPSBub2RlVG9Nb3ZlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgTm9kZSBub2RlVG9Nb3ZlUHJldmlvdXNTaWJsaW5nID0gbm9kZVRvTW92ZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICBOb2RlIG5vZGVUb01vdmVOZXh0VGV4dCA9IG51bGw7Ci0gICAgU3RyaW5nIG5vZGVUb01vdmVOZXh0U3RyaW5nID0gIiI7Ci0gICAgU3RyaW5nIG5vZGVUb01vdmVQcmV2aW91c1N0cmluZyA9ICIiOwotICAgIGlmIChub2RlVG9Nb3ZlTmV4dFNpYmxpbmcgaW5zdGFuY2VvZiBUZXh0KQotICAgIHsKLSAgICAgIG5vZGVUb01vdmVOZXh0VGV4dCA9IChUZXh0KW5vZGVUb01vdmVOZXh0U2libGluZzsKLSAgICAgIG5vZGVUb01vdmVOZXh0U3RyaW5nID0gKChUZXh0KW5vZGVUb01vdmVOZXh0U2libGluZykuZ2V0RGF0YSgpOwotICAgIH0KLSAgICBpZiAobm9kZVRvTW92ZVByZXZpb3VzU2libGluZyBpbnN0YW5jZW9mIFRleHQpCi0gICAgewotICAgICAgbm9kZVRvTW92ZVByZXZpb3VzU3RyaW5nID0gKChUZXh0KW5vZGVUb01vdmVQcmV2aW91c1NpYmxpbmcpLmdldERhdGEoKTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgdGhlIGxhc3QgZWxlbWVudCdzIG5leHQgYW5kIHByZXZpb3VzIHRleHQgc3RyaW5ncwotICAgIE5vZGUgbGFzdEVsZW1lbnQgPSBnZXRMYXN0RWxlbWVudE5vZGUocGFyZW50KTsKLSAgICBOb2RlIGxhc3RFbGVtZW50TmV4dFNpYmxpbmcgPSBsYXN0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotICAgIE5vZGUgbGFzdEVsZW1lbnRQcmV2aW91c1NpYmxpbmcgPSBsYXN0RWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICBTdHJpbmcgbGFzdEVsZW1lbnROZXh0U3RyaW5nID0gIiI7Ci0gICAgU3RyaW5nIGxhc3RFbGVtZW50UHJldmlvdXNTdHJpbmcgPSAiIjsJCQotICAgIGlmIChsYXN0RWxlbWVudE5leHRTaWJsaW5nIGluc3RhbmNlb2YgVGV4dCkKLSAgICB7Ci0gICAgICBsYXN0RWxlbWVudE5leHRTdHJpbmcgPSAoKFRleHQpbGFzdEVsZW1lbnROZXh0U2libGluZykuZ2V0RGF0YSgpOwotICAgIH0KLSAgICBpZiAobGFzdEVsZW1lbnRQcmV2aW91c1NpYmxpbmcgaW5zdGFuY2VvZiBUZXh0KQotICAgIHsKLSAgICAgIGxhc3RFbGVtZW50UHJldmlvdXNTdHJpbmcgPSAoKFRleHQpbGFzdEVsZW1lbnRQcmV2aW91c1NpYmxpbmcpLmdldERhdGEoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzTGFzdEVsZW1lbnQgPSBmYWxzZTsgLy8gd2hldGhlciB0aGUgbGFzdCBlbGVtZW50IGlzIGRyYWdnZWQvbW92ZWQKLSAgICBpZiAobGFzdEVsZW1lbnQgPT0gbm9kZVRvTW92ZSkKLSAgICB7Ci0gICAgICBpc0xhc3RFbGVtZW50ID0gdHJ1ZTsKLSAgICB9Ci0JCQotICAgIC8vIGRlZmVjdCAyMjEwNTYgdGhpcyB0ZXN0IGlzIHJlcXVpcmVkIG9yIGVsc2UgdGhlIG5vZGUgd2lsbAotICAgIC8vIGJlIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSBhbmQgdGhlIGluc2VydCB3aWxsIGZhaWwKLSAgICBpZiAocmVmZXJlbmNlTm9kZSAhPSBub2RlVG9Nb3ZlKQotICAgIHsKLSAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlVG9Nb3ZlKTsKLSAgICAgIGlmIChyZWZlcmVuY2VOb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNCZWZvcmUpCi0gICAgICAgIHsKLSAgICAgICAgICByZWZlcmVuY2VOb2RlID0gZ2V0TmV4dEVsZW1lbnROb2RlKHJlZmVyZW5jZU5vZGUpOwotLy8gICAgICAgIHJlZmVyZW5jZU5vZGUgPSByZWZlcmVuY2VOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHJlZmVyZW5jZU5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW5zZXJ0QmVmb3JlKG5vZGVUb01vdmUsIHJlZmVyZW5jZU5vZGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZVRvTW92ZSk7Ci0gICAgICB9Ci0KLSAgICAgIE5vZGUgbmV3TGFzdEVsZW1lbnQgPSBnZXRMYXN0RWxlbWVudE5vZGUocGFyZW50KTsKLSAgICAgIGlmIChyZWZlcmVuY2VOb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChyZWZlcmVuY2VOb2RlICE9IG5ld0xhc3RFbGVtZW50KSAKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNMYXN0RWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXRUZXh0RGF0YShyZWZlcmVuY2VOb2RlLCBub2RlVG9Nb3ZlTmV4dFN0cmluZywgbm9kZVRvTW92ZVByZXZpb3VzU3RyaW5nKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0VGV4dERhdGEobm9kZVRvTW92ZSwgcmVmZXJlbmNlTm9kZU5leHRTdHJpbmcsIHJlZmVyZW5jZU5vZGVQcmV2aW91c1N0cmluZyk7Ci0gICAgICB9Ci0gICAgICAvLyBSZW1vdmUgdGhlIGVtcHR5IHNwYWNlIGxlZnQgYnkgdGhlIGRyYWdnZWQgbm9kZQotICAgICAgaWYgKG5vZGVUb01vdmVOZXh0VGV4dCAhPSBudWxsKQotICAgICAgewotICAgIAkgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlVG9Nb3ZlTmV4dFRleHQpOwotICAgICAgfQotICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgbGFzdCBlbGVtZW50Ci0gICAgICBpZiAoKG5ld0xhc3RFbGVtZW50ID09IG5vZGVUb01vdmUpIHx8IGlzTGFzdEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHNldFRleHREYXRhKG5ld0xhc3RFbGVtZW50LCBsYXN0RWxlbWVudE5leHRTdHJpbmcsIGxhc3RFbGVtZW50UHJldmlvdXNTdHJpbmcpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUZXh0RGF0YShOb2RlIHRhcmdldCwgU3RyaW5nIG5leHRUZXh0LCBTdHJpbmcgcHJldmlvdXNUZXh0KQotICB7Ci0gICAgTm9kZSBwYXJlbnQgPSB0YXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotICAgIE5vZGUgbmV4dFNpYmxpbmcgPSB0YXJnZXQuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICBOb2RlIHByZXZpb3VzU2libGluZyA9IHRhcmdldC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICBpZiAobmV4dFNpYmxpbmcgaW5zdGFuY2VvZiBUZXh0KQotICAgIHsKLSAgICAgICgoVGV4dCluZXh0U2libGluZykuc2V0RGF0YShuZXh0VGV4dCk7CQotICAgIH0KLSAgICBpZiAobmV4dFNpYmxpbmcgPT0gbnVsbCB8fCBuZXh0U2libGluZyBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIiIpOwotICAgICAgdGV4dE5vZGUuc2V0RGF0YShuZXh0VGV4dCk7Ci0gICAgICBpZiAobmV4dFNpYmxpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZXh0Tm9kZSwgbmV4dFNpYmxpbmcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHRleHROb2RlLCBnZXROZXh0RWxlbWVudE5vZGUodGFyZ2V0KSk7Ci0gICAgICB9Ci0gICAgfQkJCQkKLQotICAgIGlmIChwcmV2aW91c1NpYmxpbmcgaW5zdGFuY2VvZiBUZXh0KQotICAgIHsKLSAgICAgICgoVGV4dClwcmV2aW91c1NpYmxpbmcpLnNldERhdGEocHJldmlvdXNUZXh0KTsKLSAgICB9Ci0gICAgaWYgKHByZXZpb3VzU2libGluZyA9PSBudWxsIHx8IHByZXZpb3VzU2libGluZyBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIiIpOwotICAgICAgdGV4dE5vZGUuc2V0RGF0YShwcmV2aW91c1RleHQpOwotICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZXh0Tm9kZSwgdGFyZ2V0KTsKLSAgICB9CQkJCQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydEJlZm9yZShOb2RlIG5vZGVUb0luc2VydCwgTm9kZSByZWZlcmVuY2VOb2RlKQotICB7Ci0gICAgLy8gdGhpcyBhc3N1bWVzIHRoYXQgdGhlIHJlZmVyZW5jZU5vZGUgYW5kIG5vZGUgdG8gbW92ZSBoYXZlIHRoZSBzYW1lIHBhcmVudAotICAgIE5vZGUgcGFyZW50ID0gcmVmZXJlbmNlTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLSAgICBOb2RlIHByZXZpb3VzU2libGluZyA9IHJlZmVyZW5jZU5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgcGFyZW50Lmluc2VydEJlZm9yZShub2RlVG9JbnNlcnQsIHJlZmVyZW5jZU5vZGUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlucHV0RXF1YWxzKE9iamVjdCBpbnB1dCwgU3RyaW5nIHRhZ25hbWUsIGJvb2xlYW4gaXNSZWYpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBpbnB1dDsKLSAgICAgIGlmIChlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiByZWZQcmVzZW50ID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoInJlZiIpOwotCi0gICAgICAgIHJldHVybiByZWZQcmVzZW50ID09IGlzUmVmOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlRWxlbWVudFRvTm90QW5vbnltb3VzKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSljaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcpIHx8Ci0gICAgICAgICAgICAgICAgbm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKG5vZGUpOwotICAgICAgICAgICAgICBpPTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVSZWYoRWxlbWVudCBjdCwgU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgbnMpCi0gIHsKLSAgICBOb2RlTGlzdCBsaXN0ID0gY3QuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBsZW5ndGggPSBsaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgYUNoaWxkID0gKEVsZW1lbnQpbGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAoYUNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhQ2hpbGQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVmVmFsdWUgPSBhQ2hpbGQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIGlmIChyZWZWYWx1ZS5lcXVhbHMoYXR0ck5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1N2U2MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotLy8gVE9ETzogS0MgcmVtb3ZlIHRoaXMKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUhlbHBlcgotewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhTRFNjaGVtYUhlbHBlci4KLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWFIZWxwZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgY29uY3JldGVDb21wLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgY29udGFpbm1lbnRzID0gY29uY3JldGVDb21wLmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgY29udGFpbm1lbnRzLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSljb250YWlubWVudHMubmV4dCgpOwotICAgICAgICBpZiAoZVJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZVJlZmVyZW5jZS5pc01hbnkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSAoKENvbGxlY3Rpb24pY29uY3JldGVDb21wLmVHZXQoZVJlZmVyZW5jZSkpLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdHMubmV4dCgpOwotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZENvbmNyZXRlQ29tcG9uZW50LnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7fQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpY29uY3JldGVDb21wLmVHZXQoZVJlZmVyZW5jZSk7Ci0gICAgICAgICAgICBpZiAoeHNkQ29uY3JldGVDb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RDb25jcmV0ZUNvbXBvbmVudC51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtZXJhdGlvbnNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1lcmF0aW9uc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmEyYzY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1lcmF0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotCi0KLS8qKgotICogRGlhbG9nIHRvIGhlbHAgZGVmaW5lIGEgbGlzdCBvZiBlbnVtZXJhdGlvbnMKLSAqIGZvciBhIGpvaW4uIFRoaXMgbWlnaHQgYmUgcmVwbGFjZWQgb25jZSB3ZSBrbm93IGhvdyB0bwotICogaW5pdGlhdGUgYSBkcmFnIHRyYWNrZXIKLSAqLwotCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25zRGlhbG9nIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cKLXsKLSAgcHVibGljIEVudW1lcmF0aW9uc0RpYWxvZyhTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VOVU1FUkFUSU9OU19ESUFMT0dfVElUTEUiKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBEaWFsb2cuT0spCi0gICAgewotICAgICAgdGV4dCA9IHRleHRGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICBkZWxpbWl0ZXIgPSBkZWxpbWl0ZXJGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICBpc1ByZXNlcnZlID0gcHJlc2VydmVXaGl0ZXNwYWNlLmdldFNlbGVjdGlvbigpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHRleHQsIGRlbGltaXRlcjsKLSAgcHJpdmF0ZSBib29sZWFuIGlzUHJlc2VydmU7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsgcmV0dXJuIHRleHQ7IH0KLSAgcHVibGljIFN0cmluZyBnZXREZWxpbWl0ZXIoKSB7IHJldHVybiBkZWxpbWl0ZXI7IH0KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZVdoaXRlc3BhY2UoKSB7IHJldHVybiBpc1ByZXNlcnZlOyB9Ci0KLSAgcHJpdmF0ZSBUZXh0IHRleHRGaWVsZDsKLSAgcHJpdmF0ZSBCdXR0b24gcHJlc2VydmVXaGl0ZXNwYWNlOwotICBwcml2YXRlIENvbWJvIGRlbGltaXRlckZpZWxkOwotICAvLwotICAvLyBDcmVhdGUgdGhlIGNvbnRyb2xzCi0gIC8vCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbnRyb2xbXSB0YWJPcmRlciA9IG5ldyBDb250cm9sWzNdOwotICAJaW50IHRhYkluZGV4ID0gMDsKLSAgICBDb21wb3NpdGUgY2xpZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCljbGllbnQuZ2V0TGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsgCi0KLSAgICB0ZXh0RmllbGQgPSBWaWV3VXRpbGl0eS5jcmVhdGVXcmFwcGVkTXVsdGlUZXh0RmllbGQoY2xpZW50LCA0MDAsIDIwLCB0cnVlKTsKLSAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgdGV4dEZpZWxkLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgdGFiT3JkZXJbdGFiSW5kZXgrK10gPSB0ZXh0RmllbGQ7Ci0KLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjbGllbnQsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9ERUxJTUlURVJfQ0hBUiIpKTsKLSAgICBkZWxpbWl0ZXJGaWVsZCA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbWJvQm94KGNsaWVudCwgZmFsc2UpOwotICAgIGdkID0gKEdyaWREYXRhKSBkZWxpbWl0ZXJGaWVsZC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMzA7Ci0gICAgdGFiT3JkZXJbdGFiSW5kZXgrK10gPSBkZWxpbWl0ZXJGaWVsZDsKLQotICAgIC8vIGFkZCBkZWZhdWx0IGRlbGltaXRlcnMKLSAgICBkZWxpbWl0ZXJGaWVsZC5hZGQoIjoiKTsKLSAgICBkZWxpbWl0ZXJGaWVsZC5hZGQoIiwiKTsKLSAgICBkZWxpbWl0ZXJGaWVsZC5hZGQoIiAiKTsKLSAgICAvLyBzZXQgdGhlIGN1cnJlbnQgb25lIHRvIGJlICcsJwotICAgIGRlbGltaXRlckZpZWxkLnNldFRleHQoIiwiKTsKLQotICAgIHByZXNlcnZlV2hpdGVzcGFjZSA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNoZWNrQm94KGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1BSRVNFUlZFX1dISVRFU1BBQ0UiKSk7Ci0gICAgZ2QgPSAoR3JpZERhdGEpIHByZXNlcnZlV2hpdGVzcGFjZS5nZXRMYXlvdXREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIHRhYk9yZGVyW3RhYkluZGV4KytdID0gcHJlc2VydmVXaGl0ZXNwYWNlOwotICAgIAotICAgIGNsaWVudC5zZXRUYWJMaXN0KHRhYk9yZGVyKTsKLQotICAgIHJldHVybiBjbGllbnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1NldEJhc2VUeXBlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9TZXRCYXNlVHlwZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU0NjQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1NldEJhc2VUeXBlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2V0QmFzZVR5cGVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQ29tYm8gYmFzZVR5cGVDb21ibzsKLSAgcHJvdGVjdGVkIENvbWJvIGRlcml2ZWRCeUNvbWJvOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsgIC8vIHRoZSBjb21wbGV4IHR5cGUgZWxlbWVudAotICBwcml2YXRlIFN0cmluZyB0eXBlID0gIiI7Ci0gIHByaXZhdGUgU3RyaW5nIGRlcml2ZWRCeVN0cmluZyA9ICIiOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBTZXRCYXNlVHlwZURpYWxvZy4KLSAgICogQHBhcmFtIGFyZzAKLSAgICovCi0gIHB1YmxpYyBTZXRCYXNlVHlwZURpYWxvZyhTaGVsbCBhcmcwLCBYU0RTY2hlbWEgeHNkU2NoZW1hLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgc2hlbGwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfU0VUX0JBU0VfVFlQRSIpKTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpCi0gIHsKLSAgICBpZiAoYnV0dG9uSWQgPT0gRGlhbG9nLk9LKQotICAgIHsKLSAgICAgIHR5cGUgPSBiYXNlVHlwZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIGRlcml2ZWRCeVN0cmluZyA9IGRlcml2ZWRCeUNvbWJvLmdldFRleHQoKTsKLSAgICB9Ci0gICAgc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlcml2ZWRCeSgpCi0gIHsKLSAgICByZXR1cm4gZGVyaXZlZEJ5U3RyaW5nOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50QmFzZVR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICB0aGlzLnR5cGUgPSB0eXBlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50RGVyaXZlZEJ5KFN0cmluZyBkZXJpdmVkQnlTdHJpbmcpCi0gIHsKLSAgICB0aGlzLmRlcml2ZWRCeVN0cmluZyA9IGRlcml2ZWRCeVN0cmluZzsKLSAgfQotCi0gIC8vCi0gIC8vIENyZWF0ZSB0aGUgY29udHJvbHMKLSAgLy8KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIG5hbWVDb21wb3NpdGUgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KW5hbWVDb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIG5hbWVDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7IAotCi0gICAgVmlld1V0aWxpdHkgdXRpbGl0eSA9IG5ldyBWaWV3VXRpbGl0eSgpOwotCi0gICAgVmlld1V0aWxpdHkuY3JlYXRlTGFiZWwobmFtZUNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0JBU0VfVFlQRV9XSVRIX0NPTE9OIikpOwotICAgIGJhc2VUeXBlQ29tYm8gPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21ib0JveChuYW1lQ29tcG9zaXRlLCB0cnVlKTsgLy8gcmVhZG9ubHkKLSAgICBiYXNlVHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKG5hbWVDb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9ERVJJVkVEX0JZIikpOyAKLSAgICBkZXJpdmVkQnlDb21ibyA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbWJvQm94KG5hbWVDb21wb3NpdGUsIHRydWUpOyAvLyByZWFkb25seQotCi0gICAgZGVyaXZlZEJ5Q29tYm8uYWRkKFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcpOwotICAgIGRlcml2ZWRCeUNvbWJvLmFkZChYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpOwotICAgIGRlcml2ZWRCeUNvbWJvLnNldFRleHQoZGVyaXZlZEJ5U3RyaW5nKTsKLSAgICBpbml0aWFsaXplQmFzZVR5cGVDb21ibygpOwotCi0gICAgaWYgKHR5cGUuZXF1YWxzKCIiKSkKLSAgICB7Ci0gICAgICBkZXJpdmVkQnlDb21iby5zZXRUZXh0KCIiKTsKLSAgICAgIGRlcml2ZWRCeUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICAgICAgCi0gICAgcmV0dXJuIG5hbWVDb21wb3NpdGU7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUJhc2VUeXBlQ29tYm8oKQotICB7Ci0gICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0KLSAgICBTdHJpbmcgcHJlZml4ID0gaGVscGVyLmdldFByZWZpeCh4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHRydWUpOwotCi0gICAgbGlzdC5hZGQoIiIpOwotICAgIGxpc3QuYWRkQWxsKGhlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpKTsKLSAgICBsaXN0LmFkZEFsbChoZWxwZXIuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgbGlzdC5hZGRBbGwoaGVscGVyLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpKTsKLQotICAgIC8vIHJlbW92ZSB0aGUgY3VycmVudCBDVCBmcm9tIHRoZSBsaXN0Ci0gICAgbGlzdC5yZW1vdmUocHJlZml4ICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0KLSAgICBiYXNlVHlwZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBiYXNlVHlwZUNvbWJvLmFkZChsaXN0LmdldChpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgYmFzZVR5cGVDb21iby5zZXRUZXh0KHR5cGUpOwotICAgIGhhbmRsZUJhc2VUeXBlQ29tYm9DaGFuZ2UoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJhc2VUeXBlQ29tYm9DaGFuZ2UoKQotICB7Ci0gICAgU3RyaW5nIHRlbXBDaG9pY2UgPSBiYXNlVHlwZUNvbWJvLmdldFRleHQoKTsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICBpZiAoaGVscGVyLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCkuY29udGFpbnModGVtcENob2ljZSkgfHwKLSAgICAgICAgaGVscGVyLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkuY29udGFpbnModGVtcENob2ljZSkpCi0gICAgewotICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0VGV4dChYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgIGRlcml2ZWRCeUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlIGlmIChoZWxwZXIuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCkuY29udGFpbnModGVtcENob2ljZSkpCi0gICAgewotICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0RW5hYmxlZCh0cnVlKTsgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkZXJpdmVkQnlDb21iby5zZXRUZXh0KCIiKTsKLSAgICAgIGRlcml2ZWRCeUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOyAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJhc2VUeXBlQ29tYm8pCi0gICAgewotICAgICAgaGFuZGxlQmFzZVR5cGVDb21ib0NoYW5nZSgpOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1R5cGVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9UeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTExMWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1R5cGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlU2VjdGlvbgotewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFR5cGVTZWN0aW9uLgotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqLwotICBwdWJsaWMgVHlwZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIEJ1dHRvbiAgc2ltcGxlVHlwZTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiAgdXNlclNpbXBsZVR5cGU7Ci0gIHByb3RlY3RlZCBCdXR0b24gIHVzZXJDb21wbGV4VHlwZTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiAgbm9uZVJhZGlvOwotICBwcm90ZWN0ZWQgQ29tYm8gICB0eXBlTGlzdDsKLSAgcHJvdGVjdGVkIENvbWJvICAgZGVyaXZlZEJ5Q29tYm87Ci0gIHByb3RlY3RlZCBib29sZWFuIHNob3dVc2VyQ29tcGxleFR5cGUgPSB0cnVlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93VXNlclNpbXBsZVR5cGUgID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd05vbmUgICAgICAgICAgICA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93RGVyaXZlZEJ5ICAgICAgID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgIGRlcml2ZWRCeUNob2ljZXNbXSAgPSB7ICJyZXN0cmljdGlvbiIsICJleHRlbnNpb24iIH07Ci0gIHB1YmxpYyBmaW5hbCBpbnQgIE5PTkUgICAgICAgICAgICAgICAgPSAxOwotICBwdWJsaWMgZmluYWwgaW50ICBCVUlMVF9JTiAgICAgICAgICAgID0gMjsKLSAgcHVibGljIGZpbmFsIGludCAgU0lNUExFICAgICAgICAgICAgICA9IDM7Ci0gIHB1YmxpYyBmaW5hbCBpbnQgIENPTVBMRVggICAgICAgICAgICAgPSA0OwotCi0gIFN0cmluZyAgICAgICAgICAgIHNlY3Rpb25UaXRsZSAgICAgICAgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfVFlQRV9JTkZPUk1BVElPTiIpOwotICBTdHJpbmcgICAgICAgICAgICBjdXJyZW50T2JqZWN0VXVpZCAgID0gIiI7Ci0KLSAgLyoKLSAgICogQHNlZSBGbGF0UGFnZVNlY3Rpb24jY3JlYXRlQ2xpZW50KENvbXBvc2l0ZSwgV2lkZ2V0RmFjdG9yeSkKLSAgICovCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ2xpZW50KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLwlGbGF0Vmlld1V0aWxpdHkgdXRpbGl0eSA9IG5ldyBGbGF0Vmlld1V0aWxpdHkoWFNERWRpdG9yLmlzRmxhdExvb2soKSk7Ci0gICAgVmlld1V0aWxpdHkgdXRpbGl0eSA9IG5ldyBWaWV3VXRpbGl0eSgpOwotCi0gICAgLy8gQ29tcG9zaXRlIGNsaWVudCA9IHV0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0gICAgQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgY2xpZW50LnNldExheW91dChnbCk7Ci0KLSAgICBpZiAoc2hvd05vbmUpCi0gICAgewotICAgICAgbm9uZVJhZGlvID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fTk9ORSIpKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChub25lUmFkaW8sIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9OT05FKTsKLSAgICB9Ci0KLSAgICBzaW1wbGVUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fQlVJTFRfSU5fU0lNUExFX1RZUEUiKSk7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHNpbXBsZVR5cGUsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9CVUlMVF9JTik7Ci0KLSAgICBpZiAoc2hvd1VzZXJTaW1wbGVUeXBlKQotICAgIHsKLSAgICAgIHVzZXJTaW1wbGVUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fVVNFUl9ERUZJTkVEX1NJTVBMRV9UWVBFIikpOwotICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHVzZXJTaW1wbGVUeXBlLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfVFlQRV9IRUxQRVJfVVNFUl9ERUZJTkVEX1NJTVBMRSk7Ci0gICAgfQotCi0gICAgaWYgKHNob3dVc2VyQ29tcGxleFR5cGUpCi0gICAgewotICAgICAgdXNlckNvbXBsZXhUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fVVNFUl9ERUZJTkVEX0NPTVBMRVhfVFlQRSIpKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh1c2VyQ29tcGxleFR5cGUsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9VU0VSX0RFRklORURfQ09NUExFWCk7Ci0gICAgfQotCi0gICAgLy8JICB0eXBlTGlzdCA9IHV0aWxpdHkuY3JlYXRlQ29tYm9Cb3goY2xpZW50KTsKLSAgICAvLwkgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh0eXBlTGlzdCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX1RZUEVfSEVMUEVSX1RZUEUpOwotICAgIC8vICAgIHV0aWxpdHkuY3JlYXRlSGVhZGluZ0xhYmVsKGNsaWVudCwgIlR5cGUiLG51bGwpOwotCi0gICAgaWYgKHNob3dEZXJpdmVkQnkpCi0gICAgewotICAgICAgQ29tcG9zaXRlIGRlcml2ZWRCeUNvbXBvc2l0ZSA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShjbGllbnQsIDIpOwotICAgICAgTGFiZWwgZGVyaXZlZEJ5TGFiZWwgPSBWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChkZXJpdmVkQnlDb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9ERVJJVkVEX0JZIikpOwotICAgICAgZGVyaXZlZEJ5Q29tYm8gPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21ib0JveChkZXJpdmVkQnlDb21wb3NpdGUpOwotICAgICAgcG9wdWxhdGVEZXJpdmVkQnlDb21ibygpOwotICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGRlcml2ZWRCeUNvbWJvLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfU0lNUExFX0NPTlRFTlRfREVSSVZFRCk7Ci0gICAgICBkZXJpdmVkQnlDb21iby5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9ERVJJVkVEX0JZIikpOwotICAgIH0KLSAgICAvLyBTZXQgdGhlIGRlZmF1bHQgc2VsZWN0aW9uCi0gICAgaWYgKHNob3dOb25lKQotICAgIHsKLSAgICAgIC8vCQlub25lUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgLy8JCXR5cGVMaXN0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2ltcGxlVHlwZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgfQotICAgIHJldHVybiBjbGllbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJc0Rlcml2ZWRCeShib29sZWFuIGRlcml2ZSkKLSAgewotICAgIGlmIChkZXJpdmUpCi0gICAgewotICAgICAgc2VjdGlvblRpdGxlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0JBU0VfVFlQRSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2VjdGlvblRpdGxlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1RZUEVfSU5GT1JNQVRJT04iKTsKLSAgICB9Ci0gICAgLy8Jc2V0SGVhZGVyVGV4dChzZWN0aW9uVGl0bGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0byB0cnVlIGlmIGNhbGxlZCBieSBDb21wbGV4IFR5cGUgJiBTaW1wbGUgVHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2hvd0Rlcml2ZWRCeShib29sZWFuIGRlcml2ZSkKLSAgewotICAgIHNob3dEZXJpdmVkQnkgPSBkZXJpdmU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZGVyaXZlZEJ5RmllbGQKLSAgICogQHJldHVybiBSZXR1cm5zIGEgQnV0dG9uCi0gICAqLwotICBwdWJsaWMgQ29tYm8gZ2V0RGVyaXZlZEJ5Q29tYm8oKQotICB7Ci0gICAgcmV0dXJuIGRlcml2ZWRCeUNvbWJvOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5vbmVSYWRpby4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgQnV0dG9uCi0gICAqLwotICBwdWJsaWMgQnV0dG9uIGdldE5vbmVSYWRpbygpCi0gIHsKLSAgICByZXR1cm4gbm9uZVJhZGlvOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHNpbXBsZVR5cGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBnZXRTaW1wbGVUeXBlKCkKLSAgewotICAgIHJldHVybiBzaW1wbGVUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHVzZXJDb21wbGV4VHlwZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgQnV0dG9uCi0gICAqLwotICBwdWJsaWMgQnV0dG9uIGdldFVzZXJDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdXNlckNvbXBsZXhUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHVzZXJTaW1wbGVUeXBlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBCdXR0b24KLSAgICovCi0gIHB1YmxpYyBCdXR0b24gZ2V0VXNlclNpbXBsZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHVzZXJTaW1wbGVUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHR5cGVMaXN0LgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBDQ29tYm8KLSAgICovCi0gIHB1YmxpYyBDb21ibyBnZXRUeXBlTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gdHlwZUxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogUG9wdWxhdGUgY29tYm8gYm94IHdpdGggYnVpbHQtaW4gc2ltcGxlIHR5cGVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUJ1aWx0SW5UeXBlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBnZXRUeXBlTGlzdCgpLnJlbW92ZUFsbCgpOwotICAgIExpc3QgaXRlbXMgPSBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZ2V0VHlwZUxpc3QoKS5hZGQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgcmV0dXJuIGhlbHBlci5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBvcHVsYXRlIGNvbWJvIGJveCB3aXRoIHVzZXIgZGVmaW5lZCBjb21wbGV4IHR5cGVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVVzZXJDb21wbGV4VHlwZShYU0RTY2hlbWEgeHNkU2NoZW1hLCBib29sZWFuIHNob3dBbm9ueW1vdXMpCi0gIHsKLSAgICBnZXRUeXBlTGlzdCgpLnJlbW92ZUFsbCgpOwotICAgIGlmIChzaG93QW5vbnltb3VzKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BTk9OWU1PVVMiKSk7Ci0gICAgfQotCi0gICAgTGlzdCBpdGVtcyA9IGdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZ2V0VHlwZUxpc3QoKS5hZGQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgIHJldHVybiBoZWxwZXIuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKFhTRFNjaGVtYSB4c2RTY2hlbWEsIGJvb2xlYW4gc2hvd0Fub255bW91cykKLSAgewotICAgIGdldFR5cGVMaXN0KCkucmVtb3ZlQWxsKCk7Ci0gICAgaWYgKHNob3dBbm9ueW1vdXMpCi0gICAgewotICAgICAgZ2V0VHlwZUxpc3QoKS5hZGQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FOT05ZTU9VUyIpKTsKLSAgICB9Ci0gICAgTGlzdCBpdGVtcyA9IGdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBnZXRUeXBlTGlzdCgpLmFkZChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBvcHVsYXRlIGNvbWJvIGJveCB3aXRoIHVzZXIgZGVmaW5lZCBzaW1wbGUgdHlwZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIGdldFR5cGVMaXN0KCkucmVtb3ZlQWxsKCk7Ci0gICAgTGlzdCBpdGVtcyA9IGdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBnZXRUeXBlTGlzdCgpLmFkZChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICByZXR1cm4gaGVscGVyLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbnMsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICBTdHJpbmcga2V5ID0gaGVscGVyLmdldFByZWZpeChucywgdHJ1ZSk7Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZSBjb21ibyBib3ggd2l0aCBkZXJpdmVkIGJ5IGNob2ljZXMKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRGVyaXZlZEJ5Q29tYm8oKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXJpdmVkQnlDaG9pY2VzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGdldERlcml2ZWRCeUNvbWJvKCkuYWRkKGRlcml2ZWRCeUNob2ljZXNbaV0pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzaG93VXNlckNvbXBsZXhUeXBlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93VXNlckNvbXBsZXhUeXBlKCkKLSAgewotICAgIHJldHVybiBzaG93VXNlckNvbXBsZXhUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHNob3dVc2VyU2ltcGxlVHlwZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd1VzZXJTaW1wbGVUeXBlKCkKLSAgewotICAgIHJldHVybiBzaG93VXNlclNpbXBsZVR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgc2hvd05vbmUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dOb25lKCkKLSAgewotICAgIHJldHVybiBzaG93Tm9uZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzaG93VXNlckNvbXBsZXhUeXBlLgotICAgKiBAcGFyYW0gc2hvd1VzZXJDb21wbGV4VHlwZSBUaGUgc2hvd1VzZXJDb21wbGV4VHlwZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dVc2VyQ29tcGxleFR5cGUoYm9vbGVhbiBzaG93VXNlckNvbXBsZXhUeXBlKQotICB7Ci0gICAgdGhpcy5zaG93VXNlckNvbXBsZXhUeXBlID0gc2hvd1VzZXJDb21wbGV4VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzaG93VXNlclNpbXBsZVR5cGUuCi0gICAqIEBwYXJhbSBzaG93VXNlclNpbXBsZVR5cGUgVGhlIHNob3dVc2VyU2ltcGxlVHlwZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dVc2VyU2ltcGxlVHlwZShib29sZWFuIHNob3dVc2VyU2ltcGxlVHlwZSkKLSAgewotICAgIHRoaXMuc2hvd1VzZXJTaW1wbGVUeXBlID0gc2hvd1VzZXJTaW1wbGVUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNob3dOb25lCi0gICAqIEBwYXJhbSBzaG93VXNlclNpbXBsZVR5cGUgVGhlIHNob3dOb25lIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2hvd05vbmUoYm9vbGVhbiBzaG93Tm9uZSkKLSAgewotICAgIHRoaXMuc2hvd05vbmUgPSBzaG93Tm9uZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvWFNERWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1hTREVkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YThlNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvWFNERWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuZGlhbG9ncy5FZGl0U2NoZW1hSW5mb0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5zZWRpdC5Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgWFNERWRpdFNjaGVtYUluZm9EaWFsb2cgZXh0ZW5kcyBFZGl0U2NoZW1hSW5mb0RpYWxvZyB7Ci0JU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLQlDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nIGVkaXROYW1lc3BhY2VzQ29udHJvbDsKLQkKLQlwdWJsaWMgWFNERWRpdFNjaGVtYUluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElQYXRoIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIHJlc291cmNlTG9jYXRpb24pOwotCQl0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0vKgotCS8vIGluIHN1cGVyCi0JcHJvdGVjdGVkIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nIGNyZWF0ZUNvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nKENvbXBvc2l0ZSBkaWFsb2dBcmVhKQotCXsKLQkgIHJldHVybiBuZXcgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coZGlhbG9nQXJlYSwgcmVzb3VyY2VMb2NhdGlvbiwgWE1MVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVfVUlfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OUyIpLCBmYWxzZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JfQotCQotCS8vIGluIHN1cGVyCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBlZGl0TmFtZXNwYWNlc0NvbnRyb2wgPSBjcmVhdGVDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhkaWFsb2dBcmVhKTsgCi0JCWVkaXROYW1lc3BhY2VzQ29udHJvbC5zZXROYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCWVkaXROYW1lc3BhY2VzQ29udHJvbC51cGRhdGVFcnJvck1lc3NhZ2UobmFtZXNwYWNlSW5mb0xpc3QpOwotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0JCi0JLy8gaW4gdGhpcwotCXByb3RlY3RlZCBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBjcmVhdGVDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhDb21wb3NpdGUgZGlhbG9nQXJlYSkKLQl7Ci0JICByZXR1cm4gbmV3IENvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2coZGlhbG9nQXJlYSwgcmVzb3VyY2VMb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JfQkqLwotCQotCS8vIHRoaXMgaXMgY29weSBvZiAuLi4uCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgX19pbnRlcm5hbENyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9CQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIF9faW50ZXJuYWxDcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWVkaXROYW1lc3BhY2VzQ29udHJvbCA9IG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nKGRpYWxvZ0FyZWEsIHJlc291cmNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLQkJewkKLQkJCWVkaXROYW1lc3BhY2VzQ29udHJvbC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLQkJfQotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wuc2V0TmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wudXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGVkaXROYW1lc3BhY2VzQ29udHJvbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0RXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hTRFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDczMDM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hTRFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuWE1MTW9kZWxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIE5ld1hTRFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQKLXsKLSAgcHJpdmF0ZSBYU0ROZXdGaWxlUGFnZSBuZXdGaWxlUGFnZTsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0gIHByaXZhdGUgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0KLSAgcHVibGljIE5ld1hTRFdpemFyZCgpCi0gIHsgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotICAgIHRoaXMud29ya2JlbmNoID0gYVdvcmtiZW5jaDsKLQotICAgIHRoaXMuc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL05ld1hTRC5naWYiKSk7Ci0gICAgdGhpcy5zZXRXaW5kb3dUaXRsZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfV0laQVJEX0NSRUFURV9YU0RfTU9ERUxfVElUTEUiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpCi0gIHsKLSAgICBuZXdGaWxlUGFnZSA9IG5ldyBYU0ROZXdGaWxlUGFnZShzZWxlY3Rpb24pOwotICAgIGFkZFBhZ2UobmV3RmlsZVBhZ2UpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgICBJRmlsZSBmaWxlID0gbmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotICAgIAotICAgIC8vCi0gICAgLy8gR2V0IHRoZSB4c2Qgc2NoZW1hIG5hbWUgZnJvbSB0aGUgZnVsbCBwYXRoIG5hbWUKLSAgICAvLyAgIGUuZy4gZjovYjJiL3BvLnhzZCA9PiBzY2hlbWEgbmFtZSA9IHBvCi0gICAgLy8KLSAgICBJUGF0aCBpUGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgLy8gU3RyaW5nIHNjaGVtYU5hbWUgPSBpUGF0aC5sYXN0U2VnbWVudCgpOwotICAgIFN0cmluZyBzY2hlbWFOYW1lID0gaVBhdGgubGFzdFNlZ21lbnQoKTsKLSAgICBTdHJpbmcgc2NoZW1hUHJlZml4ID0gInRucyI7Ci0gICAgU3RyaW5nIHByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSA9ICIiOwotICAgIFN0cmluZyBzY2hlbWFOYW1lc3BhY2VBdHRyaWJ1dGUgPSAieG1sbnMiOwotICAgIGlmIChYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuaXNRdWFsaWZ5WE1MU2NoZW1hTGFuZ3VhZ2UoKSkKLSAgICB7Ci0gICAgICAvLyBBZGRlZCB0aGlzIGlmIGNoZWNrIGJlZm9yZSBkaXNhbGxvd2luZyBibGFuayBwcmVmaXhlcyBpbiB0aGUgcHJlZmVyZW5jZXMuLi4KLSAgICAgIC8vIENhbiB0YWtlIHRoaXMgb3V0LiAgU2VlIGFsc28gWFNERWRpdG9yCi0gICAgICBpZiAoWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhNTFNjaGVtYVByZWZpeCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYTUxTY2hlbWFQcmVmaXgoKSArICI6IjsKLSAgICAgICAgc2NoZW1hTmFtZXNwYWNlQXR0cmlidXRlICs9ICI6IiArIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYTUxTY2hlbWFQcmVmaXgoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTE1vZGVsUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotICAgICBpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpCi0gICAgewotICAgIAljaGFyU2V0ID0gIlVURi04IjsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbmV3Q29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGNoYXJTZXQgKyAiXCI/PlxuIjsKLSAgICAgCi0gICAgU3RyaW5nIGRlZmF1bHRUYXJnZXRVUkkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgbmV3Q29udGVudHMgKz0gIjwiICsgcHJlZml4Rm9yU2NoZW1hTmFtZXNwYWNlICsgInNjaGVtYSAiICsgc2NoZW1hTmFtZXNwYWNlQXR0cmlidXRlICsgIj1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgdGFyZ2V0TmFtZXNwYWNlPVwiIiArIGRlZmF1bHRUYXJnZXRVUkkgKyBzY2hlbWFOYW1lICsgIlwiIHhtbG5zOiIgKyBzY2hlbWFQcmVmaXggKyAiPVwiIisgZGVmYXVsdFRhcmdldFVSSSArIHNjaGVtYU5hbWUgKyAiXCI+XG48LyIrcHJlZml4Rm9yU2NoZW1hTmFtZXNwYWNlKyJzY2hlbWE+IjsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGJ5dGVbXSBieXRlcyA9IG5ld0NvbnRlbnRzLmdldEJ5dGVzKGNoYXJTZXQpOwotICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgICAgCi0gICAgICBmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLHRydWUsZmFsc2UsbnVsbCk7Ci0gICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotLy8gICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoIkVycm9yIHdyaXRpbmcgZGVmYXVsdCBjb250ZW50OlxuIiArIG5ld0NvbnRlbnRzKTsgICAgICAKLS8vICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKGUpOwotICAgIH0KLQotICAgIGlmIChmaWxlICE9IG51bGwpCi0gICAgewotICAgICAgcmV2ZWFsU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbGUpKTsKLSAgICB9Ci0gICAgCi0gICAgb3BlbkVkaXRvcihmaWxlKTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJldmVhbFNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRXb3JrYmVuY2goKTsKLSAgICAgIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgZmluYWwgSVdvcmtiZW5jaFBhcnQgZm9jdXNQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0gICAgICBpZiAoZm9jdXNQYXJ0IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkKLSAgICAgIHsKLSAgICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjCi0gICAgICAgIChuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChJU2V0U2VsZWN0aW9uVGFyZ2V0KWZvY3VzUGFydCkuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGlGaWxlKQotICB7Ci0gICAgaWYgKGlGaWxlICE9IG51bGwpCi0gICAgewotICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICBmaW5hbCBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjCi0gICAgICAobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoaUZpbGUpLCBYU0RFZGl0b3JQbHVnaW4uWFNEX0VESVRPUl9JRCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleENvbXBvc2l0aW9uUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhDb21wb3NpdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYTlhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleENvbXBvc2l0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIEJhc2VkIG9uIHZlcnNpb24gMS4xMiBvZiBvcmlnaW5hbCB4c2RlZGl0b3IKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGF0dGVybkZhY2V0OwotCi0KLQotLyoKLS1vdGhlciByZWdleCBmZWF0dXJlcyAoZWcgY2FzZSBzZW5zaXRpdml0eSwgXiBvciAkLCB8LCBldGMgZXRjKQotLXNtYXJ0ZXIgbW9kZWwKLS1iZXR0ZXIga2V5Ym9hcmQgbmF2aWdhdGlvbgotLXVwZGF0ZSBsaXN0IG9mIHRva2VucyAKLSovCi0KLXB1YmxpYyBjbGFzcyBSZWdleENvbXBvc2l0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCi0gIC8qIFRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIG91ciBwYXR0ZXJuLiAqLwotICBwcml2YXRlIFN0eWxlZFRleHQgdmFsdWU7IAotCi0gIC8qIFRoZSBTdHlsZVJhbmdlIHVzZWQgdG8gY29sb3IgY29kZSB0aGUgY3VycmVudCBwYXJzZSBlcnJvci4gKi8KLSAgcHJpdmF0ZSBTdHlsZVJhbmdlIGN1cnJlbnRFcnJvcjsKLQotICAvKiBUaGUgcmVnZXggdGVybXMgd2UgY2FuIGZvcm0gdG9rZW5zIGZyb20uICovCi0gIHByaXZhdGUgQ29tYm8gdGVybXM7Ci0KLSAgLyogVGhlIGNoZWNrYm94IGZvciBhY3RpdmF0aW5nIGF1dG8tZXNjYXBlIG1vZGUuICovICAKLSAgcHJpdmF0ZSBCdXR0b24gZXNjYXBlQ2hlY2tib3g7Ci0gIAotICAvKiBPbi9vZmYgc3RhdHVzIG9mIGF1dG8tZXNjYXBlIG1vZGUuICovIAotICBwcml2YXRlIGJvb2xlYW4gYXV0b0VzY2FwZVN0YXR1czsKLQotICAvKiBUaGUgQWRkIFRva2VuIGJ1dHRvbi4gKi8KLSAgcHJpdmF0ZSBCdXR0b24gYWRkOwotCi0KLSAgLy8gVGhlIGZvbGxvd2luZyBjb250cm9scyBhcmUgdXNlZCBpbiB0aGUgb2NjdXJyZW5jZSBzZWxlY3Rpb24gZ3JvdXAKLQotICBwcml2YXRlIFRleHQgcmVwZWF0VmFsdWU7Ci0KLSAgcHJpdmF0ZSBUZXh0IHJhbmdlTWluVmFsdWU7Ci0gIHByaXZhdGUgVGV4dCByYW5nZU1heFZhbHVlOwotICBwcml2YXRlIExhYmVsIHJhbmdlVG9MYWJlbDsgIAotCi0gIHByaXZhdGUgQnV0dG9uIHNpbmdsZVJhZGlvOwotICBwcml2YXRlIEJ1dHRvbiBzdGFyUmFkaW87Ci0gIHByaXZhdGUgQnV0dG9uIHBsdXNSYWRpbzsKLSAgcHJpdmF0ZSBCdXR0b24gb3B0aW9uYWxSYWRpbzsgCi0gIHByaXZhdGUgQnV0dG9uIHJlcGVhdFJhZGlvOwotICBwcml2YXRlIEJ1dHRvbiByYW5nZVJhZGlvOwotCi0gIAotICAvLyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyB1c2VkIGFzIHBhcnQgb2YgdGhlIG1vZGVsLiAKLQotICAvKiBPdXIgcGF0dGVybi4gKi8KLSAgcHJpdmF0ZSBYU0RQYXR0ZXJuRmFjZXQgcGF0dGVybjsKLQotICAvKiBNb2RlbCB1c2VkIHRvIHN0b3JlIHRoZSBjdXJyZW50IHRva2VuLiAqLwotICBwcml2YXRlIFJlZ2V4Tm9kZSBub2RlOyAgICAKLQotICAvKiBWYWxpZGF0b3IgZnJvbSB0aGUgeGVyY2VzIHJlZ2V4IHBhY2thZ2UuICovCi0gIC8vcHJpdmF0ZSBSZWd1bGFyRXhwcmVzc2lvbiB2YWxpZGF0b3I7Ci0gIHByaXZhdGUgUGF0dGVybiB2YWxpZGF0b3I7Ci0KLSAgLyogVGhlIGZsYWdzIHBhc3NlZCB0byB0aGUgbmV3IFJlZ3VsYXJFeHByZXNzaW9uIG9iamVjdC4gIERlZmF1bHQgdmFsdWUgaW5jbHVkZXM6Ci0gICAgICBYID0gWE1MU2NoZW1hIG1vZGUgICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVnZXhGbGFncyA9ICJYIjsKLSAgICAgIAotCi0gIC8qIElzIHRoZSBjdXJyZW50IHJlZ2V4IHRva2VuIHZhbGlkPyAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFRva2VuOwotCi0gIC8qIFRoZSBsYWJlbCB1c2VkIHRvIGluZGljYXRlIHRoZSB2YWx1ZSdzIGNhcmV0IHBvc2l0aW9uIHdoZW4gaXQgbG9vc2VzIGZvY3VzLiAqLwotICBwcml2YXRlIExhYmVsIGNhcmV0TGFiZWw7Ci0KLSAgLyogVGhlIHBpeGVsIG9mZnNldHMgbmVlZGVkIHRvIGFsaWduIHRoZSBsYWJlbCBpY29uIHdpdGggdGhlIGNhcmV0IGxvY2F0aW9uLgotICAgICBUaGVzZSBhcmUgZGVwZW5kZW50IG9uIHRoZSBpY29uIHVzZWQuICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQVJFVF9MQUJFTF9YX09GRlNFVCA9IC0zOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FSRVRfTEFCRUxfWV9PRkZTRVQgPSAxOTsKLQotICAKLSAgLyogRW51bWVyYXRlZCBjb25zdGFudHMgZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgYW4gZXJyb3IgbWVzc2FnZS4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTiA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJTRSA9IDI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0VSUk9SX01FU1NBR0VfVFlQRVMgPSAzOwotICAKLSAgLyogVGhlIGN1cnJlbnQgZXJyb3IgbWVzc2FnZSBmb3IgZWFjaCB0eXBlIG9mIGVycm9yLiAgQSB2YWx1ZSBvZiBudWxsIGluZGljYXRlcyBubyBtZXNzYWdlLiAKLSAgICAgVGhlIGFycmF5IGlzIGluZGV4ZWQgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBjb25zdGFudHMuCi0gICovCi0gIHByaXZhdGUgU3RyaW5nW10gY3VycmVudEVycm9yTWVzc2FnZXM7Ci0KLQotICBwdWJsaWMgUmVnZXhDb21wb3NpdGlvblBhZ2UoWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4pCi0gIHsKLSAgICBzdXBlcihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfVElUTEUiKSk7Ci0gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQotICAgIHNldFRpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfQ09NUE9TSVRJT05fUEFHRV9USVRMRSIpKTsKLSAgICBzZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBTZXQgdXAgb3VyIG1vZGVsIGFuZCB2YWxpZGF0b3IKLSAgICBub2RlID0gbmV3IFJlZ2V4Tm9kZSgpOwotICAgIC8vIHZhbGlkYXRvciA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbigiIiwgcmVnZXhGbGFncyk7Ci0gICAgICAgIAotICAgIGlzVmFsaWRUb2tlbiA9IHRydWU7Ci0KLSAgICBjdXJyZW50RXJyb3JNZXNzYWdlcyA9IG5ldyBTdHJpbmdbTlVNX0VSUk9SX01FU1NBR0VfVFlQRVNdOwotCi0gICAgLy8gVGhlIG1haW4gY29tcG9zaXRlCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTRFJfQ09NUE9TSVRJT05fUEFHRSk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCi0gICAgLy8gVGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHRva2VuIGNvbWJvIGJveCwgbGFiZWwsIGFuZCBhdXRvLWVzY2FwZSBjaGVja2JveAotICAgIENvbXBvc2l0ZSB0b2tlbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgdG9rZW5Db21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHRva2VuQ29tcG9zaXRlTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIHRva2VuQ29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICB0b2tlbkNvbXBvc2l0ZS5zZXRMYXlvdXQodG9rZW5Db21wb3NpdGVMYXlvdXQpOwotCi0KLSAgICBuZXcgTGFiZWwodG9rZW5Db21wb3NpdGUsIFNXVC5MRUZUKS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVE9LRU5fTEFCRUwiKSk7Ci0gICAgCi0gICAgdGVybXMgPSBuZXcgQ29tYm8odG9rZW5Db21wb3NpdGUsIFNXVC5EUk9QX0RPV04pOwotICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh0ZXJtcywgWFNERWRpdG9yQ29udGV4dElkcy5YU0RSX0NPTVBPU0lUSU9OX1RPS0VOKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFJlZ2V4Tm9kZS5nZXROdW1SZWdleFRlcm1zKCk7IGkrKykKLSAgICB7Ci0gICAgICB0ZXJtcy5hZGQoUmVnZXhOb2RlLmdldFJlZ2V4VGVybVRleHQoaSkpOwotICAgIH0KLSAgICB0ZXJtcy5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgQ29tYm9MaXN0ZW5lcigpKTsKLSAgICB0ZXJtcy5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfVEVSTVMiKSk7Ci0KLSAgICBlc2NhcGVDaGVja2JveCA9IG5ldyBCdXR0b24odG9rZW5Db21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgZXNjYXBlQ2hlY2tib3guc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0FVVE9fRVNDQVBFX0NIRUNLQk9YX0xBQkVMIikpOwotICAgIGVzY2FwZUNoZWNrYm94LnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9BVVRPX0VTQ0FQRV9DSEVDS0JPWCIpKTsgCi0gICAgZXNjYXBlQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IENoZWNrYm94TGlzdGVuZXIoKSk7Ci0gICAgYXV0b0VzY2FwZVN0YXR1cyA9IGZhbHNlOwotICAgIAotICAgIHRva2VuQ29tcG9zaXRlLnBhY2soKTsKLQotCi0gICAgLy8gU2V0IHVwIHRoZSBjb21wb3NpdGVzIHBlcnRhaW5pbmcgdG8gdGhlIHNlbGVjdGlvbiBvZiBvY2N1cnJlbmNlIHF1YW50aWZpZXJzCi0KLSAgICBHcm91cCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfT0NDVVJFTkNFX0xBQkVMIikpOwotICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RSX0NPTVBPU0lUSU9OX09DQ1VSUkVOQ0VfR1JPVVApOwotICAgIEdyaWRMYXlvdXQgc2VsZWN0aW9uQXJlYUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgc2VsZWN0aW9uQXJlYUxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYS5zZXRMYXlvdXQoc2VsZWN0aW9uQXJlYUxheW91dCk7Ci0KLSAgICAvLyBMaXN0ZW5lciB1c2VkIGZvciBhbGwgb2YgdGhlIHRleHQgZmllbGRzCi0gICAgVGV4dExpc3RlbmVyIHRleHRMaXN0ZW5lciA9IG5ldyBUZXh0TGlzdGVuZXIoKTsKLSAgICAKLQotICAgIC8vIEFkZCB0aGUgcmFkaW8gYnV0dG9ucwotICAgIFJhZGlvU2VsZWN0TGlzdGVuZXIgcmFkaW9TZWxlY3RMaXN0ZW5lciA9IG5ldyBSYWRpb1NlbGVjdExpc3RlbmVyKCk7Ci0KLSAgICBzaW5nbGVSYWRpbyA9IGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKFJlZ2V4Tm9kZS5TSU5HTEUsIG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCByYWRpb1NlbGVjdExpc3RlbmVyKTsKLSAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoc2luZ2xlUmFkaW8sIFhTREVkaXRvckNvbnRleHRJZHMuWFNEUl9DT01QT1NJVElPTl9KVVNUX09OQ0UpOwotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsZXIob2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIDEpOwotCi0gICAgc3RhclJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLlNUQVIsIG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCByYWRpb1NlbGVjdExpc3RlbmVyKTsKLSAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoc3RhclJhZGlvLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTRFJfQ09NUE9TSVRJT05fWkVST19PUl9NT1JFKTsKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbGVyKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCAxKTsKLQotICAgIHBsdXNSYWRpbyA9IGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKFJlZ2V4Tm9kZS5QTFVTLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHBsdXNSYWRpbywgWFNERWRpdG9yQ29udGV4dElkcy5YU0RSX0NPTVBPU0lUSU9OX09ORV9PUl9NT1JFKTsKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbGVyKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCAxKTsKLQotICAgIG9wdGlvbmFsUmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuT1BUSU9OQUwsIG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCByYWRpb1NlbGVjdExpc3RlbmVyKTsKLSAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAob3B0aW9uYWxSYWRpbywgWFNERWRpdG9yQ29udGV4dElkcy5YU0RSX0NPTVBPU0lUSU9OX09QVElPTkFMKTsKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbGVyKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCAxKTsKLQotICAgIHJlcGVhdFJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLlJFUEVBVCwgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIHJhZGlvU2VsZWN0TGlzdGVuZXIpOwotICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChyZXBlYXRSYWRpbywgWFNERWRpdG9yQ29udGV4dElkcy5YU0RSX0NPTVBPU0lUSU9OX1JFUEVBVCk7Ci0KLSAgICAvLyBBZGQgdGV4dCBmaWVsZCBmb3Igc3BlY2lmeWluZyBudW1iZXIgb2YgcmVwZWF0cwotICAgIENvbXBvc2l0ZSByZXBlYXRXaWRnZXRzID0gbmV3IENvbXBvc2l0ZShvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgU1dULk5PTkUpOwotICAgIFJvd0xheW91dCByZXBlYXRXaWRnZXRzTGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotICAgIHJlcGVhdFdpZGdldHNMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICByZXBlYXRXaWRnZXRzTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgcmVwZWF0V2lkZ2V0c0xheW91dC5tYXJnaW5MZWZ0ID0gMDsKLSAgICByZXBlYXRXaWRnZXRzTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLSAgICByZXBlYXRXaWRnZXRzLnNldExheW91dChyZXBlYXRXaWRnZXRzTGF5b3V0KTsgICAgICAgIAotICAgIAotICAgIHJlcGVhdFZhbHVlID0gbmV3IFRleHQocmVwZWF0V2lkZ2V0cywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIHJlcGVhdFZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHJlcGVhdFZhbHVlLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTRFJfQ09NUE9TSVRJT05fUkVQRUFUX1RFWFQpOwotICAgIHJlcGVhdFZhbHVlLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9SRVBFQVQiKSk7Ci0gICAgc2V0RW5hYmxlZFN0YXR1cyhSZWdleE5vZGUuUkVQRUFULCBmYWxzZSk7Ci0gICAgCi0gICAgcmVwZWF0V2lkZ2V0cy5wYWNrKCk7Ci0gICAgCi0gICAgcmFuZ2VSYWRpbyA9IGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKFJlZ2V4Tm9kZS5SQU5HRSwgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIHJhZGlvU2VsZWN0TGlzdGVuZXIpOwotICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChyYW5nZVJhZGlvLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTRFJfQ09NUE9TSVRJT05fUkFOR0UpOwotCi0gICAgLy8gQWRkIHRleHQgZmllbGRzIGFuZCBsYWJlbHMgZm9yIHNwZWNpZnlpbmcgdGhlIHJhbmdlICAgIAotICAgIENvbXBvc2l0ZSByYW5nZVdpZGdldHMgPSBuZXcgQ29tcG9zaXRlKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCBTV1QuTk9ORSk7Ci0gICAgUm93TGF5b3V0IHJhbmdlV2lkZ2V0c0xheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLSAgICByYW5nZVdpZGdldHNMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICByYW5nZVdpZGdldHNMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICByYW5nZVdpZGdldHNMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0gICAgcmFuZ2VXaWRnZXRzTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLSAgICByYW5nZVdpZGdldHMuc2V0TGF5b3V0KHJhbmdlV2lkZ2V0c0xheW91dCk7Ci0gICAgCi0gICAgcmFuZ2VNaW5WYWx1ZSA9IG5ldyBUZXh0KHJhbmdlV2lkZ2V0cywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIHJhbmdlTWluVmFsdWUuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGV4dExpc3RlbmVyKTsKLSAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFuZ2VNaW5WYWx1ZSwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RSX0NPTVBPU0lUSU9OX1JBTkdFX01JTik7Ci0gICAgcmFuZ2VNaW5WYWx1ZS5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfTUlOIikpOwotICAgIAotICAgIHJhbmdlVG9MYWJlbCA9IG5ldyBMYWJlbChyYW5nZVdpZGdldHMsIFNXVC5OT05FKTsKLSAgICByYW5nZVRvTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RPX0xBQkVMIikpOwotICAgIAotICAgIHJhbmdlTWF4VmFsdWUgPSBuZXcgVGV4dChyYW5nZVdpZGdldHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICByYW5nZU1heFZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgcmFuZ2VNYXhWYWx1ZS5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfTUFYIikpOwotICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChyYW5nZU1heFZhbHVlLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTRFJfQ09NUE9TSVRJT05fUkFOR0VfTUFYKTsKLQotICAgIHNldEVuYWJsZWRTdGF0dXMoUmVnZXhOb2RlLlJBTkdFLCBmYWxzZSk7Ci0gICAgcmFuZ2VXaWRnZXRzLnBhY2soKTsKLSAgICAKLSAgICBzaW5nbGVSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgCi0gICAgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEucGFjaygpOwotCi0gICAgLy8gVGhlIGFkZCBidXR0b24KLSAgICBhZGQgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIGFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQnV0dG9uU2VsZWN0TGlzdGVuZXIoKSk7Ci0gICAgYWRkLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9BRERfQlVUVE9OX0xBQkVMIikpOwotICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChhZGQsIFhTREVkaXRvckNvbnRleHRJZHMuWFNEUl9DT01QT1NJVElPTl9BREQpOwotICAgIGFkZC5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQUREX0JVVFRPTiIpKTsKLQotICAgIAotICAgIExhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgc2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgCi0gICAgLy8gT3VyIG1haW4gdGV4dCBib3gKLQotICAgIExhYmVsIHZhbHVlTGFiZWw9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICB2YWx1ZUxhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9DVVJSRU5UX1JFR0VYX0xBQkVMIikpOwotICAgIAotICAgIHZhbHVlID0gbmV3IFN0eWxlZFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgdmFsdWUuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGV4dExpc3RlbmVyKTsKLSAgICB2YWx1ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0ZXh0TGlzdGVuZXIpOwotICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh2YWx1ZSwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RSX0NPTVBPU0lUSU9OX0NVUlJFTlQpOwotICAgIHZhbHVlLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9DVVJSRU5UX1JFR0VYIikpOwotICAgIHZhbHVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgdmFsdWUuc2V0Rm9jdXMoKTsKLQotICAgIC8vIFN0eWxlUmFuZ2UgdXNlZCBmb3IgaGlnaGxpZ2h0aW5nIHBhcnNlIGVycm9ycwotICAgIGN1cnJlbnRFcnJvciA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0gICAgY3VycmVudEVycm9yLmxlbmd0aCA9IDE7Ci0gICAgY3VycmVudEVycm9yLmZvcmVncm91bmQgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCi0gICAgLy8gVGhlIGNhcmV0IGxhYmVsCi0gICAgY2FyZXRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICBjYXJldExhYmVsLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvUmVnZXhXaXphcmRBcnJvdy5naWYiKSk7Ci0gICAgY2FyZXRMYWJlbC5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQ0FSRVRfTEFCRUwiKSk7Ci0gICAgc2V0U2hvd0NhcmV0TGFiZWwodHJ1ZSk7Ci0KLSAgICB2YWx1ZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBUZXh0Rm9jdXNMaXN0ZW5lcigpKTsKLQotICAgIHRlcm1zLnNlbGVjdCgwKTsKLQotCi0gICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkKLSAgewotICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLSAgICB2YWx1ZS5zZXRUZXh0KHBhdHRlcm4uZ2V0TGV4aWNhbFZhbHVlKCkpOwotICAgIHZhbHVlLnNldENhcmV0T2Zmc2V0KHZhbHVlLmdldENoYXJDb3VudCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdmlzaWJsZSBzdGF0dXMgb2YgY2FyZXRMYWJlbCB0byBzdGF0dXMuICBJZiBzdGF0dXMgaXMgdHJ1ZSwgdGhlbiB3ZSBhbHNvIHVwZGF0ZSB0aGUgcG9zaXRpb24KLSAgICogb2YgY2FyZXRMYWJlbCBpbiBvbmUgb2YgdHdvIHdheXMuICBJZiB0aGVyZSBpcyBubyBhY3RpdmUgc2VsZWN0aW9uIGluIHZhbHVlLCB3ZSBzZXQgY2FyZXRMYWJlbCdzCi0gICAqIHBvc2l0aW9uIHRvIGNvcnJlc3BvbmQgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGFjdHVhbCBjYXJldC4gIEFsdGVybmF0aXZlbHksIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBzZWxlY3Rpb24KLSAgICogaW4gdmFsdWUsIHdlIHNldCBjYXJldExhYmVsJ3MgcG9zaXRpb24gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gVGhlIG5ldyB2aXNpYmlsaXR5IHN0YXR1cyBvZiBjYXJldExhYmVsLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldFNob3dDYXJldExhYmVsKGJvb2xlYW4gc3RhdHVzKQotICB7Ci0gICAgaWYgKHN0YXR1cykKLSAgICB7Ci0gIAotICAgICAgaW50IG9mZnNldDsKLSAgICAgIAotICAgICAgaWYgKHZhbHVlLmdldFNlbGVjdGlvblRleHQoKS5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBvZmZzZXQgPSB2YWx1ZS5nZXRDYXJldE9mZnNldCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvZmZzZXQgPSB2YWx1ZS5nZXRTZWxlY3Rpb24oKS54OwotICAgICAgfQotICAKLSAgICAgIFBvaW50IHAgPSB2YWx1ZS5nZXRMb2NhdGlvbkF0T2Zmc2V0KG9mZnNldCk7Ci0gICAgICAKLSAgICAgIHAueCArPSB2YWx1ZS5nZXRMb2NhdGlvbigpLng7Ci0gICAgICBwLnkgPSB2YWx1ZS5nZXRMb2NhdGlvbigpLnk7Ci0gICAgICAKLSAgICAgIC8vIFBsYWNlIHRoZSBsYWJlbCB1bmRlciB2YWx1ZSwgYW5kIG1ha2Ugc3VyZSBpdCBpcyBhbGlnbmVkIHdpdGggdGhlIGNhcmV0LgotICAgICAgLy8gVGhlIG9mZnNldHMgYXJlIGRlcGVuZGVudCBvbiB0aGUgaWNvbiB1c2VkLgotICAgICAgcC54ICs9IENBUkVUX0xBQkVMX1hfT0ZGU0VUOwotICAgICAgcC55ICs9IENBUkVUX0xBQkVMX1lfT0ZGU0VUOwotICAKLSAgICAgIGlmIChkZWJ1ZykKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQT0lOVDogIiArIHApOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXJldExhYmVsLnNldExvY2F0aW9uKHApOwotICAgICAgY2FyZXRMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY2FyZXRMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBBZGRzIGEgbmV3IHJhZGlvIGJ1dHRvbiB0byBDb21wb3NpdGUgYyB3aXRoIFNlbGVjdGlvbkxpc3RlbmVyIGwuICBUaGUgdGV4dCBvZiB0aGUgYnV0dG9uIGlzIHRoZSBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoCi0gICAqIHF1YW50aWZpZXIuCi0gICAqCi0gICAqIEBwYXJhbSBxdWFudGlmaWVyIFRoZSBkZXNpcmVkIHF1YW50aWZpZXIsIGFzIGVudW1lcmF0ZWQgaW4gUmVnZXhOb2RlLgotICAgKiBAcGFyYW0gYyBUaGUgQ29tcG9zaXRlIHRvIGFkZCB0aGUgYnV0dG9ucyB0byAobm9ybWFsbHkgb2NjdXJyZW5jZVJhZGlvQnV0dG9ucykuCi0gICAqIEBwYXJhbSBsIFRoZSBTZWxlY3Rpb25MaXN0ZW5lciAobm9ybWFsbHkgcmFkaW9TZWxlY3Rpb25MaXN0ZW5lcikuCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgYnV0dG9uLgotICAgKi8KLSAgcHJpdmF0ZSBCdXR0b24gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oaW50IHF1YW50aWZpZXIsIENvbXBvc2l0ZSBjLCBTZWxlY3Rpb25MaXN0ZW5lciBsKQotICB7Ci0gICAgQnV0dG9uIHJlc3VsdCA9IG5ldyBCdXR0b24oYywgU1dULlJBRElPKTsKLSAgICByZXN1bHQuc2V0VGV4dChSZWdleE5vZGUuZ2V0UXVhbnRpZmllclRleHQocXVhbnRpZmllcikpOwotICAgIHJlc3VsdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIHRoZSByZWdleCBpbiB2YWx1ZS4gIElmIHRoZSByZWdleCBpcyB2YWxpZCwgY2xlYXJzIHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlLiAgSWYgaXQncyBub3QgdmFsaWQsCi0gICAqICBzZXRzIHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlIGFjY29yZGluZ2x5LgotICAgKgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIHJlZ2V4IGlzIHZhbGlkLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUmVnZXgoKQotICB7Ci0KLSAgICBib29sZWFuIGlzVmFsaWQ7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gV2UgdmFsaWRhdGUgdGhlIHJlZ2V4IGJ5IGNoZWNraW5nIHdoZXRoZXIgd2UgZ2V0IGEgUGFyc2VFeGNlcHRpb24uCi0gICAgICAvLyBCeSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhhdCBpdCdzIHZhbGlkIHVubGVzcyB3ZSBkZXRlcm1pbmUgb3RoZXJ3aXNlLgotICAgICAgaXNWYWxpZCA9IHRydWU7Ci0gICAgICBkaXNwbGF5UmVnZXhFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICB2YWx1ZS5zZXRTdHlsZVJhbmdlKG51bGwpOwotCi0gICAgICAvLyB2YWxpZGF0b3Iuc2V0UGF0dGVybih2YWx1ZS5nZXRUZXh0KCkpOwotICAgICAgdmFsaWRhdG9yID0gUGF0dGVybi5jb21waWxlKHZhbHVlLmdldFRleHQoKSk7Ci0gICAgfQotICAgIC8vIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkKLSAgICBjYXRjaCAoUGF0dGVyblN5bnRheEV4Y2VwdGlvbiBwZSkKLSAgICB7Ci0gICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgICBkaXNwbGF5UmVnZXhFcnJvck1lc3NhZ2UocGUuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgLy8gQW4gb2ZmLWJ5LW9uZSBidWcgaW4gdGhlIHhlcmNlcyByZWdleCBwYXJzZXIgd2lsbCBzb21ldGltZXMgcmV0dXJuIGEgbG9jYXRpb24gZm9yIHRoZSBwYXJzZUVycm9yIHRoYXQKLSAgICAgIC8vICBpcyBvZmYgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiB3ZSB3YW50IHRvIGhpZ2hsaWdodCB0aGUgbGFzdCBjaGFyYWN0ZXIuCi0gICAgICBpZiAocGUuZ2V0SW5kZXgoKSA+PSB2YWx1ZS5nZXRUZXh0KCkubGVuZ3RoKCkpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFcnJvci5zdGFydCA9IHZhbHVlLmdldFRleHQoKS5sZW5ndGgoKSAtIDE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFcnJvci5zdGFydCA9IHBlLmdldEluZGV4KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWJ1ZykKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJzZSBFcnJvciBsb2NhdGlvbjogIiArIHBlLmdldEluZGV4KCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImN1cnJlbnRFcnJvci5zdGFydDogIiArIGN1cnJlbnRFcnJvci5zdGFydCk7Ci0gICAgICB9Ci0KLSAgICAgIHZhbHVlLnNldFN0eWxlUmFuZ2UoY3VycmVudEVycm9yKTsKLQotICAgIH0KLQotICAgIC8vIEFub3RoZXIgYnVnIGluIHRoZSB4ZXJjZXMgcGFyc2VyIHdpbGwgc29tZXRpbWVzIHRocm93IGEgUnVudGltZUV4Y2VwdGlvbiBpbnN0ZWFkIG9mIGEgUGFyc2VFeGNlcHRpb24uCi0gICAgLy8gIFdoZW4gd2UgZ2V0IGEgUnVudGltZUV4Y2VwdGlvbiwgd2UgYXJlbid0IHByb3ZpZGVkIHdpdGggdGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBoaWdobGlnaHQKLSAgICAvLyAgdGhlIHBhcnNlIGVycm9yLiAgU28sIHdlIG1lcmVseSByZXBvcnQgdGhhdCB0aGVyZSBpcyBhbiBlcnJvci4KLSAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkKLSAgICB7Ci0gICAgICBkaXNwbGF5UmVnZXhFcnJvck1lc3NhZ2UoIiIpOwotICAgICAgdmFsdWUuc2V0U3R5bGVSYW5nZShudWxsKTsKLSAgICAgIGlzVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgc2V0UGFnZUNvbXBsZXRlKGlzVmFsaWQpOyAgICAKLSAgICByZXR1cm4gaXNWYWxpZDsKLSAgfQotCi0gIAotICAvKioKLSAgICogTWFuYWdlcyB0aGUgZGlzcGxheSBvZiBlcnJvciBtZXNzYWdlcy4KLSAgICogU2V0cyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdHlwZSB0byBlcnJvck1lc3NhZ2UuICBJZiBlcnJvck1lc3NhZ2UgIT0gbnVsbCwgdGhlbiB3ZSBzZXQgdGhlIFdpemFyZCdzIGVycm9yIG1lc3NhZ2UKLSAgICogdG8gZXJyb3JNZXNzYWdlLiAgSWYgZXJyb3JNZXNzYWdlID09IG51bGwsIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgcGVuZGluZyBtZXNzYWdlIG9mIGFub3RoZXIgdHlwZS4KLSAgICogSWYgd2UgZG8sIHRoZW4gaXQgaXMgZGlzcGxheWVkIGFzIHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlLiAgSWYgd2UgZG9uJ3QsIHRoZW4gdGhlIFdpemFyZCdzIGVycm9yIG1lc3NhZ2UgZmllbGQKLSAgICogaXMgY2xlYXJlZC4KLSAgICoKLSAgICogQHBhcmFtIGVycm9yTWVzc2FnZSBUaGUgdGV4dCBvZiB0aGUgbmV3IGVycm9yIG1lc3NhZ2UuICBBIHZhbHVlIG9mIG51bGwgaW5kaWNhdGVzIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkCi0gICAqICBiZSBjbGVhcmVkLgotICAgKiBAcGFyYW0gdHlwZSBUaGUgZXJyb3IgdHlwZSwgb25lIG9mIFBBUlNFLCBUT0tFTiwgb3IgU0VMRUNUSU9OLgotICAgKi8gCi0gIHByaXZhdGUgdm9pZCBkaXNwbGF5RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UsIGludCB0eXBlKQotICB7Ci0gICAgU3RyaW5nIG1lc3NhZ2VUb0Rpc3BsYXkgPSBudWxsOwotCi0KLSAgICBjdXJyZW50RXJyb3JNZXNzYWdlc1t0eXBlXSA9IGVycm9yTWVzc2FnZTsKLQotICAgIG1lc3NhZ2VUb0Rpc3BsYXkgPSBlcnJvck1lc3NhZ2U7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9FUlJPUl9NRVNTQUdFX1RZUEVTOyBpKyspCi0gICAgewotICAgICAgaWYgKG1lc3NhZ2VUb0Rpc3BsYXkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBtZXNzYWdlVG9EaXNwbGF5ID0gY3VycmVudEVycm9yTWVzc2FnZXNbaV07Ci0gICAgfQotCi0gICAgc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2VUb0Rpc3BsYXkpOwotICB9Ci0KLQotICAvKioKLSAgICogU2V0cyB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZSB0byBtZXNzYWdlLCBwcmVjZWRlZCBieSBhIHN0YW5kYXJkIHByZWZpeC4KLSAgICoKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG5ldyBlcnJvciBtZXNzYWdlIChvciBudWxsIHRvIGNsZWFyIGl0KS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBkaXNwbGF5UmVnZXhFcnJvck1lc3NhZ2UgKFN0cmluZyBlcnJvck1lc3NhZ2UpCi0gIHsKLSAgICBpZiAoZXJyb3JNZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgZGlzcGxheUVycm9yTWVzc2FnZShudWxsLCBQQVJTRSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgCWlmIChlcnJvck1lc3NhZ2UudHJpbSgpLmVxdWFscygiIikpIC8vIHdoZW4gdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUuCi0gICAgCXsKLSAgICAgICAgZGlzcGxheUVycm9yTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfUkVHRVhfRVJST1IiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUlNFKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGlzcGxheUVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UsIFBBUlNFKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBVcGRhdGVzIHRoZSB0b2tlbiBzdGF0dXMuICBTZXRzIGlzVmFsaWRUb2tlbiB0byBzdGF0dXMgJiYgdGhlIHN0YXR1cyBvZiB0aGUgb3RoZXIgZXJyb3IgdHlwZS4KLSAgICogSWYgc3RhdHVzIGlzIHRydWUsIHdlIGNsZWFyIHRoZSB3aXphcmQncyBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHR5cGU7IGlmIGl0IGlzIGZhbHNlLCB3ZSBzZXQgaXQgdG8gZXJyb3JNZXNzYWdlLgotICAgKgotICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBuZXcgaXNWYWxpZFRva2VuIHZhbHVlLgotICAgKiBAcGFyYW0gZXJyb3JNZXNzYWdlIFRoZSBuZXcgZXJyb3IgbWVzc2FnZS4KLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGVycm9yIChlaXRoZXIgVE9LRU4gb3IgU0VMRUNUSU9OKS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRUb2tlblN0YXR1cyAoYm9vbGVhbiBzdGF0dXMsIFN0cmluZyBlcnJvck1lc3NhZ2UsIGludCB0eXBlKQotICB7Ci0gICAgYm9vbGVhbiBvdGhlclR5cGVTdGF0dXMgPSAgICAgKHR5cGUgPT0gVE9LRU4pID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVycm9yTWVzc2FnZXNbU0VMRUNUSU9OXSA9PSBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RXJyb3JNZXNzYWdlc1tUT0tFTl0gPT0gbnVsbDsKLSAgICAKLSAgICBpc1ZhbGlkVG9rZW4gPSBzdGF0dXMgJiYgb3RoZXJUeXBlU3RhdHVzOwotICAgIGFkZC5zZXRFbmFibGVkKGlzVmFsaWRUb2tlbik7Ci0KLSAgICBpZiAoc3RhdHVzKQotICAgIHsKLSAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UobnVsbCwgdHlwZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiBlcnJvck1lc3NhZ2UudHJpbSgpLmVxdWFscygiIikpIC8vIHdoZW4gdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUuCi0gICAgCXsKLSAgICAgICAgZGlzcGxheUVycm9yTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfVE9LRU5fRVJST1IiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkaXNwbGF5RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSwgdHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBVcGRhdGVzIHRoZSB0b2tlbiBzdGF0dXMuICBTZXRzIGlzVmFsaWRUb2tlbiB0byBzdGF0dXMgJiYgdGhlIHN0YXR1cyBvZiB0aGUgb3RoZXIgZXJyb3IgdHlwZS4KLSAgICogQWxzbyBjbGVhcnMgdGhlIHdpemFyZCdzIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgdHlwZS4KLSAgICogVXN1YWxseSB1c2VkIHRvIHNldCBpc1ZhbGlkVG9rZW4gdG8gdHJ1ZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgbmV3IGlzVmFsaWRUb2tlbiB2YWx1ZS4KLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGVycm9yIChlaXRoZXIgVE9LRU4gb3IgU0VMRUNUSU9OKS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRUb2tlblN0YXR1cyhib29sZWFuIHN0YXR1cywgaW50IHR5cGUpCi0gIHsKLSAgICBzZXRUb2tlblN0YXR1cyhzdGF0dXMsIG51bGwsIHR5cGUpOwotICB9Ci0KLQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbmFibGVkIHN0YXR1cyBvZiB0aGUgdGV4dCBmaWVsZHMgYW5kIGxhYmVscyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBxdWFudGlmaWVyLgotICAgKiBJZiBzdGF0dXMgaXMgdHJ1ZSwgdGhlbiBmaWVsZHMgYW5kIGxhYmVscyBhc3NvY2lhdGVkIHdpdGggb3RoZXIgcXVhbnRpZmllcnMgYXJlIGRpc2FibGVkLgotICAgKiBAcGFyYW0gcXVhbnRpZmllciBUaGUgcXVhbnRpZmllciB3aG9zZSBlbGVtZW50cycgZW5hYmxlZCBzdGF0dXMgd2Ugd2lzaCB0byBjaGFuZ2UKLSAgICogICAoYXMgZW51bWVyYXRlZCBpbiBSZWdleE5vZGUpLgotICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBuZXcgc3RhdHVzIG9mIHRoZSBlbGVtZW50cy4gIElmIHRydWUsIHRoZW4gYWxsIGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBvdGhlciBidXR0b25zCi0gICAqICAgICAgICAgICAgICAgYXJlIGRpc2FibGVkLgotICAgKi8gICAgCi0gIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkU3RhdHVzKGludCBxdWFudGlmaWVyLCBib29sZWFuIHN0YXR1cykKLSAgewotICAgIHN3aXRjaCAocXVhbnRpZmllcikKLSAgICB7Ci0gICAgCi0gICAgY2FzZSBSZWdleE5vZGUuUkVQRUFUOgotICAgICAgcmVwZWF0VmFsdWUuc2V0RW5hYmxlZChzdGF0dXMpOwotICAgICAgaWYgKHN0YXR1cykKLSAgICAgIHsKLSAgICAgICAgcmFuZ2VNaW5WYWx1ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgcmFuZ2VNYXhWYWx1ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgcmFuZ2VUb0xhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJlZ2V4Tm9kZS5SQU5HRToKLSAgICAgIHJhbmdlTWluVmFsdWUuc2V0RW5hYmxlZChzdGF0dXMpOwotICAgICAgcmFuZ2VNYXhWYWx1ZS5zZXRFbmFibGVkKHN0YXR1cyk7Ci0gICAgICByYW5nZVRvTGFiZWwuc2V0RW5hYmxlZChzdGF0dXMpOwotICAgICAgaWYgKHN0YXR1cykKLSAgICAgIHsKLSAgICAgICAgcmVwZWF0VmFsdWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc2VsZWN0aW9uIGluIHZhbHVlLiAgSWYgdGhlcmUgaXMgbm90LCB3ZSBzZXQgdGhlIFdpemFyZCdzIGVycm9yIG1lc3NhZ2UgYWNjb3JkaW5nbHkuCi0gICAqIElmIHRoZXJlIGlzLCB3ZSB1cGRhdGUgdGhlIGNvbnRlbnRzIG9mIG5vZGUuICBJZiAiQ3VycmVudCBTZWxlY3Rpb24iIGlzIG5vdCB0aGUgY3VycmVudCB0b2tlbiwgdGhlbgotICAgKiB3ZSBjbGVhciB0aGUgU2VsZWN0aW9uIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotICBwcml2YXRlIHZvaWQgdXBkYXRlQ3VycmVudFNlbGVjdGlvblN0YXR1cygpCi0gIHsKLSAgICBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBSZWdleE5vZGUuU0VMRUNUSU9OKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSB2YWx1ZS5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uLmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIHNldFRva2VuU3RhdHVzKGZhbHNlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfU0VMRUNUSU9OX0VSUk9SIiksIFNFTEVDVElPTik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIFNFTEVDVElPTik7Ci0gICAgICAgIG5vZGUuc2V0Q29udGVudHMoc2VsZWN0aW9uKTsKLSAgICAgICAgbm9kZS5zZXRIYXNQYXJlbnModHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRUb2tlblN0YXR1cyh0cnVlLCBTRUxFQ1RJT04pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBVcGRhdGVzIHRoZSBlbmFibGVkIHN0YXR1cyBvZiB0aGUgYXV0by1lc2NhcGUgY2hlY2tib3guICBJZiBzdGF0dXMgaXMgdHJ1ZSwgd2UgZW5hYmxlIHRoZSBjaGVja2JveCwgYW5kCi0gICAqIHNldCBpdHMgc2VsZWN0aW9uIHN0YXR1cyBhbmQgbm9kZSdzIGF1dG8tZXNjYXBlIHN0YXR1cyB0byB0aGUgdmFsdWUgb2YgYXV0b0VzY2FwZVN0YXR1cy4gIElmIHN0YXR1cyBpcwotICAgKiBmYWxzZSwgdGhlbiB3ZSBkaXNhYmxlIGFuZCBkZXNlbGVjdCB0aGUgY2hlY2tib3gsIGFuZCBzZXQgbm9kZSdzIHN0YXR1cyB0byBmYWxzZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgbmV3IGVuYWJsZWQgc3RhdHVzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldEVzY2FwZUNoZWNrYm94RW5hYmxlZFN0YXR1cyhib29sZWFuIHN0YXR1cykKLSAgewotICAgIGlmIChzdGF0dXMpCi0gICAgewotICAgICAgZXNjYXBlQ2hlY2tib3guc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIGVzY2FwZUNoZWNrYm94LnNldFNlbGVjdGlvbihhdXRvRXNjYXBlU3RhdHVzKTsKLSAgICAgIG5vZGUuc2V0QXV0b0VzY2FwZVN0YXR1cyhhdXRvRXNjYXBlU3RhdHVzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVzY2FwZUNoZWNrYm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgZXNjYXBlQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIG5vZGUuc2V0QXV0b0VzY2FwZVN0YXR1cyhmYWxzZSk7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCByZWdleCBmbGFncy4KLSAgICovCi0gIFN0cmluZyBnZXRGbGFncygpCi0gIHsKLSAgICByZXR1cm4gcmVnZXhGbGFnczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFhTRFBhdHRlcm4gbW9kZWwuCi0gICAqLwotICBYU0RQYXR0ZXJuRmFjZXQgZ2V0UGF0dGVybigpCi0gIHsKLSAgICByZXR1cm4gcGF0dGVybjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBzdHJpbmcgY29uc2lzdGluZyBvZiB0aGUgdmFsdWVzIG9mIG1pbiwgbWF4LCBhbmQgcmVwZWF0IHN0b3JlZCBpbiBub2RlLgotICAgKiBVc2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KLSAgICovICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0QWxsRmllbGRWYWx1ZXMoKQotICB7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgICByZXN1bHQgKz0gIk1pbjogIiArIG5vZGUuZ2V0TWluKCkgKyAiXG4iOwotICAgICAgcmVzdWx0ICs9ICJNYXg6ICIgKyBub2RlLmdldE1heCgpICsgIlxuIjsKLSAgICAgIHJlc3VsdCArPSAiUmVwZWF0OiAiICsgbm9kZS5nZXRSZXBlYXQoKSArICJcbiI7Ci0gICAgICByZXN1bHQgKz0gIlxuIjsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0KLSAgLyogTGlzdGVuZXIgZm9yIHRoZSBhZGQgYnV0dG9uLiAqLwotICBjbGFzcyBCdXR0b25TZWxlY3RMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgfQotCi0gICAgLy8gUHJlY29uZGl0aW9uOiBpc1ZhbGlkVG9rZW4gPT0gdHJ1ZSAgCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBpZiAoIWlzVmFsaWRUb2tlbikgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF0dGVtcHRlZCB0byBhZGQgYW4gaW52YWxpZCB0b2tlbi4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5vZGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRBbGxGaWVsZFZhbHVlcygpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvLyBXaGV0aGVyIHRoZXJlIGlzIGFueXRoaW5nIHNlbGVjdGVkIGluIHZhbHVlLgotICAgICAgYm9vbGVhbiBpc0FjdGl2ZVNlbGVjdGlvbiA9IHZhbHVlLmdldFNlbGVjdGlvbkNvdW50KCkgIT0gMDsKLSAgICAgIAotICAgICAgdmFsdWUuaW5zZXJ0KG5vZGUudG9TdHJpbmcoKSk7Ci0KLSAgICAgIGlmICh0ZXJtcy5nZXRTZWxlY3Rpb25JbmRleCgpID09IFJlZ2V4Tm9kZS5TRUxFQ1RJT04pCi0gICAgICB7Ci0gICAgICAgIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgbm90aGluZyBpcyBzZWxlY3RlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkdmFuY2UgdGhlIGNhcmV0IGxvY2F0aW9uLgotICAgICAgaWYgKCFpc0FjdGl2ZVNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmFsdWUuc2V0Q2FyZXRPZmZzZXQodmFsdWUuZ2V0Q2FyZXRPZmZzZXQoKSArIG5vZGUudG9TdHJpbmcoKS5sZW5ndGgoKSk7Ci0gICAgICB9Ci0KLSAgICAgIHZhbHVlLnNldEZvY3VzKCk7Ci0KLSAgICB9Ci0KLSAgfQotIAotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgdGVybXMgY29tYm8gYm94LiAqLwotICBjbGFzcyBDb21ib0xpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpCi0gICAgewotICAgICAgCi0gICAgICB1cGRhdGVDdXJyZW50U2VsZWN0aW9uU3RhdHVzKCk7Ci0KLSAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyB0eXBlZCBpbiBhIHRva2VuCi0gICAgICBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgc2V0RXNjYXBlQ2hlY2tib3hFbmFibGVkU3RhdHVzKHRydWUpOwotICAgICAgICBub2RlLnNldENvbnRlbnRzKHRlcm1zLmdldFRleHQoKSk7Ci0gICAgICAgIG5vZGUuc2V0SGFzUGFyZW5zKHRydWUpOwotICAgICAgICAKLQotICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGVybXMuZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0ZXJtcy5nZXRTZWxlY3Rpb25JbmRleCgpID09IFJlZ2V4Tm9kZS5TRUxFQ1RJT04pCi0gICAgICB7Ci0gICAgICAgIHNldEVzY2FwZUNoZWNrYm94RW5hYmxlZFN0YXR1cyhmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5vZGUuc2V0Q29udGVudHMoUmVnZXhOb2RlLmdldFJlZ2V4VGVybVZhbHVlKHRlcm1zLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLSAgICAgICAgbm9kZS5zZXRIYXNQYXJlbnMoZmFsc2UpOwotICAgICAgICBzZXRFc2NhcGVDaGVja2JveEVuYWJsZWRTdGF0dXMoZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogTGlzdGVuZXIgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyBjYXJldExhYmVsLiAqLwotICBjbGFzcyBUZXh0Rm9jdXNMaXN0ZW5lciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkKLSAgICB7Ci0gICAgICBzZXRTaG93Q2FyZXRMYWJlbChmYWxzZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpCi0gICAgewotICAgICAgc2V0U2hvd0NhcmV0TGFiZWwodHJ1ZSk7Ci0gICAgfQotICB9Ci0KLQotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgdGV4dCBmaWVsZHMuICovCi0gIGNsYXNzIFRleHRMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkKLSAgICB7Ci0KLSAgICAgIGlmIChkZWJ1ZykKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnNpZGUgVGV4dExpc3RlbmVyIGhhbmRsZXIiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0QWxsRmllbGRWYWx1ZXMoKSk7Ci0gICAgICB9Ci0KLQotICAgICAgaWYgKCAoZS53aWRnZXQgPT0gdmFsdWUpICYmIChlLnR5cGUgPT0gU1dULk1vZGlmeSkgKQotICAgICAgewotICAgICAgICBwYXR0ZXJuLnNldExleGljYWxWYWx1ZSh2YWx1ZS5nZXRUZXh0KCkpOwotICAgICAgICB2YWxpZGF0ZVJlZ2V4KCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHZhbHVlICYmIGUudHlwZSA9PSBTV1QuU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBSZWdleE5vZGUuU0VMRUNUSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgdXBkYXRlQ3VycmVudFNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJhbmdlTWluVmFsdWUpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IG5vZGUuc2V0TWluKHJhbmdlTWluVmFsdWUuZ2V0VGV4dCgpKTsKLQotICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIG51bGwsIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NSU5fRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSByYW5nZU1heFZhbHVlKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBub2RlLnNldE1heChyYW5nZU1heFZhbHVlLmdldFRleHQoKSk7Ci0KLSAgICAgICAgaWYgKG5vZGUuZ2V0TWluKCkgPT0gUmVnZXhOb2RlLkVNUFRZKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0VG9rZW5TdGF0dXMoZmFsc2UsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfTUlTU0lOR19NSU5fRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1ZhbGlkKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0VG9rZW5TdGF0dXModHJ1ZSwgbnVsbCwgVE9LRU4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKGZhbHNlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfTUFYX0VSUk9SX1NVRkZJWCIpLCBUT0tFTik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZSAgLy8gKGUud2lkZ2V0ID09IHJlcGVhdFZhbHVlKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBub2RlLnNldFJlcGVhdChyZXBlYXRWYWx1ZS5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIG51bGwsIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFUEVBVF9FUlJPUl9TVUZGSVgiKSwgVE9LRU4pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogTGlzdGVuZXIgZm9yIHRoZSBhdXRvLWVzY2FwZSBjaGVja2JveC4gKi8KLSAgY2xhc3MgQ2hlY2tib3hMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBib29sZWFuIG5ld1N0YXR1cyA9ICFhdXRvRXNjYXBlU3RhdHVzOwotICAgICAgbm9kZS5zZXRBdXRvRXNjYXBlU3RhdHVzKG5ld1N0YXR1cyk7Ci0gICAgICBhdXRvRXNjYXBlU3RhdHVzID0gbmV3U3RhdHVzOwotICAgICAgCi0gICAgICBpZiAoZGVidWcpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXV0b0VzY2FwZSBTdGF0dXM6ICIgKyBub2RlLmdldEF1dG9Fc2NhcGVTdGF0dXMoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgcmFkaW8gYnV0dG9ucy4gKi8KLSAgY2xhc3MgUmFkaW9TZWxlY3RMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBpZiAoZGVidWcpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRBbGxGaWVsZFZhbHVlcygpKTsKLSAgICAgIH0KLQotCi0gICAgICBpbnQgY3VycmVudFF1YW50aWZpZXIgPSBnZXRRdWFudGlmaWVyKGUpOwotCi0gICAgICBub2RlLnNldFF1YW50aWZpZXIoY3VycmVudFF1YW50aWZpZXIpOwotCi0gICAgICBzd2l0Y2ggKGN1cnJlbnRRdWFudGlmaWVyKQotICAgICAgewotICAgICAgY2FzZSBSZWdleE5vZGUuU0lOR0xFOiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgY2FzZSBSZWdleE5vZGUuU1RBUjoKLSAgICAgIGNhc2UgUmVnZXhOb2RlLlBMVVM6Ci0gICAgICBjYXNlIFJlZ2V4Tm9kZS5PUFRJT05BTDoKLSAgICAgICAgc2V0RW5hYmxlZFN0YXR1cyhSZWdleE5vZGUuUkVQRUFULCBmYWxzZSk7Ci0gICAgICAgIHNldEVuYWJsZWRTdGF0dXMoUmVnZXhOb2RlLlJBTkdFLCBmYWxzZSk7Ci0gICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIFRPS0VOKTsKLSAgICAgICAgYnJlYWs7IAotCi0gICAgICBjYXNlIFJlZ2V4Tm9kZS5SRVBFQVQ6Ci0gICAgICAgIHNldEVuYWJsZWRTdGF0dXMoUmVnZXhOb2RlLlJFUEVBVCwgdHJ1ZSk7Ci0gICAgICAgIHNldFRva2VuU3RhdHVzKG5vZGUuaGFzVmFsaWRSZXBlYXQoKSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFUEVBVF9FUlJPUl9TVUZGSVgiKSwgVE9LRU4pOwotICAgICAgICByZXBlYXRWYWx1ZS5zZXRGb2N1cygpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBSZWdleE5vZGUuUkFOR0U6Ci0gICAgICAgIHNldEVuYWJsZWRTdGF0dXMoUmVnZXhOb2RlLlJBTkdFLCB0cnVlKTsKLSAgICAgICAgU3RyaW5nIGVycm9yID0gKG5vZGUuaGFzVmFsaWRNaW4oKSkgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfTUFYX0VSUk9SX1NVRkZJWCIpIDogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX01JTl9FUlJPUl9TVUZGSVgiKTsKLQotICAgICAgICBzZXRUb2tlblN0YXR1cyggbm9kZS5oYXNWYWxpZE1pbigpICYmIG5vZGUuaGFzVmFsaWRNYXgoKSwgZXJyb3IsIFRPS0VOKTsKLSAgICAgICAgcmFuZ2VNaW5WYWx1ZS5zZXRGb2N1cygpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRRdWFudGlmaWVyKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotCi0gICAgICBpZiAoZS53aWRnZXQgPT0gc2luZ2xlUmFkaW8pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBSZWdleE5vZGUuU0lOR0xFOwotICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBzdGFyUmFkaW8pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBSZWdleE5vZGUuU1RBUjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gcGx1c1JhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLlBMVVM7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG9wdGlvbmFsUmFkaW8pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBSZWdleE5vZGUuT1BUSU9OQUw7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJlcGVhdFJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLlJFUEVBVDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gcmFuZ2VSYWRpbykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5SQU5HRTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZWxzZSAvLyBjYW4ndCBnZXQgaGVyZQotICAgICAgeyAKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5FTVBUWTsKLSAgICAgIH0KLSAgICB9IAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODQ0NzA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci0KLQotY2xhc3MgUmVnZXhOb2RlCi17Ci0gIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRzOwotICBwcml2YXRlIGludCBtaW47Ci0gIHByaXZhdGUgaW50IG1heDsKLSAgcHJpdmF0ZSBpbnQgcmVwZWF0OwotICBwcml2YXRlIGludCBxdWFudGlmaWVyOwotICBwcml2YXRlIGJvb2xlYW4gaGFzUGFyZW5zOwotICBwcml2YXRlIGJvb2xlYW4gYXV0b0VzY2FwZVN0YXR1czsKLQotICAKLSAgLyogUXVhbnRpZmllcnMuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTkdMRSA9IDA7ICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExVUyA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTkFMID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQRUFUID0gNDsgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBTkdFID0gNTsKLQotICAvKiBSZWdleCBxdWFudGlmaWVycy4gIEZpcnN0IGNvbHVtbiBpcyB0aGUgb24tc2NyZWVuIHRleHR1YWwgcmVwcmVzZW50YXRpb24sIHNlY29uZCBjb2x1bW4gaXMgdGhlIAotICAgb24tc2NyZWVuIHJlZ2V4IHJlcHJlc2VudGF0aW9uLiAgVGhlIHR3byBhcmUgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyIHRvIGZvcm0gdGhlIG9uLXNjcmVlbgotICAgcmVwcmVzZW50YXRpb24uCi0gICBJbmRleGluZyBvZiB0aGlzIGFycmF5IG11c3QgY29ycmVzcG9uZCB0byB0aGUgdmFsdWVzIG9mIHRoZSBxdWFudGlmaWVyIGNvbnN0YW50cyBhYm92ZS4KLSAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSByZWdleFF1YW50aWZpZXJzID0KLSAgeyAKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9TSU5HTEUiKSwgICAiIiAgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9TVEFSIiksICAgICAiKiIgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9QTFVTIiksICAgICAiKyIgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9PUFRJT05BTCIpLCAiPyIgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9SRVBFQVQiKSwgICAiIiAgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9SQU5HRSIpLCAgICAiIiAgfSwKLSAgfTsKLQotCi0gIC8qIFJlZ2V4IHRva2Vucy4gIEZpcnN0IGNvbHVtbiBpcyB0aGUgb24tc2NyZWVuIHJlcHJlc2VudGF0aW9uLCBzZWNvbmQgY29sdW1uIGlzIHRoZSByZWdleCByZXByZXNlbnRhdGlvbi4gCi0gICAgIE1vcmUgdG9rZW5zIGNhbiBiZSBhZGRlZCwgYnV0IGl0IGlzIGFzc3VtZWQgdGhhdCAiQ3VycmVudCBTZWxlY3Rpb24iIGlzIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgotICAgICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIFNFTEVDVElPTiBjb25zdGFudCBiZWxvdyB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZCAKLSAgICAgYWNjb3JkaW5nbHkuCi0gICAgIEFsc28gbm90ZSB0aGF0IGJlY2F1c2UgdGhlc2UgYXJlIGphdmEgU3RyaW5ncywgYmFja3NsYXNoZXMgbXVzdCBiZSBlc2NhcGVkICh0aGlzIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlCi0gICAgIHNlY29uZCBjb2x1bW4gb2YgdGhlIGFycmF5KS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdW10gcmVnZXhUZXJtcyA9Ci0gIHsgCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fQU5ZX0NIQVIiKSwgICAiLiIgICAgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fQUxQSEFOVU1FUklDX0NIQVIiKSwgICAiXFx3IiAgICAgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVSTV9XSElURVNQQUNFIiksICJcXHMiICAgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVSTV9ESUdJVCIpLCAgICAgICJcXGQiICAgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVSTV9VUFBFUiIpLCAgICAgICJbQS1aXSIgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVSTV9MT1dFUiIpLCAgICAgICJbYS16XSIgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVSTV9TRUxFQ1RJT04iKSwgICIiICAgICAgfSwKLSAgfTsKLQotICAvKiBUb2tlbiBlbnVtZXJhdGVkIGNvbnN0YW50cy4gKi8KLQotICAvLyBTRUxFQ1RJT04gbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBpbmRleCBpbiByZWdleFRlcm1zIG9mICJDdXJyZW50IFNlbGVjdGlvbiIuICBUaGlzIGlzIGFzc3VtZWQgdG8gYmUKLSAgLy8gIHRoZSBsYXN0IGVsZW1lbnQuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTiA9IHJlZ2V4VGVybXMubGVuZ3RoIC0gMTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTVBUWSA9IC0xOwotCi0gIC8qIAotICBUaGUgbWV0YWNoYXJhY3RlcnMgcmVjb2duaXplZCBieSBYTUwgU2NoZW1hLgotICBOb3RlIHRoYXQgdGhlIGRvdWJsZSBiYWNrc2xhc2ggKCJcXCIpIGFjdHVhbGx5IHJlcHJlc2VudHMgYW4gZXNjYXBlZCBzaW5nbGUgYmFja3NsYXNoIGNoYXJhY3RlciAoIlwiKS4KLSAgKi8gCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtZXRhY2hhcmFjdGVycyA9ICIuXFw/Kit7fSgpW10iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVnZXhUZXJtVGV4dChpbnQgaSkKLSAgewotICAgIGlmIChpID09IFNFTEVDVElPTikKLSAgICB7Ci0gICAgICByZXR1cm4gcmVnZXhUZXJtc1tpXVswXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiByZWdleFRlcm1zW2ldWzBdICsgIiAoICIgKyByZWdleFRlcm1zW2ldWzFdICsgIiApIjsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWdleFRlcm1WYWx1ZShpbnQgaSkKLSAgewotICAgIGlmIChpID09IFNFTEVDVElPTikgLy8gc2hvdWxkbid0IGhhcHBlbgotICAgIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiByZWdleFRlcm1zW2ldWzFdOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldE51bVJlZ2V4VGVybXMoKQotICB7Ci0gICAgcmV0dXJuIHJlZ2V4VGVybXMubGVuZ3RoOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UXVhbnRpZmllclRleHQoaW50IGkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gcmVnZXhRdWFudGlmaWVyc1tpXVswXTsKLSAgICAKLSAgICBpZiAoIXJlZ2V4UXVhbnRpZmllcnNbaV1bMV0uZXF1YWxzKCIiKSkKLSAgICB7Ci0gICAgICByZXN1bHQgKz0gIiAoICI7Ci0gICAgICByZXN1bHQgKz0gcmVnZXhRdWFudGlmaWVyc1tpXVsxXTsKLSAgICAgIHJlc3VsdCArPSAiICkiOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgUmVnZXhOb2RlKCkKLSAgewotICAgIHRoaXMuY29udGVudHMgPSAiIjsKLSAgICB0aGlzLnF1YW50aWZpZXIgPSBTSU5HTEU7Ci0gICAgdGhpcy5taW4gPSBFTVBUWTsKLSAgICB0aGlzLm1heCA9IEVNUFRZOwotICAgIHRoaXMucmVwZWF0ID0gRU1QVFk7Ci0gICAgdGhpcy5oYXNQYXJlbnMgPSBmYWxzZTsKLQotICB9Ci0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudHMoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50cyhTdHJpbmcgY29udGVudHMpCi0gIHsKLSAgICB0aGlzLmNvbnRlbnRzID0gY29udGVudHM7Ci0gIH0KLQotCi0gIHB1YmxpYyBpbnQgZ2V0UXVhbnRpZmllcigpCi0gIHsKLSAgICByZXR1cm4gcXVhbnRpZmllcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFF1YW50aWZpZXIoaW50IHF1YW50aWZpZXIpCi0gIHsKLSAgICB0aGlzLnF1YW50aWZpZXIgPSBxdWFudGlmaWVyOwotICB9Ci0KLQotICBwdWJsaWMgaW50IGdldE1pbigpCi0gIHsKLSAgICByZXR1cm4gbWluOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWluKGludCBtaW4pCi0gIHsKLSAgICB0aGlzLm1pbiA9IG1pbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoaXMubWluIHRvIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIG1pbiBpZmYgbWluIGlzIGEgdmFsaWQgdmFsdWUgKGkuZS4gZ3JlYXRlciB0aGFuIDApLgotICAgKiBTZXRzIHRoaXMubWluIHRvIEVNUFRZIGlmIGl0IGlzIG5vdC4KLSAgICoKLSAgICogQHBhcmFtIG1pbiBUaGUgbmV3IG1pbiB2YWx1ZQotICAgKiBAcmV0dXJucyBXaGV0aGVyIG1pbiB3YXMgYSB2YWxpZCB2YWx1ZQotICAgKi8gIAotICBwdWJsaWMgYm9vbGVhbiBzZXRNaW4oU3RyaW5nIG1pbikKLSAgewotICAgIHRoaXMubWluID0gY29udmVydFRvSW50KG1pbik7Ci0KLSAgICAvLyBtaW4gPiBtYXggaXMgYW4gaW52YWxpZCBjYXNlLCB1bmxlc3MgbWF4IGlzIEVNUFRZIChzaW5jZSBFTVBUWSA9PSAtMSkuCi0gICAgaWYgKCAodGhpcy5tYXggIT0gRU1QVFkpICYmICh0aGlzLm1pbiA+IHRoaXMubWF4KSApCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKHRoaXMubWluID49IDApOwotICB9Ci0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0TWF4KCkKLSAgewotICAgIHJldHVybiBtYXg7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1heChpbnQgbWF4KQotICB7Ci0gICAgdGhpcy5tYXggPSBtYXg7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGlzLm1heCB0byB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBtYXggaWZmIG1heCBpcyBhIHZhbGlkIHZhbHVlIChpLmUuIGdyZWF0ZXIgdGhhbiAwKS4KLSAgICogU2V0cyB0aGlzLm1heCB0byBFTVBUWSBpZiBpdCBpcyBub3QuCi0gICAqCi0gICAqIEBwYXJhbSBtYXggVGhlIG5ldyBtYXggdmFsdWUKLSAgICogQHJldHVybnMgV2hldGhlciBtYXggd2FzIGEgdmFsaWQgdmFsdWUsIG9yICh3aGV0aGVyIG1heCA9PSB0aGUgZW1wdHkgc3RyaW5nICYmIG1pbiBoYXMgYSB2YWxpZCB2YWx1ZSkKLSAgICovIAotICBwdWJsaWMgYm9vbGVhbiBzZXRNYXgoU3RyaW5nIG1heCkKLSAgewotICAgIHRoaXMubWF4ID0gY29udmVydFRvSW50KG1heCk7Ci0KLSAgICAvLyBUaGUgZW1wdHkgc3RyaW5nIGlzIGEgdmFsaWQgbWF4IHZhbHVlIGlmZiBtaW4gaGFzIGEgdmFsaWQgdmFsdWUuCi0gICAgLy8gVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCB7bix9IG1lYW5zICJhdCBsZWFzdCBuIHRpbWVzIiBpbiByZWdleCBwYXJsYW5jZS4KLSAgICBpZiAobWF4LmVxdWFscygiIikgJiYgdGhpcy5taW4gIT0gRU1QVFkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIGVsc2UgaWYgKHRoaXMubWF4IDwgdGhpcy5taW4pCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuICh0aGlzLm1heCA+PSAwKTsKLSAgICB9Ci0gIH0KLQotCi0gCi0gIHB1YmxpYyBpbnQgZ2V0UmVwZWF0KCkKLSAgewotICAgIHJldHVybiByZXBlYXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXBlYXQoaW50IHJlcGVhdCkKLSAgewotICAgIHRoaXMucmVwZWF0ID0gcmVwZWF0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhpcy5yZXBlYXQgdG8gdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgcmVwZWF0IGlmZiByZXBlYXQgaXMgYSB2YWxpZCB2YWx1ZSAoaS5lLiBncmVhdGVyIHRoYW4gMCkuCi0gICAqIFNldHMgdGhpcy5yZXBlYXQgdG8gRU1QVFkgaWYgaXQgaXMgbm90LgotICAgKgotICAgKiBAcGFyYW0gcmVwZWF0IFRoZSBuZXcgcmVwZWF0IHZhbHVlCi0gICAqIEByZXR1cm5zIFdoZXRoZXIgcmVwZWF0IHdhcyBhIHZhbGlkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXRSZXBlYXQoU3RyaW5nIHJlcGVhdCkKLSAgewotICAgIHRoaXMucmVwZWF0ID0gY29udmVydFRvSW50KHJlcGVhdCk7Ci0gICAgcmV0dXJuICh0aGlzLnJlcGVhdCA+PSAwKTsKLSAgfQotCi0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBzLiAgSWYgcyBpcyBsZXNzIHRoYW4gemVybywgb3IgaWYgcyBpcyBub3QgYW4gaW50Ci0gICAqIChpLmUuIGlmIEludGVnZXIucGFyc2VJbnQgd291bGQgdGhyb3cgYSBOdW1iZXJGb3JtYXRFeGNlcHRpb24pLCB0aGVuIHJldHVybnMgRU1QVFkuCi0gICAqCi0gICAqIEBwYXJhbSBzIFRoZSBTdHJpbmcgdG8gY29udmVydC4KLSAgICogQHJldHVybnMgVGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2Ygcy4KLSAgICovCi0gIHByaXZhdGUgaW50IGNvbnZlcnRUb0ludChTdHJpbmcgcykKLSAgewotICAgIGludCByZXN1bHQ7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmVzdWx0ID0gSW50ZWdlci5wYXJzZUludChzKTsKLSAgICAgIGlmIChyZXN1bHQgPCAwKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBFTVBUWTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEVNUFRZOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBib29sZWFuIGdldEhhc1BhcmVucygpCi0gIHsKLSAgICByZXR1cm4gaGFzUGFyZW5zOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SGFzUGFyZW5zKGJvb2xlYW4gc3RhdHVzKQotICB7Ci0gICAgdGhpcy5oYXNQYXJlbnMgPSBzdGF0dXM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRBdXRvRXNjYXBlU3RhdHVzKCkKLSAgewotICAgIHJldHVybiBhdXRvRXNjYXBlU3RhdHVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QXV0b0VzY2FwZVN0YXR1cyhib29sZWFuIHN0YXR1cykKLSAgewotICAgIHRoaXMuYXV0b0VzY2FwZVN0YXR1cyA9IHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGVzY2FwZWQgdmVyc2lvbiBvZiBzLiAgSW4gb3RoZXIgd29yZHMsIGVhY2ggb2NjdXJyZW5jZSBvZiBhIG1ldGFjaGFyYWN0ZXIgKCAuXD8qK3t9KClbXSApCi0gICAqIGlzIHJlcGxhY2VkIGJ5IHRoYXQgY2hhcmFjdGVyIHByZWNlZGVkIGJ5IGEgYmFja3NsYXNoLgotICAgKgotICAgKiBAcGFyYW0gcyBUaGUgU3RyaW5nIHRvIGVzY2FwZS4KLSAgICogQHJldHVybnMgQW4gZXNjYXBlZCB2ZXJzaW9uIG9mIHMuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBhZGRFc2NhcGVDaGFyYWN0ZXJzKFN0cmluZyBzKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgY2hhciBjdXJyZW50Q2hhciA9IHMuY2hhckF0KGkpOwotCi0gICAgICBpZiAoaXNNZXRhY2hhcihjdXJyZW50Q2hhcikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxcIik7IC8vIE5vdGUgdGhhdCB0aGlzIGlzIGFuIGVzY2FwZWQgYmFja3NsYXNoLCBub3QgYSBkb3VibGUgYmFja3NsYXNoLgotICAgICAgfQotICAgICAgcmVzdWx0LmFwcGVuZChjdXJyZW50Q2hhcik7Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHdoZXRoZXIgYyBpcyBhIG1ldGFjaGFyYWN0ZXIgYXMgZGVmaW5lZCBpbiB0aGUgc3RhdGljIHZhcmlhYmxlIG1ldGFjaGFyYWN0ZXJzLgotICAgKgotICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgKiBAcmV0dXJucyBXaGV0aGVyIGMgaXMgYSBtZXRhY2hhcmFjdGVyLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzTWV0YWNoYXIoY2hhciBjKQotICB7Ci0gICAgcmV0dXJuIG1ldGFjaGFyYWN0ZXJzLmluZGV4T2YoYykgIT0gLTE7Ci0gIH0KLSAgCi0KLSAgcHVibGljIGJvb2xlYW4gaGFzVmFsaWRNaW4oKQotICB7Ci0gICAgcmV0dXJuIChtaW4gIT0gRU1QVFkpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFzVmFsaWRNYXgoKQotICB7Ci0gICAgcmV0dXJuKG1heCAhPSBFTVBUWSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNWYWxpZFJlcGVhdCgpCi0gIHsKLSAgICByZXR1cm4ocmVwZWF0ICE9IEVNUFRZKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIAotICAgIGlmIChoYXNQYXJlbnMpCi0gICAgewotICAgICAgcmVzdWx0ICs9ICIoIjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGF1dG9Fc2NhcGVTdGF0dXMpCi0gICAgewotICAgICAgIHJlc3VsdCArPSBhZGRFc2NhcGVDaGFyYWN0ZXJzKGNvbnRlbnRzKTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICByZXN1bHQgKz0gY29udGVudHM7Ci0gICAgfQotCi0KLSAgICBpZiAoaGFzUGFyZW5zKQotICAgIHsKLSAgICAgIHJlc3VsdCArPSAiKSI7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAocXVhbnRpZmllcikKLSAgICB7Ci0gICAgICBjYXNlIFNUQVI6Ci0gICAgICAgIHJlc3VsdCArPSAiKiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIFBMVVM6Ci0gICAgICAgIHJlc3VsdCArPSAiKyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIE9QVElPTkFMOgotICAgICAgICByZXN1bHQgKz0gIj8iOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBSRVBFQVQ6Ci0gICAgICAgIHJlc3VsdCArPSAieyIgKyByZXBlYXQgKyAifSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIFJBTkdFOgotICAgICAgICByZXN1bHQgKz0gInsiICsgbWluICsgIiwiOwotICAgICAgICBpZiAobWF4ID09IEVNUFRZKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICs9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCArPSBtYXg7Ci0gICAgICAgIH0gICAgICAgCi0gICAgICAgIHJlc3VsdCArPSAifSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICAvLyBTSU5HTEUgaXMgYSBmYWxsIHRocm91Z2ggICAgICAgICAgIAotCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4VGVzdGluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4VGVzdGluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2MDFiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleFRlc3RpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gQmFzZWQgb24gdmVyc2lvbiAxLjYgb2Ygb3JpZ2luYWwgeHNkZWRpdG9yCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci0KLQotcHVibGljIGNsYXNzIFJlZ2V4VGVzdGluZ1BhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0gIC8qIFZhbGlkYXRvciBmcm9tIHhlcmNlcyBwYWNrYWdlLiAqLwotLy8gIHByaXZhdGUgUmVndWxhckV4cHJlc3Npb24gdmFsaWRhdG9yOwotICBwcml2YXRlIFBhdHRlcm4gdmFsaWRhdG9yOwotICAKLSAgLyogRGlzcGxheXMgdGhlIHN0YXR1cyBvZiB0aGUgbWF0Y2guICovCi0gIHByaXZhdGUgTGFiZWwgbWF0Y2hMYWJlbDsKLQotCi0gIC8qIFRoZSByZWdleC4gKi8KLSAgcHJpdmF0ZSBUZXh0IHZhbHVlOwotICAKLSAgLyogVGhlIHN0cmluZyB0aGUgdXNlciBpcyB0cnlpbmcgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgcmVnZXguICovCi0gIHByaXZhdGUgU3R5bGVkVGV4dCB0ZXN0U3RyaW5nOwotCi0gIHB1YmxpYyBSZWdleFRlc3RpbmdQYWdlKCkKLSAgewotICAgIHN1cGVyKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVTVElOR19QQUdFX1RJVExFIikpOwotCi0gICAgc2V0VGl0bGUoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfVElUTEUiKSk7Ci0gICAgc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLSAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTRFJfVEVTVF9QQUdFKTsKLQotICAgIG1hdGNoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgbWF0Y2hMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVTVElOR19QQUdFX0RFU0NSSVBUSU9OIikpOwotICAgIEZvbnREYXRhW10gZm9udERhdGEgPSBtYXRjaExhYmVsLmdldEZvbnQoKS5nZXRGb250RGF0YSgpOwotICAgIEdyaWREYXRhIGRhdGFGID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YUYud2lkdGhIaW50ID0gNDAwOwotICAgIGRhdGFGLmhlaWdodEhpbnQgPSA2ICogZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCk7Ci0gICAgbWF0Y2hMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGFGKTsKLSAgICAKLSAgICBDb21wb3NpdGUgY29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgY29udHJvbHNMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGNvbnRyb2xzTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbnRyb2xzLnNldExheW91dChjb250cm9sc0xheW91dCk7Ci0gICAgY29udHJvbHMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBuZXcgTGFiZWwoY29udHJvbHMsIFNXVC5MRUZUKS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfUkVHRVhfTEFCRUwiKSk7Ci0gICAgdmFsdWUgPSBuZXcgVGV4dChjb250cm9scywgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHZhbHVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0KLSAgICBuZXcgTGFiZWwoY29udHJvbHMsIFNXVC5MRUZUKS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfU0FNUExFX1RFWFQiKSk7Ci0gICAgdGVzdFN0cmluZyA9IG5ldyBTdHlsZWRUZXh0KGNvbnRyb2xzLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHRlc3RTdHJpbmcsIFhTREVkaXRvckNvbnRleHRJZHMuWFNEUl9URVNUX1NBTVBMRSk7Ci0gICAgdGVzdFN0cmluZy5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgVGVzdFN0cmluZ0xpc3RlbmVyKCkpOwotICAgIHRlc3RTdHJpbmcuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgCi0gICAgY29udHJvbHMucGFjaygpOwotICAgIAotICAgIExhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgR0MgZ2MgPSBuZXcgR0Moc2VwYXJhdG9yKTsKLSAgICBQb2ludCBwb2ludFNpemUgPSBnYy5zdHJpbmdFeHRlbnQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC53aWR0aEhpbnQgPSAoaW50KShwb2ludFNpemUueCAvIDIgKyBnYy5nZXRBZHZhbmNlV2lkdGgoJ00nKSoxMSk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgCi0gICAgY29tcG9zaXRlLnBhY2soKTsKLSAgICAKLS8vICAgIHZhbGlkYXRvciA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbigiIiwgZ2V0RmxhZ3MoKSk7Ci0KLSAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gIH0KLQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFBhdHRlcm5WYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gKCAoUmVnZXhDb21wb3NpdGlvblBhZ2UpZ2V0UHJldmlvdXNQYWdlKCkgKS5nZXRQYXR0ZXJuKCkuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRGbGFncygpCi0gIHsKLSAgICByZXR1cm4gKCAoUmVnZXhDb21wb3NpdGlvblBhZ2UpZ2V0UHJldmlvdXNQYWdlKCkgKS5nZXRGbGFncygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpCi0gIHsKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCi0gICAgU3RyaW5nIHBhdHRlcm4gPSBnZXRQYXR0ZXJuVmFsdWUoKTsKLSAgICBTdHJpbmcgZmxhZ3MgPSBnZXRGbGFncygpOwotCi0gICAgdmFsdWUuc2V0VGV4dChwYXR0ZXJuKTsKLQotLy8gICAgdHJ5Ci0vLyAgICB7Ci0vLyAgICAgIHZhbGlkYXRvci5zZXRQYXR0ZXJuKHBhdHRlcm4sIGZsYWdzKTsKLS8vICAgIH0KLS8vICAgIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkKLS8vICAgIHsKLS8vICAgIH0KLSAgICAKLSAgICB1cGRhdGVNYXRjaFN0YXR1cygpOwotCi0gICAgdGVzdFN0cmluZy5zZXRGb2N1cygpOwotICB9Ci0KLSAgY2xhc3MgVGVzdFN0cmluZ0xpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpCi0gICAgewotICAgICAgdXBkYXRlTWF0Y2hTdGF0dXMoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTWF0Y2hTdGF0dXMoKQotICB7Ci0gICAgaWYgKFBhdHRlcm4ubWF0Y2hlcyhnZXRQYXR0ZXJuVmFsdWUoKSwgdGVzdFN0cmluZy5nZXRUZXh0KCkpKQotICAgIHsKLS8vICAgICAgbWF0Y2hMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfTUFUQ0hFUyIpKTsKLSAgICAgIHNldE1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9NQVRDSEVTIiksIDEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0TWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0RPRVNfTk9UX01BVENIIiksIDIpOwotLy8gICAgICBtYXRjaExhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9ET0VTX05PVF9NQVRDSCIpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4V2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTdjYjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXR0ZXJuRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNERmFjdG9yeUltcGw7Ci0KLQotcHVibGljIGNsYXNzIFJlZ2V4V2l6YXJkIGV4dGVuZHMgV2l6YXJkIAotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0gIAotICBwcml2YXRlIFJlZ2V4Q29tcG9zaXRpb25QYWdlIGNvbXBvc2l0aW9uUGFnZTsKLSAgcHJpdmF0ZSBSZWdleFRlc3RpbmdQYWdlIHRlc3RpbmdQYWdlOwotCi0gIC8qIFRoZSBvcmlnaW5hbCwgdW5jaGFuZ2VkIHBhdHRlcm4uICovICAKLSAgcHJpdmF0ZSBYU0RQYXR0ZXJuRmFjZXQgb3JpZ2luYWxQYXR0ZXJuOwotICAKLSAgLyogQSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIHdpemFyZC4gKi8KLSAgcHJpdmF0ZSBYU0RQYXR0ZXJuRmFjZXQgbW9kaWZpZWRQYXR0ZXJuOwotCi0gIFN0cmluZyBwYXR0ZXJuOwotCi0gIHB1YmxpYyBSZWdleFdpemFyZChTdHJpbmcgZXhwcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0V2luZG93VGl0bGUoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9USVRMRSIpKTsKLSAgICBzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvcmVneF93aXouZ2lmIikpOwotCi0gICAgWFNERmFjdG9yeUltcGwgZmFjdG9yeSA9IG5ldyBYU0RGYWN0b3J5SW1wbCgpOwotICAgIG1vZGlmaWVkUGF0dGVybiA9IGZhY3RvcnkuY3JlYXRlWFNEUGF0dGVybkZhY2V0KCk7Ci0gICAgbW9kaWZpZWRQYXR0ZXJuLnNldExleGljYWxWYWx1ZShleHByKTsKLQotICAgIG9yaWdpbmFsUGF0dGVybiA9IGZhY3RvcnkuY3JlYXRlWFNEUGF0dGVybkZhY2V0KCk7Ci0gICAgb3JpZ2luYWxQYXR0ZXJuLnNldExleGljYWxWYWx1ZShleHByKTsKLQotICAgIGNvbXBvc2l0aW9uUGFnZSA9IG5ldyBSZWdleENvbXBvc2l0aW9uUGFnZShtb2RpZmllZFBhdHRlcm4pOwotICAgIGFkZFBhZ2UoY29tcG9zaXRpb25QYWdlKTsKLQotICAgIHRlc3RpbmdQYWdlID0gbmV3IFJlZ2V4VGVzdGluZ1BhZ2UoKTsKLSAgICBhZGRQYWdlKHRlc3RpbmdQYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpCi0gIHsKLSAgICByZXR1cm4gcGF0dGVybjsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7Ci0gICAgcGF0dGVybiA9IG1vZGlmaWVkUGF0dGVybi5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNETG9jYXRpb25DaG9pY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0RMb2NhdGlvbkNob2ljZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMTEwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0RMb2NhdGlvbkNob2ljZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLQotCi1wdWJsaWMgY2xhc3MgWFNETG9jYXRpb25DaG9pY2VQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSAKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiByYWRpb0J1dHRvbjE7Ci0gIHByb3RlY3RlZCBCdXR0b24gcmFkaW9CdXR0b24yOwotICAgIAotICBwdWJsaWMgWFNETG9jYXRpb25DaG9pY2VQYWdlKCkKLSAgewotICAgIHN1cGVyKCJYU0RMb2NhdGlvbkNob2ljZVBhZ2UiKTsKLQotICAgIHRoaXMuc2V0VGl0bGUoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1dJWkFSRF9JTkNMVURFX0ZJTEVfVElUTEUiKSk7Ci0gICAgdGhpcy5zZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfV0laQVJEX0lOQ0xVREVfRklMRV9ERVNDIikpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBiYXNlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBiYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBHcmlkRGF0YSBkYXRhOwotICAgICAgCi0gICAgVmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoYmFzZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0lOQ0xVREVfVVJMX0ZJTEUiKSk7Ci0gICAgQ29tcG9zaXRlIHJhZGlvQnV0dG9uc0dyb3VwID0gVmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKGJhc2UsIDEsIHRydWUpOwotCi0gICAgcmFkaW9CdXR0b24xID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24ocmFkaW9CdXR0b25zR3JvdXAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SQURJT19GSUxFIikpOwotICAgICAgCi0gICAgcmFkaW9CdXR0b24yID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24ocmFkaW9CdXR0b25zR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JBRElPX1VSTCIpKTsKLQotICAgIHJhZGlvQnV0dG9uMS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLSAgICBzZXRDb250cm9sKGJhc2UpOwotICB9Ci0KLSAgLy8gYWN0aW9ucyBvbiBmaW5pc2gKLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVVJMKCkKLSAgewotICAgIHJldHVybiByYWRpb0J1dHRvbjIuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRE5ld0ZpbGVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0ROZXdGaWxlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjVlZWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRE5ld0ZpbGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFhTRE5ld0ZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZQotewotICBwdWJsaWMgWFNETmV3RmlsZVBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSAKLSAgewotICAgIHN1cGVyKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9DUkVBVEVYU0QiKSwgc2VsZWN0aW9uKTsKLSAgICBzZXRUaXRsZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTkVXX1hNTF9TQ0hFTUFfVElUTEUiKSk7Ci0gICAgc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NSRUFURV9BX05FV19YTUxfU0NIRU1BX0RFU0MiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgLy8gaW5oZXJpdCBkZWZhdWx0IGNvbnRhaW5lciBhbmQgbmFtZSBzcGVjaWZpY2F0aW9uIHdpZGdldHMKLSAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0KLSAgICB0aGlzLnNldEZpbGVOYW1lKGNvbXB1dGVEZWZhdWx0RmlsZU5hbWUoKSk7Ci0KLSAgICBzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkKLSAgewotICAgIFBhdGggbmV3TmFtZSA9IG5ldyBQYXRoKGdldEZpbGVOYW1lKCkpOwotICAgIFN0cmluZyBmdWxsRmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotICAgIFN0cmluZyBleHRlbnNpb24gPSBuZXdOYW1lLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwgfHwgIWV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ4c2QiKSkgCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9YU0QiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGZvciBmaWxlIHNob3VsZCBiZSBjYXNlIGluc2Vuc2l0aXZlCi0gICAgU3RyaW5nIHNhbWVOYW1lID0gZXhpc3RzRmlsZUFueUNhc2UoZnVsbEZpbGVOYW1lKTsKLSAgICBpZiAoc2FtZU5hbWUgIT0gbnVsbCkgCi0gICAgewotICAgICAgU3RyaW5nIHF1YWxpZmllZEZpbGVOYW1lID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS50b1N0cmluZygpICsgJy8nICsgZnVsbEZpbGVOYW1lOwotICAgICAgc2V0RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTIiwgc2FtZU5hbWUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZGVmYXVsdE5hbWUgPSAiTmV3WE1MU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIGRlZmF1bHRGaWxlRXh0ZW5zaW9uID0gIi54c2QiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zID0geyAiKi54c2QifTsgLy8kTk9OLU5MUy0xJAotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZURlZmF1bHRGaWxlTmFtZSgpCi0gIHsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIFN0cmluZyBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgZGVmYXVsdEZpbGVFeHRlbnNpb247Ci0gICAgSVBhdGggY29udGFpbmVyRnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgIGlmIChjb250YWluZXJGdWxsUGF0aCAhPSBudWxsKQotICAgIHsKLSAgICAgIHdoaWxlICh0cnVlKQotICAgICAgewotICAgICAgICBJUGF0aCBwYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLSAgICAgICAgaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKHBhdGgpKQotICAgICAgICB7Ci0gICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgY291bnQgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmlsZU5hbWU7Ci0gIH0KLQotICAvLyByZXR1cm5zIHRydWUgaWYgZmlsZSBvZiBzcGVjaWZpZWQgbmFtZSBleGlzdHMgaW4gYW55IGNhc2UgZm9yIHNlbGVjdGVkIGNvbnRhaW5lcgotICBwcm90ZWN0ZWQgU3RyaW5nIGV4aXN0c0ZpbGVBbnlDYXNlKFN0cmluZyBmaWxlTmFtZSkKLSAgewotICAgIGlmICggKGdldENvbnRhaW5lckZ1bGxQYXRoKCkgIT0gbnVsbCkgJiYgKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuaXNFbXB0eSgpID09IGZhbHNlKQotICAgICAgICAmJiAoZmlsZU5hbWUuY29tcGFyZVRvKCIiKSAhPSAwKSkKLSAgICB7Ci0gICAgICAvL2xvb2sgdGhyb3VnaCBhbGwgcmVzb3VyY2VzIGF0IHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIC0gY29tcGFyZSBpbiB1cHBlciBjYXNlCi0gICAgICBJUmVzb3VyY2UgcGFyZW50ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGdldENvbnRhaW5lckZ1bGxQYXRoKCkpOwotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDb250YWluZXIpCi0gICAgICB7Ci0gICAgICAgIElDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHBhcmVudDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBJUmVzb3VyY2VbXSBtZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLSAgICAgICAgICBTdHJpbmcgZW50ZXJlZEZpbGVVcHBlciA9IGZpbGVOYW1lLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1lbWJlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlVXBwZXJOYW1lID0gbWVtYmVyc1tpXS5nZXROYW1lKCkudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZVVwcGVyTmFtZS5lcXVhbHMoZW50ZXJlZEZpbGVVcHBlcikpCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlcnNbaV0uZ2V0TmFtZSgpOyAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkZWU5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFBhcnNlcjsKLQotCi0vKioKLSAqIEV4dGVuZCB0aGUgYmFzZSB3aXphcmQgdG8gc2VsZWN0IGEgZmlsZSBmcm9tIHRoZSBwcm9qZWN0IG9yIG91dHNpZGUgdGhlIHdvcmtiZW5jaAotICogYW5kIGFkZCBlcnJvciBoYW5kbGluZwotICovCi1wdWJsaWMgY2xhc3MgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkCi17Ci0gIGJvb2xlYW4gaXNJbmNsdWRlOwotICBYU0RTY2hlbWEgbWFpblNjaGVtYTsKLSAgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hOwotCi0gIFhTRExvY2F0aW9uQ2hvaWNlUGFnZSBjaG9pY2VQYWdlOwotICBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZSBmaWxlUGFnZTsKLSAgWFNEVVJMUGFnZSB1cmxQYWdlOwotCi0gIElGaWxlIHJlc3VsdEZpbGU7Ci0gIFN0cmluZyByZXN1bHRVUkw7Ci0gIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsKLQotICBwdWJsaWMgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQoWFNEU2NoZW1hIG1haW5TY2hlbWEsIGJvb2xlYW4gaXNJbmNsdWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0gICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL05ld1hTRC5naWYiKSk7Ci0KLSAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQotICAgIC8vIENob2ljZSBQYWdlCi0gICAgY2hvaWNlUGFnZSA9IG5ldyBYU0RMb2NhdGlvbkNob2ljZVBhZ2UoKTsKLQotICAgIC8vIFNlbGVjdCBGaWxlIFBhZ2UKLSAgICBmaWxlUGFnZSA9IG5ldyBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCAgc2VsZWN0aW9uLCB0cnVlKTsKLSAgICBmaWxlUGFnZS5zZXRUaXRsZSh0aXRsZSk7Ci0gICAgZmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0gICAgZmlsZVBhZ2UuYWRkRmlsdGVyKGZpbHRlcik7Ci0KLSAgICAvLyBVUkwgUGFnZQotICAgIHVybFBhZ2UgPSBuZXcgWFNEVVJMUGFnZSgpOwotICAgIHVybFBhZ2Uuc2V0VGl0bGUodGl0bGUpOwotICAgIHVybFBhZ2Uuc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9VUkwiKSk7Ci0gICAgCi0gICAgdGhpcy5tYWluU2NoZW1hID0gbWFpblNjaGVtYTsKLSAgICB0aGlzLmlzSW5jbHVkZSA9IGlzSW5jbHVkZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKQotICB7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0gICAgYWRkUGFnZShjaG9pY2VQYWdlKTsKLSAgICBhZGRQYWdlKGZpbGVQYWdlKTsKLSAgICBhZGRQYWdlKHVybFBhZ2UpOwotICB9Ci0KLSAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIGN1cnJlbnRQYWdlKQotICB7Ci0gICAgV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0KLSAgICBpZiAoY3VycmVudFBhZ2UgPT0gY2hvaWNlUGFnZSkKLSAgICB7Ci0gICAgICBpZiAoY2hvaWNlUGFnZS5pc1VSTCgpKSAKLSAgICAgIHsKLSAgICAgICAgbmV4dFBhZ2UgPSB1cmxQYWdlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBuZXh0UGFnZSA9IGZpbGVQYWdlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV4dFBhZ2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKQotICB7Ci0gICAgaWYgKCFjaG9pY2VQYWdlLmlzVVJMKCkpCi0gICAgewotICAgICAgcmV0dXJuIGZpbGVQYWdlLmlzUGFnZUNvbXBsZXRlKCk7IAotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7IAotICAgIGlmIChjaG9pY2VQYWdlLmlzVVJMKCkpCi0gICAgewotICAgICAgdHJ5IAotICAgICAgewotICAgICAgICBnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIHVybFBhZ2UuZ2V0UnVubmFibGUoKSk7Ci0gICAgICAgIHJlc3VsdFVSTCA9IHVybFBhZ2UuZ2V0VVJMKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgCi0gICAgICByZXN1bHRGaWxlID0gZmlsZVBhZ2UuZ2V0RmlsZSgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIE1PRiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBleHRlcm5hbCBmaWxlCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGdldEV4dGVybmFsU2NoZW1hKCkKLSAgewotICAgIHJldHVybiBleHRlcm5hbFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyBJRmlsZSBnZXRSZXN1bHRGaWxlKCkKLSAgewotICAgIHJldHVybiByZXN1bHRGaWxlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICB7Ci0gICAgcmV0dXJuIHJlc3VsdFVSTDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gIAlyZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIE1PRiBtb2RlbCBmb3IgdGhlIGltcG9ydGVkIGZpbGUKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZG9Mb2FkRXh0ZXJuYWxNb2RlbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB4c2RNb2RlbEZpbGUsIFN0cmluZyB4c2RGaWxlTmFtZSkKLSAgeyAKLSAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICBTdHJpbmcgY3VycmVudE5hbWVTcGFjZSA9IG1haW5TY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBtb25pdG9yLmJlZ2luVGFzaygiTG9hZGluZyBYTUwgU2NoZW1hIiwgMTAwKTsKLSAgICBtb25pdG9yLndvcmtlZCg1MCk7Ci0KLSAgICBYU0RQYXJzZXIgcGFyc2VyID0gbmV3IFhTRFBhcnNlcigpOwotICAgIHBhcnNlci5wYXJzZSh4c2RNb2RlbEZpbGUpOwotCi0gICAgZXh0ZXJuYWxTY2hlbWEgPSBwYXJzZXIuZ2V0U2NoZW1hKCk7Ci0gICAgaWYgKGV4dGVybmFsU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGV4dE5hbWVzcGFjZSA9IGV4dGVybmFsU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgbmFtZXNwYWNlID0gZXh0TmFtZXNwYWNlOwotICAgICAKLSAgICAgIGlmIChleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpICE9IG51bGwgJiYKLSAgICAgICAgICBleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoaXNJbmNsdWRlKSAKLSAgICAgICAgeyAgCi0gICAgICAgICAgLy8gQ2hlY2sgdGhlIG5hbWVzcGFjZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgdGhlIHNhbWUgYXMgY3VycmVudCBmaWxlCi0gICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgIWV4dE5hbWVzcGFjZS5lcXVhbHMoY3VycmVudE5hbWVTcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9ESUZGRVJFTlRfTkFNRV9TUEFDRSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICAvLyBDaGVjayB0aGUgbmFtZXNwYWNlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBmaWxlCi0gICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgZXh0TmFtZXNwYWNlLmVxdWFscyhjdXJyZW50TmFtZVNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX1NBTUVfTkFNRV9TUEFDRSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSIsIHhzZEZpbGVOYW1lKTsKLSAgICB9Ci0KLSAgICBtb25pdG9yLnN1YlRhc2soIkZpbmlzaCBMb2FkaW5nIik7Ci0gICAgbW9uaXRvci53b3JrZWQoODApOwotCi0gICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgfQotCi0gCi0gIC8qKgotICAgKiBVUkwgcGFnZQotICAgKi8KLSAgY2xhc3MgWFNEVVJMUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLSAgeyAKLSAgICBUZXh0IHVybEZpZWxkOwotICAgIFN0cmluZyBzYXZlU3RyaW5nOwotCi0gICAgcHVibGljIFhTRFVSTFBhZ2UoKQotICAgIHsKLSAgICAgIHN1cGVyKCJVUkxQYWdlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBjbGllbnQgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LDIpOwotICAgICAgVmlld1V0aWxpdHkuc2V0Q29tcG9zaXRlKGNsaWVudCk7Ci0KLSAgICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1VSTCIpKTsKLSAgICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgIiIpOwotCi0gICAgICB1cmxGaWVsZCA9IFZpZXdVdGlsaXR5LmNyZWF0ZVRleHRGaWVsZChjbGllbnQsIDUwKTsKLSAgICAgIHNhdmVTdHJpbmcgPSAiaHR0cDovLyI7Ci0gICAgICB1cmxGaWVsZC5zZXRUZXh0KHNhdmVTdHJpbmcpOwotCi0gICAgICBzZXRDb250cm9sKGNsaWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICAgIHsKLSAgICAgIHJldHVybiB1cmxGaWVsZC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG9wZW5FeHRlcm5hbFNjaGVtYShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgewotICAgICAgU3RyaW5nIHRleHQgPSB1cmxGaWVsZC5nZXRUZXh0KCk7Ci0vLyAgICAgIGlmICh0ZXh0LmVxdWFscyhzYXZlU3RyaW5nKSkgCi0vLyAgICAgIHsKLS8vICAgICAgICByZXR1cm4gZmFsc2U7Ci0vLyAgICAgIH0KLS8vICAgICAgc2F2ZVN0cmluZyA9IHRleHQ7Ci0KLSAgICAgIGlmICh0ZXh0LmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU1BFQ0lGWV9VUkwiKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCAhdGV4dC5zdGFydHNXaXRoKCJodHRwOi8vIikgKQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1VSTF9TVEFSVF9XSVRIIikpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBkb0xvYWRFeHRlcm5hbE1vZGVsKG1vbml0b3IsIHRleHQsIHRleHQpOwotICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7IAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0UnVubmFibGUoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgICAKLSAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgIGlmIChtb25pdG9yID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvcj0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIDYpOwotICAgICAgICAKLSAgICAgICAgICBib29sZWFuIG9rID0gb3BlbkV4dGVybmFsU2NoZW1hKG1vbml0b3IpOwotCi0gICAgICAgICAgaWYgKCFvaykgCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG5ldyBqYXZhLmxhbmcuRXJyb3IoKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlbGVjdCBYTUwgU2NoZW1hIEZpbGUKLSAgICovCi0gIGNsYXNzIFhTRFNlbGVjdFNpbmdsZUZpbGVQYWdlIGV4dGVuZHMgU2VsZWN0U2luZ2xlRmlsZVBhZ2UKLSAgewotICAgIHB1YmxpYyBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZShJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkKLSAgICB7ICAgICAgICAgIAotICAgICAgc3VwZXIod29ya2JlbmNoLHNlbGVjdGlvbixpc0ZpbGVNYW5kYXRvcnkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuRXh0ZXJuYWxTY2hlbWEoKQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgZnVsbHktcXVhbGlmaWVkIGZpbGUgbmFtZQotICAgICAgSUZpbGUgaUZpbGUgPSBnZXRGaWxlKCk7Ci0gICAgICBpZiAoaUZpbGUgPT0gbnVsbCkgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgICBTdHJpbmcgeHNkTW9kZWxGaWxlID0gaUZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgICBTdHJpbmcgeHNkRmlsZU5hbWUgPSBpRmlsZS5nZXROYW1lKCk7Ci0gICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gZG9Mb2FkRXh0ZXJuYWxNb2RlbChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB4c2RNb2RlbEZpbGUsIHhzZEZpbGVOYW1lKTsKLQotICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKQotICAgIHsgIAotICAgICAgaWYgKGNob2ljZVBhZ2UuaXNVUkwoKSkgCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgICBpZiAoc3VwZXIuaXNQYWdlQ29tcGxldGUoKSkgCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBvcGVuRXh0ZXJuYWxTY2hlbWEoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdXBlci5pc1BhZ2VDb21wbGV0ZSgpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL3VpL3JlY29uY2lsZS9EZWxlZ2F0aW5nUmVjb25jaWxlVmFsaWRhdG9yRm9yWFNELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvcmVjb25jaWxlL0RlbGVnYXRpbmdSZWNvbmNpbGVWYWxpZGF0b3JGb3JYU0QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3M2Y1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvcmVjb25jaWxlL0RlbGVnYXRpbmdSZWNvbmNpbGVWYWxpZGF0b3JGb3JYU0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlY29uY2lsZS5EZWxlZ2F0aW5nUmVjb25jaWxlVmFsaWRhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgbWh1dGNoaW4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nUmVjb25jaWxlVmFsaWRhdG9yRm9yWFNEIGV4dGVuZHMgRGVsZWdhdGluZ1JlY29uY2lsZVZhbGlkYXRvcgotewotCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBWQUxJREFUT1JfQ0xBU1MgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2UuVmFsaWRhdG9yIjsgCi0KLSAgcHVibGljIERlbGVnYXRpbmdSZWNvbmNpbGVWYWxpZGF0b3JGb3JYU0QoKQotICB7IHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJVmFsaWRhdG9yIGdldERlbGVnYXRlVmFsaWRhdG9yKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vR2V0IHRoZSB2YWxpZGF0b3I6Ci0gICAgICBWYWxpZGF0b3JNZXRhRGF0YSB2YWxpZGF0b3JEYXRhID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKFZBTElEQVRPUl9DTEFTUyk7Ci0gICAgICByZXR1cm4gdmFsaWRhdG9yRGF0YS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgLy8KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jbGFzc3BhdGggYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY3ZzaWdub3JlIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3YjljNS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnByb3BlcnRpZXMKLWJ1aWxkLnhtbAotc3NlanVuaXQuamFyCi10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnByb2plY3QgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmNTEwOS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTViNjMxLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzIgotICAgbmFtZT0iVW5pdHRlc3RzIgotICAgdmVyc2lvbj0iMS4wLjAiPgotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJzc2VqdW5pdC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuanNwLnRlc3RzLmVuY29kaW5nIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZXN0cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMucGVyZm9ybWFuY2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY3NzLnRlc3RzLmVuY29kaW5nIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS50ZXN0cy5wZXJmb3JtYW5jZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaHRtbC50ZXN0cy5lbmNvZGluZyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlc3RzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVzdHMucGVyZm9ybWFuY2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlc3RzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXN0cy5wZXJmb3JtYW5jZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXN0cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwudGVzdHMuZW5jb2RpbmciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnRlc3RzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS50ZXN0cy5wZXJmb3JtYW5jZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi50ZXN0cyIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyTGlzdFRlc3RTdWl0ZS5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL01hc3Rlckxpc3RUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxMDQ0NC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyTGlzdFRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXN0cy5KU1BDb3JlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudGVzdHMuZW5jb2RpbmcuSlNQRW5jb2RpbmdUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZXN0cy5KU1BVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGVzdHMuQ1NTQ29yZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnRlc3RzLmVuY29kaW5nLkNTU0VuY29kaW5nVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGVzdHMuSFRNTENvcmVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudGVzdHMuZW5jb2RpbmcuSFRNTEVuY29kaW5nVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlc3RzLkhUTUxVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGVzdHMuU1NFTW9kZWxUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXN0cy5TU0VVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGVzdHMuU1NFTW9kZWxYTUxUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC50ZXN0cy5lbmNvZGluZy5FbmNvZGluZ1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnRlc3RzLlhNTFVJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbC5BbGxYTUxUZXN0czsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wdWJsaWMgY2xhc3MgTWFzdGVyTGlzdFRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgTWFzdGVyTGlzdFRlc3RTdWl0ZSgpIHsKLQkJc3VwZXIoIkFsbCBUZXN0cyIpOwotCi0JCWFkZFRlc3QoU1NFTW9kZWxUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoU1NFTW9kZWxYTUxUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoQ1NTQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChIVE1MQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChKU1BDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotCi0JCWFkZFRlc3QoQWxsWE1MVGVzdHMuc3VpdGUoKSk7Ci0JCQotCQlhZGRUZXN0KEVuY29kaW5nVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KENTU0VuY29kaW5nVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEhUTUxFbmNvZGluZ1Rlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChKU1BFbmNvZGluZ1Rlc3RTdWl0ZS5zdWl0ZSgpKTsKLQotCQlhZGRUZXN0KEhUTUxVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChTU0VVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChYTUxVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChKU1BVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGwoKSB7Ci0JCS8vIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGV4aXN0LCBidXQgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyUGVyZm9ybWFuY2VUZXN0U3VpdGUuamF2YSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDkxMDE0Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMucGVyZm9ybWFuY2UuSlNQVUlQZXJmb3JtYW5jZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVzdHMucGVyZm9ybWFuY2UuQ1NTVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZXN0cy5wZXJmb3JtYW5jZS5IVE1MVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlNTRVVJUGVyZm9ybWFuY2VUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS50ZXN0cy5wZXJmb3JtYW5jZS5YTUxVSVBlcmZvcm1hbmNlVGVzdFN1aXRlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXB1YmxpYyBjbGFzcyBNYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgTWFzdGVyUGVyZm9ybWFuY2VUZXN0U3VpdGUoKSB7Ci0JCXN1cGVyKCJBbGwgVGVzdHMiKTsKLQotCQlhZGRUZXN0KEpTUFVJUGVyZm9ybWFuY2VUZXN0cy5zdWl0ZSgpKTsKLQkJYWRkVGVzdChDU1NVSVBlcmZvcm1hbmNlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEhUTUxVSVBlcmZvcm1hbmNlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFNTRVVJUGVyZm9ybWFuY2VUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoWE1MVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbCgpIHsKLQkJLy8gdGhpcyBtZXRob2QgbmVlZHMgdG8gZXhpc3QsIGJ1dCBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZwotCX0KLQotfQo=